Update sendmail to version 8.6.5
authorAndrew Moore <alm@FreeBSD.org>
Mon, 31 Jan 1994 00:11:59 +0000 (00:11 +0000)
committerAndrew Moore <alm@FreeBSD.org>
Mon, 31 Jan 1994 00:11:59 +0000 (00:11 +0000)
59 files changed:
usr.sbin/sendmail/KNOWNBUGS
usr.sbin/sendmail/READ_ME
usr.sbin/sendmail/RELEASE_NOTES
usr.sbin/sendmail/cf/README
usr.sbin/sendmail/cf/cf/Makefile
usr.sbin/sendmail/cf/domain/Berkeley.m4
usr.sbin/sendmail/cf/feature/bitdomain.m4
usr.sbin/sendmail/cf/feature/redirect.m4
usr.sbin/sendmail/cf/feature/uucpdomain.m4
usr.sbin/sendmail/cf/m4/cf.m4
usr.sbin/sendmail/cf/m4/proto.m4
usr.sbin/sendmail/cf/m4/version.m4
usr.sbin/sendmail/cf/mailer/pop.m4 [new file with mode: 0644]
usr.sbin/sendmail/cf/mailer/smtp.m4
usr.sbin/sendmail/cf/mailer/uucp.m4
usr.sbin/sendmail/cf/ostype/bsdi1.0.m4 [new file with mode: 0644]
usr.sbin/sendmail/cf/ostype/dgux.m4 [new file with mode: 0644]
usr.sbin/sendmail/cf/ostype/dynix3.2.m4 [new file with mode: 0644]
usr.sbin/sendmail/cf/ostype/hpux.m4
usr.sbin/sendmail/cf/ostype/irix.m4
usr.sbin/sendmail/cf/ostype/nextstep.m4
usr.sbin/sendmail/cf/ostype/riscos4.5.m4
usr.sbin/sendmail/cf/ostype/sco3.2.m4 [new file with mode: 0644]
usr.sbin/sendmail/doc/op/op.me
usr.sbin/sendmail/mailstats/mailstats.c
usr.sbin/sendmail/makemap/Makefile
usr.sbin/sendmail/makemap/Makefile.dist [new file with mode: 0644]
usr.sbin/sendmail/makemap/makemap.c
usr.sbin/sendmail/praliases/Makefile.dist [new file with mode: 0644]
usr.sbin/sendmail/src/Makefile
usr.sbin/sendmail/src/Makefile.dist
usr.sbin/sendmail/src/READ_ME
usr.sbin/sendmail/src/alias.c
usr.sbin/sendmail/src/cdefs.h
usr.sbin/sendmail/src/clock.c
usr.sbin/sendmail/src/collect.c
usr.sbin/sendmail/src/conf.c
usr.sbin/sendmail/src/conf.h
usr.sbin/sendmail/src/daemon.c
usr.sbin/sendmail/src/deliver.c
usr.sbin/sendmail/src/domain.c
usr.sbin/sendmail/src/envelope.c
usr.sbin/sendmail/src/err.c
usr.sbin/sendmail/src/headers.c
usr.sbin/sendmail/src/main.c
usr.sbin/sendmail/src/makesendmail [new file with mode: 0644]
usr.sbin/sendmail/src/map.c
usr.sbin/sendmail/src/mci.c
usr.sbin/sendmail/src/parseaddr.c
usr.sbin/sendmail/src/queue.c
usr.sbin/sendmail/src/readcf.c
usr.sbin/sendmail/src/recipient.c
usr.sbin/sendmail/src/savemail.c
usr.sbin/sendmail/src/sendmail.h
usr.sbin/sendmail/src/srvrsmtp.c
usr.sbin/sendmail/src/udb.c
usr.sbin/sendmail/src/usersmtp.c
usr.sbin/sendmail/src/util.c
usr.sbin/sendmail/src/version.c

index 19727be..1894e01 100644 (file)
@@ -1,7 +1,7 @@
 
 
             K N O W N   B U G S   I N   S E N D M A I L
 
 
             K N O W N   B U G S   I N   S E N D M A I L
-                            (for 8.6.3)
+                            (for 8.6.5)
 
 
 The following are bugs or deficiencies in sendmail that I am aware of
 
 
 The following are bugs or deficiencies in sendmail that I am aware of
@@ -9,14 +9,16 @@ but which have not been fixed in the current release.  You probably
 want to get the most up to date version of this from FTP.CS.Berkeley.EDU
 in /ucb/sendmail/KNOWNBUGS.
 
 want to get the most up to date version of this from FTP.CS.Berkeley.EDU
 in /ucb/sendmail/KNOWNBUGS.
 
-* "SYSERR: openmailer(local): fd 1 not open" message
+This list is not guaranteed to be complete, especially for fixed bugs.
+Many bugs are reported and fixed without ever making it as far as this
+file.  See the file RELEASE_NOTES (in the root directory of the sendmail
+distribution) for more details.
+
+
++----------------------------------------------+
+| THE FOLLOWING PROBLEMS ARE STILL OUTSTANDING |
++----------------------------------------------+
 
 
-  File descriptor 1 (standard output) should not be closed during normal
-  processing.  This is checked periodically, and sometimes this condition
-  is found and this message is produced.  Sendmail repairs the problem,
-  and the mail is still delivered, but I still don't know why it happens.
-  (There was a bug that was fixed in 8.6.beta.13 that might be related,
-  but I think this bug still exists.)
 
 * Null bytes are not handled properly.
 
 
 * Null bytes are not handled properly.
 
@@ -26,12 +28,6 @@ in /ucb/sendmail/KNOWNBUGS.
   restructuring of the code -- for example, almost no C library support
   could be used to handle strings.
 
   restructuring of the code -- for example, almost no C library support
   could be used to handle strings.
 
-* Route-addrs missing angle brackets.
-
-  There are cases where route-addrs do not get angle brackets around them,
-  such as in the "-r" flag on mailers or in the From_ line created when
-  mailing to files.
-
 * Duplicate error messages.
 
   Sometimes identical, duplicate error messages can be generated.  As
 * Duplicate error messages.
 
   Sometimes identical, duplicate error messages can be generated.  As
@@ -56,4 +52,120 @@ in /ucb/sendmail/KNOWNBUGS.
   this address.  It's not clear what the right behaviour is in this
   circumstance.
 
   this address.  It's not clear what the right behaviour is in this
   circumstance.
 
-(Version 8.9, last updated 10/31/93)
+* REDIRECT aliases don't work with `n' option.
+
+  If you have option `n' set when you use newaliases and have
+  REDIRECT addresses in your aliases file, you'll get the error
+  messages during the newaliases instead of when email is sent to
+  the address in question.  The workaround is to turn off the `n'
+  option.
+
+* MX records that point at non-existent hosts work strangly.
+
+  Consider the DNS records:
+
+       hostH   MX      1 hostA
+               MX      2 hostB
+       hostA   A       128.32.8.9
+
+  (note that there is no A record for hostB).  If hostA is down,
+  an attempt to send to hostH gives "host unknown" -- that is, it
+  reflects out the status on the last host it tries, which in this
+  case is hostB, which is unknown.  It probably ought to eliminate
+  hostB early in processing.
+
+* NAME environment variables with commas break.
+
+  If you define your NAME environment variable to have a comma
+  (e.g., ``Lastname, Firstname''), and you are using the $q definition
+  that uses ``name <address>'' format, sendmail treats the first and
+  last names as two addresses, thus producing a bogus From line.  You
+  can work around this by changing the $q definition to use
+  ``address (name)''.
+
+* \231 considered harmful.
+
+  Header addresses that have the \231 character (and possibly others
+  in the range \201 - \237) behave in odd and usually unexpected ways.
+
+* DEC Alphas (OSF/1 1.3) sometimes time out on sending mail.
+
+  I have one report that DEC Alphas acting as SMTP clients sometimes
+  will apparently not see the "250 OK" message in response to the
+  dot that indicates the end of the message.  This only happens if
+  the message is run from the queue -- if it gets through on first
+  try, everything is fine.  I have been unable to reproduce this
+  problem at Berkeley.
+
+* accept() problem on SVR4.
+
+  Apparently, the sendmail daemon loop (doing accept()s on the network)
+  can get into a wierd state on SVR4; it starts logging ``SYSERR:
+  getrequests: accept: Protocol Error''.  The workaround is to kill
+  and restart the sendmail daemon.  We don't have an SVR4 system at
+  Berkeley that carries more than token mail load, so I can't validate
+  this.  It is likely to be a glitch in the sockets emulation, since
+  "Protocol Error" is not possible error code with Berkeley TCP/IP.
+
+  I've also had someone report the message ``sendmail: accept:
+  SIOCGPGRP failed errno 22'' on an SVR4 system.  This message is
+  not in the sendmail source code, so I assume it is also a bug
+  in the sockets emulation.  (Errno 22 is EINVAL "Invalid Argument"
+  on all the systems I have available, including Solaris 2.x.)
+
+* Sending user deletion not done properly in :include: lists.
+
+  If you don't have the "m" (me too) option set, then a person
+  sending to a list that contains themselves should not get a copy
+  of the message.  However, if that list points to a :include: file
+  that has one address per line, this will break, and the sender
+  will always get a copy of their own message, just as though the
+  "m" option were set.
+
+  You can eliminate this by adding commas at the end of each line
+  of the :include: file.
+
+
++-------------------------------------------+
+| THE FOLLOWING PROBLEMS ARE FIXED IN 8.6.5 |
++-------------------------------------------+
+
+* Route-addrs missing angle brackets.
+
+  There are cases where route-addrs do not get angle brackets around them,
+  such as in the "-r" flag on mailers or in the From_ line created when
+  mailing to files.
+
+* No "exposed users" in "nullrelay" configuration.
+
+  The "nullrelay" configuration hides all addresses behind the mail
+  hub name.  Some sites might prefer to expose some names such as
+  root.  This information is always available in Received: lines.
+
+* owner-* alias that uses :include: broken.
+
+  If you have aliases set up as:
+
+       owner-listname:         :include:/some/file
+
+  sendmail will break because it considers this a "sender address",
+  which is not permitted to use the :include: syntax.  The easiest
+  workaround is to change this to:
+
+       owner-listname:         :include:/some/file,
+
+  (note the trailing comma); a somewhat cleaner solution is to use:
+
+       owner-listname:         listname-request
+       listname-request:       :include:/some/file
+
+* "SYSERR: openmailer(local): fd 1 not open" message
+
+  File descriptor 1 (standard output) should not be closed during normal
+  processing.  This is checked periodically, and sometimes this condition
+  is found and this message is produced.  Sendmail repairs the problem,
+  and the mail is still delivered, but I still don't know why it happens.
+  (There was a bug that was fixed in 8.6.beta.13 that might be related,
+  but I think this bug still exists.)
+
+(Version 8.15, last updated 1/12/94)
index 740fa6c..d91a54d 100644 (file)
@@ -1,5 +1,5 @@
 /*-
 /*-
- *     @(#)READ_ME     8.5 (Berkeley) 9/28/93
+ *     @(#)READ_ME     8.8 (Berkeley) 1/4/94
  */
 
                        SENDMAIL RELEASE 8
  */
 
                        SENDMAIL RELEASE 8
@@ -41,6 +41,43 @@ I'm also told that the groff distribution from MIT has a tmac.doc
 macro set that is compatible with these macros.
 
 
 macro set that is compatible with these macros.
 
 
++-----------------------+
+| RELATED DOCUMENTATION |
++-----------------------+
+
+There are other files you should read.  Rooted in this directory are:
+
+  CHANGES-R5-R8
+       Describes changes between Release 5 and Release 8 of sendmail.
+       There are some things that may behave somewhat differently.
+       For example, the rules governing when :include: files will
+       be read have been tightened up for security reasons.
+  FAQ
+       Answers to Frequently Asked Questions.
+  KNOWNBUGS
+       Known bugs in the current release.  I try to keep this up
+       to date -- get the latest version from FTP.CS.Berkeley.EDU
+       in /ucb/sendmail/KNOWNBUGS.
+  RELEASE_NOTES
+       A detailed description of the changes in each version.  This
+       is quite long, but informative.
+  src/READ_ME
+       Details on compiling and installing sendmail.
+  cf/README
+       Details on configuring sendmail.
+  doc/op/op.me
+       The sendmail Installation & Operations Guide.  Be warned: if
+       you are running this off on SunOS or some other system with an
+       old version of -me, you need to add the following macro to the
+       macros:
+
+               .de sm
+               \s-1\\$1\\s0\\$2
+               ..
+
+       This sets a word in a smaller pointsize.
+
+
 +--------------+
 | RELATED RFCS |
 +--------------+
 +--------------+
 | RELATED RFCS |
 +--------------+
@@ -98,6 +135,37 @@ also probably find that you have to add -I/where/you/put/db/include
 to the sendmail makefile to get db.h to work properly.
 
 
 to the sendmail makefile to get db.h to work properly.
 
 
++-------------+
+| USE WITH MH |
++-------------+
+
+This version of sendmail notices and reports certain kinds of SMTP
+protocol violations that were ignored by older versions.  If you
+are running MH you may wish to install the patch in contrib/mh.patch
+that will prevent these warning reports.  This patch also works
+with the old version of sendmail, so it's safe to go ahead and
+install it.
+
+
++-----------+
+| MAKEFILES |
++-----------+
+
+The Makefiles in this release use the new Berkeley "make" that is
+available in BSD Net/2 and 4.4BSD.  If you are using this version
+of make, you may notice one or two places where the Makefile includes
+"../../Makefile.inc".  This file is not included with the sendmail
+distribution because it's not part of sendmail.  However, it is,
+in toto:
+
+       #       @(#)Makefile.inc        8.1 (Berkeley) 6/6/93
+
+       BINDIR?=        /usr/sbin
+
+The other directories should all have Makefile.dist files that work
+on the old make.  For more details, see src/READ_ME.
+
+
 +---------------------+
 | DIRECTORY STRUCTURE |
 +---------------------+
 +---------------------+
 | DIRECTORY STRUCTURE |
 +---------------------+
index 951f2a1..0b714cf 100644 (file)
@@ -1,4 +1,287 @@
-8.6.4/8.6.4    93/10/31
+8.6.5/8.6.5    94/01/13
+       Security fix:  /.forward could be owned by anyone (the test
+               to allow root to own any file was backwards).  From
+               Bob Campbell at U.C. Berkeley.
+       Security fix: group ids were not completely set when programs
+               were invoked.  This caused programs to have group
+               permissions they should not have had (usually group
+               daemon instead of their own group).  In particular,
+               Perl scripts would refuse to run.
+       Security: check to make sure files that are written are not
+               symbolic links (at least under some circumstances).
+               Although this does not respond to a specific known
+               attack, it's just a good idea.  Suggested by
+               Christian Wettergren.
+       Security fix: if a user had an NFS mounted home directory on
+               a system with a restricted shell listed in their
+               /etc/passwd entry, they could still execute any
+               program by putting that in their .forward file.
+               This fix prevents that by insisting that their shell
+               appear in /etc/shells before allowing a .forward to
+               execute a program or write a file.  You can disable
+               this by putting "*" in /etc/shells.  It also won't
+               permit world-writable :include: files to reference
+               programs or files (there's no way to disable this).
+               These behaviours are only one level deep -- for
+               example, it is legal for a world-writable :include:
+               file to reference an alias that writes a file, on
+               the assumption that the alias file is well controlled.
+       Security fix: root was not treated suspiciously enough when
+               looking into subdirectories.  This would potentially
+               allow a cracker to examine files that were publically
+               readable but in a non-publically searchable directory.
+       Fix a problem that causes an error on QUIT on a cached
+               connection to create problems on the current job.
+               These are typically unrelated, so errors occur in
+               the wrong place.
+       Reset CurrentLA in sendall() -- this makes sendmail queue
+               runs more responsive to load average, and fixes a
+               problem that ignored the load average in locally
+               generated mail.  From Eric Wassenaar.
+       Fix possible core dump on aliases with null LHS.  From
+               John Orthoefer of BB&N.
+       Revert to using flock() whenever possible -- there are just
+               too many bugs in fcntl() locking, particularly over
+               NFS, that cause sendmail to fail in perverse ways.
+       Fix a bug that causes the connection cache to get confused
+               when sending error messages.  This resulted in
+               "unexpected close" messages.  It should fix itself
+               on the following queue run.  Problem noted by
+               Liudvikas Bukys of Rochester University.
+       Include $k in $=k as documented in the Install & Op Guide.
+               This seems odd, but it was documented....  From
+               Michael Corrigan of UCSD.
+       Fix problem that caused :include:s from alias files to be
+               forced to be owned by root instead of daemon
+               (actually DefUid).  From Tim Irvin.
+       Diagnose unrecognized I option values -- from Mortin Forssen
+               of the Chalmers University of Technology.
+       Make "error" mailer work consistently when there is no error
+               code associated with it -- previously it returned OK
+               even though there was a real problem.  Now it assumes
+               EX_UNAVAILABLE.
+       Fix bug that caused the last header line of messages that had
+               no body and which were terminated with EOF instead of
+               "." to be discarded.  Problem noted by Liudvikas Bukys.
+       Fix core dump on SMTP mail to programs that failed -- it tried
+               to go to a "next MX host" when none existed, causing
+               a core dump.  From der Mouse at McGill University.
+       Change IDENTPROTO from a defined/not defined to a 0/1 switch;
+               this makes it easier to turn it off (using
+               -DIDENTPROTO=0 in the Makefile).  From der Mouse.
+       Fix YP_MASTER_NAME store to use the unupdated result of
+               gethostname() (instead of myhostname(), which tries
+               to fully qualify the name) to be consistent with
+               SunOS.  If your hostname is unqualified, this fixes
+               transfers to slave servers.  Bug noted by Keith
+               McMillan of Ameritech Services, Inc.
+       Fix Ultrix problem: gethostbyname() can return a very large
+               (> 500) h_length field, which causes the sockaddr
+               to be trashed.  Use the size of the sockaddr instead.
+               Fix from Bob Manson of Ohio State.
+       Don't assume "-a." on host lookups if NAMED_BIND is not
+               defined -- this confuses gethostbyname on hosts
+               file lookups, which doesn't understand the trailing
+               dot convention.
+       Log SMTP server subprocesses that die with a signal instead
+               of from a clean exit.
+       If you don't have option "I" set, don't assume that a DNS
+               "host unknown" message is authoritative -- it
+               might still be found in /etc/hosts.
+       Fix a problem that would cause Deferred: messages to be sent
+               as the subject of an error message, even though the
+               actual cause of a message was more severe than that.
+               Problem noted by Chris Seabrook of OSSI.
+       Fix race condition in DBM alias file locking.  From Kyle
+               Jones of UUNET.
+       Limit delivery syslog line length to avoid bugs in some
+               versions of syslog(3).  This adds a new compile time
+               variable SYSLOG_BUFSIZE.  From Jay Plett of Princeton
+               University, which is in turn derived from IDA.
+       Fix quotes inside of comments in addresses -- previously
+               it insisted that they be balanced, but the 822 spec
+               says that they should be ignored.
+       Dump open file state to syslog upon receiving SIGUSR1 (for
+               debugging).  This also evaluates ruleset 89, if set
+               (with the null input), and logs the result.  This
+               should be used sparingly, since the rewrite process
+               is not reentrant.
+       Change -qI, -qR, and -qS flags to be case-insensitive as
+               documented in the Bat Book.
+       If the mailer returned EX_IOERR or EX_OSERR, sendmail did not
+               return an error message and did not requeue the message.
+               Fix based on code from Roland Dirlewanger of
+               Reseau Regional Aquarel, Bordeaux, France.
+       Fix a problem that caused a seg fault if you got a 421 error
+               code during some parts of connection initialization.
+               I've only seen this when talking to buggy mailers on
+               the other end, but it shouldn't give a seg fault in
+               any case.  From Amir Plivatsky.
+       Fix core dump caused by a ruleset call that returns null.
+               Fix from Bryan Costales of ICSI.
+       Full-Name: field was being ignored.  Fix from Motonori Nakamura
+               of Kyoto University.
+       Fix a possible problem with very long input lines in setproctitle.
+               From P{r Emanuelsson.
+       Avoid putting "This is a warning message" out on return receipts.
+               Suggested by Douglas Anderson.
+       Detect loops caused by recursive ruleset calls.  Suggested by
+               Bryan Costales.
+       Initialize non-alias maps during alias rebuilds -- they may be
+               needed for parsing.  Problem noted by Douglas Anderson.
+       Log sender address even if no message was collected in SMTP
+               (e.g., if all RCPTs failed).  Suggested by Motonori
+               Nakamura.
+       Don't reflect the owner-list contents into the envelope sender
+               address if the value contains ", :, /, or | (to avoid
+               illegal addresses appearing there).
+       Efficiency hack for toktype macro -- from Craig Partridge of
+               BB&N.
+       Clean up DNS error printing so that a host name is always
+               included.
+       Remember to set $i during queue runs.  Reported by Stephen
+               Campbell of Dartmouth University.
+       If ${HOSTALIASES} is set, use it during canonification so that
+               headers are properly mapped.  Reported by Anne Bennett
+               of Concordia University.
+       Avoid printing misleading error message if SMTP mailer (not
+               using [IPC]) should die on a core dump.
+       Avoid incorrect diagnosis of "file 1 closed" when it is caused
+               by the other end closing the connection.  From
+               Dave Morrison of Oracle.
+       Improve several of the error messages printed by "mailq"
+               to include a host name or other useful information.
+       Add preliminary NetInfo support for NeXT systems.  From Vince
+               DeMarco.
+       Fix a glitch that sometimes caused :include:s that pointed to
+               NFS filesystems that were down to give an "aliasing/
+               forwarding loop broken" message instead of queueing
+               the message for retry.  Noted by William C Fenner of
+               the NRL Connection Machine Facility.
+       Fix a problem that could cause a core dump if the input sequence
+               had (or somehow acquired) a \231 character.
+       Make sure that route-addrs always have <angle brackets> around
+               them in non-SMTP envelopes (SMTP envelopes already do
+               this properly).
+       Avoid wierd headers on unbalanced punctuation of the form:
+               ``Joe User <user)'' -- this caused reference to the
+               null macro.  Fix from Rick McCarty of IO.COM.
+       Fix a problem that caused an alias "user: user@local.host" to
+               not have the QNOTREMOTE bit set; this caused configs
+               to act as if FEATURE(notsticky) was defined even when
+               it was not.  The effect of the problem was to make it
+               very hard to to set up satellite sites that had a few
+               local accounts, with everything else forwarded to a
+               corporate hub.  Reported by Detlef Drewanz of the
+               University of Rostock and Mark Frost of NCD.
+       Change queuing to not call rulesets 3, {1 or 2}, 4 on header
+               addresses.  This is more efficient (fewer name server
+               calls) and fixes certain unusual configurations, such
+               as those that have ruleset 4 do something that is
+               non-idempotent unless a mailer-specific ruleset did
+               something else.  Problem reported by Brian J. Coan
+               of the Institute for Global Communications.
+       Fix the "obsolete argument" routine in main to better understand
+               new arguments.  For example, if you used ``sendmail
+               -C config -v -q'' it would choke on the -q because
+               the -C would stop looking for old-format arguments.
+       Portability fixes for:
+               SCO UNIX from Murray Kucherawy.
+               SCO Open Server 3.2v4 from Philippe Brand.
+               System V Release 4 from Rick Ellis and others.
+               OSF/1 from Steve Campbell.
+               DG/UX from Ben Mesander of the USGS and Bryan Curnutt
+                       of Stoner Associates.
+               Motorola SysV88 from Kevin Johnson of Motorola.
+               Solaris 2.3 from Casper H.S. Dik of the University
+                       of Amsterdam and John Caruso of University
+                       of Maryland.
+               FreeBSD from Ollivier Robert.
+               NetBSD from Adam Glass.
+               TitanOS from Kate Hedstrom of Rutgers University.
+               Irix from Bryan Curnutt.
+               Dynix from Jim Davis of the University of Arizona.
+               RISC/os.
+               Linux from John Kennedy of California State University
+                       at Chico.
+               Solaris 2.x from Tony Boner of the U.S. Air Force.
+               NEXTSTEP 3.x from Vince DeMarco.
+               HP-UX from various people.  NOTA BENE:  the location
+                       of the config file has moved to /usr/lib
+                       to match the HP-UX version of sendmail.
+       CONFIG: Don't do any recipient rewriting on relay mailer;
+               since this is intended only for internal use, the
+               usual RFC 821/822/1123 rules can be relaxed.  The
+               main point of this is to avoid munging (ugh) UUCP
+               addresses when relaying internally.
+       CONFIG: fix typo in mailer/uucp.m4 that mutilates list:;
+               syntax addresses delivered via UUCP.  Solution
+               provided by Peter Wemm.
+       CONFIG: fix thumb-fumble in default UUCP relaying in ruleset
+               zero; it caused double @ signs in addresses.  From
+               Irving Reid of the University of Toronto.
+       CONFIG: Portability fixes for SCO Unix 3.2 with TCP/IP 1.2.1
+               from Markku Toijala of ICL Personal Systems Oy.
+       CONFIG: Add trailing "." on pseudo-domains for consistency;
+               this fixes a problem (noted by Al Whaley of Sunnyside)
+               that made it hard to recognize your own pseudodomain
+               names.
+       CONFIG: catch "@host" syntax errors (i.e., null local-parts)
+               rather than letting them get "local configuration
+               error"s.  Problem noted by John Gardiner Myers.
+       CONFIG: add uucp-uudom mailer variant, based on code posted
+               by Spider Boardman <spider@Orb.Nashua.NH.US>; this
+               has uucp-dom semantics but old UUCP syntax.  This
+               also permits "uucp-old" as an alias for "uucp" and
+               "uucp-new" as a synonym for "suucp" for consistency.
+       CONFIG: add POP mailer support (from Kimmo Suominen
+               <kim@grendel.lut.fi>).
+       CONFIG: drop CSNET_RELAY support -- CSNET is long gone.
+       CONFIG: fix bug caused with domain literal addresses (e.g.,
+               ``[128.32.131.12]'') when FEATURE(allmasquerade)
+               was set; it would get an additional @masquerade.host
+               added to the address.  Problem noted by Peter Wan
+               of Georgia Tech.
+       CONFIG: make sure that the local UUCP name is in $=w.  From
+               Jim Murray of Stratus.
+       CONFIG: changes to UUCP rewriting to simulate IDA-style "V"
+               mailer flag.  Briefly, if you are sending to host
+               "foo", then it rewrites "foo!...!baz" to "...!baz",
+               "foo!baz" remains "foo!baz", and anything else has
+               the local name prepended.
+       CONFIG: portability fixes for HP-UX.
+       DOC: several minor problems fixed in the Install & Op Guide.
+       MAKEMAP: fix core dump problem on lines that are too long or
+               which lack newline.  From Mark Delany.
+       MAILSTATS: print sums of columns (total messages & kbytes
+               in and out of the system).  From Tom Ferrin of UC
+               San Francisco Computer Graphics Lab.
+       SIGNIFICANT USER- OR SYSAD-VISIBLE CHANGES:
+               On HP-UX, /etc/sendmail.cf has been moved to
+                       /usr/lib/sendmail.cf to match HP sendmail.
+               Permissions have been tightened up on world-writable
+                       :include: files and accounts that have shells
+                       that are not listed in /etc/shells.  This may
+                       cause some .forward files that have worked
+                       before to start failing.
+               SIGUSR1 dumps some state to the log.
+       NEW FILES:
+               src/Makefile.DGUX
+               src/Makefile.Dynix
+               src/Makefile.FreeBSD
+               src/Makefile.Mach386
+               src/Makefile.NetBSD
+               src/Makefile.RISCos
+               src/Makefile.SCO
+               src/Makefile.SVR4
+               src/Makefile.Titan
+               cf/mailer/pop.m4
+               cf/ostype/bsdi1.0.m4
+               cf/ostype/dgux.m4
+               cf/ostype/dynix3.2.m4
+               cf/ostype/sco3.2.m4
+               makemap/Makefile.dist
+               praliases/Makefile.dist
        Repair core-dump problem (write to read-only memory segment)
                if you fall back to the return-to-Postmaster case in
                savemail.  Problem reported by Richard Liu.
        Repair core-dump problem (write to read-only memory segment)
                if you fall back to the return-to-Postmaster case in
                savemail.  Problem reported by Richard Liu.
index 4a8beda..5255a9c 100644 (file)
@@ -4,7 +4,7 @@
 
                Eric Allman <eric@CS.Berkeley.EDU>
 
 
                Eric Allman <eric@CS.Berkeley.EDU>
 
-               @(#)README      8.15 (Berkeley) 10/31/93
+               @(#)README      8.21 (Berkeley) 1/12/94
 
 
 This document describes the sendmail configuration files being used
 
 
 This document describes the sendmail configuration files being used
@@ -31,10 +31,9 @@ right thing to do.
 This package requires a post-V7 version of m4; if you are running the
 4.2bsd, SysV.2, or 7th Edition version, I suggest finding a friend with
 a newer version.  You can m4-expand on their system, then run locally.
 This package requires a post-V7 version of m4; if you are running the
 4.2bsd, SysV.2, or 7th Edition version, I suggest finding a friend with
 a newer version.  You can m4-expand on their system, then run locally.
-SunOS's /usr/5bin/m4 or BSD-Net/2's m4 both work.  GNU m4 (which is a
-language unto itself) also works, but I don't intend to work so hard
-to keep this up in the future.  [Note to GNU folks:  the construct
-"define(`FOO')" should work without my having to add a null value.]
+SunOS's /usr/5bin/m4 or BSD-Net/2's m4 both work.  GNU m4 version 1.1
+also works.  Unfortunately, I'm told that the M4 on BSDI 1.0 doesn't
+work -- you'll have to use a Net/2 or GNU version.
 
 IF YOU DON'T HAVE A BERKELEY MAKE, don't despair!  Just run
 "m4 foo.mc > foo.cf" -- that should be all you need.  There is also
 
 IF YOU DON'T HAVE A BERKELEY MAKE, don't despair!  Just run
 "m4 foo.mc > foo.cf" -- that should be all you need.  There is also
@@ -52,6 +51,13 @@ I'm not pretending that this README describes everything that these
 configuration files can do; clever people can probably tweak them
 to great effect.  But it should get you started.
 
 configuration files can do; clever people can probably tweak them
 to great effect.  But it should get you started.
 
+*******************************************************************
+***  BE SURE YOU CUSTOMIZE THESE FILES!  They have some                ***
+***  Berkeley-specific assumptions built in, such as the name  ***
+***  of our UUCP-relay.  You'll want to create your own domain ***
+***  description, and use that in place of domain/Berkeley.m4. ***
+*******************************************************************
+
 
 +--------------------------+
 | INTRODUCTION AND EXAMPLE |
 
 +--------------------------+
 | INTRODUCTION AND EXAMPLE |
@@ -186,8 +192,6 @@ UUCP_RELAY  The host that will forward UUCP-addressed email.
                connected.
 BITNET_RELAY   The host that will forward BITNET-addressed email.
                If not defined, the .BITNET pseudo-domain won't work.
                connected.
 BITNET_RELAY   The host that will forward BITNET-addressed email.
                If not defined, the .BITNET pseudo-domain won't work.
-CSNET_RELAY    The host that will forward CSNET-addressed email.
-               If not defined, the .CSNET pseudo-domain won't work.
 LOCAL_RELAY    The site that will handle unqualified names -- that
                is, names with out an @domain extension.  If not set,
                they are assumed to belong on this machine.  This
 LOCAL_RELAY    The site that will handle unqualified names -- that
                is, names with out an @domain extension.  If not set,
                they are assumed to belong on this machine.  This
@@ -241,12 +245,15 @@ uucp              The Unix-to-Unix Copy Program mailer.  Actually, this
                is for when you know that the UUCP mailer at the other
                end can handle multiple recipients in one transfer.
                When you invoke this, sendmail looks for all names in
                is for when you know that the UUCP mailer at the other
                end can handle multiple recipients in one transfer.
                When you invoke this, sendmail looks for all names in
-               the $=U class and sends them to the uucp mailer; all
-               names in the $=Y class are sent to suucp.  Note that
+               the $=U class and sends them to the uucp-old mailer; all
+               names in the $=Y class are sent to uucp-new; and all
+               names in the $=Z class are sent to uucp-uudom.  Note that
                this is a function of what version of rmail runs on
                the receiving end, and hence may be out of your control.
                this is a function of what version of rmail runs on
                the receiving end, and hence may be out of your control.
-               If smtp is defined, it also defines a "uucp-dom" mailer
-               that uses domain-style rewriting.
+               If smtp is defined, it also defines "uucp-dom" and
+               "uucp-uudom" mailers that use domain-style rewriting.
+               See the section below describing UUCP mailers in more
+               detail.
 
 usenet         Usenet (network news) delivery.  If this is specified,
                an extra rule is added to ruleset 0 that forwards all
 
 usenet         Usenet (network news) delivery.  If this is specified,
                an extra rule is added to ruleset 0 that forwards all
@@ -258,6 +265,8 @@ fax         Facsimile transmission.  This is experimental and based
                on Sam Leffler's FlexFAX software.  For more information,
                see below.
 
                on Sam Leffler's FlexFAX software.  For more information,
                see below.
 
+pop            Post Office Protocol.
+
 
 +----------+
 | FEATURES |
 
 +----------+
 | FEATURES |
@@ -433,6 +442,92 @@ same line; these are usually aliases for the same host (or are at
 least in the same company).
 
 
 least in the same company).
 
 
++--------------------+
+| USING UUCP MAILERS |
++--------------------+
+
+It's hard to get UUCP mailers right because of the extremely ad hoc
+nature of UUCP addressing.  These config files are really designed
+for domain-based addressing, even for UUCP sites.
+
+There are four UUCP mailers available.  The choice of which one to
+use 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.
+
+The major choice is whether to go for a domainized scheme or a
+non-domainized scheme.  This depends entirely on what the other
+end will recognize.  If at all possible, you should encourage the
+other end to go to a domain-based system -- non-domainized addresses
+don't work entirely properly.
+
+The four mailers are:
+
+    uucp-old (obsolete name: "uucp")
+       This is the oldest, the worst (but the closest to UUCP) way of
+       sending messages accros 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 you are using one of the domainized UUCP mailers, you really want
+to convert all UUCP addresses to domain format -- otherwise, it will
+do it for you (and probably not the way you expected).  For example,
+if you have the address foo!bar!baz (and you are not sending to foo),
+the heuristics will add the @uucp.relay.name or @local.host.name to
+this address.  However, if you map foo to foo.host.name first, it
+will not add the local hostname.  You can do this using the uucpdomain
+feature.
+
+
 +-------------------+
 | TWEAKING RULESETS |
 +-------------------+
 +-------------------+
 | TWEAKING RULESETS |
 +-------------------+
@@ -691,7 +786,7 @@ Sam Leffler's FlexFAX software is still in beta test -- but he expects a
 public version out "later this week" [as of 3/1/93].  The following
 blurb is direct from Sam:
 
 public version out "later this week" [as of 3/1/93].  The following
 blurb is direct from Sam:
 
-       $Header: /usr/people/sam/fax/RCS/HOWTO,v 1.14 93/05/24 11:42:16 sam Exp $
+       $Header: /a/cvs/386BSD/src/usr.sbin/sendmail/cf/README,v 1.6 1993/12/21 03:05:54 alm Exp $
 
        How To Obtain This Software (in case all you get is this file)
        --------------------------------------------------------------
 
        How To Obtain This Software (in case all you get is this file)
        --------------------------------------------------------------
@@ -826,7 +921,14 @@ Some options are likely to be deprecated in future versions -- that is,
 the option is only included to provide back-compatibility.  These are
 marked with "*".
 
 the option is only included to provide back-compatibility.  These are
 marked with "*".
 
+Remember that these options are M4 variables, and hence may need to
+be quoted.  In particular, arguments with commas will usually have to
+be ``double quoted, like this phrase'' to avoid having the comma
+confuse things.  This is common for alias file definitions and for
+the read timeout.
+
 M4 Variable Name       Default         Mac/Opt Description
 M4 Variable Name       Default         Mac/Opt Description
+================       =======         ======= ===========
 confMAILER_NAME                MAILER-DAEMON   Dn      The sender name used for
                                                internally generated
                                                outgoing messages.
 confMAILER_NAME                MAILER-DAEMON   Dn      The sender name used for
                                                internally generated
                                                outgoing messages.
@@ -846,8 +948,8 @@ confMIN_FREE_BLOCKS 4               Ob      Minimum number of free blocks
                                                SMTP mail.
 confBLANK_SUB          .               OB      Blank (space) substitution
                                                character.
                                                SMTP mail.
 confBLANK_SUB          .               OB      Blank (space) substitution
                                                character.
-confCON_EXPENSIVE      False           Oc      Connect immediately to
-                                               mailers marked expensive?
+confCON_EXPENSIVE      False           Oc      Avoid connecting immediately
+                                               to mailers marked expensive?
 confCHECKPOINT_INTERVAL        10              OC      Checkpoint queue files
                                                every N recipients.
 confDELIVERY_MODE      background      Od      Default delivery mode.
 confCHECKPOINT_INTERVAL        10              OC      Checkpoint queue files
                                                every N recipients.
 confDELIVERY_MODE      background      Od      Default delivery mode.
@@ -1019,8 +1121,8 @@ RULESETS (* means built in to sendmail)
 MAILERS
 
    0   local, prog     local and program mailers
 MAILERS
 
    0   local, prog     local and program mailers
-   1   smtp            SMTP channel
-   2   uucp            UNIX-to-UNIX Copy Program
+   1   [e]smtp, relay  SMTP channel
+   2   uucp-*          UNIX-to-UNIX Copy Program
    3   netnews         Network News delivery
    4   fax             Sam Leffler's FlexFAX software
 
    3   netnews         Network News delivery
    4   fax             Sam Leffler's FlexFAX software
 
@@ -1029,7 +1131,7 @@ MACROS
 
    A
    B   Bitnet Relay
 
    A
    B   Bitnet Relay
-   C   CSNET Relay
+   C
    D   The local domain -- usually not needed
    E
    F   FAX Relay
    D   The local domain -- usually not needed
    E
    F   FAX Relay
index a6b6499..05613df 100644 (file)
@@ -1,4 +1,4 @@
-#      @(#)Makefile    8.4 (Berkeley) 10/15/93
+#      @(#)Makefile    8.5 (Berkeley) 12/1/93
 
 M4=    m4
 #M4=   /usr/src/usr.bin/m4/obj/m4
 
 M4=    m4
 #M4=   /usr/src/usr.bin/m4/obj/m4
@@ -15,6 +15,7 @@ RM=   rm -f
 
 ALL=   cs-hidden.cf cs-exposed.cf \
        hpux-cs-exposed.cf hpux-cs-hidden.cf \
 
 ALL=   cs-hidden.cf cs-exposed.cf \
        hpux-cs-exposed.cf hpux-cs-hidden.cf \
+       riscos-cs-exposed.cf \
        sunos3.5-cs-exposed.cf sunos3.5-cs-hidden.cf \
        sunos4.1-cs-exposed.cf sunos4.1-cs-hidden.cf \
        ultrix4.1-cs-exposed.cf ultrix4.1-cs-hidden.cf \
        sunos3.5-cs-exposed.cf sunos3.5-cs-hidden.cf \
        sunos4.1-cs-exposed.cf sunos4.1-cs-hidden.cf \
        ultrix4.1-cs-exposed.cf ultrix4.1-cs-hidden.cf \
index c151c4e..c3320e0 100644 (file)
@@ -33,10 +33,9 @@ divert(-1)
 # SUCH DAMAGE.
 #
 divert(0)
 # SUCH DAMAGE.
 #
 divert(0)
-VERSIONID(`@(#)Berkeley.m4     8.3 (Berkeley) 10/5/93')
+VERSIONID(`@(#)Berkeley.m4     8.4 (Berkeley) 12/20/93')
 define(`UUCP_RELAY', `ucbvax.Berkeley.EDU')dnl
 define(`BITNET_RELAY', `jade.Berkeley.EDU')dnl
 define(`UUCP_RELAY', `ucbvax.Berkeley.EDU')dnl
 define(`BITNET_RELAY', `jade.Berkeley.EDU')dnl
-define(`CSNET_RELAY', `Relay.CV.COM')dnl
 define(`confFORWARD_PATH', `$z/.forward.$w:$z/.forward')dnl
 define(`confCW_FILE', `-o /etc/sendmail.cw')dnl
 FEATURE(redirect)dnl
 define(`confFORWARD_PATH', `$z/.forward.$w:$z/.forward')dnl
 define(`confCW_FILE', `-o /etc/sendmail.cw')dnl
 FEATURE(redirect)dnl
index f9302f4..d90bb10 100644 (file)
@@ -34,7 +34,7 @@ divert(-1)
 #
 
 divert(0)
 #
 
 divert(0)
-VERSIONID(`@(#)bitdomain.m4    8.3 (Berkeley) 8/7/93')
+VERSIONID(`@(#)bitdomain.m4    8.4 (Berkeley) 11/30/93')
 divert(-1)
 
 
 divert(-1)
 
 
@@ -45,5 +45,5 @@ POPDIVERT
 
 PUSHDIVERT(8)
 # handle BITNET mapping
 
 PUSHDIVERT(8)
 # handle BITNET mapping
-R$* < @ $+ .BITNET > $*                $: $1 < @ $(bitdomain $2 $: $2.BITNET $) > $3
+R$* < @ $+ .BITNET. > $*       $: $1 < @ $(bitdomain $2 $: $2.BITNET. $) > $3
 POPDIVERT
 POPDIVERT
index 941fad8..0f2199c 100644 (file)
@@ -34,13 +34,13 @@ divert(-1)
 #
 
 divert(0)
 #
 
 divert(0)
-VERSIONID(`@(#)redirect.m4     8.1 (Berkeley) 6/7/93')
+VERSIONID(`@(#)redirect.m4     8.2 (Berkeley) 12/27/93')
 divert(-1)
 
 
 PUSHDIVERT(3)
 # addresses sent to foo@host.REDIRECT will give a 551 error code
 divert(-1)
 
 
 PUSHDIVERT(3)
 # addresses sent to foo@host.REDIRECT will give a 551 error code
-R$* < @ $+ .REDIRECT > $# error $@ NOUSER $: "551 User not local; please try " <$1@$2>
+R$* < @ $+ .REDIRECT. >        $# error $@ NOUSER $: "551 User not local; please try " <$1@$2>
 POPDIVERT
 
 PUSHDIVERT(6)
 POPDIVERT
 
 PUSHDIVERT(6)
index c338766..931a315 100644 (file)
@@ -34,7 +34,7 @@ divert(-1)
 #
 
 divert(0)
 #
 
 divert(0)
-VERSIONID(`@(#)uucpdomain.m4   8.3 (Berkeley) 8/7/93')
+VERSIONID(`@(#)uucpdomain.m4   8.4 (Berkeley) 11/30/93')
 divert(-1)
 
 
 divert(-1)
 
 
@@ -45,5 +45,5 @@ POPDIVERT
 
 PUSHDIVERT(8)
 # handle UUCP mapping
 
 PUSHDIVERT(8)
 # handle UUCP mapping
-R$* < @ $+ .UUCP > $*          $: $1 < @ $(uudomain $2 $: $2.UUCP $) > $3
+R$* < @ $+ .UUCP. > $*         $: $1 < @ $(uudomain $2 $: $2.UUCP. $) > $3
 POPDIVERT
 POPDIVERT
index 117f4a3..528cbff 100644 (file)
@@ -51,6 +51,7 @@ divert(-1)
 
 changecom(\ 1)
 undefine(`format')
 
 changecom(\ 1)
 undefine(`format')
+undefine(`hpux')
 ifdef(`pushdef', `',
        `errprint(`You need a newer version of M4, at least as new as
 System V or GNU')
 ifdef(`pushdef', `',
        `errprint(`You need a newer version of M4, at least as new as
 System V or GNU')
@@ -92,7 +93,7 @@ define(`DOL', ``$'$1')
 define(`SITECONFIG',
 `CONCAT(D, $3, $2)
 define(`_CLASS_$3_', `')dnl
 define(`SITECONFIG',
 `CONCAT(D, $3, $2)
 define(`_CLASS_$3_', `')dnl
-ifelse($3, U, Cw$2, `dnl')
+ifelse($3, U, Cw$2 $2.UUCP, `dnl')
 define(`SITE', `ifelse(CONCAT($'2`, $3), SU,
                CONCAT(CY, $'1`),
                CONCAT(C, $3, $'1`))')
 define(`SITE', `ifelse(CONCAT($'2`, $3), SU,
                CONCAT(CY, $'1`),
                CONCAT(C, $3, $'1`))')
@@ -145,4 +146,4 @@ define(`confMIME_FORMAT_ERRORS', `True')
 define(`confTRY_NULL_MX_LIST', `False')
 
 divert(0)dnl
 define(`confTRY_NULL_MX_LIST', `False')
 
 divert(0)dnl
-VERSIONID(`@(#)cf.m4   8.2 (Berkeley) 7/18/93')
+VERSIONID(`@(#)cf.m4   8.4 (Berkeley) 12/24/93')
index 04019de..410e32b 100644 (file)
@@ -34,7 +34,7 @@ divert(-1)
 #
 divert(0)
 
 #
 divert(0)
 
-VERSIONID(`@(#)proto.m4        8.20 (Berkeley) 10/31/93')
+VERSIONID(`@(#)proto.m4        8.30 (Berkeley) 1/12/94')
 
 MAILER(local)dnl
 
 
 MAILER(local)dnl
 
@@ -92,12 +92,6 @@ ifdef(`BITNET_RELAY',
 DB`'BITNET_RELAY
 CPBITNET
 
 DB`'BITNET_RELAY
 CPBITNET
 
-')dnl
-ifdef(`CSNET_RELAY',
-`# CSNET relay host
-DC`'CSNET_RELAY
-CPCSNET
-
 ')dnl
 ifdef(`FAX_RELAY',
 `# FAX relay host
 ')dnl
 ifdef(`FAX_RELAY',
 `# FAX relay host
@@ -185,7 +179,7 @@ Ob`'confMIN_FREE_BLOCKS
 # substitution for space (blank) characters
 OB`'confBLANK_SUB
 
 # substitution for space (blank) characters
 OB`'confBLANK_SUB
 
-# connect to "expensive" mailers on initial submission?
+# avoid connecting to "expensive" mailers on initial submission?
 Oc`'confCON_EXPENSIVE
 
 # checkpoint queue runs after every N successful deliveries
 Oc`'confCON_EXPENSIVE
 
 # checkpoint queue runs after every N successful deliveries
@@ -420,6 +414,9 @@ R$+ @ $+            $: $1 < @ $2 >                  focus on domain
 R$+ < $+ @ $+ >                $1 $2 < @ $3 >                  move gaze right
 R$+ < @ $+ >           $@ $>_SET_96_ $1 < @ $2 >               already canonical
 
 R$+ < $+ @ $+ >                $1 $2 < @ $3 >                  move gaze right
 R$+ < @ $+ >           $@ $>_SET_96_ $1 < @ $2 >               already canonical
 
+# do some sanity checking
+R$* < @ $* : $* > $*   $1 < @ $2 $3 > $4               nix colons in addrs
+
 ifdef(`_NO_UUCP_', `dnl',
 `# convert old-style addresses to a domain-based address
 R$- ! $+               $@ $>_SET_96_ $2 < @ $1 .UUCP > resolve uucp names
 ifdef(`_NO_UUCP_', `dnl',
 `# convert old-style addresses to a domain-based address
 R$- ! $+               $@ $>_SET_96_ $2 < @ $1 .UUCP > resolve uucp names
@@ -458,31 +455,34 @@ undivert(2)dnl
 ifdef(`_NO_UUCP_', `dnl',
 `ifdef(`UUCP_RELAY',
 `# pass UUCP addresses straight through
 ifdef(`_NO_UUCP_', `dnl',
 `ifdef(`UUCP_RELAY',
 `# pass UUCP addresses straight through
-R$* < @ $+ . UUCP > $*         $@ $1 < @ $2 . UUCP > $3',
+R$* < @ $+ . UUCP > $*         $@ $1 < @ $2 . UUCP > $3',
 `# if really UUCP, handle it immediately
 ifdef(`_CLASS_U_',
 `# if really UUCP, handle it immediately
 ifdef(`_CLASS_U_',
-`R$* < @ $=U . UUCP > $*       $@ $1 < @ $2 . UUCP > $3', `dnl')
+`R$* < @ $=U . UUCP > $*       $@ $1 < @ $2 . UUCP > $3', `dnl')
 ifdef(`_CLASS_V_',
 ifdef(`_CLASS_V_',
-`R$* < @ $=V . UUCP > $*       $@ $1 < @ $2 . UUCP > $3', `dnl')
+`R$* < @ $=V . UUCP > $*       $@ $1 < @ $2 . UUCP > $3', `dnl')
 ifdef(`_CLASS_W_',
 ifdef(`_CLASS_W_',
-`R$* < @ $=W . UUCP > $*       $@ $1 < @ $2 . UUCP > $3', `dnl')
+`R$* < @ $=W . UUCP > $*       $@ $1 < @ $2 . UUCP > $3', `dnl')
 ifdef(`_CLASS_X_',
 ifdef(`_CLASS_X_',
-`R$* < @ $=X . UUCP > $*       $@ $1 < @ $2 . UUCP > $3', `dnl')
+`R$* < @ $=X . UUCP > $*       $@ $1 < @ $2 . UUCP > $3', `dnl')
 ifdef(`_CLASS_Y_',
 ifdef(`_CLASS_Y_',
-`R$* < @ $=Y . UUCP > $*       $@ $1 < @ $2 . UUCP > $3', `dnl')
+`R$* < @ $=Y . UUCP > $*       $@ $1 < @ $2 . UUCP > $3', `dnl')
 
 # try UUCP traffic as a local address
 
 # try UUCP traffic as a local address
-R$* < @ $+ . UUCP > $*         $: $1 < @ $[ $2 $] . UUCP > $3
+R$* < @ $+ . UUCP > $*         $: $1 < @ $[ $2 $] . UUCP > $3
 ifdef(`_OLD_SENDMAIL_',
 ifdef(`_OLD_SENDMAIL_',
-`R$* < @ $+ . $+ . UUCP > $*           $@ $1 < @ $2 . $3 . > $4',
-`R$* < @ $+ . . UUCP > $*              $@ $1 < @ $2 . > $3')')
+`R$* < @ $+ . $+ . UUCP . > $*         $@ $1 < @ $2 . $3 . > $4',
+`R$* < @ $+ . . UUCP . > $*            $@ $1 < @ $2 . > $3')')
 ')
 ')
-ifdef(`_NO_CANONIFY_',
-`# make sure local host names appear canonical
-R$* < @ $=w > $*               $: $1 < @ $2 . > $3',
+ifdef(`_NO_CANONIFY_', `dnl',
 `# pass to name server to make hostname canonical
 R$* < @ $* $~P > $*            $: $1 < @ $[ $2 $3 $] > $4')
 
 `# pass to name server to make hostname canonical
 R$* < @ $* $~P > $*            $: $1 < @ $[ $2 $3 $] > $4')
 
+# local host aliases and pseudo-domains are always canonical
+R$* < @ $=w > $*               $: $1 < @ $2 . > $3
+R$* < @ $* $=P > $*            $: $1 < @ $2 $3 . > $4
+R$* < @ $* . . > $*            $1 < @ $2 . > $3
+
 undivert(8)dnl
 
 # if this is the local hostname, make sure we treat is as canonical
 undivert(8)dnl
 
 # if this is the local hostname, make sure we treat is as canonical
@@ -534,13 +534,14 @@ S0
 
 R<@>                   $#_LOCAL_ $: <>                 special case error msgs
 R$*:;<@>               $#error $@ USAGE $: "list:; syntax illegal for recipient addresses"
 
 R<@>                   $#_LOCAL_ $: <>                 special case error msgs
 R$*:;<@>               $#error $@ USAGE $: "list:; syntax illegal for recipient addresses"
+R<@ $+>                        $#error $@ USAGE $: "user address required"
 
 ifdef(`_MAILER_smtp_',
 `# handle numeric address spec
 ifdef(`_NO_CANONIFY_', `dnl',
 `R$* < @ [ $+ ] > $*   $: $1 < @ $[ [$2] $] > $3       numeric internet addr')
 R$* < @ [ $+ ] > $*    $: $>_SET_98_ $1 < @ [ $2 ] > $3        numeric internet spec
 
 ifdef(`_MAILER_smtp_',
 `# handle numeric address spec
 ifdef(`_NO_CANONIFY_', `dnl',
 `R$* < @ [ $+ ] > $*   $: $1 < @ $[ [$2] $] > $3       numeric internet addr')
 R$* < @ [ $+ ] > $*    $: $>_SET_98_ $1 < @ [ $2 ] > $3        numeric internet spec
-R$* < @ [ $+ ] > $*    $#_SMTP_ $@ [$2] $: $1 @ [$2] $3        still numeric: send',
+R$* < @ [ $+ ] > $*    $#_SMTP_ $@ [$2] $: $1 < @ [$2] > $3    still numeric: send',
        `dnl')
 
 # now delete the local info -- note $=O to find characters that cause forwarding
        `dnl')
 
 # now delete the local info -- note $=O to find characters that cause forwarding
@@ -564,7 +565,7 @@ R< $+ > $*          $: $>90 <$1> $2                 try domain',
 ifdef(`_LOCAL_NOT_STICKY_',
 `R$=L < @ $=w . >              $#_LOCAL_ $: @ $1                       special local names
 R$+ < @ $=w . >                $#_LOCAL_ $: $1                 dispose directly',
 ifdef(`_LOCAL_NOT_STICKY_',
 `R$=L < @ $=w . >              $#_LOCAL_ $: @ $1                       special local names
 R$+ < @ $=w . >                $#_LOCAL_ $: $1                 dispose directly',
-`R$+ < @ $=w . >               $: $1 < @ $2 @ $H >             first try hub
+`R$+ < @ $=w . >               $: $1 < @ $2 . @ $H >           first try hub
 ifdef(`_OLD_SENDMAIL_',
 `R$+ < $+ @ $-:$+ >    $# $3 $@ $4 $: $1 < $2 >        yep ....
 R$+ < $+ @ $+ >                $#relay $@ $3 $: $1 < $2 >      yep ....
 ifdef(`_OLD_SENDMAIL_',
 `R$+ < $+ @ $-:$+ >    $# $3 $@ $4 $: $1 < $2 >        yep ....
 R$+ < $+ @ $+ >                $#relay $@ $3 $: $1 < $2 >      yep ....
@@ -576,39 +577,38 @@ undivert(4)dnl
 ifdef(`_NO_UUCP_', `dnl',
 `# resolve remotely connected UUCP links (if any)
 ifdef(`_CLASS_V_',
 ifdef(`_NO_UUCP_', `dnl',
 `# resolve remotely connected UUCP links (if any)
 ifdef(`_CLASS_V_',
-`R$* < @ $=V . UUCP > $*               $: $>_SET_95_ < $V > $1 <@$2.UUCP> $3',
+`R$* < @ $=V . UUCP . > $*             $: $>_SET_95_ < $V > $1 <@$2.UUCP.> $3',
        `dnl')
 ifdef(`_CLASS_W_',
        `dnl')
 ifdef(`_CLASS_W_',
-`R$* < @ $=W . UUCP > $*               $: $>_SET_95_ < $W > $1 <@$2.UUCP> $3',
+`R$* < @ $=W . UUCP . > $*             $: $>_SET_95_ < $W > $1 <@$2.UUCP.> $3',
        `dnl')
 ifdef(`_CLASS_X_',
        `dnl')
 ifdef(`_CLASS_X_',
-`R$* < @ $=X . UUCP > $*               $: $>_SET_95_ < $X > $1 <@$2.UUCP> $3',
+`R$* < @ $=X . UUCP . > $*             $: $>_SET_95_ < $X > $1 <@$2.UUCP.> $3',
        `dnl')')
 
 # resolve fake top level domains by forwarding to other hosts
 ifdef(`BITNET_RELAY',
        `dnl')')
 
 # resolve fake top level domains by forwarding to other hosts
 ifdef(`BITNET_RELAY',
-`R$*<@$+.BITNET>$*     $: $>_SET_95_ < $B > $1 <@$2.BITNET> $3 user@host.BITNET',
+`R$*<@$+.BITNET.>$*    $: $>_SET_95_ < $B > $1 <@$2.BITNET.> $3        user@host.BITNET',
        `dnl')
        `dnl')
-ifdef(`CSNET_RELAY',
-`R$*<@$+.CSNET>$*      $: $>_SET_95_ < $C > $1 <@$2.CSNET> $3  user@host.CSNET',
+ifdef(`_MAILER_pop_',
+`R$+ < @ POP. >                $#pop $: $1                     user@POP',
        `dnl')
 ifdef(`_MAILER_fax_',
        `dnl')
 ifdef(`_MAILER_fax_',
-`R$+ < @ $+ .FAX >     $#fax $@ $2 $: $1               user@host.FAX',
+`R$+ < @ $+ .FAX. >    $#fax $@ $2 $: $1               user@host.FAX',
 `ifdef(`FAX_RELAY',
 `ifdef(`FAX_RELAY',
-`R$*<@$+.FAX>$*                $: $>_SET_95_ < $F > $1 <@$2.FAX> $3    user@host.FAX',
+`R$*<@$+.FAX.>$*               $: $>_SET_95_ < $F > $1 <@$2.FAX.> $3   user@host.FAX',
        `dnl')')
 
 ifdef(`UUCP_RELAY',
 `# forward non-local UUCP traffic to our UUCP relay
        `dnl')')
 
 ifdef(`UUCP_RELAY',
 `# forward non-local UUCP traffic to our UUCP relay
-R$*<@$*.UUCP>$*                $: $>_SET_95_ < $Y > $1 @ <$2.UUCP> $3  uucp mail',
+R$*<@$*.UUCP.>$*               $: $>_SET_95_ < $Y > $1 <@$2.UUCP.> $3  uucp mail',
 `ifdef(`_MAILER_uucp_',
 `# forward other UUCP traffic straight to UUCP
 `ifdef(`_MAILER_uucp_',
 `# forward other UUCP traffic straight to UUCP
-R< @ $+ .UUCP > : $+   $#uucp $@ $1 $: $2              @host.UUCP:...
-R$+ < @ $+ .UUCP >     $#uucp $@ $2 $: $1              user@host.UUCP',
+R$* < @ $+ .UUCP. > $*         $#uucp $@ $2 $: $1 < @ $2 .UUCP. > $3   user@host.UUCP',
        `dnl')')
 ifdef(`_MAILER_usenet_', `
 # addresses sent to net.group.USENET will get forwarded to a newsgroup
        `dnl')')
 ifdef(`_MAILER_usenet_', `
 # addresses sent to net.group.USENET will get forwarded to a newsgroup
-R$+ . USENET           $#usenet $: $1',
+R$+ . USENET.          $#usenet $: $1',
        `dnl')
 
 ifdef(`_LOCAL_RULES_',
        `dnl')
 
 ifdef(`_LOCAL_RULES_',
index 835f0d6..d92f73f 100644 (file)
@@ -32,8 +32,8 @@ divert(-1)
 # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 # SUCH DAMAGE.
 #
 # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 # SUCH DAMAGE.
 #
-VERSIONID(`@(#)version.m4      8.6.1.4 (Berkeley) 10/31/93')
+VERSIONID(`@(#)version.m4      8.6.1.5 (Berkeley) 1/13/94')
 #
 divert(0)
 # Configuration version number
 #
 divert(0)
 # Configuration version number
-DZ8.6.4
+DZ8.6.5
diff --git a/usr.sbin/sendmail/cf/mailer/pop.m4 b/usr.sbin/sendmail/cf/mailer/pop.m4
new file mode 100644 (file)
index 0000000..2b816b9
--- /dev/null
@@ -0,0 +1,54 @@
+PUSHDIVERT(-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.
+#
+
+ifdef(`POP_MAILER_PATH',, `define(`POP_MAILER_PATH', /usr/lib/mh/spop)')
+ifdef(`POP_MAILER_FLAGS',, `define(`POP_MAILER_FLAGS', `eu')')
+ifdef(`POP_MAILER_ARGS',, `define(`POP_MAILER_ARGS', `pop $u')')
+
+POPDIVERT
+
+LOCAL_CONFIG
+# POP mailer is a pseudo-domain
+CPPOP
+POPDIVERT
+
+####################################
+###   POP Mailer specification   ###
+####################################
+
+VERSIONID(`@(#)pop.m4  8.1 (Berkeley) 12/15/93')
+
+Mpop,          P=POP_MAILER_PATH, F=CONCAT(`lsDFM', POP_MAILER_FLAGS), S=10, R=20/40,
+               A=POP_MAILER_ARGS
index 143095c..9b28f63 100644 (file)
@@ -40,13 +40,13 @@ POPDIVERT
 ###   SMTP Mailer specification   ###
 #####################################
 
 ###   SMTP Mailer specification   ###
 #####################################
 
-VERSIONID(`@(#)smtp.m4 8.7 (Berkeley) 10/31/93')
+VERSIONID(`@(#)smtp.m4 8.13 (Berkeley) 12/27/93')
 
 Msmtp,         P=[IPC], F=CONCAT(mDFMuX, SMTP_MAILER_FLAGS), S=11/31, R=ifdef(`_ALL_MASQUERADE_', `11/31', `21'), E=\r\n,
                ifdef(`_OLD_SENDMAIL_',, `L=990, ')A=IPC $h
 Mesmtp,                P=[IPC], F=CONCAT(mDFMuXa, SMTP_MAILER_FLAGS), S=11/31, R=ifdef(`_ALL_MASQUERADE_', `11/31', `21'), E=\r\n,
                ifdef(`_OLD_SENDMAIL_',, `L=990, ')A=IPC $h
 
 Msmtp,         P=[IPC], F=CONCAT(mDFMuX, SMTP_MAILER_FLAGS), S=11/31, R=ifdef(`_ALL_MASQUERADE_', `11/31', `21'), E=\r\n,
                ifdef(`_OLD_SENDMAIL_',, `L=990, ')A=IPC $h
 Mesmtp,                P=[IPC], F=CONCAT(mDFMuXa, SMTP_MAILER_FLAGS), S=11/31, R=ifdef(`_ALL_MASQUERADE_', `11/31', `21'), E=\r\n,
                ifdef(`_OLD_SENDMAIL_',, `L=990, ')A=IPC $h
-Mrelay,                P=[IPC], F=CONCAT(mDFMuXa, SMTP_MAILER_FLAGS), S=11/31, R=51, E=\r\n,
+Mrelay,                P=[IPC], F=CONCAT(mDFMuXa, SMTP_MAILER_FLAGS), S=11/31, R=61, E=\r\n,
                ifdef(`_OLD_SENDMAIL_',, `L=2040, ')A=IPC $h
 
 #
                ifdef(`_OLD_SENDMAIL_',, `L=2040, ')A=IPC $h
 
 #
@@ -55,10 +55,7 @@ Mrelay,              P=[IPC], F=CONCAT(mDFMuXa, SMTP_MAILER_FLAGS), S=11/31, R=51, E=\r\n,
 S11
 R$+                    $: $>51 $1                      sender/recipient common
 R$* :; <@>             $@ $1 :;                        list:; special case
 S11
 R$+                    $: $>51 $1                      sender/recipient common
 R$* :; <@>             $@ $1 :;                        list:; special case
-
-# handle unqualified names
-R$* < @ $* > $*                $@ $1 < @ $2 > $3               already qualified
-R$*                    $@ $>61 $1
+R$*                    $@ $>61 $1                      qualify unqual'ed names
 
 
 #
 
 
 #
@@ -87,14 +84,11 @@ R< @ $* > $*                $@ < @ $1 > $2                  pass route-addr through
 R$=E < @ $=w . >       $@ $1 < @ $2 >                  exposed user as is
 R$* < @ $=w . >                $: $1 < @ $M >                  masquerade as domain
 R$* < @ >              $: $1 < @ $j >                  in case $M undefined
 R$=E < @ $=w . >       $@ $1 < @ $2 >                  exposed user as is
 R$* < @ $=w . >                $: $1 < @ $M >                  masquerade as domain
 R$* < @ >              $: $1 < @ $j >                  in case $M undefined
-
-# handle unqualified names
-R$* < @ $* > $*                $@ $1 < @ $2 > $3               already qualified
-R$*                    $@ $>61 $1
+R$*                    $@ $>61 $1                      qualify unqual'ed names
 
 
 #
 
 
 #
-#  common rewriting for all SMTP addresses
+#  convert pseudo-domain addresses to real domain addresses
 #
 S51
 
 #
 S51
 
@@ -103,15 +97,21 @@ R< @ $+ > $*               $@ < @ $1 > $2                  resolve <route-addr>
 
 # output fake domains as user%fake@relay
 ifdef(`BITNET_RELAY',
 
 # output fake domains as user%fake@relay
 ifdef(`BITNET_RELAY',
-`R$+ <@ $+ . BITNET >  $: $1 % $2 .BITNET < @ $B >     user@host.BITNET
+`R$+ <@ $+ .BITNET. >  $: $1 % $2 .BITNET < @ $B >     user@host.BITNET
 R$+.BITNET <@ $+:$+ >  $: $1 .BITNET < @ $3 >          strip mailer: part',
        `dnl')
 R$+.BITNET <@ $+:$+ >  $: $1 .BITNET < @ $3 >          strip mailer: part',
        `dnl')
-ifdef(`CSNET_RELAY',
-`R$+ <@ $+ . CSNET >   $: $1 % $2 .CSNET < @ $C >      user@host.CSNET
-R$+.CSNET <@ $+:$+ >   $: $1 .CSNET < @ $3 >           strip mailer: part',
-       `dnl')
-ifdef(`_NO_UUCP_', `dnl',
-`R$+ <@ $+ . UUCP >    $: $2 ! $1 < @ $j >             user@host.UUCP')
+ifdef(`_NO_UUCP_', `dnl', `
+# do UUCP heuristics; note that these are shared with UUCP mailers
+R$+ < @ $+ .UUCP. >    $: < $2 ! > $1                  convert to UUCP form
+R$+ < @ $* > $*                $@ $1 < @ $2 > $3               not UUCP form
+
+# leave these in .UUCP form to avoid further tampering
+R< $&h ! > $- ! $+     $@ $2 < @ $1 .UUCP. >
+R< $&h ! > $-.$+ ! $+  $@ $3 < @ $1.$2 >
+R< $&h ! > $+          $@ $1 < @ $&h .UUCP. >
+R< $+ ! > $+           $: $1 ! $2 < @ $Y >
+R$+ < @ >              $: $1 < @ $j >                  in case $Y undefined
+R$+ < @ $+ : $+ >      $: $1 < @ $3 >                  strip mailer: part')
 
 
 #
 
 
 #
@@ -119,6 +119,7 @@ ifdef(`_NO_UUCP_', `dnl',
 #
 S61
 
 #
 S61
 
+R$* < @ $* > $*                $@ $1 < @ $2 > $3               already qualified
 R$=E                   $@ $1 < @ $j>                   show exposed names
 R$+                    $: $1 < @ $M >                  user w/o host
 R$+ <@>                        $: $1 < @ $j >                  in case $M undefined
 R$=E                   $@ $1 < @ $j>                   show exposed names
 R$+                    $: $1 < @ $M >                  user w/o host
 R$+ <@>                        $: $1 < @ $j >                  in case $M undefined
index c12de28..c4b5e8e 100644 (file)
@@ -42,19 +42,32 @@ POPDIVERT
 ###   UUCP Mailer specification   ###
 #####################################
 
 ###   UUCP Mailer specification   ###
 #####################################
 
-VERSIONID(`@(#)uucp.m4 8.6 (Berkeley) 10/31/93')
+VERSIONID(`@(#)uucp.m4 8.13 (Berkeley) 1/10/94')
 
 
-# old UUCP mailer
+#
+#  There are innumerable variations on the UUCP mailer.  It really
+#  is rather absurd.
+#
+
+# old UUCP mailer (two names)
 Muucp,         P=UUCP_MAILER_PATH, F=CONCAT(DFMhuU, UUCP_MAILER_FLAGS), S=12, R=22, M=UUCP_MAX_SIZE,
                A=UUCP_MAILER_ARGS
 Muucp,         P=UUCP_MAILER_PATH, F=CONCAT(DFMhuU, UUCP_MAILER_FLAGS), S=12, R=22, M=UUCP_MAX_SIZE,
                A=UUCP_MAILER_ARGS
+Muucp-old,     P=UUCP_MAILER_PATH, F=CONCAT(DFMhuU, UUCP_MAILER_FLAGS), S=12, R=22, M=UUCP_MAX_SIZE,
+               A=UUCP_MAILER_ARGS
 
 
-# smart UUCP mailer (handles multiple addresses)
+# smart UUCP mailer (handles multiple addresses) (two names)
 Msuucp,                P=UUCP_MAILER_PATH, F=CONCAT(mDFMhuU, UUCP_MAILER_FLAGS), S=12, R=22, M=UUCP_MAX_SIZE,
                A=UUCP_MAILER_ARGS
 Msuucp,                P=UUCP_MAILER_PATH, F=CONCAT(mDFMhuU, UUCP_MAILER_FLAGS), S=12, R=22, M=UUCP_MAX_SIZE,
                A=UUCP_MAILER_ARGS
+Muucp-new,     P=UUCP_MAILER_PATH, F=CONCAT(mDFMhuU, UUCP_MAILER_FLAGS), S=12, R=22, M=UUCP_MAX_SIZE,
+               A=UUCP_MAILER_ARGS
 
 ifdef(`_MAILER_smtp_',
 `# domain-ized UUCP mailer
 Muucp-dom,     P=UUCP_MAILER_PATH, F=CONCAT(mDFMhu, UUCP_MAILER_FLAGS), S=52/31, R=ifdef(`_ALL_MASQUERADE_', `11/31', `21'), M=UUCP_MAX_SIZE,
 
 ifdef(`_MAILER_smtp_',
 `# domain-ized UUCP mailer
 Muucp-dom,     P=UUCP_MAILER_PATH, F=CONCAT(mDFMhu, UUCP_MAILER_FLAGS), S=52/31, R=ifdef(`_ALL_MASQUERADE_', `11/31', `21'), M=UUCP_MAX_SIZE,
+               A=UUCP_MAILER_ARGS
+
+# domain-ized UUCP mailer with UUCP-style sender envelope
+Muucp-uudom,   P=UUCP_MAILER_PATH, F=CONCAT(mDFMhu, UUCP_MAILER_FLAGS), S=72/31, R=ifdef(`_ALL_MASQUERADE_', `11/31', `21'), M=UUCP_MAX_SIZE,
                A=UUCP_MAILER_ARGS')
 
 
                A=UUCP_MAILER_ARGS')
 
 
@@ -70,10 +83,15 @@ R<@>                                $n                      errors to mailer-daemon
 R$* :; <@>                     $@ $1 :;
 
 R$* < @ $* . >                 $1 < @ $2 >             strip trailing dots
 R$* :; <@>                     $@ $1 :;
 
 R$* < @ $* . >                 $1 < @ $2 >             strip trailing dots
-R$* < @ $j >                   $1                      strip local name
+R$* < @ $=w >                  $1                      strip local name
+R<@ $- . UUCP > : $+           $1 ! $2                 convert to UUCP format
+R<@ $+ > : $+                  $1 ! $2                 convert to UUCP format
 R$* < @ $- . UUCP >            $2 ! $1                 convert to UUCP format
 R$* < @ $+ >                   $2 ! $1                 convert to UUCP format
 R$* < @ $- . UUCP >            $2 ! $1                 convert to UUCP format
 R$* < @ $+ >                   $2 ! $1                 convert to UUCP format
+R$&h ! $+ ! $+                 $@ $1 ! $2              $h!...!user => ...!user
+R$&h ! $+                      $@ $&h ! $1             $h!user => $h!user
 R$+                            $: $U ! $1              prepend our name
 R$+                            $: $U ! $1              prepend our name
+R! $+                          $: $k ! $1              in case $U undefined
 
 #
 #  envelope and header recipient rewriting
 
 #
 #  envelope and header recipient rewriting
@@ -81,15 +99,22 @@ R$+                         $: $U ! $1              prepend our name
 S22
 
 # don't touch list:; syntax
 S22
 
 # don't touch list:; syntax
-R$* :; <@>                     $@ $1 ;:
+R$* :; <@>                     $@ $1 :;
 
 R$* < @ $* . >                 $1 < @ $2 >             strip trailing dots
 R$* < @ $j >                   $1                      strip local name
 
 R$* < @ $* . >                 $1 < @ $2 >             strip trailing dots
 R$* < @ $j >                   $1                      strip local name
+R<@ $- . UUCP > : $+           $1 ! $2                 convert to UUCP format
+R<@ $+ > : $+                  $1 ! $2                 convert to UUCP format
 R$* < @ $- . UUCP >            $2 ! $1                 convert to UUCP format
 R$* < @ $+ >                   $2 ! $1                 convert to UUCP format
 R$* < @ $- . UUCP >            $2 ! $1                 convert to UUCP format
 R$* < @ $+ >                   $2 ! $1                 convert to UUCP format
+R$&h ! $+ ! $+                 $@ $1 ! $2              $h!...!user => ...!user
+R$&h ! $+                      $@ $&h ! $1             $h!user => $h!user
+R$+                            $: $U ! $1              prepend our name
+R! $+                          $: $k ! $1              in case $U undefined
 
 
 
 
-#
+ifdef(`_MAILER_smtp_',
+`#
 #  envelope sender rewriting for uucp-dom mailer
 #
 S52
 #  envelope sender rewriting for uucp-dom mailer
 #
 S52
@@ -100,13 +125,33 @@ R<@>                              $n                      errors to mailer-daemon
 # pass everything to standard SMTP mailer rewriting
 R$*                            $@ $>11 $1
 
 # pass everything to standard SMTP mailer rewriting
 R$*                            $@ $>11 $1
 
+#
+#  envelope sender rewriting for uucp-uudom mailer
+#
+S72
+
+# handle error address as a special case
+R<@>                           $n                      errors to mailer-daemon
+
+# do not qualify list:; syntax
+R$* :; <@>                     $@ $1 :;
+
+R$* < @ $* . >                 $1 < @ $2 >             strip trailing dots
+R$* < @ $=w >                  $1                      strip local name
+R<@ $- . UUCP > : $+           $1 ! $2                 convert to UUCP format
+R<@ $+ > : $+                  $1 ! $2                 convert to UUCP format
+R$* < @ $- . UUCP >            $2 ! $1                 convert to UUCP format
+R$* < @ $+ >                   $@ $2 ! $1              convert to UUCP format
+
+R$&h ! $+ ! $+                 $@ $1 ! $2              $h!...!user => ...!user
+R$&h ! $+                      $@ $&h ! $1             $h!user => $h!user
+R$+                            $: $M ! $1              prepend masquerade name
+R! $+                          $: $j ! $1              in case $M undefined')
+
 
 PUSHDIVERT(4)
 # resolve locally connected UUCP links
 
 PUSHDIVERT(4)
 # resolve locally connected UUCP links
-R< @ $=Z . UUCP > : $+         $#uucp-dom $@ $1 $: $2  @host.UUCP: ...
-R$+ < @ $=Z . UUCP >           $#uucp-dom $@ $2 $: $1  user@host.UUCP
-R< @ $=Y . UUCP > : $+         $#suucp $@ $1 $: $2     @host.UUCP: ...
-R$+ < @ $=Y . UUCP >           $#suucp $@ $2 $: $1     user@host.UUCP
-R< @ $=U . UUCP > : $+         $#uucp $@ $1 $: $2      @host.UUCP: ...
-R$+ < @ $=U . UUCP >           $#uucp $@ $2 $: $1      user@host.UUCP
+R$* < @ $=Z . UUCP. > $*       $#uucp-uudom $@ $1 $: $1 < @ $2 .UUCP. > $3     @host.UUCP: ...
+R$* < @ $=Y . UUCP. > $*       $#uucp-new $@ $2 $: $1 < @ $2 .UUCP. > $3
+R$* < @ $=U . UUCP. > $*       $#uucp-old $@ $2 $: $1 < @ $2 .UUCP. > $3
 POPDIVERT
 POPDIVERT
diff --git a/usr.sbin/sendmail/cf/ostype/bsdi1.0.m4 b/usr.sbin/sendmail/cf/ostype/bsdi1.0.m4
new file mode 100644 (file)
index 0000000..28088f0
--- /dev/null
@@ -0,0 +1,38 @@
+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(`@(#)bsdi1.0.m4      8.1 (Berkeley) 12/11/93')dnl
+OSTYPE(bsd4.4)
diff --git a/usr.sbin/sendmail/cf/ostype/dgux.m4 b/usr.sbin/sendmail/cf/ostype/dgux.m4
new file mode 100644 (file)
index 0000000..38c1c1a
--- /dev/null
@@ -0,0 +1,39 @@
+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(`@(#)dgux.m4 8.1 (Berkeley) 11/27/93')
+define(`LOCAL_MAILER_FLAGS', m)dnl
+define(`confTIME_ZONE', `USE_TZ')dnl
diff --git a/usr.sbin/sendmail/cf/ostype/dynix3.2.m4 b/usr.sbin/sendmail/cf/ostype/dynix3.2.m4
new file mode 100644 (file)
index 0000000..a4d6e52
--- /dev/null
@@ -0,0 +1,39 @@
+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(`@(#)dynix3.2.m4     8.1 (Berkeley) 11/27/93')
+define(`ALIAS_FILE', /usr/lib/aliases)dnl
+define(`QUEUE_DIR', /usr/spool/mqueue)dnl
index 0a1d097..1be21f3 100644 (file)
@@ -34,10 +34,11 @@ divert(-1)
 #
 
 divert(0)
 #
 
 divert(0)
-VERSIONID(`@(#)hpux.m4 8.4 (Berkeley) 8/24/93')
+VERSIONID(`@(#)hpux.m4 8.5 (Berkeley) 1/9/94')
 
 define(`QUEUE_DIR', /usr/spool/mqueue)dnl
 define(`ALIAS_FILE', /usr/lib/aliases)dnl
 define(`STATUS_FILE', /usr/lib/sendmail.st)dnl
 define(`LOCAL_MAILER_FLAGS', `m')dnl
 
 define(`QUEUE_DIR', /usr/spool/mqueue)dnl
 define(`ALIAS_FILE', /usr/lib/aliases)dnl
 define(`STATUS_FILE', /usr/lib/sendmail.st)dnl
 define(`LOCAL_MAILER_FLAGS', `m')dnl
+define(`UUCP_MAILER_ARGS', `uux - -r -a$f -gC $h!rmail ($u)')dnl
 define(`confTIME_ZONE', `USE_TZ')dnl
 define(`confTIME_ZONE', `USE_TZ')dnl
index 6baf60b..752c04d 100644 (file)
@@ -34,5 +34,8 @@ divert(-1)
 #
 
 divert(0)
 #
 
 divert(0)
-VERSIONID(`@(#)irix.m4 8.2 (Berkeley) 8/8/93')
+VERSIONID(`@(#)irix.m4 8.3 (Berkeley) 11/27/93')
 define(`LOCAL_MAILER_FLAGS', Ehmu)dnl
 define(`LOCAL_MAILER_FLAGS', Ehmu)dnl
+define(`QUEUE_DIR', /usr/spool/mqueue)dnl
+define(`ALIAS_FILE', /usr/lib/aliases)dnl
+define(`STATUS_FILE', /usr/lib/sendmail.st)dnl
index a005dc9..8144c3e 100644 (file)
@@ -34,9 +34,11 @@ divert(-1)
 #
 
 divert(0)
 #
 
 divert(0)
-VERSIONID(`@(#)nextstep.m4     8.3 (Berkeley) 8/13/93')
+VERSIONID(`@(#)nextstep.m4     8.4 (Berkeley) 11/30/93')
 define(`ALIAS_FILE', /etc/sendmail/aliases)dnl
 define(`HELP_FILE', /usr/lib/sendmail.hf)dnl
 define(`STATUS_FILE', /etc/sendmail/sendmail.st)dnl
 define(`UUCP_MAILER_PATH', /usr/bin/uux)dnl
 define(`QUEUE_DIR', /usr/spool/mqueue)dnl
 define(`ALIAS_FILE', /etc/sendmail/aliases)dnl
 define(`HELP_FILE', /usr/lib/sendmail.hf)dnl
 define(`STATUS_FILE', /etc/sendmail/sendmail.st)dnl
 define(`UUCP_MAILER_PATH', /usr/bin/uux)dnl
 define(`QUEUE_DIR', /usr/spool/mqueue)dnl
+define(`LOCAL_MAILER_FLAGS', `rmnP')dnl
+define(`LOCAL_SHELL_FLAGS', `euP')dnl
index 847cb0e..b45b252 100644 (file)
@@ -34,4 +34,9 @@ divert(-1)
 #
 
 divert(0)
 #
 
 divert(0)
-VERSIONID(`@(#)riscos4.5.m4    8.1 (Berkeley) 6/7/93')
+VERSIONID(`@(#)riscos4.5.m4    8.2 (Berkeley) 12/1/93')
+
+define(`LOCAL_MAILER_ARGS', `rmail -d $u')dnl
+define(`ALIAS_FILE', `/usr/lib/aliases')dnl
+define(`QUEUE_DIR', `/usr/spool/mqueue')dnl
+define(`HELP_FILE', `/usr/lib/sendmail.hf')dnl
diff --git a/usr.sbin/sendmail/cf/ostype/sco3.2.m4 b/usr.sbin/sendmail/cf/ostype/sco3.2.m4
new file mode 100644 (file)
index 0000000..08ed0fd
--- /dev/null
@@ -0,0 +1,45 @@
+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(`@(#)sco32.m4        8.1 (Berkeley) 11/27/93')
+define(`ALIAS_FILE', /usr/lib/mail/aliases)dnl
+define(`QUEUE_DIR', /usr/spool/mqueue)dnl
+define(`STATUS_FILE', /usr/lib/sendmail.st)dnl
+define(`UUCP_MAILER_PATH', /usr/bin/uux)dnl
+define(`LOCAL_MAILER_PATH', /usr/bin/lmail)dnl
+define(`LOCAL_MAILER_FLAGS', PuhCE)dnl
+define(`LOCAL_MAILER_ARGS', `lmail $u')dnl
+define(`LOCAL_SHELL_FLAGS', Peu)dnl
index 5d7b1b5..0ad2bb6 100644 (file)
@@ -30,7 +30,7 @@
 .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 .\" SUCH DAMAGE.
 .\"
 .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 .\" SUCH DAMAGE.
 .\"
-.\"    @(#)op.me       8.26 (Berkeley) 10/14/93
+.\"    @(#)op.me       8.32 (Berkeley) 1/12/94
 .\"
 .\" eqn op.me | pic | troff -me
 .eh 'SMM:08-%''Sendmail Installation and Operation Guide'
 .\"
 .\" eqn op.me | pic | troff -me
 .eh 'SMM:08-%''Sendmail Installation and Operation Guide'
@@ -69,7 +69,7 @@ University of California, Berkeley
 Mammoth Project
 eric@CS.Berkeley.EDU
 .sp
 Mammoth Project
 eric@CS.Berkeley.EDU
 .sp
-Version 8.26
+Version 8.32
 .sp
 For Sendmail Version 8.6
 .)l
 .sp
 For Sendmail Version 8.6
 .)l
@@ -185,7 +185,7 @@ normally
 on 4.4BSD.
 .pp
 If you are loading this off the tape,
 on 4.4BSD.
 .pp
 If you are loading this off the tape,
-continue with the next session.
+continue with the next section.
 If you have a running binary already on your system,
 you should probably skip to section 1.2.
 .sh 2 "Compiling Sendmail"
 If you have a running binary already on your system,
 you should probably skip to section 1.2.
 .sh 2 "Compiling Sendmail"
@@ -576,15 +576,13 @@ The format of this file is detailed in later sections
 of this document.
 .sh 3 "/usr/\*(SB/newaliases"
 .pp
 of this document.
 .sh 3 "/usr/\*(SB/newaliases"
 .pp
-If you are running delivermail,
-it is critical that the
+The
 .i newaliases
 .i newaliases
-command be replaced.
-This can just be a link to
+command should just be a link to
 .i sendmail :
 .(b
 rm \-f /usr/\*(SB/newaliases
 .i sendmail :
 .(b
 rm \-f /usr/\*(SB/newaliases
-ln /usr/\*(SD/sendmail /usr/\*(SB/newaliases
+ln \-s /usr/\*(SD/sendmail /usr/\*(SB/newaliases
 .)b
 This can be installed in whatever search path you prefer
 for your system.
 .)b
 This can be installed in whatever search path you prefer
 for your system.
@@ -808,6 +806,11 @@ This should be a link to /usr/\*(SD/sendmail.
 The system log is supported by the
 .i syslogd \|(8)
 program.
 The system log is supported by the
 .i syslogd \|(8)
 program.
+All messages from
+.i sendmail
+are logged under the
+.sm LOG_MAIL
+facility.
 .sh 3 "Format"
 .pp
 Each line in the system log
 .sh 3 "Format"
 .pp
 Each line in the system log
@@ -994,6 +997,16 @@ and then the map named
 .q mail.aliases
 in
 .q my.nis.domain .
 .q mail.aliases
 in
 .q my.nis.domain .
+Warning: if you build your own
+.sm NIS -based
+alias files,
+be sure to provide the
+.b \-l
+flag to
+.i makedbm (8)
+to map upper case letters in the keys to lower case;
+otherwise, aliases with upper case letters in their names
+won't match incoming addresses.
 .pp
 Additional flags can be added after the colon
 exactly like a
 .pp
 Additional flags can be added after the colon
 exactly like a
@@ -1074,11 +1087,7 @@ it checks to insure that this entry exists\**.
 .q a
 option is required in the configuration
 for this action to occur.
 .q a
 option is required in the configuration
 for this action to occur.
-This should normally be specified
-unless you are running
-.i delivermail
-in parallel with
-.i sendmail.
+This should normally be specified.
 .)f
 .sh 3 "List owners"
 .pp
 .)f
 .sh 3 "List owners"
 .pp
@@ -1438,6 +1447,18 @@ All message traffic in and out of
 .i sendmail ,
 including the incoming SMTP traffic,
 will be logged in this file.
 .i sendmail ,
 including the incoming SMTP traffic,
 will be logged in this file.
+.sh 2 "Dumping State"
+.pp
+You can ask
+.i sendmail
+to log a dump of the open files
+and the connection cache
+by sending it a
+.sm SIGUSR1
+signal.
+The results are logged at
+.sm LOG_DEBUG
+priority.
 .sh 1 "TUNING"
 .pp
 There are a number of configuration parameters
 .sh 1 "TUNING"
 .pp
 There are a number of configuration parameters
@@ -2381,7 +2402,7 @@ The
 .b $)
 syntax is a more general form of lookup;
 it uses a named map instead of an implicit map.
 .b $)
 syntax is a more general form of lookup;
 it uses a named map instead of an implicit map.
-If no lookup is found, the indicted
+If no lookup is found, the indicated
 .i default
 is inserted;
 if no default is specified and no lookup matches,
 .i default
 is inserted;
 if no default is specified and no lookup matches,
@@ -2444,12 +2465,21 @@ the
 may be a colon-separated list of hosts
 that are searched in order for the first working address
 (exactly like MX records).
 may be a colon-separated list of hosts
 that are searched in order for the first working address
 (exactly like MX records).
+The
+.i user
+is later rewritten by the mailer-specific envelope rewriting set
+and assigned to the
+.b $u
+macro.
 .pp
 .pp
+Normally, a ruleset that matches is retried,
+that is,
+the ruleset loops until it fails.
 A RHS may also be preceded by a
 .b $@
 or a
 .b $:
 A RHS may also be preceded by a
 .b $@
 or a
 .b $:
-to control evaluation.
+to change this behavior.
 A
 .b $@
 prefix causes the ruleset to return with the remainder of the RHS
 A
 .b $@
 prefix causes the ruleset to return with the remainder of the RHS
@@ -2794,7 +2824,7 @@ is equivalent to
 Defaults to
 .q MAILER-DAEMON .
 .ip $o\(dg
 Defaults to
 .q MAILER-DAEMON .
 .ip $o\(dg
-.b "The set of "operators" in addresses."
+.b "The set of \*(lqoperators\*(rq in addresses."
 A list of characters
 which will be considered tokens
 and which will separate tokens
 A list of characters
 which will be considered tokens
 and which will separate tokens
@@ -3109,6 +3139,27 @@ The class
 is set to be the same as
 .b $k ,
 that is, the UUCP node name.
 is set to be the same as
 .b $k ,
 that is, the UUCP node name.
+.pp
+The class
+.b $=m
+is set to the set of domains by which this host is known,
+initially just
+.b $m .
+.pp
+.i Sendmail
+can be compiled to allow a
+.i scanf (3)
+string on the
+.b F
+line.
+This lets you do simplistic parsing of text files.
+For example, to read all the user names in your system
+.i /etc/passwd
+file into a class, use
+.(b
+FL/etc/passwd %[^:]
+.)b
+which reads every line up to the first colon.
 .sh 3 "M \*- define mailer"
 .pp
 Programs and interfaces to mailers
 .sh 3 "M \*- define mailer"
 .pp
 Programs and interfaces to mailers
@@ -3698,7 +3749,7 @@ and then in
 .ip k\fIN\fP
 The maximum number of open connections that will be cached at a time.
 The default is one.
 .ip k\fIN\fP
 The maximum number of open connections that will be cached at a time.
 The default is one.
-This delays closing the the current connection until
+This delays closing the current connection until
 either this invocation of
 .i sendmail
 needs to connect to another host
 either this invocation of
 .i sendmail
 needs to connect to another host
@@ -3794,6 +3845,7 @@ novrfy    Disallow VRFY entirely
 restrictmailq  Restrict mailq command
 restrictqrun   Restrict \-q command line flag
 goaway Disallow essentially all SMTP status queries
 restrictmailq  Restrict mailq command
 restrictqrun   Restrict \-q command line flag
 goaway Disallow essentially all SMTP status queries
+authwarnings   Put X-Authentication-Warning: headers in messages
 .)b
 The
 .q goaway
 .)b
 The
 .q goaway
@@ -3807,6 +3859,9 @@ can print the queue.
 If queue runs are restricted,
 only root and the owner of the queue directory
 can run the queue.
 If queue runs are restricted,
 only root and the owner of the queue directory
 can run the queue.
+Authentication Warnings add warnings about various conditions
+that may indicate attempts to spoof the mail system,
+such as using an non-standard queue directory.
 .ip P\fIpostmaster\fP
 If set,
 copies of error messages will be sent to the named
 .ip P\fIpostmaster\fP
 If set,
 copies of error messages will be sent to the named
@@ -3893,7 +3948,7 @@ always instantiate the queue file,
 even if you are going to attempt immediate delivery.
 .i Sendmail
 always instantiates the queue file
 even if you are going to attempt immediate delivery.
 .i Sendmail
 always instantiates the queue file
-before returning control the the client
+before returning control the client
 under any circumstances.
 .ip S\fIfile\fP
 Log statistics in the named
 under any circumstances.
 .ip S\fIfile\fP
 Log statistics in the named
@@ -4165,6 +4220,21 @@ Version level five configuration files
 change the default definition of
 .b $w
 to be just the first component of the hostname.
 change the default definition of
 .b $w
 to be just the first component of the hostname.
+.pp
+The
+.b V
+line may have an optional
+.b / \c
+.i vendor
+to indicate that this configuration file uses modifications
+specific to a particular vendor\**.
+.(f
+\**And of course, vendors are encouraged to add themselves
+to the list of recognized vendors by editing the routine
+.i setvendor
+in
+.i conf.c .
+.)f
 .sh 3 "K \*- key file declaration"
 .pp
 Special maps can be defined using the line:
 .sh 3 "K \*- key file declaration"
 .pp
 Special maps can be defined using the line:
@@ -4265,7 +4335,7 @@ library,
 and the third requires that
 .i sendmail
 be compiled with NIS support.
 and the third requires that
 .i sendmail
 be compiled with NIS support.
-All four accept as arguments the some optional flags
+All four accept as arguments the same optional flags
 and a filename
 (or a mapname for NIS;
 the filename is the root of the database path,
 and a filename
 (or a mapname for NIS;
 the filename is the root of the database path,
@@ -4616,7 +4686,7 @@ This would require that each host
 know exactly where each network connection is,
 possibly including the names of each host on that network.
 As long as the site remains small
 know exactly where each network connection is,
 possibly including the names of each host on that network.
 As long as the site remains small
-and the the configuration remains relatively static,
+and the configuration remains relatively static,
 the update problem will probably not be too great.
 .sh 4 "Single host"
 .pp
 the update problem will probably not be too great.
 .sh 4 "Single host"
 .pp
@@ -4944,8 +5014,10 @@ To: wnj@monet.CS.Berkeley.EDU, mckusick@vangogh.CS.Berkeley.EDU
 .i "if and only if"
 the
 .q C
 .i "if and only if"
 the
 .q C
-flag is defined in the mailer corresponding to
-.q eric@vangogh.CS.Berkeley.EDU.
+flag is defined in the mailer resolved to
+by running
+.q eric@vangogh.CS.Berkeley.EDU
+through rulesets 3 and 0.
 .pp
 Other flags are described
 in Appendix C.
 .pp
 Other flags are described
 in Appendix C.
@@ -4998,7 +5070,7 @@ The usual backslash escapes
 may be used.
 .pp
 Finally,
 may be used.
 .pp
 Finally,
-an argv template is given as the E field.
+an argv template is given as the A field.
 It may have embedded spaces.
 If there is no argv with a
 .b $u
 It may have embedded spaces.
 If there is no argv with a
 .b $u
@@ -5175,7 +5247,7 @@ If a
 .q maildrop
 is found for the user,
 but no corresponding
 .q maildrop
 is found for the user,
 but no corresponding
-.q maildrop
+.q mailname
 record exists,
 the record
 .q :default:mailname
 record exists,
 the record
 .q :default:mailname
@@ -5310,7 +5382,7 @@ The pathname of the sendmail.pid file.
 The load average type.
 Details are described below.
 .lp
 The load average type.
 Details are described below.
 .lp
-The are four built-in ways of computing the load average.
+The are several built-in ways of computing the load average.
 .i Sendmail
 tries to auto-configure them based on imperfect guesses;
 you can select one using the
 .i Sendmail
 tries to auto-configure them based on imperfect guesses;
 you can select one using the
@@ -5332,6 +5404,8 @@ The actual values are scaled by a factor FSCALE
 .ip LA_FLOAT
 The kernel stores the load average in the kernel as an array of
 double precision floats.
 .ip LA_FLOAT
 The kernel stores the load average in the kernel as an array of
 double precision floats.
+.ip LA_MACH
+Use MACH-style load averages.
 .ip LA_SUBR
 Call the
 .i getloadavg
 .ip LA_SUBR
 Call the
 .i getloadavg
@@ -6009,7 +6083,7 @@ This version avoids that use.
 However, for compatibility with RFC 822,
 you can set option `7' to get seven bit stripping.
 .pp
 However, for compatibility with RFC 822,
 you can set option `7' to get seven bit stripping.
 .pp
-Individual mailers can still produce seven bit out put using the
+Individual mailers can still produce seven bit output using the
 `7' mailer flag.
 .sh 2 "User Database"
 .pp
 `7' mailer flag.
 .sh 2 "User Database"
 .pp
@@ -6517,9 +6591,7 @@ for debugging mailer problems.
 This produces a lot of data very quickly and should be used sparingly.
 .pp
 There are a number of options that may be specified as
 This produces a lot of data very quickly and should be used sparingly.
 .pp
 There are a number of options that may be specified as
-primitive flags
-(provided for compatibility with
-.i delivermail ).
+primitive flags.
 These are the e, i, m, and v options.
 Also,
 the f option
 These are the e, i, m, and v options.
 Also,
 the f option
@@ -6803,7 +6875,7 @@ A transcript of the current session.
 .\"Eric Allman
 .\"Britton-Lee, Inc.
 .\".sp
 .\"Eric Allman
 .\"Britton-Lee, Inc.
 .\".sp
-.\"Version 8.26
+.\"Version 8.32
 .\".ce 0
 .bp 2
 .rs
 .\".ce 0
 .bp 2
 .rs
index 2a9070f..1e11b01 100644 (file)
@@ -40,7 +40,7 @@ static char copyright[] =
 #endif /* not lint */
 
 #ifndef lint
 #endif /* not lint */
 
 #ifndef lint
-static char sccsid[] = "@(#)mailstats.c        8.2 (Berkeley) 7/27/93";
+static char sccsid[] = "@(#)mailstats.c        8.3 (Berkeley) 12/27/93";
 #endif /* not lint */
 
 #include <sendmail.h>
 #endif /* not lint */
 
 #include <sendmail.h>
@@ -63,6 +63,7 @@ main(argc, argv)
        char *cfile;
        FILE *cfp;
        bool mnames;
        char *cfile;
        FILE *cfp;
        bool mnames;
+       long frmsgs = 0, frbytes = 0, tomsgs = 0, tobytes = 0;
        char mtable[MAXMAILERS][MNAMELEN+1];
        char sfilebuf[100];
        char buf[MAXLINE];
        char mtable[MAXMAILERS][MNAMELEN+1];
        char sfilebuf[100];
        char buf[MAXLINE];
@@ -195,7 +196,14 @@ main(argc, argv)
                        if (mnames)
                                printf("  %s", mtable[i]);
                        printf("\n");
                        if (mnames)
                                printf("  %s", mtable[i]);
                        printf("\n");
+                       frmsgs += stat.stat_nf[i];
+                       frbytes += stat.stat_bf[i];
+                       tomsgs += stat.stat_nt[i];
+                       tobytes += stat.stat_bt[i];
                }
        }
                }
        }
+       printf("========================================\n");
+       printf(" T %6ld %10ldK %6ld %10ldK\n",
+               frmsgs, frbytes, tomsgs, tobytes);
        exit(EX_OK);
 }
        exit(EX_OK);
 }
index c4ac74e..1cc9b59 100644 (file)
@@ -2,7 +2,7 @@
 
 PROG=  makemap
 MAN8=  makemap.8
 
 PROG=  makemap
 MAN8=  makemap.8
-CFLAGS+=-I${.CURDIR}/../src -DNDBM -DNEWDB
+CFLAGS+=-I${.CURDIR}/../src -DNEWDB
 
 .include "../../Makefile.inc"
 .include <bsd.prog.mk>
 
 .include "../../Makefile.inc"
 .include <bsd.prog.mk>
diff --git a/usr.sbin/sendmail/makemap/Makefile.dist b/usr.sbin/sendmail/makemap/Makefile.dist
new file mode 100644 (file)
index 0000000..3e7817a
--- /dev/null
@@ -0,0 +1,81 @@
+#
+#  This Makefile is designed to work on the old "make" program.  It does
+#  not use the obj subdirectory.  It also does not install documentation
+#  automatically -- think of it as a quick start for sites that have the
+#  old make program (I recommend that you get and port the new make if you
+#  are going to be doing any signficant work on sendmail).
+#
+#      @(#)Makefile.dist       8.2 (Berkeley) 11/27/93
+#
+
+# use O=-O (usual) or O=-g (debugging)
+O=     -O
+
+# location of sendmail source directory
+SRCDIR=        ../src
+
+# define the database mechanisms available for map & alias lookups:
+#      -DNDBM -- use new DBM
+#      -DNEWDB -- use new Berkeley DB
+# The really old (V7) DBM library is no longer supported.
+#
+DBMDEF=        -DNDBM -DNEWDB
+
+# environment definitions (e.g., -D_AIX3)
+ENVDEF=
+
+# see also conf.h for additional compilation flags
+
+# include directories
+INCDIRS=-I${SRCDIR} -I/usr/sww/include/db
+
+# loader options
+LDOPTS=
+
+# library directories
+LIBDIRS=-L/usr/sww/lib
+
+# libraries required on your system
+LIBS=  -ldb -ldbm
+
+# location of makemap binary (usually /usr/sbin or /usr/etc)
+BINDIR=        ${DESTDIR}/usr/sbin
+
+# additional .o files needed
+OBJADD=
+
+###################  end of user configuration flags  ######################
+
+CFLAGS=        -I. $O ${INCDIRS} ${DBMDEF} ${ENVDEF}
+
+OBJS=  makemap.o ${OBJADD}
+
+LINKS= ${DESTDIR}/usr/ucb/newaliases ${DESTDIR}/usr/ucb/mailq
+BINOWN=        bin
+BINGRP=        bin
+BINMODE=555
+
+ALL=   makemap makemap.0
+
+all: ${ALL}
+
+makemap: ${BEFORE} ${OBJS}
+       ${CC} -o makemap ${LDOPTS} ${OBJS} ${LIBDIRS} ${LIBS}
+
+makemap.0: makemap.8
+       nroff -h -mandoc makemap.8 > makemap.0
+
+install: install-makemap install-docs
+
+install-makemap: makemap
+       install -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} makemap ${BINDIR}
+
+# doesn't actually install them -- you may want to install pre-nroff versions
+install-docs: makemap.0
+
+clean:
+       rm -f ${OBJS} makemap makemap.0
+
+# dependencies
+#   gross overkill, and yet still not quite enough....
+${OBJS}: ${SRCDIR}/conf.h
index 2f008fb..f2d4aea 100644 (file)
@@ -33,7 +33,7 @@
  */
 
 #ifndef lint
  */
 
 #ifndef lint
-static char sccsid[] = "@(#)makemap.c  8.5 (Berkeley) 9/22/93";
+static char sccsid[] = "@(#)makemap.c  8.6 (Berkeley) 11/22/93";
 #endif /* not lint */
 
 #include <stdio.h>
 #endif /* not lint */
 
 #include <stdio.h>
@@ -262,8 +262,15 @@ main(argc, argv)
                */
 
                p = strchr(ibuf, '\n');
                */
 
                p = strchr(ibuf, '\n');
-               if (*p != '\0')
+               if (p != NULL)
                        *p = '\0';
                        *p = '\0';
+               else if (!feof(stdin))
+               {
+                       fprintf(stderr, "%s: %s: line %d: line too long (%d bytes max)\n",
+                               progname, mapname, lineno, sizeof ibuf);
+                       continue;
+               }
+                       
                if (ibuf[0] == '\0' || ibuf[0] == '#')
                        continue;
                if (isspace(ibuf[0]))
                if (ibuf[0] == '\0' || ibuf[0] == '#')
                        continue;
                if (isspace(ibuf[0]))
diff --git a/usr.sbin/sendmail/praliases/Makefile.dist b/usr.sbin/sendmail/praliases/Makefile.dist
new file mode 100644 (file)
index 0000000..a7b07f4
--- /dev/null
@@ -0,0 +1,81 @@
+#
+#  This Makefile is designed to work on the old "make" program.  It does
+#  not use the obj subdirectory.  It also does not install documentation
+#  automatically -- think of it as a quick start for sites that have the
+#  old make program (I recommend that you get and port the new make if you
+#  are going to be doing any signficant work on sendmail).
+#
+#      @(#)Makefile.dist       8.1 (Berkeley) 11/27/93
+#
+
+# use O=-O (usual) or O=-g (debugging)
+O=     -O
+
+# location of sendmail source directory
+SRCDIR=        ../src
+
+# define the database mechanisms available for map & alias lookups:
+#      -DNDBM -- use new DBM
+#      -DNEWDB -- use new Berkeley DB
+# The really old (V7) DBM library is no longer supported.
+#
+DBMDEF=        -DNDBM -DNEWDB
+
+# environment definitions (e.g., -D_AIX3)
+ENVDEF=
+
+# see also conf.h for additional compilation flags
+
+# include directories
+INCDIRS=-I${SRCDIR} -I/usr/sww/include/db
+
+# loader options
+LDOPTS=
+
+# library directories
+LIBDIRS=-L/usr/sww/lib
+
+# libraries required on your system
+LIBS=  -ldb -ldbm
+
+# location of praliases binary (usually /usr/sbin or /usr/etc)
+BINDIR=        ${DESTDIR}/usr/sbin
+
+# additional .o files needed
+OBJADD=
+
+###################  end of user configuration flags  ######################
+
+CFLAGS=        -I. $O ${INCDIRS} ${DBMDEF} ${ENVDEF}
+
+OBJS=  praliases.o ${OBJADD}
+
+LINKS= ${DESTDIR}/usr/ucb/newaliases ${DESTDIR}/usr/ucb/mailq
+BINOWN=        bin
+BINGRP=        bin
+BINMODE=555
+
+ALL=   praliases praliases.0
+
+all: ${ALL}
+
+praliases: ${BEFORE} ${OBJS}
+       ${CC} -o praliases ${LDOPTS} ${OBJS} ${LIBDIRS} ${LIBS}
+
+praliases.0: praliases.8
+       nroff -h -mandoc praliases.8 > praliases.0
+
+install: install-praliases install-docs
+
+install-praliases: praliases
+       install -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} praliases ${BINDIR}
+
+# doesn't actually install them -- you may want to install pre-nroff versions
+install-docs: praliases.0
+
+clean:
+       rm -f ${OBJS} praliases praliases.0
+
+# dependencies
+#   gross overkill, and yet still not quite enough....
+${OBJS}: ${SRCDIR}/conf.h
index aa6cb2a..e21a716 100644 (file)
@@ -1,4 +1,4 @@
-#      @(#)Makefile    8.2 (Berkeley) 8/15/93
+#      @(#)Makefile    8.3 (Berkeley) 12/20/93
 
 PROG=  sendmail
 
 
 PROG=  sendmail
 
@@ -12,7 +12,7 @@ PROG= sendmail
 # spiral snail, but it will work.
 DBMDEF=        -DNEWDB
 
 # spiral snail, but it will work.
 DBMDEF=        -DNEWDB
 
-CFLAGS+=-I${.CURDIR} ${DBMDEF} -DNETISO -DMIME
+CFLAGS+=-I${.CURDIR} ${DBMDEF} -DNETISO -DMIME -DUSEUNAME
 
 SRCS=  alias.c arpadate.c clock.c collect.c conf.c convtime.c daemon.c \
        deliver.c domain.c envelope.c err.c headers.c macro.c main.c map.c \
 
 SRCS=  alias.c arpadate.c clock.c collect.c conf.c convtime.c daemon.c \
        deliver.c domain.c envelope.c err.c headers.c macro.c main.c map.c \
@@ -34,7 +34,7 @@ BINMODE=6555
 beforeinstall:
 #      install -c -o ${BINOWN} -g ${BINGRP} -m 644 /dev/null \
 #          ${DESTDIR}/etc/sendmail.fc
 beforeinstall:
 #      install -c -o ${BINOWN} -g ${BINGRP} -m 644 /dev/null \
 #          ${DESTDIR}/etc/sendmail.fc
-       install -c -o ${BINOWN} -g ${BINGRP} -m 666 /dev/null \
+       install -c -o ${BINOWN} -g ${BINGRP} -m 644 /dev/null \
            ${DESTDIR}/var/log/sendmail.st
        install -c -o ${BINOWN} -g ${BINGRP} -m 444 ${.CURDIR}/sendmail.hf \
            ${DESTDIR}/usr/share/misc
            ${DESTDIR}/var/log/sendmail.st
        install -c -o ${BINOWN} -g ${BINGRP} -m 444 ${.CURDIR}/sendmail.hf \
            ${DESTDIR}/usr/share/misc
index e289a7d..127e6a7 100644 (file)
@@ -5,7 +5,7 @@
 #  old make program (I recommend that you get and port the new make if you
 #  are going to be doing any signficant work on sendmail).
 #
 #  old make program (I recommend that you get and port the new make if you
 #  are going to be doing any signficant work on sendmail).
 #
-#      @(#)Makefile.dist       8.7 (Berkeley) 9/3/93
+#      @(#)Makefile.dist       8.9 (Berkeley) 12/20/93
 #
 
 # use O=-O (usual) or O=-g (debugging)
 #
 
 # use O=-O (usual) or O=-g (debugging)
@@ -80,14 +80,16 @@ newaliases.0: newaliases.1
 sendmail.0: sendmail.8
        nroff -h -mandoc sendmail.8 > sendmail.0
 
 sendmail.0: sendmail.8
        nroff -h -mandoc sendmail.8 > sendmail.0
 
+INSTALL=install
+
 install: install-sendmail install-docs
 
 install-sendmail: sendmail
 install: install-sendmail install-docs
 
 install-sendmail: sendmail
-       install -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} sendmail ${BINDIR}
+       ${INSTALL} -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} sendmail ${BINDIR}
        for i in ${LINKS}; do rm -f $$i; ln -s ${BINDIR}/sendmail $$i; done
        for i in ${LINKS}; do rm -f $$i; ln -s ${BINDIR}/sendmail $$i; done
-       install -c -o ${BINOWN} -g ${BINGRP} -m 666 /dev/null \
+       ${INSTALL} -c -o ${BINOWN} -g ${BINGRP} -m 644 /dev/null \
            ${STDIR}/sendmail.st
            ${STDIR}/sendmail.st
-       install -c -o ${BINOWN} -g ${BINGRP} -m 444 sendmail.hf ${HFDIR}
+       ${INSTALL} -c -o ${BINOWN} -g ${BINGRP} -m 444 sendmail.hf ${HFDIR}
 
 # doesn't actually install them -- you may want to install pre-nroff versions
 install-docs: aliases.0 newaliases.0 sendmail.0
 
 # doesn't actually install them -- you may want to install pre-nroff versions
 install-docs: aliases.0 newaliases.0 sendmail.0
index b599928..a2e7ad7 100644 (file)
@@ -30,7 +30,7 @@
 # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 # SUCH DAMAGE.
 #
 # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 # SUCH DAMAGE.
 #
-#      @(#)READ_ME     8.31 (Berkeley) 10/31/93
+#      @(#)READ_ME     8.47 (Berkeley) 1/12/94
 #
 
 This directory contains the source files for sendmail.
 #
 
 This directory contains the source files for sendmail.
@@ -39,35 +39,86 @@ For detailed instructions, please read the document ../doc/op.me:
 
        eqn ../doc/op.me | pic | ditroff -me
 
 
        eqn ../doc/op.me | pic | ditroff -me
 
-The Makefile is for the new (4.4BSD) Berkeley make, available from
-ftp.uu.net in the directory /systems/unix/bsd-sources/usr.bin/make.
-(Paul Southworth <pauls@umich.edu> published a description of porting
-this make in comp.unix.bsd.)  This Makefile has assumptions about the
-4.4 file system layout built in.
+The Makefile is for the new (4.4BSD) Berkeley make and uses syntax
+that is not recognized by older makes.  It also has assumptions
+about the 4.4 file system layout built in.  See below for details
+about other Makefiles.
 
 There is also a Makefile.dist which is much less clever, but works on
 the old traditional make.  You can use this using:
 
        make -f Makefile.dist
 
 
 There is also a Makefile.dist which is much less clever, but works on
 the old traditional make.  You can use this using:
 
        make -f Makefile.dist
 
-There are a bunch of other Makefiles for other systems -- these are
-the ones that I use, they have "Berkeley quirks" in them, and I don't
-guarantee that they will work unmodified in your environment.  However,
-they are all designed for the old make and can be used to help you get
-started.  They have names like "Makefile.HPUX".  Many of them include
--I/usr/sww/include/db and -L/usr/sww/lib -- this is Berkeley's
-location for the new database libraries, described below.
+**************************************************
+**  Read below for more details of Makefiles.  **
+**************************************************
 
 There is also a shell script (makesendmail) that tries to be clever
 about using object subdirectories.  It's pretty straightforward, and
 may help if you share a source tree among different architectures.
 
 
 There is also a shell script (makesendmail) that tries to be clever
 about using object subdirectories.  It's pretty straightforward, and
 may help if you share a source tree among different architectures.
 
-IMPORTANT:  DO NOT USE OPTIMIZATION (``-O'') IF YOU ARE RUNNING GCC
-2.4.x.  THERE IS A BUG IN THE GCC OPTIMIZER THAT CAUSES SENDMAIL TO
-FAIL MISERABLY.
+**************************************************************************
+**  IMPORTANT:  DO NOT USE OPTIMIZATION (``-O'') IF YOU ARE RUNNING    **
+**  GCC 2.4.x or 2.5.x.  THERE IS A BUG IN THE GCC OPTIMIZER THAT      **
+**  CAUSES SENDMAIL COMPILES TO FAIL MISERABLY.                                **
+**************************************************************************
+
+Jim Wilson of Cygnus believes he has found the problem -- it will
+probably be fixed in GCC 2.5.6 -- but until this is verified, be
+very suspicious of gcc -O.
+
+**************************************************************************
+**  IMPORTANT:  Read the appropriate paragraphs in the section on      **
+**  ``Operating System and Compile Quirks''.                           **
+**************************************************************************
+
+
++-----------+
+| MAKEFILES |
++-----------+
+
+The "Makefile"s in these directories are from 4.4 BSD, and hence
+really only work properly if you are on a 4.4 system.  In particular,
+they use new syntax that will not be recognized on old make programs,
+and some of them do things like ``.include ../../Makefile.inc'' to
+pick up some system defines.  If you are getting sendmail separately,
+these files won't be included in the distribution, as they are
+outside of the sendmail tree.
+
+Instead, you should use one of the other Makefiles, such as
+Makefile.SunOS for a SunOS system, and so forth.  These should
+work with the version of make that is appropriate for that
+system.
+
+There are a bunch of other Makefiles for other systems with names
+like Makefile.HPUX for an HP-UX system.  They use the version of
+make that is native for that system.  These are the Makefiles that
+I use, and they have "Berkeley quirks" in them.  I can't guarantee
+that they will work unmodified in your environment.  Many of them
+include -I/usr/sww/include/db and -L/usr/sww/lib -- this is Berkeley's
+location (the ``Software Warehouse'') for the new database libraries,
+described below.  You don't have to remove these definitions if you
+don't have these directories.
+
+Please look for an appropriate Makefile before you start trying to
+compile with Makefile or Makefile.dist.
+
+If you want to port the new Berkeley make, you can get it from
+ftp.uu.net in the directory /systems/unix/bsd-sources/usr.bin/make.
+Diffs and instructions for building this version of make under
+SunOS 4.1.x are available on ftp.css.itd.umich.edu in
+/pub/systems/sun/Net2-make.sun4.diff.Z.  Diffs and instructions
+for building this version of make under IBM AIX 3.2.4 are available
+on ftp.uni-stuttgart.de in /sw/src/patches/bsd-make-rus-patches.
+Paul Southworth <pauls@umich.edu> published a description of porting
+this make in comp.unix.bsd.
+
+The complete text of the Makefile.inc that is in the parent of the
+sendmail directory is:
+
+       #       @(#)Makefile.inc        8.1 (Berkeley) 6/6/93
 
 
-IMPORTANT:  Read the appropriate paragraphs in the section on
-``Operating System and Compile Quirks''.
+       BINDIR?=        /usr/sbin
 
 
 +----------------------+
 
 
 +----------------------+
@@ -83,7 +134,9 @@ older DBM implementation -- the very old V7 implementation is no
 longer supported), and NIS (Network Information Services).  Used alone
 these just include the support they indicate.  [If you are using NEWDB,
 get the latest version from FTP.CS.Berkeley.EDU in /ucb/4bsd.  DO NOT
 longer supported), and NIS (Network Information Services).  Used alone
 these just include the support they indicate.  [If you are using NEWDB,
 get the latest version from FTP.CS.Berkeley.EDU in /ucb/4bsd.  DO NOT
-use the version from the Net2 distribution!]
+use the version from the Net2 distribution!  However, if you are on
+BSD/386 or 386BSD-based systems, use the one that already exists
+on your system.  You may need to define OLD_NEWDB to do this.]
 
 If NEWDB and NDBM are defined (but not NIS), then sendmail will read
 NDBM format alias files, but the next time a newaliases is run the
 
 If NEWDB and NDBM are defined (but not NIS), then sendmail will read
 NDBM format alias files, but the next time a newaliases is run the
@@ -119,19 +172,22 @@ symbols availble, requiring the following compilation flags in the
 Makefile:
 
 SOLARIS                Define this if you are running Solaris 2.0 or higher.
 Makefile:
 
 SOLARIS                Define this if you are running Solaris 2.0 or higher.
+SOLARIS_2_3    Define this if you are running Solaris 2.3 or higher.
+SUNOS403       Define this if you are running SunOS 4.0.3.
 NeXT           Define this if you are on a NeXT box.  (This one may
                be pre-defined for you.)  There are other hacks you
                have to make -- see below.
 _AIX3          Define this if you are IBM AIX 3.x.
 RISCOS         Define this if you are running RISC/os from MIPS.
 _SCO_unix_     Define this if you are on SCO UNIX.
 NeXT           Define this if you are on a NeXT box.  (This one may
                be pre-defined for you.)  There are other hacks you
                have to make -- see below.
 _AIX3          Define this if you are IBM AIX 3.x.
 RISCOS         Define this if you are running RISC/os from MIPS.
 _SCO_unix_     Define this if you are on SCO UNIX.
+_SCO_unix_4_2  Define this if you are on SCO Open Server 3.2v4.
 
 If you are a system that sendmail has already been ported to, you
 probably won't have to touch these.  But if you are porting, you may
 have to tweak the following compilation flags in conf.h in order to
 get it to compile and link properly:
 
 
 If you are a system that sendmail has already been ported to, you
 probably won't have to touch these.  But if you are porting, you may
 have to tweak the following compilation flags in conf.h in order to
 get it to compile and link properly:
 
-SYSTEM5                Adjust for System V.
+SYSTEM5                Adjust for System V (not necessarily Release 4).
 SYS5SIGNALS    Use System V signal semantics -- the signal handler
                is automatically dropped when the signal is caught.
                If this is not set, use POSIX/BSD semantics, where the
 SYS5SIGNALS    Use System V signal semantics -- the signal handler
                is automatically dropped when the signal is caught.
                If this is not set, use POSIX/BSD semantics, where the
@@ -166,12 +222,40 @@ HASSETREUID       Define this if you have setreuid(2) ***AND*** root can
                your system has setresuid(2), (for example, on HP-UX) in
                which case you will also have to #define setreuid(r, e)
                to be the appropriate call.  Some systems (such as Solaris)
                your system has setresuid(2), (for example, on HP-UX) in
                which case you will also have to #define setreuid(r, e)
                to be the appropriate call.  Some systems (such as Solaris)
-               have a compatibility routine that doesn't work properly.
+               have a compatibility routine that doesn't work properly,
+               but may have "saved user ids" properly implemented so you
+               can ``#define setreuid(r, e) seteuid(e)'' and have it work.
                The important thing is that you have a call that will set
                The important thing is that you have a call that will set
-               the effective uid independently of the real or saved uid.
-               Setting this improves the security somewhat, since
-               sendmail doesn't have to read .forward and :include: files
-               as root.
+               the effective uid independently of the real or saved uid
+               and be able to set the effective uid back again when done.
+               There's a test program in ../test/t_setreuid.c that will
+               try things on your system.  Setting this improves the
+               security, since sendmail doesn't have to read .forward
+               and :include: files as root.  There are certain attacks
+               that may be unpreventable without this call.
+HASLSTAT       Define this if you have symbolic links (and thus the
+               lstat(2) system call).  This improves security.  Unlike
+               most other options, this one is on by default, so you
+               need to #undef it in conf.h if you don't have symbolic
+               links (these days everyone does).
+NEEDGETOPT     Define this if you need a reimplementation of getopt(3).
+               On some systems, getopt does very odd things if called
+               to scan the arguments twice.  This flag will ask sendmail
+               to compile in a local version of getopt that works
+               properly.
+NEEDSTRTOL     Define this if your standard C library does not define
+               strtol(3).  This will compile in a local version.
+NEEDVPRINTF    Define this if your standard C library does not define
+               vprintf(3).  Note that the resulting fake implementation
+               is not very elegant and may not even work on some
+               architectures.
+HASGETUSERSHELL        Define this to 1 if you have getusershell(3) in your
+               standard C library.  If this is not defined, or is defined
+               to be 0, sendmail will scan the /etc/shells file (no
+               NIS-style support, defaults to /bin/sh and /bin/csh if
+               that file does not exist) to get a list of unrestricted
+               user shells.  This is used to determine whether users
+               are allowed to forward their mail to a program or a file.
 GIDSET_T       The type of entries in a gidset passed as the second
                argument to getgroups(2).  Historically this has been an
                int, so this is the default, but some systems (such as
 GIDSET_T       The type of entries in a gidset passed as the second
                argument to getgroups(2).  Historically this has been an
                int, so this is the default, but some systems (such as
@@ -206,6 +290,17 @@ ERRLIST_PREDEFINED
 WAITUNION      The wait(2) routine takes a "union wait" argument instead
                of an integer argument.  This is for compatibility with
                old versions of BSD.
 WAITUNION      The wait(2) routine takes a "union wait" argument instead
                of an integer argument.  This is for compatibility with
                old versions of BSD.
+SCANF          You can set this to extend the F command to accept a
+               scanf string -- this gives you a primitive parser for
+               class definitions -- BUT it can make you vulnerable to
+               core dumps if the target file is poorly formed.
+SYSLOG_BUFSIZE You can define this to be the size of the buffer that
+               syslog accepts.  If it is not defined, it assumes a
+               1024-byte buffer.  If the buffer is very small (under
+               256 bytes) the log message format changes -- each
+               e-mail message will log many more messages, since it
+               will log each piece of information as a separate line
+               in syslog.
 
 
 +-----------------------+
 
 
 +-----------------------+
@@ -226,10 +321,11 @@ NIS               Define this to get NIS (YP) support for aliases and maps.
                Normally defined in the Makefile.
 USERDB         Include support for the User Information Database.  Implied
                by NEWDB in conf.h.
                Normally defined in the Makefile.
 USERDB         Include support for the User Information Database.  Implied
                by NEWDB in conf.h.
-IDENTPROTO     Define this to get IDENT (RFC 1413) protocol support.
+IDENTPROTO     Define this as 1 to get IDENT (RFC 1413) protocol support.
                This is assumed unless you are running on Ultrix or
                HP-UX, both of which have a problem in the UDP
                This is assumed unless you are running on Ultrix or
                HP-UX, both of which have a problem in the UDP
-               implementation.
+               implementation.  You can define it to be 0 to explicitly
+               turn off IDENT protocol support.
 MIME           Include support for MIME-encapsulated error messages.
 LOG            Set this to get syslog(3) support.  Defined by default
                in conf.h.  You want this if at all possible.
 MIME           Include support for MIME-encapsulated error messages.
 LOG            Set this to get syslog(3) support.  Defined by default
                in conf.h.  You want this if at all possible.
@@ -256,10 +352,69 @@ SETPROCTITLE      Try to set the string printed by "ps" to something
                default in conf.h.
 
 
                default in conf.h.
 
 
++---------------------+
+| DNS/RESOLVER ISSUES |
++---------------------+
+
+Many systems have old versions of the resolver library.  At a minimum,
+you should be running BIND 4.8.3; older versions may compile, but they
+have known bugs that should give you pause.
+
+Common problems in old versions include "undefined" errors for
+dn_skipname.
+
+Some people have had a problem with BIND 4.9; it uses some routines
+that it expects to be externally defined such as strerror().  It may
+help to link with "-l44bsd" to solve this problem.
+
+!PLEASE! be sure to link with the same version of the resolver as
+the header files you used -- some people have used the 4.9 headers
+and linked with BIND 4.8 or vice versa, and it doesn't work.
+Unfortunately, it doesn't fail in an obvious way -- things just
+subtlely don't work.
+
+
 +-------------------------------------+
 | OPERATING SYSTEM AND COMPILE QUIRKS |
 +-------------------------------------+
 
 +-------------------------------------+
 | OPERATING SYSTEM AND COMPILE QUIRKS |
 +-------------------------------------+
 
+GCC 2.5.x problems  *** IMPORTANT ***
+       Date: Mon, 29 Nov 93 19:08:44 PST
+       From: wilson@cygnus.com (Jim Wilson)
+       Message-Id: <9311300308.AA04608@cygnus.com>
+       To: kenner@vlsi1.ultra.nyu.edu
+       Subject: [cattelan@thebarn.com: gcc 2.5.4-2.5.5 -O bug]
+       Cc: cattelan@thebarn.com, rms@gnu.ai.mit.edu, sendmail@cs.berkeley.edu
+
+       This fixes a problem that occurs when gcc 2.5.5 is used to compile
+       sendmail 8.6.4 with optimization on a sparc.
+
+       Mon Nov 29 19:00:14 1993  Jim Wilson  (wilson@sphagnum.cygnus.com)
+
+               * reload.c (find_reloads_toplev): Replace obsolete reference to
+               BYTE_LOADS_*_EXTEND with LOAD_EXTEND_OP.
+
+       *** clean-ss-931128/reload.c    Sun Nov 14 16:20:01 1993
+       --- ss-931128/reload.c  Mon Nov 29 18:52:55 1993
+       *************** find_reloads_toplev (x, opnum, type, ind
+       *** 3888,3894 ****
+                force a reload in that case.  So we should not do anything here.  */
+         
+               else if (regno >= FIRST_PSEUDO_REGISTER
+       ! #if defined(BYTE_LOADS_ZERO_EXTEND) || defined(BYTE_LOADS_SIGN_EXTEND)
+                      && (GET_MODE_SIZE (GET_MODE (x))
+                          <= GET_MODE_SIZE (GET_MODE (SUBREG_REG (x))))
+         #endif
+       --- 3888,3894 ----
+                force a reload in that case.  So we should not do anything here.  */
+         
+               else if (regno >= FIRST_PSEUDO_REGISTER
+       ! #ifdef LOAD_EXTEND_OP
+                      && (GET_MODE_SIZE (GET_MODE (x))
+                          <= GET_MODE_SIZE (GET_MODE (SUBREG_REG (x))))
+         #endif
+
+
 SunOS 4.x (Solaris 1.x)
        You may have to use -lresolv on SunOS.  However, beware that
        this links in a new version of gethostbyname that does not
 SunOS 4.x (Solaris 1.x)
        You may have to use -lresolv on SunOS.  However, beware that
        this links in a new version of gethostbyname that does not
@@ -268,7 +423,8 @@ SunOS 4.x (Solaris 1.x)
        Some people have reported problems with the SunOS version of
        -lresolv and/or in.named, and suggest that you get a newer
        version.  The symptoms are delays when you connect to the
        Some people have reported problems with the SunOS version of
        -lresolv and/or in.named, and suggest that you get a newer
        version.  The symptoms are delays when you connect to the
-       SMTP server on a SunOS machine.  There is a version of BIND
+       SMTP server on a SunOS machine or having your domain added to
+       addresses inappropriately.  There is a version of BIND
        version 4.9 on gatekeeper.DEC.COM in pub/BSD/bind/4.9.
 
        There is substantial disagreement about whether you can make
        version 4.9 on gatekeeper.DEC.COM in pub/BSD/bind/4.9.
 
        There is substantial disagreement about whether you can make
@@ -299,15 +455,21 @@ Solaris 2.x (SunOS 5.x)
 
        The Solaris "syslog" function is apparently limited to something
        about 90 characters because of a kernel limitation.  If you have
 
        The Solaris "syslog" function is apparently limited to something
        about 90 characters because of a kernel limitation.  If you have
-       source code, you can probably up this number.  Bill Wisner
-       <wisner@well.sf.ca.us> was able to get an unofficial, unsupported
-       patch.
+       source code, you can probably up this number.  The syslogd patch
+       is included in kernel jumbo patch for Solaris 2.2 as of revision
+       -39 or so.  At least one person is running with patch 100999-45
+       and their long lost sendmail logging is finally showing up.  At
+       least one other person is running with patch 101318 installed
+       under Solaris 2.3 with success.
 
 OSF/1
 
 OSF/1
-       If you are compiling on OSF/1 (DEC Alpha), you must use -lmld
-       and -non_shared (otherwise it core dumps on startup).  Also,
-       the enclosed makefile removed /usr/sbin/smtpd; if you need it,
-       just create the link to the sendmail binary.
+       If you are compiling on OSF/1 (DEC Alpha), you must use 
+       -L/usr/shlib (otherwise it core dumps on startup).  You may also
+       need -mld to get the nlist() function, although some versions
+       apparently don't need this.
+       
+       Also, the enclosed makefile removed /usr/sbin/smtpd; if you need
+       it, just create the link to the sendmail binary.
 
 NeXT
        If you are compiling on NeXT, you will have to create an empty
 
 NeXT
        If you are compiling on NeXT, you will have to create an empty
@@ -329,9 +491,31 @@ NeXT
 
        You may have to use -DNeXT.
 
 
        You may have to use -DNeXT.
 
-BSDI (BSD/386)
-       I have reports that the "m4" from BSDI won't handle the config
-       files properly.  I haven't had a chance to test this myself.
+BSDI (BSD/386) 1.0, NetBSD 0.9, FreeBSD 1.0
+       The "m4" from BSDI won't handle the config files properly.
+       I haven't had a chance to test this myself.
+
+       The M4 shipped in FreeBSD and NetBSD 0.9 don't handle the config
+       files properly. One must use either GNU m4 1.1 or the PD-M4
+       recently posted in comp.os.386bsd.bugs (and maybe others).
+       NetBSD-current includes the PD-M4 (as stated in the NetBSD file
+       CHANGES).
+       
+       FreeBSD 1.0 RELEASE has uname(2) now. Use -DUSEUNAME in order to
+       use it (look into Makefile.FreeBSD). NetBSD-current may have
+       it too but it has not been verified.
+
+       You cannot port the latest version of the Berkeley db library
+       and use it with sendmail without recompiling the world.  This
+       is because C library routines use the older version which have
+       incompatible header files -- the result is that it can't read
+       other system files, such as /etc/passwd, unless you use the
+       new db format throughout your system.  You should normally just
+       use the version of db supplied in your release.  You may need
+       to use -DOLD_NEWDB to make this work -- this turns off some
+       new interface calls (for file locking) that are not in older
+       versions of db.  You'll get compile errors if you need this
+       flag and don't have it set.
 
 4.3BSD
        If you are running a "virgin" version of 4.3BSD, you'll have
 
 4.3BSD
        If you are running a "virgin" version of 4.3BSD, you'll have
@@ -346,31 +530,6 @@ BSDI (BSD/386)
        copy ../contrib/oldbind.compat.c into src and add
        oldbind.compat.o to OBJADD in the Makefile.
 
        copy ../contrib/oldbind.compat.c into src and add
        oldbind.compat.o to OBJADD in the Makefile.
 
-Linux
-       From: Karl London <karl@borg.demon.co.uk>
-       Subject: Little bit to add to a readme for Linux for 8.6
-       Date: Fri, 10 Sep 1993 20:16:05 +0100 (BST)
-
-       Below is a copy of a section of the /usr/include/unistd.h from
-       linux libc-4.4.1 which needs changing because of a bug in the
-       header files. Should be fixed for future releases..
-
-       Karl
-
-       The #if 0 and #endif are new!!
-
-       -------
-
-          If OPTS begins with `--', then non-option arguments
-          are treated as arguments to the option '\0'.
-          This behavior is specific to the GNU `getopt'.  */
-       #if 0
-       extern int getopt __P ((int __argc, char *__const * __argv,
-                               __const char *__opts));
-       #endif
-       extern int opterr;
-       extern int optind;
-
 A/UX
        Date: Tue, 12 Oct 1993 18:28:28 -0400 (EDT)
        From: "Eric C. Hagberg" <hagberg@med.cornell.edu>
 A/UX
        Date: Tue, 12 Oct 1993 18:28:28 -0400 (EDT)
        From: "Eric C. Hagberg" <hagberg@med.cornell.edu>
@@ -401,6 +560,64 @@ DG/UX
        DG/UX -- the person who has this working, Douglas Anderson
        <dlander@afterlife.ncsc.mil>, used procmail instead.
 
        DG/UX -- the person who has this working, Douglas Anderson
        <dlander@afterlife.ncsc.mil>, used procmail instead.
 
+System V Release 4 Based Systems
+       There is a single Makefile that is intended for all SVR4-based
+       systems (called Makefile.SVR4).  It defines __svr4__, which is
+       predefined by some compilers.  If your compiler already defines
+       this compile variable, you can delete the definition from the
+       Makefile.
+
+       It's been tested on Dell Issue 2.2.
+
+DELL SVR4
+       Date:      Mon, 06 Dec 1993 10:42:29 EST
+       From: "Kimmo Suominen" <kim@grendel.lut.fi>
+       Message-ID: <2d0352f9.lento29@lento29.UUCP>
+       To: eric@cs.berkeley.edu
+       Cc: sendmail@cs.berkeley.edu
+       Subject:   Notes for DELL SVR4
+
+       Eric,
+
+       Here are some notes for compiling Sendmail 8.6.4 on DELL SVR4.  I ran
+       across these things when helping out some people who contacted me by
+       e-mail.
+
+       1) Use gcc 2.4.5 (or later?).  Dell distributes gcc 2.1 with their
+          Issue 2.2 Unix.  It is too old, and gives you problems with
+          clock.c, because sigset_t won't get defined in <sys/signal.h>.
+          This is due to a problematic protection rule in there, and is
+          fixed with gcc 2.4.5.
+
+       2) If you don't use the new Berkeley DB (-DNEWDB), then you need
+          to add "-lc -lucb" to the libraries to link with.  This is because
+          the -ldbm distributed by Dell needs the bcopy, bcmp and bzero
+          functions.  It is important that you specify both libraries in
+          the given order to be sure you only get the BSTRING functions
+          from the UCB library (and not the signal routines etc.).
+
+       3) Don't leave out "-lelf" even if compiling with "-lc -lucb".
+          The UCB library also has another copy of the nlist routines,
+          but we do want the ones from "-lelf".
+
+       If anyone needs a compiled gcc 2.4.5 and/or a ported DB library, they
+       can use anonymous ftp to fetch them from lut.fi in the /kim directory. 
+       They are copies of what I use on grendel.lut.fi, and offering them
+       does not imply that I would also support them.  I have sent the DB
+       port for SVR4 back to Keith Bostic for inclusion in the official
+       distribution, but I haven't heard anything from him as of today.
+
+       - gcc-2.4.5-svr4.tar.gz (gcc 2.4.5 and the corresponding libg++)
+       - db-1.72.tar.gz        (with source, objects and a installed copy)
+
+       Cheers
+       + Kim
+       -- 
+        *  Kimmo.Suominen@lut.fi  *  SysVr4 enthusiast at GRENDEL.LUT.FI  *
+       *    KIM@FINFILES.BITNET   *  Postmaster and Hostmaster at LUT.FI   *
+        *    + 358 200 865 718    *  Unix area moderator at NIC.FUNET.FI  *
+
+
 Non-DNS based sites
        This version of sendmail always tries to connect to the Domain
        Name System (DNS) to resolve names, regardless of the setting
 Non-DNS based sites
        This version of sendmail always tries to connect to the Domain
        Name System (DNS) to resolve names, regardless of the setting
@@ -426,6 +643,42 @@ GNU getopt
        by the double call.  Use the version in conf.c instead.
 
 
        by the double call.  Use the version in conf.c instead.
 
 
++--------------+
+| MANUAL PAGES |
++--------------+
+
+The manual pages have been written against the -mandoc macros
+instead of the -man macros.  The latest version of groff has them
+included.  You can also get a copy from FTP.UU.NET in directory
+/systems/unix/bsd-sources/share/tmac.
+
+
++-----------------+
+| DEBUGGING HOOKS |
++-----------------+
+
+As of 8.6.5, sendmail daemons will catch a SIGUSR1 signal and log
+some debugging output (logged at LOG_DEBUG severity).  The
+information dumped is:
+
+ * The value of the $j macro.
+ * A warning if $j is not in the set $=w.
+ * A list of the open file descriptors.
+ * The contents of the connection cache.
+ * If ruleset 89 is defined, it is evaluated and the results printed.
+
+This allows you to get information regarding the runtime state of the
+daemon on the fly.  This should not be done too frequently, since
+the process of rewriting may lose memory which will not be recovered.
+Also, ruleset 89 may call non-reentrant routines, so there is a small
+non-zero probability that this will cause other problems.  It is
+really only for debugging serious problems.
+
+A typical formulation of ruleset 89 would be:
+
+       R$*             $@ $>0 some test address
+
+
 +-----------------------------+
 | DESCRIPTION OF SOURCE FILES |
 +-----------------------------+
 +-----------------------------+
 | DESCRIPTION OF SOURCE FILES |
 +-----------------------------+
@@ -489,4 +742,4 @@ version.c   The version number and information about this
 
 Eric Allman
 
 
 Eric Allman
 
-(Version 8.31, last update 10/31/93 11:32:52)
+(Version 8.47, last update 1/12/94 05:59:56)
index a89e273..66d81d7 100644 (file)
@@ -36,7 +36,7 @@
 # include <pwd.h>
 
 #ifndef lint
 # include <pwd.h>
 
 #ifndef lint
-static char sccsid[] = "@(#)alias.c    8.19 (Berkeley) 10/31/93";
+static char sccsid[] = "@(#)alias.c    8.21 (Berkeley) 12/11/93";
 #endif /* not lint */
 
 
 #endif /* not lint */
 
 
@@ -144,7 +144,7 @@ alias(a, sendq, e)
        owner = aliaslookup(obuf, e);
        if (owner != NULL)
        {
        owner = aliaslookup(obuf, e);
        if (owner != NULL)
        {
-               if (strchr(owner, ',') != NULL)
+               if (strpbrk(owner, ",:/|\"") != NULL)
                        owner = obuf;
                a->q_owner = newstr(owner);
        }
                        owner = obuf;
                a->q_owner = newstr(owner);
        }
@@ -570,7 +570,7 @@ readaliases(map, af, automatic)
                }
                if (parseaddr(line, &al, RF_COPYALL, ':', NULL, CurEnv) == NULL)
                {
                }
                if (parseaddr(line, &al, RF_COPYALL, ':', NULL, CurEnv) == NULL)
                {
-                       syserr("554 %s... illegal alias name", al.q_paddr);
+                       syserr("554 %.40s... illegal alias name", line);
                        continue;
                }
 
                        continue;
                }
 
index c4157bc..afc1a68 100644 (file)
@@ -2,6 +2,9 @@
  * Copyright (c) 1991, 1993
  *     The Regents of the University of California.  All rights reserved.
  *
  * Copyright (c) 1991, 1993
  *     The Regents of the University of California.  All rights reserved.
  *
+ * This code is derived from software contributed to Berkeley by
+ * Berkeley Software Design, Inc.
+ *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
  * are met:
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
  * are met:
@@ -30,7 +33,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- *     @(#)cdefs.h     8.2 (Berkeley) 10/4/93
+ *     @(#)cdefs.h     8.5 (Berkeley) 1/4/94
  */
 
 #ifndef        _CDEFS_H_
  */
 
 #ifndef        _CDEFS_H_
 #define        __CONCAT(x,y)   x ## y
 #define        __STRING(x)     #x
 
 #define        __CONCAT(x,y)   x ## y
 #define        __STRING(x)     #x
 
-#if !defined(__GNUC__) && !defined(__cplusplus)
-#define        inline
-#endif
+#define        __const         const           /* define reserved names to standard */
+#define        __signed        signed
+#define        __volatile      volatile
+#if defined(__cplusplus)
+#define        __inline        inline          /* convert to C++ keyword */
+#else
+#ifndef __GNUC__
+#define        __inline                        /* delete GCC keyword */
+#endif /* !__GNUC__ */
+#endif /* !__cplusplus */
 
 #else  /* !(__STDC__ || __cplusplus) */
 #define        __P(protos)     ()              /* traditional C preprocessor */
 #define        __CONCAT(x,y)   x/**/y
 #define        __STRING(x)     "x"
 
 
 #else  /* !(__STDC__ || __cplusplus) */
 #define        __P(protos)     ()              /* traditional C preprocessor */
 #define        __CONCAT(x,y)   x/**/y
 #define        __STRING(x)     "x"
 
-#ifdef __GNUC__
-#define        const           __const         /* GCC: ANSI C with -traditional */
-#define        inline          __inline
-#define        signed          __signed
-#define        volatile        __volatile
-
-#else  /* !__GNUC__ */
+#ifndef __GNUC__
+#define        __const                         /* delete pseudo-ANSI C keywords */
+#define        __inline
+#define        __signed
+#define        __volatile
+/*
+ * In non-ANSI C environments, new programs will want ANSI-only C keywords
+ * deleted from the program and old programs will want them left alone.
+ * When using a compiler other than gcc, programs using the ANSI C keywords
+ * const, inline etc. as normal identifiers should define -DNO_ANSI_KEYWORDS.
+ * When using "gcc -traditional", we assume that this is the intent; if
+ * __GNUC__ is defined but __STDC__ is not, we leave the new keywords alone.
+ */
+#ifndef        NO_ANSI_KEYWORDS
 #define        const                           /* delete ANSI C keywords */
 #define        inline
 #define        signed
 #define        volatile
 #define        const                           /* delete ANSI C keywords */
 #define        inline
 #define        signed
 #define        volatile
+#endif
 #endif /* !__GNUC__ */
 #endif /* !(__STDC__ || __cplusplus) */
 
 /*
 #endif /* !__GNUC__ */
 #endif /* !(__STDC__ || __cplusplus) */
 
 /*
- * GCC has extensions for declaring functions as `pure' (always returns
- * the same value given the same inputs, i.e., has no external state and
- * no side effects) and `dead' (nonreturning).  These mainly affect
- * optimization and warnings.  Unfortunately, GCC complains if these are
- * used under strict ANSI mode (`gcc -ansi -pedantic'), hence we need to
- * define them only if compiling without this.
+ * GCC1 and some versions of GCC2 declare dead (non-returning) and
+ * pure (no side effects) functions using "volatile" and "const";
+ * unfortunately, these then cause warnings under "-ansi -pedantic".
+ * GCC2 uses a new, peculiar __attribute__((attrs)) style.  All of
+ * these work for GNU C++ (modulo a slight glitch in the C++ grammar
+ * in the distribution version of 2.5.5).
  */
  */
+#if !defined(__GNUC__) || __GNUC__ < 2 || __GNUC_MINOR__ < 5
+#define        __attribute__(x)        /* delete __attribute__ if non-gcc or gcc1 */
 #if defined(__GNUC__) && !defined(__STRICT_ANSI__)
 #if defined(__GNUC__) && !defined(__STRICT_ANSI__)
-#define __dead __volatile
-#define __pure __const
-#else
-#define __dead
-#define __pure
+#define        __dead          __volatile
+#define        __pure          __const
+#endif
+#endif
+
+/* Delete pseudo-keywords wherever they are not available or needed. */
+#ifndef __dead
+#define        __dead
+#define        __pure
 #endif
 
 #endif /* !_CDEFS_H_ */
 #endif
 
 #endif /* !_CDEFS_H_ */
index 8c78bc1..45ef1c2 100644 (file)
@@ -33,7 +33,7 @@
  */
 
 #ifndef lint
  */
 
 #ifndef lint
-static char sccsid[] = "@(#)clock.c    8.7 (Berkeley) 10/21/93";
+static char sccsid[] = "@(#)clock.c    8.8 (Berkeley) 1/12/94";
 #endif /* not lint */
 
 # include "sendmail.h"
 #endif /* not lint */
 
 # include "sendmail.h"
@@ -60,7 +60,7 @@ static char sccsid[] = "@(#)clock.c   8.7 (Berkeley) 10/21/93";
 **             none.
 */
 
 **             none.
 */
 
-static void tick();
+static void tick __P((int));
 
 EVENT *
 setevent(intvl, func, arg)
 
 EVENT *
 setevent(intvl, func, arg)
@@ -101,7 +101,7 @@ setevent(intvl, func, arg)
                printf("setevent: intvl=%ld, for=%ld, func=%x, arg=%d, ev=%x\n",
                        intvl, now + intvl, func, arg, ev);
 
                printf("setevent: intvl=%ld, for=%ld, func=%x, arg=%d, ev=%x\n",
                        intvl, now + intvl, func, arg, ev);
 
-       tick();
+       tick(0);
        return (ev);
 }
 \f/*
        return (ev);
 }
 \f/*
@@ -143,7 +143,7 @@ clrevent(ev)
        }
 
        /* restore clocks and pick up anything spare */
        }
 
        /* restore clocks and pick up anything spare */
-       tick();
+       tick(0);
 }
 \f/*
 **  TICK -- take a clock tick
 }
 \f/*
 **  TICK -- take a clock tick
@@ -151,7 +151,7 @@ clrevent(ev)
 **     Called by the alarm clock.  This routine runs events as needed.
 **
 **     Parameters:
 **     Called by the alarm clock.  This routine runs events as needed.
 **
 **     Parameters:
-**             none.
+**             One that is ignored; for compatibility with signal handlers.
 **
 **     Returns:
 **             none.
 **
 **     Returns:
 **             none.
@@ -161,7 +161,8 @@ clrevent(ev)
 */
 
 static void
 */
 
 static void
-tick()
+tick(arg)
+       int arg;
 {
        register time_t now;
        register EVENT *ev;
 {
        register time_t now;
        register EVENT *ev;
index fba8c77..e0eb672 100644 (file)
@@ -33,7 +33,7 @@
  */
 
 #ifndef lint
  */
 
 #ifndef lint
-static char sccsid[] = "@(#)collect.c  8.6 (Berkeley) 10/27/93";
+static char sccsid[] = "@(#)collect.c  8.8 (Berkeley) 1/8/94";
 #endif /* not lint */
 
 # include <errno.h>
 #endif /* not lint */
 
 # include <errno.h>
@@ -160,7 +160,10 @@ collect(smtpmode, requeueflag, e)
                        if (sfgets(freebuf, MAXLINE, InChannel,
                                        TimeOuts.to_datablock,
                                        "message header read") == NULL)
                        if (sfgets(freebuf, MAXLINE, InChannel,
                                        TimeOuts.to_datablock,
                                        "message header read") == NULL)
-                               goto readerr;
+                       {
+                               freebuf[0] = '\0';
+                               break;
+                       }
 
                        /* is this a continuation line? */
                        if (*freebuf != ' ' && *freebuf != '\t')
 
                        /* is this a continuation line? */
                        if (*freebuf != ' ' && *freebuf != '\t')
@@ -257,7 +260,8 @@ collect(smtpmode, requeueflag, e)
                        break;
 
                /* check for transparent dot */
                        break;
 
                /* check for transparent dot */
-               if (OpMode == MD_SMTP && bp[0] == '.' && bp[1] == '.')
+               if ((OpMode == MD_SMTP || OpMode == MD_DAEMON) &&
+                   bp[0] == '.' && bp[1] == '.')
                        bp++;
 
                /*
                        bp++;
 
                /*
@@ -278,6 +282,8 @@ collect(smtpmode, requeueflag, e)
        if (feof(InChannel) || ferror(InChannel))
        {
 readerr:
        if (feof(InChannel) || ferror(InChannel))
        {
 readerr:
+               if (tTd(30, 1))
+                       printf("collect: read error\n");
                inputerr = TRUE;
        }
 
                inputerr = TRUE;
        }
 
@@ -290,7 +296,7 @@ readerr:
        }
 
        /* An EOF when running SMTP is an error */
        }
 
        /* An EOF when running SMTP is an error */
-       if (inputerr && OpMode == MD_SMTP)
+       if (inputerr && (OpMode == MD_SMTP || OpMode == MD_DAEMON))
        {
                char *host;
                char *problem;
        {
                char *host;
                char *problem;
index 4ae6d84..cc6605a 100644 (file)
  */
 
 #ifndef lint
  */
 
 #ifndef lint
-static char sccsid[] = "@(#)conf.c     8.42 (Berkeley) 10/21/93";
+static char sccsid[] = "@(#)conf.c     8.62 (Berkeley) 1/9/94";
 #endif /* not lint */
 
 # include "sendmail.h"
 # include "pathnames.h"
 # include <sys/ioctl.h>
 # include <sys/param.h>
 #endif /* not lint */
 
 # include "sendmail.h"
 # include "pathnames.h"
 # include <sys/ioctl.h>
 # include <sys/param.h>
+# include <netdb.h>
 # include <pwd.h>
 
 /*
 # include <pwd.h>
 
 /*
@@ -597,7 +598,9 @@ rlsesigs()
 # include      <compat.h>
 #endif
 
 # include      <compat.h>
 #endif
 
-init_md()
+init_md(argc, argv)
+       int argc;
+       char **argv;
 {
 #ifdef _AUX_SOURCE
        setcompat(getcompat() | COMPAT_BSDPROT);
 {
 #ifdef _AUX_SOURCE
        setcompat(getcompat() | COMPAT_BSDPROT);
@@ -792,10 +795,14 @@ getla()
 #if LA_TYPE == LA_MACH
 
 /*
 #if LA_TYPE == LA_MACH
 
 /*
-**  This has been tested on NeXT release 2.1.
+**  This has been tested on NEXTSTEP release 2.1/3.X.
 */
 
 */
 
-#include <mach.h>
+#if defined(NX_CURRENT_COMPILER_RELEASE) && NX_CURRENT_COMPILER_RELEASE > NX_COMPILER_RELEASE_3_0
+# include <mach/mach.h>
+#else
+# include <mach.h>
+#endif
 
 getla()
 {
 
 getla()
 {
@@ -910,6 +917,7 @@ refuseconnections()
 #  include <sys/exec.h>
 #  ifdef __bsdi__
 #   undef PS_STRINGS   /* BSDI 1.0 doesn't do PS_STRINGS as we expect */
 #  include <sys/exec.h>
 #  ifdef __bsdi__
 #   undef PS_STRINGS   /* BSDI 1.0 doesn't do PS_STRINGS as we expect */
+#   define PROCTITLEPAD        '\0'
 #  endif
 #  ifdef PS_STRINGS
 #   define SETPROC_STATIC static
 #  endif
 #  ifdef PS_STRINGS
 #   define SETPROC_STATIC static
@@ -920,6 +928,10 @@ refuseconnections()
 # endif
 #endif
 
 # endif
 #endif
 
+#ifndef PROCTITLEPAD
+# define PROCTITLEPAD  ' '
+#endif
+
 /*VARARGS1*/
 #ifdef __STDC__
 setproctitle(char *fmt, ...)
 /*VARARGS1*/
 #ifdef __STDC__
 setproctitle(char *fmt, ...)
@@ -969,7 +981,7 @@ setproctitle(fmt, va_alist)
        (void) strcpy(Argv[0], buf);
        p = &Argv[0][i];
        while (p < LastArgv)
        (void) strcpy(Argv[0], buf);
        p = &Argv[0][i];
        while (p < LastArgv)
-               *p++ = ' ';
+               *p++ = PROCTITLEPAD;
 #   endif
 #  endif
 # endif /* SETPROCTITLE */
 #   endif
 #  endif
 # endif /* SETPROCTITLE */
@@ -1258,9 +1270,13 @@ static char sccsid[] = "@(#)getopt.c     4.3 (Berkeley) 3/9/86";
 /*
  * get option letter from argument vector
  */
 /*
  * get option letter from argument vector
  */
-int    opterr = 1,             /* if error message should be printed */
-       optind = 1,             /* index into parent argv vector */
-       optopt;                 /* character checked for validity */
+#ifdef _CONVEX_SOURCE
+extern int     optind, opterr;
+#else
+int    opterr = 1;             /* if error message should be printed */
+int    optind = 1;             /* index into parent argv vector */
+#endif
+int    optopt;                 /* character checked for validity */
 char   *optarg;                /* argument associated with option */
 
 #define BADCH  (int)'?'
 char   *optarg;                /* argument associated with option */
 
 #define BADCH  (int)'?'
@@ -1269,9 +1285,9 @@ char      *optarg;                /* argument associated with option */
                fputc(optopt,stderr);fputc('\n',stderr);return(BADCH);}
 
 getopt(nargc,nargv,ostr)
                fputc(optopt,stderr);fputc('\n',stderr);return(BADCH);}
 
 getopt(nargc,nargv,ostr)
-int    nargc;
-char   **nargv,
-       *ostr;
+       int             nargc;
+       char *const     *nargv;
+       const char      *ostr;
 {
        static char     *place = EMSG;  /* option letter processing */
        static char     atend = 0;
 {
        static char     *place = EMSG;  /* option letter processing */
        static char     atend = 0;
@@ -1356,6 +1372,97 @@ vsprintf(s, fmt, ap)
 
 #endif
 \f/*
 
 #endif
 \f/*
+**  USERSHELLOK -- tell if a user's shell is ok for unrestricted use
+**
+**     Parameters:
+**             shell -- the user's shell from /etc/passwd
+**
+**     Returns:
+**             TRUE -- if it is ok to use this for unrestricted access.
+**             FALSE -- if the shell is restricted.
+*/
+
+#if !HASGETUSERSHELL
+
+# ifndef _PATH_SHELLS
+#  define _PATH_SHELLS "/etc/shells"
+# endif
+
+char   *DefaultUserShells[] =
+{
+       "/bin/sh",
+       "/usr/bin/sh",
+       "/bin/csh",
+       "/usr/bin/csh",
+#ifdef __hpux
+       "/bin/rsh",
+       "/bin/ksh",
+       "/bin/rksh",
+       "/bin/pam",
+       "/usr/bin/keysh",
+       "/bin/posix/sh",
+#endif
+       NULL
+};
+
+#endif
+
+bool
+usershellok(shell)
+       char *shell;
+{
+#if HASGETUSERSHELL
+       register char *p;
+       extern char *getusershell();
+
+       setusershell();
+       while ((p = getusershell()) != NULL)
+               if (strcmp(p, shell) == 0 || strcmp(p, "*") == 0)
+                       break;
+       endusershell();
+       return p != NULL;
+#else
+       register FILE *shellf;
+       char buf[MAXLINE];
+
+       shellf = fopen(_PATH_SHELLS, "r");
+       if (shellf == NULL)
+       {
+               /* no /etc/shells; see if it is one of the std shells */
+               char **d;
+
+               for (d = DefaultUserShells; *d != NULL; d++)
+               {
+                       if (strcmp(shell, *d) == 0)
+                               return TRUE;
+               }
+               return FALSE;
+       }
+
+       while (fgets(buf, sizeof buf, shellf) != NULL)
+       {
+               register char *p, *q;
+
+               p = buf;
+               while (*p != '\0' && *p != '#' && *p != '/')
+                       p++;
+               if (*p == '#' || *p == '\0')
+                       continue;
+               q = p;
+               while (*p != '\0' && *p != '#' && !isspace(*p))
+                       p++;
+               *p = '\0';
+               if (strcmp(shell, q) == 0 || strcmp("*", q) == 0)
+               {
+                       fclose(shellf);
+                       return TRUE;
+               }
+       }
+       fclose(shellf);
+       return FALSE;
+#endif
+}
+\f/*
 **  FREESPACE -- see how much free space is on the queue filesystem
 **
 **     Only implemented if you have statfs.
 **  FREESPACE -- see how much free space is on the queue filesystem
 **
 **     Only implemented if you have statfs.
@@ -1382,10 +1489,10 @@ vsprintf(s, fmt, ap)
 #endif
 
 #ifdef HASSTATFS
 #endif
 
 #ifdef HASSTATFS
-# if defined(IRIX) || defined(apollo) || defined(_SCO_unix_) || defined(UMAXV) || defined(DGUX)
+# if defined(IRIX) || defined(apollo) || defined(_SCO_unix_) || defined(UMAXV) || defined(DGUX) || defined(_AIX3)
 #  include <sys/statfs.h>
 # else
 #  include <sys/statfs.h>
 # else
-#  if (defined(sun) && !defined(BSD)) || defined(__hpux) || defined(_CONVEX_SOURCE) || defined(NeXT) || defined(_AUX_SOURCE)
+#  if (defined(sun) && !defined(BSD)) || defined(__hpux) || defined(_CONVEX_SOURCE) || defined(NeXT) || defined(_AUX_SOURCE) || defined(MACH386)
 #   include <sys/vfs.h>
 #  else
 #   include <sys/mount.h>
 #   include <sys/vfs.h>
 #  else
 #   include <sys/mount.h>
@@ -1726,6 +1833,16 @@ getcfname()
 {
        if (ConfFile != NULL)
                return ConfFile;
 {
        if (ConfFile != NULL)
                return ConfFile;
+#ifdef NETINFO
+       {
+               extern char *ni_propval();
+               char *cflocation;
+
+               cflocation = ni_propval("/locations/sendmail", "sendmail.cf");
+               if (cflocation != NULL)
+                       return cflocation;
+       }
+#endif
        return _PATH_SENDMAILCF;
 }
 \f/*
        return _PATH_SENDMAILCF;
 }
 \f/*
@@ -1737,11 +1854,262 @@ getcfname()
 **     Returns:
 **             TRUE -- if ok.
 **             FALSE -- if vendor code could not be processed.
 **     Returns:
 **             TRUE -- if ok.
 **             FALSE -- if vendor code could not be processed.
+**
+**     Side Effects:
+**             It is reasonable to set mode flags here to tweak
+**             processing in other parts of the code if necessary.
+**             For example, if you are a vendor that uses $%y to
+**             indicate YP lookups, you could enable that here.
 */
 
 bool
 setvendor(vendor)
        char *vendor;
 {
 */
 
 bool
 setvendor(vendor)
        char *vendor;
 {
-       return (strcasecmp(vendor, "Berkeley") == 0);
+       if (strcasecmp(vendor, "Berkeley") == 0)
+               return TRUE;
+
+       /* add vendor extensions here */
+
+       return FALSE;
 }
 }
+\f/*
+**  STRTOL -- convert string to long integer
+**
+**     For systems that don't have it in the C library.
+*/
+
+#ifdef NEEDSTRTOL
+
+long
+strtol(p, ep, b)
+       char *p;
+       char **ep;
+       int b;
+{
+       long l = 0;
+       char c;
+       char maxd;
+       int neg = 1;
+
+       maxd = (b > 10) ? '9' : b + '0';
+
+       if (p && *p == '-') {
+               neg = -1;
+               p++;
+       }
+       while (p && (c = *p)) {
+               if (c >= '0' && c <= maxd) {
+                       l = l*b + *p++ - '0';
+                       continue;
+               }
+               if (c >= 'A' && c <= 'Z')
+                       c -= 'A' + 'a';
+               c = c - 'a' + 10;
+               if (b > c) {
+                       l = l*b + c;
+                       p++;
+                       continue;
+               }
+               break;
+       }
+       l *= neg;
+       if (ep)
+               *ep = p;
+       return l;
+}
+
+#endif
+\f/*
+**  SOLARIS_GETHOSTBY{NAME,ADDR} -- compatibility routines for gethostbyXXX
+**
+**     Solaris versions prior through 2.3 don't properly deliver a
+**     canonical h_name field.  This tries to work around it.
+*/
+
+#ifdef SOLARIS
+
+struct hostent *
+solaris_gethostbyname(name)
+       const char *name;
+{
+# ifdef SOLARIS_2_3
+       static struct hostent hp;
+       static char buf[1000];
+       extern struct hostent *_switch_gethostbyname_r();
+
+       return _switch_gethostbyname_r(name, &hp, buf, sizeof(buf), &h_errno);
+# else
+       extern struct hostent *__switch_gethostbyname();
+
+       return __switch_gethostbyname(name);
+# endif
+}
+
+struct hostent *
+solaris_gethostbyaddr(addr, len, type)
+       const char *addr;
+       int len;
+       int type;
+{
+# ifdef SOLARIS_2_3
+       static struct hostent hp;
+       static char buf[1000];
+       extern struct hostent *_switch_gethostbyaddr_r();
+
+       return _switch_gethostbyaddr_r(addr, len, type, &hp, buf, sizeof(buf), &h_errno);
+# else
+       extern struct hostent *__switch_gethostbyaddr();
+
+       return __switch_gethostbyaddr(addr, len, type);
+# endif
+}
+
+#endif
+\f/*
+**  NI_PROPVAL -- netinfo property value lookup routine
+**
+**     Parameters:
+**             directory -- the Netinfo directory name.
+**             propname -- the Netinfo property name.
+**
+**     Returns:
+**             NULL -- if:
+**                     1. the directory is not found
+**                     2. the property name is not found
+**                     3. the property contains multiple values
+**                     4. some error occured
+**             else -- the location of the config file.
+**
+**     Notes:
+**             Caller should free the return value of ni_proval
+*/
+
+#ifdef NETINFO
+
+# include <netinfo/ni.h>
+
+# define LOCAL_NETINFO_DOMAIN    "."
+# define PARENT_NETINFO_DOMAIN   ".."
+# define MAX_NI_LEVELS           256
+
+char *
+ni_propval(directory, propname)
+       char *directory;
+       char *propname;
+{
+       char *propval;
+       int i;
+       void *ni = NULL;
+       void *lastni = NULL;
+       ni_status nis;
+       ni_id nid;
+       ni_namelist ninl;
+
+       /*
+       **  If the passed directory and property name are found
+       **  in one of netinfo domains we need to search (starting
+       **  from the local domain moving all the way back to the
+       **  root domain) set propval to the property's value
+       **  and return it.
+       */
+
+       for (i = 0; i < MAX_NI_LEVELS; ++i)
+       {
+               if (i == 0)
+               {
+                       nis = ni_open(NULL, LOCAL_NETINFO_DOMAIN, &ni);
+               }
+               else
+               {
+                       if (lastni != NULL)
+                               ni_free(lastni);
+                       lastni = ni;
+                       nis = ni_open(lastni, PARENT_NETINFO_DOMAIN, &ni);
+               }
+
+               /*
+               **  Don't bother if we didn't get a handle on a
+               **  proper domain.  This is not necessarily an error.
+               **  We would get a positive ni_status if, for instance
+               **  we never found the directory or property and tried
+               **  to open the parent of the root domain!
+               */
+
+               if (nis != 0)
+                       break;
+
+               /*
+               **  Find the path to the server information.
+               */
+
+               if (ni_pathsearch(ni, &nid, directory) != 0)
+                       continue;
+
+               /*
+               **  Find "host" information.
+               */
+
+               if (ni_lookupprop(ni, &nid, propname, &ninl) != 0)
+                       continue;
+
+               /*
+               **  If there's only one name in
+               **  the list, assume we've got
+               **  what we want.
+               */
+
+               if (ninl.ni_namelist_len == 1)
+               {
+                       propval = ni_name_dup(ninl.ni_namelist_val[0]);
+                       break;
+               }
+       }
+
+       /*
+       **  Clean up.
+       */
+
+       if (ni != NULL)
+               ni_free(ni);
+       if (lastni != NULL && ni != lastni)
+               ni_free(lastni);
+
+       return propval;
+}
+
+#endif /* NETINFO */
+\f/*
+**  HARD_SYSLOG -- call syslog repeatedly until it works
+**
+**     Needed on HP-UX, which apparently doesn't guarantee that
+**     syslog succeeds during interrupt handlers.
+*/
+
+#ifdef __hpux
+
+# define MAXSYSLOGTRIES        100
+# undef syslog
+
+# ifdef __STDC__
+hard_syslog(int pri, char *msg, ...)
+# else
+hard_syslog(pri, msg, va_alist)
+       int pri;
+       char *msg;
+       va_dcl
+# endif
+{
+       int i;
+       char buf[SYSLOG_BUFSIZE * 2];
+       VA_LOCAL_DECL;
+
+       VA_START(msg);
+       vsprintf(buf, msg, ap);
+       VA_END;
+
+       for (i = MAXSYSLOGTRIES; --i >= 0 && syslog(pri, "%s", buf) < 0; )
+               continue;
+}
+
+#endif
index ee84d6c..a06738c 100644 (file)
@@ -31,7 +31,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- *     @(#)conf.h      8.44 (Berkeley) 10/29/93
+ *     @(#)conf.h      8.75 (Berkeley) 1/8/94
  */
 
 /*
  */
 
 /*
@@ -64,7 +64,6 @@
 # define MEMCHUNKSIZE  1024            /* chunk size for memory allocation */
 # define MAXUSERENVIRON        100             /* max envars saved, must be >= 3 */
 # define MAXALIASDB    12              /* max # of alias databases */
 # define MEMCHUNKSIZE  1024            /* chunk size for memory allocation */
 # define MAXUSERENVIRON        100             /* max envars saved, must be >= 3 */
 # define MAXALIASDB    12              /* max # of alias databases */
-# define PSBUFSIZE     (MAXLINE + MAXATOM)     /* size of prescan buffer */
 
 # ifndef QUEUESIZE
 # define QUEUESIZE     1000            /* max # of jobs per queue run */
 
 # ifndef QUEUESIZE
 # define QUEUESIZE     1000            /* max # of jobs per queue run */
@@ -78,6 +77,7 @@
 
 # define LOG           1       /* enable logging */
 # define UGLYUUCP      1       /* output ugly UUCP From lines */
 
 # define LOG           1       /* enable logging */
 # define UGLYUUCP      1       /* output ugly UUCP From lines */
+# define NETUNIX       1       /* include unix domain support */
 # define NETINET       1       /* include internet support */
 # define SETPROCTITLE  1       /* munge argv to display current status */
 # define NAMED_BIND    1       /* use Berkeley Internet Domain Server */
 # define NETINET       1       /* include internet support */
 # define SETPROCTITLE  1       /* munge argv to display current status */
 # define NAMED_BIND    1       /* use Berkeley Internet Domain Server */
 # endif
 
 /*
 # endif
 
 /*
-**  Due to a "feature" in some operating systems such as Ultrix 4.3 and
-**  HPUX 8.0, if you receive a "No route to host" message (ICMP message
-**  ICMP_UNREACH_HOST) on _any_ connection, all connections to that host
-**  are closed.  Some firewalls return this error if you try to connect
-**  to the IDENT port (113), so you can't receive email from these hosts
-**  on these systems.  The firewall really should use a more specific
-**  message such as ICMP_UNREACH_PROTOCOL or _PORT or _NET_PROHIB.  This
-**  will get #undefed below as needed.
+**  Most systems have symbolic links today, so default them on.  You
+**  can turn them off by #undef'ing this below.
 */
 
 */
 
-# define IDENTPROTO    1       /* use IDENT proto (RFC 1413) */
+# define HASLSTAT      1       /* has lstat(2) call */
+
+/*
+**  General "standard C" defines.
+**
+**     These may be undone later, to cope with systems that claim to
+**     be Standard C but aren't.  Gcc is the biggest offender -- it
+**     doesn't realize that the library is part of the language.
+**
+**     Life would be much easier if we could get rid of this sort
+**     of bozo problems.
+*/
+
+#ifdef __STDC__
+# define HASSETVBUF    1       /* we have setvbuf(3) in libc */
+#endif
 
 /**********************************************************************
 **  Operating system configuration.
 
 /**********************************************************************
 **  Operating system configuration.
 
 
 /*
 
 
 /*
-**  HP-UX -- tested for 8.07
+**  HP-UX -- tested for 8.07, 9.00, and 9.01.
 */
 
 # ifdef __hpux
 */
 
 # ifdef __hpux
 # define HASSETREUID   1       /* has setreuid(2) call */
 # define setreuid(r, e)                setresuid(r, e, -1)     
 # define LA_TYPE       LA_FLOAT
 # define HASSETREUID   1       /* has setreuid(2) call */
 # define setreuid(r, e)                setresuid(r, e, -1)     
 # define LA_TYPE       LA_FLOAT
+# define GIDSET_T      gid_t
 # define _PATH_UNIX    "/hp-ux"
 # define _PATH_UNIX    "/hp-ux"
-# undef IDENTPROTO             /* TCP/IP implementation is broken */
+# ifndef _PATH_SENDMAILCF
+#  define _PATH_SENDMAILCF     "/usr/lib/sendmail.cf"
+# endif
+# ifndef IDENTPROTO
+#  define IDENTPROTO   0       /* TCP/IP implementation is broken */
+# endif
+# ifndef HASGETUSERSHELL
+#  define HASGETUSERSHELL 0    /* getusershell(3) causes core dumps */
+# endif
+# define syslog                hard_syslog
+# ifdef __STDC__
+extern int     syslog(int, char *, ...);
+# endif
 # endif
 
 
 # endif
 
 
 
 # ifdef _AIX3
 # define HASINITGROUPS 1       /* has initgroups(3) call */
 
 # ifdef _AIX3
 # define HASINITGROUPS 1       /* has initgroups(3) call */
+# define HASSTATFS     1       /* has the statfs(2) syscall */
+# define HASUNAME      1       /* use System V uname(2) system call */
+# define HASGETUSERSHELL 0     /* does not have getusershell(3) call */
 # define FORK          fork    /* no vfork primitive available */
 # undef  SETPROCTITLE          /* setproctitle confuses AIX */
 # endif
 # define FORK          fork    /* no vfork primitive available */
 # undef  SETPROCTITLE          /* setproctitle confuses AIX */
 # endif
 # define HASSETREUID   1       /* has setreuid(2) call */
 # define HASINITGROUPS 1       /* has initgroups(3) call */
 # define HASSTATFS     1       /* has the statfs(2) syscall */
 # define HASSETREUID   1       /* has setreuid(2) call */
 # define HASINITGROUPS 1       /* has initgroups(3) call */
 # define HASSTATFS     1       /* has the statfs(2) syscall */
+# define HASGETUSERSHELL 0     /* does not have getusershell(3) call */
 # define FORK          fork    /* no vfork primitive available */
 # define WAITUNION     1       /* use "union wait" as wait argument type */
 # define setpgid       BSDsetpgrp
 # define FORK          fork    /* no vfork primitive available */
 # define WAITUNION     1       /* use "union wait" as wait argument type */
 # define setpgid       BSDsetpgrp
 
 
 /*
 
 
 /*
-**  SunOS
+**  SunOS and Solaris
+**
+**     Tested on SunOS 4.1.x (a.k.a. Solaris 1.1.x) and
+**     Solaris 2.2 (a.k.a. SunOS 5.2).
 */
 
 #if defined(sun) && !defined(BSD)
 
 # define LA_TYPE       LA_INT
 */
 
 #if defined(sun) && !defined(BSD)
 
 # define LA_TYPE       LA_INT
-# define HASSETREUID   1       /* has setreuid(2) call */
 # define HASINITGROUPS 1       /* has initgroups(3) call */
 # define HASINITGROUPS 1       /* has initgroups(3) call */
+# define HASUNAME      1       /* use System V uname(2) system call */
+# define HASGETUSERSHELL 1     /* DOES have getusershell(3) call in libc */
+
+# ifdef SOLARIS_2_3
+#  define SOLARIS
+# endif
 
 # ifdef SOLARIS
                        /* Solaris 2.x (a.k.a. SunOS 5.x) */
 
 # ifdef SOLARIS
                        /* Solaris 2.x (a.k.a. SunOS 5.x) */
-#  define SYSTEM5      1       /* use System V definitions */
-#  define setreuid(r, e)       seteuid(e)
-#  include <sys/sysmacros.h>
+#  ifndef __svr4__
+#   define __svr4__            /* use all System V Releae 4 defines below */
+#  endif
 #  include <sys/time.h>
 #  include <sys/time.h>
-#  define gethostbyname        __switch_gethostbyname  /* get working version */
-#  define gethostbyaddr        __switch_gethostbyaddr  /* get working version */
-#  define _PATH_UNIX   "/kernel/unix"
+#  define gethostbyname        solaris_gethostbyname   /* get working version */
+#  define gethostbyaddr        solaris_gethostbyaddr   /* get working version */
+#  define GIDSET_T     gid_t
+#  ifndef _PATH_UNIX
+#   define _PATH_UNIX  "/kernel/unix"
+#  endif
 #  ifndef _PATH_SENDMAILCF
 #   define _PATH_SENDMAILCF    "/etc/mail/sendmail.cf"
 #  endif
 #  ifndef _PATH_SENDMAILCF
 #   define _PATH_SENDMAILCF    "/etc/mail/sendmail.cf"
 #  endif
 #  endif
 
 # else
 #  endif
 
 # else
-                       /* SunOS 4.1.x */
+                       /* SunOS 4.0.3 or 4.1.x */
+#  define HASSETREUID  1       /* has setreuid(2) call */
 #  define HASSTATFS    1       /* has the statfs(2) syscall */
 #  define HASSTATFS    1       /* has the statfs(2) syscall */
-/* #  define HASFLOCK  1       /* has flock(2) call */
+#  define HASFLOCK     1       /* has flock(2) call */
 #  include <vfork.h>
 
 #  include <vfork.h>
 
+#  ifdef SUNOS403
+                       /* special tweaking for SunOS 4.0.3 */
+#   include <malloc.h>
+#   define SYS5SIGNALS 1       /* SysV signal semantics -- reset on each sig */
+#   define WAITUNION   1       /* use "union wait" as wait argument type */
+#   undef WIFEXITED
+#   undef WEXITSTATUS
+#   undef HASUNAME
+#   define setpgid     setpgrp
+typedef int            pid_t;
+extern char            *getenv();
+
+#  endif
 # endif
 #endif
 
 /*
 # endif
 #endif
 
 /*
-** DG/UX 5.4.2
+**  DG/UX
+**
+**     Tested on 5.4.2
 */
 
 #ifdef DGUX
 */
 
 #ifdef DGUX
 # define HASUNAME      1       /* use System V uname(2) system call */
 # define HASSETSID     1       /* has Posix setsid(2) call */
 # define HASINITGROUPS 1       /* has initgroups(3) call */
 # define HASUNAME      1       /* use System V uname(2) system call */
 # define HASSETSID     1       /* has Posix setsid(2) call */
 # define HASINITGROUPS 1       /* has initgroups(3) call */
-# define HASSETVBUF    1       /* we have setvbuf(3) in libc */
-# undef IDENTPROTO             /* TCP/IP implementation is broken */
+# ifndef IDENTPROTO
+#  define IDENTPROTO   0       /* TCP/IP implementation is broken */
+# endif
 # undef SETPROCTITLE
 # undef SETPROCTITLE
+
+/* these include files must be included early on DG/UX */
+# include <netinet/in.h>
+# include <arpa/inet.h>
+
 # define inet_addr     dgux_inet_addr
 extern long    dgux_inet_addr();
 #endif
 # define inet_addr     dgux_inet_addr
 extern long    dgux_inet_addr();
 #endif
@@ -229,9 +288,16 @@ extern long        dgux_inet_addr();
 # define HASUNSETENV   1       /* has unsetenv(3) call */
 # define HASINITGROUPS 1       /* has initgroups(3) call */
 # define HASFLOCK      1       /* has flock(2) call */
 # define HASUNSETENV   1       /* has unsetenv(3) call */
 # define HASINITGROUPS 1       /* has initgroups(3) call */
 # define HASFLOCK      1       /* has flock(2) call */
-# define LA_TYPE       LA_INT
-# define LA_AVENRUN    "avenrun"
-# undef IDENTPROTO             /* TCP/IP implementation is broken */
+# define HASGETUSERSHELL 0     /* does not have getusershell(3) call */
+# ifdef vax
+#  define LA_TYPE      LA_FLOAT
+# else
+#  define LA_TYPE      LA_INT
+#  define LA_AVENRUN   "avenrun"
+# endif
+# ifndef IDENTPROTO
+#  define IDENTPROTO   0       /* TCP/IP implementation is broken */
+# endif
 #endif
 
 
 #endif
 
 
@@ -244,8 +310,11 @@ extern long        dgux_inet_addr();
 # define HASUNSETENV   1       /* has unsetenv(3) call */
 # define HASSETREUID   1       /* has setreuid(2) call */
 # define HASINITGROUPS 1       /* has initgroups(3) call */
 # define HASUNSETENV   1       /* has unsetenv(3) call */
 # define HASSETREUID   1       /* has setreuid(2) call */
 # define HASINITGROUPS 1       /* has initgroups(3) call */
-/* # define HASFLOCK   1       /* has flock(2) call */
+# define HASFLOCK      1       /* has flock(2) call */
 # define LA_TYPE       LA_INT
 # define LA_TYPE       LA_INT
+# ifndef _PATH_SENDMAILPID
+#  define _PATH_SENDMAILPID    "/var/run/sendmail.pid"
+# endif
 #endif
 
 
 #endif
 
 
@@ -280,6 +349,8 @@ typedef int         pid_t;
 
 /*
 **  4.4 BSD
 
 /*
 **  4.4 BSD
+**
+**     See also BSD defines.
 */
 
 #ifdef BSD4_4
 */
 
 #ifdef BSD4_4
@@ -294,12 +365,14 @@ typedef int               pid_t;
 
 
 /*
 
 
 /*
-**  386BSD / FreeBSD 1.0E (works) / NetBSD (not tested)
+**  386BSD / FreeBSD 1.0E / NetBSD (all architectures, all versions)
 **
 **  4.3BSD clone, closer to 4.4BSD
 **
 **  4.3BSD clone, closer to 4.4BSD
+**
+**     See also BSD defines.
 */
 
 */
 
-#ifdef __386BSD__
+#if defined(__386BSD__) || defined(__FreeBSD__) || defined(__NetBSD__)
 # define HASUNSETENV   1       /* has unsetenv(3) call */
 # define HASSETSID     1       /* has the setsid(2) POSIX syscall */
 # define HASSTATFS     1       /* has the statfs(2) syscall */
 # define HASUNSETENV   1       /* has unsetenv(3) call */
 # define HASSETSID     1       /* has the setsid(2) POSIX syscall */
 # define HASSTATFS     1       /* has the statfs(2) syscall */
@@ -311,6 +384,36 @@ typedef int                pid_t;
 #endif
 
 
 #endif
 
 
+/*
+**  Mach386
+**
+**     For mt Xinu's Mach386 system.
+*/
+
+#if defined(MACH) && defined(i386)
+# define MACH386       1
+# define HASUNSETENV   1       /* has unsetenv(3) call */
+# define HASINITGROUPS 1       /* has initgroups(3) call */
+# define HASFLOCK      1       /* has flock(2) call */
+# define HASSTATFS     1       /* has the statfs(2) syscall */
+# define NEEDGETOPT    1       /* need a replacement for getopt(3) */
+# define NEEDSTRTOL    1       /* need the strtol() function */
+# define setpgid       setpgrp
+# ifndef LA_TYPE
+#  define LA_TYPE      LA_FLOAT
+# endif
+# undef HASSETVBUF             /* don't actually have setvbuf(3) */
+# undef WEXITSTATUS
+# undef WIFEXITED
+# ifndef _PATH_SENDMAILCF
+#  define _PATH_SENDMAILCF     "/usr/lib/sendmail.cf"
+# endif
+# ifndef _PATH_SENDMAILPID
+#  define _PATH_SENDMAILPID    "/etc/sendmail.pid"
+# endif
+#endif
+
+
 /*
 **  4.3 BSD -- this is for very old systems
 **
 /*
 **  4.3 BSD -- this is for very old systems
 **
@@ -329,21 +432,45 @@ typedef int               pid_t;
 # ifndef _PATH_SENDMAILCF
 #  define _PATH_SENDMAILCF     "/usr/lib/sendmail.cf"
 # endif
 # ifndef _PATH_SENDMAILCF
 #  define _PATH_SENDMAILCF     "/usr/lib/sendmail.cf"
 # endif
-# undef IDENTPROTO             /* TCP/IP implementation is broken */
+# ifndef IDENTPROTO
+#  define IDENTPROTO   0       /* TCP/IP implementation is broken */
+# endif
+# undef WEXITSTATUS
+# undef WIFEXITED
+typedef short          pid_t;
+extern int             errno;
 #endif
 
 
 /*
 **  SCO Unix
 #endif
 
 
 /*
 **  SCO Unix
+**
+**     This includes two parts -- the first is for SCO Open Server 3.2v4
+**     (contributed by Philippe Brand <phb@colombo.telesys-innov.fr>).
+**     The second is, I believe, for an older version.
 */
 
 */
 
+#ifdef _SCO_unix_4_2
+# define _SCO_unix_
+# define HASSETREUID   1       /* has setreuid(2) call */
+# define _PATH_UNIX    "/unix"
+# ifndef _PATH_SENDMAILCF
+#  define _PATH_SENDMAILCF     "/usr/lib/sendmail.cf"
+# endif
+# ifndef _PATH_SENDMAILPID
+#  define _PATH_SENDMAILPID    "/etc/sendmail.pid"
+# endif
+#endif
+
 #ifdef _SCO_unix_
 # define SYSTEM5       1       /* include all the System V defines */
 # define SYS5SIGNALS   1       /* SysV signal semantics -- reset on each sig */
 # define HASSTATFS     1       /* has the statfs(2) syscall */
 #ifdef _SCO_unix_
 # define SYSTEM5       1       /* include all the System V defines */
 # define SYS5SIGNALS   1       /* SysV signal semantics -- reset on each sig */
 # define HASSTATFS     1       /* has the statfs(2) syscall */
+# define HASGETUSERSHELL 0     /* does not have getusershell(3) call */
 # define FORK          fork
 # define MAXPATHLEN    PATHSIZE
 # define LA_TYPE       LA_SHORT
 # define FORK          fork
 # define MAXPATHLEN    PATHSIZE
 # define LA_TYPE       LA_SHORT
+# undef NETUNIX                        /* no unix domain socket support */
 #endif
 
 
 #endif
 
 
@@ -358,22 +485,38 @@ typedef int               pid_t;
 # define HASSETSID     1       /* has POSIX setsid(2) call */
 # define NEEDGETOPT    1       /* need replacement for getopt(3) */
 # define LA_TYPE       LA_FLOAT
 # define HASSETSID     1       /* has POSIX setsid(2) call */
 # define NEEDGETOPT    1       /* need replacement for getopt(3) */
 # define LA_TYPE       LA_FLOAT
-# undef IDENTPROTO
+# ifndef IDENTPROTO
+#  define IDENTPROTO   0       /* TCP/IP implementation is broken */
+# endif
 #endif
 
 
 /*
 #endif
 
 
 /*
-**  RISC/os 4.51
+**  RISC/os 4.52
 **
 **
-**     Untested...
+**     Gives a ton of warning messages, but otherwise compiles.
 */
 
 #ifdef RISCOS
 */
 
 #ifdef RISCOS
+
 # define HASUNSETENV   1       /* has unsetenv(3) call */
 # define HASUNSETENV   1       /* has unsetenv(3) call */
-/* # define HASFLOCK   1       /* has flock(2) call */
+# define HASFLOCK      1       /* has flock(2) call */
+# define WAITUNION     1       /* use "union wait" as wait argument type */
+# define NEEDGETOPT    1       /* need a replacement for getopt(3) */
 # define LA_TYPE       LA_INT
 # define LA_AVENRUN    "avenrun"
 # define _PATH_UNIX    "/unix"
 # define LA_TYPE       LA_INT
 # define LA_AVENRUN    "avenrun"
 # define _PATH_UNIX    "/unix"
+# undef WIFEXITED
+
+# define setpgid       setpgrp
+
+extern int             errno;
+typedef int            pid_t;
+#define                        SIGFUNC_DEFINED
+typedef int            (*sigfunc_t)();
+extern char            *getenv();
+extern void            *malloc();
+
 #endif
 
 
 #endif
 
 
@@ -391,6 +534,7 @@ typedef int         pid_t;
 #  define LA_TYPE      LA_FLOAT
 # endif
 # include <sys/sysmacros.h>
 #  define LA_TYPE      LA_FLOAT
 # endif
 # include <sys/sysmacros.h>
+# define GIDSET_T      gid_t
 #endif
 
 
 #endif
 
 
@@ -400,19 +544,15 @@ typedef int               pid_t;
 **
 **     It's on #ifdef DELL_SVR4 because Solaris also gets __svr4__
 **     defined, and the definitions conflict.
 **
 **     It's on #ifdef DELL_SVR4 because Solaris also gets __svr4__
 **     defined, and the definitions conflict.
+**
+**     Peter Wemm <peter@perth.DIALix.oz.au> claims that the setreuid
+**     trick works on DELL 2.2 (SVR4.0/386 version 4.0) and ESIX 4.0.3A
+**     (SVR4.0/386 version 3.0).
 */
 
 #ifdef DELL_SVR4
 */
 
 #ifdef DELL_SVR4
-# define SYSTEM5       1
-/* # define setreuid(r, e)     seteuid(e) */
-/* # include <sys/time.h> */
-# define _PATH_UNIX    "/unix"
-# ifndef _PATH_SENDMAILCF
-#  define _PATH_SENDMAILCF     "/usr/ucblib/sendmail.cf"
-# endif
-# ifndef _PATH_SENDMAILPID
-#  define _PATH_SENDMAILPID    "/usr/ucblib/sendmail.pid"
-# endif
+                               /* no changes necessary */
+                               /* see general __svr4__ defines below */
 #endif
 
 
 #endif
 
 
@@ -428,7 +568,9 @@ typedef int         pid_t;
 # define HASUSTAT      1       /* use System V ustat(2) syscall */
 # define HASSETVBUF    1       /* we have setvbuf(3) in libc */
 # define SIGFUNC_DEFINED       /* sigfunc_t already defined */
 # define HASUSTAT      1       /* use System V ustat(2) syscall */
 # define HASSETVBUF    1       /* we have setvbuf(3) in libc */
 # define SIGFUNC_DEFINED       /* sigfunc_t already defined */
-# undef IDENTPROTO             /* TCP/IP implementation is broken */
+# ifndef IDENTPROTO
+#  define IDENTPROTO   0       /* TCP/IP implementation is broken */
+# endif
 # define FORK          fork
 # ifndef _PATH_SENDMAILCF
 #  define _PATH_SENDMAILCF     "/usr/lib/sendmail.cf"
 # define FORK          fork
 # ifndef _PATH_SENDMAILCF
 #  define _PATH_SENDMAILCF     "/usr/lib/sendmail.cf"
@@ -453,6 +595,7 @@ typedef int         pid_t;
 # define HASSTATFS     1       /* has the statfs(2) syscall */
 # define HASSETVBUF    1       /* we have setvbuf(3) in libc */
 # define HASINITGROUPS 1       /* has initgroups(3) call */
 # define HASSTATFS     1       /* has the statfs(2) syscall */
 # define HASSETVBUF    1       /* we have setvbuf(3) in libc */
 # define HASINITGROUPS 1       /* has initgroups(3) call */
+# define HASGETUSERSHELL 0     /* does not have getusershell(3) call */
 # define SYS5SIGNALS   1       /* SysV signal semantics -- reset on each sig */
 # define SYS5SETPGRP   1       /* use System V setpgrp(2) syscall */
 # define FORK          fork    /* no vfork(2) primitive available */
 # define SYS5SIGNALS   1       /* SysV signal semantics -- reset on each sig */
 # define SYS5SETPGRP   1       /* use System V setpgrp(2) syscall */
 # define FORK          fork    /* no vfork(2) primitive available */
@@ -464,6 +607,61 @@ extern struct group        *getgrent(), *getgrnam(), *getgrgid();
 #endif
 
 
 #endif
 
 
+/*
+**  Stardent Titan 3000 running TitanOS 4.2.
+**
+**     Must be compiled in "cc -43" mode.
+**
+**     From Kate Hedstrom <kate@ahab.rutgers.edu>.
+**
+**     Note the tweaking below after the BSD defines are set.
+*/
+
+#ifdef titan
+# define setpgid       setpgrp
+typedef int            pid_t;
+# undef WIFEXITED
+# undef WEXITSTATUS
+#endif
+
+
+/*
+**  Sequent DYNIX 3.2.0
+**
+**     From Jim Davis <jdavis@cs.arizona.edu>.
+*/
+
+#ifdef sequent
+# define BSD           1
+# define HASUNSETENV   1
+# define BSD4_3                1       /* to get signal() in conf.c */
+# define WAITUNION     1
+# define LA_TYPE       LA_FLOAT
+# ifdef        _POSIX_VERSION
+#  undef _POSIX_VERSION                /* set in <unistd.h> */
+# endif
+# undef HASSETVBUF             /* don't actually have setvbuf(3) */
+# define setpgid       setpgrp
+
+/* Have to redefine WIFEXITED to take an int, to work with waitfor() */
+# undef        WIFEXITED
+# define WIFEXITED(s)  (((union wait*)&(s))->w_stopval != WSTOPPED && \
+                        ((union wait*)&(s))->w_termsig == 0)
+# define WEXITSTATUS(s)        (((union wait*)&(s))->w_retcode)
+typedef int            pid_t;
+# define isgraph(c)    (isprint(c) && (c != ' '))
+
+# ifndef _PATH_UNIX
+#  define _PATH_UNIX   "/dynix"
+# endif
+# ifndef _PATH_SENDMAILCF
+#  define _PATH_SENDMAILCF     "/usr/lib/sendmail.cf"
+# endif
+
+#endif
+
+
+
 
 /**********************************************************************
 **  End of Per-Operating System defines
 
 /**********************************************************************
 **  End of Per-Operating System defines
@@ -481,11 +679,36 @@ extern struct group       *getgrent(), *getgrnam(), *getgrgid();
 # define HASFLOCK      1       /* has flock(2) call */
 #endif
 
 # define HASFLOCK      1       /* has flock(2) call */
 #endif
 
+/* general System V Release 4 defines */
+#ifdef __svr4__
+# define SYSTEM5       1
+# define HASSETREUID   1       /* has seteuid(2) call & working saved uids */
+# ifndef HASGETUSERSHELL
+#  define HASGETUSERSHELL 0    /* does not have getusershell(3) call */
+# endif
+# define setreuid(r, e)        seteuid(e)
+
+# ifndef _PATH_UNIX
+#  define _PATH_UNIX           "/unix"
+# endif
+# ifndef _PATH_SENDMAILCF
+#  define _PATH_SENDMAILCF     "/usr/ucblib/sendmail.cf"
+# endif
+# ifndef _PATH_SENDMAILPID
+#  define _PATH_SENDMAILPID    "/usr/ucblib/sendmail.pid"
+# endif
+# ifndef SYSLOG_BUFSIZE
+#  define SYSLOG_BUFSIZE       128
+# endif
+#endif
+
 /* general System V defines */
 # ifdef SYSTEM5
 /* general System V defines */
 # ifdef SYSTEM5
+# include <sys/sysmacros.h>
 # define HASUNAME      1       /* use System V uname(2) system call */
 # define HASUSTAT      1       /* use System V ustat(2) syscall */
 # define SYS5SETPGRP   1       /* use System V setpgrp(2) syscall */
 # define HASUNAME      1       /* use System V uname(2) system call */
 # define HASUSTAT      1       /* use System V ustat(2) syscall */
 # define SYS5SETPGRP   1       /* use System V setpgrp(2) syscall */
+# define HASSETVBUF    1       /* we have setvbuf(3) in libc */
 # ifndef LA_TYPE
 #  define LA_TYPE      LA_INT
 # endif
 # ifndef LA_TYPE
 #  define LA_TYPE      LA_INT
 # endif
@@ -494,11 +717,6 @@ extern struct group        *getgrent(), *getgrnam(), *getgrgid();
 # define bcmp(s, d, l)         (memcmp((s), (d), (l)))
 # endif
 
 # define bcmp(s, d, l)         (memcmp((s), (d), (l)))
 # endif
 
-/* general "standard C" defines */
-#if defined(__STDC__) || defined(SYSTEM5)
-# define HASSETVBUF    1       /* we have setvbuf(3) in libc */
-#endif
-
 /* general POSIX defines */
 #ifdef _POSIX_VERSION
 # define HASSETSID     1       /* has Posix setsid(2) call */
 /* general POSIX defines */
 #ifdef _POSIX_VERSION
 # define HASSETSID     1       /* has Posix setsid(2) call */
@@ -515,6 +733,34 @@ extern struct group        *getgrent(), *getgrnam(), *getgrgid();
 # define GIDSET_T      int
 #endif
 
 # define GIDSET_T      int
 #endif
 
+/*
+**  Tweaking for systems that (for example) claim to be BSD but
+**  don't have all the standard BSD routines (boo hiss).
+*/
+
+#ifdef titan
+# undef HASINITGROUPS          /* doesn't have initgroups(3) call */
+#endif
+
+/*
+**  Due to a "feature" in some operating systems such as Ultrix 4.3 and
+**  HPUX 8.0, if you receive a "No route to host" message (ICMP message
+**  ICMP_UNREACH_HOST) on _any_ connection, all connections to that host
+**  are closed.  Some firewalls return this error if you try to connect
+**  to the IDENT port (113), so you can't receive email from these hosts
+**  on these systems.  The firewall really should use a more specific
+**  message such as ICMP_UNREACH_PROTOCOL or _PORT or _NET_PROHIB.  If
+**  not explicitly set to zero above, default it on.
+*/
+
+#ifndef IDENTPROTO
+# define IDENTPROTO    1       /* use IDENT proto (RFC 1413) */
+#endif
+
+#ifndef HASGETUSERSHELL
+# define HASGETUSERSHELL 1     /* libc has getusershell(3) call */
+#endif
+
 
 /**********************************************************************
 **  Remaining definitions should never have to be changed.  They are
 
 /**********************************************************************
 **  Remaining definitions should never have to be changed.  They are
@@ -524,7 +770,10 @@ extern struct group        *getgrent(), *getgrnam(), *getgrgid();
 
 /* System 5 compatibility */
 #ifndef S_ISREG
 
 /* System 5 compatibility */
 #ifndef S_ISREG
-#define S_ISREG(foo)   ((foo & S_IFREG) == S_IFREG)
+# define S_ISREG(foo)  ((foo & S_IFMT) == S_IFREG)
+#endif
+#if !defined(S_ISLNK) && defined(S_IFLNK)
+# define S_ISLNK(foo)  ((foo & S_IFMT) == S_IFLNK)
 #endif
 #ifndef S_IWGRP
 #define S_IWGRP                020
 #endif
 #ifndef S_IWGRP
 #define S_IWGRP                020
@@ -656,6 +905,11 @@ struct utsname
 typedef void           (*sigfunc_t) __P((int));
 #endif
 
 typedef void           (*sigfunc_t) __P((int));
 #endif
 
+/* size of syslog buffer */
+#ifndef SYSLOG_BUFSIZE
+# define SYSLOG_BUFSIZE        1024
+#endif
+
 /*
 **  Size of tobuf (deliver.c)
 **     Tweak this to match your syslog implementation.  It will have to
 /*
 **  Size of tobuf (deliver.c)
 **     Tweak this to match your syslog implementation.  It will have to
@@ -663,9 +917,20 @@ typedef void               (*sigfunc_t) __P((int));
 */
 
 #ifndef TOBUFSIZE
 */
 
 #ifndef TOBUFSIZE
-# define TOBUFSIZE (1024 - 256)
+# if (SYSLOG_BUFSIZE) > 512
+#  define TOBUFSIZE    (SYSLOG_BUFSIZE - 256)
+# else
+#  define TOBUFSIZE    256
+# endif
 #endif
 
 #endif
 
+/*
+**  Size of prescan buffer.
+**     Despite comments in the _sendmail_ book, this probably should
+**     not be changed; there are some hard-to-define dependencies.
+*/
+
+# define PSBUFSIZE     (MAXNAME + MAXATOM)     /* size of prescan buffer */
 /* fork routine -- set above using #ifdef _osname_ or in Makefile */
 # ifndef FORK
 # define FORK          vfork           /* function to call to fork mailer */
 /* fork routine -- set above using #ifdef _osname_ or in Makefile */
 # ifndef FORK
 # define FORK          vfork           /* function to call to fork mailer */
index a1a51f9..8e5f555 100644 (file)
@@ -37,9 +37,9 @@
 
 #ifndef lint
 #ifdef DAEMON
 
 #ifndef lint
 #ifdef DAEMON
-static char sccsid[] = "@(#)daemon.c   8.21 (Berkeley) 10/31/93 (with daemon mode)";
+static char sccsid[] = "@(#)daemon.c   8.30 (Berkeley) 1/8/94 (with daemon mode)";
 #else
 #else
-static char sccsid[] = "@(#)daemon.c   8.21 (Berkeley) 10/31/93 (without daemon mode)";
+static char sccsid[] = "@(#)daemon.c   8.30 (Berkeley) 1/8/94 (without daemon mode)";
 #endif
 #endif /* not lint */
 
 #endif
 #endif /* not lint */
 
@@ -110,10 +110,10 @@ int               TcpSndBufferSize = 0;           /* size of TCP send buffer */
 getrequests()
 {
        int t;
 getrequests()
 {
        int t;
-       register struct servent *sp;
        int on = 1;
        bool refusingconnections = TRUE;
        FILE *pidf;
        int on = 1;
        bool refusingconnections = TRUE;
        FILE *pidf;
+       int socksize;
        extern void reapchild();
 
        /*
        extern void reapchild();
 
        /*
@@ -126,13 +126,16 @@ getrequests()
                DaemonAddr.sin.sin_addr.s_addr = INADDR_ANY;
        if (DaemonAddr.sin.sin_port == 0)
        {
                DaemonAddr.sin.sin_addr.s_addr = INADDR_ANY;
        if (DaemonAddr.sin.sin_port == 0)
        {
+               register struct servent *sp;
+
                sp = getservbyname("smtp", "tcp");
                if (sp == NULL)
                {
                        syserr("554 service \"smtp\" unknown");
                sp = getservbyname("smtp", "tcp");
                if (sp == NULL)
                {
                        syserr("554 service \"smtp\" unknown");
-                       goto severe;
+                       DaemonAddr.sin.sin_port = htons(25);
                }
                }
-               DaemonAddr.sin.sin_port = sp->s_port;
+               else
+                       DaemonAddr.sin.sin_port = sp->s_port;
        }
 
        /*
        }
 
        /*
@@ -177,22 +180,22 @@ getrequests()
        {
 # ifdef NETINET
          case AF_INET:
        {
 # ifdef NETINET
          case AF_INET:
-               t = sizeof DaemonAddr.sin;
+               socksize = sizeof DaemonAddr.sin;
                break;
 # endif
 
 # ifdef NETISO
          case AF_ISO:
                break;
 # endif
 
 # ifdef NETISO
          case AF_ISO:
-               t = sizeof DaemonAddr.siso;
+               socksize = sizeof DaemonAddr.siso;
                break;
 # endif
 
          default:
                break;
 # endif
 
          default:
-               t = sizeof DaemonAddr;
+               socksize = sizeof DaemonAddr;
                break;
        }
 
                break;
        }
 
-       if (bind(DaemonSocket, &DaemonAddr.sa, t) < 0)
+       if (bind(DaemonSocket, &DaemonAddr.sa, socksize) < 0)
        {
                syserr("getrequests: cannot bind");
                (void) close(DaemonSocket);
        {
                syserr("getrequests: cannot bind");
                (void) close(DaemonSocket);
@@ -260,7 +263,7 @@ getrequests()
                do
                {
                        errno = 0;
                do
                {
                        errno = 0;
-                       lotherend = sizeof RealHostAddr;
+                       lotherend = socksize;
                        t = accept(DaemonSocket,
                            (struct sockaddr *)&RealHostAddr, &lotherend);
                } while (t < 0 && errno == EINTR);
                        t = accept(DaemonSocket,
                            (struct sockaddr *)&RealHostAddr, &lotherend);
                } while (t < 0 && errno == EINTR);
@@ -299,7 +302,6 @@ getrequests()
                        */
 
                        (void) setsignal(SIGCHLD, SIG_DFL);
                        */
 
                        (void) setsignal(SIGCHLD, SIG_DFL);
-                       OpMode = MD_SMTP;
 
                        /* determine host name */
                        p = hostnamebyanyaddr(&RealHostAddr);
 
                        /* determine host name */
                        p = hostnamebyanyaddr(&RealHostAddr);
@@ -613,7 +615,7 @@ gothostent:
                  case AF_INET:
                        bcopy(hp->h_addr,
                                &addr.sin.sin_addr,
                  case AF_INET:
                        bcopy(hp->h_addr,
                                &addr.sin.sin_addr,
-                               hp->h_length);
+                               sizeof addr.sin.sin_addr);
                        break;
 #endif
 
                        break;
 #endif
 
@@ -639,9 +641,10 @@ gothostent:
                if (sp == NULL)
                {
                        syserr("554 makeconnection: service \"smtp\" unknown");
                if (sp == NULL)
                {
                        syserr("554 makeconnection: service \"smtp\" unknown");
-                       return (EX_OSERR);
+                       port = htons(25);
                }
                }
-               port = sp->s_port;
+               else
+                       port = sp->s_port;
        }
 
        switch (addr.sa.sa_family)
        }
 
        switch (addr.sa.sa_family)
@@ -742,7 +745,7 @@ gothostent:
                          case AF_INET:
                                bcopy(hp->h_addr_list[i++],
                                      &addr.sin.sin_addr,
                          case AF_INET:
                                bcopy(hp->h_addr_list[i++],
                                      &addr.sin.sin_addr,
-                                     hp->h_length);
+                                     sizeof addr.sin.sin_addr);
                                break;
 #endif
 
                                break;
 #endif
 
@@ -846,7 +849,7 @@ myhostname(hostbuf, size)
 **             Sets RealHostName to the name of the host at the other end.
 */
 
 **             Sets RealHostName to the name of the host at the other end.
 */
 
-#ifdef IDENTPROTO
+#if IDENTPROTO
 
 static jmp_buf CtxAuthTimeout;
 
 
 static jmp_buf CtxAuthTimeout;
 
@@ -865,7 +868,7 @@ getauthinfo(fd)
        SOCKADDR fa;
        int falen;
        register char *p;
        SOCKADDR fa;
        int falen;
        register char *p;
-#ifdef IDENTPROTO
+#if IDENTPROTO
        SOCKADDR la;
        int lalen;
        register struct servent *sp;
        SOCKADDR la;
        int lalen;
        register struct servent *sp;
@@ -878,7 +881,8 @@ getauthinfo(fd)
        extern char RealUserName[];                     /* main.c */
 
        falen = sizeof fa;
        extern char RealUserName[];                     /* main.c */
 
        falen = sizeof fa;
-       if (getpeername(fd, &fa.sa, &falen) < 0 || falen <= 0)
+       if (getpeername(fd, &fa.sa, &falen) < 0 || falen <= 0 ||
+           fa.sa.sa_family == 0)
        {
                RealHostName = "localhost";
                (void) sprintf(hbuf, "%s@localhost", RealUserName);
        {
                RealHostName = "localhost";
                (void) sprintf(hbuf, "%s@localhost", RealUserName);
@@ -891,7 +895,7 @@ getauthinfo(fd)
        RealHostName = newstr(p);
        RealHostAddr = fa;
 
        RealHostName = newstr(p);
        RealHostAddr = fa;
 
-#ifdef IDENTPROTO
+#if IDENTPROTO
        lalen = sizeof la;
        if (fa.sa.sa_family != AF_INET ||
            getsockname(fd, &la.sa, &lalen) < 0 || lalen <= 0 ||
        lalen = sizeof la;
        if (fa.sa.sa_family != AF_INET ||
            getsockname(fd, &la.sa, &lalen) < 0 || lalen <= 0 ||
@@ -1049,7 +1053,6 @@ host_map_lookup(map, name, av, statp)
        char *cp;
        int i;
        register STAB *s;
        char *cp;
        int i;
        register STAB *s;
-       char *timeoutmsg = "Recipient domain nameserver timed out";
        char hbuf[MAXNAME];
        extern struct hostent *gethostbyaddr();
        extern int h_errno;
        char hbuf[MAXNAME];
        extern struct hostent *gethostbyaddr();
        extern int h_errno;
@@ -1069,7 +1072,11 @@ host_map_lookup(map, name, av, statp)
                h_errno = s->s_namecanon.nc_herrno;
                *statp = s->s_namecanon.nc_stat;
                if (CurEnv->e_message == NULL && *statp == EX_TEMPFAIL)
                h_errno = s->s_namecanon.nc_herrno;
                *statp = s->s_namecanon.nc_stat;
                if (CurEnv->e_message == NULL && *statp == EX_TEMPFAIL)
-                       CurEnv->e_message = newstr(timeoutmsg);
+               {
+                       sprintf(hbuf, "%s: Name server timeout",
+                               shortenstring(name, 33));
+                       CurEnv->e_message = newstr(hbuf);
+               }
                return s->s_namecanon.nc_cname;
        }
 
                return s->s_namecanon.nc_cname;
        }
 
@@ -1109,9 +1116,11 @@ host_map_lookup(map, name, av, statp)
                          case TRY_AGAIN:
                                if (UseNameServer)
                                {
                          case TRY_AGAIN:
                                if (UseNameServer)
                                {
-                                       message(timeoutmsg);
+                                       sprintf(hbuf, "%s: Name server timeout",
+                                               shortenstring(name, 33));
+                                       message("%s", hbuf);
                                        if (CurEnv->e_message == NULL)
                                        if (CurEnv->e_message == NULL)
-                                               CurEnv->e_message = newstr(timeoutmsg);
+                                               CurEnv->e_message = newstr(hbuf);
                                }
                                *statp = EX_TEMPFAIL;
                                break;
                                }
                                *statp = EX_TEMPFAIL;
                                break;
@@ -1200,6 +1209,7 @@ anynet_ntoa(sap)
        switch (sap->sa.sa_family)
        {
 #ifdef MAYBENEXTRELEASE                /*** UNTESTED *** UNTESTED *** UNTESTED ***/
        switch (sap->sa.sa_family)
        {
 #ifdef MAYBENEXTRELEASE                /*** UNTESTED *** UNTESTED *** UNTESTED ***/
+#ifdef NETUNIX
          case AF_UNIX:
                if (sap->sunix.sun_path[0] != '\0')
                        sprintf(buf, "[UNIX: %.64s]", sap->sunix.sun_path);
          case AF_UNIX:
                if (sap->sunix.sun_path[0] != '\0')
                        sprintf(buf, "[UNIX: %.64s]", sap->sunix.sun_path);
@@ -1207,6 +1217,7 @@ anynet_ntoa(sap)
                        sprintf(buf, "[UNIX: localhost]");
                return buf;
 #endif
                        sprintf(buf, "[UNIX: localhost]");
                return buf;
 #endif
+#endif
 
 #ifdef NETINET
          case AF_INET:
 
 #ifdef NETINET
          case AF_INET:
index 62d6b88..d627395 100644 (file)
@@ -33,7 +33,7 @@
  */
 
 #ifndef lint
  */
 
 #ifndef lint
-static char sccsid[] = "@(#)deliver.c  8.37 (Berkeley) 10/29/93";
+static char sccsid[] = "@(#)deliver.c  8.62 (Berkeley) 1/12/94";
 #endif /* not lint */
 
 #include "sendmail.h"
 #endif /* not lint */
 
 #include "sendmail.h"
@@ -46,6 +46,8 @@ static char sccsid[] = "@(#)deliver.c 8.37 (Berkeley) 10/29/93";
 extern int     h_errno;
 #endif
 
 extern int     h_errno;
 #endif
 
+extern char    SmtpError[];
+
 /*
 **  SENDALL -- actually send all the messages.
 **
 /*
 **  SENDALL -- actually send all the messages.
 **
@@ -82,13 +84,15 @@ sendall(e, mode)
        **  addresses to be sent.
        */
 
        **  addresses to be sent.
        */
 
-       if (bitset(EF_FATALERRS, e->e_flags) && OpMode == MD_SMTP)
+       if (bitset(EF_FATALERRS, e->e_flags) &&
+           (OpMode == MD_SMTP || OpMode == MD_DAEMON))
        {
                e->e_flags |= EF_CLRQUEUE;
                return;
        }
 
        /* determine actual delivery mode */
        {
                e->e_flags |= EF_CLRQUEUE;
                return;
        }
 
        /* determine actual delivery mode */
+       CurrentLA = getla();
        if (mode == SM_DEFAULT)
        {
                mode = e->e_sendmode;
        if (mode == SM_DEFAULT)
        {
                mode = e->e_sendmode;
@@ -333,7 +337,8 @@ sendenvelope(e, mode)
        **  addresses to be sent.
        */
 
        **  addresses to be sent.
        */
 
-       if (bitset(EF_FATALERRS, e->e_flags) && OpMode == MD_SMTP)
+       if (bitset(EF_FATALERRS, e->e_flags) &&
+           (OpMode == MD_SMTP || OpMode == MD_DAEMON))
        {
                e->e_flags |= EF_CLRQUEUE;
                return;
        {
                e->e_flags |= EF_CLRQUEUE;
                return;
@@ -447,10 +452,15 @@ sendenvelope(e, mode)
                        e->e_to = q->q_paddr;
                        if (!bitset(QDONTSEND|QBADADDR, q->q_flags))
                        {
                        e->e_to = q->q_paddr;
                        if (!bitset(QDONTSEND|QBADADDR, q->q_flags))
                        {
-                               message("deliverable: mailer %s, host %s, user %s",
-                                       q->q_mailer->m_name,
-                                       q->q_host,
-                                       q->q_user);
+                               if (q->q_host != NULL && q->q_host[0] != '\0')
+                                       message("deliverable: mailer %s, host %s, user %s",
+                                               q->q_mailer->m_name,
+                                               q->q_host,
+                                               q->q_user);
+                               else
+                                       message("deliverable: mailer %s, user %s",
+                                               q->q_mailer->m_name,
+                                               q->q_user);
                        }
                }
                else if (!bitset(QDONTSEND|QBADADDR, q->q_flags))
                        }
                }
                else if (!bitset(QDONTSEND|QBADADDR, q->q_flags))
@@ -589,7 +599,6 @@ deliver(e, firstto)
        char buf[MAXNAME];
        char rpathbuf[MAXNAME];         /* translated return path */
        extern int checkcompat();
        char buf[MAXNAME];
        char rpathbuf[MAXNAME];         /* translated return path */
        extern int checkcompat();
-       extern char SmtpError[];
 
        errno = 0;
        if (bitset(QDONTSEND|QBADADDR|QQUEUEUP, to->q_flags))
 
        errno = 0;
        if (bitset(QDONTSEND|QBADADDR|QQUEUEUP, to->q_flags))
@@ -597,7 +606,8 @@ deliver(e, firstto)
 
 #ifdef NAMED_BIND
        /* unless interactive, try twice, over a minute */
 
 #ifdef NAMED_BIND
        /* unless interactive, try twice, over a minute */
-       if (OpMode == MD_DAEMON || OpMode == MD_SMTP) {
+       if (OpMode == MD_DAEMON || OpMode == MD_SMTP)
+       {
                _res.retrans = 30;
                _res.retry = 2;
        }
                _res.retrans = 30;
                _res.retry = 2;
        }
@@ -759,7 +769,9 @@ deliver(e, firstto)
                }
 
                /* compute effective uid/gid when sending */
                }
 
                /* compute effective uid/gid when sending */
-               if (to->q_mailer == ProgMailer)
+               /* XXX perhaps this should be to->q_mailer != LocalMailer ?? */
+               /* XXX perhaps it should be a mailer flag? */
+               if (to->q_mailer == ProgMailer || to->q_mailer == FileMailer)
                        ctladdr = getctladdr(to);
 
                user = to->q_user;
                        ctladdr = getctladdr(to);
 
                user = to->q_user;
@@ -831,10 +843,8 @@ deliver(e, firstto)
 
                if (m == FileMailer)
                {
 
                if (m == FileMailer)
                {
-                       ADDRESS *caddr = getctladdr(to);
-
-                       rcode = mailfile(user, caddr, e);
-                       giveresponse(rcode, m, NULL, caddr, e);
+                       rcode = mailfile(user, ctladdr, e);
+                       giveresponse(rcode, m, NULL, ctladdr, e);
                        if (rcode == EX_OK)
                                to->q_flags |= QSENT;
                        continue;
                        if (rcode == EX_OK)
                                to->q_flags |= QSENT;
                        continue;
@@ -905,8 +915,10 @@ deliver(e, firstto)
        **      If we are running SMTP, we just need to clean up.
        */
 
        **      If we are running SMTP, we just need to clean up.
        */
 
-       if (ctladdr == NULL && m != ProgMailer)
+       /*XXX this seems a bit wierd */
+       if (ctladdr == NULL && bitset(QGOODUID, e->e_from.q_flags))
                ctladdr = &e->e_from;
                ctladdr = &e->e_from;
+
 #ifdef NAMED_BIND
        if (ConfigLevel < 2)
                _res.options &= ~(RES_DEFNAMES | RES_DNSRCH);   /* XXX */
 #ifdef NAMED_BIND
        if (ConfigLevel < 2)
                _res.options &= ~(RES_DEFNAMES | RES_DNSRCH);   /* XXX */
@@ -961,12 +973,19 @@ deliver(e, firstto)
                register int i;
                register u_short port;
 
                register int i;
                register u_short port;
 
+               if (pv[0] == NULL || pv[1] == NULL || pv[1][0] == '\0')
+               {
+                       syserr("null host name for %s mailer", m->m_mailer);
+                       rcode = EX_CONFIG;
+                       goto give_up;
+               }
+
                CurHostName = pv[1];
                curhost = hostsignature(m, pv[1], e);
 
                if (curhost == NULL || curhost[0] == '\0')
                {
                CurHostName = pv[1];
                curhost = hostsignature(m, pv[1], e);
 
                if (curhost == NULL || curhost[0] == '\0')
                {
-                       syserr("null signature");
+                       syserr("null host signature for %s", pv[1]);
                        rcode = EX_OSERR;
                        goto give_up;
                }
                        rcode = EX_OSERR;
                        goto give_up;
                }
@@ -1153,6 +1172,7 @@ tryhost:
                                if (ctladdr == NULL || ctladdr->q_uid == 0)
                                {
                                        (void) initgroups(DefUser, DefGid);
                                if (ctladdr == NULL || ctladdr->q_uid == 0)
                                {
                                        (void) initgroups(DefUser, DefGid);
+                                       (void) setgid(DefGid);
                                        (void) setuid(DefUid);
                                }
                                else
                                        (void) setuid(DefUid);
                                }
                                else
@@ -1160,6 +1180,7 @@ tryhost:
                                        (void) initgroups(ctladdr->q_ruser?
                                                ctladdr->q_ruser: ctladdr->q_user,
                                                ctladdr->q_gid);
                                        (void) initgroups(ctladdr->q_ruser?
                                                ctladdr->q_ruser: ctladdr->q_user,
                                                ctladdr->q_gid);
+                                       (void) setgid(ctladdr->q_gid);
                                        (void) setuid(ctladdr->q_uid);
                                }
                        }
                                        (void) setuid(ctladdr->q_uid);
                                }
                        }
@@ -1202,7 +1223,7 @@ tryhost:
                                }
                                (void) close(rpvect[1]);
                        }
                                }
                                (void) close(rpvect[1]);
                        }
-                       else if (OpMode == MD_SMTP || HoldErrs)
+                       else if (OpMode == MD_SMTP || OpMode == MD_DAEMON || HoldErrs)
                        {
                                /* put mailer output in transcript */
                                if (dup2(fileno(e->e_xfp), STDOUT_FILENO) < 0)
                        {
                                /* put mailer output in transcript */
                                if (dup2(fileno(e->e_xfp), STDOUT_FILENO) < 0)
@@ -1333,7 +1354,7 @@ tryhost:
                                rcode, mci->mci_state, firstsig);
                        rcode = EX_SOFTWARE;
                }
                                rcode, mci->mci_state, firstsig);
                        rcode = EX_SOFTWARE;
                }
-               else if (rcode == EX_TEMPFAIL && *curhost != '\0')
+               else if (rcode == EX_TEMPFAIL && curhost != NULL && *curhost != '\0')
                {
                        /* try next MX site */
                        goto tryhost;
                {
                        /* try next MX site */
                        goto tryhost;
@@ -1403,7 +1424,7 @@ tryhost:
                        if (!bitset(MCIF_CACHED, mci->mci_flags))
                                smtpquit(m, mci, e);
                }
                        if (!bitset(MCIF_CACHED, mci->mci_flags))
                                smtpquit(m, mci, e);
                }
-               if (rcode != EX_OK && *curhost != '\0')
+               if (rcode != EX_OK && curhost != NULL && *curhost != '\0')
                {
                        /* try next MX site */
                        goto tryhost;
                {
                        /* try next MX site */
                        goto tryhost;
@@ -1500,12 +1521,21 @@ markfailure(e, q, rcode)
 {
        char buf[MAXLINE];
 
 {
        char buf[MAXLINE];
 
-       if (rcode == EX_OK)
-               return;
-       else if (rcode == EX_TEMPFAIL)
+       switch (rcode)
+       {
+         case EX_OK:
+               break;
+
+         case EX_TEMPFAIL:
+         case EX_IOERR:
+         case EX_OSERR:
                q->q_flags |= QQUEUEUP;
                q->q_flags |= QQUEUEUP;
-       else if (rcode != EX_IOERR && rcode != EX_OSERR)
+               break;
+
+         default:
                q->q_flags |= QBADADDR;
                q->q_flags |= QBADADDR;
+               break;
+       }
 }
 \f/*
 **  ENDMAILER -- Wait for mailer to terminate.
 }
 \f/*
 **  ENDMAILER -- Wait for mailer to terminate.
@@ -1537,9 +1567,9 @@ endmailer(mci, e, pv)
 
        /* close any connections */
        if (mci->mci_in != NULL)
 
        /* close any connections */
        if (mci->mci_in != NULL)
-               (void) xfclose(mci->mci_in, pv[0], "mci_in");
+               (void) xfclose(mci->mci_in, mci->mci_mailer->m_name, "mci_in");
        if (mci->mci_out != NULL)
        if (mci->mci_out != NULL)
-               (void) xfclose(mci->mci_out, pv[0], "mci_out");
+               (void) xfclose(mci->mci_out, mci->mci_mailer->m_name, "mci_out");
        mci->mci_in = mci->mci_out = NULL;
        mci->mci_state = MCIS_CLOSED;
 
        mci->mci_in = mci->mci_out = NULL;
        mci->mci_state = MCIS_CLOSED;
 
@@ -1562,10 +1592,11 @@ endmailer(mci, e, pv)
        }
 
        /* it died a horrid death */
        }
 
        /* it died a horrid death */
-       syserr("mailer %s died with signal %o", pv[0], st);
+       syserr("451 mailer %s died with signal %o",
+               mci->mci_mailer->m_name, st);
 
        /* log the arguments */
 
        /* log the arguments */
-       if (e->e_xfp != NULL)
+       if (pv != NULL && e->e_xfp != NULL)
        {
                register char **av;
 
        {
                register char **av;
 
@@ -1647,8 +1678,6 @@ giveresponse(stat, m, mci, ctladdr, e)
                        else
                        {
 #ifdef SMTP
                        else
                        {
 #ifdef SMTP
-                               extern char SmtpError[];
-
                                statmsg = SmtpError;
 #else /* SMTP */
                                statmsg = NULL;
                                statmsg = SmtpError;
 #else /* SMTP */
                                statmsg = NULL;
@@ -1710,7 +1739,7 @@ giveresponse(stat, m, mci, ctladdr, e)
 
        if (stat != EX_TEMPFAIL)
                setstat(stat);
 
        if (stat != EX_TEMPFAIL)
                setstat(stat);
-       if (stat != EX_OK)
+       if (stat != EX_OK && (stat != EX_TEMPFAIL || e->e_message == NULL))
        {
                if (e->e_message != NULL)
                        free(e->e_message);
        {
                if (e->e_message != NULL)
                        free(e->e_message);
@@ -1724,6 +1753,10 @@ giveresponse(stat, m, mci, ctladdr, e)
 \f/*
 **  LOGDELIVERY -- log the delivery in the system log
 **
 \f/*
 **  LOGDELIVERY -- log the delivery in the system log
 **
+**     Care is taken to avoid logging lines that are too long, because
+**     some versions of syslog have an unfortunate proclivity for core
+**     dumping.  This is a hack, to be sure, that is at best empirical.
+**
 **     Parameters:
 **             m -- the mailer info.  Can be NULL for initial queue.
 **             mci -- the mailer connection info -- can be NULL if the
 **     Parameters:
 **             m -- the mailer info.  Can be NULL for initial queue.
 **             mci -- the mailer connection info -- can be NULL if the
@@ -1748,13 +1781,16 @@ logdelivery(m, mci, stat, ctladdr, e)
 {
 # ifdef LOG
        register char *bp;
 {
 # ifdef LOG
        register char *bp;
+       register char *p;
+       int l;
        char buf[512];
 
        char buf[512];
 
+#  if (SYSLOG_BUFSIZE) >= 256
        bp = buf;
        if (ctladdr != NULL)
        {
                strcpy(bp, ", ctladdr=");
        bp = buf;
        if (ctladdr != NULL)
        {
                strcpy(bp, ", ctladdr=");
-               strcat(bp, ctladdr->q_paddr);
+               strcat(bp, shortenstring(ctladdr->q_paddr, 83));
                bp += strlen(bp);
                if (bitset(QGOODUID, ctladdr->q_flags))
                {
                bp += strlen(bp);
                if (bitset(QGOODUID, ctladdr->q_flags))
                {
@@ -1799,9 +1835,111 @@ logdelivery(m, mci, stat, ctladdr, e)
                        (void) strcat(bp, p);
                }
        }
                        (void) strcat(bp, p);
                }
        }
+       bp += strlen(bp);
+
+#define STATLEN                (((SYSLOG_BUFSIZE) - 100) / 4)
+#if (STATLEN) < 63
+# undef STATLEN
+# define STATLEN       63
+#endif
+#if (STATLEN) > 203
+# undef STATLEN
+# define STATLEN       203
+#endif
+
+       if ((bp - buf) > (sizeof buf - ((STATLEN) + 20)))
+       {
+               /* desperation move -- truncate data */
+               bp = buf + sizeof buf - ((STATLEN) + 17);
+               strcpy(bp, "...");
+               bp += 3;
+       }
+
+       (void) strcpy(bp, ", stat=");
+       bp += strlen(bp);
+
+       (void) strcpy(bp, shortenstring(stat, (STATLEN)));
                
                
-       syslog(LOG_INFO, "%s: to=%s%s, stat=%s",
-              e->e_id, e->e_to, buf, stat);
+       l = SYSLOG_BUFSIZE - 100 - strlen(buf);
+       p = e->e_to;
+       while (strlen(p) >= l)
+       {
+               register char *q = strchr(p + l, ',');
+
+               if (q == NULL)
+                       break;
+               syslog(LOG_INFO, "%s: to=%.*s [more]%s",
+                       e->e_id, ++q - p, p, buf);
+               p = q;
+       }
+       syslog(LOG_INFO, "%s: to=%s%s", e->e_id, p, buf);
+
+#  else                /* we have a very short log buffer size */
+
+       l = SYSLOG_BUFSIZE - 80;
+       p = e->e_to;
+       while (strlen(p) >= l)
+       {
+               register char *q = strchr(p + l, ',');
+
+               if (q == NULL)
+                       break;
+               syslog(LOG_INFO, "%s: to=%.*s [more]",
+                       e->e_id, ++q - p, p);
+               p = q;
+       }
+       syslog(LOG_INFO, "%s: to=%s", e->e_id, p);
+
+       if (ctladdr != NULL)
+       {
+               bp = buf;
+               strcpy(buf, "ctladdr=");
+               bp += strlen(buf);
+               strcpy(bp, shortenstring(ctladdr->q_paddr, 83));
+               bp += strlen(buf);
+               if (bitset(QGOODUID, ctladdr->q_flags))
+               {
+                       (void) sprintf(bp, " (%d/%d)",
+                                       ctladdr->q_uid, ctladdr->q_gid);
+                       bp += strlen(bp);
+               }
+               syslog(LOG_INFO, "%s: %s", e->e_id, buf);
+       }
+       bp = buf;
+       sprintf(bp, "delay=%s", pintvl(curtime() - e->e_ctime, TRUE));
+       bp += strlen(bp);
+
+       if (m != NULL)
+       {
+               sprintf(bp, ", mailer=%s", m->m_name);
+               bp += strlen(bp);
+       }
+
+       if (mci != NULL && mci->mci_host != NULL)
+       {
+# ifdef DAEMON
+               extern SOCKADDR CurHostAddr;
+# endif
+
+               sprintf(bp, ", relay=%s", mci->mci_host);
+
+# ifdef DAEMON
+               (void) strcat(bp, " (");
+               (void) strcat(bp, anynet_ntoa(&CurHostAddr));
+               (void) strcat(bp, ")");
+# endif
+       }
+       else
+       {
+               char *p = macvalue('h', e);
+
+               if (p != NULL && p[0] != '\0')
+                       sprintf(bp, ", relay=%s", p);
+       }
+       syslog(LOG_INFO, "%s: %s", e->e_id, buf);
+
+       syslog(LOG_INFO, "%s: stat=%s", e->e_id, shortenstring(stat, 63));
+#  endif /* short log buffer */
 # endif /* LOG */
 }
 \f/*
 # endif /* LOG */
 }
 \f/*
@@ -2013,9 +2151,7 @@ mailfile(filename, ctladdr, e)
 
                if (bitset(0111, stb.st_mode))
                        exit(EX_CANTCREAT);
 
                if (bitset(0111, stb.st_mode))
                        exit(EX_CANTCREAT);
-               if (ctladdr == NULL)
-                       ctladdr = &e->e_from;
-               else
+               if (ctladdr != NULL)
                {
                        /* ignore setuid and setgid bits */
                        mode &= ~(S_ISGID|S_ISUID);
                {
                        /* ignore setuid and setgid bits */
                        mode &= ~(S_ISGID|S_ISUID);
@@ -2034,7 +2170,7 @@ mailfile(filename, ctladdr, e)
 
                if (!bitset(S_ISGID, mode) || setgid(stb.st_gid) < 0)
                {
 
                if (!bitset(S_ISGID, mode) || setgid(stb.st_gid) < 0)
                {
-                       if (ctladdr->q_uid == 0)
+                       if (ctladdr == NULL || ctladdr->q_uid == 0)
                        {
                                (void) initgroups(DefUser, DefGid);
                        }
                        {
                                (void) initgroups(DefUser, DefGid);
                        }
@@ -2047,7 +2183,7 @@ mailfile(filename, ctladdr, e)
                }
                if (!bitset(S_ISUID, mode) || setuid(stb.st_uid) < 0)
                {
                }
                if (!bitset(S_ISUID, mode) || setuid(stb.st_uid) < 0)
                {
-                       if (ctladdr->q_uid == 0)
+                       if (ctladdr == NULL || ctladdr->q_uid == 0)
                                (void) setuid(DefUid);
                        else
                                (void) setuid(ctladdr->q_uid);
                                (void) setuid(DefUid);
                        else
                                (void) setuid(ctladdr->q_uid);
@@ -2174,7 +2310,6 @@ hostsignature(m, host, e)
                if (nmx <= 0)
                {
                        register MCI *mci;
                if (nmx <= 0)
                {
                        register MCI *mci;
-                       extern int errno;
 
                        /* update the connection info for this host */
                        mci = mci_get(hp, m);
 
                        /* update the connection info for this host */
                        mci = mci_get(hp, m);
index 496859a..ab2f7ff 100644 (file)
@@ -36,9 +36,9 @@
 
 #ifndef lint
 #ifdef NAMED_BIND
 
 #ifndef lint
 #ifdef NAMED_BIND
-static char sccsid[] = "@(#)domain.c   8.8 (Berkeley) 9/29/93 (with name server)";
+static char sccsid[] = "@(#)domain.c   8.10 (Berkeley) 12/21/93 (with name server)";
 #else
 #else
-static char sccsid[] = "@(#)domain.c   8.8 (Berkeley) 9/29/93 (without name server)";
+static char sccsid[] = "@(#)domain.c   8.10 (Berkeley) 12/21/93 (without name server)";
 #endif
 #endif /* not lint */
 
 #endif
 #endif /* not lint */
 
@@ -158,6 +158,12 @@ getmxrr(host, mxhosts, droplocalhost, rcode)
                  case HOST_NOT_FOUND:
                        /* the host just doesn't exist */
                        *rcode = EX_NOHOST;
                  case HOST_NOT_FOUND:
                        /* the host just doesn't exist */
                        *rcode = EX_NOHOST;
+
+                       if (!UseNameServer)
+                       {
+                               /* might exist in /etc/hosts */
+                               goto punt;
+                       }
                        break;
 
                  case TRY_AGAIN:
                        break;
 
                  case TRY_AGAIN:
@@ -419,8 +425,10 @@ getcanonname(host, hbsize, trymx)
        bool gotmx;
        int qtype;
        int loopcnt;
        bool gotmx;
        int qtype;
        int loopcnt;
+       char *xp;
        char nbuf[MAX(PACKETSZ, MAXDNAME*2+2)];
        char *searchlist[MAXDNSRCH+2];
        char nbuf[MAX(PACKETSZ, MAXDNAME*2+2)];
        char *searchlist[MAXDNSRCH+2];
+       extern char *gethostalias();
 
        if (tTd(8, 2))
                printf("getcanonname(%s)\n", host);
 
        if (tTd(8, 2))
                printf("getcanonname(%s)\n", host);
@@ -444,6 +452,20 @@ cnameloop:
                if (*cp == '.')
                        n++;
 
                if (*cp == '.')
                        n++;
 
+       if (n == 0 && (xp = gethostalias(host)) != NULL)
+       {
+               if (loopcnt++ > MAXCNAMEDEPTH)
+               {
+                       syserr("loop in ${HOSTALIASES} file");
+               }
+               else
+               {
+                       strncpy(host, xp, hbsize);
+                       host[hbsize - 1] = '\0';
+                       goto cnameloop;
+               }
+       }
+
        dp = searchlist;
        if (n > 0)
                *dp++ = "";
        dp = searchlist;
        if (n > 0)
                *dp++ = "";
@@ -637,6 +659,54 @@ cnameloop:
        return TRUE;
 }
 
        return TRUE;
 }
 
+
+char *
+gethostalias(host)
+       char *host;
+{
+       char *fname;
+       FILE *fp;
+       register char *p;
+       char buf[MAXLINE];
+       static char hbuf[MAXDNAME];
+
+       fname = getenv("HOSTALIASES");
+       if (fname == NULL || (fp = fopen(fname, "r")) == NULL)
+               return NULL;
+       while (fgets(buf, sizeof buf, fp) != NULL)
+       {
+               for (p = buf; p != '\0' && !(isascii(*p) && isspace(*p)); p++)
+                       continue;
+               if (*p == 0)
+               {
+                       /* syntax error */
+                       continue;
+               }
+               *p++ = '\0';
+               if (strcasecmp(buf, host) == 0)
+                       break;
+       }
+
+       if (feof(fp))
+       {
+               /* no match */
+               fclose(fp);
+               return NULL;
+       }
+
+       /* got a match; extract the equivalent name */
+       while (*p != '\0' && isascii(*p) && isspace(*p))
+               p++;
+       host = p;
+       while (*p != '\0' && !(isascii(*p) && isspace(*p)))
+               p++;
+       *p = '\0';
+       strncpy(hbuf, host, sizeof hbuf - 1);
+       hbuf[sizeof hbuf - 1] = '\0';
+       return hbuf;
+}
+
+
 #else /* not NAMED_BIND */
 
 #include <netdb.h>
 #else /* not NAMED_BIND */
 
 #include <netdb.h>
index 2987957..3048ac3 100644 (file)
@@ -33,7 +33,7 @@
  */
 
 #ifndef lint
  */
 
 #ifndef lint
-static char sccsid[] = "@(#)envelope.c 8.17 (Berkeley) 10/31/93";
+static char sccsid[] = "@(#)envelope.c 8.28 (Berkeley) 1/9/94";
 #endif /* not lint */
 
 #include "sendmail.h"
 #endif /* not lint */
 
 #include "sendmail.h"
@@ -110,7 +110,7 @@ dropenvelope(e)
        {
                printf("dropenvelope %x: id=", e);
                xputs(e->e_id);
        {
                printf("dropenvelope %x: id=", e);
                xputs(e->e_id);
-               printf(", flags=%o\n", e->e_flags);
+               printf(", flags=0x%x\n", e->e_flags);
                if (tTd(50, 10))
                {
                        printf("sendq=");
                if (tTd(50, 10))
                {
                        printf("sendq=");
@@ -123,10 +123,13 @@ dropenvelope(e)
                return;
 
 #ifdef LOG
                return;
 
 #ifdef LOG
+       if (LogLevel > 4 && bitset(EF_LOGSENDER, e->e_flags))
+               logsender(e, NULL);
        if (LogLevel > 84)
        if (LogLevel > 84)
-               syslog(LOG_DEBUG, "dropenvelope, id=%s, flags=%o, pid=%d",
+               syslog(LOG_DEBUG, "dropenvelope, id=%s, flags=0x%x, pid=%d",
                                  id, e->e_flags, getpid());
 #endif /* LOG */
                                  id, e->e_flags, getpid());
 #endif /* LOG */
+       e->e_flags &= ~EF_LOGSENDER;
 
        /* post statistics */
        poststats(StatFile);
 
        /* post statistics */
        poststats(StatFile);
@@ -214,6 +217,7 @@ dropenvelope(e)
 
                (void) sendtolist(e->e_receiptto, NULLADDR, &rlist, e);
                (void) returntosender("Return receipt", rlist, FALSE, e);
 
                (void) sendtolist(e->e_receiptto, NULLADDR, &rlist, e);
                (void) returntosender("Return receipt", rlist, FALSE, e);
+               e->e_flags &= ~EF_SENDRECEIPT;
        }
 
        /*
        }
 
        /*
@@ -272,9 +276,6 @@ dropenvelope(e)
                (void) xfclose(e->e_dfp, "dropenvelope", e->e_df);
        e->e_dfp = NULL;
        e->e_id = e->e_df = NULL;
                (void) xfclose(e->e_dfp, "dropenvelope", e->e_df);
        e->e_dfp = NULL;
        e->e_id = e->e_df = NULL;
-#ifdef XDEBUG
-       checkfd012("dropenvelope");
-#endif
 }
 \f/*
 **  CLEARENVELOPE -- clear an envelope without unlocking
 }
 \f/*
 **  CLEARENVELOPE -- clear an envelope without unlocking
@@ -583,7 +584,8 @@ setsender(from, e, delimptr, internal)
        **      Username can return errno != 0 on non-errors.
        */
 
        **      Username can return errno != 0 on non-errors.
        */
 
-       if (bitset(EF_QUEUERUN, e->e_flags) || OpMode == MD_SMTP)
+       if (bitset(EF_QUEUERUN, e->e_flags) || OpMode == MD_SMTP ||
+           OpMode == MD_DAEMON)
                realname = from;
        if (realname == NULL || realname[0] == '\0')
                realname = username();
                realname = from;
        if (realname == NULL || realname[0] == '\0')
                realname = username();
@@ -619,7 +621,7 @@ setsender(from, e, delimptr, internal)
                        }
                        syslog(LOG_NOTICE,
                                "setsender: %s: invalid or unparseable, received from %s",
                        }
                        syslog(LOG_NOTICE,
                                "setsender: %s: invalid or unparseable, received from %s",
-                               from, p);
+                               shortenstring(from, 83), p);
                }
 # endif /* LOG */
                if (from != NULL)
                }
 # endif /* LOG */
                if (from != NULL)
@@ -681,7 +683,7 @@ setsender(from, e, delimptr, internal)
                                **  We have an alternate address for the sender
                                */
 
                                **  We have an alternate address for the sender
                                */
 
-                               pvp = prescan(p, '\0', pvpbuf, NULL);
+                               pvp = prescan(p, '\0', pvpbuf, sizeof pvpbuf, NULL);
                        }
 # endif /* USERDB */
                }
                        }
 # endif /* USERDB */
                }
@@ -700,6 +702,7 @@ setsender(from, e, delimptr, internal)
                        /* extract user and group id */
                        e->e_from.q_uid = pw->pw_uid;
                        e->e_from.q_gid = pw->pw_gid;
                        /* extract user and group id */
                        e->e_from.q_uid = pw->pw_uid;
                        e->e_from.q_gid = pw->pw_gid;
+                       e->e_from.q_flags |= QGOODUID;
 
                        /* extract full name from passwd file */
                        if (FullName == NULL && pw->pw_gecos != NULL &&
 
                        /* extract full name from passwd file */
                        if (FullName == NULL && pw->pw_gecos != NULL &&
@@ -714,12 +717,13 @@ setsender(from, e, delimptr, internal)
                if (FullName != NULL && !internal)
                        define('x', FullName, e);
        }
                if (FullName != NULL && !internal)
                        define('x', FullName, e);
        }
-       else if (!internal)
+       else if (!internal && OpMode != MD_DAEMON)
        {
                if (e->e_from.q_home == NULL)
                        e->e_from.q_home = getenv("HOME");
                e->e_from.q_uid = RealUid;
                e->e_from.q_gid = RealGid;
        {
                if (e->e_from.q_home == NULL)
                        e->e_from.q_home = getenv("HOME");
                e->e_from.q_uid = RealUid;
                e->e_from.q_gid = RealGid;
+               e->e_from.q_flags |= QGOODUID;
        }
 
        /*
        }
 
        /*
@@ -728,7 +732,7 @@ setsender(from, e, delimptr, internal)
        */
 
        if (pvp == NULL)
        */
 
        if (pvp == NULL)
-               pvp = prescan(from, '\0', pvpbuf, NULL);
+               pvp = prescan(from, delimchar, pvpbuf, sizeof pvpbuf, NULL);
        if (pvp == NULL)
        {
                /* don't need to give error -- prescan did that already */
        if (pvp == NULL)
        {
                /* don't need to give error -- prescan did that already */
@@ -738,9 +742,9 @@ setsender(from, e, delimptr, internal)
 # endif
                finis();
        }
 # endif
                finis();
        }
-       (void) rewrite(pvp, 3, e);
-       (void) rewrite(pvp, 1, e);
-       (void) rewrite(pvp, 4, e);
+       (void) rewrite(pvp, 3, 0, e);
+       (void) rewrite(pvp, 1, 0, e);
+       (void) rewrite(pvp, 4, 0, e);
        bp = buf + 1;
        cataddr(pvp, NULL, bp, sizeof buf - 2, '\0');
        if (*bp == '@')
        bp = buf + 1;
        cataddr(pvp, NULL, bp, sizeof buf - 2, '\0');
        if (*bp == '@')
@@ -753,7 +757,7 @@ setsender(from, e, delimptr, internal)
        define('f', e->e_sender, e);
 
        /* save the domain spec if this mailer wants it */
        define('f', e->e_sender, e);
 
        /* save the domain spec if this mailer wants it */
-       if (!internal && e->e_from.q_mailer != NULL &&
+       if (e->e_from.q_mailer != NULL &&
            bitnset(M_CANONICAL, e->e_from.q_mailer->m_flags))
        {
                extern char **copyplist();
            bitnset(M_CANONICAL, e->e_from.q_mailer->m_flags))
        {
                extern char **copyplist();
index 64ae3eb..60e78e3 100644 (file)
@@ -33,7 +33,7 @@
  */
 
 #ifndef lint
  */
 
 #ifndef lint
-static char sccsid[] = "@(#)err.c      8.14 (Berkeley) 10/29/93";
+static char sccsid[] = "@(#)err.c      8.19 (Berkeley) 1/8/94";
 #endif /* not lint */
 
 # include "sendmail.h"
 #endif /* not lint */
 
 # include "sendmail.h"
@@ -159,8 +159,6 @@ usrerr(fmt, va_alist)
 #endif
 {
        VA_LOCAL_DECL
 #endif
 {
        VA_LOCAL_DECL
-       extern char SuprErrs;
-       extern int errno;
 
        if (SuprErrs)
                return;
 
        if (SuprErrs)
                return;
@@ -287,13 +285,13 @@ putoutmsg(msg, holdmsg)
                msg[0] = '5';
 
        (void) fflush(stdout);
                msg[0] = '5';
 
        (void) fflush(stdout);
-       if (OpMode == MD_SMTP)
+       if (OpMode == MD_SMTP || OpMode == MD_DAEMON)
                fprintf(OutChannel, "%s\r\n", msg);
        else
                fprintf(OutChannel, "%s\n", &msg[4]);
        if (TrafficLogFile != NULL)
                fprintf(TrafficLogFile, "%05d >>> %s\n", getpid(),
                fprintf(OutChannel, "%s\r\n", msg);
        else
                fprintf(OutChannel, "%s\n", &msg[4]);
        if (TrafficLogFile != NULL)
                fprintf(TrafficLogFile, "%05d >>> %s\n", getpid(),
-                       OpMode == MD_SMTP ? msg : &msg[4]);
+                       (OpMode == MD_SMTP || OpMode == MD_DAEMON) ? msg : &msg[4]);
        if (msg[3] == ' ')
                (void) fflush(OutChannel);
        if (!ferror(OutChannel))
        if (msg[3] == ' ')
                (void) fflush(OutChannel);
        if (!ferror(OutChannel))
@@ -449,6 +447,7 @@ const char *
 errstring(errno)
        int errno;
 {
 errstring(errno)
        int errno;
 {
+       char *dnsmsg;
        static char buf[MAXLINE];
 # ifndef ERRLIST_PREDEFINED
        extern char *sys_errlist[];
        static char buf[MAXLINE];
 # ifndef ERRLIST_PREDEFINED
        extern char *sys_errlist[];
@@ -458,16 +457,16 @@ errstring(errno)
        extern char *SmtpPhase;
 # endif /* SMTP */
 
        extern char *SmtpPhase;
 # endif /* SMTP */
 
-# ifdef DAEMON
-# ifdef ETIMEDOUT
        /*
        **  Handle special network error codes.
        **
        **      These are 4.2/4.3bsd specific; they should be in daemon.c.
        */
 
        /*
        **  Handle special network error codes.
        **
        **      These are 4.2/4.3bsd specific; they should be in daemon.c.
        */
 
+       dnsmsg = NULL;
        switch (errno)
        {
        switch (errno)
        {
+# if defined(DAEMON) && defined(ETIMEDOUT)
          case ETIMEDOUT:
          case ECONNRESET:
                (void) strcpy(buf, sys_errlist[errno]);
          case ETIMEDOUT:
          case ECONNRESET:
                (void) strcpy(buf, sys_errlist[errno]);
@@ -494,26 +493,45 @@ errstring(errno)
                        break;
                (void) sprintf(buf, "Connection refused by %s", CurHostName);
                return (buf);
                        break;
                (void) sprintf(buf, "Connection refused by %s", CurHostName);
                return (buf);
+# endif
 
          case EOPENTIMEOUT:
                return "Timeout on file open";
 
 # ifdef NAMED_BIND
          case HOST_NOT_FOUND + E_DNSBASE:
 
          case EOPENTIMEOUT:
                return "Timeout on file open";
 
 # ifdef NAMED_BIND
          case HOST_NOT_FOUND + E_DNSBASE:
-               return ("Name server: host not found");
+               dnsmsg = "host not found";
+               break;
 
          case TRY_AGAIN + E_DNSBASE:
 
          case TRY_AGAIN + E_DNSBASE:
-               return ("Name server: host name lookup failure");
+               dnsmsg = "host name lookup failure";
+               break;
 
          case NO_RECOVERY + E_DNSBASE:
 
          case NO_RECOVERY + E_DNSBASE:
-               return ("Name server: non-recoverable error");
+               dnsmsg = "non-recoverable error";
+               break;
 
          case NO_DATA + E_DNSBASE:
 
          case NO_DATA + E_DNSBASE:
-               return ("Name server: no data known for name");
+               dnsmsg = "no data known";
+               break;
 # endif
 # endif
+
+         case EPERM:
+               /* SunOS gives "Not owner" -- this is the POSIX message */
+               return "Operation not permitted";
+       }
+
+       if (dnsmsg != NULL)
+       {
+               (void) strcpy(buf, "Name server: ");
+               if (CurHostName != NULL)
+               {
+                       (void) strcat(buf, CurHostName);
+                       (void) strcat(buf, ": ");
+               }
+               (void) strcat(buf, dnsmsg);
+               return buf;
        }
        }
-# endif
-# endif
 
        if (errno > 0 && errno < sys_nerr)
                return (sys_errlist[errno]);
 
        if (errno > 0 && errno < sys_nerr)
                return (sys_errlist[errno]);
index 1fea639..b05876b 100644 (file)
@@ -33,7 +33,7 @@
  */
 
 #ifndef lint
  */
 
 #ifndef lint
-static char sccsid[] = "@(#)headers.c  8.13 (Berkeley) 10/24/93";
+static char sccsid[] = "@(#)headers.c  8.22 (Berkeley) 1/13/94";
 #endif /* not lint */
 
 # include <errno.h>
 #endif /* not lint */
 
 # include <errno.h>
@@ -371,6 +371,11 @@ eatheader(e, full)
        else
                define('u', NULL, e);
 
        else
                define('u', NULL, e);
 
+       /* full name of from person */
+       p = hvalue("full-name", e);
+       if (p != NULL)
+               define('x', p, e);
+
        if (tTd(32, 1))
                printf("----- collected header -----\n");
        msgid = "<none>";
        if (tTd(32, 1))
                printf("----- collected header -----\n");
        msgid = "<none>";
@@ -395,7 +400,11 @@ eatheader(e, full)
                }
 
                if (tTd(32, 1))
                }
 
                if (tTd(32, 1))
-                       printf("%s: %s\n", h->h_field, h->h_value);
+               {
+                       printf("%s: ", h->h_field);
+                       xputs(h->h_value);
+                       printf("\n");
+               }
 
                /* count the number of times it has been processed */
                if (bitset(H_TRACE, h->h_flags))
 
                /* count the number of times it has been processed */
                if (bitset(H_TRACE, h->h_flags))
@@ -453,11 +462,6 @@ eatheader(e, full)
                                 - e->e_class * WkClassFact
                                 + e->e_nrcpts * WkRecipFact;
 
                                 - e->e_class * WkClassFact
                                 + e->e_nrcpts * WkRecipFact;
 
-       /* full name of from person */
-       p = hvalue("full-name", e);
-       if (p != NULL)
-               define('x', p, e);
-
        /* date message originated */
        p = hvalue("posted-date", e);
        if (p == NULL)
        /* date message originated */
        p = hvalue("posted-date", e);
        if (p == NULL)
@@ -471,48 +475,97 @@ eatheader(e, full)
 
 # ifdef LOG
        if (full && LogLevel > 4)
 
 # ifdef LOG
        if (full && LogLevel > 4)
+               logsender(e, msgid);
+# endif /* LOG */
+       e->e_flags &= ~EF_LOGSENDER;
+}
+\f/*
+**  LOGSENDER -- log sender information
+**
+**     Parameters:
+**             e -- the envelope to log
+**             msgid -- the message id
+**
+**     Returns:
+**             none
+*/
+
+logsender(e, msgid)
+       register ENVELOPE *e;
+       char *msgid;
+{
+       char *name;
+       register char *sbp;
+       register char *p;
+       char hbuf[MAXNAME];
+       char sbuf[MAXLINE];
+
+       if (bitset(EF_RESPONSE, e->e_flags))
+               name = "[RESPONSE]";
+       else if ((name = macvalue('_', e)) != NULL)
+               ;
+       else if (RealHostName[0] == '[')
+               name = RealHostName;
+       else
        {
        {
-               char *name;
-               register char *sbp;
-               char hbuf[MAXNAME];
-               char sbuf[MAXLINE];
-
-               if (bitset(EF_RESPONSE, e->e_flags))
-                       name = "[RESPONSE]";
-               else if ((name = macvalue('_', e)) != NULL)
-                       ;
-               else if (RealHostName[0] == '[')
-                       name = RealHostName;
-               else
+               name = hbuf;
+               (void) sprintf(hbuf, "%.80s", RealHostName);
+               if (RealHostAddr.sa.sa_family != 0)
                {
                {
-                       name = hbuf;
-                       (void) sprintf(hbuf, "%.80s", RealHostName);
-                       if (RealHostAddr.sa.sa_family != 0)
-                       {
-                               p = &hbuf[strlen(hbuf)];
-                               (void) sprintf(p, " (%s)",
-                                       anynet_ntoa(&RealHostAddr));
-                       }
+                       p = &hbuf[strlen(hbuf)];
+                       (void) sprintf(p, " (%s)",
+                               anynet_ntoa(&RealHostAddr));
                }
                }
+       }
 
 
-               /* some versions of syslog only take 5 printf args */
-               sbp = sbuf;
-               sprintf(sbp, "from=%.200s, size=%ld, class=%d, pri=%ld, nrcpts=%d, msgid=%.100s",
-                   e->e_from.q_paddr, e->e_msgsize, e->e_class,
-                   e->e_msgpriority, e->e_nrcpts, msgid);
+       /* some versions of syslog only take 5 printf args */
+#  if (SYSLOG_BUFSIZE) >= 256
+       sbp = sbuf;
+       sprintf(sbp, "from=%.200s, size=%ld, class=%d, pri=%ld, nrcpts=%d",
+           e->e_from.q_paddr, e->e_msgsize, e->e_class,
+           e->e_msgpriority, e->e_nrcpts);
+       sbp += strlen(sbp);
+       if (msgid != NULL)
+       {
+               sprintf(sbp, ", msgid=%.100s", msgid);
                sbp += strlen(sbp);
                sbp += strlen(sbp);
-               if (e->e_bodytype != NULL)
-               {
-                       (void) sprintf(sbp, ", bodytype=%.20s", e->e_bodytype);
-                       sbp += strlen(sbp);
-               }
-               p = macvalue('r', e);
-               if (p != NULL)
-                       (void) sprintf(sbp, ", proto=%.20s", p);
-               syslog(LOG_INFO, "%s: %s, relay=%s",
-                   e->e_id, sbuf, name);
        }
        }
-# endif /* LOG */
+       if (e->e_bodytype != NULL)
+       {
+               (void) sprintf(sbp, ", bodytype=%.20s", e->e_bodytype);
+               sbp += strlen(sbp);
+       }
+       p = macvalue('r', e);
+       if (p != NULL)
+               (void) sprintf(sbp, ", proto=%.20s", p);
+       syslog(LOG_INFO, "%s: %s, relay=%s",
+           e->e_id, sbuf, name);
+
+#  else                        /* short syslog buffer */
+
+       syslog(LOG_INFO, "%s: from=%s",
+               e->e_id, shortenstring(e->e_from.q_paddr, 83));
+       syslog(LOG_INFO, "%s: size=%ld, class=%ld, pri=%ld, nrcpts=%d",
+               e->e_id, e->e_msgsize, e->e_class,
+               e->e_msgpriority, e->e_nrcpts);
+       if (msgid != NULL)
+               syslog(LOG_INFO, "%s: msgid=%s", e->e_id, msgid);
+       sbp = sbuf;
+       sprintf(sbp, "%s:", e->e_id);
+       sbp += strlen(sbp);
+       if (e->e_bodytype != NULL)
+       {
+               sprintf(sbp, " bodytype=%s,", e->e_bodytype);
+               sbp += strlen(sbp);
+       }
+       p = macvalue('r', e);
+       if (p != NULL)
+       {
+               sprintf(sbp, " proto=%s,", p);
+               sbp += strlen(sbp);
+       }
+       syslog(LOG_INFO, "%s relay=%s", sbuf, name);
+#  endif
 }
 \f/*
 **  PRIENCODE -- encode external priority names into internal values.
 }
 \f/*
 **  PRIENCODE -- encode external priority names into internal values.
@@ -639,7 +692,7 @@ crackaddr(addr)
                }
 
                /* check for quoted strings */
                }
 
                /* check for quoted strings */
-               if (c == '"')
+               if (c == '"' && cmtlev <= 0)
                {
                        qmode = !qmode;
                        if (copylev > 0 && !skipping)
                {
                        qmode = !qmode;
                        if (copylev > 0 && !skipping)
@@ -683,11 +736,10 @@ crackaddr(addr)
                else if (c == ')')
                {
                        /* syntax error: unmatched ) */
                else if (c == ')')
                {
                        /* syntax error: unmatched ) */
-                       if (!skipping)
+                       if (copylev > 0 && !skipping)
                                bp--;
                }
 
                                bp--;
                }
 
-
                /* check for characters that may have to be quoted */
                if (strchr(".'@,;:\\()[]", c) != NULL)
                {
                /* check for characters that may have to be quoted */
                if (strchr(".'@,;:\\()[]", c) != NULL)
                {
@@ -864,19 +916,24 @@ putheader(fp, m, e)
                                printf(" (skipped (resent))\n");
                        continue;
                }
                                printf(" (skipped (resent))\n");
                        continue;
                }
-               if (tTd(34, 11))
-                       printf("\n");
 
 
+               /* macro expand value if generated internally */
                p = h->h_value;
                if (bitset(H_DEFAULT, h->h_flags))
                {
                p = h->h_value;
                if (bitset(H_DEFAULT, h->h_flags))
                {
-                       /* macro expand value if generated internally */
                        expand(p, buf, &buf[sizeof buf], e);
                        p = buf;
                        if (p == NULL || *p == '\0')
                        expand(p, buf, &buf[sizeof buf], e);
                        p = buf;
                        if (p == NULL || *p == '\0')
+                       {
+                               if (tTd(34, 11))
+                                       printf(" (skipped -- null value)\n");
                                continue;
                                continue;
+                       }
                }
 
                }
 
+               if (tTd(34, 11))
+                       printf("\n");
+
                if (bitset(H_FROM|H_RCPT, h->h_flags))
                {
                        /* address field */
                if (bitset(H_FROM|H_RCPT, h->h_flags))
                {
                        /* address field */
@@ -980,7 +1037,8 @@ commaize(h, p, fp, oldstyle, m, e)
                        auto char *oldp;
                        char pvpbuf[PSBUFSIZE];
 
                        auto char *oldp;
                        char pvpbuf[PSBUFSIZE];
 
-                       (void) prescan(p, oldstyle ? ' ' : ',', pvpbuf, &oldp);
+                       (void) prescan(p, oldstyle ? ' ' : ',', pvpbuf,
+                                      sizeof pvpbuf, &oldp);
                        p = oldp;
 
                        /* look to see if we have an at sign */
                        p = oldp;
 
                        /* look to see if we have an at sign */
index 5db6935..d05f13d 100644 (file)
@@ -39,7 +39,7 @@ static char copyright[] =
 #endif /* not lint */
 
 #ifndef lint
 #endif /* not lint */
 
 #ifndef lint
-static char sccsid[] = "@(#)main.c     8.33 (Berkeley) 10/24/93";
+static char sccsid[] = "@(#)main.c     8.46 (Berkeley) 1/9/94";
 #endif /* not lint */
 
 #define        _DEFINE
 #endif /* not lint */
 
 #define        _DEFINE
@@ -155,6 +155,7 @@ main(argc, argv, envp)
        extern char *getcfname();
        extern char *optarg;
        extern char **environ;
        extern char *getcfname();
        extern char *optarg;
        extern char **environ;
+       extern void dumpstate();
 
        /*
        **  Check to see if we reentered.
 
        /*
        **  Check to see if we reentered.
@@ -170,7 +171,12 @@ main(argc, argv, envp)
        reenter = TRUE;
 
        /* do machine-dependent initializations */
        reenter = TRUE;
 
        /* do machine-dependent initializations */
-       init_md();
+       init_md(argc, argv);
+
+       /* arrange to dump state on signal */
+#ifdef SIGUSR1
+       setsignal(SIGUSR1, dumpstate);
+#endif
 
        /* in 4.4BSD, the table can be huge; impose a reasonable limit */
        DtableSize = getdtsize();
 
        /* in 4.4BSD, the table can be huge; impose a reasonable limit */
        DtableSize = getdtsize();
@@ -253,12 +259,15 @@ main(argc, argv, envp)
 
 #if defined(__osf__) || defined(_AIX3)
 # define OPTIONS       "B:b:C:cd:e:F:f:h:Iimno:p:q:r:sTtvX:x"
 
 #if defined(__osf__) || defined(_AIX3)
 # define OPTIONS       "B:b:C:cd:e:F:f:h:Iimno:p:q:r:sTtvX:x"
-#else
-# if defined(ultrix)
-#  define OPTIONS      "B:b:C:cd:e:F:f:h:IiM:mno:p:q:r:sTtvX:"
-# else
-#  define OPTIONS      "B:b:C:cd:e:F:f:h:Iimno:p:q:r:sTtvX:"
-# endif
+#endif
+#if defined(ultrix)
+# define OPTIONS       "B:b:C:cd:e:F:f:h:IiM:mno:p:q:r:sTtvX:"
+#endif
+#if defined(NeXT)
+# define OPTIONS       "B:b:C:cd:e:F:f:h:IimnOo:p:q:r:sTtvX:"
+#endif
+#ifndef OPTIONS
+# define OPTIONS       "B:b:C:cd:e:F:f:h:Iimno:p:q:r:sTtvX:"
 #endif
        while ((j = getopt(argc, argv, OPTIONS)) != EOF)
        {
 #endif
        while ((j = getopt(argc, argv, OPTIONS)) != EOF)
        {
@@ -334,10 +343,9 @@ main(argc, argv, envp)
 
                if (tTd(0, 4))
                        printf("canonical name: %s\n", jbuf);
 
                if (tTd(0, 4))
                        printf("canonical name: %s\n", jbuf);
-               p = newstr(jbuf);
                define('w', newstr(jbuf), CurEnv);      /* must be new string */
                define('w', newstr(jbuf), CurEnv);      /* must be new string */
-               define('j', p, CurEnv);
-               setclass('w', p);
+               define('j', newstr(jbuf), CurEnv);
+               setclass('w', jbuf);
 
                p = strchr(jbuf, '.');
                if (p != NULL)
 
                p = strchr(jbuf, '.');
                if (p != NULL)
@@ -360,6 +368,8 @@ main(argc, argv, envp)
                        p = utsname.nodename;
                else
                {
                        p = utsname.nodename;
                else
                {
+                       if (tTd(0, 22))
+                               printf("uname failed (%s)\n", errstring(errno));
                        makelower(jbuf);
                        p = jbuf;
                }
                        makelower(jbuf);
                        p = jbuf;
                }
@@ -367,6 +377,7 @@ main(argc, argv, envp)
                        printf("UUCP nodename: %s\n", p);
                p = newstr(p);
                define('k', p, CurEnv);
                        printf("UUCP nodename: %s\n", p);
                p = newstr(p);
                define('k', p, CurEnv);
+               setclass('k', p);
                setclass('w', p);
        }
        while (av != NULL && *av != NULL)
                setclass('w', p);
        }
        while (av != NULL && *av != NULL)
@@ -586,6 +597,10 @@ main(argc, argv, envp)
                  case 'x':     /* random flag that OSF/1 & AIX mailx passes */
                        break;
 # endif
                  case 'x':     /* random flag that OSF/1 & AIX mailx passes */
                        break;
 # endif
+# if defined(NeXT)
+                 case 'O':     /* random flag that NeXT Mail.app passes */
+                       break;
+# endif
 
                  default:
                        ExitStat = EX_USAGE;
 
                  default:
                        ExitStat = EX_USAGE;
@@ -601,6 +616,9 @@ main(argc, argv, envp)
        **      Extract special fields for local use.
        */
 
        **      Extract special fields for local use.
        */
 
+#ifdef XDEBUG
+       checkfd012("before readcf");
+#endif
        readcf(getcfname(), safecf, CurEnv);
 
        if (tTd(0, 1))
        readcf(getcfname(), safecf, CurEnv);
 
        if (tTd(0, 1))
@@ -761,6 +779,10 @@ main(argc, argv, envp)
                exit(ExitStat);
        }
 
                exit(ExitStat);
        }
 
+#ifdef XDEBUG
+       checkfd012("before main() initmaps");
+#endif
+
        /*
        **  Do operation-mode-dependent initialization.
        */
        /*
        **  Do operation-mode-dependent initialization.
        */
@@ -899,7 +921,8 @@ main(argc, argv, envp)
                        {
                                char pvpbuf[PSBUFSIZE];
 
                        {
                                char pvpbuf[PSBUFSIZE];
 
-                               pvp = prescan(++p, ',', pvpbuf, &delimptr);
+                               pvp = prescan(++p, ',', pvpbuf, sizeof pvpbuf,
+                                             &delimptr);
                                if (pvp == NULL)
                                        continue;
                                p = q;
                                if (pvp == NULL)
                                        continue;
                                p = q;
@@ -907,7 +930,7 @@ main(argc, argv, envp)
                                {
                                        int stat;
 
                                {
                                        int stat;
 
-                                       stat = rewrite(pvp, atoi(p), CurEnv);
+                                       stat = rewrite(pvp, atoi(p), 0, CurEnv);
                                        if (stat != EX_OK)
                                                printf("== Ruleset %s status %d\n",
                                                        p, stat);
                                        if (stat != EX_OK)
                                                printf("== Ruleset %s status %d\n",
                                                        p, stat);
@@ -1005,7 +1028,7 @@ main(argc, argv, envp)
        **  commands.  This will never return.
        */
 
        **  commands.  This will never return.
        */
 
-       if (OpMode == MD_SMTP)
+       if (OpMode == MD_SMTP || OpMode == MD_DAEMON)
                smtp(CurEnv);
 # endif /* SMTP */
 
                smtp(CurEnv);
 # endif /* SMTP */
 
@@ -1325,7 +1348,8 @@ static void
 obsolete(argv)
        char *argv[];
 {
 obsolete(argv)
        char *argv[];
 {
-       char *ap;
+       register char *ap;
+       register char *op;
 
        while ((ap = *++argv) != NULL)
        {
 
        while ((ap = *++argv) != NULL)
        {
@@ -1333,10 +1357,18 @@ obsolete(argv)
                if (ap[0] != '-' || ap[1] == '-')
                        return;
 
                if (ap[0] != '-' || ap[1] == '-')
                        return;
 
+               /* skip over options that do have a value */
+               op = strchr(OPTIONS, ap[1]);
+               if (op != NULL && *++op == ':' && ap[2] == '\0' &&
+                   argv[1] != NULL && argv[1][0] != '-')
+               {
+                       argv++;
+                       continue;
+               }
+
                /* If -C doesn't have an argument, use sendmail.cf. */
 #define        __DEFPATH       "sendmail.cf"
                /* If -C doesn't have an argument, use sendmail.cf. */
 #define        __DEFPATH       "sendmail.cf"
-               if (ap[1] == 'C' && ap[2] == '\0' &&
-                   (argv[1] == NULL || argv[1][0] == '-'))
+               if (ap[1] == 'C' && ap[2] == '\0')
                {
                        *argv = xalloc(sizeof(__DEFPATH) + 2);
                        argv[0][0] = '-';
                {
                        *argv = xalloc(sizeof(__DEFPATH) + 2);
                        argv[0][0] = '-';
@@ -1345,13 +1377,11 @@ obsolete(argv)
                }
 
                /* If -q doesn't have an argument, run it once. */
                }
 
                /* If -q doesn't have an argument, run it once. */
-               if (ap[1] == 'q' && ap[2] == '\0' &&
-                   (argv[1] == NULL || argv[1][0] == '-'))
+               if (ap[1] == 'q' && ap[2] == '\0')
                        *argv = "-q0";
 
                /* if -d doesn't have an argument, use 0-99.1 */
                        *argv = "-q0";
 
                /* if -d doesn't have an argument, use 0-99.1 */
-               if (ap[1] == 'd' && ap[2] == '\0' &&
-                   (argv[1] == NULL || !isdigit(argv[1][0])))
+               if (ap[1] == 'd' && ap[2] == '\0')
                        *argv = "-d0-99.1";
        }
 }
                        *argv = "-d0-99.1";
        }
 }
@@ -1397,3 +1427,40 @@ auth_warning(e, msg, va_alist)
                addheader("X-Authentication-Warning", buf, e);
        }
 }
                addheader("X-Authentication-Warning", buf, e);
        }
 }
+\f/*
+**  DUMPSTATE -- dump state on user signal
+**
+**     For debugging.
+*/
+
+void
+dumpstate()
+{
+#ifdef LOG
+       register char *j = macvalue('j', CurEnv);
+       register STAB *s;
+
+       syslog(LOG_DEBUG, "--- dumping state on user signal: $j = %s ---", j);
+       s = stab(j, ST_CLASS, ST_FIND);
+       if (s == NULL || !bitnset('w', s->s_class))
+               syslog(LOG_DEBUG, "*** $j not in $=w ***");
+       syslog(LOG_DEBUG, "--- open file descriptors: ---");
+       printopenfds(TRUE);
+       syslog(LOG_DEBUG, "--- connection cache: ---");
+       mci_dump_all(TRUE);
+       if (RewriteRules[89] != NULL)
+       {
+               int stat;
+               register char **pvp;
+               char *pv[MAXATOM + 1];
+
+               pv[0] = NULL;
+               stat = rewrite(pv, 89, 0, CurEnv);
+               syslog(LOG_DEBUG, "--- ruleset 89 returns stat %d, pv: ---",
+                       stat);
+               for (pvp = pv; *pvp != NULL; pvp++)
+                       syslog(LOG_DEBUG, "%s", *pvp);
+       }
+       syslog(LOG_DEBUG, "--- end of state dump ---");
+#endif
+}
diff --git a/usr.sbin/sendmail/src/makesendmail b/usr.sbin/sendmail/src/makesendmail
new file mode 100644 (file)
index 0000000..04e219a
--- /dev/null
@@ -0,0 +1,83 @@
+#!/bin/sh
+
+# Copyright (c) 1993 Eric P. Allman
+# Copyright (c) 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.
+#
+#       @(#)makesendmail       8.3 (Berkeley) 9/26/93
+#
+
+#
+#  A quick-and-dirty script to compile sendmail in the presence of
+#  multiple architectures and Makefiles.
+#
+
+# determine machine architecture
+arch=`uname -m`
+case $arch
+in
+  sun4*)       arch=sun4;;
+esac
+
+# determine operating system type
+os=`uname -s`
+
+# determine operating system release
+rel=`uname -r`
+
+# now try to find a reasonable object directory
+if [ -r obj.$os.$arch.$rel ]; then
+       obj=obj.$os.$arch.$rel
+elif [ -r obj.$os.$rel ]; then
+       obj=obj.$os.$rel
+elif [ -r obj.$os.$arch ]; then
+       obj=obj.$os.$arch
+elif [ -r obj.$arch.$rel ]; then
+       obj=obj.$arch.$rel
+elif [ -r obj.$os ]; then
+       obj=obj.$os
+elif [ -r obj.$arch ]; then
+       obj=obj.$arch
+elif [ -r obj.$rel ]; then
+       obj=obj.$rel
+elif [ -r Makefile.$os ]; then
+       obj=obj.$os.$arch.$rel
+       echo "Creating $obj using Makefile.$os"
+       mkdir $obj
+       (cd $obj; ln -s ../*.[ch158] ../sendmail.hf .; ln -s ../Makefile.$os Makefile)
+else
+       echo "Warning: no recognized support for $arch.$os.$rel"
+       echo "  ... winging it ..."
+       obj=.
+fi
+echo "Making in $obj"
+cd $obj
+exec make -f Makefile $*
index 0ee24f8..7a3bdc0 100644 (file)
@@ -33,7 +33,7 @@
  */
 
 #ifndef lint
  */
 
 #ifndef lint
-static char sccsid[] = "@(#)map.c      8.17 (Berkeley) 10/15/93";
+static char sccsid[] = "@(#)map.c      8.20 (Berkeley) 12/11/93";
 #endif /* not lint */
 
 #include "sendmail.h"
 #endif /* not lint */
 
 #include "sendmail.h"
@@ -336,7 +336,15 @@ initmaps(rebuild, e)
        checkfd012("entering initmaps");
 #endif
        CurEnv = e;
        checkfd012("entering initmaps");
 #endif
        CurEnv = e;
-       stabapply(map_init, rebuild);
+       if (rebuild)
+       {
+               stabapply(map_init, 1);
+               stabapply(map_init, 2);
+       }
+       else
+       {
+               stabapply(map_init, 0);
+       }
 #ifdef XDEBUG
        checkfd012("exiting initmaps");
 #endif
 #ifdef XDEBUG
        checkfd012("exiting initmaps");
 #endif
@@ -358,10 +366,19 @@ map_init(s, rebuild)
                return;
 
        if (tTd(38, 2))
                return;
 
        if (tTd(38, 2))
-               printf("map_init(%s:%s)\n",
+               printf("map_init(%s:%s, %d)\n",
                        map->map_class->map_cname == NULL ? "NULL" :
                                map->map_class->map_cname,
                        map->map_class->map_cname == NULL ? "NULL" :
                                map->map_class->map_cname,
-                       map->map_file == NULL ? "NULL" : map->map_file);
+                       map->map_file == NULL ? "NULL" : map->map_file,
+                       rebuild);
+
+       if (rebuild == (bitset(MF_ALIAS, map->map_mflags) &&
+                   bitset(MCF_REBUILDABLE, map->map_class->map_cflags) ? 1 : 2))
+       {
+               if (tTd(38, 3))
+                       printf("\twrong pass\n");
+               return;
+       }
 
        /* if already open, close it (for nested open) */
        if (bitset(MF_OPEN, map->map_mflags))
 
        /* if already open, close it (for nested open) */
        if (bitset(MF_OPEN, map->map_mflags))
@@ -370,18 +387,16 @@ map_init(s, rebuild)
                map->map_mflags &= ~(MF_OPEN|MF_WRITABLE);
        }
 
                map->map_mflags &= ~(MF_OPEN|MF_WRITABLE);
        }
 
-       if (rebuild)
+       if (rebuild == 2)
        {
        {
-               if (bitset(MF_ALIAS, map->map_mflags) &&
-                   bitset(MCF_REBUILDABLE, map->map_class->map_cflags))
-                       rebuildaliases(map, FALSE);
+               rebuildaliases(map, FALSE);
        }
        else
        {
                if (map->map_class->map_open(map, O_RDONLY))
                {
                        if (tTd(38, 4))
        }
        else
        {
                if (map->map_class->map_open(map, O_RDONLY))
                {
                        if (tTd(38, 4))
-                               printf("%s:%s: valid\n",
+                               printf("\t%s:%s: valid\n",
                                        map->map_class->map_cname == NULL ? "NULL" :
                                                map->map_class->map_cname,
                                        map->map_file == NULL ? "NULL" :
                                        map->map_class->map_cname == NULL ? "NULL" :
                                                map->map_class->map_cname,
                                        map->map_file == NULL ? "NULL" :
@@ -389,7 +404,7 @@ map_init(s, rebuild)
                        map->map_mflags |= MF_OPEN;
                }
                else if (tTd(38, 4))
                        map->map_mflags |= MF_OPEN;
                }
                else if (tTd(38, 4))
-                       printf("%s:%s: invalid: %s\n",
+                       printf("\t%s:%s: invalid: %s\n",
                                map->map_class->map_cname == NULL ? "NULL" :
                                        map->map_class->map_cname,
                                map->map_file == NULL ? "NULL" :
                                map->map_class->map_cname == NULL ? "NULL" :
                                        map->map_class->map_cname,
                                map->map_file == NULL ? "NULL" :
@@ -434,9 +449,22 @@ ndbm_map_open(map, mode)
                return FALSE;
        }
        map->map_db1 = (void *) dbm;
                return FALSE;
        }
        map->map_db1 = (void *) dbm;
-       if (mode == O_RDONLY && bitset(MF_ALIAS, map->map_mflags))
-               if (!aliaswait(map, ".pag", TRUE))
+       if (mode == O_RDONLY)
+       {
+               if (bitset(MF_ALIAS, map->map_mflags) &&
+                   !aliaswait(map, ".pag", TRUE))
                        return FALSE;
                        return FALSE;
+       }
+       else
+       {
+               int fd;
+
+               /* exclusive lock for duration of rebuild */
+               fd = dbm_dirfno((DBM *) map->map_db1);
+               if (fd >= 0 && !bitset(MF_LOCKED, map->map_mflags) &&
+                   lockfile(fd, map->map_file, ".dir", LOCK_EX))
+                       map->map_mflags |= MF_LOCKED;
+       }
        if (fstat(dbm_dirfno((DBM *) map->map_db1), &st) >= 0)
                map->map_mtime = st.st_mtime;
        return TRUE;
        if (fstat(dbm_dirfno((DBM *) map->map_db1), &st) >= 0)
                map->map_mtime = st.st_mtime;
        return TRUE;
@@ -559,7 +587,7 @@ ndbm_map_close(map)
                (void) sprintf(buf, "%010ld", curtime());
                ndbm_map_store(map, "YP_LAST_MODIFIED", buf);
 
                (void) sprintf(buf, "%010ld", curtime());
                ndbm_map_store(map, "YP_LAST_MODIFIED", buf);
 
-               (void) myhostname(buf, sizeof buf);
+               (void) gethostname(buf, sizeof buf);
                ndbm_map_store(map, "YP_MASTER_NAME", buf);
 
                if (inclnull)
                ndbm_map_store(map, "YP_MASTER_NAME", buf);
 
                if (inclnull)
@@ -1237,6 +1265,9 @@ impl_map_open(map, mode)
 #if defined(NEWDB) || defined(NDBM)
        if (Verbose)
                message("WARNING: cannot open alias database %s", map->map_file);
 #if defined(NEWDB) || defined(NDBM)
        if (Verbose)
                message("WARNING: cannot open alias database %s", map->map_file);
+#else
+       if (mode != O_RDONLY)
+               usrerr("Cannot rebuild aliases: no database format defined");
 #endif
 
        return stab_map_open(map, mode);
 #endif
 
        return stab_map_open(map, mode);
index 46f8c95..68a98dd 100644 (file)
@@ -33,7 +33,7 @@
  */
 
 #ifndef lint
  */
 
 #ifndef lint
-static char sccsid[] = "@(#)mci.c      8.6 (Berkeley) 10/23/93";
+static char sccsid[] = "@(#)mci.c      8.9 (Berkeley) 12/1/93";
 #endif /* not lint */
 
 #include "sendmail.h"
 #endif /* not lint */
 
 #include "sendmail.h"
@@ -275,6 +275,8 @@ mci_get(host, m)
        bzero(&CurHostAddr, sizeof CurHostAddr);
 #endif
 
        bzero(&CurHostAddr, sizeof CurHostAddr);
 #endif
 
+       if (m->m_mno < 0)
+               syserr("negative mno %d (%s)", m->m_mno, m->m_name);
        s = stab(host, ST_MCI + m->m_mno, ST_ENTER);
        mci = &s->s_mci;
        mci->mci_host = s->s_name;
        s = stab(host, ST_MCI + m->m_mno, ST_ENTER);
        mci = &s->s_mci;
        mci->mci_host = s->s_name;
@@ -348,7 +350,7 @@ mci_dump(mci, logit)
                ctime(&mci->mci_lastuse));
 printit:
        if (logit)
                ctime(&mci->mci_lastuse));
 printit:
        if (logit)
-               syslog(LOG_INFO, "%s", buf);
+               syslog(LOG_DEBUG, "%s", buf);
        else
                printf("%s\n", buf);
 }
        else
                printf("%s\n", buf);
 }
@@ -368,6 +370,9 @@ mci_dump_all(logit)
 {
        register int i;
 
 {
        register int i;
 
+       if (MciCache == NULL)
+               return;
+
        for (i = 0; i < MaxMciCache; i++)
                mci_dump(MciCache[i], logit);
 }
        for (i = 0; i < MaxMciCache; i++)
                mci_dump(MciCache[i], logit);
 }
index ea8e180..13274da 100644 (file)
@@ -33,7 +33,7 @@
  */
 
 #ifndef lint
  */
 
 #ifndef lint
-static char sccsid[] = "@(#)parseaddr.c        8.17 (Berkeley) 10/31/93";
+static char sccsid[] = "@(#)parseaddr.c        8.29 (Berkeley) 1/5/94";
 #endif /* not lint */
 
 # include "sendmail.h"
 #endif /* not lint */
 
 # include "sendmail.h"
@@ -103,7 +103,7 @@ parseaddr(addr, a, flags, delim, delimptr, e)
        if (delimptr == NULL)
                delimptr = &delimptrbuf;
 
        if (delimptr == NULL)
                delimptr = &delimptrbuf;
 
-       pvp = prescan(addr, delim, pvpbuf, delimptr);
+       pvp = prescan(addr, delim, pvpbuf, sizeof pvpbuf, delimptr);
        if (pvp == NULL)
        {
                if (tTd(20, 1))
        if (pvp == NULL)
        {
                if (tTd(20, 1))
@@ -143,9 +143,9 @@ parseaddr(addr, a, flags, delim, delimptr, e)
        */
 
        queueup = FALSE;
        */
 
        queueup = FALSE;
-       if (rewrite(pvp, 3, e) == EX_TEMPFAIL)
+       if (rewrite(pvp, 3, 0, e) == EX_TEMPFAIL)
                queueup = TRUE;
                queueup = TRUE;
-       if (rewrite(pvp, 0, e) == EX_TEMPFAIL)
+       if (rewrite(pvp, 0, 0, e) == EX_TEMPFAIL)
                queueup = TRUE;
 
 
                queueup = TRUE;
 
 
@@ -308,6 +308,7 @@ allocaddr(a, flags, paddr)
 **                     If '\t' then we are reading the .cf file.
 **             pvpbuf -- place to put the saved text -- note that
 **                     the pointers are static.
 **                     If '\t' then we are reading the .cf file.
 **             pvpbuf -- place to put the saved text -- note that
 **                     the pointers are static.
+**             pvpbsize -- size of pvpbuf.
 **             delimptr -- if non-NULL, set to the location of the
 **                     terminating delimiter.
 **
 **             delimptr -- if non-NULL, set to the location of the
 **                     terminating delimiter.
 **
@@ -341,10 +342,34 @@ static short StateTab[NSTATES][NSTATES] =
        /*ONE*/         OPR,    OPR,    OPR,    OPR,    OPR,
 };
 
        /*ONE*/         OPR,    OPR,    OPR,    OPR,    OPR,
 };
 
+/* token type table -- it gets modified with $o characters */
+static TokTypeTab[256] =
+{
+       ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,SPC,SPC,SPC,SPC,SPC,ATM,ATM,
+       ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,
+       SPC,ATM,QST,ATM,ATM,ATM,ATM,ATM,ATM,SPC,ATM,ATM,ATM,ATM,ATM,ATM,
+       ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,
+       ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,
+       ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,
+       ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,
+       ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,
+       OPR,OPR,ONE,OPR,OPR,OPR,OPR,OPR,OPR,OPR,OPR,OPR,OPR,OPR,OPR,OPR,
+       OPR,OPR,OPR,ONE,ONE,ONE,OPR,OPR,OPR,OPR,OPR,OPR,OPR,OPR,OPR,OPR,
+       ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,
+       ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,
+       ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,
+       ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,
+       ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,
+       ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM,
+};
+
+#define toktype(c)     ((int) TokTypeTab[(c) & 0xff])
+
+
 # define NOCHAR                -1      /* signal nothing in lookahead token */
 
 char **
 # define NOCHAR                -1      /* signal nothing in lookahead token */
 
 char **
-prescan(addr, delim, pvpbuf, delimptr)
+prescan(addr, delim, pvpbuf, pvpbsize, delimptr)
        char *addr;
        char delim;
        char pvpbuf[];
        char *addr;
        char delim;
        char pvpbuf[];
@@ -362,8 +387,24 @@ prescan(addr, delim, pvpbuf, delimptr)
        int newstate;
        char *saveto = CurEnv->e_to;
        static char *av[MAXATOM+1];
        int newstate;
        char *saveto = CurEnv->e_to;
        static char *av[MAXATOM+1];
+       static char firsttime = TRUE;
        extern int errno;
 
        extern int errno;
 
+       if (firsttime)
+       {
+               /* initialize the token type table */
+               char obuf[50];
+
+               firsttime = FALSE;
+               expand("\201o", obuf, &obuf[sizeof obuf - sizeof DELIMCHARS], CurEnv);
+               strcat(obuf, DELIMCHARS);
+               for (p = obuf; *p != '\0'; p++)
+               {
+                       if (TokTypeTab[*p & 0xff] == ATM)
+                               TokTypeTab[*p & 0xff] = OPR;
+               }
+       }
+
        /* make sure error messages don't have garbage on them */
        errno = 0;
 
        /* make sure error messages don't have garbage on them */
        errno = 0;
 
@@ -393,9 +434,10 @@ prescan(addr, delim, pvpbuf, delimptr)
                        if (c != NOCHAR && !bslashmode)
                        {
                                /* see if there is room */
                        if (c != NOCHAR && !bslashmode)
                        {
                                /* see if there is room */
-                               if (q >= &pvpbuf[PSBUFSIZE - 5])
+                               if (q >= &pvpbuf[pvpbsize - 5])
                                {
                                        usrerr("553 Address too long");
                                {
                                        usrerr("553 Address too long");
+       returnnull:
                                        if (delimptr != NULL)
                                                *delimptr = p;
                                        CurEnv->e_to = saveto;
                                        if (delimptr != NULL)
                                                *delimptr = p;
                                        CurEnv->e_to = saveto;
@@ -527,10 +569,12 @@ prescan(addr, delim, pvpbuf, delimptr)
                        if (avp >= &av[MAXATOM])
                        {
                                syserr("553 prescan: too many tokens");
                        if (avp >= &av[MAXATOM])
                        {
                                syserr("553 prescan: too many tokens");
-                               if (delimptr != NULL)
-                                       *delimptr = p;
-                               CurEnv->e_to = saveto;
-                               return (NULL);
+                               goto returnnull;
+                       }
+                       if (q - tok > MAXNAME)
+                       {
+                               syserr("553 prescan: token too long");
+                               goto returnnull;
                        }
                        *avp++ = tok;
                }
                        }
                        *avp++ = tok;
                }
@@ -546,50 +590,12 @@ prescan(addr, delim, pvpbuf, delimptr)
        }
        CurEnv->e_to = saveto;
        if (av[0] == NULL)
        }
        CurEnv->e_to = saveto;
        if (av[0] == NULL)
-               return (NULL);
-       return (av);
-}
-\f/*
-**  TOKTYPE -- return token type
-**
-**     Parameters:
-**             c -- the character in question.
-**
-**     Returns:
-**             Its type.
-**
-**     Side Effects:
-**             none.
-*/
-
-toktype(c)
-       register int c;
-{
-       static char buf[50];
-       static bool firstime = TRUE;
-
-       if (firstime)
        {
        {
-               firstime = FALSE;
-               expand("\201o", buf, &buf[sizeof buf - 1], CurEnv);
-               (void) strcat(buf, DELIMCHARS);
+               if (tTd(22, 1))
+                       printf("prescan: null leading token\n");
+               return (NULL);
        }
        }
-       c &= 0377;
-       if (c == MATCHCLASS || c == MATCHREPL || c == MATCHNCLASS)
-               return (ONE);
-       if (c == MACRODEXPAND)
-               return (ONE);
-       if (c == '"')
-               return (QST);
-       if ((c & 0340) == 0200)
-               return (OPR);
-       if (!isascii(c))
-               return (ATM);
-       if (isspace(c) || c == ')')
-               return (SPC);
-       if (strchr(buf, c) != NULL)
-               return (OPR);
-       return (ATM);
+       return (av);
 }
 \f/*
 **  REWRITE -- apply rewrite rules to token vector.
 }
 \f/*
 **  REWRITE -- apply rewrite rules to token vector.
@@ -616,6 +622,7 @@ toktype(c)
 **     Parameters:
 **             pvp -- pointer to token vector.
 **             ruleset -- the ruleset to use for rewriting.
 **     Parameters:
 **             pvp -- pointer to token vector.
 **             ruleset -- the ruleset to use for rewriting.
+**             reclevel -- recursion level (to catch loops).
 **             e -- the current envelope.
 **
 **     Returns:
 **             e -- the current envelope.
 **
 **     Returns:
@@ -635,11 +642,16 @@ struct match
 
 # define MAXMATCH      9       /* max params per rewrite */
 
 
 # define MAXMATCH      9       /* max params per rewrite */
 
+# ifndef MAXRULERECURSION
+#  define MAXRULERECURSION     50      /* max recursion depth */
+# endif
+
 
 int
 
 int
-rewrite(pvp, ruleset, e)
+rewrite(pvp, ruleset, reclevel, e)
        char **pvp;
        int ruleset;
        char **pvp;
        int ruleset;
+       int reclevel;
        register ENVELOPE *e;
 {
        register char *ap;              /* address pointer */
        register ENVELOPE *e;
 {
        register char *ap;              /* address pointer */
@@ -664,6 +676,11 @@ rewrite(pvp, ruleset, e)
                syserr("554 rewrite: illegal ruleset number %d", ruleset);
                return EX_CONFIG;
        }
                syserr("554 rewrite: illegal ruleset number %d", ruleset);
                return EX_CONFIG;
        }
+       if (reclevel++ > MAXRULERECURSION)
+       {
+               syserr("rewrite: infinite recursion, ruleset %d", ruleset);
+               return EX_CONFIG;
+       }
        if (pvp == NULL)
                return EX_USAGE;
 
        if (pvp == NULL)
                return EX_USAGE;
 
@@ -1124,7 +1141,8 @@ rewrite(pvp, ruleset, e)
                        else
                        {
                                /* scan the new replacement */
                        else
                        {
                                /* scan the new replacement */
-                               xpvp = prescan(replac, '\0', pvpbuf, NULL);
+                               xpvp = prescan(replac, '\0', pvpbuf,
+                                              sizeof pvpbuf, NULL);
                                if (xpvp == NULL)
                                {
                                        /* prescan already printed error */
                                if (xpvp == NULL)
                                {
                                        /* prescan already printed error */
@@ -1156,15 +1174,24 @@ rewrite(pvp, ruleset, e)
                {
                        int stat;
 
                {
                        int stat;
 
-                       bcopy((char *) &npvp[2], (char *) pvp,
-                               (int) (avp - npvp - 2) * sizeof *avp);
-                       if (tTd(21, 3))
-                               printf("-----callsubr %s\n", npvp[1]);
-                       stat = rewrite(pvp, atoi(npvp[1]), e);
-                       if (rstat == EX_OK || stat == EX_TEMPFAIL)
-                               rstat = stat;
-                       if ((**pvp & 0377) == CANONNET)
+                       if (npvp[1] == NULL)
+                       {
+                               syserr("parseaddr: NULL subroutine call in ruleset %d, rule %d",
+                                       ruleset, ruleno);
+                               *pvp = NULL;
+                       }
+                       else
+                       {
+                               bcopy((char *) &npvp[2], (char *) pvp,
+                                       (int) (avp - npvp - 2) * sizeof *avp);
+                               if (tTd(21, 3))
+                                       printf("-----callsubr %s\n", npvp[1]);
+                               stat = rewrite(pvp, atoi(npvp[1]), reclevel, e);
+                               if (rstat == EX_OK || stat == EX_TEMPFAIL)
+                                       rstat = stat;
+                               if (*pvp != NULL && (**pvp & 0377) == CANONNET)
                                rwr = NULL;
                                rwr = NULL;
+                       }
                }
                else
                {
                }
                else
                {
@@ -1285,6 +1312,8 @@ badaddr:
                        }
                        tv++;
                }
                        }
                        tv++;
                }
+               else
+                       setstat(EX_UNAVAILABLE);
                if ((**tv & 0377) != CANONUSER)
                        syserr("554 buildaddr: error: no user");
                cataddr(++tv, NULL, buf, sizeof buf, ' ');
                if ((**tv & 0377) != CANONUSER)
                        syserr("554 buildaddr: error: no user");
                cataddr(++tv, NULL, buf, sizeof buf, ' ');
@@ -1402,11 +1431,11 @@ badaddr:
        if (!bitset(RF_SENDERADDR|RF_HEADERADDR, flags))
        {
                /* sender addresses done later */
        if (!bitset(RF_SENDERADDR|RF_HEADERADDR, flags))
        {
                /* sender addresses done later */
-               (void) rewrite(tv, 2, e);
+               (void) rewrite(tv, 2, 0, e);
                if (m->m_re_rwset > 0)
                if (m->m_re_rwset > 0)
-                      (void) rewrite(tv, m->m_re_rwset, e);
+                      (void) rewrite(tv, m->m_re_rwset, 0, e);
        }
        }
-       (void) rewrite(tv, 4, e);
+       (void) rewrite(tv, 4, 0, e);
 
        /* save the result for the command line/RCPT argument */
        cataddr(tv, NULL, buf, sizeof buf, '\0');
 
        /* save the result for the command line/RCPT argument */
        cataddr(tv, NULL, buf, sizeof buf, '\0');
@@ -1500,6 +1529,8 @@ sameaddr(a, b)
        register ADDRESS *a;
        register ADDRESS *b;
 {
        register ADDRESS *a;
        register ADDRESS *b;
 {
+       register ADDRESS *ca, *cb;
+
        /* if they don't have the same mailer, forget it */
        if (a->q_mailer != b->q_mailer)
                return (FALSE);
        /* if they don't have the same mailer, forget it */
        if (a->q_mailer != b->q_mailer)
                return (FALSE);
@@ -1508,9 +1539,16 @@ sameaddr(a, b)
        if (strcmp(a->q_user, b->q_user) != 0)
                return (FALSE);
 
        if (strcmp(a->q_user, b->q_user) != 0)
                return (FALSE);
 
-       /* if we have good uids for both but the differ, these are different */
-       if (bitset(QGOODUID, a->q_flags & b->q_flags) && a->q_uid != b->q_uid)
-               return (FALSE);
+       /* if we have good uids for both but they differ, these are different */
+       if (a->q_mailer == ProgMailer)
+       {
+               ca = getctladdr(a);
+               cb = getctladdr(b);
+               if (ca != NULL && cb != NULL &&
+                   bitset(QGOODUID, ca->q_flags & cb->q_flags) &&
+                   ca->q_uid != cb->q_uid)
+                       return (FALSE);
+       }
 
        /* otherwise compare hosts (but be careful for NULL ptrs) */
        if (a->q_host == b->q_host)
 
        /* otherwise compare hosts (but be careful for NULL ptrs) */
        if (a->q_host == b->q_host)
@@ -1655,10 +1693,10 @@ remotename(name, m, flags, pstat, e)
        **      domain will be appended.
        */
 
        **      domain will be appended.
        */
 
-       pvp = prescan(name, '\0', pvpbuf, NULL);
+       pvp = prescan(name, '\0', pvpbuf, sizeof pvpbuf, NULL);
        if (pvp == NULL)
                return (name);
        if (pvp == NULL)
                return (name);
-       if (rewrite(pvp, 3, e) == EX_TEMPFAIL)
+       if (rewrite(pvp, 3, 0, e) == EX_TEMPFAIL)
                *pstat = EX_TEMPFAIL;
        if (bitset(RF_ADDDOMAIN, flags) && e->e_fromdomain != NULL)
        {
                *pstat = EX_TEMPFAIL;
        if (bitset(RF_ADDDOMAIN, flags) && e->e_fromdomain != NULL)
        {
@@ -1675,7 +1713,7 @@ remotename(name, m, flags, pstat, e)
 
                        while ((*pxp++ = *qxq++) != NULL)
                                continue;
 
                        while ((*pxp++ = *qxq++) != NULL)
                                continue;
-                       if (rewrite(pvp, 3, e) == EX_TEMPFAIL)
+                       if (rewrite(pvp, 3, 0, e) == EX_TEMPFAIL)
                                *pstat = EX_TEMPFAIL;
                }
        }
                                *pstat = EX_TEMPFAIL;
                }
        }
@@ -1689,17 +1727,17 @@ remotename(name, m, flags, pstat, e)
 
        if (bitset(RF_SENDERADDR, flags))
        {
 
        if (bitset(RF_SENDERADDR, flags))
        {
-               if (rewrite(pvp, 1, e) == EX_TEMPFAIL)
+               if (rewrite(pvp, 1, 0, e) == EX_TEMPFAIL)
                        *pstat = EX_TEMPFAIL;
        }
        else
        {
                        *pstat = EX_TEMPFAIL;
        }
        else
        {
-               if (rewrite(pvp, 2, e) == EX_TEMPFAIL)
+               if (rewrite(pvp, 2, 0, e) == EX_TEMPFAIL)
                        *pstat = EX_TEMPFAIL;
        }
        if (rwset > 0)
        {
                        *pstat = EX_TEMPFAIL;
        }
        if (rwset > 0)
        {
-               if (rewrite(pvp, rwset, e) == EX_TEMPFAIL)
+               if (rewrite(pvp, rwset, 0, e) == EX_TEMPFAIL)
                        *pstat = EX_TEMPFAIL;
        }
 
                        *pstat = EX_TEMPFAIL;
        }
 
@@ -1710,7 +1748,7 @@ remotename(name, m, flags, pstat, e)
        **      may be used as a default to the above rules.
        */
 
        **      may be used as a default to the above rules.
        */
 
-       if (rewrite(pvp, 4, e) == EX_TEMPFAIL)
+       if (rewrite(pvp, 4, 0, e) == EX_TEMPFAIL)
                *pstat = EX_TEMPFAIL;
 
        /*
                *pstat = EX_TEMPFAIL;
 
        /*
@@ -1719,7 +1757,13 @@ remotename(name, m, flags, pstat, e)
 
        cataddr(pvp, NULL, lbuf, sizeof lbuf, '\0');
        define('g', lbuf, e);
 
        cataddr(pvp, NULL, lbuf, sizeof lbuf, '\0');
        define('g', lbuf, e);
-       expand(fancy, buf, &buf[sizeof buf - 1], e);
+
+       /* need to make sure route-addrs have <angle brackets> */
+       if (bitset(RF_CANONICAL, flags) && lbuf[0] == '@')
+               expand("<\201g>", buf, &buf[sizeof buf - 1], e);
+       else
+               expand(fancy, buf, &buf[sizeof buf - 1], e);
+
        define('g', oldg, e);
 
        if (tTd(12, 1))
        define('g', oldg, e);
 
        if (tTd(12, 1))
@@ -1753,11 +1797,11 @@ maplocaluser(a, sendq, e)
                printf("maplocaluser: ");
                printaddr(a, FALSE);
        }
                printf("maplocaluser: ");
                printaddr(a, FALSE);
        }
-       pvp = prescan(a->q_user, '\0', pvpbuf, &delimptr);
+       pvp = prescan(a->q_user, '\0', pvpbuf, sizeof pvpbuf, &delimptr);
        if (pvp == NULL)
                return;
 
        if (pvp == NULL)
                return;
 
-       (void) rewrite(pvp, 5, e);
+       (void) rewrite(pvp, 5, 0, e);
        if (pvp[0] == NULL || (pvp[0][0] & 0377) != CANONNET)
                return;
 
        if (pvp[0] == NULL || (pvp[0][0] & 0377) != CANONNET)
                return;
 
index 5c4a027..e2cad4c 100644 (file)
@@ -36,9 +36,9 @@
 
 #ifndef lint
 #ifdef QUEUE
 
 #ifndef lint
 #ifdef QUEUE
-static char sccsid[] = "@(#)queue.c    8.27 (Berkeley) 10/29/93 (with queueing)";
+static char sccsid[] = "@(#)queue.c    8.36 (Berkeley) 1/9/94 (with queueing)";
 #else
 #else
-static char sccsid[] = "@(#)queue.c    8.27 (Berkeley) 10/29/93 (without queueing)";
+static char sccsid[] = "@(#)queue.c    8.36 (Berkeley) 1/9/94 (without queueing)";
 #endif
 #endif /* not lint */
 
 #endif
 #endif /* not lint */
 
@@ -121,21 +121,21 @@ queueup(e, queueall, announce)
                                        break;
 #ifdef LOG
                                if (LogLevel > 0 && (i % 32) == 0)
                                        break;
 #ifdef LOG
                                if (LogLevel > 0 && (i % 32) == 0)
-                                       syslog(LOG_ALERT, "queueup: cannot create %s: %s",
-                                               tf, errstring(errno));
+                                       syslog(LOG_ALERT, "queueup: cannot create %s, uid=%d: %s",
+                                               tf, geteuid(), errstring(errno));
 #endif
 #endif
-                               continue;
                        }
                        }
-
-                       if (lockfile(fd, tf, NULL, LOCK_EX|LOCK_NB))
-                               break;
+                       else
+                       {
+                               if (lockfile(fd, tf, NULL, LOCK_EX|LOCK_NB))
+                                       break;
 #ifdef LOG
 #ifdef LOG
-                       else if (LogLevel > 0 && (i % 32) == 0)
-                               syslog(LOG_ALERT, "queueup: cannot lock %s: %s",
-                                       tf, errstring(errno));
+                               else if (LogLevel > 0 && (i % 32) == 0)
+                                       syslog(LOG_ALERT, "queueup: cannot lock %s: %s",
+                                               tf, errstring(errno));
 #endif
 #endif
-
-                       close(fd);
+                               close(fd);
+                       }
 
                        if ((i % 32) == 31)
                        {
 
                        if ((i % 32) == 31)
                        {
@@ -146,7 +146,11 @@ queueup(e, queueall, announce)
                                sleep(i % 32);
                }
                if (fd < 0 || (tfp = fdopen(fd, "w")) == NULL)
                                sleep(i % 32);
                }
                if (fd < 0 || (tfp = fdopen(fd, "w")) == NULL)
-                       syserr("!queueup: cannot create queue temp file %s", tf);
+               {
+                       printopenfds(TRUE);
+                       syserr("!queueup: cannot create queue temp file %s, uid=%d",
+                               tf, geteuid());
+               }
        }
 
        if (tTd(40, 1))
        }
 
        if (tTd(40, 1))
@@ -176,8 +180,8 @@ queueup(e, queueall, announce)
                e->e_df = newstr(e->e_df);
                fd = open(e->e_df, O_WRONLY|O_CREAT, FileMode);
                if (fd < 0 || (dfp = fdopen(fd, "w")) == NULL)
                e->e_df = newstr(e->e_df);
                fd = open(e->e_df, O_WRONLY|O_CREAT, FileMode);
                if (fd < 0 || (dfp = fdopen(fd, "w")) == NULL)
-                       syserr("!queueup: cannot create data temp file %s",
-                               e->e_df);
+                       syserr("!queueup: cannot create data temp file %s, uid=%d",
+                               e->e_df, geteuid());
                (*e->e_putbody)(dfp, FileMailer, e, NULL);
                (void) xfclose(dfp, "queueup dfp", e->e_id);
                e->e_putbody = putbody;
                (*e->e_putbody)(dfp, FileMailer, e, NULL);
                (void) xfclose(dfp, "queueup dfp", e->e_id);
                e->e_putbody = putbody;
@@ -272,7 +276,7 @@ queueup(e, queueall, announce)
 
        bzero((char *) &nullmailer, sizeof nullmailer);
        nullmailer.m_re_rwset = nullmailer.m_rh_rwset =
 
        bzero((char *) &nullmailer, sizeof nullmailer);
        nullmailer.m_re_rwset = nullmailer.m_rh_rwset =
-                       nullmailer.m_se_rwset = nullmailer.m_sh_rwset = 0;
+                       nullmailer.m_se_rwset = nullmailer.m_sh_rwset = -1;
        nullmailer.m_eol = "\n";
 
        define('g', "\201f", e);
        nullmailer.m_eol = "\n";
 
        define('g', "\201f", e);
@@ -288,6 +292,14 @@ queueup(e, queueall, announce)
                if (bitset(H_RESENT, h->h_flags) && !bitset(EF_RESENT, e->e_flags))
                        continue;
 
                if (bitset(H_RESENT, h->h_flags) && !bitset(EF_RESENT, e->e_flags))
                        continue;
 
+               /* expand macros; if null, don't output header at all */
+               if (bitset(H_DEFAULT, h->h_flags))
+               {
+                       (void) expand(h->h_value, buf, &buf[sizeof buf], e);
+                       if (buf[0] == '\0')
+                               continue;
+               }
+
                /* output this header */
                fprintf(tfp, "H");
 
                /* output this header */
                fprintf(tfp, "H");
 
@@ -306,7 +318,6 @@ queueup(e, queueall, announce)
                /* output the header: expand macros, convert addresses */
                if (bitset(H_DEFAULT, h->h_flags))
                {
                /* output the header: expand macros, convert addresses */
                if (bitset(H_DEFAULT, h->h_flags))
                {
-                       (void) expand(h->h_value, buf, &buf[sizeof buf], e);
                        fprintf(tfp, "%s: %s\n", h->h_field, buf);
                }
                else if (bitset(H_FROM|H_RCPT, h->h_flags))
                        fprintf(tfp, "%s: %s\n", h->h_field, buf);
                }
                else if (bitset(H_FROM|H_RCPT, h->h_flags))
@@ -345,7 +356,8 @@ queueup(e, queueall, announce)
                /* rename (locked) tf to be (locked) qf */
                qf = queuename(e, 'q');
                if (rename(tf, qf) < 0)
                /* rename (locked) tf to be (locked) qf */
                qf = queuename(e, 'q');
                if (rename(tf, qf) < 0)
-                       syserr("cannot rename(%s, %s), df=%s", tf, qf, e->e_df);
+                       syserr("cannot rename(%s, %s), df=%s, uid=%d",
+                               tf, qf, e->e_df, geteuid());
 
                /* close and unlock old (locked) qf */
                if (e->e_lockfp != NULL)
 
                /* close and unlock old (locked) qf */
                if (e->e_lockfp != NULL)
@@ -461,17 +473,18 @@ runqueue(forkflag)
        if (forkflag)
        {
                int pid;
        if (forkflag)
        {
                int pid;
+#ifdef SIGCHLD
+               extern void reapchild();
+
+               (void) setsignal(SIGCHLD, reapchild);
+#endif
 
                pid = dofork();
                if (pid != 0)
                {
 
                pid = dofork();
                if (pid != 0)
                {
-                       extern void reapchild();
-
                        /* parent -- pick up intermediate zombie */
 #ifndef SIGCHLD
                        (void) waitfor(pid);
                        /* parent -- pick up intermediate zombie */
 #ifndef SIGCHLD
                        (void) waitfor(pid);
-#else /* SIGCHLD */
-                       (void) setsignal(SIGCHLD, reapchild);
 #endif /* SIGCHLD */
                        if (QueueIntvl != 0)
                                (void) setevent(QueueIntvl, runqueue, TRUE);
 #endif /* SIGCHLD */
                        if (QueueIntvl != 0)
                                (void) setevent(QueueIntvl, runqueue, TRUE);
@@ -850,6 +863,11 @@ dowork(id, forkflag, requeueflag, e)
                        syserr("dowork: cannot fork");
                        return 0;
                }
                        syserr("dowork: cannot fork");
                        return 0;
                }
+               else if (pid > 0)
+               {
+                       /* parent -- clean out connection cache */
+                       mci_flush(FALSE, NULL);
+               }
        }
        else
        {
        }
        else
        {
@@ -888,7 +906,7 @@ dowork(id, forkflag, requeueflag, e)
                e->e_header = NULL;
 
                /* read the queue control file -- return if locked */
                e->e_header = NULL;
 
                /* read the queue control file -- return if locked */
-               if (!readqf(e, !requeueflag))
+               if (!readqf(e))
                {
                        if (tTd(40, 4))
                                printf("readqf(%s) failed\n", e->e_id);
                {
                        if (tTd(40, 4))
                                printf("readqf(%s) failed\n", e->e_id);
@@ -921,8 +939,6 @@ dowork(id, forkflag, requeueflag, e)
 **
 **     Parameters:
 **             e -- the envelope of the job to run.
 **
 **     Parameters:
 **             e -- the envelope of the job to run.
-**             announcefile -- if set, announce the name of the queue
-**                     file in error messages.
 **
 **     Returns:
 **             TRUE if it successfully read the queue file.
 **
 **     Returns:
 **             TRUE if it successfully read the queue file.
@@ -933,9 +949,8 @@ dowork(id, forkflag, requeueflag, e)
 */
 
 bool
 */
 
 bool
-readqf(e, announcefile)
+readqf(e)
        register ENVELOPE *e;
        register ENVELOPE *e;
-       bool announcefile;
 {
        register FILE *qfp;
        ADDRESS *ctladdr;
 {
        register FILE *qfp;
        ADDRESS *ctladdr;
@@ -1031,9 +1046,8 @@ readqf(e, announcefile)
 
        /* do basic system initialization */
        initsys(e);
 
        /* do basic system initialization */
        initsys(e);
+       define('i', e->e_id, e);
 
 
-       if (announcefile)
-               FileName = qf;
        LineNumber = 0;
        e->e_flags |= EF_GLOBALERRS;
        OpMode = MD_DELIVER;
        LineNumber = 0;
        e->e_flags |= EF_GLOBALERRS;
        OpMode = MD_DELIVER;
@@ -1121,8 +1135,8 @@ readqf(e, announcefile)
                        break;
 
                  default:
                        break;
 
                  default:
-                       syserr("readqf: bad line \"%s\"", e->e_id,
-                               LineNumber, bp);
+                       syserr("readqf: %s: line %s: bad line \"%s\"",
+                               qf, LineNumber, bp);
                        fclose(qfp);
                        rename(qf, queuename(e, 'Q'));
                        return FALSE;
                        fclose(qfp);
                        rename(qf, queuename(e, 'Q'));
                        return FALSE;
@@ -1132,8 +1146,6 @@ readqf(e, announcefile)
                        free(bp);
        }
 
                        free(bp);
        }
 
-       FileName = NULL;
-
        /*
        **  If we haven't read any lines, this queue file is empty.
        **  Arrange to remove it without referencing any null pointers.
        /*
        **  If we haven't read any lines, this queue file is empty.
        **  Arrange to remove it without referencing any null pointers.
index eb52247..0d8d6fd 100644 (file)
@@ -33,7 +33,7 @@
  */
 
 #ifndef lint
  */
 
 #ifndef lint
-static char sccsid[] = "@(#)readcf.c   8.14 (Berkeley) 10/31/93";
+static char sccsid[] = "@(#)readcf.c   8.18 (Berkeley) 1/9/94";
 #endif /* not lint */
 
 # include "sendmail.h"
 #endif /* not lint */
 
 # include "sendmail.h"
@@ -109,7 +109,7 @@ readcf(cfname, safe, e)
        extern char **copyplist();
        struct stat statb;
        char exbuf[MAXLINE];
        extern char **copyplist();
        struct stat statb;
        char exbuf[MAXLINE];
-       char pvpbuf[PSBUFSIZE];
+       char pvpbuf[MAXLINE + MAXATOM];
        extern char *munchstring();
        extern void makemapentry();
 
        extern char *munchstring();
        extern void makemapentry();
 
@@ -241,7 +241,8 @@ readcf(cfname, safe, e)
                        /* expand and save the LHS */
                        *p = '\0';
                        expand(&bp[1], exbuf, &exbuf[sizeof exbuf], e);
                        /* expand and save the LHS */
                        *p = '\0';
                        expand(&bp[1], exbuf, &exbuf[sizeof exbuf], e);
-                       rwp->r_lhs = prescan(exbuf, '\t', pvpbuf, NULL);
+                       rwp->r_lhs = prescan(exbuf, '\t', pvpbuf,
+                                            sizeof pvpbuf, NULL);
                        nfuzzy = 0;
                        if (rwp->r_lhs != NULL)
                        {
                        nfuzzy = 0;
                        if (rwp->r_lhs != NULL)
                        {
@@ -325,7 +326,8 @@ readcf(cfname, safe, e)
                                p++;
                        *p = '\0';
                        expand(q, exbuf, &exbuf[sizeof exbuf], e);
                                p++;
                        *p = '\0';
                        expand(q, exbuf, &exbuf[sizeof exbuf], e);
-                       rwp->r_rhs = prescan(exbuf, '\t', pvpbuf, NULL);
+                       rwp->r_rhs = prescan(exbuf, '\t', pvpbuf,
+                                            sizeof pvpbuf, NULL);
                        if (rwp->r_rhs != NULL)
                        {
                                register char **ap;
                        if (rwp->r_rhs != NULL)
                        {
                                register char **ap;
@@ -540,8 +542,10 @@ readcf(cfname, safe, e)
        {
                /* user didn't initialize: set up host map */
                strcpy(buf, "host host");
        {
                /* user didn't initialize: set up host map */
                strcpy(buf, "host host");
+#ifdef NAMED_BIND
                if (ConfigLevel >= 2)
                        strcat(buf, " -a.");
                if (ConfigLevel >= 2)
                        strcat(buf, " -a.");
+#endif
                makemapentry(buf);
        }
 }
                makemapentry(buf);
        }
 }
@@ -1020,6 +1024,7 @@ struct resolverflags
        "defnames",     RES_DEFNAMES,
        "stayopen",     RES_STAYOPEN,
        "dnsrch",       RES_DNSRCH,
        "defnames",     RES_DEFNAMES,
        "stayopen",     RES_STAYOPEN,
        "dnsrch",       RES_DNSRCH,
+       "true",         0,              /* to avoid error on old syntax */
        NULL,           0
 };
 
        NULL,           0
 };
 
@@ -1239,7 +1244,9 @@ setoption(opt, val, safe, sticky, e)
                                if (strcasecmp(q, rfp->rf_name) == 0)
                                        break;
                        }
                                if (strcasecmp(q, rfp->rf_name) == 0)
                                        break;
                        }
-                       if (clearmode)
+                       if (rfp->rf_name == NULL)
+                               syserr("readcf: I option value %s unrecognized", q);
+                       else if (clearmode)
                                _res.options &= ~rfp->rf_bits;
                        else
                                _res.options |= rfp->rf_bits;
                                _res.options &= ~rfp->rf_bits;
                        else
                                _res.options |= rfp->rf_bits;
index e80c6b5..706fddc 100644 (file)
@@ -33,7 +33,7 @@
  */
 
 #ifndef lint
  */
 
 #ifndef lint
-static char sccsid[] = "@(#)recipient.c        8.21 (Berkeley) 10/29/93";
+static char sccsid[] = "@(#)recipient.c        8.39 (Berkeley) 1/10/94";
 #endif /* not lint */
 
 # include "sendmail.h"
 #endif /* not lint */
 
 # include "sendmail.h"
@@ -222,10 +222,25 @@ recipient(a, sendq, e)
        stripquotes(buf);
 
        /* check for direct mailing to restricted mailers */
        stripquotes(buf);
 
        /* check for direct mailing to restricted mailers */
-       if (a->q_alias == NULL && m == ProgMailer)
+       if (m == ProgMailer)
        {
        {
-               a->q_flags |= QBADADDR;
-               usrerr("550 Cannot mail directly to programs");
+               if (a->q_alias == NULL)
+               {
+                       a->q_flags |= QBADADDR;
+                       usrerr("550 Cannot mail directly to programs");
+               }
+               else if (bitset(QBOGUSSHELL, a->q_alias->q_flags))
+               {
+                       a->q_flags |= QBADADDR;
+                       usrerr("550 User %s@%s doesn't have a valid shell for mailing to programs",
+                               a->q_alias->q_ruser, MyHostName);
+               }
+               else if (bitset(QUNSAFEADDR, a->q_alias->q_flags))
+               {
+                       a->q_flags |= QBADADDR;
+                       usrerr("550 Address %s is unsafe for mailing to programs",
+                               a->q_alias->q_paddr);
+               }
        }
 
        /*
        }
 
        /*
@@ -252,6 +267,8 @@ recipient(a, sendq, e)
                                        message("duplicate suppressed");
                                q->q_flags |= a->q_flags;
                        }
                                        message("duplicate suppressed");
                                q->q_flags |= a->q_flags;
                        }
+                       else if (bitset(QSELFREF, q->q_flags))
+                               q->q_flags |= a->q_flags & ~QDONTSEND;
                        a = q;
                        goto testselfdestruct;
                }
                        a = q;
                        goto testselfdestruct;
                }
@@ -294,6 +311,7 @@ recipient(a, sendq, e)
                                                e->e_id, a->q_user, errstring(ret));
 #endif
                                a->q_flags |= QQUEUEUP;
                                                e->e_id, a->q_user, errstring(ret));
 #endif
                                a->q_flags |= QQUEUEUP;
+                               a->q_flags &= ~QDONTSEND;
                                usrerr("451 Cannot open %s: %s",
                                        a->q_user, errstring(ret));
                        }
                                usrerr("451 Cannot open %s: %s",
                                        a->q_user, errstring(ret));
                        }
@@ -307,18 +325,27 @@ recipient(a, sendq, e)
        }
        else if (m == FileMailer)
        {
        }
        else if (m == FileMailer)
        {
-               struct stat stb;
                extern bool writable();
 
                extern bool writable();
 
-               p = strrchr(buf, '/');
                /* check if writable or creatable */
                if (a->q_alias == NULL)
                {
                        a->q_flags |= QBADADDR;
                        usrerr("550 Cannot mail directly to files");
                }
                /* check if writable or creatable */
                if (a->q_alias == NULL)
                {
                        a->q_flags |= QBADADDR;
                        usrerr("550 Cannot mail directly to files");
                }
-               else if ((stat(buf, &stb) >= 0) ? (!writable(&stb)) :
-                   (*p = '\0', safefile(buf, RealUid, RealGid, NULL, TRUE, S_IWRITE|S_IEXEC) != 0))
+               else if (bitset(QBOGUSSHELL, a->q_alias->q_flags))
+               {
+                       a->q_flags |= QBADADDR;
+                       usrerr("550 User %s@%s doesn't have a valid shell for mailing to files",
+                               a->q_alias->q_ruser, MyHostName);
+               }
+               else if (bitset(QUNSAFEADDR, a->q_alias->q_flags))
+               {
+                       a->q_flags |= QBADADDR;
+                       usrerr("550 Address %s is unsafe for mailing to files",
+                               a->q_alias->q_paddr);
+               }
+               else if (!writable(buf, getctladdr(a), SFF_ANYFILE))
                {
                        a->q_flags |= QBADADDR;
                        giveresponse(EX_CANTCREAT, m, NULL, a->q_alias, e);
                {
                        a->q_flags |= QBADADDR;
                        giveresponse(EX_CANTCREAT, m, NULL, a->q_alias, e);
@@ -340,7 +367,6 @@ recipient(a, sendq, e)
        if (!bitset(QDONTSEND|QNOTREMOTE|QVERIFIED, a->q_flags))
        {
                extern int udbexpand();
        if (!bitset(QDONTSEND|QNOTREMOTE|QVERIFIED, a->q_flags))
        {
                extern int udbexpand();
-               extern int errno;
 
                if (udbexpand(a, sendq, e) == EX_TEMPFAIL)
                {
 
                if (udbexpand(a, sendq, e) == EX_TEMPFAIL)
                {
@@ -429,6 +455,11 @@ recipient(a, sendq, e)
                        buildfname(pw->pw_gecos, pw->pw_name, nbuf);
                        if (nbuf[0] != '\0')
                                a->q_fullname = newstr(nbuf);
                        buildfname(pw->pw_gecos, pw->pw_name, nbuf);
                        if (nbuf[0] != '\0')
                                a->q_fullname = newstr(nbuf);
+                       if (pw->pw_shell != NULL && pw->pw_shell[0] != '\0' &&
+                           !usershellok(pw->pw_shell))
+                       {
+                               a->q_flags |= QBOGUSSHELL;
+                       }
                        if (!quoted)
                                forward(a, sendq, e);
                }
                        if (!quoted)
                                forward(a, sendq, e);
                }
@@ -563,7 +594,9 @@ finduser(name, fuzzyp)
 **     not writable.  This is also enforced by mailfile.
 **
 **     Parameters:
 **     not writable.  This is also enforced by mailfile.
 **
 **     Parameters:
-**             s -- pointer to a stat struct for the file.
+**             filename -- the file name to check.
+**             ctladdr -- the controlling address for this file.
+**             flags -- SFF_* flags to control the function.
 **
 **     Returns:
 **             TRUE -- if we will be able to write this file.
 **
 **     Returns:
 **             TRUE -- if we will be able to write this file.
@@ -574,35 +607,98 @@ finduser(name, fuzzyp)
 */
 
 bool
 */
 
 bool
-writable(s)
-       register struct stat *s;
+writable(filename, ctladdr, flags)
+       char *filename;
+       ADDRESS *ctladdr;
+       int flags;
 {
        uid_t euid;
        gid_t egid;
        int bits;
 {
        uid_t euid;
        gid_t egid;
        int bits;
+       register char *p;
+       char *uname;
+       struct stat stb;
+       extern char RealUserName[];
 
 
-       if (bitset(0111, s->st_mode))
-               return (FALSE);
-       euid = RealUid;
-       egid = RealGid;
-       if (geteuid() == 0)
+       if (tTd(29, 5))
+               printf("writable(%s, %x)\n", filename, flags);
+
+#ifdef HASLSTAT
+       if ((bitset(SFF_NOSLINK, flags) ? lstat(filename, &stb)
+                                       : stat(filename, &stb)) < 0)
+#else
+       if (stat(filename, &stb) < 0)
+#endif
        {
        {
-               if (bitset(S_ISUID, s->st_mode))
-                       euid = s->st_uid;
-               if (bitset(S_ISGID, s->st_mode))
-                       egid = s->st_gid;
+               /* file does not exist -- see if directory is safe */
+               p = strrchr(filename, '/');
+               if (p == NULL)
+               {
+                       errno = ENOTDIR;
+                       return FALSE;
+               }
+               *p = '\0';
+               errno = safefile(filename, RealUid, RealGid, RealUserName,
+                                SFF_MUSTOWN, S_IWRITE|S_IEXEC);
+               *p = '/';
+               return errno == 0;
        }
 
        }
 
+#ifdef SUID_ROOT_FILES_OK
+       /* really ought to be passed down -- and not a good idea */
+       flags |= SFF_ROOTOK;
+#endif
+
+       /*
+       **  File does exist -- check that it is writable.
+       */
+
+       if (bitset(0111, stb.st_mode))
+       {
+               if (tTd(29, 5))
+                       printf("failed (mode %o: x bits)\n", stb.st_mode);
+               errno = EPERM;
+               return (FALSE);
+       }
+
+       if (ctladdr != NULL && geteuid() == 0)
+       {
+               euid = ctladdr->q_uid;
+               egid = ctladdr->q_gid;
+               uname = ctladdr->q_user;
+       }
+       else
+       {
+               euid = RealUid;
+               egid = RealGid;
+               uname = RealUserName;
+       }
        if (euid == 0)
        if (euid == 0)
-               return (TRUE);
-       bits = S_IWRITE;
-       if (euid != s->st_uid)
        {
        {
-               bits >>= 3;
-               if (egid != s->st_gid)
-                       bits >>= 3;
+               euid = DefUid;
+               uname = DefUser;
        }
        }
-       return ((s->st_mode & bits) != 0);
+       if (egid == 0)
+               egid = DefGid;
+       if (geteuid() == 0)
+       {
+               if (bitset(S_ISUID, stb.st_mode) &&
+                   (stb.st_uid != 0 || bitset(SFF_ROOTOK, flags)))
+               {
+                       euid = stb.st_uid;
+                       uname = NULL;
+               }
+               if (bitset(S_ISGID, stb.st_mode) &&
+                   (stb.st_gid != 0 || bitset(SFF_ROOTOK, flags)))
+                       egid = stb.st_gid;
+       }
+
+       if (tTd(29, 5))
+               printf("\teu/gid=%d/%d, st_u/gid=%d/%d\n",
+                       euid, egid, stb.st_uid, stb.st_gid);
+
+       errno = safefile(filename, euid, egid, uname, flags, S_IWRITE);
+       return errno == 0;
 }
 \f/*
 **  INCLUDE -- handle :include: specification.
 }
 \f/*
 **  INCLUDE -- handle :include: specification.
@@ -628,6 +724,10 @@ writable(s)
 static jmp_buf CtxIncludeTimeout;
 static int     includetimeout();
 
 static jmp_buf CtxIncludeTimeout;
 static int     includetimeout();
 
+#ifndef S_IWOTH
+# define S_IWOTH       (S_IWRITE >> 6)
+#endif
+
 int
 include(fname, forwarding, ctladdr, sendq, e)
        char *fname;
 int
 include(fname, forwarding, ctladdr, sendq, e)
        char *fname;
@@ -647,6 +747,8 @@ include(fname, forwarding, ctladdr, sendq, e)
        gid_t savedgid, gid;
        char *uname;
        int rval = 0;
        gid_t savedgid, gid;
        char *uname;
        int rval = 0;
+       int sfflags = forwarding ? SFF_MUSTOWN : SFF_ANYFILE;
+       struct stat st;
        char buf[MAXLINE];
 
        if (tTd(27, 2))
        char buf[MAXLINE];
 
        if (tTd(27, 2))
@@ -665,9 +767,9 @@ include(fname, forwarding, ctladdr, sendq, e)
        ca = getctladdr(ctladdr);
        if (ca == NULL)
        {
        ca = getctladdr(ctladdr);
        if (ca == NULL)
        {
-               uid = 0;
-               gid = 0;
-               uname = NULL;
+               uid = DefUid;
+               gid = DefGid;
+               uname = DefUser;
                saveduid = -1;
        }
        else
                saveduid = -1;
        }
        else
@@ -699,7 +801,6 @@ include(fname, forwarding, ctladdr, sendq, e)
        {
                ctladdr->q_flags |= QQUEUEUP;
                errno = 0;
        {
                ctladdr->q_flags |= QQUEUEUP;
                errno = 0;
-               usrerr("451 open timeout on %s", fname);
 
                /* return pseudo-error code */
                rval = EOPENTIMEOUT;
 
                /* return pseudo-error code */
                rval = EOPENTIMEOUT;
@@ -708,41 +809,24 @@ include(fname, forwarding, ctladdr, sendq, e)
        ev = setevent((time_t) 60, includetimeout, 0);
 
        /* the input file must be marked safe */
        ev = setevent((time_t) 60, includetimeout, 0);
 
        /* the input file must be marked safe */
-       rval = safefile(fname, uid, gid, uname, forwarding, S_IREAD);
+       rval = safefile(fname, uid, gid, uname, sfflags, S_IREAD);
        if (rval != 0)
        {
                /* don't use this :include: file */
        if (rval != 0)
        {
                /* don't use this :include: file */
-               clrevent(ev);
                if (tTd(27, 4))
                        printf("include: not safe (uid=%d): %s\n",
                                uid, errstring(rval));
                if (tTd(27, 4))
                        printf("include: not safe (uid=%d): %s\n",
                                uid, errstring(rval));
-               goto resetuid;
        }
        }
-
-       fp = fopen(fname, "r");
-       if (fp == NULL)
-       {
-               rval = errno;
-               if (tTd(27, 4))
-                       printf("include: open: %s\n", errstring(rval));
-       }
-       else if (ca == NULL)
+       else
        {
        {
-               struct stat st;
-
-               if (fstat(fileno(fp), &st) < 0)
+               fp = fopen(fname, "r");
+               if (fp == NULL)
                {
                        rval = errno;
                {
                        rval = errno;
-                       syserr("Cannot fstat %s!", fname);
-               }
-               else
-               {
-                       ctladdr->q_uid = st.st_uid;
-                       ctladdr->q_gid = st.st_gid;
-                       ctladdr->q_flags |= QGOODUID;
+                       if (tTd(27, 4))
+                               printf("include: open: %s\n", errstring(rval));
                }
        }
                }
        }
-
        clrevent(ev);
 
 resetuid:
        clrevent(ev);
 
 resetuid:
@@ -761,9 +845,43 @@ resetuid:
        if (tTd(27, 9))
                printf("include: reset uid = %d/%d\n", getuid(), geteuid());
 
        if (tTd(27, 9))
                printf("include: reset uid = %d/%d\n", getuid(), geteuid());
 
+       if (rval == EOPENTIMEOUT)
+               usrerr("451 open timeout on %s", fname);
+
        if (fp == NULL)
                return rval;
 
        if (fp == NULL)
                return rval;
 
+       if (fstat(fileno(fp), &st) < 0)
+       {
+               rval = errno;
+               syserr("Cannot fstat %s!", fname);
+               return rval;
+       }
+
+       if (ca == NULL)
+       {
+               ctladdr->q_uid = st.st_uid;
+               ctladdr->q_gid = st.st_gid;
+               ctladdr->q_flags |= QGOODUID;
+       }
+       if (ca != NULL && ca->q_uid == st.st_uid)
+       {
+               /* optimization -- avoid getpwuid if we already have info */
+               ctladdr->q_flags |= ca->q_flags & QBOGUSSHELL;
+               ctladdr->q_ruser = ca->q_ruser;
+       }
+       else
+       {
+               register struct passwd *pw;
+
+               pw = getpwuid(st.st_uid);
+               if (pw == NULL || !usershellok(pw->pw_shell))
+               {
+                       ctladdr->q_ruser = newstr(pw->pw_name);
+                       ctladdr->q_flags |= QBOGUSSHELL;
+               }
+       }
+
        if (bitset(EF_VRFYONLY, e->e_flags))
        {
                /* don't do any more now */
        if (bitset(EF_VRFYONLY, e->e_flags))
        {
                /* don't do any more now */
@@ -773,6 +891,19 @@ resetuid:
                return rval;
        }
 
                return rval;
        }
 
+       /*
+       ** Check to see if some bad guy can write this file
+       **
+       **      This should really do something clever with group
+       **      permissions; currently we just view world writable
+       **      as unsafe.  Also, we don't check for writable
+       **      directories in the path.  We've got to leave
+       **      something for the local sysad to do.
+       */
+
+       if (bitset(S_IWOTH, st.st_mode))
+               ctladdr->q_flags |= QUNSAFEADDR;
+
        /* read the file -- each line is a comma-separated list. */
        FileName = fname;
        LineNumber = 0;
        /* read the file -- each line is a comma-separated list. */
        FileName = fname;
        LineNumber = 0;
index 99e33c5..2d09594 100644 (file)
@@ -33,7 +33,7 @@
  */
 
 #ifndef lint
  */
 
 #ifndef lint
-static char sccsid[] = "@(#)savemail.c 8.17 (Berkeley) 10/31/93";
+static char sccsid[] = "@(#)savemail.c 8.24 (Berkeley) 12/18/93";
 #endif /* not lint */
 
 # include "sendmail.h"
 #endif /* not lint */
 
 # include "sendmail.h"
@@ -69,6 +69,10 @@ static char sccsid[] = "@(#)savemail.c       8.17 (Berkeley) 10/31/93";
 # define ESM_PANIC     6       /* leave the locked queue/transcript files */
 # define ESM_DONE      7       /* the message is successfully delivered */
 
 # define ESM_PANIC     6       /* leave the locked queue/transcript files */
 # define ESM_DONE      7       /* the message is successfully delivered */
 
+# ifndef _PATH_VARTMP
+#  define _PATH_VARTMP "/usr/tmp/"
+# endif
+
 
 savemail(e)
        register ENVELOPE *e;
 
 savemail(e)
        register ENVELOPE *e;
@@ -82,6 +86,7 @@ savemail(e)
        register char *p;
        extern char *ttypath();
        typedef int (*fnptr)();
        register char *p;
        extern char *ttypath();
        typedef int (*fnptr)();
+       extern bool writable();
 
        if (tTd(6, 1))
        {
 
        if (tTd(6, 1))
        {
@@ -374,8 +379,14 @@ savemail(e)
                                break;
                        }
 
                                break;
                        }
 
-                       fp = dfopen("/usr/tmp/dead.letter",
-                                   O_WRONLY|O_CREAT|O_APPEND, FileMode);
+                       strcpy(buf, _PATH_VARTMP);
+                       strcat(buf, "dead.letter");
+                       if (!writable(buf, NULLADDR, SFF_NOSLINK))
+                       {
+                               state = ESM_PANIC;
+                               break;
+                       }
+                       fp = dfopen(buf, O_WRONLY|O_CREAT|O_APPEND, FileMode);
                        if (fp == NULL)
                        {
                                state = ESM_PANIC;
                        if (fp == NULL)
                        {
                                state = ESM_PANIC;
@@ -399,8 +410,7 @@ savemail(e)
 
                  case ESM_PANIC:
                        /* leave the locked queue & transcript files around */
 
                  case ESM_PANIC:
                        /* leave the locked queue & transcript files around */
-                       syserr("554 savemail: cannot save rejected email anywhere");
-                       exit(EX_SOFTWARE);
+                       syserr("!554 savemail: cannot save rejected email anywhere");
                }
        }
 }
                }
        }
 }
@@ -466,6 +476,7 @@ returntosender(msg, returnq, sendbody, e)
 
        SendBody = sendbody;
        define('g', e->e_from.q_paddr, e);
 
        SendBody = sendbody;
        define('g', e->e_from.q_paddr, e);
+       define('u', NULL, e);
        ee = newenvelope(&errenvelope, e);
        define('a', "\201b", ee);
        define('r', "internal", ee);
        ee = newenvelope(&errenvelope, e);
        define('a', "\201b", ee);
        define('r', "internal", ee);
@@ -602,7 +613,8 @@ errbody(fp, m, e)
        for (q = e->e_parent->e_sendqueue; q != NULL; q = q->q_next)
                if (bitset(QBADADDR, q->q_flags))
                        break;
        for (q = e->e_parent->e_sendqueue; q != NULL; q = q->q_next)
                if (bitset(QBADADDR, q->q_flags))
                        break;
-       if (q == NULL && !bitset(EF_FATALERRS, e->e_parent->e_flags))
+       if (q == NULL &&
+           !bitset(EF_FATALERRS|EF_SENDRECEIPT, e->e_parent->e_flags))
        {
                putline("    **********************************************",
                        fp, m);
        {
                putline("    **********************************************",
                        fp, m);
index 5581377..e68ffe0 100644 (file)
@@ -31,7 +31,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  *
- *     @(#)sendmail.h  8.26 (Berkeley) 10/31/93
+ *     @(#)sendmail.h  8.38 (Berkeley) 1/5/94
  */
 
 /*
  */
 
 /*
@@ -41,7 +41,7 @@
 # ifdef _DEFINE
 # define EXTERN
 # ifndef lint
 # ifdef _DEFINE
 # define EXTERN
 # ifndef lint
-static char SmailSccsId[] =    "@(#)sendmail.h 8.26            10/31/93";
+static char SmailSccsId[] =    "@(#)sendmail.h 8.38            1/5/94";
 # endif
 # else /*  _DEFINE */
 # define EXTERN extern
 # endif
 # else /*  _DEFINE */
 # define EXTERN extern
@@ -57,7 +57,6 @@ static char SmailSccsId[] =   "@(#)sendmail.h 8.26            10/31/93";
 # include <string.h>
 # include <time.h>
 # include <errno.h>
 # include <string.h>
 # include <time.h>
 # include <errno.h>
-# include <sys/un.h>
 
 # include "conf.h"
 # include "useful.h"
 
 # include "conf.h"
 # include "useful.h"
@@ -69,6 +68,9 @@ static char SmailSccsId[] =   "@(#)sendmail.h 8.26            10/31/93";
 # ifdef DAEMON
 # include <sys/socket.h>
 # endif
 # ifdef DAEMON
 # include <sys/socket.h>
 # endif
+# ifdef NETUNIX
+# include <sys/un.h>
+# endif
 # ifdef NETINET
 # include <netinet/in.h>
 # endif
 # ifdef NETINET
 # include <netinet/in.h>
 # endif
@@ -148,6 +150,8 @@ typedef struct address ADDRESS;
 # define QSELFREF      000200  /* this address references itself */
 # define QVERIFIED     000400  /* verified, but not expanded */
 # define QREPORT       001000  /* report this address in return message */
 # define QSELFREF      000200  /* this address references itself */
 # define QVERIFIED     000400  /* verified, but not expanded */
 # define QREPORT       001000  /* report this address in return message */
+# define QBOGUSSHELL   002000  /* this entry has an invalid shell listed */
+# define QUNSAFEADDR   004000  /* address aquired through an unsafe path */
 
 # define NULLADDR      ((ADDRESS *) NULL)
 \f/*
 
 # define NULLADDR      ((ADDRESS *) NULL)
 \f/*
@@ -287,9 +291,9 @@ ENVELOPE
        ADDRESS         *e_sendqueue;   /* list of message recipients */
        ADDRESS         *e_errorqueue;  /* the queue for error responses */
        long            e_msgsize;      /* size of the message in bytes */
        ADDRESS         *e_sendqueue;   /* list of message recipients */
        ADDRESS         *e_errorqueue;  /* the queue for error responses */
        long            e_msgsize;      /* size of the message in bytes */
+       long            e_flags;        /* flags, see below */
        int             e_nrcpts;       /* number of recipients */
        short           e_class;        /* msg class (priority, junk, etc.) */
        int             e_nrcpts;       /* number of recipients */
        short           e_class;        /* msg class (priority, junk, etc.) */
-       short           e_flags;        /* flags, see below */
        short           e_hopcount;     /* number of times processed */
        short           e_nsent;        /* number of sends since checkpoint */
        short           e_sendmode;     /* message send mode */
        short           e_hopcount;     /* number of times processed */
        short           e_nsent;        /* number of sends since checkpoint */
        short           e_sendmode;     /* message send mode */
@@ -314,20 +318,21 @@ ENVELOPE
 };
 
 /* values for e_flags */
 };
 
 /* values for e_flags */
-#define EF_OLDSTYLE    000001          /* use spaces (not commas) in hdrs */
-#define EF_INQUEUE     000002          /* this message is fully queued */
-#define EF_CLRQUEUE    000010          /* disk copy is no longer needed */
-#define EF_SENDRECEIPT 000020          /* send a return receipt */
-#define EF_FATALERRS   000040          /* fatal errors occured */
-#define EF_KEEPQUEUE   000100          /* keep queue files always */
-#define EF_RESPONSE    000200          /* this is an error or return receipt */
-#define EF_RESENT      000400          /* this message is being forwarded */
-#define EF_VRFYONLY    001000          /* verify only (don't expand aliases) */
-#define EF_WARNING     002000          /* warning message has been sent */
-#define EF_QUEUERUN    004000          /* this envelope is from queue */
-#define EF_GLOBALERRS  010000          /* treat errors as global */
-#define EF_PM_NOTIFY   020000          /* send return mail to postmaster */
-#define EF_METOO       040000          /* send to me too */
+#define EF_OLDSTYLE    0x0000001       /* use spaces (not commas) in hdrs */
+#define EF_INQUEUE     0x0000002       /* this message is fully queued */
+#define EF_CLRQUEUE    0x0000008       /* disk copy is no longer needed */
+#define EF_SENDRECEIPT 0x0000010       /* send a return receipt */
+#define EF_FATALERRS   0x0000020       /* fatal errors occured */
+#define EF_KEEPQUEUE   0x0000040       /* keep queue files always */
+#define EF_RESPONSE    0x0000080       /* this is an error or return receipt */
+#define EF_RESENT      0x0000100       /* this message is being forwarded */
+#define EF_VRFYONLY    0x0000200       /* verify only (don't expand aliases) */
+#define EF_WARNING     0x0000400       /* warning message has been sent */
+#define EF_QUEUERUN    0x0000800       /* this envelope is from queue */
+#define EF_GLOBALERRS  0x0001000       /* treat errors as global */
+#define EF_PM_NOTIFY   0x0002000       /* send return mail to postmaster */
+#define EF_METOO       0x0004000       /* send to me too */
+#define EF_LOGSENDER   0x0008000       /* need to log the sender */
 
 EXTERN ENVELOPE        *CurEnv;        /* envelope currently being processed */
 \f/*
 
 EXTERN ENVELOPE        *CurEnv;        /* envelope currently being processed */
 \f/*
@@ -722,6 +727,17 @@ struct prival
 #define RF_COPYALL             (RF_COPYPARSE|RF_COPYPADDR)
 #define RF_COPYNONE            0
 
 #define RF_COPYALL             (RF_COPYPARSE|RF_COPYPADDR)
 #define RF_COPYNONE            0
 
+
+/*
+**  Flags passed to safefile.
+*/
+
+#define SFF_ANYFILE            0       /* no special restrictions */
+#define SFF_MUSTOWN            0x0001  /* user must own this file */
+#define SFF_NOSLINK            0x0002  /* file cannot be a symbolic link */
+#define SFF_ROOTOK             0x0004  /* ok for root to own this file */
+
+
 /*
 **  Regular UNIX sockaddrs are too small to handle ISO addresses, so
 **  we are forced to declare a supertype here.
 /*
 **  Regular UNIX sockaddrs are too small to handle ISO addresses, so
 **  we are forced to declare a supertype here.
@@ -730,7 +746,9 @@ struct prival
 union bigsockaddr
 {
        struct sockaddr         sa;     /* general version */
 union bigsockaddr
 {
        struct sockaddr         sa;     /* general version */
+#ifdef NETUNIX
        struct sockaddr_un      sunix;  /* UNIX family */
        struct sockaddr_un      sunix;  /* UNIX family */
+#endif
 #ifdef NETINET
        struct sockaddr_in      sin;    /* INET family */
 #endif
 #ifdef NETINET
        struct sockaddr_in      sin;    /* INET family */
 #endif
@@ -804,7 +822,7 @@ EXTERN bool SendMIMEErrors; /* send error messages in MIME format */
 EXTERN bool    MatchGecos;     /* look for user names in gecos field */
 EXTERN bool    UseErrorsTo;    /* use Errors-To: header (back compat) */
 EXTERN bool    TryNullMXList;  /* if we are the best MX, try host directly */
 EXTERN bool    MatchGecos;     /* look for user names in gecos field */
 EXTERN bool    UseErrorsTo;    /* use Errors-To: header (back compat) */
 EXTERN bool    TryNullMXList;  /* if we are the best MX, try host directly */
-EXTERN bool    CheckLoopBack;  /* check for loopback on HELO packet */
+extern bool    CheckLoopBack;  /* check for loopback on HELO packet */
 EXTERN bool    InChild;        /* true if running in an SMTP subprocess */
 EXTERN char    SpaceSub;       /* substitution for <lwsp> */
 EXTERN int     PrivacyFlags;   /* privacy flags */
 EXTERN bool    InChild;        /* true if running in an SMTP subprocess */
 EXTERN char    SpaceSub;       /* substitution for <lwsp> */
 EXTERN int     PrivacyFlags;   /* privacy flags */
@@ -825,13 +843,14 @@ EXTERN long       MaxMessageSize; /* advertised max size we will accept */
 EXTERN char    *PostMasterCopy;        /* address to get errs cc's */
 EXTERN int     CheckpointInterval;     /* queue file checkpoint interval */
 EXTERN bool    DontPruneRoutes;        /* don't prune source routes */
 EXTERN char    *PostMasterCopy;        /* address to get errs cc's */
 EXTERN int     CheckpointInterval;     /* queue file checkpoint interval */
 EXTERN bool    DontPruneRoutes;        /* don't prune source routes */
-EXTERN bool    BrokenSmtpPeers;        /* peers can't handle 2-line greeting */
+extern bool    BrokenSmtpPeers;        /* peers can't handle 2-line greeting */
 EXTERN int     MaxMciCache;            /* maximum entries in MCI cache */
 EXTERN time_t  MciCacheTimeout;        /* maximum idle time on connections */
 EXTERN char    *QueueLimitRecipient;   /* limit queue runs to this recipient */
 EXTERN char    *QueueLimitSender;      /* limit queue runs to this sender */
 EXTERN char    *QueueLimitId;          /* limit queue runs to this id */
 EXTERN FILE    *TrafficLogFile;        /* file in which to log all traffic */
 EXTERN int     MaxMciCache;            /* maximum entries in MCI cache */
 EXTERN time_t  MciCacheTimeout;        /* maximum idle time on connections */
 EXTERN char    *QueueLimitRecipient;   /* limit queue runs to this recipient */
 EXTERN char    *QueueLimitSender;      /* limit queue runs to this sender */
 EXTERN char    *QueueLimitId;          /* limit queue runs to this id */
 EXTERN FILE    *TrafficLogFile;        /* file in which to log all traffic */
+extern int     errno;
 
 
 /*
 
 
 /*
@@ -909,7 +928,8 @@ extern const char   *errstring __P((int));
 extern void            expand __P((char *, char *, char *, ENVELOPE *));
 extern void            define __P((int, char *, ENVELOPE *));
 extern char            *macvalue __P((int, ENVELOPE *));
 extern void            expand __P((char *, char *, char *, ENVELOPE *));
 extern void            define __P((int, char *, ENVELOPE *));
 extern char            *macvalue __P((int, ENVELOPE *));
-extern char            **prescan __P((char *, int, char[], char **));
+extern char            **prescan __P((char *, int, char[], int, char **));
+extern int             rewrite __P((char **, int, int, ENVELOPE *));
 extern char            *fgetfolded __P((char *, int, FILE *));
 extern ADDRESS         *recipient __P((ADDRESS *, ADDRESS **, ENVELOPE *));
 extern ENVELOPE                *newenvelope __P((ENVELOPE *, ENVELOPE *));
 extern char            *fgetfolded __P((char *, int, FILE *));
 extern ADDRESS         *recipient __P((ADDRESS *, ADDRESS **, ENVELOPE *));
 extern ENVELOPE                *newenvelope __P((ENVELOPE *, ENVELOPE *));
@@ -928,6 +948,8 @@ extern char         *hostsignature __P((MAILER *, char *, ENVELOPE *));
 extern void            openxscript __P((ENVELOPE *));
 extern void            closexscript __P((ENVELOPE *));
 extern sigfunc_t       setsignal __P((int, sigfunc_t));
 extern void            openxscript __P((ENVELOPE *));
 extern void            closexscript __P((ENVELOPE *));
 extern sigfunc_t       setsignal __P((int, sigfunc_t));
+extern char            *shortenstring __P((char *, int));
+extern bool            usershellok __P((char *));
 
 /* ellipsis is a different case though */
 #ifdef __STDC__
 
 /* ellipsis is a different case though */
 #ifdef __STDC__
index 4474cd5..2966f80 100644 (file)
@@ -36,9 +36,9 @@
 
 #ifndef lint
 #ifdef SMTP
 
 #ifndef lint
 #ifdef SMTP
-static char sccsid[] = "@(#)srvrsmtp.c 8.18 (Berkeley) 10/28/93 (with SMTP)";
+static char sccsid[] = "@(#)srvrsmtp.c 8.23 (Berkeley) 12/21/93 (with SMTP)";
 #else
 #else
-static char sccsid[] = "@(#)srvrsmtp.c 8.18 (Berkeley) 10/28/93 (without SMTP)";
+static char sccsid[] = "@(#)srvrsmtp.c 8.23 (Berkeley) 12/21/93 (without SMTP)";
 #endif
 #endif /* not lint */
 
 #endif
 #endif /* not lint */
 
@@ -114,6 +114,7 @@ static struct cmd   CmdTab[] =
 };
 
 bool   OneXact = FALSE;                /* one xaction only this run */
 };
 
 bool   OneXact = FALSE;                /* one xaction only this run */
+char   *CurSmtpClient;                 /* who's at the other end of channel */
 
 static char    *skipword();
 
 
 static char    *skipword();
 
@@ -147,7 +148,11 @@ smtp(e)
        }
        settime(e);
        CurHostName = RealHostName;
        }
        settime(e);
        CurHostName = RealHostName;
-       setproctitle("server %s startup", CurHostName);
+       CurSmtpClient = macvalue('_', e);
+       if (CurSmtpClient == NULL)
+               CurSmtpClient = RealHostName;
+
+       setproctitle("server %s startup", CurSmtpClient);
        expand("\201e", inp, &inp[sizeof inp], e);
        if (BrokenSmtpPeers)
        {
        expand("\201e", inp, &inp[sizeof inp], e);
        if (BrokenSmtpPeers)
        {
@@ -192,11 +197,11 @@ smtp(e)
                {
                        /* end of file, just die */
                        message("421 %s Lost input channel from %s",
                {
                        /* end of file, just die */
                        message("421 %s Lost input channel from %s",
-                               MyHostName, CurHostName);
+                               MyHostName, CurSmtpClient);
 #ifdef LOG
                        if (LogLevel > (gotmail ? 1 : 19))
                                syslog(LOG_NOTICE, "lost input channel from %s",
 #ifdef LOG
                        if (LogLevel > (gotmail ? 1 : 19))
                                syslog(LOG_NOTICE, "lost input channel from %s",
-                                       CurHostName);
+                                       CurSmtpClient);
 #endif
                        if (InChild)
                                ExitStat = EX_QUIT;
 #endif
                        if (InChild)
                                ExitStat = EX_QUIT;
@@ -211,9 +216,9 @@ smtp(e)
                        fprintf(e->e_xfp, "<<< %s\n", inp);
 
                if (e->e_id == NULL)
                        fprintf(e->e_xfp, "<<< %s\n", inp);
 
                if (e->e_id == NULL)
-                       setproctitle("%s: %s", CurHostName, inp);
+                       setproctitle("%s: %.80s", CurSmtpClient, inp);
                else
                else
-                       setproctitle("%s %s: %s", e->e_id, CurHostName, inp);
+                       setproctitle("%s %s: %.80s", e->e_id, CurSmtpClient, inp);
 
                /* break off command */
                for (p = inp; isascii(*p) && isspace(*p); p++)
 
                /* break off command */
                for (p = inp; isascii(*p) && isspace(*p); p++)
@@ -262,16 +267,13 @@ smtp(e)
                                auth_warning(e, "Host %s claimed to be %s",
                                        RealHostName, p);
                        }
                                auth_warning(e, "Host %s claimed to be %s",
                                        RealHostName, p);
                        }
-                       p = macvalue('_', e);
-                       if (p == NULL)
-                               p = RealHostName;
 
                        gothello = TRUE;
                        if (c->cmdcode != CMDEHLO)
                        {
                                /* print old message and be done with it */
                                message("250 %s Hello %s, pleased to meet you",
 
                        gothello = TRUE;
                        if (c->cmdcode != CMDEHLO)
                        {
                                /* print old message and be done with it */
                                message("250 %s Hello %s, pleased to meet you",
-                                       MyHostName, p);
+                                       MyHostName, CurSmtpClient);
                                break;
                        }
                        
                                break;
                        }
                        
@@ -332,7 +334,8 @@ smtp(e)
                        define('s', sendinghost, e);
                        initsys(e);
                        nrcpts = 0;
                        define('s', sendinghost, e);
                        initsys(e);
                        nrcpts = 0;
-                       setproctitle("%s %s: %s", e->e_id, CurHostName, inp);
+                       e->e_flags |= EF_LOGSENDER;
+                       setproctitle("%s %s: %.80s", e->e_id, CurSmtpClient, inp);
 
                        /* child -- go do the processing */
                        p = skipword(p, "from");
 
                        /* child -- go do the processing */
                        p = skipword(p, "from");
@@ -626,7 +629,12 @@ smtp(e)
                                if (vrfy)
                                        message("252 Who's to say?");
                                else
                                if (vrfy)
                                        message("252 Who's to say?");
                                else
-                                       message("502 That's none of your business");
+                                       message("502 Sorry, we do not allow this operation");
+#ifdef LOG
+                               if (LogLevel > 5)
+                                       syslog(LOG_INFO, "%s: %s [rejected]",
+                                               CurSmtpClient, inp);
+#endif
                                break;
                        }
                        else if (!gothello &&
                                break;
                        }
                        else if (!gothello &&
@@ -640,7 +648,7 @@ smtp(e)
                                break;
 #ifdef LOG
                        if (LogLevel > 5)
                                break;
 #ifdef LOG
                        if (LogLevel > 5)
-                               syslog(LOG_INFO, "%s: %s", CurHostName, inp);
+                               syslog(LOG_INFO, "%s: %s", CurSmtpClient, inp);
 #endif
                        vrfyqueue = NULL;
                        QuickAbort = TRUE;
 #endif
                        vrfyqueue = NULL;
                        QuickAbort = TRUE;
@@ -942,6 +950,9 @@ runinchild(label, e)
                        st = waitfor(childpid);
                        if (st == -1)
                                syserr("%s: lost child", label);
                        st = waitfor(childpid);
                        if (st == -1)
                                syserr("%s: lost child", label);
+                       else if (!WIFEXITED(st))
+                               syserr("%s: died on signal %d",
+                                       label, st & 0177);
 
                        /* if we exited on a QUIT command, complete the process */
                        if (st == (EX_QUIT << 8))
 
                        /* if we exited on a QUIT command, complete the process */
                        if (st == (EX_QUIT << 8))
index f079b44..46b9d65 100644 (file)
@@ -36,9 +36,9 @@
 
 #ifndef lint
 #ifdef USERDB
 
 #ifndef lint
 #ifdef USERDB
-static char sccsid [] = "@(#)udb.c     8.3 (Berkeley) 8/25/93 (with USERDB)";
+static char sccsid [] = "@(#)udb.c     8.4 (Berkeley) 11/25/93 (with USERDB)";
 #else
 #else
-static char sccsid [] = "@(#)udb.c     8.3 (Berkeley) 8/25/93 (without USERDB)";
+static char sccsid [] = "@(#)udb.c     8.4 (Berkeley) 11/25/93 (without USERDB)";
 #endif
 #endif
 
 #endif
 #endif
 
@@ -603,7 +603,7 @@ _udbx_init()
                                up->udb_addr.sin_family = h->h_addrtype;
                                bcopy(h->h_addr_list[0],
                                      (char *) &up->udb_addr.sin_addr,
                                up->udb_addr.sin_family = h->h_addrtype;
                                bcopy(h->h_addr_list[0],
                                      (char *) &up->udb_addr.sin_addr,
-                                     h->h_length);
+                                     sizeof up->udb_addr.sin_addr);
                                up->udb_addr.sin_port = UdbPort;
                                up->udb_timeout = UdbTimeout;
                                up++;
                                up->udb_addr.sin_port = UdbPort;
                                up->udb_timeout = UdbTimeout;
                                up++;
index 18510e4..14b2f7f 100644 (file)
@@ -36,9 +36,9 @@
 
 #ifndef lint
 #ifdef SMTP
 
 #ifndef lint
 #ifdef SMTP
-static char sccsid[] = "@(#)usersmtp.c 8.13 (Berkeley) 10/24/93 (with SMTP)";
+static char sccsid[] = "@(#)usersmtp.c 8.17 (Berkeley) 1/5/94 (with SMTP)";
 #else
 #else
-static char sccsid[] = "@(#)usersmtp.c 8.13 (Berkeley) 10/24/93 (without SMTP)";
+static char sccsid[] = "@(#)usersmtp.c 8.17 (Berkeley) 1/5/94 (without SMTP)";
 #endif
 #endif /* not lint */
 
 #endif
 #endif /* not lint */
 
@@ -218,8 +218,13 @@ tryhelo:
                        goto tempfail2;
        }
 
                        goto tempfail2;
        }
 
-       mci->mci_state = MCIS_OPEN;
-       return;
+       if (mci->mci_state != MCIS_CLOSED)
+       {
+               mci->mci_state = MCIS_OPEN;
+               return;
+       }
+
+       /* got a 421 error code during startup */
 
   tempfail1:
   tempfail2:
 
   tempfail1:
   tempfail2:
@@ -317,6 +322,7 @@ smtpmailfrom(m, mci, e)
        ENVELOPE *e;
 {
        int r;
        ENVELOPE *e;
 {
        int r;
+       char *bufp;
        char buf[MAXNAME];
        char optbuf[MAXLINE];
 
        char buf[MAXNAME];
        char optbuf[MAXLINE];
 
@@ -341,15 +347,25 @@ smtpmailfrom(m, mci, e)
                (void) strcpy(buf, "");
        else
                expand("\201g", buf, &buf[sizeof buf - 1], e);
                (void) strcpy(buf, "");
        else
                expand("\201g", buf, &buf[sizeof buf - 1], e);
+       if (buf[0] == '<')
+       {
+               /* strip off <angle brackets> (put back on below) */
+               bufp = &buf[strlen(buf) - 1];
+               if (*bufp == '>')
+                       *bufp = '\0';
+               bufp = &buf[1];
+       }
+       else
+               bufp = buf;
        if (e->e_from.q_mailer == LocalMailer ||
            !bitnset(M_FROMPATH, m->m_flags))
        {
        if (e->e_from.q_mailer == LocalMailer ||
            !bitnset(M_FROMPATH, m->m_flags))
        {
-               smtpmessage("MAIL From:<%s>%s", m, mci, buf, optbuf);
+               smtpmessage("MAIL From:<%s>%s", m, mci, bufp, optbuf);
        }
        else
        {
                smtpmessage("MAIL From:<@%s%c%s>%s", m, mci, MyHostName,
        }
        else
        {
                smtpmessage("MAIL From:<@%s%c%s>%s", m, mci, MyHostName,
-                       buf[0] == '@' ? ',' : ':', buf, optbuf);
+                       *bufp == '@' ? ',' : ':', bufp, optbuf);
        }
        SmtpPhase = mci->mci_phase = "client MAIL";
        setproctitle("%s %s: %s", e->e_id, CurHostName, mci->mci_phase);
        }
        SmtpPhase = mci->mci_phase = "client MAIL";
        setproctitle("%s %s: %s", e->e_id, CurHostName, mci->mci_phase);
@@ -594,7 +610,16 @@ smtpquit(m, mci, e)
        register MCI *mci;
        ENVELOPE *e;
 {
        register MCI *mci;
        ENVELOPE *e;
 {
-       int i;
+       bool oldSuprErrs = SuprErrs;
+
+       /*
+       **      Suppress errors here -- we may be processing a different
+       **      job when we do the quit connection, and we don't want the 
+       **      new job to be penalized for something that isn't it's
+       **      problem.
+       */
+
+       SuprErrs = TRUE;
 
        /* send the quit message if we haven't gotten I/O error */
        if (mci->mci_state != MCIS_ERROR)
 
        /* send the quit message if we haven't gotten I/O error */
        if (mci->mci_state != MCIS_ERROR)
@@ -602,14 +627,18 @@ smtpquit(m, mci, e)
                SmtpPhase = "client QUIT";
                smtpmessage("QUIT", m, mci);
                (void) reply(m, mci, e, TimeOuts.to_quit, NULL);
                SmtpPhase = "client QUIT";
                smtpmessage("QUIT", m, mci);
                (void) reply(m, mci, e, TimeOuts.to_quit, NULL);
+               SuprErrs = oldSuprErrs;
                if (mci->mci_state == MCIS_CLOSED)
                if (mci->mci_state == MCIS_CLOSED)
+               {
+                       SuprErrs = oldSuprErrs;
                        return;
                        return;
+               }
        }
 
        /* now actually close the connection and pick up the zombie */
        }
 
        /* now actually close the connection and pick up the zombie */
-       i = endmailer(mci, e, m->m_argv);
-       if (i != EX_OK)
-               syserr("451 smtpquit %s: stat %d", m->m_argv[0], i);
+       (void) endmailer(mci, e, NULL);
+
+       SuprErrs = oldSuprErrs;
 }
 \f/*
 **  SMTPRSET -- send a RSET (reset) command
 }
 \f/*
 **  SMTPRSET -- send a RSET (reset) command
index f296513..85e0f04 100644 (file)
@@ -33,7 +33,7 @@
  */
 
 #ifndef lint
  */
 
 #ifndef lint
-static char sccsid[] = "@(#)util.c     8.15 (Berkeley) 10/31/93";
+static char sccsid[] = "@(#)util.c     8.28 (Berkeley) 1/4/94";
 #endif /* not lint */
 
 # include "sendmail.h"
 #endif /* not lint */
 
 # include "sendmail.h"
@@ -407,7 +407,9 @@ buildfname(gecos, login, buf)
 **             gid -- group id to compare against.
 **             uname -- user name to compare against (used for group
 **                     sets).
 **             gid -- group id to compare against.
 **             uname -- user name to compare against (used for group
 **                     sets).
-**             mustown -- to be safe, this uid must own the file.
+**             flags -- modifiers:
+**                     SFF_MUSTOWN -- "uid" must own this file.
+**                     SFF_NOSLINK -- file cannot be a symbolic link.
 **             mode -- mode bits that must match.
 **
 **     Returns:
 **             mode -- mode bits that must match.
 **
 **     Returns:
@@ -433,12 +435,12 @@ buildfname(gecos, login, buf)
 #endif
 
 int
 #endif
 
 int
-safefile(fn, uid, gid, uname, mustown, mode)
+safefile(fn, uid, gid, uname, flags, mode)
        char *fn;
        uid_t uid;
        gid_t gid;
        char *uname;
        char *fn;
        uid_t uid;
        gid_t gid;
        char *uname;
-       bool mustown;
+       int flags;
        int mode;
 {
        register char *p;
        int mode;
 {
        register char *p;
@@ -446,8 +448,8 @@ safefile(fn, uid, gid, uname, mustown, mode)
        struct stat stbuf;
 
        if (tTd(54, 4))
        struct stat stbuf;
 
        if (tTd(54, 4))
-               printf("safefile(%s, uid=%d, gid=%d, mustown=%d, mode=%o):\n",
-                       fn, uid, gid, mustown, mode);
+               printf("safefile(%s, uid=%d, gid=%d, flags=%x, mode=%o):\n",
+                       fn, uid, gid, flags, mode);
        errno = 0;
 
        for (p = fn; (p = strchr(++p, '/')) != NULL; *p = '/')
        errno = 0;
 
        for (p = fn; (p = strchr(++p, '/')) != NULL; *p = '/')
@@ -455,6 +457,12 @@ safefile(fn, uid, gid, uname, mustown, mode)
                *p = '\0';
                if (stat(fn, &stbuf) < 0)
                        break;
                *p = '\0';
                if (stat(fn, &stbuf) < 0)
                        break;
+               if (uid == 0 && !bitset(SFF_ROOTOK, flags))
+               {
+                       if (bitset(S_IXOTH, stbuf.st_mode))
+                               continue;
+                       break;
+               }
                if (stbuf.st_uid == uid && bitset(S_IXUSR, stbuf.st_mode))
                        continue;
                if (stbuf.st_gid == gid && bitset(S_IXGRP, stbuf.st_mode))
                if (stbuf.st_uid == uid && bitset(S_IXUSR, stbuf.st_mode))
                        continue;
                if (stbuf.st_gid == gid && bitset(S_IXGRP, stbuf.st_mode))
@@ -488,7 +496,12 @@ safefile(fn, uid, gid, uname, mustown, mode)
                return ret;
        }
 
                return ret;
        }
 
+#ifdef HASLSTAT
+       if ((bitset(SFF_NOSLINK, flags) ? lstat(fn, &stbuf)
+                                       : stat(fn, &stbuf)) < 0)
+#else
        if (stat(fn, &stbuf) < 0)
        if (stat(fn, &stbuf) < 0)
+#endif
        {
                int ret = errno;
 
        {
                int ret = errno;
 
@@ -498,7 +511,17 @@ safefile(fn, uid, gid, uname, mustown, mode)
                errno = 0;
                return ret;
        }
                errno = 0;
                return ret;
        }
-       if (uid == 0)
+
+#ifdef S_ISLNK
+       if (bitset(SFF_NOSLINK, flags) && S_ISLNK(stbuf.st_mode))
+       {
+               if (tTd(54, 4))
+                       printf("\t[slink mode %o]\tEPERM\n", stbuf.st_mode);
+               return EPERM;
+       }
+#endif
+
+       if (uid == 0 && !bitset(SFF_ROOTOK, flags))
                mode >>= 6;
        else if (stbuf.st_uid != uid)
        {
                mode >>= 6;
        else if (stbuf.st_uid != uid)
        {
@@ -525,7 +548,8 @@ safefile(fn, uid, gid, uname, mustown, mode)
        if (tTd(54, 4))
                printf("\t[uid %d, stat %o, mode %o] ",
                        stbuf.st_uid, stbuf.st_mode, mode);
        if (tTd(54, 4))
                printf("\t[uid %d, stat %o, mode %o] ",
                        stbuf.st_uid, stbuf.st_mode, mode);
-       if ((stbuf.st_uid == uid || uid == 0 || !mustown) &&
+       if ((stbuf.st_uid == uid || stbuf.st_uid == 0 ||
+            !bitset(SFF_MUSTOWN, flags)) &&
            (stbuf.st_mode & mode) == mode)
        {
                if (tTd(54, 4))
            (stbuf.st_mode & mode) == mode)
        {
                if (tTd(54, 4))
@@ -836,12 +860,13 @@ sfgets(buf, siz, fp, timeout, during)
 
        /* try to read */
        p = NULL;
 
        /* try to read */
        p = NULL;
-       while (p == NULL && !feof(fp) && !ferror(fp))
+       while (!feof(fp) && !ferror(fp))
        {
                errno = 0;
                p = fgets(buf, siz, fp);
        {
                errno = 0;
                p = fgets(buf, siz, fp);
-               if (errno == EINTR)
-                       clearerr(fp);
+               if (p != NULL || errno != EINTR)
+                       break;
+               clearerr(fp);
        }
 
        /* clear the event if it has not sprung */
        }
 
        /* clear the event if it has not sprung */
@@ -1120,18 +1145,23 @@ strcontainedin(a, b)
        register char *a;
        register char *b;
 {
        register char *a;
        register char *b;
 {
-       int l;
-
-       l = strlen(a);
-       for (;;)
+       int la;
+       int lb;
+       int c;
+
+       la = strlen(a);
+       lb = strlen(b);
+       c = *a;
+       if (isascii(c) && isupper(c))
+               c = tolower(c);
+       for (; lb-- >= la; b++)
        {
        {
-               b = strchr(b, a[0]);
-               if (b == NULL)
-                       return FALSE;
-               if (strncmp(a, b, l) == 0)
+               if (*b != c && isascii(*b) && isupper(*b) && tolower(*b) != c)
+                       continue;
+               if (strncasecmp(a, b, la) == 0)
                        return TRUE;
                        return TRUE;
-               b++;
        }
        }
+       return FALSE;
 }
 \f/*
 **  CHECKFD012 -- check low numbered file descriptors
 }
 \f/*
 **  CHECKFD012 -- check low numbered file descriptors
@@ -1279,6 +1309,27 @@ dumpfd(fd, printclosed, logit)
                p += strlen(p);
                goto defprint;
 
                p += strlen(p);
                goto defprint;
 
+#ifdef S_IFIFO
+         case S_IFIFO:
+               sprintf(p, "FIFO: ");
+               p += strlen(p);
+               goto defprint;
+#endif
+
+#ifdef S_IFDIR
+         case S_IFDIR:
+               sprintf(p, "DIR: ");
+               p += strlen(p);
+               goto defprint;
+#endif
+
+#ifdef S_IFLNK
+         case S_IFLNK:
+               sprintf(p, "LNK: ");
+               p += strlen(p);
+               goto defprint;
+#endif
+
          default:
 defprint:
                sprintf(p, "dev=%d/%d, ino=%d, nlink=%d, u/gid=%d/%d, size=%ld",
          default:
 defprint:
                sprintf(p, "dev=%d/%d, ino=%d, nlink=%d, u/gid=%d/%d, size=%ld",
@@ -1289,7 +1340,56 @@ defprint:
 
 printit:
        if (logit)
 
 printit:
        if (logit)
-               syslog(LOG_INFO, "%s", buf);
+               syslog(LOG_DEBUG, "%s", buf);
        else
                printf("%s\n", buf);
 }
        else
                printf("%s\n", buf);
 }
+\f/*
+**  SHORTENSTRING -- return short version of a string
+**
+**     If the string is already short, just return it.  If it is too
+**     long, return the head and tail of the string.
+**
+**     Parameters:
+**             s -- the string to shorten.
+**             m -- the max length of the string.
+**
+**     Returns:
+**             Either s or a short version of s.
+*/
+
+#ifndef MAXSHORTSTR
+# define MAXSHORTSTR   203
+#endif
+
+char *
+shortenstring(s, m)
+       register char *s;
+       int m;
+{
+       int l;
+       static char buf[MAXSHORTSTR + 1];
+
+       l = strlen(s);
+       if (l < m)
+               return s;
+       if (m > MAXSHORTSTR)
+               m = MAXSHORTSTR;
+       else if (m < 10)
+       {
+               if (m < 5)
+               {
+                       strncpy(buf, s, m);
+                       buf[m] = '\0';
+                       return buf;
+               }
+               strncpy(buf, s, m - 3);
+               strcpy(buf + m - 3, "...");
+               return buf;
+       }
+       m = (m - 3) / 2;
+       strncpy(buf, s, m);
+       strcpy(buf + m, "...");
+       strcpy(buf + m + 3, s + l - m);
+       return buf;
+}
index 77760ef..3169f6a 100644 (file)
@@ -33,7 +33,7 @@
  */
 
 #ifndef lint
  */
 
 #ifndef lint
-static char sccsid[] = "@(#)version.c  8.6.1.4 (Berkeley) 10/31/93";
+static char sccsid[] = "@(#)version.c  8.6.1.5 (Berkeley) 1/13/94";
 #endif /* not lint */
 
 #endif /* not lint */
 
-char   Version[] = "8.6.4";
+char   Version[] = "8.6.5";