'sendmail_options' => [],
);
+my $new_nullmailer = 0;
+## The new nullmailer passes options on STDIN and the message on FD 3.
+my $message_fd = \*STDIN;
+eval {
+ my $fh = IO::Handle->new() or
+ die "Unable to create new fd";
+ $fh->fdopen(3,"r") or
+ die "Unable to open fd 3: $!";
+ $message_fd = $fh;
+ $new_nullmailer = 1;
+ push @ARGV, map {chomp; "--$_"} <STDIN>;
+};
+
GetOptions(\%options,'identity|i=s','username|l=s','daemon|d', 'syslog|s',
+ 'host=s',
'sendmail_options|sendmail-options|o=s@',
'help|h|?','man|m');
$DEBUG = $options{debug};
-if (not @ARGV) {
+if (not (@ARGV or defined $options{host})) {
print STDERR "${0}: Too few command-line arguments\n";
print <<END;
usage: ${0} [flags] remote-address < mail-file
exit(1);
}
-my $hostname = shift @ARGV;
+if (not defined $options{host} and @ARGV) {
+ $options{host} = shift @ARGV;
+}
-my @message = <>;
+my @message = <$message_fd>;
#throw away envelope sender
shift @message;
my @recipients;
@recipients = qw(-t) if not @recipients;
-my @ssh_arguments = ($hostname);
+my @ssh_arguments = ($options{host});
push @ssh_arguments, '-i', $options{identity} if defined $options{identity};
push @ssh_arguments, '-l', $options{username} if defined $options{username};
push @sendmail_options,@recipients;
$Data::Dumper::Useqq=1;
my $sendmail_options = Data::Dumper->Dump([\@sendmail_options],[qw(*sendmail_options)]);
-print STDERR $sendmail_options;
+print STDERR $sendmail_options if $DEBUG;
push @ssh_arguments, q(perl -e ').<<EOF .q(');
use Digest::MD5 qw(md5_hex);
use IO::Handle;
EOF
$Data::Dumper::Useqq=0;
-print STDERR Dumper(\@ssh_arguments);
+print STDERR Dumper(\@ssh_arguments) if $DEBUG;
-qx(ping -q -c 3 $hostname 2>/dev/null);
+qx(ping -q -w 3 -c 1 $options{host} 2>/dev/null);
if ($?) {
- syslog(LOG_WARNING,"${0}: Failed: unable to ping $hostname\n");
+ syslog(LOG_WARNING,"${0}: Failed: unable to ping $options{host}\n");
exit (9);
}
-print STDERR md5_hex(join('',@message))."\n";
+print STDERR md5_hex(join('',@message))."\n" if $DEBUG;
my $ssh = new IO::Handle;
open($ssh,'|-','ssh',@ssh_arguments) or exit(17);
print {$ssh} @message or exit(17);