This commit was manufactured by cvs2svn to create branch 'rh'.
[PerlMail.git] / perlmail-sendmail
diff --git a/perlmail-sendmail b/perlmail-sendmail
deleted file mode 100755 (executable)
index 2177e2c..0000000
+++ /dev/null
@@ -1,204 +0,0 @@
-#! /usr/bin/perl
-# 
-#      $Id$
-# Copyright (C) 2002-2003 Jan Kratochvil <project-PerlMail@jankratochvil.net>
-# 
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-# 
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-# 
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software
-# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
-
-
-use vars qw($VERSION);
-$VERSION=do { my @r=(q$Revision$=~/\d+/g); sprintf "%d.".("%03d"x$#r),@r; };
-use strict;
-use warnings;
-
-use File::Basename;
-use File::Spec::Link;
-BEGIN {
-       eval 'use lib $ENV{"PERLMAIL_BASEDIR"} || File::Basename::dirname(File::Spec::Link->resolve($0));';
-       }
-use PerlMail::Config;
-use PerlMail::Lib;
-
-require Getopt::Long;
-use POSIX qw(WIFEXITED WEXITSTATUS WIFSIGNALED WTERMSIG WIFSTOPPED WSTOPSIG);
-require MIME::Head;    # inherits Mail::Header
-require Mail::Address;
-
-
-sub sendmail_show { return "\"$sendmail_orig\" ".join(",",map("\"$_\"",@ARGV)); }
-
-sub sendmail_orig_exec
-{
-       exec {$sendmail_orig} $0,@ARGV or die "exec(".sendmail_show()."): $!";
-       die "NOTREACHED";
-}
-
-Getopt::Long::Configure(
-               "no_ignorecase",
-               "no_getopt_compat",
-               "bundling",
-               # FIXME: workaround: 'unknown options' are considered the same as 'arguments'
-               # None of ($REQUIRE_ORDER, $PERMUTE, $RETURN_IN_ORDER) can help us.
-               # No preprocessing possible as it is hard to find option arguments.
-               "permute",
-               "pass_through",
-               );
-
-my $opt_b;
-my $opt_Q;
-my $opt_q;
-my $opt_t;
-our $opt_f;    # not exported, just for local()
-my $opt_perlmail_dry_run;
-my @ARGV_save=@ARGV;   # for non-bm mode
-die if !Getopt::Long::GetOptions(
-               "b=s"              ,\$opt_b,
-               "Q:s"              ,\$opt_Q,
-               "q:s"              ,\$opt_q,
-               "t"                ,\$opt_t,
-               "f=s"              ,\$opt_f,
-               "F=s"              ,\$opt_F,
-               "perlmail-dry-run+",\$opt_perlmail_dry_run,
-               );
-if (0
-               # RedHat sendmail-8.12.5-7/sendmail/main.c/\QDo a quick prescan of the argument list.\E
-               || grep({ File::Basename::basename($0) eq $_; } "newaliases","mailq","smtpd","hoststat","purgestat")
-               # -bm: Deliver mail in the usual way (default).
-               || (defined($opt_b) && $opt_b ne "m")
-               || defined $opt_q       # MD_QUEUERUN
-               || defined $opt_Q       # MD_QUEUERUN
-               ) {
-       @ARGV=@ARGV_save;
-       sendmail_orig_exec();
-       die "NOTREACHED";
-       }
-
-# RedHat sendmail-8.9.3-20/src/main.c/main()/\Qif (FullName != NULL)\E
-#   for $opt_F is implemented by Mail::Address in our &FromAddress
-
-my $head=MIME::Head->new(\*STDIN);
-# options leave in @ARGV, addresses to @addr:
-my @args=@ARGV;        # temporary
-@ARGV=();      # options
-my @addr=();   # addresses
-push @{(/^-./ ? \@ARGV : \@addr)},$_ for (@args);
-if ($opt_t) {
-       for my $addrobj (map({ Mail::Address->parse($_); } map({ ($head->get($_)); } @h_rcpt))) {
-               if (!$addrobj->address()) {
-                       # bogus, shouldn't happen
-                       warn "->address() not found in \"".$addrobj->format()."\"";
-                       next;
-               }
-               push @addr,$addrobj;
-               }
-       }
-
-sub matches
-{
-       return 
-}
-
-my $from_headername;
-{
-       my $muttrc_From=parseone(scalar muttrc_get("from"));    # may get undef()!; parseone() may be redundant
-       $muttrc_From=$muttrc_From->address() if $muttrc_From;
-       $opt_f=undef() if defined($opt_f) && $muttrc_From && lc($opt_f) eq lc($muttrc_From);
-       for (@h_from) {
-               $from_headername=$_;    # leave last item in $from_headername
-               next if !(my @from_val=$head->get($from_headername));
-               @from_val=map({ ($_->address()); } map({ (Mail::Address->parse($_)); } @from_val));
-               $from_headername=undef() if !(1==@from_val && $muttrc_From && lc($from_val[0]) eq lc($muttrc_From));
-               last;
-               }       # fallthru with $from_headername remaining set if last headername did not exist
-       # now $from_headername contains the header name to be replaced w/substituted value
-       }
-
-# to be utilized later by &FromAddress
-$is_pgp=(1
-               && do { local $_=$head->mime_attr("Content-Type");          $_ && ~m#^multipart/(?:signed|encrypted)$#; }
-               && do { local $_=$head->mime_attr("Content-Type.protocol"); $_ && ~m#^application/pgp\b#; }
-               );
-
-my $exitcode=0;
-# !defined($rcpt) if we have no recipients
-# make the list unique to prevent dupes being normally filtered by sendmail(8)
-# one '{' is block-wrapper, another '{' is hash-indirection!
-# hash keys are just strings, never refs!
-# unify the list as Mail::Address instances
-my @rcpts=(!@addr ? (undef()) : values(%{{ map({
-               my $obj=$_;
-               $obj=parseone $obj if !ref $obj;
-               (!defined $obj ? () : (lc($obj->address())=>$obj));
-               } @addr) }}));
-
-my $stdin_body=(@rcpts<=1 ? undef() : do {     # store input data only if it will be used multiple times
-               local $/=undef();
-               <STDIN>;
-               });
-for my $rcpt (@rcpts) {
-       local @ARGV=@ARGV;
-       local $opt_f=$opt_f;
-
-       if (defined $rcpt) {    # !defined($rcpt) if we have no recipients
-               local $_;
-               $opt_f=FromAddress($rcpt,1)->address() if !defined $opt_f;
-               if ($from_headername) {
-                       if (my $fromaddr=FromAddress($rcpt,0)->format()) {
-                               $head->replace($from_headername,$fromaddr);
-                               }
-                       }
-               }
-
-       1;      # drop '-bm' if present as it is default anyway
-       1;      # drop '-t' if present as we are looping now for it
-       push @ARGV,"-f",$opt_f if defined $opt_f;
-       # we don't handle "Full-Name" header thus pass "-F"
-       # "From/Resent-From" should be handled by our &FromAddress
-       push @ARGV,"-F",$opt_F if defined $opt_F;
-       push @ARGV,$rcpt->address() if defined $rcpt;
-       push @ARGV,@addr_addon;
-
-       local $SIG{"PIPE"}=sub { die "Got SIGPIPE from ".sendmail_show(); };
-       local *SENDMAIL;
-       if ($opt_perlmail_dry_run) {
-               print sendmail_show()."\n";
-               *SENDMAIL=\*STDOUT;
-               }
-       else {
-               defined (my $pid=open SENDMAIL,"|-") or die "Cannot fork to spawn ".sendmail_show().": $!";
-               sendmail_orig_exec() if !$pid; # child
-               }
-       $head->print(\*SENDMAIL);
-       print SENDMAIL "\n";    # MIME::Head->print() eats the empty line but it doesn't print it
-       if (defined($stdin_body)) {
-               print SENDMAIL $stdin_body;
-               }
-       else {
-               local $_;
-               while (<STDIN>) {
-                       print SENDMAIL $_;
-                       }
-               }
-
-       next if $opt_perlmail_dry_run;  # don't close our STDOUT as it is aliased to *SENDMAIL
-       close SENDMAIL or warn "close(".sendmail_show()."): $?=".join(",",
-                       (!WIFEXITED($?)   ? () : ("EXITSTATUS(".WEXITSTATUS($?).")")),
-                       (!WIFSIGNALED($?) ? () : ("TERMSIG("   .WTERMSIG($?)   .")")),
-                       (!WIFSTOPPED($?)  ? () : ("STOPSIG("   .WSTOPSIG($?)   .")")),
-                       );
-       my $gotcode=(!WIFEXITED($?) ? 99 : WEXITSTATUS($?));
-       $exitcode=$gotcode if $gotcode>$exitcode;
-       }
-exit $exitcode;