From bdc6e5844c8c49e8a45d9c6a1c5fd2d2a9e47991 Mon Sep 17 00:00:00 2001 From: Guy Helmer Date: Mon, 23 Jul 2001 18:25:45 +0000 Subject: Fix removal of at jobs. PR: bin/23052 Submitted by: Mike Sellenschuetter MFC after: 1 week --- adduser/rmuser.perl | 90 +++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 66 insertions(+), 24 deletions(-) (limited to 'adduser') diff --git a/adduser/rmuser.perl b/adduser/rmuser.perl index d35a453..691bb05 100644 --- a/adduser/rmuser.perl +++ b/adduser/rmuser.perl @@ -47,7 +47,6 @@ $group_file = "/etc/group"; $new_group_file = "${group_file}.new.$$"; $mail_dir = "/var/mail"; $crontab_dir = "/var/cron/tabs"; -$atjob_dir = "/var/at/jobs"; $affirm = 0; #$debug = 1; @@ -200,7 +199,7 @@ if (-e "$crontab_dir/$login_name") { # Remove the user's at jobs, if any # (probably also needs to be done before password databases are updated) -&remove_at_jobs($login_name, $uid); +&remove_at_jobs($login_name); # # Kill all the user's processes @@ -476,32 +475,75 @@ sub remove_files_from_dir { printf STDERR " done.\n"; } -sub remove_at_jobs { - local($login_name, $uid) = @_; - local($i, $owner, $found); - - $found = 0; - opendir(ATDIR, $atjob_dir) || return; - while ($i = readdir(ATDIR)) { - next if $i eq '.'; - next if $i eq '..'; - next if $i eq '.lockfile'; - $owner = (stat("$atjob_dir/$i"))[4]; # UID - if ($uid == $owner) { - if (!$found) { - print STDERR "Removing user's at jobs:"; - $found = 1; - } - # Use atrm to remove the job - print STDERR " $i"; - system('/usr/bin/atrm', $i); +sub invoke_atq { + local *ATQ; + my($user) = (shift || ""); + my($path_atq) = "/usr/bin/atq"; + my(@at) = (); + my($pid, $line); + + return @at if ($user eq ""); + + if (!defined($pid = open(ATQ, "-|"))) { + die("creating pipe to atq: $!\n"); + } elsif ($pid == 0) { + exec($path_atq, $user); + die("executing $path_atq: $!\n"); + } + + while(defined($_ = )) { + chomp; + if (/^\d\d:\d\d:\d\d\s+\d\d\/\d\d\/\d\d\s+(\S+)\s+\S+\s+(\d+)$/) { + push(@at, $2) if ($1 eq $user); } } - closedir(ATDIR); - if ($found) { - print STDERR " done.\n"; + close ATQ; + return @at; +} + +sub invoke_atrm { + local *ATRM; + my($user) = (shift || ""); + my($path_atrm) = "/usr/bin/atrm"; + my(@jobs) = @_; + my($pid); + my($txt) = ""; + + return "Invalid arguments" if (($user eq "") || ($#jobs == -1)); + + if (!defined($pid = open(ATRM, "-|"))) { + die("creating pipe to atrm: $!\n"); + } elsif ($pid == 0) { + exec($path_atrm, $user, @jobs); + } + + while(defined($_ = )) { + $txt .= $_; + } + close ATRM; + return $txt; +} + +sub remove_at_jobs { + my($user) = (shift || ""); + my(@at, $atrm); + + return 1 if ($user eq ""); + + print STDERR "Removing user's at jobs:"; + @at = invoke_atq($user); + return 0 if ($#at == -1); + + print STDERR " @at:"; + $atrm = invoke_atrm($user, @at); + if ($atrm ne "") { + print STDERR " -- $atrm\n"; + return 1; } + + print STDERR "done.\n"; + return 0; } sub resolvelink { -- cgit v1.2.3-56-ge451