-sub lock_db {
- my $dist = shift;
- my $try = 0;
- my $lockfile = db_filename($dist) . ".lock";
- local( *F );
-
- print "Locking $dist database\n" if $verbose >= 2;
- repeat:
- if (!sysopen( F, $lockfile, O_WRONLY|O_CREAT|O_TRUNC|O_EXCL, 0644 )){
- if ($! == EEXIST) {
- # lock file exists, wait
- goto repeat if !open( F, "<$lockfile" );
- my $line = <F>;
- close( F );
- if ($line !~ /^(\d+)\s+([\w\d.-]+)$/) {
- warn "Bad lock file contents -- still trying\n";
- }
- else {
- my($pid, $usr) = ($1, $2);
- if (kill( 0, $pid ) == 0 && $! == ESRCH) {
- # process doesn't exist anymore, remove stale lock
- print "Removing stale lock file (pid $pid, user $usr)\n";
- unlink( $lockfile );
- goto repeat;
- }
- warn "Database locked by $usr -- please wait\n" if $try == 0;
- }
- if (++$try > 200) {
- # avoid the END routine removes the lock
- $main::keep_lock{$dist} = 1;
- die "Lock still present after 200 * 5 seconds.\n";
- }
- sleep 5;
- goto repeat;
- }
- die "Can't create lock file $lockfile: $!\n";
- }
- F->print("$$ $real_user\n");
- F->close();
-}
-
-sub unlock_db {
- my $dist = shift;
- my $lockfile = db_filename($dist) . ".lock";
-
- if (!$main::keep_lock{$dist}) {
- print "Unlocking $dist database\n" if $verbose >= 2;
- unlink $lockfile;
- }
-}
-
-sub create_maintlock {
- my $lockfile = db_filename("maintenance") . ".lock";
- my $try = 0;
- local( *F );
-
- print "Creating maintenance lock\n" if $verbose >= 2;
- repeat:
- if (!sysopen( F, $lockfile, O_WRONLY|O_CREAT|O_TRUNC|O_EXCL, 0644 )){
- if ($! == EEXIST) {
- # lock file exists, wait
- goto repeat if !open( F, "<$lockfile" );
- my $line = <F>;
- close( F );
- if ($line !~ /^(\d+)\s+([\w\d.-]+)$/) {
- warn "Bad maintenance lock file contents -- still trying\n";
- }
- else {
- my($pid, $usr) = ($1, $2);
- if (kill( 0, $pid ) == 0 && $! == ESRCH) {
- # process doesn't exist anymore, remove stale lock
- print "Removing stale lock file (pid $pid, user $usr)\n";
- unlink( $lockfile );
- goto repeat;
- }
- warn "Maintenance lock already exists by $usr -- ".
- "please wait\n" if $try == 0;
- }
- if (++$try > 120) {
- die "Lock still present after 120 * 60 seconds.\n";
- }
- sleep 60;
- goto repeat;
- }
- die "Can't create maintenance lock $lockfile: $!\n";
- }
- F->print(getppid(), " $real_user\n");
- F->close();
-}
-
-sub remove_maintlock {
- my $lockfile = db_filename("maintenance") . ".lock";
-
- print "Removing maintenance lock\n" if $verbose >= 2;
- unlink $lockfile;
-}
-
-sub waitfor_maintlock {
- my $lockfile = db_filename("maintenance") . ".lock";
- my $try = 0;
- local( *F );
-
- print "Checking for maintenance lock\n" if $verbose >= 2;
- repeat:
- if (open( F, "<$lockfile" )) {
- my $line = <F>;
- close( F );
- if ($line !~ /^(\d+)\s+([\w\d.-]+)$/) {
- warn "Bad maintenance lock file contents -- still trying\n";
- }
- else {
- my($pid, $usr) = ($1, $2);
- if (kill( 0, $pid ) == 0 && $! == ESRCH) {
- # process doesn't exist anymore, remove stale lock
- print "Removing stale maintenance lock (pid $pid, user $usr)\n";
- unlink( $lockfile );
- return;
- }
- warn "Databases locked for general maintenance by $usr -- ".
- "please wait\n" if $try == 0;
- }
- if (++$try > 120) {
- die "Lock still present after 120 * 60 seconds.\n";
- }
- sleep 60;
- goto repeat;
- }
-}
-
-