diff options
Diffstat (limited to 'sendmail/contrib/movemail.pl')
-rwxr-xr-x | sendmail/contrib/movemail.pl | 106 |
1 files changed, 106 insertions, 0 deletions
diff --git a/sendmail/contrib/movemail.pl b/sendmail/contrib/movemail.pl new file mode 100755 index 000000000000..86bcb20118e5 --- /dev/null +++ b/sendmail/contrib/movemail.pl @@ -0,0 +1,106 @@ +#!/usr/bin/perl -w +# +# Move old mail messages between queues by calling re-mqueue.pl. +# +# movemail.pl [config-script] +# +# Default config script is /usr/local/etc/movemail.conf. +# +# Graeme Hewson <graeme.hewson@oracle.com>, June 2000 +# + +use strict; + +# Load external program as subroutine to avoid +# compilation overhead on each call + +sub loadsub { + my $fn = shift + or die "Filename not specified"; + my $len = (stat($fn))[7] + or die "Can't stat $fn: $!"; + open PROG, "< $fn" + or die "Can't open $fn: $!"; + my $prog; + read PROG, $prog, $len + or die "Can't read $fn: $!"; + close PROG; + eval join "", + 'return sub { my @ARGV = @_; $0 = $fn; no strict;', + "$prog", + '};'; +} + +my $progname = $0; +my $lastage = -1; +my $LOCK_EX = 2; +my $LOCK_NB = 4; + +# Load and eval config script + +my $conffile = shift || "/usr/local/etc/movemail.conf"; +my $len = (stat($conffile))[7] + or die "Can't stat $conffile: $!"; +open CONF, "< $conffile" + or die "Can't open $conffile: $!"; +my $conf; +read CONF, $conf, $len + or die "Can't read $conffile: $!"; +close CONF; +use vars qw(@queues $subqbase @ages $remqueue $lockfile); +eval $conf; + +if ($#queues < 1) { + print "$progname: there must be at least two queues\n"; + exit 1; +} + +if ($#ages != ($#queues - 1)) { + print "$progname: wrong number of ages (should be one less than number of queues)\n"; + exit 1; +} + +# Get lock or exit quietly. Useful when running from cron. + +if ($lockfile) { + open LOCK, ">>$lockfile" + or die "Can't open lock file: $!"; + unless (flock LOCK, $LOCK_EX|$LOCK_NB) { + close LOCK; + exit 0; + } +} + +my $remsub = loadsub($remqueue); + +# Go through directories in reverse order so as to check spool files only once + +for (my $n = $#queues - 1; $n >= 0; $n--) { + unless ($ages[$n] =~ /^\d+$/) { + print "$progname: invalid number $ages[$n] in ages array\n"; + exit 1; + } + unless ($lastage < 0 || $ages[$n] < $lastage) { + print "$progname: age $lastage is not > previous value $ages[$n]\n"; + exit 1; + } + $lastage = $ages[$n]; + if ($subqbase) { + my $subdir; + opendir(DIR, $queues[$n]) + or die "Can't open $queues[$n]: $!"; + foreach $subdir ( grep { /^$subqbase/ } readdir DIR) { + &$remsub("$queues[$n]/$subdir", "$queues[$n+1]/$subdir", + $ages[$n]); + } + closedir(DIR); + } else { + # Not using subdirectories + &$remsub($queues[$n], $queues[$n+1], $ages[$n]); + } +} + +if ($lockfile) { + unlink $lockfile; + close LOCK; +} |