most of these changes were by Rasjid Wilcox <rasjidw@openminddev.net>.

Fix error handling in queue/qmail-queue.

  Add option to queue/qmail-queue to specify an alternate qmail-queue
  location.

  Add support for the QMAILQUEUE environment variable.

  PPerl compatibility (yay!)


git-svn-id: https://svn.perl.org/qpsmtpd/trunk@110 958fd67b-6ff1-0310-b445-bb7760255be9
This commit is contained in:
Ask Bjørn Hansen 2003-01-20 11:01:32 +00:00
parent 50451c09a4
commit bcaf58471e

View File

@ -1,7 +1,37 @@
=head1 NAME
qmail-queue
=head1 DESCRIPTION
This is the most common plugin used to queue incoming mails. A
variation of this plugin would maybe forward the mail via smtp.
=head1 CONFIG
It takes one optional parameter, the location of qmail-queue. This
makes it easy to use a qmail-queue replacement.
queue/qmail-queue /var/qmail/bin/another-qmail-queue
If set the environment variable QMAILQUEUE overrides this setting.
=cut
sub register { sub register {
my ($self, $qp) = @_; my ($self, $qp, @args) = @_;
$self->register_hook("queue", "queue_handler"); $self->register_hook("queue", "queue_handler");
if (@args > 0) {
$self->{_queue_exec} = $args[0];
$self->log(1, "WARNING: Ignoring additional arguments.") if (@args > 1);
} else {
$self->{_queue_exec} = "/var/qmail/bin/qmail-queue";
}
$self->{_queue_exec} = $ENV{QMAILQUEUE} if $ENV{QMAILQUEUE};
} }
sub queue_handler { sub queue_handler {
@ -44,14 +74,34 @@ sub queue_handler {
} }
elsif (defined $child) { elsif (defined $child) {
# Child # Child
close MESSAGE_WRITER or die "could not close message writer in parent"; close MESSAGE_WRITER or exit 1;
close ENVELOPE_WRITER or die "could not close envelope writer in parent"; close ENVELOPE_WRITER or exit 2;
open(STDIN, "<&MESSAGE_READER") or die "b1"; # Untaint $self->{_queue_exec}
open(STDOUT, "<&ENVELOPE_READER") or die "b2"; my $queue_exec = $self->{_queue_exec};
if ($queue_exec =~ /^(\/[\/\-\_\.a-z0-9A-Z]*)$/) {
$queue_exec = $1;
} else {
$self->log(1, "FATAL ERROR: Unexpected characters in qmail-queue plugin argument");
exit 3;
}
unless (exec '/var/qmail/bin/qmail-queue') { # save the original STDIN and STDOUT
return (DECLINED, "fatal error spawning qmail-queue"); open(SAVE_STDIN, "<&STDIN");
} open(SAVE_STDOUT, ">&STDOUT");
# what are those exit values for? Why don't we die with a useful error message?
open(STDIN, "<&MESSAGE_READER") or exit 4;
open(STDOUT, "<&ENVELOPE_READER") or exit 5;
$self->log(7, "Queuing to $queue_exec");
my $rc = exec $queue_exec;
# restore the original STDIN and STDOUT
open(STDIN, "<&SAVE_STDIN");
open(STDOUT, ">&SAVE_STDOUT");
exit 6 if not $rc;
} }
} }