*** KNOWNBUGS.OLD Sun Nov 7 10:28:55 1993 --- KNOWNBUGS Wed Jan 12 06:00:44 1994 *************** *** 1,7 **** K N O W N B U G S I N S E N D M A I L ! (for 8.6.3) The following are bugs or deficiencies in sendmail that I am aware of --- 1,7 ---- K N O W N B U G S I N S E N D M A I L ! (for 8.6.5) The following are bugs or deficiencies in sendmail that I am aware of *************** *** 9,23 **** 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 - 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. Sendmail should handle full binary data. As it stands, it handles --- 9,25 ---- want to get the most up to date version of this from FTP.CS.Berkeley.EDU in /ucb/sendmail/KNOWNBUGS. ! 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 | + +----------------------------------------------+ + + * Null bytes are not handled properly. Sendmail should handle full binary data. As it stands, it handles *************** *** 26,37 **** 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 --- 28,33 ---- *************** *** 56,59 **** this address. It's not clear what the right behaviour is in this circumstance. ! (Version 8.9, last updated 10/31/93) --- 52,171 ---- this address. It's not clear what the right behaviour is in this circumstance. ! * 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
'' 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) *** READ_ME.OLD Thu Nov 25 07:55:57 1993 --- READ_ME Tue Jan 4 07:52:09 1994 *************** *** 1,5 **** /*- ! * @(#)READ_ME 8.5 (Berkeley) 9/28/93 */ SENDMAIL RELEASE 8 --- 1,5 ---- /*- ! * @(#)READ_ME 8.8 (Berkeley) 1/4/94 */ SENDMAIL RELEASE 8 *************** *** 41,46 **** --- 41,83 ---- 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 | +--------------+ *************** *** 96,101 **** --- 133,169 ---- faster, and the interface is nicer to animals and plants. You will 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. + + + +-------------+ + | 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. +---------------------+ *** RELEASE_NOTES.OLD Sun Nov 7 10:29:11 1993 --- RELEASE_NOTES Thu Jan 13 06:45:11 1994 *************** *** 1,3 **** --- 1,287 ---- + 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 around + them in non-SMTP envelopes (SMTP envelopes already do + this properly). + Avoid wierd headers on unbalanced punctuation of the form: + ``Joe User ; 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 + ). + 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 + 8.6.4/8.6.4 93/10/31 Repair core-dump problem (write to read-only memory segment) if you fall back to the return-to-Postmaster case in *** cf/README.OLD Mon Nov 8 13:14:32 1993 --- cf/README Wed Jan 12 06:19:02 1994 *************** *** 4,10 **** Eric Allman ! @(#)README 8.15 (Berkeley) 10/31/93 This document describes the sendmail configuration files being used --- 4,10 ---- Eric Allman ! @(#)README 8.21 (Berkeley) 1/12/94 This document describes the sendmail configuration files being used *************** *** 31,40 **** 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.] 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 --- 31,39 ---- 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 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 *************** *** 52,58 **** --- 51,64 ---- 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 | +--------------------------+ *************** *** 186,193 **** 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 --- 192,197 ---- *************** *** 241,252 **** 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 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. usenet Usenet (network news) delivery. If this is specified, an extra rule is added to ruleset 0 that forwards all --- 245,259 ---- 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-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. ! 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 *************** *** 258,264 **** --- 265,273 ---- on Sam Leffler's FlexFAX software. For more information, see below. + pop Post Office Protocol. + +----------+ | FEATURES | +----------+ *************** *** 433,438 **** --- 442,533 ---- 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 | +-------------------+ *************** *** 826,832 **** --- 921,934 ---- 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 + ================ ======= ======= =========== confMAILER_NAME MAILER-DAEMON Dn The sender name used for internally generated outgoing messages. *************** *** 846,853 **** SMTP mail. confBLANK_SUB . OB Blank (space) substitution character. ! confCON_EXPENSIVE False Oc Connect immediately to ! mailers marked expensive? confCHECKPOINT_INTERVAL 10 OC Checkpoint queue files every N recipients. confDELIVERY_MODE background Od Default delivery mode. --- 948,955 ---- SMTP mail. confBLANK_SUB . OB Blank (space) substitution character. ! 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. *************** *** 1019,1026 **** MAILERS 0 local, prog local and program mailers ! 1 smtp SMTP channel ! 2 uucp UNIX-to-UNIX Copy Program 3 netnews Network News delivery 4 fax Sam Leffler's FlexFAX software --- 1121,1128 ---- MAILERS 0 local, prog local and program mailers ! 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 *************** *** 1029,1035 **** A B Bitnet Relay ! C CSNET Relay D The local domain -- usually not needed E F FAX Relay --- 1131,1137 ---- A B Bitnet Relay ! C D The local domain -- usually not needed E F FAX Relay *** cf/cf/Makefile.OLD Wed Dec 1 11:54:48 1993 --- cf/cf/Makefile Wed Dec 1 11:55:31 1993 *************** *** 1,4 **** ! # @(#)Makefile 8.4 (Berkeley) 10/15/93 M4= m4 #M4= /usr/src/usr.bin/m4/obj/m4 --- 1,4 ---- ! # @(#)Makefile 8.5 (Berkeley) 12/1/93 M4= m4 #M4= /usr/src/usr.bin/m4/obj/m4 *************** *** 15,20 **** --- 15,21 ---- 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 \ *** cf/domain/Berkeley.m4.OLD Tue Oct 5 13:28:20 1993 --- cf/domain/Berkeley.m4 Mon Dec 20 10:49:11 1993 *************** *** 33,42 **** # SUCH DAMAGE. # divert(0) ! VERSIONID(`@(#)Berkeley.m4 8.3 (Berkeley) 10/5/93') 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 --- 33,41 ---- # SUCH DAMAGE. # divert(0) ! VERSIONID(`@(#)Berkeley.m4 8.4 (Berkeley) 12/20/93') define(`UUCP_RELAY', `ucbvax.Berkeley.EDU')dnl define(`BITNET_RELAY', `jade.Berkeley.EDU')dnl define(`confFORWARD_PATH', `$z/.forward.$w:$z/.forward')dnl define(`confCW_FILE', `-o /etc/sendmail.cw')dnl FEATURE(redirect)dnl *** cf/feature/bitdomain.m4.OLD Tue Nov 30 08:58:24 1993 --- cf/feature/bitdomain.m4 Tue Nov 30 09:01:07 1993 *************** *** 34,40 **** # divert(0) ! VERSIONID(`@(#)bitdomain.m4 8.3 (Berkeley) 8/7/93') divert(-1) --- 34,40 ---- # divert(0) ! VERSIONID(`@(#)bitdomain.m4 8.4 (Berkeley) 11/30/93') divert(-1) *************** *** 45,49 **** PUSHDIVERT(8) # handle BITNET mapping ! R$* < @ $+ .BITNET > $* $: $1 < @ $(bitdomain $2 $: $2.BITNET $) > $3 POPDIVERT --- 45,49 ---- PUSHDIVERT(8) # handle BITNET mapping ! R$* < @ $+ .BITNET. > $* $: $1 < @ $(bitdomain $2 $: $2.BITNET. $) > $3 POPDIVERT *** cf/feature/redirect.m4.OLD Mon Jun 7 10:10:46 1993 --- cf/feature/redirect.m4 Mon Dec 27 14:48:46 1993 *************** *** 34,46 **** # divert(0) ! VERSIONID(`@(#)redirect.m4 8.1 (Berkeley) 6/7/93') 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> POPDIVERT PUSHDIVERT(6) --- 34,46 ---- # divert(0) ! 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 ! R$* < @ $+ .REDIRECT. > $# error $@ NOUSER $: "551 User not local; please try " <$1@$2> POPDIVERT PUSHDIVERT(6) *** cf/feature/uucpdomain.m4.OLD Tue Nov 30 07:18:13 1993 --- cf/feature/uucpdomain.m4 Tue Nov 30 09:01:08 1993 *************** *** 34,40 **** # divert(0) ! VERSIONID(`@(#)uucpdomain.m4 8.3 (Berkeley) 8/7/93') divert(-1) --- 34,40 ---- # divert(0) ! VERSIONID(`@(#)uucpdomain.m4 8.4 (Berkeley) 11/30/93') divert(-1) *************** *** 45,49 **** PUSHDIVERT(8) # handle UUCP mapping ! R$* < @ $+ .UUCP > $* $: $1 < @ $(uudomain $2 $: $2.UUCP $) > $3 POPDIVERT --- 45,49 ---- PUSHDIVERT(8) # handle UUCP mapping ! R$* < @ $+ .UUCP. > $* $: $1 < @ $(uudomain $2 $: $2.UUCP. $) > $3 POPDIVERT *** cf/m4/cf.m4.OLD Sun Jul 18 10:58:54 1993 --- cf/m4/cf.m4 Fri Dec 24 06:34:40 1993 *************** *** 51,56 **** --- 51,57 ---- changecom() undefine(`format') + undefine(`hpux') ifdef(`pushdef', `', `errprint(`You need a newer version of M4, at least as new as System V or GNU') *************** *** 92,98 **** define(`SITECONFIG', `CONCAT(D, $3, $2) define(`_CLASS_$3_', `')dnl ! ifelse($3, U, Cw$2, `dnl') define(`SITE', `ifelse(CONCAT($'2`, $3), SU, CONCAT(CY, $'1`), CONCAT(C, $3, $'1`))') --- 93,99 ---- define(`SITECONFIG', `CONCAT(D, $3, $2) define(`_CLASS_$3_', `')dnl ! ifelse($3, U, Cw$2 $2.UUCP, `dnl') define(`SITE', `ifelse(CONCAT($'2`, $3), SU, CONCAT(CY, $'1`), CONCAT(C, $3, $'1`))') *************** *** 145,148 **** define(`confTRY_NULL_MX_LIST', `False') divert(0)dnl ! VERSIONID(`@(#)cf.m4 8.2 (Berkeley) 7/18/93') --- 146,149 ---- define(`confTRY_NULL_MX_LIST', `False') divert(0)dnl ! VERSIONID(`@(#)cf.m4 8.4 (Berkeley) 12/24/93') *** cf/m4/proto.m4.OLD Tue Nov 23 09:55:51 1993 --- cf/m4/proto.m4 Thu Jan 13 06:40:24 1994 *************** *** 34,40 **** # divert(0) ! VERSIONID(`@(#)proto.m4 8.20 (Berkeley) 10/31/93') MAILER(local)dnl --- 34,40 ---- # divert(0) ! VERSIONID(`@(#)proto.m4 8.30 (Berkeley) 1/12/94') MAILER(local)dnl *************** *** 93,104 **** CPBITNET ')dnl - ifdef(`CSNET_RELAY', - `# CSNET relay host - DC`'CSNET_RELAY - CPCSNET - - ')dnl ifdef(`FAX_RELAY', `# FAX relay host DF`'FAX_RELAY --- 93,98 ---- *************** *** 185,191 **** # substitution for space (blank) characters OB`'confBLANK_SUB ! # connect to "expensive" mailers on initial submission? Oc`'confCON_EXPENSIVE # checkpoint queue runs after every N successful deliveries --- 179,185 ---- # substitution for space (blank) characters OB`'confBLANK_SUB ! # avoid connecting to "expensive" mailers on initial submission? Oc`'confCON_EXPENSIVE # checkpoint queue runs after every N successful deliveries *************** *** 420,425 **** --- 414,422 ---- 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 *************** *** 458,488 **** ifdef(`_NO_UUCP_', `dnl', `ifdef(`UUCP_RELAY', `# pass UUCP addresses straight through ! R$* < @ $+ . UUCP > $* $@ $1 < @ $2 . UUCP > $3', `# if really UUCP, handle it immediately ifdef(`_CLASS_U_', ! `R$* < @ $=U . UUCP > $* $@ $1 < @ $2 . UUCP > $3', `dnl') ifdef(`_CLASS_V_', ! `R$* < @ $=V . UUCP > $* $@ $1 < @ $2 . UUCP > $3', `dnl') ifdef(`_CLASS_W_', ! `R$* < @ $=W . UUCP > $* $@ $1 < @ $2 . UUCP > $3', `dnl') ifdef(`_CLASS_X_', ! `R$* < @ $=X . UUCP > $* $@ $1 < @ $2 . UUCP > $3', `dnl') ifdef(`_CLASS_Y_', ! `R$* < @ $=Y . UUCP > $* $@ $1 < @ $2 . UUCP > $3', `dnl') # try UUCP traffic as a local address ! R$* < @ $+ . UUCP > $* $: $1 < @ $[ $2 $] . UUCP > $3 ifdef(`_OLD_SENDMAIL_', ! `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', `# pass to name server to make hostname canonical R$* < @ $* $~P > $* $: $1 < @ $[ $2 $3 $] > $4') undivert(8)dnl # if this is the local hostname, make sure we treat is as canonical --- 455,488 ---- ifdef(`_NO_UUCP_', `dnl', `ifdef(`UUCP_RELAY', `# pass UUCP addresses straight through ! R$* < @ $+ . UUCP > $* $@ $1 < @ $2 . UUCP . > $3', `# if really UUCP, handle it immediately ifdef(`_CLASS_U_', ! `R$* < @ $=U . UUCP > $* $@ $1 < @ $2 . UUCP . > $3', `dnl') ifdef(`_CLASS_V_', ! `R$* < @ $=V . UUCP > $* $@ $1 < @ $2 . UUCP . > $3', `dnl') ifdef(`_CLASS_W_', ! `R$* < @ $=W . UUCP > $* $@ $1 < @ $2 . UUCP . > $3', `dnl') ifdef(`_CLASS_X_', ! `R$* < @ $=X . UUCP > $* $@ $1 < @ $2 . UUCP . > $3', `dnl') ifdef(`_CLASS_Y_', ! `R$* < @ $=Y . UUCP > $* $@ $1 < @ $2 . UUCP . > $3', `dnl') # try UUCP traffic as a local address ! R$* < @ $+ . UUCP > $* $: $1 < @ $[ $2 $] . UUCP . > $3 ifdef(`_OLD_SENDMAIL_', ! `R$* < @ $+ . $+ . UUCP . > $* $@ $1 < @ $2 . $3 . > $4', ! `R$* < @ $+ . . UUCP . > $* $@ $1 < @ $2 . > $3')') ') ! ifdef(`_NO_CANONIFY_', `dnl', `# 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 *************** *** 534,539 **** --- 534,540 ---- 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 *************** *** 540,546 **** 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', `dnl') # now delete the local info -- note $=O to find characters that cause forwarding --- 541,547 ---- 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', `dnl') # now delete the local info -- note $=O to find characters that cause forwarding *************** *** 564,570 **** 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 ifdef(`_OLD_SENDMAIL_', `R$+ < $+ @ $-:$+ > $# $3 $@ $4 $: $1 < $2 > yep .... R$+ < $+ @ $+ > $#relay $@ $3 $: $1 < $2 > yep .... --- 565,571 ---- 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 ifdef(`_OLD_SENDMAIL_', `R$+ < $+ @ $-:$+ > $# $3 $@ $4 $: $1 < $2 > yep .... R$+ < $+ @ $+ > $#relay $@ $3 $: $1 < $2 > yep .... *************** *** 576,614 **** ifdef(`_NO_UUCP_', `dnl', `# resolve remotely connected UUCP links (if any) ifdef(`_CLASS_V_', ! `R$* < @ $=V . UUCP > $* $: $>_SET_95_ < $V > $1 <@$2.UUCP> $3', `dnl') ifdef(`_CLASS_W_', ! `R$* < @ $=W . UUCP > $* $: $>_SET_95_ < $W > $1 <@$2.UUCP> $3', `dnl') ifdef(`_CLASS_X_', ! `R$* < @ $=X . UUCP > $* $: $>_SET_95_ < $X > $1 <@$2.UUCP> $3', `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', `dnl') ! ifdef(`CSNET_RELAY', ! `R$*<@$+.CSNET>$* $: $>_SET_95_ < $C > $1 <@$2.CSNET> $3 user@host.CSNET', `dnl') ifdef(`_MAILER_fax_', ! `R$+ < @ $+ .FAX > $#fax $@ $2 $: $1 user@host.FAX', `ifdef(`FAX_RELAY', ! `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 ! R$*<@$*.UUCP>$* $: $>_SET_95_ < $Y > $1 @ <$2.UUCP> $3 uucp mail', `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', `dnl')') ifdef(`_MAILER_usenet_', ` # addresses sent to net.group.USENET will get forwarded to a newsgroup ! R$+ . USENET $#usenet $: $1', `dnl') ifdef(`_LOCAL_RULES_', --- 577,614 ---- ifdef(`_NO_UUCP_', `dnl', `# resolve remotely connected UUCP links (if any) ifdef(`_CLASS_V_', ! `R$* < @ $=V . UUCP . > $* $: $>_SET_95_ < $V > $1 <@$2.UUCP.> $3', `dnl') ifdef(`_CLASS_W_', ! `R$* < @ $=W . UUCP . > $* $: $>_SET_95_ < $W > $1 <@$2.UUCP.> $3', `dnl') ifdef(`_CLASS_X_', ! `R$* < @ $=X . UUCP . > $* $: $>_SET_95_ < $X > $1 <@$2.UUCP.> $3', `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', `dnl') ! ifdef(`_MAILER_pop_', ! `R$+ < @ POP. > $#pop $: $1 user@POP', `dnl') ifdef(`_MAILER_fax_', ! `R$+ < @ $+ .FAX. > $#fax $@ $2 $: $1 user@host.FAX', `ifdef(`FAX_RELAY', ! `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 ! R$*<@$*.UUCP.>$* $: $>_SET_95_ < $Y > $1 <@$2.UUCP.> $3 uucp mail', `ifdef(`_MAILER_uucp_', `# forward other UUCP traffic straight to 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 ! R$+ . USENET. $#usenet $: $1', `dnl') ifdef(`_LOCAL_RULES_', *** cf/m4/version.m4.OLD Tue Nov 30 08:59:13 1993 --- cf/m4/version.m4 Thu Jan 13 06:42:08 1994 *************** *** 32,39 **** # 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') # divert(0) # Configuration version number ! DZ8.6.4 --- 32,39 ---- # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF # SUCH DAMAGE. # ! VERSIONID(`@(#)version.m4 8.6.1.5 (Berkeley) 1/13/94') # divert(0) # Configuration version number ! DZ8.6.5 *** cf/mailer/pop.m4.OLD Tue Dec 14 14:29:44 1993 --- cf/mailer/pop.m4 Wed Dec 15 06:36:42 1993 *************** *** 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 *** cf/mailer/smtp.m4.OLD Wed Nov 10 07:02:30 1993 --- cf/mailer/smtp.m4 Mon Dec 27 14:49:22 1993 *************** *** 40,52 **** ### SMTP Mailer specification ### ##################################### ! VERSIONID(`@(#)smtp.m4 8.7 (Berkeley) 10/31/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 ! Mrelay, P=[IPC], F=CONCAT(mDFMuXa, SMTP_MAILER_FLAGS), S=11/31, R=51, E=\r\n, ifdef(`_OLD_SENDMAIL_',, `L=2040, ')A=IPC $h # --- 40,52 ---- ### SMTP Mailer specification ### ##################################### ! 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 ! 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 # *************** *** 55,66 **** S11 R$+ $: $>51 $1 sender/recipient common R$* :; <@> $@ $1 :; list:; special case - # handle unqualified names - R$* < @ $* > $* $@ $1 < @ $2 > $3 already qualified - R$* $@ $>61 $1 - # # header recipient rewriting if not masquerading recipients # --- 55,63 ---- S11 R$+ $: $>51 $1 sender/recipient common R$* :; <@> $@ $1 :; list:; special case + R$* $@ $>61 $1 qualify unqual'ed names # # header recipient rewriting if not masquerading recipients # *************** *** 87,100 **** 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 - # ! # common rewriting for all SMTP addresses # S51 --- 84,94 ---- R$=E < @ $=w . > $@ $1 < @ $2 > exposed user as is R$* < @ $=w . > $: $1 < @ $M > masquerade as domain R$* < @ > $: $1 < @ $j > in case $M undefined + R$* $@ $>61 $1 qualify unqual'ed names # ! # convert pseudo-domain addresses to real domain addresses # S51 *************** *** 103,124 **** # output fake domains as user%fake@relay ifdef(`BITNET_RELAY', ! `R$+ <@ $+ . BITNET > $: $1 % $2 .BITNET < @ $B > user@host.BITNET 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') # # common sender and masquerading recipient rewriting # S61 R$=E $@ $1 < @ $j> show exposed names R$+ $: $1 < @ $M > user w/o host R$+ <@> $: $1 < @ $j > in case $M undefined --- 97,125 ---- # output fake domains as user%fake@relay ifdef(`BITNET_RELAY', ! `R$+ <@ $+ .BITNET. > $: $1 % $2 .BITNET < @ $B > user@host.BITNET R$+.BITNET <@ $+:$+ > $: $1 .BITNET < @ $3 > strip mailer: part', `dnl') ! 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') + # # common sender and masquerading recipient rewriting # 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 *** cf/mailer/uucp.m4.OLD Thu Nov 11 06:21:23 1993 --- cf/mailer/uucp.m4 Mon Jan 10 08:01:11 1994 *************** *** 42,60 **** ### UUCP Mailer specification ### ##################################### ! VERSIONID(`@(#)uucp.m4 8.6 (Berkeley) 10/31/93') ! # old UUCP mailer Muucp, 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) Msuucp, 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, A=UUCP_MAILER_ARGS') --- 42,73 ---- ### UUCP Mailer specification ### ##################################### ! VERSIONID(`@(#)uucp.m4 8.13 (Berkeley) 1/10/94') ! # ! # 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-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) (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 + 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, + 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') *************** *** 70,79 **** R$* :; <@> $@ $1 :; R$* < @ $* . > $1 < @ $2 > strip trailing dots ! R$* < @ $j > $1 strip local name R$* < @ $- . UUCP > $2 ! $1 convert to UUCP format R$* < @ $+ > $2 ! $1 convert to UUCP format R$+ $: $U ! $1 prepend our name # # envelope and header recipient rewriting --- 83,97 ---- 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$+ $: $U ! $1 prepend our name + R! $+ $: $k ! $1 in case $U undefined # # envelope and header recipient rewriting *************** *** 81,95 **** S22 # don't touch list:; syntax ! R$* :; <@> $@ $1 ;: R$* < @ $* . > $1 < @ $2 > strip trailing dots R$* < @ $j > $1 strip local name R$* < @ $- . UUCP > $2 ! $1 convert to UUCP format R$* < @ $+ > $2 ! $1 convert to UUCP format ! # # envelope sender rewriting for uucp-dom mailer # S52 --- 99,120 ---- S22 # don't touch list:; syntax ! R$* :; <@> $@ $1 :; 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$&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 *************** *** 100,112 **** # pass everything to standard SMTP mailer rewriting R$* $@ $>11 $1 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 POPDIVERT --- 125,157 ---- # 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 ! 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 *** cf/ostype/bsdi1.0.m4.OLD Sat Dec 11 13:05:45 1993 --- cf/ostype/bsdi1.0.m4 Sat Dec 11 13:05:41 1993 *************** *** 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) *** cf/ostype/dgux.m4.OLD Sat Nov 27 09:28:04 1993 --- cf/ostype/dgux.m4 Sat Nov 27 09:25:45 1993 *************** *** 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 *** cf/ostype/dynix3.2.m4.OLD Sat Nov 27 14:28:30 1993 --- cf/ostype/dynix3.2.m4 Sat Nov 27 14:28:24 1993 *************** *** 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 *** cf/ostype/hpux.m4.OLD Tue Aug 24 20:31:55 1993 --- cf/ostype/hpux.m4 Sun Jan 9 09:50:51 1994 *************** *** 34,43 **** # divert(0) ! VERSIONID(`@(#)hpux.m4 8.4 (Berkeley) 8/24/93') 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(`confTIME_ZONE', `USE_TZ')dnl --- 34,44 ---- # divert(0) ! 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(`UUCP_MAILER_ARGS', `uux - -r -a$f -gC $h!rmail ($u)')dnl define(`confTIME_ZONE', `USE_TZ')dnl *** cf/ostype/irix.m4.OLD Sat Nov 27 09:28:44 1993 --- cf/ostype/irix.m4 Sat Nov 27 09:29:26 1993 *************** *** 34,38 **** # divert(0) ! VERSIONID(`@(#)irix.m4 8.2 (Berkeley) 8/8/93') define(`LOCAL_MAILER_FLAGS', Ehmu)dnl --- 34,41 ---- # divert(0) ! VERSIONID(`@(#)irix.m4 8.3 (Berkeley) 11/27/93') 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 *** cf/ostype/nextstep.m4.OLD Wed Nov 10 17:07:58 1993 --- cf/ostype/nextstep.m4 Tue Nov 30 09:01:49 1993 *************** *** 34,42 **** # divert(0) ! VERSIONID(`@(#)nextstep.m4 8.3 (Berkeley) 8/13/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 --- 34,44 ---- # divert(0) ! 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(`LOCAL_MAILER_FLAGS', `rmnP')dnl + define(`LOCAL_SHELL_FLAGS', `euP')dnl *** cf/ostype/riscos4.5.m4.OLD Wed Dec 1 07:54:37 1993 --- cf/ostype/riscos4.5.m4 Wed Dec 1 08:44:17 1993 *************** *** 34,37 **** # divert(0) ! VERSIONID(`@(#)riscos4.5.m4 8.1 (Berkeley) 6/7/93') --- 34,42 ---- # divert(0) ! 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 *** cf/ostype/sco3.2.m4.OLD Sat Nov 27 10:29:19 1993 --- cf/ostype/sco3.2.m4 Sat Nov 27 10:29:10 1993 *************** *** 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 *** doc/op/op.me.OLD Fri Nov 12 09:44:20 1993 --- doc/op/op.me Wed Jan 12 06:52:00 1994 *************** *** 30,36 **** .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" ! .\" @(#)op.me 8.26 (Berkeley) 10/14/93 .\" .\" eqn op.me | pic | troff -me .eh 'SMM:08-%''Sendmail Installation and Operation Guide' --- 30,36 ---- .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" ! .\" @(#)op.me 8.32 (Berkeley) 1/12/94 .\" .\" eqn op.me | pic | troff -me .eh 'SMM:08-%''Sendmail Installation and Operation Guide' *************** *** 69,75 **** Mammoth Project eric@CS.Berkeley.EDU .sp ! Version 8.26 .sp For Sendmail Version 8.6 .)l --- 69,75 ---- Mammoth Project eric@CS.Berkeley.EDU .sp ! Version 8.32 .sp For Sendmail Version 8.6 .)l *************** *** 185,191 **** on 4.4BSD. .pp If you are loading this off the tape, ! continue with the next session. If you have a running binary already on your system, you should probably skip to section 1.2. .sh 2 "Compiling Sendmail" --- 185,191 ---- on 4.4BSD. .pp If you are loading this off the tape, ! 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" *************** *** 576,590 **** of this document. .sh 3 "/usr/\*(SB/newaliases" .pp ! If you are running delivermail, ! it is critical that the .i newaliases ! command be replaced. ! This can just be a link to .i sendmail : .(b rm \-f /usr/\*(SB/newaliases ! ln /usr/\*(SD/sendmail /usr/\*(SB/newaliases .)b This can be installed in whatever search path you prefer for your system. --- 576,588 ---- of this document. .sh 3 "/usr/\*(SB/newaliases" .pp ! The .i newaliases ! command should just be a link to .i sendmail : .(b rm \-f /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. *************** *** 808,813 **** --- 806,816 ---- 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 *************** *** 994,999 **** --- 997,1012 ---- .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 *************** *** 1074,1084 **** .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. .)f .sh 3 "List owners" .pp --- 1087,1093 ---- .q a option is required in the configuration for this action to occur. ! This should normally be specified. .)f .sh 3 "List owners" .pp *************** *** 1438,1443 **** --- 1447,1464 ---- .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 *************** *** 2381,2387 **** .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 .i default is inserted; if no default is specified and no lookup matches, --- 2402,2408 ---- .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 indicated .i default is inserted; if no default is specified and no lookup matches, *************** *** 2444,2455 **** may be a colon-separated list of hosts that are searched in order for the first working address (exactly like MX records). .pp A RHS may also be preceded by a .b $@ or a .b $: ! to control evaluation. A .b $@ prefix causes the ruleset to return with the remainder of the RHS --- 2465,2485 ---- 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 + 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 $: ! to change this behavior. A .b $@ prefix causes the ruleset to return with the remainder of the RHS *************** *** 2794,2800 **** Defaults to .q MAILER-DAEMON . .ip $o\(dg ! .b "The set of "operators" in addresses." A list of characters which will be considered tokens and which will separate tokens --- 2824,2830 ---- Defaults to .q MAILER-DAEMON . .ip $o\(dg ! .b "The set of \*(lqoperators\*(rq in addresses." A list of characters which will be considered tokens and which will separate tokens *************** *** 3109,3114 **** --- 3139,3165 ---- 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 *************** *** 3698,3704 **** .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 either this invocation of .i sendmail needs to connect to another host --- 3749,3755 ---- .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 current connection until either this invocation of .i sendmail needs to connect to another host *************** *** 3794,3799 **** --- 3845,3851 ---- 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 *************** *** 3807,3812 **** --- 3859,3867 ---- 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 *************** *** 3893,3899 **** even if you are going to attempt immediate delivery. .i Sendmail always instantiates the queue file ! before returning control the the client under any circumstances. .ip S\fIfile\fP Log statistics in the named --- 3948,3954 ---- even if you are going to attempt immediate delivery. .i Sendmail always instantiates the queue file ! before returning control the client under any circumstances. .ip S\fIfile\fP Log statistics in the named *************** *** 4165,4170 **** --- 4220,4240 ---- 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: *************** *** 4265,4271 **** and the third requires that .i sendmail be compiled with NIS support. ! All four accept as arguments the some optional flags and a filename (or a mapname for NIS; the filename is the root of the database path, --- 4335,4341 ---- and the third requires that .i sendmail be compiled with NIS support. ! 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, *************** *** 4616,4622 **** 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, the update problem will probably not be too great. .sh 4 "Single host" .pp --- 4686,4692 ---- 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 configuration remains relatively static, the update problem will probably not be too great. .sh 4 "Single host" .pp *************** *** 4944,4951 **** .i "if and only if" the .q C ! flag is defined in the mailer corresponding to ! .q eric@vangogh.CS.Berkeley.EDU. .pp Other flags are described in Appendix C. --- 5014,5023 ---- .i "if and only if" the .q C ! 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. *************** *** 4998,5004 **** may be used. .pp Finally, ! an argv template is given as the E field. It may have embedded spaces. If there is no argv with a .b $u --- 5070,5076 ---- may be used. .pp Finally, ! an argv template is given as the A field. It may have embedded spaces. If there is no argv with a .b $u *************** *** 5175,5181 **** .q maildrop is found for the user, but no corresponding ! .q maildrop record exists, the record .q :default:mailname --- 5247,5253 ---- .q maildrop is found for the user, but no corresponding ! .q mailname record exists, the record .q :default:mailname *************** *** 5310,5316 **** The load average type. Details are described below. .lp ! The are four 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 --- 5382,5388 ---- The load average type. Details are described below. .lp ! 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 *************** *** 5332,5337 **** --- 5404,5411 ---- .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 *************** *** 6009,6015 **** 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 `7' mailer flag. .sh 2 "User Database" .pp --- 6083,6089 ---- However, for compatibility with RFC 822, you can set option `7' to get seven bit stripping. .pp ! Individual mailers can still produce seven bit output using the `7' mailer flag. .sh 2 "User Database" .pp *************** *** 6517,6525 **** 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 ). These are the e, i, m, and v options. Also, the f option --- 6591,6597 ---- 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. These are the e, i, m, and v options. Also, the f option *************** *** 6803,6809 **** .\"Eric Allman .\"Britton-Lee, Inc. .\".sp ! .\"Version 8.26 .\".ce 0 .bp 2 .rs --- 6875,6881 ---- .\"Eric Allman .\"Britton-Lee, Inc. .\".sp ! .\"Version 8.32 .\".ce 0 .bp 2 .rs *** mailstats/mailstats.c.OLD Tue Jul 27 10:38:56 1993 --- mailstats/mailstats.c Mon Dec 27 17:07:17 1993 *************** *** 40,46 **** #endif /* not lint */ #ifndef lint ! static char sccsid[] = "@(#)mailstats.c 8.2 (Berkeley) 7/27/93"; #endif /* not lint */ #include --- 40,46 ---- #endif /* not lint */ #ifndef lint ! static char sccsid[] = "@(#)mailstats.c 8.3 (Berkeley) 12/27/93"; #endif /* not lint */ #include *************** *** 63,68 **** --- 63,69 ---- 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]; *************** *** 195,201 **** --- 196,209 ---- 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); } *** makemap/Makefile.dist.OLD Wed Dec 1 09:17:58 1993 --- makemap/Makefile.dist Sat Nov 27 09:07:40 1993 *************** *** 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 *** makemap/makemap.c.OLD Mon Nov 22 11:26:28 1993 --- makemap/makemap.c Mon Nov 22 11:44:10 1993 *************** *** 33,39 **** */ #ifndef lint ! static char sccsid[] = "@(#)makemap.c 8.5 (Berkeley) 9/22/93"; #endif /* not lint */ #include --- 33,39 ---- */ #ifndef lint ! static char sccsid[] = "@(#)makemap.c 8.6 (Berkeley) 11/22/93"; #endif /* not lint */ #include *************** *** 262,269 **** */ p = strchr(ibuf, '\n'); ! if (*p != '\0') *p = '\0'; if (ibuf[0] == '\0' || ibuf[0] == '#') continue; if (isspace(ibuf[0])) --- 262,276 ---- */ p = strchr(ibuf, '\n'); ! if (p != NULL) *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])) *** praliases/Makefile.dist.OLD Wed Dec 1 09:18:02 1993 --- praliases/Makefile.dist Sat Nov 27 09:07:26 1993 *************** *** 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 *** src/Makefile.OLD Sun Aug 15 06:43:09 1993 --- src/Makefile Mon Dec 20 10:52:10 1993 *************** *** 1,4 **** ! # @(#)Makefile 8.2 (Berkeley) 8/15/93 PROG= sendmail --- 1,4 ---- ! # @(#)Makefile 8.3 (Berkeley) 12/20/93 PROG= sendmail *************** *** 34,40 **** 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 \ ${DESTDIR}/var/log/sendmail.st install -c -o ${BINOWN} -g ${BINGRP} -m 444 ${.CURDIR}/sendmail.hf \ ${DESTDIR}/usr/share/misc --- 34,40 ---- beforeinstall: # install -c -o ${BINOWN} -g ${BINGRP} -m 644 /dev/null \ # ${DESTDIR}/etc/sendmail.fc ! 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 *** src/Makefile.386BSD.OLD Sat Dec 18 11:20:32 1993 --- src/Makefile.386BSD Sat Dec 18 11:21:07 1993 *************** *** 34,40 **** 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 \ ${DESTDIR}/var/log/sendmail.st install -c -o ${BINOWN} -g ${BINGRP} -m 444 ${.CURDIR}/sendmail.hf \ ${DESTDIR}/usr/share/misc --- 34,40 ---- beforeinstall: # install -c -o ${BINOWN} -g ${BINGRP} -m 644 /dev/null \ # ${DESTDIR}/etc/sendmail.fc ! 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 *** src/Makefile.AIX.OLD Wed Dec 1 19:08:02 1993 --- src/Makefile.AIX Mon Jan 3 07:06:46 1994 *************** *** 5,11 **** # 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). # ! # This has been tested on AIX 3.1.5. # # use O=-O (usual) or O=-g (debugging) --- 5,11 ---- # 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). # ! # This has been tested on AIX 3.1.5 and 3.2.3e. # # use O=-O (usual) or O=-g (debugging) *************** *** 19,24 **** --- 19,27 ---- # See READ_ME for a description of how these flags interact. # DBMDEF= -DNDBM -DNEWDB + # + # If you did not install the NEWDB on your AIX platform, use: + #DBMDEF=-DNDBM # environment definitions (e.g., -D_AIX3) ENVDEF= -D_AIX3 *************** *** 33,38 **** --- 36,44 ---- # libraries required on your system LIBS= -ldbm -ldb + # + # If you did not install the NEWDB on your AIX platform, use: + #LIBS= -ldbm # location of sendmail binary (usually /usr/sbin or /usr/lib) BINDIR= ${DESTDIR}/usr/sbin *************** *** 41,51 **** STDIR= ${DESTDIR}/var/log # location of sendmail.hf file (usually /usr/share/misc or /usr/lib) ! HFDIR= ${DESTDIR}/usr/share/misc # additional .o files needed OBJADD= ################### end of user configuration flags ###################### CFLAGS= -I. $O ${INCDIRS} ${DBMDEF} ${ENVDEF} --- 47,59 ---- STDIR= ${DESTDIR}/var/log # location of sendmail.hf file (usually /usr/share/misc or /usr/lib) ! HFDIR= ${DESTDIR}/usr/lib # additional .o files needed OBJADD= + INSTALL=/usr/ucb/install + ################### end of user configuration flags ###################### CFLAGS= -I. $O ${INCDIRS} ${DBMDEF} ${ENVDEF} *************** *** 80,90 **** install: install-sendmail install-docs install-sendmail: sendmail ! install -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} sendmail ${BINDIR} for i in ${LINKS}; do rm -f $$i; ln -s ${BINDIR}/sendmail $$i; done ! install -c -o ${BINOWN} -g ${BINGRP} -m 666 /dev/null \ ${STDIR}/sendmail.st ! 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 --- 88,98 ---- install: install-sendmail install-docs install-sendmail: sendmail ! ${INSTALL} -O ${BINOWN} -G ${BINGRP} -M ${BINMODE} sendmail ${BINDIR} for i in ${LINKS}; do rm -f $$i; ln -s ${BINDIR}/sendmail $$i; done ! ${INSTALL} -c -O ${BINOWN} -G ${BINGRP} -M 644 /dev/null \ ${STDIR}/sendmail.st ! ${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 *** src/Makefile.AUX.OLD Sat Dec 18 11:20:32 1993 --- src/Makefile.AUX Sat Dec 18 11:21:12 1993 *************** *** 85,91 **** install-sendmail: sendmail install -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} sendmail ${BINDIR} for i in ${LINKS}; do ; rm -f $$i; ln -s ${BINDIR}/sendmail $$i; done ! install -c -o ${BINOWN} -g ${BINGRP} -m 666 /dev/null \ ${STDIR}/sendmail.st install -c -o ${BINOWN} -g ${BINGRP} -m 444 sendmail.hf ${HFDIR} --- 85,91 ---- install-sendmail: sendmail install -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} sendmail ${BINDIR} for i in ${LINKS}; do ; rm -f $$i; ln -s ${BINDIR}/sendmail $$i; done ! install -c -o ${BINOWN} -g ${BINGRP} -m 644 /dev/null \ ${STDIR}/sendmail.st install -c -o ${BINOWN} -g ${BINGRP} -m 444 sendmail.hf ${HFDIR} *** src/Makefile.BSD43.OLD Fri Nov 12 06:21:16 1993 --- src/Makefile.BSD43 Sat Dec 18 11:21:16 1993 *************** *** 33,39 **** #LIBDIRS=-L/usr/sww/lib # libraries required on your system ! LIBS= -ldbm -lresolv # location of sendmail binary (usually /usr/sbin or /usr/lib) BINDIR= ${DESTDIR}/usr/lib --- 33,39 ---- #LIBDIRS=-L/usr/sww/lib # libraries required on your system ! LIBS= -ldbm -lresolv -ll # location of sendmail binary (usually /usr/sbin or /usr/lib) BINDIR= ${DESTDIR}/usr/lib *************** *** 48,54 **** OBJADD= # additional pseudo-sources needed ! BEFORE= unistd.h stddef.h stdlib.h ################### end of user configuration flags ###################### --- 48,54 ---- OBJADD= # additional pseudo-sources needed ! BEFORE= unistd.h stddef.h stdlib.h dirent.h sys/time.h ################### end of user configuration flags ###################### *************** *** 72,80 **** sendmail: ${BEFORE} ${OBJS} ${CC} -o sendmail ${OBJS} ${LIBDIRS} ${LIBS} ! unistd.h stddef.h stdlib.h: cp /dev/null $@ aliases.0: aliases.5 nroff -h -mandoc aliases.5 > aliases.0 --- 72,89 ---- sendmail: ${BEFORE} ${OBJS} ${CC} -o sendmail ${OBJS} ${LIBDIRS} ${LIBS} ! unistd.h stddef.h stdlib.h sys/time.h: cp /dev/null $@ + sys/time.h: sys + + sys: + mkdir sys + + dirent.h: + echo "#include " > dirent.h + echo "#define dirent direct" >> dirent.h + aliases.0: aliases.5 nroff -h -mandoc aliases.5 > aliases.0 *************** *** 89,95 **** install-sendmail: sendmail install -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} sendmail ${BINDIR} for i in ${LINKS}; do rm -f $$i; ln -s ${BINDIR}/sendmail $$i; done ! install -c -o ${BINOWN} -g ${BINGRP} -m 666 /dev/null \ ${STDIR}/sendmail.st install -c -o ${BINOWN} -g ${BINGRP} -m 444 sendmail.hf ${HFDIR} --- 98,104 ---- install-sendmail: sendmail install -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} sendmail ${BINDIR} for i in ${LINKS}; do rm -f $$i; ln -s ${BINDIR}/sendmail $$i; done ! install -c -o ${BINOWN} -g ${BINGRP} -m 644 /dev/null \ ${STDIR}/sendmail.st install -c -o ${BINOWN} -g ${BINGRP} -m 444 sendmail.hf ${HFDIR} *** src/Makefile.BSDI.OLD Sat Dec 18 11:20:32 1993 --- src/Makefile.BSDI Sat Dec 18 11:21:18 1993 *************** *** 82,88 **** install-sendmail: sendmail install -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} sendmail ${BINDIR} for i in ${LINKS}; do (rm -f $$i; ln -s ${BINDIR}/sendmail $$i); done ! install -c -o ${BINOWN} -g ${BINGRP} -m 666 /dev/null \ ${STDIR}/sendmail.st install -c -o ${BINOWN} -g ${BINGRP} -m 444 sendmail.hf ${HFDIR} --- 82,88 ---- install-sendmail: sendmail install -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} sendmail ${BINDIR} for i in ${LINKS}; do (rm -f $$i; ln -s ${BINDIR}/sendmail $$i); done ! install -c -o ${BINOWN} -g ${BINGRP} -m 644 /dev/null \ ${STDIR}/sendmail.st install -c -o ${BINOWN} -g ${BINGRP} -m 444 sendmail.hf ${HFDIR} *** src/Makefile.ConvexOS.OLD Sat Dec 18 11:20:32 1993 --- src/Makefile.ConvexOS Sat Dec 18 11:21:21 1993 *************** *** 83,89 **** install-sendmail: sendmail install -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} sendmail ${BINDIR} for i in ${LINKS}; do rm -f $$i; ln -s ${BINDIR}/sendmail $$i; done ! install -c -o ${BINOWN} -g ${BINGRP} -m 666 /dev/null \ ${STDIR}/sendmail.st install -c -o ${BINOWN} -g ${BINGRP} -m 444 sendmail.hf ${HFDIR} --- 83,89 ---- install-sendmail: sendmail install -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} sendmail ${BINDIR} for i in ${LINKS}; do rm -f $$i; ln -s ${BINDIR}/sendmail $$i; done ! install -c -o ${BINOWN} -g ${BINGRP} -m 644 /dev/null \ ${STDIR}/sendmail.st install -c -o ${BINOWN} -g ${BINGRP} -m 444 sendmail.hf ${HFDIR} *** src/Makefile.DGUX.OLD Sat Nov 27 09:28:17 1993 --- src/Makefile.DGUX Sat Dec 18 11:21:23 1993 *************** *** 0 **** --- 1,94 ---- + # + # Tested on DG/UX 5.4.2 by A. Bryan Curnutt . + # + + # use O=-O (usual) or O=-g (debugging) + O= -O + + # define the database mechanisms available for map & alias lookups: + # -DNDBM -- use new DBM + # -DNEWDB -- use new Berkeley DB + # -DNIS -- include NIS support + # The really old (V7) DBM library is no longer supported. + # See READ_ME for a description of how these flags interact. + # + DBMDEF= -DNDBM -DNIS + + # environment definitions (e.g., -D_AIX3) + ENVDEF=-DDGUX + + # see also conf.h for additional compilation flags + + # include directories + INCDIRS=-I/usr/sww/include/db + + # loader options + LDOPTS= + + # library directories + LIBDIRS=-L/usr/sww/lib + + # libraries required on your system + LIBS= -ldbm + + # location of sendmail binary (usually /usr/sbin or /usr/lib) + BINDIR= ${DESTDIR}/usr/bin + + # location of sendmail.st file (usually /var/log or /usr/lib) + STDIR= ${DESTDIR}/usr/lib + + # location of sendmail.hf file (usually /usr/share/misc or /usr/lib) + HFDIR= ${DESTDIR}/etc + + # additional .o files needed + OBJADD= + + ################### end of user configuration flags ###################### + + CFLAGS= -I. $O ${INCDIRS} ${DBMDEF} ${ENVDEF} + + OBJS= alias.o arpadate.o clock.o collect.o conf.o convtime.o daemon.o \ + deliver.o domain.o envelope.o err.o headers.o macro.o main.o \ + map.o mci.o parseaddr.o queue.o readcf.o recipient.o \ + savemail.o srvrsmtp.o stab.o stats.o sysexits.o \ + trace.o udb.o usersmtp.o util.o version.o ${OBJADD} + + LINKS= ${DESTDIR}/usr/ucb/newaliases ${DESTDIR}/usr/ucb/mailq + BINOWN= root + BINGRP= bin + BINMODE=6555 + + ALL= sendmail aliases.0 newaliases.0 sendmail.0 + + all: ${ALL} + + sendmail: ${BEFORE} ${OBJS} + ${CC} -o sendmail ${LDOPTS} ${OBJS} ${LIBDIRS} ${LIBS} + + aliases.0: aliases.5 + nroff -h -mandoc aliases.5 > aliases.0 + + newaliases.0: newaliases.1 + nroff -h -mandoc newaliases.1 > newaliases.0 + + sendmail.0: sendmail.8 + nroff -h -mandoc sendmail.8 > sendmail.0 + + install: install-sendmail install-docs + + install-sendmail: sendmail + install -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} sendmail ${BINDIR} + for i in ${LINKS}; do rm -f $$i; ln -s ${BINDIR}/sendmail $$i; done + install -c -o ${BINOWN} -g ${BINGRP} -m 644 /dev/null \ + ${STDIR}/sendmail.st + 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 + + clean: + rm -f ${OBJS} sendmail aliases.0 newaliases.0 sendmail.0 + + # dependencies + # gross overkill, and yet still not quite enough.... + ${OBJS}: sendmail.h conf.h *** src/Makefile.Dell.OLD Sat Dec 18 05:08:30 1993 --- src/Makefile.Dell Wed Dec 22 04:39:02 1993 *************** *** 10,20 **** # work on other SVR4 ports. # # use O=-O (usual) or O=-g (debugging) ! O= -O CC= gcc ! DESTDIR=/usr/local/sendmail # define the database mechanism used for alias lookups: # -DNDBM -- use new DBM --- 10,23 ---- # work on other SVR4 ports. # + # make sure the shell constructs below use the right shell + SHELL= /bin/sh + # use O=-O (usual) or O=-g (debugging) ! O= -O2 CC= gcc ! #DESTDIR=/usr/local/sendmail # define the database mechanism used for alias lookups: # -DNDBM -- use new DBM *************** *** 26,32 **** DBMDEF= -DNEWDB -DNDBM # environment definitions (e.g., -D_AIX3) ! ENVDEF= -DDELL_SVR4 # see also conf.h for additional compilation flags --- 29,35 ---- DBMDEF= -DNEWDB -DNDBM # environment definitions (e.g., -D_AIX3) ! ENVDEF= -D__svr4__ # see also conf.h for additional compilation flags *************** *** 40,52 **** LIBS= -ldb -ldbm -lresolv -lsocket -lnsl -lelf # location of sendmail binary (usually /usr/sbin or /usr/lib) ! BINDIR= ${DESTDIR}/bin # location of sendmail.st file (usually /var/log or /usr/lib) ! STDIR= ${DESTDIR}/etc # location of sendmail.hf file (usually /usr/share/misc or /usr/lib) ! HFDIR= ${DESTDIR}/etc # additional .o files needed OBJADD= --- 43,55 ---- LIBS= -ldb -ldbm -lresolv -lsocket -lnsl -lelf # location of sendmail binary (usually /usr/sbin or /usr/lib) ! BINDIR= ${DESTDIR}/usr/ucblib # location of sendmail.st file (usually /var/log or /usr/lib) ! STDIR= ${DESTDIR}/usr/ucblib # location of sendmail.hf file (usually /usr/share/misc or /usr/lib) ! HFDIR= ${DESTDIR}/usr/ucblib # additional .o files needed OBJADD= *************** *** 63,69 **** LINKS= ${DESTDIR}/usr/ucb/newaliases ${DESTDIR}/usr/ucb/mailq BINOWN= root ! BINGRP= sys BINMODE=6555 INSTALL=/usr/ucb/install --- 66,72 ---- LINKS= ${DESTDIR}/usr/ucb/newaliases ${DESTDIR}/usr/ucb/mailq BINOWN= root ! BINGRP= mail BINMODE=6555 INSTALL=/usr/ucb/install *************** *** 88,94 **** install-sendmail: sendmail ${INSTALL} -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} sendmail ${BINDIR} for i in ${LINKS}; do rm -f $$i; ln -s ${BINDIR}/sendmail $$i; done ! ${INSTALL} -c -o ${BINOWN} -g ${BINGRP} -m 666 /dev/null \ ${STDIR}/sendmail.st ${INSTALL} -c -o ${BINOWN} -g ${BINGRP} -m 444 sendmail.hf ${HFDIR} --- 91,97 ---- install-sendmail: sendmail ${INSTALL} -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} sendmail ${BINDIR} for i in ${LINKS}; do rm -f $$i; ln -s ${BINDIR}/sendmail $$i; done ! ${INSTALL} -c -o ${BINOWN} -g ${BINGRP} -m 644 /dev/null \ ${STDIR}/sendmail.st ${INSTALL} -c -o ${BINOWN} -g ${BINGRP} -m 444 sendmail.hf ${HFDIR} *** src/Makefile.Dynix.OLD Sat Nov 27 14:23:38 1993 --- src/Makefile.Dynix Sat Dec 18 11:21:27 1993 *************** *** 0 **** --- 1,106 ---- + # + # Tested on Dynix 3.2.0. + # + # From Jim Davis . + # + # ``There is no strtol in libc (well there is in the 'att universe' + # libc, but I couldn't figure out how to link that in), so I + # got the Chris Torek strtol.c from bsd-sources on uunet and + # compiled that. There is no native ndbm either; I couldn't + # get db 1.72 to pass it's regression test, so I used gdbm-1.7 + # instead. I compiled it with gcc 1.40a. The -lseq is to pick + # up getopt.'' + # + + CC= gcc + + # use O=-O (usual) or O=-g (debugging) + O= -O -g + + # define the database mechanisms available for map & alias lookups: + # -DNDBM -- use new DBM + # -DNEWDB -- use new Berkeley DB + # -DNIS -- include NIS support + # The really old (V7) DBM library is no longer supported. + # See READ_ME for a description of how these flags interact. + # + DBMDEF= -DNDBM + + # environment definitions (e.g., -D_AIX3) + ENVDEF= + + # see also conf.h for additional compilation flags + + # include directories + INCDIRS= + + # loader options + LDOPTS= + + # library directories + LIBDIRS= + + # libraries required on your system + LIBS= -lseq -lgdbm + + # location of sendmail binary (usually /usr/sbin or /usr/lib) + BINDIR= ${DESTDIR}/usr/lib + + # location of sendmail.st file (usually /var/log or /usr/lib) + STDIR= ${DESTDIR}/usr/lib + + # location of sendmail.hf file (usually /usr/share/misc or /usr/lib) + HFDIR= ${DESTDIR}/usr/lib + + # additional .o files needed + OBJADD=strtol.o + + ################### end of user configuration flags ###################### + + CFLAGS= -I. $O ${INCDIRS} ${DBMDEF} ${ENVDEF} + + OBJS= alias.o arpadate.o clock.o collect.o conf.o convtime.o daemon.o \ + deliver.o domain.o envelope.o err.o headers.o macro.o main.o \ + map.o mci.o parseaddr.o queue.o readcf.o recipient.o \ + savemail.o srvrsmtp.o stab.o stats.o sysexits.o \ + trace.o udb.o usersmtp.o util.o version.o ${OBJADD} + + LINKS= ${DESTDIR}/usr/ucb/newaliases ${DESTDIR}/usr/ucb/mailq + BINOWN= root + BINGRP= staff # no kmem group, + BINMODE=4555 # so not setgid + + ALL= sendmail aliases.0 newaliases.0 sendmail.0 + + all: ${ALL} + + sendmail: ${BEFORE} ${OBJS} + ${CC} -o sendmail ${LDOPTS} ${OBJS} ${LIBDIRS} ${LIBS} + + aliases.0: aliases.5 + nroff -h -mandoc aliases.5 > aliases.0 + + newaliases.0: newaliases.1 + nroff -h -mandoc newaliases.1 > newaliases.0 + + sendmail.0: sendmail.8 + nroff -h -mandoc sendmail.8 > sendmail.0 + + install: install-sendmail install-docs + + install-sendmail: sendmail + install -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} sendmail ${BINDIR} + for i in ${LINKS}; do rm -f $$i; ln -s ${BINDIR}/sendmail $$i; done + install -c -o ${BINOWN} -g ${BINGRP} -m 644 /dev/null \ + ${STDIR}/sendmail.st + 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 + + clean: + rm -f ${OBJS} sendmail aliases.0 newaliases.0 sendmail.0 + + # dependencies + # gross overkill, and yet still not quite enough.... + ${OBJS}: sendmail.h conf.h *** src/Makefile.FreeBSD.OLD Wed Dec 1 09:21:27 1993 --- src/Makefile.FreeBSD Sat Dec 18 11:21:31 1993 *************** *** 0 **** --- 1,49 ---- + # + # Makefile for FreeBSD + # + # @(#)Makefile 8.2 (Berkeley) 8/15/93 + + PROG= sendmail + + # define the database format to use for aliases et al. Can be -DNEWDB (for + # the new BSD database package -- this is preferred) or -DNDBM for the NDBM + # database package. The old putrescent V7 DBM package is no longer + # supported. + # You can define both NEWDB and NDBM during a transition period; old + # databases are read, but the new format will be used on any rebuilds. On + # really gnarly systems, you can set this to null; it will crawl like a high + # spiral snail, but it will work. + DBMDEF= -DNEWDB + + # FreeBSD 1.0 RELEASE has uname(2) now. Use -DUSEUNAME in order to use it. + CFLAGS+=-I${.CURDIR} ${DBMDEF} -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 \ + mci.c parseaddr.c queue.c readcf.c recipient.c savemail.c srvrsmtp.c \ + stab.c stats.c sysexits.c trace.c udb.c usersmtp.c \ + util.c version.c + DPADD= + LDADD= $(LIBUTIL) + # + # FreeBSD 1.0 RELEASE has GNU man and doesn't need preformatted man pages anymore + # + MAN1= newaliases.1 + MAN5= aliases.5 + MAN8= sendmail.8 + LINKS= /usr/sbin/sendmail /usr/bin/newaliases \ + /usr/sbin/sendmail /usr/bin/mailq + BINDIR= /usr/sbin + BINOWN= root + BINGRP= kmem + BINMODE=6555 + + beforeinstall: + # install -c -o ${BINOWN} -g ${BINGRP} -m 644 /dev/null \ + # ${DESTDIR}/etc/sendmail.fc + 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 + + .include *** src/Makefile.HP-UX.OLD Sat Dec 18 11:20:33 1993 --- src/Makefile.HP-UX Tue Jan 4 08:00:44 1994 *************** *** 39,45 **** BINDIR= ${DESTDIR}/usr/lib # location of sendmail.st file (usually /var/log or /usr/lib) ! STDIR= ${DESTDIR}/var/log # location of sendmail.hf file (usually /usr/share/misc or /usr/lib) HFDIR= ${DESTDIR}/usr/lib --- 39,45 ---- BINDIR= ${DESTDIR}/usr/lib # location of sendmail.st file (usually /var/log or /usr/lib) ! STDIR= ${DESTDIR}/usr/lib # location of sendmail.hf file (usually /usr/share/misc or /usr/lib) HFDIR= ${DESTDIR}/usr/lib *************** *** 58,66 **** savemail.o srvrsmtp.o stab.o stats.o sysexits.o \ trace.o udb.o usersmtp.o util.o version.o ${OBJADD} ! LINKS= ${DESTDIR}/usr/ucb/newaliases ${DESTDIR}/usr/ucb/mailq BINOWN= root ! BINGRP= sys BINMODE=6555 ALL= sendmail aliases.0 newaliases.0 sendmail.0 --- 58,66 ---- savemail.o srvrsmtp.o stab.o stats.o sysexits.o \ trace.o udb.o usersmtp.o util.o version.o ${OBJADD} ! LINKS= ${DESTDIR}/usr/bin/newaliases ${DESTDIR}/usr/bin/mailq BINOWN= root ! BINGRP= mail BINMODE=6555 ALL= sendmail aliases.0 newaliases.0 sendmail.0 *************** *** 82,92 **** install: install-sendmail install-docs install-sendmail: sendmail ! install -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} sendmail ${BINDIR} for i in ${LINKS}; do rm -f $$i; ln -s ${BINDIR}/sendmail $$i; done ! install -c -o ${BINOWN} -g ${BINGRP} -m 666 /dev/null \ ! ${STDIR}/sendmail.st ! 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 --- 82,91 ---- install: install-sendmail install-docs install-sendmail: sendmail ! cpset sendmail ${BINDIR} ${BINMODE} ${BINOWN} ${BINGRP} for i in ${LINKS}; do rm -f $$i; ln -s ${BINDIR}/sendmail $$i; done ! cpset /dev/null ${STDIR}/sendmail.st 644 ${BINOWN} ${BINGRP} ! cpset sendmail.hf ${HFDIR} 444 ${BINOWN} ${BINGRP} # doesn't actually install them -- you may want to install pre-nroff versions install-docs: aliases.0 newaliases.0 sendmail.0 *** src/Makefile.IRIX.OLD Sat Dec 18 11:20:33 1993 --- src/Makefile.IRIX Sat Dec 18 11:21:35 1993 *************** *** 83,89 **** install-sendmail: sendmail install -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} sendmail ${BINDIR} for i in ${LINKS}; do rm -f $$i; ln -s ${BINDIR}/sendmail $$i; done ! install -c -o ${BINOWN} -g ${BINGRP} -m 666 /dev/null \ ${STDIR}/sendmail.st install -c -o ${BINOWN} -g ${BINGRP} -m 444 sendmail.hf ${HFDIR} --- 83,89 ---- install-sendmail: sendmail install -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} sendmail ${BINDIR} for i in ${LINKS}; do rm -f $$i; ln -s ${BINDIR}/sendmail $$i; done ! install -c -o ${BINOWN} -g ${BINGRP} -m 644 /dev/null \ ${STDIR}/sendmail.st install -c -o ${BINOWN} -g ${BINGRP} -m 444 sendmail.hf ${HFDIR} *** src/Makefile.Linux.OLD Thu Dec 9 13:44:34 1993 --- src/Makefile.Linux Mon Dec 20 05:53:18 1993 *************** *** 21,27 **** DBMDEF= -DNDBM # environment definitions (e.g., -D_AIX3) ! ENVDEF= -D__USE_BSD -U__USE_POSIX2 # see also conf.h for additional compilation flags --- 21,27 ---- DBMDEF= -DNDBM # environment definitions (e.g., -D_AIX3) ! ENVDEF= -D__USE_BSD # see also conf.h for additional compilation flags *************** *** 47,53 **** OBJADD= # additional pseudo-sources needed ! BEFORE= ################### end of user configuration flags ###################### --- 47,53 ---- OBJADD= # additional pseudo-sources needed ! BEFORE= features.h ################### end of user configuration flags ###################### *************** *** 59,65 **** savemail.o srvrsmtp.o stab.o stats.o sysexits.o \ trace.o udb.o usersmtp.o util.o version.o ${OBJADD} ! LINKS= ${DESTDIR}/usr/ucb/newaliases ${DESTDIR}/usr/ucb/mailq BINOWN= root BINGRP= kmem BINMODE=6555 --- 59,65 ---- savemail.o srvrsmtp.o stab.o stats.o sysexits.o \ trace.o udb.o usersmtp.o util.o version.o ${OBJADD} ! LINKS= ${DESTDIR}/usr/bin/newaliases ${DESTDIR}/usr/bin/mailq BINOWN= root BINGRP= kmem BINMODE=6555 *************** *** 78,83 **** --- 78,86 ---- echo "#include " > dirent.h echo "#define dirent direct" >> dirent.h + features.h: + ln features.linux.h $@ + NROFF= nroff aliases.0: aliases.5 *************** *** 94,100 **** install-sendmail: sendmail install -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} sendmail ${BINDIR} for i in ${LINKS}; do rm -f $$i; ln -s ${BINDIR}/sendmail $$i; done ! install -c -o ${BINOWN} -g ${BINGRP} -m 666 /dev/null \ ${STDIR}/sendmail.st install -c -o ${BINOWN} -g ${BINGRP} -m 444 sendmail.hf ${HFDIR} --- 97,103 ---- install-sendmail: sendmail install -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} sendmail ${BINDIR} for i in ${LINKS}; do rm -f $$i; ln -s ${BINDIR}/sendmail $$i; done ! install -c -o ${BINOWN} -g ${BINGRP} -m 644 /dev/null \ ${STDIR}/sendmail.st install -c -o ${BINOWN} -g ${BINGRP} -m 444 sendmail.hf ${HFDIR} *** src/Makefile.Mach386.OLD Wed Dec 1 09:21:19 1993 --- src/Makefile.Mach386 Sat Dec 18 11:21:41 1993 *************** *** 0 **** --- 1,102 ---- + # + # 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.7 (Berkeley) 9/3/93 + # + + CC= gcc + + # use O=-O (usual) or O=-g (debugging) + O= -O + + # define the database mechanisms available for map & alias lookups: + # -DNDBM -- use new DBM + # -DNEWDB -- use new Berkeley DB + # -DNIS -- include NIS support + # The really old (V7) DBM library is no longer supported. + # See READ_ME for a description of how these flags interact. + # + DBMDEF= -DNDBM + + # environment definitions (e.g., -D_AIX3) + ENVDEF= + + # see also conf.h for additional compilation flags + + # include directories + INCDIRS= + + # loader options + LDOPTS= + + # library directories + LIBDIRS= + + # libraries required on your system + LIBS= -ldbm + + # location of sendmail binary (usually /usr/sbin or /usr/lib) + BINDIR= ${DESTDIR}/usr/lib + + # location of sendmail.st file (usually /var/log or /usr/lib) + STDIR= ${DESTDIR}/usr/lib + + # location of sendmail.hf file (usually /usr/share/misc or /usr/lib) + HFDIR= ${DESTDIR}/usr/lib + + # additional .o files needed + OBJADD= + + ################### end of user configuration flags ###################### + + CFLAGS= -I. $O ${INCDIRS} ${DBMDEF} ${ENVDEF} + + OBJS= alias.o arpadate.o clock.o collect.o conf.o convtime.o daemon.o \ + deliver.o domain.o envelope.o err.o headers.o macro.o main.o \ + map.o mci.o parseaddr.o queue.o readcf.o recipient.o \ + savemail.o srvrsmtp.o stab.o stats.o sysexits.o \ + trace.o udb.o usersmtp.o util.o version.o ${OBJADD} + + LINKS= ${DESTDIR}/usr/ucb/newaliases ${DESTDIR}/usr/ucb/mailq + BINOWN= root + BINGRP= kmem + BINMODE=6555 + + ALL= sendmail aliases.0 newaliases.0 sendmail.0 + + all: ${ALL} + + sendmail: ${BEFORE} ${OBJS} + ${CC} -o sendmail ${LDOPTS} ${OBJS} ${LIBDIRS} ${LIBS} + + aliases.0: aliases.5 + nroff -h -mandoc aliases.5 > aliases.0 + + newaliases.0: newaliases.1 + nroff -h -mandoc newaliases.1 > newaliases.0 + + sendmail.0: sendmail.8 + nroff -h -mandoc sendmail.8 > sendmail.0 + + install: install-sendmail install-docs + + install-sendmail: sendmail + install -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} sendmail ${BINDIR} + for i in ${LINKS}; do rm -f $$i; ln -s ${BINDIR}/sendmail $$i; done + install -c -o ${BINOWN} -g ${BINGRP} -m 644 /dev/null \ + ${STDIR}/sendmail.st + 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 + + clean: + rm -f ${OBJS} sendmail aliases.0 newaliases.0 sendmail.0 + + # dependencies + # gross overkill, and yet still not quite enough.... + ${OBJS}: sendmail.h conf.h *** src/Makefile.NeXT.OLD Sat Dec 18 11:20:33 1993 --- src/Makefile.NeXT Sun Dec 26 07:56:13 1993 *************** *** 21,27 **** DBMDEF= -DNDBM # environment definitions (e.g., -D_AIX3) ! ENVDEF= -DNeXT # see also conf.h for additional compilation flags --- 21,27 ---- DBMDEF= -DNDBM # environment definitions (e.g., -D_AIX3) ! ENVDEF= -DNeXT -DNETINFO # see also conf.h for additional compilation flags *************** *** 92,98 **** install-sendmail: sendmail install -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} sendmail ${BINDIR} for i in ${LINKS}; do rm -f $$i; ln -s ${BINDIR}/sendmail $$i; done ! install -c -o ${BINOWN} -g ${BINGRP} -m 666 /dev/null \ ${STDIR}/sendmail.st install -c -o ${BINOWN} -g ${BINGRP} -m 444 sendmail.hf ${HFDIR} --- 92,98 ---- install-sendmail: sendmail install -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} sendmail ${BINDIR} for i in ${LINKS}; do rm -f $$i; ln -s ${BINDIR}/sendmail $$i; done ! install -c -o ${BINOWN} -g ${BINGRP} -m 644 /dev/null \ ${STDIR}/sendmail.st install -c -o ${BINOWN} -g ${BINGRP} -m 444 sendmail.hf ${HFDIR} *** src/Makefile.NetBSD.OLD Fri Dec 10 06:25:31 1993 --- src/Makefile.NetBSD Mon Jan 10 07:29:03 1994 *************** *** 0 **** --- 1,48 ---- + # + # NetBSD Makefile + # + + # @(#)Makefile 8.2 (Berkeley) 8/15/93 + + PROG= sendmail + + # define the database format to use for aliases et al. Can be -DNEWDB (for + # the new BSD database package -- this is preferred) or -DNDBM for the NDBM + # database package. The old putrescent V7 DBM package is no longer + # supported. + # You can define both NEWDB and NDBM during a transition period; old + # databases are read, but the new format will be used on any rebuilds. On + # really gnarly systems, you can set this to null; it will crawl like a high + # spiral snail, but it will work. + DBMDEF= -DNEWDB -DNDBM + + #nasty warning about gcc 2.4.x caused bugs + CFLAGS=-I${.CURDIR} ${DBMDEF} -DNETISO + #CFLAGS+=-I${.CURDIR} ${DBMDEF} -DNETISO + + 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 \ + mci.c parseaddr.c queue.c readcf.c recipient.c savemail.c srvrsmtp.c \ + stab.c stats.c sysexits.c trace.c udb.c usersmtp.c \ + util.c version.c + DPADD= $(LIBUTIL) + LDADD= -lutil + MAN1= newaliases.0 + MAN5= aliases.0 + MAN8= sendmail.0 + LINKS= /usr/sbin/sendmail /usr/bin/newaliases \ + /usr/sbin/sendmail /usr/bin/mailq + BINDIR= /usr/sbin + BINOWN= root + BINGRP= kmem + BINMODE=6555 + + beforeinstall: + # install -c -o ${BINOWN} -g ${BINGRP} -m 644 /dev/null \ + # ${DESTDIR}/etc/sendmail.fc + 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 + + .include *** src/Makefile.OSF1.OLD Sun Nov 7 10:38:01 1993 --- src/Makefile.OSF1 Sat Dec 18 11:22:23 1993 *************** *** 29,35 **** INCDIRS=-I/usr/sww/include/db # library directories ! LIBDIRS=-L/usr/sww/lib # libraries required on your system LIBS= -ldbm --- 29,35 ---- INCDIRS=-I/usr/sww/include/db # library directories ! LIBDIRS=-L/usr/sww/lib -L/usr/shlib -L/usr/lib # libraries required on your system LIBS= -ldbm *************** *** 47,53 **** OBJADD= # additional link flags ! LDADD= -non_shared ################### end of user configuration flags ###################### --- 47,53 ---- OBJADD= # additional link flags ! #LDADD= -non_shared ################### end of user configuration flags ###################### *************** *** 69,75 **** all: ${ALL} sendmail: ${BEFORE} ${OBJS} ! ${CC} -o sendmail ${LDFLAGS} ${OBJS} ${LIBDIRS} ${LIBS} aliases.0: aliases.5 nroff -h -mandoc aliases.5 > aliases.0 --- 69,75 ---- all: ${ALL} sendmail: ${BEFORE} ${OBJS} ! ${CC} -o sendmail ${LDADD} ${OBJS} ${LIBDIRS} ${LIBS} aliases.0: aliases.5 nroff -h -mandoc aliases.5 > aliases.0 *************** *** 86,93 **** installbsd -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} sendmail ${BINDIR} for i in ${LINKS}; do rm -f $$i; ln -s ${BINDIR}/sendmail $$i; done cp /dev/null ${STDIR}/sendmail.st ! chmod ${BINMOD} ${STDIR}/sendmail.st ! chown ${BINGRP}.${BINGRP} ${STDIR}/sendmail.st installbsd -c -o ${BINOWN} -g ${BINGRP} -m 444 sendmail.hf ${HFDIR} rm -f /usr/sbin/smtpd --- 86,93 ---- installbsd -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} sendmail ${BINDIR} for i in ${LINKS}; do rm -f $$i; ln -s ${BINDIR}/sendmail $$i; done cp /dev/null ${STDIR}/sendmail.st ! chmod 644 ${STDIR}/sendmail.st ! chown ${BINOWN}.${BINGRP} ${STDIR}/sendmail.st installbsd -c -o ${BINOWN} -g ${BINGRP} -m 444 sendmail.hf ${HFDIR} rm -f /usr/sbin/smtpd *** src/Makefile.RISCos.OLD Wed Dec 1 09:08:32 1993 --- src/Makefile.RISCos Sat Dec 18 11:22:27 1993 *************** *** 0 **** --- 1,110 ---- + # + # 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). + # + # For Mips RISC/os 4.52. + # + + # use O=-O (usual) or O=-g (debugging) + O= -O + + # be sure we are compiling in BSD mode + CC= cc -systype bsd43 + + # define the database mechanism used for alias lookups: + # -DNDBM -- use new DBM + # -DNEWDB -- use new Berkeley DB + # -DNIS -- include NIS support + # The really old (V7) DBM library is no longer supported. + # See READ_ME for a description of how these flags interact. + # + DBMDEF= -DNDBM + + # environment definitions (e.g., -D_AIX3) + ENVDEF= -DRISCOS -Olimit 800 + + # see also conf.h for additional compilation flags + + # include directories + #INCDIRS=-I/usr/sww/include/db + + # library directories + #LIBDIRS=-L/usr/sww/lib + + # libraries required on your system + LIBS= -lmld + + # location of sendmail binary (usually /usr/sbin or /usr/lib) + BINDIR= ${DESTDIR}/usr/lib + + # location of sendmail.st file (usually /var/log or /usr/lib) + STDIR= ${DESTDIR}/etc + + # location of sendmail.hf file (usually /usr/share/misc or /usr/lib) + HFDIR= ${DESTDIR}/usr/lib + + # additional .o files needed + OBJADD= + + # additional pseudo-sources needed + BEFORE= stdlib.h dirent.h + + ################### end of user configuration flags ###################### + + CFLAGS= -I. $O ${INCDIRS} ${DBMDEF} ${ENVDEF} + + OBJS= alias.o arpadate.o clock.o collect.o conf.o convtime.o daemon.o \ + deliver.o domain.o envelope.o err.o headers.o macro.o main.o \ + map.o mci.o parseaddr.o queue.o readcf.o recipient.o \ + savemail.o srvrsmtp.o stab.o stats.o sysexits.o \ + trace.o udb.o usersmtp.o util.o version.o ${OBJADD} + + LINKS= ${DESTDIR}/usr/ucb/newaliases ${DESTDIR}/usr/ucb/mailq + BINOWN= root + BINGRP= kmem + BINMODE=6555 + + ALL= sendmail aliases.0 newaliases.0 sendmail.0 + + all: ${ALL} + + sendmail: ${BEFORE} ${OBJS} + ${CC} -o sendmail ${OBJS} ${LIBDIRS} ${LIBS} + + stdlib.h: + cp /dev/null $@ + + dirent.h: + echo "#include " > dirent.h + echo "#define dirent direct" >> dirent.h + + aliases.0: aliases.5 + nroff -h -mandoc aliases.5 > aliases.0 + + newaliases.0: newaliases.1 + nroff -h -mandoc newaliases.1 > newaliases.0 + + sendmail.0: sendmail.8 + nroff -h -mandoc sendmail.8 > sendmail.0 + + install: install-sendmail install-docs + + install-sendmail: sendmail + install -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} sendmail ${BINDIR} + for i in ${LINKS}; do rm -f $$i; ln -s ${BINDIR}/sendmail $$i; done + install -c -o ${BINOWN} -g ${BINGRP} -m 644 /dev/null \ + ${STDIR}/sendmail.st + 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 + + clean: + rm -f ${OBJS} sendmail aliases.0 newaliases.0 sendmail.0 + + # dependencies + # gross overkill, and yet still not quite enough.... + ${OBJS}: sendmail.h conf.h *** src/Makefile.SCO.OLD Sun Dec 12 20:33:12 1993 --- src/Makefile.SCO Sat Dec 18 11:22:31 1993 *************** *** 0 **** --- 1,97 ---- + # + # 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). + # + # This has been tested on SCO. + # + + # use O=-O (usual) or O=-g (debugging) + O= -O + + # define the database mechanisms available for map & alias lookups: + # -DNDBM -- use new DBM + # -DNEWDB -- use new Berkeley DB + # -DNIS -- include NIS support + # The really old (V7) DBM library is no longer supported. + # See READ_ME for a description of how these flags interact. + # + DBMDEF= + + # environment definitions (e.g., -D_AIX3) + ENVDEF= -D_SCO_unix_ + + # see also conf.h for additional compilation flags + + # include directories + INCDIRS= + + # library directories + LIBDIRS= + + # libraries required on your system + LIBS= -lsocket + + # location of sendmail binary (usually /usr/sbin or /usr/lib) + BINDIR= ${DESTDIR}/usr/lib + + # location of sendmail.st file (usually /var/log or /usr/lib) + STDIR= ${DESTDIR}/usr/lib + + # location of sendmail.hf file (usually /usr/share/misc or /usr/lib) + HFDIR= ${DESTDIR}/usr/lib + + # additional .o files needed + OBJADD= fsync.o + + ################### end of user configuration flags ###################### + + CFLAGS= -I. $O ${INCDIRS} ${DBMDEF} ${ENVDEF} + + OBJS= alias.o arpadate.o clock.o collect.o conf.o convtime.o daemon.o \ + deliver.o domain.o envelope.o err.o headers.o macro.o main.o \ + map.o mci.o parseaddr.o queue.o readcf.o recipient.o \ + savemail.o srvrsmtp.o stab.o stats.o sysexits.o \ + trace.o udb.o usersmtp.o util.o version.o ${OBJADD} + + LINKS= ${DESTDIR}/usr/ucb/newaliases ${DESTDIR}/usr/ucb/mailq + BINOWN= root + BINGRP= kmem + BINMODE=6555 + + ALL= sendmail aliases.0 newaliases.0 sendmail.0 + + all: ${ALL} + + sendmail: ${BEFORE} ${OBJS} + ${CC} -o sendmail ${OBJS} ${LIBDIRS} ${LIBS} + + aliases.0: aliases.5 + nroff -h -mandoc aliases.5 > aliases.0 + + newaliases.0: newaliases.1 + nroff -h -mandoc newaliases.1 > newaliases.0 + + sendmail.0: sendmail.8 + nroff -h -mandoc sendmail.8 > sendmail.0 + + install: install-sendmail install-docs + + install-sendmail: sendmail + install -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} sendmail ${BINDIR} + for i in ${LINKS}; do rm -f $$i; ln -s ${BINDIR}/sendmail $$i; done + install -c -o ${BINOWN} -g ${BINGRP} -m 644 /dev/null \ + ${STDIR}/sendmail.st + 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 + + clean: + rm -f ${OBJS} sendmail aliases.0 newaliases.0 sendmail.0 + + # dependencies + # gross overkill, and yet still not quite enough.... + ${OBJS}: sendmail.h conf.h *** src/Makefile.SVR4.OLD Tue Dec 21 06:18:28 1993 --- src/Makefile.SVR4 Wed Dec 22 04:39:09 1993 *************** *** 0 **** --- 1,106 ---- + # + # 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). + # + # Based on a Makefile for Dell SVR4 Issue 2.2 from Kimmo Suominen + # -- I haven't tested this myself. It may + # work on other SVR4 ports. + # + + # make sure the shell constructs below use the right shell + SHELL= /bin/sh + + # use O=-O (usual) or O=-g (debugging) + O= -O + + CC= gcc + #DESTDIR=/usr/local/sendmail + + # define the database mechanism used for alias lookups: + # -DNDBM -- use new DBM + # -DNEWDB -- use new Berkeley DB + # -DNIS -- include NIS support + # The really old (V7) DBM library is no longer supported. + # See READ_ME for a description of how these flags interact. + # + DBMDEF= -DNEWDB -DNDBM + + # environment definitions (e.g., -D_AIX3) + ENVDEF= -D__svr4__ + + # see also conf.h for additional compilation flags + + # include directories + INCDIRS= + + # library directories + LIBDIRS= + + # libraries required on your system + LIBS= -ldb -ldbm -lresolv -lsocket -lnsl -lelf + + # location of sendmail binary (usually /usr/sbin or /usr/lib) + BINDIR= ${DESTDIR}/usr/ucblib + + # location of sendmail.st file (usually /var/log or /usr/lib) + STDIR= ${DESTDIR}/usr/ucblib + + # location of sendmail.hf file (usually /usr/share/misc or /usr/lib) + HFDIR= ${DESTDIR}/usr/ucblib + + # additional .o files needed + OBJADD= + + ################### end of user configuration flags ###################### + + CFLAGS= -I. $O ${INCDIRS} ${DBMDEF} ${ENVDEF} + + OBJS= alias.o arpadate.o clock.o collect.o conf.o convtime.o daemon.o \ + deliver.o domain.o envelope.o err.o headers.o macro.o main.o \ + map.o mci.o parseaddr.o queue.o readcf.o recipient.o \ + savemail.o srvrsmtp.o stab.o stats.o sysexits.o \ + trace.o udb.o usersmtp.o util.o version.o ${OBJADD} + + LINKS= ${DESTDIR}/usr/ucb/newaliases ${DESTDIR}/usr/ucb/mailq + BINOWN= root + BINGRP= mail + BINMODE=6555 + INSTALL=/usr/ucb/install + + ALL= sendmail aliases.0 newaliases.0 sendmail.0 + + all: ${ALL} + + sendmail: ${BEFORE} ${OBJS} + ${CC} -o sendmail ${OBJS} ${LIBDIRS} ${LIBS} + + aliases.0: aliases.5 + nroff -h -mandoc aliases.5 > aliases.0 + + newaliases.0: newaliases.1 + nroff -h -mandoc newaliases.1 > newaliases.0 + + sendmail.0: sendmail.8 + nroff -h -mandoc sendmail.8 > sendmail.0 + + install: install-sendmail install-docs + + install-sendmail: sendmail + ${INSTALL} -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} sendmail ${BINDIR} + for i in ${LINKS}; do rm -f $$i; ln -s ${BINDIR}/sendmail $$i; done + ${INSTALL} -c -o ${BINOWN} -g ${BINGRP} -m 644 /dev/null \ + ${STDIR}/sendmail.st + ${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 + + clean: + rm -f ${OBJS} sendmail aliases.0 newaliases.0 sendmail.0 + + # dependencies + # gross overkill, and yet still not quite enough.... + ${OBJS}: sendmail.h conf.h *** src/Makefile.Solaris.OLD Sun Nov 14 07:47:59 1993 --- src/Makefile.Solaris Tue Dec 28 18:07:03 1993 *************** *** 9,17 **** # # use O=-O (usual) or O=-g (debugging) ! O= -O ! CC= gcc -V2.3.3 # define the database mechanism used for alias lookups: # -DNDBM -- use new DBM --- 9,18 ---- # # use O=-O (usual) or O=-g (debugging) ! # warning: do not use -O with gcc ! O= ! CC= gcc # define the database mechanism used for alias lookups: # -DNDBM -- use new DBM *************** *** 20,49 **** # The really old (V7) DBM library is no longer supported. # See READ_ME for a description of how these flags interact. # ! DBMDEF= -DNDBM # environment definitions (e.g., -D_AIX3) ENVDEF= -DSOLARIS # see also conf.h for additional compilation flags # include directories ! INCDIRS=-I/usr/sww/include/db # library directories ! LIBDIRS=-L/usr/sww/lib -L/usr/ucblib # libraries required on your system LIBS= -lresolv -lsocket -lnsl -lelf # location of sendmail binary (usually /usr/sbin or /usr/lib) ! BINDIR= ${DESTDIR}/usr/sbin # location of sendmail.st file (usually /var/log or /usr/lib) STDIR= ${DESTDIR}/var/log # location of sendmail.hf file (usually /usr/share/misc or /usr/lib) ! HFDIR= ${DESTDIR}/usr/share/misc # additional .o files needed OBJADD= --- 21,51 ---- # The really old (V7) DBM library is no longer supported. # See READ_ME for a description of how these flags interact. # ! DBMDEF= -DNDBM -DNIS # environment definitions (e.g., -D_AIX3) + # include -DSOLARIS_2_3 for version 2.3 and higher ENVDEF= -DSOLARIS # see also conf.h for additional compilation flags # include directories ! INCDIRS=-I/usr/sww/include/db -I. # library directories ! LIBDIRS=-L/usr/sww/lib # libraries required on your system LIBS= -lresolv -lsocket -lnsl -lelf # location of sendmail binary (usually /usr/sbin or /usr/lib) ! BINDIR= ${DESTDIR}/usr/lib # location of sendmail.st file (usually /var/log or /usr/lib) STDIR= ${DESTDIR}/var/log # location of sendmail.hf file (usually /usr/share/misc or /usr/lib) ! HFDIR= ${DESTDIR}/etc/mail # additional .o files needed OBJADD= *************** *** 85,91 **** install-sendmail: sendmail ${INSTALL} -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} sendmail ${BINDIR} for i in ${LINKS}; do rm -f $$i; ln -s ${BINDIR}/sendmail $$i; done ! ${INSTALL} -c -o ${BINOWN} -g ${BINGRP} -m 666 /dev/null \ ${STDIR}/sendmail.st ${INSTALL} -c -o ${BINOWN} -g ${BINGRP} -m 444 sendmail.hf ${HFDIR} --- 87,93 ---- install-sendmail: sendmail ${INSTALL} -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} sendmail ${BINDIR} for i in ${LINKS}; do rm -f $$i; ln -s ${BINDIR}/sendmail $$i; done ! ${INSTALL} -c -o ${BINOWN} -g ${BINGRP} -m 644 /dev/null \ ${STDIR}/sendmail.st ${INSTALL} -c -o ${BINOWN} -g ${BINGRP} -m 444 sendmail.hf ${HFDIR} *** src/Makefile.SunOS.OLD Sat Dec 18 11:20:33 1993 --- src/Makefile.SunOS Sat Dec 18 11:22:35 1993 *************** *** 89,95 **** install-sendmail: sendmail install -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} sendmail ${BINDIR} for i in ${LINKS}; do rm -f $$i; ln -s ${BINDIR}/sendmail $$i; done ! install -c -o ${BINOWN} -g ${BINGRP} -m 666 /dev/null \ ${STDIR}/sendmail.st install -c -o ${BINOWN} -g ${BINGRP} -m 444 sendmail.hf ${HFDIR} --- 89,95 ---- install-sendmail: sendmail install -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} sendmail ${BINDIR} for i in ${LINKS}; do rm -f $$i; ln -s ${BINDIR}/sendmail $$i; done ! install -c -o ${BINOWN} -g ${BINGRP} -m 644 /dev/null \ ${STDIR}/sendmail.st install -c -o ${BINOWN} -g ${BINGRP} -m 444 sendmail.hf ${HFDIR} *** src/Makefile.Titan.OLD Wed Dec 1 09:18:46 1993 --- src/Makefile.Titan Sat Dec 18 11:22:38 1993 *************** *** 0 **** --- 1,109 ---- + # + # 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.7 (Berkeley) 9/3/93 + # + + # put the compiler in BSD mode + CC= cc -43 + + # use O=-O (usual) or O=-g (debugging) + O= -O + + # define the database mechanisms available for map & alias lookups: + # -DNDBM -- use new DBM + # -DNEWDB -- use new Berkeley DB + # -DNIS -- include NIS support + # The really old (V7) DBM library is no longer supported. + # See READ_ME for a description of how these flags interact. + # + DBMDEF= -DNDBM + + # environment definitions (e.g., -D_AIX3) + ENVDEF= + + # see also conf.h for additional compilation flags + + # include directories + INCDIRS= + + # loader options + LDOPTS= + + # library directories + LIBDIRS= + + # libraries required on your system + LIBS= -ldbm + + # location of sendmail binary (usually /usr/sbin or /usr/lib) + BINDIR= ${DESTDIR}/usr/lib + + # location of sendmail.st file (usually /var/log or /usr/lib) + STDIR= ${DESTDIR}/var/log + + # location of sendmail.hf file (usually /usr/share/misc or /usr/lib) + HFDIR= ${DESTDIR}/usr/share/misc + + # additional .o files needed + OBJADD= + + # additional pseudo-sources needed + BEFORE= stddef.h stdlib.h + + ################### end of user configuration flags ###################### + + CFLAGS= -I. $O ${INCDIRS} ${DBMDEF} ${ENVDEF} + + OBJS= alias.o arpadate.o clock.o collect.o conf.o convtime.o daemon.o \ + deliver.o domain.o envelope.o err.o headers.o macro.o main.o \ + map.o mci.o parseaddr.o queue.o readcf.o recipient.o \ + savemail.o srvrsmtp.o stab.o stats.o sysexits.o \ + trace.o udb.o usersmtp.o util.o version.o ${OBJADD} + + LINKS= ${DESTDIR}/usr/ucb/newaliases ${DESTDIR}/usr/ucb/mailq + BINOWN= root + BINGRP= kmem + BINMODE=6555 + + ALL= sendmail aliases.0 newaliases.0 sendmail.0 + + all: ${ALL} + + sendmail: ${BEFORE} ${OBJS} + ${CC} -o sendmail ${LDOPTS} ${OBJS} ${LIBDIRS} ${LIBS} + + stddef.h stdlib.h: + cp /dev/null $@ + + aliases.0: aliases.5 + nroff -h -mandoc aliases.5 > aliases.0 + + newaliases.0: newaliases.1 + nroff -h -mandoc newaliases.1 > newaliases.0 + + sendmail.0: sendmail.8 + nroff -h -mandoc sendmail.8 > sendmail.0 + + install: install-sendmail install-docs + + install-sendmail: sendmail + install -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} sendmail ${BINDIR} + for i in ${LINKS}; do rm -f $$i; ln -s ${BINDIR}/sendmail $$i; done + install -c -o ${BINOWN} -g ${BINGRP} -m 644 /dev/null \ + ${STDIR}/sendmail.st + 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 + + clean: + rm -f ${OBJS} sendmail aliases.0 newaliases.0 sendmail.0 + + # dependencies + # gross overkill, and yet still not quite enough.... + ${OBJS}: sendmail.h conf.h *** src/Makefile.ULTRIX.OLD Sat Dec 18 11:20:33 1993 --- src/Makefile.ULTRIX Sat Dec 18 11:22:41 1993 *************** *** 85,91 **** install-sendmail: sendmail install -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} sendmail ${BINDIR} for i in ${LINKS}; do rm -f $$i; ln -s ${BINDIR}/sendmail $$i; done ! install -c -o ${BINOWN} -g ${BINGRP} -m 666 /dev/null \ ${STDIR}/sendmail.st install -c -o ${BINOWN} -g ${BINGRP} -m 444 sendmail.hf ${HFDIR} --- 85,91 ---- install-sendmail: sendmail install -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} sendmail ${BINDIR} for i in ${LINKS}; do rm -f $$i; ln -s ${BINDIR}/sendmail $$i; done ! install -c -o ${BINOWN} -g ${BINGRP} -m 644 /dev/null \ ${STDIR}/sendmail.st install -c -o ${BINOWN} -g ${BINGRP} -m 444 sendmail.hf ${HFDIR} *** src/Makefile.UMAX.OLD Sat Dec 18 11:20:34 1993 --- src/Makefile.UMAX Sat Dec 18 11:22:44 1993 *************** *** 92,98 **** install-sendmail: sendmail install -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} sendmail ${BINDIR} for i in ${LINKS}; do rm -f $$i; ln -s ${BINDIR}/sendmail $$i; done ! install -c -o ${BINOWN} -g ${BINGRP} -m 666 /dev/null \ ${STDIR}/sendmail.st install -c -o ${BINOWN} -g ${BINGRP} -m 444 sendmail.hf ${HFDIR} --- 92,98 ---- install-sendmail: sendmail install -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} sendmail ${BINDIR} for i in ${LINKS}; do rm -f $$i; ln -s ${BINDIR}/sendmail $$i; done ! install -c -o ${BINOWN} -g ${BINGRP} -m 644 /dev/null \ ${STDIR}/sendmail.st install -c -o ${BINOWN} -g ${BINGRP} -m 444 sendmail.hf ${HFDIR} *** src/Makefile.Utah.OLD Sat Dec 18 11:20:34 1993 --- src/Makefile.Utah Sat Dec 18 11:23:01 1993 *************** *** 31,39 **** BINMODE=6555 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 \ ${DESTDIR}/var/log/sendmail.st install -c -o ${BINOWN} -g ${BINGRP} -m 444 ${.CURDIR}/sendmail.hf \ ${DESTDIR}/usr/share/misc --- 31,37 ---- BINMODE=6555 beforeinstall: ! 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 *** src/Makefile.dist.OLD Wed Dec 1 19:09:34 1993 --- src/Makefile.dist Mon Dec 20 10:52:10 1993 *************** *** 5,11 **** # 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 # # use O=-O (usual) or O=-g (debugging) --- 5,11 ---- # 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.9 (Berkeley) 12/20/93 # # use O=-O (usual) or O=-g (debugging) *************** *** 80,93 **** sendmail.0: sendmail.8 nroff -h -mandoc sendmail.8 > sendmail.0 install: install-sendmail install-docs install-sendmail: sendmail ! install -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} sendmail ${BINDIR} for i in ${LINKS}; do rm -f $$i; ln -s ${BINDIR}/sendmail $$i; done ! install -c -o ${BINOWN} -g ${BINGRP} -m 666 /dev/null \ ${STDIR}/sendmail.st ! 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 --- 80,95 ---- sendmail.0: sendmail.8 nroff -h -mandoc sendmail.8 > sendmail.0 + INSTALL=install + install: install-sendmail install-docs install-sendmail: sendmail ! ${INSTALL} -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} sendmail ${BINDIR} for i in ${LINKS}; do rm -f $$i; ln -s ${BINDIR}/sendmail $$i; done ! ${INSTALL} -c -o ${BINOWN} -g ${BINGRP} -m 644 /dev/null \ ${STDIR}/sendmail.st ! ${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 *** src/READ_ME.OLD Sun Nov 7 13:11:29 1993 --- src/READ_ME Wed Jan 12 06:00:15 1994 *************** *** 30,36 **** # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF # SUCH DAMAGE. # ! # @(#)READ_ME 8.31 (Berkeley) 10/31/93 # This directory contains the source files for sendmail. --- 30,36 ---- # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF # SUCH DAMAGE. # ! # @(#)READ_ME 8.47 (Berkeley) 1/12/94 # This directory contains the source files for sendmail. *************** *** 39,49 **** 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 published a description of porting ! this make in comp.unix.bsd.) This Makefile has assumptions about the ! 4.4 file system layout built in. There is also a Makefile.dist which is much less clever, but works on the old traditional make. You can use this using: --- 39,48 ---- eqn ../doc/op.me | pic | ditroff -me ! 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: *************** *** 50,75 **** 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. 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: Read the appropriate paragraphs in the section on ! ``Operating System and Compile Quirks''. +----------------------+ | DATABASE DEFINITIONS | +----------------------+ --- 49,126 ---- make -f Makefile.dist ! ************************************************** ! ** 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. ! ************************************************************************** ! ** 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 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 + + BINDIR?= /usr/sbin + + +----------------------+ | DATABASE DEFINITIONS | +----------------------+ *************** *** 83,89 **** 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!] 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 --- 134,142 ---- 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! 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 *************** *** 119,124 **** --- 172,179 ---- 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. *************** *** 125,130 **** --- 180,186 ---- _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 *************** *** 131,137 **** 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. 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 --- 187,193 ---- 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 (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 *************** *** 166,177 **** 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. 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. 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 --- 222,261 ---- 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, ! 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 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 *************** *** 206,211 **** --- 290,306 ---- 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,235 **** 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. This is assumed unless you are running on Ultrix or HP-UX, both of which have a problem in the UDP ! implementation. 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. --- 321,331 ---- Normally defined in the Makefile. USERDB Include support for the User Information Database. Implied by NEWDB in conf.h. ! 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 ! 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. *************** *** 256,265 **** default in conf.h. ! +-------------------------------------+ | OPERATING SYSTEM AND COMPILE QUIRKS | +-------------------------------------+ 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 --- 352,420 ---- 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 | +-------------------------------------+ + 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 *************** *** 268,274 **** 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 version 4.9 on gatekeeper.DEC.COM in pub/BSD/bind/4.9. There is substantial disagreement about whether you can make --- 423,430 ---- 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 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 *************** *** 299,313 **** 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 ! was able to get an unofficial, unsupported ! patch. 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. NeXT If you are compiling on NeXT, you will have to create an empty --- 455,475 ---- 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. 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 ! 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 *************** *** 329,338 **** 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. 4.3BSD If you are running a "virgin" version of 4.3BSD, you'll have a very old resolver and be missing some header files. The --- 491,522 ---- You may have to use -DNeXT. ! 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 a very old resolver and be missing some header files. The *************** *** 346,376 **** copy ../contrib/oldbind.compat.c into src and add oldbind.compat.o to OBJADD in the Makefile. - Linux - From: Karl London - 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" --- 530,535 ---- *************** *** 401,406 **** --- 560,623 ---- DG/UX -- the person who has this working, Douglas Anderson , 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" + 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 . + 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 *************** *** 426,431 **** --- 643,684 ---- 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 | +-----------------------------+ *************** *** 489,492 **** Eric Allman ! (Version 8.31, last update 10/31/93 11:32:52) --- 742,745 ---- Eric Allman ! (Version 8.47, last update 1/12/94 05:59:56) *** src/alias.c.OLD Thu Nov 11 06:14:30 1993 --- src/alias.c Sat Dec 11 14:21:35 1993 *************** *** 36,42 **** # include #ifndef lint ! static char sccsid[] = "@(#)alias.c 8.19 (Berkeley) 10/31/93"; #endif /* not lint */ --- 36,42 ---- # include #ifndef lint ! static char sccsid[] = "@(#)alias.c 8.21 (Berkeley) 12/11/93"; #endif /* not lint */ *************** *** 144,150 **** owner = aliaslookup(obuf, e); if (owner != NULL) { ! if (strchr(owner, ',') != NULL) owner = obuf; a->q_owner = newstr(owner); } --- 144,150 ---- owner = aliaslookup(obuf, e); if (owner != NULL) { ! if (strpbrk(owner, ",:/|\"") != NULL) owner = obuf; a->q_owner = newstr(owner); } *************** *** 570,576 **** } if (parseaddr(line, &al, RF_COPYALL, ':', NULL, CurEnv) == NULL) { ! syserr("554 %s... illegal alias name", al.q_paddr); continue; } --- 570,576 ---- } if (parseaddr(line, &al, RF_COPYALL, ':', NULL, CurEnv) == NULL) { ! syserr("554 %.40s... illegal alias name", line); continue; } *** src/cdefs.h.OLD Tue Jan 4 09:53:56 1994 --- src/cdefs.h Fri Jan 7 17:20:58 1994 *************** *** 2,7 **** --- 2,10 ---- * 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: *************** *** 30,36 **** * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ! * @(#)cdefs.h 8.2 (Berkeley) 10/4/93 */ #ifndef _CDEFS_H_ --- 33,39 ---- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ! * @(#)cdefs.h 8.5 (Berkeley) 1/4/94 */ #ifndef _CDEFS_H_ *************** *** 56,64 **** #define __CONCAT(x,y) x ## y #define __STRING(x) #x ! #if !defined(__GNUC__) && !defined(__cplusplus) ! #define inline ! #endif #else /* !(__STDC__ || __cplusplus) */ #define __P(protos) () /* traditional C preprocessor */ --- 59,74 ---- #define __CONCAT(x,y) x ## y #define __STRING(x) #x ! #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 */ *************** *** 65,98 **** #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__ */ #define const /* delete ANSI C keywords */ #define inline #define signed #define volatile #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. */ #if defined(__GNUC__) && !defined(__STRICT_ANSI__) ! #define __dead __volatile ! #define __pure __const ! #else ! #define __dead ! #define __pure #endif #endif /* !_CDEFS_H_ */ --- 75,122 ---- #define __CONCAT(x,y) x/**/y #define __STRING(x) "x" ! #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 + #endif #endif /* !__GNUC__ */ #endif /* !(__STDC__ || __cplusplus) */ /* ! * 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__) ! #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_ */ *** src/clock.c.OLD Sun Oct 24 13:47:32 1993 --- src/clock.c Wed Jan 12 06:00:02 1994 *************** *** 33,39 **** */ #ifndef lint ! static char sccsid[] = "@(#)clock.c 8.7 (Berkeley) 10/21/93"; #endif /* not lint */ # include "sendmail.h" --- 33,39 ---- */ #ifndef lint ! static char sccsid[] = "@(#)clock.c 8.8 (Berkeley) 1/12/94"; #endif /* not lint */ # include "sendmail.h" *************** *** 60,66 **** ** none. */ ! static void tick(); EVENT * setevent(intvl, func, arg) --- 60,66 ---- ** none. */ ! static void tick __P((int)); EVENT * setevent(intvl, func, arg) *************** *** 101,107 **** printf("setevent: intvl=%ld, for=%ld, func=%x, arg=%d, ev=%x\n", intvl, now + intvl, func, arg, ev); ! tick(); return (ev); } /* --- 101,107 ---- printf("setevent: intvl=%ld, for=%ld, func=%x, arg=%d, ev=%x\n", intvl, now + intvl, func, arg, ev); ! tick(0); return (ev); } /* *************** *** 143,149 **** } /* restore clocks and pick up anything spare */ ! tick(); } /* ** TICK -- take a clock tick --- 143,149 ---- } /* restore clocks and pick up anything spare */ ! tick(0); } /* ** TICK -- take a clock tick *************** *** 151,157 **** ** Called by the alarm clock. This routine runs events as needed. ** ** Parameters: ! ** none. ** ** Returns: ** none. --- 151,157 ---- ** Called by the alarm clock. This routine runs events as needed. ** ** Parameters: ! ** One that is ignored; for compatibility with signal handlers. ** ** Returns: ** none. *************** *** 161,167 **** */ static void ! tick() { register time_t now; register EVENT *ev; --- 161,168 ---- */ static void ! tick(arg) ! int arg; { register time_t now; register EVENT *ev; *** src/collect.c.OLD Wed Nov 17 16:29:54 1993 --- src/collect.c Sat Jan 8 17:29:31 1994 *************** *** 33,39 **** */ #ifndef lint ! static char sccsid[] = "@(#)collect.c 8.6 (Berkeley) 10/27/93"; #endif /* not lint */ # include --- 33,39 ---- */ #ifndef lint ! static char sccsid[] = "@(#)collect.c 8.8 (Berkeley) 1/8/94"; #endif /* not lint */ # include *************** *** 160,166 **** if (sfgets(freebuf, MAXLINE, InChannel, TimeOuts.to_datablock, "message header read") == NULL) ! goto readerr; /* is this a continuation line? */ if (*freebuf != ' ' && *freebuf != '\t') --- 160,169 ---- if (sfgets(freebuf, MAXLINE, InChannel, TimeOuts.to_datablock, "message header read") == NULL) ! { ! freebuf[0] = '\0'; ! break; ! } /* is this a continuation line? */ if (*freebuf != ' ' && *freebuf != '\t') *************** *** 257,263 **** break; /* check for transparent dot */ ! if (OpMode == MD_SMTP && bp[0] == '.' && bp[1] == '.') bp++; /* --- 260,267 ---- break; /* check for transparent dot */ ! if ((OpMode == MD_SMTP || OpMode == MD_DAEMON) && ! bp[0] == '.' && bp[1] == '.') bp++; /* *************** *** 278,283 **** --- 282,289 ---- if (feof(InChannel) || ferror(InChannel)) { readerr: + if (tTd(30, 1)) + printf("collect: read error\n"); inputerr = TRUE; } *************** *** 290,296 **** } /* An EOF when running SMTP is an error */ ! if (inputerr && OpMode == MD_SMTP) { char *host; char *problem; --- 296,302 ---- } /* An EOF when running SMTP is an error */ ! if (inputerr && (OpMode == MD_SMTP || OpMode == MD_DAEMON)) { char *host; char *problem; *** src/conf.c.OLD Sun Nov 7 14:05:27 1993 --- src/conf.c Tue Jan 11 07:04:01 1994 *************** *** 33,39 **** */ #ifndef lint ! static char sccsid[] = "@(#)conf.c 8.42 (Berkeley) 10/21/93"; #endif /* not lint */ # include "sendmail.h" --- 33,39 ---- */ #ifndef lint ! static char sccsid[] = "@(#)conf.c 8.62 (Berkeley) 1/9/94"; #endif /* not lint */ # include "sendmail.h" *************** *** 40,45 **** --- 40,46 ---- # include "pathnames.h" # include # include + # include # include /* *************** *** 597,603 **** # include #endif ! init_md() { #ifdef _AUX_SOURCE setcompat(getcompat() | COMPAT_BSDPROT); --- 598,606 ---- # include #endif ! init_md(argc, argv) ! int argc; ! char **argv; { #ifdef _AUX_SOURCE setcompat(getcompat() | COMPAT_BSDPROT); *************** *** 792,801 **** #if LA_TYPE == LA_MACH /* ! ** This has been tested on NeXT release 2.1. */ ! #include getla() { --- 795,808 ---- #if LA_TYPE == LA_MACH /* ! ** This has been tested on NEXTSTEP release 2.1/3.X. */ ! #if defined(NX_CURRENT_COMPILER_RELEASE) && NX_CURRENT_COMPILER_RELEASE > NX_COMPILER_RELEASE_3_0 ! # include ! #else ! # include ! #endif getla() { *************** *** 910,915 **** --- 917,923 ---- # include # 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 *************** *** 920,925 **** --- 928,937 ---- # endif #endif + #ifndef PROCTITLEPAD + # define PROCTITLEPAD ' ' + #endif + /*VARARGS1*/ #ifdef __STDC__ setproctitle(char *fmt, ...) *************** *** 969,975 **** (void) strcpy(Argv[0], buf); p = &Argv[0][i]; while (p < LastArgv) ! *p++ = ' '; # endif # endif # endif /* SETPROCTITLE */ --- 981,987 ---- (void) strcpy(Argv[0], buf); p = &Argv[0][i]; while (p < LastArgv) ! *p++ = PROCTITLEPAD; # endif # endif # endif /* SETPROCTITLE */ *************** *** 1258,1266 **** /* * 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 */ char *optarg; /* argument associated with option */ #define BADCH (int)'?' --- 1270,1282 ---- /* * get option letter from argument vector */ ! #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)'?' *************** *** 1269,1277 **** fputc(optopt,stderr);fputc('\n',stderr);return(BADCH);} getopt(nargc,nargv,ostr) ! int nargc; ! char **nargv, ! *ostr; { static char *place = EMSG; /* option letter processing */ static char atend = 0; --- 1285,1293 ---- fputc(optopt,stderr);fputc('\n',stderr);return(BADCH);} getopt(nargc,nargv,ostr) ! int nargc; ! char *const *nargv; ! const char *ostr; { static char *place = EMSG; /* option letter processing */ static char atend = 0; *************** *** 1356,1361 **** --- 1372,1468 ---- #endif /* + ** 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 + } + /* ** FREESPACE -- see how much free space is on the queue filesystem ** ** Only implemented if you have statfs. *************** *** 1382,1391 **** #endif #ifdef HASSTATFS ! # if defined(IRIX) || defined(apollo) || defined(_SCO_unix_) || defined(UMAXV) || defined(DGUX) # include # else ! # if (defined(sun) && !defined(BSD)) || defined(__hpux) || defined(_CONVEX_SOURCE) || defined(NeXT) || defined(_AUX_SOURCE) # include # else # include --- 1489,1498 ---- #endif #ifdef HASSTATFS ! # if defined(IRIX) || defined(apollo) || defined(_SCO_unix_) || defined(UMAXV) || defined(DGUX) || defined(_AIX3) # include # else ! # if (defined(sun) && !defined(BSD)) || defined(__hpux) || defined(_CONVEX_SOURCE) || defined(NeXT) || defined(_AUX_SOURCE) || defined(MACH386) # include # else # include *************** *** 1726,1731 **** --- 1833,1848 ---- { 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; } /* *************** *** 1737,1742 **** --- 1854,1865 ---- ** 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 *************** *** 1743,1747 **** setvendor(vendor) char *vendor; { ! return (strcasecmp(vendor, "Berkeley") == 0); } --- 1866,2115 ---- setvendor(vendor) char *vendor; { ! if (strcasecmp(vendor, "Berkeley") == 0) ! return TRUE; ! ! /* add vendor extensions here */ ! ! return FALSE; } + /* + ** 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 + /* + ** 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 + /* + ** 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 + + # 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 */ + /* + ** 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 *** src/conf.h.OLD Sun Nov 7 10:37:02 1993 --- src/conf.h Sat Jan 8 17:53:13 1994 *************** *** 31,37 **** * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ! * @(#)conf.h 8.44 (Berkeley) 10/29/93 */ /* --- 31,37 ---- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ! * @(#)conf.h 8.75 (Berkeley) 1/8/94 */ /* *************** *** 64,70 **** # 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 */ --- 64,69 ---- *************** *** 78,83 **** --- 77,83 ---- # 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 */ *************** *** 89,106 **** # 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. */ ! # define IDENTPROTO 1 /* use IDENT proto (RFC 1413) */ /********************************************************************** ** Operating system configuration. ** --- 89,115 ---- # endif /* ! ** Most systems have symbolic links today, so default them on. You ! ** can turn them off by #undef'ing this below. */ ! # 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. ** *************** *** 114,120 **** /* ! ** HP-UX -- tested for 8.07 */ # ifdef __hpux --- 123,129 ---- /* ! ** HP-UX -- tested for 8.07, 9.00, and 9.01. */ # ifdef __hpux *************** *** 126,134 **** # define HASSETREUID 1 /* has setreuid(2) call */ # define setreuid(r, e) setresuid(r, e, -1) # define LA_TYPE LA_FLOAT # define _PATH_UNIX "/hp-ux" ! # undef IDENTPROTO /* TCP/IP implementation is broken */ # endif /* --- 135,156 ---- # 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" ! # 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 /* *************** *** 137,142 **** --- 159,167 ---- # 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 *************** *** 153,158 **** --- 178,184 ---- # 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 *************** *** 161,184 **** /* ! ** SunOS */ #if defined(sun) && !defined(BSD) # define LA_TYPE LA_INT - # define HASSETREUID 1 /* has setreuid(2) call */ # define HASINITGROUPS 1 /* has initgroups(3) call */ # 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 # include ! # define gethostbyname __switch_gethostbyname /* get working version */ ! # define gethostbyaddr __switch_gethostbyaddr /* get working version */ ! # define _PATH_UNIX "/kernel/unix" # ifndef _PATH_SENDMAILCF # define _PATH_SENDMAILCF "/etc/mail/sendmail.cf" # endif --- 187,221 ---- /* ! ** 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 # 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) */ ! # ifndef __svr4__ ! # define __svr4__ /* use all System V Releae 4 defines below */ ! # endif # include ! # 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 *************** *** 187,202 **** # endif # else ! /* SunOS 4.1.x */ # define HASSTATFS 1 /* has the statfs(2) syscall */ ! /* # define HASFLOCK 1 /* has flock(2) call */ # include # endif #endif /* ! ** DG/UX 5.4.2 */ #ifdef DGUX --- 224,255 ---- # endif # else ! /* SunOS 4.0.3 or 4.1.x */ ! # define HASSETREUID 1 /* has setreuid(2) call */ # define HASSTATFS 1 /* has the statfs(2) syscall */ ! # define HASFLOCK 1 /* has flock(2) call */ # include + # ifdef SUNOS403 + /* special tweaking for SunOS 4.0.3 */ + # include + # 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 /* ! ** DG/UX ! ** ! ** Tested on 5.4.2 */ #ifdef DGUX *************** *** 207,215 **** # 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 */ # undef SETPROCTITLE # define inet_addr dgux_inet_addr extern long dgux_inet_addr(); #endif --- 260,274 ---- # 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 */ ! # ifndef IDENTPROTO ! # define IDENTPROTO 0 /* TCP/IP implementation is broken */ ! # endif # undef SETPROCTITLE + + /* these include files must be included early on DG/UX */ + # include + # include + # define inet_addr dgux_inet_addr extern long dgux_inet_addr(); #endif *************** *** 229,237 **** # 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 */ #endif --- 288,303 ---- # define HASUNSETENV 1 /* has unsetenv(3) call */ # define HASINITGROUPS 1 /* has initgroups(3) call */ # define HASFLOCK 1 /* has flock(2) call */ ! # 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 *************** *** 244,251 **** # 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 LA_TYPE LA_INT #endif --- 310,320 ---- # 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 LA_TYPE LA_INT + # ifndef _PATH_SENDMAILPID + # define _PATH_SENDMAILPID "/var/run/sendmail.pid" + # endif #endif *************** *** 280,285 **** --- 349,356 ---- /* ** 4.4 BSD + ** + ** See also BSD defines. */ #ifdef BSD4_4 *************** *** 294,305 **** /* ! ** 386BSD / FreeBSD 1.0E (works) / NetBSD (not tested) ** ** 4.3BSD clone, closer to 4.4BSD */ ! #ifdef __386BSD__ # define HASUNSETENV 1 /* has unsetenv(3) call */ # define HASSETSID 1 /* has the setsid(2) POSIX syscall */ # define HASSTATFS 1 /* has the statfs(2) syscall */ --- 365,378 ---- /* ! ** 386BSD / FreeBSD 1.0E / NetBSD (all architectures, all versions) ** ** 4.3BSD clone, closer to 4.4BSD + ** + ** See also BSD defines. */ ! #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 */ *************** *** 312,317 **** --- 385,420 ---- /* + ** 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 ** ** You'll also have to install a new resolver library. *************** *** 329,349 **** # ifndef _PATH_SENDMAILCF # define _PATH_SENDMAILCF "/usr/lib/sendmail.cf" # endif ! # undef IDENTPROTO /* TCP/IP implementation is broken */ #endif /* ** SCO Unix */ #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 FORK fork # define MAXPATHLEN PATHSIZE # define LA_TYPE LA_SHORT #endif --- 432,476 ---- # ifndef _PATH_SENDMAILCF # define _PATH_SENDMAILCF "/usr/lib/sendmail.cf" # endif ! # 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 + ** + ** This includes two parts -- the first is for SCO Open Server 3.2v4 + ** (contributed by Philippe Brand ). + ** 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 */ + # define HASGETUSERSHELL 0 /* does not have getusershell(3) call */ # define FORK fork # define MAXPATHLEN PATHSIZE # define LA_TYPE LA_SHORT + # undef NETUNIX /* no unix domain socket support */ #endif *************** *** 358,379 **** # define HASSETSID 1 /* has POSIX setsid(2) call */ # define NEEDGETOPT 1 /* need replacement for getopt(3) */ # define LA_TYPE LA_FLOAT ! # undef IDENTPROTO #endif /* ! ** RISC/os 4.51 ** ! ** Untested... */ #ifdef RISCOS # define HASUNSETENV 1 /* has unsetenv(3) call */ ! /* # define HASFLOCK 1 /* has flock(2) call */ # define LA_TYPE LA_INT # define LA_AVENRUN "avenrun" # define _PATH_UNIX "/unix" #endif --- 485,522 ---- # define HASSETSID 1 /* has POSIX setsid(2) call */ # define NEEDGETOPT 1 /* need replacement for getopt(3) */ # define LA_TYPE LA_FLOAT ! # ifndef IDENTPROTO ! # define IDENTPROTO 0 /* TCP/IP implementation is broken */ ! # endif #endif /* ! ** RISC/os 4.52 ** ! ** Gives a ton of warning messages, but otherwise compiles. */ #ifdef RISCOS + # define HASUNSETENV 1 /* has unsetenv(3) 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" + # 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 *************** *** 391,396 **** --- 534,540 ---- # define LA_TYPE LA_FLOAT # endif # include + # define GIDSET_T gid_t #endif *************** *** 400,418 **** ** ** It's on #ifdef DELL_SVR4 because Solaris also gets __svr4__ ** defined, and the definitions conflict. */ #ifdef DELL_SVR4 ! # define SYSTEM5 1 ! /* # define setreuid(r, e) seteuid(e) */ ! /* # include */ ! # 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 #endif --- 544,558 ---- ** ** It's on #ifdef DELL_SVR4 because Solaris also gets __svr4__ ** defined, and the definitions conflict. + ** + ** Peter Wemm 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 ! /* no changes necessary */ ! /* see general __svr4__ defines below */ #endif *************** *** 428,434 **** # 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 */ # define FORK fork # ifndef _PATH_SENDMAILCF # define _PATH_SENDMAILCF "/usr/lib/sendmail.cf" --- 568,576 ---- # 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 */ ! # ifndef IDENTPROTO ! # define IDENTPROTO 0 /* TCP/IP implementation is broken */ ! # endif # define FORK fork # ifndef _PATH_SENDMAILCF # define _PATH_SENDMAILCF "/usr/lib/sendmail.cf" *************** *** 453,458 **** --- 595,601 ---- # 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 */ *************** *** 464,470 **** --- 607,668 ---- #endif + /* + ** Stardent Titan 3000 running TitanOS 4.2. + ** + ** Must be compiled in "cc -43" mode. + ** + ** From Kate Hedstrom . + ** + ** 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 . + */ + + #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 */ + # 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 **********************************************************************/ *************** *** 481,491 **** --- 679,714 ---- # 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 + # include # 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 *************** *** 494,504 **** # 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 */ --- 717,722 ---- *************** *** 515,521 **** --- 733,767 ---- # 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 ** primarily to provide back compatibility for older systems -- for *************** *** 524,531 **** /* System 5 compatibility */ #ifndef S_ISREG ! #define S_ISREG(foo) ((foo & S_IFREG) == S_IFREG) #endif #ifndef S_IWGRP #define S_IWGRP 020 #endif --- 770,780 ---- /* System 5 compatibility */ #ifndef S_ISREG ! # 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 *************** *** 656,661 **** --- 905,915 ---- 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 *************** *** 663,671 **** */ #ifndef TOBUFSIZE ! # define TOBUFSIZE (1024 - 256) #endif /* fork routine -- set above using #ifdef _osname_ or in Makefile */ # ifndef FORK # define FORK vfork /* function to call to fork mailer */ --- 917,936 ---- */ #ifndef TOBUFSIZE ! # if (SYSLOG_BUFSIZE) > 512 ! # define TOBUFSIZE (SYSLOG_BUFSIZE - 256) ! # else ! # define TOBUFSIZE 256 ! # 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 */ *** src/daemon.c.OLD Sun Nov 7 10:37:39 1993 --- src/daemon.c Sat Jan 8 17:29:32 1994 *************** *** 37,45 **** #ifndef lint #ifdef DAEMON ! static char sccsid[] = "@(#)daemon.c 8.21 (Berkeley) 10/31/93 (with daemon mode)"; #else ! static char sccsid[] = "@(#)daemon.c 8.21 (Berkeley) 10/31/93 (without daemon mode)"; #endif #endif /* not lint */ --- 37,45 ---- #ifndef lint #ifdef DAEMON ! static char sccsid[] = "@(#)daemon.c 8.30 (Berkeley) 1/8/94 (with daemon mode)"; #else ! static char sccsid[] = "@(#)daemon.c 8.30 (Berkeley) 1/8/94 (without daemon mode)"; #endif #endif /* not lint */ *************** *** 110,119 **** getrequests() { int t; - register struct servent *sp; int on = 1; bool refusingconnections = TRUE; FILE *pidf; extern void reapchild(); /* --- 110,119 ---- getrequests() { int t; int on = 1; bool refusingconnections = TRUE; FILE *pidf; + int socksize; extern void reapchild(); /* *************** *** 126,138 **** DaemonAddr.sin.sin_addr.s_addr = INADDR_ANY; if (DaemonAddr.sin.sin_port == 0) { sp = getservbyname("smtp", "tcp"); if (sp == NULL) { syserr("554 service \"smtp\" unknown"); ! goto severe; } ! DaemonAddr.sin.sin_port = sp->s_port; } /* --- 126,141 ---- 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"); ! DaemonAddr.sin.sin_port = htons(25); } ! else ! DaemonAddr.sin.sin_port = sp->s_port; } /* *************** *** 177,198 **** { # ifdef NETINET case AF_INET: ! t = sizeof DaemonAddr.sin; break; # endif # ifdef NETISO case AF_ISO: ! t = sizeof DaemonAddr.siso; break; # endif default: ! t = sizeof DaemonAddr; break; } ! if (bind(DaemonSocket, &DaemonAddr.sa, t) < 0) { syserr("getrequests: cannot bind"); (void) close(DaemonSocket); --- 180,201 ---- { # ifdef NETINET case AF_INET: ! socksize = sizeof DaemonAddr.sin; break; # endif # ifdef NETISO case AF_ISO: ! socksize = sizeof DaemonAddr.siso; break; # endif default: ! socksize = sizeof DaemonAddr; break; } ! if (bind(DaemonSocket, &DaemonAddr.sa, socksize) < 0) { syserr("getrequests: cannot bind"); (void) close(DaemonSocket); *************** *** 260,266 **** do { errno = 0; ! lotherend = sizeof RealHostAddr; t = accept(DaemonSocket, (struct sockaddr *)&RealHostAddr, &lotherend); } while (t < 0 && errno == EINTR); --- 263,269 ---- do { errno = 0; ! lotherend = socksize; t = accept(DaemonSocket, (struct sockaddr *)&RealHostAddr, &lotherend); } while (t < 0 && errno == EINTR); *************** *** 299,305 **** */ (void) setsignal(SIGCHLD, SIG_DFL); - OpMode = MD_SMTP; /* determine host name */ p = hostnamebyanyaddr(&RealHostAddr); --- 302,307 ---- *************** *** 613,619 **** case AF_INET: bcopy(hp->h_addr, &addr.sin.sin_addr, ! hp->h_length); break; #endif --- 615,621 ---- case AF_INET: bcopy(hp->h_addr, &addr.sin.sin_addr, ! sizeof addr.sin.sin_addr); break; #endif *************** *** 639,647 **** if (sp == NULL) { syserr("554 makeconnection: service \"smtp\" unknown"); ! return (EX_OSERR); } ! port = sp->s_port; } switch (addr.sa.sa_family) --- 641,650 ---- if (sp == NULL) { syserr("554 makeconnection: service \"smtp\" unknown"); ! port = htons(25); } ! else ! port = sp->s_port; } switch (addr.sa.sa_family) *************** *** 742,748 **** case AF_INET: bcopy(hp->h_addr_list[i++], &addr.sin.sin_addr, ! hp->h_length); break; #endif --- 745,751 ---- case AF_INET: bcopy(hp->h_addr_list[i++], &addr.sin.sin_addr, ! sizeof addr.sin.sin_addr); break; #endif *************** *** 846,852 **** ** Sets RealHostName to the name of the host at the other end. */ ! #ifdef IDENTPROTO static jmp_buf CtxAuthTimeout; --- 849,855 ---- ** Sets RealHostName to the name of the host at the other end. */ ! #if IDENTPROTO static jmp_buf CtxAuthTimeout; *************** *** 865,871 **** SOCKADDR fa; int falen; register char *p; ! #ifdef IDENTPROTO SOCKADDR la; int lalen; register struct servent *sp; --- 868,874 ---- SOCKADDR fa; int falen; register char *p; ! #if IDENTPROTO SOCKADDR la; int lalen; register struct servent *sp; *************** *** 878,884 **** extern char RealUserName[]; /* main.c */ falen = sizeof fa; ! if (getpeername(fd, &fa.sa, &falen) < 0 || falen <= 0) { RealHostName = "localhost"; (void) sprintf(hbuf, "%s@localhost", RealUserName); --- 881,888 ---- extern char RealUserName[]; /* main.c */ falen = sizeof fa; ! if (getpeername(fd, &fa.sa, &falen) < 0 || falen <= 0 || ! fa.sa.sa_family == 0) { RealHostName = "localhost"; (void) sprintf(hbuf, "%s@localhost", RealUserName); *************** *** 891,897 **** RealHostName = newstr(p); RealHostAddr = fa; ! #ifdef IDENTPROTO lalen = sizeof la; if (fa.sa.sa_family != AF_INET || getsockname(fd, &la.sa, &lalen) < 0 || lalen <= 0 || --- 895,901 ---- RealHostName = newstr(p); RealHostAddr = fa; ! #if IDENTPROTO lalen = sizeof la; if (fa.sa.sa_family != AF_INET || getsockname(fd, &la.sa, &lalen) < 0 || lalen <= 0 || *************** *** 1049,1055 **** 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; --- 1053,1058 ---- *************** *** 1069,1075 **** 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); return s->s_namecanon.nc_cname; } --- 1072,1082 ---- h_errno = s->s_namecanon.nc_herrno; *statp = s->s_namecanon.nc_stat; if (CurEnv->e_message == NULL && *statp == EX_TEMPFAIL) ! { ! sprintf(hbuf, "%s: Name server timeout", ! shortenstring(name, 33)); ! CurEnv->e_message = newstr(hbuf); ! } return s->s_namecanon.nc_cname; } *************** *** 1109,1117 **** case TRY_AGAIN: if (UseNameServer) { ! message(timeoutmsg); if (CurEnv->e_message == NULL) ! CurEnv->e_message = newstr(timeoutmsg); } *statp = EX_TEMPFAIL; break; --- 1116,1126 ---- case TRY_AGAIN: if (UseNameServer) { ! sprintf(hbuf, "%s: Name server timeout", ! shortenstring(name, 33)); ! message("%s", hbuf); if (CurEnv->e_message == NULL) ! CurEnv->e_message = newstr(hbuf); } *statp = EX_TEMPFAIL; break; *************** *** 1200,1205 **** --- 1209,1215 ---- 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); *************** *** 1206,1211 **** --- 1216,1222 ---- else sprintf(buf, "[UNIX: localhost]"); return buf; + #endif #endif #ifdef NETINET *** src/deliver.c.OLD Thu Nov 4 06:54:43 1993 --- src/deliver.c Wed Jan 12 12:38:48 1994 *************** *** 33,39 **** */ #ifndef lint ! static char sccsid[] = "@(#)deliver.c 8.37 (Berkeley) 10/29/93"; #endif /* not lint */ #include "sendmail.h" --- 33,39 ---- */ #ifndef lint ! static char sccsid[] = "@(#)deliver.c 8.62 (Berkeley) 1/12/94"; #endif /* not lint */ #include "sendmail.h" *************** *** 46,51 **** --- 46,53 ---- extern int h_errno; #endif + extern char SmtpError[]; + /* ** SENDALL -- actually send all the messages. ** *************** *** 82,88 **** ** addresses to be sent. */ ! if (bitset(EF_FATALERRS, e->e_flags) && OpMode == MD_SMTP) { e->e_flags |= EF_CLRQUEUE; return; --- 84,91 ---- ** addresses to be sent. */ ! if (bitset(EF_FATALERRS, e->e_flags) && ! (OpMode == MD_SMTP || OpMode == MD_DAEMON)) { e->e_flags |= EF_CLRQUEUE; return; *************** *** 89,94 **** --- 92,98 ---- } /* determine actual delivery mode */ + CurrentLA = getla(); if (mode == SM_DEFAULT) { mode = e->e_sendmode; *************** *** 333,339 **** ** addresses to be sent. */ ! if (bitset(EF_FATALERRS, e->e_flags) && OpMode == MD_SMTP) { e->e_flags |= EF_CLRQUEUE; return; --- 337,344 ---- ** addresses to be sent. */ ! if (bitset(EF_FATALERRS, e->e_flags) && ! (OpMode == MD_SMTP || OpMode == MD_DAEMON)) { e->e_flags |= EF_CLRQUEUE; return; *************** *** 447,456 **** 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); } } else if (!bitset(QDONTSEND|QBADADDR, q->q_flags)) --- 452,466 ---- e->e_to = q->q_paddr; if (!bitset(QDONTSEND|QBADADDR, q->q_flags)) { ! 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)) *************** *** 589,595 **** 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)) --- 599,604 ---- *************** *** 597,603 **** #ifdef NAMED_BIND /* unless interactive, try twice, over a minute */ ! if (OpMode == MD_DAEMON || OpMode == MD_SMTP) { _res.retrans = 30; _res.retry = 2; } --- 606,613 ---- #ifdef NAMED_BIND /* unless interactive, try twice, over a minute */ ! if (OpMode == MD_DAEMON || OpMode == MD_SMTP) ! { _res.retrans = 30; _res.retry = 2; } *************** *** 759,765 **** } /* compute effective uid/gid when sending */ ! if (to->q_mailer == ProgMailer) ctladdr = getctladdr(to); user = to->q_user; --- 769,777 ---- } /* compute effective uid/gid when sending */ ! /* 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; *************** *** 831,840 **** if (m == FileMailer) { ! ADDRESS *caddr = getctladdr(to); ! ! rcode = mailfile(user, caddr, e); ! giveresponse(rcode, m, NULL, caddr, e); if (rcode == EX_OK) to->q_flags |= QSENT; continue; --- 843,850 ---- if (m == FileMailer) { ! rcode = mailfile(user, ctladdr, e); ! giveresponse(rcode, m, NULL, ctladdr, e); if (rcode == EX_OK) to->q_flags |= QSENT; continue; *************** *** 905,912 **** ** If we are running SMTP, we just need to clean up. */ ! if (ctladdr == NULL && m != ProgMailer) ctladdr = &e->e_from; #ifdef NAMED_BIND if (ConfigLevel < 2) _res.options &= ~(RES_DEFNAMES | RES_DNSRCH); /* XXX */ --- 915,924 ---- ** If we are running SMTP, we just need to clean up. */ ! /*XXX this seems a bit wierd */ ! if (ctladdr == NULL && bitset(QGOODUID, e->e_from.q_flags)) ctladdr = &e->e_from; + #ifdef NAMED_BIND if (ConfigLevel < 2) _res.options &= ~(RES_DEFNAMES | RES_DNSRCH); /* XXX */ *************** *** 961,972 **** register int i; register u_short port; CurHostName = pv[1]; curhost = hostsignature(m, pv[1], e); if (curhost == NULL || curhost[0] == '\0') { ! syserr("null signature"); rcode = EX_OSERR; goto give_up; } --- 973,991 ---- 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') { ! syserr("null host signature for %s", pv[1]); rcode = EX_OSERR; goto give_up; } *************** *** 1153,1158 **** --- 1172,1178 ---- if (ctladdr == NULL || ctladdr->q_uid == 0) { (void) initgroups(DefUser, DefGid); + (void) setgid(DefGid); (void) setuid(DefUid); } else *************** *** 1160,1165 **** --- 1180,1186 ---- (void) initgroups(ctladdr->q_ruser? ctladdr->q_ruser: ctladdr->q_user, ctladdr->q_gid); + (void) setgid(ctladdr->q_gid); (void) setuid(ctladdr->q_uid); } } *************** *** 1202,1208 **** } (void) close(rpvect[1]); } ! else if (OpMode == MD_SMTP || HoldErrs) { /* put mailer output in transcript */ if (dup2(fileno(e->e_xfp), STDOUT_FILENO) < 0) --- 1223,1229 ---- } (void) close(rpvect[1]); } ! else if (OpMode == MD_SMTP || OpMode == MD_DAEMON || HoldErrs) { /* put mailer output in transcript */ if (dup2(fileno(e->e_xfp), STDOUT_FILENO) < 0) *************** *** 1333,1339 **** rcode, mci->mci_state, firstsig); rcode = EX_SOFTWARE; } ! else if (rcode == EX_TEMPFAIL && *curhost != '\0') { /* try next MX site */ goto tryhost; --- 1354,1360 ---- rcode, mci->mci_state, firstsig); rcode = EX_SOFTWARE; } ! else if (rcode == EX_TEMPFAIL && curhost != NULL && *curhost != '\0') { /* try next MX site */ goto tryhost; *************** *** 1403,1409 **** if (!bitset(MCIF_CACHED, mci->mci_flags)) smtpquit(m, mci, e); } ! if (rcode != EX_OK && *curhost != '\0') { /* try next MX site */ goto tryhost; --- 1424,1430 ---- if (!bitset(MCIF_CACHED, mci->mci_flags)) smtpquit(m, mci, e); } ! if (rcode != EX_OK && curhost != NULL && *curhost != '\0') { /* try next MX site */ goto tryhost; *************** *** 1500,1511 **** { char buf[MAXLINE]; ! if (rcode == EX_OK) ! return; ! else if (rcode == EX_TEMPFAIL) q->q_flags |= QQUEUEUP; ! else if (rcode != EX_IOERR && rcode != EX_OSERR) q->q_flags |= QBADADDR; } /* ** ENDMAILER -- Wait for mailer to terminate. --- 1521,1541 ---- { char buf[MAXLINE]; ! switch (rcode) ! { ! case EX_OK: ! break; ! ! case EX_TEMPFAIL: ! case EX_IOERR: ! case EX_OSERR: q->q_flags |= QQUEUEUP; ! break; ! ! default: q->q_flags |= QBADADDR; + break; + } } /* ** ENDMAILER -- Wait for mailer to terminate. *************** *** 1537,1545 **** /* close any connections */ if (mci->mci_in != NULL) ! (void) xfclose(mci->mci_in, pv[0], "mci_in"); if (mci->mci_out != NULL) ! (void) xfclose(mci->mci_out, pv[0], "mci_out"); mci->mci_in = mci->mci_out = NULL; mci->mci_state = MCIS_CLOSED; --- 1567,1575 ---- /* close any connections */ if (mci->mci_in != NULL) ! (void) xfclose(mci->mci_in, mci->mci_mailer->m_name, "mci_in"); if (mci->mci_out != NULL) ! (void) xfclose(mci->mci_out, mci->mci_mailer->m_name, "mci_out"); mci->mci_in = mci->mci_out = NULL; mci->mci_state = MCIS_CLOSED; *************** *** 1562,1571 **** } /* it died a horrid death */ ! syserr("mailer %s died with signal %o", pv[0], st); /* log the arguments */ ! if (e->e_xfp != NULL) { register char **av; --- 1592,1602 ---- } /* it died a horrid death */ ! syserr("451 mailer %s died with signal %o", ! mci->mci_mailer->m_name, st); /* log the arguments */ ! if (pv != NULL && e->e_xfp != NULL) { register char **av; *************** *** 1647,1654 **** else { #ifdef SMTP - extern char SmtpError[]; - statmsg = SmtpError; #else /* SMTP */ statmsg = NULL; --- 1678,1683 ---- *************** *** 1710,1716 **** if (stat != EX_TEMPFAIL) setstat(stat); ! if (stat != EX_OK) { if (e->e_message != NULL) free(e->e_message); --- 1739,1745 ---- if (stat != EX_TEMPFAIL) setstat(stat); ! if (stat != EX_OK && (stat != EX_TEMPFAIL || e->e_message == NULL)) { if (e->e_message != NULL) free(e->e_message); *************** *** 1724,1729 **** --- 1753,1762 ---- /* ** 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 *************** *** 1748,1760 **** { # ifdef LOG register char *bp; char buf[512]; bp = buf; if (ctladdr != NULL) { strcpy(bp, ", ctladdr="); ! strcat(bp, ctladdr->q_paddr); bp += strlen(bp); if (bitset(QGOODUID, ctladdr->q_flags)) { --- 1781,1796 ---- { # ifdef LOG register char *bp; + register char *p; + int l; char buf[512]; + # if (SYSLOG_BUFSIZE) >= 256 bp = buf; if (ctladdr != NULL) { strcpy(bp, ", ctladdr="); ! strcat(bp, shortenstring(ctladdr->q_paddr, 83)); bp += strlen(bp); if (bitset(QGOODUID, ctladdr->q_flags)) { *************** *** 1799,1807 **** (void) strcat(bp, p); } } ! syslog(LOG_INFO, "%s: to=%s%s, stat=%s", ! e->e_id, e->e_to, buf, stat); # endif /* LOG */ } /* --- 1835,1945 ---- (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))); ! 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 */ } /* *************** *** 2013,2021 **** if (bitset(0111, stb.st_mode)) exit(EX_CANTCREAT); ! if (ctladdr == NULL) ! ctladdr = &e->e_from; ! else { /* ignore setuid and setgid bits */ mode &= ~(S_ISGID|S_ISUID); --- 2151,2157 ---- if (bitset(0111, stb.st_mode)) exit(EX_CANTCREAT); ! if (ctladdr != NULL) { /* ignore setuid and setgid bits */ mode &= ~(S_ISGID|S_ISUID); *************** *** 2034,2040 **** if (!bitset(S_ISGID, mode) || setgid(stb.st_gid) < 0) { ! if (ctladdr->q_uid == 0) { (void) initgroups(DefUser, DefGid); } --- 2170,2176 ---- if (!bitset(S_ISGID, mode) || setgid(stb.st_gid) < 0) { ! if (ctladdr == NULL || ctladdr->q_uid == 0) { (void) initgroups(DefUser, DefGid); } *************** *** 2047,2053 **** } if (!bitset(S_ISUID, mode) || setuid(stb.st_uid) < 0) { ! if (ctladdr->q_uid == 0) (void) setuid(DefUid); else (void) setuid(ctladdr->q_uid); --- 2183,2189 ---- } if (!bitset(S_ISUID, mode) || setuid(stb.st_uid) < 0) { ! if (ctladdr == NULL || ctladdr->q_uid == 0) (void) setuid(DefUid); else (void) setuid(ctladdr->q_uid); *************** *** 2174,2180 **** if (nmx <= 0) { register MCI *mci; - extern int errno; /* update the connection info for this host */ mci = mci_get(hp, m); --- 2310,2315 ---- *** src/domain.c.OLD Fri Nov 26 17:49:18 1993 --- src/domain.c Tue Dec 21 14:52:18 1993 *************** *** 36,44 **** #ifndef lint #ifdef NAMED_BIND ! static char sccsid[] = "@(#)domain.c 8.8 (Berkeley) 9/29/93 (with name server)"; #else ! static char sccsid[] = "@(#)domain.c 8.8 (Berkeley) 9/29/93 (without name server)"; #endif #endif /* not lint */ --- 36,44 ---- #ifndef lint #ifdef NAMED_BIND ! static char sccsid[] = "@(#)domain.c 8.10 (Berkeley) 12/21/93 (with name server)"; #else ! static char sccsid[] = "@(#)domain.c 8.10 (Berkeley) 12/21/93 (without name server)"; #endif #endif /* not lint */ *************** *** 158,163 **** --- 158,169 ---- 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: *************** *** 419,426 **** --- 425,434 ---- bool gotmx; int qtype; int loopcnt; + char *xp; char nbuf[MAX(PACKETSZ, MAXDNAME*2+2)]; char *searchlist[MAXDNSRCH+2]; + extern char *gethostalias(); if (tTd(8, 2)) printf("getcanonname(%s)\n", host); *************** *** 444,449 **** --- 452,471 ---- 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++ = ""; *************** *** 636,641 **** --- 658,711 ---- host[hbsize - 1] = '\0'; 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 */ *** src/envelope.c.OLD Tue Nov 9 14:38:25 1993 --- src/envelope.c Sun Jan 9 09:22:39 1994 *************** *** 33,39 **** */ #ifndef lint ! static char sccsid[] = "@(#)envelope.c 8.17 (Berkeley) 10/31/93"; #endif /* not lint */ #include "sendmail.h" --- 33,39 ---- */ #ifndef lint ! static char sccsid[] = "@(#)envelope.c 8.28 (Berkeley) 1/9/94"; #endif /* not lint */ #include "sendmail.h" *************** *** 110,116 **** { printf("dropenvelope %x: id=", e); xputs(e->e_id); ! printf(", flags=%o\n", e->e_flags); if (tTd(50, 10)) { printf("sendq="); --- 110,116 ---- { printf("dropenvelope %x: id=", e); xputs(e->e_id); ! printf(", flags=0x%x\n", e->e_flags); if (tTd(50, 10)) { printf("sendq="); *************** *** 123,132 **** return; #ifdef LOG if (LogLevel > 84) ! syslog(LOG_DEBUG, "dropenvelope, id=%s, flags=%o, pid=%d", id, e->e_flags, getpid()); #endif /* LOG */ /* post statistics */ poststats(StatFile); --- 123,135 ---- return; #ifdef LOG + if (LogLevel > 4 && bitset(EF_LOGSENDER, e->e_flags)) + logsender(e, NULL); if (LogLevel > 84) ! syslog(LOG_DEBUG, "dropenvelope, id=%s, flags=0x%x, pid=%d", id, e->e_flags, getpid()); #endif /* LOG */ + e->e_flags &= ~EF_LOGSENDER; /* post statistics */ poststats(StatFile); *************** *** 214,219 **** --- 217,223 ---- (void) sendtolist(e->e_receiptto, NULLADDR, &rlist, e); (void) returntosender("Return receipt", rlist, FALSE, e); + e->e_flags &= ~EF_SENDRECEIPT; } /* *************** *** 272,280 **** (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 } /* ** CLEARENVELOPE -- clear an envelope without unlocking --- 276,281 ---- *************** *** 583,589 **** ** Username can return errno != 0 on non-errors. */ ! if (bitset(EF_QUEUERUN, e->e_flags) || OpMode == MD_SMTP) realname = from; if (realname == NULL || realname[0] == '\0') realname = username(); --- 584,591 ---- ** Username can return errno != 0 on non-errors. */ ! if (bitset(EF_QUEUERUN, e->e_flags) || OpMode == MD_SMTP || ! OpMode == MD_DAEMON) realname = from; if (realname == NULL || realname[0] == '\0') realname = username(); *************** *** 619,625 **** } syslog(LOG_NOTICE, "setsender: %s: invalid or unparseable, received from %s", ! from, p); } # endif /* LOG */ if (from != NULL) --- 621,627 ---- } syslog(LOG_NOTICE, "setsender: %s: invalid or unparseable, received from %s", ! shortenstring(from, 83), p); } # endif /* LOG */ if (from != NULL) *************** *** 681,687 **** ** We have an alternate address for the sender */ ! pvp = prescan(p, '\0', pvpbuf, NULL); } # endif /* USERDB */ } --- 683,689 ---- ** We have an alternate address for the sender */ ! pvp = prescan(p, '\0', pvpbuf, sizeof pvpbuf, NULL); } # endif /* USERDB */ } *************** *** 700,705 **** --- 702,708 ---- /* 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 && *************** *** 714,725 **** if (FullName != NULL && !internal) define('x', FullName, e); } ! else if (!internal) { 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; } /* --- 717,729 ---- if (FullName != NULL && !internal) define('x', FullName, e); } ! 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; + e->e_from.q_flags |= QGOODUID; } /* *************** *** 728,734 **** */ if (pvp == NULL) ! pvp = prescan(from, '\0', pvpbuf, NULL); if (pvp == NULL) { /* don't need to give error -- prescan did that already */ --- 732,738 ---- */ if (pvp == NULL) ! pvp = prescan(from, delimchar, pvpbuf, sizeof pvpbuf, NULL); if (pvp == NULL) { /* don't need to give error -- prescan did that already */ *************** *** 738,746 **** # endif finis(); } ! (void) rewrite(pvp, 3, e); ! (void) rewrite(pvp, 1, e); ! (void) rewrite(pvp, 4, e); bp = buf + 1; cataddr(pvp, NULL, bp, sizeof buf - 2, '\0'); if (*bp == '@') --- 742,750 ---- # endif finis(); } ! (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 == '@') *************** *** 753,759 **** define('f', e->e_sender, e); /* save the domain spec if this mailer wants it */ ! if (!internal && e->e_from.q_mailer != NULL && bitnset(M_CANONICAL, e->e_from.q_mailer->m_flags)) { extern char **copyplist(); --- 757,763 ---- define('f', e->e_sender, e); /* save the domain spec if this mailer wants it */ ! if (e->e_from.q_mailer != NULL && bitnset(M_CANONICAL, e->e_from.q_mailer->m_flags)) { extern char **copyplist(); *** src/err.c.OLD Sun Nov 7 12:03:39 1993 --- src/err.c Sat Jan 8 17:29:31 1994 *************** *** 33,39 **** */ #ifndef lint ! static char sccsid[] = "@(#)err.c 8.14 (Berkeley) 10/29/93"; #endif /* not lint */ # include "sendmail.h" --- 33,39 ---- */ #ifndef lint ! static char sccsid[] = "@(#)err.c 8.19 (Berkeley) 1/8/94"; #endif /* not lint */ # include "sendmail.h" *************** *** 159,166 **** #endif { VA_LOCAL_DECL - extern char SuprErrs; - extern int errno; if (SuprErrs) return; --- 159,164 ---- *************** *** 287,299 **** msg[0] = '5'; (void) fflush(stdout); ! if (OpMode == MD_SMTP) 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]); if (msg[3] == ' ') (void) fflush(OutChannel); if (!ferror(OutChannel)) --- 285,297 ---- msg[0] = '5'; (void) fflush(stdout); ! 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(), ! (OpMode == MD_SMTP || OpMode == MD_DAEMON) ? msg : &msg[4]); if (msg[3] == ' ') (void) fflush(OutChannel); if (!ferror(OutChannel)) *************** *** 449,454 **** --- 447,453 ---- errstring(errno) int errno; { + char *dnsmsg; static char buf[MAXLINE]; # ifndef ERRLIST_PREDEFINED extern char *sys_errlist[]; *************** *** 458,465 **** extern char *SmtpPhase; # endif /* SMTP */ - # ifdef DAEMON - # ifdef ETIMEDOUT /* ** Handle special network error codes. ** --- 457,462 ---- *************** *** 466,473 **** --- 463,472 ---- ** These are 4.2/4.3bsd specific; they should be in daemon.c. */ + dnsmsg = NULL; switch (errno) { + # if defined(DAEMON) && defined(ETIMEDOUT) case ETIMEDOUT: case ECONNRESET: (void) strcpy(buf, sys_errlist[errno]); *************** *** 494,499 **** --- 493,499 ---- break; (void) sprintf(buf, "Connection refused by %s", CurHostName); return (buf); + # endif case EOPENTIMEOUT: return "Timeout on file open"; *************** *** 500,519 **** # ifdef NAMED_BIND case HOST_NOT_FOUND + E_DNSBASE: ! return ("Name server: host not found"); case TRY_AGAIN + E_DNSBASE: ! return ("Name server: host name lookup failure"); case NO_RECOVERY + E_DNSBASE: ! return ("Name server: non-recoverable error"); case NO_DATA + E_DNSBASE: ! return ("Name server: no data known for name"); # endif } ! # endif ! # endif if (errno > 0 && errno < sys_nerr) return (sys_errlist[errno]); --- 500,537 ---- # ifdef NAMED_BIND case HOST_NOT_FOUND + E_DNSBASE: ! dnsmsg = "host not found"; ! break; case TRY_AGAIN + E_DNSBASE: ! dnsmsg = "host name lookup failure"; ! break; case NO_RECOVERY + E_DNSBASE: ! dnsmsg = "non-recoverable error"; ! break; case NO_DATA + E_DNSBASE: ! dnsmsg = "no data known"; ! break; # 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; ! } if (errno > 0 && errno < sys_nerr) return (sys_errlist[errno]); *** src/features.linux.h.OLD Thu Dec 16 16:02:45 1993 --- src/features.linux.h Thu Dec 9 13:43:51 1993 *************** *** 0 **** --- 1,14 ---- + /* + ** This should be renamed features.h on Linux. DO NOT USE IT + ** on any other system. + */ + + #include_next + #undef __USE_POSIX2 + + #ifndef __USE_POSIX + #define __USE_POSIX + #endif + #ifndef __USE_BSD + #define __USE_BSD + #endif *** src/headers.c.OLD Thu Dec 9 13:50:15 1993 --- src/headers.c Wed Jan 12 12:38:49 1994 *************** *** 33,39 **** */ #ifndef lint ! static char sccsid[] = "@(#)headers.c 8.13 (Berkeley) 10/24/93"; #endif /* not lint */ # include --- 33,39 ---- */ #ifndef lint ! static char sccsid[] = "@(#)headers.c 8.22 (Berkeley) 1/13/94"; #endif /* not lint */ # include *************** *** 371,376 **** --- 371,381 ---- 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 = ""; *************** *** 395,401 **** } if (tTd(32, 1)) ! printf("%s: %s\n", h->h_field, h->h_value); /* count the number of times it has been processed */ if (bitset(H_TRACE, h->h_flags)) --- 400,410 ---- } if (tTd(32, 1)) ! { ! 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)) *************** *** 453,463 **** - 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) --- 462,467 ---- *************** *** 471,518 **** # ifdef LOG if (full && LogLevel > 4) ! { ! 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) ! { ! 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); 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 */ } /* ** PRIENCODE -- encode external priority names into internal values. --- 475,571 ---- # ifdef LOG if (full && LogLevel > 4) ! logsender(e, msgid); ! # endif /* LOG */ ! e->e_flags &= ~EF_LOGSENDER; ! } ! /* ! ** 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 ! { ! name = hbuf; ! (void) sprintf(hbuf, "%.80s", RealHostName); ! if (RealHostAddr.sa.sa_family != 0) { ! p = &hbuf[strlen(hbuf)]; ! (void) sprintf(p, " (%s)", ! anynet_ntoa(&RealHostAddr)); } + } ! /* 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); } ! 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 } /* ** PRIENCODE -- encode external priority names into internal values. *************** *** 639,645 **** } /* check for quoted strings */ ! if (c == '"') { qmode = !qmode; if (copylev > 0 && !skipping) --- 692,698 ---- } /* check for quoted strings */ ! if (c == '"' && cmtlev <= 0) { qmode = !qmode; if (copylev > 0 && !skipping) *************** *** 683,693 **** else if (c == ')') { /* syntax error: unmatched ) */ ! if (!skipping) bp--; } - /* check for characters that may have to be quoted */ if (strchr(".'@,;:\\()[]", c) != NULL) { --- 736,745 ---- else if (c == ')') { /* syntax error: unmatched ) */ ! if (copylev > 0 && !skipping) bp--; } /* check for characters that may have to be quoted */ if (strchr(".'@,;:\\()[]", c) != NULL) { *************** *** 864,882 **** printf(" (skipped (resent))\n"); continue; } - if (tTd(34, 11)) - printf("\n"); 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') continue; } if (bitset(H_FROM|H_RCPT, h->h_flags)) { /* address field */ --- 916,939 ---- printf(" (skipped (resent))\n"); continue; } + /* macro expand value if generated internally */ p = h->h_value; if (bitset(H_DEFAULT, h->h_flags)) { expand(p, buf, &buf[sizeof buf], e); p = buf; if (p == NULL || *p == '\0') + { + if (tTd(34, 11)) + printf(" (skipped -- null value)\n"); continue; + } } + if (tTd(34, 11)) + printf("\n"); + if (bitset(H_FROM|H_RCPT, h->h_flags)) { /* address field */ *************** *** 980,986 **** auto char *oldp; char pvpbuf[PSBUFSIZE]; ! (void) prescan(p, oldstyle ? ' ' : ',', pvpbuf, &oldp); p = oldp; /* look to see if we have an at sign */ --- 1037,1044 ---- auto char *oldp; char pvpbuf[PSBUFSIZE]; ! (void) prescan(p, oldstyle ? ' ' : ',', pvpbuf, ! sizeof pvpbuf, &oldp); p = oldp; /* look to see if we have an at sign */ *** src/main.c.OLD Sun Nov 7 16:45:33 1993 --- src/main.c Sun Jan 9 11:09:20 1994 *************** *** 39,45 **** #endif /* not lint */ #ifndef lint ! static char sccsid[] = "@(#)main.c 8.33 (Berkeley) 10/24/93"; #endif /* not lint */ #define _DEFINE --- 39,45 ---- #endif /* not lint */ #ifndef lint ! static char sccsid[] = "@(#)main.c 8.46 (Berkeley) 1/9/94"; #endif /* not lint */ #define _DEFINE *************** *** 155,160 **** --- 155,161 ---- extern char *getcfname(); extern char *optarg; extern char **environ; + extern void dumpstate(); /* ** Check to see if we reentered. *************** *** 170,177 **** reenter = TRUE; /* do machine-dependent initializations */ ! init_md(); /* in 4.4BSD, the table can be huge; impose a reasonable limit */ DtableSize = getdtsize(); if (DtableSize > 256) --- 171,183 ---- reenter = TRUE; /* do machine-dependent initializations */ ! 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(); if (DtableSize > 256) *************** *** 253,265 **** #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 while ((j = getopt(argc, argv, OPTIONS)) != EOF) { switch (j) --- 259,274 ---- #if defined(__osf__) || defined(_AIX3) # define OPTIONS "B:b:C:cd:e:F:f:h:Iimno:p:q:r:sTtvX:x" #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) { switch (j) *************** *** 334,343 **** if (tTd(0, 4)) printf("canonical name: %s\n", jbuf); - p = newstr(jbuf); define('w', newstr(jbuf), CurEnv); /* must be new string */ ! define('j', p, CurEnv); ! setclass('w', p); p = strchr(jbuf, '.'); if (p != NULL) --- 343,351 ---- if (tTd(0, 4)) printf("canonical name: %s\n", jbuf); define('w', newstr(jbuf), CurEnv); /* must be new string */ ! define('j', newstr(jbuf), CurEnv); ! setclass('w', jbuf); p = strchr(jbuf, '.'); if (p != NULL) *************** *** 360,365 **** --- 368,375 ---- p = utsname.nodename; else { + if (tTd(0, 22)) + printf("uname failed (%s)\n", errstring(errno)); makelower(jbuf); p = jbuf; } *************** *** 367,372 **** --- 377,383 ---- printf("UUCP nodename: %s\n", p); p = newstr(p); define('k', p, CurEnv); + setclass('k', p); setclass('w', p); } while (av != NULL && *av != NULL) *************** *** 586,591 **** --- 597,606 ---- 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; *************** *** 601,606 **** --- 616,624 ---- ** Extract special fields for local use. */ + #ifdef XDEBUG + checkfd012("before readcf"); + #endif readcf(getcfname(), safecf, CurEnv); if (tTd(0, 1)) *************** *** 761,766 **** --- 779,788 ---- exit(ExitStat); } + #ifdef XDEBUG + checkfd012("before main() initmaps"); + #endif + /* ** Do operation-mode-dependent initialization. */ *************** *** 899,905 **** { char pvpbuf[PSBUFSIZE]; ! pvp = prescan(++p, ',', pvpbuf, &delimptr); if (pvp == NULL) continue; p = q; --- 921,928 ---- { char pvpbuf[PSBUFSIZE]; ! pvp = prescan(++p, ',', pvpbuf, sizeof pvpbuf, ! &delimptr); if (pvp == NULL) continue; p = q; *************** *** 907,913 **** { int stat; ! stat = rewrite(pvp, atoi(p), CurEnv); if (stat != EX_OK) printf("== Ruleset %s status %d\n", p, stat); --- 930,936 ---- { int stat; ! stat = rewrite(pvp, atoi(p), 0, CurEnv); if (stat != EX_OK) printf("== Ruleset %s status %d\n", p, stat); *************** *** 1005,1011 **** ** commands. This will never return. */ ! if (OpMode == MD_SMTP) smtp(CurEnv); # endif /* SMTP */ --- 1028,1034 ---- ** commands. This will never return. */ ! if (OpMode == MD_SMTP || OpMode == MD_DAEMON) smtp(CurEnv); # endif /* SMTP */ *************** *** 1325,1331 **** obsolete(argv) char *argv[]; { ! char *ap; while ((ap = *++argv) != NULL) { --- 1348,1355 ---- obsolete(argv) char *argv[]; { ! register char *ap; ! register char *op; while ((ap = *++argv) != NULL) { *************** *** 1333,1342 **** if (ap[0] != '-' || ap[1] == '-') return; /* 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] == '-')) { *argv = xalloc(sizeof(__DEFPATH) + 2); argv[0][0] = '-'; --- 1357,1374 ---- 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 (ap[1] == 'C' && ap[2] == '\0') { *argv = xalloc(sizeof(__DEFPATH) + 2); argv[0][0] = '-'; *************** *** 1345,1357 **** } /* If -q doesn't have an argument, run it once. */ ! if (ap[1] == 'q' && ap[2] == '\0' && ! (argv[1] == NULL || argv[1][0] == '-')) *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]))) *argv = "-d0-99.1"; } } --- 1377,1387 ---- } /* If -q doesn't have an argument, run it once. */ ! if (ap[1] == 'q' && ap[2] == '\0') *argv = "-q0"; /* if -d doesn't have an argument, use 0-99.1 */ ! if (ap[1] == 'd' && ap[2] == '\0') *argv = "-d0-99.1"; } } *************** *** 1396,1399 **** --- 1426,1466 ---- VA_END; addheader("X-Authentication-Warning", buf, e); } + } + /* + ** 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 } *** src/map.c.OLD Thu Nov 25 08:16:17 1993 --- src/map.c Sat Dec 11 08:26:17 1993 *************** *** 33,39 **** */ #ifndef lint ! static char sccsid[] = "@(#)map.c 8.17 (Berkeley) 10/15/93"; #endif /* not lint */ #include "sendmail.h" --- 33,39 ---- */ #ifndef lint ! static char sccsid[] = "@(#)map.c 8.20 (Berkeley) 12/11/93"; #endif /* not lint */ #include "sendmail.h" *************** *** 336,342 **** checkfd012("entering initmaps"); #endif CurEnv = e; ! stabapply(map_init, rebuild); #ifdef XDEBUG checkfd012("exiting initmaps"); #endif --- 336,350 ---- checkfd012("entering initmaps"); #endif CurEnv = e; ! if (rebuild) ! { ! stabapply(map_init, 1); ! stabapply(map_init, 2); ! } ! else ! { ! stabapply(map_init, 0); ! } #ifdef XDEBUG checkfd012("exiting initmaps"); #endif *************** *** 358,368 **** return; if (tTd(38, 2)) ! printf("map_init(%s:%s)\n", map->map_class->map_cname == NULL ? "NULL" : map->map_class->map_cname, ! map->map_file == NULL ? "NULL" : map->map_file); /* if already open, close it (for nested open) */ if (bitset(MF_OPEN, map->map_mflags)) { --- 366,385 ---- return; if (tTd(38, 2)) ! printf("map_init(%s:%s, %d)\n", map->map_class->map_cname == NULL ? "NULL" : map->map_class->map_cname, ! 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)) { *************** *** 370,380 **** map->map_mflags &= ~(MF_OPEN|MF_WRITABLE); } ! if (rebuild) { ! if (bitset(MF_ALIAS, map->map_mflags) && ! bitset(MCF_REBUILDABLE, map->map_class->map_cflags)) ! rebuildaliases(map, FALSE); } else { --- 387,395 ---- map->map_mflags &= ~(MF_OPEN|MF_WRITABLE); } ! if (rebuild == 2) { ! rebuildaliases(map, FALSE); } else { *************** *** 381,387 **** if (map->map_class->map_open(map, O_RDONLY)) { if (tTd(38, 4)) ! printf("%s:%s: valid\n", map->map_class->map_cname == NULL ? "NULL" : map->map_class->map_cname, map->map_file == NULL ? "NULL" : --- 396,402 ---- if (map->map_class->map_open(map, O_RDONLY)) { if (tTd(38, 4)) ! printf("\t%s:%s: valid\n", map->map_class->map_cname == NULL ? "NULL" : map->map_class->map_cname, map->map_file == NULL ? "NULL" : *************** *** 389,395 **** map->map_mflags |= MF_OPEN; } else if (tTd(38, 4)) ! printf("%s:%s: invalid: %s\n", map->map_class->map_cname == NULL ? "NULL" : map->map_class->map_cname, map->map_file == NULL ? "NULL" : --- 404,410 ---- map->map_mflags |= MF_OPEN; } else if (tTd(38, 4)) ! printf("\t%s:%s: invalid: %s\n", map->map_class->map_cname == NULL ? "NULL" : map->map_class->map_cname, map->map_file == NULL ? "NULL" : *************** *** 434,442 **** return FALSE; } map->map_db1 = (void *) dbm; ! if (mode == O_RDONLY && bitset(MF_ALIAS, map->map_mflags)) ! if (!aliaswait(map, ".pag", TRUE)) return FALSE; if (fstat(dbm_dirfno((DBM *) map->map_db1), &st) >= 0) map->map_mtime = st.st_mtime; return TRUE; --- 449,470 ---- return FALSE; } map->map_db1 = (void *) dbm; ! if (mode == O_RDONLY) ! { ! if (bitset(MF_ALIAS, map->map_mflags) && ! !aliaswait(map, ".pag", TRUE)) 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; *************** *** 559,565 **** (void) sprintf(buf, "%010ld", curtime()); ndbm_map_store(map, "YP_LAST_MODIFIED", buf); ! (void) myhostname(buf, sizeof buf); ndbm_map_store(map, "YP_MASTER_NAME", buf); if (inclnull) --- 587,593 ---- (void) sprintf(buf, "%010ld", curtime()); ndbm_map_store(map, "YP_LAST_MODIFIED", buf); ! (void) gethostname(buf, sizeof buf); ndbm_map_store(map, "YP_MASTER_NAME", buf); if (inclnull) *************** *** 1237,1242 **** --- 1265,1273 ---- #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); *** src/mci.c.OLD Sun Nov 7 15:01:11 1993 --- src/mci.c Wed Dec 1 14:01:45 1993 *************** *** 33,39 **** */ #ifndef lint ! static char sccsid[] = "@(#)mci.c 8.6 (Berkeley) 10/23/93"; #endif /* not lint */ #include "sendmail.h" --- 33,39 ---- */ #ifndef lint ! static char sccsid[] = "@(#)mci.c 8.9 (Berkeley) 12/1/93"; #endif /* not lint */ #include "sendmail.h" *************** *** 275,280 **** --- 275,282 ---- 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; *************** *** 348,354 **** ctime(&mci->mci_lastuse)); printit: if (logit) ! syslog(LOG_INFO, "%s", buf); else printf("%s\n", buf); } --- 350,356 ---- ctime(&mci->mci_lastuse)); printit: if (logit) ! syslog(LOG_DEBUG, "%s", buf); else printf("%s\n", buf); } *************** *** 367,372 **** --- 369,377 ---- bool logit; { register int i; + + if (MciCache == NULL) + return; for (i = 0; i < MaxMciCache; i++) mci_dump(MciCache[i], logit); *** src/parseaddr.c.OLD Sun Nov 14 10:30:10 1993 --- src/parseaddr.c Wed Jan 5 09:20:14 1994 *************** *** 33,39 **** */ #ifndef lint ! static char sccsid[] = "@(#)parseaddr.c 8.17 (Berkeley) 10/31/93"; #endif /* not lint */ # include "sendmail.h" --- 33,39 ---- */ #ifndef lint ! static char sccsid[] = "@(#)parseaddr.c 8.29 (Berkeley) 1/5/94"; #endif /* not lint */ # include "sendmail.h" *************** *** 103,109 **** if (delimptr == NULL) delimptr = &delimptrbuf; ! pvp = prescan(addr, delim, pvpbuf, delimptr); if (pvp == NULL) { if (tTd(20, 1)) --- 103,109 ---- if (delimptr == NULL) delimptr = &delimptrbuf; ! pvp = prescan(addr, delim, pvpbuf, sizeof pvpbuf, delimptr); if (pvp == NULL) { if (tTd(20, 1)) *************** *** 143,151 **** */ queueup = FALSE; ! if (rewrite(pvp, 3, e) == EX_TEMPFAIL) queueup = TRUE; ! if (rewrite(pvp, 0, e) == EX_TEMPFAIL) queueup = TRUE; --- 143,151 ---- */ queueup = FALSE; ! if (rewrite(pvp, 3, 0, e) == EX_TEMPFAIL) queueup = TRUE; ! if (rewrite(pvp, 0, 0, e) == EX_TEMPFAIL) queueup = TRUE; *************** *** 308,313 **** --- 308,314 ---- ** 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. ** *************** *** 341,350 **** /*ONE*/ OPR, OPR, OPR, OPR, OPR, }; # define NOCHAR -1 /* signal nothing in lookahead token */ char ** ! prescan(addr, delim, pvpbuf, delimptr) char *addr; char delim; char pvpbuf[]; --- 342,375 ---- /*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 ** ! prescan(addr, delim, pvpbuf, pvpbsize, delimptr) char *addr; char delim; char pvpbuf[]; *************** *** 362,369 **** --- 387,410 ---- int newstate; char *saveto = CurEnv->e_to; static char *av[MAXATOM+1]; + static char firsttime = TRUE; 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; *************** *** 393,401 **** if (c != NOCHAR && !bslashmode) { /* see if there is room */ ! if (q >= &pvpbuf[PSBUFSIZE - 5]) { usrerr("553 Address too long"); if (delimptr != NULL) *delimptr = p; CurEnv->e_to = saveto; --- 434,443 ---- if (c != NOCHAR && !bslashmode) { /* see if there is room */ ! if (q >= &pvpbuf[pvpbsize - 5]) { usrerr("553 Address too long"); + returnnull: if (delimptr != NULL) *delimptr = p; CurEnv->e_to = saveto; *************** *** 527,537 **** if (avp >= &av[MAXATOM]) { syserr("553 prescan: too many tokens"); ! if (delimptr != NULL) ! *delimptr = p; ! CurEnv->e_to = saveto; ! return (NULL); } *avp++ = tok; } } while (c != '\0' && (c != delim || anglecnt > 0)); --- 569,581 ---- if (avp >= &av[MAXATOM]) { syserr("553 prescan: too many tokens"); ! goto returnnull; } + if (q - tok > MAXNAME) + { + syserr("553 prescan: token too long"); + goto returnnull; + } *avp++ = tok; } } while (c != '\0' && (c != delim || anglecnt > 0)); *************** *** 546,597 **** } CurEnv->e_to = saveto; if (av[0] == NULL) return (NULL); return (av); } /* - ** 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); - } - 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); - } - /* ** REWRITE -- apply rewrite rules to token vector. ** ** This routine is an ordered production system. Each rewrite --- 590,603 ---- } CurEnv->e_to = saveto; if (av[0] == NULL) + { + if (tTd(22, 1)) + printf("prescan: null leading token\n"); return (NULL); + } return (av); } /* ** REWRITE -- apply rewrite rules to token vector. ** ** This routine is an ordered production system. Each rewrite *************** *** 616,621 **** --- 622,628 ---- ** Parameters: ** pvp -- pointer to token vector. ** ruleset -- the ruleset to use for rewriting. + ** reclevel -- recursion level (to catch loops). ** e -- the current envelope. ** ** Returns: *************** *** 635,645 **** # define MAXMATCH 9 /* max params per rewrite */ int ! rewrite(pvp, ruleset, e) char **pvp; int ruleset; register ENVELOPE *e; { register char *ap; /* address pointer */ --- 642,657 ---- # define MAXMATCH 9 /* max params per rewrite */ + # ifndef MAXRULERECURSION + # define MAXRULERECURSION 50 /* max recursion depth */ + # endif + int ! rewrite(pvp, ruleset, reclevel, e) char **pvp; int ruleset; + int reclevel; register ENVELOPE *e; { register char *ap; /* address pointer */ *************** *** 664,669 **** --- 676,686 ---- 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; *************** *** 1124,1130 **** else { /* scan the new replacement */ ! xpvp = prescan(replac, '\0', pvpbuf, NULL); if (xpvp == NULL) { /* prescan already printed error */ --- 1141,1148 ---- else { /* scan the new replacement */ ! xpvp = prescan(replac, '\0', pvpbuf, ! sizeof pvpbuf, NULL); if (xpvp == NULL) { /* prescan already printed error */ *************** *** 1156,1170 **** { 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) rwr = NULL; } else { --- 1174,1197 ---- { int stat; ! 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; + } } else { *************** *** 1285,1290 **** --- 1312,1319 ---- } tv++; } + else + setstat(EX_UNAVAILABLE); if ((**tv & 0377) != CANONUSER) syserr("554 buildaddr: error: no user"); cataddr(++tv, NULL, buf, sizeof buf, ' '); *************** *** 1402,1412 **** if (!bitset(RF_SENDERADDR|RF_HEADERADDR, flags)) { /* sender addresses done later */ ! (void) rewrite(tv, 2, e); if (m->m_re_rwset > 0) ! (void) rewrite(tv, m->m_re_rwset, e); } ! (void) rewrite(tv, 4, e); /* save the result for the command line/RCPT argument */ cataddr(tv, NULL, buf, sizeof buf, '\0'); --- 1431,1441 ---- if (!bitset(RF_SENDERADDR|RF_HEADERADDR, flags)) { /* sender addresses done later */ ! (void) rewrite(tv, 2, 0, e); if (m->m_re_rwset > 0) ! (void) rewrite(tv, m->m_re_rwset, 0, e); } ! (void) rewrite(tv, 4, 0, e); /* save the result for the command line/RCPT argument */ cataddr(tv, NULL, buf, sizeof buf, '\0'); *************** *** 1500,1505 **** --- 1529,1536 ---- 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); *************** *** 1508,1516 **** 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); /* otherwise compare hosts (but be careful for NULL ptrs) */ if (a->q_host == b->q_host) --- 1539,1554 ---- if (strcmp(a->q_user, b->q_user) != 0) 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) *************** *** 1655,1664 **** ** domain will be appended. */ ! pvp = prescan(name, '\0', pvpbuf, NULL); if (pvp == NULL) return (name); ! if (rewrite(pvp, 3, e) == EX_TEMPFAIL) *pstat = EX_TEMPFAIL; if (bitset(RF_ADDDOMAIN, flags) && e->e_fromdomain != NULL) { --- 1693,1702 ---- ** domain will be appended. */ ! pvp = prescan(name, '\0', pvpbuf, sizeof pvpbuf, NULL); if (pvp == NULL) return (name); ! if (rewrite(pvp, 3, 0, e) == EX_TEMPFAIL) *pstat = EX_TEMPFAIL; if (bitset(RF_ADDDOMAIN, flags) && e->e_fromdomain != NULL) { *************** *** 1675,1681 **** while ((*pxp++ = *qxq++) != NULL) continue; ! if (rewrite(pvp, 3, e) == EX_TEMPFAIL) *pstat = EX_TEMPFAIL; } } --- 1713,1719 ---- while ((*pxp++ = *qxq++) != NULL) continue; ! if (rewrite(pvp, 3, 0, e) == EX_TEMPFAIL) *pstat = EX_TEMPFAIL; } } *************** *** 1689,1705 **** if (bitset(RF_SENDERADDR, flags)) { ! if (rewrite(pvp, 1, e) == EX_TEMPFAIL) *pstat = EX_TEMPFAIL; } else { ! if (rewrite(pvp, 2, e) == EX_TEMPFAIL) *pstat = EX_TEMPFAIL; } if (rwset > 0) { ! if (rewrite(pvp, rwset, e) == EX_TEMPFAIL) *pstat = EX_TEMPFAIL; } --- 1727,1743 ---- if (bitset(RF_SENDERADDR, flags)) { ! if (rewrite(pvp, 1, 0, e) == EX_TEMPFAIL) *pstat = EX_TEMPFAIL; } else { ! if (rewrite(pvp, 2, 0, e) == EX_TEMPFAIL) *pstat = EX_TEMPFAIL; } if (rwset > 0) { ! if (rewrite(pvp, rwset, 0, e) == EX_TEMPFAIL) *pstat = EX_TEMPFAIL; } *************** *** 1710,1716 **** ** may be used as a default to the above rules. */ ! if (rewrite(pvp, 4, e) == EX_TEMPFAIL) *pstat = EX_TEMPFAIL; /* --- 1748,1754 ---- ** may be used as a default to the above rules. */ ! if (rewrite(pvp, 4, 0, e) == EX_TEMPFAIL) *pstat = EX_TEMPFAIL; /* *************** *** 1719,1725 **** cataddr(pvp, NULL, lbuf, sizeof lbuf, '\0'); define('g', lbuf, e); ! expand(fancy, buf, &buf[sizeof buf - 1], e); define('g', oldg, e); if (tTd(12, 1)) --- 1757,1769 ---- cataddr(pvp, NULL, lbuf, sizeof lbuf, '\0'); define('g', lbuf, e); ! ! /* need to make sure route-addrs have */ ! 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)) *************** *** 1753,1763 **** printf("maplocaluser: "); printaddr(a, FALSE); } ! pvp = prescan(a->q_user, '\0', pvpbuf, &delimptr); if (pvp == NULL) return; ! (void) rewrite(pvp, 5, e); if (pvp[0] == NULL || (pvp[0][0] & 0377) != CANONNET) return; --- 1797,1807 ---- printf("maplocaluser: "); printaddr(a, FALSE); } ! pvp = prescan(a->q_user, '\0', pvpbuf, sizeof pvpbuf, &delimptr); if (pvp == NULL) return; ! (void) rewrite(pvp, 5, 0, e); if (pvp[0] == NULL || (pvp[0][0] & 0377) != CANONNET) return; *** src/queue.c.OLD Thu Nov 11 17:58:27 1993 --- src/queue.c Sun Jan 9 09:22:40 1994 *************** *** 36,44 **** #ifndef lint #ifdef QUEUE ! static char sccsid[] = "@(#)queue.c 8.27 (Berkeley) 10/29/93 (with queueing)"; #else ! static char sccsid[] = "@(#)queue.c 8.27 (Berkeley) 10/29/93 (without queueing)"; #endif #endif /* not lint */ --- 36,44 ---- #ifndef lint #ifdef QUEUE ! static char sccsid[] = "@(#)queue.c 8.36 (Berkeley) 1/9/94 (with queueing)"; #else ! static char sccsid[] = "@(#)queue.c 8.36 (Berkeley) 1/9/94 (without queueing)"; #endif #endif /* not lint */ *************** *** 121,142 **** break; #ifdef LOG if (LogLevel > 0 && (i % 32) == 0) ! syslog(LOG_ALERT, "queueup: cannot create %s: %s", ! tf, errstring(errno)); #endif - continue; } ! ! if (lockfile(fd, tf, NULL, LOCK_EX|LOCK_NB)) ! break; #ifdef LOG ! else if (LogLevel > 0 && (i % 32) == 0) ! syslog(LOG_ALERT, "queueup: cannot lock %s: %s", ! tf, errstring(errno)); #endif - close(fd); - if ((i % 32) == 31) { /* save the old temp file away */ --- 121,142 ---- break; #ifdef LOG if (LogLevel > 0 && (i % 32) == 0) ! syslog(LOG_ALERT, "queueup: cannot create %s, uid=%d: %s", ! tf, geteuid(), errstring(errno)); #endif } ! else ! { ! if (lockfile(fd, tf, NULL, LOCK_EX|LOCK_NB)) ! break; #ifdef LOG ! else if (LogLevel > 0 && (i % 32) == 0) ! syslog(LOG_ALERT, "queueup: cannot lock %s: %s", ! tf, errstring(errno)); #endif + close(fd); + } if ((i % 32) == 31) { /* save the old temp file away */ *************** *** 146,152 **** sleep(i % 32); } if (fd < 0 || (tfp = fdopen(fd, "w")) == NULL) ! syserr("!queueup: cannot create queue temp file %s", tf); } if (tTd(40, 1)) --- 146,156 ---- sleep(i % 32); } if (fd < 0 || (tfp = fdopen(fd, "w")) == NULL) ! { ! printopenfds(TRUE); ! syserr("!queueup: cannot create queue temp file %s, uid=%d", ! tf, geteuid()); ! } } if (tTd(40, 1)) *************** *** 176,183 **** 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); (*e->e_putbody)(dfp, FileMailer, e, NULL); (void) xfclose(dfp, "queueup dfp", e->e_id); e->e_putbody = putbody; --- 180,187 ---- 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, 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; *************** *** 272,278 **** bzero((char *) &nullmailer, sizeof nullmailer); nullmailer.m_re_rwset = nullmailer.m_rh_rwset = ! nullmailer.m_se_rwset = nullmailer.m_sh_rwset = 0; nullmailer.m_eol = "\n"; define('g', "\201f", e); --- 276,282 ---- bzero((char *) &nullmailer, sizeof nullmailer); nullmailer.m_re_rwset = nullmailer.m_rh_rwset = ! nullmailer.m_se_rwset = nullmailer.m_sh_rwset = -1; nullmailer.m_eol = "\n"; define('g', "\201f", e); *************** *** 288,293 **** --- 292,305 ---- 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"); *************** *** 306,312 **** /* 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)) --- 318,323 ---- *************** *** 345,351 **** /* 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); /* close and unlock old (locked) qf */ if (e->e_lockfp != NULL) --- 356,363 ---- /* rename (locked) tf to be (locked) qf */ qf = queuename(e, 'q'); if (rename(tf, qf) < 0) ! 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) *************** *** 461,477 **** if (forkflag) { int pid; pid = dofork(); if (pid != 0) { - extern void reapchild(); - /* 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); --- 473,490 ---- if (forkflag) { int pid; + #ifdef SIGCHLD + extern void reapchild(); + (void) setsignal(SIGCHLD, reapchild); + #endif + pid = dofork(); if (pid != 0) { /* parent -- pick up intermediate zombie */ #ifndef SIGCHLD (void) waitfor(pid); #endif /* SIGCHLD */ if (QueueIntvl != 0) (void) setevent(QueueIntvl, runqueue, TRUE); *************** *** 850,855 **** --- 863,873 ---- syserr("dowork: cannot fork"); return 0; } + else if (pid > 0) + { + /* parent -- clean out connection cache */ + mci_flush(FALSE, NULL); + } } else { *************** *** 888,894 **** e->e_header = NULL; /* read the queue control file -- return if locked */ ! if (!readqf(e, !requeueflag)) { if (tTd(40, 4)) printf("readqf(%s) failed\n", e->e_id); --- 906,912 ---- e->e_header = NULL; /* read the queue control file -- return if locked */ ! if (!readqf(e)) { if (tTd(40, 4)) printf("readqf(%s) failed\n", e->e_id); *************** *** 921,928 **** ** ** 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. --- 939,944 ---- *************** *** 933,941 **** */ bool ! readqf(e, announcefile) register ENVELOPE *e; - bool announcefile; { register FILE *qfp; ADDRESS *ctladdr; --- 949,956 ---- */ bool ! readqf(e) register ENVELOPE *e; { register FILE *qfp; ADDRESS *ctladdr; *************** *** 1031,1039 **** /* do basic system initialization */ initsys(e); - if (announcefile) - FileName = qf; LineNumber = 0; e->e_flags |= EF_GLOBALERRS; OpMode = MD_DELIVER; --- 1046,1053 ---- /* do basic system initialization */ initsys(e); + define('i', e->e_id, e); LineNumber = 0; e->e_flags |= EF_GLOBALERRS; OpMode = MD_DELIVER; *************** *** 1121,1128 **** break; default: ! syserr("readqf: bad line \"%s\"", e->e_id, ! LineNumber, bp); fclose(qfp); rename(qf, queuename(e, 'Q')); return FALSE; --- 1135,1142 ---- break; default: ! syserr("readqf: %s: line %s: bad line \"%s\"", ! qf, LineNumber, bp); fclose(qfp); rename(qf, queuename(e, 'Q')); return FALSE; *************** *** 1131,1138 **** if (bp != buf) free(bp); } - - FileName = NULL; /* ** If we haven't read any lines, this queue file is empty. --- 1145,1150 ---- *** src/readcf.c.OLD Sun Nov 14 10:16:20 1993 --- src/readcf.c Sun Jan 9 09:00:09 1994 *************** *** 33,39 **** */ #ifndef lint ! static char sccsid[] = "@(#)readcf.c 8.14 (Berkeley) 10/31/93"; #endif /* not lint */ # include "sendmail.h" --- 33,39 ---- */ #ifndef lint ! static char sccsid[] = "@(#)readcf.c 8.18 (Berkeley) 1/9/94"; #endif /* not lint */ # include "sendmail.h" *************** *** 109,115 **** extern char **copyplist(); struct stat statb; char exbuf[MAXLINE]; ! char pvpbuf[PSBUFSIZE]; extern char *munchstring(); extern void makemapentry(); --- 109,115 ---- extern char **copyplist(); struct stat statb; char exbuf[MAXLINE]; ! char pvpbuf[MAXLINE + MAXATOM]; extern char *munchstring(); extern void makemapentry(); *************** *** 241,247 **** /* expand and save the LHS */ *p = '\0'; expand(&bp[1], exbuf, &exbuf[sizeof exbuf], e); ! rwp->r_lhs = prescan(exbuf, '\t', pvpbuf, NULL); nfuzzy = 0; if (rwp->r_lhs != NULL) { --- 241,248 ---- /* expand and save the LHS */ *p = '\0'; expand(&bp[1], exbuf, &exbuf[sizeof exbuf], e); ! rwp->r_lhs = prescan(exbuf, '\t', pvpbuf, ! sizeof pvpbuf, NULL); nfuzzy = 0; if (rwp->r_lhs != NULL) { *************** *** 325,331 **** p++; *p = '\0'; expand(q, exbuf, &exbuf[sizeof exbuf], e); ! rwp->r_rhs = prescan(exbuf, '\t', pvpbuf, NULL); if (rwp->r_rhs != NULL) { register char **ap; --- 326,333 ---- p++; *p = '\0'; expand(q, exbuf, &exbuf[sizeof exbuf], e); ! rwp->r_rhs = prescan(exbuf, '\t', pvpbuf, ! sizeof pvpbuf, NULL); if (rwp->r_rhs != NULL) { register char **ap; *************** *** 540,547 **** --- 542,551 ---- { /* user didn't initialize: set up host map */ strcpy(buf, "host host"); + #ifdef NAMED_BIND if (ConfigLevel >= 2) strcat(buf, " -a."); + #endif makemapentry(buf); } } *************** *** 1020,1025 **** --- 1024,1030 ---- "defnames", RES_DEFNAMES, "stayopen", RES_STAYOPEN, "dnsrch", RES_DNSRCH, + "true", 0, /* to avoid error on old syntax */ NULL, 0 }; *************** *** 1239,1245 **** if (strcasecmp(q, rfp->rf_name) == 0) break; } ! if (clearmode) _res.options &= ~rfp->rf_bits; else _res.options |= rfp->rf_bits; --- 1244,1252 ---- if (strcasecmp(q, rfp->rf_name) == 0) break; } ! 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; *** src/recipient.c.OLD Thu Nov 4 06:57:11 1993 --- src/recipient.c Mon Jan 10 08:57:26 1994 *************** *** 33,39 **** */ #ifndef lint ! static char sccsid[] = "@(#)recipient.c 8.21 (Berkeley) 10/29/93"; #endif /* not lint */ # include "sendmail.h" --- 33,39 ---- */ #ifndef lint ! static char sccsid[] = "@(#)recipient.c 8.39 (Berkeley) 1/10/94"; #endif /* not lint */ # include "sendmail.h" *************** *** 222,231 **** stripquotes(buf); /* check for direct mailing to restricted mailers */ ! if (a->q_alias == NULL && m == ProgMailer) { ! a->q_flags |= QBADADDR; ! usrerr("550 Cannot mail directly to programs"); } /* --- 222,246 ---- stripquotes(buf); /* check for direct mailing to restricted mailers */ ! if (m == ProgMailer) { ! 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,257 **** --- 267,274 ---- 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; } *************** *** 294,299 **** --- 311,317 ---- 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)); } *************** *** 307,316 **** } else if (m == FileMailer) { - struct stat stb; extern bool writable(); - p = strrchr(buf, '/'); /* check if writable or creatable */ if (a->q_alias == NULL) { --- 325,332 ---- *************** *** 317,326 **** 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)) { a->q_flags |= QBADADDR; giveresponse(EX_CANTCREAT, m, NULL, a->q_alias, e); } } --- 333,353 ---- a->q_flags |= QBADADDR; usrerr("550 Cannot mail directly to files"); } ! 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); } } *************** *** 340,346 **** if (!bitset(QDONTSEND|QNOTREMOTE|QVERIFIED, a->q_flags)) { extern int udbexpand(); - extern int errno; if (udbexpand(a, sendq, e) == EX_TEMPFAIL) { --- 367,372 ---- *************** *** 429,434 **** --- 455,465 ---- 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); } *************** *** 563,569 **** ** not writable. This is also enforced by mailfile. ** ** Parameters: ! ** s -- pointer to a stat struct for the file. ** ** Returns: ** TRUE -- if we will be able to write this file. --- 594,602 ---- ** not writable. This is also enforced by mailfile. ** ** Parameters: ! ** 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. *************** *** 574,608 **** */ bool ! writable(s) ! register struct stat *s; { uid_t euid; gid_t egid; int bits; ! if (bitset(0111, s->st_mode)) ! return (FALSE); ! euid = RealUid; ! egid = RealGid; ! if (geteuid() == 0) { ! if (bitset(S_ISUID, s->st_mode)) ! euid = s->st_uid; ! if (bitset(S_ISGID, s->st_mode)) ! egid = s->st_gid; } if (euid == 0) - return (TRUE); - bits = S_IWRITE; - if (euid != s->st_uid) { ! bits >>= 3; ! if (egid != s->st_gid) ! bits >>= 3; } ! return ((s->st_mode & bits) != 0); } /* ** INCLUDE -- handle :include: specification. --- 607,704 ---- */ bool ! writable(filename, ctladdr, flags) ! char *filename; ! ADDRESS *ctladdr; ! int flags; { uid_t euid; gid_t egid; int bits; + register char *p; + char *uname; + struct stat stb; + extern char RealUserName[]; ! 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 { ! /* 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) { ! euid = DefUid; ! uname = DefUser; } ! 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; } /* ** INCLUDE -- handle :include: specification. *************** *** 628,633 **** --- 724,733 ---- 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; *************** *** 647,652 **** --- 747,754 ---- 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)) *************** *** 665,673 **** ca = getctladdr(ctladdr); if (ca == NULL) { ! uid = 0; ! gid = 0; ! uname = NULL; saveduid = -1; } else --- 767,775 ---- ca = getctladdr(ctladdr); if (ca == NULL) { ! uid = DefUid; ! gid = DefGid; ! uname = DefUser; saveduid = -1; } else *************** *** 699,705 **** { ctladdr->q_flags |= QQUEUEUP; errno = 0; - usrerr("451 open timeout on %s", fname); /* return pseudo-error code */ rval = EOPENTIMEOUT; --- 801,806 ---- *************** *** 708,748 **** ev = setevent((time_t) 60, includetimeout, 0); /* the input file must be marked safe */ ! rval = safefile(fname, uid, gid, uname, forwarding, S_IREAD); 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)); - 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) ! { ! struct stat st; ! ! if (fstat(fileno(fp), &st) < 0) { rval = errno; ! syserr("Cannot fstat %s!", fname); } - else - { - ctladdr->q_uid = st.st_uid; - ctladdr->q_gid = st.st_gid; - ctladdr->q_flags |= QGOODUID; - } } - clrevent(ev); resetuid: --- 809,832 ---- ev = setevent((time_t) 60, includetimeout, 0); /* the input file must be marked safe */ ! rval = safefile(fname, uid, gid, uname, sfflags, S_IREAD); if (rval != 0) { /* don't use this :include: file */ if (tTd(27, 4)) printf("include: not safe (uid=%d): %s\n", uid, errstring(rval)); } ! else { ! fp = fopen(fname, "r"); ! if (fp == NULL) { rval = errno; ! if (tTd(27, 4)) ! printf("include: open: %s\n", errstring(rval)); } } clrevent(ev); resetuid: *************** *** 761,769 **** --- 845,887 ---- 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 (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 */ *************** *** 772,777 **** --- 890,908 ---- xfclose(fp, "include", fname); 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; *** src/savemail.c.OLD Mon Nov 22 11:50:07 1993 --- src/savemail.c Sat Dec 18 06:25:06 1993 *************** *** 33,39 **** */ #ifndef lint ! static char sccsid[] = "@(#)savemail.c 8.17 (Berkeley) 10/31/93"; #endif /* not lint */ # include "sendmail.h" --- 33,39 ---- */ #ifndef lint ! static char sccsid[] = "@(#)savemail.c 8.24 (Berkeley) 12/18/93"; #endif /* not lint */ # include "sendmail.h" *************** *** 69,75 **** --- 69,79 ---- # 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; { *************** *** 82,87 **** --- 86,92 ---- register char *p; extern char *ttypath(); typedef int (*fnptr)(); + extern bool writable(); if (tTd(6, 1)) { *************** *** 374,381 **** break; } ! fp = dfopen("/usr/tmp/dead.letter", ! O_WRONLY|O_CREAT|O_APPEND, FileMode); if (fp == NULL) { state = ESM_PANIC; --- 379,392 ---- break; } ! 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; *************** *** 399,406 **** case ESM_PANIC: /* leave the locked queue & transcript files around */ ! syserr("554 savemail: cannot save rejected email anywhere"); ! exit(EX_SOFTWARE); } } } --- 410,416 ---- case ESM_PANIC: /* leave the locked queue & transcript files around */ ! syserr("!554 savemail: cannot save rejected email anywhere"); } } } *************** *** 466,471 **** --- 476,482 ---- 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); *************** *** 602,608 **** 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)) { putline(" **********************************************", fp, m); --- 613,620 ---- 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|EF_SENDRECEIPT, e->e_parent->e_flags)) { putline(" **********************************************", fp, m); *** src/sendmail.h.OLD Sun Nov 7 10:37:14 1993 --- src/sendmail.h Wed Jan 5 08:34:35 1994 *************** *** 31,37 **** * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ! * @(#)sendmail.h 8.26 (Berkeley) 10/31/93 */ /* --- 31,37 ---- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ! * @(#)sendmail.h 8.38 (Berkeley) 1/5/94 */ /* *************** *** 41,47 **** # ifdef _DEFINE # define EXTERN # ifndef lint ! static char SmailSccsId[] = "@(#)sendmail.h 8.26 10/31/93"; # endif # else /* _DEFINE */ # define EXTERN extern --- 41,47 ---- # ifdef _DEFINE # define EXTERN # ifndef lint ! static char SmailSccsId[] = "@(#)sendmail.h 8.38 1/5/94"; # endif # else /* _DEFINE */ # define EXTERN extern *************** *** 57,63 **** # include # include # include - # include # include "conf.h" # include "useful.h" --- 57,62 ---- *************** *** 69,74 **** --- 68,76 ---- # ifdef DAEMON # include # endif + # ifdef NETUNIX + # include + # endif # ifdef NETINET # include # endif *************** *** 148,153 **** --- 150,157 ---- # 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) /* *************** *** 287,295 **** ADDRESS *e_sendqueue; /* list of message recipients */ ADDRESS *e_errorqueue; /* the queue for error responses */ long e_msgsize; /* size of the message in bytes */ 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 */ --- 291,299 ---- 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.) */ short e_hopcount; /* number of times processed */ short e_nsent; /* number of sends since checkpoint */ short e_sendmode; /* message send mode */ *************** *** 314,333 **** }; /* 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 */ EXTERN ENVELOPE *CurEnv; /* envelope currently being processed */ /* --- 318,338 ---- }; /* values for e_flags */ ! #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 */ /* *************** *** 722,728 **** --- 727,744 ---- #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. */ *************** *** 730,736 **** --- 746,754 ---- union bigsockaddr { struct sockaddr sa; /* general version */ + #ifdef NETUNIX struct sockaddr_un sunix; /* UNIX family */ + #endif #ifdef NETINET struct sockaddr_in sin; /* INET family */ #endif *************** *** 804,810 **** 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 InChild; /* true if running in an SMTP subprocess */ EXTERN char SpaceSub; /* substitution for */ EXTERN int PrivacyFlags; /* privacy flags */ --- 822,828 ---- 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 InChild; /* true if running in an SMTP subprocess */ EXTERN char SpaceSub; /* substitution for */ EXTERN int PrivacyFlags; /* privacy flags */ *************** *** 825,831 **** 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 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 */ --- 843,849 ---- 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 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 */ *************** *** 832,837 **** --- 850,856 ---- 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,915 **** 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 *fgetfolded __P((char *, int, FILE *)); extern ADDRESS *recipient __P((ADDRESS *, ADDRESS **, ENVELOPE *)); extern ENVELOPE *newenvelope __P((ENVELOPE *, ENVELOPE *)); --- 928,935 ---- 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[], 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 *)); *************** *** 928,933 **** --- 948,955 ---- 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__ *** src/srvrsmtp.c.OLD Fri Nov 26 17:21:59 1993 --- src/srvrsmtp.c Wed Dec 22 05:07:01 1993 *************** *** 36,44 **** #ifndef lint #ifdef SMTP ! static char sccsid[] = "@(#)srvrsmtp.c 8.18 (Berkeley) 10/28/93 (with SMTP)"; #else ! static char sccsid[] = "@(#)srvrsmtp.c 8.18 (Berkeley) 10/28/93 (without SMTP)"; #endif #endif /* not lint */ --- 36,44 ---- #ifndef lint #ifdef SMTP ! static char sccsid[] = "@(#)srvrsmtp.c 8.23 (Berkeley) 12/21/93 (with SMTP)"; #else ! static char sccsid[] = "@(#)srvrsmtp.c 8.23 (Berkeley) 12/21/93 (without SMTP)"; #endif #endif /* not lint */ *************** *** 114,119 **** --- 114,120 ---- }; bool OneXact = FALSE; /* one xaction only this run */ + char *CurSmtpClient; /* who's at the other end of channel */ static char *skipword(); *************** *** 147,153 **** } settime(e); CurHostName = RealHostName; ! setproctitle("server %s startup", CurHostName); expand("\201e", inp, &inp[sizeof inp], e); if (BrokenSmtpPeers) { --- 148,158 ---- } settime(e); CurHostName = RealHostName; ! CurSmtpClient = macvalue('_', e); ! if (CurSmtpClient == NULL) ! CurSmtpClient = RealHostName; ! ! setproctitle("server %s startup", CurSmtpClient); expand("\201e", inp, &inp[sizeof inp], e); if (BrokenSmtpPeers) { *************** *** 192,202 **** { /* end of file, just die */ message("421 %s Lost input channel from %s", ! MyHostName, CurHostName); #ifdef LOG if (LogLevel > (gotmail ? 1 : 19)) syslog(LOG_NOTICE, "lost input channel from %s", ! CurHostName); #endif if (InChild) ExitStat = EX_QUIT; --- 197,207 ---- { /* end of file, just die */ message("421 %s Lost input channel from %s", ! MyHostName, CurSmtpClient); #ifdef LOG if (LogLevel > (gotmail ? 1 : 19)) syslog(LOG_NOTICE, "lost input channel from %s", ! CurSmtpClient); #endif if (InChild) ExitStat = EX_QUIT; *************** *** 211,219 **** fprintf(e->e_xfp, "<<< %s\n", inp); if (e->e_id == NULL) ! setproctitle("%s: %s", CurHostName, inp); else ! setproctitle("%s %s: %s", e->e_id, CurHostName, inp); /* break off command */ for (p = inp; isascii(*p) && isspace(*p); p++) --- 216,224 ---- fprintf(e->e_xfp, "<<< %s\n", inp); if (e->e_id == NULL) ! setproctitle("%s: %.80s", CurSmtpClient, inp); else ! setproctitle("%s %s: %.80s", e->e_id, CurSmtpClient, inp); /* break off command */ for (p = inp; isascii(*p) && isspace(*p); p++) *************** *** 262,270 **** 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) --- 267,272 ---- *************** *** 271,277 **** { /* print old message and be done with it */ message("250 %s Hello %s, pleased to meet you", ! MyHostName, p); break; } --- 273,279 ---- { /* print old message and be done with it */ message("250 %s Hello %s, pleased to meet you", ! MyHostName, CurSmtpClient); break; } *************** *** 332,338 **** define('s', sendinghost, e); initsys(e); nrcpts = 0; ! setproctitle("%s %s: %s", e->e_id, CurHostName, inp); /* child -- go do the processing */ p = skipword(p, "from"); --- 334,341 ---- define('s', sendinghost, e); initsys(e); nrcpts = 0; ! e->e_flags |= EF_LOGSENDER; ! setproctitle("%s %s: %.80s", e->e_id, CurSmtpClient, inp); /* child -- go do the processing */ p = skipword(p, "from"); *************** *** 626,632 **** if (vrfy) message("252 Who's to say?"); else ! message("502 That's none of your business"); break; } else if (!gothello && --- 629,640 ---- if (vrfy) message("252 Who's to say?"); else ! 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 && *************** *** 640,646 **** break; #ifdef LOG if (LogLevel > 5) ! syslog(LOG_INFO, "%s: %s", CurHostName, inp); #endif vrfyqueue = NULL; QuickAbort = TRUE; --- 648,654 ---- break; #ifdef LOG if (LogLevel > 5) ! syslog(LOG_INFO, "%s: %s", CurSmtpClient, inp); #endif vrfyqueue = NULL; QuickAbort = TRUE; *************** *** 942,947 **** --- 950,958 ---- 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)) *** src/udb.c.OLD Thu Nov 25 08:54:38 1993 --- src/udb.c Thu Nov 25 11:23:27 1993 *************** *** 36,44 **** #ifndef lint #ifdef USERDB ! static char sccsid [] = "@(#)udb.c 8.3 (Berkeley) 8/25/93 (with USERDB)"; #else ! static char sccsid [] = "@(#)udb.c 8.3 (Berkeley) 8/25/93 (without USERDB)"; #endif #endif --- 36,44 ---- #ifndef lint #ifdef USERDB ! static char sccsid [] = "@(#)udb.c 8.4 (Berkeley) 11/25/93 (with USERDB)"; #else ! static char sccsid [] = "@(#)udb.c 8.4 (Berkeley) 11/25/93 (without USERDB)"; #endif #endif *************** *** 603,609 **** up->udb_addr.sin_family = h->h_addrtype; bcopy(h->h_addr_list[0], (char *) &up->udb_addr.sin_addr, ! h->h_length); up->udb_addr.sin_port = UdbPort; up->udb_timeout = UdbTimeout; up++; --- 603,609 ---- up->udb_addr.sin_family = h->h_addrtype; bcopy(h->h_addr_list[0], (char *) &up->udb_addr.sin_addr, ! sizeof up->udb_addr.sin_addr); up->udb_addr.sin_port = UdbPort; up->udb_timeout = UdbTimeout; up++; *** src/usersmtp.c.OLD Sun Nov 7 15:33:58 1993 --- src/usersmtp.c Wed Jan 5 09:20:15 1994 *************** *** 36,44 **** #ifndef lint #ifdef SMTP ! static char sccsid[] = "@(#)usersmtp.c 8.13 (Berkeley) 10/24/93 (with SMTP)"; #else ! static char sccsid[] = "@(#)usersmtp.c 8.13 (Berkeley) 10/24/93 (without SMTP)"; #endif #endif /* not lint */ --- 36,44 ---- #ifndef lint #ifdef SMTP ! static char sccsid[] = "@(#)usersmtp.c 8.17 (Berkeley) 1/5/94 (with SMTP)"; #else ! static char sccsid[] = "@(#)usersmtp.c 8.17 (Berkeley) 1/5/94 (without SMTP)"; #endif #endif /* not lint */ *************** *** 218,226 **** goto tempfail2; } ! mci->mci_state = MCIS_OPEN; ! return; tempfail1: tempfail2: mci->mci_exitstat = EX_TEMPFAIL; --- 218,231 ---- goto tempfail2; } ! if (mci->mci_state != MCIS_CLOSED) ! { ! mci->mci_state = MCIS_OPEN; ! return; ! } + /* got a 421 error code during startup */ + tempfail1: tempfail2: mci->mci_exitstat = EX_TEMPFAIL; *************** *** 317,322 **** --- 322,328 ---- ENVELOPE *e; { int r; + char *bufp; char buf[MAXNAME]; char optbuf[MAXLINE]; *************** *** 341,355 **** (void) strcpy(buf, ""); else expand("\201g", buf, &buf[sizeof buf - 1], e); if (e->e_from.q_mailer == LocalMailer || !bitnset(M_FROMPATH, m->m_flags)) { ! smtpmessage("MAIL From:<%s>%s", m, mci, buf, optbuf); } else { smtpmessage("MAIL From:<@%s%c%s>%s", m, mci, MyHostName, ! buf[0] == '@' ? ',' : ':', buf, optbuf); } SmtpPhase = mci->mci_phase = "client MAIL"; setproctitle("%s %s: %s", e->e_id, CurHostName, mci->mci_phase); --- 347,371 ---- (void) strcpy(buf, ""); else expand("\201g", buf, &buf[sizeof buf - 1], e); + if (buf[0] == '<') + { + /* strip off (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)) { ! smtpmessage("MAIL From:<%s>%s", m, mci, bufp, optbuf); } else { smtpmessage("MAIL From:<@%s%c%s>%s", m, mci, MyHostName, ! *bufp == '@' ? ',' : ':', bufp, optbuf); } SmtpPhase = mci->mci_phase = "client MAIL"; setproctitle("%s %s: %s", e->e_id, CurHostName, mci->mci_phase); *************** *** 594,601 **** register MCI *mci; ENVELOPE *e; { ! int i; /* send the quit message if we haven't gotten I/O error */ if (mci->mci_state != MCIS_ERROR) { --- 610,626 ---- register MCI *mci; ENVELOPE *e; { ! 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) { *************** *** 602,615 **** SmtpPhase = "client QUIT"; smtpmessage("QUIT", m, mci); (void) reply(m, mci, e, TimeOuts.to_quit, NULL); if (mci->mci_state == MCIS_CLOSED) return; } /* 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); } /* ** SMTPRSET -- send a RSET (reset) command --- 627,644 ---- SmtpPhase = "client QUIT"; smtpmessage("QUIT", m, mci); (void) reply(m, mci, e, TimeOuts.to_quit, NULL); + SuprErrs = oldSuprErrs; if (mci->mci_state == MCIS_CLOSED) + { + SuprErrs = oldSuprErrs; return; + } } /* now actually close the connection and pick up the zombie */ ! (void) endmailer(mci, e, NULL); ! ! SuprErrs = oldSuprErrs; } /* ** SMTPRSET -- send a RSET (reset) command *** src/util.c.OLD Sun Nov 7 11:14:47 1993 --- src/util.c Tue Jan 4 06:40:38 1994 *************** *** 33,39 **** */ #ifndef lint ! static char sccsid[] = "@(#)util.c 8.15 (Berkeley) 10/31/93"; #endif /* not lint */ # include "sendmail.h" --- 33,39 ---- */ #ifndef lint ! static char sccsid[] = "@(#)util.c 8.28 (Berkeley) 1/4/94"; #endif /* not lint */ # include "sendmail.h" *************** *** 407,413 **** ** 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. ** mode -- mode bits that must match. ** ** Returns: --- 407,415 ---- ** gid -- group id to compare against. ** uname -- user name to compare against (used for group ** sets). ! ** flags -- modifiers: ! ** SFF_MUSTOWN -- "uid" must own this file. ! ** SFF_NOSLINK -- file cannot be a symbolic link. ** mode -- mode bits that must match. ** ** Returns: *************** *** 433,444 **** #endif int ! safefile(fn, uid, gid, uname, mustown, mode) char *fn; uid_t uid; gid_t gid; char *uname; ! bool mustown; int mode; { register char *p; --- 435,446 ---- #endif int ! safefile(fn, uid, gid, uname, flags, mode) char *fn; uid_t uid; gid_t gid; char *uname; ! int flags; int mode; { register char *p; *************** *** 446,453 **** struct stat stbuf; if (tTd(54, 4)) ! printf("safefile(%s, uid=%d, gid=%d, mustown=%d, mode=%o):\n", ! fn, uid, gid, mustown, mode); errno = 0; for (p = fn; (p = strchr(++p, '/')) != NULL; *p = '/') --- 448,455 ---- struct stat stbuf; if (tTd(54, 4)) ! 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 = '/') *************** *** 455,460 **** --- 457,468 ---- *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)) *************** *** 488,494 **** --- 496,507 ---- return ret; } + #ifdef HASLSTAT + if ((bitset(SFF_NOSLINK, flags) ? lstat(fn, &stbuf) + : stat(fn, &stbuf)) < 0) + #else if (stat(fn, &stbuf) < 0) + #endif { int ret = errno; *************** *** 498,504 **** errno = 0; return ret; } ! if (uid == 0) mode >>= 6; else if (stbuf.st_uid != uid) { --- 511,527 ---- errno = 0; return ret; } ! ! #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) { *************** *** 525,531 **** 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) && (stbuf.st_mode & mode) == mode) { if (tTd(54, 4)) --- 548,555 ---- if (tTd(54, 4)) printf("\t[uid %d, stat %o, mode %o] ", stbuf.st_uid, stbuf.st_mode, mode); ! if ((stbuf.st_uid == uid || stbuf.st_uid == 0 || ! !bitset(SFF_MUSTOWN, flags)) && (stbuf.st_mode & mode) == mode) { if (tTd(54, 4)) *************** *** 836,847 **** /* try to read */ p = NULL; ! while (p == NULL && !feof(fp) && !ferror(fp)) { errno = 0; p = fgets(buf, siz, fp); ! if (errno == EINTR) ! clearerr(fp); } /* clear the event if it has not sprung */ --- 860,872 ---- /* try to read */ p = NULL; ! while (!feof(fp) && !ferror(fp)) { errno = 0; p = fgets(buf, siz, fp); ! if (p != NULL || errno != EINTR) ! break; ! clearerr(fp); } /* clear the event if it has not sprung */ *************** *** 1120,1137 **** register char *a; register char *b; { ! int l; ! l = strlen(a); ! for (;;) { ! b = strchr(b, a[0]); ! if (b == NULL) ! return FALSE; ! if (strncmp(a, b, l) == 0) return TRUE; - b++; } } /* ** CHECKFD012 -- check low numbered file descriptors --- 1145,1167 ---- register char *a; register char *b; { ! 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++) { ! if (*b != c && isascii(*b) && isupper(*b) && tolower(*b) != c) ! continue; ! if (strncasecmp(a, b, la) == 0) return TRUE; } + return FALSE; } /* ** CHECKFD012 -- check low numbered file descriptors *************** *** 1279,1284 **** --- 1309,1335 ---- 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", *************** *** 1289,1295 **** printit: if (logit) ! syslog(LOG_INFO, "%s", buf); else printf("%s\n", buf); } --- 1340,1395 ---- printit: if (logit) ! syslog(LOG_DEBUG, "%s", buf); else printf("%s\n", buf); + } + /* + ** 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; } *** src/version.c.OLD Tue Nov 30 08:59:46 1993 --- src/version.c Thu Jan 13 06:41:44 1994 *************** *** 33,39 **** */ #ifndef lint ! static char sccsid[] = "@(#)version.c 8.6.1.4 (Berkeley) 10/31/93"; #endif /* not lint */ ! char Version[] = "8.6.4"; --- 33,39 ---- */ #ifndef lint ! static char sccsid[] = "@(#)version.c 8.6.1.5 (Berkeley) 1/13/94"; #endif /* not lint */ ! char Version[] = "8.6.5";