- my( $name, $ui );
- my $change = 0;
-
- $ui = $db{'_userinfo'};
- foreach $name (@_) {
- if (!defined( $ui->{$name} )) {
- print "$name: not registered\n";
- next;
- }
-
- delete $ui->{$name};
- $change++;
- print "$name: deleted from database\n" if $verbose;
- }
- $db{'_userinfo'} = $ui if $change;
-}
-
-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;
- }
- if ($pid == $lock_for_pid) {
- # We are allowed to use this lock.
- return;
- }
- 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";
- }
- my $pid = $lock_for_pid == -1 ? $$ : $lock_for_pid;
- F->print("$pid $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;
- }