diff options
65 files changed, 10767 insertions, 5 deletions
diff --git a/checksendmail/BSDI_CONTRIB b/checksendmail/BSDI_CONTRIB new file mode 100644 index 0000000..97871d5 --- /dev/null +++ b/checksendmail/BSDI_CONTRIB @@ -0,0 +1,18 @@ +Software Package: + checksendmail + +Release/Version: + Dated 7/11/90. + +Retrieved from: + N/A. + +Bug reports: + This software package is maintained by the software contributor, + not BSDI. Please send any bug reports to both support@BSDI.COM + and polk@bsdi.com. + +Comments: + +=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= +Modifications to this version made by BSDI: diff --git a/checksendmail/CVS/Entries b/checksendmail/CVS/Entries new file mode 100644 index 0000000..692e38d --- /dev/null +++ b/checksendmail/CVS/Entries @@ -0,0 +1,5 @@ +/BSDI_CONTRIB/1.1/Mon Jan 22 10:57:27 1996 Tue Oct 24 17:29:51 1995// +/Makefile/1.3/Mon Jan 22 10:57:28 1996 Fri Jan 6 22:34:35 1995// +/address.resolve/1.1.1.1/Mon Jan 22 10:57:28 1996 Thu Jan 13 14:15:30 1994// +/checksendmail.8/1.1.1.1/Mon Jan 22 10:57:28 1996 Thu Jan 13 14:15:31 1994// +/checksendmail.perl/1.1.1.1/Mon Jan 22 10:57:29 1996 Thu Jan 13 14:15:31 1994// diff --git a/checksendmail/CVS/Repository b/checksendmail/CVS/Repository new file mode 100644 index 0000000..b300606 --- /dev/null +++ b/checksendmail/CVS/Repository @@ -0,0 +1 @@ +/master/contrib/checksendmail diff --git a/checksendmail/Makefile b/checksendmail/Makefile new file mode 100644 index 0000000..101ba4e --- /dev/null +++ b/checksendmail/Makefile @@ -0,0 +1,15 @@ +# BSDI $Id: Makefile,v 1.3 1995/01/07 05:34:35 donn Exp $ + +MAN8= checksendmail.0 + +all checksendmail: ${MAN8} + +clean depend tags: + +install: maninstall + install -c -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} \ + ${.CURDIR}/checksendmail.perl ${DESTDIR}${BINDIR}/checksendmail + install -c -o ${BINOWN} -g ${BINGRP} -m 0444 \ + ${.CURDIR}/address.resolve ${DESTDIR}/usr/contrib/lib/ + +.include <bsd.prog.mk> diff --git a/checksendmail/address.resolve b/checksendmail/address.resolve new file mode 100644 index 0000000..01f3011 --- /dev/null +++ b/checksendmail/address.resolve @@ -0,0 +1,27 @@ + +# BSDI $Id: address.resolve,v 1.1.1.1 1994/01/13 21:15:30 polk Exp $ + +# Sample address resolution file for checksendmail(8) + +# local addresses +user +user@hilltop +user@hilltop.BSDI.COM +hilltop!polk + +# within-domain addresses +user@bsdi.com +user@ibapah +user@ibapah.bsdi.com +ibapah!user + +# faraway addresses +user@xxxxxxx.com +user@xxxxxxx.dom +site!user + +# addresses with routing, etc. +site1!site2!user +user@xxxxxxx.dom@bar.dom +site!user@xxxxxxx.dom +site!user@uunet.uu.net diff --git a/checksendmail/checksendmail.8 b/checksendmail/checksendmail.8 new file mode 100644 index 0000000..b129c35 --- /dev/null +++ b/checksendmail/checksendmail.8 @@ -0,0 +1,223 @@ +.\" BSDI $Id: checksendmail.8,v 1.1.1.1 1994/01/13 21:15:31 polk Exp $ +.Dd January 12, 1994 +.Dt CHECKSENDMAIL 8 +.Os +.Sh NAME +.Nm checksendmail +.Nd verify sendmail address transformations. +.Sh SYNOPSIS +.Nm checksendmail +.Op Fl C Ar file.cf +.Op Fl r Ar resolve +.Op Fl T Ar test.address +.Op Fl b Ar sendmail_binary +.Sh DESCRIPTION +.Pp +The +.Nm checksendmail +program is a +.Xr perl +script that aids the testing of +.Xr sendmail 8 's +various configuration files. +.Nm checksendmail +passes typical addresses (supplied in input files) through +.Xr sendmail +and prints the results of the resolution and transformation routines. +.Pp +The input files contain a list of addresses, one per line. +For example: +.Bd -literal -offset indent +user +user@site +user@site.com +.Ed +.Pp +The input file can contain comments started with a +.Em # +and blank lines. +.Sh OPTIONS +.Pp +.Bl -tag -width Fl -compact -offset left +.It Fl C Ar file.cf +Use the +.Xr sendmail +configuration file +.Ar file.cf +instead of the default +.Pa /etc/sendmail.cf +file. +.It Fl r Ar resolve +Use +.Ar resolve +as the input file for the addresses to be used for mail resolving. Defaults +to +.Ar address.resolve . +.It Fl T Ar test.address +Use +.Ar test.address +as the single address to test. Cannot be used in conjunction with +file setting flags. +.It Fl B Ar sendmail_binary +Use the specified +.Ar sendmail_binary +as the path to invoke sendmail (instead of +.Pa /usr/sbin/sendmail ) . +.El +.Sh EXAMPLES +.Pp +The following command will pass the addresses in +.Ar address.resolve +through +.Xr sendmail +using the configuration information in +.Ar myconfig.cf . +.Bd -literal -offset left +example% cat address.resolve +user +user@site +user@site.com +example% checksendmail \-C myconfig.cf +config file: myconfig.cf resolve file: address.resolve +towhom file: address.resolve fromwhom file: address.resolve +Mail address resolution +user --(ether )--> user[rmtc] +user@site --(ether )--> user@site[rmtc] +user@site.com --(ether )--> user@site.com[rmtc] +`To' address transformations for mailer ether: +user ----> user +user@site ----> user@site +user@site.com ----> user@site.com +`From' address transformations for mailer ether: +user ----> user +user@site ----> user +user@site.com ----> user +.Ed +.Pp +The first section of the output shows how the addresses in the input +files are resolved by +.Xr sendmail 8 . +Consider the following output line: +.Pp +.Dl user@site.com --(ether )--> user@site.com[rmtc] +.Pp +The input address +.Em user@site.com +resolves to use the +.Em ether +mailer. That mailer is directed to send the mail to +to the user +.Em user@site.com +at site +.Em rmtc +(as indicated in the square brackets). +.Pp +The two later sections of output show how the addresses specified as +the +.Em To +and +.Em From +address are transformed in the text of the +headers. In the example above, the +.Em To +addresses are untouched. +The +.Em From +addresses, however, all lose their machine information on +the way through the mailer: +.Pp +.Dl user@site ----> user +.Pp +This may be desirable when using a configuration file on a +workstation which is to be hidden as a mailhost from the rest of the +network. +.Pp +The following is a set of addresses used at one site for the purposes of +testing address resolution. Comments after the addresses detail why +particular addresses are present: +.Bl -tag -width "user@machine.com" -compact -offset indent +.It user +Standard trivial address +.It user@rmtc +qualified at one level +.It user@rmtc.central +qualified at two levels +.It user@rmtc.central.sun.com +qualified all the way +.It rmtc!user +local but specified as uucp +.It user@summit +a workstation (normally delivered locally, though) +.It user@summit.central +same but more qualified +.It user@summit.central.sun.com +same but fully qualified +.It summit!user +same but specified as uucp +.It user@prisma +Backward compatibility tests +.It user@prisma.com +.It prisma!user +.It user@central +Superior domain testing +.It user@machine.central +more qualified, but unknown +.It user@summit.central +more qualified and known +.It user@eng +name in faraway domain +.It user@machine.eng +unknown machine in faraway domain +.It user@summit.eng +local machine, far away domain +.It user@hoback +far away machine +.It user@machine +apparently local but unknown machine +.It user@sun.com +Standard trivial address +.It user@machine.dom.sun.com +fully qualified but unknown machine +.It user@foo.com +standard, known, really far away domain +.It user@foo.dom +standard, unknown, really far away domain +.It site!user +Single level uucp +.It site1!site2!user +Double level uucp +.It user@foo.dom@bar.dom +Trickier address +.It site!user@foo.dom +Mixed uucp/domain +.It site!user@uunet.uu.net +Mixed double uucp/domain +.El +.Sh NOTES +Note that +.Nm checksendmail +is a +.Xr perl +script. If your site does not have +.Xr perl 1 , +it can be obtained via anonymous +.Xr ftp +from +.Em ftp.uu.net . +.Pp +.Xr sendmail +requires that the user have access to directory specified by the +.Em OQ +parameter in the configuration file (normally +.Pa /usr/spool/mqueue ) . +.Nm checksendmail +verifies that the user has access to this directory before allowing the +test to continue. +.Sh AUTHORS +.Bd -literal +Gene Kim +Rob Kolstad +Jeff Polk +.Ed +.Sh "SEE ALSO" +.Xr sendmail 8 diff --git a/checksendmail/checksendmail.perl b/checksendmail/checksendmail.perl new file mode 100644 index 0000000..a8e9e11 --- /dev/null +++ b/checksendmail/checksendmail.perl @@ -0,0 +1,377 @@ +#!/usr/bin/perl + +# BSDI $Id: checksendmail.perl,v 1.1.1.1 1994/01/13 21:15:31 polk Exp $ + +# checksendmail +# +# The checksendmail program is a perl script that aids the testing +# of sendmail's various configuration filse. checksendmail +# passes typical addresses (supplied in input files) through +# sendmail and prints the result of the resolution and +# transformation routines. +# +# Gene Kim & Rob Kolstad & Jeff Polk, 7/11/90 + +# -- -C config file +# -- -r resolve_addresses_file +# -- -T test one address +# -- -b sendmail binary + +# XXX deficiencies: ``/etc/sendmail'' should be a parameter + +# defaults: + $resolve = "address.resolve"; + $cffile = "/etc/sendmail.cf"; + $sendmail = "/usr/sbin/sendmail"; + +sub usage { + die "Usage: checksendmail [-C cffile.cf] [-r resolve_addrs_file [-T one\@test.addr\n"; +} + +for (unshift (@ARGV, "XX"); $#ARGV > 0; shift ARGV) { + if ($ARGV[1] eq "-C") + { + shift @ARGV; + if ($#ARGV >= 1) {$cffile = $ARGV[1]; } + else { &usage(); } + } + elsif ($ARGV[1] eq "-r") + { + if ($setfile & 1) { die "Can only set `resolve' once"; } + shift @ARGV; + if ($#ARGV < 1) { &usage(); } + $resolve = $ARGV[1]; + $setfile += 1; + } + elsif ($ARGV[1] eq "-T") + { + if ($setfile) { die "Can't set other files and use -T"; } + shift @ARGV; + if ($#ARGV < 1) { &usage(); } + open (OUT, ">/tmp/csm.in$$") || + die "Can't open >/tmp/csm.in$$"; + $resolve = "/tmp/csm.in$$"; + print OUT "$ARGV[1]\n"; + close (OUT); + $setfile = 7; + } + elsif ($ARGV[1] eq "-b") + { + shift @ARGV; + if ($#ARGV >= 1) {$sendmail = $ARGV[1]; } + else { &usage(); } + } + else { &usage(); } +} + +if (!-e $cffile) { die "Can't find configuration file $cffile\n"; } +if (!-e $resolve) { die "Can't find name file $resolve\n"; } + +# make sure the user can access the ../mqueue directory + +$maildir = `grep ^OQ $cffile`; +chop $maildir; +$maildir =~ s/^OQ//; +if ((!-r $maildir) || (!-x $maildir) || (!-w $maildir)) { + warn "checksendmail: can't access $maildir! trying anyway...\n"; +} + +chop($hostname = `hostname`); +chop($pwd = `pwd`); +print "system: $hostname\t\tcurrent dir: $pwd\n"; +print "config file: $cffile\t\tresolve file: $resolve\n"; + +sub handler { # 1st argument is signal name + local($sig) = @_; + print STDERR "Caught a SIG$sig--shutting down\n"; + unlink("/tmp/csm$$") || die "Can't unlink /tmp/csm$$"; + unlink("/tmp/csm.in$$"); + exit(0); +} + +$SIG{'INT'} = 'handler'; +$SIG{'QUIT'} = 'handler'; + + +# glean the mailers used from the rule 0 tests + +sub parseresolve +{ + while (<MAIL>) + { + if (/^ADDRESS TEST MODE/) { next; } + if (/^Enter <ruleset>/) { next; } + if (/^>/) # INPUT LINE! (and last output is done) + { + chop; + if ($prevline) { # OUTPUT LINE! + &printparseresolve; + } + s/> *[0-9,]* *//g; + s/.*input: *//; + s/ //g; + s/"//g; + $input = $_; + } + else { chop; } + $prevline = $_; + } + &printparseresolve; +} + +sub printparseresolve { + $prevline =~ s/.*returns: *//; + $prevline =~ s/"//g; + $prevline =~ s/ //g; + # Don't strip spaces off error messages + $prevline =~ s/ *([.!%<>]) */$1/g; + $prevline =~ s/ +([;?\$])/$1/g; + $prevline =~ s/([#\@:]) +/$1/g; + +# non-Sun test mode delimiters -> easily-readable style +# Mark Sausville, MIT Media Laboratory, saus@media-lab.media.mit.edu + $prevline =~ s/\^V/\$#/; + $prevline =~ s/\^W/\$@/; + $prevline =~ s/\^X/\$:/; + + #### $#ether$@sun-barr.Ebay.Sun.COM$:site!user@uunet.uu.NET + @t = split( '\$', $prevline); + $address = "XXX"; + $remote = "XXX"; + $mailer = "XXX"; + for ($i = 1; $i <= $#t; $i++) + { + if (substr($t[$i], 0, 1) eq ":") + { $address = substr($t[$i], 1,999); } + if (substr($t[$i], 0, 1) eq "@") + { $remote = substr($t[$i], 1,999); } + if (substr($t[$i], 0, 1) eq "#") + { $mailer = substr($t[$i], 1,999); + $mailer =~ tr/A-Z/a-z/; } + } + printf("%-27.27s --(%-6.6s)--> %s[%s]\n", $input, $mailer, + $address, $remote); + if ($mailer ne "XXX") { $themailers{$mailer}.="$input ";} +} + +# Parse output of sendmail name resolution + +sub parseaddress +{ +## ADDRESS TEST MODE +## Enter <ruleset> <address> +## > rewrite: ruleset 3 input: "user" + + open(MAIL, $_[0]) || die "Can't open $_[0]...\n"; + local ($k, $address, $prevline, $mailer, $remote, $input); + print $_[1]; # the title + + $done = 0; + while (<MAIL>) + { + if (/^> *$/) { $done = 1; } + if (/^ADDRESS TEST MODE/) { next; } + if (/^Enter <ruleset>/) { next; } + chop; + if (/^>/) # INPUT LINE! (and last output is done) + { + if ($prevline) { # OUTPUT LINE! + $prevline =~ s/.*returns: *//; + $prevline =~ s/"//g; + $prevline =~ s/ //g; +#> rewrite: ruleset 3 input: "site" "!" "user" "@" "uunet" "." "uu" "." "net" +#rewrite: ruleset 8 input: "site" "!" "user" "@" "uunet" "." "uu" "." "net" +#> + printf("%-27.27s ----> %s\n", $input, $prevline); + } + s/> *[0-9,]* *//g; + s/.*input: *//; + s/ //g; + s/"//g; + $input = $_; + } + last if $done; + $prevline = $_; + } + close(MAIL); +} + + +# pass names from resolve files to sendmail + +open(IN, $resolve) || die "can't open $resolve\n"; +open(OUT, ">/tmp/csm$$") || die "can't open >/tmp/csm$$\n"; +while (<IN>) +{ + /^$/ && next; + /^#/ && next; + print OUT "3,0 $_"; + chop; + $allinput .= " $_"; +} +close(OUT); +close(IN); +$sendmailprog = "$sendmail -bt -C$cffile < /tmp/csm$$|"; +open(MAIL, $sendmailprog) || die "can't exec $sendmailprog...\n"; +print "Mail address resolution (rule 0)\n\n"; +&parseresolve(); + +# calculate $f + $sendmailprog = "|$sendmail -bt -C$cffile > /tmp/csm$$"; + open (OUT, $sendmailprog); + open (IN, $resolve); + $rules = "3,1,4"; + while (<IN>) { + chop; + /^$/ && next; + /^#/ && next; + $address = $_; + print OUT "$rules $address\n"; + } + print OUT "\n"; # stuff last line into sendmail + close(IN); + close(OUT); + &parseaddress ("/tmp/csm$$", "\n\n\$f address header transformations\n\n"); + +# Get the R= and S= special rulesets from the configuration + +open(FID, "grep ^M $cffile|"); +while (<FID>) +{ +# Mether, P=[IPC], F=msDFMueCX, S=11, R=21, A=IPC $h + chop; + $thisline = $_; $thisline =~ s/M//; $thisline =~ s/,.*//; + $thisline =~ tr/A-Z/a-z/; + $sendrule = $_; $sendrule =~ s/.*S=//; $sendrule =~ s/,.*//; + if ($sendrule=~q!/!) { + ($esendrule, $hsendrule) = split (q!/!, $sendrule); + } + else { $esendrule = $hsendrule = $sendrule; } + $recvrule = $_; $recvrule =~ s/.*R=//; $recvrule =~ s/,.*//; + if ($recvrule=~q!/!) { + ($erecvrule, $hrecvrule) = split (q!/!, $recvrule); + } + else { $erecvrule = $hrecvrule = $recvrule; } + $esendrules{$thisline} = $esendrule; + $hsendrules{$thisline} = $hsendrule; + $erecvrules{$thisline} = $erecvrule; + $hrecvrules{$thisline} = $hrecvrule; +} +close(FID); + +# pass names from various mailers through sendmail + +foreach $i (keys %themailers) +{ + $sendmailprog = "|$sendmail -bt -C$cffile > /tmp/csm$$"; + if ($erecvrules{$i} == 0) { + print "\n\nCan't find recv rule for `$i', skipping this mailer <-------------------\n"; + next; + } + open (OUT, $sendmailprog); + @namelist = split(/ /, $allinput); + $rules = "3,2,$erecvrules{$i},4"; + foreach (@namelist) { + print OUT "$rules $_\n"; + } + print OUT "\n"; # stuff last line into sendmail + close(OUT); + $note = ""; + if ($erecvrules{$i} eq $hrecvrules{$i}) { $note = "and header "; } + &parseaddress ("/tmp/csm$$", "\n\n`To' envelope ${note}address transformations for mailer $i [$rules]:\n\n"); +} +foreach $i (keys %themailers) +{ + $sendmailprog = "|$sendmail -bt -C$cffile > /tmp/csm$$"; + if ($hrecvrules{$i} == 0) { + print "\n\nCan't find recv rule for `$i', skipping this mailer <-------------------\n"; + next; + } + if ($hrecvrules{$i} ne $erecvrules{$i}) { + open (OUT, $sendmailprog); + @namelist = split(/ /, $allinput); + $rules = "3,2,$hrecvrules{$i},4"; + foreach (@namelist) { + print OUT "$rules $_\n"; + } + print OUT "\n"; # stuff last line into sendmail + close(OUT); + &parseaddress ("/tmp/csm$$", "\n\n`To' header address transformations for mailer $i [$rules]:\n\n"); + } +} + +# pass names from various mailers through sendmail +foreach $i (keys %themailers) +{ + $sendmailprog = "|$sendmail -bt -C$cffile > /tmp/csm$$"; + if ($esendrules{$i} == 0) { + print "\n\nCan't find send rule for `$i', skipping this mailer <-------------------\n"; + next; + } + open (OUT, $sendmailprog); + open (IN, $resolve); + $rules = "3,1,$esendrules{$i},4"; + while (<IN>) { + chop; + /^$/ && next; + /^#/ && next; + $address = $_; + print OUT "$rules $address\n"; + } + print OUT "\n"; # stuff last line into sendmail + close(IN); + close(OUT); + $note = ""; + if ($esendrules{$i} eq $hsendrles{$i}) {$note = "and header ";} + &parseaddress ("/tmp/csm$$", "\n\n`From' envelope ${note}address transformations for mailer $i [$rules]:\n\n"); +} +foreach $i (keys %themailers) +{ + $sendmailprog = "|$sendmail -bt -C$cffile > /tmp/csm$$"; + if ($hsendrules{$i} == 0) { + print "\n\nCan't find send rule for `$i', skipping this mailer <-------------------\n"; + next; + } + open (OUT, $sendmailprog); + open (IN, $resolve); + $rules = "3,1,$hsendrules{$i},4"; + while (<IN>) { + chop; + /^$/ && next; + /^#/ && next; + $address = $_; + print OUT "$rules $address\n"; + } + print OUT "\n"; # stuff last line into sendmail + close(IN); + close(OUT); + &parseaddress ("/tmp/csm$$", "\n\n`From' address header transformations for mailer $i [$rules]:\n\n"); +} +foreach $i (keys %themailers) +{ + $sendmailprog = "|$sendmail -bt -C$cffile > /tmp/csm$$"; + if ($esendrules{$i} == 0) { + print "\n\nCan't find send rule for `$i', skipping this mailer <-------------------\n"; + next; + } + open (OUT, $sendmailprog); + open (IN, $resolve); + $rules = "3,1,4,3,1,$hsendrules{$i},4"; # XXX esendrules? book p. 431??? + while (<IN>) { + chop; + /^$/ && next; + /^#/ && next; + $address = $_; + print OUT "$rules $address\n"; + } + print OUT "\n"; # stuff last line into sendmail + close(IN); + close(OUT); + $note = ""; + if ($esendrules{$i} eq $hsendrles{$i}) {$note = "and header ";} + &parseaddress ("/tmp/csm$$", "\n\n\$g address transformations for mailer $i [$rules]:\n\n"); +} + +unlink("/tmp/csm$$") || die "Can't unlink /tmp/csm$$"; +unlink("/tmp/csm.in$$"); + diff --git a/contrib/passwd-to-alias.pl b/contrib/passwd-to-alias.pl index 05a51b9..b571927 100755 --- a/contrib/passwd-to-alias.pl +++ b/contrib/passwd-to-alias.pl @@ -1,4 +1,4 @@ -#!/bin/perl +#!/usr/bin/perl # # Convert GECOS information in password files to alias syntax. diff --git a/debian/README.Debian b/debian/README.Debian new file mode 100644 index 0000000..6bbc72c --- /dev/null +++ b/debian/README.Debian @@ -0,0 +1,67 @@ + +This Debian package includes an automatic configuration utility +`sendmailconfig' which can be run at any time to modify the current sendmail +configuration. + +Most mail-related configuration files are kept in the /etc/mail directory. + +Specialized configurations can be accomplished by editing the file +/etc/mail/sendmail.mc by hand and then running `sendmailconfig' to generate +and use the appropriate corresponding sendmail.cf file. Such configurations +can make use of the m4 configuration macros kept in the /usr/lib/sendmail.cf +directory. See also the other documentation in this directory. + +Finally, the file /etc/aliases holds a text representation of the current mail +aliases. See the aliases(5) man page for more information. If you edit this +file, be sure to run `newaliases' to update the corresponding binary database. + +The Debian sendmail package includes Miquel's patch: + + + PREVENT UNAUTHORIZED USE OF YOUR HOSTS AS SMTP RELAY + + Miquel van Smoorenburg <miquels@cistron.nl> 23-Aug-1997 + +The patch at the end of this file adds a new option to sendmail, +`W' or `TcpWrappers'. This makes it possible for precompiled distributions +to ship binaries compiled with -DTCPWRAPPERS without any unexpected +side-effects, since the option is off by default. + +However that's not the main reason for this patch. The new code also +adds a new map type to sendmail-8.8.7, called "ismx". That maps checks if +we (all names in class 'w') are an MX for a certain domain. If so, the +input hostname is replaced by our hostname, or TEMPFAIL if the DNS +lookup failed. + +This can be used together with the "check_rcpt" rule to deny relaying for +domains for which we are officially not an MX, without listing all domains +in a configuration file. This prevents that your host is being used as +a spam relay. However your host will still relay for hosts that it is +officially an MX for, without any extra administration. + +Ofcourse you can put a list of IP numbers/networks in the file "LocalIP" +to list hosts that may use your host as relay or smarthost. This is +useful for a machine that is used internally as SMTP relay, for e.g. +Eudora or Pegasus mail clients. + +The sendmail rules are: (LOCAL_* included for m4 file) + + +LOCAL_CONFIG +Kismx ismx +F{LocalIP} /etc/mail/LocalIP + +LOCAL_RULESETS +Scheck_rcpt +# first: get client addr +R$+ $: $(dequote "" $&{client_addr} $) $| $1 +R0 $| $* $@ ok no client addr: directly invoked +R$={LocalIP}$* $| $* $@ ok from here +# See if we are MX for this host +R$*<$+@$+>$* $: $1 < $2 @ $(ismx $3 $: NOMX $) > $4 +R$*<$+@NOMX>$* $#error $@ 5.7.1 $: 571 I don't relay for that address. +R$*<$+@TEMPFAIL>$* $#error $@ 4.5.1 $: "451 Cannot resolve. Retry later." + + +Note that if the MX lookup fails, a temporary rather than a fatal error +code is returned so that the message will not get lost. diff --git a/debian/aliases b/debian/aliases new file mode 100644 index 0000000..fcfa35f --- /dev/null +++ b/debian/aliases @@ -0,0 +1,11 @@ +# +# Mail aliases for sendmail +# +# You must run newaliases(1) after making changes to this file. +# + +# Required aliases +postmaster: root +MAILER-DAEMON: root + +# Other aliases diff --git a/debian/changelog b/debian/changelog new file mode 100644 index 0000000..4d9bfce --- /dev/null +++ b/debian/changelog @@ -0,0 +1,291 @@ +sendmail (8.8.8-20) frozen; urgency=high, closes=23774 + + * Patch collect.c to prevent segfaults in mime8->mime7 (#23774) + + -- Richard Nelson <cowboy@debian.org> Tue, 23 Jun 1998 10:00:00 -0500 + +sendmail (8.8.8-19) frozen; urgency=high, closes=23000 + + * sensible-mda now ignores non-suid MDAs (#23000) + + -- Richard Nelson <cowboy@debian.org> Tue, 16 Jun 1998 15:00:00 -0500 + +sendmail (8.8.8-18) frozen; urgency=high + * Repackaged to apply only to frozen, and bump the severity + because this problem (22747) has sufficient consequences + to warrant a change in hamm - only the alias file is changed, + and it will impact primarily *NEW* installations of sendmail. + + -- Richard Nelson <cowboy@debian.org> Sat, 13 Jun 1998 12:00:00 -0500 + +sendmail (8.8.8-17) unstable frozen; urgency=low, closes=22747 + + * add MAILER-DAEMON alias (#22747) This is a SEVERE problem + in that absence of this alias may cause mailing loops upon + delivery errors. + + -- Richard Nelson <cowboy@debian.org> Sat, 23 May 1998 12:00:00 -0500 + +sendmail (8.8.8-16) unstable frozen; urgency=low, closes=21787 21744 + + * remove the `m' flag from LOCAL_MAILER_FLAGS (#21787) + * remove /etc/ppp/ip-{up,down}.d from debian/dirs (#21744) + + -- Richard Nelson <cowboy@debian.org> Sun, 03 May 1998 12:00:00 -0500 + +sendmail (8.8.8-15) unstable frozen; urgency=low, closes=21071 + + * This time, hoststat and purgestat really are symlinks to sendmail ;-} (#21071) + * debhelperization start + + -- Richard Nelson <cowboy@debian.org> Sun, 19 Apr 1998 12:00:00 -0500 + +sendmail (8.8.8-14) unstable frozen; urgency=low, closes=20657 20758 + + * <lart,mode=auto> rewrite desc for 20637 </lart> (#20758) + * Don't install /etc/ppp/ip-{up,down}.d/sendmail (#20657) + + -- Richard Nelson <cowboy@debian.org> Mon, 06 Apr 1998 09:00:00 -0500 + +sendmail (8.8.8-13) unstable frozen; urgency=low, closes=20637 20335 20189 + + * Add --pidfile to start of daemon (#20637) + Allow starting when there are queue processes from prior incarnation + * Dangling man symlinks (#20335) + * Local mailer and mixed case users (#20189) + * Include updated ismx patch (updated rules) + + -- Richard Nelson <cowboy@debian.org> Sat, 04 Apr 1998 12:00:00 -0500 + +sendmail (8.8.8-12) unstable frozen; urgency=low, closes=19972 19971 19081 + + * lintian bugs + * /usr/doc/sendmail/checksum.txt has mode 600 (#19972) + * sensible.mda needs man page (#19971) + * Change LOCAL_SHELL_FLAGS to stop queueing of local mail (#19081) + + -- Richard Nelson <cowboy@debian.org> Sat, 21 Mar 1998 12:00:00 -0500 + +sendmail (8.8.8-11) unstable; urgency=low + + * Correct package build so both source/binary show up + + - Richard Nelson <cowboy@debian.org> Sun, 8 Mar 1998 16:36:00 -0500 + +sendmail (8.8.8-10) unstable; urgency=low, closes=16883 19129 + + * New maintainer + * Updated to Standards-Version 2.4.0.0. + * Made -q default to 10 minutes instead of 30. + * Debian.mc: ct,cw optional, temp_mode, etc. + * Add /etc/ppp/ip-{up,down}.d/sendmail (#19129) + + -- Richard Nelson <cowboy@debian.org> Sun, 8 Mar 1998 12:00:00 -0500 + +sendmail (8.8.8-9) unstable; urgency=low + + * Added examples for other operating systems to cf/ostype, per + StormCrow's request. + + -- Johnie Ingram <johnie@debian.org> Mon, 9 Feb 1998 17:23:54 -0500 + +sendmail (8.8.8-8) unstable; urgency=low, closes=17454 17809 + + * Manpage for etrn.8 is no longer executable (#17454). + * Added checksendmail script from BSDI contrib. + * Debian releases of 8.8.6 and later include a .dsc file (#17809). + * Added HACK(rblspam) from Manoj Srivastava (srivasta@debian.org) to + redirect messages from RBLed wastelands to a user called "spam". + + -- Johnie Ingram <johnie@debian.org> Fri, 6 Feb 1998 23:08:55 -0500 + +sendmail (8.8.8-7) unstable; urgency=low + + * The sendmailconfig program no longer forces FEATURE(local_procmail). + + -- Johnie Ingram <johnie@debian.org> Wed, 21 Jan 1998 13:30:33 -0500 + +sendmail (8.8.8-6) unstable; urgency=low, closes=7903 9788 12413 12453 14253 14520 14575 14711 15508 15593 16065 16079 + + * Added Realtime Black Hole ruleset: HACK(rbl). + * Includes alternate nsswitch file which does not use DNS, allowing + run-time deactivation with HACK(nodns) (#12413, #12453, cf. 6495, + early stage of fix of 16883). + * Made name of spam control README more obvious by popular request of + IRC, and corrected "dbm" to "hash" in documentation (#16065). + * Now determines at runtime which mail delivery agent to invoke + (#15593), so dependency is restored to "procmail | deliver" (#14253). + * Corrected location of sendmail.st file (#14575, #15508, #16079). + * The option of setting the expensive flag in mailer definitions is + enabled by default, making modem-based setups easier (#9788). + * Corrected tcpwraper support patch so support is activatable again, and + disabled by default (#14520, #14711). + * ETRN and EXPN programs now included, from the contrib dir. + * A persistent host status directory is defined, so the daemon need not + reattempt a connect to known-bad hosts during simultaneous queue runs. + * Enabled tiered connect timeout in queue runs, lessening the effect of + slow peers delaying the queue runs of mailing lists. + * Queue runs are now sorted, by host to be connected to. + * A limit is set on the number of live children to prevent DoS attacks. + * Outbound connections are now quickly retried once after diald has time + to react, then queued normally. + * For speed, initgroups (supplemental group permissions) are disabled by + default -- this would require a sequential scan of the groups file. + * Added SHELL=/bin/bash to rules file and increased debhelperization. + * Closed #13384, corrected by sed fix to sendmailconfig (cf. 14547). + * Some undocumented features may now be enabled by config files: + O PidFile=/var/run/sendmail.pid + O WritableDirectoriesAreFatal=False + O DontProbeInterfaces=False + O MaxRecipientPerMessage= + O DeadLetterDrop=False + O TcpWrappers=False + * Undocumented features are documented in /usr/lib/sendmail.cf/ostype/debian. + * No longer runs dpkg-shlibdeps on shell scripts. + * Documentation files now preserve original timestamps whenever possible. + * Closed #7903, apparently not a problem with hamm mailx. + * All provided DOMAIN() examples are now included. + * Perl example for converting passwd file to aliases database included. + + -- Johnie Ingram <johnie@debian.org> Tue, 20 Jan 1998 23:06:30 -0500 + +sendmail (8.8.8-5) unstable; urgency=low, closes=16389 + + * Compiled with the -D_FFR_DONT_PROBE_INTERFACES_OPTION option (#16389). + + -- Johnie Ingram <johnie@debian.org> Tue, 30 Dec 1997 16:57:51 -0500 + +sendmail (8.8.8-4) unstable; urgency=low, closes=15707 15990 16000 + + * Corrected package md5sum error (#15990, #16000). + * Removed errant mail delivery agent mail.local (#15707). + + -- Johnie Ingram <johnie@debian.org> Wed, 17 Dec 1997 11:54:59 -0500 + +sendmail (8.8.8-3) unstable; urgency=low + + * Tweaked debian/rules to autocompile on debian-powerpc. + + -- Johnie Ingram <johnie@debian.org> Tue, 9 Dec 1997 17:56:42 -0500 + +sendmail (8.8.8-2) unstable; urgency=low, closes=14894 14565 15552 15131 14825 14292 14547 + + * Init script now defines PIDFILE (#15552, #15131, #14825). + * Binaries are now stripped (#14894, #14565). + * Applied patch so sendmail postinst is now reentrant (#14292). + * Added sed fix to sendmailconfig (#14547). + + -- Johnie Ingram <johnie@debian.org> Wed, 3 Dec 1997 18:49:51 -0500 + +sendmail (8.8.8-1) unstable; urgency=low, closes=12235 13817 13864 + + * New upstream version. + * Now includes sendmail FAQ from rtfm.mit.edu (#12235). + * Added code from David Rocher for compliance with the Standard for + Console Messages (#13817). + * No longer depends exclusively on procmail (#13864). + + -- Johnie Ingram <johnie@debian.org> Wed, 29 Oct 1997 17:11:50 -0500 + +sendmail (8.8.7-5) unstable; urgency=low + + * Added patch from Miquel van Smoorenburg <miquels@cistron.nl> to enable + tcpwrap support at runtime (support now disabled by default). + + -- Johnie Ingram <johnie@debian.org> Sat, 4 Oct 1997 15:05:03 -0400 + +sendmail (8.8.7-4) unstable; urgency=low + + * Fixed problem with sendmailconfig reported by Scott K. Ellis. + + -- Johnie Ingram <johnie@debian.org> Thu, 2 Oct 1997 11:22:12 -0400 + +sendmail (8.8.7-3) unstable; urgency=low + + * No longer depends on deliver (#11655). + * Updated to Standards-Version 2.3.0.0. + * Corrected typo in debian/rules which prevented tcpwrapper support from + working. + + -- Johnie Ingram <johnie@debian.org> Wed, 1 Oct 1997 14:02:01 -0400 + +sendmail (8.8.7-2) unstable; urgency=low + + * Fixed bug in yesno() function in sendmailconfig (#12035) which caused + it to ignore user input in some cases. + * Added patch for ifmail fidonet mailer support (#12241). + * Registered sendmail permissions with suidregister. + * Added patch from Herbert Xu so sendmailconfig will work with ash + (#12211). + * Fixed detection of compatible sendmail.cf files. + * Tweaked packaging to improve multi-architecture, multi-compiler + support. + + -- Johnie Ingram <johnie@debian.org> Sun, 31 Aug 1997 05:00:20 -0400 + +sendmail (8.8.7-1) unstable; urgency=low + + * New upstream bugfix version (pristine source) (#11932). + * Updated to Standards-Version: 2.2.0.0. + + -- Johnie Ingram <johnie@debian.org> Thu, 7 Aug 1997 18:12:23 -0400 + +sendmail (8.8.6-4) unstable; urgency=low + + * Added spam control hacks by Claus Assmann (#5795). + + -- Johnie Ingram <johnie@debian.org> Sat, 26 Jul 1997 13:54:58 -0400 + +sendmail (8.8.6-3) unstable; urgency=low + + * Added binary-arch target to debian/rules (#11400). + + -- Johnie Ingram <johnie@debian.org> Tue, 22 Jul 1997 04:52:54 -0400 + +sendmail (8.8.6-2) unstable; urgency=low + + * Added patch to sendmailconfig from Darrin Stalder so it accepts + procmail as an alternate local delivery agent (#7897, fixing #3752, + #3753, #3754, #4064, #9074, much of 10860). Go Darrin. + * No longer requires "deliver" for installation (bug list above). + * Created a "runq" script at request of Martin "Joey" Schulze (#9268). + * Enabled default support for limited 7->8 bit MIME autoconversion, + since this security hole was fixed (#6815, #10491). + * Edited sendmailconfig to make it more clear that a FQDN is needed + during setup of /etc/mailname (#10512). + * Added the mail.local local delivery program (cf. 4064). + * Corrected name of init script in sendmail(8) manpage from /etc/rc to + /etc/init.d/sendmail (#9176). + * Closed #6093, a duplicate of 6495 (sendmail insists on performing DNS + lookups, bringing the PPP link up unnecessarily). Unfortunately 6495 + is a known bug in the 8.8 series which is not yet fixed. + * Closed #7843 (incorrect upstream PROCMAIL_MAILER_PATH), since this is + always redefined by OSTYPE(debian). + * Closed #5321 -- performance demands that sendmail be run as a daemon. + * Closed #9550, since package is now in new source format and compliant + with Standards-Version 2.1.3.3 (cf. 7077, 9845). + * Closed #5676 (core dump) posted against 8.7.6, which does not apply to + the versions currently in use in the stable and unstable + distributions. + * No longer requires "deliver" for installation (worth repeating). + + -- Johnie Ingram <johnie@debian.org> Sun, 20 Jul 1997 01:48:51 -0400 + +sendmail (8.8.6-1) unstable; urgency=low + + * New maintainer. + * Converted to new source format (#7077, #9845). + * Added "debug" target to /etc/init.d/sendmail to dump status to syslog. + * Modified build makefile to work with bash 2.0, and with libc6 tools. + * Changed tone of long description and similar blurbs from "complex" to + "powerful". + * Added PGP-signed file checksums. + * Included upstream changelog, created Debian changelog (#7075). + * Added Debian and GNU to default configuration string. + + -- Johnie Ingram <johnie@debian.org> Sat, 19 Jul 1997 04:26:45 -0400 + +Local variables: +mode: debian-changelog +add-log-mailing-address: "johnie@debian.org" +End: diff --git a/debian/check.tar.uue b/debian/check.tar.uue new file mode 100644 index 0000000..a813f89 --- /dev/null +++ b/debian/check.tar.uue @@ -0,0 +1,1005 @@ +begin 600 check.tar +M4D5!1$U%+F-H96-K```````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````"`@(#8T-"``("`@,C,P(``@(#$W-3`@`"`@("`@(#$R,30R +M("`V,S0T,S(R,#8W("`@-C$S,0`@```````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M``````````````````````!4:&ES(&9I;&4@8V]N=&%I;G,@<V5V97)A;"`B +M2$%#2R)S(&9O<B!S96YD;6%I;"`X+C@@=&\@<F5J96-T(&4M;6%I;',*9G)O +M;2!S<&%M;65R<R!A;F0@=&\@<')E=F5N="!T:&4@86)U<V4@;V8@>6]U<B!M +M86-H:6YE(&%S(&$@;6%I;`IR96QA>2X*"D%N(&5X<&QA;F%T:6]N(&-A;B!B +M92!F;W5N9"!A=#H*/%523#H@:'1T<#HO+W=W=RYI;F9O<FUA=&EK+G5N:2UK +M:65L+F1E+R4W16-A+V5M86EL+V-H96-K+FAT;6P@/@H*5&AE($A!0TMS(&%R +M93H*8VAE8VM?;6%I;"YM-`IC:&5C:U]M86EL,BYM-`IC:&5C:U]M86EL,RYM +M-`IC:&5C:U]R8W!T+FTT"F-H96-K7W)C<'0S+FTT"F-H96-K7W)C<'0T+FTT +M"F-H96-K7W)E;&%Y+FTT"F-H96-K7W)E;&%Y,RYM-`IS<&%M9&]M<RYM-`IS +M<&%M;65R<RYM-`IU<V5?:7`N;30*=7-E7VYA;65S+FTT"G5S95]R96QA>71O +M+FTT"@IA;F0@87)E('5S960@87,@9F]L;&]W<SH*,6$I(&-H96-K7VUA:6P@ +M*'5S97,@<&QA:6X@9FEL97,@9F]R(&UA=&-H:6YG*3H*2$%#2RAS<&%M;65R +M<RD*2$%#2RAS<&%M9&]M<RD*0F]T:"!T86ME(&%N(&]P=&EO;F%L(&%R9W5M +M96YT("AT:&4@9FEL92!T;R!U<V4I+@I4:&4@9&5F875L="!F:6QE;F%M97,@ +M87)E(&QI<W1E9"!B96QO=RX*"DA!0TLH8VAE8VM?;6%I;"D*"C%B*2!C:&5C +M:U]M86EL,B`H=7-E<R!D871A8F%S97,@9F]R(&UA=&-H:6YG*3H*2$%#2RAC +M:&5C:U]M86EL,BD*"C)A*2!C:&5C:U]R8W!T-#H*2$%#2RAU<V5?:7`I"DA! +M0TLH=7-E7VYA;65S*0I(04-+*'5S95]R96QA>71O*0H*2$%#2RAC:&5C:U]R +M8W!T-"D*"C)B*2!C:&5C:U]R8W!T("AO;&0@=F5R<VEO;BP@=7-E(&-H96-K +M7W)C<'0T*3H*2$%#2RAU<V5?:7`I"DA!0TLH=7-E7VYA;65S*0I(04-+*'5S +M95]R96QA>71O*0H*2$%#2RAC:&5C:U]R8W!T*0H*5&AE(&9I<G-T(&]N97,@ +M;6%Y(&AA=F4@82!P87)A;65T97(@=&\@9&5F:6YE('1H92!N86UE(&]F('1H +M92!F:6QE('1O"F)E('5S960N"@HS*2!C:&5C:U]R96QA>2P@8VAE8VM?<F5L +M87DS"E1H97-E('=O<FL@;VYL>2!I9B!Y;W4@:&%V92!A('!A=&-H("AS964@ +M86)O=F4@55),*2!O<B`X+C@N-B`H;W(@8F5T=&5R*2X*2$%#2RAC:&5C:U]R +M96QA>2D*;W(*2$%#2RAC:&5C:U]R96QA>3,I"@H*4V]M92!M;W)E(&5X<&QA +M;F%T:6]N<SH*"C%A*0I)9B!Y;W4@=V%N="!T;R!U<V4@8VAE8VM?;6%I;"P@ +M9&\@=&AE(&9O;&QO=VEN9SH@4'5T"@I(04-+*'-P86UM97)S*0I(04-+*'-P +M86UD;VUS*0I(04-+*&-H96-K7VUA:6PI"@II;B!Y;W5R("YM8R!F:6QE+B!0 +M=70@861D<F5S<V5S(&]F('=E;&PM:VYO=VX@<W!A;6UE<G,@*&4M;6%I;"!A +M9&1R97-S97,L"F1O;6%I;G,I(&EN('1H92!A<'!R;W!R:6%T92!F:6QE<R!; +M9&5F875L=%TZ"G-P86UM97)S"5LO971C+VUA:6PO4W!A;6UE<ET)"G-P86UD +M;VUA:6YS"5LO971C+VUA:6PO4W!A;41O;6%I;G-="0H*,6(I"DEF('EO=2!W +M86YT('1O('5S92!C:&5C:U]M86EL,BP@9&\@=&AE(&9O;&QO=VEN9SH@4'5T +M"@I(04-+*&-H96-K7VUA:6PR*0I;5&AI<R!H87,@86QS;R!A;B!O<'1I;VYA +M;"!A<F=U;65N="P@=&AE(&1E9F%U;'0@:7,@9VEV96X@8F5L;W<N70H*:6X@ +M>6]U<B`N;6,@9FEL92X@4'5T(&%D9')E<W-E<R!O9B!W96QL+6MN;W=N('-P +M86UM97)S("AE+6UA:6P@861D<F5S<V5S+`ID;VUA:6YS*2!I;B!T:&4@87!P +M<F]P<FEA=&4@9&%T86)A<V4@6V1E9F%U;'1=.@IJ=6YK"5MD8FT@+V5T8R]M +M86EL+VIU;FM="0H*5&AE(&9O<FUA="!I<SH*:G5N:RYD;VUA:6X@2E5.2PIS +M<&%M;65R0&%D9')E<W,N9&]M86EN(%-004U-15(*0W)E871E('1H92!D871A +M8F%S92`H;6%N(&UA:V5M87`I(&EN('1H92!C:&]S96X@9F]R;6%T+@H*4%,Z +M(%EO=2!C86X@86-T:79A=&4@=&AE(')E=F5R<V4@25`@;&]O:W5P(&%N9"!T +M:&4*=F%L:61I='D@8VAE8VL@;V8@=&AE($923TT@861D<F5S<R!B>0ID969I +M;F4H8%])4%],3T]+55!?)RPQ*61N;`ID969I;F4H8%]$3E-604Q)1%\G+#$I +M9&YL"G)E<W!E8W1I=F5L>2X*"C%C*0I4:&ES(&ES(&$@=F%R:6%N="!O9B!C +M:&5C:U]M86EL,BP@=VAE<F4@=&AE(%)(4R!O9B!T:&4@;6%P"FES('5S960@ +M=&\@<W!E8VEF>2!A;B!E<G)O<B!C;V1E("AW:&EC:"!I<R!O;FQY('5S960@ +M:6X@=&AE"G1E>'0I(&%N9"!A;B!E<G)O<B!T97AT+@I)9B!Y;W4@=V%N="!T +M;R!U<V4@8VAE8VM?;6%I;#,L(&1O('1H92!F;VQL;W=I;F<Z(%!U=`H*2$%# +M2RAC:&5C:U]M86EL,RD*6U1H:7,@:&%S(&%L<V\@86X@;W!T:6]N86P@87)G +M=6UE;G0L('1H92!D969A=6QT(&ES(&=I=F5N(&)E;&]W+ET*"FEN('EO=7(@ +M+FUC(&9I;&4N(%!U="!A9&1R97-S97,@;V8@=V5L;"UK;F]W;B!S<&%M;65R +M<R`H92UM86EL(&%D9')E<W-E<RP*9&]M86EN<RD@:6X@=&AE(&%P<')O<')I +M871E(&1A=&%B87-E(%MD969A=6QT73H*:G5N:PE;9&)M("UA0$I53DL@+V5T +M8R]M86EL+VIU;FM="0HH:68@>6]U('5S92!A;F]T:&5R(&1A=&%B87-E(&9O +M<FUA="!O<B!A;F]T:&5R(&9I;&4L(&UA:V4@<W5R92!Y;W4*<W!E8VEF>2!T +M:&4@;W!T:6]N("UA0$I53DL@(2D*"E1H92!F;W)M870@:7,Z"FIU;FLN9&]M +M86EN(")%<G)O<BU#;V1E($5R<F]R+51E>'0B"G-P86UM97)`861D<F5S<RYD +M;VUA:6X@(D5R<F]R+4-O9&4@17)R;W(M5&5X="(*0W)E871E('1H92!D871A +M8F%S92`H;6%N(&UA:V5M87`I(&EN('1H92!C:&]S96X@9F]R;6%T+@H*17AA +M;7!L93H*8WEB97)P<F]M;RYC;VT@(C4W,2!3;W)R>2P@4W!A;69O<F0L(&YO +M(&4M;6%I;"!F<F]M('EO=7(@<&QA8V4N(@IH;VYE>4!S=V5E=&EE<RYC;VT@ +M(C4W,2!(;VYE>2P@>6]U)W)E(&$@<W!A;6UE<BP@9V\@87=A>2XB"@I04SH@ +M66]U(&-A;B!A8W1I=F%T92!T:&4@<F5V97)S92!)4"!L;V]K=7`@86YD('1H +M90IV86QI9&ET>2!C:&5C:R!O9B!T:&4@1E)/32!A9&1R97-S(&)Y"F1E9FEN +M92A@7TE07TQ/3TM54%\G+#$I9&YL"F1E9FEN92A@7T1.4U9!3$E$7R<L,2ED +M;FP*<F5S<&5C=&EV96QY+@H*,F$I"DEF('EO=2!W86YT('1O('5S92!C:&5C +M:U]R8W!T+"!D;R!T:&4@9F]L;&]W:6YG.B!$96-I9&4@=VAE=&AE<B!Y;W4* +M=V%N('1O('5S92!T:&4@8VAE8VL@9F]R(&QO8V%L(&UA8VAI;F5S(&)Y($E0 +M(&YU;6)E<B`H=7-E7VEP*2!O<B!B>0IN86UE("AU<V5?;F%M97,I+B!.97AT +M+"!D96-I9&4@=VAE=&AE<B!Y;W4@=V%N="!A;'-O(&%L;&]W(')E;&%Y('1O +M"G-E=F5R86P@;6%C:&EN97,@:6X@861D:71I;VX@=&\@=&AO<V4@>6]U(&%C +M8V5P="!A<R!L;V-A;"`H8VQA<W,@=RDN"D1E<&5N9&EN9R!O;B!Y;W5R('-E +M;&5C=&EO;BP@<'5T('-O;64@;V8@=&AE(&9I<G-T('1H<F5E($A!0TMS(&EN +M=&\*>6]U<B`N;6,@9FEL92P@86YD(&%L=V%Y<R!U<V4@=&AE(&QA<W0@;VYE +M+@I(04-+*'5S95]I<"D*2$%#2RAU<V5?;F%M97,I"DA!0TLH=7-E7W)E;&%Y +M=&\I"D%L;"!T86ME(&%N(&]P=&EO;F%L(&%R9W5M96YT("AT:&4@9FEL92!T +M;R!U<V4I+@I4:&4@9&5F875L="!F:6QE;F%M97,@87)E(&QI<W1E9"!B96QO +M=RX*"DA!0TLH8VAE8VM?<F-P=#0I"@I0=70@=&AE(&%P<')O<')I871E('9A +M;'5E<R!I;B!T:&4@9FEL97,Z"G5S95]I<`D)6R]E=&,O;6%I;"],;V-A;$E0 +M70D*=7-E7VYA;65S"5LO971C+VUA:6PO3&]C86Q.86UE<UT)"G5S95]R96QA +M>71O"5LO971C+VUA:6PO4F5L87E4;UT)"@HQ.3DW+3`S+3$V.B!C:&5C:U]R +M8W!T-"!C86X@;F]W(&UA:V4@=7-E(&]F('5S95]I<"!A;F0@=7-E7VYA;65S +M+@I)="!R97!L86-E<R!C:&5C:U]R8W!T,RP@=VAI8V@@:7,@<W1I;&P@879A +M:6QA8FQE(&EF('1H97)E(&ES"F$@<')O8FQE;2!W:71H('1H92!N97<@=F5R +M<VEO;BX*"C-A*0I)9B!Y;W4@=V%N="!T;R!U<V4@8VAE8VM?<F5L87DL(&1O +M('1H92!F;VQL;W=I;F<Z(%!U=`H*2$%#2RAC:&5C:U]R96QA>2D*6U1H:7,@ +M:&%S(&%L<V\@86X@;W!T:6]N86P@87)G=6UE;G0L('1H92!D969A=6QT(&ES +M(&=I=F5N(&)E;&]W+ET*"FEN('EO=7(@+FUC(&9I;&4N(%!U="!T:&4@25`@ +M;G5M8F5R<R!O9B!W96QL+6MN;W=N('-P86UM97)S(`II;B!T:&4@87!P<F]P +M<FEA=&4@9&%T86)A<V4@6V1E9F%U;'1=.@IJ=6YK"5MD8FT@+V5T8R]M86EL +M+VIU;FM="0H*5&AE(&9O<FUA="!I<SH*1"Y8+EDN6B!)4`I#+E@N62!)4`I" +M+E@@25`*02!)4`HH9G5L;"!A9&1R97-S97,L(&-L87-S($,L($(L(&]R($$@ +M;F5T<RD*0W)E871E('1H92!D871A8F%S92`H;6%N(&UA:V5M87`I(&EN('1H +M92!C:&]S96X@9F]R;6%T+@H*,V(I"DEF('EO=2!W86YT('1O('5S92!C:&5C +M:U]R96QA>3,L(&1O('1H92!F;VQL;W=I;F<Z(%!U=`H*2$%#2RAC:&5C:U]R +M96QA>3,I"EM4:&ES(&AA<R!A;'-O(&%N(&]P=&EO;F%L(&%R9W5M96YT+"!T +M:&4@9&5F875L="!I<R!G:79E;B!B96QO=RY="@II;B!Y;W5R("YM8R!F:6QE +M+B!0=70@=&AE($E0(&YU;6)E<G,@;V8@=V5L;"UK;F]W;B!S<&%M;65R<R`* +M:6X@=&AE(&%P<')O<')I871E(&1A=&%B87-E(%MD969A=6QT73H*:G5N:PE; +M9&)M("UA0$I53DL@+V5T8R]M86EL+VIU;FM="0HH:68@>6]U('5S92!A;F]T +M:&5R(&1A=&%B87-E(&9O<FUA="!O<B!A;F]T:&5R(&9I;&4L(&UA:V4@<W5R +M92!Y;W4*<W!E8VEF>2!T:&4@;W!T:6]N("UA0$I53DL@(2D*"E1H92!F;W)M +M870@:7,Z"D0N6"Y9+EH@(D5R<F]R('1E>'0B"D,N6"Y9(")%<G)O<B!T97AT +M(@I"+E@@(D5R<F]R('1E>'0B"D$@(D5R<F]R('1E>'0B"BAF=6QL(&%D9')E +M<W-E<RP@8VQA<W,@0RP@0BP@;W(@02!N971S*0I#<F5A=&4@=&AE(&1A=&%B +M87-E("AM86X@;6%K96UA<"D@:6X@=&AE(&-H;W-E;B!F;W)M870N"@I4:&ES +M(&ES('1H92!S86UE(&1A=&%B87-E(&%S('5S960@9F]R(&-H96-K7VUA:6PS +M+`IJ=7-T('=I=&@@=&AE(&%D9&ET:6]N(&]F($E0(&YU;6)E<G,N"@I#;VYC +M;'5S:6]N.@H*36%K92!S=7)E('EO=2!U;F1E<G-T86YD('=H870@>6]U(&1O +M(&%N9"!Y;W4@=&5S="!T:&ES('-T=69F"F)E9F]R92!Y;W4@=7-E(&ET(&]N +M(&$@<')O9'5C=&EO;B!M86-H:6YE(0I)(&1O;B=T(&=U87)A;G1E92!F;W(@ +M86YY=&AI;F<A"DEF('EO=2!H879E(&%N>2!S=6=G97-T:6]N<RP@8V]M;65N +M=',L(&5N:&%N8V5M96YT<RP*<&QE87-E(&QE="!M92!K;F]W+@H*0VQA=7,@ +M07-S;6%N;@D\8V%`:6YF;W)M871I:RYU;FDM:VEE;"YD93X*3&%S="!U<&1A +M=&4Z(#$Y.3<M,#8M,#$*('=E;&PM:VYO=VX@<W!A;6UE<G,@*&4M;6%I;"!A +M9&1R97-S97,L"F1O;6%I;G,I(&EN('1H92!A<'!R;W!R:6%T92!D871A8F%S +M92!;9&5F875L=%TZ"FIU;FL)6V1B;2`O971C+VUA:6PO:G5N:UT)"@I4:&4@ +M9F]R;6%T(&ES.@IJ=6YK+F1O;6%I;B!*54Y+"G-P86UM97)`861D<F5S<RYD +M;VUA:6X@4U!!34U%4@I#<F5A=&4@=&AE(&1A=&%B87-E("AM86X@;6%K96UA +M<"D@:6X@=&AE(&-H;W-E;B!F;W)M870N"@I04SH@66]U(&-A;B!A8W1I=F%T +M92!T:&4@<F5V97)S92!)4"!L;V]K=7`@86YD('1H90IV86QI9&ET>2!C:&5C +M:R!O9B!T:&4@1E)/32!A9&1R97-S(&)Y"F1E9FEN92A@7TE07TQ/3TM54%\G +M+#$I9&YL"F1E9FEN92A@7T1.4U9!3$E$7R<L,2ED;FP*<F5S<&5C=&EV96QY +M+@H*,6,I"E1H:7,@:7,@82!V87)I86YT:&%C:R]C:&5C:U]M86EL+FTT```` +M```````````````````````````````````````````````````````````` +M`````````````````````````````````````````````"`@(#8T-"``("`@ +M,C,P(``@(#$W-3`@`"`@("`@("`T,C0R("`V,S0U,C8V-S8S("`@-S0R,0`@ +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M``````````````````````````````````````````````````````!D:79E +M<G0H+3$I"B,*(R!#;W!Y<FEG:'0@*&,I(#$Y.38@0VQA=7,@07-S;6%N;B`\ +M8V%`:6YF;W)M871I:RYU;FDM:VEE;"YD93X*(PHC($EN('-H;W)T.B!Y;W4@ +M8V%N(&1O('=H871E=F5R('EO=2!W86YT('=I=&@@=&AI<RP@8G5T(&1O;B=T +M(&)L86UE(&UE(0HC"B,@5$A)4R!33T945T%212!)4R!04D]6241%1"!"62!4 +M2$4@05542$]2($%.1"!#3TY44DE"551/4E,@8&!!4R!)4R<G($%.1`HC($%. +M62!%6%!215-3($]2($E-4$Q)140@5T%24D%.5$E%4RP@24Y#3%5$24Y'+"!" +M550@3D]4($Q)34E4140@5$\L(%1(10HC($E-4$Q)140@5T%24D%.5$E%4R!/ +M1B!-15)#2$%.5$%"24Q)5%D@04Y$($9)5$Y%4U,@1D]2($$@4$%25$E#54Q! +M4B!055)03U-%"B,@05)%($1)4T-,04E-140N("!)3B!.3R!%5D5.5"!32$%, +M3"!42$4@05542$]2($]2($-/3E1224)55$]24R!"12!,24%"3$4*(R!&3U(@ +M04Y9($1)4D5#5"P@24Y$25)%0U0L($E.0TE$14Y404PL(%-014-)04PL($58 +M14U03$%262P@3U(@0T].4T51545.5$E!3`HC($1!34%'15,@*$E.0TQ51$E. +M1RP@0E54($Y/5"!,24U)5$5$(%1/+"!04D]#55)%345.5"!/1B!354)35$E4 +M551%($=/3T13"B,@3U(@4T525DE#15,[($Q/4U,@3T8@55-%+"!$051!+"!/ +M4B!04D]&2513.R!/4B!"55-)3D534R!)3E1%4E)54%1)3TXI"B,@2$]7159% +M4B!#0553140@04Y$($].($%.62!42$5/4ED@3T8@3$E!0DE,2519+"!72$54 +M2$52($E.($-/3E1204-4+"!35%))0U0*(R!,24%"24Q)5%DL($]2(%1/4E0@ +M*$E.0TQ51$E.1R!.14=,24=%3D-%($]2($]42$525TE312D@05))4TE.1R!) +M3B!!3ED@5T%9"B,@3U54($]&(%1(12!54T4@3T8@5$A)4R!33T945T%212P@ +M159%3B!)1B!!1%9)4T5$($]&(%1(12!03U-324))3$E462!/1@HC(%-50T@@ +M1$%-04=%+@HC"F1I=F5R="@P*0I615)324].240H8$`H(REC:&5C:U]M86EL +M+FTT"3$N,2`H0VQA=7,@07-S;6%N;BD@,3DY-RTP,RTP.2<I"@ID:79E<G0H +M,BD*3$]#04Q?4E5,15-%5%,*4V-H96-K7VUA:6P*9&5F:6YE*&!#3TU-14Y4 +M)RP@:69D968H8%]34$%-34524U\G+"!@)RP@8",G*2ED;FP*(R!N;R!M86EL +M<R!F<F]M('-P86UM97)S("AU<V5R0&1O;2YA:6XI"D-/34U%3E1@)U(\)#U[ +M4W!A;6UE<GT^"20C97)R;W(@)$`@-2XW+C$@)#H@(C4W,2!792!D;VXG="!A +M8V-E<'0@:G5N:R!M86EL+B(@"6=O(&%W87D*0T]-345.5&`G4CPD/7M3<&%M +M;65R?2X^"20C97)R;W(@)$`@-2XW+C$@)#H@(C4W,2!792!D;VXG="!A8V-E +M<'0@:G5N:R!M86EL+B(@"6=O(&%W87D*0T]-345.5&`G4B0]>U-P86UM97)] +M"20C97)R;W(@)$`@-2XW+C$@)#H@(C4W,2!792!D;VXG="!A8V-E<'0@:G5N +M:R!M86EL+B(@"6=O(&%W87D*0T]-345.5&`G4B0]>U-P86UM97)]+@DD(V5R +M<F]R("1`(#4N-RXQ("0Z("(U-S$@5V4@9&]N)W0@86-C97!T(&IU;FL@;6%I +M;"XB(`EG;R!A=V%Y"G5N9&5F:6YE*&!#3TU-14Y4)RED;FP*4B0J"0DD.B`D +M/C,@)#$)"0D)"0EC86YO;FEF>0I2)"T)"21`(&]K"0D)"0D)"6QO8V%L(&AO +M<W0*9&5F:6YE*&!#3TU-14Y4)RP@:69D968H8%]34$%-1$]-4U\G+"!@)RP@ +M8",G*2ED;FP*(R!N;R!S<&%M(&1O;6%I;G,*0T]-345.5&`G4B0J/$`D*B0] +M>U-P86U$;VUA:6YS?2X^)"H))"-E<G)O<B`D0"`U+C<N,2`D.B`B-3<Q(%1H +M:7,@9&]M86EN(&ES(&)A;FYE9"XB(`EG;R!A=V%Y"D-/34U%3E1@)U(D*CQ` +M)"HD/7M3<&%M1&]M86EN<WT^)"H))"-E<G)O<B`D0"`U+C<N,2`D.B`B-3<Q +M(%1H:7,@9&]M86EN(&ES(&)A;FYE9"XB(`EG;R!A=V%Y"G5N9&5F:6YE*&!# +M3TU-14Y4)RED;FP*(R!I9B!Y;W4@96YA8FQE('1H92!L87-T(')U;&4L('EO +M=2!C86X@9&ES86)L92!T:&ES(&]N92X*(R!H;W-T('=I=&AO=70@82`N(&EN +M('1H92!&44A.(#\*4B0J/$`D+3XD*@DD(V5R<F]R("1`(#4N,2XX("0Z(#4Q +M."!I;G9A;&ED(&AO<W0@;F%M92`D,@D);F\@<F5A;"!N86UE"B,@;&]O:W5P +M($E0(&%D9')E<W,@*')E=F5R<V4@;6%P<&EN9R!A=F%I;&%B;&4_*0HC(%(D +M*CQ`6R0K73XD*@DD.B`D,2`\($`@)%L@6R`D,B!=("1=(#X@)#,*(R!N;R!$ +M3E,@96YT<GD_('1H:7,@:7,@9&%N9V5R;W5S(0HC(%(D*CQ`)"HD?E`^)"H) +M)"-E<G)O<B`D0"`T+C$N."`D.B`T,3@@=6YR97-O;'9A8FQE(&AO<W0@;F%M +M92`D,B0S+"!C:&5C:R!Y;W5R(&-O;F9I9W5R871I;VXN"0ID:79E<G0H,"D* +M"D]7159%4B!#0553140@04Y$($].($%.62!42$5/4ED@3T8@3$E!0DE,2519 +M+"!72$542$52($E.($-/3E1204-4+"!35%))0U0*(R!,24%"24Q)5%DL($]2 +M(%1/4E0@*$E.0TQ51$E.1R!.14=,24=%3D-%($]2($]42$525TE312D@05)) +M4TE.1R!)3B!!3ED@5T%9"B,@3U54($]&(%1(12!54T4@3T8@5$A)4R!33T94 +M5T%212P@159%3B!)1B!!1%9)4T5$($]&(%1(12!03U-324))3$E462!/1@HC +M(%-50T@@1$%-04=%+@HC"F1I=F5R="@P*0I615)324].240H8$`H(REC:&5C +M:U]M86EL+FTT"3$N,2`H0VQA=7,@07-S;6%N;BD@,3DY-RTP,RTP.2<I"@ID +M:79E<G0H,BD*3$]#04Q?4E5,15-%5%,*4V-H96-K7VUA:6P*:&%C:R]C:&5C +M:U]M86EL,BYM-``````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`"`@(#8T-"``("`@,C,P(``@(#$W-3`@`"`@("`@("`V,3$S("`V,S8S-#,V +M,S,S("`@-S0W,@`@```````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M``````````!D:79E<G0H+3$I"B,*(R!#;W!Y<FEG:'0@*&,I(#$Y.38L,3DY +M-R!#;&%U<R!!<W-M86YN(#QC84!I;F9O<FUA=&EK+G5N:2UK:65L+F1E/@HC +M"B,@26X@<VAO<G0Z('EO=2!C86X@9&\@=VAA=&5V97(@>6]U('=A;G0@=VET +M:"!T:&ES+"!B=70@9&]N)W0@8FQA;64@;64A"B,*(R!42$E3(%-/1E1705)% +M($E3(%!23U9)1$5$($)9(%1(12!!551(3U(@04Y$($-/3E1224)55$]24R!@ +M8$%3($E3)R<@04Y$"B,@04Y9($584%)%4U,@3U(@24U03$E%1"!705)204Y4 +M2453+"!)3D-,541)3D<L($)55"!.3U0@3$E-251%1"!43RP@5$A%"B,@24U0 +M3$E%1"!705)204Y42453($]&($U%4D-(04Y404))3$E462!!3D0@1DE43D53 +M4R!&3U(@02!005)424-53$%2(%!54E!/4T4*(R!!4D4@1$E30TQ!24U%1"X@ +M($E.($Y/($5614Y4(%-(04Q,(%1(12!!551(3U(@3U(@0T].5%))0E543U)3 +M($)%($Q)04),10HC($9/4B!!3ED@1$E214-4+"!)3D1)4D5#5"P@24Y#241% +M3E1!3"P@4U!%0TE!3"P@15A%35!,05)9+"!/4B!#3TY315%514Y424%,"B,@ +M1$%-04=%4R`H24Y#3%5$24Y'+"!"550@3D]4($Q)34E4140@5$\L(%!23T-5 +M4D5-14Y4($]&(%-50E-425155$4@1T]/1%,*(R!/4B!315)624-%4SL@3$]3 +M4R!/1B!54T4L($1!5$$L($]2(%!23T9)5%,[($]2($)54TE.15-3($E.5$52 +M4E505$E/3BD*(R!(3U=%5D52($-!55-%1"!!3D0@3TX@04Y9(%1(14]262!/ +M1B!,24%"24Q)5%DL(%=(151(15(@24X@0T].5%)!0U0L(%-44DE#5`HC($Q) +M04))3$E462P@3U(@5$]25"`H24Y#3%5$24Y'($Y%1TQ)1T5.0T4@3U(@3U1( +M15)725-%*2!!4DE324Y'($E.($%.62!705D*(R!/550@3T8@5$A%(%5312!/ +M1B!42$E3(%-/1E1705)%+"!%5D5.($E&($%$5DE3140@3T8@5$A%(%!/4U-) +M0DE,2519($]&"B,@4U5#2"!$04U!1T4N"B,*9&EV97)T*#`I"E9%4E-)3TY) +M1"A@0"@C*6-H96-K7VUA:6PN;30),BXQ("A#;&%U<R!!<W-M86YN*2`Q.3DW +M+3`S+3,P)RD*4%532$1)5D525"@V*0II9F1E9BA@7TI53DM?1$5&24Y%1%]2 +M14Q!62<L+`HC(&9I;&4@8V]N=&%I;FEN9R!F=6QL(&4M;6%I;"!A9&1R97-S +M97,@;V8@<W!A;6UE<G,@*&9O<B!C:&5C:U]M86EL*3H*(R!S<&%M;65R0&%D +M9')E<W,N9&]M86EN(%-004U-15(*(R!O<B!J=6YK(&1O;6%I;G,@*&9O<B!C +M:&5C:U]M86EL+"!C:&5C:U]R96QA>2DZ"B,@:G5N:RYD;VUA:6X@2E5.2PHC +M(&]R($E0(&%D9')E<W-E<R`H9F]R(&-H96-K7W)E;&%Y*3H*(R!$+E@N62Y: +M($E0"B,@0RY8+ED@25`*(R!"+E@@25`*(R!!($E0"DMJ=6YK(&EF96QS92A? +M05)'7RP@8"<L(&!D8FT@+V5T8R]M86EL+VIU;FLG+"!@7T%21U\G*0ID969I +M;F4H8%]*54Y+7T1%1DE.141?34%)3"<L,2D**0II9F1E9BA@7T%#0T505%]3 +M3TU%7R<L"DMA8V-E<'0@9&)M("]E=&,O;6%I;"]A8V-E<'0I"E!/4$1)5D52 +M5`H*9&EV97)T*#(I"DQ/0T%,7U)53$531513"B,@8VAE8VL@9F]R(&IU;FL@ +M9&]M86EN+W-P86UM97)S"E-J=6YK"B,@;&]O:W5P(&1O;6%I;B!I;B!D871A +M8F%S90I2)"H\0"0K/B0J"0DD.B0Q/$`D*&IU;FL@)#(D*3XD,PHC(&5X:7-T +M<S\@<F5T=7)N"E(D*CQ`2E5.2SXD*@D))$`D,3Q`2E5.2SXD,@HC(&QO;VMU +M<"!A9&1R97-S(&EN(&1A=&%B87-E"E(D*CQ`)"L^)"H)"20Z)#$\0"0H:G5N +M:R`D,4`D,B`D.B0R)"D^)#,*(R!E>&ES=',_(')E='5R;@I2)"H\0%-004U- +M15(^)"H)"21`)#$\0%-004U-15(^)#(*(R!M=B!O;F4@<W5B9&]M86EN(&EN +M(&9R;VYT+"!T<GD@86=A:6X*4B0J/$`D+2XD+2XD*SXD*@DD.B`D,CQ`/B`D +M/FIU;FL@)#$\0"0S+B0T/B0U"B,@=6YD;R!D86UA9V4*4B0J/$`^)"H\0"0K +M/B0J"0DD,CQ`)#$N)#,^)#0*"E-C:&5C:U]M86EL"B,@9&]N)W0@8VAE8VL@ +M=&AE<V4*4CPD*D`D/7<^"21`(&]K"0D)<VAO<G1C=70*(R!I9&5A(&9R;VT@ +M4W1E=F5N(%-C:'5L='H*4CP^"0DD.B`\)&X@0"`D*&1E<75O=&4@(B(@)"9[ +M8VQI96YT7VYA;65]("0I(#X*:69D968H8%]!0T-%4%1?4T]-15\G+`HC(&%C +M8V5P="!S;VUE('-T=7!I9"!S='5F9@I2/"0J0"0K/@DD.CPD,4`D*&%C8V5P +M="`D,B`D.B0R)"D^"E(\)"I`3TL^"21`(&]K*0I2)"H)"20Z("0^,R`D,0D) +M"6-A;F]N:69Y"E(D+0D))$`@;VL)"0D);&]C86P@:&]S=`HC(&YO(&AO<W0@ +M=VET:&]U="!A("X@:6X@=&AE($912$X@/PI2)"H\0"0M/B0J"20C97)R;W(@ +M)$`@-2XQ+C@@)#H@-3$X(&EN=F%L:60@:&]S="!N86UE("0R+"!C:&5C:R!Y +M;W5R(&-O;F9I9W5R871I;VXN"G5N9&5F:6YE*&!#3TU-14Y4)RED;FP*9&5F +M:6YE*&!#3TU-14Y4)RP@:69D968H8%])4%],3T]+55!?)RP@8"<L(&`C)RDI +M9&YL"B,@;&]O:W5P($E0(&%D9')E<W,@*')E=F5R<V4@;6%P<&EN9R!A=F%I +M;&%B;&4_*0I#3TU-14Y48"=2)"H\0%LD+2XD+2XD+2XD+5T^)"H))#H@)#$@ +M/"!`("1;(%L@)#(N)#,N)#0N)#4@72`D72`^("0V(`IU;F1E9FEN92A@0T]- +M345.5"<I9&YL"B,@8V]P>2!T:&4@<F5S=6QT(&]F('1H92!L;V]K=7`*4B0J +M"0DD.B0Q("1\("0Q"B,@;F]W(')E;6]V92!T:&4@9&]T"E(D*B`D?"`D*CQ` +M)"HN/B0J"20Z("0Q("1\("0R/$`D,SXD-`HC(&%N9"!C:&5C:R!T:&4@9&%T +M86)A<V4*4B0J("1\("0J/$`D*CXD*@DD.B`D,2`D?"`D/FIU;FL@)#(\0"0S +M/@I2)"H@)'P@)"H\0"0J2E5.2SXD*@DD(V5R<F]R("1`(#4N-RXQ("0Z("(U +M-S$@5&AI<R!D;VUA:6X@:7,@8F%N;F5D+"!C;VYT86-T('EO=7(@;&]C86P@ +M861M:6XN(B`)9V\@87=A>0I2)"H@)'P@)"H\0"0J4U!!34U%4CXD*@DD(V5R +M<F]R("1`(#4N-RXQ("0Z("(U-S$@66]U(&%R92!B86YN960L(&-O;G1A8W0@ +M>6]U<B!L;V-A;"!A9&UI;BXB(`EG;R!A=V%Y"B,@<F5S=&]R92!O<FEG:6YA +M;"!V86QU92`H869T97(@8V%N;VYI8V%L:7IA=&EO;B!B>2!R=6QE<V5T(#,I +M"E(D*B`D?"`D*@D))#H@)#$*=6YD969I;F4H8$-/34U%3E0G*61N;`ID969I +M;F4H8$-/34U%3E0G+"!I9F1E9BA@7T1.4U9!3$E$7R<L(&`G+"!@(R<I*61N +M;`HC('1H:7,@:7,@9&%N9V5R;W5S(2!N;R!R96%L(&YA;64*0T]-345.5&`G +M4B0J/$`D*B1^4#XD*@DD(V5R<F]R("1`(#0N,2XX("0Z(#0Q."!U;G)E<V]L +M=F%B;&4@:&]S="!N86UE("0R)#,L(&-H96-K('EO=7(@<V5T=7`N"F1I=F5R +M="@P*0I354)35$E4551%($=/3T13"B,@3U(@4T525DE#15,[($Q/4U,@3T8@ +M55-%+"!$051!+"!/4B!04D]&2513.R!/4B!"55-)3D534R!)3E1%4E)54%1) +M3TXI"B,@2$]7159%4B!#0553140@04Y$($].($%.62!42$5/4ED@3T8@3$E! +M0DE,2519+"!72$542$52($E.($-/3E1204-4+"!35%))0U0*(R!,24%"24Q) +M5%DL($]2(%1/4E0@*$E.0TQ51$E.1R!.14=,24=%3D-%($]2($]42$525TE3 +M12D@05))4TE.1R!)3B!!3ED@5T%9"B,@3U54($]&(%1(12!54T4@3T8@5$A) +M4R!33T945T%212P@159%3B!)1B!!1%9)4T5$($]&(%1(12!03U-324))3$E4 +M62!/1@HC(%-50T@@1$%-04=%+@HC"F1I=F5R="@P*0I615)324].240H8$`H +M(REC:&5C:U]M86EL+FTT"3(N,2`H0VQA=7,@07-S;6%N;BD@,3DY-RTP,RTS +M,"<I"E!54TA$259%4E0H-BD*:69D968H8%]*54Y+7T1%1DE.16AA8VLO8VAE +M8VM?;6%I;#,N;30````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```@("`V-#0@`"`@(#(S,"``("`Q-S4P(``@("`@("`@-C0V-2`@-C,V,S0S +M-S(U,R`@(#<U,#<`(``````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````9&EV97)T*"TQ*0HC"B,@0V]P>7)I9VAT("AC*2`Q.3DV+#$Y +M.3<@0VQA=7,@07-S;6%N;B`\8V%`:6YF;W)M871I:RYU;FDM:VEE;"YD93X* +M(PHC($EN('-H;W)T.B!Y;W4@8V%N(&1O('=H871E=F5R('EO=2!W86YT('=I +M=&@@=&AI<RP@8G5T(&1O;B=T(&)L86UE(&UE(0HC"B,@5$A)4R!33T945T%2 +M12!)4R!04D]6241%1"!"62!42$4@05542$]2($%.1"!#3TY44DE"551/4E,@ +M8&!!4R!)4R<G($%.1`HC($%.62!%6%!215-3($]2($E-4$Q)140@5T%24D%. +M5$E%4RP@24Y#3%5$24Y'+"!"550@3D]4($Q)34E4140@5$\L(%1(10HC($E- +M4$Q)140@5T%24D%.5$E%4R!/1B!-15)#2$%.5$%"24Q)5%D@04Y$($9)5$Y% +M4U,@1D]2($$@4$%25$E#54Q!4B!055)03U-%"B,@05)%($1)4T-,04E-140N +M("!)3B!.3R!%5D5.5"!32$%,3"!42$4@05542$]2($]2($-/3E1224)55$]2 +M4R!"12!,24%"3$4*(R!&3U(@04Y9($1)4D5#5"P@24Y$25)%0U0L($E.0TE$ +M14Y404PL(%-014-)04PL($5814U03$%262P@3U(@0T].4T51545.5$E!3`HC +M($1!34%'15,@*$E.0TQ51$E.1RP@0E54($Y/5"!,24U)5$5$(%1/+"!04D]# +M55)%345.5"!/1B!354)35$E4551%($=/3T13"B,@3U(@4T525DE#15,[($Q/ +M4U,@3T8@55-%+"!$051!+"!/4B!04D]&2513.R!/4B!"55-)3D534R!)3E1% +M4E)54%1)3TXI"B,@2$]7159%4B!#0553140@04Y$($].($%.62!42$5/4ED@ +M3T8@3$E!0DE,2519+"!72$542$52($E.($-/3E1204-4+"!35%))0U0*(R!, +M24%"24Q)5%DL($]2(%1/4E0@*$E.0TQ51$E.1R!.14=,24=%3D-%($]2($]4 +M2$525TE312D@05))4TE.1R!)3B!!3ED@5T%9"B,@3U54($]&(%1(12!54T4@ +M3T8@5$A)4R!33T945T%212P@159%3B!)1B!!1%9)4T5$($]&(%1(12!03U-3 +M24))3$E462!/1@HC(%-50T@@1$%-04=%+@HC"F1I=F5R="@P*0I615)324]. +M240H8$`H(REC:&5C:U]M86EL+FTT"3,N,2`H0VQA=7,@07-S;6%N;BD@,3DY +M-RTP-RTP-B<I"E!54TA$259%4E0H-BD*:69D968H8%]*54Y+7T1%1DE.141? +M4D5,05DG+"P*(R!F:6QE(&-O;G1A:6YI;F<@9G5L;"!E+6UA:6P@861D<F5S +M<V5S(&]F('-P86UM97)S("AF;W(@8VAE8VM?;6%I;"DZ"B,@<W!A;6UE<D!A +M9&1R97-S+F1O;6%I;B`B17)R;W(M0V]D92!%<G)O<BU497AT(@HC(&]R(&IU +M;FL@9&]M86EN<R`H9F]R(&-H96-K7VUA:6PL(&-H96-K7W)E;&%Y*3H*(R!J +M=6YK+F1O;6%I;B`@(D5R<F]R+4-O9&4@17)R;W(M5&5X="(*(R!O<B!)4"!A +M9&1R97-S97,@*&9O<B!C:&5C:U]R96QA>2DZ"B,@1"Y8+EDN6B`B17)R;W(M +M0V]D92!%<G)O<BU497AT(@HC($,N6"Y9(")%<G)O<BU#;V1E($5R<F]R+51E +M>'0B"B,@0BY8(")%<G)O<BU#;V1E($5R<F]R+51E>'0B"B,@02`B17)R;W(M +M0V]D92!%<G)O<BU497AT(@I+:G5N:R!I9F5L<V4H7T%21U\L(&`G+"!@9&)M +M("UA0$I53DL@+V5T8R]M86EL+VIU;FLG+"!@7T%21U\G*0ID969I;F4H8%]* +M54Y+7T1%1DE.141?34%)3"<L,2D**0II9F1E9BA@7T%#0T505%]33TU%7R<L +M"DMA8V-E<'0@9&)M("UO("]E=&,O;6%I;"]A8V-E<'0I"E!/4$1)5D525`H* +M9&EV97)T*#(I"DQ/0T%,7U)53$531513"B,@8VAE8VL@9F]R(&IU;FL@9&]M +M86EN+W-P86UM97)S"E-J=6YK"B,@;&]O:W5P(&1O;6%I;B!I;B!D871A8F%S +M90I2)"H\0"0K/@D))#HD,3Q`)"AJ=6YK("0R)"D^"B,@97AI<W1S/R!R971U +M<FX*4B0J/$`D*D!*54Y+/@D))$`D,3Q`)#)`2E5.2SX*(R!L;V]K=7`@861D +M<F5S<R!I;B!D871A8F%S90I2)"H\0"0K/@D))#HD,3Q`)"AJ=6YK("0Q0"0R +M("0Z)#(D*3X*(R!E>&ES=',_(')E='5R;@I2)"H\0"0J0$I53DL^"0DD0"0Q +M/$`D,D!*54Y+/@HC(')E;6]V92!O;F4@<W5B9&]M86EN+"!T<GD@86=A:6X* +M4B0J/$`D+2XD+2XD*SX)"20Z("0^:G5N:R`D,3Q`)#,N)#0^"@I38VAE8VM? +M;6%I;`HC(&1O;B=T(&-H96-K('1H97-E"E(\)"I`)#UW/@DD0"!O:PD)"7-H +M;W)T8W5T"B,@:61E82!F<F]M(%-T979E;B!38VAU;'1Z"E(\/@D))#H@/"1N +M($`@)"AD97%U;W1E("(B("0F>V-L:65N=%]N86UE?2`D*2`^"FEF9&5F*&!? +M04-#15!47U-/345?)RP*(R!A8V-E<'0@<V]M92!S='5P:60@<W1U9F8*4CPD +M*D`D*SX))#H\)#%`)"AA8V-E<'0@)#(@)#HD,B0I/@I2/"0J0$]+/@DD0"!O +M:RD*:69D968H8%]#2$5#2U]&4D]-7R<L"B,@;6%R:R!A9&1R97-S"E(D*@D) +M)#H\0#XD,0HC(&ES('1H92!S>6YT87@@;VL@*'5S97,@/#X@86YD(&YO(&1O +M="!A="!T:&4@96YD/RD*4CQ`/CPD*D`D*B1^+CX))#H\)#%`)#(D,SX*(R!M +M87)K('-T:6QL('1H97)E.B!E<G)O<BXN+@I2/$`^)"H)"20C97)R;W(@)$`@ +M-2XQ+C@@)#H@-3$X(&EL;&5G86P@34%)3"!&4D]-("0Q+`HC(&EF('=E(&1O +M;B=T('1O('1H92!A8F]V93H@<F5M;W9E(&%T(&QE87-T('1H92!D;W0N+BX* +M4CPD*D`D*BX^"3PD,21`,CXI"E(D*@D))#H@)#XS("0Q"0D)8V%N;VYI9GD* +M4B0M"0DD0"!O:PD)"0EL;V-A;"!H;W-T"B,@;F\@:&]S="!W:71H;W5T(&$@ +M+B!I;B!T:&4@1E%(3B`_"E(D*CQ`)"T^)"H))"-E<G)O<B`D0"`U+C$N."`D +M.B`U,3@@:6YV86QI9"!H;W-T(&YA;64@)#(L(&-H96-K('EO=7(@8V]N9FEG +M=7)A=&EO;BX*=6YD969I;F4H8$-/34U%3E0G*61N;`ID969I;F4H8$-/34U% +M3E0G+"!I9F1E9BA@7TE07TQ/3TM54%\G+"!@)RP@8",G*2ED;FP*(R!L;V]K +M=7`@25`@861D<F5S<R`H<F5V97)S92!M87!P:6YG(&%V86EL86)L93\I"D-/ +M34U%3E1@)U(D*CQ`6R0M+B0M+B0M+B0M73XD*@DD.B`D,2`\($`@)%L@6R`D +M,BXD,RXD-"XD-2!=("1=(#X@)#8@"B,@8V]P>2!T:&4@<F5S=6QT(&]F('1H +M92!L;V]K=7`*4B0J"0DD.B0Q("1\("0Q"B,@;F]W(')E;6]V92!T:&4@9&]T +M"E(D*B`D?"`D*CQ`)"HN/B0J"20Z("0Q("1\("0R/$`D,SXD-`HC(&%N9"!C +M:&5C:R!T:&4@9&%T86)A<V4*4B0J("1\("0J/$`D*CXD*@DD.B`D,2`D?"`D +M/FIU;FL@)#(\0"0S/@HC(&UA=&-H.B!R971U<FX@9VEV96X@97)R;W(@8V]D +M92`H<FAS(&]F(&UA<"D*4B0J("1\("0J/$`D*D!*54Y+/B0J"20C97)R;W(@ +M)$`@-2XW+C$@)#H@)#,*(R!R97-T;W)E(&]R:6=I;F%L('9A;'5E("AA9G1E +M<B!C86YO;FEC86QI>F%T:6]N(&)Y(')U;&5S970@,RD*4B0J("1\("0J"0DD +M.B`D,0IU;F1E9FEN92A@0T]-345.5"<I9&YL"F1E9FEN92A@0T]-345.5"<L +M(&EF9&5F*&!?1$Y35D%,241?)RP@8"<L(&`C)RDI9&YL"B,@=&AI<R!I<R!D +M86YG97)O=7,A(&YO(')E86P@;F%M90I#3TU-14Y48"=2)"H\0"0J)'Y0/B0J +M"20C97)R;W(@)$`@-"XQ+C@@)#H@-#$X('5N<F5S;VQV86)L92!H;W-T(&YA +M;64@)#(D,RP@8VAE8VL@>6]U<B!S971U<"X*=6YD969I;F4H8$-/34U%3E0G +M*61N;`ID:79E<G0H,"D*04Y9(%=!60HC($]55"!/1B!42$4@55-%($]&(%1( +M25,@4T]&5%=!4D4L($5614X@248@041625-%1"!/1B!42$4@4$]34TE"24Q) +M5%D@3T8*(R!354-(($1!34%'12X*(PID:79E<G0H,"D*5D524TE/3DE$*&!` +M*",I8VAE8VM?;6%I;"YM-`DS+C$@*$-L875S($%S<VUA;FXI(#$Y.3<M,#<M +M,#8G*0I055-(1$E615)4*#8I"FEF9&5F*&!?2E5.2U]$149)3D5H86-K+V-H +M96-K7W)C<'0N;30````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````("`@-C0T(``@("`R,S`@`"`@,3<U,"``("`@("`@(#,U,#,@(#8S-#4R +M-C4S-3,@("`W-#0P`"`````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````&1I=F5R="@M,2D*(PHC($-O<'ER:6=H="`H8RD@,3DY-B!# +M;&%U<R!!<W-M86YN(#QC84!I;F9O<FUA=&EK+G5N:2UK:65L+F1E/@HC"B,@ +M26X@<VAO<G0Z('EO=2!C86X@9&\@=VAA=&5V97(@>6]U('=A;G0@=VET:"!T +M:&ES+"!B=70@9&]N)W0@8FQA;64@;64A"B,*(R!42$E3(%-/1E1705)%($E3 +M(%!23U9)1$5$($)9(%1(12!!551(3U(@04Y$($-/3E1224)55$]24R!@8$%3 +M($E3)R<@04Y$"B,@04Y9($584%)%4U,@3U(@24U03$E%1"!705)204Y42453 +M+"!)3D-,541)3D<L($)55"!.3U0@3$E-251%1"!43RP@5$A%"B,@24U03$E% +M1"!705)204Y42453($]&($U%4D-(04Y404))3$E462!!3D0@1DE43D534R!& +M3U(@02!005)424-53$%2(%!54E!/4T4*(R!!4D4@1$E30TQ!24U%1"X@($E. +M($Y/($5614Y4(%-(04Q,(%1(12!!551(3U(@3U(@0T].5%))0E543U)3($)% +M($Q)04),10HC($9/4B!!3ED@1$E214-4+"!)3D1)4D5#5"P@24Y#241%3E1! +M3"P@4U!%0TE!3"P@15A%35!,05)9+"!/4B!#3TY315%514Y424%,"B,@1$%- +M04=%4R`H24Y#3%5$24Y'+"!"550@3D]4($Q)34E4140@5$\L(%!23T-54D5- +M14Y4($]&(%-50E-425155$4@1T]/1%,*(R!/4B!315)624-%4SL@3$]34R!/ +M1B!54T4L($1!5$$L($]2(%!23T9)5%,[($]2($)54TE.15-3($E.5$524E50 +M5$E/3BD*(R!(3U=%5D52($-!55-%1"!!3D0@3TX@04Y9(%1(14]262!/1B!, +M24%"24Q)5%DL(%=(151(15(@24X@0T].5%)!0U0L(%-44DE#5`HC($Q)04)) +M3$E462P@3U(@5$]25"`H24Y#3%5$24Y'($Y%1TQ)1T5.0T4@3U(@3U1(15)7 +M25-%*2!!4DE324Y'($E.($%.62!705D*(R!/550@3T8@5$A%(%5312!/1B!4 +M2$E3(%-/1E1705)%+"!%5D5.($E&($%$5DE3140@3T8@5$A%(%!/4U-)0DE, +M2519($]&"B,@4U5#2"!$04U!1T4N"B,*9&EV97)T*#`I"E9%4E-)3TY)1"A@ +M0"@C*6-H96-K7W)C<'0N;30),2XP("A#;&%U<R!!<W-M86YN*2`Q.3DV+3$Q +M+3(S)RD*"@ID:79E<G0H,BD*3$]#04Q?4E5,15-%5%,*4V-H96-K7W)C<'0* +M4B0K"0D))#H@)#XS("0Q"0D)"6-A;F]N:69Y"E(D*PD)"20Z("0H9&5Q=6]T +M92`D,2`D*0I2)"T)"0DD0"!O:PD)"0D)=&\@:&5R90I2)"H@)2`D*@D))#H@ +M<F5L87D@871T96UP=`I2)"H@0"`D*B`\($`@)"HN/@DD.B!R96QA>2!A='1E +M;7!T"E(D*R`\($`@)#UW+CX)"21`(&]K"0D)"0ET;R!H97)E"FEF9&5F*&!? +M55-%7U)%3$%95$]?)RQ@)RQ@(R<I9&YL"E(D*R`\($`@)"HD/7M296QA>51O +M?2X^"21`(&]K"0EA;&QO=R!R96QA>2!T;R!T:&5R90ID969I;F4H8$-/34U% +M3E0G+"!I9F1E9BA@7U5315])4%\G+"!@)RP@8",G*2ED;FP*0T]-345.5&`G +M4B0K"0D))#H@)"AD97%U;W1E("(B("0F>V-L:65N=%]A9&1R?2`D*0I#3TU- +M14Y48"=2,`D)"21`(&]K"0EC;&EE;G1?861D<B!I<R`P(&9O<B!S96YD;6%I +M;"`M8G,*0T]-345.5&`G4B0]>TQO8V%L25!]+B0J"0DD0"!O:PD)"0D)9G)O +M;2!H97)E"G5N9&5F:6YE*&!#3TU-14Y4)RED;FP*9&5F:6YE*&!#3TU-14Y4 +M)RP@:69D968H8%]54T5?3D%-15-?)RP@8"<L(&`C)RDI9&YL"D-/34U%3E1@ +M)U(D*PD)"20Z("0H9&5Q=6]T92`B(B`D)GMC;&EE;G1?;F%M97T@)"D*0T]- +M345.5&`G4B0M"0D))$`@;VL)"0D)"69R;VT@:&5R90I#3TU-14Y48"=2)"HD +M/7M,;V-A;$YA;65S?0D))$`@;VL)"0D)"69R;VT@:&5R90IU;F1E9FEN92A@ +M0T]-345.5"<I9&YL"FEF9&5F*&!?55-%7U)#4%1?)RP@8"<L(&!E<G)P<FEN +M="A@2$%#2R`B8VAE8VM?<F-P="(@<F5Q=6ER97,@=7-E7VEP(&]R('5S95]N +M86UE<R<I)RD*4B0J"0D))"-E<G)O<B`D0"`U+C<N,2`D.B`B-3<Q('=E(&1O +M(&YO="!S=7!P;W)T(')E;&%Y:6YG(@H*('-U8F1O;6%I;BP@=')Y(&%G86EN +M"E(D*CQ`)"TN)"TN)"L^"0DD.B`D/FIU;FL@)#$\0"0S+B0T/@H*4V-H96-K +M7VUA:6P*(R!D;VXG="!C:&5C:R!T:&5S90I2/"0J0"0]=SX))$`@;VL)"0ES +M:&]R=&-U=`HC(&ED96$@9G)O;2!3=&5V96X@4V-H=6QT>@I2/#X)"20Z(#PD +M;B!`("0H9&5Q=6]T92`B(B`D)GMC;&EE;G1?;F%M97T@:&%C:R]C:&5C:U]R +M8W!T,BYM-``````````````````````````````````````````````````` +M`````````````````````````````````````````````````````````"`@ +M(#8T-"``("`@,C,P(``@(#$W-3`@`"`@("`@("`T,#(Q("`V,S0U,C8U,S8T +M("`@-S4R,``@```````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M``````!D:79E<G0H+3$I"B,*(R!#;W!Y<FEG:'0@*&,I(#$Y.3<@0VQA=7,@ +M07-S;6%N;B`\8V%`:6YF;W)M871I:RYU;FDM:VEE;"YD93X*(PHC($EN('-H +M;W)T.B!Y;W4@8V%N(&1O('=H871E=F5R('EO=2!W86YT('=I=&@@=&AI<RP@ +M8G5T(&1O;B=T(&)L86UE(&UE(0HC"B,@5$A)4R!33T945T%212!)4R!04D]6 +M241%1"!"62!42$4@05542$]2($%.1"!#3TY44DE"551/4E,@8&!!4R!)4R<G +M($%.1`HC($%.62!%6%!215-3($]2($E-4$Q)140@5T%24D%.5$E%4RP@24Y# +M3%5$24Y'+"!"550@3D]4($Q)34E4140@5$\L(%1(10HC($E-4$Q)140@5T%2 +M4D%.5$E%4R!/1B!-15)#2$%.5$%"24Q)5%D@04Y$($9)5$Y%4U,@1D]2($$@ +M4$%25$E#54Q!4B!055)03U-%"B,@05)%($1)4T-,04E-140N("!)3B!.3R!% +M5D5.5"!32$%,3"!42$4@05542$]2($]2($-/3E1224)55$]24R!"12!,24%" +M3$4*(R!&3U(@04Y9($1)4D5#5"P@24Y$25)%0U0L($E.0TE$14Y404PL(%-0 +M14-)04PL($5814U03$%262P@3U(@0T].4T51545.5$E!3`HC($1!34%'15,@ +M*$E.0TQ51$E.1RP@0E54($Y/5"!,24U)5$5$(%1/+"!04D]#55)%345.5"!/ +M1B!354)35$E4551%($=/3T13"B,@3U(@4T525DE#15,[($Q/4U,@3T8@55-% +M+"!$051!+"!/4B!04D]&2513.R!/4B!"55-)3D534R!)3E1%4E)54%1)3TXI +M"B,@2$]7159%4B!#0553140@04Y$($].($%.62!42$5/4ED@3T8@3$E!0DE, +M2519+"!72$542$52($E.($-/3E1204-4+"!35%))0U0*(R!,24%"24Q)5%DL +M($]2(%1/4E0@*$E.0TQ51$E.1R!.14=,24=%3D-%($]2($]42$525TE312D@ +M05))4TE.1R!)3B!!3ED@5T%9"B,@3U54($]&(%1(12!54T4@3T8@5$A)4R!3 +M3T945T%212P@159%3B!)1B!!1%9)4T5$($]&(%1(12!03U-324))3$E462!/ +M1@HC(%-50T@@1$%-04=%+@HC"F1I=F5R="@P*0I615)324].240H8$`H(REC +M:&5C:U]R8W!T,BYM-`DR+C`@*$-L875S($%S<VUA;FXI(#$Y.3<M,#,M,#$G +M*0H*9&EV97)T*#(I"DQ/0T%,7U)53$531513"E-C:&5C:U]R8W!T"G5N9&5F +M:6YE*&!#3TU-14Y4)RED;FP*9&5F:6YE*&!#3TU-14Y4)RP@:69D968H8%]5 +M4T5?3D%-15-?)RP@8"<L(&`C)RDI9&YL"D-/34U%3E1@)R,@9FER<W0Z(&=E +M="!C;&EE;G0@;F%M90I#3TU-14Y48"=2)"L)"0DD.B`D*&1E<75O=&4@(B(@ +M)"9[8VQI96YT7VYA;65]("0I("1\("0Q"D-/34U%3E1@)U(@)'P@)"H)"0DD +M0"!O:PD)"6YO(&-L:65N="!N86UE.B!D:7)E8W1L>2!I;G9O:V5D"D-/34U% +M3E1@)R-2)"T@)'P@)"H)"21`(&]K"0D)9F]R('1H;W-E('=I=&AO=70@9G5L +M;"!$3E,N+BX*0T]-345.5&`G4B0J)#UW("1\("0J"0DD0"!O:PD)"69R;VT@ +M:&5R90II9F1E9BA@7U5315]214Q!651/7R<L8"<L8",G*61N;`I2)"HD/7M2 +M96QA>51O?2`D?"`D*@D))$`@;VL)"69R;VT@86QL;W=E9"!S>7-T96T*=6YD +M969I;F4H8$-/34U%3E0G*61N;`ID969I;F4H8$-/34U%3E0G+"!I9F1E9BA@ +M7U5315])4%\G+"!@)RP@8",G*2ED;FP*0T]-345.5&`G(R!F:7)S=#H@9V5T +M(&-L:65N="!A9&1R97-S"D-/34U%3E1@)U(D*PD)"20Z("0H9&5Q=6]T92`B +M(B`D)GMC;&EE;G1?861D<GT@)"D@)'P@)#$*0T]-345.5&`G4C`@)'P@)"H) +M"0DD0"!O:PD)"6-L:65N=%]A9&1R(&ES(#`@9F]R('-E;F1M86EL("UB<PI# +M3TU-14Y48"=2)#U[3&]C86Q)4'TD*B`D?"`D*@DD0"!O:PD)"69R;VT@:&5R +M90IU;F1E9FEN92A@0T]-345.5"<I9&YL"FEF9&5F*&!?55-%7U)#4%1?)RP@ +M8"<L(&!E<G)P<FEN="A@2$%#2R`B8VAE8VM?<F-P="(@<F5Q=6ER97,@=7-E +M7VEP(&]R('5S95]N86UE<R<I)RD*(R!N;W<@8VAE8VL@;W1H97(@<VED90I2 +M)"H@)'P@)"H)"20Z("0^,R`D,@HC(')E;6]V92!L;V-A;"!P87)T+"!M87EB +M92!R97!E871E9&QY"E(D*CQ`)#UW+CXD*@D))#XS("0Q("0S"FEF9&5F*&!? +M55-%7U)%3$%95$]?)RQ@)RQ@(R<I9&YL"E(D*CQ`)"HD/7M296QA>51O?2X^ +M)"H)"20^,R`D,2`D,PHC('-T:6QL('-O;65T:&EN9R!L969T/PI2)"H\0"0J +M/B0J"0DD(V5R<F]R("1`(#4N-RXQ("0Z(#4W,2!W92!D;R!N;W0@<F5L87D* +M4%1?4T]-15\G+`HC(&%C8V5P="!S;VUE('-T=7!I9"!S='5F9@I2/"0J0"0K +M/@DD.CPD,4`D*&%C8V5P="`D,B`D.B0R)"D^"E(\)"I`3TL^"21`(&]K*0II +M9F1E9BA@7T-(14-+7T923TU?)RP*(R!M87)K(&%D9')E<W,*4B0J"0DD.CQ` +M/B0Q"B,@:7,@=&AE('-Y;G1A>"!O:R`H=7-E<R`\/B!A;F0@;F\@9&]T(&%T +M('1H92!E;F0_*0I2/$`^/"0J0"0J)'XN/@DD.CPD,4`D,B0S/@HC(&UA<FL@ +M<W1I;&P@=&AE<F4Z(&5R<F]R+BXN"E(\0#XD*@D))"-E<G)O<B`D0"`U+C$N +M."`D.B`U,3@@:6QL96=A;"!-04E,($923TT@)#$L"B,@:68@=V4@9&]N)W0@ +M=&\@=&AE(&%B;W9E.B!R96UO=F4@870@;&5A<W0@=&AE(&1O="XN+@I2/"0J +M0"0J+CX)/"0Q)$`R/BD*4B0J"0DD.B`D/C,@)#$)"0EC86YO;FEF>0I2)"T) +M"21`(&]K"0D)"6QO8V%L(&AO<W0*(R!N;R!H;W-T('=I=&AO=70@82`N(&EN +M('1H92!&44A.(#\*4B0J/$`D+3XD*@DD(V5R<F]R("1`(#4N,2XX("0Z(#4Q +M:&%C:R]C:&5C:U]R8W!T,RYM-``````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````"`@(#8T-"``("`@,C,P(``@(#$W-3`@`"`@("`@("`S-#0U +M("`V,S$S,#$R-3(Q("`@-S4P-@`@```````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M``````````````````````!D:79E<G0H+3$I"B,*(R!#;W!Y<FEG:'0@*&,I +M(#$Y.3<@0VQA=7,@07-S;6%N;B`\8V%`:6YF;W)M871I:RYU;FDM:VEE;"YD +M93X*(PHC($EN('-H;W)T.B!Y;W4@8V%N(&1O('=H871E=F5R('EO=2!W86YT +M('=I=&@@=&AI<RP@8G5T(&1O;B=T(&)L86UE(&UE(0HC"B,@5$A)4R!33T94 +M5T%212!)4R!04D]6241%1"!"62!42$4@05542$]2($%.1"!#3TY44DE"551/ +M4E,@8&!!4R!)4R<G($%.1`HC($%.62!%6%!215-3($]2($E-4$Q)140@5T%2 +M4D%.5$E%4RP@24Y#3%5$24Y'+"!"550@3D]4($Q)34E4140@5$\L(%1(10HC +M($E-4$Q)140@5T%24D%.5$E%4R!/1B!-15)#2$%.5$%"24Q)5%D@04Y$($9) +M5$Y%4U,@1D]2($$@4$%25$E#54Q!4B!055)03U-%"B,@05)%($1)4T-,04E- +M140N("!)3B!.3R!%5D5.5"!32$%,3"!42$4@05542$]2($]2($-/3E1224)5 +M5$]24R!"12!,24%"3$4*(R!&3U(@04Y9($1)4D5#5"P@24Y$25)%0U0L($E. +M0TE$14Y404PL(%-014-)04PL($5814U03$%262P@3U(@0T].4T51545.5$E! +M3`HC($1!34%'15,@*$E.0TQ51$E.1RP@0E54($Y/5"!,24U)5$5$(%1/+"!0 +M4D]#55)%345.5"!/1B!354)35$E4551%($=/3T13"B,@3U(@4T525DE#15,[ +M($Q/4U,@3T8@55-%+"!$051!+"!/4B!04D]&2513.R!/4B!"55-)3D534R!) +M3E1%4E)54%1)3TXI"B,@2$]7159%4B!#0553140@04Y$($].($%.62!42$5/ +M4ED@3T8@3$E!0DE,2519+"!72$542$52($E.($-/3E1204-4+"!35%))0U0* +M(R!,24%"24Q)5%DL($]2(%1/4E0@*$E.0TQ51$E.1R!.14=,24=%3D-%($]2 +M($]42$525TE312D@05))4TE.1R!)3B!!3ED@5T%9"B,@3U54($]&(%1(12!5 +M4T4@3T8@5$A)4R!33T945T%212P@159%3B!)1B!!1%9)4T5$($]&(%1(12!0 +M3U-324))3$E462!/1@HC(%-50T@@1$%-04=%+@HC"F1I=F5R="@P*0I615)3 +M24].240H8$`H(REC:&5C:U]R8W!T,RYM-`DR+C(@*$-L875S($%S<VUA;FXI +M(#$Y.3<M,#,M,#DG*0H*9&EV97)T*#(I"DQ/0T%,7U)53$531513"E-C:&5C +M:U]R8W!T"FEF9&5F*&!?55-%7U)#4%1?)RP@8"<L(&!E<G)P<FEN="A@2$%# +M2R`B8VAE8VM?<F-P="(@<F5Q=6ER97,@=7-E7VEP(&]R('5S95]N86UE<R<I +M)RED;FP*:69D968H8%]54T5?3D%-15-?)RP*(R!F:7)S=#H@9V5T(&-L:65N +M="!N86UE"E(D*PD)"20Z("0H9&5Q=6]T92`B(B`D)GMC;&EE;G1?;F%M97T@ +M)"D@)'P@)#$*4B`D?"`D*@D)"21`(&]K"0EN;R!C;&EE;G0@;F%M93H@9&ER +M96-T;'D@:6YV;VME9`HC4B0M("1\("0J"0DD0"!O:PD)9F]R('1H;W-E('=I +M=&AO=70@9G5L;"!$3E,N+BX*4B0J)#U[3&]C86Q.86UE<WT@)'P@)"H))$`@ +M;VL)"69R;VT@86QL;W=E9"!S>7-T96T*4B0J)#UW("1\("0J"0DD0"!O:PD) +M9G)O;2!H97)E("AI;G-T96%D(&]F($QO8V%L3F%M97,I"BP*(R!F:7)S=#H@ +M9V5T(&-L:65N="!A9&1R97-S"E(D*PD)"20Z("0H9&5Q=6]T92`B(B`D)GMC +M;&EE;G1?861D<GT@)"D@)'P@)#$*4C`@)'P@)"H)"21`(&]K"0EC;&EE;G1? +M861D<B!I<R`P(&9O<B!S96YD;6%I;"`M8G,*4B0]>TQO8V%L25!])"H@)'P@ +M)"H))$`@;VL)"69R;VT@:&5R90HI9&YL"B,@;F]W(&-H96-K(&]T:&5R('-I +M9&4*4B0J("1\("0J"0DD.B`D/C,@)#(*(R!R96UO=F4@;&]C86P@<&%R="P@ +M;6%Y8F4@<F5P96%T961L>0II9F1E9BA@7U5315]214Q!651/7R<L"E(D*CQ` +M)"HD/7M296QA>51O?2X^)"H)"20^,R`D,2`D-`HL"E(D*CQ`)#UW+CXD*@D) +M)#XS("0Q("0S"BED;FP*(R!S=&EL;"!S;VUE=&AI;F<@;&5F=#\*4B0J/$`D +M*SXD*@D))"-E<G)O<B`D0"`U+C<N,2`D.B`U-S$@=V4@9&\@;F]T(')E;&%Y +M"D%225-)3D<@24X@04Y9(%=!60HC($]55"!/1B!42$4@55-%($]&(%1(25,@ +M4T]&5%=!4D4L($5614X@248@041625-%1"!/1B!42$4@4$]34TE"24Q)5%D@ +M3T8*(R!354-(($1!34%'12X*(PID:79E<G0H,"D*5D524TE/3DE$*&!`*",I +M8VAE8VM?<F-P=#,N;30),BXR("A#;&%U<R!!<W-M86YN*2`Q.3DW+3`S+3`Y +M)RD*"F1I=F5R="@R*0I,3T-!3%]254Q%4T544PI38VAE8VM?<F-P=&AA8VLO +M8VAE8VM?<F-P=#0N;30````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````@("`V-#0@`"`@(#(S,"``("`Q-S4P(``@("`@("`@,S<V-2`@-C,Q +M,S`Q-3,R-"`@(#<U,C``(``````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````9&EV97)T*"TQ*0HC"B,@0V]P>7)I9VAT("AC*2`Q.3DW +M($-L875S($%S<VUA;FX@/&-A0&EN9F]R;6%T:6LN=6YI+6MI96PN9&4^"B,* +M(R!);B!S:&]R=#H@>6]U(&-A;B!D;R!W:&%T979E<B!Y;W4@=V%N="!W:71H +M('1H:7,L(&)U="!D;VXG="!B;&%M92!M92$*(PHC(%1(25,@4T]&5%=!4D4@ +M25,@4%)/5DE$140@0ED@5$A%($%55$A/4B!!3D0@0T].5%))0E543U)3(&!@ +M05,@25,G)R!!3D0*(R!!3ED@15A04D534R!/4B!)35!,245$(%=!4E)!3E1) +M15,L($E.0TQ51$E.1RP@0E54($Y/5"!,24U)5$5$(%1/+"!42$4*(R!)35!, +M245$(%=!4E)!3E1)15,@3T8@34520TA!3E1!0DE,2519($%.1"!&251.15-3 +M($9/4B!!(%!!4E1)0U5,05(@4%524$]310HC($%212!$25-#3$%)345$+B`@ +M24X@3D\@159%3E0@4TA!3$P@5$A%($%55$A/4B!/4B!#3TY44DE"551/4E,@ +M0D4@3$E!0DQ%"B,@1D]2($%.62!$25)%0U0L($E.1$E214-4+"!)3D-)1$5. +M5$%,+"!34$5#24%,+"!%6$5-4$Q!4EDL($]2($-/3E-%455%3E1)04P*(R!$ +M04U!1T53("A)3D-,541)3D<L($)55"!.3U0@3$E-251%1"!43RP@4%)/0U52 +M14U%3E0@3T8@4U5"4U1)5%5412!'3T]$4PHC($]2(%-%4E9)0T53.R!,3U-3 +M($]&(%5312P@1$%402P@3U(@4%)/1DE44SL@3U(@0E5324Y%4U,@24Y415)2 +M55!424].*0HC($A/5T5615(@0T%54T5$($%.1"!/3B!!3ED@5$A%3U)9($]& +M($Q)04))3$E462P@5TA%5$A%4B!)3B!#3TY44D%#5"P@4U1224-4"B,@3$E! +M0DE,2519+"!/4B!43U)4("A)3D-,541)3D<@3D5'3$E'14Y#12!/4B!/5$A% +M4E=)4T4I($%225-)3D<@24X@04Y9(%=!60HC($]55"!/1B!42$4@55-%($]& +M(%1(25,@4T]&5%=!4D4L($5614X@248@041625-%1"!/1B!42$4@4$]34TE" +M24Q)5%D@3T8*(R!354-(($1!34%'12X*(PID:79E<G0H,"D*5D524TE/3DE$ +M*&!`*",I8VAE8VM?<F-P=#0N;30),BXS("A#;&%U<R!!<W-M86YN*2`Q.3DW +M+3`S+3$V)RD*"F1I=F5R="@R*0ID969I;F4H8%]54T5?3D%-15-?4E5,15,G +M+&!2("1@)WP@)&`G*@D)"21@)T`@;VL)"6YO(&-L:65N="!N86UE.B!D:7)E +M8W1L>2!I;G9O:V5D"B-2)&`G+2`D8"=\("1@)RH)"21@)T`@;VL)"69O<B!T +M:&]S92!W:71H;W5T(&9U;&P@1$Y3+BXN"E(D8"<J)&`G/7<@)&`G?"`D8"<J +M"0DD8"=`(&]K"0EF<F]M(&AE<F4*4B1@)RHD8"<]>TQO8V%L3F%M97-]("1@ +M)WP@)&`G*@DD8"=`(&]K"0EF<F]M(&%L;&]W960@<WES=&5M)RD*3$]#04Q? +M4E5,15-%5%,*4V-H96-K7W)C<'0*:69D968H8%]54T5?4D-05%\G+"!@)RP@ +M8&5R<G!R:6YT*&!(04-+(")C:&5C:U]R8W!T(B!R97%U:7)E<R!U<V5?:7`@ +M;W(@=7-E7VYA;65S)RDG*61N;`II9F1E9BA@7U5315])4%\G+`HC(&9I<G-T +M.B!G970@8VQI96YT(&%D9')E<W,*4B0K"0D))#H@)"AD97%U;W1E("(B("0F +M>V-L:65N=%]A9&1R?2`D*2`D?"`D,0I2,"`D?"`D*@D))$`@;VL)"6-L:65N +M=%]A9&1R(&ES(#`@9F]R('-E;F1M86EL("UB<PI2)#U[3&]C86Q)4'TD*B`D +M?"`D*@DD0"!O:PD)9G)O;2!H97)E"FEF9&5F*&!?55-%7TY!34537R<L"B,@ +M;F5X=#H@9V5T(&-L:65N="!N86UE"E(D*B`D?"`D*PD))#H@)"AD97%U;W1E +M("(B("0F>V-L:65N=%]N86UE?2`D*2`D?"`D,@I?55-%7TY!34537U)53$53 +M"BDL"B,@9FER<W0Z(&=E="!C;&EE;G0@;F%M90I2)"L)"0DD.B`D*&1E<75O +M=&4@(B(@)"9[8VQI96YT7VYA;65]("0I("1\("0Q"E]54T5?3D%-15-?4E5, +M15,**61N;`HC(&YO=R!C:&5C:R!O=&AE<B!S:61E"E(D*B`D?"`D*@D))#H@ +M)#XS("0R"FEF9&5F*&!?55-%7U)%3$%95$]?)RP*(R!R96UO=F4@4F5L87E4 +M;R!P87)T("AM87EB92!R97!E871E9&QY*0I2)"H\0"0J)#U[4F5L87E4;WTN +M/B0J"0DD/C,@)#$@)#0**61N;`HC(')E;6]V92!L;V-A;"!P87)T("AM87EB +M92!R97!E871E9&QY*0I2)"H\0"0]=RX^)"H)"20^,R`D,2`D,PHC('-T:6QL +M('-O;65T:&EN9R!L969T/PI2)"H\0"0K/B0J"0DD(V5R<F]R("1`(#4N-RXQ +M("0Z(#4W,2!W92!D;R!N;W0@<F5L87D*+C<N,2`D.B`U-S%H86-K+V-H96-K +M7W)E;&%Y+FTT```````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M("`@-C0T(``@("`R,S`@`"`@,3<U,"``("`@("`@(#,U-#(@(#8S-#(R-C<U +M-S(@("`W-C$Q`"`````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````&1I=F5R="@M,2D*(PHC($-O<'ER:6=H="`H8RD@,3DY-R!#;&%U +M<R!!<W-M86YN(#QC84!I;F9O<FUA=&EK+G5N:2UK:65L+F1E/@HC"B,@26X@ +M<VAO<G0Z('EO=2!C86X@9&\@=VAA=&5V97(@>6]U('=A;G0@=VET:"!T:&ES +M+"!B=70@9&]N)W0@8FQA;64@;64A"B,*(R!42$E3(%-/1E1705)%($E3(%!2 +M3U9)1$5$($)9(%1(12!!551(3U(@04Y$($-/3E1224)55$]24R!@8$%3($E3 +M)R<@04Y$"B,@04Y9($584%)%4U,@3U(@24U03$E%1"!705)204Y42453+"!) +M3D-,541)3D<L($)55"!.3U0@3$E-251%1"!43RP@5$A%"B,@24U03$E%1"!7 +M05)204Y42453($]&($U%4D-(04Y404))3$E462!!3D0@1DE43D534R!&3U(@ +M02!005)424-53$%2(%!54E!/4T4*(R!!4D4@1$E30TQ!24U%1"X@($E.($Y/ +M($5614Y4(%-(04Q,(%1(12!!551(3U(@3U(@0T].5%))0E543U)3($)%($Q) +M04),10HC($9/4B!!3ED@1$E214-4+"!)3D1)4D5#5"P@24Y#241%3E1!3"P@ +M4U!%0TE!3"P@15A%35!,05)9+"!/4B!#3TY315%514Y424%,"B,@1$%-04=% +M4R`H24Y#3%5$24Y'+"!"550@3D]4($Q)34E4140@5$\L(%!23T-54D5-14Y4 +M($]&(%-50E-425155$4@1T]/1%,*(R!/4B!315)624-%4SL@3$]34R!/1B!5 +M4T4L($1!5$$L($]2(%!23T9)5%,[($]2($)54TE.15-3($E.5$524E505$E/ +M3BD*(R!(3U=%5D52($-!55-%1"!!3D0@3TX@04Y9(%1(14]262!/1B!,24%" +M24Q)5%DL(%=(151(15(@24X@0T].5%)!0U0L(%-44DE#5`HC($Q)04))3$E4 +M62P@3U(@5$]25"`H24Y#3%5$24Y'($Y%1TQ)1T5.0T4@3U(@3U1(15)725-% +M*2!!4DE324Y'($E.($%.62!705D*(R!/550@3T8@5$A%(%5312!/1B!42$E3 +M(%-/1E1705)%+"!%5D5.($E&($%$5DE3140@3T8@5$A%(%!/4U-)0DE,2519 +M($]&"B,@4U5#2"!$04U!1T4N"B,*9&EV97)T*#`I"E9%4E-)3TY)1"A@0"@C +M*6-H96-K7W)E;&%Y+FTT"3(N,"`H0VQA=7,@07-S;6%N;BD@,3DY-RTP-2TR +M-2<I"E!54TA$259%4E0H-BD*:69D968H8%]*54Y+7T1%1DE.141?34%)3"<L +M+`HC(&9I;&4@8V]N=&%I;FEN9R!F=6QL(&4M;6%I;"!A9&1R97-S97,@;V8@ +M<W!A;6UE<G,@*&9O<B!C:&5C:U]M86EL*3H*(R!S<&%M;65R0&%D9')E<W,N +M9&]M86EN(%-004U-15(*(R!O<B!J=6YK(&1O;6%I;G,@*&9O<B!C:&5C:U]M +M86EL+"!C:&5C:U]R96QA>2DZ"B,@:G5N:RYD;VUA:6X@2E5.2PHC(&]R($E0 +M(&%D9')E<W-E<R`H9F]R(&-H96-K7W)E;&%Y*3H*(R!$+E@N62Y:($E0"B,@ +M0RY8+ED@25`*(R!"+E@@25`*(R!!($E0"DMJ=6YK(&EF96QS92A?05)'7RP@ +M8"<L(&!D8FT@+V5T8R]M86EL+VIU;FLG+"!@7T%21U\G*0ID969I;F4H8%]* +M54Y+7T1%1DE.141?4D5,05DG+#$I"BD*4$]01$E615)4"@ID:79E<G0H,BD* +M3$]#04Q?4E5,15-%5%,*4VIU;FM)4`HC(&QO;VMU<"!)4"!I;B!D871A8F%S +M90HC(&9U;&P@25`@861D<F5S<PI2)"TN)"TN)"TN)"T))#H@)"AJ=6YK("0Q +M+B0R+B0S+B0T("0I"B,@8VQA<W,@0R!N970*4B0M+B0M+B0M+B0M"20Z("0H +M:G5N:R`D,2XD,BXD,R`D.B`D,2XD,BXD,RXD-"`D*0HC(&-L87-S($(@;F5T +M"E(D+2XD+2XD+2XD+0DD.B`D*&IU;FL@)#$N)#(@)#H@)#$N)#(N)#,N)#0@ +M)"D*(R!C;&%S<R!!(&YE=`I2)"TN)"TN)"TN)"T))#H@)"AJ=6YK("0Q("0Z +M("0Q+B0R+B0S+B0T("0I"@I38VAE8VM?<F5L87D*(R!C:&5C:R!)4`I2)"L@ +M)'P@)"L))#H@)#$@)'P@)#YJ=6YK25`@)#(*4B0K("1\($E0"20C97)R;W(@ +M)$`@-2XW+C$@)#H@(FYO(&%C8V5S<R!F<F]M('EO=7(@25`B"B,@8VAE8VL@ +M:&]S=&YA;64*4B0K("1\("0K"20Z("0^:G5N:R`\0"0Q/@I2)"H\0"0J2E5. +M2SXD*@DD(V5R<F]R("1`(#4N-RXQ("0Z(")N;R!A8V-E<W,@9G)O;2!T:&ES +M(&AO<W0B"B0T"BED;FP*(R!R96UO=F4@;&]C86P@<&%R="`H;6%Y8F4@<F5P +M96%T961L>2D*4B0J/$`D/7<N/B0J"0DD/C,@)#$@)#,*(R!S=&EL;"!S;VUE +M=&AI;F<@;&5F=#\*4B0J/$`D*SXD*@D))"-E<G)O<B`D0"`U+C<N,2`D.B`U +M-S$@=V4@9&\@;F]T(')E;&%Y"BXW+C$@)#H@-3<Q:&%C:R]C:&5C:U]R96QA +M>3,N;30````````````````````````````````````````````````````` +M`````````````````````````````````````````````````````"`@(#8T +M-"``("`@,C,P(``@(#$W-3`@`"`@("`@("`S-C<R("`V,S4W-S4P,S4W("`@ +M-S<P-``@```````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M``!D:79E<G0H+3$I"B,*(R!#;W!Y<FEG:'0@*&,I(#$Y.3<@0VQA=7,@07-S +M;6%N;B`\8V%`:6YF;W)M871I:RYU;FDM:VEE;"YD93X*(PHC($EN('-H;W)T +M.B!Y;W4@8V%N(&1O('=H871E=F5R('EO=2!W86YT('=I=&@@=&AI<RP@8G5T +M(&1O;B=T(&)L86UE(&UE(0HC"B,@5$A)4R!33T945T%212!)4R!04D]6241% +M1"!"62!42$4@05542$]2($%.1"!#3TY44DE"551/4E,@8&!!4R!)4R<G($%. +M1`HC($%.62!%6%!215-3($]2($E-4$Q)140@5T%24D%.5$E%4RP@24Y#3%5$ +M24Y'+"!"550@3D]4($Q)34E4140@5$\L(%1(10HC($E-4$Q)140@5T%24D%. +M5$E%4R!/1B!-15)#2$%.5$%"24Q)5%D@04Y$($9)5$Y%4U,@1D]2($$@4$%2 +M5$E#54Q!4B!055)03U-%"B,@05)%($1)4T-,04E-140N("!)3B!.3R!%5D5. +M5"!32$%,3"!42$4@05542$]2($]2($-/3E1224)55$]24R!"12!,24%"3$4* +M(R!&3U(@04Y9($1)4D5#5"P@24Y$25)%0U0L($E.0TE$14Y404PL(%-014-) +M04PL($5814U03$%262P@3U(@0T].4T51545.5$E!3`HC($1!34%'15,@*$E. +M0TQ51$E.1RP@0E54($Y/5"!,24U)5$5$(%1/+"!04D]#55)%345.5"!/1B!3 +M54)35$E4551%($=/3T13"B,@3U(@4T525DE#15,[($Q/4U,@3T8@55-%+"!$ +M051!+"!/4B!04D]&2513.R!/4B!"55-)3D534R!)3E1%4E)54%1)3TXI"B,@ +M2$]7159%4B!#0553140@04Y$($].($%.62!42$5/4ED@3T8@3$E!0DE,2519 +M+"!72$542$52($E.($-/3E1204-4+"!35%))0U0*(R!,24%"24Q)5%DL($]2 +M(%1/4E0@*$E.0TQ51$E.1R!.14=,24=%3D-%($]2($]42$525TE312D@05)) +M4TE.1R!)3B!!3ED@5T%9"B,@3U54($]&(%1(12!54T4@3T8@5$A)4R!33T94 +M5T%212P@159%3B!)1B!!1%9)4T5$($]&(%1(12!03U-324))3$E462!/1@HC +M(%-50T@@1$%-04=%+@HC"F1I=F5R="@P*0I615)324].240H8$`H(REC:&5C +M:U]R96QA>2YM-`DS+C`@*$-L875S($%S<VUA;FXI(#$Y.3<M,#8M,#$G*0I0 +M55-(1$E615)4*#8I"FEF9&5F*&!?2E5.2U]$149)3D5$7TU!24PG+"P*(R!F +M:6QE(&-O;G1A:6YI;F<@9G5L;"!E+6UA:6P@861D<F5S<V5S(&]F('-P86UM +M97)S("AF;W(@8VAE8VM?;6%I;"DZ"B,@<W!A;6UE<D!A9&1R97-S+F1O;6%I +M;B`B17)R;W(M0V]D92!%<G)O<BU497AT(@HC(&]R(&IU;FL@9&]M86EN<R`H +M9F]R(&-H96-K7VUA:6PL(&-H96-K7W)E;&%Y*3H*(R!J=6YK+F1O;6%I;B`@ +M(D5R<F]R+4-O9&4@17)R;W(M5&5X="(*(R!O<B!)4"!A9&1R97-S97,@*&9O +M<B!C:&5C:U]R96QA>2DZ"B,@1"Y8+EDN6B`B17)R;W(M0V]D92!%<G)O<BU4 +M97AT(@HC($,N6"Y9(")%<G)O<BU#;V1E($5R<F]R+51E>'0B"B,@0BY8(")% +M<G)O<BU#;V1E($5R<F]R+51E>'0B"B,@02`B17)R;W(M0V]D92!%<G)O<BU4 +M97AT(@I+:G5N:R!I9F5L<V4H7T%21U\L(&`G+"!@9&)M("UA0$I53DL@+V5T +M8R]M86EL+VIU;FLG+"!@7T%21U\G*0ID969I;F4H8%]*54Y+7T1%1DE.141? +M4D5,05DG+#$I"BD*4$]01$E615)4"@ID:79E<G0H,BD*3$]#04Q?4E5,15-% +M5%,*4VIU;FM)4`HC(&QO;VMU<"!)4"!I;B!D871A8F%S90HC(&9U;&P@25`@ +M861D<F5S<PI2)"TN)"TN)"TN)"T))#H@)"AJ=6YK("0Q+B0R+B0S+B0T("0I +M"B,@8VQA<W,@0R!N970*4B0M+B0M+B0M+B0M"20Z("0H:G5N:R`D,2XD,BXD +M,R`D.B`D,2XD,BXD,RXD-"`D*0HC(&-L87-S($(@;F5T"E(D+2XD+2XD+2XD +M+0DD.B`D*&IU;FL@)#$N)#(@)#H@)#$N)#(N)#,N)#0@)"D*(R!C;&%S<R!! +M(&YE=`I2)"TN)"TN)"TN)"T))#H@)"AJ=6YK("0Q("0Z("0Q+B0R+B0S+B0T +M("0I"@I38VAE8VM?<F5L87D*(R!C:&5C:R!)4`I2)"L@)'P@)"L))#H@)#$@ +M)'P@)#YJ=6YK25`@)#(*4B0K("1\("0J0$I53DL))"-E<G)O<B`D0"`U+C<N +M,2`D.B`D,@HC(&-H96-K(&AO<W1N86UE"E(D*R`D?"`D*PDD.B`D/FIU;FL@ +M/$`D,3X*4B0J/$`D*D!*54Y+/B0J"20C97)R;W(@)$`@-2XW+C$@)#H@)#(* +M24%"3$4*(R!&3U(@04Y9($1)4D5#5"P@24Y$25)%0U0L($E.0TE$14Y404PL +M(%-014-)04PL($5814U03$%262P@3U(@0VAA8VLO<W!A;61O;7,N;30````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````@("`V-#0@`"`@ +M(#(S,"``("`Q-S4P(``@("`@("`@,C(P-R`@-C(T-C`U,38P,B`@(#<Q-#0` +M(``````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````````````````````````````````````````````9&EV +M97)T*"TQ*0HC"B,@0V]P>7)I9VAT("AC*2`Q.3DV($-L875S($%S<VUA;FX@ +M/&-A0&EN9F]R;6%T:6LN=6YI+6MI96PN9&4^"B,*(R!);B!S:&]R=#H@>6]U +M(&-A;B!D;R!W:&%T979E<B!Y;W4@=V%N="!W:71H('1H:7,L(&)U="!D;VXG +M="!B;&%M92!M92$*(PHC(%1(25,@4T]&5%=!4D4@25,@4%)/5DE$140@0ED@ +M5$A%($%55$A/4B!!3D0@0T].5%))0E543U)3(&!@05,@25,G)R!!3D0*(R!! +M3ED@15A04D534R!/4B!)35!,245$(%=!4E)!3E1)15,L($E.0TQ51$E.1RP@ +M0E54($Y/5"!,24U)5$5$(%1/+"!42$4*(R!)35!,245$(%=!4E)!3E1)15,@ +M3T8@34520TA!3E1!0DE,2519($%.1"!&251.15-3($9/4B!!(%!!4E1)0U5, +M05(@4%524$]310HC($%212!$25-#3$%)345$+B`@24X@3D\@159%3E0@4TA! +M3$P@5$A%($%55$A/4B!/4B!#3TY44DE"551/4E,@0D4@3$E!0DQ%"B,@1D]2 +M($%.62!$25)%0U0L($E.1$E214-4+"!)3D-)1$5.5$%,+"!34$5#24%,+"!% +M6$5-4$Q!4EDL($]2($-/3E-%455%3E1)04P*(R!$04U!1T53("A)3D-,541) +M3D<L($)55"!.3U0@3$E-251%1"!43RP@4%)/0U5214U%3E0@3T8@4U5"4U1) +M5%5412!'3T]$4PHC($]2(%-%4E9)0T53.R!,3U-3($]&(%5312P@1$%402P@ +M3U(@4%)/1DE44SL@3U(@0E5324Y%4U,@24Y415)255!424].*0HC($A/5T56 +M15(@0T%54T5$($%.1"!/3B!!3ED@5$A%3U)9($]&($Q)04))3$E462P@5TA% +M5$A%4B!)3B!#3TY44D%#5"P@4U1224-4"B,@3$E!0DE,2519+"!/4B!43U)4 +M("A)3D-,541)3D<@3D5'3$E'14Y#12!/4B!/5$A%4E=)4T4I($%225-)3D<@ +M24X@04Y9(%=!60HC($]55"!/1B!42$4@55-%($]&(%1(25,@4T]&5%=!4D4L +M($5614X@248@041625-%1"!/1B!42$4@4$]34TE"24Q)5%D@3T8*(R!354-( +M($1!34%'12X*(PID:79E<G0H,"D*5D524TE/3DE$*&!`*",I<W!A;61O;7,N +M;30),2XP("A#;&%U<R!!<W-M86YN*2`Q.3DV+3$Q+3(S)RD*9&EV97)T*"TQ +M*0H*9&5F:6YE*&!?4U!!341/35-?)RPQ*0I055-(1$E615)4*#8I"B,@9FEL +M92!C;VYT86EN:6YG(&1O;6%I;G,@;V8@=V5L;"UK;F]W;B!S<&%M;65R<PI& +M>U-P86U$;VUA:6YS?2!I9F5L<V4H7T%21U\L(&`G+"!@+V5T8R]M86EL+U-P +M86U$;VUA:6YS)RP@8%]!4D=?)RD*4$]01$E615)4"F1O;6%I;G,@*&9O<B!C +M:&5C:U]M86EL+"!C:&5C:U]R96QA>2DZ"B,@:G5N:RYD;VUA:6X@(")%<G)O +M<BU#;V1E($5R<F]R+51E>'0B"B,@;W(@25`@861D<F5S<V5S("AF;W(@8VAE +M8VM?<F5L87DI.@HC($0N6"Y9+EH@(D5R<F]R+4-O9&4@17)R;W(M5&5X="(* +M(R!#+E@N62`B17)R;W(M0V]D92!%<G)O<BU497AT(@HC($(N6"`B17)R;W(M +M0V]D92!%<G)O<BU497AT(@HC($$@(D5R<F]R+4-O9&4@17)R;W(M5&5X="(* +M2VIU;FL@:69E;'-E*%]!4D=?+"!@)RP@8&1B;2`M84!*54Y+("]E=&,O;6%I +M;"]J=6YK)RP@8%]!4D=?)RD*9&5F:6YE*&!?2E5.2U]$149)3D5$7U)%3$%9 +M)RPQ*0HI"E!/4$1)5D525`H*9&EV97)T*#(I"DQ/0T%,7U)53$531513"E-J +M=6YK:&%C:R]S<&%M;65R<RYM-``````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````"`@(#8T-"``("`@,C,P(``@(#$W-3`@`"`@("`@("`R +M,C$U("`V,C0U-C,T,#0R("`@-S$U,P`@```````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M``````````````````````````!D:79E<G0H+3$I"B,*(R!#;W!Y<FEG:'0@ +M*&,I(#$Y.38@0VQA=7,@07-S;6%N;B`\8V%`:6YF;W)M871I:RYU;FDM:VEE +M;"YD93X*(PHC($EN('-H;W)T.B!Y;W4@8V%N(&1O('=H871E=F5R('EO=2!W +M86YT('=I=&@@=&AI<RP@8G5T(&1O;B=T(&)L86UE(&UE(0HC"B,@5$A)4R!3 +M3T945T%212!)4R!04D]6241%1"!"62!42$4@05542$]2($%.1"!#3TY44DE" +M551/4E,@8&!!4R!)4R<G($%.1`HC($%.62!%6%!215-3($]2($E-4$Q)140@ +M5T%24D%.5$E%4RP@24Y#3%5$24Y'+"!"550@3D]4($Q)34E4140@5$\L(%1( +M10HC($E-4$Q)140@5T%24D%.5$E%4R!/1B!-15)#2$%.5$%"24Q)5%D@04Y$ +M($9)5$Y%4U,@1D]2($$@4$%25$E#54Q!4B!055)03U-%"B,@05)%($1)4T-, +M04E-140N("!)3B!.3R!%5D5.5"!32$%,3"!42$4@05542$]2($]2($-/3E12 +M24)55$]24R!"12!,24%"3$4*(R!&3U(@04Y9($1)4D5#5"P@24Y$25)%0U0L +M($E.0TE$14Y404PL(%-014-)04PL($5814U03$%262P@3U(@0T].4T51545. +M5$E!3`HC($1!34%'15,@*$E.0TQ51$E.1RP@0E54($Y/5"!,24U)5$5$(%1/ +M+"!04D]#55)%345.5"!/1B!354)35$E4551%($=/3T13"B,@3U(@4T525DE# +M15,[($Q/4U,@3T8@55-%+"!$051!+"!/4B!04D]&2513.R!/4B!"55-)3D53 +M4R!)3E1%4E)54%1)3TXI"B,@2$]7159%4B!#0553140@04Y$($].($%.62!4 +M2$5/4ED@3T8@3$E!0DE,2519+"!72$542$52($E.($-/3E1204-4+"!35%)) +M0U0*(R!,24%"24Q)5%DL($]2(%1/4E0@*$E.0TQ51$E.1R!.14=,24=%3D-% +M($]2($]42$525TE312D@05))4TE.1R!)3B!!3ED@5T%9"B,@3U54($]&(%1( +M12!54T4@3T8@5$A)4R!33T945T%212P@159%3B!)1B!!1%9)4T5$($]&(%1( +M12!03U-324))3$E462!/1@HC(%-50T@@1$%-04=%+@HC"F1I=F5R="@P*0I6 +M15)324].240H8$`H(RES<&%M;65R<RYM-`DQ+C`@*$-L875S($%S<VUA;FXI +M(#$Y.38M,3$M,C,G*0ID:79E<G0H+3$I"@ID969I;F4H8%]34$%-34524U\G +M+#$I"E!54TA$259%4E0H-BD*(R!F:6QE(&-O;G1A:6YI;F<@9G5L;"!E+6UA +M:6P@861D<F5S<V5S(&]F('=E;&PM:VYO=VX@<W!A;6UE<G,*1GM3<&%M;65R +M?2!I9F5L<V4H7T%21U\L(&`G+"!@+V5T8R]M86EL+U-P86UM97(G+"!@7T%2 +M1U\G*0I03U!$259%4E0*;&%M92!M92$*(PHC(%1(25,@4T]&5%=!4D4@25,@ +M4%)/5DE$140@0ED@5$A%($%55$A/4B!!3D0@0T].5%))0E543U)3(&!@05,@ +M25,G)R!!3D0*(R!!3ED@15A04D534R!/4B!)35!,245$(%=!4E)!3E1)15,L +M($E.0TQ51$E.1RP@0E54($Y/5"!,24U)5$5$(%1/+"!42$4*(R!)35!,245$ +M(%=!4E)!3E1)15,@3T8@34520TA!3E1!0DE,2519($%.1"!&251.15-3($9/ +M4B!!(%!!4E1)0U5,05(@4%524$]310HC($%212!$25-#3$%)345$+B`@24X@ +M3D\@159%3E0@4TA!3$P@5$A%($%55$A/4B!/4B!#3TY44DE"551/4E,@0D4@ +M3$E!0DQ%"B,@1D]2($%.62!$25)%0U0L($E.1$E214-4+"!)3D-)1$5.5$%, +M+"!34$5#24%,+"!%6$5-4$Q!4EDL($]2($-H86-K+W5S95]I<"YM-``````` +M```````````````````````````````````````````````````````````` +M````````````````````````````````````````````````("`@-C0T(``@ +M("`R,S`@`"`@,3<U,"``("`@("`@(#(R-#,@(#8R-#8P-3,T-#8@("`V-C$U +M`"`````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M`````````````````````````````````````````````````````````&1I +M=F5R="@M,2D*(PHC($-O<'ER:6=H="`H8RD@,3DY-B!#;&%U<R!!<W-M86YN +M(#QC84!I;F9O<FUA=&EK+G5N:2UK:65L+F1E/@HC"B,@26X@<VAO<G0Z('EO +M=2!C86X@9&\@=VAA=&5V97(@>6]U('=A;G0@=VET:"!T:&ES+"!B=70@9&]N +M)W0@8FQA;64@;64A"B,*(R!42$E3(%-/1E1705)%($E3(%!23U9)1$5$($)9 +M(%1(12!!551(3U(@04Y$($-/3E1224)55$]24R!@8$%3($E3)R<@04Y$"B,@ +M04Y9($584%)%4U,@3U(@24U03$E%1"!705)204Y42453+"!)3D-,541)3D<L +M($)55"!.3U0@3$E-251%1"!43RP@5$A%"B,@24U03$E%1"!705)204Y42453 +M($]&($U%4D-(04Y404))3$E462!!3D0@1DE43D534R!&3U(@02!005)424-5 +M3$%2(%!54E!/4T4*(R!!4D4@1$E30TQ!24U%1"X@($E.($Y/($5614Y4(%-( +M04Q,(%1(12!!551(3U(@3U(@0T].5%))0E543U)3($)%($Q)04),10HC($9/ +M4B!!3ED@1$E214-4+"!)3D1)4D5#5"P@24Y#241%3E1!3"P@4U!%0TE!3"P@ +M15A%35!,05)9+"!/4B!#3TY315%514Y424%,"B,@1$%-04=%4R`H24Y#3%5$ +M24Y'+"!"550@3D]4($Q)34E4140@5$\L(%!23T-54D5-14Y4($]&(%-50E-4 +M25155$4@1T]/1%,*(R!/4B!315)624-%4SL@3$]34R!/1B!54T4L($1!5$$L +M($]2(%!23T9)5%,[($]2($)54TE.15-3($E.5$524E505$E/3BD*(R!(3U=% +M5D52($-!55-%1"!!3D0@3TX@04Y9(%1(14]262!/1B!,24%"24Q)5%DL(%=( +M151(15(@24X@0T].5%)!0U0L(%-44DE#5`HC($Q)04))3$E462P@3U(@5$]2 +M5"`H24Y#3%5$24Y'($Y%1TQ)1T5.0T4@3U(@3U1(15)725-%*2!!4DE324Y' +M($E.($%.62!705D*(R!/550@3T8@5$A%(%5312!/1B!42$E3(%-/1E1705)% +M+"!%5D5.($E&($%$5DE3140@3T8@5$A%(%!/4U-)0DE,2519($]&"B,@4U5# +M2"!$04U!1T4N"B,*9&EV97)T*#`I"E9%4E-)3TY)1"A@0"@C*75S95]I<"YM +M-`DQ+C`@*$-L875S($%S<VUA;FXI(#$Y.38M,3$M,C,G*0ID:79E<G0H+3$I +M"@ID969I;F4H8%]54T5?25!?)RPQ*0ID969I;F4H8%]54T5?4D-05%\G+#$I +M"E!54TA$259%4E0H-BD*(R!F:6QE(&-O;G1A:6YI;F<@25`@;G5M8F5R<R!O +M9B!M86-H:6YE<R!W:&EC:"!C86X@=7-E(&]U<B!R96QA>0I&>TQO8V%L25!] +M(&EF96QS92A?05)'7RP@8"<L(&`O971C+VUA:6PO3&]C86Q)4"<L(&!?05)' +M7R<I"E!/4$1)5D525`H*8VM?<F5L87DI.@HC(&IU;FLN9&]M86EN("`B17)R +M;W(M0V]D92!%<G)O<BU497AT(@HC(&]R($E0(&%D9')E<W-E<R`H9F]R(&-H +M96-K7W)E;&%Y*3H*(R!$+E@N62Y:(")%<G)O<BU#;V1E($5R<F]R+51E>'0B +M"B,@0RY8+ED@(D5R<F]R+4-O9&4@17)R;W(M5&5X="(*(R!"+E@@(D5R<F]R +M+4-O9&4@17)R;W(M5&5X="(*(R!!(")%<G)O<BU#;V1E($5R<F]R+51E>'0B +M"DMJ=6YK(&EF96QS92A?05)'7RP@8"<L(&!D8FT@+6%`2E5.2R`O971C+VUA +M:6PO:G5N:R<L(&!?05)'7R<I"F1E9FEN92A@7TI53DM?1$5&24Y%1%]214Q! +M62<L,2D**0I03U!$259%4E0*"F1I=F5R="@R*0I,3T-!3%]254Q%4T544PI3 +M:G5N:VAA8VLO=7-E7VYA;65S+FTT```````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````@("`V-#0@`"`@(#(S,"``("`Q-S4P(``@("`@("`@ +M,C(U,B`@-C(T-C`U,S0U-"`@(#<S,#<`(``````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````````````````9&EV97)T*"TQ*0HC"B,@0V]P>7)I9VAT +M("AC*2`Q.3DV($-L875S($%S<VUA;FX@/&-A0&EN9F]R;6%T:6LN=6YI+6MI +M96PN9&4^"B,*(R!);B!S:&]R=#H@>6]U(&-A;B!D;R!W:&%T979E<B!Y;W4@ +M=V%N="!W:71H('1H:7,L(&)U="!D;VXG="!B;&%M92!M92$*(PHC(%1(25,@ +M4T]&5%=!4D4@25,@4%)/5DE$140@0ED@5$A%($%55$A/4B!!3D0@0T].5%)) +M0E543U)3(&!@05,@25,G)R!!3D0*(R!!3ED@15A04D534R!/4B!)35!,245$ +M(%=!4E)!3E1)15,L($E.0TQ51$E.1RP@0E54($Y/5"!,24U)5$5$(%1/+"!4 +M2$4*(R!)35!,245$(%=!4E)!3E1)15,@3T8@34520TA!3E1!0DE,2519($%. +M1"!&251.15-3($9/4B!!(%!!4E1)0U5,05(@4%524$]310HC($%212!$25-# +M3$%)345$+B`@24X@3D\@159%3E0@4TA!3$P@5$A%($%55$A/4B!/4B!#3TY4 +M4DE"551/4E,@0D4@3$E!0DQ%"B,@1D]2($%.62!$25)%0U0L($E.1$E214-4 +M+"!)3D-)1$5.5$%,+"!34$5#24%,+"!%6$5-4$Q!4EDL($]2($-/3E-%455% +M3E1)04P*(R!$04U!1T53("A)3D-,541)3D<L($)55"!.3U0@3$E-251%1"!4 +M3RP@4%)/0U5214U%3E0@3T8@4U5"4U1)5%5412!'3T]$4PHC($]2(%-%4E9) +M0T53.R!,3U-3($]&(%5312P@1$%402P@3U(@4%)/1DE44SL@3U(@0E5324Y% +M4U,@24Y415)255!424].*0HC($A/5T5615(@0T%54T5$($%.1"!/3B!!3ED@ +M5$A%3U)9($]&($Q)04))3$E462P@5TA%5$A%4B!)3B!#3TY44D%#5"P@4U12 +M24-4"B,@3$E!0DE,2519+"!/4B!43U)4("A)3D-,541)3D<@3D5'3$E'14Y# +M12!/4B!/5$A%4E=)4T4I($%225-)3D<@24X@04Y9(%=!60HC($]55"!/1B!4 +M2$4@55-%($]&(%1(25,@4T]&5%=!4D4L($5614X@248@041625-%1"!/1B!4 +M2$4@4$]34TE"24Q)5%D@3T8*(R!354-(($1!34%'12X*(PID:79E<G0H,"D* +M5D524TE/3DE$*&!`*",I=7-E7VYA;65S+FTT"3$N,"`H0VQA=7,@07-S;6%N +M;BD@,3DY-BTQ,2TR,R<I"F1I=F5R="@M,2D*"F1E9FEN92A@7U5315].04U% +M4U\G+#$I"F1E9FEN92A@7U5315]20U!47R<L,2D*4%532$1)5D525"@V*0HC +M(&9I;&4@8V]N=&%I;FEN9R!N86UE<R!O9B!M86-H:6YE<R!W:&EC:"!C86X@ +M=7-E(&]U<B!R96QA>0I&>TQO8V%L3F%M97-](&EF96QS92A?05)'7RP@8"<L +M(&`O971C+VUA:6PO3&]C86Q.86UE<R<L(&!?05)'7R<I"E!/4$1)5D525`H* +M(%!23U9)1$5$($)9(%1(12!!551(3U(@04Y$($-/3E1224)55$]24R!@8$%3 +M($E3)R<@04Y$"B,@04Y9($584%)%4U,@3U(@24U03$E%1"!705)204Y42453 +M+"!)3D-,541)3D<L($)55"!.3U0@3$E-251%1"!43RP@5$A%"B,@24U03$E% +M1"!705)204Y42453($]&($U%4D-(04Y404))3$E462!!3D0@1DE43D534R!& +M3U(@02!005)424-53$%2(%!54E!/4T4*(R!!4D4@1$E30TQ!24U%1"X@($E. +M($Y/($5614Y4(%-(04Q,(%1(12!!551(3U(@3U(@0T].5%))0E543U)3($)% +M($Q)04),10HC($9/4B!!3ED@1$E214-4+"!)3D1)4D5#5"P@24Y#241%3E1! +M3"P@4U!%0TE!3"P@15A%35!,05)9+"!/4B!#:&%C:R]U<V5?<F5L87ET;RYM +M-``````````````````````````````````````````````````````````` +M`````````````````````````````````````````````````"`@(#8T-"`` +M("`@,C,P(``@(#$W-3`@`"`@("`@("`R,3<P("`V,C0U-C,S-S4T("`@-S8W +M,``@```````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M``````````````````````````````````````````````````````````!D +M:79E<G0H+3$I"B,*(R!#;W!Y<FEG:'0@*&,I(#$Y.38@0VQA=7,@07-S;6%N +M;B`\8V%`:6YF;W)M871I:RYU;FDM:VEE;"YD93X*(PHC($EN('-H;W)T.B!Y +M;W4@8V%N(&1O('=H871E=F5R('EO=2!W86YT('=I=&@@=&AI<RP@8G5T(&1O +M;B=T(&)L86UE(&UE(0HC"B,@5$A)4R!33T945T%212!)4R!04D]6241%1"!" +M62!42$4@05542$]2($%.1"!#3TY44DE"551/4E,@8&!!4R!)4R<G($%.1`HC +M($%.62!%6%!215-3($]2($E-4$Q)140@5T%24D%.5$E%4RP@24Y#3%5$24Y' +M+"!"550@3D]4($Q)34E4140@5$\L(%1(10HC($E-4$Q)140@5T%24D%.5$E% +M4R!/1B!-15)#2$%.5$%"24Q)5%D@04Y$($9)5$Y%4U,@1D]2($$@4$%25$E# +M54Q!4B!055)03U-%"B,@05)%($1)4T-,04E-140N("!)3B!.3R!%5D5.5"!3 +M2$%,3"!42$4@05542$]2($]2($-/3E1224)55$]24R!"12!,24%"3$4*(R!& +M3U(@04Y9($1)4D5#5"P@24Y$25)%0U0L($E.0TE$14Y404PL(%-014-)04PL +M($5814U03$%262P@3U(@0T].4T51545.5$E!3`HC($1!34%'15,@*$E.0TQ5 +M1$E.1RP@0E54($Y/5"!,24U)5$5$(%1/+"!04D]#55)%345.5"!/1B!354)3 +M5$E4551%($=/3T13"B,@3U(@4T525DE#15,[($Q/4U,@3T8@55-%+"!$051! +M+"!/4B!04D]&2513.R!/4B!"55-)3D534R!)3E1%4E)54%1)3TXI"B,@2$]7 +M159%4B!#0553140@04Y$($].($%.62!42$5/4ED@3T8@3$E!0DE,2519+"!7 +M2$542$52($E.($-/3E1204-4+"!35%))0U0*(R!,24%"24Q)5%DL($]2(%1/ +M4E0@*$E.0TQ51$E.1R!.14=,24=%3D-%($]2($]42$525TE312D@05))4TE. +M1R!)3B!!3ED@5T%9"B,@3U54($]&(%1(12!54T4@3T8@5$A)4R!33T945T%2 +M12P@159%3B!)1B!!1%9)4T5$($]&(%1(12!03U-324))3$E462!/1@HC(%-5 +M0T@@1$%-04=%+@HC"F1I=F5R="@P*0I615)324].240H8$`H(REU<V5?<F5L +M87ET;RYM-`DQ+C`@*$-L875S($%S<VUA;FXI(#$Y.38M,3$M,C,G*0ID:79E +M<G0H+3$I"@ID969I;F4H8%]54T5?4D5,05E43U\G+#$I"E!54TA$259%4E0H +M-BD*(R!F:6QE(&-O;G1A:6YI;F<@;F%M97,@=V4@<F5L87D@=&\*1GM296QA +M>51O?2!I9F5L<V4H7T%21U\L(&`G+"!@+V5T8R]M86EL+U)E;&%Y5&\G+"!@ +M7T%21U\G*0I03U!$259%4E0*+"!@+V5T8R]M86EL+TQO8V%L25`G+"!@7T%2 +M1U\G*0I03U!$259%4E0*"F-K7W)E;&%Y*3H*(R!J=6YK+F1O;6%I;B`@(D5R +M<F]R+4-O9&4@17)R;W(M5&5X="(*(R!O<B!)4"!A9&1R97-S97,@*&9O<B!C +M:&5C:U]R96QA>2DZ"B,@1"Y8+EDN6B`B17)R;W(M0V]D92!%<G)O<BU497AT +M(@HC($,N6"Y9(")%<G)O<BU#;V1E($5R<F]R+51E>'0B"B,@0BY8(")%<G)O +M<BU#;V1E($5R<F]R+51E>'0B"B,@02`B17)R;W(M0V]D92!%<G)O<BU497AT +M(@I+:G5N:R!I9F5L<V4H7T%21U\L(&`G+"!@9&)M("UA0$I53DL@+V5T8R]M +M86EL+VIU;FLG+"!@7T%21U\G*0ID969I;F4H8%]*54Y+7T1%1DE.141?4D5, +M05DG+#$I"BD*4$]01$E615)4"@ID:79E<G0H,BD*3$]#04Q?4E5,15-%5%,* +M4VIU;FL````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M```````````````````````````````````````````````````````````` +M````````````````````````````````````````````````````3TY315%5 +M14Y424%,"B,@1$%-04=%4R`H24Y#3%5$24Y'+"!"550@3D]4($Q)34E4140@ +M5$\L(%!23T-54D5-14Y4($]&(%-50E-425155$4@1T]/1%,*(R!/4B!315)6 +M24-%4SL@3$]34R!/1B!54T4L($1!5$$L($]2(%!23T9)5%,[($]2($)54TE. +M15-3($E.5$524E505$E/3BD*(R!(3U=%5D52($-!55-%1"!!3D0@3TX@04Y9 +M(%1(14]262!/1B!,24%"24Q)5%DL(%=(151(15(@24X@0T].5%)!0U0L(%-4 +M4DE#5`HC($Q)04))3$E462P@3U(@5$]25"`H24Y#3%5$24Y'($Y%1TQ)1T5. +M0T4@3U(@3U1(15)725-%*2!!4DE324Y'($E.($%.62!705D*(R!/550@3T8@ +M5$A%(%5312!/1B!42$E3(%-/1E1705)%+"!%5D5.($E&($%$5DE3140@3T8@ +M5$A%(%!/4U-)0DE,2519($]&"B,@4U5#2"!$04U!1T4N"B,*9&EV97)T*#`I +M"E9%4E-)3TY)1"A@0"@C*75S95]N86UE<RYM-`DQ+C`@*$-L875S($%S<VUA +M;FXI(#$Y.38M,3$M,C,G*0ID:79E<G0H+3$I"@ID969I;F4H8%]54T5?3D%- ++15-?)RPQ*0ID968` +` +end diff --git a/debian/conffiles b/debian/conffiles new file mode 100644 index 0000000..2108bcc --- /dev/null +++ b/debian/conffiles @@ -0,0 +1,3 @@ +/etc/aliases +/etc/nssnodns.conf +/etc/init.d/sendmail diff --git a/debian/control b/debian/control new file mode 100644 index 0000000..c964212 --- /dev/null +++ b/debian/control @@ -0,0 +1,20 @@ +Source: sendmail +Section: mail +Priority: extra +Maintainer: Richard Nelson <cowboy@debian.org> +Standards-Version: 2.4.0.0 + +Package: sendmail +Architecture: any +Depends: ${shlibs:Depends}, netbase (>= 1.26-1), m4, procmail | deliver +Recommends: mail-reader +Conflicts: mail-transport-agent, smail +Provides: mail-transport-agent +Description: A powerful mail transport agent. + Sendmail is an alternative mail transport agent (MTA) for + Debian. It is suitable for handling sophisticated mail + configurations, although this means that its configuration + can also be complex. + . + To deliver mail to local users, sendmail requires either the + `procmail' or `deliver' package to be installed. diff --git a/debian/copyright b/debian/copyright new file mode 100644 index 0000000..b34d8e5 --- /dev/null +++ b/debian/copyright @@ -0,0 +1,47 @@ +This is the Debian Linux prepackaged version of Sendmail, a powerful mail +transport agent. + +This package was put together by Robert Leslie <rob@mars.org> and is +now being maintained by Johnie Ingram <johnie@debian.org>. The +sources were obtained from: + + ftp://ftp.sendmail.org/pub/sendmail/ + +The following copyright applies to this software: + + + Copyright (c) 1983, 1995-1997 Eric P. Allman + Copyright (c) 1988 The Regents of the University of California. + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. All advertising materials mentioning features or use of this software + must display the following acknowledgement: + This product includes software developed by the University of + California, Berkeley and its contributors. + 4. Neither the name of the University nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + SUCH DAMAGE. + + +On Debian systems, further copyright information can be found in the +file /usr/doc/copyright/BSD. diff --git a/debian/debian.m4 b/debian/debian.m4 new file mode 100644 index 0000000..8c111e4 --- /dev/null +++ b/debian/debian.m4 @@ -0,0 +1,69 @@ +divert(-1) +# +# Copyright (c) 1983 Eric P. Allman +# Copyright (c) 1988, 1993 +# The Regents of the University of California. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# 3. All advertising materials mentioning features or use of this software +# must display the following acknowledgement: +# This product includes software developed by the University of +# California, Berkeley and its contributors. +# 4. Neither the name of the University nor the names of its contributors +# may be used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. +# +divert(0) +VERSIONID(`@(#)debian.m4 8.8 (Debian) 01/21/98') +define(`confCF_VERSION', `Debian/GNU')dnl +define(`LOCAL_MAILER_PATH', `/usr/sbin/sensible-mda')dnl +dnl define(`LOCAL_MAILER_FLAGS', `mnru9')dnl +define(`LOCAL_MAILER_FLAGS', `hnu90')dnl +define(`LOCAL_MAILER_ARGS', `sensible-mda $g $u ${client_addr}')dnl +define(`LOCAL_SHELL_FLAGS', `u90')dnl +define(`PROCMAIL_MAILER_PATH', `/usr/bin/procmail')dnl +define(`USENET_MAILER_PATH', `/usr/bin/inews')dnl +define(`confSAFE_QUEUE', `True')dnl +define(`confTEMP_FILE_MODE', `600')dnl +define(`STATUS_FILE', `/var/log/sendmail.st')dnl +define(`confCW_FILE', `-o /etc/mail/sendmail.cw')dnl +define(`confCT_FILE', `-o /etc/mail/sendmail.ct')dnl +define(`confCON_EXPENSIVE', `True')dnl +define(`confHOST_STATUS_DIRECTORY', `/var/state/sendmail')dnl +define(`confDIAL_DELAY', `45')dnl +define(`confTO_ICONNECT', `30s')dnl +define(`confQUEUE_SORT_ORDER', `Host')dnl +define(`confMAX_DAEMON_CHILDREN', `30s')dnl +define(`confDONT_INIT_GROUPS', `True')dnl + +# These undocumented features are available in Debian sendmail. + +# O PidFile=/var/run/sendmail.pid +# O WritableDirectoriesAreFatal=False +# O ChownIsAlwaysSafe=False +# O DontProbeInterfaces=False +# O MaxRecipientPerMessage= +# O DeadLetterDrop=False +# O RrtImpliesDSN=False +# O TCPWrappers=False + + diff --git a/debian/debproto.mc b/debian/debproto.mc new file mode 100644 index 0000000..6841807 --- /dev/null +++ b/debian/debproto.mc @@ -0,0 +1,42 @@ +divert(-1) +# +# Copyright (c) 1983 Eric P. Allman +# Copyright (c) 1988, 1993 +# The Regents of the University of California. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# 3. All advertising materials mentioning features or use of this software +# must display the following acknowledgement: +# This product includes software developed by the University of +# California, Berkeley and its contributors. +# 4. Neither the name of the University nor the names of its contributors +# may be used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. +# + +# +# This file is used to configure sendmail for use with Debian systems. +# + +divert(0) +VERSIONID(`@(#)sendmail.mc 8.7 (Linux) 3/5/96') +OSTYPE(debian)dnl diff --git a/debian/dirs b/debian/dirs new file mode 100644 index 0000000..23b4a3f --- /dev/null +++ b/debian/dirs @@ -0,0 +1,15 @@ +DEBIAN +etc/init.d +usr/bin +usr/sbin +usr/man/man1 +usr/man/man5 +usr/man/man8 +usr/doc/sendmail +usr/lib/sm.bin +usr/lib/sendmail.cf/hack +usr/lib/sendmail.cf/domain +usr/lib/sendmail.cf/ostype +usr/lib/sendmail.cf/cf +var/state/sendmail +var/log diff --git a/debian/el33t.h b/debian/el33t.h new file mode 100644 index 0000000..ce7bf94 --- /dev/null +++ b/debian/el33t.h @@ -0,0 +1,6 @@ +#define _FFR_DSN_RRT_OPTION 1 +#define _FFR_PIDFILE_OPTION 1 +#define _FFR_WRITABLE_DIRECTORIES_ARE_FATAL_OPTION 1 +#define _FFR_DONT_PROBE_INTERFACES_OPTION 1 +#define _FFR_MAXRCPT_OPTION 1 +#define _FFR_DEADLETTERDROP_OPTION 1 diff --git a/debian/init.d b/debian/init.d new file mode 100644 index 0000000..ff8422a --- /dev/null +++ b/debian/init.d @@ -0,0 +1,62 @@ +#!/bin/sh + +# Start or stop sendmail +# +# Robert Leslie <rob@mars.org> +# Johnie Ingram <johnie@netgod.net> +# David Rocher <rocher@mail.dotcom.fr> +# Richard Nelson <cowboy@debain.org> + +# How often to run the queue +Q="10m" + +PATH=/bin:/usr/bin:/sbin:/usr/sbin +DAEMON=/usr/sbin/sendmail +PIDFILE=/var/run/sendmail.pid +NAME=sendmail +FLAGS="defaults 50" + +test -x $DAEMON -a -f /etc/sendmail.cf || exit 0 + +case "$1" in + start) + ( cd /var/spool/mqueue && rm -f [lnx]f* ) + echo -n "Starting mail transport agent: sendmail" + start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON -- -bd -q"$Q" + echo "." + ;; + + stop) + echo -n "Stopping mail transport agent: sendmail" + start-stop-daemon --stop --quiet --pidfile $PIDFILE --exec $DAEMON + echo "." + ;; + + restart) + $0 stop + $0 start + ;; + + reload) + echo -n "Reloading sendmail configuration..." + start-stop-daemon --stop --signal 1 --quiet \ + --pidfile $PIDFILE --exec $DAEMON + echo "done." + ;; + + force-reload) + $0 reload + ;; + + debug) + start-stop-daemon --stop --signal 10 --verbose \ + --pidfile $PIDFILE --exec $DAEMON + ;; + + *) + echo "Usage: /etc/init.d/sendmail {start|stop|restart|reload|force-reload|debug}" + exit 1 + ;; +esac + +exit 0 diff --git a/debian/ip-down.d b/debian/ip-down.d new file mode 100644 index 0000000..0b3609e --- /dev/null +++ b/debian/ip-down.d @@ -0,0 +1,10 @@ +#!/bin/sh +# +# This script is called when ppp disconnects from the network. +# +# Here is where we'll stop sendmail if needed +# +# Written By Richard Nelson <cowboy@debian.org> + +# Stop/reload sendmail as needed + diff --git a/debian/ip-up.d b/debian/ip-up.d new file mode 100644 index 0000000..7bada47 --- /dev/null +++ b/debian/ip-up.d @@ -0,0 +1,14 @@ +#!/bin/sh +# +# This script is called when ppp connects to the network. +# +# Here is where we'll start sendmail if needed, and will +# run the queue in either case. +# +# Written By Richard Nelson <cowboy@debian.org> + +# Start/reload sendmail as needed +#/etc/init.d/sendmail reload + +# Process the sendmail queue +#runq diff --git a/debian/nodns.m4 b/debian/nodns.m4 new file mode 100644 index 0000000..c84d2c5 --- /dev/null +++ b/debian/nodns.m4 @@ -0,0 +1,44 @@ +divert(-1) +# +# Copyright (c) 1983 Eric P. Allman +# Copyright (c) 1988, 1993 +# The Regents of the University of California. All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# 1. Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# 2. Redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution. +# 3. All advertising materials mentioning features or use of this software +# must display the following acknowledgement: +# This product includes software developed by the University of +# California, Berkeley and its contributors. +# 4. Neither the name of the University nor the names of its contributors +# may be used to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +# ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +# SUCH DAMAGE. +# +divert(0) +VERSIONID(`@(#)nodns.m4 8.1 (Debian) 1/21/98') +divert(-1) +undefine(`confBIND_OPTS')dnl +define(`confSERVICE_SWITCH_FILE', `/etc/nssnodns.conf')dnl +FEATURE(nocanonify) +# HACK(nodns): What DNS? +O DontProbeInterfaces=True + + diff --git a/debian/nssnodns.conf b/debian/nssnodns.conf new file mode 100644 index 0000000..0344993 --- /dev/null +++ b/debian/nssnodns.conf @@ -0,0 +1,18 @@ +# /etc/nsswitch.conf +# +# Hax0rd configuration of GNU Name Service Switch functionality. +# + +passwd: db files +group: db files +shadow: db files + +hosts: files +networks: files + +protocols: db files +services: db files +ethers: db files +rpc: db files + +netgroup: db files diff --git a/debian/part1 b/debian/part1 new file mode 100644 index 0000000..f6f347a --- /dev/null +++ b/debian/part1 @@ -0,0 +1,1755 @@ +Path: senator-bedfellow.mit.edu!bloom-beacon.mit.edu!hookup!nic.ott.hookup.net!vertex.tor.hookup.net!nic.win.hookup.net!news-out.internetmci.com!newsfeed.internetmci.com!uwm.edu!math.ohio-state.edu!howland.erols.net!newsxfer3.itd.umich.edu!news.cic.net!not-for-mail +From: brad@etext.org +Newsgroups: comp.mail.sendmail,comp.mail.misc,comp.answers,news.answers +Subject: comp.mail.sendmail Frequently Asked Questions (Part 1 of 2) +Followup-To: comp.mail.sendmail +Date: 27 Mar 1997 06:01:28 GMT +Organization: The ETEXT Archives +Lines: 1734 +Approved: news-answers-request@MIT.Edu +Distribution: world +Expires: 05/01/97 02:00:01 +Message-ID: <5hd2fo$pou$1@news.cic.net> +Reply-To: sendmail-faq@etext.org (Sendmail FAQ Maintainers) +NNTP-Posting-Host: locust.cic.net +Summary: This posting contains a list of Frequently Asked Questions + (and their answers) about the program "sendmail", distributed with + many versions of Unix. It should be read by anyone who wishes to + post to the Usenet newsgroup comp.mail.sendmail. +Keywords: sendmail mail SMTP FAQ +X-Posting-Frequency: posted on the 27th of each month +Xref: senator-bedfellow.mit.edu comp.mail.sendmail:42630 comp.mail.misc:38790 comp.answers:25080 news.answers:98196 + +Posted-By: auto-faq 3.1.1.2 +Archive-name: mail/sendmail-faq/part1 + +URL: http://www.his.com/~brad/sendmail/index.html + + + comp.mail.sendmail + Frequently Asked Questions (FAQ) + Last updated March 24, 1997 + + Copyright 1996, by Brad Knowles, all rights reserved + + +This FAQ is edited and maintained by Brad Knowles <brad@etext.org>. +The official archive for all FAQs posted to <news:news.answers> +is <ftp://rtfm.mit.edu/pub/usenet/news.answers/>, with many known +mirrors. On this site, the latest version of this FAQ can be found +in <ftp://rtfm.mit.edu/pub/usenet/news.answers/mail/sendmail-faq/>. +Since this server tends to be extremely busy, as an alternative, +you might want to try using <http://www.imc.org/sendmail-faq-1> +and <http://www.imc.org/sendmail-faq-2> instead. + +If you don't have access to FTP or WWW, this FAQ can be retrieved by +sending Internet email to <mail-server@rtfm.mit.edu> with an empty +subject line (it gets ignored) and the command "send +usenet/news.answers/mail/sendmail-faq/part*" as the body of the +message (omitting the quotes, of course). + +As an alternative, you might want to try sending Internet email +to <info@imc.org> with an empty subject line (it gets ignored) +and "send sendmail-faq-*" as the body of the body of the message +(again, omitting the quotes). + +Additional alternative access methods are detailed within. + + +This FAQ is in RFC 1153 digest format. The "Date:" field of each +entry represents the date of the last update made to that entry. + + +This FAQ has now been split into two parts, to try and make it easier +to pass through older or less capable news or mail gateways. + + +The intent is to ultimately make this document more web-friendly (in +that all original work is done in SGML), and using the linuxdoc-sgml +tools, automatically generate both the HTML and ASCII text versions, +automatically posting the ASCII version to comp.mail.sendmail as +appropriate. + +In the meanwhile, all pseudo-HTMLized versions of this FAQ are +considered unsupported. We cannot be held responsible for what +someone else's program does to this document in an attempt to +make it more web-friendly. Nevertheless, the Landfield Hypertext +Usenet FAQ Archive seems to work well, and if you must access +the comp.mail.sendmail FAQ via the web, try slinging over to +<http://www.landfield.com/faqs/mail/sendmail-faq/>. + + +Comments/updates should be sent to <sendmail-faq@etext.org>. + +---------------------------------------------------------------------- + +Date: March 24, 1997 +Subject: Table of Contents + +Table of Contents +================= + + PART ONE + ======== + + 0. TO DO + + 1. COPYRIGHT NOTICE / REDISTRIBUTION REQUIREMENTS + + 2. INTRODUCTION / MISCELLANEOUS + 2.1 What is this newsgroup? + 2.2 What is the scope of this FAQ? + 2.3 Where can I find the latest version of this FAQ? + 2.4 How do I access comp.mail.sendmail by email? + 2.5 Where can I ask email-related DNS questions? + 2.6 How can I subscribe to these newsgroups? + 2.7 Which version of sendmail should I run? + 2.8 What is the latest release of sendmail? + 2.9 Where can I find it? + 2.10 What are the differences between Version 8 and other + versions? + 2.11 What's the best platform for running sendmail? + 2.12 What is BIND and where can I get the latest version? + 2.13 What is smrsh and where can I get it? + 2.14 What is smap and where can I get it? + 2.15 What is TCP-Wrappers and where can I get it? + 2.16 Why won't db 1.85 build for my SGI running Irix >= 5.2? + 2.17 What is makemap and where can I get it? + + 3. VERSION 8 SPECIFIC ISSUES + 3.1 How do I make all my addresses appear to be from a single + host? + 3.2 How do I rewrite my "From:" lines to read + ``First_Last@My.Domain''? + 3.3 So what was the user database feature intended for? + 3.4 Why are you so hostile to using full names for email + addresses? + 3.5 Where do I find this user database (UserDB) code? + 3.6 How do I get the user database to work with Pine or + with FEATURE(always_add_domain)? + 3.7 How do I manage several (virtual) domains? + 3.8 There are four UUCP mailers listed in the configuration + files. Which one should I use? + 3.9 How do I fix "undefined symbol inet_aton" and "undefined + symbol _strerror" messages? + 3.10 How do I solve "collect: I/O error on connection" errors? + 3.11 Why can't my users forward their mail to a program? + 3.12 Why do connections to the SMTP port take such a long time? + 3.13 Why do I get "unknown mailer error 5 -- mail: options + MUST PRECEDE recipients" errors? + 3.14 Why does version 8 sendmail panic my SunOS box? + 3.15 Why does the "From " header gets mysteriously munged + when I send to an alias? + 3.16 Why doesn't MASQUERADE_AS (or the user database) work + for envelope addresses as well as header addresses? + 3.17 How do I run version 8 sendmail and support the MAIL11V3 + protocol? + 3.18 Why do messages disappear from my queue unsent? + 3.19 When is sendmail going to support RFC 1522 MIME header + encoding? + 3.20 Why can't I get mail to some places, but instead + always get the error "reply: read error from + name.of.remote.host"? + 3.21 Why doesn't "FEATURE(xxx)" work? + 3.22 How do I configure sendmail to not use DNS? + 3.23 How do I get all my queued mail delivered to my Unix + box from my ISP? + + + PART TWO + ======== + + 4. GENERAL SENDMAIL ISSUES + 4.1 Should I use a wildcard MX for my domain? + 4.2 How can I set up an auto-responder? + 4.3 How can I get sendmail to deliver local mail to + $HOME/.mail instead of into /usr/spool/mail (or + /usr/mail)? + 4.4 Why does it deliver the mail interactively when I'm + trying to get it to go into queue only mode? + 4.5 How can I solve "config error: mail loops back to + myself" messages? + 4.6 Why does my sendmail process sometimes hang when + connecting over a SLIP/PPP link? + 4.7 How can I summarize the statistics generated by + sendmail in the syslog? + 4.8 How can I check my sendmail.cf to ensure that it's + re-writing addresses correctly? + 4.9 What is procmail, and where can I get it? + 4.10 How can I solve "cannot alias non-local names" errors? + + 5. VENDOR/OS SPECIFIC SENDMAIL ISSUES + 5.1 Sun Microsystems SunOS/Solaris 1.x/2.x + 5.1.1 How can I solve "line 273: replacement $3 out of + bounds" errors? + 5.1.2 How can I solve "line 445: bad ruleset 96 (50 max)" + errors? + 5.1.3 Why does version 8 sendmail (< 8.7.5) sometimes + hang under Solaris 2.5? + 5.1.4 Why can't I use SunOS/Solaris to get email to + certain large sites? + 5.2 IBM AIX + 5.2.1 The system resource controller always reports + sendmail as "inoperative". What's wrong? + 5.2.2 Why can't I use AIX to get email to some sites? + 5.2.3 Why can't I get sendmail 8.7.1 to use MX records + with AIX 3.2.5? + + 6. ADDITIONAL INFORMATION SOURCES (RFC 1807 bibliography format) + 6.1 Reference material devoted exlusively to sendmail + 6.2 Reference material with chapters or sections on sendmail + 6.3 Reference material on subjects related to sendmail + 6.4 World-wide web index pages on sendmail + 6.5 World-wide web index pages Internet email in general + 6.6 Online tutorials for sendmail + 6.7 Online archives of mailing lists and Usenet newsgroups, + relating to Internet email + + 7. THANKS! + +------------------------------ + +Date: January 17, 1997 +Subject: Q0 -- TO DO list + +* Make the FAQ more web-friendly by writing it in SGML and using + the linuxdoc-sgml tools to automate the generation of the HTML + and ASCII text versions. +* Index +* Additional net resources (web pages, anonymous ftp sites, etc...) +* Larger, more clearly written annotated bibliography (including RFCs + and comments/corrections for books specific to sendmail) +* Reorganize by platform/version of sendmail (All Sun questions in one + section, all AIX questions in another, etc...) + +------------------------------ + +Date: May 28, 1996 +Subject: Q1 -- COPYRIGHT NOTICE / REDISTRIBUTION REQUIREMENTS + + The entire contents of this document are copyright 1996 by Brad +Knowles, all rights reserved. + + This document may be freely distributed for non-profit purposes +(including, but not limited to: posting to mailing lists, Usenet +newsgroups, and world-wide-web pages; inclusion on CD-ROM or other +distribution media; and insertion into text retrieval systems), so +long as it is the latest version available at the time, all parts are +distributed together, and it is kept completely intact without +editing, changes, deletions, or additions. Non-profit redistribution +in accordance with these guidelines does not require contact with or +approval from the copyright holder. + + Redistribution of this document for profit without express prior +permission is not allowed. At the very least, expect to provide the +copyright holder a free copy of the product (exactly as it would be +sold to customers, all distribution media intact), or a percentage of +the gross revenue from said product and sufficient proof that the +integrity and completeness requirements set for non-profit +distribution will be met. + + + In the event that the copyright holder discovers a redistributed +version that is not in compliance with the above requirements, he will +make a good-faith effort to get it corrected or removed, and failing +that, at least note its deprecated status in a new version. Legal +action will likely be taken against redistribution for profit that +is not in compliance with the above requirements. + +------------------------------ + +Date: May 28, 1996 +Subject: Q2.1 -- What is this newsgroup? + + The Usenet newsgroup <news:comp.mail.sendmail> is dedicated to the +discussion of the program named "sendmail" in all its various forms. +It is most commonly found on computers running a flavor of the +Operating System known as Unix, or derived from Unix. + + This program has been ported to other OSes, but those versions +have typically been ported by a particular vendor and are considered +proprietary. There are many versions of sendmail, but the original +author (Eric Allman) is continuing development on a particular version +typically referred to as "Version Eight" or sometimes just "V8". This +is considered by many to be the One True Version. This is also the +version that this FAQ is centered around. + + + If you have a question that amounts to "How do I send mail to my +friend?", then you're in the wrong newsgroup. You should first check +with your System or E-Mail Administrator(s), BBS SysOp(s), etc... +before you post your question publicly, since the answer will likely +be very highly dependant on what software and hardware you have. You +also don't want to embarass yourself publicly, nor do you want to +annoy the kinds of people who are likely to be the counterparts of +your System or E-Mail Administrator(s), BBS SysOp(s), etc.... If +asking them doesn't do you any good, make sure you read this FAQ and +the other mail-related FAQs at the archive sites listed below. + + If you have a question about another program similar to sendmail +(technically referred to as an "SMTP MTA"), an SMTP Gateway package, +or a LAN email package, then you should see if there is another group +in the <news:comp.mail> hierarchy that more closely matches the +particular program you want to ask a question about. For example, the +SMTP MTA known as Smail has <news:comp.mail.smail> dedicated to it. +The Mail User Agent (MUA) Eudora has two newsgroups dedicated to it +(<news:comp.mail.eudora.mac> and <news:comp.mail.eudora.ms-windows>), +depending on which hardware platform you use. If there isn't a more +appropriate newsgroup, try <news:comp.mail.misc>. Again, make sure +your question isn't already addressed in one of the mail-related +FAQs or other available documentation. See the IMC website (more +info below) for a good list of mail-related FAQs. + + + If you have a question about an older or vendor-proprietary +version of sendmail, be prepared for a lot of answers that amount to +"Get V8". Version 8 isn't a panacea, but it does solve many problems +known to plague previous versions, as well as having many new features +that make it much easier to administer large or complex sites. In +many cases, it makes at least possible what was previously virtually +impossible, and relatively easy the previously difficult. + + + There are, of course, many alternative programs that have sprung +up in an attempt to answer one or another weakness or perceived fault +of sendmail, but so far, none of them have had the kind of success it +would require to unseat it as the de facto standard program for +sending Internet mail. Obviously, this forum should not be used to +discuss the merits of any of the alternative programs versus sendmail. +These kinds of discussions should be taken to <news:comp.mail.misc>, +or you should agitate to get a new newsgroup or newsgroup hierarchy +created where that sort of thing is acceptable (or even the norm, such +as a <news:comp.mail.advocacy> or <news:comp.mail.mta.advocacy> +newsgroup). + +------------------------------ + +Date: July 9, 1996 +Subject: Q2.2 -- What is the scope of this FAQ? + + This FAQ is strongly centered around version 8 sendmail, for many +reasons. First and foremost, this is the area of most interest on the +part of the maintainer of this FAQ. Secondly, version 8 is where most +of the additional development is being concentrated. Version 8 +sendmail is also the best documented of all SMTP MTAs, by virtue of +the book by Bryan Costales (see entry +sendmail-faq//book/ISBN/1-56592-056-2 in Q6.1). + + Other versions of sendmail get mentioned in passing, and some +interesting interactions between version 8 and various OSes is also +covered. + + This FAQ is aimed primarily at the experienced Unix System +Administrator/Postmaster/DNS Domain Administrator. If you're looking +for introductory texts, see the references in Q6.1. + + + Where I've provided URLs, I've generally tried to keep them +exactly as they should be entered, without line breaks or anything +else. This may make them or the surrounding text ugly, but hopefully +they'll be easier to cut-and-paste, or just click on once I've got an +HTMLized version. However, this has not been possible in the +bibliography section, since I'm trying to adhere to RFC 1807 +guidelines, and they explicitly require lines to be no longer than 79 +characters. In those cases, I've tried to break the lines at +relatively obvious and innocuous places. + +------------------------------ + +Date: January 21, 1997 +Subject: Q2.3 -- Where can I find the latest version of this FAQ? + + I post changes as they occur to my sendmail FAQ support page +at <http://www.his.com/pub/brad/sendmail/>. + + The ASCII text of my private version can be found at +<ftp://ftp.his.com/pub/brad/sendmail/sendmail-faq/part*>, while +the latest "single part" version before the split can be found at +<ftp://ftp.his.com/pub/brad/sendmail/sendmail-faq/old>. I don't +have an HTMLized version yet, but when I do, I will put in a link +to it from my support page as well as updating this document. + + + The official version (as posted to <news:news.answers>) is in +<ftp://rtfm.mit.edu/pub/usenet/news.answers/mail/sendmail-faq/>. + + The Internet Mail Consortium <http://www.imc.org> +maintains an archive of email related FAQs and many other +documents. On their site, the latest version of this FAQ +can be found in <http://www.imc.org/sendmail-faq-1> and +<http://www.imc.org/sendmail-faq-2>. + + + Unfortunately, the parser for the Ohio State semi-official +pseudo-HTMLized version tends to misinterpret the way I provide +URLs, so I no longer support it or provide the URL for this FAQ at +that site. However, Kent Landfield has put together an alternative +web archive of Usenet FAQs, and it appears to parse things in a +more sensible manner. + + The root of the Landfield FAQ archive is at +<http://www.landfield.com/faqs/>, and the comp.mail.sendmail FAQ +can be found at <http://www.landfield.com/faqs/mail/sendmail-faq/>. + + The Landfield Usenet Hypertext FAQ Archive supports full text +searching with multiple ways to access Usenet's Frequently Asked +Question postings. Hyperlinks are enabled where ever possible to +make references easy to follow. A full set of FAQ statistics is +also available. + + + If you don't have access to FTP or WWW, this FAQ can be +retrieved by sending Internet email to <mail-server@rtfm.mit.edu> +with an empty subject line (it gets ignored) and the command "send +usenet/news.answers/mail/sendmail-faq/part*" as the body of the +message (omitting the quotes, of course). + + Since this server tends to be extremely busy, as an alternative, +you might want to try sending Internet email to <info@imc.org> with +an empty subject line (it gets ignored) and "send sendmail-faq-*" +as the body of the body of the message (again, omitting the quotes). + + + Well known mirrors for the FAQs archived at rtfm.mit.edu can be +found at: + + Continent URL + --------- ------------------------------------------- + North <ftp://mirrors.aol.com/pub/rtfm/usenet/> + America <ftp://ftp.uu.net/usenet/news.answers/> + <ftp://ftp.seas.gwu.edu/pub/rtfm/> + <http://www.landfield.com/faqs/> + Europe <ftp://ftp.uni-paderborn.de/pub/FAQ/> + <ftp://ftp.Germany.EU.net/pub/newsarchive/news.answers/> + <ftp://ftp.sunet.se/pub/usenet/> + <http://www.cs.ruu.nl/cgi-bin/faqwais/> + <http://www.lib.ox.ac.uk/internet/news/faq/by_group.index.html> + Asia <ftp://nctuccca.edu.tw/USENET/FAQ/> + <ftp://hwarang.postech.ac.kr/pub/usenet/news.answers/> + <ftp://ftp.hk.super.net/mirror/faqs/> + Australia <ftp://ftp.info.au/usenet/FAQs/> + + + + Additional information on how to get access +to various Internet resources by email can be +found in Bob Rankin's Internet-by-Email FAQ, +<ftp://rtfm.mit.edu/pub/usenet/news.answers/internet-services/access-via-email>. + + To get the latest edition of this document sent to you by return +email, send a message to one of these addresses: + + To: mail-server@rtfm.mit.edu (for US, Canada & South America) + Enter only this line in the BODY of the note: + send usenet/news.answers/internet-services/access-via-email + + To: mailbase@mailbase.ac.uk (for Europe, Asia, etc.) + Enter only this line in the BODY of the note: + send lis-iis e-access-inet.txt + +------------------------------ + +Date: November 24, 1996 +Subject: Q2.4 -- How do I access comp.mail.sendmail by email? + + Send email to <mxt@dl.ac.uk> with the command "sub +comp-news.comp.mail.sendmail full-US-ordered-email-address" as +the body of the message (with your correct address in place of the +"full-US-ordered-email-address", and omitting the double quotes in +all cases of this example). + + E-mail you want posted on comp.mail.sendmail should be sent to +<comp-mail-sendmail@dl.ac.uk> + +------------------------------ + +Date: March 23, 1996 +Subject: Q2.5 -- Where can I ask email-related DNS questions? + + Depending on how deeply they get into the DNS, they can be asked +here. However, you'll probably be told that you should send them to +the Usenet newsgroup <news:comp.protocols.tcp-ip.domains> (DNS in +general) or to the Info-BIND mailing list (if the question is specific +to that program). + +------------------------------ + +Date: May 23, 1996 +Subject: Q2.6 -- How can I subscribe to these? + + For <news:comp.protocols.tcp-ip.domains>, you have to be on +Usenet. They don't have a news-to-mail gateway yet (I'm working on +this), but they do have a FAQ, and it can be found at +<ftp://ftp.njit.edu/pub/dns/Comp.protocols.tcp-ip.domains.FAQ>. + + Questions from all levels of experience can be found on this +newsgroup (as well as people to answer them), so don't be shy about +asking a question you think may be too simple. + + + For the Info-BIND mailing list, send email to +<bind-request@vix.com> with and empty subject (it gets ignored) and +the command "subscribe" as the body of the message. Submissions +should be sent to <bind@vix.com>. + + Note that this list is now moderated, and anything you post to it +may get material added, deleted, or changed by the moderator. He +reserves the right to reject any postings (and possibly unsubscribe +the poster), if he deems them inappropriate. + +------------------------------ + +Date: May 23, 1996 +Subject: Q2.7 -- Which version of sendmail should I run? + + If you're concerned at all about the security of your machines, +you should make sure you're at least running a recent release of +version 8 sendmail (either from your vendor or the public version +detailed in 1.8). + + Check the CERT Alerts and Summaries (details in 1.13) to make sure +that you're running a version that is free of known security holes. +Just because the sendmail program provided by your vendor isn't list +doesn't mean that you're not vulnerable, however. If your particular +vendor or version isn't listed, check with your vendor and on the +appropriate Internet mailing lists and Usenet newsgroups to verify. + + If nothing else, the most recent public version is usually a +pretty good bet, although you should check <news:comp.mail.sendmail> +to see if anyone has posted recent comments that haven't yet been +folded into a new release. + + + That said, you need to look at what the primary function is for +the machine. If its primary function is to run some CAD/CAM package +on the desk of an Engineer, then there's probably not much sense in +replacing the vendor-supplied version of sendmail (assuming it's +secure, according to the CERT Alerts and Summaries). Just set the +machine up to forward all outbound mail to a central mail relay, and +then worry about making that central mail relay the best it can be. +Also arrange to have all their inbound mail pass through a central +Mail eXchanger (probably the same machine as the central Mail Relay), +for the same reasons. + + + If the primary function for a machine is to act as that central +Mail Relay/Mail eXchanger, then I *strongly* recommend the best +version of sendmail you can get, and in my opinion that is the latest +release of version 8. IDA sendmail is also pretty good, but virtually +everything it does, version 8 does better, and version 8 has the +additional advantage of having continued development as well. On a +central mailhub, recent versions of IDA sendmail are the oldest +sendmail that I'd even consider leaving in place instead of replacing +with version 8. + + However, keep in mind that version 8 still hasn't been ported (so +far as we know) to some of the older (and perhaps more esoteric) +platforms, and if you're stuck using one of them, you may not have +much choice. + + + Recently, some vendors have started shipping (or announced that +they will soon ship) version 8 sendmail pre-configured for their +machines. Unfortunately, in most cases this means you get a +pre-compiled binary and a sendmail.cf file (that may need a bit of +tweaking), but not much else of the "standard" version 8 sendmail +installation kit. Silicon Graphics (SGI) is known to already be +shipping version 8 sendmail in this fashion, and both Hewlett-Packard +and Sun Microsystems have announced that they soon will be (Sun has a +patch today that can be applied to upgrade many machines to an older +release of version 8 sendmail). + + This may be suitable for desktop machines forwarding all their +mail to a central Mail Relay and receiving all their mail from a +central Mail eXchanger, but I personally believe that this is not +likely to be suitable for the central Mail Relay/Mail eXchanger +itself. In that case, I recommend you get and install the latest +version and get the m4 macros, the on-line documentation, the source +code, etc.... + +------------------------------ + +Date: January 21, 1997 +Subject: Q2.8 -- What is the latest release of sendmail? + + For version 8 sendmail, there are three release trees. + + For those people who, for whatever reason, are unable or +unwilling to upgrade to version 8.8.z, releases of version 8.6 and +8.7 sendmail are still available. As of this writing, the most +recent release of version 8.6 sendmail is 8.6.13, and the most +recent release of version 8.7 sendmail is 8.7.6. + + For the most recent releases of 8.6 and 8.7 sendmail, there is a +version number difference between the sendmail program itself and the +associated configuration files. This is okay. The security-related +bug fixes that were made only required changes to the sendmail +program itself and not the configuration files, so only the version +number of the sendmail program itself was incremented. + + + The most recent release of version 8.8 sendmail is 8.8.5. + + On machines exposed directly to the Internet, you should either +already be running 8.8.5 sendmail or plan on upgrading to it in the +immediate future. This release is considered "mature", has security +fixes included that will not be found in any previous release, and +therefore supercedes all previous releases. + + There is no further support for previous releases of sendmail. + +------------------------------ + +Date: January 21, 1997 +Subject: Q2.9 -- Where can I find it? + + By anonymous FTP from ftp.sendmail.org in /pub/sendmail, or (in +URL form) via <ftp://ftp.sendmail.org/pub/sendmail/>. If you care, +there should be files in this directory that end with the extension +".sig" which you can check with PGP to make sure that corresponding +archives haven't been modified. You'll need to have the PGP key +of Eric Allman on your public keyring to be able to verify these +archives with their associated .sig files. + + Current releases of sendmail can also be found at +<ftp://ftp.cs.berkeley.edu/ucb/src/sendmail/>. + + There are no other known official version 8 sendmail mirrors. + + + Check the sendmail home page at <http://www.sendmail.org/> for +late-breaking updates and other useful information. + + If you want to be notified regarding future updates to sendmail +and other items of potential interest, you may want to subscribe +to the sendmail-announce mailing list. Address your subscription +requests to "majordomo@lists.sendmail.org" with "subscribe +sendmail-announce" as the body of the message. + +------------------------------ + +Date: March 23, 1996 +Subject: Q2.10 -- What are the differences between Version 8 and + other versions? + + See doc/changes/changes.{me,ps} in the distribution. See also +RELEASE_NOTES at the top level. + +------------------------------ + +Date: March 24, 1997 +Subject: Q2.11 -- What is BIND and where can I get the latest version? + + BIND stands for "Berkeley Internet Name Daemon", and is the +Internet de-facto standard program for turning host names into IP +addresses. + + The BIND Home Page is at <http://www.isc.org/bind.html>, which +provides pointers to the most recent release of BIND. Note that +BIND 4.9.5-P1 is the most recent "production version", and BIND +8.1 (the next major release; skipping 5.x-7.x) is a "release +candidate" as of version 8.1T3B. See the BIND 8.1T3B announcement +at <ftp://ftp.isc.org/isc/bind/src/testing/t3b-ann.asc> for more +information. + + + Note that there are bugs in older resolver libraries, which can +cause problems getting to large sites (that list more than five IP +addresses for a particular name), or represent a huge security hole +as they do not check the returned data to see if it will fit in the +amount of space pre-allocated for it. + + If at all possible, you should get the most recent "release" +version of BIND and make a serious attempt to integrate it into +your configuration, since virtually all vendor-provided resolver +libaries are woefully out of date. + +------------------------------ + +Date: March 24, 1997 +Subject: Q2.12 -- What's the best platform for running sendmail? + + Generally speaking, I adhere to the old axiom that you should +choose what software you want to run first, then choose the platform +(hardware and OS) that best runs this software. By this token, if +sendmail is the software, then a recent version of BSD Unix would +probably be best, since sendmail was developed at UC Berkeley on +BSD Unix. FreeBSD and BSD/OS are two known implementations of +BSD Unix for Intel-based PC's (among other hardware platforms), +and this would make them the most "native" OSes for sendmail. +FreeBSD is freely available by anonymous ftp or on CD-ROM, and +BSD/OS is a commercial product. + + However, not everyone has this kind of "luxury". If you're on a +homogenous network (i.e., completely composed of only one type of +hardware and OS), then you should probably be running the same OS as +the rest of the machines on the network, regardless of the axiom +stated above. You may have other problems, but you should at least be +able to get some local support on the OS for your machine. + + + Either way, if the primary function of the machine is to handle +"large" quantities of mail (for whatever value you define "large" +to be), I strongly recommend getting the latest stable release of +version 8 sendmail. + + On the other hand, if the primary function of the machine is +to sit on some Engineer's desk and do CAD, then it may be easier +for you to leave the vendor-supplied version of sendmail on that +machine (after suitable configuration), and instead concentrate +your efforts on making the central mail handling machine(s) as +robust and capable as they can be. + + However, you may be surprised to find that it is easier +for you to support only one version of sendmail across all the +various platforms than it is to try and support multiple versions of +sendmail, each unique for their particular platform. In that case, +the easy solution is to put version 8 sendmail everywhere, and not +have to worry about vendor-specific problems with older versions. + + + For more information on BSD Unix in general, see the Usenet +newsgroups under <news:comp.unix.bsd>, <news:comp.bugs.4bsd>, +<news:comp.os.386bsd>. For more information on BSD/OS, see the BSD +newsgroups mentioned above, or the BSD/OS Home Page at +<http://www.bsdi.com/>. For more information on FreeBSD, see the +Usenet newsgroups under <news:comp.unix.bsd.freebsd>, or the FreeBSD +Home Page at <http://www.freebsd.org/>. + +------------------------------ + +Date: July 9, 1996 +Subject: Q2.13 -- What is smrsh and where can I get it? + + From <ftp://info.cert.org/pub/tools/smrsh/README>: + + smrsh is a restricted shell utility that provides the ability + to specify, through a configuration, an explicit list of + executable programs. When used in conjunction with sendmail, + smrsh effectively limits sendmail's scope of program execution + to only those programs specified in smrsh's configuration. + + smrsh has been written with portability in mind, and uses + traditional Unix library utilities. As such, smrsh should + compile on most Unix C compilers. + +The purpose for restricting the list of programs that can be executed +in this manner is to keep mail messages (either through an alias or +the .forward file in a user's home directory) from being sent to +arbitrary programs which are not necessarily known to be sufficiently +paranoid in checking their input, and can therefore be easily +subverted (this is related to, but different from, the /etc/shells +feature discussed in Q3.11). + + More information regarding the CERT-CC can be found at their web +site, <http://www.cert.org>. For more information on CERT Alerts and +CERT Summaries, see <ftp://info.cert.org/pub/cert_advisories/> and +<ftp://info.cert.org/pub/cert_summaries/>, respectively. + + + You can find smrsh in the most recent sendmail source archive, as +well as <ftp://info.cert.org/pub/tools/smrsh/>. Other very useful +programs can be found in <ftp://info.cert.org/pub/tools/>. + +------------------------------ + +Date: July 5, 1996 +Subject: Q2.14 -- What is smap and where can I get it? + + Smap (and smapd) are tools out of the Trusted Information Systems +(TIS) Firewall Toolkit (fwtk). They were originally written by +firewall expert Marcus Ranum under contract to TIS, and TIS is +continuing what maintenance there is. The toolkit may be found at +<ftp://ftp.tis.com/pub/firewalls/toolkit/>. Support questions +regarding the toolkit may be sent to <mailto:fwall-support@tis.com>, +while you may join their mailing list <mailto:fwall-users@tis.com> by +sending electronic mail to <mailto:fwall-users-request@tis.com>. + + + The concept of smap and smapd is that sendmail is a huge, +monolithic setuid root program that is virtually impossible to verify +as being "correct" and free from bugs (historically, sendmail has been +rather buggy and an easy mark for system crackers to exploit, although +with the advent of version 8 sendmail, this becomes much more +difficult). In contrast, smap and smapd are very small (only a few +hundred lines long), and relatively easy to verify as being correct +and functioning as designed (however, as you will see later, we can +question their design). According to the theory, it is therefore +safer and "better" to run smap and smapd as "wrappers" around +sendmail, which would no longer need to be run setuid root. + + Unfortunately, smap and smapd have a few problems of their +own, and don't appear to have been updated since late March 1996. +There have been conflicting reports of incompatibilities between +smapd and sendmail 8.7.y (both cannot be run on the same machine, +although if you're running sendmail 8.6.x and smap/smapd on the +local machine, people on the outside can still use sendmail 8.7.y +to talk to you). + + For further information on smap and smapd, see the documentation +that comes with the TIS Firewall Toolkit. + + + For more information on firewalls, see the Firewalls FAQ at +<http://www.v-one.com/newpages/faq.htm>. + +------------------------------ + +Date: January 21, 1996 +Subject: Q2.15 -- What is TCP-Wrappers and where can I get it? + + TCP-Wrappers is another security enhancement package. The theory +is that you take programs being run under inetd (see /etc/inetd.conf) +and before you run the program to do the real work (ftpd, telnetd, +etc...), you first run the connection attempt through a package that +checks to see if the IP address of the source packet is coming from a +host known to be either good or bad (you may filter connection +attempts by source host name, domain name, raw IP address, port they +are attempting to connect to; and either allow known good connections +through thus refusing unknown connections, or accept all connections +except those known to be bad). + + The practice of TCP-Wrappers actually follows the theory +quite well. It is a very useful and important tool in the System +Administrator's Bag of Things To Help You Secure Your Machine +>From Crackers, Spammers, Junkmailers, and Other Undesirables. +However, it only works for programs that communicate via TCP packets +(not UDP, such as NFS) started up out of inetd. It does not work +for RPC-based services, and programs that start up a daemon outside +of inetd and just leave it running obviously don't benefit beyond +the initial connection that gets the daemon started (however, see +the FTP URL below for other packages that can help secure RPC and +portmapper-based services). + + However, most sendmail installations tend to start up a daemon and +leave it running at all times. If you did run sendmail out of inetd, +you'd lose the benefit of the load average checking code that is +executed only in daemon mode, and for systems that handle a lot of +mail, this is vitally important. + + You can get TCP-Wrappers from +<ftp://ftp.win.tue.nl/pub/security/>, a site that has +a whole host of other useful security tools, such as +securelib, portmap, satan, cops, crack, etc... You can +also find pointers to many other useful security tools at +<http://ciac.llnl.gov/ciac/SecurityTools.html>, and the COAST Archive +at <http://www.cs.purdue.edu/homes/spaf/hotlists/csec.html> is a +veritable cornucopia of all things security related. The SANS 1996 +Network Security Roadmap at <http://www.sans.org/roadmap.html> has +much useful information and pointers to many other useful resources. + + + For the adventurous, you can get a source patch for version +8 sendmail (created for 8.7.6, but with work, applicable to older +releases) that will take the core TCP-Wrappers code and integrate +it into the daemon, so that you get the best of both worlds. +However, this isn't as smoothly integrated as it should be, is not +for the faint-of-heart, and is certainly not officially supported +by the orginal author of sendmail (Eric Allman). This functionality +is integrated in a different fashion into version 8.8.5 sendmail. + + You should be able to find the unsupported patch at +<ftp://ftp.win.tue.nl/pub/security/sendmail-tcpd.patch>. + +------------------------------ + +Date: November 24, 1996 + +Subject: Q2.16 -- Why won't db 1.85 build for my SGI running Irix + >= 5.2? + + The db 1.85 package as available from ftp.cs.berkeley.edu +provides Irix support up to Irix 4.05F, but 5.{2,3} need a slightly +patched version. Some vendors also provide db standard with their OS +(DEC Unix 4.0, for example). + + A tarball incorporating these changes is available at +<ftp://ftp.his.com/pub/brad/sendmail/irix5.tar.gz>. This will +extract into ./db.1.85/PORT/irix.5.2, with a symbolic link +created from ./db.1.85/PORT/irix.5.3 to this same directory. +Make sure you extract this archive into the same directory +where you extracted the db 1.85 archive as available from +ftp.cs.berkeley.edu. (see Q3.5 for more information on getting +the db 1.85 package). An ASCII context diff of this same patch is +at <ftp://ftp.his.com/pub/brad/sendmail/irix4-5.diff>. + + A version of db 1.85 that has been supposedly patched +to compile under Irix 6.2 has been made available at +<http://reality.sgi.com/ariel/db-1.85-irix.tar.Z>, but I haven't +had a chance to download and check it out yet. + +------------------------------ + +Date: August 30, 1996 + +Subject: Q2.17 -- What is makemap and where can I get it? + + The program "makemap" is used to build the databases used by +version 8 sendmail, for things like the UserDB, mailertables, +etc.... + + It is distributed as part of the basic Operating System from +some vendors, but source code for it is also included at the root +level of the sendmail archive (at least, it is for sendmail 8.6.12 +and 8.7.5, and presumably will continue to be as newer releases come +out). However, it is not considered a "supported" part of version +8 sendmail. Just like the other source provided in the archive, +the Makefile will likely need some tweaking for your specific site. + + It turns out that Irix 5.3 doesn't appear to have the dbm or +ndbm libraries, but to compile makemap.c, you need to have -DNDBM +on the "DBMDEF=" line (some necessary things are defined only +in /usr/include/ndbm.h). Try just leaving off "-lndbm" from the +"LIBS=" line in the Makefile for makemap. + + If you plan on using makemap with db 1.85 on an SGI machine +running a version of Irix later than 4.x, see Q2.16 for some +additional steps to get db 1.85 compiled on your machine. + +------------------------------ + +Date: May 28, 1996 +Subject: Q3.1 -- How do I make all my addresses appear to be from a + single host? + + Using the m4 macros, use: + + MASQUERADE_AS(my.dom.ain) + + This will cause all addresses to be sent out as being from the +indicated domain. + + On your mailhub/mailhost/Domain Mail eXchanger, you may need to +add "my.dom.ain" to the sendmail.cw file or the "Cwhost.my.dom.ain" +line in the sendmail.cf file. + + If you're using version 8.7 sendmail, and you want to hide this +information in the envelope as well as the headers, use: + + FEATURE(masquerade_envelope) + +------------------------------ + +Date: January 24, 1996 +Subject: Q3.2 -- How do I rewrite my From: lines to read + ``First_Last@My.Domain''? + + There are a couple of ways of doing this. This describes using +the "user database" code. This is still experimental, and was +intended for a different purpose -- however, it does work with a bit +of care. It does require that you have the Berkeley "db" package +installed (it won't work with DBM). + + First, create your input file. This should have lines like: + + loginname:mailname First_Last + First_Last:maildrop loginname + + If your login name is "john" and your full name is "John Q. +Public", then this would be: + + john:mailname John_Q_Public@your.domain.goes.here + John_Q_Public:maildrop john + + The words "mailname" and "maildrop" must be typed in literally, +just as they appear. + + + Install this file in (say) /etc/userdb. Create the database: + + makemap -d btree /etc/userdb.db < /etc/userdb + + You can then create a config file that uses this. You will have +to include the following in your .mc file: + + define(confUSERDB_SPEC, /etc/userdb.db) + FEATURE(notsticky) + + Version 8.7 sendmail changes the semantics of this feature such +that notsticky is turned on by default, and if you want the old (8.6) +behaviour, you instead define: + + FEATURE(stickyhost) + + + You also need to make sure that you have the "ik" flags specified +on the affected mailer definition. + + + Note: The program "makemap" is discussed in further detail +in Q2.17. The UserDB feature is discussed further on pp. 643-645 +of _sendmail, 2nd Ed._ by Costales. + +------------------------------ + +Date: March 23, 1996 +Subject: Q3.3 -- So what was the user database feature intended for? + + The intent was to have all information for a given user (where the +user is the unique login name, not an inherently non-unique full name) +in one place. This would include phone numbers, addresses, and so +forth. The "maildrop" feature is because Berkeley does not use a +centralized mail server (there are a number of reasons for this that +are mostly historic), and so we need to know where each user gets his +or her mail delivered -- i.e., the mail drop. + + UC Berkeley is (was) in the process of setting up their +environment so that mail sent to an unqualified "name" goes to that +person's preferred maildrop; mail sent to "name@host" goes to that +host. The purpose of "FEATURE(notsticky)" is to cause "name@host" to +be looked up in the user database for delivery to the maildrop. + +------------------------------ + +Date: March 23, 1996 +Subject: Q3.4 -- Why are you so hostile to using full names for email + addresses? + + Because full names are not unique. For example, the computer +community has two Andy Tannenbaums and two Peter Deutsches. At one +time, Bell Labs had two Stephen R. Bournes with offices a few doors +apart. You can create alternative addresses (e.g., +Stephen_R_Bourne_2), but that's even worse -- which one of them has to +have their name desecrated in this way? And you can bet that one of +them will get most of the other person's email. + + So called "full names" are just an attempt to create longer +versions of unique names. Rather that lulling people into a sense of +security, I'd rather that it be clear that these handles are +arbitrary. People should use good user agents that have alias +mappings so that they can attach arbitrary names for their personal +use to those with whom they correspond (such as the MH alias file). + + Even worse is fuzzy matching in email -- this can make good +addresses turn bad. For example, Eric Allman is currently (to the +best of our knowledge) the only ``Allman'' at Berkeley, so mail sent +to <Allman@Berkeley.EDU> should get to him. But if another Allman +ever appears, this address could suddenly become ambiguous. He's been +the only Allman at Berkeley for over fifteen years -- to suddenly have +this "good address" bounce mail because it is ambiguous would be a +heinous wrong. + + Directory services should be as fuzzy as possible (within reason, +of course). Mail services should be unique. + +------------------------------ + +Date: November 24, 1996 +Subject: Q3.5 -- Where do I find this user database (UserDB) code? + + The user database code is part of the Sendmail V8 distribution. +However, it depends on your installing the db library from the +package at <ftp://ftp.cs.berkeley.edu/pub/4bsd/db.1.85.tar.gz>. +If you install this library, edit the Makefile to include the +right option (-DNEWDB), and then make sendmail again, you get a +binary which has the database features described in the book and +the documentation provided in the sendmail source archive. + + If you're using SGI Irix above 4.x, see Q2.16 for the patches +you will need to get db 1.85 working on your machine. + +------------------------------ + +Date: July 19, 1996 +Subject: Q3.6 -- How do I get the user database to work with Pine or + with FEATURE(always_add_domain)? + + The basic incompatibility with Pine and the user database option +is in how Pine writes From addresses in the header. Most MUAs write +the From address as "From: user", while Pine, for reasons given in +its documentation, write the From address as "From: user@FQDN" +(FQDN=fully qualified domain name). Using the m4 feature macro +"always_add_domain" has the same effect. Because of this difference, +the user database does not rewrite these headers. + + One solution to this problem is to make the following change in +the sendmail.mc file compiled by m4 into your /etc/sendmail.cf (or +wherever your sendmail.cf file is located) after you have the user +database option installed and working with other MUAs: + + Early in the section(s) where you are setting configuration +variables, add the following: + + # Define our userdb file for FQDN rewrites + Kuserdb btree -o /etc/userdb.db + + And a bit later, before the "MAILER()" entries, but after other +configuration options have been set: + + LOCAL_RULE_1 + ######################################################## + ### Local Ruleset 1, rewrite sender header & envelope ## + ######################################################## + #Thanks to Bjart Kvarme <bjart.kvarme@usit.uio.no> + S1 + R$- $1 < @ $j . > user => user@localhost + R$- < @ $=w . > $* $: $1 < @ $2 . > $3 ?? $1 user@localhost ? + R$+ ?? $+ $: $1 ?? $(userdb $2 : mailname $: @ $) + R$+ ?? @ $@ $1 Not found + R$+ ?? $+ $>3 $2 Found, rewrite + + #NOTE ^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^ + # Use Tab Characters Use Tab Characters in these regions + # to make three columns (the line with "mailname" only has 2 columns). + + Now the user database should re-write messages sent with Pine or +anything else that causes local users to have their address be fully +qualified (both header and envelope sender will be properly +re-written). If this still does not work for you, try adding the +following to either the system-wide pine.conf, pine.conf.fixed, or +your personal .pinerc: + + user-domain=localhost + + This has been known to help solve the problem for some people. + + However, a more elegant (read: m4-based) solution for version 8 +sendmail users has yet to be created. + +------------------------------ + +Date: March 24, 1997 +Subject: Q3.7 -- How do I manage several (virtual) domains? + + If you want to provide mailservice to several domains and be able +to add identical names across different domains, as in this example: + + user@a.dom.ain mb1@dom.ain + user@b.dom.ain mb2@dom.ain + user@c.dom.ain mb@outer.space + + you may accomplish this by using an external database in +conjunction with minor Ruleset rewriting in sendmail.cf. Many ISPs +(Internet Service Providers) have asked me and here's a general +solution (you may combine it with userdb's if you need to): + + 1. Make a textfile (I usually make one for each domain and + concatenate them before database-compilation) with the + following structure: + + user@a.dom.ain mb1@dom.ain + user@b.dom.ain mb2@dom.ain + user@c.dom.ain mb@outer.space + + The LHS (Left Hand Side) is the mail-adress of a particular + user and the RHS is the corresponding mailbox. An example + that might apply to the real world: + + webmaster@josnet.se wm.list@eowyn.josnet.se + webmaster@client1.se joe@client1.se + webmaster@client2.se anne@another.provider.se + webmaster@client3.se joe@client3.se + joe@client1.se c1_joe@mail.josnet.se + joe@client3.se joeuser + + Note that you have to spell out the complete email-address in + the LHS entry. The RHS entry may be either a local address + (for example 'johan' if that account exists) or a complete + email-adress on another system (or a domain that the server + recognizes as local for that matter). + + 2. Compile the textfile into a database: + + makemap hash mbt.db <mbt + + You may you use other lookup-methods than hash (btree for + example). The resulting database is mbt.db in this example + and the input is the textfile mbt. + + 3. Add a few lines in sendmail.cf: + + A. In the beginning (typically in the "local info" section or + together with the user database option in the "options" + section): + + # Declare mbt as a hash-lookup database: + Kmbt hash /etc/mail/mbt.db + + B. In the Ruleset 98 (local part of ruleset 0) section, add: + + # Use mailboxtable-database: + R$+ < @ $+ . > $: $1 < @ $2 > . + R$+ < @ $+ > $* $: $(mbt $1@$2 $: $1 < @ $2 > $3 $) + R$+ < @ $+ > $* $: $(mbt $2 $: $1 < @ $2 > $3 $) + RERROR $* $#error $: $1 + R$+ < @ $+ > . $: $1 < @ $2 . > + + If you have any other rewrite rules in ruleset 98, these + should be able to either go after or before the existing + rules, but you may have to do some experimenting to + find out which placement works best. + + 4. The next-to-last line of these rules let you have an alias + file like: + + joe@somedom.com joe + jim@somedom.com jim@othersite + somedom.com ERROR "No such user" + + And still have mail addressed to unknown users at that domain + bounce properly. You can also do a form of redirects, such + as: + + fred@somedom.com ERROR "This user has moved to fred@otherdom.com" + + 5. Test with sendmail -bv and/or sendmail -bt + + 6. Restart sendmail. You must do this in order to have the + daemon reread the sendmail.cf. + + + Note: Alternate sets of instructions and/or kits +can be found at <http://www.westnet.com/providers>, +<http://hub.org/softdocs/Sendmail-VD>, +<ftp://samson.oslo.uninett.no/pub/unix/sendmail/>, and +<http://jos.net/projects/mbt/>. None of these have been tested +by the maintainer of this FAQ, but are believed to work correctly. +Which you use is a matter of your personal aesthetics. + + + If you're using version 8.8 sendmail, you can make use of the +new "virtual user table" feature (for one thing, it won't require +that you add new rewrite rules to your sendmail configuration, as +the previous example does). + + 1. Put "FEATURE(virtusertable)" in your sendmail.mc + file. + + 2. By default, sendmail will build tables out of + /etc/virtusertable. If you want to change this, put + something like: + + define(`VIRTUSER_TABLE', `-o hash /usr/local/lib/virtusertable')dnl + + in your sendmail.mc file. + + 3. Construct the virtusertable file like so: + + info@foo.com foo-info + info@bar.com bar-info + @baz.org jane@elsewhere.net + @somedom.com error : 5.5.0 User unknown + + (Contrast with steps 1 and 4 in the previous example + using regular mailertables). + + 4. Compile the textfile into a database: + + makemap hash /etc/virtusertable.db </etc/virtusertable + + You may you use other lookup-methods than hash (btree + for example). Make sure that this database type matches + what is defined for the table in step 2. + + 5. Put all the domains listed on the LHS of these aliases + in your sendmail.cw file, or on the Cw line in your + sendmail.cf. + + 6. Recompile your sendmail.cf from your sendmail.mc and + test it. + + 7. Once you are satisfied, move it into place and restart + sendmail. + + + Note that the virtusertable is only referenced for inbound +mail (more accurately, only for controlling delivery). If you +want to rewrite mail addresses from your virtual domain users as +they pass through your system, you'll also need to make comparable +modifications to the genericstable (used for rewriting). + +------------------------------ + +Date: July 9, 1996 +Subject: Q3.8 -- There are four UUCP mailers listed in the + configuration files. Which one should I use? + + The choice is partly a matter of local preferences and what is +running at the other end of your UUCP connection. Unlike good +protocols that define what will go over the wire, UUCP uses the policy +that you should do what is right for the other end; if they change, +you have to change. This makes it hard to do the right thing, and +discourages people from updating their software. In general, if you +can avoid UUCP, please do. + + If you can't avoid it, you'll have to find the version that is +closest to what the other end accepts. Following is a summary of the +UUCP mailers available. + + uucp-old (obsolete name: "uucp") + This is the oldest, the worst (but the closest to UUCP) way of + sending messages across UUCP connections. It does bangify + everything and prepends $U (your UUCP name) to the sender's + address (which can already be a bang path itself). It can only + send to one address at a time, so it spends a lot of time + copying duplicates of messages. Avoid this if at all possible. + + uucp-new (obsolete name: "suucp") + The same as above, except that it assumes that in one rmail + command you can specify several recipients. It still has a lot + of other problems. + + uucp-dom + This UUCP mailer keeps everything as domain addresses. + Basically, it uses the SMTP mailer rewriting rules. + + Unfortunately, a lot of UUCP mailer transport agents require + bangified addresses in the envelope, although you can use + domain-based addresses in the message header. (The envelope + shows up as the From_ line on UNIX mail.) So.... + + uucp-uudom + This is a cross between uucp-new (for the envelope addresses) + and uucp-dom (for the header addresses). It bangifies the + envelope sender (From_ line in messages) without adding the + local hostname, unless there is no host name on the address at + all (e.g., "wolf") or the host component is a UUCP host name + instead of a domain name ("somehost!wolf" instead of + "some.dom.ain!wolf"). + + Examples: + + We are on host grasp.insa-lyon.fr (UUCP host name "grasp"). The + following summarizes the sender rewriting for various mailers: + + Mailer sender rewriting in the envelope + ------ ------ ------------------------- + uucp-{old,new} wolf grasp!wolf + uucp-dom wolf wolf@grasp.insa-lyon.fr + uucp-uudom wolf grasp.insa-lyon.fr!wolf + + uucp-{old,new} wolf@fr.net grasp!fr.net!wolf + uucp-dom wolf@fr.net wolf@fr.net + uucp-uudom wolf@fr.net fr.net!wolf + + uucp-{old,new} somehost!wolf grasp!somehost!wolf + uucp-dom somehost!wolf somehost!wolf@grasp.insa-lyon.fr + uucp-uudom somehost!wolf grasp.insa-lyon.fr!somehost!wolf + + + If your only contact with the external world is through UUCP, +you'll probably want to recompile sendmail with support for DNS turned +off (if your host architecture supports a service switch file that +sendmail understands, it will use the service switch however you've +got it configured, even if you've compiled sendmail with DNS support +turned off, so make sure the service switch file is also properly +configured). + + Using "FEATURE(nodns)" probably won't completely satisfy you, as +more recent releases of version 8 sendmail really, REALLY, want to +know what their canonical hostname is, and will go to great lengths to +figure this out from the DNS. But if you don't have any nameservers, +this can obviously add significant amounts of time to process startup +as sendmail repeatedly tries (and fails) to find this information. It +then becomes doubly important to have the proper Fully Qualified +Domain Name (FQDN) listed first in your /etc/hosts file or in the file +used to build your NIS/NIS+ table (or whatever you use). + + For more information on "FEATURE(nodns)", see the RELEASE_NOTES +file for sendmail versions 8.7.1 and later (search for "FQDN"), as +well as _sendmail_, page 741 (page reference correct as of first +edition, first printing). + +------------------------------ + +Date: March 23, 1996 +Subject: Q3.9 -- How do I fix "undefined symbol inet_aton" and + "undefined symbol _strerror" messages? + + You've probably replaced your resolver with the version from BIND +4.9.3. You need to compile with -l44bsd in order to get the +additional routines. + +------------------------------ + +Date: March 24, 1997 +Subject: Q3.10 -- How do I solve "collect: I/O error on connection" + errors? + + There is nothing wrong. This is just a diagnosis of a condition +that had not been diagnosed before. If you are getting a lot of these +from a single host, there is probably some incompatibility between 8.x +and that host. If you get a lot of them in general, you may have +network problems that are causing connections to get reset. + + Note that if you are using PPP and the MTU on your end does +not match what your service provider has configured, you may see +these problems. Discuss with your service provider what the MTU +should be set to, and correct if there is a mismatch. + +------------------------------ + +Date: July 9, 1996 +Subject: Q3.11 -- Why can't my users forward their mail to a program? + + I just upgraded to version 8 sendmail and now when my users try to +forward their mail to a program they get an "illegal shell" or "cannot +mail to programs" message and their mail is not delivered. What's +wrong? + + In order for people to be able to run a program from their +.forward file, version 8 sendmail insists that their shell (that is, +the shell listed for that user in the passwd entry) be a "valid" +shell, meaning a shell listed in /etc/shells. If /etc/shells does not +exist, a default list is used, typically consisting of /bin/sh and +/bin/csh. + + This is to support environments that may have NFS-shared +directories mounted on machines on which users do not have login +permission. For example, many people make their file server +inaccessible for performance or security reasons; although users have +directories, their shell on the server is /usr/local/etc/nologin or +some such. If you allowed them to run programs anyway you might as +well let them log in. + + If you are willing to let users run programs from their .forward +file even though they cannot telnet or rsh in (as might be reasonable +if you run smrsh to control the list of programs they can run) then +add the line: + + /SENDMAIL/ANY/SHELL/ + +to /etc/shells. This must be typed exactly as indicated, in caps, +with the trailing slash. + +NOTA BENE: DO NOT list /usr/local/etc/nologin in /etc/shells -- this +will open up other security problems. + + + IBM AIX does not use /etc/shells -- a list of allowable login +shells is contained, along with many other login parameters, in +/etc/security/login.cfg. You can copy the information in the +"shells=" stanza into a /etc/shells on your system so sendmail will +have something to use. Do NOT add "/usr/lib/uucp/uucico" or any other +non-login shell into /etc/shells. + + Also note that there are some weird things that AFS throws into +the mix, and these can keep a program from running or running +correctly out of .forward files or the system-wide aliases. + + + See also "smrsh" in Q2.13. + +------------------------------ + +Date: November 24, 1996 +Subject: Q3.12 -- Why do connections to the SMTP port take such a + long time? + + I just upgraded to version 8 sendmail and suddenly connections to +the SMTP port take a long time. What is going wrong? + + It's probably something weird in your TCP implementation that +makes the IDENT code act oddly. On most systems version 8 sendmail +tries to do a ``callback'' to the connecting host to get a validated +user name (see RFC 1413 for detail). If the connecting host does not +support such a service it will normally fail quickly with "Connection +refused", but certain kinds of packet filters and certain TCP +implementations just time out. + + To test this (pre-8.7.y sendmail), set the IDENT timeout to zero +using: + + define(`confREAD_TIMEOUT',`Ident=0')dnl + +in the .mc file used by m4 to generate your sendmail.cf file. +Alternatively, if you don't use m4, you can put ``OrIdent=0'' in the +configuration file (we recommend the m4 solution, since that makes +maintenance much easier for people who don't understand sendmail +re-write rules, or after you've been away from it for a while). +Either way, this will completely disable all use of the IDENT +protocol. + + For version 8.7.y sendmail (and above), you should instead use: + + define(`confTO_IDENT',`0s')dnl + + + Another possible problem is that you have your name server and/or +resolver configured improperly. Make sure that all "nameserver" +entries in /etc/resolv.conf point to functional servers. If you are +running your own server, make certain that all the servers listed in +your root cache are up to date (this file is usually called something +like "/var/namedb/root.cache"; see your /etc/named.boot file to get +your value). Either of these can cause long delays. + +------------------------------ + +Date: March 23, 1996 +Subject: Q3.13 -- Why do I get "unknown mailer error 5 -- mail: + options MUST PRECEDE recipients" errors? + + I just upgraded to version 8 sendmail and suddenly I get errors +such as ``unknown mailer error 5 -- mail: options MUST PRECEDE +recipients.'' What is going wrong? + + You need OSTYPE(systype) in your .mc file, where "systype" is set +correctly for your hardware & OS combination -- otherwise the +configurations use a default that probably disagrees with your local +mail system. See cf/README for details. + + If this is on a Sun workstation, you might also want to take a +look at the local mailer flags in the Sun-supplied sendmail.cf and +compare them to the local mailer flags generated for your version 8 +sendmail.cf. If they differ, you might try changing the V8 flags to +match the Sun flags. + +------------------------------ + +Date: March 24, 1996 +Subject: Q3.14 -- Why does version 8 sendmail panic my SunOS box? + + Sendmail 8.7.y panics SunOS 4.1.3_U1 (at least for 1<=y<=3) +and SunOS 4.1.3, and sendmail 8.6.x seems fine on both machines (at +least for 9<=x<=12). + + The problem is that a kernel patch is missing, specifically +100584-08 (4.1.3), 102010-03 (4.1.3_U1), or 102517 (4.1.4). +This should be available from your hardware vendor through your +support contract or their online support facilities (including +being available on the SunSolve CD). + +------------------------------ + +Date: March 23, 1996 +Subject: Q3.15 -- Why does the "From " header gets mysteriously + munged when I send to an alias? + + ``It's not a bug, it's a feature.'' This happens when you have a +"owner-list" alias and you send to "list". V8 propagates the owner +information into the envelope sender field (which appears as the "From +" header on UNIX mail or as the Return-Path: header) so that +downstream errors are properly returned to the mailing list owner +instead of to the sender. In order to make this appear as sensible as +possible to end users, I recommend making the owner point to a +"request" address -- for example: + + list: :include:/path/name/list.list + owner-list: list-request + list-request: eric + + This will make message sent to "list" come out as being "From +list-request" instead of "From eric". + +------------------------------ + +Date: November 24, 1996 +Subject: Q3.16 -- Why doesn't MASQUERADE_AS (or the user database) + work for envelope addresses as well as header addresses? + + Believe it or not, this is intentional. The interpretation of the +standards by the version 8 sendmail development group was that this +was an inappropriate rewriting, and that if the rewriting were +incorrect at least the envelope would contain a valid return address. + + + If you're using version 8.7.y sendmail (or later), you can use + + FEATURE(masquerade_envelope) + + in your sendmail.mc file to change this behaviour. + +------------------------------ + +Date: March 23, 1996 +Subject: Q3.17 -- How do I run version 8 sendmail and support the + MAIL11V3 protocol? + + Get the reimplementation of the mail11 protocol by Keith Moore +from <ftp://gatekeeper.dec.com/pub/DEC/gwtools/> (with contributions +from Paul Vixie). + +------------------------------ + +Date: March 23, 1996 +Subject: Q3.18 -- Why do messages disappear from my queue unsent? + + When I look in the queue directory I see that qf* files have been +renamed to Qf*, and sendmail doesn't see these. What's wrong? + + If you look closely you should find that the Qf files are owned by +users other than root. Since sendmail runs as root it refuses to +believe information in non-root-owned qf files, and it renames them to +Qf to get them out of the way and make it easy for you to find. The +usual cause of this is twofold: first, you have the queue directory +world writable (which is probably a mistake -- this opens up other +security problems) and someone is calling sendmail with an "unsafe" +flag, usually a -o flag that sets an option that could compromise +security. When sendmail sees this it gives up setuid root +permissions. + + The usual solution is to not use the problematic flags. If you +must use them, you have to write a special queue directory and have +them processed by the same uid that submitted the job in the first +place. + +------------------------------ + +Date: March 23, 1996 +Subject: Q3.19 -- When is sendmail going to support RFC 1522 MIME + header encoding? + + This is considered to be a MUA issue rather than an MTA issue. + +Quoth Eric Allman: + + The primary reason is that the information necessary to + do the encoding (that is, 8->7 bit) is unknown to the MTA. + In specific, the character set used to encode names in headers + is _NOT_ necessarily the same as used to encode the body + (which is already encoded in MIME in the charset parameter + of the Content-Type: header). Furthermore, it is perfectly + reasonable for, say, a Swede to be living and working in Korea, + or a Russian living and working in Germany, and want their + name to be encoded in their native character set; it could + even be that the sender was Japanese, the recipient Russian, + and the body encoded in ISO 8859-1. If all I have are 8-bit + characters, I can't choose the charset properly. + + Similarly, when doing 7->8 bit conversions, I don't want + to throw away this information, as it is necessary for proper + presentation to the end user. + +------------------------------ + +Date: January 17, 1997 +Subject: Q3.20 -- Why can't I get mail to some places, but + instead always get the error "reply: read error from + name.of.remote.host"? + + This is usually caused by a bug in the remote host's mail server, +or Mail Transport Agent (MTA). The "EHLO" command of ESMTP causes +the remote server to drop the SMTP connection. There are several +MTAs that have this problem, but one of the most common server +implementations can be identified by the "220 All set, fire away" +greeting it gives when you telnet to its SMTP port. + + To work around this problem, you can configure sendmail to use +a mailertable with an entry telling sendmail to use plain SMTP when +talking to that host: + + name.of.remote.host smtp:name.of.remote.host + + + Sites which must run a host with this broken SMTP implemetation +should do so by having a site running sendmail or some other +reliable (and reasonably modern) SMTP MTA act as an MX server for +the problem host. + + + There is also a problem wherein some TCP/IP implementations +are broken, and if any connection attempt to a remote end gets a +"connection refused", then *all* connections to that site will +get closed. Of course, if you try to use the IDENT protocol across +a firewall (at either end), this is highly likely to result in the +same apparent kind of "read error". + + The fix is simple -- on those machines with broken TCP/IP +implementations, do not attempt to use IDENT. When compiling newer +releases of version 8 sendmail, the compiler should automatically +detect whether you're on a machine that is known to have this kind +of TCP/IP networking problem, and make sure that sendmail does +not attempt to use IDENT. If you've since patched your machine so +that it no longer has this problem, you'll need to go back in and +explicitly configure sendmail for support of IDENT, if you want +that feature. + +------------------------------ + +Date: January 17, 1996 +Subject: Q3.21 -- Why doesn't "FEATURE(xxx)" work? + + When creating m4 Master Config (".mc") files for version 8 +sendmail, many "FEATURE()" macros simply change the definition of +internal variables that are referenced in the "MAILER()" definitions. + + To make sure that everything works as desired, you need to +make sure that "OSTYPE()" macros are put at the very beginning +of the file, followed by "FEATURE()" and "HACK()" macros, local +definitions, and at the very bottom, the "MAILER()" definitions. + +------------------------------ + +Date: March 24, 1997 +Subject: Q3.22 -- How do I configure sendmail to not use DNS? + + In situations where you're behind a firewall, or across a +dial-up line, there are times when you need to make sure that +programs (such as sendmail) do not use the DNS at all. + + + With version 8.8, you change the service switch file to omit +"DNS" and use only NIS, files, and other map types as appropriate. + + With previous releases of version 8 sendmail, you need to +recompile the binary and make sure that "NAMED_BIND" is turned off +in src/conf.h. + + + Note that you'll need to forward all your outbound mail to +another machine as a "relay" (one that does use DNS, and understands +how to properly use MX records, etc...), otherwise you won't be able +to get mail to any site(s) other than the one(s) you configure in +your /etc/hosts file (or whatever). + +------------------------------ + +Date: March 24, 1997 +Subject: Q3.23 -- How do I get all my queued mail delivered to my + Unix box from my ISP? + + Assuming you're running sendmail or some other SMTP MTA on +some sort of a Unix host, and your ISP uses version 8.8 sendmail +and they queue all mail for your domain (as opposed to stuffing it +all in one file that you need to download via POP3 or somesuch), +something like the following script should do the trick: + + #!/bin/sh + telnet mail.myisp.com. 25 < __EOF__ + EHLO me.mydomain.com + ETRN mydomain.com + QUIT + __EOF__ + + + Note that this is indented for readability, and the real script +would have column position #1 of the file be the first printable +character in each line. + + Of course, you'll have to fill in the appropriate details for +"mail.myisp.com", "mydomain.com", etc.... + + + If this script doesn't work, you may have problems with "here" +documents being fed as standard input to commands (like telnet). In +that case, you'll need to build a similar script using "expect". For +more information on expect, see <http://expect.nist.gov> and the book +"Exploring Expect: A Tcl-Based Toolkit for Automating Interactive +Applications" (<http://www.ora.com/catalog/expect/noframes.html>). + + + If your ISP doesn't use version 8.8 sendmail, you may have to +cobble together alternative solutions. They may have a "ppplogin" +script that is executed every time your machines dials them up, and +if so, you may be able to have them modified this script so as to +put a "sendmail -qRmydomain.com" in it (which is effectively what +the "ETRN" command does, but in a safer fashion). + + Alternatively, they may have a hacked finger daemon, so +that you'd put "finger mydomain.com@theirhost.theirdomain.com" +in your script. Or, they may have some other solution for you. +However, only they would be able to answer what solutions they have +available to them. + + Obviously, the easiest and most "standard" solution is to have +them upgrade their system to the most recent stable release of +version 8.8 sendmail. + +------------------------------ + +Comments/updates should be sent to <sendmail-faq@etext.org>. + +Copyright 1996, by Brad Knowles, all rights reserved + +End of comp.mail.sendmail Frequently Asked Questions (FAQ), part 1 of 2 +*********************************************************************** diff --git a/debian/part2 b/debian/part2 new file mode 100644 index 0000000..d91ab4d --- /dev/null +++ b/debian/part2 @@ -0,0 +1,1467 @@ +Path: senator-bedfellow.mit.edu!bloom-beacon.mit.edu!thetimes.pixel.kodak.com!news.kodak.com!news.sprintlink.net!news-pen-16.sprintlink.net!news.etcfiber.net!pjm-gate.pjm.com!dsinc!netnews.upenn.edu!news-xfer.netaxs.com!tezcat!cam-news-hub1.bbnplanet.com!cpk-news-hub1.bbnplanet.com!news.bbnplanet.com!newsxfer3.itd.umich.edu!newsxfer.itd.umich.edu!aanews.merit.net!branch.com!news.bizserve.com!news +From: brad@etext.org +Newsgroups: comp.mail.sendmail,comp.mail.misc,comp.answers,news.answers +Subject: comp.mail.sendmail Frequently Asked Questions (Part 2 of 2) +Followup-To: comp.mail.sendmail +Date: 27 Apr 1997 04:57:53 GMT +Organization: The ETEXT Archives +Lines: 1446 +Approved: news-answers-request@MIT.Edu +Distribution: world +Expires: 06/01/97 01:00:01 +Message-ID: <5jumch$i1l@kahuna.bizserve.com> +Reply-To: sendmail-faq@etext.org (Sendmail FAQ Maintainers) +NNTP-Posting-Host: locust.etext.org +Summary: This posting contains a list of Frequently Asked Questions + (and their answers) about the program "sendmail", distributed with + many versions of Unix. It should be read by anyone who wishes to + post to the Usenet newsgroup comp.mail.sendmail. +Keywords: sendmail mail SMTP FAQ +X-Posting-Frequency: posted on the 27th of each month +Xref: senator-bedfellow.mit.edu comp.mail.sendmail:43555 comp.mail.misc:39333 comp.answers:25606 news.answers:100741 + +Posted-By: auto-faq 3.1.1.2 +Archive-name: mail/sendmail-faq/part2 + +URL: http://www.his.com/~brad/sendmail/index.html + + + comp.mail.sendmail + Frequently Asked Questions (FAQ) + Last updated March 24, 1997 + + Copyright 1996, by Brad Knowles, all rights reserved + + +This FAQ is edited and maintained by Brad Knowles <brad@etext.org>. +The official archive for all FAQs posted to <news:news.answers> +is <ftp://rtfm.mit.edu/pub/usenet/news.answers/>, with many known +mirrors. On this site, the latest version of this FAQ can be found +in <ftp://rtfm.mit.edu/pub/usenet/news.answers/mail/sendmail-faq/>. +Since this server tends to be extremely busy, as an alternative, +you might want to try using <http://www.imc.org/sendmail-faq-1> +and <http://www.imc.org/sendmail-faq-2> instead. + +If you don't have access to FTP or WWW, this FAQ can be retrieved by +sending Internet email to <mail-server@rtfm.mit.edu> with an empty +subject line (it gets ignored) and the command "send +usenet/news.answers/mail/sendmail-faq/part*" as the body of the +message (omitting the quotes, of course). + +As an alternative, you might want to try sending Internet email +to <info@imc.org> with an empty subject line (it gets ignored) +and "send sendmail-faq-*" as the body of the body of the message +(again, omitting the quotes). + +Additional alternative access methods are detailed within. + + +This FAQ is in RFC 1153 digest format. The "Date:" field of each +entry represents the date of the last update made to that entry. + + +This FAQ has now been split into two parts, to try and make it easier +to pass through older or less capable news or mail gateways. + + +The intent is to ultimately make this document more web-friendly (in +that all original work is done in SGML), and using the linuxdoc-sgml +tools, automatically generate both the HTML and ASCII text versions, +automatically posting the ASCII version to comp.mail.sendmail as +appropriate. + +In the meanwhile, all pseudo-HTMLized versions of this FAQ are +considered unsupported. We cannot be held responsible for what +someone else's program does to this document in an attempt to +make it more web-friendly. Nevertheless, the Landfield Hypertext +Usenet FAQ Archive seems to work well, and if you must access +the comp.mail.sendmail FAQ via the web, try slinging over to +<http://www.landfield.com/faqs/mail/sendmail-faq/>. + + +Comments/updates should be sent to <sendmail-faq@etext.org>. + +---------------------------------------------------------------------- + +Date: March 24, 1997 +Subject: Table of Contents + +Table of Contents +================= + + PART ONE + ======== + + 0. TO DO + + 1. COPYRIGHT NOTICE / REDISTRIBUTION REQUIREMENTS + + 2. INTRODUCTION / MISCELLANEOUS + 2.1 What is this newsgroup? + 2.2 What is the scope of this FAQ? + 2.3 Where can I find the latest version of this FAQ? + 2.4 How do I access comp.mail.sendmail by email? + 2.5 Where can I ask email-related DNS questions? + 2.6 How can I subscribe to these newsgroups? + 2.7 Which version of sendmail should I run? + 2.8 What is the latest release of sendmail? + 2.9 Where can I find it? + 2.10 What are the differences between Version 8 and other + versions? + 2.11 What's the best platform for running sendmail? + 2.12 What is BIND and where can I get the latest version? + 2.13 What is smrsh and where can I get it? + 2.14 What is smap and where can I get it? + 2.15 What is TCP-Wrappers and where can I get it? + 2.16 Why won't db 1.85 build for my SGI running Irix >= 5.2? + 2.17 What is makemap and where can I get it? + + 3. VERSION 8 SPECIFIC ISSUES + 3.1 How do I make all my addresses appear to be from a single + host? + 3.2 How do I rewrite my "From:" lines to read + ``First_Last@My.Domain''? + 3.3 So what was the user database feature intended for? + 3.4 Why are you so hostile to using full names for email + addresses? + 3.5 Where do I find this user database (UserDB) code? + 3.6 How do I get the user database to work with Pine or + with FEATURE(always_add_domain)? + 3.7 How do I manage several (virtual) domains? + 3.8 There are four UUCP mailers listed in the configuration + files. Which one should I use? + 3.9 How do I fix "undefined symbol inet_aton" and "undefined + symbol _strerror" messages? + 3.10 How do I solve "collect: I/O error on connection" errors? + 3.11 Why can't my users forward their mail to a program? + 3.12 Why do connections to the SMTP port take such a long time? + 3.13 Why do I get "unknown mailer error 5 -- mail: options + MUST PRECEDE recipients" errors? + 3.14 Why does version 8 sendmail panic my SunOS box? + 3.15 Why does the "From " header gets mysteriously munged + when I send to an alias? + 3.16 Why doesn't MASQUERADE_AS (or the user database) work + for envelope addresses as well as header addresses? + 3.17 How do I run version 8 sendmail and support the MAIL11V3 + protocol? + 3.18 Why do messages disappear from my queue unsent? + 3.19 When is sendmail going to support RFC 1522 MIME header + encoding? + 3.20 Why can't I get mail to some places, but instead + always get the error "reply: read error from + name.of.remote.host"? + 3.21 Why doesn't "FEATURE(xxx)" work? + 3.22 How do I configure sendmail to not use DNS? + 3.23 How do I get all my queued mail delivered to my Unix + box from my ISP? + + + PART TWO + ======== + + 4. GENERAL SENDMAIL ISSUES + 4.1 Should I use a wildcard MX for my domain? + 4.2 How can I set up an auto-responder? + 4.3 How can I get sendmail to deliver local mail to + $HOME/.mail instead of into /usr/spool/mail (or + /usr/mail)? + 4.4 Why does it deliver the mail interactively when I'm + trying to get it to go into queue only mode? + 4.5 How can I solve "config error: mail loops back to + myself" messages? + 4.6 Why does my sendmail process sometimes hang when + connecting over a SLIP/PPP link? + 4.7 How can I summarize the statistics generated by + sendmail in the syslog? + 4.8 How can I check my sendmail.cf to ensure that it's + re-writing addresses correctly? + 4.9 What is procmail, and where can I get it? + 4.10 How can I solve "cannot alias non-local names" errors? + + 5. VENDOR/OS SPECIFIC SENDMAIL ISSUES + 5.1 Sun Microsystems SunOS/Solaris 1.x/2.x + 5.1.1 How can I solve "line 273: replacement $3 out of + bounds" errors? + 5.1.2 How can I solve "line 445: bad ruleset 96 (50 max)" + errors? + 5.1.3 Why does version 8 sendmail (< 8.7.5) sometimes + hang under Solaris 2.5? + 5.1.4 Why can't I use SunOS/Solaris to get email to + certain large sites? + 5.2 IBM AIX + 5.2.1 The system resource controller always reports + sendmail as "inoperative". What's wrong? + 5.2.2 Why can't I use AIX to get email to some sites? + 5.2.3 Why can't I get sendmail 8.7.1 to use MX records + with AIX 3.2.5? + + 6. ADDITIONAL INFORMATION SOURCES (RFC 1807 bibliography format) + 6.1 Reference material devoted exlusively to sendmail + 6.2 Reference material with chapters or sections on sendmail + 6.3 Reference material on subjects related to sendmail + 6.4 World-wide web index pages on sendmail + 6.5 World-wide web index pages Internet email in general + 6.6 Online tutorials for sendmail + 6.7 Online archives of mailing lists and Usenet newsgroups, + relating to Internet email + + 7. THANKS! + +------------------------------ + +Date: July 9, 1996 +Subject: Q4.1 -- Should I use a wildcard MX for my domain? + + If at all possible, no. + + Wildcard MX records have lots of semantic "gotcha"s. For example, +they will match a host "unknown.your.domain" -- if you don't +explicitly test for unknown hosts in your domain, you will get "config +error: mail loops back to myself". + + See RFCs 1535, 1536, and 1912 (updates RFC 1537) for more detail +and other related (or common) problems. See also _DNS and BIND_ by +Albitz and Liu. + + They can also cause your system to add your domain to outgoing +FQDNs in a desperate attempt to get the mail to where it's supposed to +go, but because *.your.domain is valid due to the wildcard MX, +delivery to not.real.domain.your.domain will get dumped on you, and +you may even find yourself in a loop as the domain keeps getting +tacked on time after time after time (the "config error: mail loops +back to myself" problem). + + + Wildcard MX records are just a bad idea, plain and simple. +They don't work the way you'd expect, and virtually no one gets +them right. Avoid them at all costs. + +------------------------------ + +Date: March 23, 1996 +Subject: Q4.2 -- How can I set up an auto-responder? + + This is a local mailer issue, not a sendmail issue. Depending on +what you're doing, look at procmail (see Q4.9), ftpmail, or Majordomo. + + + The latest version of Majordomo can be found at +<ftp://ftp.greatcircle.com/pub/majordomo/>. It is written in Perl and +requires either Perl 4.036, and appears to run with only minor tweaks +under 5.001a or later. Make sure to check out the web interface for +Majordomo called "Mailserv" at <http://iquest.com/~fitz/www/mailserv/> +or "LWGate" at <http://www.netspace.org/users/dwb/lwgate.html>. The +latest versions of Perl (both 4.x and 5.x) can be found in +<http://www.metronet.com/perlinfo/src/>. More information about Perl +can be found at <http://www.metronet.com/perlinfo/perl5.html> + + The latest version of ftpmail can be found at +<ftp://src.doc.ic.ac.uk/packages/ftpmail> or any comp.sources.misc +archive (volume 37). + +------------------------------ + +Date: July 9, 1996 +Subject: Q4.3 -- How can I get sendmail to deliver local mail to + $HOME/.mail instead of into /usr/spool/mail (or /usr/mail)? + + Again, this is a local mailer issue, not a sendmail issue. Either +modify your local mailer (source code will be required) or change the +program called in the "local" mailer configuration description to be a +new program that does this local delivery. One program that is +capable of doing this is procmail (see Q4.9), although there are +probably many others as well. + + You might be interested in reading the paper ``HLFSD: Delivering +Email to your $HOME'' available in the Proceedings of the USENIX +System Administration (LISA VII) Conference (November 1993). More +information is at <ftp://ftp.cs.columbia.edu/pub/hlfsd/README.hlfsd>, +while the actual archive of the papers is at +<ftp://ftp.cs.columbia.edu/pub/hlfsd/hlfsd-paper.tar.gz> (tar archive, +gzip'ed). + +------------------------------ + +Date: March 23, 1996 +Subject: Q4.4 -- Why does it deliver the mail interactively when I'm + trying to get it to go into queue only mode? + + Or, I'm trying to use the "don't deliver to expensive mailer" +flag, and it delivers the mail interactively anyway. I can see it +does it: here's the output of "sendmail -v foo@somehost" (or Mail -v +or equivalent). + + + The -v flag to sendmail (which is implied by the -v flag to Mail +and other programs in that family) tells sendmail to watch the +transaction. Since you have explicitly asked to see what's going on, +it assumes that you do not want to to auto-queue, and turns that +feature off. Remove the -v flag and use a "tail -f" of the log +instead to see what's going on. + + If you are trying to use the "don't deliver to expensive mailer" +flag (mailer flag "e"), be sure you also turn on global option "c" -- +otherwise it ignores the mailer flag. + +------------------------------ + +Date: January 17, 1997 +Subject: Q4.5 -- How can I solve "config error: mail loops back to + myself" messages? + + I'm getting these error messages: + + 553 relay.domain.net config error: mail loops back to myself + 554 <user@domain.net>... Local configuration error + + How can I solve this problem? + + You have asked mail to the domain (e.g., domain.net) to be +forwarded to a specific host (in this case, relay.domain.net) +by using an MX record, but the relay machine doesn't recognize +itself as domain.net. Add domain.net to /etc/sendmail.cw (if you +are using FEATURE(use_cw_file)) or add "Cw domain.net" to your +configuration file. + + + IMPORTANT: When making changes to your configuration file, be +sure you kill and restart the sendmail daemon (for ANY change in the +configuration, not just this one): + + kill `head -1 /etc/sendmail.pid` + sh -c "`tail -1 /etc/sendmail.pid`" + + NOTA BENE: kill -1 does not work with versions prior to 8.7.y! + + With version 8.8.z sendmail, if the daemon was started up with +a full pathname (i.e., "/usr/lib/sendmail -bd -q13m"), then you +should be able to send it a HUP signal ("kill -1", or more safely, +"kill -HUP") and have it reload itself (version 8.7.y sendmail +cannot do this safely, and represents a security risk if it's not +replaced with version 8.8.3 or later). + +------------------------------ + +Date: March 23, 1996 +Subject: Q4.6 -- Why does my sendmail process sometimes hang when + connecting over a SLIP/PPP link? + + I'm connected to the network via a SLIP/PPP link. Sometimes my +sendmail process hangs (although it looks like part of the message has +been transfered). Everything else works. What's wrong? + + Most likely, the problem isn't sendmail at all, but the low level +network connection. It's important that the MTU (Maximum Transfer +Unit) for the SLIP connection be set properly at both ends. If they +disagree, large packets will be trashed and the connection will hang. + +------------------------------ + +Date: November 24, 1996 +Subject: Q4.7 -- How can I summarize the statistics generated by + sendmail in the syslog? + + This question is addressed on page 319 of _sendmail_ by Bryan +Costales. + + An updated version of this syslog-stat.pl script (so that +it understands the log format used in version 8 sendmail) is +at <ftp://ftp.his.com/pub/brad/sendmail/syslog_stats>. The +updated version of ssl has been uploaded to the SMTP Resources +Directory (in <ftp://ftp.is.co.za/networking/mail/tools/>), +as well as <ftp://ftp.his.com/pub/brad/sendmail/ssl>. +There is also another program (written by Bryan Beecher) at +<ftp://ftp.his.com/pub/brad/sendmail/smtpstats>. + + If you're interested in summarizing POP statistics, there is +<ftp://ftp.his.com/pub/brad/sendmail/popstats>, also written by +Bryan Beecher. + + + To see what else is available today, check the Comprehensive Perl +Archive Network <ftp://ftp.funet.fi/pub/languages/perl/CPAN/CPAN> or +<ftp://ftp.cis.ufl.edu/pub/perl/CPAN/CPAN> for the site nearest you. +For the scripts themselves, look under CPAN/scripts/mailstuff/ at +any CPAN site. For more information, see the comp.lang.perl.* +FAQs at <ftp://ftp.cis.ufl.edu:/pub/perl/faq/FAQ> or +<ftp://rtfm.mit.edu:/pub/usenet/comp.lang.perl.*/>. + + + There is also the "Sendmail Statistics Project" which has a web +page at <http://www.josnet.se/projects/ssp/>. Although they have +examples online of what the output might look like, it now appears +that this project is either dead or at least indefinitely on hold. +Still, you may be able to talk to the authors in order to get what +code from them you can. + + + If you're interested in using these kinds of tools to help +you do some near real-time monitoring of your system, you might be +interested in MEWS (Mail Early Warning System). From the README: + + If you've ever written a perl script to parse sendmail + log files looking for errors, MEWS might be of interest to + you. If you've ever thought about writing a perl script to + munge sendmail log files, cringed a little and hurriedly + came up with an excuse not to do it, read on. + + If you don't have a Solaris 2.5 machine, you can probably + stop reading here. + + The Mail Early Warning System (MEWS) gives postmasters + immediate notification of trouble spots on your mail + backbone. It only works with sendmail. + + To explain it in a nutshell, whenever sendmail returns a + 4xx or 5xx SMTP code, with the MEWS modifications, it also + sends the code over UDP to a daemon which then replays the + error message to interested parties. The man pages go into + a little bit more detail. + + + If this sounds like something you might be interested in +getting more details about, you can find the MEWS archive at +<ftp://ftp.qualcomm.com/pub/people/eamonn/mews.tar.Z>. + +------------------------------ + +Date: July 9, 1996 +Subject: Q4.8 -- How can I check my sendmail.cf to ensure that it's + re-writing addresses correctly? + + The recommended program for this is "checksendmail" by Rob +Kolstad. Old versions of this are available on various archive sites, +but currently, the only way to get the most recent version (which has +been updated to understand version 8.7 long option name syntax, as +well as now supporting both Perl 4.x and Perl 5.x) is from Rob +himself. + + The latest archive will be made publicly available (most likely +through the SMTPRD run by Andras Salamon; see Q6.5, entry +sendmail-faq//online/index/14) as soon as it is received. + +------------------------------ + +Date: July 9, 1996 +Subject: Q4.9 -- What is procmail, and where can I get it? + + The program "procmail" is a replacement for the local mailer +(variously called /bin/mail, /usr/bin/mail, mail.local, rmail, +etc...). It has been ported to run on virtually every OS you're +likely to run into, and has a whole host of features. It is typically +about 30% faster performing the job of the local mailer than programs +such as /bin/mail or /usr/bin/mail, it has been hammered on widely to +make it extremely secure (much more so than most local mailers) and +very robust. Procmail is also capable of helping you put a quota on a +user's mailbox through the standard Unix quota mechanism (see Q4.3). + + In short, whatever you've got, you're almost guaranteed that +procmail is better (if nothing else, the author has been able to focus +lots of time and energy into making it the best and fastest tool +available, while most system vendors just throw something together as +fast as they can and move on to the whole rest of the OS). + + However, this only begins to scratch the surface of what procmail +is capable of. It's most important feature is the fact that it gives +you a standard way to create rules (procmail calls them "recipes") to +process your mail before the messages get put into your mailbox, and +for that feature alone, it is one of the most important tools any +administrator can have in their repertoire. By filtering out or +automatically dealing with 80% of your daily cruft, it lets you spend +more time on the hard 20%. + + Note that recent releases of version 8 sendmail natively support +using procmail as an alternate local mailer (see +"FEATURE(local_procmail)" for version 8.7 and above). They also +support procmail as an additional local mailer, if you're concerned +about flat-out replacing your current local mailer with procmail (see +"MAILER(procmail)" in version 8.7 and above). + + + You can also install procmail as a user and run it out of your +.forward file, although this tends to be a bit slower and less +efficient. + + + The latest version of procmail can be found at +<ftp://ftp.informatik.rwth-aachen.de/pub/packages/procmail/>. + + + Procmail is also the core to a mailing list management package +called "SmartList", so if you've already got procmail, adding +SmartList may be a good option. Some listowners prefer Majordomo, +Listserv, or one of those other programs, but SmartList has more than +a few adherents as well. Your personal tastes will dictate whether +you swear by SmartList or at it. + +------------------------------ + +Date: March 24, 1997 +Subject: Q4.10 -- How can I solve "cannot alias non-local names" + errors? + + I upgraded from my vendor's sendmail to the latest version and +now I'm getting these error messages when I run "newaliases": + + /etc/aliases: line 13: MAILER-DAEMON... cannot alias non-local names + /etc/aliases: line 14: postmaster... cannot alias non-local names + + How can I solve this problem? + + + Your local mailer doesn't have the "A" flag specified. Edit the +Mlocal line in sendmail.cf and add "A" to the flags listed after +"F=". + + Better yet, if you're running a recent version of sendmail +that uses m4 to generate .cf files from .mc files, regenerate your +sendmail.cf and see if that fixes the problem. Remember to install +the new sendmail.cf and restart the sendmail daemon. + +------------------------------ + +Date: March 23, 1996 +Subject: Q5.1.1 -- How can I solve "line 273: replacement $3 out of + bounds" errors? + + When I use sendmail V8 with a Sun config file I get lines like: + + /etc/sendmail.cf: line 273: replacement $3 out of bounds + + the line in question reads: + + R$*<@$%y>$* $1<@$2.LOCAL>$3 user@ether + + what does this mean? How do I fix it? + + V8 doesn't recognize the Sun "$%y" syntax, so as far as it is +concerned, there is only a $1 and a $2 (but no $3) in this line. Read +Rick McCarty's paper on "Converting Standard Sun Config Files to +Sendmail Version 8", in the contrib directory (file +"converting.sun.configs") in the latest version 8 sendmail +distribution for a full discussion of how to do this. + +------------------------------ + +Date: March 23, 1996 +Subject: Q5.1.2 -- How can I solve "line 445: bad ruleset 96 (50 max)" + errors? + + When I use sendmail V8 on a Sun, I sometimes get lines like: + + /etc/sendmail.cf: line 445: bad ruleset 96 (50 max) + + what does this mean? How do I fix it? + + You're somehow trying to start up the old Sun sendmail (or +sendmail.mx) with a version 8 sendmail config file, which Sun's +sendmail doesn't like. Check your /etc/rc.local, any procedures that +have been created to stop and re-start the sendmail processes, etc.... +Make sure that you've switched everything over to using the new +sendmail. To keep this problem from ever happening again, try the +following (make sure you're logged in as root): + + mv /usr/lib/sendmail /usr/lib/sendmail.old + ln -s /usr/local/lib/sendmail.v8 /usr/lib/sendmail + mv /usr/lib/sendmail.mx /usr/lib/sendmail.mx.old + ln -s /usr/local/lib/sendmail.v8 /usr/lib/sendmail.mx + chmod 0000 /usr/lib/sendmail.old + chmod 0000 /usr/lib/sendmail.mx.old + + Assuming, of course, that you have installed sendmail V8 in +/usr/local/lib/sendmail.v8. + +------------------------------ + +Date: May 23, 1996 +Subject: Q5.1.3 -- Why does version 8 sendmail (< 8.7.5) sometimes + hang under Solaris 2.5? + + In moving from Solaris 2.4 to Solaris 2.5, the kernel changed its +name and is now in /kernel/genunix instead of /kernel/unix, so +_PATH_UNIX in conf.h is pointing to the wrong place. + + If you can't upgrade to the latest release of sendmail 8.8.z, +the next best thing to do is change _PATH_UNIX in conf.h (in the +solaris2 part) to point to the generic interface /dev/ksyms, like so: + + # define _PATH_UNIX "/dev/ksyms" + +------------------------------ + +Date: November 24, 1996 +Subject: Q5.1.4 -- Why can't I use SunOS/Solaris to get email to + certain large sites? + + This is most likely a problem in your resolver libraries +(DNS, /etc/hosts, NIS, etc...). Older Sun (and Solaris?) resolver +libraries allocated enough room for only five IP addresses for each +host name, and if any program ever ran across a name with more than +five IP addresses for it, the program would crash. + + For example, this would keep you from getting mail to CompuServe, +since (at the time of this writing) they list eleven IP addresses +for mx1.compuserve.com (one of the named MXes for compuserve.com). + + This will affect you even if you use version 8 sendmail, since +it's a problem in the resolver libraries, and not in sendmail itself. + + + You should either get patches to the resolver libraries from +Sun, or the latest version of BIND (see Q2.12) and install their +resolver library routines. Between the two, installing BIND is a +bit more work, but it typically gives you much more up-to-date code +to help you resist attacks to your systems, more capable programs +to be used for serving the DNS (including support for IPv6 and +several other features), and some very useful utility programs. + +------------------------------ + +Date: July 5, 1996 +Subject: Q5.2.1 -- The system resource controller always reports + sendmail as "inoperative". What's wrong? + + When I use version 8 sendmail on an IBM RS/6000 running AIX, the +system resource controller always reports sendmail as "inoperative", +even though it's actually running. What's wrong? + + When running as a daemon, sendmail detaches from its parent +process, fooling the SRC into thinking that sendmail has exited. To +fix this, issue the commands: + + kill `head -1 /etc/sendmail.pid` + chssys -s sendmail -f 9 -n 15 -S -a "-d99.100" + # use "-d0.1" in sendmail 8.6.x + startsrc -s sendmail -a "-bd -q30m" + # your sendmail args may vary + + Now the SRC should report the correct status of sendmail. If you +are using version 8.6.x, use "-d0.1" instead of "-d99.100" (the debug +options changed somewhat in version 8.7). In 8.6.x a side-effect of +the "-d0.1" option is that a few lines of debug output will be printed +on the system console every time sendmail starts up. + + For more information, read up on the System Resource Controller, +the lssrc command and the chssys command in the online AIX +documentation. + +------------------------------ + +Date: May 23, 1996 +Subject: Q5.2.2 -- Why can't I use AIX to get email to some sites? + + When I use IBM's sendmail on an IBM RS/6000 running AIX trying to +get to certain sites, it seems that I can get to some of them and not +others. What's wrong? + + There are two possible problems here: + + 1) Your version of sendmail is not configured to recognize MX + records in the DNS. Search through your sendmail.cf + looking for "OK MX" or "OK ALL". Older configurations had + this line commented out, and this will cause mail from you + to some sites to fail (because those sites have MX + records, but no A records in their DNS for the specific + Fully Qualified Domain Name you're trying to mail to). + + For more information, see the comp.unix.aix FAQ + <ftp://rtfm.mit.edu:/pub/usenet/news.answers/aix-faq/>. + + 2) There is a negative caching bug in AIX 3.2.5 with + /usr/sbin/named executables that are less than 103000 + bytes long. Ask your IBM representative to give you PMP + 3251, or the most recent patch that fixes this problem for + your particular configuration and version of the OS. + +------------------------------ + +Date: July 5, 1996 +Subject: Q5.2.3 -- Why can't I get sendmail 8.7.1 to use MX records + with AIX 3.2.5? + + IBM, in their infinite wisdom, provided a header file that would +easily mis-compile. This resulted in the struct{} for the DNS query +to be mis-allocated, and MX processing would barf. + + Fix 1) upgrade to 8.7.5 - this has a code fix for this problem. + + Fix 2) Install the BIND 4.9.4 libraries and include files and +tweak the Makefile.AIX to use them - I *think* these Get It Right (if +not, at least it'll die during compile rather than failing weirdly at +runtime). + + Fix 3) Hack Makefile.AIX to pass a -DBIT_ZERO_ON_LEFT to cause the +headers to use the right #ifdefs. + +------------------------------ + +Date: January 21, 1997 +Subject: Q6 -- Additional information sources + + This probably isn't in strict RFC 1807 format, but I'm getting +closer. Unfortunately, the format detailed in RFC 1807 was never +intended to be used in this fashion, so I'm doing a bit of square-peg +fitting into round holes. + + Note that the publisher ids that I've assigned should not be +misconstrued to imply that I have actually published all these +documents, it's just that I need some sort of reasonable entry for the +RFC 1807 "ID" field, and in lieu of information to the contrary +indicating what the actual publishers have registered, I have assigned +my own, independant, "third-party" IDs. Hopefully, the bibliographic +entries below make it obvious who the real publishers of the various +documents are. + + + 6.1 Reference material devoted exlusively to sendmail + + BIB-VERSION:: CS-TR-v2.1 + ID:: sendmail-faq//online/reference/1 + ENTRY:: March 23, 1996 + TYPE:: Reference manual, available online in printable format + REVISION:: January 21, 1997; Updated URL & mailing list info + TITLE:: Sendmail Installation and Operation Guide + AUTHOR:: Allman, Eric + CONTACT:: Eric Allman <eric@Sendmail.ORG> + InReference, Inc. + NASA Ames Technology Commercialization Center + 155-A Moffett Park Drive, Suite 104 + Sunnyvale, CA 94089 + Phone: 1+408 541-7615 + Fax: 1+408 734-4946 + DATE:: November 19, 1995 + PAGES:: 69 + RETRIEVAL:: Contents of manual is in doc/op/op.ps of sendmail source + archive + KEYWORD:: version 8.7.5 sendmail + LANGUAGE:: English + NOTES:: {g|n}roff "me" macro format version is in doc/op/op.me + See: URL:http://www.sendmail.org/ + +ABSTRACT:: + +The documentation written by Eric Allman himself, comes with the +sendmail distribution. The file in doc/op/op.me (nroff "me" macro +format) may have a different number of pages depending on the type of +device it is printed on, etc.... + +Eric provides his free consulting in the form of continuing +development on sendmail, and occasional posts to comp.mail.sendmail. +Please don't be so rude as to ask him to provide further free +consulting directly to you. If you (or your company) is willing to +compensate his for his consulting time, he may be willing to listen. +At the very least, you should make sure you've exhausted all other +courses of action before resorting to adding another message to the +thousands he gets per day. + + +Check the sendmail home page at <http://www.sendmail.org/> for +late-breaking updates and other useful information. + +If you want to be notified regarding future updates to sendmail and +other items of potential interest, you may want to subscribe to the +sendmail-announce mailing list. Address your subscription requests +to "majordomo@lists.sendmail.org" with "subscribe sendmail-announce" +as the body of the message. + + +END:: sendmail-faq//online/reference/1 + + BIB-VERSION:: CS-TR-v2.1 + ID:: sendmail-faq//book/ISBN/1-56592-056-2 + ENTRY:: March 23, 1996 + REVISION:: January 21, 1997; Updated info re: 2nd Ed. + TYPE:: Reference book, hardcopy + TITLE:: sendmail + AUTHOR:: Costales, Bryan + AUTHOR:: Allman, Eric + AUTHOR:: Rickert, Neil + CONTACT:: Bryan Costales <bcx@BCX.COM> + O'Reilly & Associates, Inc. + 103 Morris Street, Suite A + Sebastapol, CA 95472 + Order by phone: 800-998-9938 (US/Canada inquiries) + 800-889-8969 (US/Canada credit card orders) + 707-829-0515 (local/overseas) + DATE:: November, 1993 + PAGES:: 792 + COPYRIGHT:: Copyright (c) 1993 O'Reilly & Associates, Inc. All rights + reserved. + LANGUAGE:: English + NOTES:: See: URL:http://www.ora.com/gnn/bus/ora/item/sendmail.html + +ABSTRACT:: + +The definitive reference for version 8 sendmail. + +At least three printings of first edition have come out, and the +information above is for the first printing. + +As of yet, this book has not been updated to include versions of +sendmail after 8.6.4. + +Bryan provides his consulting to the world in the form of his book, +unless you're willing to compensate him for his services as well. +Like Eric, you should make sure you've exhausted all other courses of +action before you spend any of his valuable time. + + +The second edition has now been published (focussing exclusively +on version 8.8 sendmail), with an ISBN of 1-56592-222-0. It has +been expanded to 1,050 pages long and expanded coverage of many +new topics too numerous to name. + +END:: sendmail-faq//book/ISBN/1-56592-056-2 + + BIB-VERSION:: CS-TR-v2.1 + ID:: sendmail-faq//book/ISBN/1-55558-127-7 + ENTRY:: March 23, 1996 + TYPE:: Reference book, hardcopy + REVISION:: Sep 9, 1996; fixed typo + TITLE:: Sendmail: Theory and Practice + AUTHOR:: Avolio, Frederick M. + AUTHOR:: Vixie, Paul A. + CONTACT:: Fred Avolio <fma@al.org>, Paul Vixie <vix@al.org> + Digital Press + 225 Wildwood Avenue + Woburn, MA 01801, USA + Ordering Info: voice 1 800 366 2665 + fax 1 800 446 6520 + DATE:: 1994 + PAGES:: 262 + COPYRIGHT:: Copyright (c) by 1995 Butterworth-Heinemann + LANGUAGE:: English + NOTES:: See: URL:http://www.vix.com/vix/smtap/ + +ABSTRACT:: + +Centers more on IDA sendmail (at least partly because version 8 didn't +exist when they began the book). Written more like a college +Sophomore or Junior level textbook. + +While you'll probably never let the Costales book out of your grubby +little hands (especially if you do much work with version 8 sendmail), +this is a book you'll probably read once or maybe twice, learn some +very valuable things, but then likely put on a shelf and not read or +reference again (unless you have to write up a bibliographic entry for +it). Makes a better introduction to sendmail for management types, +especially if you don't want them getting their hands on too much +"dangerous" technical information. Also a *lot* smaller and less +imposing. + +If possible, I recommend getting both, but if you can only get one, +get Costales unless you're going to be working exclusively with IDA +sendmail, in which case Avolio & Vixie will probably be more useful. + +Note that Paul Vixie is extremely busy working on further development +of BIND, the Internet de facto standard program for serving the DNS, +upon which all Internet services depend, mail being only one of them. +Like Eric and Bryan, he's also very busy. Unless you're willing to +compensate him for his services, please let him get real work done. + +END:: sendmail-faq//book/ISBN/1-55558-127-7 + + + 6.2 Reference material with chapters or sections on sendmail + + BIB-VERSION:: CS-TR-v2.1 + ID:: sendmail-faq//book/ISBN/0-13-151051-7 + ENTRY:: March 23, 1996 + TYPE:: Reference book, hardcopy + REVISION:: May 23, 1996; Updated abstract. + TITLE:: Unix System Administration Handbook, Second Edition + AUTHOR:: Nemeth, Evi + AUTHOR:: Snyder, Garth + AUTHOR:: Seebass, Scott + AUTHOR:: Hein, Trent R. + CONTACT:: <sa-book@admin.com> + Prentice-Hall, Inc. + Upper Saddle River, New Jersey 07458 + DATE:: January, 1995 + PAGES:: 780 + COPYRIGHT:: Copyright (c) 1995 by Prentice Hall PTR + LANGUAGE:: English + NOTES:: See: URL:http://www.admin.com/ + +ABSTRACT:: + +Still the best hands-on Unix System Administration book around. +Covers far more than just sendmail, but the sixty-four pages (pages +455-518 in the third printing) it does devote are very well written +and quite useful. Also provides a version of Rob Kolstad's +checksendmail script on the accompanying CD-ROM. + +Note that Eric Allman and Marshall Kirk McKusick wrote the Foreword +for the Second Edition. This should give you at least an inkling as +to how essential this book is, even for experienced Unix +administrators. + +END:: sendmail-faq//book/ISBN/0-13-151051-7 + + BIB-VERSION:: CS-TR-v2.1 + ID:: sendmail-faq//book/ISBN/0-201-58629=0 + ENTRY:: March 23, 1996 + TYPE:: Reference book, hardcopy + REVISION:: March 27, 1996; Changed ID format to include ISBN, + moved URL to NOTES field from OTHER_ACCESS field, + also updated ABSTRACT + REVISION:: March 29, 1996; Updated ID, PAGES, COPYRIGHT, and ABSTRACT + TITLE:: Practical Internetworking With TCP/IP and UNIX + AUTHOR:: Carl-Mitchell, Smoot + AUTHOR:: Quarterman, John S. + CONTACT:: <tic@tic.com> + Addison Wesley Publishing Company + Computer Science & Engineering Division + One Jacob Way + Reading, MA 01867 + USA + Orders: voice://800-822-6339 (USA) + fax://617-942-1117 + DATE:: 1993 + PAGES:: 476 + COPYRIGHT:: Copyright (c) 1993 by Addison-Wesley Publishing + Company, Inc. + LANGUAGE:: English + NOTES:: See URL:http://heg-school.aw.com/cseng/authors/mitchell/ + practical/practical.html + +ABSTRACT:: + +Devotes 50 pages (most of chapter 8) to discussion of sendmail. As +far as TCP/IP networking books go that also happen to discuss +sendmail, it seems well-written and clear (better than I recall Hunt's +book being), but rather dated in the face of books devoted to the +topic and all the recent development activity in the sendmail +community. Forget about the references, though. The newest +sendmail-related reference listed is dated 1983, ten years before the +date on this book and most certainly wildly out-of-date now. + +There are other books written on the subject of Internetworking with +TCP/IP (most notably Comer), but this particular book seems to have a +unique mix of theory (if perhaps a bit dated) and practical advice. +Other books tend to have lots of one or the other, or split their +theory and nitty-gritty details into separate books in a series (like +Comer). + +Assuming that an update will be coming out soon, it probably deserves +a place on the shelf of most System or Network Administrators, right +next to _Internetworking with TCP/IP_ by Comer, _Managing Internet +Information Services_ by Liu, et. al., _DNS and BIND_ by Albitz and +Liu, _Unix System Administration_ by Nemeth, et. al., and last, but +certainly not least, _sendmail_ by Costales. However, it deserves +this place more because of the non-sendmail related material, as +opposed to what sendmail-related material there is. + +END:: sendmail-faq//book/ISBN/0-201-58629-0 + + BIB-VERSION:: CS-TR-v2.1 + ID:: sendmail-faq//book/ISBN/0-937175-82-X + ENTRY:: March 23, 1996 + TYPE:: Reference book, hardcopy + REVISION:: March 27, 1996; Changed ID format to include ISBN, + moved URL to NOTES field from OTHER_ACCESS field + TITLE:: TCP/IP Network Administration + AUTHOR:: Hunt, Craig + CONTACT:: O'Reilly & Associates, Inc. + 103 Morris Street, Suite A + Sebastapol, CA 95472 + Order by phone: 800-998-9938 (US/Canada inquiries) + 800-889-8969 (US/Canada credit card orders) + 707-829-0515 (local/overseas) + DATE:: August, 1992 + PAGES:: 502 + LANGUAGE:: English + NOTES:: See: URL:http://www.ora.com/gnn/bus/ora/item/tcp.html + +ABSTRACT:: + +The book I learned sendmail from when there was no other book in print +that even mentioned the name. + +Here primarily for historical purposes, especially with respect to the +sending of Internet mail and the DNS. Some of the other TCP/IP +networking stuff is relevant, but this book is getting more and more +dated as time goes by. + +END:: sendmail-faq//book/ISBN/0-937175-82-X + + + 6.3 Reference material on subjects related to sendmail + + BIB-VERSION:: CS-TR-v2.1 + ID:: sendmail-faq//book/ISBN/1-56592-010-4 + ENTRY:: March 23, 1996 + TYPE:: Reference book, hardcopy + REVISION:: January 21, 1997; Updated info re: 2nd Ed. + TITLE:: DNS and BIND + AUTHOR:: Albitz, Paul + AUTHOR:: Liu, Cricket + CONTACT:: O'Reilly & Associates, Inc. + 103 Morris Street, Suite A + Order by phone: 800-998-9938 (US/Canada inquiries) + 800-889-8969 (US/Canada credit card orders) + 707-829-0515 (local/overseas) + DATE:: October 1992 + PAGES:: 418 + COPYRIGHT:: Copyright (c) 1992 O'Reilly & Associates, Inc. All rights + reserved. + LANGUAGE:: English + NOTES:: See: URL:http://www.ora.com/gnn/bus/ora/item/dns.html + +ABSTRACT:: + +As definitive as Costales is on sendmail, this book is on the subject +of the Domain Name System (DNS) and the most common server software +for the DNS, namely BIND. + +It hasn't been updated yet to reflect the massive changes that +happened with BIND 4.9.3 (and the recent flurry of related activity in +the DNS community), but even as old as it is, it still stands the test +of time as the one book *every* DNS/Domain Administrator should have +on their shelf. + +Since the sending of Internet mail is so very heavily dependant on the +DNS, it obviously also belongs on the shelf of any Postmaster or +System Administrator whose site does Internet email. And that means +virtually every administrator of every site on the Internet. + + +This book has recently been updated with a second edition, ISBN +1-56592-236-0 and 438 pages. It includes updated discussion of +BIND 4.9.4, as well as many other topics. + +END:: sendmail-faq//book/ISBN/1-56592-010-4 + + BIB-VERSION:: CS-TR-v2.1 + ID:: sendmail-faq//book/ISBN/0-937175-93-5 + ENTRY:: March 23, 1996 + TYPE:: Reference book, hardcopy + REVISION:: March 27, 1996; Changed ID format to include ISBN, + moved URL to NOTES field from OTHER_ACCESS field + TITLE:: Managing UUCP and Usenet + AUTHOR:: Todino, Grace + AUTHOR:: O'Reilly, Tim + CONTACT:: O'Reilly & Associates, Inc. + 103 Morris Street, Suite A + Order by phone: 800-998-9938 (US/Canada inquiries) + 800-889-8969 (US/Canada credit card orders) + 707-829-0515 (local/overseas) + DATE:: January 1992 + PAGES:: 368 + LANGUAGE:: English + NOTES:: See: URL:http://www.ora.com/gnn/bus/ora/item/muucp.html + +ABSTRACT:: + +The definitive book for installing and managing UUCP. + +The general assumption with version 8 sendmail is that virtually no +one uses UUCP to send email anymore, but if that assumption isn't true +for you, then you probably need this book. + +END:: sendmail-faq//book/ISBN/0-937175-93-5 + + + 6.4 World-wide web index/resource pages on sendmail + + BIB-VERSION:: CS-TR-v2.1 + ID:: sendmail-faq//online/index/10 + ENTRY:: March 23, 1996 + TYPE:: Online sendmail index + REVISION:: March 27, 1996; moved URL from RETRIEVAL field to + OTHER_ACCESS field. + TITLE:: comp.mail.sendmail FAQ Support Page + AUTHOR:: Knowles, Brad + CONTACT:: Brad Knowles <brad@etext.org> +OTHER_ACCESS:: URL:http://www.his.com/~brad/sendmail/ + LANGUAGE:: English + +ABSTRACT:: + +Support Page for this FAQ. + +END:: sendmail-faq//online/index/10 + + BIB-VERSION:: CS-TR-v2.1 + ID:: sendmail-faq//online/index/17 + ENTRY:: March 25, 1996 + TYPE:: Online sendmail index + REVISION:: March 27, 1996; moved URL from RETRIEVAL field to + OTHER_ACCESS field. + TITLE:: comp.mail.sendmail Most Frequently Asked Questions Support Page + AUTHOR:: Assman, Claus + CONTACT:: Claus Assmann <ca@informatik.uni-kiel.de> +OTHER_ACCESS:: URL:http://www.informatik.uni-kiel.de/~ca/email/english.html + LANGUAGE:: English + +ABSTRACT:: + +Most Frequently Asked Questions on comp.mail.sendmail and their +answers. Also has some links to a few other resources. + +END:: sendmail-faq//online/index/17 + + + BIB-VERSION:: CS-TR-v2.1 + ID:: sendmail-faq//online/index/11 + ENTRY:: March 23, 1996 + TYPE:: Online sendmail index + REVISION:: May 23, 1996; Updated abstract. + TITLE:: Henry's sendmail Page! + AUTHOR:: Farkas, Henry + CONTACT:: Henry Farkas <hfarkas@ims.advantis.com> +OTHER_ACCESS:: URL:http://newstand.ims.advantis.com/henry/sendmail.html + LANGUAGE:: English + +ABSTRACT:: + +Has collected a few direct pointers to a few places, although I prefer +to either have pointers to well-known index sites and let them do the +hard work for me or do myself the work of making my site one of those +well-known indexes. + +Still, worth taking a look at. + +END:: sendmail-faq//online/index/11 + + + BIB-VERSION:: CS-TR-v2.1 + ID:: sendmail-faq//online/resources/22 + ENTRY:: November 24, 1996 + TITLE:: IICONS Sendmail Resources + AUTHOR:: Caloca, Paul + CONTACT:: Paul Caloca <pcaloca@iicons.com> + COPYRIGHT:: Copyright (c) 1996 Paul Caloca. All Rights Reserved. +OTHER_ACCESS:: URL:http://www.iicons.com/sendmail/index.html + LANGUAGE:: English + +ABSTRACT:: + +Provides information on how to compile Sendmail and the NEWDB +db.1.85 for Solaris 2. Also has a section on which Sun patches +update Solaris 2 to BIND 4.9.3. + +Has pointers to some non-Sun/Solaris sendmail resources, especially +including CERT Advisories related to sendmail. + + +END:: sendmail-faq//online/index/22 + + + 6.5 World-wide web index pages and other reference on Internet + email in general + + BIB-VERSION:: CS-TR-v2.1 + ID:: sendmail-faq//online/index/12 + ENTRY:: March 23, 1996 + TYPE:: Online general Internet email index + REVISION:: March 27, 1996; moved URL from RETRIEVAL field to + OTHER_ACCESS field. + TITLE:: Internet Mail Consortium web site + CORP-AUTHOR:: Internet Mail Consortium + CONTACT:: <info@imc.org> +OTHER_ACCESS:: URL:http://www.imc.org/ + LANGUAGE:: English + +ABSTRACT:: + +If it has to do with Internet email, you'll probably find it here or a +link to it from here. + +They have or have information on email-related Usenet FAQs, RFCs, +Internet Drafts (documents that are in the process of becoming RFCs), +IETF Working Groups, security standards, and are running a few +email-related mailing lists. + +Tends to be focussed on the standards issues. + +If you care about Internet email, you should make it your duty in life +to check this site frequently. + +END:: sendmail-faq//online/index/12 + + BIB-VERSION:: CS-TR-v2.1 + ID:: sendmail-faq//online/index/13 + ENTRY:: March 23, 1996 + TYPE:: Online general Internet email index + REVISION:: August 20, 1996; Updated URL. + TITLE:: Email References + AUTHOR:: Wohler, Bill + CONTACT:: Bill Wohler <wohler@worldtalk.com> +OTHER_ACCESS:: URL:http://www.worldtalk.com/html/msg_resources/email_ref.html + LANGUAGE:: English + +ABSTRACT:: + +The most exhaustive index site I know of for Internet email related +documents outside of the Internet Mail Consortium. + +Also has pointers to other organizations that relate to Internet +email, such as the Electronic Messaging Association and the European +Electronic Messaging Association. + +Tends to be focussed on the server and standards issues. + +END:: sendmail-faq//online/index/13 + + BIB-VERSION:: CS-TR-v2.1 + ID:: sendmail-faq//online/index/14 + ENTRY:: March 23, 1996 + TYPE:: Online general Internet email index + REVISION:: June 28, 1996; Added acronym for SMTPRD + TITLE:: SMTP Resources Directory (SMTPRD) + AUTHOR:: Salamon, Andras + AUTHOR:: Knowles, Brad + CONTACT:: Andras Salamon <smtprd@dns.net> +OTHER_ACCESS:: URL:http://www.dns.net/smtprd/ + LANGUAGE:: English + +ABSTRACT:: + +Another good index site, but still very much in the early phases of +gestation. Based very heavily on the DNS Resources Directory, also by +Andras Salamon, at <http://www.is.co.za/dnsrd/>. + +A well-rounded site, for the amount of material it covers so far. + +END:: sendmail-faq//online/index/14 + + BIB-VERSION:: CS-TR-v2.1 + ID:: sendmail-faq//online/index/15 + ENTRY:: March 23, 1996 + TYPE:: Online general Internet email index + REVISION:: March 27, 1996; moved URL from RETRIEVAL field to + OTHER_ACCESS field. + TITLE:: E-Mail Web Resources + AUTHOR:: Wall, Matt + CONTACT:: Matt Wall <wall+@cmu.edu> +OTHER_ACCESS:: URL:http://andrew2.andrew.cmu.edu/cyrus/email/email.html + LANGUAGE:: English + +ABSTRACT:: + +Another good index site, tends to be more focussed on client side and +LAN email packages. Also lists some email services, which no one else +that I've seen appears to have taken the time to catalog. + +Excellent side-by-side feature comparison of various MUAs and their +compliance with various Internet protocols. + +END:: sendmail-faq//online/index/15 + + + 6.6 Online tutorials for sendmail + + BIB-VERSION:: CS-TR-v2.1 + ID:: sendmail-faq//online/tutorial/9 + ENTRY:: March 23, 1996 + TYPE:: Online sendmail tutorial + REVISION:: March 27, 1996; moved URL from RETRIEVAL field to + OTHER_ACCESS field. + TITLE:: Sendmail V8: A (Smoother) Engine Powers Network Email + AUTHOR:: Reich, Richard + CONTACT:: Richard Reich <richard@reich.com> + DATE:: February 8, 1996 + COPYRIGHT:: Copyright (c) 1995 The McGraw-Hill Companies, Inc. + All Rights Reserved. +OTHER_ACCESS:: URL:http://www.unixworld.com/unixworld/archives/95/tutorial/ + 008/008.txt.html + LANGUAGE:: English + NOTES:: UnixWorld Online: Tutorial: Article No. 008 + +ABSTRACT:: + +Good technical introduction. Some useful references. Notably does +not reference this FAQ as a place to get more information. + +END:: sendmail-faq//online/article/9 + + BIB-VERSION:: CS-TR-v2.1 + ID:: sendmail-faq//online/tutorial/16 + ENTRY:: March 23, 1996 + TYPE:: Online sendmail tutorial + REVISION:: March 27, 1996; moved URL from RETRIEVAL field to + OTHER_ACCESS field. + TITLE:: Sendmail -- Care and Feeding + AUTHOR:: Quinton, Reg + CONTACT:: Reg Quinton <reggers@julian.uwo.ca> + Computing and Communications Services + The University of Western Ontario + London, Ontario N6A 5B7 + Canada + DATE:: March 24, 1992 +OTHER_ACCESS:: URL:ftp://ftp.sterling.com/mail/sendmail/uwo-course/ + sendmail.txt.Z + LANGUAGE:: English + NOTES:: Postscript version also available. See ftp://ftp.sterling.com/ + mail/sendmail/uwo-course/sendmail.ps.Z + +ABSTRACT:: + +Dated. Only here until I find better. + +END:: sendmail-faq//online/tutorial/16 + + BIB-VERSION:: CS-TR-v2.1 + ID:: sendmail-faq//online/tutorial/21 + ENTRY:: March 27, 1996 + TYPE:: Online sendmail tutorial + TITLE:: Explosion in a Punctuation Factory + AUTHOR:: Bryan Costales + CONTACT:: Becca Thomas <editor@unixworld.com> + DATE:: January 1994 + COPYRIGHT:: Copyright (c) 1995 The McGraw-Hill Companies, Inc. + All Rights Reserved. +OTHER_ACCESS:: URL:http://www.unixworld.com/unixworld/archives/94/tutorial/ + 01/01.txt.html + LANGUAGE:: English + +ABSTRACT:: + +Good introduction on how sendmail re-write rules work. + +END:: sendmail-faq//online/article/21 + + + 6.7 Online archives of mailing lists and Usenet newsgroups, + relating to Internet email + + BIB-VERSION:: CS-TR-v2.1 + ID:: sendmail-faq//online/archive/18 + ENTRY:: March 25, 1996 + TYPE:: Online Usenet newgroup archive + REVISION:: March 27, 1996; moved URL from RETRIEVAL field to + OTHER_ACCESS field. + TITLE:: DejaNews +OTHER_ACCESS:: URL:http://www.dejanews.com + LANGUAGE:: English + NOTES:: Archives/indexes only Usenet news. + +ABSTRACT:: + +The first, and still most focussed, Usenet news archive/index site. +Others archive/index news as well as other things, but none that I've +seen do it better. + +Go to "Power Search" then "Query Filter" if you wish to restrict the +newsgroups you search on to something like just comp.mail.sendmail and +not all newsgroups. + +END:: sendmail-faq//online/archive/18 + + BIB-VERSION:: CS-TR-v2.1 + ID:: sendmail-faq//online/archive/19 + ENTRY:: March 25, 1996 + TYPE:: Online Usenet newgroup archive + REVISION:: March 27, 1996; moved URL from RETRIEVAL field to + OTHER_ACCESS field. + TITLE:: AltaVista +OTHER_ACCESS:: URL:http://www.altavista.digital.com + LANGUAGE:: English + NOTES:: Archives/indexes Usenet news and World-wide web pages. + +ABSTRACT:: + +One of the leading indexes of world-wide web pages, and their +archive/index of Usenet news is obviously secondary. + +END:: sendmail-faq//online/archive/19 + + BIB-VERSION:: CS-TR-v2.1 + ID:: sendmail-faq//online/archive/20 + ENTRY:: March 25, 1996 + TYPE:: Online Usenet newgroup archive + REVISION:: July 9, 1996; Additional information based on experience + TITLE:: InReference +OTHER_ACCESS:: URL:http://www.reference.com + LANGUAGE:: English + NOTES:: Not officially online yet, in final stages of beta + +ABSTRACT:: + +Has promise to be the best Usenet news/publicly accessible mailing +list index/archive site in the world. We'll see how well it delivers +on this promise. It's in the final stages of beta testing (and is now +open to the public), and seems quite solid. I haven't yet figured out +how to really make proper use of the underlying power I'm sure is +there, but it looks good. Of course, you'll need to wait a little +while as they backfill their archives before searches will turn up all +that much information, but it already compares favourably to DejaNews. + +Some of the best minds I know of are working on this project, so if it +can be done, I figure they can do it. + +END:: sendmail-faq//online/archive/20 + + BIB-VERSION:: CS-TR-v2.1 + ID:: sendmail-faq//online/archive/21 + ENTRY:: May 24, 1996 + TYPE:: Online archive of spam/junkmail + TITLE:: list-managers spam discussion archives + AUTHOR:: Gilman, Al + CONTACT:: Al Gilman <asgilman@access.digex.net> +OTHER_ACCESS:: URL:http://www.access.digex.net/~asgilman/spam/ +OTHER_ACCESS:: URL:ftp://www.access.digex.net/~asgilman/spam/ + LANGUAGE:: English + +ABSTRACT:: + +These collections of past mail from the list-managers discussion list +can be retrieved by ftp or HTTP. + +For anonymous ftp, open ftp.digex.net and cd to +/pub/access/asgilman/spam. + +For http, G)o to http://www.access.digex.net/~asgilman/spam/ In this +directory you will find, _inter alia_, two files which are mail +folders: + + spam -- collects examples of spams + spam-NOT -- collects discussion of spam countermeasures + +END:: sendmail-faq//online/archive/21 + +------------------------------ + +Date: July 9, 1996 +Subject: Q7 -- THANKS! + + +Special thanks to: + + Eric Allman The core of the material here comes from + his FAQ for version 8.6.9 sendmail. I + couldn't even have gotten started were it + not for him. And if he hadn't written + sendmail, there obviously wouldn't even + be a FAQ. Heck, there might not even be an + Internet. + + Paul Southworth Provides FAQ posting services, useful + comments on various sections, and the + mailclient-faq. I couldn't have kept + doing this were it not for his help. + + Ed Ravin Virtually all the material regarding the + use of sendmail on AIX is his, and most + of it has been carried over verbatim. + +Thanks also to: + + Neil Hoggarth, Andras Salamon, Johan Svensson, Christopher X. + Candreva, Bill Wohler, Matthew Wall, Henry W. Farkas, Claus + Assmann, Curt Sampson, Rebecca Lasher, Jim Davis, David Keegel, + Betty Lee, Alain Durand, Walter Schweizer, Christophe Wolfhugel, + Al Gilman, Valdis Kletnieks, John Gardiner Myers, Paul DuBois, + Adam Bentley, Dave Sill, Dave Wreski, Paul Caloca, Eamonn + Coleman, Michael Fuhr, Betty Lee, Derrell Lipman, and the + readers and posters of comp.mail.sendmail. + +------------------------------ + +Comments/updates should be sent to <sendmail-faq@etext.org>. + +Copyright 1996, by Brad Knowles, all rights reserved + +End of comp.mail.sendmail Frequently Asked Questions (FAQ), part 2 of 2 +*********************************************************************** diff --git a/debian/patch.collect b/debian/patch.collect new file mode 100644 index 0000000..6aad2fd --- /dev/null +++ b/debian/patch.collect @@ -0,0 +1,25 @@ +*** collect.c.orig Wed May 20 02:36:05 1998 +--- collect.c Thu May 28 13:29:09 1998 +*************** +*** 353,360 **** + if (*--bp != '\n' || *--bp != '\r') + bp++; + *bp = '\0'; +! if (bitset(H_EOH, chompheader(buf, FALSE, hdrp, e))) +! mstate = MS_BODY; + break; + + case MS_BODY: +--- 353,364 ---- + if (*--bp != '\n' || *--bp != '\r') + bp++; + *bp = '\0'; +! if (bitset(H_EOH, chompheader(buf, FALSE, hdrp, e))) { +! mstate = MS_BODY; +! if (tTd(30, 35)) +! printf("H_EOH, istate=%d, mstate=%d\n", istate, mstate); +! goto nextstate; +! } + break; + + case MS_BODY: diff --git a/debian/postinst b/debian/postinst new file mode 100644 index 0000000..6c4ecbc --- /dev/null +++ b/debian/postinst @@ -0,0 +1,144 @@ +#!/bin/sh -e +# +# Debian package postinst +# Version 1.2 +# +# Robert Leslie <rob@mars.org> + +case "$1" in + configure) + # continue below + ;; + + abort-upgrade|abort-remove|abort-deconfigure) + exit 0 + ;; + + *) + echo "postinst called with unknown argument \`$1'" >&2 + exit 0 + ;; +esac + +if [ -e /etc/suid.conf -a -x /usr/sbin/suidregister ]; then + suidregister -s sendmail /usr/sbin/sendmail root root 4755 +else + chown root.root /usr/sbin/sendmail + chmod 4755 /usr/sbin/sendmail +fi + +if [ ! -d /etc/mail ] +then + mkdir /etc/mail + chown 0.0 /etc/mail + chmod 755 /etc/mail +fi + +if [ ! -d /var/spool/mqueue ] +then + mkdir /var/spool/mqueue + chown 0.0 /var/spool/mqueue + chmod 700 /var/spool/mqueue +fi + +if [ ! -f /var/log/sendmail.st ] +then + touch /var/log/sendmail.st + chown 0.0 /var/log/sendmail.st + chmod 644 /var/log/sendmail.st +fi + +update-rc.d sendmail defaults >/dev/null +update-inetd --disable smtp + +# Move old configuration files to their new home + +if [ -f /etc/sendmail.cf -a \ + ! -L /etc/sendmail.cf -a \ + ! -f /etc/mail/sendmail.cf ] +then + echo "This version of the Debian sendmail package keeps its configuration" + echo "files under /etc/mail. You already have some sendmail configuration" + echo -n "files in /etc; would you like to move them to /etc/mail? [Y] " + read yn + test -n "$yn" || yn="Y" + + case "$yn" in + [Yy]*) + echo "Moving /etc/sendmail.* to /etc/mail ..." + mv -f /etc/sendmail.* /etc/mail/. + + test ! -f /etc/mail/sendmail.cf || \ + mv -f /etc/mail/sendmail.cf /etc/mail/sendmail.cf.old + ;; + + *) + echo "Okay, leaving them where they are; they won't be used." + ;; + esac +fi + +# Make sure /etc/sendmail.cf points to /etc/mail/sendmail.cf + +if [ -e /etc/sendmail.cf ] +then + if [ -L /etc/sendmail.cf ] + then + rm -f /etc/sendmail.cf + else + echo "Saving old /etc/sendmail.cf as /etc/sendmail.cf.old ..." + mv -f /etc/sendmail.cf /etc/sendmail.cf.old + fi +fi + +ln -sf mail/sendmail.cf /etc/sendmail.cf + +# Check existing /etc/mail/sendmail.cf + +if [ -f /etc/mail/sendmail.cf ] +then + if (sed -n -e "/^DZ/s/^DZ//p" /etc/mail/sendmail.cf \ + | grep 8.8.8 > /dev/null) + then + echo "Existing /etc/mail/sendmail.cf found, and it appears it may be" + echo -n "compatible with this version of sendmail. Use it? [Y] " + read yn + test -n "$yn" || yn="Y" + else + echo "Existing /etc/mail/sendmail.cf found, but it was made for" + echo -n "an older version of sendmail. Use it anyway? [N] " + read yn + test -n "$yn" || yn="N" + fi + + case "$yn" in + [Yy]*) + ;; + + *) + echo "Saving old /etc/mail/sendmail.cf" \ + "as /etc/mail/sendmail.cf.old ..." + mv -f /etc/mail/sendmail.cf /etc/mail/sendmail.cf.old + ;; + esac +fi + +test -f /etc/mail/sendmail.cf || sendmailconfig --no-reload + +# Start server + +echo -n "Start sendmail now? [Y] " +read yn +test -n "$yn" || yn="Y" + +case "$yn" in + [Nn]*) + echo "Not started; to start later, do: /etc/init.d/sendmail start" + echo -n "Press [ENTER] " + read line + ;; + + *) + /etc/init.d/sendmail start + ;; +esac diff --git a/debian/postinst.debhelper b/debian/postinst.debhelper new file mode 100644 index 0000000..f0e9469 --- /dev/null +++ b/debian/postinst.debhelper @@ -0,0 +1,72 @@ +# Automatically added by dh_suidregister +if [ -e /etc/suid.conf -a -x /usr/sbin/suidregister ]; then + suidregister -s sendmail /usr/sbin/sendmail root root 4755 +else + chown root.root /usr/sbin/sendmail + chmod 4755 /usr/sbin/sendmail +fi +# End automatically added section +# Automatically added by dh_suidregister +if [ -e /etc/suid.conf -a -x /usr/sbin/suidregister ]; then + suidregister -s sendmail /usr/sbin/sendmail root root 4755 +else + chown root.root /usr/sbin/sendmail + chmod 4755 /usr/sbin/sendmail +fi +# End automatically added section +# Automatically added by dh_suidregister +if [ -e /etc/suid.conf -a -x /usr/sbin/suidregister ]; then + suidregister -s sendmail /usr/sbin/sendmail root root 4755 +else + chown root.root /usr/sbin/sendmail + chmod 4755 /usr/sbin/sendmail +fi +# End automatically added section +# Automatically added by dh_suidregister +if [ -e /etc/suid.conf -a -x /usr/sbin/suidregister ]; then + suidregister -s sendmail /usr/sbin/sendmail root root 4755 +else + chown root.root /usr/sbin/sendmail + chmod 4755 /usr/sbin/sendmail +fi +# End automatically added section +# Automatically added by dh_suidregister +if [ -e /etc/suid.conf -a -x /usr/sbin/suidregister ]; then + suidregister -s sendmail /usr/sbin/sendmail root root 4755 +else + chown root.root /usr/sbin/sendmail + chmod 4755 /usr/sbin/sendmail +fi +# End automatically added section +# Automatically added by dh_suidregister +if [ -e /etc/suid.conf -a -x /usr/sbin/suidregister ]; then + suidregister -s sendmail /usr/sbin/sendmail root root 4755 +else + chown root.root /usr/sbin/sendmail + chmod 4755 /usr/sbin/sendmail +fi +# End automatically added section +# Automatically added by dh_suidregister +if [ -e /etc/suid.conf -a -x /usr/sbin/suidregister ]; then + suidregister -s sendmail /usr/sbin/sendmail root root 4755 +else + chown root.root /usr/sbin/sendmail + chmod 4755 /usr/sbin/sendmail +fi +# End automatically added section +# Automatically added by dh_suidregister +if [ -e /etc/suid.conf -a -x /usr/sbin/suidregister ]; then + suidregister -s sendmail /usr/sbin/sendmail root root 4755 +else + chown root.root /usr/sbin/sendmail + chmod 4755 /usr/sbin/sendmail +fi +# End automatically added section +# Automatically added by dh_suidregister +if [ -e /etc/suid.conf -a -x /usr/sbin/suidregister ]; then + suidregister -s sendmail /usr/sbin/sendmail root root 4755 +else + chown root.root /usr/sbin/sendmail + chmod 4755 /usr/sbin/sendmail +fi +# End automatically added section diff --git a/debian/postrm b/debian/postrm new file mode 100644 index 0000000..2ebac2e --- /dev/null +++ b/debian/postrm @@ -0,0 +1,33 @@ +#!/bin/sh -e +# +# Debian package postrm +# Version 1.2 +# +# Robert Leslie <rob@mars.org> + +case "$1" in + remove) + ;; + + upgrade) + ;; + + purge) + rm -rf /var/spool/mqueue + rm -f /etc/sendmail.cf /etc/aliases.{db,dir,pag} + rm -f /etc/mail/sendmail.{cf,cw,ct,mc}{,.old} + rmdir /etc/mail 2>/dev/null || true + update-rc.d sendmail remove >/dev/null + if [ -e /etc/suid.conf -a -x /usr/sbin/suidunregister ]; then + suidunregister -s sendmail /usr/sbin/sendmail + fi + ;; + + failed-upgrade|abort-install|abort-upgrade|disappear) + ;; + + *) + echo "postrm called with unknown argument \`$1'" >&2 + exit 0 + ;; +esac diff --git a/debian/postrm.debhelper b/debian/postrm.debhelper new file mode 100644 index 0000000..fb8bdab --- /dev/null +++ b/debian/postrm.debhelper @@ -0,0 +1,45 @@ +# Automatically added by dh_suidregister +if [ -e /etc/suid.conf -a -x /usr/sbin/suidunregister ]; then + suidunregister -s sendmail /usr/sbin/sendmail +fi +# End automatically added section +# Automatically added by dh_suidregister +if [ -e /etc/suid.conf -a -x /usr/sbin/suidunregister ]; then + suidunregister -s sendmail /usr/sbin/sendmail +fi +# End automatically added section +# Automatically added by dh_suidregister +if [ -e /etc/suid.conf -a -x /usr/sbin/suidunregister ]; then + suidunregister -s sendmail /usr/sbin/sendmail +fi +# End automatically added section +# Automatically added by dh_suidregister +if [ -e /etc/suid.conf -a -x /usr/sbin/suidunregister ]; then + suidunregister -s sendmail /usr/sbin/sendmail +fi +# End automatically added section +# Automatically added by dh_suidregister +if [ -e /etc/suid.conf -a -x /usr/sbin/suidunregister ]; then + suidunregister -s sendmail /usr/sbin/sendmail +fi +# End automatically added section +# Automatically added by dh_suidregister +if [ -e /etc/suid.conf -a -x /usr/sbin/suidunregister ]; then + suidunregister -s sendmail /usr/sbin/sendmail +fi +# End automatically added section +# Automatically added by dh_suidregister +if [ -e /etc/suid.conf -a -x /usr/sbin/suidunregister ]; then + suidunregister -s sendmail /usr/sbin/sendmail +fi +# End automatically added section +# Automatically added by dh_suidregister +if [ -e /etc/suid.conf -a -x /usr/sbin/suidunregister ]; then + suidunregister -s sendmail /usr/sbin/sendmail +fi +# End automatically added section +# Automatically added by dh_suidregister +if [ -e /etc/suid.conf -a -x /usr/sbin/suidunregister ]; then + suidunregister -s sendmail /usr/sbin/sendmail +fi +# End automatically added section diff --git a/debian/preinst b/debian/preinst new file mode 100644 index 0000000..0a2830d --- /dev/null +++ b/debian/preinst @@ -0,0 +1,25 @@ +#!/bin/sh -e +# +# Debian package preinst +# Version 1.2 +# +# Robert Leslie <rob@mars.org> + +case "$1" in + install) + ;; + + upgrade) + start-stop-daemon --stop --quiet --oknodo \ + --pidfile /var/run/sendmail.pid \ + --exec /usr/sbin/sendmail 2>/dev/null || true + ;; + + abort-upgrade) + ;; + + *) + echo "preinst called with unknown argument \`$1'" >&2 + exit 0 + ;; +esac diff --git a/debian/prerm b/debian/prerm new file mode 100644 index 0000000..6fa8b78 --- /dev/null +++ b/debian/prerm @@ -0,0 +1,20 @@ +#!/bin/sh -e +# +# Debian package prerm +# Version 1.2 +# +# Robert Leslie <rob@mars.org> + +case "$1" in + remove|upgrade|deconfigure) + /etc/init.d/sendmail stop + ;; + + failed-upgrade) + ;; + + *) + echo "prerm called with unknown argument \`$1'" >&2 + exit 0 + ;; +esac diff --git a/debian/rbl.m4 b/debian/rbl.m4 new file mode 100644 index 0000000..0b740b0 --- /dev/null +++ b/debian/rbl.m4 @@ -0,0 +1,14 @@ +divert(0) +VERSIONID(`@(#)rbl.m4 1.2 (RBL) 11/18/97') + +LOCAL_RULESETS +# +# Deny spammers during MAIL command if the IP address of the incoming +# connection is in the RBL map (http://maps.vix.com/rbl/) +# +Scheck_mail +R$* $: $(dequote "" $&{client_addr} $) +R0 $@ OK +R$-.$-.$-.$- $: $(host $4.$3.$2.$1.rbl.maps.vix.com. $: OK $) +ROK $@ OK +R$+ $#error $@ 5.7.1 $: " Mail from " $(dequote "" $&{client_addr}$) " refused, see http://maps.vix.com/rbl/" diff --git a/debian/rblspam.m4 b/debian/rblspam.m4 new file mode 100644 index 0000000..48d6c29 --- /dev/null +++ b/debian/rblspam.m4 @@ -0,0 +1,66 @@ +divert(-1) +# This is a variation on the tradinal RBL filters that dumps email to +# a separate user rather than bouncing it back. It is recommended that +# a user spam be created to recieve the mail. + +# This works as discussed in the web page http://maps.vix.com/ + +# The two ways to use the MAPS RBL are: transfer and inquiry. In +# inquiry mode you start by knowing the IPv4 dotted quad address of +# some host or mail relay, and you use some network protoco l to ask +# MAPS whether that host is listed in the RBL. If the host is so +# listed, you can choose a next step which is appropriate to your site +# security policy. At our site we reject all mail from hosts listed in +# the MAPS RB L, and some of our hosts also route all traffic destined +# for such hosts to a local black hole . + +# The rules below direct all such mail to a designated spam +# user. Please note that this means the mail is not rejected, and the +# spammer has no incentive to stop; the default configuration rejects +# the mail with an error; and this not totally in line with the intent +# of the Mail Abuse Prevention System's Realtime Blackhole List. The +# are trying to make sure the spammers are delibrately +# disconnected. For this reason, I have provided a means of rejecting +# the message (by uncommenting a line) just like the original +# configuration does. + +# Please use this hack after due consideration, this is not for every +# one. + + +# The simplest way to get started using the MAPS RBL to protect your +# mail relay ag ainst theft of service by spammers is to arrange for +# it to make a DNS query (of a stylized name) whenever you receive an +# incoming mail message from a host whose spam status you do not +# know. In Sendmail (version 8.8 or later), this is done using +# configuration rules like these: + + +divert(0) +VERSIONID(`@(#)my_rbl.m4 1.2 (Manoj Srivastava) 1998-02-05') +PUSHDIVERT(6) +# Login of the user selected to recieve all spam +D{SpamUser} ifelse(_ARG_, `', `spam', `_ARG_') +POPDIVERT + + +divert(2) +LOCAL_RULESETS + +S98 +# Try and ensure that the sender is not blacklisted +R$* $: $1 $| $(dequote "" $&{client_addr} $) +R$* $| $1 # no match, restore + +# check with upstream site +R$* $| $-.$-.$-.$- $: $1 $| $(host $5.$4.$3.$2.rbl.maps.vix.com. $: OK $) + +# handle results of lookup +R$* $| OK $1 # no match, restore +R$* $| $1 # no match, restore + +# Comment this line, and un comment the next to actually reject the message +R$* $| $+ ${SpamUser} < @ $j . > # save to spam user +#R$* $| $+ $#error $@ 5.7.1 $: " Mail from " $(dequote "" $&{client_addr} $) " refused, see http://maps.vix.com/rbl/" + +divert(0) diff --git a/debian/rules b/debian/rules new file mode 100755 index 0000000..c5eecb3 --- /dev/null +++ b/debian/rules @@ -0,0 +1,258 @@ +#!/usr/bin/make -f +# -*- makefile -*- +# Debianrules for building a Debian package +# Version 1.5 +# +# These rules have been specifically designed NOT to require root to +# run them. At any time root privileges are required, the command to be +# executed will be made obvious and root's password will be prompted for. +# Of course, root may still run this and no password will be required. +# +# Robert Leslie <rob@mars.org> + +package=sendmail +version=$(shell expr `pwd` : '.*-\([0-9.].*\)') +version_main=$(shell expr `pwd` : '.*-\([0-9]*.[0-9.]*\)') + +LIBS = -ldb -lresolv -lnsl -lwrap +DBMDEF = -DNEWDB -DNIS +ENVDEF = -DHASFLOCK=1 -DTCPWRAPPERS=1 -include $(shell pwd)/debian/el33t.h \ + -I/usr/include/db + +CC=cc +GCC = $(CC) $(HACK) +OFLAGS = -O2 +SHELL=/bin/bash + + +.SILENT: rmail/rmail + +rmail/rmail: + cd rmail && $(GCC) $(OFLAGS) rmail.c -o rmail + + + +.PHONY: man bin + +build: + $(checkdir) +# -ln -sf /usr/include/gdbm-ndbm.h src/ndbm.h + cd src && ./makesendmail sendmail \ + CC="$(GCC)" O="$(OFLAGS)" DBMDEF="$(DBMDEF)" \ + ENVDEF="$(ENVDEF)" INCDIRS="$(INCDIRS)" \ + LIBS="$(LIBS)" LIBDIRS="" + $(MAKE) -C mailstats -f Makefile.dist mailstats \ + CC="$(GCC)" O="$(OFLAGS)" \ + INCDIRS="-I../src" LIBDIRS="" + $(MAKE) -C makemap -f Makefile.dist makemap \ + CC="$(GCC)" O="$(OFLAGS)" \ + INCDIRS="-I../src -I/usr/include/db" \ + LIBDIRS="" LIBS="$(LIBS)" DBMDEF="$(DBMDEF)" + $(MAKE) -C praliases -f Makefile.dist praliases \ + CC="$(GCC)" O="$(OFLAGS)" \ + INCDIRS="-I../src -I/usr/include/db" \ + LIBDIRS="" LIBS="$(LIBS)" +# -$(MAKE) -C mail.local -f Makefile.dist mail.local \ +# CC="$(GCC)" O="$(OFLAGS)" INCDIRS="-I../src" \ +# LIBDIRS="" LIBS="" ENVDEF="-DBSD4_4" + $(MAKE) -C smrsh -f Makefile.dist smrsh \ + CC="$(GCC)" O="$(OFLAGS)" \ + ENVDEF="-DCMDDIR=\\\"/usr/lib/sm.bin\\\" \ + -DPATH=\\\"/usr/bin:/bin\\\"" \ + INCDIRS="-I../src" LIBDIRS="" + $(MAKE) -f debian/rules rmail/rmail + cd doc && { \ + for doc in changes/changes intro/intro op/op usenix/usenix; \ + do test -f $$doc.txt || \ + nroff -me $$doc.me | cat -s > $$doc.txt; done; \ + } + test -f debian/part1 && test -f debian/part2 + cd debian && gcc -o sensible-mda sensible-mda.c + touch build + + +l33ch: + cd debian && \ + wget ftp://rtfm.mit.edu/pub/usenet/news.answers/mail/sendmail-faq/part1 + cd debian && \ + wget ftp://rtfm.mit.edu/pub/usenet/news.answers/mail/sendmail-faq/part2 + + +man: + cp -p debian/runq.1 debian/tmp/usr/man/man1 + cp -p debian/sendmailconfig.8 debian/tmp/usr/man/man8 + cp -p debian/sensible-mda.8 debian/tmp/usr/man/man8 + for file in src/*.[158] mailstats/*.8 makemap/*.8 \ + praliases/*.8 smrsh/*.8 rmail/*.8; do \ + base=$$(basename $$file); \ + ext=$$(echo $$file | sed -e "s/.*\(.\)$$/\1/"); \ + sed -e "s#/usr/adm/sm.bin#/usr/lib/sm.bin#g" \ + -e "s#/etc/sendmail.hf#/usr/lib/sendmail.hf#g" \ + -e "s#/bin:/usr/bin:/usr/ucb#/usr/bin:/bin#g" \ + -e "s#/etc/rc#/etc/init.d/sendmail#g" $$file \ + > debian/tmp/usr/man/man$$ext/$$base; \ + done + install -m 644 contrib/etrn.pl debian/tmp/usr/man/man8/etrn.8 + install -m 644 contrib/expn.pl debian/tmp/usr/man/man8/expn.8 + cp -p checksendmail/address.resolve debian/tmp/usr/doc/$(package) + cp -p checksendmail/checksendmail.8 debian/tmp/usr/man/man8 + + +bin: + install rmail/rmail debian/tmp/usr/bin + cd src && ./makesendmail install-sendmail \ + DESTDIR="$$(pwd)/../debian/tmp" BINGRP="root" + STDIR="$$(pwd)/../debian/tmp/var/log" +# cd debian/tmp && mv etc/sendmail.hf usr/lib + rm -f debian/tmp/etc/sendmail.st + $(MAKE) -s -C mailstats -f Makefile.dist install-mailstats \ + DESTDIR="../debian/tmp" + $(MAKE) -s -C makemap -f Makefile.dist install-makemap \ + DESTDIR="../debian/tmp" + $(MAKE) -s -C praliases -f Makefile.dist install-praliases \ + DESTDIR="../debian/tmp" + $(MAKE) -s -C smrsh -f Makefile.dist install-smrsh \ + BINDIR="../debian/tmp/usr/sbin" +# -$(MAKE) -s -C mail.local -f Makefile.dist install-mail.local \ +# BINDIR="../debian/tmp/usr/sbin" + strip --strip-debug debian/tmp/usr/{bin,sbin}/* + install debian/sendmailconfig debian/sensible-mda debian/tmp/usr/sbin + install debian/runq debian/tmp/usr/bin + sed "s?/usr/local/bin/perl?/usr/bin/perl?g" contrib/etrn.pl \ + > debian/tmp/usr/sbin/etrn + sed "s?/usr/local/bin/perl?/usr/bin/perl?g" contrib/expn.pl \ + > debian/tmp/usr/bin/expn + chmod 755 debian/tmp/usr/sbin/etrn debian/tmp/usr/bin/expn + install checksendmail/checksendmail.perl debian/tmp/usr/sbin/checksendmail + for file in debian/tmp/usr/bin/{hoststat,mailq,newaliases,purgestat} \ + debian/tmp/usr/lib/sendmail; do \ + rm -f $$file && ln -s ../sbin/sendmail $$file; \ + done + + + +hacks: + cd debian && uudecode check.tar.uue + cd debian/tmp/usr/doc/$(package) && tar -xf ../../../../check.tar + cd debian/tmp/usr/doc/$(package)/hack; \ + for file in *; do \ + sed "s/dbm /hash /g" < $$file \ + > ../../../lib/sendmail.cf/hack/$$file; \ + done + sed "s/dbm /hash /g" debian/tmp/usr/doc/$(package)/README.check \ + > debian/tmp/usr/doc/$(package)/README.Spam + rm debian/tmp/usr/doc/$(package)/README.check + rm -r debian/tmp/usr/doc/$(package)/hack/ + cp -p debian/{rbl*,nodns}.m4 debian/tmp/usr/lib/sendmail.cf/hack + + +binary-indep: checkroot + $(checkdir) + +binary-arch: checkroot build + $(checkdir) + rm -rf debian/tmp && install -d debian/tmp + cd debian/tmp && install -d $$(cat ../dirs) + cp debian/{conffiles,control} debian/tmp/DEBIAN + install debian/{pre*,post*} debian/tmp/DEBIAN + + $(MAKE) -f debian/rules man + cp -p doc/*/{*.ps,*.txt} debian/tmp/usr/doc/$(package) + cp -p RELEASE_NOTES debian/tmp/usr/doc/$(package)/changelog +# cp -p debian/changelog \ +# debian/tmp/usr/doc/$(package)/changelog.Debian + cp -p cf/README debian/tmp/usr/doc/$(package)/cf.README + cp -p debian/part1 debian/tmp/usr/doc/$(package)/FAQ-1.txt + cp -p debian/part2 debian/tmp/usr/doc/$(package)/FAQ-2.txt + find debian/tmp/usr/doc/$(package) debian/tmp/usr/man \ + -type f -exec gzip -v9 {} ";" + cd debian/tmp/usr/man/man8 && \ + ln -s sendmail.8.gz ./purgestat.8.gz && \ + ln -s sendmail.8.gz ./hoststat.8.gz + cp -p debian/{README*,copyright} contrib/passwd-to-alias.pl \ + KNOWNBUGS debian/tmp/usr/doc/$(package) + chmod a-x debian/tmp/usr/doc/$(package)/passwd-to-alias.pl + cp debian/debproto.mc debian/tmp/usr/lib/sendmail.cf/cf + cp -p debian/debian.m4 cf/ostype/* \ + debian/tmp/usr/lib/sendmail.cf/ostype + cp -p cf/domain/* debian/tmp/usr/lib/sendmail.cf/domain + cp -a cf/{feature,m4,mailer,sh} debian/tmp/usr/lib/sendmail.cf + + $(MAKE) -f debian/rules bin + $(MAKE) -f debian/rules hacks + install debian/init.d debian/tmp/etc/init.d/$(package) + #install -m 755 debian/ip-up.d debian/tmp/etc/ppp/ip-up.d/$(package) + #install -m 755 debian/ip-down.d debian/tmp/etc/ppp/ip-down.d/$(package) + cp -p debian/{aliases,nssnodns.conf} debian/tmp/etc + + chmod -R u=rwX,go=rX debian/tmp + chown -R root.root debian/tmp + chmod 4755 debian/tmp/usr/sbin/sendmail + chmod 700 debian/tmp/var/state/sendmail + $(MAKE) -s -f debian/rules buildinfo + +# dh_installdocs +# dh_installexamples +# dh_installmenu +# dh_installcron +# dh_installmanpages + dh_installchangelogs +# dh_movefiles + dh_strip +# dh_compress + dh_fixperms + dh_suidregister + dh_installdeb + dh_shlibdeps + dh_gencontrol +# dh_makeshlibs + dh_md5sums + dh_builddeb + + +clean: + $(checkdir) + rm -f build + test ! -d debian/tmp || rm -rf debian/tmp + $(MAKE) -C smrsh -f Makefile.dist clean + $(MAKE) -C praliases -f Makefile.dist clean + $(MAKE) -C makemap -f Makefile.dist clean + $(MAKE) -C mailstats -f Makefile.dist clean + $(MAKE) -C mail.local -f Makefile.dist clean + rm -f doc/{changes/changes,intro/intro,op/op,usenix/usenix}.txt + rm -rf rmail/rmail stamp-build $$(find . -name "*~") src/obj.* + rm -rf $$(find debian/* -type d) $$(find src makemap -type l) + rm -rf debian/{files*,*substvars*} debian/{check.tar,sensible-mda} + find .. -name $(package)*.asc -size 0 -maxdepth 1 -exec rm {} ";" + chmod +x debian/{pre*,post*,runq,sendmailconfig} + + +buildinfo: + @echo; dpkg -l gcc "libc6*" binutils ldso make dpkg-dev $(BUILDINFO) \ + | awk '$$1 == "ii" { printf("%s-%s\n", $$2, $$3) }' \ + | tee debian/tmp/usr/doc/$(package)/buildinfo.Debian; echo + chmod 644 debian/tmp/usr/doc/$(package)/buildinfo.Debian +# cd debian/tmp && md5sum $$(find * -type f -not -regex "DEBIAN/.*") \ +# > DEBIAN/md5sums +# rm -f debian/tmp/files.sig +# -cd debian/tmp && pgp -sat +clearsig=on DEBIAN/md5sums -o files.sig \ +# && chmod 644 files.sig \ +# && mv -v files.sig usr/doc/$(package)/checksums.txt + + +define checkdir + test -f debian/rules +endef + +# Below here is fairly generic really + +binary: binary-indep binary-arch + +source diff: + @echo >&2 'source and diff are obsolete - use dpkg-source -b'; false + +checkroot: + $(checkdir) + test root = "`whoami`" + +.PHONY: binary binary-arch binary-indep clean checkroot diff --git a/debian/runq b/debian/runq new file mode 100644 index 0000000..b68b35a --- /dev/null +++ b/debian/runq @@ -0,0 +1,26 @@ +#!/bin/sh + +usage="Usage: $0 [OPTION]... +Run the sendmail queue (sendmail -q) + + --help display this help and exit + --version output version information and exit + +Report bugs to submit@bugs.debian.org" + +case $# in + 1 ) + case "z${1}" in + z--help ) + echo "$usage"; exit 0 ;; + z--version ) + echo -n "runq (Debian GNU/Linux) 1.00. "; + echo "Copyright (c) 1997 Johnie Ingram. >= GNU GPL 2." + exit 0 ;; + * ) ;; + esac + ;; + * ) ;; +esac + +exec /usr/sbin/sendmail -q $* diff --git a/debian/runq.1 b/debian/runq.1 new file mode 100644 index 0000000..99f97a9 --- /dev/null +++ b/debian/runq.1 @@ -0,0 +1,31 @@ +.TH TRUE 1 "1997 July 20" "Debian Distribution" \" -*- nroff -*- +.SH NAME +runq \- run the sendmail queue +.SH SYNOPSIS +.B runq +.br +.B runq +.I sendmail options +.br +.B runq +{ \-\-help, \-\-version } +.SH DESCRIPTION +This +.B runq +command is a wrapper around sendmail which tells it to run the mail +queue in the background. +.SH OPTIONS +When called with exactly one argument, the following options are +handled internally: +.TP +.I "\-\-help" +Print a usage message on standard output and exit successfully. +.TP +.I "\-\-version" +Print version information on standard output then exit successfully. +.P +In other cases, the options are simply passed on to +.B sendmail -q. +.SH "SEE ALSO" +.LP +.BR sendmail (8). diff --git a/debian/sendmail-8.8.5-tcpwrap b/debian/sendmail-8.8.5-tcpwrap new file mode 100644 index 0000000..1cf0971 --- /dev/null +++ b/debian/sendmail-8.8.5-tcpwrap @@ -0,0 +1,82 @@ + + PREVENT UNAUTHORIZED USE OF YOUR HOSTS AS SMTP RELAY + + Miquel van Smoorenburg <miquels@cistron.nl> 14-Jun-1996 + +The patch at the end of this file adds a new option to sendmail, +`W' or `TcpWrappers'. This makes it possible for precompiled distributions +to ship binaries compiled with -DTCPWRAPPERS without any unexpected +side-effects, since the option is off by default. + +Here's the diff to the sendmail-8.8.5 source: + +diff -ru sendmail-8.8.5.orig/src/conf.c sendmail-8.8.5/src/conf.c +--- sendmail-8.8.5.orig/src/conf.c Tue Jan 21 16:47:13 1997 ++++ sendmail-8.8.5/src/conf.c Tue Jun 3 14:26:44 1997 +@@ -4026,7 +4029,8 @@ + return FALSE; + + #if TCPWRAPPERS +- if (!hosts_ctl("sendmail", hostname, anynet_ntoa(sap), STRING_UNKNOWN)) ++ if (TcpWrappers && ++ !hosts_ctl("sendmail", hostname, anynet_ntoa(sap), STRING_UNKNOWN)) + { + # ifdef LOG + if (LogLevel >= 4) +diff -ru sendmail-8.8.5.orig/src/readcf.c sendmail-8.8.5/src/readcf.c +--- sendmail-8.8.5.orig/src/readcf.c Wed Jan 15 02:51:29 1997 ++++ sendmail-8.8.5/src/readcf.c Tue Jun 3 15:19:48 1997 +@@ -1424,6 +1424,9 @@ + { "FallbackMXhost", 'V', FALSE }, + { "Verbose", 'v', TRUE }, + { "TryNullMXList", 'w', FALSE }, ++#ifdef TCPWRAPPERS ++ { "TcpWrappers", 'W', TRUE }, ++#endif + { "QueueLA", 'x', FALSE }, + { "RefuseLA", 'X', FALSE }, + { "RecipientFactor", 'y', FALSE }, +@@ -2069,6 +2072,11 @@ + break; + + /* 'W' available -- was wizard password */ ++#ifdef TCPWRAPPERS ++ case 'W': ++ TcpWrappers = atobool(val); ++ break; ++#endif + + case 'x': /* load avg at which to auto-queue msgs */ + QueueLA = atoi(val); +diff -ru sendmail-8.8.5.orig/src/sendmail.8 sendmail-8.8.5/src/sendmail.8 +--- sendmail-8.8.5.orig/src/sendmail.8 Fri Jan 17 00:25:50 1997 ++++ sendmail-8.8.5/src/sendmail.8 Tue Jun 3 15:03:28 1997 +@@ -432,6 +432,15 @@ + This may not be available if your sendmail does not have the + .Dv USERDB + option compiled in. ++.It Li TcpWrappers ++Use the ++.Dv sendmail ++entry in ++.Pa /etc/hosts.allow ++to decide if the remote host has access to the SMTP port. ++This may not be available if your sendmail does not have the ++.Dv TCPWRAPPERS ++option compiled in. + .It Li ForkEachJob + Fork each job during queue runs. + May be convenient on memory-poor machines. +diff -ru sendmail-8.8.5.orig/src/sendmail.h sendmail-8.8.5/src/sendmail.h +--- sendmail-8.8.5.orig/src/sendmail.h Wed Jan 15 02:51:29 1997 ++++ sendmail-8.8.5/src/sendmail.h Tue Jun 3 14:25:43 1997 +@@ -1168,6 +1168,9 @@ + #ifdef _FFR_DSN_RRT + EXTERN bool RrtImpliesDsn; /* turn Return-Receipt-To: into DSN */ + #endif ++#ifdef TCPWRAPPERS ++EXTERN bool TcpWrappers; /* Use tcp wrappers for access control. */ ++#endif + EXTERN bool IgnoreHostStatus; /* ignore long term host status files */ + EXTERN bool SingleThreadDelivery; /* single thread hosts on delivery */ + EXTERN bool UnsafeGroupWrites; /* group-writable files are unsafe */ diff --git a/debian/sendmail-8.8.8-ismx-4 b/debian/sendmail-8.8.8-ismx-4 new file mode 100644 index 0000000..7185096 --- /dev/null +++ b/debian/sendmail-8.8.8-ismx-4 @@ -0,0 +1,161 @@ + + PREVENT UNAUTHORIZED USE OF YOUR HOSTS AS SMTP RELAY + + Miquel van Smoorenburg <miquels@cistron.nl> 03-Mar-1998 + +This patch adds a new map type to sendmail-8.8.8, called "ismx". That +maps checks if we (all names in class 'w') are an MX for a certain domain. +If so, the input hostname is replaced by our hostname, or TEMPFAIL if the DNS +lookup failed. + +This can be used together with the "check_rcpt" rule to deny relaying for +domains for which we are officially not an MX, without listing all domains +in a configuration file. This prevents that your host is being used as +a spam relay. However your host will still relay for hosts that it is +officially an MX for, without any extra administration. + +Ofcourse you can put a list of IP numbers/networks in the file "LocalIP" +to list hosts that may use your host as relay or smarthost. This is +useful for a machine that is used internally as SMTP relay, for e.g. +Eudora or Pegasus mail clients. The fields in this file are used with +a substring match; for example 192.168 will match 192.168.0.0/16, +192.168.1 will match 192.168.1.0/24 and 192.168.1.2 will only match +that specific IP address. One entry per line. + +If you want to add some more hosts/domains you relay for but which +do not have an MX entry pointing at your server, or which are not +in class `w', you can put them in the file "RelayTo". + +Both files (LocalIP and RelayTo) must exist, even if they are otherwise +empty. Comments (using `#') are allowed. + + +These are the sendmail rules, with thanks to Niels Bakker <niels@euro.net> + +8.8.8-2 Documentation update, rules rewrite +8.8.8-3 Allow <@a,b:user@c> in MAIL FROM: +8.8.8-4 Use ismx map to differentiate between soft and hard lookup + errors in Scheck_mail + +LOCAL_CONFIG +Kismx ismx +F{LocalIP} /etc/mail/LocalIP +FR /etc/mail/RelayTo + +LOCAL_RULESETS +Scheck_mail +# +# Check that the domain name is valid. +# +R< @ $+ : $+ @ $+ > $: < $2 @ $3 > Strip SMTP route-addr +R<$*@$=w> $@ <OK> shortcut (class w) +R$- $@ <OK> local host +R<> $@ <OK> bounce +R$* $: <?> $>3 $1 canonify +R<?> $* < @ $+ . > $: $1 < @ $2 > qualified +R<?> $* < @ $+ > $: <?> $(ismx $2 $: NOMX $) +R<?> TEMPFAIL $# error $@ 4.5.1 $: 451 Cannot resolve that - try again later. +R<?> $* $# error $@ 5.7.1 $: 571 Invalid host name + +Scheck_rcpt +# +# Local users (LocalIP) can relay anywhere. +# +R$+ $: $(dequote "" $&{client_addr} $) $| $1 +R0 $| $* $@ <OK> no client addr: directly invoked +R$={LocalIP}$* $| $* $@ <OK> from here +R$* $| $* $: $2 undo damage +# +# Anything terminating locally is also OK. +# +R$* $: $>Parse0 $>3 $1 +R$+ < @ $* . > $* $: $1 < @ $2 > +R$+ < @ $=w > $@ <OK> we deliver +R$+ < @ $=R > $@ <OK> we relay +# +# See if we are MX for this host +# +R$+ < $* @ $+ > $* $: $1 < $2 @ $(ismx $3 $: NOMX $) > $4 +R$+ < $* @ NOMX > $* $# error $@ 5.7.1 $: 571 I do not relay for that address. +R$+ < $* @ TEMPFAIL > $* $# error $@ 4.5.1 $: 451 Cannot resolve target domain. +R$* $@ <OK> + + +Note that if the MX lookup fails, a temporary rather than a fatal error +code is returned so that the message will not get lost. + +Here's the diff to the sendmail-8.8.8 source. Note that if you are +running Debian/Linux, the sendmail-8.8.8 package already has this patch +incorporated. + + +diff -u --recursive --new-file sendmail-8.8.8.orig/src/conf.c sendmail-8.8.8/src/conf.c +--- sendmail-8.8.8.orig/src/conf.c Mon Oct 20 17:41:38 1997 ++++ sendmail-8.8.8/src/conf.c Mon Jan 12 11:24:15 1998 +@@ -368,6 +368,10 @@ + MAPDEF("bestmx", NULL, MCF_OPTFILE, + map_parseargs, null_map_open, null_map_close, + bestmx_map_lookup, null_map_store); ++ ++ MAPDEF("ismx", NULL, MCF_OPTFILE, ++ map_parseargs, null_map_open, null_map_close, ++ ismx_map_lookup, null_map_store); + #endif + + MAPDEF("host", NULL, 0, +diff -u --recursive --new-file sendmail-8.8.8.orig/src/domain.c sendmail-8.8.8/src/domain.c +--- sendmail-8.8.8.orig/src/domain.c Sat Aug 2 20:06:53 1997 ++++ sendmail-8.8.8/src/domain.c Mon Jan 12 11:24:15 1998 +@@ -481,6 +481,52 @@ + return map_rewrite(map, mxhosts[0], strlen(mxhosts[0]), av); + } + /* ++** ISMX -- find if we are the MX for a certain host. ++** ++** This is really a hack, but I don't see any obvious way ++** to generalize it at the moment. ++*/ ++ ++char * ++ismx_map_lookup(map, name, av, statp) ++ MAP *map; ++ char *name; ++ char **av; ++ int *statp; ++{ ++ int nmx, i, len; ++ auto int rcode; ++ int saveopts = _res.options; ++ char *mxhosts[MAXMXHOSTS + 1]; ++ char *mymx = NULL; ++ ++ _res.options &= ~(RES_DNSRCH|RES_DEFNAMES); ++ nmx = getmxrr(name, mxhosts, FALSE, &rcode); ++ _res.options = saveopts; ++ if (rcode != EX_TEMPFAIL) { ++ if (nmx <= 0) ++ return NULL; ++ for(i = 0; i < nmx; i++) { ++ len = strlen(mxhosts[i]); ++ if (len && mxhosts[i][len - 1] == '.') ++ mxhosts[i][len - 1] = 0; ++ if (wordinclass(mxhosts[i], 'w')) { ++ mymx = mxhosts[i]; ++ break; ++ } ++ } ++ if (mymx == NULL) ++ return NULL; ++ } else ++ mymx = "TEMPFAIL"; ++ ++ if (bitset(MF_MATCHONLY, map->map_mflags)) ++ return map_rewrite(map, name, strlen(name), NULL); ++ else ++ return map_rewrite(map, mymx, strlen(mymx), av); ++} ++ ++/* + ** DNS_GETCANONNAME -- get the canonical name for named host using DNS + ** + ** This algorithm tries to be smart about wildcard MX records. diff --git a/debian/sendmailconfig b/debian/sendmailconfig new file mode 100644 index 0000000..3d44a9e --- /dev/null +++ b/debian/sendmailconfig @@ -0,0 +1,566 @@ +#!/bin/sh -e +# +# Interactively configure Sendmail for Debian +# +# Robert Leslie <rob@mars.org> + +PATH="/usr/sbin:/usr/bin:/sbin:/bin" + +reload="yes" +umask 022 + +############################################################################### + +while [ $# -gt 0 ] +do + case "$1" in + --no-reload) + reload="" + shift + ;; + + *) + echo "Usage: $0 [--no-reload]" >&2 + exit 1 + ;; + esac +done + +############################################################################### + +descrip() { + echo "" + echo "$1" + echo "$1" | sed -e 's/./-/g' + cat - + echo "" +} + +yesno() { + local N="N" Y="Y" + local q="$1" def=$(eval "echo -n \$$2") + + while : + do + echo -n "$q? [$def] " + read REPLY + REPLY=$(echo -n "$REPLY" | sed -e "s/^\ *//" -e "s/^\t*//") + test -n "$REPLY" || REPLY="$def" + + case "$REPLY" in + [Yy]*) + echo yes > /dev/null + eval "$2=\"Y\"" + return 0 + ;; + + [Nn]*) + echo no > /dev/null + eval "$2=\"N\"" + return 1 + ;; + esac + done +} + +input() { + local q="$1" def=$(eval "echo -n \$$2") + + echo -n "$q? [$def] " + read REPLY + REPLY=$(echo "$REPLY" | sed -e 's/^[ ]*//' -e 's/[ ]*$//' | cat) + test -n "$REPLY" || REPLY="$def" + + if [ NONE = "$3" ] + then + test NONE != "$REPLY" || REPLY="" + fi + + eval "$2=\"$REPLY\"" +} + +testconfig() { + CONFIG=$(grep "$1" /etc/mail/sendmail.mc 2>/dev/null) +} + +makecf() { + echo "Generating /etc/mail/sendmail.cf from /etc/mail/sendmail.mc ..." + m4 /usr/lib/sendmail.cf/m4/cf.m4 /etc/mail/sendmail.mc \ + >/etc/mail/sendmail.cf.new + mv -f /etc/mail/sendmail.cf.new /etc/mail/sendmail.cf + + echo "Updating alias database ..." + newaliases + + if [ "$reload" ] && \ + yesno "Reload the running sendmail now with the new configuration" Y + then + echo "Reloading sendmail ..." + /etc/init.d/sendmail reload >/dev/null + fi +} + +############################################################################### + +if [ -f /etc/mail/sendmail.mc ] +then + if yesno "Configure sendmail with the existing /etc/mail/sendmail.mc" Y + then + makecf + exit 0 + fi +fi + +############################################################################### + +exec 3>/etc/mail/sendmail.mc.new +trap "rm -f /etc/mail/sendmail.mc.new" 0 + +############################################################################### + +descrip "Sendmail Configuration" <<EOT +By answering the following questions, you can configure sendmail for your +system. Default values are determined either by your existing configuration +or from common usage. +EOT + +echo -n "Press [ENTER] " +read REPLY + +cat /usr/lib/sendmail.cf/cf/debproto.mc >&3 + +############################################################################### + +descrip "Mail Name" <<EOT +Your \`mail name' is the hostname portion of the address to be shown on +outgoing news and mail messages (following the username and @ sign). This +name will be used by other programs besides sendmail; it should be the single, +full domain name (FQDN) from which mail will appear to originate. +EOT + +mailname=$(cat /etc/mailname 2>/dev/null || hostname --fqdn) +input "Mail name" mailname + +echo "$mailname" >/etc/mailname + +############################################################################### + +descrip "Null Client" <<EOT +A special configuration known as the "null client" can be created for this +host if all mail should be forwarded to a central hub via a local SMTP-based +network. This may be a suitable configuration if you want to forward all of +your mail to your local Internet service provider (ISP) for delivery. + +To enable this option, give the name of the host to which all mail should be +forwarded. Otherwise leave the option empty or answer \`NONE' to disable it. +EOT + +nullclient="" +! testconfig "FEATURE(nullclient" || + nullclient=$(echo -n "$CONFIG" | sed -e 's/[^,]*, *\([^)]*\).*/\1/') + +input "Null client forward host" nullclient NONE + +test -z "$nullclient" || echo "FEATURE(nullclient, $nullclient)dnl" >&3 + +############################################################################### + +descrip "Address Canonification" <<EOT +Usually sendmail will canonify all addresses by consulting a name server and +resolving hosts to their fully qualified domain name (FQDN). Under special +circumstances you may want to disable this feature, for example if this +machine acts only as a mail gateway. +EOT + +test -z "$nullclient" || cat <<EOT +Since this host will be configured as a null client, this option controls +whether addresses will be qualified with \`$mailname' when +sent to the central hub via SMTP. Disabling this feature may cause mail to +appear to come from (and be qualified by the domain for) the hub machine +rather than this host. + +EOT + +nocanonify="N" +! testconfig "FEATURE(nocanonify)" || nocanonify="Y" + +! yesno "Disable address canonification" nocanonify || + echo "FEATURE(nocanonify)dnl" >&3 + +############################################################################### + +if [ -z "$nullclient" ] +then + +############################################################################### + +descrip "SMTP Mailer" <<EOT +If you plan to exchange mail with other computers, you should enable the +SMTP mailer. Even if you don't plan to exchange mail with other computers, +it is still a good idea to enable this so local programs can use it. +EOT + +smtp="Y" +if [ -f /etc/mail/sendmail.mc ] +then + testconfig "MAILER(smtp)" || smtp="N" +fi + +yesno "Enable the SMTP mailer" smtp || true + +############################################################################### + +descrip "Masquerade Envelope" <<EOT +If you want mail envelopes (as well as mail headers) to appear to come from +\`$mailname', you can enable this option. +EOT + +masqenvelope="Y" +if [ -f /etc/mail/sendmail.mc ] +then + testconfig "FEATURE(masquerade_envelope)" || masqenvelope="N" +fi + +! yesno "Masquerade envelopes" masqenvelope || + echo "FEATURE(masquerade_envelope)dnl" >&3 + +############################################################################### + +descrip "All Masquerade" <<EOT +If enabled, this feature will cause recipient addresses to also appear to come +from \`$mailname'. Normally they get the local hostname. +Although this may be right for ordinary users, it can break local aliases. For +example, if you send to "localalias", the originating sendmail will find that +alias and send to all members, but send the message with +"To: localalias@$mailname". Since that alias likely does +not exist, replies will fail. Use this feature ONLY if you can guarantee that +the ENTIRE namespace of \`$mailname' supersets all the +local entries. If in doubt, it is safe to leave this option disabled. +EOT + +allmasquerade="N" +! testconfig "FEATURE(allmasquerade)" || allmasquerade="Y" + +! yesno "All masquerade" allmasquerade || + echo "FEATURE(allmasquerade)dnl" >&3 + +############################################################################### + +descrip "Always Add Domain" <<EOT +If enabled, the local host domain is included even on locally delivered mail. +Normally it is not added unless it is already present. +EOT + +alwaysdomain="N" +! testconfig "FEATURE(always_add_domain)" || alwaysdomain="Y" + +! yesno "Always add domain" alwaysdomain || + echo "FEATURE(always_add_domain)dnl" >&3 + +############################################################################### + +descrip "Mail Acceptance" <<EOT +Sendmail is usually configured to accept mail for your mail name +($mailname). However, under special circumstances you +may not wish sendmail to do this, particularly if (and disabling this option +generally requires that) mail for \`$mailname' is MXed +to another host. If in doubt, it is safe to leave this option enabled. +EOT + +acceptmailname="Y" +if [ -f /etc/mail/sendmail.mc ] +then + testconfig "^Cw.*$mailname" || acceptmailname="N" +fi + +yesno "Accept mail for \`$mailname'" acceptmailname || true + +############################################################################### + +descrip "Alternate Names" <<EOT +In addition to the canonical mail name \`$mailname', you can +add any number of additional alternate names to recognize for receiving mail. +If other hosts are MXed to you for local mail, this is where you should list +them. This list is saved into the file /etc/mail/sendmail.cw so it can be +changed later as needed. + +To answer this question, separate each alternate name with a space, or answer +\`NONE' to eliminate all alternate names. +EOT + +altnames=$(cat /etc/mail/sendmail.cw 2>/dev/null | tr -s '\n \t' ' ' | + sed -e 's/^ *//' -e 's/ *$//') +input "Alternate names" altnames NONE + +if [ -n "$altnames" ] +then + echo "$altnames" | tr -s ' \t' '\n' >/etc/mail/sendmail.cw +else + cat /dev/null >/etc/mail/sendmail.cw +fi + +echo "FEATURE(use_cw_file)dnl" >&3 + +############################################################################### + +descrip "Trusted Users" <<EOT +Sendmail allows a special group of users to set their envelope "From" address +using the -f option without generating a warning message. If you have +software such as Majordomo installed, you will want to include the usernames +from such software here. Note that "root", "daemon", and "uucp" are included +automatically and do not need to be specified. This list is saved into the +file /etc/mail/sendmail.ct so it can be changed later as needed. + +To answer this question, separate each username with a space, or answer +\`NONE' to eliminate all usernames. +EOT + +trusted=$(cat /etc/mail/sendmail.ct 2>/dev/null | tr -s '\n \t' ' ' | + sed -e 's/^ *//' -e 's/ *$//') +input "Trusted users" trusted NONE + +if [ -n "$trusted" ] +then + echo "$trusted" | tr -s ' \t' '\n' >/etc/mail/sendmail.ct +else + cat /dev/null >/etc/mail/sendmail.ct +fi + +echo "FEATURE(use_ct_file)dnl" >&3 + +############################################################################### + +descrip "Redirect Feature" <<EOT +If enabled, this feature will allow you to alias old names to +<new-address>.REDIRECT, causing sendmail to return mail to the sender with +an error but indicating the recipient's new address. +EOT + +redirect="N" +! testconfig "FEATURE(redirect)" || redirect="Y" + +! yesno "Enable redirect option" redirect || echo "FEATURE(redirect)dnl" >&3 + +############################################################################### + +descrip "UUCP Addresses" <<EOT +Sendmail can be configured to be smart about UUCP addresses, or it can do +nothing special with UUCP addresses at all. If you care about UUCP, you will +need to do some additional configuration, perhaps outside of this script. +EOT + +uucp="N" +if [ -f /etc/mail/sendmail.mc ] +then + testconfig "FEATURE(nouucp)" || uucp="Y" +fi + +yesno "Enable UUCP addressing" uucp || echo "FEATURE(nouucp)dnl" >&3 + +############################################################################### + +descrip "Sticky Host" <<EOT +If enabled, mail sent to \`user@$mailname' is marked as +"sticky" -- that is, the local addresses aren't matched against UDB and don't +go through ruleset 5. This is used if you want a setup where \`user' is not +necessarily the same as \`user@$mailname', e.g., to make +a distinct domain-wide namespace. If in doubt, it is safe to leave this +option disabled. +EOT + +sticky="N" +! testconfig "FEATURE(stickyhost)" || sticky="Y" + +! yesno "Enable sticky host option" sticky || echo "FEATURE(stickyhost)dnl" >&3 + +############################################################################### + +descrip "DNS" <<EOT +If you are directly connected to the Internet and have access to a domain +name server, you should enable this option. +EOT + +dns="Y" +! testconfig "FEATURE(nodns)" || dns="N" + +yesno "Enable DNS" dns || echo "FEATURE(nodns)dnl" >&3 + +############################################################################### + +if [ Y = "$dns" ] +then + +############################################################################### + +descrip "Best MX is Local" <<EOT +If enabled, this option will cause sendmail to accept mail as though locally +addressed for any host that lists this machine as the best possible MX record. +This generates additional DNS traffic, but should be OK for low-to-medium +traffic hosts. N.B.: This feature is fundamentally incompatible with wildcard +MX records. If you have a wildcard MX record that matches your domain, you +cannot use this feature. +EOT + +bestmxlocal="N" +! testconfig "FEATURE(bestmx_is_local)" || bestmxlocal="Y" + +! yesno "Assume best MX is local" bestmxlocal || + echo "FEATURE(bestmx_is_local)dnl" >&3 + +############################################################################### + +fi # finished DNS configuration + +############################################################################### + +descrip "Mailertable" <<EOT +If enabled, this option causes sendmail to read mail routing rules from +the text file /etc/mail/mailertable. This is needed for unusual mailers like +ifmail and fax programs. More information is in /usr/doc/sendmail/op.txt.gz. +EOT + +mailertable="N" +! testconfig "FEATURE(mailertable" || mailertable="Y" + +! yesno "Enable the mailertable feature" mailertable || + echo "FEATURE(mailertable, \`text /etc/mail/mailertable')dnl" >&3 + +############################################################################### + +descrip "Sendmail Restricted Shell" <<EOT +If enabled, this option causes sendmail to use the sendmail restricted shell +program (smrsh) instead of /bin/sh for mailing to programs. This improves your +ability to control what gets run via email; only those programs which appear +in a special directory can be run. If you enable this option, please carefully +read the smrsh(8) man page for further information. +EOT + +smrsh="N" +! testconfig "FEATURE(smrsh" || smrsh="Y" + +! yesno "Use the Sendmail Restricted Shell (smrsh)" smrsh || + echo "FEATURE(smrsh, \`/usr/sbin/smrsh')dnl" >&3 + +############################################################################### + +descrip "Mailer Name" <<EOT +You can change the name used for internally generated outgoing messages. +Usually this is \`MAILER-DAEMON' but it would not be unreasonable to change +it to something such as \`postmaster'. +EOT + +daemon="MAILER-DAEMON" +! testconfig "confMAILER_NAME" || + daemon=$(echo -n "$CONFIG" | sed -e 's/[^,]*, *`\([^'"'"']*\).*/\1/') + +input "Mailer name" daemon + +test "MAILER-DAEMON" = "$daemon" || + echo "define(\`confMAILER_NAME', \`$daemon')dnl" >&3 + +############################################################################### + +descrip "Me Too" <<EOT +Sendmail normally excludes the sender address from group expansion. Enabling +this option will cause the sender to be included. +EOT + +metoo="N" +! testconfig "confME_TOO.*True" || metoo="Y" + +! yesno "Enable me too option" metoo || + echo "define(\`confME_TOO', True)dnl" >&3 + +############################################################################### + +descrip "Message Timeouts" <<EOT +Sendmail will issue a warning message to the sender if it can't deliver a +message within a reasonable amount of time. It will also send a failure +notification and give up trying to deliver the message if it can't deliver it +after an unreasonable amount of time. + +You can configure the message timeouts after which warning and failure +notifications are sent. Sendmail's defaults are 4 hours and 5 days (4h/5d), +respectively, but many people feel warnings after only 4 hours are premature. +EOT + +qw="4h" +! testconfig "confTO_QUEUEWARN" || + qw=$(echo -n "$CONFIG" | sed -e 's/[^,]*, *`\([^'"'"']*\).*/\1/') + +qr="5d" +! testconfig "confTO_QUEUERETURN" || + qr=$(echo -n "$CONFIG" | sed -e 's/[^,]*, *`\([^'"'"']*\).*/\1/') + +timeouts="$qw/$qr" + +input "Message timeouts" timeouts + +qw=$(expr "$timeouts" : '\([^/]*\)/') +qr=$(expr "$timeouts" : '[^/]*/\(.*\)') + +test "4h" = "$qw" || echo "define(\`confTO_QUEUEWARN', \`$qw')dnl" >&3 +test "5d" = "$qr" || echo "define(\`confTO_QUEUERETURN', \`$qr')dnl" >&3 + +############################################################################### + +echo "MAILER(local)dnl" >&3 + +test "N" = "$smtp" || echo "MAILER(smtp)dnl" >&3 +test "N" = "$acceptmailname" || echo "Cw$mailname" >&3 + +############################################################################### + +if [ -e /etc/ifmail/config ] && [ -e /usr/lib/sendmail.cf/mailer/ifmail.m4 ]; +then + echo "MAILER(ifmail)dnl" >&3 +fi + +############################################################################### + +fi # finished non-"null client" configuration + +echo "MASQUERADE_AS($mailname)dnl" >&3 + +############################################################################### + +echo "" >&3 + +if [ -f /etc/mail/sendmail.mc ] +then + sed -n -e '/^## Custom/,$p' /etc/mail/sendmail.mc >&3 +else + echo "## Custom configurations below (will be preserved)" >&3 +fi + +descrip "Configuration Complete" <<EOT +Advanced configuration, such as alternate mailers, the use of mailertables, +Bitnet domains, and UUCP domains can be accomplished by manually editing the +/etc/mail/sendmail.mc configuration file and rerunning +\`$0' to generate the appropriate /etc/mail/sendmail.cf +file. (Local changes made at the end of /etc/mail/sendmail.mc will be +preserved by \`$0'.) + +The m4 library files for sendmail configuration are kept in the +/usr/lib/sendmail.cf directory. You may wish to review the documentation in +/usr/doc/sendmail to assist in further customization. + +You may wish to customize your alias database; see the aliases(5) man page +for information on the format and use of the /etc/aliases file. +EOT + +############################################################################### + +exec 3>&- + +if [ -f /etc/mail/sendmail.mc ] +then + echo "Saving old /etc/mail/sendmail.mc as /etc/mail/sendmail.mc.old ..." + mv -f /etc/mail/sendmail.mc /etc/mail/sendmail.mc.old +fi + +mv -f /etc/mail/sendmail.mc.new /etc/mail/sendmail.mc +trap 0 + +makecf +exit 0 diff --git a/debian/sendmailconfig.8 b/debian/sendmailconfig.8 new file mode 100644 index 0000000..b2cd52c --- /dev/null +++ b/debian/sendmailconfig.8 @@ -0,0 +1,41 @@ +.TH SENDMAILCONFIG 8 21-Jan-1997 +.SH NAME +sendmailconfig \- configure sendmail for Debian systems +.SH SYNOPSIS +sendmailconfig [--no-reload] +.SH DESCRIPTION +.B sendmailconfig +is used to simplify the configuration of sendmail(8) for use on Debian +systems. +.PP +In the simplest case, you may run this program to (re)configure sendmail for +your Debian system at any time. It will modify the file /etc/mail/sendmail.mc +in order to create a working sendmail configuration which will be written to +the file /etc/mail/sendmail.cf. +.PP +For advanced configurations, you can modify the sendmail.mc file before +generating sendmail.cf. Future invokations of +.B sendmailconfig +will preserve these changes provided they are made at the end of the file. +.PP +Normally +.B sendmailconfig +will ask if you want to reload sendmail after making changes to its +configuration. The --no-reload option will avoid this question. +.SH FILES +.TP +/etc/mail/sendmail.mc +sendmail m4 input to generate sendmail.cf +.TP +/etc/mail/sendmail.cf +actual sendmail configuration file +.TP +/etc/mail/sendmail.cw +names for which we will accept mail in the standard configuration +.TP +/etc/mail/sendmail.ct +names of trusted users in the standard configuration +.SH SEE ALSO +sendmail(8) +.SH AUTHOR +Robert Leslie <rob@mars.org> diff --git a/debian/sensible-mda.8 b/debian/sensible-mda.8 new file mode 100644 index 0000000..89e3009 --- /dev/null +++ b/debian/sensible-mda.8 @@ -0,0 +1,28 @@ +.TH SENDMAILCONFIG 8 21-Jan-1997 +.SH NAME +sensible-mda - generic sendmail local MDA for Debian systems +.SH SYNOPSIS +sensible-mda +.SH DESCRIPTION +.B sensible-mda +is used to simplify the configuration of sendmail(8) for use on Debian +systems. +.PP +.B sensible-mda +is called by sendmail as a local mailer when the following exists in +sendmail.mc: +define(`LOCAL_MAILER_ARGS', `sensible-mda $g $u ${client_addr}')dnl +.PP +This program is included so that sendmail can function with either procmail +or deliver as its MDA (with procmail taking precedence). +.SH FILES +.TP +/etc/mail/sendmail.mc +sendmail m4 input to generate sendmail.cf +.TP +/etc/mail/sendmail.cf +actual sendmail configuration file +.SH SEE ALSO +sendmail(8) +.SH AUTHOR +Richard Nelson <cowboy@debian.org> diff --git a/debian/sensible-mda.c b/debian/sensible-mda.c new file mode 100644 index 0000000..e9afa31 --- /dev/null +++ b/debian/sensible-mda.c @@ -0,0 +1,62 @@ +/* + * sensible-mda.c + * Copyright (c) 1998, Johnie Ingram. + * Copyright (c) 1998, Richard Nelson <cowboy@debian.org>. + * Time-stamp: <1998/06/16 14:28:33 cowboy> + * + * 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., 675 Mass Ave, Cambridge, MA 02139, USA. + * + */ + +#include <stdio.h> +#include <sys/stat.h> +#include <unistd.h> + +// TODO: declare -x TCPREMOTEIP="$3" + +#define PROCMAIL "/usr/bin/procmail" +#define DELIVER "/usr/bin/deliver" + +static struct stat MDA_stat; +static int done = 1; + +int +main (int argc, char *argv[]) +{ + + if (!stat(PROCMAIL, &MDA_stat)) { + if (MDA_stat.st_mode & S_ISUID) { + done = 0; + execl (PROCMAIL, PROCMAIL, "-t", "-Y", "-f", + argv[1], "-d", argv[2], NULL); + } + else + fprintf(stderr, "Ack!?! %s is not setuid!\n", PROCMAIL); + } + + if (done && !stat(DELIVER, &MDA_stat)) { + if (MDA_stat.st_mode & S_ISUID) { + done = 0; + execl (DELIVER, DELIVER, "-r", argv[1], argv[2], NULL); + } + else + fprintf(stderr, "Ack!?! %s is not setuid!\n", DELIVER); + } + + fprintf (stderr, "Huh? Neither %s nor %s was found (or was suid)!\n", + PROCMAIL, DELIVER); + + return (75); +} diff --git a/mmuegel/README b/mmuegel/README new file mode 100644 index 0000000..4547516 --- /dev/null +++ b/mmuegel/README @@ -0,0 +1,92 @@ +------------------------------------------------------------------------------- +Document Revision Control Information: + mmuegel + /usr/local/ustart/src/mail-tools/dist/foo/README,v + 1.1 of 1993/07/28 08:12:53 +------------------------------------------------------------------------------- + +1. Introduction +--------------- + +These tools may be of use to those sites using sendmail. Both are written in +Perl. Our site, Mot.COM, receives a ton of mail being a top-level domain +gateway. We have over 24 domains under us. Needless to say, we must have +a robust mail system or my head, and others, would be on the chopping block. + +2. Description +-------------- + +The first tool, cqueue, checks the sendmail queue for problems. We use +it to flag problems with subdomain mail servers (and even our own servers +once in a while ;-). We run it via a cron job every hour during the day. +You may find this too frequent, however. + +The other program, postclip, is used to "filter" non-deliverable NDNs that +get sent to our Postmaster account now and then. This ensures privacy of +e-mail and helps avoid disk problems from huge NDNs. It is different than +a brute force "just keep the header" approach because it tries hard to keep +other parts of the message that look like non-delivery information. + +Both have been used for some time at our site with no problems. Everything +you need should be in this distribution: source, manual pages, and support +libs. See the manual pages for a complete description of each tool. + +3. Installation +--------------- + +No fancy Makefile simply because these tools are all under a large +hierarchy at my site. Installation should be a snap, however. Install +the nroff(1) man(5) manual pages from the man subdirectory to the +appropriate directory on your system. This might be something like +/usr/local/man/man1. + +Next, install all of the Perl libraries located in the lib subdirectory +to your Perl library area. /usr/local/lib/perl is a good bet. The person +who installed Perl at your site will be able to tell you for sure. + +Finally, you need to install the programs. Note that cqueue wants to +run setuid root by default. This is because the sendmail queue is normally +only readable by root or some special group. In order to let any user +run this suidperl is used. suidperl allows a Perl program to run with the +privileges of another user. + +You will have to edit both the cqueue and postclip programs to change +the #! line at the top of each. Just change the pathname to whatever is +appropriate on your system. Note that Larry Wall's fixin program from +the Camel book can also be used to do this. It is very handy. It changes +#! lines by looking at your PATH. + +If you do not have suidperl on your system change the #! line in cqueue +to reference perl instead of suidperl. + +You may also wish to change some constants in cqueue. $DEF_QUEUE should be +changed to your queue directory if it is not /usr/spool/mqueue. $DEF_TIME +could be changed easy enough also. It is the time spec for the time duration +after which a mail message will be reported on if the -a option has not been +specified. See the manual page for more information and the format of this +constant (same as the -t argument). Then again, neither of these has to +be changed. Command line options are there to override their default +values. + +After you have edited the programs as necessary, all that remains is to +install them to some executable directory. Install postclip mode 555 +and cqueue mode 4555 with owner root (if using suidperl) or mode 555 +(if not using suidperl). + +4. Gripes, Comments, Etc +------------------------ + +If you start using either of these let me know. I have other mail tools I +will likely post in the future if these prove useful. Also, if you think +something is just plain dumb/wrong/stupid let me know! + +Cheers, +-Mike + +-- ++----------------------------------------------------------------------------+ +| Michael S. Muegel | Internet E-Mail: mmuegel@mot.com | +| UNIX Applications Startup Group | Moto Dist E-Mail: X10090 | +| Corporate Information Office | Voice: (708) 576-0507 | +| Motorola | Fax: (708) 576-4153 | ++----------------------------------------------------------------------------+ diff --git a/mmuegel/libs/date.pl b/mmuegel/libs/date.pl new file mode 100644 index 0000000..6732438 --- /dev/null +++ b/mmuegel/libs/date.pl @@ -0,0 +1,324 @@ +;# +;# Name +;# date.pl - Perl emulation of (the output side of) date(1) +;# +;# Synopsis +;# require "date.pl"; +;# $Date = &date(time); +;# $Date = &date(time, $format); +;# +;# Description +;# This package implements the output formatting functions of date(1) in +;# Perl. The format options are based on those supported by Ultrix 4.0 +;# plus a couple of additions from SunOS 4.1.1 and elsewhere: +;# +;# %a abbreviated weekday name - Sun to Sat +;# %A full weekday name - Sunday to Saturday +;# %b abbreviated month name - Jan to Dec +;# %B full month name - January to December +;# %c date and time in local format [+] +;# %C date and time in long local format [+] +;# %d day of month - 01 to 31 +;# %D date as mm/dd/yy +;# %e day of month (space padded) - ` 1' to `31' +;# %E day of month (with suffix: 1st, 2nd, 3rd...) +;# %f month of year (space padded) - ` 1' to `12' +;# %h abbreviated month name - Jan to Dec +;# %H hour - 00 to 23 +;# %i hour (space padded) - ` 1' to `12' +;# %I hour - 01 to 12 +;# %j day of the year (Julian date) - 001 to 366 +;# %k hour (space padded) - ` 0' to `23' +;# %l date in ls(1) format +;# %m month of year - 01 to 12 +;# %M minute - 00 to 59 +;# %n insert a newline character +;# %p ante-meridiem or post-meridiem indicator (AM or PM) +;# %r time in AM/PM notation +;# %R time as HH:MM +;# %S second - 00 to 59 +;# %t insert a tab character +;# %T time as HH:MM:SS +;# %u date/time in date(1) required format +;# %U week number, Sunday as first day of week - 00 to 53 +;# %V date-time in SysV touch format (mmddHHMMyy) +;# %w day of week - 0 (Sunday) to 6 +;# %W week number, Monday as first day of week - 00 to 53 +;# %x date in local format [+] +;# %X time in local format [+] +;# %y last 2 digits of year - 00 to 99 +;# %Y all 4 digits of year ~ 1700 to 2000 odd ? +;# %z time zone from TZ environment variable w/ a trailing space +;# %Z time zone from TZ environment variable +;# %% insert a `%' character +;# %+ insert a `+' character +;# +;# [+]: These may need adjustment to fit local conventions, see below. +;# +;# For the sake of compatibility, a leading `+' in the format +;# specificaiton is removed if present. +;# +;# Remarks +;# This is version 3.4 of date.pl +;# +;# An extension of `ctime.pl' by Waldemar Kebsch (kebsch.pad@nixpbe.UUCP), +;# as modified by Marion Hakanson (hakanson@ogicse.ogi.edu). +;# +;# Unlike date(1), unknown format tags are silently replaced by "". +;# +;# defaultTZ is a blatant hack, but I wanted to be able to get date(1) +;# like behaviour by default and there does'nt seem to be an easy (read +;# portable) way to get the local TZ name back... +;# +;# For a cheap date, try... +;# +;# #!/usr/local/bin/perl +;# require "date.pl"; +;# exit print (&date(time, shift @ARGV) . "\n") ? 0 : 1; +;# +;# This package is redistributable under the same terms as apply to +;# the Perl 4.0 release. See the COPYING file in your Perl kit for +;# more information. +;# +;# Please send any bug reports or comments to tmcgonigal@gallium.com +;# +;# Modification History +;# Nmemonic Version Date Who +;# +;# NONE 1.0 02feb91 Terry McGonigal (tmcgonigal@gallium.com) +;# Created from ctime.pl +;# +;# NONE 2.0 07feb91 tmcgonigal +;# Added some of Marion Hakanson (hakanson@ogicse.ogi.edu)'s ctime.pl +;# TZ handling changes. +;# +;# NONE 2.1 09feb91 tmcgonigal +;# Corrected week number calculations. +;# +;# NONE 2.2 21oct91 tmcgonigal +;# Added ls(1) date format, `%l'. +;# +;# NONE 2.3 06nov91 tmcgonigal +;# Added SysV touch(1) date-time format, `%V' (pretty thin as +;# mnemonics go, I know, but `t' and `T' were both gone already!) +;# +;# NONE 2.4 05jan92 tmcgonigal +;# Corrected slight (cosmetic) problem with %V replacment string +;# +;# NONE 3.0 09jul92 tmcgonigal +;# Fixed a couple of problems with &ls as pointed out by +;# Thomas Richter (richter@ki1.chemie.fu-berlin.de), thanks Thomas! +;# Also added a couple of SunOS 4.1.1 strftime-ish formats, %i and %k +;# for space padded hours (` 1' to `12' and ` 0' to `23' respectivly), +;# and %C for locale long date/time format. Changed &mH to take a +;# pad char parameter to make to evaled code for %i and %k simpler. +;# Added %E for suffixed day-of-month (ie 1st, 3rd, 4th etc). +;# +;# NONE 3.1 16jul92 tmcgonigal +;# Added `%u' format to generate date/time in date(1) required +;# format (ie '%y%m%d%H%M.%S'). +;# +;# NONE 3.2 23jan93 tmcgonigal +;# Added `%f' format to generate space padded month numbers, added +;# `%E' to the header comments, it seems to have been left out (and +;# I'm sure I wanted to use it at some point in the past...). +;# +;# NONE 3.3 03feb93 tmcgonigal +;# Corrected some problems with AM/PM handling pointed out by +;# Michael S. Muegel (mmuegel@mot.com). Thanks Michael, I hope +;# this is the behaviour you were looking for, it seems more +;# correct to me... +;# +;# NONE 3.4 26jul93 tmcgonigal +;# Incorporated some fixes provided by DaviD W. Sanderson +;# (dws@ssec.wisc.edu): February was spelled incorrectly and +;# &wkno() was always using the current year while calculating +;# week numbers, regardless of year implied by the time value +;# passed to &date(). DaviD also contributed an improved &date() +;# test script, thanks DaviD, I appreciate the effort. Finally, +;# changed my mailling address from @gvc.com to @gallium.com +;# to reflect, well, my new address! +;# +;# SccsId = "%W% %E%" +;# +require 'timelocal.pl'; +package date; + +# Months of the year +@MoY = ('January', 'February', 'March', 'April', 'May', 'June', + 'July', 'August', 'September','October', 'November', 'December'); + +# days of the week +@DoW = ('Sunday', 'Monday', 'Tuesday', 'Wednesday', + 'Thursday', 'Friday', 'Saturday'); + +# CUSTOMIZE - defaults +$defaultTZ = 'CST'; # time zone (hack!) +$defaultFMT = '%a %h %e %T %z%Y'; # format (ala date(1)) + +# CUSTOMIZE - `local' formats +$locTF = '%T'; # time (as HH:MM:SS) +$locDF = '%D'; # date (as mm/dd/yy) +$locDTF = '%a %b %d %T %Y'; # date/time (as dow mon dd HH:MM:SS yyyy) +$locLDTF = '%i:%M:%S %p %A %B %E %Y'; # long date/time (as HH:MM:SS a/p day month dom yyyy) + +# Time zone info +$TZ; # wkno needs this info too + +# define the known format tags as associative keys with their associated +# replacement strings as values. Each replacement string should be +# an eval-able expresion assigning a value to $rep. These expressions are +# eval-ed, then the value of $rep is substituted into the supplied +# format (if any). +%Tags = ( '%a', q|($rep = $DoW[$wday])=~ s/^(...).*/\1/|, # abbr. weekday name - Sun to Sat + '%A', q|$rep = $DoW[$wday]|, # full weekday name - Sunday to Saturday + '%b', q|($rep = $MoY[$mon]) =~ s/^(...).*/\1/|, # abbr. month name - Jan to Dec + '%B', q|$rep = $MoY[$mon]|, # full month name - January to December + '%c', q|$rep = $locDTF; 1|, # date/time in local format + '%C', q|$rep = $locLDTF; 1|, # date/time in local long format + '%d', q|$rep = &date'pad($mday, 2, "0")|, # day of month - 01 to 31 + '%D', q|$rep = '%m/%d/%y'|, # date as mm/dd/yy + '%e', q|$rep = &date'pad($mday, 2, " ")|, # day of month (space padded) ` 1' to `31' + '%E', q|$rep = &date'dsuf($mday)|, # day of month (w/suffix) `1st' to `31st' + '%f', q|$rep = &date'pad($mon+1, 2, " ")|, # month of year (space padded) ` 1' to `12' + '%h', q|$rep = '%b'|, # abbr. month name (same as %b) + '%H', q|$rep = &date'pad($hour, 2, "0")|, # hour - 00 to 23 + '%i', q|$rep = &date'ampmH($hour, " ")|, # hour (space padded ` 1' to `12' + '%I', q|$rep = &date'ampmH($hour, "0")|, # hour - 01 to 12 + '%j', q|$rep = &date'pad($yday+1, 3, "0")|, # Julian date 001 - 366 + '%k', q|$rep = &date'pad($hour, 2, " ")|, # hour (space padded) ` 0' to `23' + '%l', q|$rep = '%b %d ' . &date'ls($year)|, # ls(1) style date + '%m', q|$rep = &date'pad($mon+1, 2, "0")|, # month of year - 01 to 12 + '%M', q|$rep = &date'pad($min, 2, "0")|, # minute - 00 to 59 + '%n', q|$rep = "\n"|, # insert a newline + '%p', q|$rep = &date'ampmD($hour)|, # insert `AM' or `PM' + '%r', q|$rep = '%I:%M:%S %p'|, # time in AM/PM notation + '%R', q|$rep = '%H:%M'|, # time as HH:MM + '%S', q|$rep = &date'pad($sec, 2, "0")|, # second - 00 to 59 + '%t', q|$rep = "\t"|, # insert a tab + '%T', q|$rep = '%H:%M:%S'|, # time as HH:MM:SS + '%u', q|$rep = '%y%m%d%H%M.%S'|, # daaate/time in date(1) required format + '%U', q|$rep = &date'wkno($year, $yday, 0)|, # week number (weeks start on Sun) - 00 to 53 + '%V', q|$rep = '%m%d%H%M%y'|, # SysV touch(1) date-time format (mmddHHMMyy) + '%w', q|$rep = $wday; 1|, # day of week - Sunday = 0 + '%W', q|$rep = &date'wkno($year, $yday, 1)|, # week number (weeks start on Mon) - 00 to 53 + '%x', q|$rep = $locDF; 1|, # date in local format + '%X', q|$rep = $locTF; 1|, # time in local format + '%y', q|($rep = $year) =~ s/..(..)/\1/|, # last 2 digits of year - 00 to 99 + '%Y', q|$rep = "$year"; 1|, # full year ~ 1700 to 2000 odd + '%z', q|$rep = $TZ eq "" ? "" : "$TZ "|, # time zone from TZ env var (w/trail. space) + '%Z', q|$rep = $TZ; 1|, # time zone from TZ env. var. + '%%', q|$rep = '%'; $adv=1|, # insert a `%' + '%+', q|$rep = '+'| # insert a `+' +); + +sub main'date { + local($time, $format) = @_; + local($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst); + local($pos, $tag, $rep, $adv) = (0, "", "", 0); + + # default to date/ctime format or strip leading `+'... + if ($format eq "") { + $format = $defaultFMT; + } elsif ($format =~ /^\+/) { + $format = $'; + } + + # Use local time if can't find a TZ in the environment + $TZ = defined($ENV{'TZ'}) ? $ENV{'TZ'} : $defaultTZ; + ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = + &gettime ($TZ, $time); + + # Hack to deal with 'PST8PDT' format of TZ + # Note that this can't deal with all the esoteric forms, but it + # does recognize the most common: [:]STDoff[DST[off][,rule]] + if ($TZ =~ /^([^:\d+\-,]{3,})([+-]?\d{1,2}(:\d{1,2}){0,2})([^\d+\-,]{3,})?/) { + $TZ = $isdst ? $4 : $1; + } + + # watch out in 2070... + $year += ($year < 70) ? 2000 : 1900; + + # now loop throught the supplied format looking for tags... + while (($pos = index ($format, '%')) != -1) { + + # grab the format tag + $tag = substr($format, $pos, 2); + $adv = 0; # for `%%' processing + + # do we have a replacement string? + if (defined $Tags{$tag}) { + + # trap dead evals... + if (! eval $Tags{$tag}) { + print STDERR "date.pl: internal error: eval for $tag failed: $@\n"; + return ""; + } + } else { + $rep = ""; + } + + # do the substitution + substr ($format, $pos, 2) =~ s/$tag/$rep/; + $pos++ if ($adv); + } + + $format; +} + +# dsuf - add `st', `nd', `rd', `th' to a date (ie 1st, 22nd, 29th) +sub dsuf { + local ($mday) = @_; + + return $mday . 'st' if ($mday =~ m/.*1$/); + return $mday . 'nd' if ($mday =~ m/.*2$/); + return $mday . 'rd' if ($mday =~ m/.*3$/); + return $mday . 'th'; +} + +# weekno - figure out week number +sub wkno { + local ($year, $yday, $firstweekday) = @_; + local ($jan1, @jan1, $wks); + + # figure out the `time' value for January 1 of the given year + $jan1 = &maketime ($TZ, 0, 0, 0, 1, 0, $year-1900); + + # figure out what day of the week January 1 was + @jan1= &gettime ($TZ, $jan1); + + # and calculate the week number + $wks = (($yday + ($jan1[6] - $firstweekday)) + 1)/ 7; + $wks += (($wks - int($wks) > 0.0) ? 1 : 0); + + # supply zero padding + &pad (int($wks), 2, "0"); +} + +# ampmH - figure out am/pm (1 - 12) mode hour value, padded with $p (0 or ' ') +sub ampmH { local ($h, $p) = @_; &pad($h>12 ? $h-12 : ($h ? $h : 12), 2, $p); } + +# ampmD - figure out am/pm designator +sub ampmD { shift @_ >= 12 ? "PM" : "AM"; } + +# gettime - get the time via {local,gmt}time +sub gettime { ((shift @_) eq 'GMT') ? gmtime(shift @_) : localtime(shift @_); } + +# maketime - make a time via time{local,gmt} +sub maketime { ((shift @_) eq 'GMT') ? &main'timegm(@_) : &main'timelocal(@_); } + +# ls - generate the time/year portion of an ls(1) style date +sub ls { + return ((&gettime ($TZ, time))[5] == @_[0]) ? "%R" : " %Y"; +} + +# pad - pad $in with leading $pad until lenght $len +sub pad { + local ($in, $len, $pad) = @_; + local ($out) = "$in"; + + $out = $pad . $out until (length ($out) == $len); + return $out; +} + +1; diff --git a/mmuegel/libs/elapsed.pl b/mmuegel/libs/elapsed.pl new file mode 100644 index 0000000..e8fc52a --- /dev/null +++ b/mmuegel/libs/elapsed.pl @@ -0,0 +1,123 @@ +;# NAME +;# elapsed.pl - convert seconds to elapsed time format +;# +;# AUTHOR +;# Michael S. Muegel <mmuegel@mot.com> +;# +;# RCS INFORMATION +;# mmuegel +;# /usr/local/ustart/src/mail-tools/dist/foo/libs/elapsed.pl,v +;# 1.1 of 1993/07/28 08:07:19 + +package elapsed; + +# Time field types +$DAYS = 1; +$HOURS = 2; +$MINUTES = 3; +$SECONDS = 4; + +# The array contains four records each with four fields. The fields are, +# in order: +# +# Type Specifies what kind of time field this is. Once of +# $DAYS, $HOURS, $MINUTES, or $SECONDS. +# +# Multiplier Specifies what time field this is via the minimum +# number of seconds this time field may specify. For +# example, the minutes field would be non-zero +# when there are 60 or more seconds. +# +# Separator How to separate this time field from the next +# *greater* field. +# +# Format sprintf() format specifier on how to print this +# time field. +@MULT_AND_SEPS = ($DAYS, 60 * 60 * 24, "+", "%d", + $HOURS, 60 * 60, ":", "%d", + $MINUTES, 60, ":", "%02d", + $SECONDS, 1, "", "%02d" + ); + +;############################################################################### +;# Seconds_To_Elapsed +;# +;# Coverts a seconds count to form [d+]h:mm:ss. If $Collapse +;# is true then the result is compacted somewhat. The string returned +;# will be of the form [d+][[h:]mm]:ss. +;# +;# Arguments: +;# $Seconds, $Collapse +;# +;# Examples: +;# &Seconds_To_Elapsed (0, 0) -> 0:00:00 +;# &Seconds_To_Elapsed (0, 1) -> :00 +;# +;# &Seconds_To_Elapsed (119, 0) -> 0:01:59 +;# &Seconds_To_Elapsed (119, 1) -> 01:59 +;# +;# &Seconds_To_Elapsed (3601, 0) -> 1:00:01 +;# &Seconds_To_Elapsed (3601, 1) -> 1:00:01 +;# +;# &Seconds_To_Elapsed (86401, 0) -> 1+0:00:01 +;# &Seconds_To_Elapsed (86401, 1) -> 1+:01 +;# +;# Returns: +;# $Elapsed +;############################################################################### +sub main'Seconds_To_Elapsed +{ + local ($Seconds, $Collapse) = @_; + local ($Type, $Multiplier, @Multipliers, $Separator, $DHMS_Used, + $Elapsed, @Mult_And_Seps, $Print_Field); + + $Multiplier = 1; + @Mult_And_Seps = @MULT_AND_SEPS; + + # Keep subtracting the number of seconds corresponding to a time field + # from the number of seconds passed to the function. + while (1) + { + ($Type, $Multiplier, $Separator, $Format) = splice (@Mult_And_Seps, 0, 4); + last if (! $Multiplier); + $Seconds -= $DHMS_Used * $Multiplier + if ($DHMS_Used = int ($Seconds / $Multiplier)); + + # Figure out if we should print this field + if ($Type == $DAYS) + { + $Print_Field = $DHMS_Used; + } + + elsif ($Collapse) + { + if ($Type == $HOURS) + { + $Print_Field = $DHMS_Used; + } + elsif ($Type == $MINUTES) + { + $Print_Field = $DHMS_Used || $Printed_Field {$HOURS}; + } + else + { + $Format = ":%02d" + if (! $Printed_Field {$MINUTES}); + $Print_Field = 1; + }; + } + + else + { + $Print_Field = 1; + }; + + $Printed_Field {$Type} = $Print_Field; + $Elapsed .= sprintf ("$Format%s", $DHMS_Used, $Separator) + if ($Print_Field); + }; + + return ($Elapsed); +}; + +1; diff --git a/mmuegel/libs/mail.pl b/mmuegel/libs/mail.pl new file mode 100644 index 0000000..eeedb11 --- /dev/null +++ b/mmuegel/libs/mail.pl @@ -0,0 +1,140 @@ +;# NAME +;# mail.pl - perl function(s) to handle mail processing +;# +;# AUTHOR +;# Michael S. Muegel (mmuegel@mot.com) +;# +;# RCS INFORMATION +;# mmuegel +;# /usr/local/ustart/src/mail-tools/dist/foo/libs/mail.pl,v 1.1 1993/07/28 08:07:19 mmuegel Exp + +package mail; + +# Mailer statement to eval. $Users, $Subject, and $Verbose are substituted +# via eval +$BIN_MAILER = "/usr/ucb/mail \$Verbose -s '\$Subject' \$Users"; + +# Sendmail command to use when $Use_Sendmail is true. +$SENDMAIL = '/usr/lib/sendmail $Verbose $Users'; + +;############################################################################### +;# Send_Mail +;# +;# Sends $Message to $Users with a subject of $Subject. If $Message_Is_File +;# is true then $Message is assumed to be a filename pointing to the mail +;# message. This is a new option and thus the backwards-compatible hack. +;# $Users should be a space separated list of mail-ids. +;# +;# If everything went OK $Status will be 1 and $Error_Msg can be ignored; +;# otherwise, $Status will be 0 and $Error_Msg will contain an error message. +;# +;# If $Use_Sendmail is 1 then sendmail is used to send the message. Normally +;# a mailer such as Mail is used. By specifiying this you can include +;# headers in addition to text in either $Message or $Message_Is_File. +;# If either $Message or $Message_Is_File contain a Subject: header then +;# $Subject is ignored; otherwise, a Subject: header is automatically created. +;# Similar to the Subject: header, if a To: header does not exist one +;# is automatically created from the $Users argument. The mail is still +;# sent, however, to the recipients listed in $Users. This is keeping with +;# normal sendmail usage (header vs. envelope). +;# +;# In both bin mailer and sendmail modes $Verbose will turn on verbose mode +;# (normally just sendmail verbose mode output). +;# +;# Arguments: +;# $Users, $Subject, $Message, $Message_Is_File, $Verbose, $Use_Sendmail +;# +;# Returns: +;# $Status, $Error_Msg +;############################################################################### +sub main'Send_Mail +{ + local ($Users, $Subject, $Message, $Message_Is_File, $Verbose, + $Use_Sendmail) = @_; + local ($BIN_MAILER_HANDLE, $Mailer_Command, $Header_Found, %Header_Map, + $Header_Extra, $Mailer); + + # If the message is contained in a file read it in so we can have one + # consistent interface + if ($Message_Is_File) + { + undef $/; + $Message_Is_File = 0; + open (Message) || return (0, "error reading $Message: $!"); + $Message = <Message>; + close (Message); + }; + + # If sendmail mode see if we need to add some headers + if ($Use_Sendmail) + { + # Determine if a header block is included in the message and what headers + # are there + foreach (split (/\n/, $Message)) + { + last if ($_ eq ""); + $Header_Found = $Header_Map {$1} = 1 if (/^([A-Z]\S*): /); + }; + + # Add some headers? + if (! $Header_Map {"To"}) + { + $Header_Extra .= "To: " . join (", ", $Users) . "\n"; + }; + if (($Subject ne "") && (! $Header_Map {"Subject"})) + { + $Header_Extra .= "Subject: $Subject\n"; + }; + + # Add the required blank line between header/body if there where no + # headers to begin with + if ($Header_Found) + { + $Message = "$Header_Extra$Message"; + } + else + { + $Message = "$Header_Extra\n$Message"; + }; + }; + + # Get a string that is the mail command + $Verbose = ($Verbose) ? "-v" : ""; + $Mailer = ($Use_Sendmail) ? $SENDMAIL : $BIN_MAILER; + eval "\$Mailer = \"$Mailer\""; + return (0, "error setting \$Mailer: $@") if ($@); + + # need to catch SIGPIPE in case the $Mailer call fails + $SIG {'PIPE'} = "mail'Cleanup"; + + # Open mailer + return (0, "can not open mail program: $Mailer") if (! open (MAILER, "| $Mailer")); + + # Send off the mail! + print MAILER $Message; + close (MAILER); + return (0, "error running mail program: $Mailer") if ($?); + + # Everything must have went AOK + return (1); +}; + +;############################################################################### +;# Cleanup +;# +;# Simply here so we can catch SIGPIPE and not exit. +;# +;# Globals: +;# None +;# +;# Arguments: +;# None +;# +;# Returns: +;# Nothing exciting +;############################################################################### +sub Cleanup +{ +}; + +1; diff --git a/mmuegel/libs/mqueue.pl b/mmuegel/libs/mqueue.pl new file mode 100644 index 0000000..f425ede --- /dev/null +++ b/mmuegel/libs/mqueue.pl @@ -0,0 +1,215 @@ +;# NAME +;# mqueue.pl - functions to work with the sendmail queue +;# +;# DESCRIPTION +;# Both Get_Queue_IDs and Parse_Control_File are available to get +;# information about the sendmail queue. The cqueue program is a good +;# example of how these functions work. +;# +;# AUTHOR +;# Michael S. Muegel (mmuegel@mot.com) +;# +;# RCS INFORMATION +;# mmuegel +;# /usr/local/ustart/src/mail-tools/dist/foo/libs/mqueue.pl,v +;# 1.1 of 1993/07/28 08:07:19 + +package mqueue; + +;############################################################################### +;# Get_Queue_IDs +;# +;# Will figure out the queue IDs in $Queue that have both control and data +;# files. They are returned in @Valid_IDs. Those IDs that have a +;# control file and no data file are saved to the array globbed by +;# *Missing_Control_IDs. Likewise, those IDs that have a data file and no +;# control file are saved to the array globbed by *Missing_Data_IDs. +;# +;# If $Skip_Locked is true they a message that has a lock file is skipped +;# and will not show up in any of the arrays. +;# +;# If everything went AOK then $Status is 1; otherwise, $Status is 0 and +;# $Msg tells what went wrong. +;# +;# Globals: +;# None +;# +;# Arguments: +;# $Queue, $Skip_Locked, *Missing_Control_IDs, *Missing_Data_IDs +;# +;# Returns: +;# $Status, $Msg, @Valid_IDs +;############################################################################### +sub main'Get_Queue_IDs +{ + local ($Queue, $Skip_Locked, *Missing_Control_IDs, + *Missing_Data_IDs) = @_; + local (*QUEUE, @Files, %Lock_IDs, %Data_IDs, %Control_IDs, $_); + + # Make sure that the * argument @arrays ar empty + @Missing_Control_IDs = @Missing_Data_IDs = (); + + # Save each data, lock, and queue file in @Files + opendir (QUEUE, $Queue) || return (0, "error getting directory listing of $Queue"); + @Files = grep (/^(df|lf|qf)/, readdir (QUEUE)); + closedir (QUEUE); + + # Create indexed list of data and control files. IF $Skip_Locked is true + # then skip either if there is a lock file present. + if ($Skip_Locked) + { + grep ((s/^lf//) && ($Lock_IDs {$_} = 1), @Files); + grep ((s/^df//) && (! $Lock_IDs {$_}) && ($Data_IDs {$_} = 1), @Files); + grep ((s/^qf//) && (! $Lock_IDs {$_}) && ($Control_IDs {$_} = 1), @Files); + } + else + { + grep ((s/^df//) && ($Data_IDs {$_} = 1), @Files); + grep ((s/^qf//) && ($Control_IDs {$_} = 1), @Files); + }; + + # Find missing control and data files and remove them from the lists of each + @Missing_Control_IDs = sort (grep ((! $Control_IDs {$_}) && (delete $Data_IDs {$_}), keys (%Data_IDs))); + @Missing_Data_IDs = sort (grep ((! $Data_IDs {$_} && (delete $Control_IDs {$_})), keys (%Control_IDs))); + + + # Return the IDs in an appartently random order + return (1, "", keys (%Control_IDs)); +}; + + +;############################################################################### +;# Parse_Control_File +;# +;# Will pase a sendmail queue control file for useful information. See the +;# Sendmail Installtion and Operation Guide (SMM:07) for a complete +;# explanation of each field. +;# +;# The following globbed variables are set (or cleared) by this function: +;# +;# $Sender The sender's address. +;# +;# @Recipients One or more addresses for the recipient of the mail. +;# +;# @Errors_To One or more addresses for addresses to which mail +;# delivery errors should be sent. +;# +;# $Creation_Time The job creation time in time(3) format. That is, +;# seconds since 00:00:00 GMT 1/1/70. +;# +;# $Priority An integer representing the current message priority. +;# This is used to order the queue. Higher numbers mean +;# lower priorities. +;# +;# $Status_Message The status of the mail message. It can contain any +;# text. +;# +;# @Headers Message headers unparsed but in their original order. +;# Headers that span multiple lines are not mucked with, +;# embedded \ns will be evident. +;# +;# In all e-mail addresses bounding <> pairs are stripped. +;# +;# If everything went AOK then $Status is 1. If the message with queue ID +;# $Queue_ID just does not exist anymore -1 is returned. This is very +;# possible and should be allowed for. Otherwise, $Status is 0 and $Msg +;# tells what went wrong. +;# +;# Globals: +;# None +;# +;# Arguments: +;# $Queue, $Queue_ID, *Sender, *Recipients, *Errors_To, *Creation_Time, +;# *Priority, *Status_Message, *Headers +;# +;# Returns: +;# $Status, $Msg +;############################################################################### +sub main'Parse_Control_File +{ + local ($Queue, $Queue_ID, *Sender, *Recipients, *Errors_To, *Creation_Time, + *Priority, *Status_Message, *Headers) = @_; + local (*Control, $_, $Not_Empty); + + # Required variables and the associated control. If empty at the end of + # parsing we return a bad status. + @REQUIRED_INFO = ('$Creation_Time', 'T', '$Sender', 'S', '@Recipients', 'R', + '$Priority', 'P'); + + # Open up the control file for read + $Control = "$Queue/qf$Queue_ID"; + if (! open (Control)) + { + return (-1) if ((-x $Queue) && (! -f "$Queue/qf$Queue_ID") && + (! -f "$Queue/df$Queue_ID")); + return (0, "error opening $Control for read: $!"); + }; + + # Reset the globbed variables just in case + $Sender = $Creation_Time = $Priority = $Status_Message = ""; + @Recipients = @Errors_To = @Headers = (); + + # Look for a few things in the control file + READ: while (<Control>) + { + $Not_Empty = 1; + chop; + + PARSE: + { + if (/^T(\d+)$/) + { + $Creation_Time = $1; + } + elsif (/^S(<)?([^>]+)/) + { + $Sender = $2; + } + elsif (/^R(<)?([^>]+)/) + { + push (@Recipients, $2); + } + elsif (/^E(<)?([^>]+)/) + { + push (@Errors_To, $2); + } + elsif (/^M(.*)/) + { + $Status_Message = $1; + } + elsif (/^P(\d+)$/) + { + $Priority = $1; + } + elsif (/^H(.*)/) + { + $Header = $1; + while (<Control>) + { + chop; + last if (/^[A-Z]/); + $Header .= "\n$_"; + }; + push (@Headers, $Header); + redo PARSE if ($_); + last if (eof); + }; + }; + }; + + # If the file was empty scream bloody murder + return (0, "empty control file") if (! $Not_Empty); + + # Yell if we could not find a required field + while (($Var, $Control) = splice (@REQUIRED_INFO, 0, 2)) + { + eval "return (0, 'required control field $Control not found') + if (! $Var)"; + return (0, "error checking \$Var: $@") if ($@); + }; + + # Everything went AOK + return (1); +}; + +1; diff --git a/mmuegel/libs/newgetopts.pl b/mmuegel/libs/newgetopts.pl new file mode 100644 index 0000000..bc73348 --- /dev/null +++ b/mmuegel/libs/newgetopts.pl @@ -0,0 +1,213 @@ +;# NAME +;# newgetopts.pl - a better newgetopt (which is a better getopts which is +;# a better getopt ;-) +;# +;# AUTHOR +;# Mike Muegel (mmuegel@mot.com) +;# +;# mmuegel +;# /usr/local/ustart/src/mail-tools/dist/foo/libs/newgetopts.pl,v 1.1 1993/07/28 08:07:19 mmuegel Exp + +;############################################################################### +;# New_Getopts +;# +;# Does not care about order of switches, options, and arguments like +;# getopts.pl. Thus all non-switches/options will be kept in ARGV even if they +;# are not at the end. If $Pass_Invalid is set all unkown options will be +;# passed back to the caller by keeping them in @ARGV. This is useful when +;# parsing a command line for your script while ignoring options that you +;# may pass to another script. If this is set New_Getopts tries to maintain +;# the switch clustering on the unkown switches. +;# +;# Accepts the special argument -usage to print the Usage string. Also accepts +;# the special option -version which prints the contents of the string +;# $VERSION. $VERSION may or may not have an embeded \n in it. If -usage +;# or -version are specified a status of -1 is returned. Note that the usage +;# option is only accepted if the usage string is not null. +;# +;# $Switches is just like the formal arguemnt of getopts.pl. $Usage is a usage +;# string with or without a trailing \n. *Switch_To_Order is an optional +;# pointer to the name of an associative array which will contain a mapping of +;# switch names to the order in which (if at all) the argument was entered. +;# +;# For example, if @ARGV contains -v, -x, test: +;# +;# $Switch_To_Order {"v"} = 1; +;# $Switch_To_Order {"x"} = 2; +;# +;# Note that in the case of multiple occurances of an option $Switch_To_Order +;# will store each occurance of the argument via a string that emulates +;# an array. This is done by using join ($;, ...). You can retrieve the +;# array by using split (/$;/, ...). +;# +;# *Split_ARGV is an optional pointer to an array which will conatin the +;# original switches along with their values. For the example used above +;# Split_ARGV would contain: +;# +;# @Split_ARGV = ("v", "", "x", "test"); +;# +;# Another exciting ;-) feature that newgetopts has. Along with creating the +;# normal $opt_ scalars for the last value of an argument the list @opt_ is +;# created. It is an array which contains all the values of arguments to the +;# basename of the variable. They are stored in the order which they occured +;# on the command line starting with $[. Note that blank arguments are stored +;# as "". Along with providing support for multiple options on the command +;# line this also provides a method of counting the number of times an option +;# was specified via $#opt_. +;# +;# Automatically resets all $opt_, @opt_, %Switch_To_Order, and @Split_ARGV +;# variables so that New_Getopts may be called more than once from within +;# the same program. Thus, if $opt_v is set upon entry to New_Getopts and +;# -v is not in @ARGV $opt_v will not be set upon exit. +;# +;# Arguments: +;# $Switches, $Usage, $Pass_Invalid, *Switch_To_Order, *Split_ARGV +;# +;# Returns: +;# -1, 0, or 1 depending on status (printed Usage/Version, OK, not OK) +;############################################################################### +sub New_Getopts +{ + local($taint_argumentative, $Usage, $Pass_Invalid, *Switch_To_Order, + *Split_ARGV) = @_; + local(@args,$_,$first,$rest,$errs, @leftovers, @current_leftovers, + %Switch_Found); + local($[, $*, $Script_Name, $argumentative); + + # Untaint the argument cluster so that we can use this with taintperl + $taint_argumentative =~ /^(.*)$/; + $argumentative = $1; + + # Clear anything that might still be set from a previous New_Getopts + # call. + @Split_ARGV = (); + + # Get the basename of the calling script + ($Script_Name = $0) =~ s/.*\///; + + # Make Usage have a trailing \n + $Usage .= "\n" if ($Usage !~ /\n$/); + + @args = split( / */, $argumentative ); + + # Clear anything that might still be set from a previous New_Getopts call. + foreach $first (@args) + { + next if ($first eq ":"); + delete $Switch_Found {$first}; + delete $Switch_To_Order {$first}; + eval "undef \@opt_$first; undef \$opt_$first;"; + }; + + while (@ARGV) + { + # Let usage through + if (($ARGV[0] eq "-usage") && ($Usage ne "\n")) + { + print $Usage; + exit (-1); + } + + elsif ($ARGV[0] eq "-version") + { + if ($VERSION) + { + print $VERSION; + print "\n" if ($VERSION !~ /\n$/); + } + else + { + warn "${Script_Name}: no version information available, sorry\n"; + } + exit (-1); + } + + elsif (($_ = $ARGV[0]) =~ /^-(.)(.*)/) + { + ($first,$rest) = ($1,$2); + $pos = index($argumentative,$first); + + $Switch_To_Order {$first} = join ($;, split (/$;/, $Switch_To_Order {$first}), ++$Order); + + if($pos >= $[) + { + if($args[$pos+1] eq ':') + { + shift(@ARGV); + if($rest eq '') + { + $rest = shift(@ARGV); + } + + eval "\$opt_$first = \$rest;"; + eval "push (\@opt_$first, \$rest);"; + push (@Split_ARGV, $first, $rest); + } + else + { + eval "\$opt_$first = 1"; + eval "push (\@opt_$first, '');"; + push (@Split_ARGV, $first, ""); + + if($rest eq '') + { + shift(@ARGV); + } + else + { + $ARGV[0] = "-$rest"; + } + } + } + + else + { + # Save any other switches if $Pass_Valid + if ($Pass_Invalid) + { + push (@current_leftovers, $first); + } + else + { + warn "${Script_Name}: unknown option: $first\n"; + ++$errs; + }; + if($rest ne '') + { + $ARGV[0] = "-$rest"; + } + else + { + shift(@ARGV); + } + } + } + + else + { + push (@leftovers, shift (@ARGV)); + }; + + # Save any other switches if $Pass_Valid + if ((@current_leftovers) && ($rest eq '')) + { + push (@leftovers, "-" . join ("", @current_leftovers)); + @current_leftovers = (); + }; + }; + + # Automatically print Usage if a warning was given + @ARGV = @leftovers; + if ($errs != 0) + { + warn $Usage; + return (0); + } + else + { + return (1); + } + +} + +1; diff --git a/mmuegel/libs/strings1.pl b/mmuegel/libs/strings1.pl new file mode 100644 index 0000000..a49335a --- /dev/null +++ b/mmuegel/libs/strings1.pl @@ -0,0 +1,147 @@ +;# NAME +;# strings1.pl - FUN with strings #1 +;# +;# NOTES +;# I wrote Format_Text_Block when I just started programming Perl so +;# it is probably not very Perlish code. Center is more like it :-). +;# +;# AUTHOR +;# Michael S. Muegel (mmuegel@mot.com) +;# +;# RCS INFORMATION +;# mmuegel +;# /usr/local/ustart/src/mail-tools/dist/foo/libs/strings1.pl,v 1.1 1993/07/28 08:07:19 mmuegel Exp + +package strings1; + +;###############################################################################;# Center +;# +;# Center $Text assuming the output should be $Columns wide. $Text can span +;# multiple lines, of course :-). Lines within $Text that contain only +;# whitespace are not centered and are instead collapsed. This may save time +;# when printing them later. +;# +;# Arguments: +;# $Text, $Columns +;# +;# Returns: +;# $Centered_Text +;############################################################################### +sub main'Center +{ + local ($_, $Columns) = @_; + local ($*) = 1; + + s@^(.*)$@" " x (($Columns - length ($1)) / 2) . $1@eg; + s/^[\t ]*$//g; + return ($_); +}; + +;############################################################################### +;# Format_Text_Block +;# +;# Formats a text string to be printed to the display or other similar device. +;# Text in $String will be fomratted such that the following hold: +;# +;# + $String contains the (possibly) multi-line text to print. It is +;# automatically word-wrapped to fit in $Columns. +;# +;# + \n'd are maintained and are not folded. +;# +;# + $Offset is pre-pended before each separate line of text. +;# +;# + If $Offset_Once is $TRUE $Offset will only appear on the first line. +;# All other lines will be indented to match the amount of whitespace of +;# $Offset. +;# +;# + If $Bullet_Indent is $TRUE $Offset will only be applied to the begining +;# of lines as they occured in the original $String. Lines that are created +;# by this routine will always be indented by blank spaces. +;# +;# + If $Columns is 0 no word-wrap is done. This might be useful to still +;# to offset each line in a buffer. +;# +;# + If $Split_Expr is supplied the string is split on it. If not supplied +;# the string is split on " \t\/\-\,\." by default. +;# +;# + If $Offset_Blank is $TRUE then empty lines will have $Offset pre-pended +;# to them. Otherwise, they will still empty. +;# +;# This is a realy workhorse routine that I use in many places because of its +;# veratility. +;# +;# Arguments: +;# $String, $Offset, $Offset_Once, $Bullet_Indent, $Columns, $Split_Expr, +;# $Offset_Blank +;# +;# Returns: +;# $Buffer +;############################################################################### +sub main'Format_Text_Block +{ + local ($String, $Real_Offset, $Offset_Once, $Bullet_Indent, $Columns, + $Split_Expr, $Offset_Blank) = @_; + + local ($New_Line, $Line, $Chars_Per_Line, $Space_Offset, $Buffer, + $Next_New_Line, $Num_Lines, $Num_Offsets, $Offset); + local ($*) = 0; + local ($BLANK_TAG) = "__FORMAT_BLANK__"; + local ($Blank_Offset) = $Real_Offset if ($Offset_Blank); + + # What should we split on? + $Split_Expr = " \\t\\/\\-\\,\\." if (! $Split_Expr); + + # Pre-process the string - convert blank lines to __FORMAT_BLANK__ sequence + $String =~ s/\n\n/\n$BLANK_TAG\n/g; + $String =~ s/^\n/$BLANK_TAG\n/g; + $String =~ s/\n$/\n$BLANK_TAG/g; + + # If bad $Columns/$Offset combo or no $Columns make a VERRRYYY wide $Column + $Offset = $Real_Offset; + $Chars_Per_Line = 16000 if (($Chars_Per_Line = $Columns - length ($Offset)) <= 0); + $Space_Offset = " " x length ($Offset); + + # Get a buffer + foreach $Line (split ("\n", $String)) + { + $Offset = $Real_Offset if ($Bullet_Indent); + + # Find where to split the line + if ($Line ne $BLANK_TAG) + { + $New_Line = ""; + while ($Line =~ /^([$Split_Expr]*)([^$Split_Expr]+)/) + { + if (length ("$New_Line$&") >= $Chars_Per_Line) + { + $Next_New_Line = $+; + $New_Line = "$Offset$New_Line$1"; + $Buffer .= "\n" if ($Num_Lines++); + $Buffer .= $New_Line; + $Offset = $Space_Offset if (($Offset) && ($Offset_Once)); + $New_Line = $Next_New_Line; + ++$Num_Lines; + } + else + { + $New_Line .= $&; + }; + $Line = $'; + }; + + $Buffer .= "\n" if ($Num_Lines++); + $Buffer .= "$Offset$New_Line$Line"; + $Offset = $Space_Offset if (($Offset) && ($Offset_Once)); + } + + else + { + $Buffer .= "\n$Blank_Offset"; + }; + }; + + return ($Buffer); + +}; + +1; diff --git a/mmuegel/libs/timespec.pl b/mmuegel/libs/timespec.pl new file mode 100644 index 0000000..06b048d --- /dev/null +++ b/mmuegel/libs/timespec.pl @@ -0,0 +1,60 @@ +;# NAME +;# timespec.pl - convert a pre-defined time specifyer to seconds +;# +;# AUTHOR +;# Michael S. Muegel (mmuegel@mot.com) +;# +;# RCS INFORMATION +;# mmuegel +;# /usr/local/ustart/src/mail-tools/dist/foo/libs/timespec.pl,v 1.1 1993/07/28 08:07:19 mmuegel Exp + +package timespec; + +%TIME_SPEC_TO_SECONDS = ("s", 1, + "m", 60, + "h", 60 * 60, + "d", 60 * 60 * 24 + ); + +$VALID_TIME_SPEC_EXPR = "[" . join ("", keys (%TIME_SPEC_TO_SECONDS)) . "]"; + +;############################################################################### +;# Time_Spec_To_Seconds +;# +;# Converts a string of the form: +;# +;# (<number>(s|m|h|d))+ +;# +;# to seconds. The second part of the time spec specifies seconds, minutes, +;# hours, or days, respectfully. The first part is the number of those untis. +;# There can be any number of such specifiers. As an example, 1h30m means 1 +;# hour and 30 minutes. +;# +;# If the parsing went OK then $Status is 1, $Msg is undefined, and $Seconds +;# is $Time_Spec converted to seconds. If something went wrong then $Status +;# is 0 and $Msg explains what went wrong. +;# +;# Arguments: +;# $Time_Spec +;# +;# Returns: +;# $Status, $Msg, $Seconds +;############################################################################### +sub main'Time_Spec_To_Seconds +{ + $Time_Spec = $_[0]; + + $Seconds = 0; + while ($Time_Spec =~ /^(\d+)($VALID_TIME_SPEC_EXPR)/) + { + $Seconds += $1 * $TIME_SPEC_TO_SECONDS {$2}; + $Time_Spec = $'; + }; + + return (0, "error parsing time spec: $Time_Spec") if ($Time_Spec ne ""); + return (1, "", $Seconds); + +}; + + +1; diff --git a/mmuegel/man/cqueue.1 b/mmuegel/man/cqueue.1 new file mode 100644 index 0000000..56e534b --- /dev/null +++ b/mmuegel/man/cqueue.1 @@ -0,0 +1,166 @@ +.TH CQUEUE 1L +\" +\" mmuegel +\" /usr/local/ustart/src/mail-tools/dist/foo/man/cqueue.1,v 1.1 1993/07/28 08:08:25 mmuegel Exp +\" +.ds mp \fBcqueue\fR +.de IB +.IP \(bu 2 +.. +.SH NAME +\*(mp - check sendmail queue for problems +.SH SYNOPSIS +.IP \*(mp 7 +[ \fB-abdms\fR ] [ \fB-q\fR \fIqueue-dir\fI ] [ \fB-t\fR \fItime\fR ] +[ \fB-u\fR \fIusers\fR ] [ \fB-w\fR \fIwidth\fR ] +.SH DESCRIPTION +Reports on problems in the sendmail queue. With no options this simply +means listing messages that have been in the queue longer than a default +period along with a summary of queue mail by host and status message. +.SH OPTIONS +.IP \fB-a\fR 14 +Report on all messages in the queue. This is equivalent to saying \fB-t\fR 0s. +You may like this command so much that you use it as a replacement for +\fBmqueue\fR. For example: +.sp 1 +.RS +.RS +\fBalias mqueue cqueue -a\fR +.RE +.RE +.IP \fB-b\fR 14 +Also report on bogus queue files. Those are files that +have data files and no control files or vice versa. +.IP \fB-d\fR +Print a detailed report of mail messages that have been queued longer than +the specified or default time. Information that is presented includes: +.RS +.RS +.IB +Sendmail queue identifier. +.IB +Date the message was first queued. +.IB +Sender of the message. +.IB +One or more recipients of the message. +.IB +An optional status of the message. This usually indicates why the message +has not been delivered. +.RE +.RE +.IP \fB-m\fR 14 +Mail off the results if any problems were found. +Normaly results are printed to stdout. If this option +is specified they are mailed to one or more users. Results +are not printed to stdout in this case. Results are \fBonly\fR +mailed if \*(mp found something wrong. +.IP "\fB-q\fR \fIqueue-dir\fI" +The sendmail mail queue directory. Default is \fB/usr/spool/mqueue\fR or +some other site configured value. +.IP "\fB-t\fR \fItime\fR" +List messages that have been in the queue longer than +\fItime\fR. Time should of the form: +.sp 1 +.RS +.RS +(<number>(s|m|h|d))+ +.sp 1 +.RE +.RE +.RS 14 +The second portion of the above definition +specifies seconds, minutes, hours, or +days, respectfully. The first portion is the number of +those units. There can be any number of such specifiers. +As an example, 1h30m means 1 hour and 30 minutes. +.sp 1 +The default is 2 hours. +.RE +.IP \fB-s\fR 14 +Print a summary of messages that have been queued longer than +the specified or default time. Two separate types of summaries are printed. +The first summarizes the queue messages by destination host. The host name +is gleaned from the recipient addresses for each message. +Thus the actual host names for this summary should be taken with a grain +of salt since ruleset 0 has not been applied to the address the host was +taken from nor were MX records consulted. It would be possible to add +this; however, the execution time of the script would increase +dramatically. The second summary is by status message. +.IP "\fB-u\fR \fIusers\fR" +Specify list of users to send a mail report to other than +the invoker. This option is only valid when \fB-m\fR has been +specified. Multiple recipients may be separated by spaces. +.IP "\fB-w\fR \fIwidth\fR" +Specify the page width to which the output should tailored. \fIwidth\fR +should be an integer representing some character position. The default is +80 or some other site configured value. Output is folded neatly to match +\fIwidth\fR. +.SH EXAMPLES +.nf +% \fBdate\fR +Tue Jan 19 12:07:20 CST 1993 + +% \fBcqueue -t 21h45m -w 70\fR + +Summary of messages in queue longer than 21:45:00 by destination +host: + + Number of + Messages Destination Host + --------- ---------------- + 2 cigseg.rtsg.mot.com + 1 mnesouth.corp.mot.com + --------- + 3 + +Summary of messages in queue longer than 21:45:00 by status message: + + Number of + Messages Status Message + --------- -------------- + 1 Deferred: Connection refused by mnesouth.corp.mot.com + 2 Deferred: Host Name Lookup Failure + --------- + 3 + +Detail of messages in queue longer than 21:45:00 sorted by creation +date: + + ID: AA20573 + Date: 02:09:27 PM 01/18/93 + Sender: melrose-place-owner@ferkel.ucsb.edu + Recipient: pbaker@cigseg.rtsg.mot.com + Status: Deferred: Host Name Lookup Failure + + ID: AA20757 + Date: 02:11:30 PM 01/18/93 + Sender: 90210-owner@ferkel.ucsb.edu + Recipient: pbaker@cigseg.rtsg.mot.com + Status: Deferred: Host Name Lookup Failure + + ID: AA21110 + Date: 02:17:01 PM 01/18/93 + Sender: rd_lap_wg@mdd.comm.mot.com + Recipient: jim_mathis@mnesouth.corp.mot.com + Status: Deferred: Connection refused by mnesouth.corp.mot.com +.fi +.SH AUTHOR +.nf +Michael S. Muegel (mmuegel@mot.com) +UNIX Applications Startup Group +Corporate Information Office, Schaumburg, IL +Motorola, Inc. +.fi +.SH COPYRIGHT NOTICE +Copyright 1993, Motorola, Inc. +.sp 1 +Permission to use, copy, modify and distribute without charge this +software, documentation, etc. is granted, provided that this +comment and the author's name is retained. The author nor Motorola assume any +responsibility for problems resulting from the use of this software. +.SH SEE ALSO +.nf +\fBsendmail(8)\fR +\fISendmail Installation and Operation Guide\fR. +.fi diff --git a/mmuegel/man/postclip.1 b/mmuegel/man/postclip.1 new file mode 100644 index 0000000..6c33ef2 --- /dev/null +++ b/mmuegel/man/postclip.1 @@ -0,0 +1,59 @@ +.TH POSTCLIP 1L +\" +\" mmuegel +\" /usr/local/ustart/src/mail-tools/dist/foo/man/postclip.1,v 1.1 1993/07/28 08:08:25 mmuegel Exp +\" +.ds mp \fBpostclip\fR +.SH NAME +\*(mp - send only the headers to Postmaster +.SH SYNOPSIS +\*(mp [ \fB-v\fR ] [ \fIto\fR ... ] +.SH DESCRIPTION +\*(mp will forward non-delivery reports to a postmaster after deleting the body +of the message. This keeps bounced mail private and helps to avoid disk space problems. \*(mp tries its best to keep as much of the header trail as possible. +Hopefully only the original body of the message will be filtered. Only messages +that have a subject that begins with 'Returned mail:' are filtered. This +ensures that other mail is not accidently mucked with. Finally, note that +\fBsendmail\fR is used to deliver the message after it has been (possibly) +filtered. All of the original headers will remain intact. +.sp 1 +You can use this with any \fBsendmail\fR by modifying the Postmaster alias. +If you use IDA \fBsendmail\fR you could add the following to <machine>.m4: +.sp 1 +.RS +define(POSTMASTERBOUNCE, mailer-errors) +.RE +.sp 1 +In the aliases file, add a line similar to the following: +.sp 1 +.RS +mailer-errors: "|/usr/local/bin/postclip postmaster" +.RE +.SH OPTIONS +.IP \fB-v\fR +Be verbose about delivery. Probably only useful when debugging \*(mp. +.IP \fIto\fR +A list of one or more e-mail ids to send the modified +Postmaster messages to. If none are specified postmaster +is used. +.SH AUTHOR +.nf +Michael S. Muegel (mmuegel@mot.com) +UNIX Applications Startup Group +Corporate Information Office, Schaumburg, IL +Motorola, Inc. +.fi +.SH CREDITS +The original idea to filter Postmaster mail was taken from a script by +Christopher Davis <ckd@eff.org>. +.SH COPYRIGHT NOTICE +Copyright 1992, Motorola, Inc. +.sp 1 +Permission to use, copy, modify and distribute without charge this +software, documentation, etc. is granted, provided that this +comment and the author's name is retained. The author nor Motorola assume any +responsibility for problems resulting from the use of this software. +.SH SEE ALSO +.nf +\fBsendmail(8)\fR +.fi diff --git a/mmuegel/src/cqueue b/mmuegel/src/cqueue new file mode 100644 index 0000000..f94252a --- /dev/null +++ b/mmuegel/src/cqueue @@ -0,0 +1,242 @@ +#!/usr/bin/perl + +# NAME +# cqueue - check sendmail queue for problems +# +# SYNOPSIS +# Type cqueue -usage +# +# AUTHOR +# Michael S. Muegel <mmuegel@mot.com> +# +# RCS INFORMATION +# mmuegel +# /usr/local/ustart/src/mail-tools/dist/foo/src/cqueue,v 1.1 1993/07/28 08:09:02 mmuegel Exp + +# So that date.pl does not yell (Domain/OS version does a ``) +$ENV{'PATH'} = ""; + +# A better getopts routine +require "newgetopts.pl"; +require "timespec.pl"; +require "mail.pl"; +require "date.pl"; +require "mqueue.pl"; +require "strings1.pl"; +require "elapsed.pl"; + +($Script_Name = $0) =~ s/.*\///; + +# Some defaults you may want to change +$DEF_TIME = "2h"; +$DEF_QUEUE = "/usr/spool/mqueue"; +$DEF_COLUMNS = 80; +$DATE_FORMAT = "%r %D"; + +# Constants that probably should not be changed +$USAGE = "Usage: $Script_Name [ -abdms ] [ -q queue-dir ] [ -t time ] [ -u user ] [ -w width ]\n"; +$VERSION = "${Script_Name} by mmuegel; 1.1 of 1993/07/28 08:09:02"; +$SWITCHES = "abdmst:u:q:w:"; +$SPLIT_EXPR = '\s,\.@!%:'; +$ADDR_PART_EXPR = '[^!@%]+'; + +# Let getopts parse for switches +$Status = &New_Getopts ($SWITCHES, $USAGE); +exit (0) if ($Status == -1); +exit (1) if (! $Status); + +# Check args +die "${Script_Name}: -u only valid with -m\n" if (($opt_u) && (! $opt_m)); +die "${Script_Name}: -a not valid with -t option\n" if ($opt_a && $opt_t); +$opt_u = getlogin || (getpwuid ($<))[0] || $ENV{"USER"} || die "${Script_Name}: can not determine who you are!\n" if (! $opt_u); + +# Set defaults +$opt_t = "0s" if ($opt_a); +$opt_t = $DEF_TIME if ($opt_t eq ""); +$opt_w = $DEF_COLUMNS if ($opt_w eq ""); +$opt_q = $DEF_QUEUE if ($opt_q eq ""); +$opt_s = $opt_d = 1 if (! ($opt_s || $opt_d)); + +# Untaint the users to mail to +$opt_u =~ /^(.*)$/; +$Users = $1; + +# Convert time option to seconds and seconds to elapsed form +die "${Script_Name}: $Msg\n" if (! (($Status, $Msg, $Seconds) = &Time_Spec_To_Seconds ($opt_t))[0]); +$Elapsed = &Seconds_To_Elapsed ($Seconds, 1); +$Time_Info = " longer than $Elapsed" if ($Seconds); + +# Get the current time +$Current_Time = time; +$Current_Date = &date ($Current_Time, $DATE_FORMAT); + +($Status, $Msg, @Queue_IDs) = &Get_Queue_IDs ($opt_q, 1, @Missing_Control_IDs, + @Missing_Data_IDs); +die "$Script_Name: $Msg\n" if (! $Status); + +# Yell about missing data/control files? +if ($opt_b) +{ + + $Report = "\nMessages missing control files:\n\n " . + join ("\n ", @Missing_Control_IDs) . + "\n" + if (@Missing_Control_IDs); + + $Report .= "\nMessages missing data files:\n\n " . + join ("\n ", @Missing_Data_IDs) . + "\n" + if (@Missing_Data_IDs); +}; + +# See if any mail messages are older than $Seconds +foreach $Queue_ID (@Queue_IDs) +{ + # Get lots of info about this sendmail message via the control file + ($Status, $Msg) = &Parse_Control_File ($opt_q, $Queue_ID, *Sender, + *Recipients, *Errors_To, *Creation_Time, *Priority, *Status_Message, + *Headers); + next if ($Status == -1); + if (! $Status) + { + warn "$Script_Name: $Queue_ID: $Msg\n"; + next; + }; + + # Report on message if it is older than $Seconds + if ($Current_Time - $Creation_Time >= $Seconds) + { + # Build summary by host information. Keep track of each host destination + # encountered. + if ($opt_s) + { + %Host_Map = (); + foreach (@Recipients) + { + if ((/@($ADDR_PART_EXPR)$/) || (/($ADDR_PART_EXPR)!$ADDR_PART_EXPR$/)) + { + ($Host = $1) =~ tr/A-Z/a-z/; + $Host_Map {$Host} = 1; + } + else + { + warn "$Script_Name: could not find host part from $_; contact author\n"; + }; + }; + + # For each unique target host add to its stats + grep ($Host_Queued {$_}++, keys (%Host_Map)); + + # Build summary by message information. + $Message_Queued {$Status_Message}++ if ($Status_Message); + }; + + # Build long report information for this creation time (there may be + # more than one message created at the same time) + if ($opt_d) + { + $Creation_Date = &date ($Creation_Time, $DATE_FORMAT); + $Recipient_Info = &Format_Text_Block (join (", ", @Recipients), + " Recipient: ", 1, 0, $opt_w, $SPLIT_EXPR); + $Time_To_Report {$Creation_Time} .= <<"EOS"; + + ID: $Queue_ID + Date: $Creation_Date + Sender: $Sender +$Recipient_Info +EOS + + # Add the status message if available to long report + if ($Status_Message) + { + $Time_To_Report {$Creation_Time} .= &Format_Text_Block ($Status_Message, + " Status: ", 1, 0, $opt_w, $SPLIT_EXPR) . "\n"; + }; + }; + }; + +}; + +# Add the summary report by target host? +if ($opt_s) +{ + foreach $Host (sort (keys (%Host_Queued))) + { + $Host_Report .= &Format_Text_Block ($Host, + sprintf (" %-9d ", $Host_Queued{$Host}), 1, 0, $opt_w, + $SPLIT_EXPR) . "\n"; + $Num_Hosts += $Host_Queued{$Host}; + }; + if ($Host_Report) + { + chop ($Host_Report); + $Report .= &Format_Text_Block("\nSummary of messages in queue$Time_Info by destination host:\n", "", 0, 0, $opt_w); + + $Report .= <<"EOS"; + + Number of + Messages Destination Host + --------- ---------------- +$Host_Report + --------- + $Num_Hosts +EOS + }; +}; + +# Add the summary by message report? +if ($opt_s) +{ + foreach $Message (sort (keys (%Message_Queued))) + { + $Message_Report .= &Format_Text_Block ($Message, + sprintf (" %-9d ", $Message_Queued{$Message}), 1, 0, $opt_w, + $SPLIT_EXPR) . "\n"; + $Num_Messages += $Message_Queued{$Message}; + }; + if ($Message_Report) + { + chop ($Message_Report); + $Report .= &Format_Text_Block ("\nSummary of messages in queue$Time_Info by status message:\n", "", 0, 0, $opt_w); + + $Report .= <<"EOS"; + + Number of + Messages Status Message + --------- -------------- +$Message_Report + --------- + $Num_Messages +EOS + }; +}; + +# Add the detailed message reports? +if ($opt_d) +{ + foreach $Time (sort { $a <=> $b} (keys (%Time_To_Report))) + { + $Report .= &Format_Text_Block ("\nDetail of messages in queue$Time_Info sorted by creation date:\n","", 0, 0, $opt_w) if (! $Detailed_Header++); + $Report .= $Time_To_Report {$Time}; + }; +}; + +# Now mail or print the report +if ($Report) +{ + $Report .= "\n"; + if ($opt_m) + { + ($Status, $Msg) = &Send_Mail ($Users, "sendmail queue report for $Current_Date", $Report, 0); + die "${Script_Name}: $Msg" if (! $Status); + } + + else + { + print $Report; + }; + +}; + +# I am outta here... +exit (0); diff --git a/mmuegel/src/postclip b/mmuegel/src/postclip new file mode 100644 index 0000000..63f6df0 --- /dev/null +++ b/mmuegel/src/postclip @@ -0,0 +1,74 @@ +#!/usr/local/bin/perl + +# NAME +# postclip - send only the headers to Postmaster +# +# SYNOPSIS +# postclip [ -v ] [ to ... ] +# +# AUTHOR +# Michael S. Muegel <mmuegel@mot.com> +# +# RCS INFORMATION +# /usr/local/ustart/src/mail-tools/dist/foo/src/postclip,v +# 1.1 of 1993/07/28 08:09:02 + +# We use this to send off the mail +require "newgetopts.pl"; +require "mail.pl"; + +# Get the basename of the script +($Script_Name = $0) =~ s/.*\///; + +# Some famous constants +$USAGE = "Usage: $Script_Name [ -v ] [ to ... ]\n"; +$VERSION = "${Script_Name} by mmuegel; 1.1 of 1993/07/28 08:09:02"; +$SWITCHES = "v"; + +# Let getopts parse for switches +$Status = &New_Getopts ($SWITCHES, $USAGE); +exit (0) if ($Status == -1); +exit (1) if (! $Status); + +# Who should we send the modified mail to? +@ARGV = ("postmaster") if (! @ARGV); +$Users = join (" ", @ARGV); +@ARGV = (); + +# Suck in the original header and save a few interesting lines +while (<>) +{ + $Buffer .= $_ if (! /^From /); + $Subject = $1 if (/^Subject:\s+(.*)$/); + $From = $1 if (/^From:\s+(.*)$/); + last if (/^$/); +}; + +# Do not filter the message unless it has a subject and the subject indicates +# it is an NDN +if ($Subject && ($Subject =~ /^returned mail/i)) +{ + # Slurp input by paragraph. Keep track of the last time we saw what + # appeared to be NDN text. We keep this. + $/ = "\n\n"; + $* = 1; + while (<>) + { + push (@Paragraphs, $_); + $Last_Error_Para = $#Paragraphs + if (/unsent message follows/i || /was not delivered because/); + }; + + # Now save the NDN text into $Buffer + $Buffer .= join ("", @Paragraphs [0..$Last_Error_Para]); +} + +else +{ + undef $/; + $Buffer .= <>; +}; + +# Send off the (possibly) modified mail +($Status, $Msg) = &Send_Mail ($Users, "", $Buffer, 0, $opt_v, 1); +die "$Script_Name: $Msg\n" if (! $Status); diff --git a/src/collect.c b/src/collect.c index 58f0dc7..d3a1f18 100644 --- a/src/collect.c +++ b/src/collect.c @@ -375,8 +375,12 @@ nextstate: if (*--bp != '\n' || *--bp != '\r') bp++; *bp = '\0'; - if (bitset(H_EOH, chompheader(buf, FALSE, hdrp, e))) - mstate = MS_BODY; + if (bitset(H_EOH, chompheader(buf, FALSE, hdrp, e))) { + mstate = MS_BODY; + if (tTd(30, 35)) + printf("H_EOH, istate=%d, mstate=%d\n", istate, mstate); + goto nextstate; + } break; case MS_BODY: diff --git a/src/collect.c.orig b/src/collect.c.orig new file mode 100644 index 0000000..58f0dc7 --- /dev/null +++ b/src/collect.c.orig @@ -0,0 +1,761 @@ +/* + * Copyright (c) 1983, 1995-1997 Eric P. Allman + * Copyright (c) 1988, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef lint +static char sccsid[] = "@(#)collect.c 8.72 (Berkeley) 10/6/97"; +#endif /* not lint */ + +# include <errno.h> +# include "sendmail.h" + +/* +** COLLECT -- read & parse message header & make temp file. +** +** Creates a temporary file name and copies the standard +** input to that file. Leading UNIX-style "From" lines are +** stripped off (after important information is extracted). +** +** Parameters: +** fp -- file to read. +** smtpmode -- if set, we are running SMTP: give an RFC821 +** style message to say we are ready to collect +** input, and never ignore a single dot to mean +** end of message. +** hdrp -- the location to stash the header. +** e -- the current envelope. +** +** Returns: +** none. +** +** Side Effects: +** Temp file is created and filled. +** The from person may be set. +*/ + +static jmp_buf CtxCollectTimeout; +static void collecttimeout(); +static bool CollectProgress; +static EVENT *CollectTimeout; + +/* values for input state machine */ +#define IS_NORM 0 /* middle of line */ +#define IS_BOL 1 /* beginning of line */ +#define IS_DOT 2 /* read a dot at beginning of line */ +#define IS_DOTCR 3 /* read ".\r" at beginning of line */ +#define IS_CR 4 /* read a carriage return */ + +/* values for message state machine */ +#define MS_UFROM 0 /* reading Unix from line */ +#define MS_HEADER 1 /* reading message header */ +#define MS_BODY 2 /* reading message body */ + +void +collect(fp, smtpmode, hdrp, e) + FILE *fp; + bool smtpmode; + HDR **hdrp; + register ENVELOPE *e; +{ + register FILE *volatile tf; + volatile bool ignrdot = smtpmode ? FALSE : IgnrDot; + volatile time_t dbto = smtpmode ? TimeOuts.to_datablock : 0; + register char *volatile bp; + volatile int c = EOF; + volatile bool inputerr = FALSE; + bool headeronly; + char *volatile buf; + volatile int buflen; + volatile int istate; + volatile int mstate; + u_char *volatile pbp; + u_char peekbuf[8]; + char dfname[MAXQFNAME]; + char bufbuf[MAXLINE]; + extern bool isheader(); + extern void eatheader(); + extern void tferror(); + + headeronly = hdrp != NULL; + + /* + ** Create the temp file name and create the file. + */ + + if (!headeronly) + { + int tfd; + struct stat stbuf; + + strcpy(dfname, queuename(e, 'd')); + tfd = dfopen(dfname, O_WRONLY|O_CREAT|O_TRUNC, FileMode, SFF_ANYFILE); + if (tfd < 0 || (tf = fdopen(tfd, "w")) == NULL) + { + syserr("Cannot create %s", dfname); + e->e_flags |= EF_NO_BODY_RETN; + finis(); + } + if (fstat(fileno(tf), &stbuf) < 0) + e->e_dfino = -1; + else + { + e->e_dfdev = stbuf.st_dev; + e->e_dfino = stbuf.st_ino; + } + HasEightBits = FALSE; + e->e_msgsize = 0; + e->e_flags |= EF_HAS_DF; + } + + /* + ** Tell ARPANET to go ahead. + */ + + if (smtpmode) + message("354 Enter mail, end with \".\" on a line by itself"); + + if (tTd(30, 2)) + printf("collect\n"); + + /* + ** Read the message. + ** + ** This is done using two interleaved state machines. + ** The input state machine is looking for things like + ** hidden dots; the message state machine is handling + ** the larger picture (e.g., header versus body). + */ + + buf = bp = bufbuf; + buflen = sizeof bufbuf; + pbp = peekbuf; + istate = IS_BOL; + mstate = SaveFrom ? MS_HEADER : MS_UFROM; + CollectProgress = FALSE; + + if (dbto != 0) + { + /* handle possible input timeout */ + if (setjmp(CtxCollectTimeout) != 0) + { + if (LogLevel > 2) + sm_syslog(LOG_NOTICE, e->e_id, + "timeout waiting for input from %s during message collect", + CurHostName ? CurHostName : "<local machine>"); + errno = 0; + usrerr("451 timeout waiting for input during message collect"); + goto readerr; + } + CollectTimeout = setevent(dbto, collecttimeout, dbto); + } + + for (;;) + { + if (tTd(30, 35)) + printf("top, istate=%d, mstate=%d\n", istate, mstate); + for (;;) + { + if (pbp > peekbuf) + c = *--pbp; + else + { + while (!feof(fp) && !ferror(fp)) + { + errno = 0; + c = getc(fp); + if (errno != EINTR) + break; + clearerr(fp); + } + CollectProgress = TRUE; + if (TrafficLogFile != NULL && !headeronly) + { + if (istate == IS_BOL) + fprintf(TrafficLogFile, "%05d <<< ", + (int) getpid()); + if (c == EOF) + fprintf(TrafficLogFile, "[EOF]\n"); + else + putc(c, TrafficLogFile); + } + if (c == EOF) + goto readerr; + if (SevenBitInput) + c &= 0x7f; + else + HasEightBits |= bitset(0x80, c); + } + if (tTd(30, 94)) + printf("istate=%d, c=%c (0x%x)\n", + istate, c, c); + switch (istate) + { + case IS_BOL: + if (c == '.') + { + istate = IS_DOT; + continue; + } + break; + + case IS_DOT: + if (c == '\n' && !ignrdot && + !bitset(EF_NL_NOT_EOL, e->e_flags)) + goto readerr; + else if (c == '\r' && + !bitset(EF_CRLF_NOT_EOL, e->e_flags)) + { + istate = IS_DOTCR; + continue; + } + else if (c != '.' || + (OpMode != MD_SMTP && + OpMode != MD_DAEMON && + OpMode != MD_ARPAFTP)) + { + *pbp++ = c; + c = '.'; + } + break; + + case IS_DOTCR: + if (c == '\n' && !ignrdot) + goto readerr; + else + { + /* push back the ".\rx" */ + *pbp++ = c; + *pbp++ = '\r'; + c = '.'; + } + break; + + case IS_CR: + if (c == '\n') + istate = IS_BOL; + else + { + ungetc(c, fp); + c = '\r'; + istate = IS_NORM; + } + goto bufferchar; + } + + if (c == '\r' && !bitset(EF_CRLF_NOT_EOL, e->e_flags)) + { + istate = IS_CR; + continue; + } + else if (c == '\n' && !bitset(EF_NL_NOT_EOL, e->e_flags)) + istate = IS_BOL; + else + istate = IS_NORM; + +bufferchar: + if (!headeronly) + e->e_msgsize++; + if (mstate == MS_BODY) + { + /* just put the character out */ + if (MaxMessageSize <= 0 || + e->e_msgsize <= MaxMessageSize) + putc(c, tf); + continue; + } + + /* header -- buffer up */ + if (bp >= &buf[buflen - 2]) + { + char *obuf; + + if (mstate != MS_HEADER) + break; + + /* out of space for header */ + obuf = buf; + if (buflen < MEMCHUNKSIZE) + buflen *= 2; + else + buflen += MEMCHUNKSIZE; + buf = xalloc(buflen); + bcopy(obuf, buf, bp - obuf); + bp = &buf[bp - obuf]; + if (obuf != bufbuf) + free(obuf); + } + if (c >= 0200 && c <= 0237) + { +#if 0 /* causes complaints -- figure out something for 8.9 */ + usrerr("Illegal character 0x%x in header", c); +#endif + } + else if (c != '\0') + *bp++ = c; + if (istate == IS_BOL) + break; + } + *bp = '\0'; + +nextstate: + if (tTd(30, 35)) + printf("nextstate, istate=%d, mstate=%d, line = \"%s\"\n", + istate, mstate, buf); + switch (mstate) + { + extern int chompheader(); + + case MS_UFROM: + mstate = MS_HEADER; +#ifndef NOTUNIX + if (strncmp(buf, "From ", 5) == 0) + { + extern void eatfrom(); + + bp = buf; + eatfrom(buf, e); + continue; + } +#endif + /* fall through */ + + case MS_HEADER: + if (!isheader(buf)) + { + mstate = MS_BODY; + goto nextstate; + } + + /* check for possible continuation line */ + do + { + clearerr(fp); + errno = 0; + c = getc(fp); + } while (errno == EINTR); + if (c != EOF) + ungetc(c, fp); + if (c == ' ' || c == '\t') + { + /* yep -- defer this */ + continue; + } + + /* trim off trailing CRLF or NL */ + if (*--bp != '\n' || *--bp != '\r') + bp++; + *bp = '\0'; + if (bitset(H_EOH, chompheader(buf, FALSE, hdrp, e))) + mstate = MS_BODY; + break; + + case MS_BODY: + if (tTd(30, 1)) + printf("EOH\n"); + if (headeronly) + goto readerr; + bp = buf; + + /* toss blank line */ + if ((!bitset(EF_CRLF_NOT_EOL, e->e_flags) && + bp[0] == '\r' && bp[1] == '\n') || + (!bitset(EF_NL_NOT_EOL, e->e_flags) && + bp[0] == '\n')) + { + break; + } + + /* if not a blank separator, write it out */ + if (MaxMessageSize <= 0 || + e->e_msgsize <= MaxMessageSize) + { + while (*bp != '\0') + putc(*bp++, tf); + } + break; + } + bp = buf; + } + +readerr: + if ((feof(fp) && smtpmode) || ferror(fp)) + { + const char *errmsg = errstring(errno); + + if (tTd(30, 1)) + printf("collect: premature EOM: %s\n", errmsg); + if (LogLevel >= 2) + sm_syslog(LOG_WARNING, e->e_id, + "collect: premature EOM: %s", errmsg); + inputerr = TRUE; + } + + /* reset global timer */ + clrevent(CollectTimeout); + + if (headeronly) + return; + + if (tf != NULL && + (fflush(tf) != 0 || ferror(tf) || + (SuperSafe && fsync(fileno(tf)) < 0) || + fclose(tf) < 0)) + { + tferror(tf, e); + flush_errors(TRUE); + finis(); + } + + /* An EOF when running SMTP is an error */ + if (inputerr && (OpMode == MD_SMTP || OpMode == MD_DAEMON)) + { + char *host; + char *problem; + + host = RealHostName; + if (host == NULL) + host = "localhost"; + + if (feof(fp)) + problem = "unexpected close"; + else if (ferror(fp)) + problem = "I/O error"; + else + problem = "read timeout"; + if (LogLevel > 0 && feof(fp)) + sm_syslog(LOG_NOTICE, e->e_id, + "collect: %s on connection from %.100s, sender=%s: %s", + problem, host, + shortenstring(e->e_from.q_paddr, 203), + errstring(errno)); + if (feof(fp)) + usrerr("451 collect: %s on connection from %s, from=%s", + problem, host, + shortenstring(e->e_from.q_paddr, 203)); + else + syserr("451 collect: %s on connection from %s, from=%s", + problem, host, + shortenstring(e->e_from.q_paddr, 203)); + + /* don't return an error indication */ + e->e_to = NULL; + e->e_flags &= ~EF_FATALERRS; + e->e_flags |= EF_CLRQUEUE; + + /* and don't try to deliver the partial message either */ + if (InChild) + ExitStat = EX_QUIT; + finis(); + } + + /* + ** Find out some information from the headers. + ** Examples are who is the from person & the date. + */ + + eatheader(e, TRUE); + + if (GrabTo && e->e_sendqueue == NULL) + usrerr("No recipient addresses found in header"); + + /* collect statistics */ + if (OpMode != MD_VERIFY) + { + extern void markstats(); + + markstats(e, (ADDRESS *) NULL); + } + +#if _FFR_DSN_RRT_OPTION + /* + ** If we have a Return-Receipt-To:, turn it into a DSN. + */ + + if (RrtImpliesDsn && hvalue("return-receipt-to", e->e_header) != NULL) + { + ADDRESS *q; + + for (q = e->e_sendqueue; q != NULL; q = q->q_next) + if (!bitset(QHASNOTIFY, q->q_flags)) + q->q_flags |= QHASNOTIFY|QPINGONSUCCESS; + } +#endif + + /* + ** Add an Apparently-To: line if we have no recipient lines. + */ + + if (hvalue("to", e->e_header) != NULL || + hvalue("cc", e->e_header) != NULL || + hvalue("apparently-to", e->e_header) != NULL) + { + /* have a valid recipient header -- delete Bcc: headers */ + e->e_flags |= EF_DELETE_BCC; + } + else if (hvalue("bcc", e->e_header) == NULL) + { + /* no valid recipient headers */ + register ADDRESS *q; + char *hdr = NULL; + extern void addheader(); + + /* create an Apparently-To: field */ + /* that or reject the message.... */ + switch (NoRecipientAction) + { + case NRA_ADD_APPARENTLY_TO: + hdr = "Apparently-To"; + break; + + case NRA_ADD_TO: + hdr = "To"; + break; + + case NRA_ADD_BCC: + addheader("Bcc", " ", &e->e_header); + break; + + case NRA_ADD_TO_UNDISCLOSED: + addheader("To", "undisclosed-recipients:;", &e->e_header); + break; + } + + if (hdr != NULL) + { + for (q = e->e_sendqueue; q != NULL; q = q->q_next) + { + if (q->q_alias != NULL) + continue; + if (tTd(30, 3)) + printf("Adding %s: %s\n", + hdr, q->q_paddr); + addheader(hdr, q->q_paddr, &e->e_header); + } + } + } + + /* check for message too large */ + if (MaxMessageSize > 0 && e->e_msgsize > MaxMessageSize) + { + e->e_flags |= EF_NO_BODY_RETN|EF_CLRQUEUE; + e->e_status = "5.2.3"; + usrerr("552 Message exceeds maximum fixed size (%ld)", + MaxMessageSize); + if (LogLevel > 6) + sm_syslog(LOG_NOTICE, e->e_id, + "message size (%ld) exceeds maximum (%ld)", + e->e_msgsize, MaxMessageSize); + } + + /* check for illegal 8-bit data */ + if (HasEightBits) + { + e->e_flags |= EF_HAS8BIT; + if (!bitset(MM_PASS8BIT|MM_MIME8BIT, MimeMode) && + !bitset(EF_IS_MIME, e->e_flags)) + { + e->e_status = "5.6.1"; + usrerr("554 Eight bit data not allowed"); + } + } + else + { + /* if it claimed to be 8 bits, well, it lied.... */ + if (e->e_bodytype != NULL && + strcasecmp(e->e_bodytype, "8BITMIME") == 0) + e->e_bodytype = "7BIT"; + } + + if ((e->e_dfp = fopen(dfname, "r")) == NULL) + { + /* we haven't acked receipt yet, so just chuck this */ + syserr("Cannot reopen %s", dfname); + finis(); + } +} + + +static void +collecttimeout(timeout) + time_t timeout; +{ + /* if no progress was made, die now */ + if (!CollectProgress) + longjmp(CtxCollectTimeout, 1); + + /* otherwise reset the timeout */ + CollectTimeout = setevent(timeout, collecttimeout, timeout); + CollectProgress = FALSE; +} +/* +** TFERROR -- signal error on writing the temporary file. +** +** Parameters: +** tf -- the file pointer for the temporary file. +** e -- the current envelope. +** +** Returns: +** none. +** +** Side Effects: +** Gives an error message. +** Arranges for following output to go elsewhere. +*/ + +void +tferror(tf, e) + FILE *tf; + register ENVELOPE *e; +{ + setstat(EX_IOERR); + if (errno == ENOSPC) + { + struct stat st; + long avail; + long bsize; + extern long freediskspace __P((char *, long *)); + + e->e_flags |= EF_NO_BODY_RETN; + if (fstat(fileno(tf), &st) < 0) + st.st_size = 0; + (void) freopen(queuename(e, 'd'), "w", tf); + if (st.st_size <= 0) + fprintf(tf, "\n*** Mail could not be accepted"); + else if (sizeof st.st_size > sizeof (long)) + fprintf(tf, "\n*** Mail of at least %qd bytes could not be accepted\n", + st.st_size); + else + fprintf(tf, "\n*** Mail of at least %ld bytes could not be accepted\n", + (long) st.st_size); + fprintf(tf, "*** at %s due to lack of disk space for temp file.\n", + MyHostName); + avail = freediskspace(QueueDir, &bsize); + if (avail > 0) + { + if (bsize > 1024) + avail *= bsize / 1024; + else if (bsize < 1024) + avail /= 1024 / bsize; + fprintf(tf, "*** Currently, %ld kilobytes are available for mail temp files.\n", + avail); + } + e->e_status = "4.3.1"; + usrerr("452 Out of disk space for temp file"); + } + else + syserr("collect: Cannot write tf%s", e->e_id); + (void) freopen("/dev/null", "w", tf); +} +/* +** EATFROM -- chew up a UNIX style from line and process +** +** This does indeed make some assumptions about the format +** of UNIX messages. +** +** Parameters: +** fm -- the from line. +** +** Returns: +** none. +** +** Side Effects: +** extracts what information it can from the header, +** such as the date. +*/ + +# ifndef NOTUNIX + +char *DowList[] = +{ + "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", NULL +}; + +char *MonthList[] = +{ + "Jan", "Feb", "Mar", "Apr", "May", "Jun", + "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", + NULL +}; + +void +eatfrom(fm, e) + char *fm; + register ENVELOPE *e; +{ + register char *p; + register char **dt; + + if (tTd(30, 2)) + printf("eatfrom(%s)\n", fm); + + /* find the date part */ + p = fm; + while (*p != '\0') + { + /* skip a word */ + while (*p != '\0' && *p != ' ') + p++; + while (*p == ' ') + p++; + if (!(isascii(*p) && isupper(*p)) || + p[3] != ' ' || p[13] != ':' || p[16] != ':') + continue; + + /* we have a possible date */ + for (dt = DowList; *dt != NULL; dt++) + if (strncmp(*dt, p, 3) == 0) + break; + if (*dt == NULL) + continue; + + for (dt = MonthList; *dt != NULL; dt++) + if (strncmp(*dt, &p[4], 3) == 0) + break; + if (*dt != NULL) + break; + } + + if (*p != '\0') + { + char *q; + + /* we have found a date */ + q = xalloc(25); + (void) strncpy(q, p, 25); + q[24] = '\0'; + q = arpadate(q); + define('a', newstr(q), e); + } +} + +# endif /* NOTUNIX */ diff --git a/src/collect.sav b/src/collect.sav new file mode 100644 index 0000000..58f0dc7 --- /dev/null +++ b/src/collect.sav @@ -0,0 +1,761 @@ +/* + * Copyright (c) 1983, 1995-1997 Eric P. Allman + * Copyright (c) 1988, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef lint +static char sccsid[] = "@(#)collect.c 8.72 (Berkeley) 10/6/97"; +#endif /* not lint */ + +# include <errno.h> +# include "sendmail.h" + +/* +** COLLECT -- read & parse message header & make temp file. +** +** Creates a temporary file name and copies the standard +** input to that file. Leading UNIX-style "From" lines are +** stripped off (after important information is extracted). +** +** Parameters: +** fp -- file to read. +** smtpmode -- if set, we are running SMTP: give an RFC821 +** style message to say we are ready to collect +** input, and never ignore a single dot to mean +** end of message. +** hdrp -- the location to stash the header. +** e -- the current envelope. +** +** Returns: +** none. +** +** Side Effects: +** Temp file is created and filled. +** The from person may be set. +*/ + +static jmp_buf CtxCollectTimeout; +static void collecttimeout(); +static bool CollectProgress; +static EVENT *CollectTimeout; + +/* values for input state machine */ +#define IS_NORM 0 /* middle of line */ +#define IS_BOL 1 /* beginning of line */ +#define IS_DOT 2 /* read a dot at beginning of line */ +#define IS_DOTCR 3 /* read ".\r" at beginning of line */ +#define IS_CR 4 /* read a carriage return */ + +/* values for message state machine */ +#define MS_UFROM 0 /* reading Unix from line */ +#define MS_HEADER 1 /* reading message header */ +#define MS_BODY 2 /* reading message body */ + +void +collect(fp, smtpmode, hdrp, e) + FILE *fp; + bool smtpmode; + HDR **hdrp; + register ENVELOPE *e; +{ + register FILE *volatile tf; + volatile bool ignrdot = smtpmode ? FALSE : IgnrDot; + volatile time_t dbto = smtpmode ? TimeOuts.to_datablock : 0; + register char *volatile bp; + volatile int c = EOF; + volatile bool inputerr = FALSE; + bool headeronly; + char *volatile buf; + volatile int buflen; + volatile int istate; + volatile int mstate; + u_char *volatile pbp; + u_char peekbuf[8]; + char dfname[MAXQFNAME]; + char bufbuf[MAXLINE]; + extern bool isheader(); + extern void eatheader(); + extern void tferror(); + + headeronly = hdrp != NULL; + + /* + ** Create the temp file name and create the file. + */ + + if (!headeronly) + { + int tfd; + struct stat stbuf; + + strcpy(dfname, queuename(e, 'd')); + tfd = dfopen(dfname, O_WRONLY|O_CREAT|O_TRUNC, FileMode, SFF_ANYFILE); + if (tfd < 0 || (tf = fdopen(tfd, "w")) == NULL) + { + syserr("Cannot create %s", dfname); + e->e_flags |= EF_NO_BODY_RETN; + finis(); + } + if (fstat(fileno(tf), &stbuf) < 0) + e->e_dfino = -1; + else + { + e->e_dfdev = stbuf.st_dev; + e->e_dfino = stbuf.st_ino; + } + HasEightBits = FALSE; + e->e_msgsize = 0; + e->e_flags |= EF_HAS_DF; + } + + /* + ** Tell ARPANET to go ahead. + */ + + if (smtpmode) + message("354 Enter mail, end with \".\" on a line by itself"); + + if (tTd(30, 2)) + printf("collect\n"); + + /* + ** Read the message. + ** + ** This is done using two interleaved state machines. + ** The input state machine is looking for things like + ** hidden dots; the message state machine is handling + ** the larger picture (e.g., header versus body). + */ + + buf = bp = bufbuf; + buflen = sizeof bufbuf; + pbp = peekbuf; + istate = IS_BOL; + mstate = SaveFrom ? MS_HEADER : MS_UFROM; + CollectProgress = FALSE; + + if (dbto != 0) + { + /* handle possible input timeout */ + if (setjmp(CtxCollectTimeout) != 0) + { + if (LogLevel > 2) + sm_syslog(LOG_NOTICE, e->e_id, + "timeout waiting for input from %s during message collect", + CurHostName ? CurHostName : "<local machine>"); + errno = 0; + usrerr("451 timeout waiting for input during message collect"); + goto readerr; + } + CollectTimeout = setevent(dbto, collecttimeout, dbto); + } + + for (;;) + { + if (tTd(30, 35)) + printf("top, istate=%d, mstate=%d\n", istate, mstate); + for (;;) + { + if (pbp > peekbuf) + c = *--pbp; + else + { + while (!feof(fp) && !ferror(fp)) + { + errno = 0; + c = getc(fp); + if (errno != EINTR) + break; + clearerr(fp); + } + CollectProgress = TRUE; + if (TrafficLogFile != NULL && !headeronly) + { + if (istate == IS_BOL) + fprintf(TrafficLogFile, "%05d <<< ", + (int) getpid()); + if (c == EOF) + fprintf(TrafficLogFile, "[EOF]\n"); + else + putc(c, TrafficLogFile); + } + if (c == EOF) + goto readerr; + if (SevenBitInput) + c &= 0x7f; + else + HasEightBits |= bitset(0x80, c); + } + if (tTd(30, 94)) + printf("istate=%d, c=%c (0x%x)\n", + istate, c, c); + switch (istate) + { + case IS_BOL: + if (c == '.') + { + istate = IS_DOT; + continue; + } + break; + + case IS_DOT: + if (c == '\n' && !ignrdot && + !bitset(EF_NL_NOT_EOL, e->e_flags)) + goto readerr; + else if (c == '\r' && + !bitset(EF_CRLF_NOT_EOL, e->e_flags)) + { + istate = IS_DOTCR; + continue; + } + else if (c != '.' || + (OpMode != MD_SMTP && + OpMode != MD_DAEMON && + OpMode != MD_ARPAFTP)) + { + *pbp++ = c; + c = '.'; + } + break; + + case IS_DOTCR: + if (c == '\n' && !ignrdot) + goto readerr; + else + { + /* push back the ".\rx" */ + *pbp++ = c; + *pbp++ = '\r'; + c = '.'; + } + break; + + case IS_CR: + if (c == '\n') + istate = IS_BOL; + else + { + ungetc(c, fp); + c = '\r'; + istate = IS_NORM; + } + goto bufferchar; + } + + if (c == '\r' && !bitset(EF_CRLF_NOT_EOL, e->e_flags)) + { + istate = IS_CR; + continue; + } + else if (c == '\n' && !bitset(EF_NL_NOT_EOL, e->e_flags)) + istate = IS_BOL; + else + istate = IS_NORM; + +bufferchar: + if (!headeronly) + e->e_msgsize++; + if (mstate == MS_BODY) + { + /* just put the character out */ + if (MaxMessageSize <= 0 || + e->e_msgsize <= MaxMessageSize) + putc(c, tf); + continue; + } + + /* header -- buffer up */ + if (bp >= &buf[buflen - 2]) + { + char *obuf; + + if (mstate != MS_HEADER) + break; + + /* out of space for header */ + obuf = buf; + if (buflen < MEMCHUNKSIZE) + buflen *= 2; + else + buflen += MEMCHUNKSIZE; + buf = xalloc(buflen); + bcopy(obuf, buf, bp - obuf); + bp = &buf[bp - obuf]; + if (obuf != bufbuf) + free(obuf); + } + if (c >= 0200 && c <= 0237) + { +#if 0 /* causes complaints -- figure out something for 8.9 */ + usrerr("Illegal character 0x%x in header", c); +#endif + } + else if (c != '\0') + *bp++ = c; + if (istate == IS_BOL) + break; + } + *bp = '\0'; + +nextstate: + if (tTd(30, 35)) + printf("nextstate, istate=%d, mstate=%d, line = \"%s\"\n", + istate, mstate, buf); + switch (mstate) + { + extern int chompheader(); + + case MS_UFROM: + mstate = MS_HEADER; +#ifndef NOTUNIX + if (strncmp(buf, "From ", 5) == 0) + { + extern void eatfrom(); + + bp = buf; + eatfrom(buf, e); + continue; + } +#endif + /* fall through */ + + case MS_HEADER: + if (!isheader(buf)) + { + mstate = MS_BODY; + goto nextstate; + } + + /* check for possible continuation line */ + do + { + clearerr(fp); + errno = 0; + c = getc(fp); + } while (errno == EINTR); + if (c != EOF) + ungetc(c, fp); + if (c == ' ' || c == '\t') + { + /* yep -- defer this */ + continue; + } + + /* trim off trailing CRLF or NL */ + if (*--bp != '\n' || *--bp != '\r') + bp++; + *bp = '\0'; + if (bitset(H_EOH, chompheader(buf, FALSE, hdrp, e))) + mstate = MS_BODY; + break; + + case MS_BODY: + if (tTd(30, 1)) + printf("EOH\n"); + if (headeronly) + goto readerr; + bp = buf; + + /* toss blank line */ + if ((!bitset(EF_CRLF_NOT_EOL, e->e_flags) && + bp[0] == '\r' && bp[1] == '\n') || + (!bitset(EF_NL_NOT_EOL, e->e_flags) && + bp[0] == '\n')) + { + break; + } + + /* if not a blank separator, write it out */ + if (MaxMessageSize <= 0 || + e->e_msgsize <= MaxMessageSize) + { + while (*bp != '\0') + putc(*bp++, tf); + } + break; + } + bp = buf; + } + +readerr: + if ((feof(fp) && smtpmode) || ferror(fp)) + { + const char *errmsg = errstring(errno); + + if (tTd(30, 1)) + printf("collect: premature EOM: %s\n", errmsg); + if (LogLevel >= 2) + sm_syslog(LOG_WARNING, e->e_id, + "collect: premature EOM: %s", errmsg); + inputerr = TRUE; + } + + /* reset global timer */ + clrevent(CollectTimeout); + + if (headeronly) + return; + + if (tf != NULL && + (fflush(tf) != 0 || ferror(tf) || + (SuperSafe && fsync(fileno(tf)) < 0) || + fclose(tf) < 0)) + { + tferror(tf, e); + flush_errors(TRUE); + finis(); + } + + /* An EOF when running SMTP is an error */ + if (inputerr && (OpMode == MD_SMTP || OpMode == MD_DAEMON)) + { + char *host; + char *problem; + + host = RealHostName; + if (host == NULL) + host = "localhost"; + + if (feof(fp)) + problem = "unexpected close"; + else if (ferror(fp)) + problem = "I/O error"; + else + problem = "read timeout"; + if (LogLevel > 0 && feof(fp)) + sm_syslog(LOG_NOTICE, e->e_id, + "collect: %s on connection from %.100s, sender=%s: %s", + problem, host, + shortenstring(e->e_from.q_paddr, 203), + errstring(errno)); + if (feof(fp)) + usrerr("451 collect: %s on connection from %s, from=%s", + problem, host, + shortenstring(e->e_from.q_paddr, 203)); + else + syserr("451 collect: %s on connection from %s, from=%s", + problem, host, + shortenstring(e->e_from.q_paddr, 203)); + + /* don't return an error indication */ + e->e_to = NULL; + e->e_flags &= ~EF_FATALERRS; + e->e_flags |= EF_CLRQUEUE; + + /* and don't try to deliver the partial message either */ + if (InChild) + ExitStat = EX_QUIT; + finis(); + } + + /* + ** Find out some information from the headers. + ** Examples are who is the from person & the date. + */ + + eatheader(e, TRUE); + + if (GrabTo && e->e_sendqueue == NULL) + usrerr("No recipient addresses found in header"); + + /* collect statistics */ + if (OpMode != MD_VERIFY) + { + extern void markstats(); + + markstats(e, (ADDRESS *) NULL); + } + +#if _FFR_DSN_RRT_OPTION + /* + ** If we have a Return-Receipt-To:, turn it into a DSN. + */ + + if (RrtImpliesDsn && hvalue("return-receipt-to", e->e_header) != NULL) + { + ADDRESS *q; + + for (q = e->e_sendqueue; q != NULL; q = q->q_next) + if (!bitset(QHASNOTIFY, q->q_flags)) + q->q_flags |= QHASNOTIFY|QPINGONSUCCESS; + } +#endif + + /* + ** Add an Apparently-To: line if we have no recipient lines. + */ + + if (hvalue("to", e->e_header) != NULL || + hvalue("cc", e->e_header) != NULL || + hvalue("apparently-to", e->e_header) != NULL) + { + /* have a valid recipient header -- delete Bcc: headers */ + e->e_flags |= EF_DELETE_BCC; + } + else if (hvalue("bcc", e->e_header) == NULL) + { + /* no valid recipient headers */ + register ADDRESS *q; + char *hdr = NULL; + extern void addheader(); + + /* create an Apparently-To: field */ + /* that or reject the message.... */ + switch (NoRecipientAction) + { + case NRA_ADD_APPARENTLY_TO: + hdr = "Apparently-To"; + break; + + case NRA_ADD_TO: + hdr = "To"; + break; + + case NRA_ADD_BCC: + addheader("Bcc", " ", &e->e_header); + break; + + case NRA_ADD_TO_UNDISCLOSED: + addheader("To", "undisclosed-recipients:;", &e->e_header); + break; + } + + if (hdr != NULL) + { + for (q = e->e_sendqueue; q != NULL; q = q->q_next) + { + if (q->q_alias != NULL) + continue; + if (tTd(30, 3)) + printf("Adding %s: %s\n", + hdr, q->q_paddr); + addheader(hdr, q->q_paddr, &e->e_header); + } + } + } + + /* check for message too large */ + if (MaxMessageSize > 0 && e->e_msgsize > MaxMessageSize) + { + e->e_flags |= EF_NO_BODY_RETN|EF_CLRQUEUE; + e->e_status = "5.2.3"; + usrerr("552 Message exceeds maximum fixed size (%ld)", + MaxMessageSize); + if (LogLevel > 6) + sm_syslog(LOG_NOTICE, e->e_id, + "message size (%ld) exceeds maximum (%ld)", + e->e_msgsize, MaxMessageSize); + } + + /* check for illegal 8-bit data */ + if (HasEightBits) + { + e->e_flags |= EF_HAS8BIT; + if (!bitset(MM_PASS8BIT|MM_MIME8BIT, MimeMode) && + !bitset(EF_IS_MIME, e->e_flags)) + { + e->e_status = "5.6.1"; + usrerr("554 Eight bit data not allowed"); + } + } + else + { + /* if it claimed to be 8 bits, well, it lied.... */ + if (e->e_bodytype != NULL && + strcasecmp(e->e_bodytype, "8BITMIME") == 0) + e->e_bodytype = "7BIT"; + } + + if ((e->e_dfp = fopen(dfname, "r")) == NULL) + { + /* we haven't acked receipt yet, so just chuck this */ + syserr("Cannot reopen %s", dfname); + finis(); + } +} + + +static void +collecttimeout(timeout) + time_t timeout; +{ + /* if no progress was made, die now */ + if (!CollectProgress) + longjmp(CtxCollectTimeout, 1); + + /* otherwise reset the timeout */ + CollectTimeout = setevent(timeout, collecttimeout, timeout); + CollectProgress = FALSE; +} +/* +** TFERROR -- signal error on writing the temporary file. +** +** Parameters: +** tf -- the file pointer for the temporary file. +** e -- the current envelope. +** +** Returns: +** none. +** +** Side Effects: +** Gives an error message. +** Arranges for following output to go elsewhere. +*/ + +void +tferror(tf, e) + FILE *tf; + register ENVELOPE *e; +{ + setstat(EX_IOERR); + if (errno == ENOSPC) + { + struct stat st; + long avail; + long bsize; + extern long freediskspace __P((char *, long *)); + + e->e_flags |= EF_NO_BODY_RETN; + if (fstat(fileno(tf), &st) < 0) + st.st_size = 0; + (void) freopen(queuename(e, 'd'), "w", tf); + if (st.st_size <= 0) + fprintf(tf, "\n*** Mail could not be accepted"); + else if (sizeof st.st_size > sizeof (long)) + fprintf(tf, "\n*** Mail of at least %qd bytes could not be accepted\n", + st.st_size); + else + fprintf(tf, "\n*** Mail of at least %ld bytes could not be accepted\n", + (long) st.st_size); + fprintf(tf, "*** at %s due to lack of disk space for temp file.\n", + MyHostName); + avail = freediskspace(QueueDir, &bsize); + if (avail > 0) + { + if (bsize > 1024) + avail *= bsize / 1024; + else if (bsize < 1024) + avail /= 1024 / bsize; + fprintf(tf, "*** Currently, %ld kilobytes are available for mail temp files.\n", + avail); + } + e->e_status = "4.3.1"; + usrerr("452 Out of disk space for temp file"); + } + else + syserr("collect: Cannot write tf%s", e->e_id); + (void) freopen("/dev/null", "w", tf); +} +/* +** EATFROM -- chew up a UNIX style from line and process +** +** This does indeed make some assumptions about the format +** of UNIX messages. +** +** Parameters: +** fm -- the from line. +** +** Returns: +** none. +** +** Side Effects: +** extracts what information it can from the header, +** such as the date. +*/ + +# ifndef NOTUNIX + +char *DowList[] = +{ + "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", NULL +}; + +char *MonthList[] = +{ + "Jan", "Feb", "Mar", "Apr", "May", "Jun", + "Jul", "Aug", "Sep", "Oct", "Nov", "Dec", + NULL +}; + +void +eatfrom(fm, e) + char *fm; + register ENVELOPE *e; +{ + register char *p; + register char **dt; + + if (tTd(30, 2)) + printf("eatfrom(%s)\n", fm); + + /* find the date part */ + p = fm; + while (*p != '\0') + { + /* skip a word */ + while (*p != '\0' && *p != ' ') + p++; + while (*p == ' ') + p++; + if (!(isascii(*p) && isupper(*p)) || + p[3] != ' ' || p[13] != ':' || p[16] != ':') + continue; + + /* we have a possible date */ + for (dt = DowList; *dt != NULL; dt++) + if (strncmp(*dt, p, 3) == 0) + break; + if (*dt == NULL) + continue; + + for (dt = MonthList; *dt != NULL; dt++) + if (strncmp(*dt, &p[4], 3) == 0) + break; + if (*dt != NULL) + break; + } + + if (*p != '\0') + { + char *q; + + /* we have found a date */ + q = xalloc(25); + (void) strncpy(q, p, 25); + q[24] = '\0'; + q = arpadate(q); + define('a', newstr(q), e); + } +} + +# endif /* NOTUNIX */ @@ -368,6 +368,9 @@ setupmaps() MAPDEF("bestmx", NULL, MCF_OPTFILE, map_parseargs, null_map_open, null_map_close, bestmx_map_lookup, null_map_store); + MAPDEF("ismx", NULL, MCF_OPTFILE, + map_parseargs, null_map_open, null_map_close, + ismx_map_lookup, null_map_store); #endif MAPDEF("host", NULL, 0, @@ -4118,7 +4121,8 @@ validate_connection(sap, hostname, e) } #if TCPWRAPPERS - if (!hosts_ctl("sendmail", hostname, anynet_ntoa(sap), STRING_UNKNOWN)) + if (TcpWrappers && + !hosts_ctl("sendmail", hostname, anynet_ntoa(sap), STRING_UNKNOWN)) { if (tTd(48, 4)) printf(" ... validate_connection: BAD (tcpwrappers)\n"); @@ -1178,7 +1178,7 @@ extern void *malloc(); # define ERRLIST_PREDEFINED /* don't declare sys_errlist */ # define GIDSET_T gid_t /* from <linux/types.h> */ # define HASGETUSERSHELL 0 /* getusershell(3) broken in Slackware 2.0 */ -# define IP_SRCROUTE 0 /* linux <= 1.2.8 doesn't support IP_OPTIONS */ +# define IP_SRCROUTE 0 # define USE_SIGLONGJMP 1 /* sigsetjmp needed for signal handling */ # ifndef HASFLOCK # include <linux/version.h> diff --git a/src/domain.c b/src/domain.c index 2031726..13e4afa 100644 --- a/src/domain.c +++ b/src/domain.c @@ -481,6 +481,52 @@ bestmx_map_lookup(map, name, av, statp) return map_rewrite(map, mxhosts[0], strlen(mxhosts[0]), av); } /* +** ISMX -- find if we are the MX for a certain host. +** +** This is really a hack, but I don't see any obvious way +** to generalize it at the moment. +*/ + +char * +ismx_map_lookup(map, name, av, statp) + MAP *map; + char *name; + char **av; + int *statp; +{ + int nmx, i, len; + auto int rcode; + int saveopts = _res.options; + char *mxhosts[MAXMXHOSTS + 1]; + char *mymx = NULL; + + _res.options &= ~(RES_DNSRCH|RES_DEFNAMES); + nmx = getmxrr(name, mxhosts, FALSE, &rcode); + _res.options = saveopts; + if (rcode != EX_TEMPFAIL) { + if (nmx <= 0) + return NULL; + for(i = 0; i < nmx; i++) { + len = strlen(mxhosts[i]); + if (len && mxhosts[i][len - 1] == '.') + mxhosts[i][len - 1] = 0; + if (wordinclass(mxhosts[i], 'w')) { + mymx = mxhosts[i]; + break; + } + } + if (mymx == NULL) + return NULL; + } else + mymx = "TEMPFAIL"; + + if (bitset(MF_MATCHONLY, map->map_mflags)) + return map_rewrite(map, name, strlen(name), NULL); + else + return map_rewrite(map, mymx, strlen(mymx), av); +} + +/* ** DNS_GETCANONNAME -- get the canonical name for named host using DNS ** ** This algorithm tries to be smart about wildcard MX records. diff --git a/src/readcf.c b/src/readcf.c index 681c3d3..04f70f9 100644 --- a/src/readcf.c +++ b/src/readcf.c @@ -1431,6 +1431,9 @@ struct optioninfo { "FallbackMXhost", 'V', FALSE }, { "Verbose", 'v', TRUE }, { "TryNullMXList", 'w', FALSE }, +#ifdef TCPWRAPPERS + { "TcpWrappers", 'W', FALSE }, +#endif { "QueueLA", 'x', FALSE }, { "RefuseLA", 'X', FALSE }, { "RecipientFactor", 'y', FALSE }, @@ -2097,6 +2100,11 @@ setoption(opt, val, safe, sticky, e) break; /* 'W' available -- was wizard password */ +#ifdef TCPWRAPPERS + case 'W': + TcpWrappers = atobool(val); + break; +#endif case 'x': /* load avg at which to auto-queue msgs */ QueueLA = atoi(val); diff --git a/src/sendmail.8 b/src/sendmail.8 index 9a0a687..5c11545 100644 --- a/src/sendmail.8 +++ b/src/sendmail.8 @@ -433,6 +433,15 @@ aliases are local to a particular host. This may not be available if your sendmail does not have the .Dv USERDB option compiled in. +.It Li TcpWrappers +Use the +.Dv sendmail +entry in +.Pa /etc/hosts.allow +to decide if the remote host has access to the SMTP port. +This may not be available if your sendmail does not have the +.Dv TCPWRAPPERS +option compiled in. .It Li ForkEachJob Fork each job during queue runs. May be convenient on memory-poor machines. diff --git a/src/sendmail.h b/src/sendmail.h index fc3bf49..7524d7b 100644 --- a/src/sendmail.h +++ b/src/sendmail.h @@ -1218,6 +1218,9 @@ EXTERN bool DoQueueRun; /* non-interrupt time queue run needed */ #if _FFR_DSN_RRT_OPTION EXTERN bool RrtImpliesDsn; /* turn Return-Receipt-To: into DSN */ #endif +#ifdef TCPWRAPPERS +EXTERN bool TcpWrappers; /* Use tcp wrappers for access control. */ +#endif EXTERN char *DeadLetterDrop; /* path to dead letter office */ EXTERN bool DontProbeInterfaces; /* don't probe interfaces for names */ EXTERN bool ChownAlwaysSafe; /* treat chown(2) as safe */ |