diff options
author | Peter Wemm <peter@FreeBSD.org> | 1996-03-25 06:54:33 +0000 |
---|---|---|
committer | Peter Wemm <peter@FreeBSD.org> | 1996-03-25 06:54:33 +0000 |
commit | 71e87128907375807decc670b44c70d16b47da63 (patch) | |
tree | fe29f1d29bf8730a41d3a7edc182bffd092f27a6 | |
parent | e783ed7fdd65fc9a69f98f005e8143747f87e496 (diff) |
Notes
168 files changed, 20856 insertions, 21482 deletions
diff --git a/usr.sbin/sendmail/FAQ b/usr.sbin/sendmail/FAQ index 743dc362fcaa3..cc27e50805fd2 100644 --- a/usr.sbin/sendmail/FAQ +++ b/usr.sbin/sendmail/FAQ @@ -1,58 +1,154 @@ +Newsgroups: comp.mail.sendmail,comp.mail.misc,comp.mail.smail,comp.answers,news.answers +Subject: comp.mail.sendmail Frequently Asked Questions (FAQ) +From: brad@birch.ims.disa.mil (Brad Knowles) +Followup-to: comp.mail.sendmail +Summary: This posting contains a list of Frequently Asked Questions + (and their answers) about the program "sendmail", distributed + with many versions of Unix (and available for some other + operating systems). This FAQ is shared between + comp.mail.sendmail and the Sendmail V8 distribution. It should + be read by anyone who wishes to post to comp.mail.sendmail, or + anyone having questions about the newsgroup itself. + +Archive-name: mail/sendmail-faq +Posting-Frequency: monthly (first Monday) + + +[The most recent copy of this document can be obtained via anonymous +FTP from rtfm.mit.edu in /pub/usenet/news.answers/mail/sendmail-faq. +If you do not have access to anonymous FTP, you can retrieve it by +sending email to mail-server@rtfm.mit.edu with the command "send +usenet/news.answers/mail/sendmail-faq" in the message.] + + + Sendmail Version 8 Frequently Asked Questions - Version 8.4 of 4/20/94 + Last updated 9/17/95 -This FAQ is specific to Version 8 of sendmail. Other questions, -particularly regarding compilation and configuration, are answered -in src/READ_ME and cf/README. +This FAQ is specific to Version 8.6.10 of sendmail. Other questions, +particularly regarding compilation and configuration, are answered in +src/READ_ME and cf/README (found in the V8 sendmail distribution). +This is also the official FAQ for the Usenet newsgroup +comp.mail.sendmail. + +====================================================================== +BEFORE YOU GO ANY FURTHER +====================================================================== + + * What do you wish everyone would do before sending you mail or + posting to comp.mail.sendmail? + + Read this FAQ completely. Read src/READ_ME and cf/README + completely. Read the books written to help with common + problems such as compilation and installation, configuration, + security issues, etc.... Ask themselves if their question + hasn't already been answered. ---------------------------------------------------------------------- - * Where can I get Version 8? + * How can I be sure if this is the right place to look for answers + to my questions? - Via anonymous FTP from FTP.CS.Berkeley.EDU in /ucb/sendmail. + 1. Do you know, for a fact, that the question is related to + sendmail V8? + + 2. Do you know, for a fact, that the question is related to an + older version of sendmail? + + 3. Is the question about a sendmail-like program (e.g., Smail, + Zmailer, MMDF, etc...)? + + 4. Is the question about an SMTP Gateway product for a LAN + mail package (e.g., cc:Mail, MS-Mail, WordPerfect + Office/GroupWise, etc...)? + + If you answered "yes" to the question #1, then this is the + right place. + + If you answered "yes" to questions #2 or #3, then you should + seriously consider upgrading to the most recent version of + sendmail V8. + + For question #2, If you're going to continue using an older + version of sendmail, you may not find much help and will + probably get some responses that amount to "Get V8". + Otherwise, this is probably the best place to look for + answers. + + If you answered "yes" to question #3 and are not going to + upgrade to sendmail V8, then this is probably not the right + place to look. + + If you answered "yes" to question #4, then this is almost + certainly not the right place to look. + + For questions #3 and #4, try looking around elsewhere in the + "comp.mail.*" hierarchy for a more appropriate newsgroup. + For example, you might want to try posting to comp.mail.misc + or comp.mail.smail. + + If you couldn't answer "yes" to any of the above questions, + then you're DEFINITELY in the wrong place. For the sake of + your sanity and ego, not to mention avoiding the waste of + your time and ours, try asking your System or E-Mail + Administrator(s) before you post any questions publicly. ---------------------------------------------------------------------- - * What are the differences between Version 8 and other versions? + * Where can I find the latest version of this FAQ? + + It is included in the most recent Version 8 distribution of + sendmail (described below), as well as via anonymous FTP from + rtfm.mit.edu in /pub/usenet/news.answers/mail/sendmail-faq. + If you do not have access to anonymous FTP, you can retrieve + it by sending email to mail-server@rtfm.mit.edu with the + command "send usenet/news.answers/mail/sendmail-faq" in the + message. +---------------------------------------------------------------------- + * I don't have access to Usenet news. Can I still get access to + comp.mail.sendmail? - See doc/changes/changes.me in the sendmail distribution. + Yes. Send email to mxt@dl.ac.uk with the command "sub + comp-news.comp.mail.sendmail <full-US-ordered-email-address>" + in the message. + + E-mail you want posted on comp.mail.sendmail should be sent + to comp-mail-sendmail@dl.ac.uk ---------------------------------------------------------------------- - * What happened to sendmail 6.x and 7.x? + * I have sendmail-related DNS questions. Where should I ask them? - When I released a new version of sendmail, I changed it to - Release 6. Development continued in that tree until 4.4BSD - was released, when everything on the 4.4 tape was set to be - version 8.1. Version 7.x never existed. + Depending on how deeply they get into the DNS, they can be + asked here. However, you'll probably be told that you should + send them to the Info-BIND mailing list (if the question is + specific to that program) or to the Usenet newsgroup + comp.protocols.tcp-ip.domains (DNS in general). ---------------------------------------------------------------------- - * Version 8 requires a new version of "make". Where can I get this? + * How do I subscribe to either of these? - Actually, Version 8 does not require a new version of "make". - It includes a collection of Makefiles for different architectures, - only one or two of which require the new "make". If you are - porting to a new architecture, start with Makefile.dist. + For comp.protocols.tcp-ip.domains, you have to be on Usenet. + They don't have a news-to-mail gateway yet. - If you really do want the new make, it is available on any of - the BSD Net2 or 4.4-Lite distribution sites. These include: + For the Info-BIND mailing list, send email to + bind-request@uunet.uu.net with the command "subscribe" in the + message. Submissions should be sent to bind@uunet.uu.net - ftp.uu.net /systems/unix/bsd-sources - gatekeeper.dec.com /.0/BSD/net2 - ucquais.cba.uc.edu /pub/net2 - ftp.luth.se /pub/unix/4.3bsd/net2 +====================================================================== +GENERAL QUESTIONS +====================================================================== - 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. ----------------------------------------------------------------------- - * What macro package do I use to format the V8 man pages? + * Where can I get Version 8? - The BSD group switched over the the ``mandoc'' macros for - the 4.4 release. These include more hooks designed for - hypertext handling. However, new man pages won't format - under the old man macros. Fortunately, old man pages will - format under the new mandoc macros. + Via anonymous FTP from FTP.CS.Berkeley.EDU in /ucb/sendmail. +---------------------------------------------------------------------- + * What are the differences between Version 8 and other versions? - Get the new macros with the BSD Net2 or 4.4-Lite release. + See doc/changes/changes.me in the sendmail distribution. +---------------------------------------------------------------------- + * What happened to sendmail 6.x and 7.x? - This macro set is also available with newer versions of groff. + When a new (Alpha/Beta) version of sendmail was released, it + was changed to Release 6. Development continued in that tree + until 4.4BSD was released, when everything on the 4.4 tape + was set to be version 8.1. Version 7.x never existed. ---------------------------------------------------------------------- * What books are available describing sendmail? @@ -73,7 +169,81 @@ in src/READ_ME and cf/README. Avolio & Vixie, _Sendmail Theory and Practice_. Digital Press (release date unknown). + + For details on sendmail-related DNS issues, consult: + + Liu and Albitz, _DNS and BIND_. O'Reilly & Associates. + + For details on UUCP, see: + + O'Reilly and Todino, _Managing UUCP and Usenet_. + O'Reilly & Associates. + +====================================================================== +COMPILING AND INSTALLING SENDMAIL 8 +====================================================================== + + * Version 8 requires a new version of "make". Where can I get this? + + Actually, Version 8 does not require a new version of "make". + It includes a collection of Makefiles for different architectures, + only one or two of which require the new "make". For a supported + architecture, use ``sh makesendmail''. If you are porting to a + new architecture, start with Makefile.dist. + + If you really do want the new make, it is available on any of + the BSD Net2 or 4.4-Lite distribution sites. These include: + + ftp.uu.net /systems/unix/bsd-sources + gatekeeper.dec.com /.0/BSD/net2 + ucquais.cba.uc.edu /pub/net2 + ftp.luth.se /pub/unix/4.3bsd/net2 + + 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. A patchkit for + Ultrix is on ftp.vix.com in /pub/patches/pmake-for-ultrix.Z. + Patches for AIX 3.2.4 are available on ftp.uni-stuttgart.de + in /sw/src/patches/bsd-make-rus-patches. + + There is also a Linux version available on the main Linux + distribution sites as pmake; this version is included as + standard with the current Slackware distributions. +---------------------------------------------------------------------- + * What macro package do I use to format the V8 man pages? + + The BSD group switched over the the ``mandoc'' macros for the + 4.4 release. These include more hooks designed for hypertext + handling. However, new man pages won't format under the old + man macros. Fortunately, old man pages will format under the + new mandoc macros. + + Get the new macros with the BSD Net2 or 4.4-Lite release (see + above for locations; for example, on FTP.UU.NET the files + /system/unix/bsd-sources/share/tmac/me/strip/sed and + /system/unix/bsd-sources/share/tmac/* are what you need). + + This macro set is also included with newer versions of groff. ---------------------------------------------------------------------- + * What modes should be used when installing sendmail? + + The sendmail binary should be owned by root, mode 4755. + The queue directory should be owned by root, with a mode + between 700 and 755. Under no circumstances should + it be group or other writable! + The sendmail config file should be owned by root, mode 644. + The aliases file should generally be owned by one trusted + user and writable only by that user, although it is + not unreasonable to have it group writable by a + "sysadmin" group. It should not be world writable. + The aliases database files (aliases.db or aliases.{pag,dir} + depending on what database format you compile with) + should be owned by root, mode 644. + +====================================================================== +CONFIGURATION QUESTIONS +====================================================================== + * How do I make all my addresses appear to be from a single host? Using the V8 configuration macros, use: @@ -85,11 +255,11 @@ in src/READ_ME and cf/README. ---------------------------------------------------------------------- * How do I rewrite my From: lines to read ``First_Last@My.Domain''? - There are a couple of ways of doing this. This describes using - the "user database" code. This is still experimental, and was - intended for a different purpose -- however, it does work - with a bit of care. It does require that you have the Berkeley - "db" package installed (it won't work with DBM). + There are a couple of ways of doing this. This describes + using the "user database" code. This is still experimental, + and was intended for a different purpose -- however, it does + work with a bit of care. It does require that you have the + Berkeley "db" package installed (it won't work with DBM). First, create your input file. This should have lines like: @@ -108,14 +278,14 @@ in src/READ_ME and cf/README. ---------------------------------------------------------------------- * So what was the user database feature intended for? - The intent was to have all information for a given user (where - the user is the unique login name, not an inherently non-unique - full name) in one place. This would include phone numbers, - addresses, and so forth. The "maildrop" feature is because - Berkeley does not use a centralized mail server (there are a - number of reasons for this that are mostly historic), and so - we need to know where each user gets his or her mail delivered -- - i.e., the mail drop. + The intent was to have all information for a given user + (where the user is the unique login name, not an inherently + non-unique full name) in one place. This would include phone + numbers, addresses, and so forth. The "maildrop" feature is + because Berkeley does not use a centralized mail server + (there are a number of reasons for this that are mostly + historic), and so we need to know where each user gets his or + her mail delivered -- i.e., the mail drop. We are in the process of setting up our environment so that mail sent to an unqualified "name" goes to that person's @@ -128,48 +298,33 @@ in src/READ_ME and cf/README. Because full names are not unique. For example, the computer community has two Andy Tannenbaums and two Peter Deutsches. - At one time, Bell Labs had two Stephen R. Bournes with offices - a few doors apart. You can create alternative addresses - (e.g., Stephen_R_Bourne_2), but that's even worse -- which - one of them has to have their name desecrated in this way? - And you can bet that they will get most of the other person's - email. - - So called "full names" are just longer versions of unique - names. Rather that lulling people into a sense of security, - I'd rather that it be clear that these handles are arbitrary. - People should use good user agents that have alias mappings - so that they can attach arbitrary names for their personal - use to those with whom they correspond. + At one time, Bell Labs had two Stephen R. Bournes with + offices a few doors apart. You can create alternative + addresses (e.g., Stephen_R_Bourne_2), but that's even worse + -- which one of them has to have their name desecrated in + this way? And you can bet that one of them will get most of + the other person's e-mail. + + So called "full names" are just an attempt to create longer + versions of unique names. Rather that lulling people into a + sense of security, I'd rather that it be clear that these + handles are arbitrary. People should use good user agents + that have alias mappings so that they can attach arbitrary + names for their personal use to those with whom they + correspond (such as the MH alias file). Even worse is fuzzy matching in e-mail -- this can make good - addresses turn bad. For example, I'm currently (to the best - of my knowledge) the only ``Allman'' at Berkeley, so mail - sent to "Allman@Berkeley.EDU" should get to me. But if - another Allman ever appears, this address could suddenly - become ambiguous. I've been the only Allman at Berkeley for - over fifteen years -- to suddenly have this "good address" - bounce mail because it is ambiguous would be a heinous wrong. - - Finger services should be as fuzzy as possible. Mail services - should be unique. ----------------------------------------------------------------------- - * When I use sendmail V8 with a Sun config file I get lines like: - - /etc/sendmail.cf: line 273: replacement $3 out of bounds - - the line in question reads: - - R$*<@$%y>$* $1<@$2.LOCAL>$3 user@ether - - what does this mean? How do I fix it? - - V8 doesn't recognize the Sun "$%y" syntax, so as far as it - is concerned, there is only a $1 and a $2 (but no $3) in this - line. Read Rick McCarty's paper on "Converting Standard Sun - Config Files to Sendmail Version 8", in the contrib directory - (file "converting.sun.configs") on the sendmail distribution - for a full discussion of how to do this. + addresses turn bad. For example, Eric Allman is currently + (to the best of our knowledge) the only ``Allman'' at + Berkeley, so mail sent to "Allman@Berkeley.EDU" should get to + him. But if another Allman ever appears, this address could + suddenly become ambiguous. He's been the only Allman at + Berkeley for over fifteen years -- to suddenly have this + "good address" bounce mail because it is ambiguous would be a + heinous wrong. + + Finger services should be as fuzzy as possible (within + reason, of course). Mail services should be unique. ---------------------------------------------------------------------- * Should I use a wildcard MX for my domain? @@ -180,86 +335,78 @@ in src/READ_ME and cf/README. you don't explicitly test for unknown hosts in your domain, you will get "config error: mail loops back to myself" errors. ----------------------------------------------------------------------- - * I'm connected to the network via a SLIP link. Sometimes my sendmail - process hangs (although it looks like part of the message has been - transfered). Everything else works. What's wrong? - Most likely, the problem isn't sendmail at all, but the low - level network connection. It's important that the MTU (Maximum - Transfer Unit) for the SLIP connection be set properly at both - ends. If they disagree, large packets will be trashed and - the connection will hang. + See RFCs 1535-1537 for more detail and other related (or + common) problems. ---------------------------------------------------------------------- - * I just upgraded to 8.x and suddenly I'm getting messages in my - syslog of the form "collect: I/O error on connection". What is - going wrong? + * How can I get sendmail to process messages sent to an account and + send the results back to the originator? + + This is a local mailer issue, not a sendmail issue. + Depending on what you're doing, look at procmail (mentioned + again below), ftpmail, or Majordomo. - Nothing. This is just a diagnosis of a condition that had - not been diagnosed before. If you are getting a lot of these - from a single host, there is probably some incompatibility - between 8.x and that host. If you get a lot of them in general, - you may have network problems that are causing connections to - get reset. + Check your local archie server to see what machine(s) nearest + you have the most recent versions of these programs. ---------------------------------------------------------------------- * How can I get sendmail to deliver local mail to $HOME/.mail instead of into /usr/spool/mail (or /usr/mail)? - This is a local mailer issue, not a sendmail issue. Either - modify your local mailer (source code will be required) or - change the program called in the "local" mailer configuration - description to be a new program that does this local delivery. - I understand that "procmail" works well, although I haven't - used it myself. - - You might be interested in reading the paper ``HLFSD: Delivering - Email to your $HOME'' available in the Proceedings of the - USENIX System Administration (LISA VII) Conference (November - 1993). This is also available via public FTP from - ftp.cs.columbia.edu:/pub/hlfsd/{README.hlfsd,hlfsd.ps}. + Again, this is a local mailer issue, not a sendmail issue. + Either modify your local mailer (source code will be + required) or change the program called in the "local" mailer + configuration description to be a new program that does this + local delivery. One program that is capable of doing this is + "procmail", although there are probably many others as well. + + You might be interested in reading the paper ``HLFSD: + Delivering Email to your $HOME'' available in the Proceedings + of the USENIX System Administration (LISA VII) Conference + (November 1993). This is also available via public FTP from + ftp.cs.columbia.edu in /pub/hlfsd/{README.hlfsd,hlfsd.ps}. ---------------------------------------------------------------------- - * Under V8, the "From " header gets mysteriously munged when I send - to an alias. - - ``It's not a bug, it's a feature.'' This happens when you have - a "owner-list" alias and you send to "list". V8 propogates the - owner information into the envelope sender field (which appears - as the "From " header on UNIX mail or as the Return-Path: header) - so that downstream errors are properly returned to the mailing - list owner instead of to the sender. In order to make this - appear as sensible as possible to end users, I recommend making - the owner point to a "request" address -- for example: + * I'm trying to to get my mail to go into queue only mode, and it + delivers the mail interactively anyway. (Or, I'm trying to use + the "don't deliver to expensive mailer" flag, and it delivers the + mail interactively anyway.) I can see it does it: here's the + output of "sendmail -v foo@somehost" (or Mail -v or equivalent). - list: :include:/path/name/list.list - owner-list: list-request - list-request: eric + The -v flag to sendmail (which is implied by the -v flag to + Mail and other programs in that family) tells sendmail to + watch the transaction. Since you have explicitly asked to + see what's going on, it assumes that you do not want to to + auto-queue, and turns that feature off. Remove the -v flag + and use a "tail -f" of the log instead to see what's going + on. - This will make message sent to "list" come out as being - "From list-request" instead of "From eric". + If you are trying to use the "don't deliver to expensive + mailer" flag (mailer flag "e"), be sure you also turn on + global option "c" -- otherwise it ignores the mailer flag. ---------------------------------------------------------------------- * There are four UUCP mailers listed in the configuration files. Which one should I use? - The choice is partly a matter of local preferences and what is - running at the other end of your UUCP connection. Unlike good - protocols that define what will go over the wire, UUCP uses - the policy that you should do what is right for the other end; - if they change, you have to change. This makes it hard to - do the right thing, and discourages people from updating their - software. In general, if you can avoid UUCP, please do. + The choice is partly a matter of local preferences and what + is running at the other end of your UUCP connection. Unlike + good protocols that define what will go over the wire, UUCP + uses the policy that you should do what is right for the + other end; if they change, you have to change. This makes it + hard to do the right thing, and discourages people from + updating their software. In general, if you can avoid UUCP, + please do. - If you can't avoid it, you'll have to find the version that is - closest to what the other end accepts. Following is a summary - of the UUCP mailers available. + If you can't avoid it, you'll have to find the version that + is closest to what the other end accepts. Following is a + summary of the UUCP mailers available. uucp-old (obsolete name: "uucp") - This is the oldest, the worst (but the closest to UUCP) way of - sending messages 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. + This is the oldest, the worst (but the closest to UUCP) way + of sending messages across UUCP connections. It does + bangify everything and prepends $U (your UUCP name) to the + sender's address (which can already be a bang path + itself). It can only send to one address at a time, so it + spends a lot of time copying duplicates of messages. Avoid + this if at all possible. uucp-new (obsolete name: "suucp") The same as above, except that it assumes that in one rmail @@ -270,24 +417,25 @@ in src/READ_ME and cf/README. 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.... + 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"). + 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. + 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 ------ ------ ------------------------- @@ -302,24 +450,16 @@ in src/READ_ME and cf/README. 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 ----------------------------------------------------------------------- - * I'm trying to to get my mail to go into queue only mode, and it - delivers the mail interactively anyway. (Or, I'm trying to use - the "don't deliver to expensive mailer" flag, and it doesn't - delivers the mail interactively anyway.) I can see it does it: - here's the output of "sendmail -v foo@somehost" (or Mail -v or - equivalent). - The -v flag to sendmail (which is implied by the -v flag to - Mail and other programs in that family) tells sendmail to - watch the transaction. Since you have explicitly asked to - see what's going on, it assumes that you do not want to to - auto-queue, and turns that feature off. Remove the -v flag - and use a "tail -f" of the log instead to see what's going on. +====================================================================== +RESOLVING PROBLEMS +====================================================================== + + * When I compile, I get "undefined symbol inet_aton" messages. - If you are trying to use the "don't deliver to expensive mailer" - flag (mailer flag "e"), be sure you also turn on global option - "c" -- otherwise it ignores the mailer flag. + You've probably replaced your resolver with the version from + BIND 4.9.3. You need to compile with -l44bsd in order to get + the additional routines. ---------------------------------------------------------------------- * I'm getting "Local configuration error" messages, such as: @@ -330,14 +470,262 @@ in src/READ_ME and cf/README. You have asked mail to the domain (e.g., domain.net) to be forwarded to a specific host (in this case, relay.domain.net) - by using an MX record, but the relay machine doesn't recognize - itself as domain.net. Add domain.net to /etc/sendmail.cw - (if you are using FEATURE(use_cw_file)) or add "Cw domain.net" - to your configuration file. + by using an MX record, but the relay machine doesn't + recognize itself as domain.net. Add domain.net to + /etc/sendmail.cw (if you are using FEATURE(use_cw_file)) or + add "Cw domain.net" to your configuration file. + + IMPORTANT: Be sure you kill and restart the sendmail daemon + after you change the configuration file (for ANY change in + the configuration, not just this one): + + kill `head -1 /etc/sendmail.pid` + sh -c "`tail -1 /etc/sendmail.pid`" + + NOTA BENE: kill -1 does not work! +---------------------------------------------------------------------- + * When I use sendmail V8 with a Sun config file I get lines like: + + /etc/sendmail.cf: line 273: replacement $3 out of bounds + + the line in question reads: + + R$*<@$%y>$* $1<@$2.LOCAL>$3 user@ether + + what does this mean? How do I fix it? + + V8 doesn't recognize the Sun "$%y" syntax, so as far as it is + concerned, there is only a $1 and a $2 (but no $3) in this + line. Read Rick McCarty's paper on "Converting Standard Sun + Config Files to Sendmail Version 8", in the contrib directory + (file "converting.sun.configs") on the sendmail distribution + for a full discussion of how to do this. +---------------------------------------------------------------------- + * When I use sendmail V8 on a Sun, I sometimes get lines like: + + /etc/sendmail.cf: line 445: bad ruleset 96 (50 max) + + what does this mean? How do I fix it? + + You're somehow trying to start up the old Sun sendmail (or + sendmail.mx) with a sendmail V8 config file, which Sun's + sendmail doesn't like. Check your /etc/rc.local, any + procedures that have been created to stop and re-start the + sendmail processes, etc.... Make sure that you've switched + everything over to using the new sendmail. To keep this + problem from ever happening again, try the following: + + mv /usr/lib/sendmail /usr/lib/sendmail.old + ln -s /usr/local/lib/sendmail.v8 /usr/lib/sendmail + mv /usr/lib/sendmail.mx /usr/lib/sendmail.mx.old + ln -s /usr/local/lib/sendmail.v8 /usr/lib/sendmail.mx + chmod 0000 /usr/lib/sendmail.old + chmod 0000 /usr/lib/sendmail.mx.old + + Assuming you have installed sendmail V8 in /usr/local/lib. +---------------------------------------------------------------------- + * When I use sendmail V8 on an IBM RS/6000 running AIX, the system + resource controller always reports sendmail as "inoperative" even + though it is running. What's wrong? + + IBM's system resource controller is one of their "value + added" features to AIX -- it's not a Unix standard. You'll + need to either redefine the subsystem to use signals (see + chssys(1)) or dump the entire subsystem and invoke sendmail + in /etc/rc.tcpip or some other boot script. +---------------------------------------------------------------------- + * When I use sendmail V8 on an Intel x86 machine running Linux, I + have some problems. Specifically, I have.... + + The current versions of Linux are generally considered to be + great for hobbyists and anyone else who wants to learn Unix + inside and out, or wants to always have something to do, or + wants a machine for light-duty mostly personal use and not + high-volume multi-user purposes. + + However, for those who want a system that will just sit in + the background and work without a fuss handling thousands of + mail messages a day for lots of different users, it's not + (yet) stable enough to fit the bill. + + Unfortunately, there are no known shareware/freeware + implementations of any operating system that provides the + level of stability necessary to handle that kind of load + (i.e., there are no free lunches). + + If you're wedded to the Intel x86 platform and want to run + sendmail, we suggest you look at commercial implementations + of Unix such as Interactive, UnixWare, Solaris, or BSD/386 + (just a sample of the dozens of different versions of Unix + for Intel x86). + + Of all known vendor supported versions of Unix for Intel x86, + BSDI's BSD/386 is least expensive and the only one known to + currently ship with sendmail V8 pre-installed. Since sendmail + V8 is continuing to be developed at UC Berkeley, and BSD/386 + is a full BSD 4.4 implementation, this is obviously be the most + "native" sendmail V8 environment. +---------------------------------------------------------------------- + * When I use sendmail on an Intel x86 machine running OS/2, I have + some problems. Specifically, I have.... + + The OS/2 port of sendmail is known to have left out huge + chunks of the code and functionality of even much older + versions of sendmail, in large part because the underlying OS + just doesn't have the necessary hooks to make it happen. + This port is so broken that we make no attempt to provide any + kind of support for it. Try BSDI's BSD/386 instead. +---------------------------------------------------------------------- + * I'm connected to the network via a SLIP/PPP link. Sometimes my + sendmail process hangs (although it looks like part of the + message has been transfered). Everything else works. What's + wrong? + + Most likely, the problem isn't sendmail at all, but the low + level network connection. It's important that the MTU + (Maximum Transfer Unit) for the SLIP connection be set + properly at both ends. If they disagree, large packets will + be trashed and the connection will hang. +---------------------------------------------------------------------- + * I just upgraded to 8.x and suddenly I'm getting messages in my + syslog of the form "collect: I/O error on connection". What is + going wrong? + + Nothing. This is just a diagnosis of a condition that had + not been diagnosed before. If you are getting a lot of these + from a single host, there is probably some incompatibility + between 8.x and that host. If you get a lot of them in + general, you may have network problems that are causing + connections to get reset. +---------------------------------------------------------------------- + * I just upgraded to 8.x and now when my users try to forward their + mail to a program they get an "illegal shell" message and their + mail is not delivered. What's wrong? + + In order for people to be able to run a program from their + .forward file, 8.x insists that their shell (that is, the + shell listed for that user in the passwd entry) be a "valid" + shell, meaning a shell listed in /etc/shells. If /etc/shells + does not exist, a default list is used, typically consisting + of /bin/sh and /bin/csh. + + This is to support environments that may have NFS-shared + directories mounted on machines on which users do not have + login permission. For example, many people make their + file server inaccessible for performance or security + reasons; although users have directories, their shell on + the server is /usr/local/etc/nologin or some such. If you + allowed them to run programs anyway you might as well let + them log in. + + If you are willing to let users run programs from their + .forward file even though they cannot telnet or rsh in (as + might be reasonable if you run smrsh to control the list of + programs they can run) then add the line + + /SENDMAIL/ANY/SHELL/ + + to /etc/shells. This must be typed exactly as indicated, + in caps, with the trailing slash. NOTA BENE: DO NOT + list /usr/local/etc/nologin in /etc/shells -- this will + open up other security problems. +---------------------------------------------------------------------- + * I just upgraded to 8.x and suddenly connections to the SMTP port + take a long time. What is going wrong? + + It's probably something weird in your TCP implementation that + makes the IDENT code act oddly. On most systems V8 tries to + do a ``callback'' to the connecting host to get a validated + user name (see RFC 1413 for detail). If the connecting host + does not support such a service it will normally fail quickly + with "Connection refused", but certain kinds of packet + filters and certain TCP implementations just time out. + + To test this, set the IDENT timeout to zero using + ``OrIdent=0'' in the configuration file. This will + completely disable all use of the IDENT protocol. + + Another possible problem is that you have your name server + and/or resolver configured improperly. Make sure that all + "nameserver" entries in /etc/resolv.conf point to functional + servers. If you are running your own server make certain + that all the servers listed in your root cache (usually + called something like "/var/namedb/root.cache"; see your + /etc/named.boot file to get your value) are up to date. + Either of these can cause long delays. +---------------------------------------------------------------------- + * I just upgraded to 8.x and suddenly I get errors such as ``unknown + mailer error 5 -- mail: options MUST PRECEDE recipients.'' What is + going wrong? + + You need OSTYPE(systype) in your .mc file -- otherwise the + configurations use a default that probably disagrees with + your local mail system. See cf/README for details. +---------------------------------------------------------------------- + * Under V8, the "From " header gets mysteriously munged when I send + to an alias. + + ``It's not a bug, it's a feature.'' This happens when you + have a "owner-list" alias and you send to "list". V8 + propagates the owner information into the envelope sender + field (which appears as the "From " header on UNIX mail or as + the Return-Path: header) so that downstream errors are + properly returned to the mailing list owner instead of to the + sender. In order to make this appear as sensible as possible + to end users, I recommend making the owner point to a + "request" address -- for example: + + list: :include:/path/name/list.list + owner-list: list-request + list-request: eric + + This will make message sent to "list" come out as being "From + list-request" instead of "From eric". +---------------------------------------------------------------------- + * I am trying to use MASQUERADE_AS (or the user database) to + rewrite from addresses, and although it works in the From: header + line, it doesn't work in the envelope (e.g., the "From " line). + + Believe it or not, this is intentional. The interpretation + of the standards by the V8 development group was that this + was an inappropriate rewriting, and that if the rewriting + were incorrect at least the envelope would contain a valid + return address. Other people have since described scenarios + where the envelope cannot be correct without this rewriting, + so 8.7 will have an option to rewrite both header and + envelope. ---------------------------------------------------------------------- * I want to run Sendmail version 8 on my DEC system, but you don't have MAIL11V3 support in sendmail. How do I handle this? - Get Paul Vixie's reimplementation of the mail11 protocol - from gatekeeper.dec.com in /pub/DEC/gwtools. + Get Paul Vixie's reimplementation of the mail11 protocol from + gatekeeper.dec.com in /pub/DEC/gwtools. + + Rumour has it that he will be fully integrating into sendmail + V8 what little is left of IDA sendmail that is not handled + (or handled as well) by V8. No additional information on + this project is currently available. +---------------------------------------------------------------------- + * Messages seem to disappear from my queue unsent. When I look in + the queue directory I see that they have been renamed from qf* to + Qf*, and sendmail doesn't see these. + + If you look closely you should find that the Qf files are + owned by users other than root. Since sendmail runs as root + it refuses to believe information in non-root-owned qf files, + and it renames them to Qf to get them out of the way and make + it easy for you to find. The usual cause of this is + twofold: first, you have the queue directory world writable + (which is probably a mistake -- this opens up other security + problems) and someone is calling sendmail with an "unsafe" + flag, usually a -o flag that sets an option that could + compromise security. When sendmail sees this it gives up + setuid root permissions. + + The usual solution is to not use the problematic flags. If + you must use them, you have to write a special queue + directory and have them processed by the same uid that + submitted the job in the first place. ---------------------------------------------------------------------- +@(#)FAQ 8.16 (Berkeley) 9/17/95 +Send updates to sendmail@sendmail.ORG. diff --git a/usr.sbin/sendmail/KNOWNBUGS b/usr.sbin/sendmail/KNOWNBUGS index f34c6b738c1d9..f9020e7fb75ec 100644 --- a/usr.sbin/sendmail/KNOWNBUGS +++ b/usr.sbin/sendmail/KNOWNBUGS @@ -1,7 +1,7 @@ K N O W N B U G S I N S E N D M A I L - (for 8.6.7) + (for 8.7) The following are bugs or deficiencies in sendmail that I am aware of @@ -14,10 +14,10 @@ distribution). This list is not guaranteed to be complete. -* Null bytes are not handled properly. +* Null bytes are not handled properly in headers. Sendmail should handle full binary data. As it stands, it handles - any value from 0x01-0xFF in the body and 0x01-0x80 and 0xA0-0xFF in + all values in the body, but only 0x01-0x80 and 0xA0-0xFF in the header. Notably missing is 0x00, which would require a major restructuring of the code -- for example, almost no C library support could be used to handle strings. @@ -27,12 +27,6 @@ This list is not guaranteed to be complete. Sometimes identical, duplicate error messages can be generated. As near as I can tell, this is rare and relatively innocuous. -* 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. - * $c (hop count) macro improperly set. The $c macro is supposed to contain the current hop count, for use @@ -46,14 +40,6 @@ This list is not guaranteed to be complete. 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: @@ -68,29 +54,11 @@ This list is not guaranteed to be complete. case is hostB, which is unknown. It probably ought to eliminate hostB early in processing. -* NAME environment variables with commas break. - - If you define your NAME environment variable to have a comma - (e.g., ``Lastname, Firstname''), and you are using the $q definition - that uses ``name <address>'' format, sendmail treats the first and - last names as two addresses, thus producing a bogus From line. You - can work around this by changing the $q definition to use - ``address (name)''. - * \231 considered harmful. Header addresses that have the \231 character (and possibly others in the range \201 - \237) behave in odd and usually unexpected ways. -* DEC Alphas (OSF/1 1.3) sometimes time out on sending mail. - - I have one report that DEC Alphas acting as SMTP clients sometimes - will apparently not see the "250 OK" message in response to the - dot that indicates the end of the message. This only happens if - the message is run from the queue -- if it gets through on first - try, everything is fine. I have been unable to reproduce this - problem at Berkeley. - * accept() problem on SVR4. Apparently, the sendmail daemon loop (doing accept()s on the network) @@ -128,4 +96,24 @@ This list is not guaranteed to be complete. file descriptors per list). This is particularly egregious if you have your connection cache set to be large. -(Version 8.18, last updated 3/14/94) +* Connection caching breaks if you pass the port number as an argument. + + If you have a definition such as: + + Mport, P=[IPC], F=kmDFMuX, S=11/31, R=21, + M=2100000, T=DNS/RFC822/SMTP, + A=IPC [127.0.0.1] $h + + (i.e., where $h is the port number instead of the host name) the + connection caching code will break because it won't notice that + two messages addressed to different ports should use different + connections. + +* ESMTP SIZE underestimates the size of a message + + Sendmail makes no allowance for headers that it adds, nor does it + account for the SMTP on-the-wire \r\n expansion. It probably doesn't + allow for 8->7 bit MIME conversions either. + + +(Version 8.21, last updated 8/27/95) diff --git a/usr.sbin/sendmail/Makefile b/usr.sbin/sendmail/Makefile index 767d48e9b585f..2dc0b0fd7b505 100644 --- a/usr.sbin/sendmail/Makefile +++ b/usr.sbin/sendmail/Makefile @@ -1,24 +1,45 @@ -# @(#)Makefile 8.3 (Berkeley) 2/27/94 +# @(#)Makefile 8.12 (Berkeley) 5/29/95 -SUBDIR= src mailstats makemap praliases -FTPDIR= barad-dur:/disks/barad-dur/ftp/sendmail/. VER= XX +SUBDIR= src mailstats makemap praliases cf/cf +FTPDIR= mastodon:/disks/barad-dur/ftp/sendmail/. +DISTFILES=sendmail.${VER}.tar.Z sendmail.${VER}.tar.gz \ + RELEASE_NOTES FAQ KNOWNBUGS +FILES= Files.base Files.cf Files.misc Files.xdoc -tar: Files.base Files.cf Files.misc Files.xdoc +tar: sccs-check compile-world run-pax + +sccs-check: + sccs check + (cd src; sccs check) + (cd doc/op; sccs check) + (cd doc/intro; sccs check) + (cd doc/usenix; sccs check) + (cd cf; sccs check) + (cd cf/m4; sccs check) + (cd cf/mailer; sccs check) + (cd cf/feature; sccs check) + (cd cf/cf; sccs check) + (cd cf/ostype; sccs check) + (cd cf/domain; sccs check) + +compile-world: (cd src; ${MAKE}) (cd doc; PRINTER=ps ${MAKE}) (cd doc; chmod 444 op/op.ps intro/intro.ps usenix/usenix.ps) (cd cf/cf; ${MAKE}) - pax -w -x tar -L -f sendmail.${VER}.base.tar `grep -v ^# Files.base` - compress sendmail.${VER}.base.tar - pax -w -x tar -L -f sendmail.${VER}.cf.tar `grep -v ^# Files.cf` - compress sendmail.${VER}.cf.tar - pax -w -x tar -L -f sendmail.${VER}.misc.tar `grep -v ^# Files.misc` - compress sendmail.${VER}.misc.tar - pax -w -x tar -L -f sendmail.${VER}.xdoc.tar `grep -v ^# Files.xdoc` - compress sendmail.${VER}.xdoc.tar -ftp: sendmail.${VER}.base.tar.Z sendmail.${VER}.cf.tar.Z sendmail.${VER}.misc.tar.Z sendmail.${VER}.xdoc.tar.Z - rcp sendmail.${VER}.*.tar.Z RELEASE_NOTES FAQ KNOWNBUGS ${FTPDIR} +run-pax: Files.base Files.cf Files.misc Files.xdoc + chmod +x src/makesendmail + pax -w -x tar -L \ + -s ",cf/domain/unspecified-domain,sendmail-${VER}/cf/domain/berkeley-only,p" \ + -s ",^,sendmail-${VER}/," \ + -f sendmail.${VER}.tar \ + `cat ${FILES} | grep -v ^#` + gzip -c sendmail.${VER}.tar > sendmail.${VER}.tar.gz + compress sendmail.${VER}.tar + +ftp: sendmail.${VER}.tar.Z + rcp ${DISTFILES} ${FTPDIR} .include <bsd.subdir.mk> diff --git a/usr.sbin/sendmail/READ_ME b/usr.sbin/sendmail/READ_ME index 016fa7f49c936..2e50d085ecada 100644 --- a/usr.sbin/sendmail/READ_ME +++ b/usr.sbin/sendmail/READ_ME @@ -1,16 +1,21 @@ /*- - * @(#)READ_ME 8.10 (Berkeley) 4/13/94 + * @(#)READ_ME 8.25 (Berkeley) 11/19/95 */ SENDMAIL RELEASE 8 This directory has the latest sendmail software from Berkeley. See -doc/op/op.me for a summary of changes since 5.67. +doc/changes/changes.me for a summary of changes since 5.67. -Report any bugs to sendmail@CS.Berkeley.EDU. +Report any bugs to sendmail-bugs@sendmail.ORG -The latest version of sendmail is kept on FTP.CS.Berkeley.EDU, directory -/ucb/sendmail; check there for the latest revision. +****************************************************************** +** DO NOT USE MAKE to compile sendmail. Instead, cd src and ** +** use the "makesendmail" shell script. On many environments ** +** this will do everything for you, no fuss, no muss. See ** +** src/READ_ME for more details of compilation. See cf/README ** +** for details about building a runtime configuration file. ** +****************************************************************** +--------------+ @@ -28,7 +33,26 @@ The strip.sed file is only used in installation. After installation, edit tmac.doc and tmac.andoc to reflect the installation path of the tmac files. Those files contain pointers to /usr/share/tmac/, and those pointers are not changed by the `make -install` process. +install` process. There's also a bug in those files -- make the +following patch: + +*** tmac.an~ Tue Jul 12 14:29:09 1994 +--- tmac.an Fri Jul 15 13:17:54 1994 +*************** +*** 50,55 **** + .de TH + .rn TH xX + .so /usr/share/lib/tmac/tmac.an.old +! .TH \\$1 \\$2 \\$3 \\$4 \\$5 \\$6 \\$7 \\$8 + .rm xX + .. +--- 50,55 ---- + .de TH + .rn TH xX + .so /usr/share/lib/tmac/tmac.an.old +! .TH "\\$1" "\\$2" "\\$3" "\\$4" "\\$5" "\\$6" "\\$7" "\\$8" + .rm xX + .. Rename the existing tmac.an to be tmac.an.old, and rename tmac.andoc to be tmac.an. @@ -104,8 +128,13 @@ Important RFCs for electronic mail are: RFC976 UUCP mail format RFC1123 Host requirements (modifies 821, 822, and 974) RFC1413 Identification server - RFC1341 MIME: Multipurpose Internet Mail Extensions + RFC1425 SMTP Service Extensions (ESMTP spec) + RFC1426 SMTP Service Extension for 8bit-MIMEtransport + RFC1427 SMTP Service Extension for Message Size Declaration + RFC1521 MIME: Multipurpose Internet Mail Extensions RFC1344 Implications of MIME for Internet Mail Gateways + RFC1428 Transition of Internet Mail from Just-Send-8 to + 8-bit SMTP/MIME Other standards that may be of interest (but which are less directly relevant to sendmail) are: @@ -114,8 +143,8 @@ relevant to sendmail) are: RFC1049 Content-Type header field (extension to RFC822) Warning to AIX users: this version of sendmail does not implement -MB, MR, or MG DNS resource records, as defined as experiments in -RFC883. +MB, MR, or MG DNS resource records, as defined (as experiments) in +RFC1035. +-------------------+ @@ -138,32 +167,26 @@ about NEWDB and NDBM coexisting. +--------------------+ -| Host Name Services | +| HOST NAME SERVICES | +--------------------+ -If you compile with NAMED_BIND (the default) sendmail will use -DNS (the Domain Name System) for most host name lookups. If -you do not have DNS running at your site you may have to turn -this off to cause sendmail to use NIS and/or the /etc/hosts file. -In particular, on SunOS you have to choose to use DNS (which -you should do if you are attached to the Internet, otherwise -you lose MX records, which are required) or NIS -- there is no -way to try both. - -If you are using NIS and /etc/hosts, it is critical that you -list the long (fully qualified) name first in the /etc/hosts file -used to build the NIS database. For example, the line should read +If you are using NIS or /etc/hosts, it is critical that you +list the long (fully qualified) name somewhere (preferably first) in +the /etc/hosts file used to build the NIS database. For example, the +line should read 128.32.149.68 mastodon.CS.Berkeley.EDU mastodon **** NOT **** - 128.32.149.68 mastodon mastodon.CS.Berkeley.EDU + 128.32.149.68 mastodon -If you use the wrong order, sendmail will conclude that your -canonical name is the short version and use that in messages. -The name "mastodon" doesn't mean much outside of Berkeley, -and so this creates incorrect and unreplyable messages. +If you do not include the long name, sendmail will complain loudly +about ``unable to qualify my own domain name (mastodon) -- using +short name'' and conclude that your canonical name is the short +version and use that in messages. The name "mastodon" doesn't mean +much outside of Berkeley, and so this creates incorrect and unreplyable +messages. +-------------+ @@ -178,6 +201,23 @@ with the old version of sendmail, so it's safe to go ahead and install it. ++----------------+ +| USE WITH IDENT | ++----------------+ + +Sendmail 8 supports the IDENT protocol, as defined by RFC 1413. +No ident server is included with this distribution. I have found +copies available on: + + ftp.lysator.liu.se /pub/ident/servers + romulus.ucs.uoknor.edu /networking/ident/servers + ftp.cyf-kr.edu.pl /agh/uciagh/network/ident + +If you want to run an IDENT server, I suggest getting a copy from +one of those sites. Versions are available for several different +systems, including Apollo, BSD, NeXT, AIX, TOPS20, and VMS. + + +-----------+ | MAKEFILES | +-----------+ @@ -219,6 +259,10 @@ contrib Some contributed tools to help with sendmail. THESE on the 4.4BSD tape.) doc Documentation. If you are getting source, read op.me -- it's long, but worth it. +mail.local The source for the local delivery agent used for 4.4BSD. + THIS IS NOT PART OF SENDMAIL! and may not compile + everywhere, since it depends on some 4.4-isms. Warning: + it does mailbox locking differently than other systems. mailstats Statistics printing program. It has the pathname of sendmail.st compiled in, so if you've changed that, beware. This isn't all that useful. @@ -228,12 +272,17 @@ makemap A program that creates the keyed maps used by the $( ... $) expect to preprocess must human-convenient formats using sed scripts before this program will like them. But it should be functionally complete. -praliases A program to print the DBM version of the aliases file. - It hasn't been converted to understand the new Berkeley - DB format (which we are using). +praliases A program to print the DBM or NEWDB version of the + aliases file. rmail Source for rmail(8). This is used as a delivery agent for for UUCP, and could presumably be used by other non-socket oriented mailers. Older versions of - rmail are probably deficient. + rmail are probably deficient. RMAIL IS NOT PART OF + SENDMAIL!!! The 4.4BSD source is included for you to + look at or try to port to your system. I know it doesn't + compile on {SunOS, HP-UX, OSF/1, other} (pick one). +smrsh The "sendmail restricted shell", which can be used as + a replacement for /bin/sh in the prog mailer to provide + increased security control. NOT PART OF SENDMAIL! src Source for the sendmail program itself. test Some test scripts (currently only for compilation aids). diff --git a/usr.sbin/sendmail/RELEASE_NOTES b/usr.sbin/sendmail/RELEASE_NOTES index 98f746193a332..7f212ec3e4874 100644 --- a/usr.sbin/sendmail/RELEASE_NOTES +++ b/usr.sbin/sendmail/RELEASE_NOTES @@ -1,10 +1,1486 @@ SENDMAIL RELEASE NOTES - @(#)RELEASE_NOTES 8.6.12.1 (Berkeley) 3/28/95 + @(#)RELEASE_NOTES 8.7.5.1 (Berkeley) 3/4/96 + This listing shows the version of the sendmail binary, the version of the sendmail configuration files, the date of release, and a summary of the changes in that release. +8.7.5/8.7.3 96/03/04 + Fix glitch in 8.7.4 when putting certain internal lines; this can + in some case cause connections to hang. Patch from Eric + Wassenaar. + +8.7.4/8.7.3 96/02/18 + SECURITY: In some cases it was still possible for an attacker to + insert newlines into a queue file, thus allowing access to + any user (except root). + CONFIG: no changes -- it is not a bug that the configuration + version number is unchanged. + +8.7.3/8.7.3 95/12/03 + Fix botch in name server timeout in RCPT code; this problem caused + two responses in SMTP, which breaks things horribly. Fix + from Gregory Neil Shapiro of WPI. + Verify that L= value on M lines cannot be negative, which could cause + negative array subscripting. Not a security problem since + this has to be in the config file, but it could have caused + core dumps. Pointed out by Bryan Costales. + Fix -d21 debug output for long macro names. Pointed out by Bryan + Costales. + PORTABILITY FIXES: + SCO doesn't have ftruncate. From Bill Aten of Computerizers. + IBM's version of arpa/nameser.h defaults to the wrong byte + order. Tweak it to work properly. Based on fixes + from Fletcher Mattox of UTexas and Betty Lee of + Stanford University. + CONFIG: add confHOSTS_FILE m4 variable to set HostsFile option. + Deficiency pointed out by Bryan Costales of ICSI. + +8.7.2/8.7.2 95/11/19 + REALLY fix the backslash escapes in SmtpGreetingMessage, + OperatorChars, and UnixFromLine options. They were not + properly repaired in 8.7.1. + Completely delete the Bcc: header if and only if there are other + valid recipient headers (To:, Cc: or Apparently-To:, the + last being a historic botch, of course). If Bcc: is the + only recipient header in the message, it's value is tossed, + but the header name is kept. The old behaviour (always keep + the header name and toss the value) allowed primary recipients + to see that a Bcc: went to _someone_. + Include queue id on ``Authentication-Warning: <host>: <user> set + sender to <addresss> using -f'' syslog messages. Suggested + by Kari Hurtta. + If a sequence or switch map lookup entry gets a tempfail but then + continues on to another map type, but the name is not found, + return a temporary failure from the sequence or switch map. + For example, if hosts search ``dns files'' and DNS fails + with a tempfail, the hosts map will go on and search files, + but if it fails the whole thing should be a tempfail, not + a permanent (host unknown) failure, even though that is the + failure in the hosts.files map. This error caused hard + bounces when it should have requeued. + Aliases to files such as /users/bar/foo/inbox, with /users/bar/foo + owned by bar mode 700 and inbox being setuid bar stopped + working properly due to excessive paranoia. Pointed out by + John Hawkinson of Panix. + An SMTP RCPT command referencing a host that gave a nameserver + timeout would return a 451 command (8.6 accepted it and + queued it locally). Revert to the 8.6 behaviour in order + to simplify queue management for clustered systems. Suggested + by Gregory Neil Shapiro of WPI. The same problem could break + MH, which assumes that the SMTP session will succeed (tsk, tsk + -- mail gets lost!); this was pointe dout by Stuart Pook of + Infobiogen. + Fix possible buffer overflow in munchstring(). This was not a security + problem because you couldn't specify any argument to this + without first giving up root privileges, but it is still a + good idea to avoid future problems. Problem noted by John + Hawkinson and Sam Hartman of MIT. + ``452 Out of disk space for temp file'' messages weren't being + printed. Fix from David Perlin of Nanosoft. + Don't advertise the ESMTP DSN extension if the SendMIMEErrors option + is not set, since this is required to get the actual DSNs + created. Problem pointed out by John Gardiner Myers of CMU. + Log permission problems that cause .forward and :include: files to + be untrusted or ignored on log level 12 and higher. Suggestted + by Randy Martin of Clemson University. + Allow user ids in U= clauses of M lines to have hyphens and + underscores. + Fix overcounting of recipients -- only happened when sending to an + alias. Pointed out by Mark Andrews of SGI and Jack Woolley + of Systems and Computer Technology Corporation. + If a message is sent to an address that fails, the error message that + is returned could show some extraneous "success" information + included even if the user did not request success notification, + which was confusing. Pointed out by Allan Johannesen of WPI. + Config files that had no AliasFile definition were defaulting to + using /etc/aliases; this caused problems with nullclient + configurations. Change it back to the 8.6 semantics of + having no local alias file unless it is declared. Problem + noted by Charles Karney of Princeton University. + Fix compile problem if NOTUNIX is defined. Pointed out by Bryan + Costales of ICSI. + Map lookups of class "userdb" maps were always case sensitive; they + should be controlled by the -f flag like other maps. Pointed + out by Bjart Kvarme <bjart.kvarme@usit.uio.no>. + Fix problem that caused some addresses to be passed through ruleset 5 + even when they were tagged as "sticky" by prefixing the + address with an "@". Patch from Thomas Dwyer III of Michigan + Technological University. + When converting a message to Quoted-Printable, prevent any lines with + dots alone on a line by themselves. This is because of the + preponderence of broken mailers that still get this wrong. + Code contributed by Per Hedeland of Ericsson. + Fix F{macro}/file construct -- it previously did nothing. Pointed + out by Bjart Kvarme of USIT/UiO (Norway). + Announce whether a cached connection is SMTP or ESMTP (in -v mode). + Requested by Allan Johannesen. + Delete check for text format of alias files -- it should be legal + to have the database format of the alias files without the + text version. Problem pointed out by Joe Rhett of Navigist, + Inc. + If "Ot" was specified with no value, the TZ variable was not properly + imported from the environment. Pointed out by Frank Crawford + <frank@ansto.gov.au>. + Some architectures core dumped on "program" maps that didn't have + extra arguments. Patch from Booker C. Bense of Stanford + University. + Queue run processes would re-spawn daemons when given a SIGHUP; only + the parent should do this. Fix from Brian Coan of the + Association for Progressive Communications. + If MinQueueAge was set and a message was considered but not run + during a queue run and the Timeout.queuereturn interval was + reached, a "timed out" error message would be returned that + didn't include the failed address (and claimed to be a warning + even though it was fatal). The fix is to not return such + messages until they are actually tried, i.e., in the next + MinQueueAge interval. Problem noted by Rein Tollevik of + SINTEF RUNIT, Oslo. + Add HES_GETMAILHOST compile flag to support MIT Hesiod distributions + that have the hes_getmailhost() routine. DEC Hesiod + distributions do not have this routine. Based on a patch + from Betty Lee of Stanford University. + Extensive cleanups to map open code to handle a locking race condition + in ndbm, hash, and btree format database files on some (most + non-4.4-BSD based) OS architectures. This should solve the + occassional "user unknown" problem during alias rebuilds that + has plagued me for quite some time. Based on a patch from + Thomas Dwyer III of Michigan Technological University. + PORTABILITY FIXES: + Solaris: Change location of newaliases and mailq from + /usr/ucb to /usr/bin to match Sun settings. From + James B. Davis of TCI. + DomainOS: Makefile.DomainOS doesn't require -ldbm. From + Don Lewis of Silicon Systems. + HP-UX 10: rename Makefile.HP-UX.10 => Makefile.HP-UX.10.x + so that the makesendmail script will find it. Pointed + out by Richard Allen of the University of Iceland. + Also, use -Aa -D_HPUX_SOURCE instead of -Ae, which + isn't supported on all compilers. + UXPDS: compilation fixes from Diego R. Lopez. + CONFIG: FAX mailer wasn't setting .FAX as a pseudo-domain unless + you also had a FAX_RELAY. From Thomas.Tornblom@Hax.SE. + CONFIG: Minor glitch in S21 -- attachment of local domain name + didn't have trailing dot. From Jim Hickstein of Teradyne. + CONFIG: Fix best_mx_is_local feature to allow nested addresses such as + user%host@thishost. From Claude Scarpelli of Infobiogen + (France). + CONFIG: OSTYPE(hpux10) failed to define the location of the help file. + Pointed out by Hannu Martikka of Nokia Telecommunications. + CONFIG: Diagnose some inappropriate ordering in configuration files, + such as FEATURE(smrsh) listed after MAILER(local). Based on + a bug report submitted by Paul Hoffman of Proper Publishing. + CONFIG: Make OSTYPE files consistently not override settings that + have already been set. Previously it worked differently + for different files. + CONFIG: Change relay mailer to do masquerading like 8.6 did. My take + is that this is wrong, but the change was causing problems + for some people. From Per Hedeland of Ericsson. + CONTRIB: bitdomain.c patch from John Gardiner Myers <jgm+@CMU.EDU>; + portability changes for Posix environments (no functional + changes). + +8.7.1/8.7.1 95/10/01 + Old macros that have become options (SmtpGreetingMessage, + OperatorChars, and UnixFromLine) didn't allow backslash + escapes in the options, where they previously had. Bug + pointed out by John Hawkinson of MIT. + Fix strange case of an executable called by a program map that + returns a value but also a non-zero exit status; this + would give contradictory results in the higher level; in + particular, the default clause in the map lookup would be + ignored. Change to ignore the value if the program returns + non-zero exit status. From Tom Moore of AT&T GIS. + Shorten parameters passed to syslog() in some contexts to avoid a + bug in many vendors' implementations of that routine. Although + this isn't really a bug in sendmail per se, and my solution + has to assume that syslog() has at least a 1K buffer size + internally (I know some vendors have shortened this + dramatically -- they're on their own), sendmail is a popular + target. Also, limit the size of %s arguments in sprintf. + These both have possible security implications. Solutions + suggested by Casper Dik of Sun's Network Security Group + (Holland), Mark Seiden, and others. + Fix a problem that might cause a non-standard -B (body type) + parameter to be passed to the next server with undefined + results. This could have security implications. + If a filesystem was at > 100% utilization, the freediskspace() + routine incorrectly returned an error rather than zero. + Problem noted by G. Paul Ziemba of Alantec. + Change MX sort order so that local hostnames (those in $=w) always + sort first within a given preference. This forces the bestmx + map to always return the local host first, if it is included + in the list of highest priority MX records. From K. Robert + Elz. + Avoid some possible null pointer dereferences. Fixes from Randy + Martin <WOLF@CLEMSON.EDU> + When sendmail starts up on systems that have no fully qualified + domain name (FQDN) anywhere in the first matching host map + (e.g., /etc/hosts if the hosts service searches "files dns"), + sendmail would sleep to try to find a FQDN, which it really + really needs. This has been changed to fall through to the + next map type if it can't find a FQDN -- i.e., if the hosts + file doesn't have a FQDN, it will try dns even though the + short name was found in /etc/hosts. This is probably a crock, + but many people have hosts files without FQDNs. Remember: + domain names are your friends. + Log a high-priority message if you can't find your FQDN during startup. + Suggested by Simon Barnes of Schlumberger Limited. + When using Hesiod, initialize it early to improve error reporting. + Patch from Don Lewis of Silicon Systems, Inc. + Apparently at least some versions of Linux have a 90 !minute! TCP + connection timeout in the kernel. Add a new "connect" timeout + to limit this time. Defaults to zero (use whatever the + kernel provides). Based on code contributed by J.R. Oldroyd + of TerraNet. + Under some circumstances, a failed message would not be properly + removed from the queue, causing tons of bogus error messages. + (This fix eliminates the problematic EF_KEEPQUEUE flag.) + Problem noted by Allan E Johannesen and Gregory Neil Shapiro + of WPI. + PORTABILITY FIXES: + On IRIX 5.x, there was an inconsistency in the setting + of sendmail.st location. Change the Makefile to + install it in /var/sendmail.st to match the OSTYPE + file and SGI standards. From Andre + <andre@curry.zfe.siemens.de>. + Support for Fujitsu/ICL UXP/DS (For the DS/90 Series) + from Diego R. Lopez <drlopez@cica.es>. + Linux compilation patches from J.R. Oldroyd of TerraNet, Inc. + LUNA 2 Mach patches from Motonori Nakamura. + SunOS Makefile was including -ldbm, which is for the old + dbm library. The ndbm library is part of libc. + CONFIG: avoid bouncing ``user@host.'' (note trailing dot) with + ``local configuration error'' in nullclient configuration. + Patch from Gregory Neil Shapiro of WPI. + CONFIG: don't allow an alias file in nullclient configurations -- + since all addresses are relayed, they give errors during + rebuild. Suggested by Per Hedeland of Ericsson. + CONFIG: local mailer on Solaris 2 should always get a -f flag because + otherwise the F=S causes the From_ line to imply that root is + the sender. Problem pointed out by Claude Scarpelli of + Infobiogen (France). + NEW FILES: + cf/feature/use_ct_file.m4 (omitted from 8.7 by mistake) + src/Makefiles/Makefile.KSR (omitted from 8.7 by mistake) + src/Makefiles/Makefile.UXPDS + +8.7/8.7 95/09/16 + Fix a problem that could cause sendmail to run out of file + descriptors due to a trashed data structure after a + vfork. Fix from Brian Coan of the Institute for + Global Communications. + Change the VRFY response if you have disabled VRFY -- some + people seemed to think that it was too rude. + Avoid reference to uninitialized file descriptor if HASFLOCK + was not defined. This was used "safely" in the sense + that it only did a stat, but it would have set the + map modification time improperly. Problem pointed out + by Roy Mongiovi of Georgia Tech. + Clean up the Subject: line on warning messages and return + receipts so that they don't say "Returned mail:"; this + can be confusing. + Move ruleset entry/exit debugging from 21.2 to 21.1 -- this is + useful enough to make it worthwhile printing on "-d". + Avoid logging alias statistics every time you read the alias + file on systems with no database method compiled in. + If you have a name with a trailing dot, and you try looking it + up using gethostbyname without the dot (for /etc/hosts + compatibility), be sure to turn off RES_DEFNAMES and + RES_DNSRCH to avoid finding the wrong name accidently. + Problem noted by Charles Amos of the University of + Maryland. + Don't do timeouts in collect if you are not running SMTP. + There is nothing that says you can't have a long + running program piped into sendmail (possibly via + /bin/mail, which just execs sendmail). Problem reported + by Don "Truck" Lewis of Silicon Systems. + Try gethostbyname() even if the DNS lookup fails iff option I + is not set. This allows you to have hosts listed in + NIS or /etc/hosts that are not known to DNS. It's normally + a bad idea, but can be useful on firewall machines. This + should really be broken out on a separate flag, I suppose. + Avoid compile warnings against BIND 4.9.3, which uses function + prototypes. From Don Lewis of Silicon Systems. + Avoid possible incorrect diagnosis of DNS-related errors caused + by things like attempts to resolve uucp names using + $[ ... $] -- the fix is to clear h_errno at appropriate + times. From Kyle Jones of UUNET. + SECURITY: avoid denial-of-service attacks possible by destroying + the alias database file by setting resource limits low. + This involves adding two new compile-time options: + HASSETRLIMIT (indicating that setrlimit(2) support is + available) and HASULIMIT (indicating that ulimit(2) support + is available -- the Release 3 form is used). The former + is assumed on BSD-based systems, the latter on System + V-based systems. Attack noted by Phil Brandenberger of + Swarthmore University. + New syntaxes in test (-bt) mode: + ``.Dmvalue'' will define macro "m" to "value". + ``.Ccvalue'' will add "value" to class "c". + ``=Sruleset'' will dump the contents of the indicated + ruleset. + ``=M'' will display the known mailers. + ``-ddebug-spec'' is equivalent to the command-line + -d debug flag. + ``$m'' will print the value of macro $m. + ``$=c'' will print the contents of class $=c. + ``/mx host'' returns the MX records for ``host''. + ``/parse address'' will parse address, returning the value of + crackaddr (essentially, the comment information) + and the parsed address (the same as -bv). + ``/try mailer address'' will rewrite address into the form + it will have when presented to the indicated mailer. + ``/tryflags flags'' will set flags used by parsing. The + flags can be `H' for header or `E' for envelope, + and `S' for sender or `R' for recipient. These + can be combined, so `HR' sets flags for header + recipients. + ``/canon hostname'' will try to canonify hostname and + return the result. + ``/map mapname key'' will look up `key' in the indicated + `mapname' and return the result. + Somewhat better handling of UNIX-domain socket addresses -- it + should show the pathname rather than hex bytes. + Restore ``-ba'' mode -- this reads a file from stdin and parses + the header for envelope sender information and uses + CR-LF as message terminators. It was thought to be + obsolete (used only for Arpanet NCP protocols), but it + turns out that the UK ``Grey Book'' protocols require + that functionality. + Fix a fix in previous release -- if gethostname and gethostbyname + return a name without dots, and if an attempt to canonify + that name fails, wait one minute and try again. This can + result in an extra 60 second delay on startup if your system + hostname (as returned by hostname(1)) has no dot and no names + listed in /etc/hosts or your NIS map have a dot. + Check for proper domain name on HELO and EHLO commands per + RFC 1123 section 5.2.5. Problem noted by Thomas Dwyer III + of Michigan Technological University. + Relax chownsafe rules slightly -- old version said that if you + can't tell if _POSIX_CHOWN_RESTRICTED is set (that is, + if fpathconf returned EINVAL or ENOSYS), assume that + chown is not safe. The new version falls back to whether + you are on a BSD system or not. This is important for + SunOS, which apparently always returns one of those + error codes. This impacts whether you can mail to files + or not. + Syntax errors such as unbalanced parentheses in the configuration + file could be omitted if you had "Oem" prior to the + syntax error in the config file. Change to always print + the error message. It was especially wierd because it + would cause a "warning" message to be sent to the Postmaster + for every message sent (but with no transcript). Problem + noted by Gregory Paris of Motorola. + Rewrite collect and putbody to handle full 8-bit data, including + zero bytes. These changes are internally extensive, but + should have minimal impact on external function. + Allow full words for option names -- if the option letter is + (apparently) a space, then take the word following -- e.g., + O MatchGECOS=TRUE + The full list of old and new names is as follows: + 7 SevenBitInput + 8 EightBitMode + A AliasFile + a AliasWait + B BlankSub + b MinFreeBlocks/MaxMessageSize + C CheckpointInterval + c HoldExpensive + D AutoRebuildAliases + d DeliveryMode + E ErrorHeader + e ErrorMode + f SaveFromLine + F TempFileMode + G MatchGECOS + H HelpFile + h MaxHopCount + i IgnoreDots + I ResolverOptions + J ForwardPath + j SendMimeErrors + k ConnectionCacheSize + K ConnectionCacheTimeout + L LogLevel + l UseErrorsTo + m MeToo + n CheckAliases + O DaemonPortOptions + o OldStyleHeaders + P PostmasterCopy + p PrivacyOptions + Q QueueDirectory + q QueueFactor + R DontPruneRoutes + r, T Timeout + S StatusFile + s SuperSafe + t TimeZoneSpec + u DefaultUser + U UserDatabaseSpec + V FallbackMXhost + v Verbose + w TryNullMXList + x QueueLA + X RefuseLA + Y ForkEachJob + y RecipientFactor + z ClassFactor + Z RetryFactor + The old macros that passed information into sendmail have + been changed to options; those correspondences are: + $e SmtpGreetingMessage + $l UnixFromLine + $o OperatorChars + $q (deleted -- not necessary) + To avoid possible problems with an older sendmail, + configuration level 6 is accepted by this version of + sendmail; any config file using the new names should + specify "V6" in the configuration. + Change address parsing to properly note that a phrase before a + colon and a trailing semicolon are essentially the same + as text outside of angle brackets (i.e., sendmail should + treat them as comments). This is to handle the + ``group name: addr1, addr2, ..., addrN;'' syntax (it will + assume that ``group name:'' is a comment on the first + address and the ``;'' is a comment on the last address). + This requires config file support to get right. It does + understand that :: is NOT this syntax, and can be turned + off completely by setting the ColonOkInAddresses option. + Level 6 config files added with new mailer flags: + A Addresses are aliasable. + i Do udb rewriting on envelope as well as header + sender lines. Applies to the from address mailer + flags rather than the recipient mailer flags. + j Do udb rewriting on header recipient addresses. + Applies to the sender mailer flags rather than the + recipient mailer flags. + k Disable check for loops when doing HELO command. + o Always run as the mail recipient, even on local + delivery. + w Check for an /etc/passwd entry for this user. + 5 Pass addresses through ruleset 5. + : Check for :include: on this address. + | Check for |program on this address. + / Check for /file on this address. + @ Look up sender header addresses in the user + database. Applies to the mailer flags for the + mailer corresponding to the envelope sender + address, rather than to recipient mailer flags. + Pre-level 6 configuration files set A, w, 5, :, |, /, and @ + on the "local" mailer, the o flag on the "prog" and "*file*" + mailers, and the ColonOkInAddresses option. + Eight-to-seven bit MIME conversions. This borrows ideas from + John Beck of Hewlett-Packard, who generously contributed + their implementation to me, which I then didn't use (see + mime.c for an explanation of why). This adds the + EightBitMode option (a.k.a. `8') and an F=8 mailer flag + to control handling of 8-bit data. These have to cope with + two types of 8-bit data: unlabelled 8-bit data (that is, + 8-bit data that is entered without declaring it as 8-bit + MIME -- technically this is illegal according to the + specs) and labelled 8-bit data (that is, it was declared + as 8BITMIME in the ESMTP session or by using the + -B8BITMIME command line flag). If the F=8 mailer flag is + set then 8-bit data is sent to non-8BITMIME machines + instead of converting to 7 bit (essentially using + just-send-8 semantics). The values for EightBitMode are: + m convert unlabelled 8-bit input to 8BITMIME, and do + any necessary conversion of 8BITMIME to 7BIT + (essentially, the full MIME option). + p pass unlabelled 8-bit input, but convert labelled + 8BITMIME input to 7BIT as required (default). + s strict adherence: reject unlabelled 8-bit input, + convert 8BITMIME to 7BIT as required. The F=8 + flag is ignored. + Unlabelled 8-bit data is rejected in mode `s' regardless of + the setting of F=8. + Add new internal class 'n', which is the set of MIME Content-Types + which can not be 8 to 7 bit encoded because of other + considerations. Types "multipart/*" and "message/*" are + never directly encoded (although their components can be). + Add new internal class 's', which is the set of subtypes of the + MIME message/* content type that can be treated as though + they are an RFC822 message. It is predefined to have + "rfc822". Suggested By Kari Hurtta. + Add new internal class 'e'. This is the set of MIME + Content-Transfer-Encodings that can be converted to + a seven bit format (Quoted-Printable or Base64). It is + preinitialized to contain "7bit", "8bit", and "binary". + Add C=charset mailer parameter and the the DefaultCharSet option (no + short name) to set the default character set to use in the + Content-Type: header when doing encoding of an 8-bit message + which isn't marked as MIME into MIME format. If the C= + parameter is set on the Envelope From address, use that as + the default encoding; else use the DefaultCharSet option. + If neither is set, it defaults to "unknown-8bit" as + suggested by RFC 1428 section 3. + Allow ``U=user:group'' field in mailer definition to set a default + user and group that a mailer will be executed as. This + overrides the 'u' and 'g' options, and if the `F=S' flag is + also set, it is the uid/gid that will always be used (that + is, the controlling address is ignored). The values may be + numeric or symbolic; if only a symbolic user is given (no + group) that user's default group in the passwd file is used + as the group. Based on code donated by Chip Rosenthal of + Unicom. + Allow `u' option to also accept user:group as a value, in the same + fashion as the U= mailer option. + Add the symbolic time zone name in the Arpanet format dates (as + a comment). This adds a new compile-time configuration + flag: TZ_TYPE can be set to TZ_TM_NAME (use the value + of (struct tm *)->tm_name), TZ_TM_ZONE (use the value + of (struct tm *)->tm_zone), TZ_TZNAME (use extern char + *tzname[(struct tm *)->tm_isdst]), TZ_TIMEZONE (use + timezone()), or TZ_NONE (don't include the comment). Code + from Chip Rosenthal. + The "Timeout" option (formerly "r") is extended to allow suboptions. + For example, + O Timeout.helo = 2m + There are also two new suboptions "queuereturn" and + "queuewarn"; these subsume the old T option. Thus, to + set them both the preferred new syntax is + O Timeout.queuereturn = 5d + O Timeout.queuewarn = 4h + Sort queue by host name instead of by message priority if the + QueueSortOrder option (no short name) is set is set to + ``host''. This makes better use of the connection cache, + but may delay more ``interactive'' messages behind large + backlogs under some circumstances. This is probably a + good option if you have high speed links or don't do lots + of ``batch'' messages, but less good if you are using + something like PPP on a 14.4 modem. Based on code + contributed by Roy Mongiovi of Georgia Tech (my main + contribution was to make it configurable). + Save i-number of df file in qf file to simplify rebuilding of queue + after disasterous disk crash. Suggested by Kyle Jones of + UUNET; closely based on code from KJS DECWRL code written + by Paul Vixie. NOTA BENE: The qf files produced by 8.7 + are NOT back compatible with 8.6 -- that is, you can convert + from 8.6 to 8.7, but not the other direction. + Add ``F=d'' mailer flag to disable all use of angle brackets in + route-addrs in envelopes; this is because in some cases + they can be sent to the shell, which interprets them as + I/O redirection. + Don't include error file (option E) with return-receipts; this + can be confusing. + Don't send "Warning: cannot send" messages to owner-* or + *-request addresses. Suggested by Christophe Wolfhugel + of the Institut Pasteur, Paris. + Allow -O command line flag to set long form options. + Add "MinQueueAge" option to set the minimum time between attempts + to run the queue. For example, if the queue interval + (-q value) is five minutes, but the minimum queue age + is fifteen minutes, jobs won't be tried more often than + once every fifteen minutes. This can be used to give + you more responsiveness if your delivery mode is set to + queue-only. + Allow "fileopen" timeout (default: 60 seconds) for opening + :include: and .forward files. + Add "-k", "-v", and "-z" flags to map definitions; these set the + key field name, the value field name, and the field + delimiter. The field delimiter can be a single character + or the sequence "\t" or "\n" for tab or newline. + These are for use by NIS+ and similar access methods. + Change maps to always strip quotes before lookups; the -q flag + turns off this behaviour. Suggested by Motonori Nakamura. + Add "nisplus" map class. Takes -k and -v flags to choose the + key and value field names respectively. Code donated by + Sun Microsystems. + Add "hesiod" map class. The "file name" is used as the + "HesiodNameType" parameter to hes_resolve(3). Returns the + first value found for the match. Code donated by Scott + Hutton of Indiana University. + Add "netinfo" (NeXT NetInfo) map class. Maps can have a -k flag to + specify the name of the property that is searched as the + key and a -v flag to specify the name of the property that + is returned as the value (defaults to "members"). The + default map is "/aliases". Some code based on code + contributed by Robert La Ferla of Hot Software. + Add "text" map class. This does slow, linear searches through + text files. The -z flag specifies a column delimiter + (defaults to any sequence of white space), the -k flag + sets the key column number, and the -v flag sets the + value column number. Lines beginning with `#' are treated + as comments. + Add "program" map class to execute arbitrary programs. The search + key is presented as the last argument; the output is one + line read from the programs standard output. Exit statuses + are from sysexits.h. + Add "sequence" map class -- searches maps in sequence until it + finds a match. For example, the declarations: + Kmap1 ... + Kmap2 ... + Kmapseq sequence map1 map2 + defines a map "mapseq" that first searches map1; if the + value is found it is returned immediately, otherwise + map2 is searched and the value returned. + Add "switch" map class. This is much like "sequence" except that + the ordering is fetched from an external file, usually + the system service switch. The parameter is the name of + the service to switch on, and the maps that it will use + are the name of the switch map followed by ".service_type". + For example, if the declaration of the map is + Ksample switch hosts + and the system service switch specifies that hosts are + looked up using dns and nis in that order, then this is + equivalent to + Ksample sequence sample.dns sample.nis + The subordinate maps (sample.*) must already be defined. + Add "user" map class -- looks up users using getpwnam. Takes a + "-v field" flag on the definition that tells what passwd + entry to return -- legal values are name, passwd, uid, gid, + gecos, dir, and shell. Generally expected to be used with + the -m (matchonly) flag. + Add "bestmx" map class -- returns the best MX value for the host + listed as the value. If there are several "best" MX records + for this host, one will be chosen at random. + Add "userdb" map class -- looks up entries in the user database. + The "file name" is actually the tag that will be used, + typically "mailname". If there are multiple entries + matching the name, the one chosen is undefined. + Add multiple queue timeouts (both return and warning). These are + set by the Precedence: or Priority: header fields to one of + three values. If a Priority: is set and has value "normal", + "urgent", or "non-urgent" the corresponding timeouts are + used. If no priority is set, the Precedence: is consulted; + if negative, non-urgent timeouts are used; if greater than + zero, urgent timeouts are used. Otherwise, normal timeouts + are used. The timeouts are set by setting the six timeouts + queue{warn,return}.{urgent,normal,non-urgent}. + Fix problem when a mail address is resolved to a $#error mailer + with a temporary failure indication; it works in SMTP, + but when delivering locally the mail is silently discarded. + This patch, from Kyle Jones of UUNET, bounces it instead + of queueing it (queueing is very hard). + When using /etc/hosts or NIS-style lookups, don't assume that + the first name in the list is the best one -- instead, + search for the first one with a dot. For example, if + an /etc/hosts entry reads + 128.32.149.68 mammoth mammoth.CS.Berkeley.EDU + this change will use the second name as the canonical + machine name instead of the initial, unqualified name. + Change dequote map to replace spaces in quoted text with a value + indicated by the -s flag on the dequote map definition. + For example, ``Mdequote dequote -s_'' will change + "Foo Bar" into an unquoted Foo_Bar instead of leaving it + quoted (because of the space character). Suggested by Dan + Oscarsson for use in X.400 addresses. + Implement long macro names as ${name}; long class names can + be similarly referenced as $={name} and $~{name}. + Definitions are (e.g.) ``D{name}value''. Names that have + a leading lower case letter or punctuation characters are + reserved for internal use by sendmail; i.e., config files + should use names that begin with a capital letter. Based + on code contributed by Dan Oscarsson. + Fix core dump if getgrgid returns a null group list (as opposed + to an empty group list, that is, a pointer to a list + with no members). Fix from Andrew Chang of Sun Microsystems. + Fix possible core dump if malloc fails -- if the malloc in xalloc + failed, it called syserr which called newstr which called + xalloc.... The newstr is now avoided for "panic" messages. + Reported by Stuart Kemp of James Cook University. + Improve connection cache timeouts; previously, they were not even + checked if you were delivering to anything other than an + IPC-connected host, so a series of (say) local mail + deliveries could cause cached connections to be open + much longer than the specified timeout. + If an incoming message exceeds the maximum message size, stop + writing the incoming bytes to the queue data file, since + this can fill your mqueue partition -- this is a possible + denial-of-service attack. + Don't reject all numeric local user names unless HESIOD is + defined. It turns out that Posix allows all-numeric + user names. Fix from Tony Sanders of BSDI. + Add service switch support. If the local OS has a service + switch (e.g., /etc/nsswitch.conf on Solaris or /etc/svc.conf + on DEC systems) that will be used; otherwise, it falls back + to using a local mechanism based on the ServiceSwitchFile + option (default: /etc/service.switch). For example, if the + service switch lists "files" and "nis" for the aliases + service, that will be the default lookup order. the "files" + ("local" on DEC) service type expands to any alias files + you listed in the configuration file, even if they aren't + actually file lookups. + Option I (NameServerOptions) no longer sets the "UseNameServer" + variable which tells whether or not DNS should be considered + canonical. This is now determined based on whether or not + "dns" is in the service list for "hosts". + Add preliminary support for the ESMTP "DSN" extension (Delivery + Status Notifications). DSN notifications override + Return-Receipt-To: headers, which are bogus anyhow. + Add T=mts-name-type/address-type/diagnostic-type keyletter to mailer + definitions to define the types used in DSN returns for + MTA names, addresses, and diagnostics respectively. + Extend heuristic to force running in ESMTP mode to look for the + five-character string "ESMTP" anywhere in the 220 greeting + message (not just the second line). This is to provide + better compatibility with other ESMTP servers. + Print sequence number of job when running the queue so you can + easily see how much progress you have made. Suggested + by Peter Wemm of DIALix. + Map newlines to spaces in logged message-ids; some versions of + syslog truncate the rest of the line after newlines. + Suggested by Fletcher Mattox of U. Texas. + Move up forking for job runs so that if a message is split into + multiple envelopes you don't get "fork storms" -- this + also improves the connection cache utilization. + Accept "<<>>", "<<<>>>", and so forth as equivalent to "<>" for + the purposes of refusing to send error returns. Suggested + by Motonori Nakamura of Ritsumeikan University. + Relax rules on when a file can be written when referenced from + the aliases file: use the default uid/gid instead of the + real uid/gid. This allows you to create a file owned by + and writable only by the default uid/gid that will work + all the time (without having the setuid bit set). Change + suggested by Shau-Ping Lo and Andrew Cheng of Sun + Microsystems. + Add "DialDelay" option (no short name) to provide an "extra" + delay for dial on demand systems. If this is non-zero + and a connect fails, sendmail will wait this long and + then try again. If it takes longer than the kernel + timeout interval to establish the connection, this + option can give the network software time to establish + the link. The default units are seconds. + Move logging of sender information to be as early as possible; + previously, it could be delayed a while for SMTP mail + sent to aliases. Suggested by Brad Knowles of the + Defense Information Systems Agency. + Call res_init() before setting RES_DEBUG; this is required by + BIND 4.9.3, or so I'm told. From Douglas Anderson of + the National Computer Security Center. + Add xdelay= field in logs -- this is a transaction delay, telling + you how long it took to deliver to this address on the + last try. It is intended to be used for sorting mailing + lists to favor "quick" addresses. Provided for use by + the mailprio scripts (see below). + If a map cannot be opened, and that map is non-optional, and + an address requires that map for resolution, queue the + map instead of bouncing it. This involves creating a + pseudo-class of maps called "bogus-map" -- if a required + map cannot be opened, the class is changed to bogus-map; + all queries against bogus-map return "tempfail". The + bogus-map class is not directly accessible. A sample + implementation was donated by Jem Taylor of Glasgow + University Computing Service. + Fix a possible core dump when mailing to a program that talks + SMTP on its standard input. Fix from Keith Moore of + the University of Kentucky. + Make it possible to resolve filenames to $#local $: @ /filename; + previously, the "@" would cause it to not be recognized + as a file. Problem noted by Brian Hill of U.C. Davis. + Accept a -1 signal to re-exec the daemon. This only works if + argv[0] is a full path to sendmail. + Fix bug in "addr=..." field in O option on little-endian machines + -- the network number wasn't being converted to network + byte order. Patch from Kurt Lidl of Pix Technologies + Corporation. + Pre-initialize the resolver early on; this is to avoid a bug with + BIND 4.9.3 that can cause the _res.retry field to get + reset to zero, causing all name server lookups to time + out. Fix from Matt Day of Artisoft. + Restore T line (trusted users) in config file -- but instead of + locking out the -f flag, they just tell whether or not + an X-Authentication-Warning: will be added. This really + just creates new entries in class 't', so "Ft/file/name" + can be used to read trusted user names from a file. + Trusted users are also allowed to execute programs even + if they have a shell that isn't in /etc/shells. + Improve NEWDB alias file rebuilding so it will create them + properly if they do not already exist. This had been + a MAYBENEXTRELEASE feature in 8.6.9. + Check for @:@ entry in NIS maps before starting up to avoid + (but not prevent, sigh) race conditions. This ought to + be handled properly in ypserv, but isn't. Suggested by + Michael Beirne of Motorola. + Refuse connections if there isn't enough space on the filesystem + holding the queue. Contributed by Robert Dana of Wolf + Communications. + Skip checking for directory permissions in the path to a file + when checking for file permissions iff setreuid() + succeeded -- it is unnecessary in that case. This avoids + significant performance problems when looking for .forward + files. Based on a suggestion by Win Bent of USC. + Allow symbolic ruleset names. Syntax can be "Sname" to get an + arbitrary ruleset number assigned or "Sname = integer" + to assign a specific ruleset number. Reference is + $>name_or_number. Names can be composed of alphas, digits, + underscore, or hyphen (first character must be non-numeric). + Allow -o flag on AliasFile lines to make the alias file optional. + From Bryan Costales of ICSI. + Add NoRecipientAction option to handle the case where there is + no legal recipient header in the message. It can take + on values: + None Leave the message as is. The + message will be passed on even + though it is in technically + illegal syntax. + Add-To Add a To: header with any + recipients that it can find from + the envelope. This risks exposing + Bcc: recipients. + Add-Apparently-To Add an Apparently-To: header. This + has almost no redeeming social value, + and is provided only for back + compatibility. + Add-To-Undisclosed Add a header reading + To: undisclosed-recipients:; + which will have the effect of + making the message legal without + exposing Bcc: recipients. + Add-Bcc To add an empty Bcc: header. + There is a chance that mailers down + the line will delete this header, + which could cause exposure of Bcc: + recipients. + The default is NoRecipientAction=None. + Truncate (rather than delete) Bcc: lines in the header. This + should prevent later sendmails (at least, those that don't + themselves delete Bcc:) from considering this message to + be non-conforming -- although it does imply that non-blind + recipients can see that a Bcc: was sent, albeit not to whom. + Add SafeFileEnvironment option. If declared, files named as delivery + targets must be regular files in addition to the regular + checks. Also, if the option is non-null then it is used as + the name of a directory that is used as a chroot(2) + environment for the delivery; the file names listed in an + alias or forward should include the name of this root. + For example, if you run with + O SafeFileEnvironment=/arch + then aliases should reference "/arch/rest/of/path". If a + value is given, sendmail also won't try to save to + /usr/tmp/dead.letter (instead it just leaves the job in the + queue as Qfxxxxxx). Inspired by *Hobbit*'s sendmail patch kit. + Support -A flag for alias files; this will comma concatenate like + entries. For example, given the aliases: + list: member1 + list: member2 + and an alias file declared as: + OAhash:-A /etc/aliases + the final alias inserted will be "list: member1,member2"; + without -A you will get an error on the second and subsequent + alias for "list". Contributed by Bryan Costales of ICSI. + Line-buffer transcript file. Suggested by Liudvikas Bukys. + Fix a problem that could cause very long addresses to core dump in + some special circumstances. Problem pointed out by Allan + Johannesen. + (Internal change.) Change interface to expand() (macro expansion) + to be simpler and more consistent. + Delete check for funny qf file names. This didn't really give + any extra security and caused some people some problems. + (If you -really- want this, define PICKY_QF_NAME_CHECK + at compile time.) Suggested by Kyle Jones of UUNET. + (Internal change.) Change EF_NORETURN to EF_NO_BODY_RETN and + merge with DSN code; this is simpler and more consistent. + This may affect some people who have written their own + checkcompat() routine. + (Internal change.) Eliminate `D' line in qf file. The df file + is now assumed to be the same name as the qf file (with + the `q' changed to a `d', of course). + Avoid forking for delivery if all recipient mailers are marked as + "expensive" -- this can be a major cost on some systems. + Essentially, this forces sendmail into "queue only" mode + if all it is going to do is queue anyway. + Avoid sending a null message in some rather unusual circumstances + (specifically, the RCPT command returns a temporary + failure but the connection is lost before the DATA + command). Fix from Scott Hammond of Secure Computing + Corporation. + Change makesendmail to use a somewhat more rational naming scheme: + Makefiles and obj directories are named $os.$rel.$arch, + where $os is the operating system (e.g., SunOS), $rel is + the release number (e.g., 5.3), and $arch is the machine + architecture (e.g., sun4). Any of these can be omitted, + and anything after the first dot in a release number can + be replaced with "x" (e.g., SunOS.4.x.sun4). The previous + version used $os.$arch.$rel and was rather less general. + Change makesendmail to do a "make depend" in the target directory + when it is being created. This involves adding an empty + "depend:" entry in most Makefiles. + Ignore IDENT return value if the OSTYPE field returns "OTHER", + as indicated by RFC 1413. Pointed out by Kari Hurtta + of the Finnish Meteorological Institute. + Fix problem that could cause multiple responses to DATA command + on header syntax errors (e.g., lines beginning with colons). + Problem noted by Jens Thomassen of the University of Oslo. + Don't let null bytes in headers cause truncation of the rest of + the header. + Log Authentication-Warning:s. Suggested by Motonori Nakamura. + Increase timeouts on message data puts to allow time for receivers + to canonify addresses in headers on the fly. This is still + a rather ugly heuristic. From Motonori Nakamura. + Add "HasWildcardMX" suboption to ResolverOptions; if set, MX + records are not used when canonifying names, and when MX + lookups are done for addressing they must be fully + qualified. This is useful if you have a wildcard MX record, + although it may cause other problems. In general, don't use + wildcard MX records. Patch from Motonori Nakamura. + Eliminate default two-line SMTP greeting message. Instead of + adding an extra "ESMTP spoken here" line, the word "ESMTP" + is added between the first and second word of the first + line of the greeting message (i.e., immediately after the + host name). This eliminates the need for the BROKEN_SMTP_PEERS + compile flag. Old sendmails won't see the ESMTP, but that's + acceptable because SIZE was the only useful extension that + old sendmails understand. + Avoid gethostbyname calls on UNIX domain sockets during SIGUSR1 + invoked state dumps. From Masaharu Onishi. + Allow on-line comments in .forward and :include: files; they are + introduced by the string "<LWSP>#@#<LWSP>", where <LWSP> + is a space or a tab. This is intended for native + representation of non-ASCII sets such as Japanese, where + existing encodings would be unreadable or would lose + data -- for example, + <motonori@cs.ritsumei.ac.jp> NAKAMURA Motonori + (romanized/less information) + <motonori@cs.ritsumei.ac.jp> =?ISO-2022-JP?B?GyRCQ2ZCPBsoQg==?= + =?ISO-2022-JP?B?GyRCQUdFNRsoQg==?= + (with MIME encoding, not human readable) + <motonori@cs.ritsumei.ac.jp> #@# ^[$BCfB<^[(B ^[$BAGE5^[(B + (native encoding with ISO-2022-JP) + The last form is human readable in the Japanese environment. + Based on a fix from (surprise!) Motonori Nakamura. + Don't make SMTP error returns on MAIL FROM: line be "sticky" for all + messages to that host; these are most frequently associated + with addresses rather than the host, with the exception of + 421 (service shutting down). The effect was to cause queues + to sometimes take an excessive time to flush. Reported by + Robert Sargent of Southern Geographics Technologies and + Eric Prestemon of American University. + Add Nice=N mailer option to set the niceness at which a mailer will + run. This is actually a relative niceness (that is, an + increment on the background value). + Log queue runs that are skipped due to high loads. They are logged + at LOG_INFO priority iff the log level is > 8. Contributed + by Bruce Nagel of Data General. + Allow the error mailer to accept a DSN-style error status code + instead of an sysexits status code in the host part. + Anything with a dot will be interpreted as a DSN-style code. + Add new mailer flag: F=3 will tell translations to Quoted-Printable + to encode characters that might be munged by an EBCDIC system + in addition to the set required by RFC 1521. The additional + characters are !, ", #, $, @, [, \, ], ^, `, {, |, }, and ~. + (Think of "IBM 360" as the mnemonic for this flag.) + Change check for mailing to files to look for a pathname of [FILE] + rather than looking for the mailer named *file*. The mapping + of leading slashes still goes to the *file* mailer. This + allows you to implement the *file* mailer as a separate + program, for example, to insert a Content-Length: header + or do special security policy. However, note that the usual + initial checking for the file permissions is still done, and + the program in question needs to be very careful about how + it does the file write to avoid security problems. + Be able to read ~root/.forward even if the path isn't accessible to + regular users. This is disrecommended because sendmail + sometimes does not run as root (e.g., when an unsafe option + is specified on the command line), but should otherwise be + safe because .forward files must be owned by the user for + whom mail is being forwarded, and cannot be a symbolic link. + Suggested by Forrest Aldrich of Wang Laboratories. + Add new "HostsFile" option that is the pathname to the /etc/hosts + file. This is used for canonifying hostnames when the + service type is "files". + Implement programs on F (read class from file) line. The syntax is + Fc|/path/to/program to read the output from the program + into class "c". + Probe the network interfaces to find alternate names for this + host. Requires the SIOCGIFCONF ioctl call. Code + contributed by SunSoft. + Add "E" configuration line to set or propogate environment + variables into children. "E<envar>" will propogate + the named variable from the environment when sendmail + was invoked into any children it calls; "E<envar>=<value>" + sets the named variable to the indicated value. Any + variables not explicitly named will not be in the child + environment. However, sendmail still forces an + "AGENT=sendmail" environment variable, in part to enforce + at least one environment variable, since many programs and + libraries die horribly if this is not guaranteed. + Change heuristic for rebuilding both NEWDB and NDBM versions of + alias databases -- new algorithm looks for the substring + "/yp/" in the file name. This is more portable and involves + less overhead. Suggested by Motonori Nakamura. + Dynamically allocate the queue work list so that you don't lose + jobs in large queue runs. The old QUEUESIZE compile parameter + is replaced by QUEUESEGSIZE (the unit of allocation, which + should not need to be changed) and the MaxQueueRunSize option, + which is the absolute maximum number of jobs that will ever + be handled in a single queue run. Based on code contributed + by Brian Coan of the Institute for Global Communications. + Log message when a message is dropped because it exceeds the maximum + message size. Suggested by Leo Bicknell of Virginia Tech. + Allow trusted users (those on a T line or in $=t) to use -bs without + an X-Authentication-Warning: added. Suggested by Mark Thomas + of Mark G. Thomas Consulting. + Announce state of compile flags on -d0.1 (-d0.10 throws in the + OS-dependent defines). The old semantic of -d0.1 to not + run the daemon in background has been moved to -d99.100, + and the old 52.5 flag (to avoid disconnect() from closing + all output files) has been moved to 52.100. This makes + things more consistent (flags below .100 don't change + semantics) and separates out the backgrounding so that + it doesn't happen automatically on other unrelated debugging + flags. + If -t is used but no addresses are found in the header, give an + error message rather than just doing nothing. Fix from + Motonori Nakamura. + On systems (like SunOS) where the effective gid is not necessarily + included in the group list returned by getgroups(), the + `restrictmailq' option could sometimes cause an authorized + user to not be able to use `mailq'. Fix from Charles Hannum + of MIT. + Allow symbolic service names for [IPC] mailers. Suggested by + Gerry Magennis of Logica International. + Add DontExpandCnames option to prevent $[ ... $] from expanding CNAMEs + when running DNS. For example, if the name FTP.Foo.ORG is + a CNAME for Cruft.Foo.ORG, then when sitting on a machine in + the Foo.ORG domain a lookup of "FTP" returns "Cruft.Foo.ORG" + if this option is not set, or "FTP.Foo.ORG" if it is set. + This is technically illegal under RFC 822 and 1123, but the + IETF is moving toward legalizing it. Note that turning on + this option is not sufficient to guarantee that a downstream + neighbor won't rewrite the address for you. + Add "-m" flag to makesendmail script -- this tells you what object + directory and Makefile it will use, but doesn't actually do + the make. + Do some additional checking on the contents of the qf file to try + to detect attacks against the qf file. In particular, + abort on any line beginning "From ", and add an "end of + file" line -- any data after that line is prohibited. + Always use /etc/sendmail.cf, regardless of the arbitrary vendor + choices. This can be overridden in the Makefile by using + either -DUSE_VENDOR_CF_PATH to get the vendor location + (to the extent that we know it) or by defining + _PATH_SENDMAILCF (which is a "hard override"). This allows + sendmail 8 to have more consistent installation instructions. + Allow macros on `K' line in config file. Suggested by Andrew Chang + of Sun Microsystems. + Improved symbol table hash function from Eric Wassenaar. This one + is at least 50% faster. + Fix problem that didn't notice that timeout on file open was a + transient error. Fix from Larry Parmelee of Cornell + University. + Allow comments (lines beginning with a `#') in files read for + classes. Suggested by Motonori Nakamura. + Make SIGINT (usually ^C) in test mode return to the prompt instead + of dropping out entirely. This makes testing some of the + name server lookups easier to deal with when there are + hung servers. From Motonori Nakamura. + Add new ${opMode} macro that is set to the current operation mode + (e.g., `s' for -bs, `t' for -bt, etc.). Suggested by + Claude Marinier <MARINIER@emp.ewd.dreo.dnd.ca>. + Add new delivery mode (Odd) that defers all map lookups to queue runs. + Kind of like queue-only mode (Odq) except it tries to avoid + any external service requests; for dial-on-demand hosts that + want to minimize DNS lookups when mail is being queued. For + this to work you will also have to make sure that gethostbyname + of your local host name does not do a DNS lookup. + Improved handling of "out of space" conditions from John Myers of + Carnegie Mellon. + Improved security for mailing to files on systems that have fchmod(2) + support. + Improve "cannot send message for N days" message -- now says "could + not send for past N days". Suggested by Tom Moore of AT&T + Global Information Solutions. + Less misleading Subject: line on messages sent to postmaster only. + From Motonori Nakamura. + Avoid duplicate error messages on bad command line flags. From + Motonori Nakamura. + Better error message for case where ruleset 0 falls off the end + or otherwise does not resolve to a canonical triple. + Fix a problem that could cause multiple bounce messages if a bad + address was sent along with a good address to an SMTP + site where that SMTP site returned a 4yz code in response + to the final dot of the data. Problem reported by David + James of British Telecom. + Add "volatile" declarations so that gcc -O2 will work. Patches + from Alexander Dupuy of System Management ARTS. + Delete duplicates in MX lists -- believe it or not, there are sites + that list the same host twice in an MX list. This deletion + only works on adjacent preferences, so an MX list that + had A=5, B=10, A=15 would leave both As, but one that had + A=5, A=10, B=15 would reduce to A, B. This is intentional, + just in case there is something wierd I haven't thought of. + Suggested by Barry Shein of Software Tool & Die. + SECURITY: .forward files cannot be symbolic links. If they are, + a bad guy can read your private files. + PORTABILITY FIXES: + Solaris 2 from Rob McMahon <cudcv@csv.warwick.ac.uk>. + System V Release 4 from Motonori Nakamura of Ritsumeikan + University. This expands the disk size + checking to include all (?) SVR4 configurations. + System V Release 4 from Kimmo Suominen -- initgroups(3) + and setrlimit(2) are both available. + System V Release 4 from sob@sculley.ffg.com -- some versions + apparently "have EX_OK defined in other headerfiles." + Linux Makefile typo. + Linux getusershell(3) is broken in Slackware 2.0 -- + from Andrew Pam of Xanadu Australia. + More Linux tweaking from John Kennedy of California State + University, Chico. + Cray changes from Eric Wassenaar: ``On Cray, shorts, + ints, and longs are all 64 bits, and all structs + are multiples of 64 bits. This means that the + sizeof operator returns only multiples of 8. + This requires adaptation of code that really + deals with 32 bit or 16 bit fields, such as IP + addresses or nameserver fields.'' + DG/UX 5.4.3 from Mark T. Robinson <mtr@ornl.gov>. To + get the old behaviour, use -DDGUX_5_4_2. + DG/UX hack: add _FORCE_MAIL_LOCAL_=yes environment + variable to fix bogus /bin/mail behaviour. + Tandem NonStop-UX from Rick McCarty <mccarty@mpd.tandem.com>. + This also cleans up some System V Release 4 compile + problems. + Solaris 2: sendmail.cw file should be in /etc/mail to + match all the other configuration files. Fix + from Glenn Barry of Emory University. + Solaris 2.3: compile problem in conf.c. Fix from Alain + Nissen of the University of Liege, Belgium. + Ultrix: freespace calculation was incorrect. Fix from + Takashi Kizu of Osaka University. + SVR4: running in background gets a SIGTTOU because the + emulation code doesn't realize that "getpeername" + doesn't require reading the file. Fix from Peter + Wemm of DIALix. + Solaris 2.3: due to an apparent bug in the socket emulation + library, sockets can get into a "wedged" state where + they just return EPROTO; closing and re-opening the + socket clears the problem. Fix from Bob Manson + of Ohio State University. + Hitachi 3050R & 3050RX running HI-UX/WE2: portability + fixes from Akihiro Hashimoto ("Hash") of Chiba + University. + AIX changes to allow setproctitle to work from Rainer Schöpf + of Zentrum für Datenverarbeitung der Universität + Mainz. + AIX changes for load average from Ed Ravin of NASA/Goddard. + SCO Unix from Chip Rosenthal of Unicom (code was using the + wrong statfs call). + ANSI C fixes from Adam Glass (NetBSD project). + Stardent Titan/ANSI C fixes from Kate Hedstrom of Rutgers + University. + DG-UX fixes from Bruce Nagel of Data General. + IRIX64 updates from Mark Levinson of the University of + Rochester Medical Center. + Altos System V (``the first UNIX/XENIX merge the Altos + did for their Series 1000 & Series 2000 line; + their merged code was licenced back to AT&T and + Microsoft and became System V release 3.2'') from + Tim Rice <timr@crl.com>. + OSF/1 running on Intel Paragon from Jeff A. Earickson + <jeff@ssd.intel.com> of Intel Scalable Systems + Divison. + Amdahl UTS System V 2.1.5 (SVr3-based) from Janet Jackson + <janet@dialix.oz.au>. + System V Release 4 (statvfs semantic fix) from Alain + Durand of I.M.A.G. + HP-UX 10.x multiprocessor load average changes from + Scott Hutton and Jeff Sumler of Indiana University. + Cray CSOS from Scott Bolte of Cray Computer Corporation. + Unicos 8.0 from Douglas K. Rand of the University of North + Dakota, Scientific Computing Center. + Solaris 2.4 fixes from Sanjay Dani of Dani Communications. + ConvexOS 11.0 from Christophe Wolfhugel. + IRIX 4.0.5 from David Ashton-Reader of CADcentre. + ISC UNIX from J. J. Bailey. + HP-UX 9.xx on the 8xx series machines from Remy Giraud + of Meteo France. + HP-UX configuration from Tom Lane <tgl@sss.pgh.pa.us>. + IRIX 5.2 and 5.3 from Kari E. Hurtta. + FreeBSD 2.0 from Mike Hickey of Federal Data Corporation. + Sony NEWS-OS 4.2.1R and 6.0.3 from Motonori Nakamura. + Omron LUNA unios-b, mach from Motonori Nakamura. + NEC EWS-UX/V 4.2 from Motonori Nakamura. + NeXT 2.1 from Bryan Costales. + AUX patch thanks to Mike Erwin of Apple Computer. + HP-UX 10.0 from John Beck of Hewlett-Packard. + Ultrix: allow -DBROKEN_RES_SEARCH=0 if you are using a + non-DEC resolver. Suggested by Allan Johannesen. + UnixWare 2.0 fixes from Petr Lampa of the Technical + University of Brno (Czech Republic). + KSR OS 1.2.2 support from Todd Miller of the University + of Colorado. + UX4800 support from Kazuhisa Shimizu of NEC. + MAKEMAP: allow -d flag to allow insertion of duplicate aliases + in type ``btree'' maps. The semantics of this are undefined + for regular maps, but it can be useful for the user database. + MAKEMAP: lock database file while rebuilding to avoid sendmail + lookups while the rebuild is going on. There is a race + condition between the open(... O_TRUNC ...) and the lock + on the file, but it should be quite small. + SMRSH: sendmail restricted shell added to the release. This can + be used as an alternative to /bin/sh for the "prog" mailer, + giving the local administrator more control over what + programs can be run from sendmail. + MAIL.LOCAL: add this local mailer to the tape. It is not really + part of the release proper, and isn't fully supported; in + particular, it does not run on System V based systems and + never will. + CONTRIB: a patch to rmail.c from Bill Gianopoulos of Raytheon + to allow rmail to compile on systems that don't have + function prototypes and systems that don't have snprintf. + CONTRIB: add the "mailprio" scripts that will help you sort mailing + lists by transaction delay times so that addresses that + respond quickly get sent first. This is to prevent very + sluggish servers from delaying other peoples' mail. + Contributed by Tony Sanders of BSDI. + CONTRIB: add the "bsdi.mc" file as contributed by Tony Sanders + of BSDI. This has a lot of comments to help people out. + CONFIG: Don't have .mc files include(../m4/cf.m4) -- instead, + put this on the m4 command line. On GNU m4 (which + supports the __file__ primitive) you can run m4 in an + arbitrary directory -- use either: + m4 ${CFDIR}/m4/cf.m4 config.mc > config.cf + or + m4 -I${CFDIR} m4/cf.m4 config.mc > config.cf + On other versions of m4 that don't support __file__, you + can use: + m4 -D_CF_DIR_=${CFDIR}/ ${CFDIR}/m4/cf.m4 ... + (Note the trailing slash on the _CF_DIR_ definition.) + Old versions of m4 will default to _CF_DIR_=.. for back + compatibility. + CONFIG: fix mail from <> so it will properly convert to + MAILER-DAEMON on local addresses. + CONFIG: fix code that was supposed to catch colons in host + names. Problem noted by John Gardiner Myers of CMU. + CONFIG: allow use of SMTP_MAILER_MAX in nullclient configuration. + From Paul Riddle of the University of Maryland, Baltimore + County. + CONFIG: Catch and reject "." as a host address. + CONFIG: Generalize domaintable to look up all domains, not + just unqualified ones. + CONFIG: Delete OLD_SENDMAIL support -- as near as I can tell, it + was never used and didn't work anyway. + CONFIG: Set flags A, w, 5, :, /, |, and @ on the "local" mailer + and d on all mailers in the UUCP class. + CONFIG: Allow "user+detail" to be aliased specially: it will first + look for an alias for "user+detail", then for "user+*", and + finally for "user". This is intended for forwarding mail + for system aliases such as root and postmaster to a + centralized hub. + CONFIG: add confEIGHT_BIT_HANDLING to set option 8 (see above). + CONFIG: add smtp8 mailer; this has the F=8 (just-send-8) flag set. + The F=8 flag is also set on the "relay" mailer, since + this is expected to be another sendmail. + CONFIG: avoid qualifying all UUCP addresses sent via SMTP with + the name of the UUCP_RELAY -- in some cases, this is the + wrong value (e.g., when we have local UUCP connections), + and this can create unreplyable addresses. From Chip + Rosenthal of Unicom. + CONFIG: add confRECEIVED_HEADER to change the format of the + Received: header inserted into all messages. Suggested by + Gary Mills of the University of Manitoba. + CONFIG: Make "notsticky" the default; use FEATURE(stickyhost) + to get the old behaviour. I did this upon observing + that almost everyone needed this feature, and that the + concept I was trying to make happen didn't work with + some user agents anyway. FEATURE(notsticky) still works, + but it is a no-op. + CONFIG: Add LUSER_RELAY -- the host to which unrecognized user + names are sent, rather than immediately diagnosing them + as User Unknown. + CONFIG: Add SMTP_MAILER_ARGS, ESMTP_MAILER_ARGS, SMTP8_MAILER_ARGS, + and RELAY_MAILER_ARGS to set the arguments for the + indicated mailers. All default to "IPC $h". Patch from + Larry Parmelee of Cornell University. + CONFIG: pop mailer needs F=n flag to avoid "annoying side effects + on the client side" and F=P to get an appropriate + return-path. From Kimmo Suominen. + CONFIG: add FEATURE(local_procmail) to use the procmail program + as the local mailer. For addresses of the form "user+detail" + the "detail" part is passed to procmail via the -a flag. + Contributed by Kimmo Suominen. + CONFIG: add MAILER(procmail) to add an interface to procmail for + use from mailertables. This lets you execute arbitrary + procmail scripts. Contributed by Kimmo Suominen. + CONFIG: add T= fields (MTS type) to local, smtp, and uucp mailers. + CONFIG: add OSTYPE(ptx2) for DYNIX/ptx 2.x from Sequent. From + Paul Southworth of CICNet Systems Support. + CONFIG: use -a$g as default to UUCP mailers, instead of -a$f. + This causes the null return path to be rewritten as + MAILER-DAEMON; otherwise UUCP gets horribly confused. + From Michael Hohmuth of Technische Universitat Dresden. + CONFIG: Add FEATURE(bestmx_is_local) to cause any hosts that + list us as the best possible MX record to be treated as + though they were local (essentially, assume that they + are included in $=w). This can cause additional DNS + traffic, but is easier to administer if this fits your + local model. It does not work reliably if there are + multiple hosts that share the best MX preference. + Code contributed by John Oleynick of Rutgers. + CONFIG: Add FEATURE(smrsh) to use smrsh (the SendMail Restricted + SHell) instead of /bin/sh as the program used for delivery + to programs. If an argument is included, it is used as + the path to smrsh; otherwise, /usr/local/etc/smrsh is + assumed. + CONFIG: Add LOCAL_MAILER_MAX and PROCMAILER_MAILER_MAX to limit the + size of messages to the local and procmail mailers + respectively. Contributed by Brad Knowles of the Defense + Information Systems Agency. + CONFIG: Handle leading ``phrase:'' and trailing ``;'' as comments + (just like text outside of angle brackets) in order to + properly deal with ``group: addr1, ... addrN;'' syntax. + CONFIG: Require OSTYPE macro (the defaults really don't apply to + any real systems any more) and tweak the DOMAIN macro + so that it is less likely that users will accidently use + the Berkeley defaults. Also, create some generic files + that really can be used in the real world. + CONFIG: Add new configuration macros to set character sets for + messages _arriving from_ various mailers: LOCAL_MAILER_CHARSET, + SMTP_MAILER_CHARSET, and UUCP_MAILER_CHARSET. + CONFIG: Change UUCP_MAX_SIZE to UUCP_MAILER_MAX for consistency. + The old name will still be accepted for a while at least. + CONFIG: Implement DECNET_RELAY as spec for host to which DECNET + mail (.DECNET pseudo-domain or node::user) will be sent. + As with all relays, it can be ``mailer:hostname''. Suggested + by Scott Hutton. + CONFIG: Add MAILER(mail11) to get DECnet support. Code contributed + by Barb Dijker of Labyrinth Computer Services. + CONFIG: change confCHECK_ALIASES to default to False -- it has poor + performance for large alias files, and this confused many + people. + CONFIG: Add confCF_VERSION to append local information to the + configuration version number displayed during SMTP startup. + CONFIG: fix some.newsgroup.usenet@local.host syntax (previously it + would only work when locally addressed. Fix from + Edvard Tuinder of Cistron Internet Services. + CONFIG: use ${opMode} to avoid error on .REDIRECT addresses if option + "n" (CheckAlaises) is set when rebuilding alias database. + Based on code contributed by Claude Marinier. + CONFIG: Allow mailertable to have values of the form + ``error:code message''. The ``code'' is a status code + derived from the sysexits codes -- e.g., NOHOST or UNAVAILABLE. + Contributed by David James <dwj@agw.bt.co.uk>. + CONFIG: add MASQUERADE_DOMAIN(domain list) to extend the list of + sender domains that will be replaced with the masquerade name. + These domains will not be treated as local, but if mail passes + through with sender addresses in those domains they will be + replaced by the masquerade name. These can also be specified + in a file using MASQUERADE_DOMAIN_FILE(filename). + CONFIG: add FEATURE(masquerade_envelope) to masquerade the envelope + as well as the header. Substantial improvements to this + code were contributed by Per Hedeland. + CONFIG: add MAILER(phquery) to define a new "ph" mailer; this can be + accessed from a mailertable to do CCSO ph lookups. Contributed + by Kimmo Suominen. + CONFIG: add MAILER(cyrus) to define a new Cyrus mailer; this can be + used to define cyrus and cyrusbb mailers (for IMAP support). + Contributed by John Gardiner Myers of Carnegie Mellon. + CONFIG: add confUUCP_MAILER to select default mailer to use for + UUCP addressing. Suggested by Tom Moore of AT&T GIS. + NEW FILES: + cf/cf/cs-hpux10.mc + cf/cf/cs-solaris2.mc + cf/cf/cyrusproto.mc + cf/cf/generic-bsd4.4.mc + cf/cf/generic-hpux10.mc + cf/cf/generic-hpux9.mc + cf/cf/generic-osf1.mc + cf/cf/generic-solaris2.mc + cf/cf/generic-sunos4.1.mc + cf/cf/generic-ultrix4.mc + cf/cf/huginn.cs.mc + cf/domain/berkeley-only.m4 + cf/domain/generic.m4 + cf/feature/bestmx_is_local.m4 + cf/feature/local_procmail.m4 + cf/feature/masquerade_envelope.m4 + cf/feature/smrsh.m4 + cf/feature/stickyhost.m4 + cf/feature/use_ct_file.m4 + cf/m4/cfhead.m4 + cf/mailer/cyrus.m4 + cf/mailer/mail11.m4 + cf/mailer/phquery.m4 + cf/mailer/procmail.m4 + cf/ostype/amdahl-uts.m4 + cf/ostype/bsdi2.0.m4 + cf/ostype/hpux10.m4 + cf/ostype/irix5.m4 + cf/ostype/isc4.1.m4 + cf/ostype/ptx2.m4 + cf/ostype/unknown.m4 + contrib/bsdi.mc + contrib/mailprio + contrib/rmail.oldsys.patch + mail.local/mail.local.0 + makemap/makemap.0 + smrsh/README + smrsh/smrsh.0 + smrsh/smrsh.8 + smrsh/smrsh.c + src/Makefiles/Makefile.CSOS + src/Makefiles/Makefile.EWS-UX_V + src/Makefiles/Makefile.HP-UX.10 + src/Makefiles/Makefile.IRIX.5.x + src/Makefiles/Makefile.IRIX64 + src/Makefiles/Makefile.ISC + src/Makefiles/Makefile.KSR + src/Makefiles/Makefile.NEWS-OS.4.x + src/Makefiles/Makefile.NEWS-OS.6.x + src/Makefiles/Makefile.NEXTSTEP + src/Makefiles/Makefile.NonStop-UX + src/Makefiles/Makefile.Paragon + src/Makefiles/Makefile.SCO.3.2v4.2 + src/Makefiles/Makefile.SunOS.5.3 + src/Makefiles/Makefile.SunOS.5.4 + src/Makefiles/Makefile.SunOS.5.5 + src/Makefiles/Makefile.UNIX_SV.4.x.i386 + src/Makefiles/Makefile.uts.systemV + src/Makefiles/Makefile.UX4800 + src/aliases.0 + src/mailq.0 + src/mime.c + src/newaliases.0 + src/sendmail.0 + test/t_seteuid.c + RENAMED FILES: + cf/cf/alpha.mc => cf/cf/s2k-osf1.mc + cf/cf/chez.mc => cf/cf/chez.cs.mc + cf/cf/hpux-cs-exposed.mc => cf/cf/cs-hpux9.mc + cf/cf/osf1-cs-exposed.mc => cf/cf/cs-osf1.mc + cf/cf/s2k.mc => cf/cf/s2k-ultrix4.mc + cf/cf/sunos4.1-cs-exposed.mc => cf/cf/cs-sunos4.1.mc + cf/cf/ultrix4.1-cs-exposed.mc => cf/cf/cs-ultrix4.mc + cf/cf/vangogh.mc => cf/cf/vangogh.cs.mc + cf/domain/Berkeley.m4 => cf/domain/Berkeley.EDU.m4 + cf/domain/cs-exposed.m4 => cf/domain/CS.Berkeley.EDU.m4 + cf/domain/eecs-hidden.m4 => cf/domain/EECS.Berkeley.EDU.m4 + cf/domain/s2k.m4 => cf/domain/S2K.Berkeley.EDU.m4 + cf/ostype/hpux.m4 => cf/ostype/hpux9.m4 + cf/ostype/irix.m4 => cf/ostype/irix4.m4 + cf/ostype/ultrix4.1.m4 => cf/ostype/ultrix4.m4 + src/Makefile.* => src/Makefiles/Makefile.* + src/Makefile.AUX => src/Makefiles/Makefile.A-UX + src/Makefile.BSDI => src/Makefiles/Makefile.BSD-OS + src/Makefile.DGUX => src/Makefiles/Makefile.dgux + src/Makefile.RISCos => src/Makefiles/Makefile.UMIPS + src/Makefile.SunOS.4.0.3 => src/Makefiles/Makefile.SunOS.4.0 + OBSOLETED FILES: + cf/cf/cogsci.mc + cf/cf/cs-exposed.mc + cf/cf/cs-hidden.mc + cf/cf/hpux-cs-hidden.mc + cf/cf/knecht.mc + cf/cf/osf1-cs-hidden.mc + cf/cf/sunos3.5-cs-exposed.mc + cf/cf/sunos3.5-cs-hidden.mc + cf/cf/sunos4.1-cs-hidden.mc + cf/cf/ultrix4.1-cs-hidden.mc + cf/domain/cs-hidden.m4 + contrib/rcpt-streaming + src/Makefiles/Makefile.SunOS.5.x + +8.6.13/8.6.12 95/01/25 + SECURITY: In some cases it was still possible for an attacker to + insert newlines into a queue file, thus allowing access to + any user (except root). + CONFIG: no changes -- it is not a bug that the configuration + version number is unchanged. + 8.6.12/8.6.12 95/03/28 Fix to IDENT code (it was getting the size of the reply buffer too small, so nothing was ever accepted). Fix from several @@ -161,7 +1637,7 @@ summary of the changes in that release. and drops core for debugging. This is an attempt to track down a bug that I thought was long since gone. If you see this, please forward the log fragment to - sendmail@CS.Berkeley.EDU. + sendmail@sendmail.ORG. Change OLD_NEWDB from a #ifdef to a #if so it can be turned off with -DOLD_NEWDB=0 on the command line. From Christophe Wolfhugel. @@ -206,7 +1682,7 @@ summary of the changes in that release. Newcastle upon Tyne. IRIX from Dean Cookson and Bill Driscoll of Mitre Corporation. - NCR 3000 from Kevin Darcy of Chrysler Corporation. + NCR 3000 from Kevin Darcy of Chrysler Financial Corporation. SunOS (it has setsid() and setvbuf() calls) from Jonathan Kamens of OpenVision Technologies. HP-UX from Tor Lillqvist. @@ -244,7 +1720,7 @@ summary of the changes in that release. the sender instead of the recipient if the mail was from a local user to another local user. From Motonori Nakamura of Kyoto University. - Fix "wildcard" on /etc/shell matching -- instead of looking + Fix "wildcard" on /etc/shells matching -- instead of looking for "*", look for "/SENDMAIL/ANY/SHELL/". From Bryan Costales of ICSI. Change the method used to declare the "statfs" availability; @@ -603,9 +2079,10 @@ summary of the changes in that release. 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. + If the environment variable HOSTALIASES is set, use it during + canonification as the name of a file with per-user host + translations 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 @@ -795,82 +2272,6 @@ summary of the changes in that release. CONFIG: handle <list:;> syntax correctly. This isn't legal, but it shouldn't fail miserably. From Motonori Nakamura. -8.6.3/8.6.3 93/10/24 - IMPORTANT FIX: Fix several problems that caused open files to - be "lost" during queue runs; this overflowed the open - file table on large runs. An assumption that fdopen - always succeeds sometimes resulted in core dumps when - this happens; sometimes the message is delivered twice, - sometimes (probably) infinite times. This problem in - various form was reported by P{r (Pell) Emanuelsson and - Robert Campbell of U.C. Berkeley. - Special diagnosis of EMFILE error conditions -- it now prints - the known open file descriptors so you can figure out - what is consuming so much resources. - Fix a couple of problems caused by early address parsing - errors -- one caused it to return a "this is only a - warning" when it really wasn't, and the other started - parsing through a random pointer. The first was - noted by Eric Wassenaar. - Fix an infinite loop problem caused by null components in the - host signature. Problem noted by Jan Sorensen. - Be sure to reset the "current date" when sending an error - message -- PostMasterCopy messages were being sent - with an old Date: header. - Fix a problem that caused duplicated mail when sendmail was - (1) compiled without HASFLOCK, (2) you are sending to - an alias that has an owner-* alias, (3) you execute - sendmail with -t flag, (4) you run in -odb mode, and - (5) the sender specifies both the alias name and - another alias [i.e., the envelope is split], then - duplicate messages are sent. The problem description - and one-line fix are from Motonori Nakamura of Kyoto - University. - Avoid a problem that causes error messages to be discarded - in some cases -- this was the result of a "fix" to - avoid duplicate error messages, but two are better - than zero. Reported by Tim Rylance. - Fix a minor botch in checkfd012() -- fix from Dave Hill of - Computervision R&D Ltd. - Remove "X-Authentication-Warning: <user> set sender to <address> - using -f" entirely -- it is far too eager to include - this, and it is confusing folks. I'll try to make it - work "right" in 8.7. Problem noted by Yoshitaka - Tokugawa of dit Co., Ltd. - Fix a race condition with the errno value in tick() and - reapchild() -- this caused occasional misdiagnosis - of problems. Kyle Jones of UUNET helped this along. - Repair rule loop-detection code. From Michael Corrigan of - U.C. San Diego. - Fix a problem that caused sender domain addition (C mailer - flag to be ignored if you use -odq or use -odb with - a high load average. Problem reported by Jim Murray - of Stratus. - Fix ident protocol on multi-homed machines. It was not - always using the correct interface. Fix from J.R. - Oldroyd of Opal. - Previously, sendmail assumed that any SMTP greeting message - that wasn't 2xx was a temporary failure -- it should - only take 4xx as a temporary failure, and return a - solid error message on anything else -- for example, - to allow you to reject connections on a workstation - that is MXed to a mail server. - Portability enhancements for 386BSD/FreeBSD/NetBSD from - Ollivier Robert. - CONFIG: FEATURE(always_add_domain) didn't always add the domain; - in particular, on local mail it modified the header sender - but not the header recipient address(es). Reported by - Jeffrey Honig of Cornell University. Also, strip - any host from envelope recipient address(es), since - local mailers don't understand host names -- this is - to help mailertable entries. From Christopher Davis. - CONFIG: masquerading didn't apply to addresses that already - had a domain. This change replaces a local hostname - by the masquerade name in the SMTP mailer (previously - it only added the masquerade name if it didn't already - have a domain name). Several people complained about - this. - 8.6.2/8.6.2 93/10/15 Put a "successful delivery" message in the transcript for addresses that get return-receipts. diff --git a/usr.sbin/sendmail/cf/README b/usr.sbin/sendmail/cf/README index 6ab3b010ae450..73a4d4822c322 100644 --- a/usr.sbin/sendmail/cf/README +++ b/usr.sbin/sendmail/cf/README @@ -4,13 +4,12 @@ Eric Allman <eric@CS.Berkeley.EDU> - @(#)README 8.28 (Berkeley) 4/14/94 + @(#)README 8.81 (Berkeley) 12/3/95 This document describes the sendmail configuration files being used -at Berkeley. These use features in the new (R8) sendmail, and although -there is an ``OLDSENDMAIL'' mode, they haven't really been tested on -old versions of sendmail and cannot be expected to work well. +at Berkeley. These use features in the new (R8) sendmail; they will +not work on other versions. These configuration files are probably not as general as previous versions, and don't handle as many of the weird cases automagically. @@ -36,9 +35,9 @@ 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 -a fairly crude (but functional) Makefile.dist that works on the -old version of make. +"m4 ../m4/cf.m4 foo.mc > foo.cf" -- that should be all you need. +There is also a fairly crude (but functional) Makefile.dist that works +on the old version of make. To get started, you may want to look at tcpproto.mc (for TCP-only sites), uucpproto.mc (for UUCP-only sites), and clientproto.mc (for @@ -65,41 +64,73 @@ to great effect. But it should get you started. Configuration files are contained in the subdirectory "cf", with a suffix ".mc". They must be run through "m4" to produce a ".cf" file. +You must pre-load "cf.m4": -Let's examine a typical .mc file (cf/cs-exposed.mc): + m4 ${CFDIR}/m4/cf.m4 config.mc > config.cf + +where ${CFDIR} is the root of the cf directory and config.mc is the +name of your configuration file. If you are running a version of M4 +that understands the __file__ builtin (versions of GNU m4 >= 0.75 do +this, but the versions distributed with 4.4BSD and derivatives do not) +or the -I flag (ditto), then ${CFDIR} can be in an arbitrary directory. +For "traditional" versions, ${CFDIR} ***MUST*** be "..", or you MUST +use -D_CF_DIR_=/path/to/cf/dir/ -- note the trailing slash! For example: + + m4 -D_CF_DIR_=${CFDIR}/ ${CFDIR}/m4/cf.m4 config.mc > config.cf + +Let's examine a typical .mc file: divert(-1) # # Copyright (c) 1983 Eric P. Allman - # Copyright (c) 1988 The Regents of the University of California. - # All rights reserved. + # Copyright (c) 1988, 1993 + # The Regents of the University of California. All rights reserved. # - # Redistribution and use in source and binary forms are permitted - # provided that the above copyright notice and this paragraph are - # duplicated in all such forms and that any documentation, - # advertising materials, and other materials related to such - # distribution and use acknowledge that the software was developed - # by the University of California, Berkeley. The name of the - # University may not be used to endorse or promote products derived - # from this software without specific prior written permission. - # THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR - # IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED - # WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. + # 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. # -The divert(-1) will delete the crud in the resulting output file. -The copyright notice is what your lawyers require. Our lawyers require -the one that I've included in my files. A copyleft is a copyright by -another name. - -The next line MUST be - - include(`../m4/cf.m4') + # + # This is a Berkeley-specific configuration file for HP-UX 9.x. + # It applies only the the Computer Science Division at Berkeley, + # and should not be used elsewhere. It is provided on the sendmail + # distribution as a sample only. To create your own configuration + # file, create an appropriate domain file in ../domain, change the + # `DOMAIN' macro below to reference that file, and copy the result + # to a name of your own choosing. + # + divert(0) -This will pull in the M4 macros you will need to make sense of -everything else. As the saying goes, don't think about it, just -do it. If you don't do it, don't bother reading the rest of this -file. +The divert(-1) will delete the crud in the resulting output file. +The copyright notice can be replace by whatever your lawyers require; +our lawyers require the one that I've included in my files. A copyleft +is a copyright by another name. The divert(0) restores regular output. VERSIONID(`<SCCS or RCS version id>') @@ -108,40 +139,67 @@ resulting file. We use SCCS; you could use RCS, something else, or omit it completely. This is not the same as the version id included in SMTP greeting messages -- this is defined in m4/version.m4. - DOMAIN(cs.exposed) + OSTYPE(hpux9)dnl + +You must specify an OSTYPE to properly configure things such as the +pathname of the help and status files, the flags needed for the local +mailer, and other important things. If you omit it, you will get an +error when you try to build the configuration. Look at the ostype +directory for the list of known operating system types. + + DOMAIN(CS.Berkeley.EDU)dnl -This example exposes the host inside of the CS subdomain -- that is, -it doesn't try to hide the name of the workstation to the outside -world. Changing this to DOMAIN(cs.hidden) would have made outgoing -messages refer to "<username>@CS.Berkeley.EDU" instead of using the -local hostname. Internally this is effected by using -"MASQUERADE_AS(CS.Berkeley.EDU)". +This example is specific to the Computer Science Division at Berkeley. +You can use "DOMAIN(generic)" to get a sufficiently bland definition +that may well work for you, or you can create a customized domain +definition appropriate for your environment. + MAILER(local) MAILER(smtp) These describe the mailers used at the default CS site site. The -local mailer is always included automatically. +local mailer is always included automatically. Beware MAILER +declarations should always be last in the configuration file, and +MAILER(smtp) should always precede MAILER(uucp). + +One word of warning: M4 macros are expanded even in lines that appear +to be comments. For example, if you have + + # See FEATURE(foo) above + +it will not do what you expect, because the FEATURE(foo) will be +expanded. This also applies to + + # And then define the $X macro to be the return address + +because ``define'' is an M4 keyword. If you want to use them, surround +them with directed quotes, `like this'. +--------+ | OSTYPE | +--------+ -Note that cf/cs-exposed.mc omits an OSTYPE macro -- this assumes -default Computer Science Division environment. There are several -explicit environments available: bsd4.3, bsd4.4, hpux, irix, osf1, -riscos4.5, sunos3.5, sunos4.1, and ultrix4.1. These change things -like the location of the alias file and queue directory. Some of -these files are identical to one another. +You MUST define an operating system environment, or the configuration +file build will puke. There are several environments available; look +at the "ostype" directory for the current list. This macro changes +things like the location of the alias file and queue directory. Some +of these files are identical to one another. + +It is IMPERATIVE that the OSTYPE occur before any MAILER definitions. +In general, the OSTYPE macro should go immediately after any version +information, and MAILER definitions should always go last. -Operating system definitions are easy to write. They may define -the following variables (everything defaults, so an ostype file -may be empty). +Operating system definitions are usually easy to write. They may define +the following variables (everything defaults, so an ostype file may be +empty). Unfortunately, the list of configuration-supported systems is +not as broad as the list of source-supported systems, since many of +the source contributors do not include corresponding ostype files. ALIAS_FILE [/etc/aliases] The location of the text version of the alias file(s). It can be a comma-separated list of names (but be sure you quote values with - comments in them -- for example, use + commas in them -- for example, use define(`ALIAS_FILE', `a,b') to get "a" and "b" both listed as alias files; otherwise the define() primitive only sees "a"). @@ -157,11 +215,19 @@ LOCAL_MAILER_FLAGS [rmn] The flags used by the local mailer. The flags lsDFM are always included. LOCAL_MAILER_ARGS [mail -d $u] The arguments passed to deliver local mail. +LOCAL_MAILER_MAX [undefined] If defined, the maximum size of local + mail that you are willing to accept. +LOCAL_MAILER_CHARSET [undefined] If defined, messages containing 8-bit data + that ARRIVE from an address that resolves to the + local mailer and which are converted to MIME will be + labelled with this character set. LOCAL_SHELL_PATH [/bin/sh] The shell used to deliver piped email. LOCAL_SHELL_FLAGS [eu] The flags used by the shell mailer. The flags lsDFM are always included. LOCAL_SHELL_ARGS [sh -c $u] The arguments passed to deliver "prog" mail. +LOCAL_SHELL_DIR [$z:/] The directory search path in which the + shell should run. USENET_MAILER_PATH [/usr/lib/news/inews] The name of the program used to submit news. USENET_MAILER_FLAGS [rlsDFMmn] The mailer flags for the usenet mailer. @@ -170,20 +236,66 @@ USENET_MAILER_ARGS [-m -h -n] The command line arguments for the USENET_MAILER_MAX [100000] The maximum size of messages that will be accepted by the usenet mailer. SMTP_MAILER_FLAGS [undefined] Flags added to SMTP mailer. Default - flags are `mDFMUX' (and `a' for esmtp mailer). + flags are `mDFMUX' for all SMTP-based mailers; the + "esmtp" mailer adds `a' and "smtp8" adds `8'. SMTP_MAILER_MAX [undefined] The maximum size of messages that will - be transported using the smtp or esmtp mailers. + be transported using the smtp, smtp8, or esmtp + mailers. +SMTP_MAILER_ARGS [IPC $h] The arguments passed to the smtp mailer. + About the only reason you would want to change this + would be to change the default port. +ESMTP_MAILER_ARGS [IPC $h] The arguments passed to the esmtp mailer. +SMTP8_MAILER_ARGS [IPC $h] The arguments passed to the smtp8 mailer. +RELAY_MAILER_ARGS [IPC $h] The arguments passed to the relay mailer. +SMTP_MAILER_CHARSET [undefined] If defined, messages containing 8-bit data + that ARRIVE from an address that resolves to one of + the SMTP mailers and which are converted to MIME will + be labelled with this character set. UUCP_MAILER_FLAGS [undefined] Flags added to UUCP mailer. Default - flags are `DFMhuU' (and `m' for suucp mailer, minus - `U' for uucp-dom mailer). -UUCP_MAILER_ARGS [uux - -r -z -a$f -gC $h!rmail ($u)] The arguments + flags are `DFMhuU' (and `m' for uucp-new mailer, + minus `U' for uucp-dom mailer). +UUCP_MAILER_ARGS [uux - -r -z -a$g -gC $h!rmail ($u)] The arguments passed to the UUCP mailer. -UUCP_MAX_SIZE [100000] The maximum size message accepted for +UUCP_MAILER_MAX [100000] The maximum size message accepted for transmission by the UUCP mailers. +UUCP_MAILER_CHARSET [undefined] If defined, messages containing 8-bit data + that ARRIVE from an address that resolves to one of + the UUCP mailers and which are converted to MIME will + be labelled with this character set. FAX_MAILER_PATH [/usr/local/lib/fax/mailfax] The program used to submit FAX messages. FAX_MAILER_MAX [100000] The maximum size message accepted for transmission by FAX. +POP_MAILER_PATH [/usr/lib/mh/spop] The pathname of the POP mailer. +POP_MAILER_FLAGS [Penu] Flags added to POP mailer. Flags "lsDFM" + are always added. +POP_MAILER_ARGS [pop $u] The arguments passed to the POP mailer. +PROCMAIL_MAILER_FLAGS [Shu] Flags added to Procmail mailer. Flags + ``DFMmn'' are always set. +PROCMAIL_MAILER_ARGS [procmail -m $h $f $u] The arguments passed to + the Procmail mailer. +PROCMAIL_MAILER_MAX [undefined] If set, the maximum size message that + will be accepted by the procmail mailer. +MAIL11_MAILER_PATH [/usr/etc/mail11] The path to the mail11 mailer. +MAIL11_MAILER_FLAGS [nsFx] Flags for the mail11 mailer. +MAIL11_MAILER_ARGS [mail11 $g $x $h $u] Arguments passed to the mail11 + mailer. +PH_MAILER_PATH [/usr/local/etc/phquery] The path to the phquery + program. +PH_MAILER_FLAGS [ehmu] Flags for the phquery mailer. +PH_MAILER_ARGS [phquery -- $u] -- arguments to the phquery mailer. +CYRUS_MAILER_FLAGS [A5@] The flags used by the cyrus mailer. The + flags lsDFMnP are always included. +CYRUS_MAILER_PATH [/usr/cyrus/bin/deliver] The progam used to deliver + cyrus mail. +CYRUS_MAILER_ARGS [deliver -e -m $h -- $u] The arguments passed + to deliver cyrus mail. +CYRUS_BB_MAILER_FLAGS [undefined] The flags used by the cyrusbb + mailer. The flags lsDFMnP are always included. +CYRUS_BB_MAILER_ARGS [deliver -e -m $u] The arguments passed + to deliver cyrusbb mail. + + +---------+ | DOMAINS | @@ -194,21 +306,28 @@ file, referenced by the DOMAIN macro. For example, our Berkeley domain file includes definitions for several internal distinguished hosts: -UUCP_RELAY The host that will forward UUCP-addressed email. +UUCP_RELAY The host that will accept UUCP-addressed email. If not defined, all UUCP sites must be directly connected. -BITNET_RELAY The host that will forward BITNET-addressed email. +BITNET_RELAY The host that will accept BITNET-addressed email. If not defined, the .BITNET 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 - allows you to have a central site to store a +DECNET_RELAY The host that will accept DECNET-addressed email. + If not defined, the .DECNET pseudo-domain and addresses + of the form node::user will not work. +FAX_RELAY The host that will accept mail to the .FAX pseudo-domain. + The "fax" mailer overrides this value. +LOCAL_RELAY DEPRECATED. 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 allows you to have a central site to store a company- or department-wide alias database. This - only works at small sites, and there are better - methods. + only works at small sites, and only with some user + agents. +LUSER_RELAY The site that will handle lusers -- that is, apparently + local names that aren't local accounts or aliases. -Each of these can be either ``mailer:hostname'' (in which case the -mailer is the internal mailer name, such as ``suucp'' and the hostname +Any of these can be either ``mailer:hostname'' (in which case the +mailer is the internal mailer name, such as ``uucp-new'' and the hostname is the name of the host as appropriate for that mailer) or just a ``hostname'', in which case a default mailer type (usually ``relay'', a variant on SMTP) is used. WARNING: if you have a wildcard MX @@ -231,7 +350,11 @@ knowledge" into one place. +---------+ There are fewer mailers supported in this version than the previous -version, owing mostly to a simpler world. +version, owing mostly to a simpler world. As a general rule, put the +MAILER definitions last in your .mc file, and always put MAILER(smtp) +before MAILER(uucp) -- several features and definitions will modify +the definition of mailers, and the smtp mailer modifies the UUCP +mailer. local The local and prog mailers. You will almost always need these; the only exception is if you relay ALL @@ -242,23 +365,29 @@ smtp The Simple Mail Transport Protocol mailer. This does not hide hosts behind a gateway or another other such hack; it assumes a world where everyone is running the name server. This file actually defines - three mailers: "smtp" for regular (old-style) SMTP to + four mailers: "smtp" for regular (old-style) SMTP to other servers, "esmtp" for extended SMTP to other - servers, and "relay" for transmission to our - RELAY_HOST or MAILER_HUB. + servers, "smtp8" to do SMTP to other servers without + converting 8-bit data to MIME (essentially, this is + your statement that you know the other end is 8-bit + clean even if it doesn't say so), and "relay" for + transmission to our RELAY_HOST, LUSER_RELAY, or + MAILER_HUB. uucp The Unix-to-Unix Copy Program mailer. Actually, this - defines two mailers, "uucp" and "suucp". The latter - 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 + defines two mailers, "uucp-old" (a.k.a. "uucp") and + "uucp-new" (a.k.a. "suucp"). The latter is for when you + know that the UUCP mailer at the other end can handle + multiple recipients in one transfer. If the smtp mailer + is also included in your configuration, two other mailers + ("uucp-dom" and "uucp-uudom") are also defined [warning: + you MUST specify MAILER(smtp) before MAILER(uucp)]. When you + include the uucp mailer, 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. @@ -274,6 +403,51 @@ fax Facsimile transmission. This is experimental and based pop Post Office Protocol. +procmail An interface to procmail (does not come with sendmail). + This is designed to be used in mailertables. For example, + a common question is "how do I forward all mail for a given + domain to a single person?". If you have this mailer + defined, you could set up a mailertable reading: + + host.com procmail:/etc/procmailrcs/host.com + + with the file /etc/procmailrcs/host.com reading: + + :0 # forward mail for host.com + ! -oi -f $1 person@other.host + + This would arrange for (anything)@host.com to be sent + to person@other.host. Within the procmail script, $1 is + the name of the sender and $2 is the name of the recipient. + If you use this with FEATURE(local_procmail), the FEATURE + should be listed first. + +mail11 The DECnet mail11 mailer, useful only if you have the mail11 + program from gatekeeper.dec.com:/pub/DEC/gwtools (and + DECnet, of course). This is for Phase IV DECnet support; + if you have Phase V at your site you may have additional + problems. + +phquery The phquery program. This is somewhat counterintuitively + referenced as the "ph" mailer internally. It can be used + to do CCSO name server lookups. The phquery program, which + this mailer uses, is distributed with the ph client. + +cyrus The cyrus and cyrusbb mailers. The cyrus mailer delivers to + a local cyrus user. this mailer can make use of the + "user+detail@local.host" syntax; it will deliver the mail to + the user's "detail" mailbox if the mailbox's ACL permits. + The cyrusbb mailer delivers to a system-wide cyrus mailbox + if the mailbox's ACL permits. + + +The local mailer accepts addresses of the form "user+detail", where +the "+detail" is not used for mailbox matching but is available +to certain local mail programs (in particular, see FEATURE(local_procmail)). +For example, "eric", "eric+sendmail", and "eric+sww" all indicate +the same user, but additional arguments <null>, "sendmail", and "sww" +may be provided for use in sorting mail. + +----------+ | FEATURES | @@ -300,6 +474,13 @@ use_cw_file Read the file /etc/sendmail.cw file to get alternate The actual filename can be overridden by redefining confCW_FILE. +use_ct_file Read the file /etc/sendmail.ct file to get the names + of users that will be ``trusted'', that is, able to + set their envelope from address using -f without + generating a warning message. + The actual filename can be overridden by redefining + confCT_FILE. + redirect Reject all mail addressed to "address.REDIRECT" with a ``551 User not local; please try <address>'' message. If this is set, you can alias people who have left @@ -315,11 +496,14 @@ nocanonify Don't pass addresses to $[ ... $] for canonification. turn off the usual resolver options that do a similar thing. -notsticky By default, email sent to "user@local.host" are marked +stickyhost If set, email sent to "user@local.host" are marked as "sticky" -- that is, the local addresses aren't matched against UDB and don't go through ruleset 5. - This features disables this treatment. It would - normally be used on network gateway machines. + This is used if you want a set up where "user" is + not necessarily the same as "user@local.host", e.g., + to make a distinct domain-wide namespace. Prior to + 8.7 this was the default, and notsticky was used to + turn this off. mailertable Include a "mailer table" which can be used to override routing for particular domains. The argument of the @@ -336,12 +520,15 @@ mailertable Include a "mailer table" which can be used to override reflected into the message header. domaintable Include a "domain table" which can be used to provide - full domains on unqualified (single word) hosts. The - argument of the FEATURE may be the key definition. If - none is specified, the definition used is: + domain name mapping. Use of this should really be + limited to your own domains. It may be useful if you + change names (e.g., your company changes names from + oldname.com to newname.com). The argument of the + FEATURE may be the key definition. If none is specified, + the definition used is: hash -o /etc/domaintable - The key in this table is the unqualified host name; the - value is the fully qualified domain. Anything in the + The key in this table is the domain name; the value is + the new (fully qualified) domain. Anything in the domaintable is reflected into headers; that is, this is done in ruleset 3. @@ -395,6 +582,29 @@ nullclient This is a special case -- it creates a stripped down defaults to the name of the hub machine). No mailers should be defined. No aliasing or forwarding is done. +local_procmail Use procmail as the local mailer. This mailer can + make use of the "user+indicator@local.host" syntax; + normally the +indicator is just tossed, but by default + it is passed as the -a argument to procmail. The + argument to this feature is the pathname of procmail, + which defaults to /usr/local/bin/procmail. + +bestmx_is_local Accept mail as though locally addressed for any host that + lists us as the best possible MX record. This generates + additional DNS traffic, but should be OK for low to + medium traffic hosts. THIS FEATURE IS FUNDAMENTALLY + INCOMPATIBLE WITH WILDCARD MX RECORDS!!! If you have + a wildcard MX record that matches your domain, you + cannot use this feature. + +smrsh Use the SendMail Restricted SHell (smrsh) provided + with the distribution instead of /bin/sh for mailing + to programs. This improves the ability of the local + system administrator to control what gets run via + e-mail. If an argument is provided it is used as the + pathname to smrsh; otherwise, /usr/local/etc/smrsh is + assumed. + +-------+ | HACKS | @@ -413,6 +623,14 @@ subdomains. | SITE CONFIGURATION | +--------------------+ + ***************************************************** + * This section is really obsolete, and is preserved * + * only for back compatibility. You should plan on * + * using mailertables for new installations. In * + * particular, it doesn't work for the newer forms * + * of UUCP mailers, such as uucp-uudom. * + ***************************************************** + Complex sites will need more local configuration information, such as lists of UUCP hosts they speak with directly. This can get a bit more tricky. For an example of a "complex" site, see cf/ucbvax.mc. @@ -512,7 +730,8 @@ The four mailers are: uucp-dom This UUCP mailer keeps everything as domain addresses. - Basically, it uses the SMTP mailer rewriting rules. + Basically, it uses the SMTP mailer rewriting rules. This mailer + is only included if MAILER(smtp) is also specified. Unfortunately, a lot of UUCP mailer transport agents require bangified addresses in the envelope, although you can use @@ -526,7 +745,8 @@ The four mailers are: 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"). + "some.dom.ain!wolf"). This is also included only if MAILER(smtp) + is also specified. Examples: @@ -623,7 +843,29 @@ The masquerade name is not normally canonified, so it is important that it be your One True Name, that is, fully qualified and not a CNAME. -there are always users that need to be "exposed" -- that is, their +Normally the only addresses that are masqueraded are those that come +from this host (that is, are either unqualified or in $=w, the list +of local domain names). You can augment this list using + + MASQUERADE_DOMAIN(otherhost.domain) + +The effect of this is that although mail to user@otherhost.domain +will not be delivered locally, any mail including any user@otherhost.domain +will, when relayed, be rewritten to have the MASQUERADE_AS address. +This can be a space-separated list of names. + +If these names are in a file, you can use + + MASQUERADE_DOMAIN_FILE(filename) + +to read the list of names from the indicated file. + +Normally only header addresses are masqueraded. If you want to +masquerade the envelope as well, use + + FEATURE(masquerade_envelope) + +There are always users that need to be "exposed" -- that is, their internal site name should be displayed instead of the masquerade name. Root is an example. You can add users to this list using @@ -657,23 +899,28 @@ shared /var/spool/mail scheme, use define(`MAIL_HUB', mailer:hostname) Again, ``mailer:'' defaults to "smtp". If you define both LOCAL_RELAY -and MAIL_HUB, unqualified names will be sent to the LOCAL_RELAY and -other local names will be sent to MAIL_HUB. Names in $=L will be -delivered locally, so you MUST have aliases or .forward files for them. +and MAIL_HUB _AND_ you have FEATURE(stickyhost), unqualified names will +be sent to the LOCAL_RELAY and other local names will be sent to MAIL_HUB. +Names in $=L will be delivered locally, so you MUST have aliases or +.forward files for them. -For example, if are on machine mastodon.CS.Berkeley.EDU, the following -combinations of settings will have the indicated effects: +For example, if are on machine mastodon.CS.Berkeley.EDU and you have +FEATURE(stickyhost), the following combinations of settings will have the +indicated effects: email sent to.... eric eric@mastodon.CS.Berkeley.EDU LOCAL_RELAY set to mail.CS.Berkeley.EDU (delivered locally) -mail.CS.Berkeley.EDU +mail.CS.Berkeley.EDU (no local aliasing) (aliasing done) MAIL_HUB set to mammoth.CS.Berkeley.EDU mammoth.CS.Berkeley.EDU -mammoth.CS.Berkeley.EDU +mammoth.CS.Berkeley.EDU (aliasing done) (aliasing done) Both LOCAL_RELAY and mail.CS.Berkeley.EDU mammoth.CS.Berkeley.EDU -MAIL_HUB set as above +MAIL_HUB set as above (no local aliasing) (aliasing done) + +If you do not have FEATURE(stickyhost) set, then LOCAL_RELAY and +MAIL_HUB act identically, with MAIL_HUB taking precedence. If you want all outgoing mail to go to a central relay site, define SMART_HOST as well. Briefly: @@ -683,11 +930,11 @@ SMART_HOST as well. Briefly: local host (e.g., "eric@mastodon.CS.Berkeley.EDU"). SMART_HOST applies to names qualified with other hosts. -However, beware that other relays (e.g., UUCP_RELAY, BITNET_RELAY, and -FAX_RELAY) take precedence over SMART_HOST, so if you really want -absolutely everything to go to a single central site you will need to -unset all the other relays -- or better yet, find or build a minimal -config file that does this. +However, beware that other relays (e.g., UUCP_RELAY, BITNET_RELAY, +DECNET_RELAY, and FAX_RELAY) take precedence over SMART_HOST, so if you +really want absolutely everything to go to a single central site you will +need to unset all the other relays -- or better yet, find or build a +minimal config file that does this. +-------------------------------+ @@ -788,6 +1035,21 @@ the host name. For example, the first line above sends everything addressed to "anything.my.domain" to that same host name, but using the (presumably experimental) xnet mailer. +In some cases you may want to temporarily turn off MX records, +particularly on gateways. For example, you may want to MX +everything in a domain to one machine that then forwards it +directly. To do this, you might use the DNS configuration: + + *.domain. IN MX 0 relay.machine + +and on relay.machine use the mailertable: + + .domain smtp:[gateway.domain] + +The [square brackets] turn off MX records for this host only. +If you didn't do this, the mailertable would use the MX record +again, which would give you an MX loop. + +--------------------------------+ | USING USERDB TO MAP FULL NAMES | @@ -801,13 +1063,82 @@ is fairly easy.) The intent was to locate the default maildrop at a site, but allow you to override this by sending to a specific host. If you decide to set up the user database in this fashion, it is -imperative that you also specify FEATURE(notsticky) -- otherwise, +imperative that you not use FEATURE(stickyhost) -- otherwise, e-mail sent to Full.Name@local.host.name will be rejected. -To build the internal form of the user databae, use: +To build the internal form of the user database, use: makemap btree /usr/data/base.db < /usr/data/base.txt +As a general rule, I am adamantly opposed to using full names as +e-mail addresses, since they are not in any sense unique. For example, +the Unix software-development community has two Andy Tannenbaums, +at least two well-known Peter Deutsches, and at one time Bell Labs +had two Stephen R. Bournes with offices along the same hallway. +Which one will be forced to suffer the indignity of being +Stephen_R_Bourne_2? The less famous of the two, or the one that +was hired later? + +Finger should handle full names (and be fuzzy). Mail should use +handles, and not be fuzzy. [Not that I expect anyone to pay any +attention to my opinions.] + + ++--------------------------------+ +| MISCELLANEOUS SPECIAL FEATURES | ++--------------------------------+ + +Plussed users + Sometimes it is convenient to merge configuration on a + centralized mail machine, for example, to forward all + root mail to a mail server. In this case it might be + useful to be able to treat the root addresses as a class + of addresses with subtle differences. You can do this + using plussed users. For example, a client might include + the alias: + + root: root+client1@server + + On the server, this will match an alias for "root+client1". + If that is not found, the alias "root+*" will be tried, + then "root". + + ++----------------+ +| SECURITY NOTES | ++----------------+ + +A lot of sendmail security comes down to you. Sendmail 8 is much +more careful about checking for security problems than previous +versions, but there are some things that you still need to watch +for. In particular: + +* Make sure the aliases file isn't writable except by trusted + system personnel. This includes both the text and database + version. + +* Make sure that other files that sendmail reads, such as the + mailertable, is only writable by trusted system personnel. + +* The queue directory should not be world writable PARTICULARLY + if your system allows "file giveaways" (that is, if a non-root + user can chown any file they own to any other user). + +* If your system allows file giveaways, DO NOT create a publically + writable directory for forward files. This will allow anyone + to steal anyone else's e-mail. Instead, create a script that + copies the .forward file from users' home directories once a + night (if you want the non-NFS-mounted forward directory). + +* If your system allows file giveaways, you'll find that + sendmail is much less trusting of :include: files -- in + particular, you'll have to have /SENDMAIL/ANY/SHELL/ in + /etc/shells before they will be trusted (that is, before + files and programs listed in them will be honored). + +In general, file giveaways are a mistake -- if you can turn them +off I recommend you do so. + +------------------+ | FlexFAX SOFTWARE | @@ -817,7 +1148,7 @@ Sam Leffler's FlexFAX software is still in beta test -- but he expects a public version out "later this week" [as of 3/1/93]. The following blurb is direct from Sam: - $Header: /usr/people/sam/fax/RCS/HOWTO,v 1.14 93/05/24 11:42:16 sam Exp $ + $Header: /home/ncvs/src/usr.sbin/sendmail/cf/README,v 1.1.1.3 1995/12/03 17:45:24 peter Exp $ How To Obtain This Software (in case all you get is this file) -------------------------------------------------------------- @@ -958,115 +1289,305 @@ 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. -confFROM_LINE From $g $d Dl The From_ line used when - sending to files or programs. -confFROM_HEADER $?x$x <$g>$|$g$. The format of an internally - Dq generated From: address. -confOPERATORS .:%@!^/[] Do Address operator characters. -confSMTP_LOGIN_MSG $j Sendmail $v/$Z ready at $b - De The initial (spontaneous) - SMTP greeting message. -confSEVEN_BIT_INPUT False O7 Force input to seven bits? -confALIAS_WAIT 10 Oa Wait (in minutes) for alias - file rebuild. -confMIN_FREE_BLOCKS 4 Ob Minimum number of free blocks - on queue filesystem to accept - 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. -confAUTO_REBUILD False OD Automatically rebuild - alias file if needed. -confERROR_MODE (undefined) Oe Error message mode. -confERROR_MESSAGE (undefined) OE Error message header/file. -confSAVE_FROM_LINES False Of Save extra leading - From_ lines. -confTEMP_FILE_MODE 0600 OF Temporary file mode. -confDEF_GROUP_ID 1 Og Default group id. -confMATCH_GECOS False OG Match GECOS field. -confMAX_HOP 17 Oh Maximum hop count. -confIGNORE_DOTS False Oi * Ignore dot as terminator - for incoming messages? -confBIND_OPTS (empty) OI Default options for BIND. -confMIME_FORMAT_ERRORS True Oj * Send error messages as MIME- - encapsulated messages per - RFC 1344. -confFORWARD_PATH (undefined) OJ The colon-separated list of - places to search for .forward - files. -confMCI_CACHE_SIZE 2 Ok Size of open connection cache. -confMCI_CACHE_TIMEOUT 5m OK Open connection cache timeout. -confUSE_ERRORS_TO False Ol * Use the Errors-To: header to - deliver error messages. This - should not be necessary because - of general acceptance of the - envelope/header distinction. -confLOG_LEVEL 9 OL Log level. -confME_TOO False Om Include sender in group - expansions. -confCHECK_ALIASES True On Check RHS of aliases when - running newaliases. -confOLD_STYLE_HEADERS True Oo * Assume that headers without - special chars are old style. -confDAEMON_OPTIONS (undefined) OO SMTP daemon options. -confPRIVACY_FLAGS authwarnings Op Privacy flags. -confCOPY_ERRORS_TO (undefined) OP Address for additional copies - of all error messages. -confQUEUE_FACTOR (undefined) Oq Slope of queue-only function -confREAD_TIMEOUT (undefined) Or SMTP read timeouts. -confSAFE_QUEUE True Os * Commit all messages to disk - before forking. -confMESSAGE_TIMEOUT 5d/4h OT Timeout for messages before - sending error/warning message. -confTIME_ZONE USE_SYSTEM Ot Time zone info -- can be - USE_SYSTEM to use the system's - idea, USE_TZ to use the user's - TZ envariable, or something - else to force that value. -confDEF_USER_ID 1 Ou Default user id. -confUSERDB_SPEC (undefined) OU User database specification. -confFALLBACK_MX (undefined) OV Fallback MX host. -confTRY_NULL_MX_LIST False Ow If we are the best MX for a - host and haven't made other - arrangements, try connecting - to the host directly; normally - this would be a config error. -confQUEUE_LA 8 Ox Load average at which queue-only - function kicks in. -confREFUSE_LA 12 OX Load average at which incoming - SMTP connections are refused. +M4 Variable Name Configuration Description & [Default] +================ ============= ======================= +confMAILER_NAME $n macro [MAILER-DAEMON] The sender name used + for internally generated outgoing + messages. +confDOMAIN_NAME $j macro If defined, sets $j. This should + only be done if your system cannot + determine your local domain name, + and then it should be set to + $w.Foo.COM, where Foo.COM is your + domain name. +confCF_VERSION $Z macro If defined, this is appended to the + configuration version name. +confFROM_HEADER From: [$?x$x <$g>$|$g$.] The format of an + internally generated From: address. +confRECEIVED_HEADER Received: + [.$?_($?s$|from $.$_) $.by $j ($v/$Z)$?r with $r$. id $i$?u for $u$.; $b] + The format of the Received: header + in messages passed through this host. + It is unwise to try to change this. +confCW_FILE Fw class [/etc/sendmail.cw] Name of file used + to get the local additions to the $=w + (local host names) class. +confCT_FILE Ft class [/etc/sendmail.ct] Name of file used + to get the local additions to the $=t + (trusted users) class. +confTRUSTED_USERS Ct class [no default] Names of users to add to + the list of trusted users. This list + always includes root, uucp, and daemon. + See also FEATURE(use_ct_file). +confSMTP_MAILER - [smtp] The mailer name used when + SMTP connectivity is required. + One of "smtp", "smtp8", or "esmtp". +confUUCP_MAILER - [uucp-old] The mailer to be used by + default for bang-format recipient + addresses. See also discussion of + $=U, $=Y, and $=Z in the MAILER(uucp) + section. +confLOCAL_MAILER - [local] The mailer name used when + local connectivity is required. + Almost always "local". +confRELAY_MAILER - [relay] The default mailer name used + for relaying any mail (e.g., to a + BITNET_RELAY, a SMART_HOST, or + whatever). This can reasonably be + "uucp-new" if you are on a + UUCP-connected site. +confSEVEN_BIT_INPUT SevenBitInput [False] Force input to seven bits? +confEIGHT_BIT_HANDLING EightBitMode [pass8] 8-bit data handling +confALIAS_WAIT AliasWait [10m] Time to wait for alias file + rebuild until you get bored and + decide that the apparently pending + rebuild failed. +confMIN_FREE_BLOCKS MinFreeBlocks [100] Minimum number of free blocks on + queue filesystem to accept SMTP mail. + (Prior to 8.7 this was minfree/maxsize, + where minfree was the number of free + blocks and maxsize was the maximum + message size. Use confMAX_MESSAGE_SIZE + for the second value now.) +confMAX_MESSAGE_SIZE MaxMessageSize [infinite] The maximum size of messages + that will be accepted (in bytes). +confBLANK_SUB BlankSub [ ] Blank (space) substitution + character. +confCON_EXPENSIVE HoldExpensive [False] Avoid connecting immediately + to mailers marked expensive? +confCHECKPOINT_INTERVAL CheckpointInterval + [10] Checkpoint queue files every N + recipients. +confDELIVERY_MODE DeliveryMode [background] Default delivery mode. +confAUTO_REBUILD AutoRebuildAliases + [False] Automatically rebuild alias + file if needed. +confERROR_MODE ErrorMode [print] Error message mode. +confERROR_MESSAGE ErrorHeader [undefined] Error message header/file. +confSAVE_FROM_LINES SafeFromLine Save extra leading From_ lines. +confTEMP_FILE_MODE TempFileMode [0600] Temporary file mode. +confMATCH_GECOS MatchGECOS [True] Match GECOS field. +confMAX_HOP MaxHopCount [25] Maximum hop count. +confIGNORE_DOTS* IgnoreDots [False; always False in -bs or -bd mode] + Ignore dot as terminator for incoming + messages? +confBIND_OPTS ResolverOptions [undefined] Default options for DNS + resolver. +confMIME_FORMAT_ERRORS* SendMimeErrors [True] Send error messages as MIME- + encapsulated messages per RFC 1344. +confFORWARD_PATH ForwardPath [$z/.forward.$w:$z/.forward] + The colon-separated list of places to + search for .forward files. N.B.: see + the Security Notes section. +confMCI_CACHE_SIZE ConnectionCacheSize + [2] Size of open connection cache. +confMCI_CACHE_TIMEOUT ConnectionCacheTimeout + [5m] Open connection cache timeout. +confUSE_ERRORS_TO* UserErrorsTo [False] Use the Errors-To: header to + deliver error messages. This should + not be necessary because of general + acceptance of the envelope/header + distinction. +confLOG_LEVEL LogLevel [9] Log level. +confME_TOO MeToo [False] Include sender in group + expansions. +confCHECK_ALIASES CheckAliases [False] Check RHS of aliases when + running newaliases. Since this does + DNS lookups on every address, it can + slow down the alias rebuild process + considerably on large alias files. +confOLD_STYLE_HEADERS* OldStyleHeaders [True] Assume that headers without + special chars are old style. +confDAEMON_OPTIONS DaemonPortOptions + [none] SMTP daemon options. +confPRIVACY_FLAGS PrivacyOptions [authwarnings] Privacy flags. +confCOPY_ERRORS_TO PostmasterCopy [undefined] Address for additional + copies of all error messages. +confQUEUE_FACTOR QueueFactor [600000] Slope of queue-only function. +confDONT_PRUNE_ROUTES DontPruneRoutes [False] Don't prune down route-addr + syntax addresses to the minimum + possible. +confSAFE_QUEUE* SuperSafe [True] Commit all messages to disk + before forking. +confTO_INITIAL Timeout.initial [5m] The timeout waiting for a response + on the initial connect. +confTO_HELO Timeout.helo [5m] The timeout waiting for a response + to a HELO or EHLO command. +confTO_MAIL Timeout.mail [10m] The timeout waiting for a + response to the MAIL command. +confTO_RCPT Timeout.rcpt [1h] The timeout waiting for a response + to the RCPT command. +confTO_DATAINIT Timeout.datainit + [5m] The timeout waiting for a 354 + response from the DATA command. +confTO_DATABLOCK Timeout.datablock + [1h] The timeout waiting for a block + during DATA phase. +confTO_DATAFINAL Timeout.datafinal + [1h] The timeout waiting for a response + to the final "." that terminates a + message. +confTO_RSET Timeout.rset [5m] The timeout waiting for a response + to the RSET command. +confTO_QUIT Timeout.quit [2m] The timeout waiting for a response + to the QUIT command. +confTO_MISC Timeout.misc [2m] The timeout waiting for a response + to other SMTP commands. +confTO_COMMAND Timeout.command [1h] In server SMTP, the timeout waiting + for a command to be issued. +confTO_IDENT Timeout.ident [30s] The timeout waiting for a response + to an IDENT query. +confTO_FILEOPEN Timeout.fileopen + [60s] The timeout waiting for a file + (e.g., :include: file) to be opened. +confTO_QUEUERETURN Timeout.queuereturn + [5d] The timeout before a message is + returned as undeliverable. +confTO_QUEUERETURN_NORMAL + Timeout.queuereturn.normal + [undefined] As above, for normal + priority messages. +confTO_QUEUERETURN_URGENT + Timeout.queuereturn.urgent + [undefined] As above, for urgent + priority messages. +confTO_QUEUERETURN_NONURGENT + Timeout.queuereturn.non-urgent + [undefined] As above, for non-urgent + (low) priority messages. +confTO_QUEUEWARN Timeout.queuewarn + [4h] The timeout before a warning + message is sent to the sender telling + them that the message has been deferred. +confTO_QUEUEWARN_NORMAL Timeout.queuewarn.normal + [undefined] As above, for normal + priority messages. +confTO_QUEUEWARN_URGENT Timeout.queuewarn.urgent + [undefined] As above, for urgent + priority messages. +confTO_QUEUEWARN_NONURGENT + Timeout.queuewarn.non-urgent + [undefined] As above, for non-urgent + (low) priority messages. +confTIME_ZONE TimeZoneSpec [USE_SYSTEM] Time zone info -- can be + USE_SYSTEM to use the system's idea, + USE_TZ to use the user's TZ envariable, + or something else to force that value. +confDEF_USER_ID DefaultUser [1:1] Default user id. +confUSERDB_SPEC UserDatabaseSpec + [undefined] User database specification. +confFALLBACK_MX FallbackMXhost [undefined] Fallback MX host. +confTRY_NULL_MX_LIST TryNullMXList [False] If we are the best MX for a + host and haven't made other + arrangements, try connecting to the + host directly; normally this would be + a config error. +confQUEUE_LA QueueLA [8] Load average at which queue-only + function kicks in. +confREFUSE_LA RefuseLA [12] Load average at which incoming + SMTP connections are refused. confWORK_RECIPIENT_FACTOR - (undefined) Oy Cost of each recipient. -confSEPARATE_PROC False OY Run all deliveries in a - separate process. -confWORK_CLASS_FACTOR (undefined) Oz Priority multiplier for class. -confWORK_TIME_FACTOR (undefined) OZ Cost of each delivery attempt. -confCW_FILE /etc/sendmail.cw Name of file used to get the - Fw local additions to the $=w - class. -confSMTP_MAILER smtp - The mailer name used when - SMTP connectivity is required. - Either "smtp" or "esmtp". -confLOCAL_MAILER local - The mailer name used when - local connectivity is required. - Almost always "local". -confRELAY_MAILER relay - The default mailer name used - for relaying any mail (e.g., - to a BITNET_RELAY, a - SMART_HOST, or whatever). - This can reasonably be "suucp" - if you are on a UUCP-connected - site. -confDOMAIN_NAME (undefined) Dj If defined, sets $j. + RecipientFactor [30000] Cost of each recipient. +confSEPARATE_PROC ForkEachJob [False] Run all deliveries in a separate + process. +confWORK_CLASS_FACTOR ClassFactor [1800] Priority multiplier for class. +confWORK_TIME_FACTOR RetryFactor [90000] Cost of each delivery attempt. +confQUEUE_SORT_ORDER QueueSortOrder [Priority] Queue sort algorithm: + Priority or Host. +confMIN_QUEUE_AGE MinQueueAge [0] The minimum amount of time a job + must sit in the queue between queue + runs. This allows you to set the + queue run interval low for better + resposiveness without trying all + jobs in each run. +confDEF_CHAR_SET DefaultCharSet [unknown-8bit] When converting + unlabelled 8 bit input to MIME, the + character set to use by default. +confSERVICE_SWITCH_FILE ServiceSwitchFile + [/etc/service.switch] The file to use + for the service switch on systems that + do not have a system-defined switch. +confHOSTS_FILE HostsFile [/etc/hosts] The file to use when doing + "file" type access of hosts names. +confDIAL_DELAY DialDelay [0s] If a connection fails, wait this + long and try again. Zero means "don't + retry". This is to allow "dial on + demand" connections to have enough time + to complete a connection. +confNO_RCPT_ACTION NoRecipientAction + [none] What to do if there are no legal + recipient fields (To:, Cc: or Bcc:) + in the message. Legal values can + be "none" to just leave the + nonconforming message as is, "add-to" + to add a To: header with all the + known recipients (which may expose + blind recipients), "add-apparently-to" + to do the same but use Apparently-To: + instead of To:, "add-bcc" to add an + empty Bcc: header, or + "add-to-undisclosed" to add the header + ``To: undisclosed-recipients:;''. +confSAFE_FILE_ENV SafeFileEnvironment + [undefined] If set, sendmail will do a + chroot() into this directory before + writing files. +confCOLON_OK_IN_ADDR ColonOkInAddr [True unless Configuration Level > 6] + If set, colons are treated as a regular + character in addresses. If not set, + they are treated as the introducer to + the RFC 822 "group" syntax. Colons are + handled properly in route-addrs. This + option defaults on for V5 and lower + configuration files. +confMAX_QUEUE_RUN_SIZE MaxQueueRunSize [0] If set, limit the maximum size of + any given queue run to this number of + entries. Essentially, this will stop + reading the queue directory after this + number of entries are reached; it does + _not_ pick the highest priority jobs, + so this should be as large as your + system can tolerate. If not set, there + is no limit. +confDONT_EXPAND_CNAMES DontExpandCnames + [False] If set, $[ ... $] lookups that + do DNS based lookups do not expand + CNAME records. This currently violates + the published standards, but the IETF + seems to be moving toward legalizing + this. For example, if "FTP.Foo.ORG" + is a CNAME for "Cruft.Foo.ORG", then + with this option set a lookup of + "FTP" will return "FTP.Foo.ORG"; if + clear it returns "Cruft.FOO.ORG". N.B. + you may not see any effect until your + downstream neighbors stop doing CNAME + lookups as well. +confFROM_LINE UnixFromLine [From $g $d] The From_ line used + when sending to files or programs. +confOPERATORS OperatorChars [.:%@!^/[]+] Address operator + characters. +confSMTP_LOGIN_MSG SmtpGreetingMessage + [$j Sendmail $v/$Z; $b] + The initial (spontaneous) SMTP + greeting message. The word "ESMTP" + will be inserted between the first and + second words to convince other + sendmails to try to speak ESMTP. +confDONT_INIT_GROUPS DontInitGroups [False] If set, the initgroups(3) + routine will never be invoked. You + might want to do this if you are + running NIS and you have a large group + map, since this call does a sequential + scan of the map; in a large site this + can cause your ypserv to run + essentially full time. If you set + this, agents run on behalf of users + will only have their primary + (/etc/passwd) group permissions. + +See also the description of OSTYPE for some parameters that can be +tweaked (generally pathnames to mailers). +-----------+ @@ -1092,12 +1613,8 @@ ostype Definitions describing a particular operating domain Definitions describing a particular domain, referenced using the DOMAIN macro in the .mc file. These are - site dependent; for example, we contribute "cs.exposed.m4" - and "cs.hidden.m4" which both describe hosts in the - CS.Berkeley.EDU subdomain; the former displays the local - hostname (e.g., mammoth.CS.Berkeley.EDU), whereas the - latter does its best to hide the identity of the local - workstation inside the CS subdomain. + site dependent; for example, "CS.Berkeley.EDU.m4" + describes hosts in the CS.Berkeley.EDU subdomain. mailer Descriptions of mailers. These are referenced using the MAILER macro in the .mc file. @@ -1147,6 +1664,7 @@ RULESETS (* means built in to sendmail) 96 Bottom half of Ruleset 3 (ruleset 6 in old sendmail) 97 Hook for recursive ruleset 0 call (ruleset 7 in old sendmail) 98 Local part of ruleset 0 (ruleset 8 in old sendmail) + 99 Guaranteed null (for debugging) MAILERS @@ -1156,22 +1674,23 @@ MAILERS 2 uucp-* UNIX-to-UNIX Copy Program 3 netnews Network News delivery 4 fax Sam Leffler's FlexFAX software + 5 mail11 DECnet mailer MACROS A B Bitnet Relay - C + C DECnet Relay D The local domain -- usually not needed - E + E reserved for X.400 Relay F FAX Relay G H mail Hub (for mail clusters) I J K - L + L Luser Relay M Masquerade (who I claim to be) N O @@ -1202,10 +1721,10 @@ CLASSES J K L addresses that should not be forwarded to $R - M + M domains that should be mapped to $M N O operators that indicate network operations (cannot be in local names) - P top level pseudo-domains: BITNET, FAX, UUCP, etc. + P top level pseudo-domains: BITNET, DECNET, FAX, UUCP, etc. Q R S diff --git a/usr.sbin/sendmail/cf/cf/Makefile b/usr.sbin/sendmail/cf/cf/Makefile index 3d0ab693f2d41..06cb3a91a5380 100644 --- a/usr.sbin/sendmail/cf/cf/Makefile +++ b/usr.sbin/sendmail/cf/cf/Makefile @@ -1,7 +1,18 @@ -# @(#)Makefile 8.5 (Berkeley) 12/1/93 +# @(#)Makefile 8.17 (Berkeley) 9/12/95 + +# +# This Makefile uses the new Berkeley "make" program. See Makefile.dist +# for a more vanilla version. +# +# Configuration files are created using "m4 file.mc > file.cf"; +# this may be easier than tweaking the Makefile. You do need to +# have a fairly modern M4 available (GNU m4 works). On SunOS, use +# /usr/5bin/m4. +# M4= m4 #M4= /usr/src/usr.bin/m4/obj/m4 +CFDIR= .. CHMOD= chmod ROMODE= 444 RM= rm -f @@ -10,73 +21,93 @@ RM= rm -f .mc.cf: $(RM) $@ - (cd ${.CURDIR} && $(M4) ${@:R}.mc ) > $@ + (cd ${.CURDIR} && $(M4) ${CFDIR}/m4/cf.m4 ${@:R}.mc) > $@ $(CHMOD) $(ROMODE) $@ -CLEANFILES= 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 \ - osf1-cs-exposed.cf osf1-cs-hidden.cf \ - mail.cs.cf mail.eecs.cf ucbvax.cf vangogh.cf \ - chez.cf knecht.cf cogsci.cf alpha.cf s2k.cf auspex.cf \ - python.cf \ - clientproto.cf tcpproto.cf uucpproto.cf +ALL= freebsd.cf freefall.cf +CLEANFILES+=$(ALL) + +#We dont build the generic stuff... +#Use `make generic-bsd4.4.cf' if you want one.. +#ALL= generic-bsd4.4.cf generic-hpux9.cf generic-hpux10.cf \ +# generic-osf1.cf generic-solaris2.cf \ +# generic-sunos4.1.cf generic-ultrix4.cf \ +# cs-hpux9.cf cs-osf1.cf cs-solaris2.cf \ +# cs-sunos4.1.cf cs-ultrix4.cf \ +# s2k-osf1.cf s2k-ultrix4.cf \ +# chez.cs.cf huginn.cs.cf mail.cs.cf mail.eecs.cf mailspool.cs.cf \ +# python.cs.cf ucbarpa.cf ucbvax.cf vangogh.cs.cf -all: $(CLEANFILES) +all: $(ALL) depend install: # this is overkill, but.... M4FILES=\ - ../domain/Berkeley.m4 \ - ../domain/cs.exposed.m4 \ - ../domain/cs.hidden.m4 \ - ../domain/eecs.hidden.m4 \ - ../domain/s2k.m4 \ - ../feature/allmasquerade.m4 \ - ../feature/always_add_domain.m4 \ - ../feature/bitdomain.m4 \ - ../feature/domaintable.m4 \ - ../feature/mailertable.m4 \ - ../feature/nocanonify.m4 \ - ../feature/nodns.m4 \ - ../feature/notsticky.m4 \ - ../feature/nouucp.m4 \ - ../feature/nullclient.m4 \ - ../feature/redirect.m4 \ - ../feature/use_cw_file.m4 \ - ../feature/uucpdomain.m4 \ - ../hack/cssubdomain.m4 \ - ../m4/cf.m4 \ - ../m4/nullrelay.m4 \ - ../m4/proto.m4 \ - ../m4/version.m4 \ - ../mailer/fax.m4 \ - ../mailer/local.m4 \ - ../mailer/smtp.m4 \ - ../mailer/usenet.m4 \ - ../mailer/uucp.m4 \ - ../ostype/aix3.m4 \ - ../ostype/bsd4.3.m4 \ - ../ostype/bsd4.4.m4 \ - ../ostype/hpux.m4 \ - ../ostype/irix.m4 \ - ../ostype/linux.m4 \ - ../ostype/nextstep.m4 \ - ../ostype/osf1.m4 \ - ../ostype/riscos4.5.m4 \ - ../ostype/solaris2.m4 \ - ../ostype/sunos3.5.m4 \ - ../ostype/sunos4.1.m4 \ - ../ostype/svr4.m4 \ - ../ostype/ultrix4.1.m4 \ - ../siteconfig/uucp.cogsci.m4 \ - ../siteconfig/uucp.old.arpa.m4 \ - ../siteconfig/uucp.ucbarpa.m4 \ - ../siteconfig/uucp.ucbvax.m4 \ + ${CFDIR}/domain/generic.m4 \ + ${CFDIR}/domain/Berkeley.EDU.m4 \ + ${CFDIR}/domain/CS.Berkeley.EDU.m4 \ + ${CFDIR}/domain/EECS.Berkeley.EDU.m4 \ + ${CFDIR}/domain/S2K.Berkeley.EDU.m4 \ + ${CFDIR}/feature/allmasquerade.m4 \ + ${CFDIR}/feature/always_add_domain.m4 \ + ${CFDIR}/feature/bestmx_is_local.m4 \ + ${CFDIR}/feature/bitdomain.m4 \ + ${CFDIR}/feature/domaintable.m4 \ + ${CFDIR}/feature/local_procmail.m4 \ + ${CFDIR}/feature/mailertable.m4 \ + ${CFDIR}/feature/nocanonify.m4 \ + ${CFDIR}/feature/nodns.m4 \ + ${CFDIR}/feature/notsticky.m4 \ + ${CFDIR}/feature/nouucp.m4 \ + ${CFDIR}/feature/nullclient.m4 \ + ${CFDIR}/feature/redirect.m4 \ + ${CFDIR}/feature/smrsh.m4 \ + ${CFDIR}/feature/stickyhost.m4 \ + ${CFDIR}/feature/use_cw_file.m4 \ + ${CFDIR}/feature/uucpdomain.m4 \ + ${CFDIR}/hack/cssubdomain.m4 \ + ${CFDIR}/m4/cf.m4 \ + ${CFDIR}/m4/cfhead.m4 \ + ${CFDIR}/m4/nullrelay.m4 \ + ${CFDIR}/m4/proto.m4 \ + ${CFDIR}/m4/version.m4 \ + ${CFDIR}/mailer/cyrus.m4 \ + ${CFDIR}/mailer/fax.m4 \ + ${CFDIR}/mailer/local.m4 \ + ${CFDIR}/mailer/mail11.m4 \ + ${CFDIR}/mailer/pop.m4 \ + ${CFDIR}/mailer/procmail.m4 \ + ${CFDIR}/mailer/smtp.m4 \ + ${CFDIR}/mailer/usenet.m4 \ + ${CFDIR}/mailer/uucp.m4 \ + ${CFDIR}/ostype/aix3.m4 \ + ${CFDIR}/ostype/amdahl-uts.m4 \ + ${CFDIR}/ostype/aux.m4 \ + ${CFDIR}/ostype/bsd4.3.m4 \ + ${CFDIR}/ostype/bsd4.4.m4 \ + ${CFDIR}/ostype/bsdi1.0.m4 \ + ${CFDIR}/ostype/dgux.m4 \ + ${CFDIR}/ostype/domainos.m4 \ + ${CFDIR}/ostype/dynix3.2.m4 \ + ${CFDIR}/ostype/hpux9.m4 \ + ${CFDIR}/ostype/irix4.m4 \ + ${CFDIR}/ostype/irix5.m4 \ + ${CFDIR}/ostype/linux.m4 \ + ${CFDIR}/ostype/nextstep.m4 \ + ${CFDIR}/ostype/osf1.m4 \ + ${CFDIR}/ostype/ptx2.m4 \ + ${CFDIR}/ostype/riscos4.5.m4 \ + ${CFDIR}/ostype/sco3.2.m4 \ + ${CFDIR}/ostype/solaris2.m4 \ + ${CFDIR}/ostype/sunos3.5.m4 \ + ${CFDIR}/ostype/sunos4.1.m4 \ + ${CFDIR}/ostype/svr4.m4 \ + ${CFDIR}/ostype/ultrix4.m4 \ + ${CFDIR}/siteconfig/uucp.cogsci.m4 \ + ${CFDIR}/siteconfig/uucp.old.arpa.m4 \ + ${CFDIR}/siteconfig/uucp.ucbarpa.m4 \ + ${CFDIR}/siteconfig/uucp.ucbvax.m4 \ $(ALL): $(M4FILES) diff --git a/usr.sbin/sendmail/cf/cf/Makefile.dist b/usr.sbin/sendmail/cf/cf/Makefile.dist deleted file mode 100644 index 07b62f2440879..0000000000000 --- a/usr.sbin/sendmail/cf/cf/Makefile.dist +++ /dev/null @@ -1,85 +0,0 @@ -# -# Makefile for configuration files. -# -# @(#)Makefile.dist 8.1 (Berkeley) 8/25/93 - -M4= m4 -#M4= /usr/src/usr.bin/m4/obj/m4 -CHMOD= chmod -ROMODE= 444 -RM= rm -f - -.SUFFIXES: .mc .cf - -.mc.cf: - $(RM) $@ - $(M4) $*.mc > $@ - $(CHMOD) $(ROMODE) $@ - -ALL= cs-hidden.cf cs-exposed.cf \ - hpux-cs-exposed.cf hpux-cs-hidden.cf \ - sunos3.5-cs-exposed.cf sunos3.5-cs-hidden.cf \ - sunos4.1-cs-exposed.cf sunos4.1-cs-hidden.cf \ - ultrix4.1-cs-exposed.cf ultrix4.1-cs-hidden.cf \ - mail.cs.cf mail.eecs.cf ucbvax.cf vangogh.cf \ - chez.cf knecht.cf cogsci.cf alpha.cf s2k.cf auspex.cf \ - python.cf \ - clientproto.cf tcpproto.cf uucpproto.cf - -all: $(ALL) - -clean cleandir: - $(RM) $(ALL) core - -depend install: - -# this is overkill, but.... -M4FILES=\ - ../domain/Berkeley.m4 \ - ../domain/cs.exposed.m4 \ - ../domain/cs.hidden.m4 \ - ../domain/eecs.hidden.m4 \ - ../domain/s2k.m4 \ - ../feature/allmasquerade.m4 \ - ../feature/always_add_domain.m4 \ - ../feature/bitdomain.m4 \ - ../feature/domaintable.m4 \ - ../feature/mailertable.m4 \ - ../feature/nocanonify.m4 \ - ../feature/nodns.m4 \ - ../feature/notsticky.m4 \ - ../feature/nouucp.m4 \ - ../feature/nullclient.m4 \ - ../feature/redirect.m4 \ - ../feature/use_cw_file.m4 \ - ../feature/uucpdomain.m4 \ - ../hack/cssubdomain.m4 \ - ../m4/cf.m4 \ - ../m4/nullrelay.m4 \ - ../m4/proto.m4 \ - ../m4/version.m4 \ - ../mailer/fax.m4 \ - ../mailer/local.m4 \ - ../mailer/smtp.m4 \ - ../mailer/usenet.m4 \ - ../mailer/uucp.m4 \ - ../ostype/aix3.m4 \ - ../ostype/bsd4.3.m4 \ - ../ostype/bsd4.4.m4 \ - ../ostype/hpux.m4 \ - ../ostype/irix.m4 \ - ../ostype/linux.m4 \ - ../ostype/nextstep.m4 \ - ../ostype/osf1.m4 \ - ../ostype/riscos4.5.m4 \ - ../ostype/solaris2.m4 \ - ../ostype/sunos3.5.m4 \ - ../ostype/sunos4.1.m4 \ - ../ostype/svr4.m4 \ - ../ostype/ultrix4.1.m4 \ - ../siteconfig/uucp.cogsci.m4 \ - ../siteconfig/uucp.old.arpa.m4 \ - ../siteconfig/uucp.ucbarpa.m4 \ - ../siteconfig/uucp.ucbvax.m4 \ - -$(ALL): $(M4FILES) diff --git a/usr.sbin/sendmail/cf/cf/alpha.mc b/usr.sbin/sendmail/cf/cf/alpha.mc deleted file mode 100644 index 026fed11ff2e9..0000000000000 --- a/usr.sbin/sendmail/cf/cf/alpha.mc +++ /dev/null @@ -1,41 +0,0 @@ -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. -# - -include(`../m4/cf.m4') -VERSIONID(`@(#)alpha.mc 8.1 (Berkeley) 6/7/93') -OSTYPE(osf1)dnl -DOMAIN(s2k)dnl -MAILER(local)dnl -MAILER(smtp)dnl diff --git a/usr.sbin/sendmail/cf/cf/auspex.mc b/usr.sbin/sendmail/cf/cf/auspex.mc deleted file mode 100644 index 961c139e2c0e3..0000000000000 --- a/usr.sbin/sendmail/cf/cf/auspex.mc +++ /dev/null @@ -1,42 +0,0 @@ -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. -# - -include(`../m4/cf.m4') -VERSIONID(`@(#)auspex.mc 8.1 (Berkeley) 6/7/93') -OSTYPE(sunos4.1)dnl -DOMAIN(cs.hidden)dnl -FEATURE(use_cw_file)dnl -MAILER(local)dnl -MAILER(smtp)dnl diff --git a/usr.sbin/sendmail/cf/cf/chez.mc b/usr.sbin/sendmail/cf/cf/chez.mc deleted file mode 100644 index 13f951977f00c..0000000000000 --- a/usr.sbin/sendmail/cf/cf/chez.mc +++ /dev/null @@ -1,44 +0,0 @@ -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. -# - -include(`../m4/cf.m4') -VERSIONID(`@(#)chez.mc 8.1 (Berkeley) 6/7/93') -OSTYPE(bsd4.4)dnl -DOMAIN(cs.exposed)dnl -define(`LOCAL_RELAY', vangogh.CS.Berkeley.EDU)dnl -define(`MASQUERADE_NAME', vangogh.CS.Berkeley.EDU)dnl -MAILER(local)dnl -MAILER(smtp)dnl -Fw/etc/sendmail.cw diff --git a/usr.sbin/sendmail/cf/cf/clientproto.mc b/usr.sbin/sendmail/cf/cf/clientproto.mc index 902c1eb752efb..a59ac037e1929 100644 --- a/usr.sbin/sendmail/cf/cf/clientproto.mc +++ b/usr.sbin/sendmail/cf/cf/clientproto.mc @@ -35,15 +35,20 @@ divert(-1) # # This the prototype for a "null client" -- that is, a client that -# does nothing except forward all mail to a mail hub. +# does nothing except forward all mail to a mail hub. IT IS NOT +# USABLE AS IS!!! # # To use this, you MUST use the nullclient feature with the name of -# the mail hub as its argument. You MAY also define an OSTYPE to +# the mail hub as its argument. You MUST also define an `OSTYPE' to # define the location of the queue directories and the like. +# In addition, you MAY select the nocanonify feature. This causes +# addresses to be sent unqualified via the SMTP connection; normally +# they are qualifed with the masquerade name, which defaults to the +# name of the hub machine. # Other than these, it should never contain any other lines. # -include(`../m4/cf.m4') -VERSIONID(`@(#)clientproto.mc 8.2 (Berkeley) 8/21/93') +VERSIONID(`@(#)clientproto.mc 8.6 (Berkeley) 8/16/95') +OSTYPE(unknown) FEATURE(nullclient, mailhost.$m) diff --git a/usr.sbin/sendmail/cf/cf/cogsci.mc b/usr.sbin/sendmail/cf/cf/cogsci.mc deleted file mode 100644 index 4faa46d822e5f..0000000000000 --- a/usr.sbin/sendmail/cf/cf/cogsci.mc +++ /dev/null @@ -1,41 +0,0 @@ -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. -# - -include(`../m4/cf.m4') -VERSIONID(`@(#)cogsci.mc 8.1 (Berkeley) 6/7/93') -DOMAIN(cs.exposed)dnl -MAILER(smtp)dnl -MAILER(uucp)dnl -SITECONFIG(uucp.cogsci, Ucogsci, U) diff --git a/usr.sbin/sendmail/cf/cf/cs-exposed.mc b/usr.sbin/sendmail/cf/cf/cs-exposed.mc deleted file mode 100644 index 62072b7e14aca..0000000000000 --- a/usr.sbin/sendmail/cf/cf/cs-exposed.mc +++ /dev/null @@ -1,40 +0,0 @@ -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. -# - -include(`../m4/cf.m4') -VERSIONID(`@(#)cs-exposed.mc 8.1 (Berkeley) 6/7/93') -DOMAIN(cs.exposed)dnl -MAILER(local)dnl -MAILER(smtp)dnl diff --git a/usr.sbin/sendmail/cf/cf/cs-hidden.mc b/usr.sbin/sendmail/cf/cf/cs-hidden.mc deleted file mode 100644 index 216062ce9e41a..0000000000000 --- a/usr.sbin/sendmail/cf/cf/cs-hidden.mc +++ /dev/null @@ -1,40 +0,0 @@ -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. -# - -include(`../m4/cf.m4') -VERSIONID(`@(#)cs-hidden.mc 8.1 (Berkeley) 6/7/93') -DOMAIN(cs.hidden)dnl -MAILER(local)dnl -MAILER(smtp)dnl diff --git a/usr.sbin/sendmail/cf/cf/freefall.mc b/usr.sbin/sendmail/cf/cf/freefall.mc index a27e9f86c4db2..f6bc65ef1a937 100644 --- a/usr.sbin/sendmail/cf/cf/freefall.mc +++ b/usr.sbin/sendmail/cf/cf/freefall.mc @@ -1,8 +1,8 @@ divert(-1) # # Copyright (c) 1983 Eric P. Allman -# Copyright (c) 1988 The Regents of the University of California. -# All rights reserved. +# 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 @@ -33,15 +33,30 @@ divert(-1) # SUCH DAMAGE. # -include(`../m4/cf.m4') -VERSIONID(`@(#)freefall.mc $Revision: 1.1 $') +VERSIONID(`@(#)freefall.mc $Revision: 1.7 $') OSTYPE(bsd4.4)dnl +DOMAIN(generic)dnl MAILER(local)dnl MAILER(smtp)dnl +FEATURE(mailertable, `hash -o /etc/mailertable')dnl define(`UUCP_RELAY', ucbvax.Berkeley.EDU)dnl define(`BITNET_RELAY', mailhost.Berkeley.EDU)dnl define(`CSNET_RELAY', mailhost.Berkeley.EDU)dnl -define(`confCHECKPOINT_INTERVAL', 4)dnl -define(`confAUTO_REBUILD', True)dnl - - +define(`confCHECKPOINT_INTERVAL', `4')dnl +define(`confAUTO_REBUILD', `True')dnl +define(`confMIN_FREE_BLOCKS', `1024')dnl +define(`confSMTP_MAILER', `smtp8')dnl +define(`confME_TOO', `True')dnl +define(`confMCI_CACHE_TIMEOUT', `10m')dnl +define(`confTO_QUEUEWARN', `1d')dnl +define(`confTO_QUEUEWARN_NORMAL', `1d')dnl +define(`confTO_RCPT', `10m')dnl +define(`confTO_DATABLOCK', `10m')dnl +define(`confTO_DATAFINAL', `10m')dnl +define(`confTO_COMMAND', `10m')dnl +define(`confMIN_QUEUE_AGE', `30m')dnl +define(`confNO_RCPT_ACTION', `add-to-undisclosed')dnl +define(`confTRUSTED_USERS', `majordom') +define(`confRECEIVED_HEADER', `$?sfrom $s $.$?_($?s$|from $.$_)$. + by $j ($v/$Z)$?r with $r$. id $i + $?ufor $u; $.$b') diff --git a/usr.sbin/sendmail/cf/cf/hpux-cs-exposed.mc b/usr.sbin/sendmail/cf/cf/hpux-cs-exposed.mc deleted file mode 100644 index 4f61ffda450ff..0000000000000 --- a/usr.sbin/sendmail/cf/cf/hpux-cs-exposed.mc +++ /dev/null @@ -1,41 +0,0 @@ -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. -# - -include(`../m4/cf.m4') -VERSIONID(`@(#)hpux-cs-exposed.mc 8.1 (Berkeley) 6/7/93') -OSTYPE(hpux)dnl -DOMAIN(cs.exposed)dnl -MAILER(local)dnl -MAILER(smtp)dnl diff --git a/usr.sbin/sendmail/cf/cf/hpux-cs-hidden.mc b/usr.sbin/sendmail/cf/cf/hpux-cs-hidden.mc deleted file mode 100644 index 33cf580d3977e..0000000000000 --- a/usr.sbin/sendmail/cf/cf/hpux-cs-hidden.mc +++ /dev/null @@ -1,41 +0,0 @@ -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. -# - -include(`../m4/cf.m4') -VERSIONID(`@(#)hpux-cs-hidden.mc 8.1 (Berkeley) 6/7/93') -OSTYPE(hpux)dnl -DOMAIN(cs.hidden)dnl -MAILER(local)dnl -MAILER(smtp)dnl diff --git a/usr.sbin/sendmail/cf/cf/knecht.mc b/usr.sbin/sendmail/cf/cf/knecht.mc deleted file mode 100644 index 0cd17fab688f7..0000000000000 --- a/usr.sbin/sendmail/cf/cf/knecht.mc +++ /dev/null @@ -1,44 +0,0 @@ -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. -# - -include(`../m4/cf.m4') -VERSIONID(`@(#)knecht.mc 8.1 (Berkeley) 6/7/93') -OSTYPE(ultrix4.1)dnl -DOMAIN(cs.exposed)dnl -define(`LOCAL_RELAY', CS.Berkeley.EDU)dnl -MAILER(smtp)dnl - -# our local domain -DDCS.Berkeley.EDU diff --git a/usr.sbin/sendmail/cf/cf/mail.cs.mc b/usr.sbin/sendmail/cf/cf/mail.cs.mc index 227e2fe52ecf1..50daad7e68c0a 100644 --- a/usr.sbin/sendmail/cf/cf/mail.cs.mc +++ b/usr.sbin/sendmail/cf/cf/mail.cs.mc @@ -33,15 +33,24 @@ divert(-1) # SUCH DAMAGE. # -include(`../m4/cf.m4') -VERSIONID(`@(#)mail.cs.mc 8.3 (Berkeley) 10/15/93') -OSTYPE(ultrix4.1)dnl -DOMAIN(Berkeley)dnl +# +# This is a Berkeley-specific configuration file for a specific +# machine in the Computer Science Division at Berkeley, and should +# not be used elsewhere. It is provided on the sendmail distribution +# as a sample only. +# +# This file is for the primary CS Division mail server. +# + +VERSIONID(`@(#)mail.cs.mc 8.9 (Berkeley) 8/25/95') +OSTYPE(ultrix4)dnl +DOMAIN(Berkeley.EDU)dnl MASQUERADE_AS(CS.Berkeley.EDU)dnl -FEATURE(notsticky)dnl MAILER(local)dnl MAILER(smtp)dnl define(`confUSERDB_SPEC', ``/usr/local/lib/users.cs.db,/usr/local/lib/users.eecs.db'')dnl + +LOCAL_CONFIG DDBerkeley.EDU # hosts for which we accept and forward mail (must be in .Berkeley.EDU) diff --git a/usr.sbin/sendmail/cf/cf/mail.eecs.mc b/usr.sbin/sendmail/cf/cf/mail.eecs.mc index 3b6200c3a8411..f6d2bdcde106a 100644 --- a/usr.sbin/sendmail/cf/cf/mail.eecs.mc +++ b/usr.sbin/sendmail/cf/cf/mail.eecs.mc @@ -33,14 +33,24 @@ divert(-1) # SUCH DAMAGE. # -include(`../m4/cf.m4') -VERSIONID(`@(#)mail.eecs.mc 8.1 (Berkeley) 6/7/93') -OSTYPE(ultrix4.1)dnl -DOMAIN(eecs.hidden)dnl -FEATURE(notsticky)dnl +# +# This is a Berkeley-specific configuration file for a specific +# machine in Electrical Engineering and Computer Sciences at Berkeley, +# and should not be used elsewhere. It is provided on the sendmail +# distribution as a sample only. +# +# This file is for the primary EECS mail server. +# + +VERSIONID(`@(#)mail.eecs.mc 8.9 (Berkeley) 8/25/95') +OSTYPE(ultrix4)dnl +DOMAIN(EECS.Berkeley.EDU)dnl +MASQUERADE_AS(EECS.Berkeley.EDU)dnl MAILER(local)dnl MAILER(smtp)dnl -define(`confUSERDB_SPEC', `/usr/local/lib/users.cs.db,/usr/local/lib/users.eecs.db')dnl +define(`confUSERDB_SPEC', `/usr/local/lib/users.eecs.db,/usr/local/lib/users.cs.db,/usr/local/lib/users.coe.db')dnl + +LOCAL_CONFIG DDBerkeley.EDU # hosts for which we accept and forward mail (must be in .Berkeley.EDU) diff --git a/usr.sbin/sendmail/cf/cf/osf1-cs-exposed.mc b/usr.sbin/sendmail/cf/cf/osf1-cs-exposed.mc deleted file mode 100644 index eaed6cc4e5295..0000000000000 --- a/usr.sbin/sendmail/cf/cf/osf1-cs-exposed.mc +++ /dev/null @@ -1,41 +0,0 @@ -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. -# - -include(`../m4/cf.m4') -VERSIONID(`@(#)osf1-cs-exposed.mc 8.1 (Berkeley) 10/15/93') -OSTYPE(osf1)dnl -DOMAIN(cs.exposed)dnl -MAILER(local)dnl -MAILER(smtp)dnl diff --git a/usr.sbin/sendmail/cf/cf/osf1-cs-hidden.mc b/usr.sbin/sendmail/cf/cf/osf1-cs-hidden.mc deleted file mode 100644 index 2b85ba4be179f..0000000000000 --- a/usr.sbin/sendmail/cf/cf/osf1-cs-hidden.mc +++ /dev/null @@ -1,41 +0,0 @@ -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. -# - -include(`../m4/cf.m4') -VERSIONID(`@(#)osf1-cs-hidden.mc 8.1 (Berkeley) 10/15/93') -OSTYPE(osf1)dnl -DOMAIN(cs.hidden)dnl -MAILER(local)dnl -MAILER(smtp)dnl diff --git a/usr.sbin/sendmail/cf/cf/python.mc b/usr.sbin/sendmail/cf/cf/python.mc deleted file mode 100644 index ac23e613138c8..0000000000000 --- a/usr.sbin/sendmail/cf/cf/python.mc +++ /dev/null @@ -1,52 +0,0 @@ -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. -# - -include(`../m4/cf.m4') -VERSIONID(`@(#)python.mc 8.1 (Berkeley) 6/7/93') -OSTYPE(bsd4.4)dnl -DOMAIN(cs.exposed)dnl -define(`LOCAL_RELAY', vangogh.CS.Berkeley.EDU)dnl -define(`MASQUERADE_NAME', vangogh.CS.Berkeley.EDU)dnl -MAILER(local)dnl -MAILER(smtp)dnl - -# accept mail sent to the domain head -DDBostic.COM - -LOCAL_RULE_0 -# accept mail sent to the domain head -R< @ $D . > : $* $@ $>7 $1 @here:... -> ... -R$* $=O $* < @ $D . > $@ $>7 $1 $2 $3 ...@here -> ... -R$* < @ $D . > $#local $: $1 user@here -> user diff --git a/usr.sbin/sendmail/cf/cf/riscos-cs-exposed.mc b/usr.sbin/sendmail/cf/cf/riscos-cs-exposed.mc deleted file mode 100644 index a92b7709c2fbd..0000000000000 --- a/usr.sbin/sendmail/cf/cf/riscos-cs-exposed.mc +++ /dev/null @@ -1,41 +0,0 @@ -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. -# - -include(`../m4/cf.m4') -VERSIONID(`@(#)riscos-cs-exposed.mc 8.1 (Berkeley) 12/1/93') -OSTYPE(riscos4.5)dnl -DOMAIN(cs.exposed)dnl -MAILER(local)dnl -MAILER(smtp)dnl diff --git a/usr.sbin/sendmail/cf/cf/s2k.mc b/usr.sbin/sendmail/cf/cf/s2k.mc deleted file mode 100644 index e65fc9f54f198..0000000000000 --- a/usr.sbin/sendmail/cf/cf/s2k.mc +++ /dev/null @@ -1,42 +0,0 @@ -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. -# - -include(`../m4/cf.m4') -VERSIONID(`@(#)s2k.mc 8.1 (Berkeley) 6/7/93') -OLDSENDMAIL -OSTYPE(ultrix4.1)dnl -DOMAIN(s2k)dnl -MAILER(local)dnl -MAILER(smtp)dnl diff --git a/usr.sbin/sendmail/cf/cf/sample.mc b/usr.sbin/sendmail/cf/cf/sample.mc deleted file mode 100644 index 760409db59833..0000000000000 --- a/usr.sbin/sendmail/cf/cf/sample.mc +++ /dev/null @@ -1,40 +0,0 @@ -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. -# - -include(`../m4/cf.m4') -VERSIONID(`@(#)sample.mc 8.1 (Berkeley) 6/7/93') -OSTYPE(bsd4.4) -DOMAIN(cs.hidden) -MAILER(smtp) diff --git a/usr.sbin/sendmail/cf/cf/sleepy.mc b/usr.sbin/sendmail/cf/cf/sleepy.mc deleted file mode 100644 index ff6a7cd9c372f..0000000000000 --- a/usr.sbin/sendmail/cf/cf/sleepy.mc +++ /dev/null @@ -1,43 +0,0 @@ -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. -# - -include(`../m4/cf.m4') -VERSIONID(@(#)sleepy.mc 8.1 (Berkeley) 6/7/93) -OSTYPE(hpux)dnl -DOMAIN(cs.exposed)dnl -define(`LOCAL_RELAY', diva.Berkeley.EDU)dnl -define(`MASQUERADE_NAME', diva.Berkeley.EDU)dnl -MAILER(local)dnl -MAILER(smtp)dnl diff --git a/usr.sbin/sendmail/cf/cf/sunos3.5-cs-exposed.mc b/usr.sbin/sendmail/cf/cf/sunos3.5-cs-exposed.mc deleted file mode 100644 index 46d04d96e2a06..0000000000000 --- a/usr.sbin/sendmail/cf/cf/sunos3.5-cs-exposed.mc +++ /dev/null @@ -1,41 +0,0 @@ -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. -# - -include(`../m4/cf.m4') -VERSIONID(`@(#)sunos3.5-cs-exposed.mc 8.1 (Berkeley) 6/7/93') -OSTYPE(sunos3.5)dnl -DOMAIN(cs.exposed)dnl -MAILER(local)dnl -MAILER(smtp)dnl diff --git a/usr.sbin/sendmail/cf/cf/sunos3.5-cs-hidden.mc b/usr.sbin/sendmail/cf/cf/sunos3.5-cs-hidden.mc deleted file mode 100644 index a3d6f20efb18c..0000000000000 --- a/usr.sbin/sendmail/cf/cf/sunos3.5-cs-hidden.mc +++ /dev/null @@ -1,41 +0,0 @@ -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. -# - -include(`../m4/cf.m4') -VERSIONID(`@(#)sunos3.5-cs-hidden.mc 8.1 (Berkeley) 6/7/93') -OSTYPE(sunos3.5)dnl -DOMAIN(cs.hidden)dnl -MAILER(local)dnl -MAILER(smtp)dnl diff --git a/usr.sbin/sendmail/cf/cf/sunos4.1-cs-exposed.mc b/usr.sbin/sendmail/cf/cf/sunos4.1-cs-exposed.mc deleted file mode 100644 index 7c94ba5ab7780..0000000000000 --- a/usr.sbin/sendmail/cf/cf/sunos4.1-cs-exposed.mc +++ /dev/null @@ -1,41 +0,0 @@ -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. -# - -include(`../m4/cf.m4') -VERSIONID(`@(#)sunos4.1-cs-exposed.mc 8.1 (Berkeley) 6/7/93') -OSTYPE(sunos4.1)dnl -DOMAIN(cs.exposed)dnl -MAILER(local)dnl -MAILER(smtp)dnl diff --git a/usr.sbin/sendmail/cf/cf/sunos4.1-cs-hidden.mc b/usr.sbin/sendmail/cf/cf/sunos4.1-cs-hidden.mc deleted file mode 100644 index 8e1dbb96844d0..0000000000000 --- a/usr.sbin/sendmail/cf/cf/sunos4.1-cs-hidden.mc +++ /dev/null @@ -1,41 +0,0 @@ -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. -# - -include(`../m4/cf.m4') -VERSIONID(`@(#)sunos4.1-cs-hidden.mc 8.1 (Berkeley) 6/7/93') -OSTYPE(sunos4.1)dnl -DOMAIN(cs.hidden)dnl -MAILER(local)dnl -MAILER(smtp)dnl diff --git a/usr.sbin/sendmail/cf/cf/tcpproto.mc b/usr.sbin/sendmail/cf/cf/tcpproto.mc index aa31ca152dca5..7f43558ca97d8 100644 --- a/usr.sbin/sendmail/cf/cf/tcpproto.mc +++ b/usr.sbin/sendmail/cf/cf/tcpproto.mc @@ -37,14 +37,17 @@ divert(-1) # This is the prototype file for a configuration that supports nothing # but basic SMTP connections via TCP. # -# You may want to add an OSTYPE macro to get the location of various -# support files for your operating system environment. +# You MUST change the `OSTYPE' macro to specify the operating system +# on which this will run; this will set the location of various +# support files for your operating system environment. You MAY +# create a domain file in ../domain and reference it by adding a +# `DOMAIN' macro after the `OSTYPE' macro. I recommend that you +# first copy this to another file name so that new sendmail releases +# will not trash your changes. # -include(`../m4/cf.m4') -VERSIONID(`@(#)tcpproto.mc 8.2 (Berkeley) 8/21/93') - +VERSIONID(`@(#)tcpproto.mc 8.4 (Berkeley) 8/6/95') +OSTYPE(unknown) FEATURE(nouucp) - MAILER(local) MAILER(smtp) diff --git a/usr.sbin/sendmail/cf/cf/ucbarpa.mc b/usr.sbin/sendmail/cf/cf/ucbarpa.mc index 21f35fdaced0c..39d73908cad66 100644 --- a/usr.sbin/sendmail/cf/cf/ucbarpa.mc +++ b/usr.sbin/sendmail/cf/cf/ucbarpa.mc @@ -33,9 +33,16 @@ divert(-1) # SUCH DAMAGE. # -include(`../m4/cf.m4') -VERSIONID(`@(#)ucbarpa.mc 8.1 (Berkeley) 6/7/93') -DOMAIN(cs.exposed)dnl +# +# This machine has been decommissioned at Berkeley, and hence should +# not be considered to be tested. This file is provided as an example +# only, of how you might set up a joint SMTP/UUCP configuration. At +# this point I recommend using `FEATURE(mailertable)' instead of +# `SITECONFIG'. See also ucbvax.mc. +# + +VERSIONID(`@(#)ucbarpa.mc 8.3 (Berkeley) 8/6/95') +DOMAIN(CS.Berkeley.EDU)dnl OSTYPE(bsd4.4)dnl MAILER(local)dnl MAILER(smtp)dnl diff --git a/usr.sbin/sendmail/cf/cf/ucbvax.mc b/usr.sbin/sendmail/cf/cf/ucbvax.mc index bae55d577ec94..cc8cd2ce66dec 100644 --- a/usr.sbin/sendmail/cf/cf/ucbvax.mc +++ b/usr.sbin/sendmail/cf/cf/ucbvax.mc @@ -33,15 +33,25 @@ divert(-1) # SUCH DAMAGE. # -include(`../m4/cf.m4') -VERSIONID(`@(#)ucbvax.mc 8.1 (Berkeley) 6/7/93') +# +# This machine has been decommissioned at Berkeley, and hence should +# not be considered to be tested. This file is provided as an example +# only, of how you might set up a fairly complex configuration. +# Ucbvax was our main relay (both SMTP and UUCP) for many years. +# At this point I recommend using `FEATURE(mailertable)' instead of +# `SITECONFIG' for routing of UUCP within your domain. +# + +VERSIONID(`@(#)ucbvax.mc 8.5 (Berkeley) 8/25/95') OSTYPE(bsd4.3) -DOMAIN(cs.hidden) -FEATURE(notsticky) +DOMAIN(CS.Berkeley.EDU) +MASQUERADE_AS(CS.Berkeley.EDU) MAILER(local) MAILER(smtp) MAILER(uucp) undefine(`UUCP_RELAY')dnl + +LOCAL_CONFIG DDBerkeley.EDU # names for which we act as a local forwarding agent diff --git a/usr.sbin/sendmail/cf/cf/udb.mc b/usr.sbin/sendmail/cf/cf/udb.mc deleted file mode 100644 index 624d2d4071059..0000000000000 --- a/usr.sbin/sendmail/cf/cf/udb.mc +++ /dev/null @@ -1,41 +0,0 @@ -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. -# - -include(`../m4/cf.m4') -VERSIONID(`@(#)udb.mc 8.1 (Berkeley) 6/7/93') -OSTYPE(sunos4.1)dnl -DOMAIN(cs.hidden)dnl -MAILER(smtp)dnl -define(`USERDB_FILE', `/home/auspex/a/staff/gnn/UDB/UI')dnl diff --git a/usr.sbin/sendmail/cf/cf/ultrix4.1-cs-exposed.mc b/usr.sbin/sendmail/cf/cf/ultrix4.1-cs-exposed.mc deleted file mode 100644 index 093590fff190d..0000000000000 --- a/usr.sbin/sendmail/cf/cf/ultrix4.1-cs-exposed.mc +++ /dev/null @@ -1,41 +0,0 @@ -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. -# - -include(`../m4/cf.m4') -VERSIONID(`@(#)ultrix4.1-cs-exposed.mc 8.1 (Berkeley) 6/7/93') -OSTYPE(ultrix4.1)dnl -DOMAIN(cs.exposed)dnl -MAILER(local)dnl -MAILER(smtp)dnl diff --git a/usr.sbin/sendmail/cf/cf/ultrix4.1-cs-hidden.mc b/usr.sbin/sendmail/cf/cf/ultrix4.1-cs-hidden.mc deleted file mode 100644 index ea25375924cfa..0000000000000 --- a/usr.sbin/sendmail/cf/cf/ultrix4.1-cs-hidden.mc +++ /dev/null @@ -1,41 +0,0 @@ -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. -# - -include(`../m4/cf.m4') -VERSIONID(`@(#)ultrix4.1-cs-hidden.mc 8.1 (Berkeley) 6/7/93') -OSTYPE(ultrix4.1)dnl -DOMAIN(cs.hidden)dnl -MAILER(local)dnl -MAILER(smtp)dnl diff --git a/usr.sbin/sendmail/cf/cf/uucpproto.mc b/usr.sbin/sendmail/cf/cf/uucpproto.mc index c460d76b3cda6..49c4a0de65624 100644 --- a/usr.sbin/sendmail/cf/cf/uucpproto.mc +++ b/usr.sbin/sendmail/cf/cf/uucpproto.mc @@ -34,16 +34,20 @@ divert(-1) # # -# This is the prototype for a configuration that only supports UUCP. +# This is the prototype for a configuration that only supports UUCP +# and does not have DNS support at all. # -# You may want to add an OSTYPE macro to get the location of various -# support files for your operating system environment. +# You MUST change the `OSTYPE' macro to specify the operating system +# on which this will run; this will set the location of various +# support files for your operating system environment. You MAY +# create a domain file in ../domain and reference it by adding a +# `DOMAIN' macro after the `OSTYPE' macro. I recommend that you +# first copy this to another file name so that new sendmail releases +# will not trash your changes. # -include(`../m4/cf.m4') -VERSIONID(`@(#)uucpproto.mc 8.3 (Berkeley) 8/21/93') - +VERSIONID(`@(#)uucpproto.mc 8.5 (Berkeley) 8/6/95') +OSTYPE(unknown) FEATURE(nodns)dnl - MAILER(local)dnl MAILER(uucp)dnl diff --git a/usr.sbin/sendmail/cf/cf/vangogh.mc b/usr.sbin/sendmail/cf/cf/vangogh.mc deleted file mode 100644 index 2406364c5a82e..0000000000000 --- a/usr.sbin/sendmail/cf/cf/vangogh.mc +++ /dev/null @@ -1,44 +0,0 @@ -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. -# - -include(`../m4/cf.m4') -VERSIONID(`@(#)vangogh.mc 8.2 (Berkeley) 1/26/94') -DOMAIN(cs.exposed)dnl -OSTYPE(bsd4.4)dnl -MAILER(local)dnl -MAILER(smtp)dnl -define(`MCI_CACHE_SIZE', 5) -Cw okeeffe.CS.Berkeley.EDU -Cw python.CS.Berkeley.EDU diff --git a/usr.sbin/sendmail/cf/domain/Berkeley.m4 b/usr.sbin/sendmail/cf/domain/Berkeley.m4 deleted file mode 100644 index 4f572d6436aef..0000000000000 --- a/usr.sbin/sendmail/cf/domain/Berkeley.m4 +++ /dev/null @@ -1,42 +0,0 @@ -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(`@(#)Berkeley.m4 8.5 (Berkeley) 2/18/94') -define(`UUCP_RELAY', `ucbvax.Berkeley.EDU')dnl -define(`BITNET_RELAY', `CMSA.Berkeley.EDU')dnl -define(`confFORWARD_PATH', `$z/.forward.$w:$z/.forward')dnl -define(`confCW_FILE', `-o /etc/sendmail.cw')dnl -FEATURE(redirect)dnl -FEATURE(use_cw_file)dnl diff --git a/usr.sbin/sendmail/cf/domain/cs.exposed.m4 b/usr.sbin/sendmail/cf/domain/cs.exposed.m4 deleted file mode 100644 index 43c07becdb83d..0000000000000 --- a/usr.sbin/sendmail/cf/domain/cs.exposed.m4 +++ /dev/null @@ -1,40 +0,0 @@ -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(`@(#)cs.exposed.m4 8.1 (Berkeley) 6/7/93') -DOMAIN(Berkeley)dnl -HACK(cssubdomain)dnl -define(`confUSERDB_SPEC', - `/usr/sww/share/lib/users.cs.db,/usr/sww/share/lib/users.eecs.db')dnl diff --git a/usr.sbin/sendmail/cf/domain/cs.hidden.m4 b/usr.sbin/sendmail/cf/domain/cs.hidden.m4 deleted file mode 100644 index 3d9721af7a66e..0000000000000 --- a/usr.sbin/sendmail/cf/domain/cs.hidden.m4 +++ /dev/null @@ -1,38 +0,0 @@ -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(`@(#)cs.hidden.m4 8.1 (Berkeley) 6/7/93') -DOMAIN(cs.exposed)dnl -MASQUERADE_AS(CS.Berkeley.EDU)dnl diff --git a/usr.sbin/sendmail/cf/domain/eecs.hidden.m4 b/usr.sbin/sendmail/cf/domain/eecs.hidden.m4 deleted file mode 100644 index bbdc01afb1afe..0000000000000 --- a/usr.sbin/sendmail/cf/domain/eecs.hidden.m4 +++ /dev/null @@ -1,38 +0,0 @@ -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(`@(#)eecs.hidden.m4 8.1 (Berkeley) 6/7/93') -DOMAIN(Berkeley)dnl -MASQUERADE_AS(EECS.Berkeley.EDU)dnl diff --git a/usr.sbin/sendmail/cf/domain/s2k.m4 b/usr.sbin/sendmail/cf/domain/s2k.m4 deleted file mode 100644 index 25b931f51117a..0000000000000 --- a/usr.sbin/sendmail/cf/domain/s2k.m4 +++ /dev/null @@ -1,38 +0,0 @@ -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(`@(#)s2k.m4 8.1 (Berkeley) 6/7/93') -DOMAIN(cs.exposed)dnl -MASQUERADE_AS(postgres.Berkeley.EDU)dnl diff --git a/usr.sbin/sendmail/cf/feature/notsticky.m4 b/usr.sbin/sendmail/cf/feature/notsticky.m4 index 511892367172d..027b8e3a51c0f 100644 --- a/usr.sbin/sendmail/cf/feature/notsticky.m4 +++ b/usr.sbin/sendmail/cf/feature/notsticky.m4 @@ -34,7 +34,9 @@ divert(-1) # divert(0) -VERSIONID(`@(#)notsticky.m4 8.1 (Berkeley) 6/7/93') +VERSIONID(`@(#)notsticky.m4 8.3 (Berkeley) 5/29/95') +# +# This is now the default. Use ``FEATURE(stickyhost)'' if you want +# the old default behaviour. +# divert(-1) - -define(`_LOCAL_NOT_STICKY_', 1) diff --git a/usr.sbin/sendmail/cf/feature/nullclient.m4 b/usr.sbin/sendmail/cf/feature/nullclient.m4 index 930f265c4b864..7543070f77f7d 100644 --- a/usr.sbin/sendmail/cf/feature/nullclient.m4 +++ b/usr.sbin/sendmail/cf/feature/nullclient.m4 @@ -32,9 +32,7 @@ PUSHDIVERT(-1) # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF # SUCH DAMAGE. # -ifdef(`SMTP_MAILER_FLAGS',, - `define(`SMTP_MAILER_FLAGS', - `ifdef(`_OLD_SENDMAIL_', `L', `')')') +ifdef(`SMTP_MAILER_FLAGS',, `define(`SMTP_MAILER_FLAGS', `')') define(_NULL_CLIENT_ONLY_, `1') ifelse(_ARG_, `', `errprint(`Feature "nullclient" requires argument')', `define(`MAIL_HUB', _ARG_)') @@ -47,8 +45,17 @@ POPDIVERT # sendmail. # -VERSIONID(`@(#)nullclient.m4 8.2 (Berkeley) 8/21/93') +VERSIONID(`@(#)nullclient.m4 8.6 (Berkeley) 6/29/95') +PUSHDIVERT(6) +# hub host (to which all mail is sent) +DH`'ifdef(`MAIL_HUB', MAIL_HUB, + `errprint(`MAIL_HUB not defined for nullclient feature')') +ifdef(`MASQUERADE_NAME',, `define(`MASQUERADE_NAME', MAIL_HUB)')dnl + +# route-addr separators +C: : , +POPDIVERT PUSHDIVERT(7) ############################################ ### Null Client Mailer specification ### @@ -56,6 +63,9 @@ PUSHDIVERT(7) ifdef(`confRELAY_MAILER',, `define(`confRELAY_MAILER', `nullclient')')dnl +ifdef(`confFROM_HEADER',, + `define(`confFROM_HEADER', <$g>)')dnl -Mnullclient, P=[IPC], F=CONCAT(mDFMuXa, SMTP_MAILER_FLAGS), A=IPC $h +Mnullclient, P=[IPC], F=CONCAT(mDFMuXa, SMTP_MAILER_FLAGS),ifdef(`SMTP_MAILER_MAX', ` M=SMTP_MAILER_MAX,') + A=IPC $h POPDIVERT diff --git a/usr.sbin/sendmail/cf/feature/redirect.m4 b/usr.sbin/sendmail/cf/feature/redirect.m4 index 0f2199c9755f8..081db113ae011 100644 --- a/usr.sbin/sendmail/cf/feature/redirect.m4 +++ b/usr.sbin/sendmail/cf/feature/redirect.m4 @@ -34,13 +34,15 @@ divert(-1) # divert(0) -VERSIONID(`@(#)redirect.m4 8.2 (Berkeley) 12/27/93') +VERSIONID(`@(#)redirect.m4 8.4 (Berkeley) 6/25/95') divert(-1) PUSHDIVERT(3) # addresses sent to foo@host.REDIRECT will give a 551 error code -R$* < @ $+ .REDIRECT. > $# error $@ NOUSER $: "551 User not local; please try " <$1@$2> +R$* < @ $+ .REDIRECT. > $: $1 < @ $2 . REDIRECT . > < ${opMode} > +R$* < @ $+ .REDIRECT. > <i> $: $1 < @ $2 . REDIRECT. > +R$* < @ $+ .REDIRECT. > < $- > $# error $@ 5.1.1 $: "551 User not local; please try " <$1@$2> POPDIVERT PUSHDIVERT(6) diff --git a/usr.sbin/sendmail/cf/m4/cf.m4 b/usr.sbin/sendmail/cf/m4/cf.m4 index 528cbfffef934..4e54f4142898e 100644 --- a/usr.sbin/sendmail/cf/m4/cf.m4 +++ b/usr.sbin/sendmail/cf/m4/cf.m4 @@ -1,6 +1,6 @@ -divert(0)dnl +divert(-1) # -# Copyright (c) 1983 Eric P. Allman +# Copyright (c) 1983, 1995 Eric P. Allman # Copyright (c) 1988, 1993 # The Regents of the University of California. All rights reserved. # @@ -33,117 +33,18 @@ divert(0)dnl # SUCH DAMAGE. # +# +# This file is included so that multiple includes of cf.m4 will work +# -###################################################################### -###################################################################### -##### -##### SENDMAIL CONFIGURATION FILE -##### -define(`TEMPFILE', maketemp(/tmp/cfXXXXXX))dnl -syscmd(sh ../sh/makeinfo.sh > TEMPFILE)dnl -include(TEMPFILE)dnl -syscmd(rm -f TEMPFILE)dnl -##### -###################################################################### -###################################################################### - -divert(-1) - -changecom() -undefine(`format') -undefine(`hpux') -ifdef(`pushdef', `', - `errprint(`You need a newer version of M4, at least as new as -System V or GNU') - include(NoSuchFile)') -define(`PUSHDIVERT', `pushdef(`__D__', divnum)divert($1)') -define(`POPDIVERT', `divert(__D__)popdef(`__D__')') -define(`OSTYPE', `PUSHDIVERT(-1)define(`_ARG_', $2)include(../ostype/$1.m4)POPDIVERT`'') -define(`MAILER', -`ifdef(`_MAILER_$1_', `dnl`'', -`define(`_MAILER_$1_', `')PUSHDIVERT(7)include(../mailer/$1.m4)POPDIVERT`'')') -define(`DOMAIN', `PUSHDIVERT(-1)define(`_ARG_', $2)include(../domain/$1.m4)POPDIVERT`'') -define(`FEATURE', `PUSHDIVERT(-1)define(`_ARG_', $2)include(../feature/$1.m4)POPDIVERT`'') -define(`HACK', `PUSHDIVERT(-1)define(`_ARG_', $2)include(../hack/$1.m4)POPDIVERT`'') -define(`OLDSENDMAIL', `define(`_OLD_SENDMAIL_', `')') -define(`VERSIONID', ``##### $1 #####'') -define(`LOCAL_RULE_0', `divert(3)') -define(`LOCAL_RULE_1', -`divert(9)dnl -####################################### -### Ruleset 1 -- Sender Rewriting ### -####################################### - -S1 -') -define(`LOCAL_RULE_2', -`divert(9)dnl -########################################## -### Ruleset 2 -- Recipient Rewriting ### -########################################## - -S2 -') -define(`LOCAL_RULE_3', `divert(2)') -define(`LOCAL_CONFIG', `divert(6)') -define(`LOCAL_NET_CONFIG', `define(`_LOCAL_RULES_', 1)divert(1)') -define(`UUCPSMTP', `R DOL(*) < @ $1 .UUCP > DOL(*) DOL(1) < @ $2 > DOL(2)') -define(`CONCAT', `$1$2$3$4$5$6$7') -define(`DOL', ``$'$1') -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`))') -sinclude(../siteconfig/$1.m4)') -define(`EXPOSED_USER', `PUSHDIVERT(5)CE$1 -POPDIVERT`'dnl') -define(`LOCAL_USER', `PUSHDIVERT(5)CL$1 -POPDIVERT`'dnl') -define(`MASQUERADE_AS', `define(`MASQUERADE_NAME', $1)') - -m4wrap(`include(`../m4/proto.m4')') - -# set up default values for options -define(`confMAILER_NAME', ``MAILER-DAEMON'') -define(`confFROM_LINE', `From $g $d') -define(`confOPERATORS', `.:%@!^/[]') -define(`confSMTP_LOGIN_MSG', `$j Sendmail $v/$Z ready at $b') -define(`confSEVEN_BIT_INPUT', `False') -define(`confALIAS_WAIT', `10') -define(`confMIN_FREE_BLOCKS', `4') -define(`confBLANK_SUB', `.') -define(`confCON_EXPENSIVE', `False') -define(`confCHECKPOINT_INTERVAL', `10') -define(`confDELIVERY_MODE', `background') -define(`confAUTO_REBUILD', `False') -define(`confSAVE_FROM_LINES', `False') -define(`confTEMP_FILE_MODE', `0600') -define(`confMATCH_GECOS', `False') -define(`confDEF_GROUP_ID', `1') -define(`confMAX_HOP', `17') -define(`confIGNORE_DOTS', `False') -define(`confBIND_OPTS', `') -define(`confMCI_CACHE_SIZE', `2') -define(`confMCI_CACHE_TIMEOUT', `5m') -define(`confUSE_ERRORS_TO', `False') -define(`confLOG_LEVEL', `9') -define(`confME_TOO', `False') -define(`confCHECK_ALIASES', `True') -define(`confOLD_STYLE_HEADERS', `True') -define(`confPRIVACY_FLAGS', `authwarnings') -define(`confSAFE_QUEUE', `True') -define(`confMESSAGE_TIMEOUT', `5d/4h') -define(`confTIME_ZONE', `USE_SYSTEM') -define(`confDEF_USER_ID', `1') -define(`confQUEUE_LA', `8') -define(`confREFUSE_LA', `12') -define(`confSEPARATE_PROC', `False') -define(`confCW_FILE', `/etc/sendmail.cw') -define(`confMIME_FORMAT_ERRORS', `True') -define(`confTRY_NULL_MX_LIST', `False') +# figure out where the CF files live +ifdef(`_CF_DIR_', `', + `ifelse(__file__, `__file__', + `define(`_CF_DIR_', `../')', + `define(`_CF_DIR_', + substr(__file__, 0, eval(len(__file__) - 8)))')') divert(0)dnl -VERSIONID(`@(#)cf.m4 8.4 (Berkeley) 12/24/93') +ifdef(`OSTYPE', `dnl', +`include(_CF_DIR_`'m4/cfhead.m4)dnl +VERSIONID(`@(#)cf.m4 8.24 (Berkeley) 8/16/95')') diff --git a/usr.sbin/sendmail/cf/m4/nullrelay.m4 b/usr.sbin/sendmail/cf/m4/nullrelay.m4 index c79d1797f474c..799f3ab79198e 100644 --- a/usr.sbin/sendmail/cf/m4/nullrelay.m4 +++ b/usr.sbin/sendmail/cf/m4/nullrelay.m4 @@ -1,6 +1,6 @@ divert(-1) # -# Copyright (c) 1983 Eric P. Allman +# Copyright (c) 1983, 1995 Eric P. Allman # Copyright (c) 1988, 1993 # The Regents of the University of California. All rights reserved. # @@ -34,7 +34,7 @@ divert(-1) # divert(0) -VERSIONID(`@(#)nullrelay.m4 8.5 (Berkeley) 2/1/94') +VERSIONID(`@(#)nullrelay.m4 8.10 (Berkeley) 9/29/95') # # This configuration applies only to relay-only hosts. They send @@ -45,201 +45,6 @@ VERSIONID(`@(#)nullrelay.m4 8.5 (Berkeley) 2/1/94') # This is based on a prototype done by Bryan Costales of ICSI. # -# hub host (to which all mail is sent) -DH`'ifdef(`MAIL_HUB', MAIL_HUB, - `errprint(`MAIL_HUB not defined for nullclient feature')') - -# name from which everyone will appear to come -DM`'ifdef(`MASQUERADE_NAME', MASQUERADE_NAME, MAIL_HUB) - -# route-addr separators -C: : , - -undivert(6)dnl - -###################### -# Special macros # -###################### - -# SMTP initial login message -De`'confSMTP_LOGIN_MSG - -# UNIX initial From header format -Dl`'confFROM_LINE - -# my name for error messages -Dn`'confMAILER_NAME - -# delimiter (operator) characters -Do`'confOPERATORS - -# format of a total name -Dq<$g> -include(`../m4/version.m4') - -############### -# Options # -############### - -# strip message body to 7 bits on input? -O7`'confSEVEN_BIT_INPUT - -# no aliases here - -# substitution for space (blank) characters -OB`'confBLANK_SUB - -# default delivery mode -Od`'confDELIVERY_MODE - -# error message header/file -ifdef(`confERROR_MESSAGE', - OE`'confERROR_MESSAGE, - #OE/etc/sendmail.oE) - -# error mode -ifdef(`confERROR_MODE', - Oe`'confERROR_MODE, - #Oep) - -# save Unix-style "From_" lines at top of header? -Of`'confSAVE_FROM_LINES - -# temporary file mode -OF`'confTEMP_FILE_MODE - -# default GID -Og`'confDEF_GROUP_ID - -# maximum hop count -Oh`'confMAX_HOP - -# location of help file -OH`'ifdef(`HELP_FILE', HELP_FILE, /usr/lib/sendmail.hf) - -# ignore dots as terminators in incoming messages? -Oi`'confIGNORE_DOTS - -# Insist that the BIND name server be running to resolve names -ifdef(`confBIND_OPTS', - OI`'confBIND_OPTS, - #OI) - -# deliver MIME-encapsulated error messages? -Oj`'confMIME_FORMAT_ERRORS - -# open connection cache size -Ok`'confMCI_CACHE_SIZE - -# open connection cache timeout -OK`'confMCI_CACHE_TIMEOUT - -# use Errors-To: header? -Ol`'confUSE_ERRORS_TO - -# log level -OL`'confLOG_LEVEL - -# send to me too, even in an alias expansion? -Om`'confME_TOO - -# default messages to old style headers if no special punctuation? -Oo`'confOLD_STYLE_HEADERS - -# SMTP daemon options -ifdef(`confDAEMON_OPTIONS', - OO`'confDAEMON_OPTIONS, - #OOPort=esmtp) - -# privacy flags -Op`'confPRIVACY_FLAGS - -# who (if anyone) should get extra copies of error messages -ifdef(`confCOPY_ERRORS_TO', - OP`'confCOPY_ERRORS_TO, - #OPPostmaster) - -# slope of queue-only function -ifdef(`confQUEUE_FACTOR', - Oq`'confQUEUE_FACTOR, - #Oq600000) - -# queue directory -OQ`'ifdef(`QUEUE_DIR', QUEUE_DIR, /var/spool/mqueue) - -# read timeout -- now OK per RFC 1123 section 5.3.2 -ifdef(`confREAD_TIMEOUT', - Or`'confREAD_TIMEOUT, - #Ordatablock=10m) - -# queue up everything before forking? -Os`'confSAFE_QUEUE - -# status file -OS`'ifdef(`STATUS_FILE', STATUS_FILE, /etc/sendmail.st) - -# default message timeout interval -OT`'confMESSAGE_TIMEOUT - -# time zone handling: -# if undefined, use system default -# if defined but null, use TZ envariable passed in -# if defined and non-null, use that info -ifelse(confTIME_ZONE, `USE_SYSTEM', `#Ot', - confTIME_ZONE, `USE_TZ', `Ot', - `Ot`'confTIME_ZONE') - -# default UID -Ou`'confDEF_USER_ID - -# deliver each queued job in a separate process? -OY`'confSEPARATE_PROC - -# work class factor -ifdef(`confWORK_CLASS_FACTOR', - Oz`'confWORK_CLASS_FACTOR, - #Oz1800) - -# work time factor -ifdef(`confWORK_TIME_FACTOR', - OZ`'confWORK_TIME_FACTOR, - #OZ90000) - -########################### -# Message precedences # -########################### - -Pfirst-class=0 -Pspecial-delivery=100 -Plist=-30 -Pbulk=-60 -Pjunk=-100 - -##################### -# Trusted users # -##################### - -Troot -Tdaemon -Tuucp - -######################### -# Format of headers # -######################### - -H?P?Return-Path: $g -HReceived: $?sfrom $s $.$?_($_) $.by $j ($v/$Z)$?r with $r$. id $i$?u for $u$.; $b -H?D?Resent-Date: $a -H?D?Date: $a -H?F?Resent-From: $q -H?F?From: $q -H?x?Full-Name: $x -HSubject: -# HPosted-Date: $a -# H?l?Received-Date: $b -H?M?Resent-Message-Id: <$t.$i@$j> -H?M?Message-Id: <$t.$i@$j> -# ###################################################################### ###################################################################### ##### @@ -253,9 +58,20 @@ H?M?Message-Id: <$t.$i@$j> ########################################### S3 -# handle null input and list syntax (translate to <@> special case) +# handle null input R$@ $@ <@> -R$*:;$* $@ $1 :; <@> + +# strip group: syntax (not inside angle brackets!) and trailing semicolon +R$* $: $1 <@> mark addresses +R$* < $* > $* <@> $: $1 < $2 > $3 unmark <addr> +R$* :: $* <@> $: $1 :: $2 unmark node::addr +R:`include': $* <@> $: :`include': $1 unmark :`include':... +R$* : $* <@> $: $2 strip colon if marked +R$* <@> $: $1 unmark +R$* ; $: $1 strip trailing semi + +# null input now results from list:; syntax +R$@ $@ :; <@> # basic textual canonicalization -- note RFC733 heuristic here R$*<$*>$*<$*>$* $2$3<$4>$5 strip multiple <> <> @@ -291,6 +107,17 @@ R$*:;<@> $#error $@ USAGE $: "list:; syntax illegal for recipient addresses" # pass everything else to a relay host R$* $#_RELAY_ $@ $H $: $1 + +################################################## +### Ruleset 4 -- Final Output Post-rewriting ### +################################################## +S4 + +R$* <@> $@ handle <> and list:; + +# strip trailing dot off before passing to nullclient relay +R$* @ $+ . $1 @ $2 + # ###################################################################### ###################################################################### diff --git a/usr.sbin/sendmail/cf/m4/proto.m4 b/usr.sbin/sendmail/cf/m4/proto.m4 index 284572988f902..89b3215e5ce3e 100644 --- a/usr.sbin/sendmail/cf/m4/proto.m4 +++ b/usr.sbin/sendmail/cf/m4/proto.m4 @@ -1,6 +1,6 @@ divert(-1) # -# Copyright (c) 1983 Eric P. Allman +# Copyright (c) 1983, 1995 Eric P. Allman # Copyright (c) 1988, 1993 # The Regents of the University of California. All rights reserved. # @@ -34,32 +34,54 @@ divert(-1) # divert(0) -VERSIONID(`@(#)proto.m4 8.45 (Berkeley) 3/4/94') +VERSIONID(`@(#)proto.m4 8.100 (Berkeley) 12/3/95') MAILER(local)dnl -ifdef(`_OLD_SENDMAIL_', -`define(`_SET_95_', 5)dnl -define(`_SET_96_', 6)dnl -define(`_SET_97_', 7)dnl -define(`_SET_98_', 8)dnl -define(`confDOMAIN_NAME', - `ifdef(`NEED_DOMAIN', `$w.$d', `$w')')dnl', -`# level 5 config file format -V5 -define(`_SET_95_', 95)dnl -define(`_SET_96_', 96)dnl -define(`_SET_97_', 97)dnl -define(`_SET_98_', 98)dnl') -ifdef(`confSMTP_MAILER',, `define(`confSMTP_MAILER', `smtp')')dnl -ifdef(`confLOCAL_MAILER',, `define(`confLOCAL_MAILER', `local')')dnl +# level 6 config file format +V6/Berkeley +divert(-1) + +# do some sanity checking +ifdef(`__OSTYPE__',, + `errprint(`*** ERROR: No system type defined (use OSTYPE macro)')') + +# pick our default mailers +ifdef(`confSMTP_MAILER',, `define(`confSMTP_MAILER', `smtp')') +ifdef(`confLOCAL_MAILER',, `define(`confLOCAL_MAILER', `local')') ifdef(`confRELAY_MAILER',, `define(`confRELAY_MAILER', `ifdef(`_MAILER_smtp_', `relay', - `ifdef(`_MAILER_uucp', `suucp', `unknown')')')')dnl + `ifdef(`_MAILER_uucp', `uucp-new', `unknown')')')') +ifdef(`confUUCP_MAILER',, `define(`confUUCP_MAILER', `uucp-old')') define(`_SMTP_', `confSMTP_MAILER')dnl for readability only define(`_LOCAL_', `confLOCAL_MAILER')dnl for readability only define(`_RELAY_', `confRELAY_MAILER')dnl for readability only +define(`_UUCP_', `confUUCP_MAILER')dnl for readability only + +# back compatibility with old config files +ifdef(`confDEF_GROUP_ID', + `errprint(`*** confDEF_GROUP_ID is obsolete.') + errprint(` Use confDEF_USER_ID with a colon in the value instead.')') +ifdef(`confREAD_TIMEOUT', + `errprint(`*** confREAD_TIMEOUT is obsolete.') + errprint(` Use individual confTO_<timeout> parameters instead.')') +ifdef(`confMESSAGE_TIMEOUT', + `define(`_ARG_', index(confMESSAGE_TIMEOUT, /)) + ifelse(_ARG_, -1, + `define(`confTO_QUEUERETURN', confMESSAGE_TIMEOUT)', + `define(`confTO_QUEUERETURN', + substr(confMESSAGE_TIMEOUT, 0, _ARG_)) + define(`confTO_QUEUEWARN', + substr(confMESSAGE_TIMEOUT, eval(_ARG_+1)))')') +ifdef(`confMIN_FREE_BLOCKS', `ifelse(index(confMIN_FREE_BLOCKS, /), -1,, + `errprint(`*** compound confMIN_FREE_BLOCKS is obsolete.') + errprint(` Use confMAX_MESSAGE_SIZE for the second part of the value.')')') + +# clean option definitions below.... +define(`_OPTION', `ifdef(`$2', `O $1=$2', `#O $1`'ifelse($3, `',, `=$3')')')dnl + +divert(0)dnl ################## # local info # @@ -70,14 +92,12 @@ ifdef(`USE_CW_FILE', `# file containing names of hosts for which we receive email Fw`'confCW_FILE', `dnl') -ifdef(`confDOMAIN_NAME', ` + # my official domain name -Dj`'confDOMAIN_NAME', - `dnl') +# ... define this only if sendmail cannot automatically determine your domain +ifdef(`confDOMAIN_NAME', `Dj`'confDOMAIN_NAME', `#Dj$w.Foo.COM') -ifdef(`_NULL_CLIENT_ONLY_', -`include(../m4/nullrelay.m4)m4exit', - `dnl') +ifdef(`_NULL_CLIENT_ONLY_', `divert(-1)')dnl CP. @@ -93,6 +113,13 @@ DB`'BITNET_RELAY CPBITNET ')dnl +ifdef(`DECNET_RELAY', +`define(`_USE_DECNET_SYNTAX_', 1)dnl +# DECnet relay host +DC`'DECNET_RELAY +CPDECNET + +')dnl ifdef(`FAX_RELAY', `# FAX relay host DF`'FAX_RELAY @@ -102,240 +129,276 @@ CPFAX # "Smart" relay host (may be null) DS`'ifdef(`SMART_HOST', SMART_HOST) +# place to which unknown users should be forwarded +ifdef(`LUSER_RELAY', `', `#')dnl +Kuser user -m -a<> +ifdef(`LUSER_RELAY', + `DL`'LUSER_RELAY', + `#DLname_of_luser_relay') + +# operators that cannot be in local usernames (i.e., network indicators) +CO @ % ifdef(`_NO_UUCP_', `', `!') + +# a class with just dot (for identifying canonical names) +C.. + +# Mailer table (overriding domains) ifdef(`MAILER_TABLE', -`# Mailer table (overriding domains) -Kmailertable MAILER_TABLE + `Kmailertable MAILER_TABLE', + `#Kmailertable dbm /etc/mailertable') -')dnl +# Domain table (adding domains) ifdef(`DOMAIN_TABLE', -`# Domain table (adding domains) -Kdomaintable DOMAIN_TABLE + `Kdomaintable DOMAIN_TABLE', + `#Kdomaintable dbm /etc/domaintable') -')dnl # who I send unqualified names to (null means deliver locally) DR`'ifdef(`LOCAL_RELAY', LOCAL_RELAY) # who gets all local email traffic ($R has precedence for unqualified names) DH`'ifdef(`MAIL_HUB', MAIL_HUB) -# who I masquerade as (null for no masquerading) -DM`'ifdef(`MASQUERADE_NAME', MASQUERADE_NAME) - # class L: names that should be delivered locally, even if we have a relay # class E: names that should be exposed as from this host, even if we masquerade -#CLroot -CEroot +# class M: domains that should be converted to $M +#CL root +CE root undivert(5)dnl -# operators that cannot be in local usernames (i.e., network indicators) -CO @ % ifdef(`_NO_UUCP_', `', `!') - -# a class with just dot (for identifying canonical names) -C.. - -ifdef(`_OLD_SENDMAIL_', `dnl', -`# dequoting map -Kdequote dequote') - -undivert(6)dnl - -###################### -# Special macros # -###################### - -# SMTP initial login message -De`'confSMTP_LOGIN_MSG +# dequoting map +Kdequote dequote -# UNIX initial From header format -Dl`'confFROM_LINE +divert(0)dnl # end of nullclient diversion +# who I masquerade as (null for no masquerading) (see also $=M) +DM`'ifdef(`MASQUERADE_NAME', MASQUERADE_NAME) # my name for error messages -Dn`'confMAILER_NAME - -# delimiter (operator) characters -Do`'confOPERATORS +ifdef(`confMAILER_NAME', `Dn`'confMAILER_NAME', `#DnMAILER-DAEMON') -# format of a total name -Dq`'ifdef(`confFROM_HEADER', confFROM_HEADER, - ifdef(`_OLD_SENDMAIL_', `$g$?x ($x)$.', `$?x$x <$g>$|$g$.')) -include(`../m4/version.m4') +undivert(6)dnl +include(_CF_DIR_`m4/version.m4') ############### # Options # ############### # strip message body to 7 bits on input? -O7`'confSEVEN_BIT_INPUT +_OPTION(SevenBitInput, `confSEVEN_BIT_INPUT') -# wait (in minutes) for alias file rebuild -Oa`'confALIAS_WAIT +# 8-bit data handling +_OPTION(EightBitMode, `confEIGHT_BIT_HANDLING', adaptive) -# location of alias file -OA`'ifdef(`ALIAS_FILE', `ALIAS_FILE', /etc/aliases) +ifdef(`_NULL_CLIENT_ONLY_', `dnl', ` +# wait for alias file rebuild (default units: minutes) +_OPTION(AliasWait, `confALIAS_WAIT', 5m) +# location of alias file +O AliasFile=ifdef(`ALIAS_FILE', `ALIAS_FILE', /etc/aliases) +') # minimum number of free blocks on filesystem -Ob`'confMIN_FREE_BLOCKS +_OPTION(MinFreeBlocks, `confMIN_FREE_BLOCKS', 100) + +# maximum message size +_OPTION(MaxMessageSize, `confMAX_MESSAGE_SIZE', 1000000) # substitution for space (blank) characters -OB`'confBLANK_SUB +_OPTION(BlankSub, `confBLANK_SUB', _) # avoid connecting to "expensive" mailers on initial submission? -Oc`'confCON_EXPENSIVE +_OPTION(HoldExpensive, `confCON_EXPENSIVE') # checkpoint queue runs after every N successful deliveries -OC`'confCHECKPOINT_INTERVAL +_OPTION(CheckpointInterval, `confCHECKPOINT_INTERVAL', 10) # default delivery mode -Od`'confDELIVERY_MODE +_OPTION(DeliveryMode, `confDELIVERY_MODE', background) # automatically rebuild the alias database? -OD`'confAUTO_REBUILD +_OPTION(AutoRebuildAliases, `confAUTO_REBUILD') # error message header/file -ifdef(`confERROR_MESSAGE', - OE`'confERROR_MESSAGE, - #OE/etc/sendmail.oE) +_OPTION(ErrorHeader, `confERROR_MESSAGE', /etc/sendmail.oE) # error mode -ifdef(`confERROR_MODE', - Oe`'confERROR_MODE, - #Oep) +_OPTION(ErrorMode, `confERROR_MODE', print) # save Unix-style "From_" lines at top of header? -Of`'confSAVE_FROM_LINES +_OPTION(SaveFromLine, `confSAVE_FROM_LINES') # temporary file mode -OF`'confTEMP_FILE_MODE +_OPTION(TempFileMode, `confTEMP_FILE_MODE', 0600) # match recipients against GECOS field? -OG`'confMATCH_GECOS - -# default GID -Og`'confDEF_GROUP_ID +_OPTION(MatchGECOS, `confMATCH_GECOS') # maximum hop count -Oh`'confMAX_HOP +_OPTION(MaxHopCount, `confMAX_HOP', 17) # location of help file -OH`'ifdef(`HELP_FILE', HELP_FILE, /usr/lib/sendmail.hf) +O HelpFile=ifdef(`HELP_FILE', HELP_FILE, /usr/lib/sendmail.hf) # ignore dots as terminators in incoming messages? -Oi`'confIGNORE_DOTS +_OPTION(IgnoreDots, `confIGNORE_DOTS') -# Insist that the BIND name server be running to resolve names -ifdef(`confBIND_OPTS', - OI`'confBIND_OPTS, - #OI) +# name resolver options +_OPTION(ResolverOptions, `confBIND_OPTS', +AAONLY) # deliver MIME-encapsulated error messages? -Oj`'confMIME_FORMAT_ERRORS +_OPTION(SendMimeErrors, `confMIME_FORMAT_ERRORS') # Forward file search path -ifdef(`confFORWARD_PATH', - OJ`'confFORWARD_PATH, - #OJ/var/forward/$u:$z/.forward.$w:$z/.forward) +_OPTION(ForwardPath, `confFORWARD_PATH', /var/forward/$u:$z/.forward.$w:$z/.forward) # open connection cache size -Ok`'confMCI_CACHE_SIZE +_OPTION(ConnectionCacheSize, `confMCI_CACHE_SIZE', 2) # open connection cache timeout -OK`'confMCI_CACHE_TIMEOUT +_OPTION(ConnectionCacheTimeout, `confMCI_CACHE_TIMEOUT', 5m) # use Errors-To: header? -Ol`'confUSE_ERRORS_TO +_OPTION(UseErrorsTo, `confUSE_ERRORS_TO') # log level -OL`'confLOG_LEVEL +_OPTION(LogLevel, `confLOG_LEVEL', 10) # send to me too, even in an alias expansion? -Om`'confME_TOO +_OPTION(MeToo, `confME_TOO') # verify RHS in newaliases? -On`'confCHECK_ALIASES +_OPTION(CheckAliases, `confCHECK_ALIASES') # default messages to old style headers if no special punctuation? -Oo`'confOLD_STYLE_HEADERS +_OPTION(OldStyleHeaders, `confOLD_STYLE_HEADERS') # SMTP daemon options -ifdef(`confDAEMON_OPTIONS', - OO`'confDAEMON_OPTIONS, - #OOPort=esmtp) +_OPTION(DaemonPortOptions, `confDAEMON_OPTIONS', Port=esmtp) # privacy flags -Op`'confPRIVACY_FLAGS +_OPTION(PrivacyOptions, `confPRIVACY_FLAGS', authwarnings) # who (if anyone) should get extra copies of error messages -ifdef(`confCOPY_ERRORS_TO', - OP`'confCOPY_ERRORS_TO, - #OPPostmaster) +_OPTION(PostMasterCopy, `confCOPY_ERRORS_TO', Postmaster) # slope of queue-only function -ifdef(`confQUEUE_FACTOR', - Oq`'confQUEUE_FACTOR, - #Oq600000) +_OPTION(QueueFactor, `confQUEUE_FACTOR', 600000) # queue directory -OQ`'ifdef(`QUEUE_DIR', QUEUE_DIR, /var/spool/mqueue) - -# read timeout -- now OK per RFC 1123 section 5.3.2 -ifdef(`confREAD_TIMEOUT', - Or`'confREAD_TIMEOUT, - #Ordatablock=10m) +O QueueDirectory=ifdef(`QUEUE_DIR', QUEUE_DIR, /var/spool/mqueue) + +# timeouts (many of these) +_OPTION(Timeout.initial, `confTO_INITIAL', 5m) +_OPTION(Timeout.helo, `confTO_HELO', 5m) +_OPTION(Timeout.mail, `confTO_MAIL', 10m) +_OPTION(Timeout.rcpt, `confTO_RCPT', 1h) +_OPTION(Timeout.datainit, `confTO_DATAINIT', 5m) +_OPTION(Timeout.datablock, `confTO_DATABLOCK', 1h) +_OPTION(Timeout.datafinal, `confTO_DATAFINAL', 1h) +_OPTION(Timeout.rset, `confTO_RSET', 5m) +_OPTION(Timeout.quit, `confTO_QUIT', 2m) +_OPTION(Timeout.misc, `confTO_MISC', 2m) +_OPTION(Timeout.command, `confTO_COMMAND', 1h) +_OPTION(Timeout.ident, `confTO_IDENT', 30s) +_OPTION(Timeout.fileopen, `confTO_FILEOPEN', 60s) +_OPTION(Timeout.queuereturn, `confTO_QUEUERETURN', 5d) +_OPTION(Timeout.queuereturn.normal, `confTO_QUEUERETURN_NORMAL', 5d) +_OPTION(Timeout.queuereturn.urgent, `confTO_QUEUERETURN_URGENT', 2d) +_OPTION(Timeout.queuereturn.non-urgent, `confTO_QUEUERETURN_NONURGENT', 7d) +_OPTION(Timeout.queuewarn, `confTO_QUEUEWARN', 4h) +_OPTION(Timeout.queuewarn.normal, `confTO_QUEUEWARN_NORMAL', 4h) +_OPTION(Timeout.queuewarn.urgent, `confTO_QUEUEWARN_URGENT', 1h) +_OPTION(Timeout.queuewarn.non-urgent, `confTO_QUEUEWARN_NONURGENT', 12h) + +# should we not prune routes in route-addr syntax addresses? +_OPTION(DontPruneRoutes, `confDONT_PRUNE_ROUTES') # queue up everything before forking? -Os`'confSAFE_QUEUE +_OPTION(SuperSafe, `confSAFE_QUEUE') # status file -OS`'ifdef(`STATUS_FILE', STATUS_FILE, /etc/sendmail.st) - -# default message timeout interval -OT`'confMESSAGE_TIMEOUT +O StatusFile=ifdef(`STATUS_FILE', `STATUS_FILE', /etc/sendmail.st) # time zone handling: # if undefined, use system default # if defined but null, use TZ envariable passed in # if defined and non-null, use that info -ifelse(confTIME_ZONE, `USE_SYSTEM', `#Ot', - confTIME_ZONE, `USE_TZ', `Ot', - `Ot`'confTIME_ZONE') +ifelse(confTIME_ZONE, `USE_SYSTEM', `#O TimeZoneSpec=', + confTIME_ZONE, `USE_TZ', `O TimeZoneSpec=', + `O TimeZoneSpec=confTIME_ZONE') -# default UID -Ou`'confDEF_USER_ID +# default UID (can be username or userid:groupid) +_OPTION(DefaultUser, `confDEF_USER_ID', nobody) # list of locations of user database file (null means no lookup) -OU`'ifdef(`confUSERDB_SPEC', `confUSERDB_SPEC') +_OPTION(UserDatabaseSpec, `confUSERDB_SPEC', /etc/userdb) # fallback MX host -ifdef(`confFALLBACK_MX', - OV`'confFALLBACK_MX, - #OVfall.back.host.net) +_OPTION(FallbackMXhost, `confFALLBACK_MX', fall.back.host.net) # if we are the best MX host for a site, try it directly instead of config err -Ow`'confTRY_NULL_MX_LIST +_OPTION(TryNullMXList, `confTRY_NULL_MX_LIST') # load average at which we just queue messages -Ox`'confQUEUE_LA +_OPTION(QueueLA, `confQUEUE_LA', 8) # load average at which we refuse connections -OX`'confREFUSE_LA +_OPTION(RefuseLA, `confREFUSE_LA', 12) # work recipient factor -ifdef(`confWORK_RECIPIENT_FACTOR', - Oy`'confWORK_RECIPIENT_FACTOR, - #Oy30000) +_OPTION(RecipientFactor, `confWORK_RECIPIENT_FACTOR', 30000) # deliver each queued job in a separate process? -OY`'confSEPARATE_PROC +_OPTION(ForkEachJob, `confSEPARATE_PROC') # work class factor -ifdef(`confWORK_CLASS_FACTOR', - Oz`'confWORK_CLASS_FACTOR, - #Oz1800) +_OPTION(ClassFactor, `confWORK_CLASS_FACTOR', 1800) # work time factor -ifdef(`confWORK_TIME_FACTOR', - OZ`'confWORK_TIME_FACTOR, - #OZ90000) +_OPTION(RetryFactor, `confWORK_TIME_FACTOR', 90000) + +# shall we sort the queue by hostname first? +_OPTION(QueueSortOrder, `confQUEUE_SORT_ORDER', priority) + +# minimum time in queue before retry +_OPTION(MinQueueAge, `confMIN_QUEUE_AGE', 30m) + +# default character set +_OPTION(DefaultCharSet, `confDEF_CHAR_SET', iso-8859-1) + +# service switch file (ignored on Solaris, Ultrix, OSF/1, others) +_OPTION(ServiceSwitchFile, `confSERVICE_SWITCH_FILE', /etc/service.switch) + +# hosts file (normally /etc/hosts) +_OPTION(HostsFile, `confHOSTS_FILE', /etc/hosts) + +# dialup line delay on connection failure +_OPTION(DialDelay, `confDIAL_DELAY', 10s) + +# action to take if there are no recipients in the message +_OPTION(NoRecipientAction, `confNO_RCPT_ACTION', add-to-undisclosed) + +# chrooted environment for writing to files +_OPTION(SafeFileEnvironment, `confSAFE_FILE_ENV', /arch) + +# are colons OK in addresses? +_OPTION(ColonOkInAddr, `confCOLON_OK_IN_ADDR') + +# how many jobs can you process in the queue? +_OPTION(MaxQueueRunSize, `confMAX_QUEUE_RUN_SIZE', 10000) + +# shall I avoid expanding CNAMEs (violates protocols)? +_OPTION(DontExpandCnames, `confDONT_EXPAND_CNAMES') + +# SMTP initial login message (old $e macro) +_OPTION(SmtpGreetingMessage, `confSMTP_LOGIN_MSG') + +# UNIX initial From header format (old $l macro) +_OPTION(UnixFromLine, `confFROM_LINE') + +# delimiter (operator) characters (old $o macro) +_OPTION(OperatorChars, `confOPERATORS') + +# shall I avoid calling initgroups(3) because of high NIS costs? +_OPTION(DontInitGroups, `confDONT_INIT_GROUPS') ########################### # Message precedences # @@ -351,26 +414,33 @@ Pjunk=-100 # Trusted users # ##################### +# this is equivalent to setting class "t" +ifdef(`_USE_CT_FILE_', `', `#')Ft`'ifdef(`confCT_FILE', confCT_FILE, `/etc/sendmail.ct') Troot Tdaemon Tuucp +ifdef(`confTRUSTED_USERS', `T`'confTRUSTED_USERS', `dnl') ######################### # Format of headers # ######################### +ifdef(`confFROM_HEADER',, `define(`confFROM_HEADER', `$?x$x <$g>$|$g$.')')dnl H?P?Return-Path: $g -HReceived: $?sfrom $s $.$?_($?s$|from $.$_) $.by $j ($v/$Z)$?r with $r$. id $i$?u for $u$.; $b +HReceived: confRECEIVED_HEADER H?D?Resent-Date: $a H?D?Date: $a -H?F?Resent-From: $q -H?F?From: $q +H?F?Resent-From: confFROM_HEADER +H?F?From: confFROM_HEADER H?x?Full-Name: $x HSubject: # HPosted-Date: $a # H?l?Received-Date: $b H?M?Resent-Message-Id: <$t.$i@$j> H?M?Message-Id: <$t.$i@$j> +ifdef(`_NULL_CLIENT_ONLY_', + `include(_CF_DIR_`'m4/nullrelay.m4)m4exit', + `dnl') # ###################################################################### ###################################################################### @@ -390,53 +460,69 @@ S3 # handle null input (translate to <@> special case) R$@ $@ <@> -# basic textual canonicalization -- note RFC733 heuristic here -R$*<$*>$*<$*>$* $2$3<$4>$5 strip multiple <> <> -R$*<$*<$+>$*>$* <$3>$5 2-level <> nesting -R$*<>$* $@ <@> MAIL FROM:<> case -R$*<$+>$* $2 basic RFC821/822 parsing - -# handle list:; syntax as special case -R$*:;$* $@ $1 :; <@> +# strip group: syntax (not inside angle brackets!) and trailing semicolon +R$* $: $1 <@> mark addresses +R$* < $* > $* <@> $: $1 < $2 > $3 unmark <addr> +R$* :: $* <@> $: $1 :: $2 unmark node::addr +R:`include': $* <@> $: :`include': $1 unmark :`include':... +R$* : $* <@> $: $2 strip colon if marked +R$* <@> $: $1 unmark +R$* ; $: $1 strip trailing semi + +# null input now results from list:; syntax +R$@ $@ :; <@> + +# strip angle brackets -- note RFC733 heuristic to get innermost item +R$* $: < $1 > housekeeping <> +R$+ < $* > < $2 > strip excess on left +R< $* > $+ < $1 > strip excess on right +R<> $@ < @ > MAIL FROM:<> case +R< $+ > $: $1 remove housekeeping <> # make sure <@a,@b,@c:user@d> syntax is easy to parse -- undone later R@ $+ , $+ @ $1 : $2 change all "," to ":" # localize and dispose of route-based addresses -R@ $+ : $+ $@ $>_SET_96_ < @$1 > : $2 handle <route-addr> +R@ $+ : $+ $@ $>96 < @$1 > : $2 handle <route-addr> # find focus for list syntax -R $+ : $* ; @ $+ $@ $>_SET_96_ $1 : $2 ; < @ $3 > list syntax +R $+ : $* ; @ $+ $@ $>96 $1 : $2 ; < @ $3 > list syntax R $+ : $* ; $@ $1 : $2; list syntax # find focus for @ syntax addresses R$+ @ $+ $: $1 < @ $2 > focus on domain R$+ < $+ @ $+ > $1 $2 < @ $3 > move gaze right -R$+ < @ $+ > $@ $>_SET_96_ $1 < @ $2 > already canonical +R$+ < @ $+ > $@ $>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 -R$+ . $- ! $+ $@ $>_SET_96_ $3 < @ $1 . $2 > domain uucps -R$+ ! $+ $@ $>_SET_96_ $2 < @ $1 .UUCP > uucp subdomains') - +R$- ! $+ $@ $>96 $2 < @ $1 .UUCP > resolve uucp names +R$+ . $- ! $+ $@ $>96 $3 < @ $1 . $2 > domain uucps +R$+ ! $+ $@ $>96 $2 < @ $1 .UUCP > uucp subdomains +') +ifdef(`_USE_DECNET_SYNTAX_', +`# convert node::user addresses into a domain-based address +R$- :: $+ $@ $>96 $2 < @ $1 .DECNET > resolve DECnet names +R$- . $- :: $+ $@ $>96 $3 < @ $1.$2 .DECNET > numeric DECnet addr +', + `dnl') # if we have % signs, take the rightmost one R$* % $* $1 @ $2 First make them all @s. R$* @ $* @ $* $1 % $2 @ $3 Undo all but the last. -R$* @ $* $@ $>_SET_96_ $1 < @ $2 > Insert < > and finish +R$* @ $* $@ $>96 $1 < @ $2 > Insert < > and finish # else we must be a local name +R$* $@ $>96 $1 ################################################ -### Ruleset _SET_96_ -- bottom half of ruleset 3 ### +### Ruleset 96 -- bottom half of ruleset 3 ### ################################################ -# At this point, everything should be in a "local_part<@domain>extra" format. -S`'_SET_96_ +S96 # handle special cases for local names R$* < @ localhost > $* $: $1 < @ $j . > $2 no domain at all @@ -446,10 +532,11 @@ ifdef(`_NO_UUCP_', `dnl', R$* < @ [ $+ ] > $* $: $1 < @@ [ $2 ] > $3 mark [a.b.c.d] R$* < @@ $=w > $* $: $1 < @ $j . > $3 self-literal R$* < @@ $+ > $* $@ $1 < @ $2 > $3 canon IP addr -ifdef(`DOMAIN_TABLE', ` -# look up unqualified domains in the domain table -R$* < @ $- > $* $: $1 < @ $(domaintable $2 $) > $3', -`dnl') + +# look up domains in the domain table +ifdef(`DOMAIN_TABLE', `', `#')dnl +R$* < @ $+ > $* $: $1 < @ $(domaintable $2 $) > $3 + undivert(2)dnl ifdef(`_NO_UUCP_', `dnl', @@ -470,9 +557,7 @@ ifdef(`_CLASS_Y_', # 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')') +R$* < @ $+ . . UUCP . > $* $@ $1 < @ $2 . > $3') ') ifdef(`_NO_CANONIFY_', `dnl', `# pass to name server to make hostname canonical @@ -492,11 +577,14 @@ R$* < @ $j > $* $: $1 < @ $j . > $2 ################################################## S4 -R$*<@> $@ $1 handle <> and list:; +R$* <@> $@ handle <> and list:; # strip trailing dot off possibly canonical name R$* < @ $+ . > $* $1 < @ $2 > $3 +# eliminate internal code -- should never get this far! +R$* < @ *LOCAL* > $* $1 < @ $j > $2 + # externalize local domain info R$* < $+ > $* $1 $2 $3 defocus R@ $+ : @ $+ : $+ @ $1 , @ $2 : $3 <route-addr> canonical @@ -506,17 +594,21 @@ ifdef(`_NO_UUCP_', `dnl', `# UUCP must always be presented in old form R$+ @ $- . UUCP $2!$1 u@h.UUCP => h!u') +ifdef(`_USE_DECNET_SYNTAX_', +`# put DECnet back in :: form +R$+ @ $+ . DECNET $2 :: $1 u@h.DECNET => h::u', + `dnl') # delete duplicate local names R$+ % $=w @ $=w $1 @ $j u%host@host => u@host ############################################################## -### Ruleset _SET_97_ -- recanonicalize and call ruleset zero ### +### Ruleset 97 -- recanonicalize and call ruleset zero ### ### (used for recursive calls) ### ############################################################## -S`'_SET_97_ +S`'97 R$* $: $>3 $1 R$* $@ $>0 $1 @@ -527,62 +619,68 @@ R$* $@ $>0 $1 S0 -R<@> $#_LOCAL_ $: <> special case error msgs -R$* : $* ; $#error $@ USAGE $: "list:; syntax illegal for recipient addresses" -R<@ $+> $#error $@ USAGE $: "user address required" -R<$* : $* > $#error $@ USAGE $: "colon illegal in host name part" +R<@> $#_LOCAL_ $: <@> special case error msgs +R$* : $* ; <@> $#error $@ 5.1.3 $: "list:; syntax illegal for recipient addresses" +R<@ $+> $#error $@ 5.1.1 $: "user address required" +R$* <$* : $* > $* $#error $@ 5.1.1 $: "colon illegal in host name part" +R$* < @ . > $* $#error $@ 5.1.2 $: "invalid host name" ifdef(`_MAILER_smtp_', `# handle numeric address spec -R$* < @ [ $+ ] > $* $: $>_SET_98_ $1 < @ [ $2 ] > $3 numeric internet spec +R$* < @ [ $+ ] > $* $: $>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 -R$* < @ > $* $@ $>_SET_97_ $1 user@ => user -R< @ $=w . > : $* $@ $>_SET_97_ $2 @here:... -> ... -R$* $=O $* < @ $=w . > $@ $>_SET_97_ $1 $2 $3 ...@here -> ... +R$* < @ > $* $@ $>97 $1 user@ => user +R< @ $=w . > : $* $@ $>97 $2 @here:... -> ... +R$- < @ $=w . > $: $(dequote $1 $) < @ $2 . > dequote "foo"@here +R$* $=O $* < @ $=w . > $@ $>97 $1 $2 $3 ...@here -> ... # handle local hacks -R$* $: $>_SET_98_ $1 +R$* $: $>98 $1 # short circuit local delivery so forwarded email works -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 .... -R$+ < $+ @ > $#_LOCAL_ $: $1 nope, local address', -`R$+ < $+ @ $+ > $#_LOCAL_ $: $1 yep .... -R$+ < $+ @ > $#_LOCAL_ $: @ $1 nope, local address')') -ifdef(`MAILER_TABLE', -` +ifdef(`_MAILER_usenet_', +`R$+ . USENET < @ $=w . > $#usenet $: $1 handle usenet specially', + `dnl') +ifdef(`_STICKY_LOCAL_DOMAIN_', +`R$+ < @ $=w . > $: < $H > $1 < @ $2 . > first try hub +R< $+ > $+ < $+ > $>95 < $1 > $2 < $3 > yep .... +R< > $+ + $* < $+ > $#_LOCAL_ $: $1 + $2 plussed name? +R< > $+ < $+ > $#_LOCAL_ $: @ $1 nope, local address', +`R$=L < @ $=w . > $#_LOCAL_ $: @ $1 special local names +R$+ < @ $=w . > $#_LOCAL_ $: $1 regular local name') + +define(`X', ifdef(`MAILER_TABLE', `', `#'))dnl # not local -- try mailer table lookup -R$* <@ $+ > $* $: < $2 > $1 < @ $2 > $3 extract host name -R< $+ . > $* $: < $1 > $2 strip trailing dot -R< $+ > $* $: < $(mailertable $1 $) > $2 lookup -R< $- : $+ > $* $# $1 $@ $2 $: $3 check -- resolved? -R< $+ > $* $: $>90 <$1> $2 try domain', -`dnl') +X`'R$* <@ $+ > $* $: < $2 > $1 < @ $2 > $3 extract host name +X`'R< $+ . > $* $: < $1 > $2 strip trailing dot +X`'R< $+ > $* $: < $(mailertable $1 $) > $2 lookup +X`'R< error : $- $+ > $* $#error $@ $1 $: $2 check -- error? +X`'R< $- : $+ > $* $# $1 $@ $2 $: $3 check -- resolved? +X`'R< $+ > $* $: $>90 <$1> $2 try domain +undefine(`X')dnl undivert(4)dnl ifdef(`_NO_UUCP_', `dnl', `# resolve remotely connected UUCP links (if any) ifdef(`_CLASS_V_', -`R$* < @ $=V . UUCP . > $* $: $>_SET_95_ < $V > $1 <@$2.UUCP.> $3', +`R$* < @ $=V . UUCP . > $* $: $>95 < $V > $1 <@$2.UUCP.> $3', `dnl') ifdef(`_CLASS_W_', -`R$* < @ $=W . UUCP . > $* $: $>_SET_95_ < $W > $1 <@$2.UUCP.> $3', +`R$* < @ $=W . UUCP . > $* $: $>95 < $W > $1 <@$2.UUCP.> $3', `dnl') ifdef(`_CLASS_X_', -`R$* < @ $=X . UUCP . > $* $: $>_SET_95_ < $X > $1 <@$2.UUCP.> $3', +`R$* < @ $=X . UUCP . > $* $: $>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', +`R$*<@$+.BITNET.>$* $: $>95 < $B > $1 <@$2.BITNET.> $3 user@host.BITNET', + `dnl') +ifdef(`DECNET_RELAY', +`R$*<@$+.DECNET.>$* $: $>95 < $C > $1 <@$2.DECNET.> $3 user@host.DECNET', `dnl') ifdef(`_MAILER_pop_', `R$+ < @ POP. > $#pop $: $1 user@POP', @@ -590,15 +688,15 @@ ifdef(`_MAILER_pop_', 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', +`R$*<@$+.FAX.>$* $: $>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', +R$*<@$*.UUCP.>$* $: $>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', +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 @@ -610,23 +708,16 @@ ifdef(`_LOCAL_RULES_', undivert(1)', `dnl') # pass names that still have a host to a smarthost (if defined) -R$* < @ $* > $* $: $>_SET_95_ < $S > $1 < @ $2 > $3 glue on smarthost name +R$* < @ $* > $* $: $>95 < $S > $1 < @ $2 > $3 glue on smarthost name # deal with other remote names ifdef(`_MAILER_smtp_', `R$* < @$* > $* $#_SMTP_ $@ $2 $: $1 < @ $2 > $3 user@host.domain', -`R$* < @$* > $* $#error $@NOHOST $: Unrecognized host name $2') - -ifdef(`_OLD_SENDMAIL_', -`# forward remaining names to local relay, if any -R$=L $#_LOCAL_ $: $1 special local names -R$+ $: $>_SET_95_ < $R > $1 try relay -R$+ $: $>_SET_95_ < $H > $1 try hub -R$+ $#_LOCAL_ $: $1 no relay or hub: local', +`R$* < @$* > $* $#error $@ 5.1.2 $: Unrecognized host name $2') -`# if this is quoted, strip the quotes and try again +# if this is quoted, strip the quotes and try again R$+ $: $(dequote $1 $) strip quotes -R$+ $=O $+ $@ $>_SET_97_ $1 $2 $3 try again +R$+ $=O $+ $@ $>97 $1 $2 $3 try again # handle locally delivered names R$=L $#_LOCAL_ $: @ $1 special local names @@ -634,49 +725,90 @@ R$+ $#_LOCAL_ $: $1 regular local names ########################################################################### ### Ruleset 5 -- special rewriting after aliases have been expanded ### -### (new sendmail only) ### ########################################################################### S5 +# deal with plussed users so aliases work nicely +R$+ + * $#_LOCAL_ $@ $&h $: $1 +R$+ + $* $#_LOCAL_ $@ $2 $: $1 + * + +# prepend an empty "forward host" on the front +R$+ $: <> $1 + +define(`X', ifdef(`LUSER_RELAY', `', `#'))dnl +# send unrecognized local users to a relay host +X`'R< > $+ + $* $: < $L . > $( user $1 $) + $2 +X`'R< > $+ $: < $L . > $( user $1 $) look up user +X`'R< $* > $+ <> $* $: < > $2 $3 found; strip $L +X`'R< $* . > $+ $: < $1 > $2 strip extra dot +undefine(`X')dnl + +# handle plussed local names +R< > $+ + $* $#_LOCAL_ $@ $2 $: $1 + # see if we have a relay or a hub -R$+ $: < $R > $1 try relay R< > $+ $: < $H > $1 try hub +R< > $+ $: < $R > $1 try relay R< > $+ $@ $1 nope, give up -R< $- : $+ > $+ $: $>_SET_95_ < $1 : $2 > $3 < @ $2 > -R< $+ > $+ $@ $>_SET_95_ < $1 > $2 < @ $1 >') -ifdef(`MAILER_TABLE', -` +R< $- : $+ > $+ $: $>95 < $1 : $2 > $3 < @ $2 > +R< $+ > $+ $@ $>95 < $1 > $2 < @ $1 > ################################################################### ### Ruleset 90 -- try domain part of mailertable entry ### -### (new sendmail only) ### ################################################################### -S90 -R$* <$- . $+ > $* $: $1$2 < $(mailertable .$3 $@ $1$2 $@ $2 $) > $4 -R$* <$- : $+ > $* $# $2 $@ $3 $: $4 check -- resolved? -R$* < . $+ > $* $@ $>90 $1 . <$2> $3 no -- strip & try again -R$* < $* > $* $: < $(mailertable . $@ $1$2 $) > $3 try "." -R<$- : $+ > $* $# $1 $@ $2 $: $3 "." found? -R< $* > $* $@ $2 no mailertable match', -`dnl') +define(`X', ifdef(`MAILER_TABLE', `', `#'))dnl +X`'S90 +X`'R$* <$- . $+ > $* $: $1$2 < $(mailertable .$3 $@ $1$2 $@ $2 $) > $4 +X`'R$* <$- : $+ > $* $# $2 $@ $3 $: $4 check -- resolved? +X`'R$* < . $+ > $* $@ $>90 $1 . <$2> $3 no -- strip & try again +X`'R$* < $* > $* $: < $(mailertable . $@ $1$2 $) > $3 try "." +X`'R<$- : $+ > $* $# $1 $@ $2 $: $3 "." found? +X`'R< $* > $* $@ $2 no mailertable match +undefine(`X')dnl ################################################################### -### Ruleset _SET_95_ -- canonify mailer:host syntax to triple ### +### Ruleset 95 -- canonify mailer:host syntax to triple ### ################################################################### -S`'_SET_95_ +S95 R< > $* $@ $1 strip off null relay R< $- : $+ > $* $# $1 $@ $2 $: $3 try qualified mailer R< $=w > $* $@ $2 delete local host R< $+ > $* $#_RELAY_ $@ $1 $: $2 use unqualified mailer ################################################################### -### Ruleset _SET_98_ -- local part of ruleset zero (can be null) ### +### Ruleset 93 -- convert header names to masqueraded form ### +################################################################### + +S93 +R$=E < @ *LOCAL* > $@ $1 < @ $j . > leave exposed +R$=E < @ $=M . > $@ $1 < @ $2 . > +ifdef(`_LIMITED_MASQUERADE_', `#')dnl +R$=E < @ $=w . > $@ $1 < @ $2 . > +R$* < @ $=M . > $* $: $1 < @ $2 . @ $M > $3 convert masqueraded doms +ifdef(`_LIMITED_MASQUERADE_', `#')dnl +R$* < @ $=w . > $* $: $1 < @ $2 . @ $M > $3 +R$* < @ *LOCAL* > $* $: $1 < @ $j . @ $M > $2 +R$* < @ $+ @ > $* $@ $1 < @ $2 > $3 $M is null +R$* < @ $+ @ $+ > $* $@ $1 < @ $3 . > $4 $M is not null + +################################################################### +### Ruleset 94 -- convert envelope names to masqueraded form ### +################################################################### + +S94 +ifdef(`_MASQUERADE_ENVELOPE_', `', `#')dnl +R$+ $@ $>93 $1 +ifdef(`_MASQUERADE_ENVELOPE_', `#', `')dnl +R$* < @ *LOCAL* > $* $: $1 < @ $j . > $2 + +################################################################### +### Ruleset 98 -- local part of ruleset zero (can be null) ### ################################################################### -S`'_SET_98_ +S98 undivert(3)dnl # ###################################################################### diff --git a/usr.sbin/sendmail/cf/m4/version.m4 b/usr.sbin/sendmail/cf/m4/version.m4 index d7abdd6ac44c0..fb8e96e144f3d 100644 --- a/usr.sbin/sendmail/cf/m4/version.m4 +++ b/usr.sbin/sendmail/cf/m4/version.m4 @@ -32,8 +32,8 @@ divert(-1) # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF # SUCH DAMAGE. # -VERSIONID(`@(#)version.m4 8.6.12.1 (Berkeley) 3/28/95') +VERSIONID(`@(#)version.m4 8.7.3.1 (Berkeley) 12/3/95') # divert(0) # Configuration version number -DZ8.6.12 +DZ8.7.3`'ifdef(`confCF_VERSION', `/confCF_VERSION') diff --git a/usr.sbin/sendmail/cf/mailer/fax.m4 b/usr.sbin/sendmail/cf/mailer/fax.m4 index 0c98a3bde1967..777fe01cf36a1 100644 --- a/usr.sbin/sendmail/cf/mailer/fax.m4 +++ b/usr.sbin/sendmail/cf/mailer/fax.m4 @@ -44,7 +44,10 @@ POPDIVERT ### FAX Mailer specification ### #################################### -VERSIONID(`@(#)fax.m4 8.2 (Berkeley) 1/24/94') +VERSIONID(`@(#)fax.m4 8.4 (Berkeley) 10/10/95') -Mfax, P=FAX_MAILER_PATH, F=DFMhu, S=14, R=24, M=FAX_MAILER_MAX, +Mfax, P=FAX_MAILER_PATH, F=DFMhu, S=14, R=24, M=FAX_MAILER_MAX, T=X-Phone/X-FAX/X-Unix, A=mailfax $u $h $f + +LOCAL_CONFIG +CPFAX diff --git a/usr.sbin/sendmail/cf/mailer/local.m4 b/usr.sbin/sendmail/cf/mailer/local.m4 index 24a820413cb17..124cbba752826 100644 --- a/usr.sbin/sendmail/cf/mailer/local.m4 +++ b/usr.sbin/sendmail/cf/mailer/local.m4 @@ -38,29 +38,57 @@ ifdef(`LOCAL_MAILER_ARGS',, `define(`LOCAL_MAILER_ARGS', `mail -d $u')') ifdef(`LOCAL_SHELL_FLAGS',, `define(`LOCAL_SHELL_FLAGS', `eu')') ifdef(`LOCAL_SHELL_PATH',, `define(`LOCAL_SHELL_PATH', /bin/sh)') ifdef(`LOCAL_SHELL_ARGS',, `define(`LOCAL_SHELL_ARGS', `sh -c $u')') +ifdef(`LOCAL_SHELL_DIR',, `define(`LOCAL_SHELL_DIR', `$z:/')') POPDIVERT ################################################## ### Local and Program Mailer specification ### ################################################## -VERSIONID(`@(#)local.m4 8.6 (Berkeley) 10/24/93') +VERSIONID(`@(#)local.m4 8.21 (Berkeley) 11/6/95') -Mlocal, P=LOCAL_MAILER_PATH, F=CONCAT(`lsDFM', LOCAL_MAILER_FLAGS), S=10, R=20/40, +Mlocal, P=LOCAL_MAILER_PATH, F=CONCAT(`lsDFMAw5:/|@', LOCAL_MAILER_FLAGS), S=10/30, R=20/40, + _OPTINS(`LOCAL_MAILER_MAX', `M=', `, ')_OPTINS(`LOCAL_MAILER_CHARSET', `C=', `, ')T=DNS/RFC822/X-Unix, A=LOCAL_MAILER_ARGS -Mprog, P=LOCAL_SHELL_PATH, F=CONCAT(`lsDFM', LOCAL_SHELL_FLAGS), S=10, R=20/40, D=$z:/, +Mprog, P=LOCAL_SHELL_PATH, F=CONCAT(`lsDFMo', LOCAL_SHELL_FLAGS), S=10/30, R=20/40, D=LOCAL_SHELL_DIR, + _OPTINS(`LOCAL_MAILER_MAX', `M=', `, ')T=X-Unix, A=LOCAL_SHELL_ARGS +# +# Envelope sender rewriting +# S10 R<@> $n errors to mailer-daemon -R$+ $: $>40 $1 +R$+ $: $>50 $1 add local domain if needed +R$* $: $>94 $1 do masquerading +# +# Envelope recipient rewriting +# S20 R$+ < @ $* > $: $1 strip host part +# +# Header sender rewriting +# +S30 +R<@> $n errors to mailer-daemon +R$+ $: $>50 $1 add local domain if needed +R$* $: $>93 $1 do masquerading + +# +# Header recipient rewriting +# S40 -ifdef(`_ALWAYS_ADD_DOMAIN_', -`R$* < @ $* > $* $@ $1 < @ $2 > $3 already fully qualified -R$* $: $1 @ $M add local qualification -R$* @ $: $1 @ $j if $M not defined', -`dnl') +R$+ $: $>50 $1 add local domain if needed +ifdef(`_ALL_MASQUERADE_', `', `#')dnl +R$* $: $>93 $1 do all-masquerading + +# +# Common code to add local domain name (only if always-add-domain) +# +S50 +ifdef(`_ALWAYS_ADD_DOMAIN_', `', `#')dnl +R$* < @ $* > $* $@ $1 < @ $2 > $3 already fully qualified +ifdef(`_ALWAYS_ADD_DOMAIN_', `', `#')dnl +R$+ $@ $1 < @ *LOCAL* > add local qualification diff --git a/usr.sbin/sendmail/cf/mailer/pop.m4 b/usr.sbin/sendmail/cf/mailer/pop.m4 index 92bcff9e79071..210a3c83a6fc0 100644 --- a/usr.sbin/sendmail/cf/mailer/pop.m4 +++ b/usr.sbin/sendmail/cf/mailer/pop.m4 @@ -34,7 +34,7 @@ PUSHDIVERT(-1) # ifdef(`POP_MAILER_PATH',, `define(`POP_MAILER_PATH', /usr/lib/mh/spop)') -ifdef(`POP_MAILER_FLAGS',, `define(`POP_MAILER_FLAGS', `eu')') +ifdef(`POP_MAILER_FLAGS',, `define(`POP_MAILER_FLAGS', `Penu')') ifdef(`POP_MAILER_ARGS',, `define(`POP_MAILER_ARGS', `pop $u')') POPDIVERT @@ -43,9 +43,9 @@ POPDIVERT ### POP Mailer specification ### #################################### -VERSIONID(`@(#)pop.m4 8.2 (Berkeley) 2/19/94') +VERSIONID(`@(#)pop.m4 8.5 (Berkeley) 4/23/95') -Mpop, P=POP_MAILER_PATH, F=CONCAT(`lsDFM', POP_MAILER_FLAGS), S=10, R=20/40, +Mpop, P=POP_MAILER_PATH, F=CONCAT(`lsDFM', POP_MAILER_FLAGS), S=10, R=20/40, T=DNS/RFC822/X-Unix, A=POP_MAILER_ARGS LOCAL_CONFIG diff --git a/usr.sbin/sendmail/cf/mailer/smtp.m4 b/usr.sbin/sendmail/cf/mailer/smtp.m4 index 45efbd68a81f5..6b59574e61e49 100644 --- a/usr.sbin/sendmail/cf/mailer/smtp.m4 +++ b/usr.sbin/sendmail/cf/mailer/smtp.m4 @@ -32,60 +32,64 @@ PUSHDIVERT(-1) # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF # SUCH DAMAGE. # -ifdef(`SMTP_MAILER_FLAGS',, - `define(`SMTP_MAILER_FLAGS', - `ifdef(`_OLD_SENDMAIL_', `L', `')')') +ifdef(`SMTP_MAILER_FLAGS',, `define(`SMTP_MAILER_FLAGS', `')') +ifdef(`SMTP_MAILER_ARGS',, `define(`SMTP_MAILER_ARGS', `IPC $h')') +ifdef(`ESMTP_MAILER_ARGS',, `define(`ESMTP_MAILER_ARGS', `IPC $h')') +ifdef(`SMTP8_MAILER_ARGS',, `define(`SMTP8_MAILER_ARGS', `IPC $h')') +ifdef(`RELAY_MAILER_ARGS',, `define(`RELAY_MAILER_ARGS', `IPC $h')') +ifdef(`_MAILER_uucp_', + `errprint(`*** MAILER(smtp) must appear before MAILER(uucp)')')dnl POPDIVERT ##################################### ### SMTP Mailer specification ### ##################################### -VERSIONID(`@(#)smtp.m4 8.15 (Berkeley) 2/14/94') - -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, ')ifdef(`SMTP_MAILER_MAX', `M=SMTP_MAILER_MAX, ')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, ')ifdef(`SMTP_MAILER_MAX', `M=SMTP_MAILER_MAX, ')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 +VERSIONID(`@(#)smtp.m4 8.32 (Berkeley) 11/20/95') + +Msmtp, P=[IPC], F=CONCAT(mDFMuX, SMTP_MAILER_FLAGS), S=11/31, R=ifdef(`_ALL_MASQUERADE_', `21/31', `21'), E=\r\n, L=990, + _OPTINS(`SMTP_MAILER_MAX', `M=', `, ')_OPTINS(`SMTP_MAILER_CHARSET', `C=', `, ')T=DNS/RFC822/SMTP, + A=SMTP_MAILER_ARGS +Mesmtp, P=[IPC], F=CONCAT(mDFMuXa, SMTP_MAILER_FLAGS), S=11/31, R=ifdef(`_ALL_MASQUERADE_', `21/31', `21'), E=\r\n, L=990, + _OPTINS(`SMTP_MAILER_MAX', `M=', `, ')_OPTINS(`SMTP_MAILER_CHARSET', `C=', `, ')T=DNS/RFC822/SMTP, + A=ESMTP_MAILER_ARGS +Msmtp8, P=[IPC], F=CONCAT(mDFMuX8, SMTP_MAILER_FLAGS), S=11/31, R=ifdef(`_ALL_MASQUERADE_', `21/31', `21'), E=\r\n, L=990, + _OPTINS(`SMTP_MAILER_MAX', `M=', `, ')_OPTINS(`SMTP_MAILER_CHARSET', `C=', `, ')T=DNS/RFC822/SMTP, + A=SMTP8_MAILER_ARGS +Mrelay, P=[IPC], F=CONCAT(mDFMuXa8, SMTP_MAILER_FLAGS), S=11/31, R=ifdef(`_ALL_MASQUERADE_', `61/71', `61'), E=\r\n, L=2040, + _OPTINS(`RELAY_MAILER_CHARSET', `C=', `, ')T=DNS/RFC822/SMTP, + A=RELAY_MAILER_ARGS # -# envelope sender and masquerading recipient rewriting +# envelope sender rewriting # S11 R$+ $: $>51 $1 sender/recipient common -R$* :; <@> $@ $1 :; list:; special case -R$* $@ $>61 $1 qualify unqual'ed names +R$* :; <@> $@ list:; special case +R$* $: $>61 $1 qualify unqual'ed names +R$+ $: $>94 $1 do masquerading # -# header recipient rewriting if not masquerading recipients +# envelope recipient rewriting -- +# also header recipient if not masquerading recipients # S21 - -# do sender/recipient common rewriting -R$+ $: $>51 $1 - -# unqualified names (e.g., "eric") are qualified by local host -R$* < @ $* > $* $@ $1 < @ $2 > $3 already qualified -R$+ $: $1 < @ $j > add local domain +R$+ $: $>51 $1 sender/recipient common +R$+ $: $>61 $1 qualify unqual'ed names # -# header sender and masquerading recipient rewriting +# header sender and masquerading header recipient rewriting # S31 R$+ $: $>51 $1 sender/recipient common -R$* :; <@> $@ $1 :; list:; special case +R:; <@> $@ list:; special case # do special header rewriting R$* <@> $* $@ $1 <@> $2 pass null host through R< @ $* > $* $@ < @ $1 > $2 pass route-addr through -R$=E < @ $=w . > $@ $1 < @ $2 > exposed user as is -R$* < @ $=w . > $: $1 < @ $2 @ $M > masquerade as domain -R$* < @ $+ @ > $@ $1 < @ $2 > in case $M undefined -R$* < @ $+ @ $+ > $@ $1 < @ $3 > $M is defined -- use it -R$* $@ $>61 $1 qualify unqual'ed names +R$* $: $>61 $1 qualify unqual'ed names +R$+ $: $>93 $1 do masquerading # @@ -110,9 +114,7 @@ R$+ < @ $* > $* $@ $1 < @ $2 > $3 not UUCP form 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') +R< $+ ! > $+ $: $1 ! $2 < @ *LOCAL* >') # @@ -120,7 +122,14 @@ R$+ < @ $+ : $+ > $: $1 < @ $3 > strip mailer: part') # S61 -R$* < @ $* > $* $@ $1 < @ $2 > $3 already qualified -R$=E $@ $1 < @ $j> show exposed names -R$+ $: $1 < @ $M > user w/o host -R$+ <@> $: $1 < @ $j > in case $M undefined +R$* < @ $* > $* $@ $1 < @ $2 > $3 already fully qualified +R$+ $@ $1 < @ *LOCAL* > add local qualification + + +# +# relay mailer header masquerading recipient rewriting +# +S71 + +R$+ $: $>61 $1 +R$+ $: $>93 $1 diff --git a/usr.sbin/sendmail/cf/mailer/usenet.m4 b/usr.sbin/sendmail/cf/mailer/usenet.m4 index fe6ee3071f8da..2abf3b072dbaa 100644 --- a/usr.sbin/sendmail/cf/mailer/usenet.m4 +++ b/usr.sbin/sendmail/cf/mailer/usenet.m4 @@ -41,7 +41,8 @@ POPDIVERT ### USENET Mailer specification ### #################################### -VERSIONID(`@(#)usenet.m4 8.3 (Berkeley) 1/24/94') +VERSIONID(`@(#)usenet.m4 8.5 (Berkeley) 4/26/95') -Musenet, P=USENET_MAILER_PATH, F=USENET_MAILER_FLAGS, S=10, R=20,ifdef(`USENET_MAILER_MAX', ` M=USENET_MAILER_MAX,') +Musenet, P=USENET_MAILER_PATH, F=USENET_MAILER_FLAGS, S=10, R=20, + _OPTINS(`USENET_MAILER_MAX', `M=', `, ')T=X-Usenet/X-Usenet/X-Unix, A=USENET_MAILER_ARGS $u diff --git a/usr.sbin/sendmail/cf/mailer/uucp.m4 b/usr.sbin/sendmail/cf/mailer/uucp.m4 index dd7aa87ff1850..0b6594971d039 100644 --- a/usr.sbin/sendmail/cf/mailer/uucp.m4 +++ b/usr.sbin/sendmail/cf/mailer/uucp.m4 @@ -34,15 +34,17 @@ PUSHDIVERT(-1) # ifdef(`UUCP_MAILER_PATH',, `define(`UUCP_MAILER_PATH', /usr/bin/uux)') -ifdef(`UUCP_MAILER_ARGS',, `define(`UUCP_MAILER_ARGS', `uux - -r -a$f -gC $h!rmail ($u)')') +ifdef(`UUCP_MAILER_ARGS',, `define(`UUCP_MAILER_ARGS', `uux - -r -a$g -gC $h!rmail ($u)')') ifdef(`UUCP_MAILER_FLAGS',, `define(`UUCP_MAILER_FLAGS', `')') -ifdef(`UUCP_MAX_SIZE',, `define(`UUCP_MAX_SIZE', 100000)') +ifdef(`UUCP_MAILER_MAX',, + `define(`UUCP_MAILER_MAX', + `ifdef(`UUCP_MAX_SIZE', `UUCP_MAX_SIZE', 100000)')') POPDIVERT ##################################### ### UUCP Mailer specification ### ##################################### -VERSIONID(`@(#)uucp.m4 8.16 (Berkeley) 4/14/94') +VERSIONID(`@(#)uucp.m4 8.24 (Berkeley) 9/5/95') # # There are innumerable variations on the UUCP mailer. It really @@ -50,24 +52,30 @@ VERSIONID(`@(#)uucp.m4 8.16 (Berkeley) 4/14/94') # # old UUCP mailer (two names) -Muucp, P=UUCP_MAILER_PATH, F=CONCAT(DFMhuU, UUCP_MAILER_FLAGS), S=12, R=22/42, M=UUCP_MAX_SIZE, +Muucp, P=UUCP_MAILER_PATH, F=CONCAT(DFMhuUd, UUCP_MAILER_FLAGS), S=12, R=22/42, M=UUCP_MAILER_MAX, + _OPTINS(`UUCP_MAILER_CHARSET', `C=', `, ')T=X-UUCP/X-UUCP/X-Unix, A=UUCP_MAILER_ARGS -Muucp-old, P=UUCP_MAILER_PATH, F=CONCAT(DFMhuU, UUCP_MAILER_FLAGS), S=12, R=22/42, M=UUCP_MAX_SIZE, +Muucp-old, P=UUCP_MAILER_PATH, F=CONCAT(DFMhuUd, UUCP_MAILER_FLAGS), S=12, R=22/42, M=UUCP_MAILER_MAX, + _OPTINS(`UUCP_MAILER_CHARSET', `C=', `, ')T=X-UUCP/X-UUCP/X-Unix, 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/42, M=UUCP_MAX_SIZE, +Msuucp, P=UUCP_MAILER_PATH, F=CONCAT(mDFMhuUd, UUCP_MAILER_FLAGS), S=12, R=22/42, M=UUCP_MAILER_MAX, + _OPTINS(`UUCP_MAILER_CHARSET', `C=', `, ')T=X-UUCP/X-UUCP/X-Unix, A=UUCP_MAILER_ARGS -Muucp-new, P=UUCP_MAILER_PATH, F=CONCAT(mDFMhuU, UUCP_MAILER_FLAGS), S=12, R=22/42, M=UUCP_MAX_SIZE, +Muucp-new, P=UUCP_MAILER_PATH, F=CONCAT(mDFMhuUd, UUCP_MAILER_FLAGS), S=12, R=22/42, M=UUCP_MAILER_MAX, + _OPTINS(`UUCP_MAILER_CHARSET', `C=', `, ')T=X-UUCP/X-UUCP/X-Unix, 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, +Muucp-dom, P=UUCP_MAILER_PATH, F=CONCAT(mDFMhud, UUCP_MAILER_FLAGS), S=52/31, R=ifdef(`_ALL_MASQUERADE_', `21/31', `21'), M=UUCP_MAILER_MAX, + _OPTINS(`UUCP_MAILER_CHARSET', `C=', `, ')T=X-UUCP/X-UUCP/X-Unix, 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, +Muucp-uudom, P=UUCP_MAILER_PATH, F=CONCAT(mDFMhud, UUCP_MAILER_FLAGS), S=72/31, R=ifdef(`_ALL_MASQUERADE_', `21/31', `21'), M=UUCP_MAILER_MAX, + _OPTINS(`UUCP_MAILER_CHARSET', `C=', `, ')T=X-UUCP/X-UUCP/X-Unix, A=UUCP_MAILER_ARGS') @@ -79,10 +87,10 @@ S12 # handle error address as a special case R<@> $n errors to mailer-daemon -# do not qualify list:; syntax -R$* :; <@> $@ $1 :; +# list:; syntax should disappear +R:; <@> $@ -R$* < @ $* . > $1 < @ $2 > strip trailing dots +R$* < @ $* . > $* $1 < @ $2 > $3 strip trailing dots R$* < @ $=w > $1 strip local name R<@ $- . UUCP > : $+ $1 ! $2 convert to UUCP format R<@ $+ > : $+ $1 ! $2 convert to UUCP format @@ -98,10 +106,10 @@ R! $+ $: $k ! $1 in case $U undefined # S22 -# don't touch list:; syntax -R$* :; <@> $@ $1 :; +# list:; should disappear +R:; <@> $@ -R$* < @ $* . > $1 < @ $2 > strip trailing dots +R$* < @ $* . > $* $1 < @ $2 > $3 strip trailing dots R$* < @ $j > $1 strip local name R<@ $- . UUCP > : $+ $1 ! $2 convert to UUCP format R<@ $+ > : $+ $1 ! $2 convert to UUCP format @@ -113,10 +121,10 @@ R$* < @ $+ > $2 ! $1 convert to UUCP format # S42 -# don't touch list:; syntax -R$* :; <@> $@ $1 :; +# list:; syntax should disappear +R:; <@> $@ -R$* < @ $* . > $1 < @ $2 > strip trailing dots +R$* < @ $* . > $* $1 < @ $2 > $3 strip trailing dots R$* < @ $j > $1 strip local name R<@ $- . UUCP > : $+ $1 ! $2 convert to UUCP format R<@ $+ > : $+ $1 ! $2 convert to UUCP format @@ -148,20 +156,14 @@ S72 # handle error address as a special case R<@> $n errors to mailer-daemon -# do not qualify list:; syntax -R$* :; <@> $@ $1 :; +# do standard SMTP mailer rewriting +R$* $: $>11 $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') +R$* < @ $* . > $* $1 < @ $2 > $3 strip trailing dots +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') PUSHDIVERT(4) diff --git a/usr.sbin/sendmail/cf/ostype/aix3.m4 b/usr.sbin/sendmail/cf/ostype/aix3.m4 index 4411fd0645127..19763422fe3c0 100644 --- a/usr.sbin/sendmail/cf/ostype/aix3.m4 +++ b/usr.sbin/sendmail/cf/ostype/aix3.m4 @@ -34,7 +34,8 @@ divert(-1) # divert(0) -VERSIONID(`@(#)aix3.m4 8.3 (Berkeley) 8/8/93') -define(`LOCAL_MAILER_PATH', /bin/bellmail)dnl -define(`LOCAL_MAILER_ARGS', mail $u)dnl -define(`LOCAL_MAILER_FLAGS', `mn')dnl +VERSIONID(`@(#)aix3.m4 8.5 (Berkeley) 11/13/95') +ifdef(`LOCAL_MAILER_PATH',, `define(`LOCAL_MAILER_PATH', /bin/bellmail)')dnl +ifdef(`LOCAL_MAILER_ARGS',, `define(`LOCAL_MAILER_ARGS', mail $u)')dnl +ifdef(`LOCAL_MAILER_FLAGS',, `define(`LOCAL_MAILER_FLAGS', `mn')')dnl +define(`confTIME_ZONE', `USE_TZ')dnl diff --git a/usr.sbin/sendmail/cf/ostype/aux.m4 b/usr.sbin/sendmail/cf/ostype/aux.m4 index b7ea47ba14624..3c60eb13a62a6 100644 --- a/usr.sbin/sendmail/cf/ostype/aux.m4 +++ b/usr.sbin/sendmail/cf/ostype/aux.m4 @@ -34,10 +34,10 @@ divert(-1) # divert(0) -VERSIONID(`@(#)aux.m4 8.1 (Berkeley) 9/2/93') -define(`ALIAS_FILE', /usr/lib/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_FLAGS', mn)dnl -define(`LOCAL_MAILER_ARGS', `mail -d -r $f $u')dnl +VERSIONID(`@(#)aux.m4 8.2 (Berkeley) 11/13/95') +ifdef(`ALIAS_FILE',, `define(`ALIAS_FILE', /usr/lib/aliases)')dnl +ifdef(`QUEUE_DIR',, `define(`QUEUE_DIR', /usr/spool/mqueue)')dnl +ifdef(`STATUS_FILE',, `define(`STATUS_FILE', /usr/lib/sendmail.st)')dnl +ifdef(`UUCP_MAILER_PATH',, `define(`UUCP_MAILER_PATH', /usr/bin/uux)')dnl +ifdef(`LOCAL_MAILER_FLAGS',, `define(`LOCAL_MAILER_FLAGS', mn)')dnl +ifdef(`LOCAL_MAILER_ARGS',, `define(`LOCAL_MAILER_ARGS', `mail -d -r $f $u')')dnl diff --git a/usr.sbin/sendmail/cf/ostype/bsd4.3.m4 b/usr.sbin/sendmail/cf/ostype/bsd4.3.m4 index 32aac4d7b431f..546fd376c93c5 100644 --- a/usr.sbin/sendmail/cf/ostype/bsd4.3.m4 +++ b/usr.sbin/sendmail/cf/ostype/bsd4.3.m4 @@ -34,6 +34,6 @@ divert(-1) # divert(0) -VERSIONID(`@(#)bsd4.3.m4 8.2 (Berkeley) 2/10/94') -define(`QUEUE_DIR', /usr/spool/mqueue)dnl -define(`UUCP_MAILER_ARGS', `uux - -r -z -a$f $h!rmail ($u)')dnl +VERSIONID(`@(#)bsd4.3.m4 8.4 (Berkeley) 11/13/95') +ifdef(`QUEUE_DIR',, `define(`QUEUE_DIR', /usr/spool/mqueue)')dnl +ifdef(`UUCP_MAILER_ARGS',, `define(`UUCP_MAILER_ARGS', `uux - -r -z -a$g $h!rmail ($u)')')dnl diff --git a/usr.sbin/sendmail/cf/ostype/bsd4.4.m4 b/usr.sbin/sendmail/cf/ostype/bsd4.4.m4 index 1950528902be8..835e4d89c6c11 100644 --- a/usr.sbin/sendmail/cf/ostype/bsd4.4.m4 +++ b/usr.sbin/sendmail/cf/ostype/bsd4.4.m4 @@ -35,8 +35,8 @@ divert(-1) # divert(0) -VERSIONID(`@(#)bsd4.4.m4 8.2 (Berkeley) 2/10/94') -define(`HELP_FILE', /usr/share/misc/sendmail.hf)dnl -define(`STATUS_FILE', /var/log/sendmail.st)dnl -define(`LOCAL_MAILER_PATH', /usr/libexec/mail.local)dnl -define(`UUCP_MAILER_ARGS', `uux - -r -z -a$f $h!rmail ($u)')dnl +VERSIONID(`@(#)bsd4.4.m4 8.4 (Berkeley) 11/13/95') +ifdef(`HELP_FILE',, `define(`HELP_FILE', /usr/share/misc/sendmail.hf)')dnl +ifdef(`STATUS_FILE',, `define(`STATUS_FILE', /var/log/sendmail.st)')dnl +ifdef(`LOCAL_MAILER_PATH',, `define(`LOCAL_MAILER_PATH', /usr/libexec/mail.local)')dnl +ifdef(`UUCP_MAILER_ARGS',, `define(`UUCP_MAILER_ARGS', `uux - -r -z -a$g $h!rmail ($u)')')dnl diff --git a/usr.sbin/sendmail/cf/ostype/bsdi1.0.m4 b/usr.sbin/sendmail/cf/ostype/bsdi1.0.m4 index 28088f000521d..8bc3c218b41ec 100644 --- a/usr.sbin/sendmail/cf/ostype/bsdi1.0.m4 +++ b/usr.sbin/sendmail/cf/ostype/bsdi1.0.m4 @@ -34,5 +34,5 @@ divert(-1) # divert(0) -VERSIONID(`@(#)bsdi1.0.m4 8.1 (Berkeley) 12/11/93')dnl -OSTYPE(bsd4.4) +VERSIONID(`@(#)bsdi1.0.m4 8.2 (Berkeley) 8/16/95')dnl +include(_CF_DIR_`'ostype/bsd4.4.m4)dnl diff --git a/usr.sbin/sendmail/cf/ostype/dgux.m4 b/usr.sbin/sendmail/cf/ostype/dgux.m4 index 38c1c1a0c8175..e78ce3bca5aa9 100644 --- a/usr.sbin/sendmail/cf/ostype/dgux.m4 +++ b/usr.sbin/sendmail/cf/ostype/dgux.m4 @@ -34,6 +34,6 @@ divert(-1) # divert(0) -VERSIONID(`@(#)dgux.m4 8.1 (Berkeley) 11/27/93') -define(`LOCAL_MAILER_FLAGS', m)dnl +VERSIONID(`@(#)dgux.m4 8.2 (Berkeley) 11/13/95') +ifdef(`LOCAL_MAILER_FLAGS',, `define(`LOCAL_MAILER_FLAGS', m)')dnl define(`confTIME_ZONE', `USE_TZ')dnl diff --git a/usr.sbin/sendmail/cf/ostype/domainos.m4 b/usr.sbin/sendmail/cf/ostype/domainos.m4 index 6c214e6e22b08..65329f3e17286 100644 --- a/usr.sbin/sendmail/cf/ostype/domainos.m4 +++ b/usr.sbin/sendmail/cf/ostype/domainos.m4 @@ -34,9 +34,9 @@ divert(-1) # divert(0) -VERSIONID(`@(#)domainos.m4 8.1 (Berkeley) 1/23/94') +VERSIONID(`@(#)domainos.m4 8.2 (Berkeley) 11/13/95') divert(-1) -define(`ALIAS_FILE', /usr/lib/aliases) -define(`STATUS_FILE', /usr/lib/sendmail.st) -define(`QUEUE_DIR', /usr/spool/mqueue) +ifdef(`ALIAS_FILE',, `define(`ALIAS_FILE', /usr/lib/aliases)') +ifdef(`STATUS_FILE',, `define(`STATUS_FILE', /usr/lib/sendmail.st)') +ifdef(`QUEUE_DIR',, `define(`QUEUE_DIR', /usr/spool/mqueue)') diff --git a/usr.sbin/sendmail/cf/ostype/dynix3.2.m4 b/usr.sbin/sendmail/cf/ostype/dynix3.2.m4 index a4d6e527a8f05..149f6ad3a6fc4 100644 --- a/usr.sbin/sendmail/cf/ostype/dynix3.2.m4 +++ b/usr.sbin/sendmail/cf/ostype/dynix3.2.m4 @@ -34,6 +34,6 @@ divert(-1) # 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 +VERSIONID(`@(#)dynix3.2.m4 8.2 (Berkeley) 11/13/95') +ifdef(`ALIAS_FILE',, `define(`ALIAS_FILE', /usr/lib/aliases)')dnl +ifdef(`QUEUE_DIR',, `define(`QUEUE_DIR', /usr/spool/mqueue)')dnl diff --git a/usr.sbin/sendmail/cf/ostype/hpux.m4 b/usr.sbin/sendmail/cf/ostype/hpux.m4 deleted file mode 100644 index 1be21f36c3c17..0000000000000 --- a/usr.sbin/sendmail/cf/ostype/hpux.m4 +++ /dev/null @@ -1,44 +0,0 @@ -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(`@(#)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 diff --git a/usr.sbin/sendmail/cf/ostype/irix.m4 b/usr.sbin/sendmail/cf/ostype/irix.m4 deleted file mode 100644 index 6cd7fc9a9599e..0000000000000 --- a/usr.sbin/sendmail/cf/ostype/irix.m4 +++ /dev/null @@ -1,41 +0,0 @@ -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(`@(#)irix.m4 8.4 (Berkeley) 2/1/94') -define(`LOCAL_MAILER_FLAGS', Ehm)dnl -define(`QUEUE_DIR', /usr/spool/mqueue)dnl -define(`ALIAS_FILE', /usr/lib/aliases)dnl -define(`STATUS_FILE', /usr/lib/sendmail.st)dnl diff --git a/usr.sbin/sendmail/cf/ostype/nextstep.m4 b/usr.sbin/sendmail/cf/ostype/nextstep.m4 index 8144c3e69012a..515757aaf82b3 100644 --- a/usr.sbin/sendmail/cf/ostype/nextstep.m4 +++ b/usr.sbin/sendmail/cf/ostype/nextstep.m4 @@ -34,11 +34,11 @@ divert(-1) # 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 +VERSIONID(`@(#)nextstep.m4 8.5 (Berkeley) 11/13/95') +ifdef(`ALIAS_FILE',, `define(`ALIAS_FILE', /etc/sendmail/aliases)')dnl +ifdef(`HELP_FILE',, `define(`HELP_FILE', /usr/lib/sendmail.hf)')dnl +ifdef(`STATUS_FILE',, `define(`STATUS_FILE', /etc/sendmail/sendmail.st)')dnl +ifdef(`UUCP_MAILER_PATH',, `define(`UUCP_MAILER_PATH', /usr/bin/uux)')dnl +ifdef(`QUEUE_DIR',, `define(`QUEUE_DIR', /usr/spool/mqueue)')dnl +ifdef(`LOCAL_MAILER_FLAGS',, `define(`LOCAL_MAILER_FLAGS', `rmnP')')dnl +ifdef(`LOCAL_SHELL_FLAGS',, `define(`LOCAL_SHELL_FLAGS', `euP')')dnl diff --git a/usr.sbin/sendmail/cf/ostype/osf1.m4 b/usr.sbin/sendmail/cf/ostype/osf1.m4 index fbc4832026e89..107cd75071715 100644 --- a/usr.sbin/sendmail/cf/ostype/osf1.m4 +++ b/usr.sbin/sendmail/cf/ostype/osf1.m4 @@ -34,8 +34,7 @@ divert(-1) # divert(0) -VERSIONID(`@(#)osf1.m4 8.1 (Berkeley) 6/7/93') -ifdef(`_OLD_SENDMAIL_', `define(`NEED_DOMAIN', `')')dnl -define(`ALIAS_FILE', /usr/adm/sendmail/aliases)dnl -define(`STATUS_FILE', /usr/adm/sendmail/sendmail.st)dnl -define(`HELP_FILE', /usr/share/lib/sendmail.hf)dnl +VERSIONID(`@(#)osf1.m4 8.3 (Berkeley) 11/13/95') +ifdef(`ALIAS_FILE',, `define(`ALIAS_FILE', /usr/adm/sendmail/aliases)')dnl +ifdef(`STATUS_FILE',, `define(`STATUS_FILE', /usr/adm/sendmail/sendmail.st)')dnl +ifdef(`HELP_FILE',, `define(`HELP_FILE', /usr/share/lib/sendmail.hf)')dnl diff --git a/usr.sbin/sendmail/cf/ostype/riscos4.5.m4 b/usr.sbin/sendmail/cf/ostype/riscos4.5.m4 index b45b25263fd33..7e8f382d0e0e7 100644 --- a/usr.sbin/sendmail/cf/ostype/riscos4.5.m4 +++ b/usr.sbin/sendmail/cf/ostype/riscos4.5.m4 @@ -34,9 +34,9 @@ divert(-1) # divert(0) -VERSIONID(`@(#)riscos4.5.m4 8.2 (Berkeley) 12/1/93') +VERSIONID(`@(#)riscos4.5.m4 8.3 (Berkeley) 11/13/95') -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 +ifdef(`LOCAL_MAILER_ARGS',, `define(`LOCAL_MAILER_ARGS', `rmail -d $u')')dnl +ifdef(`ALIAS_FILE',, `define(`ALIAS_FILE', `/usr/lib/aliases')')dnl +ifdef(`QUEUE_DIR',, `define(`QUEUE_DIR', `/usr/spool/mqueue')')dnl +ifdef(`HELP_FILE',, `define(`HELP_FILE', `/usr/lib/sendmail.hf')')dnl diff --git a/usr.sbin/sendmail/cf/ostype/sco3.2.m4 b/usr.sbin/sendmail/cf/ostype/sco3.2.m4 index f336b34d13a9f..06fc050197c35 100644 --- a/usr.sbin/sendmail/cf/ostype/sco3.2.m4 +++ b/usr.sbin/sendmail/cf/ostype/sco3.2.m4 @@ -34,12 +34,12 @@ divert(-1) # divert(0) -VERSIONID(`@(#)sco3.2.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 +VERSIONID(`@(#)sco3.2.m4 8.2 (Berkeley) 11/13/95') +ifdef(`ALIAS_FILE',, `define(`ALIAS_FILE', /usr/lib/mail/aliases)')dnl +ifdef(`QUEUE_DIR',, `define(`QUEUE_DIR', /usr/spool/mqueue)')dnl +ifdef(`STATUS_FILE',, `define(`STATUS_FILE', /usr/lib/sendmail.st)')dnl +ifdef(`UUCP_MAILER_PATH',, `define(`UUCP_MAILER_PATH', /usr/bin/uux)')dnl +ifdef(`LOCAL_MAILER_PATH',, `define(`LOCAL_MAILER_PATH', /usr/bin/lmail)')dnl +ifdef(`LOCAL_MAILER_FLAGS',, `define(`LOCAL_MAILER_FLAGS', PuhCE)')dnl +ifdef(`LOCAL_MAILER_ARGS',, `define(`LOCAL_MAILER_ARGS', `lmail $u')')dnl +ifdef(`LOCAL_SHELL_FLAGS',, `define(`LOCAL_SHELL_FLAGS', Peu)')dnl diff --git a/usr.sbin/sendmail/cf/ostype/solaris2.m4 b/usr.sbin/sendmail/cf/ostype/solaris2.m4 index 5e87027253d2e..9a7b0703ecbb3 100644 --- a/usr.sbin/sendmail/cf/ostype/solaris2.m4 +++ b/usr.sbin/sendmail/cf/ostype/solaris2.m4 @@ -34,10 +34,12 @@ divert(-1) # divert(0) -VERSIONID(`@(#)solaris2.m4 8.2 (Berkeley) 1/23/94') +VERSIONID(`@(#)solaris2.m4 8.6 (Berkeley) 11/13/95') divert(-1) -define(`ALIAS_FILE', /etc/mail/aliases) -define(`HELP_FILE', /etc/mail/sendmail.hf) -define(`STATUS_FILE', /etc/mail/sendmail.st) -define(`LOCAL_MAILER_FLAGS', `fSn') +ifdef(`ALIAS_FILE',, `define(`ALIAS_FILE', /etc/mail/aliases)') +ifdef(`HELP_FILE',, `define(`HELP_FILE', /etc/mail/sendmail.hf)') +ifdef(`STATUS_FILE',, `define(`STATUS_FILE', /etc/mail/sendmail.st)') +ifdef(`LOCAL_MAILER_FLAGS',, `define(`LOCAL_MAILER_FLAGS', `SnE')') +ifdef(`LOCAL_MAILER_ARGS',, `define(`LOCAL_MAILER_ARGS', `mail -f $g -d $u')') +define(`confCW_FILE', /etc/mail/sendmail.cw) diff --git a/usr.sbin/sendmail/cf/ostype/svr4.m4 b/usr.sbin/sendmail/cf/ostype/svr4.m4 index dd50127d4e1a8..ae18c1038b7eb 100644 --- a/usr.sbin/sendmail/cf/ostype/svr4.m4 +++ b/usr.sbin/sendmail/cf/ostype/svr4.m4 @@ -34,7 +34,7 @@ divert(-1) # divert(0) -VERSIONID(`@(#)svr4.m4 8.1 (Berkeley) 8/24/93') +VERSIONID(`@(#)svr4.m4 8.2 (Berkeley) 5/26/95') ifdef(`ALIAS_FILE',,`define(`ALIAS_FILE', /usr/ucblib/aliases)')dnl ifdef(`HELP_FILE',,`define(`HELP_FILE', /usr/ucblib/sendmail.hf)')dnl @@ -42,4 +42,4 @@ ifdef(`STATUS_FILE',,`define(`STATUS_FILE', /usr/ucblib/sendmail.st)')dnl define(`LOCAL_MAILER_PATH', `/usr/ucblib/binmail')dnl define(`LOCAL_MAILER_FLAGS', `rmn')dnl define(`LOCAL_SHELL_FLAGS', `ehuP')dnl -define(`UUCP_MAILER_ARGS', `uux - -r -a$f -gmedium $h!rmail ($u)')dnl +define(`UUCP_MAILER_ARGS', `uux - -r -a$g -gmedium $h!rmail ($u)')dnl diff --git a/usr.sbin/sendmail/cf/ostype/ultrix4.1.m4 b/usr.sbin/sendmail/cf/ostype/ultrix4.1.m4 deleted file mode 100644 index 87c4425bc10ef..0000000000000 --- a/usr.sbin/sendmail/cf/ostype/ultrix4.1.m4 +++ /dev/null @@ -1,38 +0,0 @@ -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(`@(#)ultrix4.1.m4 8.1 (Berkeley) 6/7/93') -ifdef(`_OLD_SENDMAIL_', `define(`NEED_DOMAIN', `')')dnl diff --git a/usr.sbin/sendmail/cf/sh/makeinfo.sh b/usr.sbin/sendmail/cf/sh/makeinfo.sh index dd5044afe972c..68b85d30c6a27 100644 --- a/usr.sbin/sendmail/cf/sh/makeinfo.sh +++ b/usr.sbin/sendmail/cf/sh/makeinfo.sh @@ -32,7 +32,7 @@ # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF # SUCH DAMAGE. # -# @(#)makeinfo.sh 8.4 (Berkeley) 3/4/94 +# @(#)makeinfo.sh 8.6 (Berkeley) 8/6/95 # usewhoami=0 @@ -75,3 +75,5 @@ else fi echo '#####' built by $user@$host on `date` echo '#####' in `pwd` | sed 's/\/tmp_mnt//' +echo '#####' using $1 as configuration include directory | sed 's/\/tmp_mnt//' +echo "define(\`__HOST__', $host)dnl" diff --git a/usr.sbin/sendmail/contrib/bitdomain.c b/usr.sbin/sendmail/contrib/bitdomain.c index d5e854935932b..720b9a1a4a5a2 100644 --- a/usr.sbin/sendmail/contrib/bitdomain.c +++ b/usr.sbin/sendmail/contrib/bitdomain.c @@ -1,6 +1,6 @@ /* * By John G. Myers, jgm+@cmu.edu - * Version 1.1 + * Version 1.2 * * Process a BITNET "internet.listing" file, producing output * suitable for input to makemap. @@ -154,7 +154,7 @@ char *domainlen; * if "domain" doesn't have a domain expansion already. */ p = lookup(domain); - if (!p || !index(p, '.')) remember(domain, otherdomain); + if (!p || !strchr(p, '.')) remember(domain, otherdomain); } } else { @@ -167,7 +167,7 @@ char *domainlen; * have a domain expansion, give it the expansion "domain". */ p = lookup(otherdomain); - if (!p || !index(p, '.')) remember(otherdomain, domain); + if (!p || !strchr(p, '.')) remember(otherdomain, domain); } } else { diff --git a/usr.sbin/sendmail/contrib/expn.pl b/usr.sbin/sendmail/contrib/expn.pl index 495db73473c4b..243729853866a 100755 --- a/usr.sbin/sendmail/contrib/expn.pl +++ b/usr.sbin/sendmail/contrib/expn.pl @@ -1,20 +1,19 @@ -#!/usr/local/bin/perl +#!/usr/bin/perl 'di '; 'ds 00 \\"'; -'ig00 '; +'ig 00 '; # # THIS PROGRAM IS ITS OWN MANUAL PAGE. INSTALL IN man & bin. # # hardcoded constants, should work fine for BSD-based systems -$AF_INET = 2; -$SOCK_STREAM = 1; +require 'sys/socket.ph'; $sockaddr = 'S n a4 x8'; # system requirements: # must have 'nslookup' and 'hostname' programs. -# $Header: /home/muir/bin/RCS/expn,v 3.6 1994/02/23 22:26:19 muir Exp muir $ +# $Header: /home/ncvs/src/usr.sbin/sendmail/contrib/expn.pl,v 1.1.1.2 1995/12/02 17:30:09 peter Exp $ # TODO: # less magic should apply to command-line addresses @@ -70,7 +69,7 @@ $sockaddr = 'S n a4 x8'; # ask each server in turn a whole bunch of questions, addresses to # be expanded are queued up. # -# This means that all account w.r.t. an address must be stored in +# This means that all accounting w.r.t. an address must be stored in # various arrays. Generally these arrays are indexed by the # string "$addr *** $server" where $addr is the address to be # expanded "foo" or maybe "foo@bar" and $server is the hostname @@ -102,13 +101,18 @@ $sockaddr = 'S n a4 x8'; $have_nslookup = 1; # we have the nslookup program $port = 'smtp'; $av0 = $0; -$0 = "$av0 - running hostname"; $ENV{'PATH'} .= ":/usr/etc" unless $ENV{'PATH'} =~ m,/usr/etc,; -chop($hostname = `hostname`); +$ENV{'PATH'} .= ":/usr/ucb" unless $ENV{'PATH'} =~ m,/usr/ucb,; select(STDERR); -$usage = "Usage: $av0 [-1avwd] user[@host] [user2[host2] ...]"; +$0 = "$av0 - running hostname"; +chop($name = `hostname || uname -n`); + +$0 = "$av0 - lookup host FQDN and IP addr"; +($hostname,$aliases,$type,$len,$thisaddr) = gethostbyname($name); + $0 = "$av0 - parsing args"; +$usage = "Usage: $av0 [-1avwd] user[\@host] [user2[host2] ...]"; for $a (@ARGV) { die $usage if $a eq "-"; while ($a =~ s/^(-.*)([1avwd])/$1/) { @@ -143,8 +147,7 @@ $0 = "$av0 - building local socket"; ($name,$aliases,$proto) = getprotobyname('tcp'); ($name,$aliases,$port) = getservbyname($port,'tcp') unless $port =~ /^\d+/; -($name,$aliases,$type,$len,$thisaddr) = gethostbyname($hostname); -$this = pack($sockaddr, $AF_INET, 0, $thisaddr); +$this = pack($sockaddr, &AF_INET, 0, $thisaddr); HOST: while (@hosts) { @@ -174,8 +177,8 @@ while (@hosts) { # get a connection, or look for an mx $0 = "$av0 - socket to $server"; - $that = pack($sockaddr, $AF_INET, $port, $thataddr); - socket(S, $AF_INET, $SOCK_STREAM, $proto) + $that = pack($sockaddr, &AF_INET, $port, $thataddr); + socket(S, &AF_INET, &SOCK_STREAM, $proto) || die "socket: $!"; $0 = "$av0 - bind to $server"; bind(S, $this) @@ -200,8 +203,8 @@ while (@hosts) { print if $watch; if (/^(\d+)([- ])/) { if ($1 != 220) { - $0 = "$av0 - bad numeric responce from $server"; - &alarm("giving up after bet responce from $server",''); + $0 = "$av0 - bad numeric response from $server"; + &alarm("giving up after bad response from $server",''); &read_response($2,$watch); alarm(0); print STDERR "$server: NOT 220 greeting: $_" @@ -213,7 +216,7 @@ while (@hosts) { } last if ($2 eq " "); } else { - $0 = "$av0 - bad responce from $server"; + $0 = "$av0 - bad response from $server"; print STDERR "$server: NOT 220 greeting: $_" if ($debug || $vw); unless (&mxlookup(0,$server,"$server: did not respond with SMTP codes",*users)) { @@ -261,7 +264,9 @@ while (@hosts) { @toExpn = (); } - ($ecode,@expansion) = &expn_vrfy($u,$server); +# ($ecode,@expansion) = &expn_vrfy($u,$server); + (@foo) = &expn_vrfy($u,$server); + ($ecode,@expansion) = @foo; if ($ecode) { &giveup('',$ecode,$u); last USER; @@ -329,7 +334,7 @@ while (@hosts) { # 550 is a known code... Should the be # included in -a output? Might be a bug # here. Does it matter? Can assume that - # there won't be UNKNOWN USER responces + # there won't be UNKNOWN USER responses # mixed with valid users? if ($s =~ /^(550)([- ])/) { if ($valid) { @@ -414,6 +419,8 @@ sub giveup { local($redirect_okay,$reason,$user) = @_; local($us,@so,$nh,@remaining_users); + local($pk,$file,$line); + ($pk, $file, $line) = caller; $0 = "$av0 - giving up on $server: $reason"; # @@ -427,7 +434,7 @@ sub giveup $giveup{$server} = $reason; print STDERR "$reason\n"; } - print "Giveup!!! redirect okay = $redirect_okay; $reason\n" if $debug; + print "Giveup at $file:$line!!! redirect okay = $redirect_okay; $reason\n" if $debug; # # Wait! # Before giving up, see if there is a chance that @@ -486,7 +493,7 @@ sub try_fallback if (defined $fellback{$us}) { # # Undo a previous fallback so that we can try again - # Nest fallbacks are avoided because they could + # Nested fallbacks are avoided because they could # lead to infinite loops # $fallhost = $fellback{$us}; @@ -579,7 +586,7 @@ sub do_validAddr # # Ranking of inputs: best: user@host.domain, okay: user # -# Return value: $error_string, @responces_from_server +# Return value: $error_string, @responses_from_server sub expn_vrfy { local($u,$server) = @_; @@ -594,7 +601,7 @@ sub expn_vrfy TRY: for $c (@c) { for $try_u (@try_u) { - &alarm("$c'ing $try_u on $server",'',$u); + &alarm("${c}'ing $try_u on $server",'',$u); &ps("$c $try_u"); alarm(0); $s = <S>; @@ -608,7 +615,7 @@ sub expn_vrfy $code = 250; @ret = ("",$s); push(@ret,&read_response($2,$debug)); - return @ret; + return (@ret); } if ($1 == 551 || $1 == 251) { $code = $1; @@ -648,7 +655,7 @@ sub parse } # returns ($new_smtp_server,$new_address,$new_name) -# given a responce from a SMTP server ($newaddr), the +# given a response from a SMTP server ($newaddr), the # current host ($server), the old "name" and a flag that # indicates if it is being called during the initial # command line parsing ($parsing_args) @@ -672,13 +679,13 @@ sub parse2 # if ($newaddr =~ /^\<(.*)\>$/) { print "<A:$1>\n" if $debug; - $newaddr = &trim($1); + ($newaddr) = &trim($1); print "na = $newaddr\n" if $debug; } if ($newaddr =~ /^([^\<\>]*)\<([^\<\>]*)\>([^\<\>]*)$/) { # address has a < > pair in it. print "N:$1 <A:$2> N:$3\n" if $debug; - $newaddr = &trim($2); + ($newaddr) = &trim($2); unshift(@names, &trim($3,$1)); print "na = $newaddr\n" if $debug; } @@ -754,7 +761,7 @@ sub trim } # using the host part of an address, and the server name, add the # servers' domain to the address if it doesn't already have a -# domain. Since this sometimes failes, save a back reference so +# domain. Since this sometimes fails, save a back reference so # it can be unrolled. sub domainify { @@ -1047,11 +1054,6 @@ sub mxlookup # provide fallbacks in case $nserver doesn't work out if (defined $fallback{$cpref}) { -# for $u (@users) { -# print "mx_secondary{$u *** $nserver} = ".$fallback{$cpref}."\n" -# if $debug; -# $mx_secondary{"$u *** $nserver"} = $fallback{$cpref}; -# } $mx_secondary{$server} = $fallback{$cpref}; } @@ -1191,15 +1193,15 @@ sub alarm alarm(3600); $SIG{ALRM} = 'handle_alarm'; } -# this involves one GREAT hack. -# the "next HOST" has to unwind the stack! +# this involves one great big ugly hack. +# the "next HOST" unwinds the stack! sub handle_alarm { &giveup($alarm_redirect,"Timed out during $alarm_action",$alarm_user); next HOST; } -# read the rest of the current smtp daemon's responce (and toss it away) +# read the rest of the current smtp daemon's response (and toss it away) sub read_response { local($done,$watch) = @_; @@ -1227,11 +1229,11 @@ $flag_1; %already_mx_fellback; &handle_alarm; ################### BEGIN PERL/TROFF TRANSITION -.00; +.00 ; -'di \\ " finish diversion--previous line must be blank -.nr nl 0-1 \\ " fake up transition to first page again -.nr % 0 \\ " start at page 1 +'di +.nr nl 0-1 +.nr % 0 .\\"'; __END__ .\" ############## END PERL/TROFF TRANSITION .TH EXPN 1 "March 11, 1993" @@ -1359,7 +1361,7 @@ and Jon Broome has dropped off the face of the earth! .SH AVAILABILITY The latest version of .B expn -is available through anonymous ftp to -.IR idiom.berkeley.ca.us . +is available through anonymous ftp at +.IR ftp://ftp.idiom.com/pub/muir-programs/expn . .SH AUTHOR -.I David Muir Sharnoff\ \ \ \ <muir@idiom.berkeley.ca.us> +.I David Muir Sharnoff\ \ \ \ <muir@idiom.com> diff --git a/usr.sbin/sendmail/doc/Makefile b/usr.sbin/sendmail/doc/Makefile deleted file mode 100644 index fc9dc193a80f1..0000000000000 --- a/usr.sbin/sendmail/doc/Makefile +++ /dev/null @@ -1,5 +0,0 @@ -# @(#)Makefile 8.1 (Berkeley) 6/7/93 - -SUBDIR= op intro usenix - -.include <bsd.subdir.mk> diff --git a/usr.sbin/sendmail/doc/changes/changes.me b/usr.sbin/sendmail/doc/changes/changes.me index 0b91ed0d438df..ee838bd40d78c 100644 --- a/usr.sbin/sendmail/doc/changes/changes.me +++ b/usr.sbin/sendmail/doc/changes/changes.me @@ -30,7 +30,7 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" @(#)changes.me 8.1 (Berkeley) 4/13/94 +.\" @(#)changes.me 8.2 (Berkeley) 5/3/95 .\" .\" ditroff -me -Pxx changes.me .eh '%''Changes in Sendmail Version 8' @@ -454,15 +454,15 @@ Data General DG/UX, HP-UX, Sequent Dynix, or -Ultrix. +Ultrix 4.x, x \(<= 3. It seems to work on 4.4BSD, IBM AIX 3.x, OSF/1, SGI IRIX, Solaris, -and -SunOS. +SunOS, +and Ultrix 4.4. .sh 2 "Separate Envelope/Header Processing .pp Since the From: line is passed in separately from the envelope diff --git a/usr.sbin/sendmail/doc/changes/changes.ps b/usr.sbin/sendmail/doc/changes/changes.ps deleted file mode 100644 index 755cb5713cf6a..0000000000000 --- a/usr.sbin/sendmail/doc/changes/changes.ps +++ /dev/null @@ -1,1088 +0,0 @@ -%!PS-Adobe-3.0 -%%Creator: groff version 1.08 -%%DocumentNeededResources: font Times-Roman -%%+ font Times-Italic -%%+ font Times-Bold -%%DocumentSuppliedResources: procset grops 1.08 0 -%%Pages: 11 -%%PageOrder: Ascend -%%Orientation: Portrait -%%EndComments -%%BeginProlog -%%BeginResource: procset grops 1.08 0 -/setpacking where{ -pop -currentpacking -true setpacking -}if -/grops 120 dict dup begin -/SC 32 def -/A/show load def -/B{0 SC 3 -1 roll widthshow}bind def -/C{0 exch ashow}bind def -/D{0 exch 0 SC 5 2 roll awidthshow}bind def -/E{0 rmoveto show}bind def -/F{0 rmoveto 0 SC 3 -1 roll widthshow}bind def -/G{0 rmoveto 0 exch ashow}bind def -/H{0 rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def -/I{0 exch rmoveto show}bind def -/J{0 exch rmoveto 0 SC 3 -1 roll widthshow}bind def -/K{0 exch rmoveto 0 exch ashow}bind def -/L{0 exch rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def -/M{rmoveto show}bind def -/N{rmoveto 0 SC 3 -1 roll widthshow}bind def -/O{rmoveto 0 exch ashow}bind def -/P{rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def -/Q{moveto show}bind def -/R{moveto 0 SC 3 -1 roll widthshow}bind def -/S{moveto 0 exch ashow}bind def -/T{moveto 0 exch 0 SC 5 2 roll awidthshow}bind def -/SF{ -findfont exch -[exch dup 0 exch 0 exch neg 0 0]makefont -dup setfont -[exch/setfont cvx]cvx bind def -}bind def -/MF{ -findfont -[5 2 roll -0 3 1 roll -neg 0 0]makefont -dup setfont -[exch/setfont cvx]cvx bind def -}bind def -/level0 0 def -/RES 0 def -/PL 0 def -/LS 0 def -/PLG{ -gsave newpath clippath pathbbox grestore -exch pop add exch pop -}bind def -/BP{ -/level0 save def -1 setlinecap -1 setlinejoin -72 RES div dup scale -LS{ -90 rotate -}{ -0 PL translate -}ifelse -1 -1 scale -}bind def -/EP{ -level0 restore -showpage -}bind def -/DA{ -newpath arcn stroke -}bind def -/SN{ -transform -.25 sub exch .25 sub exch -round .25 add exch round .25 add exch -itransform -}bind def -/DL{ -SN -moveto -SN -lineto stroke -}bind def -/DC{ -newpath 0 360 arc closepath -}bind def -/TM matrix def -/DE{ -TM currentmatrix pop -translate scale newpath 0 0 .5 0 360 arc closepath -TM setmatrix -}bind def -/RC/rcurveto load def -/RL/rlineto load def -/ST/stroke load def -/MT/moveto load def -/CL/closepath load def -/FL{ -currentgray exch setgray fill setgray -}bind def -/BL/fill load def -/LW/setlinewidth load def -/RE{ -findfont -dup maxlength 1 index/FontName known not{1 add}if dict begin -{ -1 index/FID ne{def}{pop pop}ifelse -}forall -/Encoding exch def -dup/FontName exch def -currentdict end definefont pop -}bind def -/DEFS 0 def -/EBEGIN{ -moveto -DEFS begin -}bind def -/EEND/end load def -/CNT 0 def -/level1 0 def -/PBEGIN{ -/level1 save def -translate -div 3 1 roll div exch scale -neg exch neg exch translate -0 setgray -0 setlinecap -1 setlinewidth -0 setlinejoin -10 setmiterlimit -[]0 setdash -/setstrokeadjust where{ -pop -false setstrokeadjust -}if -/setoverprint where{ -pop -false setoverprint -}if -newpath -/CNT countdictstack def -userdict begin -/showpage{}def -}bind def -/PEND{ -clear -countdictstack CNT sub{end}repeat -level1 restore -}bind def -end def -/setpacking where{ -pop -setpacking -}if -%%EndResource -%%IncludeResource: font Times-Roman -%%IncludeResource: font Times-Italic -%%IncludeResource: font Times-Bold -grops begin/DEFS 1 dict def DEFS begin/u{.001 mul}bind def end/RES 72 def/PL -792 def/LS false def/ENC0[/asciicircum/asciitilde/Scaron/Zcaron/scaron/zcaron -/Ydieresis/trademark/quotesingle/.notdef/.notdef/.notdef/.notdef/.notdef -/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef -/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/space -/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright/parenleft -/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four -/five/six/seven/eight/nine/colon/semicolon/less/equal/greater/question/at/A/B/C -/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash -/bracketright/circumflex/underscore/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q -/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright/tilde/.notdef/quotesinglbase -/guillemotleft/guillemotright/bullet/florin/fraction/perthousand/dagger -/daggerdbl/endash/emdash/ff/fi/fl/ffi/ffl/dotlessi/dotlessj/grave/hungarumlaut -/dotaccent/breve/caron/ring/ogonek/quotedblleft/quotedblright/oe/lslash -/quotedblbase/OE/Lslash/.notdef/exclamdown/cent/sterling/currency/yen/brokenbar -/section/dieresis/copyright/ordfeminine/guilsinglleft/logicalnot/minus -/registered/macron/degree/plusminus/twosuperior/threesuperior/acute/mu -/paragraph/periodcentered/cedilla/onesuperior/ordmasculine/guilsinglright -/onequarter/onehalf/threequarters/questiondown/Agrave/Aacute/Acircumflex/Atilde -/Adieresis/Aring/AE/Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute -/Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis -/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls -/agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla/egrave/eacute -/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis/eth/ntilde/ograve -/oacute/ocircumflex/otilde/odieresis/divide/oslash/ugrave/uacute/ucircumflex -/udieresis/yacute/thorn/ydieresis]def/Times-Bold@0 ENC0/Times-Bold RE -/Times-Italic@0 ENC0/Times-Italic RE/Times-Roman@0 ENC0/Times-Roman RE -%%EndProlog -%%Page: 1 1 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 14/Times-Roman@0 SF(Changes in Sendmail V)196.615 141 Q(ersion 8*)-1.554 E -/F1 10/Times-Roman@0 SF(Eric Allman)263.42 165 Q/F2 10/Times-Italic@0 SF -(Univer)220.2 183 Q(sity of California, Berk)-.1 E(ele)-.1 E(y)-.3 E -(Mammoth Pr)251.98 195 Q(oject)-.45 E F1(ABSTRA)262.085 227.4 Q(CT)-.4 E -1.11 -(Ve)112 243.6 S 1.709(rsion 8 of)1.11 F F2(sendmail)4.209 E F1 1.709 -(includes a number of major changes from pre)4.209 F 1.71(vious v)-.25 F -(ersions.)-.15 E .701(This paper gi)112 255.6 R -.15(ve)-.25 G 3.201(sav).15 G -.701(ery short history of)194.794 255.6 R F2(sendmail)3.201 E F1 3.201(,as)C .7 -(ummary of the major dif)329.82 255.6 R(ferences)-.25 E .953(between v)112 -267.6 R .954(ersion 5 \(the last publically a)-.15 F -.25(va)-.2 G .954 -(ilable v).25 F .954(ersion\) and v)-.15 F .954(ersion 8, and some dis-)-.15 F -(cussion of future directions.)112 279.6 Q .48 -(In 1987, the author stopped major w)97 324 R .48(ork on)-.1 F F2(sendmail)2.98 -E F1 .48(due to other time committments, only to return)2.98 F(to acti)72 336 Q -.3 -.15(ve w)-.25 H(ork in 1991.).05 E(This paper e)5 E(xplores wh)-.15 E 2.5 -(yw)-.05 G(ork resumed and what changes ha)277 336 Q .3 -.15(ve b)-.2 H -(een made.).15 E .58(Section 1 gi)97 352.2 R -.15(ve)-.25 G 3.08(sas).15 G .58 -(hort history of)173.36 352.2 R F2(sendmail)3.08 E F1 .58(through v)3.08 F .58 -(ersion 5 and the moti)-.15 F -.25(va)-.25 G .58(tion behind w).25 F .58 -(orking on)-.1 F -.15(ve)72 364.2 S .126(rsion 8.).15 F .126 -(Section 2 has a rather detailed description of what has changed between v) -5.126 F .125(ersion 5 and v)-.15 F .125(ersion 8.)-.15 F -(The paper \214nishes of)72 376.2 Q 2.5(fw)-.25 G -(ith some thoughts about what still needs to be done.)168.95 376.2 Q/F3 10 -/Times-Bold@0 SF 2.5(1. HIST)72 400.2 R(OR)-.18 E(Y)-.35 E F1 .151 -(As discussed else)112 416.4 R .151 -(where, [Allman83a, Allman83b, Allman&Amos85] sendmail has e)-.25 F .151 -(xisted in v)-.15 F(ar)-.25 E(-)-.2 E .405(ious forms since 1980.)87 428.4 R -.405(It w)5.405 F .405(as released under the name)-.1 F F2(delivermail)2.905 E -F1 .404(in 4BSD and 4.1BSD, and as)2.905 F F2(send-)2.904 E(mail)87 440.4 Q F1 -(in 4.2BSD.)2.5 E(It quickly became the dominant mail system for netw)5 E(ork) --.1 E(ed UNIX systems.)-.1 E 1.569(Prior the release of 4.3BSD in No)112 456.6 -R -.15(ve)-.15 G 1.569(mber 1986, the author had left the Uni).15 F -.15(ve) --.25 G 1.57(rsity for pri).15 F -.25(va)-.25 G(te).25 E(industry)87 468.6 Q -3.347(,b)-.65 G .847(ut continued to do some w)129.777 468.6 R .847(ork on)-.1 -F F2(sendmail)3.347 E F1 .847(with acti)3.347 F .846(vity slo)-.25 F .846 -(wly trailing of)-.25 F 3.346(fu)-.25 G .846(ntil ef)445.204 468.6 R(fecti)-.25 -E -.15(ve)-.25 G(ly).15 E .255(stopping after February 1987.)87 480.6 R .255 -(There w)5.255 F .255(as minimal support done by man)-.1 F 2.756(yp)-.15 G .256 -(eople for se)389.796 480.6 R -.15(ve)-.25 G .256(ral years, until).15 F -(July of 1991 when the original author)87 492.6 Q 2.5(,w)-.4 G -(ho had returned the Uni)249.36 492.6 Q -.15(ve)-.25 G(rsity).15 E 2.5(,s)-.65 -G(tarted acti)379.4 492.6 Q .3 -.15(ve w)-.25 H(ork on it ag).05 E(ain.)-.05 E -1.271(There were se)112 508.8 R -.15(ve)-.25 G 1.271(ral reasons for rene).15 F -1.271(wed w)-.25 F 1.271(ork on)-.1 F F2(sendmail)3.771 E F1 6.271(.T)C 1.271 -(here w)369.549 508.8 R 1.27(as a desire at Berk)-.1 F(ele)-.1 E 3.77(yt)-.15 G -(o)499 508.8 Q(con)87 520.8 Q -.15(ve)-.4 G .097 -(rt to a subdomained structure so that indi).15 F .098 -(viduals were identi\214ed by their subdomain rather than by)-.25 F 1.758 -(their indi)87 532.8 R 1.758(vidual w)-.25 F 1.758(orkstation; although possib\ -le in the old code, there were some problems, and the)-.1 F .66(author w)87 -544.8 R .66(as the ob)-.1 F .66(vious person to address them.)-.15 F .66 -(The Computer Systems Research Group \(CSRG\), the)5.66 F 1.89 -(group that produced the Berk)87 556.8 R(ele)-.1 E 4.39(yS)-.15 G(oftw)238.12 -556.8 Q 1.89(are Distrib)-.1 F 1.89(utions, w)-.2 F 1.89(as w)-.1 F 1.89 -(orking on 4.4BSD, and w)-.1 F 1.89(anted an)-.1 F .053 -(update to the mail system.)87 568.8 R .053(Bryan Costales w)5.053 F .053(as w) --.1 F .053(orking on a book on)-.1 F F2(sendmail)2.553 E F1 .053(that w)2.553 F -.053(as being re)-.1 F(vie)-.25 E(wed)-.25 E .923(by the author)87 580.8 R -3.423(,w)-.4 G .923(hich encouraged him to mak)154.359 580.8 R 3.422(es)-.1 G -.922(ome re)283.572 580.8 R 3.422(visions. And)-.25 F .922(the author w)3.422 F -.922(anted to try to unify)-.1 F(some of the disparate v)87 592.8 Q(ersions of) --.15 E F2(sendmail)2.5 E F1(that had been permitted to proliferate.)2.5 E .023 -(During the 1987\25591 f)112 609 R(allo)-.1 E 2.523(wp)-.25 G .023(eriod, man) -228.482 609 R 2.523(yv)-.15 G .023(endors and outside v)283.498 609 R .023 -(olunteers had produced v)-.2 F .024(ariants of)-.25 F F2(sendmail)87 621 Q F1 -5.518(.P)C .517(erhaps the best kno)136.688 621 R .517(wn is the ID)-.25 F -3.017(Av)-.4 G .517(ersion [ID)280.317 621 R 3.017(A87]. Originally)-.4 F .517 -(intended to be a ne)3.017 F 3.017(ws)-.25 G .517(et of)485.433 621 R .268 -(con\214guration \214les, ID)87 633 R 2.768(Ae)-.4 G .269(xpanded into a f) -189.464 633 R .269(airly lar)-.1 F .269(ge set of patches for the code.)-.18 F -.269(Originally produced in)5.269 F .471(Sweden, ID)87 645 R 2.971(Ad)-.4 G --2.15 -.25(ev e)149.472 645 T .471(lopment passed to the Uni).25 F -.15(ve)-.25 -G .471(rsity of Illinois, and w).15 F .47(as widely used by the f)-.1 F .47 -(airly lar)-.1 F(ge)-.18 E .077 -(set of people who prefer to get and compile their o)87 657 R .077 -(wn source code rather than use v)-.25 F(endor)-.15 E .078(-supplied bina-)-.2 -F(ries.)87 669 Q .32 LW 76 678.6 72 678.6 DL 80 678.6 76 678.6 DL 84 678.6 80 -678.6 DL 88 678.6 84 678.6 DL 92 678.6 88 678.6 DL 96 678.6 92 678.6 DL 100 -678.6 96 678.6 DL 104 678.6 100 678.6 DL 108 678.6 104 678.6 DL 112 678.6 108 -678.6 DL 116 678.6 112 678.6 DL 120 678.6 116 678.6 DL 124 678.6 120 678.6 DL -128 678.6 124 678.6 DL 132 678.6 128 678.6 DL 136 678.6 132 678.6 DL 140 678.6 -136 678.6 DL 144 678.6 140 678.6 DL 148 678.6 144 678.6 DL 152 678.6 148 678.6 -DL 156 678.6 152 678.6 DL 160 678.6 156 678.6 DL 164 678.6 160 678.6 DL 168 -678.6 164 678.6 DL 172 678.6 168 678.6 DL 176 678.6 172 678.6 DL 180 678.6 176 -678.6 DL 184 678.6 180 678.6 DL 188 678.6 184 678.6 DL 192 678.6 188 678.6 DL -196 678.6 192 678.6 DL 200 678.6 196 678.6 DL 204 678.6 200 678.6 DL 208 678.6 -204 678.6 DL 212 678.6 208 678.6 DL 216 678.6 212 678.6 DL/F4 8/Times-Roman@0 -SF .045(*An earlier v)93.6 690.6 R .045(ersion of this paper w)-.12 F .044 -(as printed in the Proceedings of the 1994 A)-.08 F .044 -(UUG Queensland Summer T)-.44 F .044(echnical Conference,)-.56 F(Gate)72 700.2 -Q -.08(wa)-.2 G 2(yH).08 G(otel, Brisbane, March 1994.)107.928 700.2 Q F3 -(Changes in Sendmail V)72 756 Q(ersion 8)-1 E(1)499 756 Q EP -%%Page: 2 2 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF 294.65(2C)72 60 S(hanges in Sendmail V)378.87 60 Q -(ersion 8)-1 E/F1 10/Times-Roman@0 SF .151 -(In about the same time frame, attempts were made to clean up and e)112 96 R -.151(xtend the Simple Mail T)-.15 F(rans-)-.35 E .468 -(port Protocol \(SMTP\) [RFC821].)87 108 R .468(This in)5.468 F -.2(vo)-.4 G -(lv).2 E .469(ed clari\214cations of some ambiguities in the protocol, and)-.15 -F .085(correction of some problem areas [RFC1123], as well as e)87 120 R .084 -(xtensions for additional functionality \(dubbed)-.15 F 1.052 -(Extended Simple Mail T)87 132 R 1.053 -(ransport Protocol, or ESMTP\) [RFC1425, RFC1426, RFC1427] and a richer)-.35 F -1.376(set of semantics in the body of messages \(the Multipurpose Internet Mai\ -l Extensions, a.k.a. MIME\))87 144 R .497([RFC1521, RFC1344].)87 156 R .497 -(Neither the ID)5.497 F 2.998(Ag)-.4 G .498(roup nor most v)258.526 156 R .498 -(endors were modifying)-.15 F/F2 10/Times-Italic@0 SF(sendmail)2.998 E F1 .498 -(to conform)2.998 F 1.7(to these ne)87 168 R 4.2(ws)-.25 G 4.2(tandards. It) -148.23 168 R 1.699(seemed clear that these were `)4.2 F 1.699(`good things') --.74 F 4.199('t)-.74 G 1.699(hat should be encouraged.)394.483 168 R(Ho)87 180 -Q(we)-.25 E -.15(ve)-.25 G 1.635 -.4(r, s).15 H .835(ince no one w).4 F .835 -(as w)-.1 F .835(orking on a publically a)-.1 F -.25(va)-.2 G .835(ilable v).25 -F .836(ersion of)-.15 F F2(sendmail)3.336 E F1 .836(with these updates,)3.336 F -(the)87 192 Q 2.5(yw)-.15 G(ere unlik)113.79 192 Q(ely to be widely deplo)-.1 E -(yed an)-.1 E 2.5(yt)-.15 G(ime in the near future.)274.25 192 Q .466 -(There are, of course, other mail transport agents a)112 208.2 R -.25(va)-.2 G -.465(ilable, such as).25 F F2 .465(MMDF zmailer smail)2.965 F F1(and)2.965 E F2 -(PP)2.965 E F1(Ho)87 220.2 Q(we)-.25 E -.15(ve)-.25 G .842 -.4(r, n).15 H .042 -(one of these seemed to be g).4 F .043(aining the prominence of)-.05 F F2 -(sendmail)2.543 E F1 2.543(;i)C 2.543(ta)390.518 220.2 S .043 -(ppeared that most compa-)400.281 220.2 R .238(nies w)87 232.2 R .238 -(ould not con)-.1 F -.15(ve)-.4 G .238(rt to another mail transport agent an) -.15 F 2.737(yt)-.15 G .237(ime in the forseeable future.)327.438 232.2 R(Ho) -5.237 E(we)-.25 E -.15(ve)-.25 G 1.037 -.4(r, t).15 H(he).4 E(y)-.15 E -(might be persuaded to con)87 244.2 Q -.15(ve)-.4 G(rt to a ne).15 E(wer v)-.25 -E(ersion of)-.15 E F2(sendmail)2.5 E F1(.)A .841(All of these con)112 260.4 R -.841(vinced the author to w)-.4 F .841(ork on a updated v)-.1 F .841(ersion of) --.15 F F2(sendmail)3.342 E F1 .842(for public distrib)3.342 F(u-)-.2 E(tion.)87 -272.4 Q 1.024(The ne)112 288.6 R 3.524(wv)-.25 G 1.023(ersion of)155.858 288.6 -R F2(sendmail)3.523 E F1 1.023(is referred to as v)3.523 F 1.023 -(ersion eight \(V8\).)-.15 F -1.11(Ve)6.023 G 1.023(rsions six and se)1.11 F --.15(ve)-.25 G 3.523(nw).15 G(ere)491.79 288.6 Q 1.281 -(skipped because of an agreement that all \214les in 4.4BSD w)87 300.6 R 1.281 -(ould be numbered as \2318.1\232.)-.1 F 1.282(Rather than)6.282 F(ha)87 312.6 Q -2.05 -.15(ve a)-.2 H 4.25(ne).15 G 1.75(xternal v)127.76 312.6 R 1.75 -(ersion number that dif)-.15 F 1.75(fered from the \214le v)-.25 F 1.75 -(ersion numbers,)-.15 F F2(sendmail)4.25 E F1 1.75(just jumped)4.25 F -(directly to V8.)87 324.6 Q F0 2.5(2. CHANGES)72 348.6 R(IN VERSION EIGHT)2.5 E -F1 .138(The follo)112 364.8 R .139 -(wing is a summary of the changes between the last commonly a)-.25 F -.25(va) --.2 G .139(ilable v).25 F .139(ersion of send-)-.15 F(mail from Berk)87 376.8 Q -(ele)-.1 E 2.5(y\()-.15 G(5.67\) and the latest v)170.9 376.8 Q -(ersion \(8.6.6\).)-.15 E(Man)112 393 Q 2.5(yo)-.15 G 2.5(ft)142.68 393 S -(hese are ideas that had been tried in ID)151.29 393 Q(A, b)-.4 E(ut man)-.2 E -2.5(yo)-.15 G 2.5(ft)363.27 393 S(hem were generalized in V8.)371.88 393 Q F0 -2.5(2.1. P)87 417 R(erf)-.2 E(ormance Enhancements)-.25 E F1 .549 -(Instead of closing SMTP connections immediately)127 433.2 R 3.049(,o)-.65 G -.549(pen connections are cached for possible)342.135 433.2 R .029(future use.) -102 445.2 R .029(There is a limit to the number of simultaneous open connectio\ -ns and the idle time of an)5.029 F(y)-.15 E(indi)102 457.2 Q -(vidual connection.)-.25 E 1.219(This is of best help during queue processing \ -\(since there is the potential of man)127 473.4 R 3.719(yd)-.15 G(if)474.82 -473.4 Q(ferent)-.25 E 1.113(messages going to one site\), although it can also\ - help when processing MX records which aren')102 485.4 R(t)-.18 E -(handled by MX Piggybacking.)102 497.4 Q 1.258(If tw)127 513.6 R 3.757(oh)-.1 G -1.257(osts with dif)161.075 513.6 R 1.257 -(ferent names in a single message happen to ha)-.25 F 1.557 -.15(ve t)-.2 H -1.257(he same set of MX).15 F .94(hosts, the)102 525.6 R 3.44(yc)-.15 G .94 -(an be sent in the same transaction.)153.45 525.6 R -1.11(Ve)5.94 G .94 -(rsion 8 notices this and tries to batch the mes-)1.11 F(sages.)102 537.6 Q --.15(Fo)127 553.8 S 3.638(re).15 G 1.138(xample, if tw)148.668 553.8 R 3.637 -(os)-.1 G 1.137(ites `)216.42 553.8 R(`foo.com')-.74 E 3.637('a)-.74 G 1.137 -(nd `)286.914 553.8 R(`bar)-.74 E(.com')-.55 E 3.637('a)-.74 G 1.137 -(re both serv)352.408 553.8 R 1.137(ed by UUNET)-.15 F 3.637(,t)-.74 G(he) -470.513 553.8 Q 3.637(yw)-.15 G(ill)495.66 553.8 Q(ha)102 565.8 Q .557 -.15 -(ve t)-.2 H .257(he same set of MX hosts and will be sent in one transaction.) -.15 F .258(UUNET will then split the mes-)5.258 F(sage and send it to the tw) -102 577.8 Q 2.5(oi)-.1 G(ndi)213.28 577.8 Q(vidual hosts.)-.25 E F0 2.5 -(2.2. RFC)87 601.8 R(1123 Changes)2.5 E F1 2.607(An)127 618 S .107 -(umber of changes ha)141.827 618 R .407 -.15(ve b)-.2 H .106(een made to mak) -.15 F 2.606(es)-.1 G .106(endmail `)321.07 618 R .106 -(`conditionally compliant')-.74 F 2.606('\()-.74 G .106(that is, it)469.058 618 -R(satis\214es all of the MUST clauses and most b)102 630 Q -(ut not all of the SHOULD clauses in RFC 1123\).)-.2 E -(The major areas of change are \(numbers are RFC 1123 section numbers\):)127 -646.2 Q 26.5(\2475.2.7 Response)102 662.4 R .565(to RCPT command is f)3.065 F -3.065(ast. Pre)-.1 F(viously)-.25 E 3.065(,s)-.65 G .565(endmail e)362.295 -662.4 R .565(xpanded all aliases as f)-.15 F(ar)-.1 E .686 -(as it could \212 this could tak)156 674.4 R 3.186(eav)-.1 G .685 -(ery long time, particularly if there were name serv)290.118 674.4 R(er)-.15 E -3.891(delays. V)156 686.4 R 1.391(ersion 8 only checks for the e)-1.11 F 1.392 -(xistence of an alias and does the e)-.15 F(xpansion)-.15 E(later)156 698.4 Q -5.176(.I)-.55 G 2.676(td)184.226 698.4 S .176 -(oes still do a DNS lookup if there is an e)194.682 698.4 R .175 -(xplicit host name in the RCPT com-)-.15 F(mand, b)156 710.4 Q -(ut this time is bounded.)-.2 E EP -%%Page: 3 3 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF(Changes in Sendmail V)72 60 Q(ersion 8)-1 E(3)499 60 Q -/F1 10/Times-Roman@0 SF 26.5(\2475.2.8 Numeric)102 96 R .612 -(IP addresses are logged in Recei)3.112 F -.15(ve)-.25 G .613(d: lines.).15 F -.613(This helps tracing spoofed mes-)5.613 F(sages.)156 108 Q 21.5 -(\2475.2.17 Self)102 124.2 R .127(domain literal is properly handled.)2.627 F -(Pre)5.126 E(viously)-.25 E 2.626(,i)-.65 G 2.626(fs)368.196 124.2 S .126 -(omeone sent to user@[1.2.3.4],)378.042 124.2 R .12 -(where 1.2.3.4 is your IP address, the mail w)156 136.2 R .12 -(ould probably be rejected with a `)-.1 F(`con\214gu-)-.74 E(ration error')156 -148.2 Q 2.5('. V)-.74 F(ersion 8 can handle these addresses.)-1.11 E 26.5 -(\2475.3.2 Better)102 164.4 R 1.189(control o)3.69 F -.15(ve)-.15 G 3.689(ri) -.15 G(ndi)240.088 164.4 Q 1.189(vidual timeouts.)-.25 F 1.189 -(RFC 821 speci\214ed no timeouts.)6.189 F 1.189(Older v)6.189 F(er)-.15 E(-)-.2 -E .002(sions of sendmail had a single timeout, typically set to tw)156 176.4 R -2.502(oh)-.1 G 2.502(ours. V)398.142 176.4 R .002(ersion 8 allo)-1.11 F .002 -(ws the)-.25 F(con\214guration \214le to set timeouts for v)156 188.4 Q -(arious SMTP commands indi)-.25 E(vidually)-.25 E(.)-.65 E 26.5 -(\2475.3.3 Error)102 204.6 R 1.06(messages are sent as From:<>.)3.56 F 1.059 -(This w)6.059 F 1.059(as ur)-.1 F 1.059(ged by RFC 821 and reiterated by)-.18 F -.237(RFC 1123, b)156 216.6 R .237(ut older v)-.2 F .237(ersions of sendmail ne) --.15 F -.15(ve)-.25 G 2.737(rr).15 G .237(eally did it properly)355.186 216.6 R -5.237(.V)-.65 G .238(ersion 8 does.)448.254 216.6 R(Ho)156 228.6 Q(we)-.25 E --.15(ve)-.25 G 1.934 -.4(r, s).15 H 1.134 -(ome systems cannot handle this perfectly le).4 F -.05(ga)-.15 G 3.633(la).05 G -1.133(ddress; if necessary)402.941 228.6 R 3.633(,y)-.65 G(ou)494 228.6 Q -(can create a special mailer that uses the `g' \215ag to disable this.)156 -240.6 Q 26.5(\2475.3.3 Error)102 256.8 R 3.212(messages are ne)5.712 F -.15(ve) --.25 G 5.712(rs).15 G 3.212(ent to <>.)275.628 256.8 R(Pre)8.213 E(viously)-.25 -E 5.713(,s)-.65 G 3.213(endmail w)383.028 256.8 R 3.213(as happ)-.1 F 5.713(yt) --.1 G 5.713(os)474.957 256.8 S(end)489.56 256.8 Q 6 -(responses-to-responses which sometimes resulted in responses-to-responses-to-) -156 268.8 R(responses which resulted in ....)156 280.8 Q(you get the idea.)5 E -26.5(\2475.3.3 Route-addrs)102 297 R .111(\(the ugly `)2.611 F -(`<@hosta,@hostb:user@hostc>')-.74 E 2.611('s)-.74 G .111(yntax\) are pruned.) -389.124 297 R .112(RFC 821)5.112 F(ur)156 309 Q 1.001 -(ged the use of this bletcherous syntax.)-.18 F 1 -(RFC 1123 has seen the light and of)6.001 F(\214cially)-.25 E 1.124 -(deprecates them, further ur)156 321 R 1.125(ging that you eliminate all b)-.18 -F 1.125(ut `)-.2 F(`user@hostc')-.74 E 3.625('s)-.74 G 1.125(hould you)462.595 -321 R(recei)156 333 Q 1.698 -.15(ve o)-.25 H 1.398(ne of these things.).15 F --1.11(Ve)6.398 G 1.398(rsion 8 is slightly more generous than the standards) -1.11 F .753(suggest; instead of stripping of)156 345 R 3.253(fa)-.25 G .753 -(ll the route addressees, it only strips hosts of)293.115 345 R 3.254(fu)-.25 G -3.254(pt)487.966 345 S(o)499 345 Q 1.29(the one before the last one kno)156 357 -R 1.289(wn to DNS, thus allo)-.25 F 1.289(wing you to ha)-.25 F 1.589 -.15 -(ve p)-.2 H(seudo-hosts).15 E(such as foo.BITNET)156 369 Q 5(.T)-.74 G -(he `R' option will turn this of)251.91 369 Q(f.)-.25 E -(The areas in which sendmail is not `)102 385.2 Q(`unconditionally compliant') --.74 E 2.5('a)-.74 G(re:)367.43 385.2 Q 26.5(\2475.2.6 Sendmail)102 401.4 R -(does do header munging.)2.5 E 21.5(\2475.2.10 Sendmail)102 417.6 R(doesn')3.2 -E 3.2(ta)-.18 G -.1(lwa)233.88 417.6 S .7(ys use the e).1 F .701 -(xact SMTP message te)-.15 F .701(xt from RFC 821.)-.15 F .701(This is a)5.701 -F(rather silly requirement.)156 429.6 Q 19(\2475.3.1.1 Sendmail)102 445.8 R -(doesn')3.512 E 3.512(tg)-.18 G 1.012 -(uarantee only one connect for each host on queue runs.)235.064 445.8 R -(Connec-)6.011 E(tion caching gi)156 457.8 Q -.15(ve)-.25 G 2.5(sy).15 G -(ou most of this, b)235.87 457.8 Q(ut it does not pro)-.2 E(vide a guarantee.) --.15 E 19(\2475.3.1.1 Sendmail)102 474 R(doesn')2.843 E 2.843(ta)-.18 G -.1 -(lwa)233.166 474 S .343(ys pro).1 F .343(vide an adequate limit on concurrenc) --.15 F 4.144 -.65(y. T)-.15 H .344(hat is, there can).65 F .757(be se)156 486 R --.15(ve)-.25 G .757(ral independent sendmails running at once.).15 F .757 -(My feeling is that doing an abso-)5.757 F 1.047(lute limit w)156 498 R 1.047 -(ould be a mistak)-.1 F 3.547(e\()-.1 G 1.048(it might result in lost mail\).) -284.302 498 R(Ho)6.048 E(we)-.25 E -.15(ve)-.25 G 1.848 -.4(r, i).15 H 3.548 -(fy).4 G 1.048(ou use the)461.354 498 R .801(XLA contrib)156 510 R .801 -(uted softw)-.2 F .801(are, most of this will be guaranteed \(b)-.1 F .801 -(ut I don')-.2 F 3.3(tg)-.18 G .8(uarantee the)454.61 510 R(guarantee\).)156 -522 Q F0 2.5(2.3. Extended)87 546 R(SMTP Support)2.5 E F1 -1.11(Ve)127 562.2 S -.154(rsion 8 includes both sending and recei)1.11 F .155 -(ving support for Extended SMTP support as de\214ned)-.25 F .229(by RFC 1425 \ -\(basic\) and RFC 1427 \(SIZE\); and limited support for RFC 1426 \(BOD)102 -574.2 R 2.729(Y\). The)-.55 F(body)2.729 E .275(support is minimal because the\ - \2318BITMIME\232 body type is not currently adv)102 586.2 R 2.776 -(ertised. Although)-.15 F(such)2.776 E 3.076(ab)102 598.2 S .576 -(ody type will be accepted, it will not be correctly con)114.516 598.2 R -.15 -(ve)-.4 G .576(rted to 7 bits if speaking to a non-8-bit-).15 F(MIME a)102 -610.2 Q -.1(wa)-.15 G(re SMTP serv).1 E(er)-.15 E(.)-.55 E/F2 10/Times-Italic@0 -SF(Sendmail)127 626.4 Q F1 .287(tries to speak ESMTP if you ha)2.787 F .588 --.15(ve t)-.2 H .288(he `a' \215ag set in the \215ags for the mailer descrip-) -.15 F(tor)102 638.4 Q 3.322(,o)-.4 G 3.322(ri)123.532 638.4 S 3.322(ft)132.964 -638.4 S .822(he other end adv)142.396 638.4 R .822(ertises the f)-.15 F .822 -(act that it speaks ESMTP)-.1 F 5.822(.T)-1.11 G .821 -(his is a non-standard adv)376.446 638.4 R(ertise-)-.15 E(ment:)102 650.4 Q F2 -(sendmail)2.98 E F1 .48(announces \231ESMTP spok)2.98 F .48 -(en here\232 during the initial connection message, and client)-.1 F .587 -(sendmails search for this message.)102 662.4 R .586 -(This creates some problems for some PC-based mailers, which)5.586 F -(do not understand tw)102 674.4 Q -(o-line greeting messages as required by RFC 821.)-.1 E EP -%%Page: 4 4 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF 294.65(4C)72 60 S(hanges in Sendmail V)378.87 60 Q -(ersion 8)-1 E 2.5(2.4. Eight-Bit)87 96 R(Clean)2.5 E/F1 10/Times-Roman@0 SF -(Pre)127 112.2 Q 1.263(vious v)-.25 F 1.263 -(ersions of sendmail used the 0200 bit for quoting.)-.15 F 1.264(This v)6.264 F -1.264(ersion a)-.15 F -.2(vo)-.2 G 1.264(ids that use.).2 F(Ho)102 124.2 Q(we) --.25 E -.15(ve)-.25 G 1.119 -.4(r, y).15 H .318 -(ou can set option `7' to get se).4 F -.15(ve)-.25 G 2.818(nb).15 G .318 -(it stripping for compatibility with RFC 821, which is)290.046 124.2 R 2.5(a7) -102 136.2 S(-bit protocol.)113.94 136.2 Q(This option says `)5 E -(`strip to 7 bits on input')-.74 E('.)-.74 E(Indi)127 152.4 Q .375 -(vidual mailers can still produce se)-.25 F -.15(ve)-.25 G 2.875(nb).15 G .376 -(it out put using the `7' mailer \215ag.)303.02 152.4 R .376(This \215ag says) -5.376 F -.74(``)102 164.4 S(strip to 7 bits on output').74 E('.)-.74 E F0 2.5 -(2.5. User)87 188.4 R(Database)2.5 E F1 1.926 -(The User Database \(UDB\) is an as-yet e)127 204.6 R 1.926 -(xperimental attempt to pro)-.15 F 1.925(vide uni\214ed lar)-.15 F(ge-site)-.18 -E .396(name support.)102 216.6 R 1.996 -.8(We a)5.396 H .396 -(re installing it at Berk).8 F(ele)-.1 E .396(y; future v)-.15 F .396 -(ersions may sho)-.15 F 2.897(ws)-.25 G .397(igni\214cant modi\214cations.) -406.373 216.6 R(Brie\215y)102 228.6 Q 3.583(,U)-.65 G 1.083 -(DB contains a database that is intended to contain all the per)142.433 228.6 R -1.082(-user information for your)-.2 F -.1(wo)102 240.6 S .172 -(rkgroup, such as people').1 F 2.673(sf)-.55 G .173 -(ull names, their .plan information, their outgoing mail name, and their)222.29 -240.6 R(mail drop.)102 252.6 Q .438(The user database allo)127 268.8 R .438 -(ws you to map both incoming and outgoing addresses, much lik)-.25 F 2.937(eI) --.1 G -.4(DA)487.46 268.8 S(.).4 E(Ho)102 280.8 Q(we)-.25 E -.15(ve)-.25 G -1.799 -.4(r, t).15 H .999(he interf).4 F .999(ace is still better with ID)-.1 F -.999(A; in particular)-.4 F 3.499(,t)-.4 G 1 -(he alias \214le with incoming/outgoing)355.55 280.8 R(marks pro)102 292.8 Q -(vides better locality of information.)-.15 E F0 2.5(2.6. Impr)87 316.8 R -.1 -(ove)-.18 G 2.5(dB).1 G(IND Support)158.01 316.8 Q F1 .262 -(The BIND support, particularly for MX records, had a number of anno)127 333 R -.261(ying `)-.1 F(`features')-.74 E 2.761('w)-.74 G(hich)486.78 333 Q(ha)102 -345 Q 1.212 -.15(ve b)-.2 H .912(een remo).15 F -.15(ve)-.15 G 3.412(di).15 G -3.412(nt)187.116 345 S .912(his release.)198.308 345 R .912(In particular)5.912 -F 3.412(,t)-.4 G .912(hese more tightly bind \(pun intended\) the name)307.916 -345 R(serv)102 357 Q(er to sendmail, so that the name serv)-.15 E -(er resolution rules are incorporated directly into sendmail.)-.15 E .688 -(The major change has been that the $[ ... $] operator didn')127 373.2 R 3.188 -(tf)-.18 G .688(ully qualify names that were in)376.41 373.2 R -(DNS as A or MX records.)102 385.2 Q -1.11(Ve)5 G -(rsion 8 does this quali\214cation.)1.11 E .429(This has pro)127 401.4 R -.15 -(ve)-.15 G 2.929(nt).15 G 2.929(ob)197.147 401.4 S 2.929(ea)210.076 401.4 S -2.929(na)221.885 401.4 S(nno)234.254 401.4 Q .43 -(yance in Sun shops, who often still run without BIND support.)-.1 F(Ho)102 -413.4 Q(we)-.25 E -.15(ve)-.25 G 1.001 -.4(r, i).15 H 2.701(ti).4 G 2.701(sr) -153.842 413.4 S .201 -(eally critical that this be supported, since MX records are mandatory)163.763 -413.4 R 5.2(.I)-.65 G 2.7(nS)450.26 413.4 S .2(unOS you)463.52 413.4 R .101 -(can choose either MX support or NIS support, b)102 425.4 R .101(ut not both.) --.2 F .101(This is \214x)5.101 F .101(ed in Solaris, and some)-.15 F/F2 10 -/Times-Italic@0 SF(send-)2.602 E(mail)102 437.4 Q F1(support to allo)2.5 E 2.5 -(wt)-.25 G(his in SunOS should be forthcoming in a future release.)192.31 437.4 -Q F0 2.5(2.7. K)87 461.4 R(ey)-.25 E(ed Files)-.1 E F1 .242(Generalized k)127 -477.6 R -.15(ey)-.1 G .242(ed \214les is an idea tak).15 F .241 -(en directly from ID)-.1 F 2.741(As)-.4 G .241 -(endmail \(albeit with a completely)368.606 477.6 R(dif)102 489.6 Q -(ferent implementation\).)-.25 E(The)5 E 2.5(yc)-.15 G(an be useful on lar) -239.63 489.6 Q(ge sites.)-.18 E -1.11(Ve)127 505.8 S -(rsion 8 includes the follo)1.11 E(wing b)-.25 E(uilt-in map classes:)-.2 E -33.72(dbm Support)102 522 R(for the ndbm\(3\) library)2.5 E(.)-.65 E 33.17 -(hash Support)102 538.2 R 1.229(for the `)3.729 F(`Hash')-.74 E 3.729('t)-.74 G -1.229(ype from the ne)261.636 538.2 R 3.729(wB)-.25 G(erk)345.732 538.2 Q(ele) --.1 E 3.729(yd)-.15 G 1.229(b\(3\) library)383.641 538.2 R 6.23(.t)-.65 G 1.23 -(his library pro-)441.55 538.2 R 4.094(vides substantially better database sup\ -port than ndbm\(3\), including in-memory)156 550.2 R -(caching, arbitrarily long k)156 562.2 Q -.15(ey)-.1 G 2.5(sa).15 G(nd v)279.89 -562.2 Q(alues, and better disk utilization.)-.25 E 31.51(btree Support)102 -578.4 R .547(for the `)3.047 F(`B-T)-.74 E(ree')-.35 E 3.047('t)-.74 G .547 -(ype from the ne)266.328 578.4 R 3.048(wB)-.25 G(erk)347.698 578.4 Q(ele)-.1 E -3.048(yd)-.15 G .548(b\(3\) library)384.926 578.4 R 5.548(.B)-.65 G(-T)445.362 -578.4 Q .548(rees pro)-.35 F(vide)-.15 E .521(better clustering than Hashed \ -\214les if you are fetching lots of records that ha)156 590.4 R .821 -.15(ve s) --.2 H(imilar).15 E -.1(ke)156 602.4 S(ys, such as searching a dictionary for w) --.05 E(ords be)-.1 E(ginning with `)-.15 E(`detr')-.74 E('.)-.74 E 39.83 -(nis Support)102 618.6 R(for NIS \(a.k.a. YP\) maps.)2.5 E -(NIS+ is not supported in this v)5 E(ersion.)-.15 E 34.83(host Support)102 -634.8 R(for DNS lookups.)2.5 E 19.84(dequote A)102 651 R -.74(``)2.642 G -(pseudo-map').74 E 2.642('\()-.74 G .142(that is, once that does not ha)232.554 -651 R .442 -.15(ve a)-.2 H .442 -.15(ny ex).15 H .142(ternal data\) that allo) -.15 F .142(ws a con-)-.25 F .099 -(\214guration \214le to break apart a quoted string in the address.)156 663 R -.098(This is necessary primarily)5.098 F .726 -(for DECnet addresses, which often ha)156 675 R 1.026 -.15(ve q)-.2 H .726 -(uoted addresses that need to be unwrapped).15 F(on g)156 687 Q(ate)-.05 E -.1 -(wa)-.25 G(ys.).1 E EP -%%Page: 5 5 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF(Changes in Sendmail V)72 60 Q(ersion 8)-1 E(5)499 60 Q -2.5(2.8. Multi-W)87 96 R(ord Classes & Macr)-.75 E(os in Classes)-.18 E/F1 10 -/Times-Roman@0 SF(Classes can no)127 112.2 Q 2.5(wb)-.25 G 2.5(em)200.35 112.2 -S(ultiple w)215.07 112.2 Q 2.5(ords. F)-.1 F(or e)-.15 E(xample,)-.15 E -(CShofmann.CS.Berk)142 128.4 Q(ele)-.1 E -.65(y.)-.15 G(EDU).65 E(allo)102 -144.6 Q 2.395(ws you to match the entire string `)-.25 F(`hofmann.CS.Berk)-.74 -E(ele)-.1 E -.65(y.)-.15 G(EDU').65 E 4.894('u)-.74 G 2.394 -(sing the single construct)399.878 144.6 R -.74(``)102 156.6 S($=S').74 E('.) --.74 E(Class de\214nitions are no)127 172.8 Q 2.5(wa)-.25 G(llo)234.52 172.8 Q -(wed to include macros \212 for e)-.25 E(xample:)-.15 E(Cw$k)142 189 Q(is le) -102 205.2 Q -.05(ga)-.15 G(l.).05 E F0 2.5(2.9. IDENT)87 229.2 R(Pr)2.5 E -(otocol Support)-.18 E F1 .633 -(The IDENT protocol as de\214ned in RFC 1413 [RFC1413] is supported.)127 245.4 -R(Ho)5.633 E(we)-.25 E -.15(ve)-.25 G 1.433 -.4(r, m).15 H(an).4 E 3.134(ys) --.15 G(ys-)491.78 245.4 Q .909(tems ha)102 257.4 R 1.209 -.15(ve a T)-.2 H .909 -(CP/IP b).15 F .908 -(ug that renders this useless, and the feature must be turned of)-.2 F 3.408 -(f. Roughly)-.25 F 3.408(,i)-.65 G(f)500.67 257.4 Q 8.538 -(one of these system recei)102 269.4 R -.15(ve)-.25 G 11.038(sa\231).15 G 8.539 -(No route to host\232 message \(ICMP message)280.568 269.4 R(ICMP_UNREA)102 -281.4 Q .829(CH_HOST\) on)-.4 F/F2 10/Times-Italic@0 SF(any)3.329 E F1 .828 -(connection, all connections to that host are closed.)3.329 F .828 -(Some \214re-)5.828 F -.1(wa)102 293.4 S .087 -(lls return this error if you try to connect to the IDENT port, so you can').1 -F 2.587(tr)-.18 G(ecei)408.889 293.4 Q .387 -.15(ve e)-.25 H .087 -(mail from these).15 F 1.712(hosts on these systems.)102 305.4 R(It')6.712 E -4.212(sp)-.55 G 1.712(ossible that if the \214re)228.62 305.4 R -.1(wa)-.25 G -1.712(ll used a more speci\214c message \(such as).1 F(ICMP_UNREA)102 317.4 Q -(CH_PR)-.4 E -1.88 -.4(OT O)-.4 H 72.325(COL, ICMP_UNREA).4 F(CH_POR)-.4 E -74.825(To)-.6 G(r)500.67 317.4 Q(ICMP_UNREA)102 329.4 Q(CH_NET_PR)-.4 E -(OHIB\) it w)-.4 E(ould w)-.1 E(ork, b)-.1 E(ut this hasn')-.2 E 2.5(tb)-.18 G -(een v)375.62 329.4 Q(eri\214ed.)-.15 E .678(IDENT protocol support cannot be \ -used on 4.3BSD, Apollo DomainOS, Apple A/UX, Con-)127 345.6 R -.15(vex)102 -357.6 S 1.405(OS, Data General DG/UX, HP-UX, Sequent Dynix, or Ultrix.).15 F -1.405(It seems to w)6.405 F 1.405(ork on 4.4BSD,)-.1 F -(IBM AIX 3.x, OSF/1, SGI IRIX, Solaris, and SunOS.)102 369.6 Q F0 2.5 -(2.10. Separate)87 393.6 R(En)2.5 E -.1(ve)-.4 G(lope/Header Pr).1 E(ocessing) --.18 E F1 .854(Since the From: line is passed in separately from the en)127 -409.8 R -.15(ve)-.4 G .854(lope sender).15 F 3.354(,t)-.4 G .854(hese ha) -420.978 409.8 R 1.154 -.15(ve b)-.2 H .854(oth been).15 F .427 -(made visible; the $g macro is set to the en)102 421.8 R -.15(ve)-.4 G .428 -(lope sender during processing of mailer ar).15 F .428(gument v)-.18 F(ec-)-.15 -E(tors and the header sender during processing of headers.)102 433.8 Q .085 -(It is also possible to specify separate per)127 450 R .085(-mailer en)-.2 F --.15(ve)-.4 G .084(lope and header processing.).15 F .084(The Sender)5.084 F(-) --.2 E -.55(RW)102 462 S 1.085(Set and RecipientR).55 F 1.085(Wset ar)-.55 F -1.085(guments for mailers can be speci\214ed as `)-.18 F(`en)-.74 E -.15(ve)-.4 -G(lope/header').15 E 3.585('t)-.74 G 3.585(og)478.595 462 S -2.15 -.25(iv e) -492.18 462 T(dif)102 474 Q(ferent re)-.25 E(writings for en)-.25 E -.15(ve)-.4 -G(lope v).15 E(ersus header addresses.)-.15 E F0 2.5(2.11. Owner)87 498 R -(-List Pr)-.37 E(opagates to En)-.18 E -.1(ve)-.4 G(lope).1 E F1 1.168 -(When an alias has an associated o)127 514.2 R(wner)-.25 E 1.168 -(-list name, that alias is used to change the en)-.2 F -.15(ve)-.4 G(lope).15 E -(sender address.)102 526.2 Q(This will cause do)5 E -(wnstream errors to be returned to that o)-.25 E(wner)-.25 E(.)-.55 E 1.813 -(Some people \214nd this confusing because the en)127 542.4 R -.15(ve)-.4 G -1.813(lope sender is what appears in the \214rst).15 F -.74(``)102 554.4 S -(From_').74 E 3.127('l)-.74 G .627(ine in UNIX messages \(that is, the line be) -146.417 554.4 R .627(ginning `)-.15 F(`From<space>')-.74 E 3.127('i)-.74 G .627 -(nstead of `)424.797 554.4 R(`From:')-.74 E(';)-.74 E .502 -(the latter is the header from, which)102 566.4 R F2(does)3.002 E F1 .503 -(indicate the sender of the message\).)3.002 F .503(In pre)5.503 F .503 -(vious v)-.25 F(ersions,)-.15 E F2(sendmail)102 578.4 Q F1 .057(has tried to a) -2.557 F -.2(vo)-.2 G .057(id changing the en).2 F -.15(ve)-.4 G .056 -(lope sender for back compatibility with UNIX con).15 F -.15(ve)-.4 G(n-).15 E -.177(tion; at this point that back compatibility is creating too man)102 590.4 -R 2.678(yp)-.15 G .178(roblems, and it is necessary to mo)357.972 590.4 R -.15 -(ve)-.15 G(forw)102 602.4 Q(ard into the 1980s.)-.1 E F0 2.5(2.12. Command)87 -626.4 R(Line Flags)2.5 E F1(The)127 642.6 Q F0<ad42>2.5 E F1 -(\215ag has been added to pass in body type information.)2.5 E(The)127 658.8 Q -F0<ad70>3.057 E F1 .557 -(\215ag has been added to pass in protocol information that w)3.057 F .557 -(as pre)-.1 F .556(viously passed in by)-.25 F(de\214ning the)102 670.8 Q F0 -($r)2.5 E F1(and)2.5 E F0($s)2.5 E F1(macros.)2.5 E(The)127 687 Q F0<ad58>2.6 E -F1 .1(\215ag has been added to allo)2.6 F 2.6(wl)-.25 G .1 -(ogging of all protocol in and out of sendmail for deb)279.89 687 R(ug-)-.2 E -2.732(ging. Y)102 699 R .232(ou can set \231\255X \214lename\232 and a complet\ -e transcript will be logged in that \214le.)-1.1 F .231(This gets big)5.231 F --.1(fa)102 711 S(st: the option is only for deb).1 E(ugging.)-.2 E EP -%%Page: 6 6 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF 294.65(6C)72 60 S(hanges in Sendmail V)378.87 60 Q -(ersion 8)-1 E/F1 10/Times-Roman@0 SF(The)127 96 Q F0<ad71>4.006 E F1 1.507(\ -\215ag can limit limit a queue run to speci\214c recipients, senders, or queue\ - ids using)4.006 F -(\255qRsubstring, \255qSsubstring, or \255qIsubstring respecti)102 108 Q -.15 -(ve)-.25 G(ly).15 E(.)-.65 E F0 2.5(2.13. New)87 132 R(Con\214guration Line T) -2.5 E(ypes)-.74 E F1 .674(The `T' \(T)127 148.2 R .674 -(rusted users\) con\214guration line has been deleted.)-.35 F .674 -(It will still be accepted b)5.674 F .674(ut will)-.2 F(be ignored.)102 160.2 Q -(The `K' line has been added to declare database maps.)127 176.4 Q -(The `V' line has been added to declare the con\214guration v)127 192.6 Q -(ersion le)-.15 E -.15(ve)-.25 G(l.).15 E(The `M' \(mailer\) line tak)127 208.8 -Q(es a D= \214eld to specify e)-.1 E -.15(xe)-.15 G(cution directory).15 E(.) --.65 E F0 2.5(2.14. New)87 232.8 R(and Extended Options)2.5 E F1(Se)127 249 Q --.15(ve)-.25 G .9(ral ne).15 F 3.4(wo)-.25 G .9(ptions ha)184.8 249 R 1.2 -.15 -(ve b)-.2 H .9(een added, man).15 F 3.4(yt)-.15 G 3.4(os)314.89 249 S .9 -(upport ne)327.18 249 R 3.4(wf)-.25 G .9(eatures, others to allo)379.83 249 R -3.4(wt)-.25 G(uning)481.22 249 Q(that w)102 261 Q(as pre)-.1 E(viously a)-.25 E --.25(va)-.2 G(ilable only by recompiling.).25 E(Brie\215y:)5 E 28.78(AT)102 -277.2 S .099(he alias \214le speci\214cation can no)144.11 277.2 R 2.599(wb) --.25 G 2.599(eal)286.654 277.2 S .099(ist of alias \214les.)303.512 277.2 R -.098(Also, the con\214guration can spec-)5.099 F(ify a class of \214le.)138 -289.2 Q -.15(Fo)5 G 2.5(re).15 G(xample, to search the NIS aliases, use \231O) -232.13 289.2 Q(Anis:mail.aliases\232.)-.35 E 31(bI)102 305.4 S -(nsist on a minimum number of disk blocks.)141.33 305.4 Q 29.33(CD)102 321.6 S -(eli)145.22 321.6 Q -.15(ve)-.25 G .24(ry checkpoint interv).15 F 2.74 -(al. Checkpoint)-.25 F .24(the queue \(to a)2.74 F -.2(vo)-.2 G .24 -(id duplicate deli).2 F -.15(ve)-.25 G .24(ries\) e).15 F -.15(ve)-.25 G .24 -(ry C).15 F(addresses.)138 333.6 Q 29.89(ED)102 349.8 S(ef)145.22 349.8 Q .712 -(ault error message.)-.1 F .711 -(This message \(or the contents of the indicated \214le\) are prepended)5.712 F -(to error messages.)138 361.8 Q 28.78(GE)102 378 S .785(nable GECOS matching.) -144.11 378 R .785(If you can')5.785 F 3.285<748c>-.18 G .786 -(nd a local user name and this option is enabled,)307.51 378 R .59 -(do a sequential scan of the passwd \214le to match ag)138 390 R .589 -(ainst full names.)-.05 F(Pre)5.589 E .589(viously a compile)-.25 F(option.)138 -402 Q 31(hM)102 418.2 S(aximum hop count.)146.89 418.2 Q(Pre)5 E -(viously this w)-.25 E(as compiled in.)-.1 E 32.67(IT)102 434.4 S -(his option has been e)144.11 434.4 Q(xtended to allo)-.15 E 2.5(ws)-.25 G -(etting of resolv)300.64 434.4 Q(er parameters.)-.15 E 33.22(jS)102 450.6 S -(end errors in MIME-encapsulated format.)143.56 450.6 Q 32.11(JF)102 466.8 S -(orw)143.41 466.8 Q(ard \214le path.)-.1 E(Where to search for .forw)5 E -(ard \214les \212 def)-.1 E(aults to $HOME/.forw)-.1 E(ard.)-.1 E 31(kC)102 483 -S .05(onnection cache size.)144.67 483 R .05 -(The total number of connections that will be k)5.05 F .05(ept open at an)-.1 F -2.55(yt)-.15 G(ime.)486.5 483 Q 28.78(KC)102 499.2 S 1.395 -(onnection cache lifetime.)144.67 499.2 R 1.395(The amount of time an)6.395 F -3.895(yc)-.15 G 1.394(onnection will be permitted to sit)364.53 499.2 R(idle.) -138 511.2 Q 33.22(lE)102 527.4 S .333(nable Errors-T)144.11 527.4 R .333 -(o: header)-.8 F 5.334(.T)-.55 G .334 -(hese headers violate RFC 1123; this option is included to pro-)252.89 527.4 R -(vide back compatibility with old v)138 539.4 Q(ersions of sendmail.)-.15 E -28.78(OI)102 555.6 S(ncoming daemon options \(e.g., use alternate SMTP port\).) -141.33 555.6 Q 31(pP)102 571.8 S(ri)143.56 571.8 Q -.25(va)-.25 G .3 -.15(cy o) -.25 H 2.5(ptions. These).15 F(can be used to mak)2.5 E 2.5(ey)-.1 G -(our SMTP serv)322.22 571.8 Q(er less friendly)-.15 E(.)-.65 E 32.67(rT)102 588 -S .67(his option has been e)144.11 588 R .67(xtended to allo)-.15 F 3.17<778c> --.25 G .67(ner grained control o)307 588 R -.15(ve)-.15 G 3.17(rt).15 G 3.17 -(imeouts. F)411.02 588 R .67(or e)-.15 F(xample,)-.15 E -(you can set the timeout for SMTP commands indi)138 600 Q(vidually)-.25 E(.) --.65 E 29.33(RD)102 616.2 S(on')145.22 616.2 Q 11.797(tp)-.18 G 9.297 -(rune route-addrs.)177.947 616.2 R(Normally)269.851 616.2 Q 11.797(,i)-.65 G -11.797(fv)324.608 616.2 S 9.297(ersion 8 sees an address lik)344.585 616.2 R(e) --.1 E 1.256("<@hostA,@hostB:user@hostC>, sendmail will try to strip of)138 -628.2 R 3.755(fa)-.25 G 3.755(sm)406.48 628.2 S 1.255(uch as it can \(up to) -421.905 628.2 R(user@hostC\) as suggested by RFC 1123.)138 640.2 Q -(This option disables that beha)5 E(viour)-.2 E(.)-.55 E 29.89(TT)102 656.4 S -1.485(he \231Return T)144.11 656.4 R 3.985(oS)-.8 G 1.485 -(ender\232 timeout has been e)213.035 656.4 R 1.485(xtended to allo)-.15 F -3.986(ws)-.25 G 1.486(peci\214cation of a w)399.942 656.4 R(arning)-.1 E .789 -(message interv)138 668.4 R .789 -(al, typically something on the order of four hours.)-.25 F .788 -(If a message cannot be)5.788 F(deli)138 680.4 Q -.15(ve)-.25 G 1.245 -(red in that interv).15 F 1.245(al, a w)-.25 F 1.245 -(arning message is sent back to the sender b)-.1 F 1.246(ut the message)-.2 F -(continues to be tried.)138 692.4 Q 28.78(UU)102 708.6 S(ser database spec.) -145.22 708.6 Q(This is still e)5 E(xperimental.)-.15 E EP -%%Page: 7 7 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF(Changes in Sendmail V)72 60 Q(ersion 8)-1 E(7)499 60 Q -/F1 10/Times-Roman@0 SF 28.78(VF)102 96 S .758(allback `)143.41 96 R(`MX')-.74 -E 3.258('h)-.74 G 3.258(ost. This)211.756 96 R .757 -(can be thought of as an MX host that applies to all addresses)3.258 F -(that has a v)138 108 Q(ery high preference v)-.15 E -(alue \(that is, use it only if e)-.25 E -.15(ve)-.25 G(rything else f).15 E -(ails\).)-.1 E 28.78(wI)102 124.2 S 3.066(fs)141.33 124.2 S .566(et, assume th\ -at if you are the best MX host for a host, you should send directly to that) -151.616 124.2 R 3.213(host. This)138 136.2 R .713 -(is intended for compatibility with UIUC sendmail, and may ha)3.213 F 1.013 --.15(ve s)-.2 H .712(ome use on).15 F(\214re)138 148.2 Q -.1(wa)-.25 G(lls.).1 -E 31(7D)102 164.4 S 2.758(on)145.22 164.4 S .258(ot run eight bit clean.) -157.978 164.4 R -.7(Te)5.258 G(chnically).7 E 2.758(,y)-.65 G .258(ou ha) -305.656 164.4 R .558 -.15(ve t)-.2 H 2.758(oa).15 G .259 -(ssert this option to be RFC 821 com-)354.68 164.4 R(patible.)138 176.4 Q F0 -2.5(2.15. New)87 200.4 R(Mailer De\214nitions)2.5 E F1 21.75(L= Set)102 216.6 R -.93(the allo)3.43 F -.1(wa)-.25 G .93(ble line length.).1 F .93 -(In V5, the L mailer \215ag implied a line length limit of 990)5.93 F -(characters; this is no)138 228.6 Q 2.5(ws)-.25 G(ettable to an arbitrary v) -233.29 228.6 Q(alue.)-.25 E 17.86(F=a T)102 244.8 R(ry to use ESMTP)-.35 E 5 -(.I)-1.11 G 2.5(tw)222.65 244.8 S(ill f)235.15 244.8 Q -(all back to SMTP if the initial EHLO pack)-.1 E(et is rejected.)-.1 E 17.3 -(F=b Ensure)102 261 R 2.5(ab)2.5 G(lank line at the end of messages.)180.21 261 -Q(Useful on the *\214le* mailer)5 E(.)-.55 E 17.86(F=c Strip)102 277.2 R .68(a\ -ll comments from addresses; this should only be used as a last resort when dea\ -ling)3.18 F(with crank)138 289.2 Q 2.5(ym)-.15 G(ailers.)195.62 289.2 Q 17.3 -(F=g Ne)102 305.4 R -.15(ve)-.25 G 2.88(ru).15 G .38 -(se the null sender as the en)169.91 305.4 R -.15(ve)-.4 G .379(lope sender).15 -F 2.879(,e)-.4 G -.15(ve)343.645 305.4 S 2.879(nw).15 G .379(hen running SMTP) -368.034 305.4 R 5.379(.T)-1.11 G .379(his violates)458.341 305.4 R(RFC 1123.) -138 317.4 Q 17.3(F=7 Strip)102 333.6 R(all output to this mailer to 7 bits.)2.5 -E 16.19(F=L Used)102 349.8 R .198 -(to set the line limit to 990 bytes for SMTP compatibility)2.697 F 5.198(.I) --.65 G 2.698(tn)398.622 349.8 S .698 -.25(ow d)409.1 349.8 T .198 -(oes that only if the).25 F(L= k)138 361.8 Q -.15(ey)-.1 G -(letter is not speci\214ed.).15 E -(This \215ag is obsolete and should not be used.)5 E F0 2.5(2.16. New)87 385.8 -R(or Changed Pr)2.5 E(e-De\214ned Macr)-.18 E(os)-.18 E F1 23.5($k UUCP)102 402 -R(node name from uname\(2\).)2.5 E 20.72($m Domain)102 418.2 R -(part of our full hostname.)2.5 E 23.5($_ RFC)102 434.4 R(1413-pro)2.5 E -(vided sender address.)-.15 E 21.28($w Pre)102 450.6 R .148(viously w)-.25 F -.148(as sometimes the full domain name, sometimes just the \214rst w)-.1 F -2.647(ord. No)-.1 F 2.647(wg)-.25 G(uar)488.1 450.6 Q(-)-.2 E -(anteed to be the \214rst w)138 462.6 Q -(ord of the domain name \(i.e., the host name\).)-.1 E 25.72($j Pre)102 478.8 R -.193(viously had to be de\214ned \212 it is no)-.25 F 2.693(wp)-.25 G .194 -(rede\214ned to be the full domain name, if that can)310.067 478.8 R -(be determined.)138 490.8 Q(That is, it is equi)5 E -.25(va)-.25 G(lent to $w) -.25 E(.$m.)-.65 E F0 2.5(2.17. New)87 514.8 R(and Changed Classes)2.5 E F1 -17.86($=k Initialized)102 531 R(to contain $k.)2.5 E 15.64($=w No)102 547.2 R -3.069(wi)-.25 G .569 -(ncludes \231[1.2.3.4]\232 \(where 1.2.3.4 is your IP address\) to allo)163.039 -547.2 R 3.068(wt)-.25 G .568(he con\214guration \214le)422.314 547.2 R -(to recognize your o)138 559.2 Q(wn IP address.)-.25 E F0 2.5(2.18. New)87 -583.2 R(Rewriting T)2.5 E(ok)-.92 E(ens)-.1 E F1(The)127 599.4 Q F0($&)3.25 E -F1 .75(construct has been adopted from ID)3.25 F 3.25(At)-.4 G 3.25(od)322 -599.4 S .75(efer macro e)335.25 599.4 R -.25(va)-.25 G 3.25(luation. Normally) -.25 F 3.25(,m)-.65 G(acros)482.9 599.4 Q .476 -(in rulesets are bound when the rule is \214rst parsed during startup.)102 -611.4 R .476(Some macros change during pro-)5.476 F .046 -(cessing and are uninteresting during startup.)102 623.4 R(Ho)5.046 E(we)-.25 E --.15(ve)-.25 G .846 -.4(r, t).15 H .047 -(hat macro can be referenced using \231$&x\232 to).4 F(defer the e)102 635.4 Q --.25(va)-.25 G(ulation of $x until the rule is processed.).25 E(The tok)127 -651.6 Q(ens)-.1 E F0($\()2.5 E F1(and)2.5 E F0($\))2.5 E F1(ha)2.5 E .3 -.15 -(ve b)-.2 H(een added to allo).15 E 2.5(ws)-.25 G(peci\214cation of map re) -319.59 651.6 Q(writing.)-.25 E -1.11(Ve)127 667.8 S 1.499(rsion 8 allo)1.11 F -(ws)-.25 E F0($@)3.999 E F1 1.499 -(on the Left Hand Side of an `R' line to match zero tok)3.999 F 3.998 -(ens. This)-.1 F(is)3.998 E(intended to be used to match the null input.)102 -679.8 Q EP -%%Page: 8 8 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF 294.65(8C)72 60 S(hanges in Sendmail V)378.87 60 Q -(ersion 8)-1 E 2.5(2.19. Bigger)87 96 R(Defaults)2.5 E/F1 10/Times-Roman@0 SF --1.11(Ve)127 112.2 S 1.283(rsion 8 allo)1.11 F 1.284 -(ws up to 100 rulesets instead of 30.)-.25 F 1.284 -(It is recommended that rulesets 0\2559 be)6.284 F(reserv)102 124.2 Q -(ed for sendmail')-.15 E 2.5(sd)-.55 G(edicated use in future releases.)202.66 -124.2 Q(The total number of MX records that can be used has been raised to 20.) -127 140.4 Q .335(The number of queued messages that can be handled at one time\ - has been raised from 600 to)127 156.6 R(1000.)102 168.6 Q F0 2.5(2.20. Differ) -87 192.6 R(ent Default T)-.18 E(uning P)-.92 E(arameters)-.1 E F1 -1.11(Ve)127 -208.8 S .8(rsion 8 has changed the def)1.11 F .8 -(ault parameters for tuning queue costs to mak)-.1 F 3.3(et)-.1 G .8 -(he number of)449.08 208.8 R .712(recipients more important than the size of t\ -he message \(for small messages\).)102 220.8 R .712(This is reasonable if)5.712 -F(you are connected with reasonably f)102 232.8 Q(ast links.)-.1 E F0 2.5 -(2.21. A)87 256.8 R(uto-Quoting in Addr)-.5 E(esses)-.18 E F1(Pre)127 273 Q -(viously)-.25 E 3.2(,t)-.65 G .701(he `)177.36 273 R .701 -(`Full Name <email address>')-.74 F 3.201('s)-.74 G .701(yntax w)322.025 273 R -.701(ould generate incorrect protocol out-)-.1 F .006(put if `)102 285 R .006 -(`Full Name')-.74 F 2.506('h)-.74 G .006(ad special characters such as dot.) -187.754 285 R .005(This v)5.006 F .005(ersion puts quotes around such names.) --.15 F F0 2.5(2.22. Symbolic)87 309 R(Names On Err)2.5 E(or Mailer)-.18 E F1 -(Se)127 325.2 Q -.15(ve)-.25 G(ral names ha).15 E .3 -.15(ve b)-.2 H(een b).15 -E(uilt in to the $@ portion of the $#error mailer)-.2 E 5(.F)-.55 G(or e)428.96 -325.2 Q(xample:)-.15 E($#error $@NOHOST $: Host unkno)142 341.4 Q(wn)-.25 E -(Prints the indicated message and sets the e)102 357.6 Q(xit status of)-.15 E -/F2 10/Times-Italic@0 SF(sendmail)2.5 E F1(to)2.5 E/F3 9/Times-Roman@0 SF -(EX_NOHOST)2.5 E F1(.)A F0 2.5(2.23. New)87 381.6 R(Built-In Mailers)2.5 E F1 --1 -.8(Tw o)127 397.8 T(ne)3.901 E 3.101(wm)-.25 G .601(ailers, *\214le* and *\ -include*, are included to de\214ne options when mailing to a \214le)174.822 -397.8 R(or a :include: \214le respecti)102 409.8 Q -.15(ve)-.25 G(ly).15 E 5 -(.P)-.65 G(re)232.88 409.8 Q(viously these were o)-.25 E -.15(ve)-.15 G -(rloaded on the local mailer).15 E(.)-.55 E F0 2.5(2.24. SMTP)87 433.8 R -(VRFY Doesn't Expand)2.5 E F1(Pre)127 450 Q 1.438(vious v)-.25 F 1.438 -(ersions of sendmail treated VRFY and EXPN the same.)-.15 F 1.437(In this v) -6.437 F 1.437(ersion, VRFY)-.15 F(doesn')102 462 Q 2.5(te)-.18 G -(xpand aliases or follo)138.05 462 Q 2.5(w.)-.25 G(forw)235.84 462 Q -(ard \214les.)-.1 E .663(As an optimization, if you run with your def)127 478.2 -R .664(ault deli)-.1 F -.15(ve)-.25 G .664(ry mode being queue-only).15 F 3.164 -(,t)-.65 G .664(he RCPT)466.386 478.2 R 1.09 -(command will also not chase aliases and .forw)102 490.2 R 1.09(ard \214les.) --.1 F 1.09(It will chase them when it processes the)6.09 F 2.5(queue. This)102 -502.2 R(speeds up RCPT processing.)2.5 E F0 2.5(2.25. [IPC])87 526.2 R -(Mailers Allo)2.5 E 2.5(wM)-.1 G(ultiple Hosts)210.49 526.2 Q F1 .099 -(When an address resolv)127 542.4 R .099(es to a mailer that has `)-.15 F -(`[IPC]')-.74 E 2.599('a)-.74 G 2.6(si)353.52 542.4 S .1(ts `)362.79 542.4 R -(`P)-.74 E(ath')-.15 E .1(', the $@ part \(host name\))-.74 F .138 -(can be a colon-separated list of hosts instead of a single hostname.)102 554.4 -R .137(This asks sendmail to search the)5.137 F .16 -(list for the \214rst entry that is a)102 566.4 R -.25(va)-.2 G .16(ilable e) -.25 F .161(xactly as though it were an MX record.)-.15 F .161 -(The intent is to route)5.161 F .738(internal traf)102 578.4 R .738 -(\214c through internal netw)-.25 F .738 -(orks without publishing an MX record to the net.)-.1 F .737(MX e)5.737 F -(xpan-)-.15 E(sion is still done on the indi)102 590.4 Q(vidual items.)-.25 E -F0 2.5(2.26. Aliases)87 614.4 R(Extended)2.5 E F1 .298 -(The implementation has been mer)127 630.6 R .298(ged with maps.)-.18 F .299 -(Among other things, this supports multiple)5.298 F -(alias \214les and NIS-based aliases.)102 642.6 Q -.15(Fo)5 G 2.5(re).15 G -(xample:)258.34 642.6 Q -.35(OA)142 658.8 S(/etc/aliases,nis:mail.aliases).35 E -(will search \214rst the local database \231/etc/aliases\232 follo)102 675 Q -(wed by the NIS map)-.25 E EP -%%Page: 9 9 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF(Changes in Sendmail V)72 60 Q(ersion 8)-1 E(9)499 60 Q -2.5(2.27. P)87 96 R(ortability and Security Enhancements)-.2 E/F1 10 -/Times-Roman@0 SF 2.5(An)127 112.2 S(umber of internal changes ha)141.72 112.2 -Q .3 -.15(ve b)-.2 H(een made to enhance portability).15 E(.)-.65 E(Se)127 -128.4 Q -.15(ve)-.25 G(ral \214x).15 E(es ha)-.15 E .3 -.15(ve b)-.2 H -(een made to increase the paranoia f).15 E(actor)-.1 E(.)-.55 E .46 -(In particular)127 144.6 R 2.96(,t)-.4 G .46(he permissions required for .forw) -184.45 144.6 R .46(ard and :include: \214les ha)-.1 F .76 -.15(ve b)-.2 H .46 -(een tightened up).15 F(considerably)102 156.6 Q 5.182(.V)-.65 G 2.683(5w) -167.352 156.6 S .183(ould pretty much read an)182.155 156.6 R 2.683<798c>-.15 G -.183(le it could get to as root, which e)295.96 156.6 R .183(xposed some secu-) --.15 F 1.02(rity holes.)102 168.6 R 1.02 -(V8 insists that all directories leading up to the .forw)6.02 F 1.02 -(ard or :include: \214le be searchable)-.1 F .334 -(\("x" permission\) by the controlling user" \(de\214ned belo)102 180.6 R .335 -(w\), that the \214le itself be readable by the con-)-.25 F(trolling user)102 -192.6 Q 2.5(,a)-.4 G(nd that .forw)159.65 192.6 Q(ard \214les be o)-.1 E -(wned by the user who is being forw)-.25 E(arded to or root.)-.1 E .565 -(The "controlling user" is the user on whose behalf the mail is being deli)127 -208.8 R -.15(ve)-.25 G 3.065(red. F).15 F .565(or e)-.15 F(xample,)-.15 E .459 -(if you mail to "user1" then the controlling user for ~user1/.forw)102 220.8 R -.46(ard and an)-.1 F 2.96(ym)-.15 G .46(ailers in)416.94 220.8 R -.2(vo)-.4 G --.1(ke).2 G 2.96(db).1 G 2.96(yt)481.04 220.8 S(hat)491.78 220.8 Q(.forw)102 -232.8 Q(ard \214le, including :include: \214les.)-.1 E(Pre)127 249 Q(viously) --.25 E 2.816(,a)-.65 G -.15(ny)178.636 249 S .316 -(one who had a home directory could create a .forw).15 F .316(ard could forw) --.1 F .316(ard to a pro-)-.1 F 2.965(gram. No)102 261 R 1.765 -.65(w, s)-.25 H -.466(endmail checks to mak).65 F 2.966(es)-.1 G .466(ure that the)262.934 261 R -2.966(yh)-.15 G -2.25 -.2(av e)321.672 261 T .466(an "appro)3.166 F -.15(ve) --.15 G 2.966(ds).15 G .466(hell", that is, a shell listed)398.42 261 R -(in the /etc/shells \214le.)102 273 Q F0 2.5(2.28. Miscellaneous)87 297 R -(Fixes and Enhancements)2.5 E F1 4.03(An)127 313.2 S 1.53(umber of small b) -143.25 313.2 R 1.53(ugs ha)-.2 F 1.53(ving to do with things lik)-.2 F 4.03(eb) --.1 G 1.53(ackslash-escaped quotes inside of)364.72 313.2 R(comments ha)102 -325.2 Q .3 -.15(ve b)-.2 H(een \214x).15 E(ed.)-.15 E 1.552(The \214x)127 341.4 -R 1.552(ed size limit on header lines \(such as \231T)-.15 F 1.553 -(o:\232 and \231Cc:\232\) has been eliminated; those)-.8 F -.2(bu)102 353.4 S --.25(ff).2 G(ers are dynamically allocated no).25 E -.65(w.)-.25 G .289(Sendma\ -il writes a /etc/sendmail.pid \214le with the current process id and the curre\ -nt in)127 369.6 R -.2(vo)-.4 G(cation).2 E(\215ags.)102 381.6 Q -1 -.8(Tw o)127 -397.8 T .218 -(people using the same program \(e.g., submit\) are considered "dif)3.518 F -.219(ferent" so that duplicate)-.25 F .508(elimination doesn')102 409.8 R 3.008 -(td)-.18 G .508(elete one of them.)187.836 409.8 R -.15(Fo)5.508 G 3.008(re).15 -G .508(xample, tw)287.556 409.8 R 3.008(op)-.1 G .508(eople forw)345.412 409.8 -R .508(arding their email to |submit)-.1 F(will be treated as tw)102 421.8 Q -2.5(or)-.1 G(ecipients.)193.27 421.8 Q .721(The mailstats program prints maile\ -r names and gets the location of the sendmail.st \214le from)127 438 R -(/etc/sendmail.cf.)102 450 Q(Man)127 466.2 Q 2.5(ym)-.15 G(inor b)160.46 466.2 -Q(ugs ha)-.2 E .3 -.15(ve b)-.2 H(een \214x).15 E -(ed, such as handling of backslashes inside of quotes.)-.15 E 2.5(Ah)127 482.4 -S(ook has been added to allo)141.72 482.4 Q 2.5(wr)-.25 G -.25(ew)260.89 482.4 -S(riting of local addresses after aliasing.).25 E F0 2.5(3. FUTURE)72 506.4 R --.1(WO)2.5 G(RK).1 E F1 1.719(The pre)112 522.6 R 1.719 -(vious section describes)-.25 F/F2 10/Times-Italic@0 SF(sendmail)4.219 E F1 -1.719(as of v)4.219 F 1.719(ersion 8.6.6.)-.15 F 1.718 -(There is still much to be done.)6.719 F(Some high points are described belo)87 -534.6 Q 3.8 -.65(w. T)-.25 H(his list is by no means e).65 E(xhausti)-.15 E --.15(ve)-.25 G(.).15 E F0 2.5(3.1. Full)87 558.6 R(MIME Support)2.5 E F1 -(Currently)127 574.8 Q F2(sendmail)3.305 E F1 .805(only supports se)3.305 F --.15(ve)-.25 G 3.305(nb).15 G .805(it MIME messages.)297.005 574.8 R .806 -(Although it can pass eight bit)5.805 F .371(MIME messages, it cannot adv)102 -586.8 R .371(ertise that f)-.15 F .37 -(act because the standards say that the mail agent must be)-.1 F .26 -(able to do 8- to 7-bit con)102 598.8 R -.15(ve)-.4 G .26(rsion to ha).15 F -.561 -.15(ve f)-.2 H .261(ull 8-bit support.).15 F .261(This requires f)5.261 F -.261(ar more e)-.1 F(xtensi)-.15 E .561 -.15(ve m)-.25 H(odi\214-).15 E -(cation of the message body than is currently supported.)102 610.8 Q .464 -(The best w)127 627 R .464(ay to do this w)-.1 F .463 -(ould be to support the general concept of an e)-.1 F .463(xternal `)-.15 F -.463(`message \214l-)-.74 F(ter')102 639 Q 3.319('t)-.74 G .819 -(hat could do arbitrary modi\214cations of the message.)124.569 639 R .819 -(This w)5.819 F .82(ould allo)-.1 F 3.32(wM)-.25 G .82(IME con)427.37 639 R --.15(ve)-.4 G .82(rsion as).15 F .63 -(well as such things as automatic encryption of messages sent o)102 651 R -.15 -(ve)-.15 G 3.129(re).15 G .629(xternal links.)379.264 651 R .629 -(This is probably)5.629 F(an e)102 663 Q(xtremely non-tri)-.15 E(vial change.) --.25 E F0 2.5(3.2. Ser)87 687 R(vice Switch Abstraction)-.1 E F1 .369(Most mod\ -ern systems include some concept of a \231service switch\232 \212 for e)127 -703.2 R .37(xample, to look up)-.15 F .984 -(host names you can try DNS, NIS, NIS+, te)102 715.2 R .984 -(xt tables, NetInfo, or other services in some arbitrary)-.15 F EP -%%Page: 10 10 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF 287.15(10 Changes)72 60 R(in Sendmail V)2.5 E(ersion 8) --1 E/F1 10/Times-Roman@0 SF(order)102 96 Q 5.174(.T)-.55 G .174 -(his is currently v)136.334 96 R .174(ery clumsy in)-.15 F/F2 10/Times-Italic@0 -SF(sendmail)2.674 E F1 2.674(,w)C .174 -(ith only limited control of the services pro)309.612 96 R(vided.)-.15 E F0 2.5 -(3.3. Mor)87 120 R 2.5(eC)-.18 G(ontr)139.86 120 Q(ol of Local Addr)-.18 E -(esses)-.18 E F1 .943(Currently some addresses are declared as \231local\232 a\ -nd are handled specially \212 for e)127 136.2 R(xample,)-.15 E(the)102 148.2 Q -3.455(ym)-.15 G .955(ay ha)130.305 148.2 R 1.255 -.15(ve .)-.2 H(forw).15 E -.956(ard \214les, may be translated into program calls or \214le deli)-.1 F --.15(ve)-.25 G .956(ries, and so forth.).15 F .311(These should be brok)102 -160.2 R .311(en out into separate \215ags to allo)-.1 F 2.811(wt)-.25 G .31 -(he local system administrator to ha)330.29 160.2 R .61 -.15(ve m)-.2 H(ore).15 -E(\214ne-grained control o)102 172.2 Q -.15(ve)-.15 G 2.5(ro).15 G(perations.) -208.62 172.2 Q F0 2.5(3.4. Mor)87 196.2 R 2.5(eR)-.18 G(un-T)139.86 196.2 Q -(ime Con\214guration Options)-.18 E F1 .016(There are man)127 212.4 R 2.516(yo) --.15 G .016(ptions that are con\214gured at compile time, such as the method o\ -f \214le locking)197.148 212.4 R .719 -(and the use of the IDENT protocol [RFC1413].)102 224.4 R .719 -(These should be transfered to run time by adding)5.719 F(ne)102 236.4 Q 2.5 -(wo)-.25 G(ptions.)125.91 236.4 Q(Similarly)127 252.6 Q 3.413(,s)-.65 G .913 -(ome options are currently o)173.383 252.6 R -.15(ve)-.15 G .913 -(rloaded, that is, a single option controls more than).15 F(one thing.)102 -264.6 Q(These should probably be brok)5 E(en out into separate options.)-.1 E -(This implies that options will change from single characters to w)127 280.8 Q -(ords.)-.1 E F0 2.5(3.5. Mor)87 304.8 R 2.5(eC)-.18 G(on\214guration Contr) -139.86 304.8 Q(ol Ov)-.18 E(er Err)-.1 E(ors)-.18 E F1(Currently)127 321 Q -3.649(,t)-.65 G 1.148 -(he con\214guration \214le can generate an error message during parsing.) -173.609 321 R(Ho)6.148 E(we)-.25 E -.15(ve)-.25 G 1.948 -.4(r, i).15 H(t).4 E -.569(cannot tweak other operations, such as issuing a w)102 333 R .57 -(arning message to the system postmaster)-.1 F 5.57(.S)-.55 G(imi-)487.33 333 Q -(larly)102 345 Q 2.558(,s)-.65 G .057 -(ome errors should not be triggered if the)128.628 345 R 2.557(ya)-.15 G .057 -(re in aliases during an alias \214le reb)302.237 345 R .057(uild, b)-.2 F .057 -(ut should)-.2 F(be triggered if that alias is actually used.)102 357 Q F0 2.5 -(3.6. Long)87 381 R -.92(Te)2.5 G(rm Host State).92 E F1(Currently)127 397.2 Q -(,)-.65 E F2(sendmail)3.731 E F1 1.231 -(only remembers host status during a single queue run.)3.731 F 1.232 -(This should be)6.232 F(con)102 409.2 Q -.15(ve)-.4 G .492(rted to long term s\ -tatus stored on disk so it can be shared between instantiations of).15 F F2 -(sendmail)2.991 E F1(.)A .866(Entries will ha)102 421.2 R 1.167 -.15(ve t)-.2 H -3.367(ob).15 G 3.367(et)190.666 421.2 S .867(imestamped so the)201.253 421.2 R -3.367(yc)-.15 G .867(an time out.)290.084 421.2 R .867(This will allo)5.867 F -(w)-.25 E F2(sendmail)3.367 E F1 .867(to implement)3.367 F -.15(ex)102 433.2 S -(ponential back).15 E(of)-.1 E 2.5(fo)-.25 G 2.5(nq)188.7 433.2 S -(ueue runs on a per)201.2 433.2 Q(-host basis.)-.2 E F0 2.5(3.7. Connection)87 -457.2 R(Contr)2.5 E(ol)-.18 E F1 .819(Modern netw)127 473.4 R .819(orks ha)-.1 -F 1.119 -.15(ve d)-.2 H(if).15 E .819(ferent types of connecti)-.25 F .818 -(vity than the past.)-.25 F .818(In particular)5.818 F 3.318(,t)-.4 G .818 -(he rising)468.462 473.4 R .636 -(prominence of dialup IP has created certain challenges for automated serv)102 -485.4 R 3.136(ers. It)-.15 F .636(is not uncommon)3.136 F .732(to try to mak) -102 497.4 R 3.232(eac)-.1 G .732(onnection to a host and ha)175.27 497.4 R -1.032 -.15(ve i)-.2 H 3.232(tf).15 G .732(ail, e)307.984 497.4 R -.15(ve)-.25 G -3.232(nt).15 G .732(hough if you tried ag)348.208 497.4 R .732(ain it w)-.05 F -.731(ould suc-)-.1 F 2.5(ceed. The)102 509.4 R -(connection management could be a bit cle)2.5 E -.15(ve)-.25 G -(rer to try to adapt to such situations.).15 E F0 2.5(3.8. Other)87 533.4 R -(Caching)2.5 E F1 .074(When you do an MX record lookup, the name serv)127 549.6 -R .075(er automatically returns the IP addresses of)-.15 F .518 -(the associated MX serv)102 561.6 R 3.018(ers. This)-.15 F .518 -(information is currently ignored, and another query is done to get)3.018 F -(this information.)102 573.6 Q(It should be cached to a)5 E -.2(vo)-.2 G(id e) -.2 E(xcess name serv)-.15 E(er traf)-.15 E(\214c.)-.25 E F0 2.5(4. REFERENCES) -72 597.6 R F1([Allman83a])87 613.8 Q .137(\231Sendmail \212 An Internetw)123 -625.8 R .137(ork Mail Router)-.1 F 4.037 -.7(.\232 E)-.55 H 2.638(.A).7 G 2.638 -(llman. In)327.58 625.8 R F2 .138(Unix Pr)2.638 F -.1(og)-.45 G -.15(ra).1 G -(mmer).15 E(s')-.1 E 2.638(sM)-.4 G(anual,)463.582 625.8 Q F1(4.2)2.638 E(Berk) -123 637.8 Q(ele)-.1 E 2.5(yS)-.15 G(oftw)166.91 637.8 Q(are Distrib)-.1 E -(ution, v)-.2 E(olume 2C.)-.2 E(August 1983.)5 E([Allman83b])87 654 Q .384 -(\231Mail Systems and Addressing in 4.2BSD.)123 666 R 5.384<9a45>-.7 G 2.884 -(.A)311.544 666 S .383(llman In)324.148 666 R F2 .383(UNICOM Confer)2.883 F -.383(ence Pr)-.37 F(oceedings.)-.45 E F1(San Die)123 678 Q(go, California.)-.15 -E(January 1983.)5 E([Allman&Amos85])87 694.2 Q -.74(``)123 706.2 S 1.145 -(Sendmail Re).74 F(visited.)-.25 E 5.125 -.74('' E)-.7 H 3.645(.A).74 G 1.145 -(llman and M. Amos.)241.215 706.2 R(In)6.145 E F2 1.145 -(Usenix Summer 1985 Confer)3.645 F 1.145(ence Pr)-.37 F(o-)-.45 E(ceedings.)123 -718.2 Q F1(Portland, Ore)5 E 2.5(gon. June)-.15 F(1985.)2.5 E EP -%%Page: 11 11 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF(Changes in Sendmail V)72 60 Q(ersion 8)-1 E(11)494 60 Q -/F1 10/Times-Roman@0 SF([ID)87 96 Q(A87])-.4 E/F2 10/Times-Italic@0 SF(Electr) -1.97 E .983(onic Mail Addr)-.45 F .983(essing in Theory and Pr)-.37 F .982 -(actice with the ID)-.15 F 3.482(AS)-.35 G .982(endmail Enhancement Kit)398.156 -96 R .563(\(or The P)123 108 R(ostmaster')-.8 E 3.063(sL)-.4 G .563(ast W) -215.989 108 R .564(ill and T)-.55 F(estament\).)-.92 E F1 .564(Lennart Lo)5.564 -F -.5(..)359.828 102 S 3.064(vstrand. Department)364.828 108 R .564 -(of Computer)3.064 F 1.267(and Information Science, Uni)123 120 R -.15(ve)-.25 -G 1.267(rsity of Link).15 F(o)-.1 E -.5(..)306.585 114 S 1.266 -(ping, Sweden, Report no. LiTH-ID)311.585 120 R(A-Ex-8715.)-.4 E(May 1987.)123 -132 Q([RFC821])87 148.2 Q F2(Simple Mail T)123 160.2 Q -.15(ra)-.55 G -(nsport Pr).15 E(otocol.)-.45 E F1(J. Postel.)5 E(August 1982.)5 E([RFC1123])87 -176.4 Q F2(Requir)123 188.4 Q .163 -(ements for Internet Hosts \212 Application and Support.)-.37 F F1 .164 -(Internet Engineering T)5.164 F .164(ask F)-.8 F(orce,)-.15 E -(R. Braden, Editor)123 200.4 Q 5(.O)-.55 G(ctober 1989.)207.72 200.4 Q -([RFC1344])87 216.6 Q F2(Implications of MIME for Internet Mail Gate)123 228.6 -Q(ways.)-.15 E F1(N. Borenstein.)5 E(June 1992.)5 E([RFC1413])87 244.8 Q F2 -(Identi\214cation Pr)123 256.8 Q(otocol.)-.45 E F1(M. St. Johns.)5 E -(February 1993.)5 E([RFC1425])87 273 Q F2 2.352(SMTP Service Extensions.)123 -285 R F1 2.352(J. Klensin, N. Freed, M. Rose, E. Stef)7.352 F 2.351 -(ferud, and D. Crock)-.25 F(er)-.1 E(.)-.55 E(February 1993.)123 297 Q -([RFC1426])87 313.2 Q F2 .12(SMTP Service Extension for 8bit-MIMEtr)123 325.2 R -(ansport.)-.15 E F1 .12(J. Klensin, N. Freed, M. Rose, E. Stef)5.12 F(ferud,) --.25 E(and D. Crock)123 337.2 Q(er)-.1 E 5(.F)-.55 G(ebruary 1993.)196.78 337.2 -Q([RFC1427])87 353.4 Q F2 .813(SMTP Service Extension for Messa)123 365.4 R -1.013 -.1(ge S)-.1 H .813(ize Declar).1 F(ation.)-.15 E F1 .813 -(J. Klensin, N. Freed, and K. Moore.)5.813 F(February 1993.)123 377.4 Q -([RFC1521])87 393.6 Q F2 2.033 -(MIME \(Multipurpose Internet Mail Extensions\) P)123 405.6 R 2.033 -(art One: Mec)-.8 F 2.033(hanisms for Specifying and)-.15 F .933 -(Describing the F)123 417.6 R .933(ormat of Internet Messa)-1.05 F 1.133 -.1 -(ge B)-.1 H(odies.).1 E F1 .932(N. Borenstein and N. Freed.)5.932 F(September) -5.932 E(1993.)123 429.6 Q EP -%%Trailer -end -%%EOF diff --git a/usr.sbin/sendmail/doc/intro/intro.ps b/usr.sbin/sendmail/doc/intro/intro.ps deleted file mode 100644 index 57c4216992243..0000000000000 --- a/usr.sbin/sendmail/doc/intro/intro.ps +++ /dev/null @@ -1,1295 +0,0 @@ -%!PS-Adobe-3.0 -%%Creator: groff version 1.08 -%%DocumentNeededResources: font Times-Roman -%%+ font Times-Italic -%%+ font Times-Bold -%%DocumentSuppliedResources: procset grops 1.08 0 -%%Pages: 13 -%%PageOrder: Ascend -%%Orientation: Portrait -%%EndComments -%%BeginProlog -%%BeginResource: procset grops 1.08 0 -/setpacking where{ -pop -currentpacking -true setpacking -}if -/grops 120 dict dup begin -/SC 32 def -/A/show load def -/B{0 SC 3 -1 roll widthshow}bind def -/C{0 exch ashow}bind def -/D{0 exch 0 SC 5 2 roll awidthshow}bind def -/E{0 rmoveto show}bind def -/F{0 rmoveto 0 SC 3 -1 roll widthshow}bind def -/G{0 rmoveto 0 exch ashow}bind def -/H{0 rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def -/I{0 exch rmoveto show}bind def -/J{0 exch rmoveto 0 SC 3 -1 roll widthshow}bind def -/K{0 exch rmoveto 0 exch ashow}bind def -/L{0 exch rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def -/M{rmoveto show}bind def -/N{rmoveto 0 SC 3 -1 roll widthshow}bind def -/O{rmoveto 0 exch ashow}bind def -/P{rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def -/Q{moveto show}bind def -/R{moveto 0 SC 3 -1 roll widthshow}bind def -/S{moveto 0 exch ashow}bind def -/T{moveto 0 exch 0 SC 5 2 roll awidthshow}bind def -/SF{ -findfont exch -[exch dup 0 exch 0 exch neg 0 0]makefont -dup setfont -[exch/setfont cvx]cvx bind def -}bind def -/MF{ -findfont -[5 2 roll -0 3 1 roll -neg 0 0]makefont -dup setfont -[exch/setfont cvx]cvx bind def -}bind def -/level0 0 def -/RES 0 def -/PL 0 def -/LS 0 def -/PLG{ -gsave newpath clippath pathbbox grestore -exch pop add exch pop -}bind def -/BP{ -/level0 save def -1 setlinecap -1 setlinejoin -72 RES div dup scale -LS{ -90 rotate -}{ -0 PL translate -}ifelse -1 -1 scale -}bind def -/EP{ -level0 restore -showpage -}bind def -/DA{ -newpath arcn stroke -}bind def -/SN{ -transform -.25 sub exch .25 sub exch -round .25 add exch round .25 add exch -itransform -}bind def -/DL{ -SN -moveto -SN -lineto stroke -}bind def -/DC{ -newpath 0 360 arc closepath -}bind def -/TM matrix def -/DE{ -TM currentmatrix pop -translate scale newpath 0 0 .5 0 360 arc closepath -TM setmatrix -}bind def -/RC/rcurveto load def -/RL/rlineto load def -/ST/stroke load def -/MT/moveto load def -/CL/closepath load def -/FL{ -currentgray exch setgray fill setgray -}bind def -/BL/fill load def -/LW/setlinewidth load def -/RE{ -findfont -dup maxlength 1 index/FontName known not{1 add}if dict begin -{ -1 index/FID ne{def}{pop pop}ifelse -}forall -/Encoding exch def -dup/FontName exch def -currentdict end definefont pop -}bind def -/DEFS 0 def -/EBEGIN{ -moveto -DEFS begin -}bind def -/EEND/end load def -/CNT 0 def -/level1 0 def -/PBEGIN{ -/level1 save def -translate -div 3 1 roll div exch scale -neg exch neg exch translate -0 setgray -0 setlinecap -1 setlinewidth -0 setlinejoin -10 setmiterlimit -[]0 setdash -/setstrokeadjust where{ -pop -false setstrokeadjust -}if -/setoverprint where{ -pop -false setoverprint -}if -newpath -/CNT countdictstack def -userdict begin -/showpage{}def -}bind def -/PEND{ -clear -countdictstack CNT sub{end}repeat -level1 restore -}bind def -end def -/setpacking where{ -pop -setpacking -}if -%%EndResource -%%IncludeResource: font Times-Roman -%%IncludeResource: font Times-Italic -%%IncludeResource: font Times-Bold -grops begin/DEFS 1 dict def DEFS begin/u{.001 mul}bind def end/RES 72 def/PL -792 def/LS false def/ENC0[/asciicircum/asciitilde/Scaron/Zcaron/scaron/zcaron -/Ydieresis/trademark/quotesingle/.notdef/.notdef/.notdef/.notdef/.notdef -/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef -/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/space -/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright/parenleft -/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four -/five/six/seven/eight/nine/colon/semicolon/less/equal/greater/question/at/A/B/C -/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash -/bracketright/circumflex/underscore/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q -/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright/tilde/.notdef/quotesinglbase -/guillemotleft/guillemotright/bullet/florin/fraction/perthousand/dagger -/daggerdbl/endash/emdash/ff/fi/fl/ffi/ffl/dotlessi/dotlessj/grave/hungarumlaut -/dotaccent/breve/caron/ring/ogonek/quotedblleft/quotedblright/oe/lslash -/quotedblbase/OE/Lslash/.notdef/exclamdown/cent/sterling/currency/yen/brokenbar -/section/dieresis/copyright/ordfeminine/guilsinglleft/logicalnot/minus -/registered/macron/degree/plusminus/twosuperior/threesuperior/acute/mu -/paragraph/periodcentered/cedilla/onesuperior/ordmasculine/guilsinglright -/onequarter/onehalf/threequarters/questiondown/Agrave/Aacute/Acircumflex/Atilde -/Adieresis/Aring/AE/Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute -/Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis -/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls -/agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla/egrave/eacute -/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis/eth/ntilde/ograve -/oacute/ocircumflex/otilde/odieresis/divide/oslash/ugrave/uacute/ucircumflex -/udieresis/yacute/thorn/ydieresis]def/Times-Bold@0 ENC0/Times-Bold RE -/Times-Italic@0 ENC0/Times-Italic RE/Times-Roman@0 ENC0/Times-Roman RE -%%EndProlog -%%Page: 1 1 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 14/Times-Roman@0 SF(SENDMAIL \212 An Internetw)159.172 141 Q -(ork Mail Router)-.14 E/F1 10/Times-Roman@0 SF(Eric Allman*)260.92 165 Q/F2 10 -/Times-Italic@0 SF(Univer)220.2 183 Q(sity of California, Berk)-.1 E(ele)-.1 E -(y)-.3 E(Mammoth Pr)251.98 195 Q(oject)-.45 E F1(ABSTRA)262.085 227.4 Q(CT)-.4 -E 1.41(Routing mail through a heterogenous internet presents man)112 243.6 R -3.91(yn)-.15 G 1.91 -.25(ew p)372.55 243.6 T 3.91(roblems. Among).25 F .297 -(the w)112 255.6 R .297(orst of these is that of address mapping.)-.1 F -(Historically)5.297 E 2.797(,t)-.65 G .298(his has been handled on an)355.03 -255.6 R F2(ad hoc)112 267.6 Q F1 2.5(basis. Ho)2.5 F(we)-.25 E -.15(ve)-.25 G -.8 -.4(r, t).15 H(his approach has become unmanageable as internets gro).4 E --.65(w.)-.25 G .15(Sendmail acts a uni\214ed "post of)112 283.8 R .15 -(\214ce" to which all mail can be submitted.)-.25 F .15(Address inter)5.15 F(-) --.2 E .426(pretation is controlled by a production system, which can parse bot\ -h domain-based ad-)112 295.8 R .423(dressing and old-style)112 307.8 R F2 .423 -(ad hoc)2.923 F F1 2.923(addresses. The)2.923 F .422(production system is po) -2.922 F .422(werful enough to)-.25 F(re)112 319.8 Q 1.357(write addresses in t\ -he message header to conform to the standards of a number of)-.25 F 1.15 -(common tar)112 331.8 R 1.15(get netw)-.18 F 1.15 -(orks, including old \(NCP/RFC733\) Arpanet, ne)-.1 F 3.65(w\()-.25 G -(TCP/RFC822\))405.65 331.8 Q 1.119(Arpanet, UUCP)112 343.8 R 3.619(,a)-1.11 G -1.119(nd Phonenet.)186.448 343.8 R 1.119(Sendmail also implements an SMTP serv) -6.119 F(er)-.15 E 3.619(,m)-.4 G(essage)437.9 343.8 Q(queueing, and aliasing.) -112 355.8 Q F2(Sendmail)97 400.2 Q F1 .501(implements a general internetw)3 F -.501(ork mail routing f)-.1 F(acility)-.1 E 3.001(,f)-.65 G .501 -(eaturing aliasing and forw)369.847 400.2 R(arding,)-.1 E -(automatic routing to netw)72 412.2 Q(ork g)-.1 E(ate)-.05 E -.1(wa)-.25 G -(ys, and \215e).1 E(xible con\214guration.)-.15 E .624(In a simple netw)97 -428.4 R .624(ork, each node has an address, and resources can be identi\214ed \ -with a host-resource)-.1 F .374(pair; in particular)72 440.4 R 2.874(,t)-.4 G -.374(he mail system can refer to users using a host-username pair)149.932 440.4 -R 5.374(.H)-.55 G .375(ost names and numbers)409.276 440.4 R(ha)72 452.4 Q .3 --.15(ve t)-.2 H 2.5(ob).15 G 2.5(ea)108.31 452.4 S -(dministered by a central authority)119.69 452.4 Q 2.5(,b)-.65 G -(ut usernames can be assigned locally to each host.)263.82 452.4 Q .649 -(In an internet, multiple netw)97 468.6 R .649(orks with dif)-.1 F .649 -(ferent characterstics and managements must communicate.)-.25 F .389 -(In particular)72 480.6 R 2.889(,t)-.4 G .389 -(he syntax and semantics of resource identi\214cation change.)129.308 480.6 R -.39(Certain special cases can be han-)5.389 F 1.033(dled tri)72 492.6 R 1.033 -(vially by)-.25 F F2 1.033(ad hoc)3.533 F F1 1.032(techniques, such as pro) -3.533 F 1.032(viding netw)-.15 F 1.032 -(ork names that appear local to hosts on other)-.1 F(netw)72 504.6 Q 1.454 -(orks, as with the Ethernet at Xerox P)-.1 F 3.955(ARC. Ho)-.92 F(we)-.25 E --.15(ve)-.25 G 4.755 -.4(r, t).15 H 1.455(he general case is e).4 F 1.455 -(xtremely comple)-.15 F 3.955(x. F)-.15 F(or)-.15 E -.15(ex)72 516.6 S .192 -(ample, some netw).15 F .192(orks require point-to-point routing, which simpli\ -\214es the database update problem since)-.1 F .618(only adjacent hosts must b\ -e entered into the system tables, while others use end-to-end addressing.)72 -528.6 R(Some)5.618 E(netw)72 540.6 Q .123(orks use a left-associati)-.1 F .423 --.15(ve s)-.25 H .123(yntax and others use a right-associati).15 F .423 -.15 -(ve s)-.25 H .123(yntax, causing ambiguity in mix).15 F(ed)-.15 E(addresses.)72 -552.6 Q .678(Internet standards seek to eliminate these problems.)97 568.8 R -(Initially)5.678 E 3.178(,t)-.65 G .679(hese proposed e)353.134 568.8 R .679 -(xpanding the address)-.15 F .65(pairs to address triples, consisting of {netw) -72 580.8 R .649(ork, host, resource} triples.)-.1 F(Netw)5.649 E .649 -(ork numbers must be uni)-.1 F -.15(ve)-.25 G -.2(r-).15 G 1.452 -(sally agreed upon, and hosts can be assigned locally on each netw)72 592.8 R -3.952(ork. The)-.1 F(user)3.952 E(-le)-.2 E -.15(ve)-.25 G 3.952(lp).15 G 1.452 -(resentation w)440.718 592.8 R(as)-.1 E 2.352(quickly e)72 604.8 R 2.352(xpand\ -ed to address domains, comprised of a local resource identi\214cation and a hi\ -erarchical)-.15 F .256(domain speci\214cation with a common static root.)72 -616.8 R .257(The domain technique separates the issue of ph)5.257 F .257 -(ysical v)-.05 F(er)-.15 E(-)-.2 E .807(sus logical addressing.)72 628.8 R -.15 -(Fo)5.807 G 3.307(re).15 G .807 -(xample, an address of the form \231eric@a.cc.berk)191.028 628.8 R(ele)-.1 E --.65(y.)-.15 G .807(arpa\232 describes only the).65 F(logical or)72 640.8 Q --.05(ga)-.18 G(nization of the address space.).05 E F2(Sendmail)97 657 Q F1 -.493(is intended to help bridge the g)2.992 F .493(ap between the totally)-.05 -F F2 .493(ad hoc)2.993 F F1 -.1(wo)2.993 G .493(rld of netw).1 F .493 -(orks that kno)-.1 F(w)-.25 E .855 -(nothing of each other and the clean, tightly-coupled w)72 669 R .854 -(orld of unique netw)-.1 F .854(ork numbers.)-.1 F .854(It can accept old)5.854 -F .32 LW 76 678.6 72 678.6 DL 80 678.6 76 678.6 DL 84 678.6 80 678.6 DL 88 -678.6 84 678.6 DL 92 678.6 88 678.6 DL 96 678.6 92 678.6 DL 100 678.6 96 678.6 -DL 104 678.6 100 678.6 DL 108 678.6 104 678.6 DL 112 678.6 108 678.6 DL 116 -678.6 112 678.6 DL 120 678.6 116 678.6 DL 124 678.6 120 678.6 DL 128 678.6 124 -678.6 DL 132 678.6 128 678.6 DL 136 678.6 132 678.6 DL 140 678.6 136 678.6 DL -144 678.6 140 678.6 DL 148 678.6 144 678.6 DL 152 678.6 148 678.6 DL 156 678.6 -152 678.6 DL 160 678.6 156 678.6 DL 164 678.6 160 678.6 DL 168 678.6 164 678.6 -DL 172 678.6 168 678.6 DL 176 678.6 172 678.6 DL 180 678.6 176 678.6 DL 184 -678.6 180 678.6 DL 188 678.6 184 678.6 DL 192 678.6 188 678.6 DL 196 678.6 192 -678.6 DL 200 678.6 196 678.6 DL 204 678.6 200 678.6 DL 208 678.6 204 678.6 DL -212 678.6 208 678.6 DL 216 678.6 212 678.6 DL/F3 8/Times-Roman@0 SF .557 -(*A considerable part of this w)93.6 690.6 R .557(ork w)-.08 F .557 -(as done while under the emplo)-.08 F 2.557(yo)-.08 G 2.556(ft)323.116 690.6 S -.556(he INGRES Project at the Uni)330.56 690.6 R -.12(ve)-.2 G .556 -(rsity of California at).12 F(Berk)72 700.2 Q(ele)-.08 E 2(ya)-.12 G -(nd at Britton Lee.)106.232 700.2 Q/F4 10/Times-Bold@0 SF -(SENDMAIL \212 An Inter)72 756 Q(netw)-.15 E(ork Mail Router)-.1 E(SMM:9-1) -462.9 756 Q EP -%%Page: 2 2 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF 192.28(SMM:9-2 SENDMAIL)72 60 R 2.5<8a41>2.5 G 2.5(nI) -383.99 60 S(nter)395.94 60 Q(netw)-.15 E(ork Mail Router)-.1 E/F1 10 -/Times-Roman@0 SF .632(arbitrary address syntax)72 96 R .633(es, resolving amb\ -iguities using heuristics speci\214ed by the system administrator)-.15 F 3.133 -(,a)-.4 G(s)500.11 96 Q .348(well as domain-based addressing.)72 108 R .347 -(It helps guide the con)5.347 F -.15(ve)-.4 G .347 -(rsion of message formats between disparate net-).15 F -.1(wo)72 120 S 3.394 -(rks. In).1 F(short,)3.394 E/F2 10/Times-Italic@0 SF(sendmail)3.394 E F1 .894 -(is designed to assist a graceful transition to consistent internetw)3.394 F -.895(ork addressing)-.1 F(schemes.)72 132 Q .153 -(Section 1 discusses the design goals for)97 160.2 R F2(sendmail)2.653 E F1 -5.153(.S)C .152(ection 2 gi)308.214 160.2 R -.15(ve)-.25 G 2.652(sa).15 G 2.652 -(no)370.76 160.2 S -.15(ve)383.262 160.2 S(rvie).15 E 2.652(wo)-.25 G 2.652(ft) -422.724 160.2 S .152(he basic functions)431.486 160.2 R .644(of the system.)72 -172.2 R .644(In section 3, details of usage are discussed.)5.644 F .644 -(Section 4 compares)5.644 F F2(sendmail)3.144 E F1 .645(to other internet)3.144 -F(mail routers, and an e)72 184.2 Q -.25(va)-.25 G(luation of).25 E F2 -(sendmail)2.5 E F1(is gi)2.5 E -.15(ve)-.25 G 2.5(ni).15 G 2.5(ns)283.3 184.2 S -(ection 5, including future plans.)294.69 184.2 Q F0 2.5(1. DESIGN)72 208.2 R -(GO)2.5 E(ALS)-.4 E F1(Design goals for)112 224.4 Q F2(sendmail)2.5 E F1 -(include:)2.5 E 12.5(\(1\) Compatibility)92 240.6 R 1.363(with the e)3.864 F -1.363(xisting mail programs, including Bell v)-.15 F 1.363 -(ersion 6 mail, Bell v)-.15 F 1.363(ersion 7)-.15 F 1.202(mail [UNIX83], Berk) -118.66 252.6 R(ele)-.1 E(y)-.15 E F2(Mail)3.702 E F1 1.202 -([Shoens79], BerkNet mail [Schmidt79], and hopefully UUCP)3.702 F(mail [No) -118.66 264.6 Q(witz78a, No)-.25 E 2.5(witz78b]. ARP)-.25 F(ANET mail [Crock) --.92 E(er77a, Postel77] w)-.1 E(as also required.)-.1 E 12.5(\(2\) Reliability) -92 280.8 R 4.003(,i)-.65 G 4.003(nt)169.523 280.8 S 1.502 -(he sense of guaranteeing that e)181.306 280.8 R -.15(ve)-.25 G 1.502 -(ry message is correctly deli).15 F -.15(ve)-.25 G 1.502(red or at least).15 F -.368 -(brought to the attention of a human for correct disposal; no message should e) -118.66 292.8 R -.15(ve)-.25 G 2.868(rb).15 G 2.868(ec)452.252 292.8 S -(ompletely)464 292.8 Q 2.541(lost. This)118.66 304.8 R .041(goal w)2.541 F .041 -(as considered essential because of the emphasis on mail in our en)-.1 F 2.54 -(vironment. It)-.4 F 1.754 -(has turned out to be one of the hardest goals to satisfy)118.66 316.8 R 4.255 -(,e)-.65 G 1.755(specially in the f)363.75 316.8 R 1.755(ace of the man)-.1 F -(y)-.15 E .978(anomalous message formats produced by v)118.66 328.8 R .977 -(arious ARP)-.25 F .977(ANET sites.)-.92 F -.15(Fo)5.977 G 3.477(re).15 G .977 -(xample, certain sites)420.116 328.8 R .069 -(generate improperly formated addresses, occasionally causing error)118.66 -340.8 R .069(-message loops.)-.2 F .069(Some hosts)5.069 F .063(use blanks in \ -names, causing problems with UNIX mail programs that assume that an address is) -118.66 352.8 R .111(one w)118.66 364.8 R 2.611(ord. The)-.1 F .111 -(semantics of some \214elds are interpreted slightly dif)2.611 F .112 -(ferently by dif)-.25 F .112(ferent sites.)-.25 F(In)5.112 E(summary)118.66 -376.8 Q 3.023(,t)-.65 G .523(he obscure features of the ARP)163.533 376.8 R -.523(ANET mail protocol really)-.92 F F2(ar)3.023 E(e)-.37 E F1 .522 -(used and are dif)3.023 F(\214cult)-.25 E(to support, b)118.66 388.8 Q -(ut must be supported.)-.2 E 12.5(\(3\) Existing)92 405 R(softw)2.938 E .438 -(are to do actual deli)-.1 F -.15(ve)-.25 G .439(ry should be used whene).15 F --.15(ve)-.25 G 2.939(rp).15 G 2.939(ossible. This)387.654 405 R .439(goal deri) -2.939 F -.15(ve)-.25 G 2.939(sa).15 G(s)500.11 405 Q -(much from political and practical considerations as technical.)118.66 417 Q -12.5(\(4\) Easy)92 433.2 R -.15(ex)2.899 G .399(pansion to f).15 F .399 -(airly comple)-.1 F 2.898(xe)-.15 G -.4(nv)261.064 433.2 S .398 -(ironments, including multiple connections to a single net-).4 F -.1(wo)118.66 -445.2 S .115 -(rk type \(such as with multiple UUCP or Ether nets [Metcalfe76]\).).1 F .115 -(This goal requires consid-)5.115 F .587(eration of the contents of an address\ - as well as its syntax in order to determine which g)118.66 457.2 R(ate)-.05 E --.1(wa)-.25 G(y).1 E 1.018(to use.)118.66 469.2 R -.15(Fo)6.018 G 3.518(re).15 -G 1.018(xample, the ARP)173.354 469.2 R 1.019 -(ANET is bringing up the TCP protocol to replace the old NCP)-.92 F 4.791 -(protocol. No)118.66 481.2 R 2.291(host at Berk)4.791 F(ele)-.1 E 4.791(yr)-.15 -G 2.291(uns both TCP and NCP)256.235 481.2 R 4.791(,s)-1.11 G 4.79(oi)369.37 -481.2 S 4.79(ti)381.94 481.2 S 4.79(sn)392.29 481.2 S 2.29 -(ecessary to look at the)405.97 481.2 R(ARP)118.66 493.2 Q .016 -(ANET host name to determine whether to route mail to an NCP g)-.92 F(ate)-.05 -E -.1(wa)-.25 G 2.517(yo).1 G 2.517(raT)435.569 493.2 S .017(CP g)454.483 493.2 -R(ate)-.05 E -.1(wa)-.25 G -.65(y.).1 G 12.5(\(5\) Con\214guration)92 509.4 R -.145(should not be compiled into the code.)2.645 F 2.645(As)5.145 G .145 -(ingle compiled program should be able)346.905 509.4 R .91(to run as is at an) -118.66 521.4 R 3.41(ys)-.15 G .91 -(ite \(barring such basic changes as the CPU type or the operating system\).) -200.63 521.4 R 2.61 -.8(We h)118.66 533.4 T -2.25 -.2(av e).8 H 1.009 -(found this seemingly unimportant goal to be critical in real life.)3.71 F -1.009(Besides the simple)6.009 F .66(problems that occur when an)118.66 545.4 R -3.16(yp)-.15 G .66(rogram gets recompiled in a dif)249.84 545.4 R .66 -(ferent en)-.25 F .66(vironment, man)-.4 F 3.16(ys)-.15 G(ites)490.11 545.4 Q -(lik)118.66 557.4 Q 2.5(et)-.1 G 2.5<6f99>138.84 557.4 S(\214ddle\232 with an) -150.78 557.4 Q(ything that the)-.15 E 2.5(yw)-.15 G(ill be recompiling an) -282.42 557.4 Q(yw)-.15 E(ay)-.1 E(.)-.65 E(\(6\))92 573.6 Q F2(Sendmail)118.66 -573.6 Q F1 .184(must be able to let v)2.684 F .184 -(arious groups maintain their o)-.25 F .184(wn mailing lists, and let indi)-.25 -F(viduals)-.25 E(specify their o)118.66 585.6 Q(wn forw)-.25 E -(arding, without modifying the system alias \214le.)-.1 E 12.5(\(7\) Each)92 -601.8 R .313(user should be able to specify which mailer to e)2.813 F -.15(xe) --.15 G .313(cute to process mail being deli).15 F -.15(ve)-.25 G .314(red for) -.15 F 3.098(him. This)118.66 613.8 R .598(feature allo)3.098 F .598 -(ws users who are using specialized mailers that use a dif)-.25 F .598 -(ferent format to)-.25 F -.2(bu)118.66 625.8 S .25(ild their en).2 F .25 -(vironment without changing the system, and f)-.4 F .25 -(acilitates specialized functions \(such)-.1 F(as returning an \231I am on v) -118.66 637.8 Q(acation\232 message\).)-.25 E 12.5(\(8\) Netw)92 654 R 1.553 -(ork traf)-.1 F 1.552(\214c should be minimized by batching addresses to a sin\ -gle host where possible,)-.25 F(without assistance from the user)118.66 666 Q -(.)-.55 E .374(These goals moti)112 682.2 R -.25(va)-.25 G .374 -(ted the architecture illustrated in \214gure 1.).25 F .375 -(The user interacts with a mail gen-)5.375 F .491(erating and sending program.) -87 694.2 R .491(When the mail is created, the generator calls)5.491 F F2 -(sendmail)2.99 E F1 2.99(,w)C .49(hich routes the)444.14 694.2 R .84 -(message to the correct mailer\(s\).)87 706.2 R .841 -(Since some of the senders may be netw)5.84 F .841(ork serv)-.1 F .841 -(ers and some of the)-.15 F(mailers may be netw)87 718.2 Q(ork clients,)-.1 E -F2(sendmail)2.5 E F1(may be used as an internet mail g)2.5 E(ate)-.05 E -.1(wa) --.25 G -.65(y.).1 G EP -%%Page: 3 3 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF(SENDMAIL \212 An Inter)72 60 Q(netw)-.15 E -(ork Mail Router)-.1 E(SMM:9-3)462.9 60 Q .4 LW 77 108 72 108 DL 79 108 74 108 -DL 84 108 79 108 DL 89 108 84 108 DL 94 108 89 108 DL 99 108 94 108 DL 104 108 -99 108 DL 109 108 104 108 DL 114 108 109 108 DL 119 108 114 108 DL 124 108 119 -108 DL 129 108 124 108 DL 134 108 129 108 DL 139 108 134 108 DL 144 108 139 108 -DL 149 108 144 108 DL 154 108 149 108 DL 159 108 154 108 DL 164 108 159 108 DL -169 108 164 108 DL 174 108 169 108 DL 179 108 174 108 DL 184 108 179 108 DL 189 -108 184 108 DL 194 108 189 108 DL 199 108 194 108 DL 204 108 199 108 DL 209 108 -204 108 DL 214 108 209 108 DL 219 108 214 108 DL 224 108 219 108 DL 229 108 224 -108 DL 234 108 229 108 DL 239 108 234 108 DL 244 108 239 108 DL 249 108 244 108 -DL 254 108 249 108 DL 259 108 254 108 DL 264 108 259 108 DL 269 108 264 108 DL -274 108 269 108 DL 279 108 274 108 DL 284 108 279 108 DL 289 108 284 108 DL 294 -108 289 108 DL 299 108 294 108 DL 304 108 299 108 DL 309 108 304 108 DL 314 108 -309 108 DL 319 108 314 108 DL 324 108 319 108 DL 329 108 324 108 DL 334 108 329 -108 DL 339 108 334 108 DL 344 108 339 108 DL 349 108 344 108 DL 354 108 349 108 -DL 359 108 354 108 DL 364 108 359 108 DL 369 108 364 108 DL 374 108 369 108 DL -379 108 374 108 DL 384 108 379 108 DL 389 108 384 108 DL 394 108 389 108 DL 399 -108 394 108 DL 404 108 399 108 DL 409 108 404 108 DL 414 108 409 108 DL 419 108 -414 108 DL 424 108 419 108 DL 429 108 424 108 DL 434 108 429 108 DL 439 108 434 -108 DL 444 108 439 108 DL 449 108 444 108 DL 454 108 449 108 DL 459 108 454 108 -DL 464 108 459 108 DL 469 108 464 108 DL 474 108 469 108 DL 479 108 474 108 DL -484 108 479 108 DL 489 108 484 108 DL 494 108 489 108 DL 499 108 494 108 DL 504 -108 499 108 DL/F1 10/Times-Roman@0 SF(sender1)164.45 155.6 Q 144 135.6 144 -171.6 DL 216 135.6 144 135.6 DL 216 171.6 216 135.6 DL 144 171.6 216 171.6 DL -(sender2)272.45 155.6 Q 252 135.6 252 171.6 DL 324 135.6 252 135.6 DL 324 171.6 -324 135.6 DL 252 171.6 324 171.6 DL(sender3)380.45 155.6 Q 360 135.6 360 171.6 -DL 432 135.6 360 135.6 DL 432 171.6 432 135.6 DL 360 171.6 432 171.6 DL 288 -207.6 288 171.6 DL 288 207.6 286.2 200.4 DL 288 207.6 289.8 200.4 DL(sendmail) -269.945 227.6 Q 216 207.6 216 243.6 DL 360 207.6 216 207.6 DL 360 243.6 360 -207.6 DL 216 243.6 360 243.6 DL 288 279.6 288 243.6 DL 288 279.6 286.2 272.4 DL -288 279.6 289.8 272.4 DL(mailer1)164.725 299.6 Q 144 279.6 144 315.6 DL 216 -279.6 144 279.6 DL 216 315.6 216 279.6 DL 144 315.6 216 315.6 DL(mailer2) -272.725 299.6 Q 252 279.6 252 315.6 DL 324 279.6 252 279.6 DL 324 315.6 324 -279.6 DL 252 315.6 324 315.6 DL(mailer3)380.725 299.6 Q 360 279.6 360 315.6 DL -432 279.6 360 279.6 DL 432 315.6 432 279.6 DL 360 315.6 432 315.6 DL 252 207.6 -180 171.6 DL 252 207.6 244.728 206.016 DL 252 207.6 246.384 202.776 DL 324 -207.6 396 171.6 DL 324 207.6 329.616 202.776 DL 324 207.6 331.272 206.016 DL -180 279.6 252 243.6 DL 180 279.6 185.616 274.776 DL 180 279.6 187.272 278.016 -DL 396 279.6 324 243.6 DL 396 279.6 388.728 278.016 DL 396 279.6 390.384 -274.776 DL(Figure 1 \212 Sendmail System Structure.)208 346.8 Q 77 358.8 72 -358.8 DL 79 358.8 74 358.8 DL 84 358.8 79 358.8 DL 89 358.8 84 358.8 DL 94 -358.8 89 358.8 DL 99 358.8 94 358.8 DL 104 358.8 99 358.8 DL 109 358.8 104 -358.8 DL 114 358.8 109 358.8 DL 119 358.8 114 358.8 DL 124 358.8 119 358.8 DL -129 358.8 124 358.8 DL 134 358.8 129 358.8 DL 139 358.8 134 358.8 DL 144 358.8 -139 358.8 DL 149 358.8 144 358.8 DL 154 358.8 149 358.8 DL 159 358.8 154 358.8 -DL 164 358.8 159 358.8 DL 169 358.8 164 358.8 DL 174 358.8 169 358.8 DL 179 -358.8 174 358.8 DL 184 358.8 179 358.8 DL 189 358.8 184 358.8 DL 194 358.8 189 -358.8 DL 199 358.8 194 358.8 DL 204 358.8 199 358.8 DL 209 358.8 204 358.8 DL -214 358.8 209 358.8 DL 219 358.8 214 358.8 DL 224 358.8 219 358.8 DL 229 358.8 -224 358.8 DL 234 358.8 229 358.8 DL 239 358.8 234 358.8 DL 244 358.8 239 358.8 -DL 249 358.8 244 358.8 DL 254 358.8 249 358.8 DL 259 358.8 254 358.8 DL 264 -358.8 259 358.8 DL 269 358.8 264 358.8 DL 274 358.8 269 358.8 DL 279 358.8 274 -358.8 DL 284 358.8 279 358.8 DL 289 358.8 284 358.8 DL 294 358.8 289 358.8 DL -299 358.8 294 358.8 DL 304 358.8 299 358.8 DL 309 358.8 304 358.8 DL 314 358.8 -309 358.8 DL 319 358.8 314 358.8 DL 324 358.8 319 358.8 DL 329 358.8 324 358.8 -DL 334 358.8 329 358.8 DL 339 358.8 334 358.8 DL 344 358.8 339 358.8 DL 349 -358.8 344 358.8 DL 354 358.8 349 358.8 DL 359 358.8 354 358.8 DL 364 358.8 359 -358.8 DL 369 358.8 364 358.8 DL 374 358.8 369 358.8 DL 379 358.8 374 358.8 DL -384 358.8 379 358.8 DL 389 358.8 384 358.8 DL 394 358.8 389 358.8 DL 399 358.8 -394 358.8 DL 404 358.8 399 358.8 DL 409 358.8 404 358.8 DL 414 358.8 409 358.8 -DL 419 358.8 414 358.8 DL 424 358.8 419 358.8 DL 429 358.8 424 358.8 DL 434 -358.8 429 358.8 DL 439 358.8 434 358.8 DL 444 358.8 439 358.8 DL 449 358.8 444 -358.8 DL 454 358.8 449 358.8 DL 459 358.8 454 358.8 DL 464 358.8 459 358.8 DL -469 358.8 464 358.8 DL 474 358.8 469 358.8 DL 479 358.8 474 358.8 DL 484 358.8 -479 358.8 DL 489 358.8 484 358.8 DL 494 358.8 489 358.8 DL 499 358.8 494 358.8 -DL 504 358.8 499 358.8 DL F0 2.5(2. O)72 394.8 R(VER)-.5 E(VIEW)-.55 E 2.5 -(2.1. System)87 418.8 R(Or)2.5 E(ganization)-.1 E/F2 10/Times-Italic@0 SF -(Sendmail)127 435 Q F1 .874(neither interf)3.374 F .874 -(aces with the user nor does actual mail deli)-.1 F -.15(ve)-.25 G(ry).15 E -5.873(.R)-.65 G(ather)431.241 435 Q 3.373(,i)-.4 G 3.373(tc)459.484 435 S .873 -(ollects a)470.077 435 R .619(message generated by a user interf)102 447 R .619 -(ace program \(UIP\) such as Berk)-.1 F(ele)-.1 E(y)-.15 E F2(Mail)3.12 E F1 -3.12(,M)C 3.12(S[)427.6 447 S(Crock)439.61 447 Q .62(er77b], or)-.1 F 1.428 -(MH [Borden79], edits the message as required by the destination netw)102 459 R -1.427(ork, and calls appropriate)-.1 F .28(mailers to do mail deli)102 473 R --.15(ve)-.25 G .281(ry or queueing for netw).15 F .281(ork transmission)-.1 F -/F3 7/Times-Roman@0 SF(1)364.275 469 Q F1 5.281(.T)367.775 473 S .281 -(his discipline allo)381.666 473 R .281(ws the inser)-.25 F(-)-.2 E 1.354 -(tion of ne)102 485 R 3.854(wm)-.25 G 1.354(ailers at minimum cost.)161.642 485 -R 1.354(In this sense)6.354 F F2(sendmail)3.853 E F1 1.353 -(resembles the Message Processing)3.853 F(Module \(MPM\) of [Postel79b].)102 -497 Q F0 2.5(2.2. Interfaces)87 521 R(to the Outside W)2.5 E(orld)-.75 E F1 -.041(There are three w)127 537.2 R(ays)-.1 E F2(sendmail)2.541 E F1 .041 -(can communicate with the outside w)2.541 F .042(orld, both in recei)-.1 F .042 -(ving and)-.25 F 1.195(in sending mail.)102 549.2 R 1.194 -(These are using the con)6.194 F -.15(ve)-.4 G 1.194(ntional UNIX ar).15 F -1.194(gument v)-.18 F 1.194(ector/return status, speaking)-.15 F(SMTP o)102 -561.2 Q -.15(ve)-.15 G 2.5(rap).15 G(air of UNIX pipes, and speaking SMTP o) -162.53 561.2 Q -.15(ve)-.15 G 2.5(ra).15 G 2.5(ni)348.03 561.2 S -(nterprocess\(or\) channel.)358.31 561.2 Q F0 2.5(2.2.1. Ar)102 585.2 R -(gument v)-.1 E(ector/exit status)-.1 E F1 .52(This technique is the standard \ -UNIX method for communicating with the process.)142 601.4 R 3.02(Al)5.52 G(ist) -494.55 601.4 Q .442(of recipients is sent in the ar)117 613.4 R .441(gument v) --.18 F(ector)-.15 E 2.941(,a)-.4 G .441 -(nd the message body is sent on the standard input.)299.491 613.4 R(An)117 -625.4 Q .351(ything that the mailer prints is simply collected and sent back t\ -o the sender if there were an)-.15 F(y)-.15 E 2.621(problems. The)117 637.4 R --.15(ex)2.621 G .121(it status from the mailer is collected after the message \ -is sent, and a diagnostic).15 F(is printed if appropriate.)117 649.4 Q .32 LW -76 678.8 72 678.8 DL 80 678.8 76 678.8 DL 84 678.8 80 678.8 DL 88 678.8 84 -678.8 DL 92 678.8 88 678.8 DL 96 678.8 92 678.8 DL 100 678.8 96 678.8 DL 104 -678.8 100 678.8 DL 108 678.8 104 678.8 DL 112 678.8 108 678.8 DL 116 678.8 112 -678.8 DL 120 678.8 116 678.8 DL 124 678.8 120 678.8 DL 128 678.8 124 678.8 DL -132 678.8 128 678.8 DL 136 678.8 132 678.8 DL 140 678.8 136 678.8 DL 144 678.8 -140 678.8 DL 148 678.8 144 678.8 DL 152 678.8 148 678.8 DL 156 678.8 152 678.8 -DL 160 678.8 156 678.8 DL 164 678.8 160 678.8 DL 168 678.8 164 678.8 DL 172 -678.8 168 678.8 DL 176 678.8 172 678.8 DL 180 678.8 176 678.8 DL 184 678.8 180 -678.8 DL 188 678.8 184 678.8 DL 192 678.8 188 678.8 DL 196 678.8 192 678.8 DL -200 678.8 196 678.8 DL 204 678.8 200 678.8 DL 208 678.8 204 678.8 DL 212 678.8 -208 678.8 DL 216 678.8 212 678.8 DL/F4 5/Times-Roman@0 SF(1)93.6 689.2 Q/F5 8 -/Times-Roman@0 SF -.12(ex)3.2 K(cept when mailing to a \214le, when).12 E/F6 8 -/Times-Italic@0 SF(sendmail)2 E F5(does the deli)2 E -.12(ve)-.2 G(ry directly) -.12 E(.)-.52 E EP -%%Page: 4 4 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF 192.28(SMM:9-4 SENDMAIL)72 60 R 2.5<8a41>2.5 G 2.5(nI) -383.99 60 S(nter)395.94 60 Q(netw)-.15 E(ork Mail Router)-.1 E 2.5(2.2.2. SMTP) -102 96 R -.1(ove)2.5 G 2.5(rp).1 G(ipes)186.52 96 Q/F1 10/Times-Roman@0 SF .774 -(The SMTP protocol [Postel82] can be used to run an interacti)142 112.2 R 1.074 --.15(ve l)-.25 H .774(ock-step interf).15 F .774(ace with)-.1 F .507 -(the mailer)117 124.2 R 5.507(.A)-.55 G .506(subprocess is still created, b) -175.461 124.2 R .506(ut no recipient addresses are passed to the mailer via)-.2 -F .075(the ar)117 136.2 R .075(gument list.)-.18 F .075(Instead, the)5.075 F -2.575(ya)-.15 G .075 -(re passed one at a time in commands sent to the processes stan-)249.805 136.2 -R .19(dard input.)117 148.2 R(An)5.19 E .19(ything appearing on the standard o\ -utput must be a reply code in a special format.)-.15 F F0 2.5(2.2.3. SMTP)102 -172.2 R -.1(ove)2.5 G 2.5(ra).1 G 2.5(nI)185.96 172.2 S(PC connection)197.91 -172.2 Q F1 .366(This technique is similar to the pre)142 188.4 R .366 -(vious technique, e)-.25 F .366(xcept that it uses a 4.2bsd IPC chan-)-.15 F -.953(nel [UNIX83].)117 200.4 R .953(This method is e)5.953 F .953 -(xceptionally \215e)-.15 F .952 -(xible in that the mailer need not reside on the)-.15 F(same machine.)117 212.4 -Q(It is normally used to connect to a sendmail process on another machine.)5 E -F0 2.5(2.3. Operational)87 236.4 R(Description)2.5 E F1 .228(When a sender w) -127 252.6 R .228(ants to send a message, it issues a request to)-.1 F/F2 10 -/Times-Italic@0 SF(sendmail)2.729 E F1 .229(using one of the three)2.729 F -1.028(methods described abo)102 264.6 R -.15(ve)-.15 G(.).15 E F2(Sendmail) -6.028 E F1 1.028(operates in tw)3.528 F 3.528(od)-.1 G 1.028(istinct phases.) -325.706 264.6 R 1.028(In the \214rst phase, it collects)6.028 F .612 -(and stores the message.)102 276.6 R .612(In the second phase, message deli) -5.612 F -.15(ve)-.25 G .612(ry occurs.).15 F .612(If there were errors during) -5.612 F 1.59(processing during the second phase,)102 288.6 R F2(sendmail)4.09 E -F1 1.59(creates and returns a ne)4.09 F 4.09(wm)-.25 G 1.59 -(essage describing the)415.84 288.6 R -(error and/or returns an status code telling what went wrong.)102 300.6 Q F0 -2.5(2.3.1. Ar)102 324.6 R(gument pr)-.1 E(ocessing and addr)-.18 E(ess parsing) --.18 E F1(If)142 340.8 Q F2(sendmail)3.321 E F1 .821 -(is called using one of the tw)3.321 F 3.322(os)-.1 G .822 -(ubprocess techniques, the ar)320.66 340.8 R .822(guments are \214rst)-.18 F -.797(scanned and option speci\214cations are processed.)117 352.8 R .796 -(Recipient addresses are then collected, either)5.796 F .717(from the command \ -line or from the SMTP RCPT command, and a list of recipients is created.)117 -364.8 R .347(Aliases are e)117 376.8 R .347 -(xpanded at this step, including mailing lists.)-.15 F .347(As much v)5.347 F -.346(alidation as possible of the)-.25 F 1.001 -(addresses is done at this step: syntax is check)117 388.8 R 1.002 -(ed, and local addresses are v)-.1 F 1.002(eri\214ed, b)-.15 F 1.002 -(ut detailed)-.2 F .709 -(checking of host names and addresses is deferred until deli)117 400.8 R -.15 -(ve)-.25 G(ry).15 E 5.708(.F)-.65 G(orw)388.946 400.8 Q .708 -(arding is also performed)-.1 F(as the local addresses are v)117 412.8 Q -(eri\214ed.)-.15 E F2(Sendmail)142 429 Q F1 .307 -(appends each address to the recipient list after parsing.)2.807 F .307 -(When a name is aliased)5.307 F .322(or forw)117 441 R .322(arded, the old nam\ -e is retained in the list, and a \215ag is set that tells the deli)-.1 F -.15 -(ve)-.25 G .322(ry phase to).15 F .479(ignore this recipient.)117 453 R .479 -(This list is k)5.479 F .479(ept free from duplicates, pre)-.1 F -.15(ve)-.25 G -.48(nting alias loops and duplicate).15 F(messages deli)117 465 Q -.15(ve)-.25 -G(rd to the same recipient, as might occur if a person is in tw).15 E 2.5(og) --.1 G(roups.)428.12 465 Q F0 2.5(2.3.2. Message)102 489 R(collection)2.5 E F2 -(Sendmail)142 505.2 Q F1 .454(then collects the message.)2.954 F .454 -(The message should ha)5.454 F .754 -.15(ve a h)-.2 H .453(eader at the be).15 -F(ginning.)-.15 E .778(No formatting requirements are imposed on the message e) -117 517.2 R .778(xcept that the)-.15 F 3.278(ym)-.15 G .778(ust be lines of te) -427.708 517.2 R(xt)-.15 E .78(\(i.e., binary data is not allo)117 529.2 R 3.28 -(wed\). The)-.25 F .779(header is parsed and stored in memory)3.28 F 3.279(,a) --.65 G .779(nd the body of)443.613 529.2 R(the message is sa)117 541.2 Q -.15 -(ve)-.2 G 2.5(di).15 G 2.5(nat)204.97 541.2 S(emporary \214le.)222.19 541.2 Q -3.227 -.8(To s)142 557.4 T 1.627(implify the program interf).8 F 1.628 -(ace, the message is collected e)-.1 F -.15(ve)-.25 G 4.128(ni).15 G 4.128(fn) -420.536 557.4 S 4.128(oa)432.994 557.4 S 1.628(ddresses were)446.562 557.4 R --.25(va)117 569.4 S 2.5(lid. The).25 F(message will be returned with an error) -2.5 E(.)-.55 E F0 2.5(2.3.3. Message)102 593.4 R(deli)2.5 E -.1(ve)-.1 G(ry).1 -E F1 -.15(Fo)142 609.6 S 2.618(re).15 G .117 -(ach unique mailer and host in the recipient list,)162.798 609.6 R F2(sendmail) -2.617 E F1 .117(calls the appropriate mailer)2.617 F(.)-.55 E .619 -(Each mailer in)117 621.6 R -.2(vo)-.4 G .619(cation sends to all users recei) -.2 F .619(ving the message on one host.)-.25 F .62(Mailers that only)5.62 F -(accept one recipient at a time are handled properly)117 633.6 Q(.)-.65 E .47 -(The message is sent to the mailer using one of the same three interf)142 649.8 -R .47(aces used to submit a)-.1 F 1.465(message to sendmail.)117 661.8 R 1.465 -(Each cop)6.465 F 3.965(yo)-.1 G 3.965(ft)263.925 661.8 S 1.465 -(he message is prepended by a customized header)274 661.8 R 6.465(.T)-.55 G(he) -494.56 661.8 Q 1.455(mailer status code is caught and check)117 673.8 R 1.455 -(ed, and a suitable error message gi)-.1 F -.15(ve)-.25 G 3.955(na).15 G 3.955 -(sa)448.115 673.8 S(ppropriate.)460.4 673.8 Q .589(The e)117 685.8 R .589(xit \ -code must conform to a system standard or a generic message \(\231Service una) --.15 F -.25(va)-.2 G(ilable\232\)).25 E(is gi)117 697.8 Q -.15(ve)-.25 G(n.).15 -E EP -%%Page: 5 5 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF(SENDMAIL \212 An Inter)72 60 Q(netw)-.15 E -(ork Mail Router)-.1 E(SMM:9-5)462.9 60 Q 2.5(2.3.4. Queueing)102 96 R -.25(fo) -2.5 G 2.5(rr).25 G(etransmission)192.4 96 Q/F1 10/Times-Roman@0 SF .209(If the\ - mailer returned an status that indicated that it might be able to handle the \ -mail later)142 112.2 R(,)-.4 E/F2 10/Times-Italic@0 SF(sendmail)117 124.2 Q F1 -(will queue the mail and try ag)2.5 E(ain later)-.05 E(.)-.55 E F0 2.5 -(2.3.5. Retur)102 148.2 R 2.5(nt)-.15 G 2.5(os)165.73 148.2 S(ender)177.12 -148.2 Q F1 .588(If errors occur during processing,)142 164.4 R F2(sendmail) -3.088 E F1 .589(returns the message to the sender for retrans-)3.088 F 3.133 -(mission. The)117 176.4 R .632(letter can be mailed back or written in the \ -\214le \231dead.letter\232 in the sender')3.133 F 3.132(sh)-.55 G(ome)486.78 -176.4 Q(directory)117 190.4 Q/F3 7/Times-Roman@0 SF(2)153.1 186.4 Q F1(.)156.6 -190.4 Q F0 2.5(2.4. Message)87 214.4 R(Header Editing)2.5 E F1 1.756 -(Certain editing of the message header occurs automatically)127 230.6 R 6.756 -(.H)-.65 G 1.756(eader lines can be inserted)391.456 230.6 R .41 -(under control of the con\214guration \214le.)102 242.6 R .41 -(Some lines can be mer)5.41 F .41(ged; for e)-.18 F .41 -(xample, a \231From:\232 line and)-.15 F 2.5<6199>102 254.6 S -(Full-name:\232 line can be mer)113.38 254.6 Q -(ged under certain circumstances.)-.18 E F0 2.5(2.5. Con\214guration)87 278.6 R -(File)2.5 E F1 .798(Almost all con\214guration information is read at runtime \ -from an ASCII \214le, encoding macro)127 294.8 R .679 -(de\214nitions \(de\214ning the v)102 306.8 R .678 -(alue of macros used internally\), header declarations \(telling sendmail the) --.25 F 1.009(format of header lines that it will process specially)102 318.8 R -3.509(,i)-.65 G 1.009(.e., lines that it will add or reformat\), mailer)320.398 -318.8 R .478(de\214nitions \(gi)102 330.8 R .478(ving information such as the \ -location and characteristics of each mailer\), and address)-.25 F(re)102 342.8 -Q .428(writing rules \(a limited production system to re)-.25 F .429 -(write addresses which is used to parse and re)-.25 F(write)-.25 E -(the addresses\).)102 354.8 Q 2.828 -.8(To i)127 371 T(mpro).8 E 1.528 -.15 -(ve p)-.15 H 1.228(erformance when reading the con\214guration \214le, a memor\ -y image can be pro-).15 F 2.5(vided. This)102 383 R(pro)2.5 E -(vides a \231compiled\232 form of the con\214guration \214le.)-.15 E F0 2.5 -(3. USA)72 407 R(GE AND IMPLEMENT)-.55 E -.95(AT)-.9 G(ION).95 E 2.5(3.1. Ar)87 -431 R(guments)-.1 E F1(Ar)127 447.2 Q .376 -(guments may be \215ags and addresses.)-.18 F .377(Flags set v)5.377 F .377 -(arious processing options.)-.25 F -.15(Fo)5.377 G(llo).15 E .377(wing \215ag) --.25 F(ar)102 459.2 Q .281(guments, address ar)-.18 F .281(guments may be gi) --.18 F -.15(ve)-.25 G .281(n, unless we are running in SMTP mode.).15 F .28 -(Addresses fol-)5.28 F(lo)102 471.2 Q 2.5(wt)-.25 G(he syntax in RFC822 [Crock) -122.03 471.2 Q(er82] for ARP)-.1 E(ANET address formats.)-.92 E -(In brief, the format is:)5 E 12.5(\(1\) An)107 487.4 R -(ything in parentheses is thro)-.15 E(wn a)-.25 E -.1(wa)-.15 G 2.5(y\().1 G -(as a comment\).)299.65 487.4 Q 12.5(\(2\) An)107 503.6 R .051 -(ything in angle brack)-.15 F .051(ets \(\231<)-.1 F .051 -(>\232\) is preferred o)1.666 F -.15(ve)-.15 G 2.551(ra).15 G -.15(ny)348.064 -503.6 S .051(thing else.).15 F .051(This rule implements the)5.051 F(ARP)133.66 -515.6 Q(ANET standard that addresses of the form)-.92 E -(user name <machine-address>)173.66 531.8 Q(will send to the electronic \231ma\ -chine-address\232 rather than the human \231user name.)133.66 548 Q<9a>-.7 E -12.5(\(3\) Double)107 564.2 R 2.246(quotes \()4.746 F -2.754 2.5("\) q)2.5 H -2.246(uote phrases; backslashes quote characters.)224.188 564.2 R 2.246 -(Backslashes are more)7.246 F(po)133.66 576.2 Q .654(werful in that the)-.25 F -3.154(yw)-.15 G .655(ill cause otherwise equi)229.196 576.2 R -.25(va)-.25 G -.655(lent phrases to compare dif).25 F .655(ferently \212 for)-.25 F -.15(ex) -133.66 588.2 S(ample,).15 E F2(user)2.5 E F1(and)2.5 E F2("user")2.5 E F1 -(are equi)2.5 E -.25(va)-.25 G(lent, b).25 E(ut)-.2 E F2(\\user)2.5 E F1 -(is dif)2.5 E(ferent from either of them.)-.25 E -.15(Pa)127 604.4 S 1.12 -(rentheses, angle brack).15 F 1.12 -(ets, and double quotes must be properly balanced and nested.)-.1 F(The)6.12 E -(re)102 618.4 Q(writing rules control remaining parsing)-.25 E F3(3)266.17 -614.4 Q F1(.)269.67 618.4 Q .32 LW 76 646 72 646 DL 80 646 76 646 DL 84 646 80 -646 DL 88 646 84 646 DL 92 646 88 646 DL 96 646 92 646 DL 100 646 96 646 DL 104 -646 100 646 DL 108 646 104 646 DL 112 646 108 646 DL 116 646 112 646 DL 120 646 -116 646 DL 124 646 120 646 DL 128 646 124 646 DL 132 646 128 646 DL 136 646 132 -646 DL 140 646 136 646 DL 144 646 140 646 DL 148 646 144 646 DL 152 646 148 646 -DL 156 646 152 646 DL 160 646 156 646 DL 164 646 160 646 DL 168 646 164 646 DL -172 646 168 646 DL 176 646 172 646 DL 180 646 176 646 DL 184 646 180 646 DL 188 -646 184 646 DL 192 646 188 646 DL 196 646 192 646 DL 200 646 196 646 DL 204 646 -200 646 DL 208 646 204 646 DL 212 646 208 646 DL 216 646 212 646 DL/F4 5 -/Times-Roman@0 SF(2)93.6 656.4 Q/F5 8/Times-Roman@0 SF(Ob)3.2 I(viously)-.12 E -2.226(,i)-.52 G 2.226(ft)135.246 659.6 S .226(he site gi)142.36 659.6 R .226(v\ -ing the error is not the originating site, the only reasonable option is to ma\ -il back to the sender)-.2 F 4.227(.A)-.44 G(lso,)492.664 659.6 Q .191 -(there are man)72 669.2 R 2.191(ym)-.12 G .19(ore error disposition options, b) -128.213 669.2 R .19(ut the)-.16 F 2.19(yo)-.12 G .19(nly ef)255.514 669.2 R .19 -(fect the error message \212 the \231return to sender\232 function is al)-.2 F --.08(wa)-.08 G .19(ys han-).08 F(dled in one of these tw)72 678.8 Q 2(ow)-.08 G -(ays.)156.272 678.8 Q F4(3)93.6 689.2 Q F5 -(Disclaimer: Some special processing is done after re)3.2 I -(writing local names; see belo)-.2 E -.52(w.)-.2 G EP -%%Page: 6 6 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF 192.28(SMM:9-6 SENDMAIL)72 60 R 2.5<8a41>2.5 G 2.5(nI) -383.99 60 S(nter)395.94 60 Q(netw)-.15 E(ork Mail Router)-.1 E 2.5(3.2. Mail)87 -96 R(to Files and Pr)2.5 E(ograms)-.18 E/F1 10/Times-Roman@0 SF .609 -(Files and programs are le)127 112.2 R .609(gitimate message recipients.)-.15 F -.609(Files pro)5.609 F .609(vide archi)-.15 F -.25(va)-.25 G 3.109(ls).25 G .61 -(torage of mes-)445.02 112.2 R .124 -(sages, useful for project administration and history)102 124.2 R 5.124(.P)-.65 -G .124(rograms are useful as recipients in a v)318.308 124.2 R .124(ariety of) --.25 F .69(situations, for e)102 136.2 R .691(xample, to maintain a public rep\ -ository of systems messages \(such as the Berk)-.15 F(ele)-.1 E(y)-.15 E/F2 10 -/Times-Italic@0 SF(msgs)102 148.2 Q F1(program, or the MARS system [Sattle)2.5 -E(y78]\).)-.15 E(An)127 164.4 Q 3.188(ya)-.15 G .688(ddress passing through th\ -e initial parsing algorithm as a local address \(i.e, not appear)151.698 164.4 -R(-)-.2 E .276(ing to be a v)102 176.4 R .276 -(alid address for another mailer\) is scanned for tw)-.25 F 2.776(os)-.1 G .277 -(pecial cases.)362.128 176.4 R .277(If pre\214x)5.277 F .277(ed by a v)-.15 F -(erti-)-.15 E .18(cal bar \(\231)102 188.4 R .833<7c9a>.833 G 2.68(\)t)-.833 G -.179(he rest of the address is processed as a shell command.)156.456 188.4 R -.179(If the user name be)5.179 F .179(gins with a)-.15 F(slash mark \(\231/)102 -200.4 Q(\232\) the name is used as a \214le name, instead of a login name.).833 -E .241(Files that ha)127 216.6 R .541 -.15(ve s)-.2 H .241 -(etuid or setgid bits set b).15 F .241(ut no e)-.2 F -.15(xe)-.15 G .241 -(cute bits set ha).15 F .541 -.15(ve t)-.2 H .241(hose bits honored if).15 F F2 -(send-)2.742 E(mail)102 228.6 Q F1(is running as root.)2.5 E F0 2.5 -(3.3. Aliasing,)87 252.6 R -.25(Fo)2.5 G(rwarding, Inclusion).25 E F2(Sendmail) -127 268.8 Q F1 1.075(reroutes mail three w)3.575 F 3.575(ays. Aliasing)-.1 F -1.074(applies system wide.)3.575 F -.15(Fo)6.074 G(rw).15 E 1.074(arding allo) --.1 F 1.074(ws each)-.25 F .233 -(user to reroute incoming mail destined for that account.)102 280.8 R .233 -(Inclusion directs)5.233 F F2(sendmail)2.733 E F1 .233(to read a \214le for) -2.733 F 2.5(al)102 292.8 S -(ist of addresses, and is normally used in conjunction with aliasing.)111.72 -292.8 Q F0 2.5(3.3.1. Aliasing)102 316.8 R F1 1.554 -(Aliasing maps names to address lists using a system-wide \214le.)142 333 R -1.553(This \214le is inde)6.553 F -.15(xe)-.15 G 4.053(dt).15 G(o)499 333 Q 1.1 -(speed access.)117 345 R 1.101(Only names that parse as local are allo)6.1 F -1.101(wed as aliases; this guarantees a unique)-.25 F -.1(ke)117 357 S 2.5(y\() --.05 G(since there are no nicknames for the local host\).)137.02 357 Q F0 2.5 -(3.3.2. F)102 381 R(orwarding)-.25 E F1 .651 -(After aliasing, recipients that are local and v)142 397.2 R .651 -(alid are check)-.25 F .65(ed for the e)-.1 F .65(xistence of a \231.for)-.15 F -(-)-.2 E -.1(wa)117 409.2 S .493(rd\232 \214le in their home directory).1 F -5.493(.I)-.65 G 2.994(fi)264.178 409.2 S 2.994(te)273.282 409.2 S .494 -(xists, the message is)283.346 409.2 R F2(not)2.994 E F1 .494 -(sent to that user)2.994 F 2.994(,b)-.4 G .494(ut rather to)459.132 409.2 R .37 -(the list of users in that \214le.)117 421.2 R .37 -(Often this list will contain only one address, and the feature will be)5.37 F -(used for netw)117 433.2 Q(ork mail forw)-.1 E(arding.)-.1 E -.15(Fo)142 449.4 -S(rw).15 E 1.151(arding also permits a user to specify a pri)-.1 F -.25(va)-.25 -G 1.152(te incoming mailer).25 F 6.152(.F)-.55 G 1.152(or e)437.346 449.4 R -1.152(xample, for)-.15 F(-)-.2 E -.1(wa)117 461.4 S(rding to:).1 E -2.5 .833 -("| /)157 477.6 T(usr/local/ne)-.833 E(wmail myname")-.25 E(will use a dif)117 -493.8 Q(ferent incoming mailer)-.25 E(.)-.55 E F0 2.5(3.3.3. Inclusion)102 -517.8 R F1(Inclusion is speci\214ed in RFC 733 [Crock)142 534 Q(er77a] syntax:) --.1 E(:Include: pathname)157 550.2 Q .391 -(An address of this form reads the \214le speci\214ed by)117 566.4 R F2 -(pathname)2.891 E F1 .391(and sends to all users listed in that)2.891 F -(\214le.)117 578.4 Q .644(The intent is)142 594.6 R F2(not)3.144 E F1 .644 -(to support direct use of this feature, b)3.144 F .644 -(ut rather to use this as a subset of)-.2 F 2.5(aliasing. F)117 606.6 R(or e) --.15 E(xample, an alias of the form:)-.15 E -(project: :include:/usr/project/userlist)157 622.8 Q 1.93(is a method of letti\ -ng a project maintain a mailing list without interaction with the system)117 -639 R(administration, e)117 651 Q -.15(ve)-.25 G 2.5(ni).15 G 2.5(ft)203.54 651 -S(he alias \214le is protected.)212.15 651 Q 2.024(It is not necessary to reb) -142 667.2 R 2.024(uild the inde)-.2 F 4.524(xo)-.15 G 4.524(nt)317.822 667.2 S -2.025(he alias database when a :include: list is)330.126 667.2 R(changed.)117 -679.2 Q EP -%%Page: 7 7 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF(SENDMAIL \212 An Inter)72 60 Q(netw)-.15 E -(ork Mail Router)-.1 E(SMM:9-7)462.9 60 Q 2.5(3.4. Message)87 96 R(Collection) -2.5 E/F1 10/Times-Roman@0 SF .857 -(Once all recipient addresses are parsed and v)127 112.2 R .857 -(eri\214ed, the message is collected.)-.15 F .856(The message)5.857 F -(comes in tw)102 124.2 Q 2.5(op)-.1 G -(arts: a message header and a message body)162.73 124.2 Q 2.5(,s)-.65 G -(eparated by a blank line.)343.42 124.2 Q -(The header is formatted as a series of lines of the form)127 140.4 Q -(\214eld-name: \214eld-v)178 156.6 Q(alue)-.25 E(Field-v)102 172.8 Q 1.366 -(alue can be split across lines by starting the follo)-.25 F 1.366 -(wing lines with a space or a tab)-.25 F 6.366(.S)-.4 G(ome)486.78 172.8 Q .211 -(header \214elds ha)102 184.8 R .511 -.15(ve s)-.2 H .211 -(pecial internal meaning, and ha).15 F .511 -.15(ve a)-.2 H .211 -(ppropriate special processing.).15 F .21(Other headers)5.21 F -(are simply passed through.)102 196.8 Q -(Some header \214elds may be added automatically)5 E 2.5(,s)-.65 G -(uch as time stamps.)413.53 196.8 Q .86(The body is a series of te)127 213 R -.861(xt lines.)-.15 F .861(It is completely uninterpreted and untouched, e) -5.861 F .861(xcept that)-.15 F 1.43(lines be)102 225 R 1.43 -(ginning with a dot ha)-.15 F 1.729 -.15(ve t)-.2 H 1.429 -(he dot doubled when transmitted o).15 F -.15(ve)-.15 G 3.929(ra).15 G 3.929 -(nS)407.213 225 S 1.429(MTP channel.)421.702 225 R(This)6.429 E -.15(ex)102 237 -S(tra dot is stripped by the recei).15 E -.15(ve)-.25 G -.55(r.).15 G F0 2.5 -(3.5. Message)87 261 R(Deli)2.5 E -.1(ve)-.1 G(ry).1 E F1 .028 -(The send queue is ordered by recei)127 277.2 R .029 -(ving host before transmission to implement message batch-)-.25 F 3.07 -(ing. Each)102 289.2 R .57(address is mark)3.07 F .57 -(ed as it is sent so rescanning the list is safe.)-.1 F .57(An ar)5.57 F .57 -(gument list is b)-.18 F .57(uilt as)-.2 F 1.138(the scan proceeds.)102 301.2 R -1.139(Mail to \214les is detected during the scan of the send list.)6.139 F -1.139(The interf)6.139 F 1.139(ace to the)-.1 F -(mailer is performed using one of the techniques described in section 2.2.)102 -313.2 Q .996(After a connection is established,)127 329.4 R/F2 10 -/Times-Italic@0 SF(sendmail)3.496 E F1(mak)3.495 E .995(es the per)-.1 F .995 -(-mailer changes to the header and)-.2 F .236(sends the result to the mailer) -102 341.4 R 5.236(.I)-.55 G 2.736(fa)228.406 341.4 S .537 -.15(ny m)238.912 -341.4 T .237(ail is rejected by the mailer).15 F 2.737(,a\215)-.4 G .237 -(ag is set to in)386.628 341.4 R -.2(vo)-.4 G .437 -.1(ke t).2 H .237 -(he return-).1 F(to-sender function after all deli)102 353.4 Q -.15(ve)-.25 G -(ry completes.).15 E F0 2.5(3.6. Queued)87 377.4 R(Messages)2.5 E F1 .163 -(If the mailer returns a \231temporary f)127 393.6 R .163(ailure\232 e)-.1 F -.162(xit status, the message is queued.)-.15 F 2.662(Ac)5.162 G .162 -(ontrol \214le is)455.336 393.6 R .85 -(used to describe the recipients to be sent to and v)102 405.6 R .851 -(arious other parameters.)-.25 F .851(This control \214le is for)5.851 F(-)-.2 -E 1.011(matted as a series of lines, each describing a sender)102 417.6 R 3.511 -(,ar)-.4 G 1.011(ecipient, the time of submission, or some)333.494 417.6 R .776 -(other salient parameter of the message.)102 429.6 R .776 -(The header of the message is stored in the control \214le, so)5.776 F(that th\ -e associated data \214le in the queue is just the temporary \214le that w)102 -441.6 Q(as originally collected.)-.1 E F0 2.5(3.7. Con\214guration)87 465.6 R -F1 .493(Con\214guration is controlled primarily by a con\214guration \214le re\ -ad at startup.)127 481.8 R F2(Sendmail)5.492 E F1(should)2.992 E -(not need to be recomplied e)102 493.8 Q(xcept)-.15 E 12.5(\(1\) T)107 510 R -2.5(oc)-.8 G(hange operating systems \(V6, V7/32V)150.91 510 Q 2.5(,4)-1.29 G -(BSD\).)313.21 510 Q 12.5(\(2\) T)107 526.2 R 2.5(or)-.8 G(emo)149.8 526.2 Q .3 --.15(ve o)-.15 H 2.5(ri).15 G(nsert the DBM \(UNIX database\) library)192.27 -526.2 Q(.)-.65 E 12.5(\(3\) T)107 542.4 R 2.5(oc)-.8 G(hange ARP)150.91 542.4 Q -(ANET reply codes.)-.92 E 12.5(\(4\) T)107 558.6 R 2.5(oa)-.8 G -(dd headers \214elds requiring special processing.)150.91 558.6 Q .434 -(Adding mailers or changing parsing \(i.e., re)102 574.8 R .435 -(writing\) or routing information does not require recom-)-.25 F(pilation.)102 -586.8 Q 1.317(If the mail is being sent by a local user)127 603 R 3.817(,a)-.4 -G 1.317(nd the \214le \231.mailcf\232 e)303.914 603 R 1.317 -(xists in the sender')-.15 F 3.817(sh)-.55 G(ome)486.78 603 Q(directory)102 615 -Q 2.721(,t)-.65 G .221(hat \214le is read as a con\214guration \214le after th\ -e system con\214guration \214le.)145.451 615 R .222(The primary use)5.222 F -(of this feature is to add header lines.)102 627 Q 3.25(The con\214guration \ -\214le encodes macro de\214nitions, header de\214nitions, mailer de\214nitions\ -,)127 643.2 R(re)102 655.2 Q(writing rules, and options.)-.25 E F0 2.5 -(3.7.1. Macr)102 679.2 R(os)-.18 E F1 .332(Macros can be used in three w)142 -695.4 R 2.833(ays. Certain)-.1 F .333(macros transmit unstructured te)2.833 F -.333(xtual informa-)-.15 F .07(tion into the mail system, such as the name)117 -707.4 R F2(sendmail)2.57 E F1 .07 -(will use to identify itself in error messages.)2.57 F 1.247 -(Other macros transmit information from)117 719.4 R F2(sendmail)3.747 E F1 -1.247(to the con\214guration \214le for use in creating)3.747 F EP -%%Page: 8 8 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF 192.28(SMM:9-8 SENDMAIL)72 60 R 2.5<8a41>2.5 G 2.5(nI) -383.99 60 S(nter)395.94 60 Q(netw)-.15 E(ork Mail Router)-.1 E/F1 10 -/Times-Roman@0 SF .312(other \214elds \(such as ar)117 96 R .312(gument v)-.18 -F .312(ectors to mailers\); e.g., the name of the sender)-.15 F 2.811(,a)-.4 G -.311(nd the host and)442.237 96 R .848(user of the recipient.)117 108 R .848 -(Other macros are unused internally)5.848 F 3.348(,a)-.65 G .848 -(nd can be used as shorthand in the)361.142 108 R(con\214guration \214le.)117 -120 Q F0 2.5(3.7.2. Header)102 144 R(declarations)2.5 E F1 .355 -(Header declarations inform)142 160.2 R/F2 10/Times-Italic@0 SF(sendmail)2.854 -E F1 .354(of the format of kno)2.854 F .354(wn header lines.)-.25 F(Kno)5.354 E -.354(wledge of)-.25 F 2.5(af)117 172.2 S .5 -.25(ew h)127.27 172.2 T -(eader lines is b).25 E(uilt into)-.2 E F2(sendmail)2.5 E F1 2.5(,s)C -(uch as the \231From:\232 and \231Date:\232 lines.)284.59 172.2 Q 1.201(Most c\ -on\214gured headers will be automatically inserted in the outgoing message if \ -the)142 188.4 R(y)-.15 E(don')117 200.4 Q 2.5(te)-.18 G -(xist in the incoming message.)144.72 200.4 Q -(Certain headers are suppressed by some mailers.)5 E F0 2.5(3.7.3. Mailer)102 -224.4 R(declarations)2.5 E F1 1.756(Mailer declarations tell)142 240.6 R F2 -(sendmail)4.256 E F1 1.756(of the v)4.256 F 1.756(arious mailers a)-.25 F -.25 -(va)-.2 G 1.756(ilable to it.).25 F 1.755(The de\214nition)6.755 F .119 -(speci\214es the internal name of the mailer)117 252.6 R 2.619(,t)-.4 G .12 -(he pathname of the program to call, some \215ags associ-)285.183 252.6 R 2.036 -(ated with the mailer)117 264.6 R 4.536(,a)-.4 G 2.036(nd an ar)213.894 264.6 R -2.036(gument v)-.18 F 2.036(ector to be used on the call; this v)-.15 F 2.035 -(ector is macro-)-.15 F -.15(ex)117 276.6 S(panded before use.).15 E F0 2.5 -(3.7.4. Addr)102 300.6 R(ess r)-.18 E(ewriting rules)-.18 E F1 .458 -(The heart of address parsing in)142 316.8 R F2(sendmail)2.959 E F1 .459 -(is a set of re)2.959 F .459(writing rules.)-.25 F .459(These are an ordered) -5.459 F .561(list of pattern-replacement rules, \(some)117 328.8 R .561 -(what lik)-.25 F 3.061(eap)-.1 G .561(roduction system, e)328.867 328.8 R .56 -(xcept that order is criti-)-.15 F 1.905 -(cal\), which are applied to each address.)117 340.8 R 1.905(The address is re) -6.905 F 1.906(written te)-.25 F 1.906(xtually until it is either)-.15 F(re)117 -352.8 Q .308(written into a special canonical form \(i.e., a \(mailer)-.25 F -2.807(,h)-.4 G .307(ost, user\) 3-tuple, such as {arpanet, usc-)342.118 352.8 R -.64(isif, postel} representing the address \231postel@usc-isif\232\), or it f) -117 364.8 R .641(alls of)-.1 F 3.141(ft)-.25 G .641(he end.)406.466 364.8 R -.641(When a pattern)5.641 F(matches, the rule is reapplied until it f)117 376.8 -Q(ails.)-.1 E 1.222 -(The con\214guration \214le also supports the editing of addresses into dif)142 -393 R 1.221(ferent formats.)-.25 F -.15(Fo)6.221 G(r).15 E -.15(ex)117 405 S -(ample, an address of the form:).15 E(ucsfcgl!tef)157 421.2 Q -(might be mapped into:)117 437.4 Q(tef@ucsfcgl.UUCP)157 453.6 Q -(to conform to the domain syntax.)117 469.8 Q -.35(Tr)5 G -(anslations can also be done in the other direction.).35 E F0 2.5 -(3.7.5. Option)102 493.8 R(setting)2.5 E F1 1.168(There are se)142 510 R -.15 -(ve)-.25 G 1.169(ral options that can be set from the con\214guration \214le.) -.15 F 1.169(These include the)6.169 F(pathnames of v)117 522 Q -(arious support \214les, timeouts, def)-.25 E(ault modes, etc.)-.1 E F0 2.5 -(4. COMP)72 546 R(ARISON WITH O)-.74 E(THER MAILERS)-.4 E 2.5(4.1. Deli)87 570 -R -.1(ve)-.1 G(rmail).1 E F2(Sendmail)127 586.2 Q F1(is an outgro)2.5 E(wth of) --.25 E F2(delivermail)2.5 E F1 5(.T)C(he primary dif)301.18 586.2 Q -(ferences are:)-.25 E 12.5(\(1\) Con\214guration)107 602.4 R .273 -(information is not compiled in.)2.773 F .272(This change simpli\214es man) -5.273 F 2.772(yo)-.15 G 2.772(ft)445.686 602.4 S .272(he problems)454.568 602.4 -R(of mo)133.66 614.4 Q(ving to other machines.)-.15 E(It also allo)5 E -(ws easy deb)-.25 E(ugging of ne)-.2 E 2.5(wm)-.25 G(ailers.)413.89 614.4 Q -12.5(\(2\) Address)107 630.6 R .681(parsing is more \215e)3.181 F 3.182 -(xible. F)-.15 F .682(or e)-.15 F(xample,)-.15 E F2(delivermail)3.182 E F1 .682 -(only supported one g)3.182 F(ate)-.05 E -.1(wa)-.25 G 3.182(yt).1 G(o)499 -630.6 Q(an)133.66 642.6 Q 2.817(yn)-.15 G(etw)155.767 642.6 Q .317 -(ork, whereas)-.1 F F2(sendmail)2.817 E F1 .317(can be sensiti)2.817 F .616 --.15(ve t)-.25 H 2.816(oh).15 G .316(ost names and reroute to dif)345.224 642.6 -R .316(ferent g)-.25 F(ate-)-.05 E -.1(wa)133.66 654.6 S(ys.).1 E 12.5(\(3\) F) -107 670.8 R(orw)-.15 E 1.627(arding and :include: features eliminate the requi\ -rement that the system alias \214le be)-.1 F .074(writable by an)133.66 682.8 R -2.574(yu)-.15 G .073 -(ser \(or that an update program be written, or that the system administration) -203.442 682.8 R(mak)133.66 694.8 Q 2.5(ea)-.1 G(ll changes\).)162.16 694.8 Q -(\(4\))107 711 Q F2(Sendmail)133.66 711 Q F1 .4 -(supports message batching across netw)2.9 F .401 -(orks when a message is being sent to mul-)-.1 F(tiple recipients.)133.66 723 Q -EP -%%Page: 9 9 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF(SENDMAIL \212 An Inter)72 60 Q(netw)-.15 E -(ork Mail Router)-.1 E(SMM:9-9)462.9 60 Q/F1 10/Times-Roman@0 SF 12.5(\(5\) A) -107 96 R .875(mail queue is pro)3.375 F .874(vided in)-.15 F/F2 10 -/Times-Italic@0 SF(sendmail.)3.374 E F1 .874(Mail that cannot be deli)5.874 F --.15(ve)-.25 G .874(red immediately b).15 F .874(ut can)-.2 F 1.063 -(potentially be deli)133.66 108 R -.15(ve)-.25 G 1.064 -(red later is stored in this queue for a later retry).15 F 6.064(.T)-.65 G -1.064(he queue also pro-)427.218 108 R .896(vides a b)133.66 120 R(uf)-.2 E -.896(fer ag)-.25 F .895 -(ainst system crashes; after the message has been collected it may be reli-) --.05 F(ably redeli)133.66 132 Q -.15(ve)-.25 G(red e).15 E -.15(ve)-.25 G 2.5 -(ni).15 G 2.5(ft)224.22 132 S(he system crashes during the initial deli)232.83 -132 Q -.15(ve)-.25 G(ry).15 E(.)-.65 E(\(6\))107 148.2 Q F2(Sendmail)133.66 -148.2 Q F1 .197(uses the netw)2.696 F .197(orking support pro)-.1 F .197 -(vided by 4.2BSD to pro)-.15 F .197(vide a direct interf)-.15 F .197(ace net-) --.1 F -.1(wo)133.66 160.2 S .07(rks such as the ARP).1 F .07 -(ANET and/or Ethernet using SMTP \(the Simple Mail T)-.92 F .07(ransfer Proto-) --.35 F(col\) o)133.66 172.2 Q -.15(ve)-.15 G 2.5(raT).15 G(CP/IP connection.) -184.73 172.2 Q F0 2.5(4.2. MMDF)87 196.2 R F1 .957(MMDF [Crock)127 212.4 R .957 -(er79] spans a wider problem set than)-.1 F F2(sendmail)3.458 E F1 5.958(.F)C -.958(or e)395.058 212.4 R .958(xample, the domain of)-.15 F .721 -(MMDF includes a \231phone netw)102 224.4 R .721(ork\232 mailer)-.1 F 3.221(,w) --.4 G(hereas)290.516 224.4 Q F2(sendmail)3.221 E F1 .721(calls on pree)3.221 F -.72(xisting mailers in most)-.15 F(cases.)102 236.4 Q .175(MMDF and)127 252.6 R -F2(sendmail)2.675 E F1 .175 -(both support aliasing, customized mailers, message batching, automatic)2.675 F -(forw)102 264.6 Q .792(arding to g)-.1 F(ate)-.05 E -.1(wa)-.25 G .792 -(ys, queueing, and retransmission.).1 F .792(MMDF supports tw)5.792 F .792 -(o-stage timeout, which)-.1 F F2(sendmail)102 276.6 Q F1(does not support.)2.5 -E(The con\214guration for MMDF is compiled into the code)127 294.8 Q/F3 7 -/Times-Roman@0 SF(4)348.65 290.8 Q F1(.)352.15 294.8 Q .037 -(Since MMDF does not consider backw)127 311 R .037 -(ards compatibility as a design goal, the address parsing)-.1 F(is simpler b) -102 323 Q(ut much less \215e)-.2 E(xible.)-.15 E 1.159(It is some)127 341.2 R -1.159(what harder to inte)-.25 F 1.159(grate a ne)-.15 F 3.659(wc)-.25 G -(hannel)302.802 341.2 Q F3(5)329.462 337.2 Q F1 1.159(into MMDF)336.621 341.2 R -6.16(.I)-.8 G 3.66(np)397.59 341.2 S(articular)411.25 341.2 Q 3.66(,M)-.4 G -1.16(MDF must)459.22 341.2 R(kno)102 353.2 Q 3.225(wt)-.25 G .725(he location \ -and format of host tables for all channels, and the channel must speak a speci\ -al)129.975 353.2 R 2.525(protocol. This)102 365.2 R(allo)2.525 E .025 -(ws MMDF to do additional v)-.25 F .025(eri\214cation \(such as v)-.15 F .025 -(erifying host names\) at submis-)-.15 F(sion time.)102 377.2 Q 1.761 -(MMDF strictly separates the submission and deli)127 393.4 R -.15(ve)-.25 G -1.761(ry phases.).15 F(Although)6.761 E F2(sendmail)4.261 E F1 1.76(has the) -4.261 F .784(concept of each of these stages, the)102 405.4 R 3.284(ya)-.15 G -.784(re inte)260.068 405.4 R .785(grated into one program, whereas in MMDF the) --.15 F 3.285(ya)-.15 G(re)496.23 405.4 Q(split into tw)102 417.4 Q 2.5(op)-.1 G -(rograms.)162.19 417.4 Q F0 2.5(4.3. Message)87 441.4 R(Pr)2.5 E -(ocessing Module)-.18 E F1 .925 -(The Message Processing Module \(MPM\) discussed by Postel [Postel79b] matches) -127 457.6 R F2(sendmail)3.425 E F1 1.364 -(closely in terms of its basic architecture.)102 469.6 R(Ho)6.364 E(we)-.25 E --.15(ve)-.25 G 2.164 -.4(r, l).15 H(ik).4 E 3.864(eM)-.1 G(MDF)347.526 469.6 Q -3.864(,t)-.8 G 1.365(he MPM includes the netw)377.54 469.6 R(ork)-.1 E(interf) -102 481.6 Q(ace softw)-.1 E(are as part of its domain.)-.1 E .408 -(MPM also postulates a duple)127 497.8 R 2.907(xc)-.15 G .407 -(hannel to the recei)256.937 497.8 R -.15(ve)-.25 G 1.207 -.4(r, a).15 H 2.907 -(sd).4 G .407(oes MMDF)365.362 497.8 R 2.907(,t)-.8 G .407(hus allo)419.546 -497.8 R .407(wing simpler)-.25 F .302 -(handling of errors by the mailer than is possible in)102 509.8 R F2(sendmail) -2.802 E F1 5.302(.W)C .302(hen a message queued by)362.24 509.8 R F2(sendmail) -2.802 E F1 .23(is sent, an)102 521.8 R 2.73(ye)-.15 G .23 -(rrors must be returned to the sender by the mailer itself.)154.2 521.8 R .229 -(Both MPM and MMDF mail-)5.229 F .883(ers can return an immediate error respon\ -se, and a single error processor can create an appropriate)102 533.8 R -(response.)102 545.8 Q 2.24 -(MPM prefers passing the message as a structured object, with type-length-v)127 -564 R 2.24(alue tuples)-.25 F F3(6)498 560 Q F1(.)501.5 564 Q .874(Such a con) -102 576 R -.15(ve)-.4 G .874(ntion requires a much higher de).15 F .875 -(gree of cooperation between mailers than is required)-.15 F(by)102 588 Q F2 -(sendmail)2.796 E F1 5.296(.M)C .296(PM also assumes a uni)167.592 588 R -.15 -(ve)-.25 G .296(rsally agreed upon internet name space \(with each address).15 -F(in the form of a net-host-user tuple\), which)102 600 Q F2(sendmail)2.5 E F1 -(does not.)2.5 E .32 LW 76 642 72 642 DL 80 642 76 642 DL 84 642 80 642 DL 88 -642 84 642 DL 92 642 88 642 DL 96 642 92 642 DL 100 642 96 642 DL 104 642 100 -642 DL 108 642 104 642 DL 112 642 108 642 DL 116 642 112 642 DL 120 642 116 642 -DL 124 642 120 642 DL 128 642 124 642 DL 132 642 128 642 DL 136 642 132 642 DL -140 642 136 642 DL 144 642 140 642 DL 148 642 144 642 DL 152 642 148 642 DL 156 -642 152 642 DL 160 642 156 642 DL 164 642 160 642 DL 168 642 164 642 DL 172 642 -168 642 DL 176 642 172 642 DL 180 642 176 642 DL 184 642 180 642 DL 188 642 184 -642 DL 192 642 188 642 DL 196 642 192 642 DL 200 642 196 642 DL 204 642 200 642 -DL 208 642 204 642 DL 212 642 208 642 DL 216 642 212 642 DL/F4 5/Times-Roman@0 -SF(4)93.6 652.4 Q/F5 8/Times-Roman@0 SF .179 -(Dynamic con\214guration tables are currently being considered for MMDF; allo) -3.2 J .18(wing the installer to select either compiled or dy-)-.2 F -(namic tables.)72 665.2 Q F4(5)93.6 675.6 Q F5(The MMDF equi)3.2 I -.2(va)-.2 G -(lent of a).2 E/F6 8/Times-Italic@0 SF(sendmail)2 E F5(\231mailer)2 E -.56 -<2e9a>-.44 G F4(6)93.6 689.2 Q F5(This is similar to the NBS standard.)3.2 I EP -%%Page: 10 10 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF 187.28(SMM:9-10 SENDMAIL)72 60 R 2.5<8a41>2.5 G 2.5(nI) -383.99 60 S(nter)395.94 60 Q(netw)-.15 E(ork Mail Router)-.1 E 2.5(5. EV)72 96 -R(ALU)-1.35 E -.95(AT)-.6 G(IONS AND FUTURE PLANS).95 E/F1 10/Times-Italic@0 SF -(Sendmail)112 112.2 Q/F2 10/Times-Roman@0 SF 1.851(is designed to w)4.351 F -1.851(ork in a nonhomogeneous en)-.1 F 4.352(vironment. Ev)-.4 F 1.852 -(ery attempt is made to)-.15 F -.2(avo)87 124.2 S 1.037 -(id imposing unnecessary constraints on the underlying mailers.).2 F 1.036 -(This goal has dri)6.036 F -.15(ve)-.25 G 3.536(nm).15 G 1.036(uch of the) -461.938 124.2 R 2.723(design. One)87 136.2 R .223(of the major problems has be\ -en the lack of a uniform address space, as postulated in [Pos-)2.723 F -(tel79a] and [Postel79b].)87 148.2 Q 2.647(An)112 164.4 S .147(onuniform addre\ -ss space implies that a path will be speci\214ed in all addresses, either e) -126.867 164.4 R(xplicitly)-.15 E .472 -(\(as part of the address\) or implicitly \(as with implied forw)87 176.4 R -.473(arding to g)-.1 F(ate)-.05 E -.1(wa)-.25 G 2.973(ys\). This).1 F .473 -(restriction has the)2.973 F .493(unpleasant ef)87 188.4 R .493 -(fect of making replying to messages e)-.25 F .493(xceedingly dif)-.15 F .493 -(\214cult, since there is no one \231address\232)-.25 F(for an)87 200.4 Q 2.5 -(yp)-.15 G(erson, b)122.95 200.4 Q(ut only a w)-.2 E -(ay to get there from where)-.1 E -.15(ve)-.25 G 2.5(ry).15 G(ou are.)324.7 -200.4 Q(Interf)112 216.6 Q .448(acing to mail programs that were not initially\ - intended to be applied in an internet en)-.1 F(viron-)-.4 E(ment has been ama\ -zingly successful, and has reduced the job to a manageable task.)87 228.6 Q F1 -(Sendmail)112 244.8 Q F2 2.906(has kno)5.406 F 2.906(wledge of a fe)-.25 F -5.406(wd)-.25 G(if)271.126 244.8 Q 2.906(\214cult en)-.25 F 2.906(vironments b) --.4 F 2.906(uilt in.)-.2 F 2.905(It generates ARP)7.906 F(ANET)-.92 E .648(FTP\ -/SMTP compatible error messages \(prepended with three-digit numbers [Neigus73\ -, Postel74, Pos-)87 256.8 R .771(tel82]\) as necessary)87 268.8 R 3.271(,o)-.65 -G .771(ptionally generates UNIX-style \231From\232 lines on the front of messa\ -ges for some)177.523 268.8 R 1.669(mailers, and kno)87 280.8 R 1.669(ws ho)-.25 -F 4.169(wt)-.25 G 4.169(op)195.666 280.8 S 1.669(arse the same lines on input.) -209.835 280.8 R 1.67(Also, error handling has an option cus-)6.67 F -(tomized for BerkNet.)87 292.8 Q 1.482(The decision to a)112 309 R -.2(vo)-.2 G -1.482(id doing an).2 F 3.982(yt)-.15 G 1.481(ype of deli)254.222 309 R -.15(ve) --.25 G 1.481(ry where possible \(e).15 F -.15(ve)-.25 G 1.481 -(n, or perhaps especially).15 F(,)-.65 E .574(local deli)87 321 R -.15(ve)-.25 -G .574(ry\) has turned out to be a good idea.).15 F(Ev)5.574 E .574 -(en with local deli)-.15 F -.15(ve)-.25 G(ry).15 E 3.074(,t)-.65 G .575 -(here are issues of the loca-)394.776 321 R .469(tion of the mailbox, the form\ -at of the mailbox, the locking protocol used, etc., that are best decided by)87 -333 R .038(other programs.)87 345 R .038(One surprisingly major anno)5.038 F -.038(yance in man)-.1 F 2.538(yi)-.15 G .038 -(nternet mailers is that the location and for)333.684 345 R(-)-.2 E .138 -(mat of local mail is b)87 357 R .138(uilt in.)-.2 F .137 -(The feeling seems to be that local mail is so common that it should be ef) -5.137 F<8c2d>-.25 E 3.045(cient. This)87 369 R .545 -(feeling is not born out by our e)3.045 F .545(xperience; on the contrary)-.15 -F 3.045(,t)-.65 G .545(he location and format of mail-)376.575 369 R(box)87 381 -Q(es seems to v)-.15 E(ary widely from system to system.)-.25 E .681 -(The ability to automatically generate a response to incoming mail \(by forw) -112 397.2 R .68(arding mail to a pro-)-.1 F .435 -(gram\) seems useful \(\231I am on v)87 409.2 R .435 -(acation until late August....)-.25 F 2.935(\232\) b)-.7 F .435 -(ut can create problems such as forw)-.2 F(ard-)-.1 E .143(ing loops \(tw)87 -421.2 R 2.643(op)-.1 G .143(eople on v)152.609 421.2 R .143(acation whose prog\ -rams send notes back and forth, for instance\) if these pro-)-.25 F .732 -(grams are not well written.)87 433.2 R 3.232(Ap)5.732 G .732 -(rogram could be written to do standard tasks correctly)218.592 433.2 R 3.233 -(,b)-.65 G .733(ut this w)450.404 433.2 R(ould)-.1 E(solv)87 445.2 Q 2.5(et) --.15 G(he general case.)113.24 445.2 Q .225 -(It might be desirable to implement some form of load limiting.)112 461.4 R -2.725(Ia)5.225 G 2.724(mu)380.8 461.4 S(na)396.304 461.4 Q -.1(wa)-.15 G .224 -(re of an).1 F 2.724(ym)-.15 G .224(ail system)463.496 461.4 R -(that addresses this problem, nor am I a)87 473.4 Q -.1(wa)-.15 G(re of an).1 E -2.5(yr)-.15 G(easonable solution at this time.)294.05 473.4 Q .113(The con\214\ -guration \214le is currently practically inscrutable; considerable con)112 -489.6 R -.15(ve)-.4 G .114(nience could be real-).15 F(ized with a higher)87 -501.6 Q(-le)-.2 E -.15(ve)-.25 G 2.5(lf).15 G(ormat.)186.93 501.6 Q .778(It se\ -ems clear that common protocols will be changing soon to accommodate changing \ -require-)112 517.8 R 2.774(ments and en)87 529.8 R 5.274(vironments. These)-.4 -F 2.774(changes will include modi\214cations to the message header \(e.g.,) -5.274 F .859([NBS80]\) or to the body of the message itself \(such as for mult\ -imedia messages [Postel80]\).)87 541.8 R(Experi-)5.859 E -(ence indicates that these changes should be relati)87 553.8 Q -.15(ve)-.25 G -(ly tri).15 E(vial to inte)-.25 E(grate into the e)-.15 E(xisting system.)-.15 -E .811(In tightly coupled en)112 570 R .812(vironments, it w)-.4 F .812 -(ould be nice to ha)-.1 F 1.112 -.15(ve a n)-.2 H .812(ame serv).15 F .812 -(er such as Grapvine [Bir)-.15 F(-)-.2 E .095(rell82] inte)87 582 R .095 -(grated into the mail system.)-.15 F .095(This w)5.095 F .095(ould allo)-.1 F -2.594(was)-.25 G .094(ite such as \231Berk)330.768 582 R(ele)-.1 E .094 -(y\232 to appear as a single)-.15 F 2.606 -(host, rather than as a collection of hosts, and w)87 594 R 2.606(ould allo)-.1 -F 5.106(wp)-.25 G 2.606(eople to mo)352.786 594 R 2.906 -.15(ve t)-.15 H 2.606 -(ransparently among).15 F 1.664(machines without ha)87 606 R 1.664 -(ving to change their addresses.)-.2 F 1.664(Such a f)6.664 F 1.664(acility w) --.1 F 1.663(ould require an automatically)-.1 F .428 -(updated database and some method of resolving con\215icts.)87 618 R .428 -(Ideally this w)5.428 F .428(ould be ef)-.1 F(fecti)-.25 E .728 -.15(ve e)-.25 -H -.15(ve)-.1 G 2.928(nw).15 G(ithout)480.66 618 Q .184 -(all hosts being under a single management.)87 630 R(Ho)5.184 E(we)-.25 E -.15 -(ve)-.25 G .984 -.4(r, i).15 H 2.684(ti).4 G 2.683(sn)317.576 630 S .183 -(ot clear whether this feature should be inte-)329.149 630 R -(grated into the aliasing f)87 642 Q(acility or should be considered a \231v) --.1 E(alue added\232 feature outside)-.25 E F1(sendmail)2.5 E F2(itself.)2.5 E -.79(As a more interesting case, the CSNET name serv)112 658.2 R .791 -(er [Solomon81] pro)-.15 F .791(vides an f)-.15 F .791(acility that goes)-.1 F -(be)87 670.2 Q .375(yond a single tightly-coupled en)-.15 F 2.875 -(vironment. Such)-.4 F 2.875(af)2.875 G .375(acility w)308.675 670.2 R .374 -(ould normally e)-.1 F .374(xist outside of)-.15 F F1(sendmail)2.874 E F2(ho)87 -682.2 Q(we)-.25 E -.15(ve)-.25 G -.55(r.).15 G EP -%%Page: 11 11 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF(SENDMAIL \212 An Inter)72 60 Q(netw)-.15 E -(ork Mail Router)-.1 E(SMM:9-11)457.9 60 Q -.55(AC)72 96 S(KNO).55 E -(WLEDGEMENTS)-.5 E/F1 10/Times-Roman@0 SF 1.203(Thanks are due to K)97 112.2 R -1.204 -(urt Shoens for his continual cheerful assistance and good advice, Bill Jo)-.15 -F 3.704(yf)-.1 G(or)495.67 112.2 Q .102 -(pointing me in the correct direction \(o)72 124.2 R -.15(ve)-.15 G 2.602(ra) -.15 G .102(nd o)244.324 124.2 R -.15(ve)-.15 G .102 -(r\), and Mark Horton for more advice, prodding, and man).15 F(y)-.15 E .453 -(of the good ideas.)72 136.2 R -.15(Ku)5.453 G .453 -(rt and Eric Schmidt are to be credited for using).15 F/F2 10/Times-Italic@0 SF -(delivermail)2.953 E F1 .453(as a serv)2.953 F .453(er for their pro-)-.15 F -1.663(grams \()72 148.2 R F2(Mail)A F1 1.663(and BerkNet respecti)4.163 F -.15 -(ve)-.25 G 1.663(ly\) before an).15 F 4.163(ys)-.15 G 1.663 -(ane person should ha)291.091 148.2 R -.15(ve)-.2 G 4.163(,a).15 G 1.662 -(nd making the necessary)400.423 148.2 R .078 -(modi\214cations promptly and happily)72 160.2 R 5.078(.E)-.65 G .078(ric g) -228.332 160.2 R -2.25 -.2(av e)-.05 H .079 -(me considerable advice about the perils of netw)2.778 F .079(ork softw)-.1 F -(are)-.1 E .179(which sa)72 172.2 R -.15(ve)-.2 G 2.679(dm).15 G 2.679(ea) -131.998 172.2 S 2.679(nu)143.557 172.2 S(nkno)156.236 172.2 Q .178 -(wn amount of w)-.25 F .178(ork and grief.)-.1 F .178 -(Mark did the original implementation of the DBM)5.178 F -.15(ve)72 184.2 S -.341(rsion of aliasing, installed the VFORK code, wrote the current v).15 F -.341(ersion of)-.15 F F2(rmail)2.841 E F1 2.841(,a)C .341(nd w)411.083 184.2 R -.342(as the person who)-.1 F .61(really con)72 196.2 R .61 -(vinced me to put the w)-.4 F .61(ork into)-.1 F F2(delivermail)3.109 E F1 .609 -(to turn it into)3.109 F F2(sendmail)3.109 E F1 5.609(.K)C .609(urt deserv) -398.753 196.2 R .609(es accolades for)-.15 F(using)72 208.2 Q F2(sendmail)2.57 -E F1 .07(when I w)2.57 F .07(as myself afraid to tak)-.1 F 2.57(et)-.1 G .07 -(he risk; ho)271.01 208.2 R 2.57(wap)-.25 G .07 -(erson can continue to be so enthusiastic in)334.92 208.2 R(the f)72 220.2 Q -(ace of so much bitter reality is be)-.1 E(yond me.)-.15 E -.15(Ku)97 236.4 S -1.505(rt, Mark, Kirk McK).15 F 1.505(usick, Marvin Solomon, and man)-.15 F -4.005(yo)-.15 G 1.504(thers ha)345.79 236.4 R 1.804 -.15(ve r)-.2 H -.25(ev).15 -G(ie).25 E 1.504(wed this paper)-.25 F 4.004(,g)-.4 G -.25(iv)483.69 236.4 S -(ing).25 E(considerable useful advice.)72 248.4 Q .846 -(Special thanks are reserv)97 264.6 R .846(ed for Mik)-.15 F 3.346(eS)-.1 G -(tonebrak)256.786 264.6 Q .846(er at Berk)-.1 F(ele)-.1 E 3.347(ya)-.15 G .847 -(nd Bob Epstein at Britton-Lee, who)356.995 264.6 R .542(both kno)72 276.6 R -.542(wingly allo)-.25 F .542(wed me to put so much w)-.25 F .541 -(ork into this project when there were so man)-.1 F 3.041(yo)-.15 G .541 -(ther things I)454.588 276.6 R(really should ha)72 288.6 Q .3 -.15(ve b)-.2 H -(een w).15 E(orking on.)-.1 E EP -%%Page: 12 12 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Roman@0 SF(REFERENCES)256.605 132 Q 62.73([Birrell82] Birrell,)72 -148.2 R 1.084(A. D., Le)3.584 F 1.084(vin, R., Needham, R. M., and Schroeder) --.25 F 3.584(,M)-.4 G 3.585(.D)433.49 148.2 S 1.085(., \231Grape)446.795 148.2 -R(vine:)-.25 E(An Ex)180 160.2 Q(ercise in Distrib)-.15 E(uted Computing.)-.2 E -5<9a49>-.7 G(n)348.66 160.2 Q/F1 10/Times-Italic@0 SF(Comm. A.C.M. 25,)2.5 E F0 -(4, April 82.)2.5 E 59.4([Borden79] Borden,)72 176.4 R .796 -(S., Gaines, R. S., and Shapiro, N. Z.,)3.296 F F1 .795(The MH Messa)3.295 F -.995 -.1(ge H)-.1 H .795(andling Sys-).1 F(tem: User)180 188.4 Q(s' Manual.)-.1 -E F0(R-2367-P)5 E(AF)-.92 E 5(.R)-.8 G(and Corporation.)332.06 188.4 Q -(October 1979.)5 E([Crock)72 204.6 Q 52.29(er77a] Crock)-.1 F(er)-.1 E 2.508 -(,D)-.4 G 2.508(.H)223.938 204.6 S .008(., V)236.166 204.6 R .009 -(ittal, J. J., Pogran, K. T)-.6 F .009(., and Henderson, D. A. Jr)-.74 F(.,) --.55 E F1(Standar)2.509 E 2.509(df)-.37 G(or)495.11 204.6 Q .955(the F)180 -216.6 R .955(ormat of ARP)-1.05 F 3.454(AN)-.9 G .954(etwork T)272.978 216.6 R --.2(ex)-.92 G 3.454(tM).2 G(essa)331.536 216.6 Q -.1(ge)-.1 G(s.).1 E F0 .954 -(RFC 733, NIC 41952.)5.954 F .954(In [Fein-)5.954 F 2.5(ler78]. No)180 228.6 R --.15(ve)-.15 G(mber 1977.).15 E([Crock)72 244.8 Q 51.73(er77b] Crock)-.1 F(er) --.1 E 3.04(,D)-.4 G 3.04(.H)224.47 244.8 S(.,)237.23 244.8 Q F1 -1.55 -.55 -(Fr a)3.04 H(me).55 E .54(work and Functions of the MS P)-.15 F(er)-.8 E .54 -(sonal Messa)-.1 F .74 -.1(ge S)-.1 H(ystem.).1 E F0(R-2134-ARP)180 256.8 Q -(A, Rand Corporation, Santa Monica, California.)-.92 E(1977.)5 E([Crock)72 273 -Q 56.73(er79] Crock)-.1 F(er)-.1 E 2.557(,D)-.4 G 2.557(.H)223.987 273 S .056 -(., Szurk)236.264 273 R -.25(ow)-.1 G .056(ski, E. S., and F).25 F(arber)-.15 E -2.556(,D)-.4 G 2.556(.J)374.85 273 S(.,)383.796 273 Q F1 .056 -(An Internetwork Memo Dis-)2.556 F(trib)180 285 Q 1.341(ution F)-.2 F 1.341 -(acility \212 MMDF)-.75 F(.)-1.35 E F0 1.341 -(6th Data Communication Symposium, Asilomar)6.341 F(.)-.55 E(No)180 297 Q -.15 -(ve)-.15 G(mber 1979.).15 E([Crock)72 313.2 Q 56.73(er82] Crock)-.1 F(er)-.1 E -3.383(,D)-.4 G 3.383(.H)224.813 313.2 S(.,)237.916 313.2 Q F1(Standar)3.383 E -3.383(df)-.37 G .883(or the F)288.762 313.2 R .882(ormat of Arpa Internet T) --1.05 F -.2(ex)-.92 G 3.382(tM).2 G(essa)446.368 313.2 Q -.1(ge)-.1 G(s.).1 E -F0(RFC)5.882 E 4.197(822. Netw)180 325.2 R 1.697(ork Information Center)-.1 F -4.197(,S)-.4 G 1.698(RI International, Menlo P)333.768 325.2 R 1.698 -(ark, California.)-.15 F(August 1982.)180 337.2 Q 53.3([Metcalfe76] Metcalfe,) -72 353.4 R .727(R., and Boggs, D., \231Ethernet: Distrib)3.227 F .727(uted P) --.2 F(ack)-.15 E .727(et Switching for Local)-.1 F(Computer Netw)180 365.4 Q -(orks\232,)-.1 E F1(Communications of the A)2.5 E(CM 19,)-.3 E F0 2.5(7. July) -2.5 F(1976.)2.5 E 60.51([Feinler78] Feinler)72 381.6 R 4.438(,E)-.4 G 1.938 -(., and Postel, J.)220.978 381.6 R(\(eds.\),)6.938 E F1(ARP)4.438 E 1.938 -(ANET Pr)-.9 F 1.938(otocol Handbook.)-.45 F F0 1.938(NIC 7104,)6.938 F(Netw) -180 393.6 Q(ork Information Center)-.1 E 2.5(,S)-.4 G -(RI International, Menlo P)304.48 393.6 Q(ark, California.)-.15 E(1978.)5 E -69.39([NBS80] National)72 409.8 R 1.46(Bureau of Standards,)3.96 F F1 1.46 -(Speci\214cation of a Dr)3.96 F 1.46(aft Messa)-.15 F 1.66 -.1(ge F)-.1 H 1.46 -(ormat Stan-)-.95 F(dar)180 421.8 Q(d.)-.37 E F0(Report No. ICST/CBOS 80-2.)5 E -(October 1980.)5 E 60.51([Neigus73] Neigus,)72 438 R(N.,)5.186 E F1 -.45(Fi) -5.186 G 2.686(le T).45 F -.15(ra)-.55 G 2.686(nsfer Pr).15 F 2.686 -(otocol for the ARP)-.45 F 5.187(AN)-.9 G(etwork.)402.599 438 Q F0 2.687 -(RFC 542, NIC)7.687 F 2.5(17759. In)180 450 R 2.5([Feinler78]. August,)2.5 F -(1973.)2.5 E([No)72 466.2 Q 55.21(witz78a] No)-.25 F 1.633 -(witz, D. A., and Lesk, M. E.,)-.25 F F1 4.132(AD)4.132 G 1.632 -(ial-Up Network of UNIX Systems.)338.9 466.2 R F0(Bell)6.632 E 5.403 -(Laboratories. In)180 478.2 R 2.904(UNIX Programmer')5.403 F 5.404(sM)-.55 G -2.904(anual, Se)356.024 478.2 R -.15(ve)-.25 G 2.904(nth Edition, V).15 F 2.904 -(olume 2.)-1.29 F(August, 1978.)180 490.2 Q([No)72 506.4 Q 54.65(witz78b] No) --.25 F .633(witz, D. A.,)-.25 F F1 .632(Uucp Implementation Description.)3.132 -F F0 .632(Bell Laboratories.)5.632 F .632(In UNIX)5.632 F(Programmer')180 518.4 -Q 2.5(sM)-.55 G(anual, Se)248.05 518.4 Q -.15(ve)-.25 G(nth Edition, V).15 E -(olume 2.)-1.29 E(October)5 E 2.5(,1)-.4 G(978.)431.22 518.4 Q 64.39 -([Postel74] Postel,)72 534.6 R .24(J., and Neigus, N., Re)2.74 F .241 -(vised FTP Reply Codes.)-.25 F .241(RFC 640, NIC 30843.)5.241 F(In)5.241 E 2.5 -([Feinler78]. June,)180 546.6 R(1974.)2.5 E 64.39([Postel77] Postel,)72 562.8 R -(J.,)2.5 E F1(Mail Pr)2.5 E(otocol.)-.45 E F0(NIC 29588.)5 E(In [Feinler78].)5 -E(No)5 E -.15(ve)-.15 G(mber 1977.).15 E 59.95([Postel79a] Postel,)72 579 R -(J.,)3.144 E F1 .644(Internet Messa)3.144 F .844 -.1(ge P)-.1 H -.45(ro).1 G -(tocol.).45 E F0 .644(RFC 753, IEN 85.)5.644 F(Netw)5.644 E .644 -(ork Information)-.1 F(Center)180 591 Q 2.5(,S)-.4 G(RI International, Menlo P) -216.82 591 Q(ark, California.)-.15 E(March 1979.)5 E 59.39([Postel79b] Postel,) -72 607.2 R 1.305(J. B.,)3.805 F F1 1.305(An Internetwork Messa)3.805 F 1.505 --.1(ge S)-.1 H(tructur).1 E -.15(e.)-.37 G F0(In)6.456 E F1(Pr)3.806 E 1.306 -(oceedings of the Sixth)-.45 F(Data Communications Symposium,)180 619.2 Q F0 -2.5(IEEE. Ne)2.5 F 2.5(wY)-.25 G 2.5(ork. No)379.74 619.2 R -.15(ve)-.15 G -(mber 1979.).15 E 64.39([Postel80] Postel,)72 635.4 R .639(J. B.,)3.139 F F1 -3.139(AS)3.139 G(tructur)248.676 635.4 Q .639(ed F)-.37 F .639(ormat for T) --1.05 F -.15(ra)-.55 G .639(nsmission of Multi-Media Documents.).15 F F0 .418 -(RFC 767.)180 647.4 R(Netw)5.419 E .419(ork Information Center)-.1 F 2.919(,S) --.4 G .419(RI International, Menlo P)350.474 647.4 R .419(ark, Califor)-.15 F -(-)-.2 E 2.5(nia. August)180 659.4 R(1980.)2.5 E 64.39([Postel82] Postel,)72 -675.6 R 2.05(J. B.,)4.55 F F1 2.05(Simple Mail T)4.55 F -.15(ra)-.55 G 2.05 -(nsfer Pr).15 F(otocol.)-.45 E F0 2.05(RFC821 \(obsoleting RFC788\).)7.05 F -(Netw)180 687.6 Q .273(ork Information Center)-.1 F 2.774(,S)-.4 G .274 -(RI International, Menlo P)305.3 687.6 R .274(ark, California.)-.15 F(August) -5.274 E(1982.)180 699.6 Q/F2 10/Times-Bold@0 SF 187.28(SMM:9-12 SENDMAIL)72 756 -R 2.5<8a41>2.5 G 2.5(nI)383.99 756 S(nter)395.94 756 Q(netw)-.15 E -(ork Mail Router)-.1 E EP -%%Page: 13 13 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF(SENDMAIL \212 An Inter)72 60 Q(netw)-.15 E -(ork Mail Router)-.1 E(SMM:9-13)457.9 60 Q/F1 10/Times-Roman@0 SF 55.5 -([Schmidt79] Schmidt,)72 96 R(E.,)2.972 E/F2 10/Times-Italic@0 SF .472(An Intr) -2.972 F .472(oduction to the Berk)-.45 F(ele)-.1 E 2.972(yN)-.3 G(etwork.) -369.664 96 Q F1(Uni)5.472 E -.15(ve)-.25 G .472(rsity of California,).15 F -(Berk)180 108 Q(ele)-.1 E 2.5(yC)-.15 G 2.5(alifornia. 1979.)225.02 108 R 59.95 -([Shoens79] Shoens,)72 124.2 R(K.,)4.894 E F2 2.394(Mail Refer)4.894 F 2.394 -(ence Manual.)-.37 F F1(Uni)7.394 E -.15(ve)-.25 G 2.395 -(rsity of California, Berk).15 F(ele)-.1 E 6.195 -.65(y. I)-.15 H(n).65 E -(UNIX Programmer')180 136.2 Q 2.5(sM)-.55 G(anual, Se)275.54 136.2 Q -.15(ve) --.25 G(nth Edition, V).15 E(olume 2C.)-1.29 E(December 1979.)5 E 60.51 -([Sluizer81] Sluizer)72 152.4 R 2.872(,S)-.4 G .372(., and Postel, J. B.,) -218.862 152.4 R F2 .372(Mail T)2.872 F -.15(ra)-.55 G .372(nsfer Pr).15 F -(otocol.)-.45 E F1 .371(RFC 780.)5.371 F(Netw)5.371 E .371(ork Infor)-.1 F(-) --.2 E(mation Center)180 164.4 Q 2.5(,S)-.4 G(RI International, Menlo P)247.1 -164.4 Q(ark, California.)-.15 E(May 1981.)5 E 52.72([Solomon81] Solomon,)72 -180.6 R .96(M., Landweber)3.46 F 3.46(,L)-.4 G .96 -(., and Neuhengen, D., \231The Design of the CSNET)296.08 180.6 R(Name Serv)180 -192.6 Q(er)-.15 E 3.9 -.7(.\232 C)-.55 H(S-DN-2, Uni).7 E -.15(ve)-.25 G -(rsity of W).15 E(isconsin, Madison.)-.4 E(No)5 E -.15(ve)-.15 G(mber 1981.).15 -E 78.28([Su82] Su,)72 208.8 R(Za)4.344 E 1.844(w-Sing, and Postel, Jon,)-.15 F -F2 1.844(The Domain Naming Con)4.344 F 1.844(vention for Internet)-.4 F 1.717 -(User Applications.)180 220.8 R F1 4.217(RFC819. Netw)6.717 F 1.717 -(ork Information Center)-.1 F 4.217(,S)-.4 G 1.718(RI International,)436.182 -220.8 R(Menlo P)180 232.8 Q(ark, California.)-.15 E(August 1982.)5 E([UNIX83]) -72 249 Q F2 2.12(The UNIX Pr)180 249 R -.1(og)-.45 G -.15(ra).1 G(mmer').15 E -4.62(sM)-.4 G 2.12(anual, Se)298.3 249 R 2.12(venth Edition,)-.15 F F1 -.6(Vi) -4.62 G 2.12(rtual V).6 F 2.12(AX-11 V)-1.35 F(ersion,)-1.11 E -1.29(Vo)180 261 -S 1.027(lume 1.)1.29 F 1.027(Bell Laboratories, modi\214ed by the Uni)6.027 F --.15(ve)-.25 G 1.027(rsity of California, Berk).15 F(e-)-.1 E(le)180 273 Q 1.3 --.65(y, C)-.15 H 2.5(alifornia. March,).65 F(1983.)2.5 E EP -%%Trailer -end -%%EOF diff --git a/usr.sbin/sendmail/doc/op/op.me b/usr.sbin/sendmail/doc/op/op.me index 9678d14c1fecc..6fd40ad866e38 100644 --- a/usr.sbin/sendmail/doc/op/op.me +++ b/usr.sbin/sendmail/doc/op/op.me @@ -1,4 +1,4 @@ -.\" Copyright (c) 1983 Eric P. Allman +.\" Copyright (c) 1983, 1995 Eric P. Allman .\" Copyright (c) 1983, 1993 .\" The Regents of the University of California. All rights reserved. .\" @@ -30,7 +30,7 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" @(#)op.me 8.36 (Berkeley) 4/14/94 +.\" @(#)op.me 8.70 (Berkeley) 11/3/95 .\" .\" eqn op.me | pic | troff -me .eh 'SMM:08-%''Sendmail Installation and Operation Guide' @@ -65,22 +65,18 @@ .sp .r Eric Allman -University of California, Berkeley -Mammoth Project -eric@CS.Berkeley.EDU +Pang\(aea Reference Systems +eric@Sendmail.ORG .sp -Version 8.36 +Version 8.70 .sp -For Sendmail Version 8.6 +For Sendmail Version 8.7 .)l .sp 2 .pp .i Sendmail implements a general purpose internetwork mail routing facility -under the UNIX* -.(f -*UNIX is a trademark of Unix Systems Laboratories. -.)f +under the UNIX\(rg operating system. It is not tied to any one transport protocol \*- its function may be likened to a crossbar switch, @@ -104,11 +100,22 @@ incrementally. .pp .i Sendmail is based on -RFC822 (Internet Mail Format Protocol), RFC821 (Simple Mail Transport Protocol), +RFC822 (Internet Mail Format Protocol), RFC1123 (Internet Host Requirements), +RFC1521 (MIME), +RFC1651 (SMTP Service Extensions), +and a series of as-yet-draft standards describing +Delivery Status Notifications (DSNs), +available from the internet drafts sites as +draft-ietf-notary-mime-delivery-\fIXX\fP.txt, +draft-ietf-notary-mime-report-\fIXX\fP.txt, +draft-ietf-notary-smtp-drpt-\fIXX\fP.txt, and -RFC1425 (SMTP Service Extensions). +draft-ietf-notary-status-\fIXX\fP.txt +(replace +.i XX +by the latest draft number). However, since .i sendmail is designed to work in a wider world, @@ -153,6 +160,12 @@ in this version of The appendixes give a brief but detailed explanation of a number of features not described in the rest of the paper. +.pp +.b WARNING: +Several major changes were introduced in version 8.7. +You should not attempt to use this document +for prior versions of +.i sendmail . .bp 7 .sh 1 "BASIC INSTALLATION" .pp @@ -199,29 +212,23 @@ If you are running on a 4.4BSD system, compile by typing .q make . On other systems, you may have to make some other adjustments. -.sh 3 "Old versions of make" -.pp -If you are not running the new version of -.b make -you will probably have to use +On most systems, +you can do the appropriate compilation by typing .(b -make \-f Makefile.dist +sh makesendmail .)b -This file does not assume several new syntaxes, -including the -.q += -syntax in macro definition -and the -.q ".include" -syntax. -.sh 3 "Compilation flags" +This will leave the binary in an appropriately named subdirectory. +It works for multiple object versions +compiled out of the same directory. +.sh 3 "Tweaking the Makefile" .pp .i Sendmail supports two different formats -for the +for the local (on disk) version of databases, +notably the .i aliases database. -These formats are: +At least one of these should be defined if at all possible. .nr ii 1i .ip NDBM The ``new DBM'' format, @@ -243,9 +250,8 @@ old databases are read, but when a new database is created it will be in NEWDB format. As a nasty hack, if you have NEWDB, NDBM, and NIS defined, -and if the file -.i /var/yp/Makefile -exists and is readable, +and if the alias file name includes the substring +.q /yp/ , .i sendmail will create both new and old versions of the alias file during a @@ -260,47 +266,36 @@ If neither of these are defined, .i sendmail reads the alias file into memory on every invocation. This can be slow and should be avoided. -.pp -System V based systems can define -SYSTEM5 -to make several small adjustments. -This changes the handling of timezones -and uses the much less efficient -.i lockf -call in preference to -.i flock . -These can be specified separately using the compilation flags -SYS5TZ -and -LOCKF -respectively. -.pp -If you don't have the -.i unsetenv -routine in your system library, define the UNSETENV compilation flag. -.pp -You may also have to define the compilation variable LA_TYPE -to describe how your load average is computed. -This and other flags are detailed in section 6.1. +There are also several methods for remote database access: +.ip NIS +Sun's Network Information Services (formerly YP). +.ip NISPLUS +Sun's NIS+ services. +.ip NETINFO +NeXT's NetInfo service. +.ip HESIOD +Hesiod service (from Athena). +.lp +Other compilation flags are set in conf.h +and should be predefined for you +unless you are porting to a new environment. .sh 3 "Compilation and installation" .pp After making the local system configuration described above, You should be able to compile and install the system. -Compilation can be performed using -.q make\** -.(f -\**where you may have to replace -.q make -with -.q "make \-f Makefile.dist" -as appropriate. -.)f -in the -.b sendmail/src -directory. +The script +.q makesendmail +is the best approach on most systems: +.(b +sh makesendmail +.)b +This will use +.i uname (1) +to select the correct Makefile for your environment. +.pp You may be able to install using .(b -make install +sh makesendmail install .)b This should install the binary in /usr/\*(SD @@ -315,7 +310,7 @@ On 4.4BSD systems it will also format and install man pages. .pp .i Sendmail cannot operate without a configuration file. -The configuration defines the mail systems understood at this site, +The configuration defines the mail delivery mechanisms understood at this site, how to access them, how to forward email to remote mail systems, and a number of tuning parameters. @@ -348,12 +343,6 @@ they will use The configuration files can be customized to work around this, but it is more complex. .pp -I haven't tested these yet on an isolated LAN environment -with a single UUCP connection to the outside world. -If you are in such an environment, -please send comments to -sendmail@CS.Berkeley.EDU. -.pp Our configuration files are processed by .i m4 to facilitate local customization; @@ -435,12 +424,15 @@ referenced using the .sm MAILER .b m4 macro. -Defined mailer types in this distribution are +The mailer types that are known in this distribution are fax, local, smtp, uucp, and usenet. +For example, to include support for the UUCP-based mailers, +use +.q MAILER(uucp) . .ip ostype Definitions describing various operating system environments (such as the location of support files). @@ -549,8 +541,22 @@ and permissions are .sh 3 "/etc/sendmail.cf" .pp This is the configuration file for -.i sendmail . -This is the only non-library file name compiled into +.i sendmail \**. +.(f +\**Actually, the pathname varies depending on the operating system; +/etc is the preferred directory. +Some older systems install it in +.b /usr/lib/sendmail.cf , +and I've also seen it in +.b /usr/ucblib +and +.b /etc/mail . +If you want to move this file, +change +.i src/conf.h . +.)f +This and /etc/sendmail.pid +are the only non-library file names compiled into .i sendmail \**. .(f \**The system libraries can reference other files; @@ -561,12 +567,6 @@ calls probably reference and .i /etc/resolv.conf . .)f -Some older systems install it in -.b /usr/lib/sendmail.cf . -.pp -If you want to move this file, -change -.i src/pathnames.h . .pp The configuration file is normally created using the distribution files described above. @@ -690,8 +690,10 @@ causes it to run the queue every half hour. .pp Some people use a more complex startup script, removing zero length qf files and df files for which there is no qf file. -For example: -.(b +For example, see Figure 1 +for an example of a complex startup script. +.(z +.hl # remove zero length qf files for qffile in qf* do @@ -732,7 +734,11 @@ for xffile in [A-Z]f* do echo \-n " <panic: $xffile>" > /dev/console done -.)b +.sp +.ce +Figure 1 \(em A complex startup script +.hl +.)z .pp If you are not running a version of UNIX that supports Berkeley TCP/IP, @@ -774,18 +780,6 @@ is defined in the option of the .i sendmail.cf file. -.sh 3 "/usr/\*(SB/newaliases" -.pp -If -.i sendmail -is invoked as -.q newaliases, -it will simulate the -.b \-bi -flag -(i.e., will rebuild the alias database; -see below). -This should be a link to /usr/\*(SD/sendmail. .sh 3 "/usr/\*(SB/mailq" .pp If @@ -810,7 +804,11 @@ All messages from .i sendmail are logged under the .sm LOG_MAIL -facility. +facility\**. +.(f +\**Except on Ultrix, +which does not support facilities in the syslog. +.)f .sh 3 "Format" .pp Each line in the system log @@ -820,7 +818,64 @@ the name of the machine that generated it over the local area network), the word .q sendmail: , -and a message. +and a message\**. +.(f +\**This format may vary slightly if your vendor has changed +the syntax. +.)f +Most messages are a sequence of +.i name \c +=\c +.i value +pairs. +.pp +The two most common lines are logged when a message is processed. +The first logs the receipt of a message; +there will be exactly one of these per message. +Some fields may be omitted if they do not contain interesting information. +Fields are: +.ip from +The envelope sender address. +.ip size +The size of the message in bytes. +.ip class +The class (i.e., numeric precedence) of the message. +.ip pri +The initial message priority (used for queue sorting). +.ip nrcpts +The number of envelope recipients for this message +(after aliasing and forwarding). +.ip msgid +The message id of the message (from the header). +.ip proto +The protocol used to receive this message (e.g., ESMTP or UUCP) +.ip relay +The machine from which it was received. +.lp +There is also one line logged per delivery attempt +(so there can be several per message if delivery is deferred +or there are multiple recipients). +Fields are: +.ip to +A comma-separated list of the recipients to this mailer. +.ip ctladdr +The ``controlling user'', that is, the name of the user +whose credentials we use for delivery. +.ip delay +The total delay between the time this message was received +and the time it was delivered. +.ip xdelay +The amount of time needed in this delivery attempt +(normally indicative of the speed of the connection). +.ip mailer +The name of the mailer used to deliver to this recipient. +.ip relay +The name of the host that actually accepted (or rejected) this recipient. +.ip stat +The delivery status. +.lp +Not all fields are present in all messages; +for example, the relay is not listed for local deliveries. .sh 3 "Levels" .pp If you have @@ -844,10 +899,30 @@ Levels from 11\-64 are reserved for verbose information that some sites might want. .pp A complete description of the log levels -is given in section 4.6. +is given in section +.\" XREF +4.6. +.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 2 "The Mail Queue" .pp -The mail queue should be processed transparently. +Sometimes a host cannot handle a message immediately. +For example, it may be down or overloaded, causing it to refuse connections. +The sending host is then expected to save this message in +its mail queue +and attempt to deliver it later. +.pp +Under normal conditions the mail queue will be processed transparently. However, you may find that manual intervention is sometimes necessary. For example, if a major host is down for a period of time @@ -947,6 +1022,56 @@ you can remove the directory: .(b rmdir /var/spool/omqueue .)b +.sh 2 "The Service Switch" +.pp +The implementation of certain system services +such as host and user name lookup +is controlled by the service switch. +If the host operating system supports such a switch +.i sendmail +will use the native version. +Ultrix, Solaris, and DEC OSF/1 are examples of such systems. +.pp +If the underlying operating system does not support a service switch +(e.g., SunOS, HP-UX, BSD) +then +.i sendmail +will provide a stub implementation. +The +.b ServiceSwitchFile +option points to the name of a file that has the service definitions +Each line has the name of a service +and the possible implementations of that service. +For example, the file: +.(b +hosts dns files nis +aliases files nis +.)b +will ask +.i sendmail +to look for hosts in the Domain Name System first. +If the requested host name is not found, +it tries local files, +and if that fails it tries NIS. +Similarly, +when looking for aliases +it will try the local files first +followed by NIS. +.pp +Service switches are not completely integrated. +For example, despite the fact that the host entry listed in the above example +specifies to look in NIS, +on SunOS this won't happen because the system implementation of +.i gethostbyname \|(3) +doesn't understand this. +If there is enough demand +.i sendmail +may reimplement +.i gethostbyname \|(3), +.i gethostbyaddr \|(3), +.i getpwent \|(3), +and the other system routines that would be necessary +to make this work seamlessly. .sh 2 "The Alias Database" .pp The alias database exists in two forms. @@ -962,7 +1087,14 @@ e.g., .(b eric@prep.ai.MIT.EDU: eric@CS.Berkeley.EDU .)b -will not have the desired effect. +will not have the desired effect +(except on prep.ai.MIT.EDU, +and they probably don't want me)\**. +.(f +\**Actually, any mailer that has the `A' mailer flag set +will permit aliasing; +this is normally limited to the local mailer. +.)f Aliases may be continued by starting any continuation lines with a space or a tab. Blank lines and lines beginning with a sharp sign @@ -971,9 +1103,14 @@ Blank lines and lines beginning with a sharp sign are comments. .pp The second form is processed by the -.i dbm \|(3) -(or -.i db \|(3)) +.i ndbm \|(3)\** +.(f +\**The +.i gdbm +package probably works as well. +.)f +or +.i db \|(3) library. This form is in the files .i /etc/aliases.dir @@ -984,6 +1121,30 @@ This is the form that actually uses to resolve aliases. This technique is used to improve performance. .pp +The control of search order is actually set by the service switch. +Essentially, the entry +.(b +OAswitch:aliases +.)b +is always added as the first alias entry; +also, the first alias file name without a class +(e.g., without +.q nis: +on the front) +will be used as the name of the file for a ``files'' entry +in the aliases switch. +For example, if the configuration file contains +.(b +OA/etc/aliases +.)b +and the service switch contains +.(b +aliases nis files nisplus +.)b +then aliases will first be searched in the NIS database, +then in /etc/aliases, +then in the NIS+ database. +.pp You can also use .sm NIS -based alias files. @@ -1013,7 +1174,7 @@ exactly like a .b K line \(em for example: .(b -OAnis:-N mail.aliases@my.nis.domain +OAnis:\-N mail.aliases@my.nis.domain .)b will search the appropriate NIS map and always include null bytes in the key. .sh 3 "Rebuilding the alias database" @@ -1033,7 +1194,9 @@ flag: .)b .pp If the -.q D +.b RebuildAliases +(old +.b D ) option is specified in the configuration, .i sendmail will rebuild the alias database automatically @@ -1042,7 +1205,12 @@ when it is out of date. Auto-rebuild can be dangerous on heavily loaded machines with large alias files; -if it might take more than five minutes +if it might take more than the rebuild timeout +(option +.b AliasWait , +old +.b a , +which is normally five minutes) to rebuild the database, there is a chance that several processes will start the rebuild process simultaneously. @@ -1051,7 +1219,7 @@ If you have multiple aliases databases specified, the .b \-bi flag rebuilds all the database types it understands -(for example, it can rebuild dbm databases but not nis databases). +(for example, it can rebuild NDBM databases but not NIS databases). .sh 3 "Potential problems" .pp There are a number of problems that can occur @@ -1067,11 +1235,14 @@ or the process rebuilding the database dies (due to being killed or a system crash) before completing the rebuild. .pp -Sendmail has two techniques to try to relieve these problems. +Sendmail has three techniques to try to relieve these problems. First, it ignores interrupts while rebuilding the database; this avoids the problem of someone aborting the process leaving a partially rebuilt database. Second, +it locks the database source file during the rebuild \(em +but that may not work over NFS or if the file is unwritable. +Third, at the end of the rebuild it adds an alias of the form .(b @@ -1084,7 +1255,7 @@ will access the database, it checks to insure that this entry exists\**. .(f \**The -.q a +.b AliasWait option is required in the configuration for this action to occur. This should normally be specified. @@ -1108,7 +1279,8 @@ For example: .(b unix-wizards: eric@ucbarpa, wnj@monet, nosuchuser, sam@matisse -owner-unix-wizards: eric@ucbarpa +owner-unix-wizards: unix-wizards-request +unix-wizards-request: eric@ucbarpa .)b would cause .q eric@ucbarpa @@ -1123,12 +1295,14 @@ List owners also cause the envelope sender address to be modified. The contents of the owner alias are used if they point to a single user, otherwise the name of the alias itself is used. For this reason, and to obey Internet conventions, -a typical scheme would be: -.(b -list: some, set, of, addresses -list-request: list-admin-1, list-admin-2, ... -owner-list: list-request -.)b +the +.q owner- +address normally points at the +.q -request +address; this causes messages to go out with the typical Internet convention +of using ``\c +.i list -request'' +as the return address. .sh 2 "User Information Database" .pp If you have a version of @@ -1142,12 +1316,6 @@ the databases will be searched for a .i user :maildrop entry. If found, the mail will be sent to the specified address. -.pp -If the first token passed to user part of the -.q local -mailer is an at sign, -the at sign will be stripped off -and this step will be skipped. .sh 2 "Per-User Forwarding (.forward Files)" .pp As an alternative to the alias database, @@ -1185,30 +1353,6 @@ Others have interpretations built into .i sendmail that cannot be changed without changing the code. These builtins are described here. -.sh 3 "Return-Receipt-To:" -.pp -If this header is sent, -a message will be sent to any specified addresses -when the final delivery is complete, -that is, -when successfully delivered to a mailer with the -.b l -flag (local delivery) set in the mailer descriptor\**. -.(f -\**Some sites disable this header, -and other (non-\c -.i sendmail ) -systems do not implement it. -Do not assume that a failure to get a return receipt -means that the mail did not arrive. -Also, do not assume that getting a return receipt -means that the mail has been read; -it just means that the message has been delivered -to the recipient's mailbox. -.)f -This header can be disabled with the -.q noreceipts -privacy flag. .sh 3 "Errors-To:" .pp If errors occur anywhere during processing, @@ -1222,21 +1366,35 @@ this was a hack to provide what should now be passed as the envelope sender address. It should go away. It is only used if the -.b l +.b UseErrorsTo option is set. +.pp +The Errors-To: header is official deprecated +and will go away in a future release. .sh 3 "Apparently-To:" .pp +RFC 822 requires at least one recipient field +(To:, Cc:, or Bcc: line) +in every message. If a message comes in with no recipients listed in the message -(in a To:, Cc:, or Bcc: line) then .i sendmail -will add an +will adjust the header based on the +.q NoRecipientAction +option. +One of the possible actions is to add an .q "Apparently-To:" header line for any recipients it is aware of. This is not put in as a standard recipient line to warn any recipients that the list is not complete. .pp -At least one recipient line is required under RFC 822. +The Apparently-To: header is non-standard +and is deprecated. +.sh 3 "Precedence" +.pp +The Precedence: header can be used as a crude control of message priority. +It tweaks the sort order in the queue +and can be configured to change the message timeout values. .sh 2 "IDENT Protocol Support" .pp .i Sendmail @@ -1281,6 +1439,15 @@ the CallerID service apply to Identification. If you wouldn't run a "finger" server due to privacy considerations you may not want to run this protocol. .ba +.lp +In some cases your system may not work properly with IDENT support +due to a bug in the TCP/IP implementation. +The symptoms will be that for some hosts +the SMTP connection will be closed +almost immediately. +If this is true or if you do not want to use IDENT, +you should set the IDENT timeout to zero; +this will disable the IDENT protocol. .sh 1 "ARGUMENTS" .pp The complete list of arguments to @@ -1294,10 +1461,10 @@ to run through the queue is defined by the .b \-q flag. -If you run in mode -.b f +If you run with delivery mode set to +.b i or -.b a +.b b this can be relatively large, since it will only be relevant when a host that was down comes back up. @@ -1307,6 +1474,7 @@ mode it should be relatively short, since it defines the maximum amount of time that a message may sit in the queue. +(See also the MinQueueAge option.) .pp RFC 1123 section 5.3.1.1 says that this value should be at least 30 minutes (although that probably doesn't make sense if you use ``queue-only'' mode). @@ -1327,6 +1495,23 @@ flag may be combined in one call: .(b /usr/\*(SD/sendmail \-bd \-q30m .)b +.pp +An alternative approach is to invoke sendmail from +.i inetd (8) +(use the +.b \-bs +flag to ask sendmail to speak SMTP on its standard input and output). +This works and allows you to wrap +.i sendmail +in a TCP wrapper program, +but may be a bit slower since the configuration file +has to be re-read on every message that comes in. +If you do this, you still need to have a +.i sendmail +running to flush the queue: +.(b +/usr/\*(SD/sendmail \-q30m +.)b .sh 2 "Forcing the Queue" .pp In some cases you may find that the queue has gotten clogged for some reason. @@ -1354,7 +1539,7 @@ Similarly, .q \-qSstring limits the run to particular senders and .q \-qIstring -limits it to particular identifiers. +limits it to particular queue identifiers. .sh 2 "Debugging" .pp There are a fairly large number of debug flags @@ -1374,7 +1559,7 @@ the syntax is: .(b .ta \w'debug-option 'u debug-flag: \fB\-d\fP debug-list -debug-list: debug-option [ , debug-option ] +debug-list: debug-option [ , debug-option ]* debug-option: debug-range [ . debug-level ] debug-range: integer | integer \- integer debug-level: integer @@ -1384,12 +1569,41 @@ For example, .(b \-d12 Set flag 12 to level 1 \-d12.3 Set flag 12 to level 3 -\-d3-17 Set flags 3 through 17 to level 1 -\-d3-17.4 Set flags 3 through 17 to level 4 +\-d3\-17 Set flags 3 through 17 to level 1 +\-d3\-17.4 Set flags 3 through 17 to level 4 .)b For a complete list of the available debug flags you will have to look at the code (they are too dynamic to keep this documentation up to date). +.sh 2 "Changing the Values of Options" +.pp +Options can be overridden using the +.b \-o +or +.b \-O +command line flags. +For example, +.(b +/usr/\*(SD/sendmail \-oT2m +.)b +sets the +.b T +(timeout) option to two minutes +for this run only; +the equivalent line using the long option name is +.(b +/usr/\*(SD/sendmail -OQueueTimeout=2m +.)b +.pp +Some options have security implications. +Sendmail allows you to set these, +but relinquishes its setuid root permissions thereafter\**. +.(f +\**That is, it sets its effective uid to the real uid; +thus, if you are executing as root, +as from root's crontab file or during system startup +the root permissions will still be honored. +.)f .sh 2 "Trying a Different Configuration File" .pp An alternative configuration file @@ -1397,7 +1611,7 @@ can be specified using the .b \-C flag; for example, .(b -/usr/\*(SD/sendmail \-Ctest.cf +/usr/\*(SD/sendmail \-Ctest.cf \-oQ/tmp/mqueue .)b uses the configuration file .i test.cf @@ -1409,23 +1623,12 @@ flag has no value it defaults to .i sendmail.cf in the current directory. -.sh 2 "Changing the Values of Options" .pp -Options can be overridden using the -.b \-o -flag. -For example, -.(b -/usr/\*(SD/sendmail \-oT2m -.)b -sets the -.b T -(timeout) option to two minutes -for this run only. -.pp -Some options have security implications. -Sendmail allows you to set these, -but refuses to run as root thereafter. +.i Sendmail +gives up its setuid root permissions +when you use this flag, so it is common to use a publicly writable directory +(such as /tmp) +as the spool directory (QueueDirectory or Q option) while testing. .sh 2 "Logging Traffic" .pp Many SMTP implementations do not fully implement the protocol. @@ -1437,12 +1640,14 @@ If you suspect such a problem, you can set traffic logging using the flag. For example, .(b -/usr/\*(SD/sendmail \-X /tmp/traffic -bd +/usr/\*(SD/sendmail \-X /tmp/traffic \-bd .)b will log all traffic in the file .i /tmp/traffic . .pp -This logs a lot of data very quickly and should never be used +This logs a lot of data very quickly and should +.b NEVER +be used during normal operations. After starting up such a daemon, force the errant implementation to send a message to your host. @@ -1450,18 +1655,99 @@ All message traffic in and out of .i sendmail , including the incoming SMTP traffic, will be logged in this file. -.sh 2 "Dumping State" +.sh 2 "Testing Configuration Files" .pp -You can ask +When you build a configuration table, +you can do a certain amount of testing +using the +.q "test mode" +of +.i sendmail . +For example, +you could invoke .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. +as: +.(b +sendmail \-bt \-Ctest.cf +.)b +which would read the configuration file +.q test.cf +and enter test mode. +In this mode, +you enter lines of the form: +.(b +rwset address +.)b +where +.i rwset +is the rewriting set you want to use +and +.i address +is an address to apply the set to. +Test mode shows you the steps it takes +as it proceeds, +finally showing you the address it ends up with. +You may use a comma separated list of rwsets +for sequential application of rules to an input. +For example: +.(b +3,1,21,4 monet:bollard +.)b +first applies ruleset three to the input +.q monet:bollard. +Ruleset one is then applied to the output of ruleset three, +followed similarly by rulesets twenty-one and four. +.pp +If you need more detail, +you can also use the +.q \-d21 +flag to turn on more debugging. +For example, +.(b +sendmail \-bt \-d21.99 +.)b +turns on an incredible amount of information; +a single word address +is probably going to print out several pages worth of information. +.pp +You should be warned that internally, +.i sendmail +applies ruleset 3 to all addresses. +In test mode +you will have to do that manually. +For example, older versions allowed you to use +.(b +0 bruce@broadcast.sony.com +.)b +This version requires that you use: +.(b +3,0 bruce@broadcast.sony.com +.)b +.pp +As of version 8.7, +some other syntaxes are available in test mode: +.bu +\&.D\|x\|value +defines macro +.i x +to have the indicated +.i value . +This is useful when debugging rules that use the +.b $& \c +.i x +syntax. +.bu +\&.C\|c\|value +adds the indicated +.i value +to class +.i c . +.bu +\&.S\|ruleset +dumps the contents of the indicated ruleset. +.bu +\-d\|debug-spec +is equivalent to the command-line flag. .sh 1 "TUNING" .pp There are a number of configuration parameters @@ -1471,9 +1757,9 @@ Most of these are set using an option in the configuration file. For example, the line -.q OT5d +.q "O Timeout.queuereturn=5d" sets option -.q T +.q Timeout.queuereturn to the value .q 5d (five days). @@ -1487,6 +1773,22 @@ sites experiencing a large number of small messages, many of which are delivered to many recipients, may find that they need to adjust the parameters dealing with queue priorities. +.pp +All versions of +.i sendmail +prior to 8.7 +had single character option names. +As of 8.7, +options have long (multi-character names). +Although old short names are still accepted, +most new options do not have short equivalents. +.pp +This section only describes the options you are most likely +to want to tweak; +read section +.\"XREF +5 +for more details. .sh 2 "Timeouts" .pp All time intervals are set @@ -1516,17 +1818,24 @@ and one hour. RFC 1123 section 5.3.1.1 recommends that this be at least 30 minutes. .sh 3 "Read timeouts" .pp -It is possible to time out when reading the standard input -or when reading from a remote SMTP server. -These timeouts are set using the -.b r -option in the configuration file. -The argument is a list of -.i keyword=value -pairs. -The recognized keywords, their default values, and the minimum values +Timeouts all have option names +.q Timeout.\fIsuboption\fP . +The recognized +.i suboption s, +their default values, and the minimum values allowed by RFC 1123 section 5.3.2 are: .nr ii 1i +.ip connect +The time to wait for an SMTP connection to open +(the +.i connect (2) +system call) +[0, unspecified]. +If zero, uses the kernel default. +In no case can this option extend the timeout +longer than the kernel provides, but it can shorten it. +This is to get around kernels that provide an absurdly long connection timeout +(90 minutes in one case). .ip initial The wait for the initial 220 greeting message [5m, 5m]. @@ -1543,7 +1852,8 @@ The wait for a reply from a RCPT command [1h, 5m]. This should be long because it could be pointing at a list -that takes a long time to expand. +that takes a long time to expand +(see below). .ip datainit\(dg The wait for a reply from a DATA command [5m, 2m]. @@ -1578,10 +1888,15 @@ the time to wait for another command. [1h, 5m]. .ip ident The timeout waiting for a reply to an IDENT query -[30s, unspecified]. +[30s\**, unspecified]. +.(f +\**On some systems the default is zero to turn the protocol off entirely. +.)f .lp For compatibility with old configuration files, -if no ``keyword='' is specified, +if no +.i suboption +is specified, all the timeouts marked with \(dg are set to the indicated value. .pp Many of the RFC 1123 minimum values @@ -1589,15 +1904,15 @@ may well be too short. .i Sendmail was designed to the RFC 822 protocols, which did not specify read timeouts; -hence, +hence, versions of .i sendmail -does not guarantee to reply to messages promptly. +prior to version 8.1 did not guarantee to reply to messages promptly. In particular, a .q RCPT command specifying a mailing list will expand and verify the entire list; a large list on a slow system -may take more than five minutes\**. +may easily take more than five minutes\**. .(f \**This verification includes looking up every address with the name server; @@ -1605,13 +1920,15 @@ this involves network delays, and can in some cases can be considerable. .)f I recommend a one hour timeout \*- -since this failure is rare, +since a communications failure during the RCPT phase is rare, a long timeout is not onerous -and may ultimately help reduce network load. +and may ultimately help reduce network load +and duplicated messages. .pp -For example, the line: +For example, the lines: .(b -Orcommand=25m,datablock=3h +O Timeout.command=25m +O Timeout.datablock=3h .)b sets the server SMTP command timeout to 25 minutes and the input data block timeout to three hours. @@ -1621,28 +1938,25 @@ After sitting in the queue for a few days, a message will time out. This is to insure that at least the sender is aware of the inability to send a message. -The timeout is typically set to three days. -This timeout is set using the +The timeout is typically set to five days. +It is sometimes considered convenient to also send a warning message +if the message is in the queue longer than a few hours +(assuming you normally have good connectivity; +if your messages normally took several hours to send +you wouldn't want to do this because it wouldn't be an unusual event). +These timeouts are set using the +.b Timeout.queuereturn +and +.b Timeout.queuewarn +options in the configuration file +(previously both were set using the .b T -option in the configuration file. -.pp -The time of submission is set in the queue, -rather than the amount of time left until timeout. -As a result, you can flush messages that have been hanging -for a short period -by running the queue -with a short message timeout. -For example, -.(b -/usr/\*(SD/sendmail \-oT1d \-q -.)b -will run the queue -and flush anything that is one day old. +option). .pp -Since this option is global, -and since you can not +Since these options are global, +and since you can not know .i "a priori" -know how long another host outside your domain will be down, +how long another host outside your domain will be down, a five day timeout is recommended. This allows a recipient to fix the problem even if it occurs at the beginning of a long weekend. @@ -1650,13 +1964,15 @@ RFC 1123 section 5.3.1.1 says that this parameter should be ``at least 4\-5 days''. .pp The +.b Timeout.queuewarn +value can be piggybacked on the .b T -option can also take a second timeout indicating a time after which +option by indicating a time after which a warning message should be sent; the two timeouts are separated by a slash. -For example, the value +For example, the line .(b -5d/4h +OT5d/4h .)b causes email to fail after five days, but a warning message will be sent after four hours. @@ -1665,7 +1981,9 @@ several times. .sh 2 "Forking During Queue Runs" .pp By setting the -.b Y +.b ForkEachJob +(\c +.b Y ) option, .i sendmail will fork before each individual message @@ -1675,14 +1993,14 @@ This will prevent from consuming large amounts of memory, so it may be useful in memory-poor environments. However, if the -.b Y +.b ForkEachJob option is not set, .i sendmail will keep track of hosts that are down during a queue run, which can improve performance dramatically. .pp If the -.b Y +.b ForkEachJob option is set, .i sendmail can not use connection caching. @@ -1690,7 +2008,9 @@ can not use connection caching. .pp Every message is assigned a priority when it is first instantiated, consisting of the message size (in bytes) -offset by the message class times the +offset by the message class +(which is determined from the Precedence: header) +times the .q "work class factor" and the number of recipients times the .q "work recipient factor." @@ -1714,16 +2034,20 @@ this is also included into the priority. .pp The recipient and class factors can be set in the configuration file using the -.b y +.b RecipientFactor +(\c +.b y ) and -.b z +.b ClassFactor +(\c +.b z ) options respectively. They default to 30000 (for the recipient factor) and 1800 (for the class factor). The initial priority is: .EQ -pri = msgsize - (class times bold z) + (nrcpt times bold y) +pri = msgsize - (class times bold ClassFactor) + (nrcpt times bold RecipientFactor) .EN (Remember, higher values for this parameter actually mean that the job will be treated with lower priority.) @@ -1733,14 +2057,16 @@ The priority of a job can also be adjusted each time it is processed using the .q "work time factor," set by the -.b Z +.b RetryFactor +(\c +.b Z ) option. This is added to the priority, so it normally decreases the precedence of the job, on the grounds that jobs that have failed many times will tend to fail again in the future. The -.b Z +.b RetryFactor option defaults to 90000. .sh 2 "Load Limiting" .pp @@ -1748,30 +2074,31 @@ option defaults to 90000. can be asked to queue (but not deliver) mail if the system load average gets too high using the -.b x +.b QueueLA +(\c +.b x ) option. When the load average exceeds the value of the -.b x +.b QueueLA option, the delivery mode is set to .b q (queue only) if the -.i "Queue Factor" +.b QueueFactor (\c -.b q -option) -divided by the difference in the current load average and the -.b x +.b q ) +option divided by the difference in the current load average and the +.b QueueLA option plus one exceeds the priority of the message \(em that is, the message is queued iff: .EQ -pri > { bold q } over { LA - { bold x } + 1 } +pri > { bold QueueFactor } over { LA - { bold QueueLA } + 1 } .EN The -.b q +.b QueueFactor option defaults to 600000, so each point of load average is worth 600000 priority points @@ -1779,7 +2106,9 @@ priority points .pp For drastic cases, the -.b X +.b RefuseLA +(\c +.b X ) option defines a load average at which .i sendmail will refuse @@ -1793,7 +2122,9 @@ There are a number of delivery modes that .i sendmail can operate in, set by the -.q d +.b DeliveryMode +(\c +.b d ) configuration option. These modes specify how quickly mail will be delivered. @@ -1803,25 +2134,42 @@ Legal modes are: i deliver interactively (synchronously) b deliver in background (asynchronously) q queue only (don't deliver) +d defer delvery attempts (don't deliver) .)b There are tradeoffs. Mode .q i -passes the maximum amount of information to the sender, -but is hardly ever necessary. +gives the sender the quickest feedback, +but may slow down some mailers and +is hardly ever necessary. +Mode +.q b +delivers promptly but +can cause large numbers of processes +if you have a mailer that takes a long time to deliver a message. Mode .q q -puts the minimum load on your machine, +minimizes the load on your machine, but means that delivery may be delayed for up to the queue interval. Mode +.q d +is identical to mode +.q q +except that it also prevents all the early map lookups from working; +it is intended for ``dial on demand'' sites where DNS lookups +might cost real money. +Some simple error messages +(e.g., host unknown during the SMTP protocol) +will be delayed using this mode. +Mode .q b -is probably a good compromise. -However, this mode can cause large numbers of processes -if you have a mailer that takes a long time to deliver a message. +is the usual default. .pp If you run in mode .q q -(queue only) +(queue only), +.q d +(defer), or .q b (deliver in background) @@ -1829,6 +2177,9 @@ or will not expand aliases and follow .forward files upon initial receipt of the mail. This speeds up the response to RCPT commands. +Mode +.q i +cannot be used by the SMTP server. .sh 2 "Log Level" .pp The level of logging can be set for @@ -1854,14 +2205,12 @@ VRFY and EXPN commands. .ip 7 Delivery failures (host or user unknown, etc.). .ip 8 -Successful deliveries. +Successful deliveries and alias database rebuilds. .ip 9 Messages being deferred (due to a host being down, etc.). .ip 10 Database expansion (alias, forward, and userdb lookups). -.ip 15 -Automatic alias database rebuilds. .ip 20 Logs attempts to run locked queue files. These are not errors, @@ -1870,13 +2219,11 @@ but can be useful to note if your queue appears to be clogged. Lost locks (only if using lockf instead of flock). .lp Additionally, -values above 64 are reserved for extremely verbose debuggging output. +values above 64 are reserved for extremely verbose debugging output. No normal site would ever set these. .sh 2 "File Modes" .pp -There are a number of files -that may have a number of modes. -The modes depend on what functionality you want +The modes used for files depend on what functionality you want and the level of security you require. .sh 3 "To suid or not to suid?" .pp @@ -1907,6 +2254,26 @@ to be accounted .i sa \|(8)) to root rather than to the user sending the mail. +.pp +If you don't make +.i sendmail +setuid to root, it will still run but you lose a lot of functionality +and a lot of privacy, since you'll have to make the queue directory +world readable. +You could also make +.i sendmail +setuid to some pseudo-user +(e.g., create a user called +.q sendmail +and make +.i sendmail +setuid to that) +which will fix the privacy problems +but not the functionality issues. +Also, this isn't a guarantee of security: +for example, +root occasionally sends mail, +and the daemon often runs as root. .sh 3 "Should my alias database be writable?" .pp At Berkeley @@ -1954,7 +2321,7 @@ can arrange to steal mail anyway. If your DBM files are not writable by the world or you do not have auto-rebuild enabled (with the -.q D +.b AutoRebuildAliases option), then you must be careful to reconstruct the alias database each time you change the text version: @@ -1982,7 +2349,9 @@ instead, the connection is closed and reopened. .pp Two parameters control the connection cache. The -.b k +.b ConnectionCacheSize +(\c +.b k ) option defines the number of simultaneous open connections that will be permitted. If it is set to zero, @@ -1992,9 +2361,12 @@ This should be set as appropriate for your system size; it will limit the amount of system resources that .i sendmail will use during queue runs. +Never set this higher than 4. .pp The -.b K +.b ConnectionCacheTimeout +(\c +.b K ) option specifies the maximum time that any cached connection will be permitted to idle. When the idle time exceeds this value @@ -2006,39 +2378,65 @@ from other hosts. The default is five minutes. .sh 2 "Name Server Access" .pp -If your system supports the name server, -then the probability is that +Control of host address lookups is set by the +.b hosts +service entry in your service switch file. +If you are on a system that has built-in service switch support +(e.g., Ultrix, Solaris, or DEC OSF/1) +then your system is probably configured properly already. +Otherwise, .i sendmail -will be using it regardless of how you configure -.i sendmail . +will consult the file +.b /etc/service.switch , +which should be created. +.i Sendmail +only uses two entries: +.b hosts +and +.b aliases . +.pp +However, some systems (such as SunOS) +will do DNS lookups +regardless of the setting of the service switch entry. In particular, the system routine .i gethostbyname (3) is used to look up host names, -and most vendor versions try some combination of DNS, NIS, -and file lookup in /etc/hosts. -.pp -However, if you do not have a nameserver configured at all, +and many vendor versions try some combination of DNS, NIS, +and file lookup in /etc/hosts +without consulting a service switch. +.i Sendmail +makes no attempt to work around this problem, +and the DNS lookup will be done anyway. +If you do not have a nameserver configured at all, such as at a UUCP-only site, .i sendmail will get a .q "connection refused" -message when it tries to connect to the name server -(either indirectly by calling -.i gethostbyname -or directly by looking up MX records). +message when it tries to connect to the name server. If the -.b I -option is set, +.b hosts +switch entry has the service +.q dns +listed somewhere in the list, .i sendmail will interpret this to mean a temporary failure and will queue the mail for later processing; otherwise, it ignores the name server data. -If your name server is running properly, -the setting of this option is not relevant; -however, it is important that it be set properly -to make error handling work properly. .pp -This option also allows you to tweak name server options. +The same technique is used to decide whether to do MX lookups. +If you want MX support, you +.i must +have +.q dns +listed as a service in the +.b hosts +switch entry. +.pp +The +.b ResolverOptions +(\c +.b I ) +option allows you to tweak name server options. The command line takes a series of flags as documented in .i resolver (3) (with the leading @@ -2047,16 +2445,17 @@ deleted). Each can be preceded by an optional `+' or `\(mi'. For example, the line .(b -OITrue +AAONLY \(miDNSRCH +O ResolverOptions=+AAONLY \(miDNSRCH .)b turns on the AAONLY (accept authoritative answers only) and turns off the DNSRCH (search the domain path) options. Most resolver libraries default DNSRCH, DEFNAMES, and RECURSE flags on and all others off. -Note the use of the initial ``True'' \*- -this is for compatibility with previous versions of -.i sendmail , -but is not otherwise necessary. +You can also include +.q HasWildcardMX +to specify that there is a wildcard MX record matching your domain; +this turns off MX matching when canonifying names, +which can lead to inappropriate canonifications. .pp Version level 1 configurations turn DNSRCH and DEFNAMES off when doing delivery lookups, @@ -2070,7 +2469,7 @@ If you don't want to do automatic name extension, don't call $[ ... $]. .pp The search rules for $[ ... $] are somewhat different than usual. -If the name (that is, the ``...'') +If the name being looked up has at least one dot, it always tries the unmodified name first. If that fails, it tries the reduced search path, and lastly tries the unmodified name @@ -2085,6 +2484,14 @@ that is, if it finds an MX record it makes note of it, but keeps looking. This way, if you have a wildcard MX record matching your domain, it will not assume that all names match. +.pp +To completely turn off all name server access +on systems without service switch support +(such as SunOS) +you will have to recompile with +\-DNAMED_BIND=0 +and remove \-lresolv from the list of libraries to be searched +when linking. .sh 2 "Moving the Per-User Forward Files" .pp Some sites mount each user's home directory @@ -2097,17 +2504,20 @@ because of a file server being down. The performance can be especially bad if you run the automounter. .pp The -.b J +.b ForwardPath +(\c +.b J ) option allows you to set a path of forward files. For example, the config file line .(b -OJ/var/forward/$u:$z/.forward +O ForwardPath=/var/forward/$u:$z/.forward.$w .)b would first look for a file with the same name as the user's login in /var/forward; if that is not found (or is inaccessible) the file -.q \&.forward +``.forward.\c +.i machinename '' in the user's home directory is searched. A truly perverse site could also search by sender by using $r, $s, or $f. @@ -2118,12 +2528,18 @@ it should be mode 1777 Users should create the files mode 644. .sh 2 "Free Space" .pp -On systems that have the +On systems that have one of the system calls in the .i statfs (2) -system call, +family +(including +.i statvfs +and +.i ustat ), you can specify a minimum number of free blocks on the queue filesystem using the -.b b +.b MinFreeBlocks +(\c +.b b ) option. If there are fewer than the indicated number of blocks free on the filesystem on which the queue is mounted @@ -2135,43 +2551,42 @@ This invites the SMTP client to try again later. Beware of setting this option too high; it can cause rejection of email when that mail would be processed without difficulty. +.sh 2 "Maximum Message Size" .pp -This option can also specify an advertised -.q "maximum message size" -for hosts that speak ESMTP. +To avoid overflowing your system with a large message, +the +.b MaxMessageSize +option can be set to set an absolute limit +on the size of any one message. +This will be advertised in the ESMTP dialogue +and checked during message collection. .sh 2 "Privacy Flags" .pp The -.b p +.b PrivacyOptions +(\c +.b p ) option allows you to set certain ``privacy'' flags. Actually, many of them don't give you any extra privacy, rather just insisting that client SMTP servers use the HELO command -before using certain commands. +before using certain commands +or adding extra headers to indicate possible spoof attempts. .pp The option takes a series of flag names; the final privacy is the inclusive or of those flags. For example: .(b -Op needmailhelo, noexpn +O PrivacyOptions=needmailhelo, noexpn .)b insists that the HELO or EHLO command be used before a MAIL command is accepted and disables the EXPN command. .pp -The -.q restrictmailq -option restricts printing the queue to the group that owns the queue directory. -It is absurd to set this if you don't also protect the logs. -.pp -The -.q restrictqrun -option restricts people running the queue -(that is, using the -.b \-q -command line flag) -to root and the owner of the queue directory. +The flags are detailed in section +.\"XREF +5.1.6. .sh 2 "Send to Me Too" .pp Normally, @@ -2186,9 +2601,11 @@ If the .b \-m (me too) command line flag, or if the -.b m +.b MeToo +(\c +.b m ) option is set in the configuration file, -this behaviour is supressed. +this behaviour is suppressed. Some sites like to run the .sm SMTP daemon with @@ -2196,9 +2613,7 @@ daemon with .sh 1 "THE WHOLE SCOOP ON THE CONFIGURATION FILE" .pp This section describes the configuration file -in detail, -including hints on how to write one of your own -if you have to. +in detail. .pp There is one point that should be made clear immediately: the syntax of the configuration file @@ -2212,11 +2627,6 @@ On the list is a configuration-file compiler. .pp -An overview of the configuration file -is given first, -followed by details of the semantics. -.sh 2 "Configuration File Lines" -.pp The configuration file is organized as a series of lines, each of which begins with a single character defining the semantics for the rest of the line. @@ -2226,7 +2636,7 @@ are continuation lines Blank lines and lines beginning with a sharp symbol (`#') are comments. -.sh 3 "R and S \*- rewriting rules" +.sh 2 "R and S \*- Rewriting Rules" .pp The core of address parsing are the rewriting rules. @@ -2291,7 +2701,7 @@ This for is intended only for referencing internally defined macros such as .b $h that are changed at runtime. -.sh 4 "The left hand side" +.sh 3 "The left hand side" .pp The left hand side of rewriting rules contains a pattern. Normal words are simply matched directly. @@ -2336,10 +2746,10 @@ This is .i not bound to a .b $ \c -.i N +.i n on the RHS, and is normally only used when it stands alone in order to match the null input. -.sh 4 "The right hand side" +.sh 3 "The right hand side" .pp When the left hand side of a rewriting rule matches, the input is deleted and replaced by the right hand side. @@ -2375,9 +2785,8 @@ A host name enclosed between .b $[ and .b $] -is looked up using the -.i gethostent \|(3) -routines and replaced by the canonical name\**. +is looked up in the host database(s) +and replaced by the canonical name\**. .(f \**This is actually completely equivalent @@ -2387,9 +2796,9 @@ In particular, a default can be used. .)f For example, -.q $[csam$] +.q $[ftp$] might become -.q lbl-csam.arpa +.q ftp.CS.Berkeley.EDU and .q $[[128.32.130.2]$] would become @@ -2410,6 +2819,9 @@ If no lookup is found, the indicated is inserted; if no default is specified and no lookup matches, the value is left unchanged. +The +.i arguments +are passed to the map for possible use. .pp The .b $> \c @@ -2422,6 +2834,13 @@ The final value of ruleset .i n then becomes the substitution for this rule. +The +.b $> +syntax can only be used at the beginning of the right hand side; +it can be only be preceded by +.b $@ +or +.b $: . .pp The .b $# @@ -2446,10 +2865,11 @@ the host part may be omitted\**. \**You may want to use it for special .q "per user" extensions. -For example, at CMU you can send email to -.q jgm+foo ; -the part after the plus sign -is not part of the user name, +For example, in the address +.q jgm+foo@CMU.EDU ; +the +.q +foo +part is not part of the user name, and is passed to the local mailer for local use. .)f The @@ -2537,11 +2957,11 @@ and finally and .b $: are processed. -.sh 4 "Semantics of rewriting rule sets" +.sh 3 "Semantics of rewriting rule sets" .pp There are five rewriting sets that have specific semantics. -These are related as depicted by figure 2. +Four of these are related as depicted by figure 1. .(z .hl .ie n \{\ @@ -2592,7 +3012,7 @@ Box0: arrow; box "0" .\} .el .sp 2i .ce -Figure 2 \*- Rewriting set semantics +Figure 1 \*- Rewriting set semantics .(c D \*- sender domain addition S \*- mailer-specific sender rewriting @@ -2608,13 +3028,21 @@ This form should have the basic syntax: .(b local-part@host-domain-spec .)b +Ruleset three +is applied by +.i sendmail +before doing anything with any address. +.pp If no .q @ sign is specified, then the host-domain-spec .i may -be appended from the +be appended (box +.q D +in Figure 1) +from the sender address (if the .b C @@ -2622,10 +3050,6 @@ flag is set in the mailer definition corresponding to the .i sending mailer). -Ruleset three -is applied by -.i sendmail -before doing anything with any address. .pp Ruleset zero is applied after ruleset three @@ -2654,7 +3078,7 @@ Ruleset four is applied to all addresses in the message. It is typically used to translate internal to external form. -.sh 4 "IPC mailers" +.sh 3 "IPC mailers" .pp Some special processing occurs if the ruleset zero resolves to an IPC mailer @@ -2694,21 +3118,28 @@ in square brackets: .)b This form avoids the MX mapping. .b N.B.: -This is intended only for situations where you have a network firewall, +.i +This is intended only for situations where you have a network firewall +or other host that will do special processing for all your mail, so that your MX record points to a gateway machine; this machine could then do direct delivery to machines within your local domain. Use of this feature directly violates RFC 1123 section 5.3.5: it should not be used lightly. -.sh 3 "D \*- define macro" +.r +.sh 2 "D \*- Define Macro" .pp -Macros are named with a single character. -These may be selected from the entire ASCII set, +Macros are named with a single character +or with a word in {braces}. +Single character names may be selected from the entire ASCII set, but user-defined macros should be selected from the set of upper case letters only. Lower case letters and special symbols are used internally. +Long names beginning with a lower case letter or a punctuation character +are reserved for use by sendmail, +so user-defined long macro names should begin with an upper case letter. .pp The syntax for macro definitions is: .(b F @@ -2718,9 +3149,13 @@ The syntax for macro definitions is: where .i x is the name of the macro +(which may be a single character +or a word in braces) and .i val is the value it should have. +There should be no spaces given +that do not actually belong in the macro value. .pp Macros are interpolated using the construct @@ -2787,15 +3222,21 @@ but are not otherwise used internally. These macros are: .nr ii 5n .ip $a -.b "The origination date in RFC 822 format." +The origination date in RFC 822 format. +This is extracted from the Date: line. .ip $b -.b "The current date in RFC 822 format." +The current date in RFC 822 format. .ip $c -.b "The hop count." +The hop count. +This is a count of the number of Received: lines +plus the value of the +.b \-h +command line flag. .ip $d -.b "The current date in UNIX (ctime) format." +The current date in UNIX (ctime) format. .ip $e\(dg -.b "The SMTP entry message." +(Obsolete; use SmtpGreetingMessage option instead.) +The SMTP entry message. This is printed out when SMTP starts up. The first word must be the .b $j @@ -2805,15 +3246,27 @@ Defaults to Commonly redefined to include the configuration version number, e.g., .q "$j Sendmail $v/$Z ready at $b" .ip $f -.b "The sender (from) address." +The envelope sender (from) address. .ip $g -.b "The sender address relative to the recipient." +The sender address relative to the recipient. +For example, if +.b $f +is +.q foo , +.b $g +will be +.q host!foo , +.q foo@host.domain , +or whatever is appropriate for the receiving mailer. .ip $h -.b "The recipient host." +The recipient host. +This is set in ruleset 0 from the $# field of a parsed address. .ip $i -.b "The queue id." +The queue id, +e.g., +.q HAA12345 . .ip $j\(dd -.b "The \*(lqofficial\*(rq domain name for this site." +The \*(lqofficial\*(rq domain name for this site. This is fully qualified if the full qualification can be found. It .i must @@ -2821,25 +3274,27 @@ be redefined to be the fully qualified domain name if your system is not configured so that information can find it automatically. .ip $k -.b "The UUCP node name (from the uname system call)." +The UUCP node name (from the uname system call). .ip $l\(dg -.b "The format of the UNIX from line." +(Obsolete; use UnixFromLine option instead.) +The format of the UNIX from line. Unless you have changed the UNIX mailbox format, you should not change the default, which is .q "From $g $d" . .ip $m -.b "The domain part of the \fIgethostname\fP return value." +The domain part of the \fIgethostname\fP return value. Under normal circumstances, .b $j is equivalent to .b $w.$m . .ip $n\(dg -.b "The name of the daemon (for error messages)." +The name of the daemon (for error messages). Defaults to .q MAILER-DAEMON . .ip $o\(dg -.b "The set of \*(lqoperators\*(rq in addresses." +(Obsolete: use OperatorChars option instead.) +The set of \*(lqoperators\*(rq in addresses. A list of characters which will be considered tokens and which will separate tokens @@ -2862,9 +3317,9 @@ a richer set of operators is .q ".:%@!/[]" , which adds support for UUCP, the %-hack, and X.400 addresses. .ip $p -.b "Sendmail's process id." +Sendmail's process id. .ip $q\(dg -.b "Default format of sender address." +Default format of sender address. The .b $q macro specifies how an address should appear in a message @@ -2884,27 +3339,32 @@ eric@CS.Berkeley.EDU (Eric Allman) properly quotes names that have special characters if the first form is used. .ip $r -.b "Protocol used to receive the message." +Protocol used to receive the message. +Set from the +.b \-p +command line flag or by the SMTP server code. .ip $s -.b "Sender's host name." +Sender's host name. +Set from the +.b \-p +command line flag or by the SMTP server code. .ip $t -.b "A numeric representation of the current time." +A numeric representation of the current time. .ip $u -.b "The recipient user." +The recipient user. .ip $v -.b "The version number of \fIsendmail\fP." +The version number of the +.i sendmail +binary. .ip $w\(dd -.b "The hostname of this site." -.pp -The -.b $w -macro is set to the root name of this host (but see below for caveats). +The hostname of this site. +This is the root name of this host (but see below for caveats). .ip $x -.b "The full name of the sender." +The full name of the sender. .ip $z -.b "The home directory of the recipient." +The home directory of the recipient. .ip $_ -.b "The validated sender address." +The validated sender address. .pp There are three types of dates that can be used. The @@ -3017,10 +3477,13 @@ macro is set to the full name of the sender. This can be determined in several ways. It can be passed as flag to .i sendmail . -The second choice is the value of the -.q Full-name: +It can be defined in the +.sm NAME +environment variable. +The third choice is the value of the +.q Full-Name: line in the header if it exists, -and the third choice is the comment field +and the fourth choice is the comment field of a .q From: line. @@ -3083,13 +3546,21 @@ and fields are set to the protocol used to communicate with .i sendmail and the sending hostname. +They can be set together using the +.b \-p +command line flag or separately using the +.b \-M +or +.b \-oM +flags. .pp The .b $_ is set to a validated sender host name. -If the sender is running an RFC 1413 compliant IDENT server, +If the sender is running an RFC 1413 compliant IDENT server +and the receiver has the IDENT protocol turned on, it will include the user name on that host. -.sh 3 "C and F \*- define classes" +.sh 2 "C and F \*- Define Classes" .pp Classes of phrases may be defined to match on the left hand side of rewriting rules, @@ -3103,10 +3574,12 @@ so that attempts to send to oneself can be eliminated. These can either be defined directly in the configuration file or read in from another file. -Classes may be given names -from the set of upper case letters. -Lower case letters and special characters -are reserved for system use. +Classes are named as a single letter or a word in {braces}. +Class names beginning with lower case letters +and special characters are reserved for system use. +Classes defined in config files may be given names +from the set of upper case letters for short names +or beginning with an upper case letter for long names. .pp The syntax is: .(b F @@ -3131,12 +3604,16 @@ CHmonet CHucbmonet .)b are equivalent. -The second form +The ``F'' form reads the elements of the class .i c from the named .i file . .pp +Elements of classes can be accessed in rules using +.b $= +or +.b $~ . The .b $~ (match entries not in class) @@ -3161,6 +3638,50 @@ is set to the set of domains by which this host is known, initially just .b $m . .pp +The class +.b $=t +is set to the set of trusted users by the +.b T +configuration line. +If you want to read trusted users from a file use +.b Ft \c +.i /file/name . +.pp +The class +.b $=n +can be set to the set of MIME body types +that can never be eight to seven bit encoded. +It defaults to +.q multipart/signed . +Message types +.q message/* +and +.q multipart/* +are never encoded directly. +Multipart messages are always handled recursively. +The handling of message/* messages +are controlled by class +.b $=s . +The class +.b $=e +contains the Content-Transfer-Encodings that can be 8\(->7 bit encoded. +It is predefined to contain +.q 7bit , +.q 8bit , +and +.q binary . +The class +.b $=s +contains the set of subtypes of message that can be treated recursively. +By default it contains only +.q rfc822 . +Other +.q message/* +types cannot be 8\(->7 bit encoded. +If a message containing eight bit data is sent to a seven bit host, +and that message cannot be encoded into seven bits, +it will be stripped to 7 bits. +.pp .i Sendmail can be compiled to allow a .i scanf (3) @@ -3175,7 +3696,7 @@ file into a class, use FL/etc/passwd %[^:] .)b which reads every line up to the first colon. -.sh 3 "M \*- define mailer" +.sh 2 "M \*- Define Mailer" .pp Programs and interfaces to mailers are defined in this line. @@ -3199,13 +3720,17 @@ Fields are: .ta 1i Path The pathname of the mailer Flags Special flags for this mailer -Sender A rewriting set for sender addresses -Recipient A rewriting set for recipient addresses +Sender Rewriting set(s) for sender addresses +Recipient Rewriting set(s) for recipient addresses Argv An argument vector to pass to this mailer Eol The end-of-line string for this mailer Maxsize The maximum message length to this mailer Linelimit The maximum line length in the message body Directory The working directory for the mailer +Userid The default user and group id to run as +Nice The nice(2) increment for the mailer +Charset The default character set for 8-bit characters +Type The MTS type information (used for error messages) .)b Only the first character of the field name is checked. .pp @@ -3213,9 +3738,25 @@ The following flags may be set in the mailer description. Any other flags may be used freely to conditionally assign headers to messages destined for particular mailers. +Flags marked with \(dg +are not interpreted by the +.i sendmail +binary; +these are the conventionally used to correlate to the flags portion +of the +.b H +line. +Flags marked with \(dd +apply to the mailers for the sender address +rather than the usual recipient mailers. .nr ii 4n .ip a -Run Extended SMTP (ESMTP) protocol (defined in RFCs 1425, 1426, and 1427). +Run Extended SMTP (ESMTP) protocol (defined in RFCs 1651, 1652, and 1653). +This flag defaults on if the SMTP greeting message includes the word +.q ESMTP . +.ip A +Look up the user part of the address in the alias database. +Normally this is only set for local mailers. .ip b Force a blank line on the end of a message. This is intended to work around some stupid versions of @@ -3226,7 +3767,13 @@ It would not normally be used on network mail. Do not include comments in addresses. This should only be used if you have to work around a remote mailer that gets confused by comments. -.ip C +This strips addresses of the form +.q "Phrase <address>" +or +.q "address (Comment)" +down to just +.q address . +.ip C\(dd If mail is .i received from a mailer with this flag set, @@ -3236,7 +3783,7 @@ any addresses in the header that do not have an at sign after being rewritten by ruleset three will have the .q @domain -clause from the sender +clause from the sender envelope address tacked on. This allows mail with headers of the form: .(b @@ -3249,7 +3796,8 @@ From: usera@hosta To: userb@hostb, userc@hosta .)b automatically. -.ip D +However, it doesn't really work reliably. +.ip D\(dg This mailer wants a .q Date: header line. @@ -3271,7 +3819,7 @@ but only if this is a network forward operation the mailer will give an error if the executing user does not have special permissions). -.ip F +.ip F\(dg This mailer wants a .q From: header line. @@ -3279,11 +3827,7 @@ header line. Normally, .i sendmail sends internally generated email (e.g., error messages) -using the null return address\** -.(f -\**Actually, this only applies to SMTP, -which uses the ``MAIL FROM:<>'' command. -.)f +using the null return address as required by RFC 1123. However, some mailers don't accept a null return address. If necessary, @@ -3309,6 +3853,19 @@ This option is not required (i.e., if this option is omitted the transmission will still operate successfully, although perhaps not as efficiently as possible). +.ip k +Normally when +.i sendmail +connects to a host via SMTP, +it checks to make sure that this isn't accidently the same host name +as might happen if +.i sendmail +is misconfigured or if a long-haul network interface is set in loopback mode. +This flag disables the loopback check. +It should only be used under very unusual circumstances. +.ip K +Currently unimplemented. +Reserved for chunking. .ip l This mailer is local (i.e., @@ -3334,7 +3891,7 @@ macro occurs in the part of the mailer definition, that field will be repeated as necessary for all qualifying users. -.ip M +.ip M\(dg This mailer wants a .q Message-Id: header line. @@ -3342,6 +3899,23 @@ header line. Do not insert a UNIX-style .q From line on the front of the message. +.ip o +Always run as the owner of the recipient mailbox. +Normally +.i sendmail +runs as the sender for locally generated mail +or as +.q daemon +(actually, the user specified in the +.b u +option) +when delivering network mail. +The normal behaviour is required by most local mailers, +which will not allow the envelope sender address +to be set unless the mailer is running as daemon. +This flag is ignored if the +.b S +flag is set. .ip p Use the route-addr style reverse-path in the SMTP .q "MAIL FROM:" @@ -3350,7 +3924,7 @@ rather than just the return address; although this is required in RFC821 section 3.1, many hosts do not process reverse-paths properly. Reverse-paths are officially discouraged by RFC 1123. -.ip P +.ip P\(dg This mailer wants a .q Return-Path: line. @@ -3361,7 +3935,7 @@ but sends a .b \-r flag. .ip s -Strip quote characters off of the address +Strip quote characters (" and \e) off of the address before calling the mailer. .ip S Don't reset the userid @@ -3371,20 +3945,31 @@ where .i sendmail ran as root. This could be used to avoid forged addresses. -This flag is suppressed if given from an -.q unsafe -environment -(e.g, a user's mail.cf file). +If the +.b U= +field is also specified, +this flag causes the user id to always be set to that user and group +(instead of leaving it as root). .ip u Upper case should be preserved in user names for this mailer. .ip U -This mailer wants Unix-style +This mailer wants UUCP-style .q From -lines with the ugly UUCP-style +lines with the ugly .q "remote from <host>" on the end. -.ip x +.ip w +The user must have a valid account on this machine, +i.e., +getpwnam +must succeed. +If not, +the mail is bounced. +This is required to get +.q \&.forward +capability. +.ip x\(dg This mailer wants a .q Full-Name: header line. @@ -3397,6 +3982,10 @@ will have an extra dot prepended (to be stripped at the other end). This insures that lines in the message containing a dot will not terminate the message prematurely. +.ip 5 +If no aliases are found for this address, +pass the address through ruleset 5 for possible alternate resolution. +This is intended to forward the mail to an alternate delivery spot. .ip 7 Strip all output to seven bits. This is the default if the @@ -3409,6 +3998,35 @@ If the .b 7 option is set, this is essentially always set, since the eighth bit was stripped on input. +Note that this option will only impact messages +that didn't have 8\(->7 bit MIME conversions performed. +.ip 8 +If set, +it is acceptable to send eight bit data to this mailer; +the usual attempt to do 8\(->7 bit MIME conversions will be bypassed. +.ip : +Check addresses to see if they begin +.q :include: ; +if they do, convert them to the +.q *include* +mailer. +.ip | +Check addresses to see if they begin with a `|'; +if they do, convert them to the +.q prog +mailer. +.ip / +Check addresses to see if they begin with a `/'; +if they do, convert them to the +.q *file* +mailer. +.ip @ +Look up addresses in the user database. +.pp +Configuration files prior to level 6 +assume the `A', `w', `5', `:', `|', `/', and `@' options +on the mailer named +.q local . .pp The mailer with the special name .q error @@ -3428,7 +4046,7 @@ and the .q "Host unknown" exit status to be returned if the LHS matches. -This mailer is only functional in ruleset zero. +This mailer is only functional in rulesets zero or five. .pp The mailer named .q local @@ -3452,8 +4070,8 @@ M*include*, P=/dev/null, F=su, A=INCLUDE .)b .pp The Sender and Recipient rewriting sets -may either be a simple integer -or may be two integers separated by a slash; +may either be a simple ruleset id +or may be two ids separated by a slash; if so, the first rewriting set is applied to envelope addresses and the second is applied to headers. @@ -3471,10 +4089,69 @@ mailer, since some shells (such as .i csh ) refuse to execute if they cannot read the home directory. -Since the queue directory is not normally readable by normal users +Since the queue directory is not normally readable by unprivileged users .i csh scripts as recipients can fail. -.sh 3 "H \*- define header" +.pp +The Userid +specifies the default user and group id to run as, +overriding the +.b DefaultUser +option (q.v.). +If the +.b S +mailer flag is also specified, +this is the user and group to run as in all circumstances. +This may be given as +.i user:group +to set both the user and group id; +either may be an integer or a symbolic name to be looked up +in the +.i passwd +and +.i group +files respectively. +If only a symbolic user name is specified, +the group id in the +.i passwd +file for that user is used as the group id. +.pp +The Charset field +is used when converting a message to MIME; +this is the character set used in the +Content-Type: header. +If this is not set, the +.b DefaultCharset +option is used, +and if that is not set, the value +.q unknown-8bit +is used. +.b WARNING: +this field applies to the sender's mailer, +not the recipient's mailer. +For example, if the envelope sender address +lists an address on the local network +and the recipient is on an external network, +the character set will be set from the Charset= field +for the local network mailer, +not that of the external network mailer. +.pp +The Type= field +sets the type information +used in MIME error messages +as defined by +RFC XXX +(not yet published). +It is actually three values separated by slashes: +the MTA-type (that is, the description of how hosts are named), +the address type (the description of e-mail addresses), +and the diagnostic type (the description of error diagnostic codes). +Each of these must be a registered value +or begin with +.q X\- . +The default is +.q dns/rfc822/smtp . +.sh 2 "H \*- Define Header" .pp The format of the header lines that .i sendmail @@ -3509,23 +4186,38 @@ it is reflected to the output regardless of these flags. .pp Some headers have special semantics -that will be described below. -.sh 3 "O \*- set option" +that will be described later. +.sh 2 "O \*- Set Option" .pp There are a number of -.q random +global options that can be set from a configuration file. -Options are represented by single characters. +Options are represented by full words; +some are also representable as single characters +for back compatibility. The syntax of this line is: .(b F -.b O \c -.i o\|value +.b O \0 +.i option \c +.b = \c +.i value .)b This sets option -.i o +.i option to be .i value . +Note that there +.i must +be a space between the letter `O' and the name of the option. +An older version is: +.(b F +.b O \c +.i o\|value +.)b +where the option +.i o +is a single character. Depending on the option, .i value may be a string, an integer, @@ -3540,25 +4232,10 @@ the default is TRUE), or a time interval. .pp -The options supported are: +The options supported (with the old, one character names in brackets) are: .nr ii 1i -.ip a\fIN\fP -If set, -wait up to -.i N -minutes for an -.q @:@ -entry to exist in the alias database -before starting up. -If it does not appear in -.i N -minutes, -rebuild the database -(if the -.b D -option is also set) -or issue a warning. -.ip "A\fIspec, spec, ...\fP" +.ip "AliasFile=\fIspec, spec, ...\fP" +[A] Specify possible alias file(s). Each .i spec @@ -3598,32 +4275,46 @@ If a list of are provided, .i sendmail searches them in order. -.ip b\fIN\fP/\fIM\fP -Insist on at least -.i N -blocks free on the filesystem that holds the queue files -before accepting email via SMTP. -If there is insufficient space +.ip AliasWait=\fItimeout\fP +[a] +If set, +wait up to +.i timeout +(units default to minutes) +for an +.q @:@ +entry to exist in the alias database +before starting up. +If it does not appear in the +.i timeout +interval +rebuild the database +(if the +.b AutoRebuildAliases +option is also set) +or issue a warning. +.ip AutoRebuildAliases +[D] +If set, +rebuild the alias database if necessary and possible. +If this option is not set, .i sendmail -gives a 452 response -to the MAIL command. -This invites the sender to try again later. -The optional -.i M -is a maximum message size advertised in the ESMTP EHLO response. -It is currently otherwise unused. -.ip B\fIc\fP +will never rebuild the alias database +unless explicitly requested +using +.b \-bi . +Not recommended \(em can cause thrashing. +.ip BlankSub=\fIc\fP +[B] Set the blank substitution character to .i c . Unquoted spaces in addresses are replaced by this character. Defaults to space (i.e., no change is made). -.ip c -If an outgoing mailer is marked as being expensive, -don't connect immediately. -This requires that queueing be compiled in, -since it will depend on a queue run process to -actually send the mail. -.ip C\fIN\fP +.ip CheckAliases +[n] +Validate the RHS of aliases when rebuilding the alias database. +.ip CheckpointInterval=\fIN\fP +[C] Checkpoints the queue every .i N (default 10) @@ -3632,7 +4323,131 @@ If your system crashes during delivery to a large list, this prevents retransmission to any but the last .I N recipients. -.ip d\fIx\fP +.ip ClassFactor=\fIfact\fP +[z] +The indicated +.i fact or +is multiplied by the message class +(determined by the Precedence: field in the user header +and the +.b P +lines in the configuration file) +and subtracted from the priority. +Thus, messages with a higher Priority: will be favored. +Defaults to 1800. +.ip ColonOkInAddr +[no short name] +If set, colons are acceptable in e-mail addresses +(e.g., +.q host:user ). +If not set, colons indicate the beginning of a RFC 822 group construct +(\c +.q "groupname: member1, member2, ... memberN;" ). +Doubled colons are always acceptable +(\c +.q nodename::user ) +and proper route-addr nesting is understood +(\c +.q <@relay:user@host> ). +Furthermore, this option defaults on if the configuration version level +is less than 6 (for back compatibility). +However, it must be off for full compatibility with RFC 822. +.ip ConnectionCacheSize=\fIN\fP +[k] +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 +or it terminates. +Setting it to zero defaults to the old behavior, +that is, connections are closed immediately. +Since this consumes file descriptors, +the connection cache should be kept small: +4 is probably a practical maximum. +.ip ConnectionCacheTimeout=\fItimeout\fP +[K] +The maximum amount of time a cached connection will be permitted to idle +without activity. +If this time is exceeded, +the connection is immediately closed. +This value should be small (on the order of ten minutes). +Before +.i sendmail +uses a cached connection, +it always sends a RSET command +to check the connection; +if this fails, it reopens the connection. +This keeps your end from failing if the other end times out. +The point of this option is to be a good network neighbor +and avoid using up excessive resources +on the other end. +The default is five minutes. +.ip DaemonPortOptions=\fIoptions\fP +[O] +Set server SMTP options. +The options are +.i key=value +pairs. +Known keys are: +.(b +.ta 1i +Port Name/number of listening port (defaults to "smtp") +Addr Address mask (defaults INADDR_ANY) +Family Address family (defaults to INET) +Listen Size of listen queue (defaults to 10) +SndBufSize Size of TCP send buffer +RcvBufSize Size of TCP receive buffer +.)b +The +.i Addr ess +mask may be a numeric address in dot notation +or a network name. +.ip DefaultCharSet=\fIcharset\fP +[no short name] +When a message that has 8-bit characters but is not in MIME format +is converted to MIME +(see the EightBitMode option) +a character set must be included in the Content-Type: header. +This character set is normally set from the Charset= field +of the mailer descriptor. +If that is not set, the value of this option is used. +If this option is not set, the value +.q unknown-8bit +is used. +.ip DefaultUser=\fIuser:group\fP +[u] +Set the default userid for mailers to +.i user:group . +If +.i group +is omitted and +.i user +is a user name +(as opposed to a numeric user id) +the default group listed in the /etc/passwd file for that user is used +as the default group. +Both +.i user +and +.i group +may be numeric. +Mailers without the +.i S +flag in the mailer definition +will run as this user. +Defaults to 1:1. +The value can also be given as a symbolic user name.\** +.(f +\**The old +.b g +option has been combined into the +.b DefaultUser +option. +.)f +.ip DeliveryMode=\fIx\fP +[d] Deliver in mode .i x . Legal modes are: @@ -3641,33 +4456,125 @@ Legal modes are: i Deliver interactively (synchronously) b Deliver in background (asynchronously) q Just queue the message (deliver during queue run) +d Defer delivery and all map lookups (deliver during queue run) .)b Defaults to ``b'' if no option is specified, ``i'' if it is specified but given no argument (i.e., ``Od'' is equivalent to ``Odi''). -.ip D +The +.b \-v +command line flag sets this to +.b i . +.ip DialDelay=\fIsleeptime\fP +[no short name] +Dial-on-demand network connections can see timeouts +if a connection is opened before the call is set up. +If this is set to an interval and a connection times out +on the first connection being attempted +.i sendmail +will sleep for this amount of time and try again. +This should give your system time to establish the connection +to your service provider. +Units default to seconds, so +.q DialDelay=5 +uses a five second delay. +Defaults to zero +(no retry). +.ip DontExpandCnames +[no short name] +The standards say that all host addresses used in a mail message +must be fully canonical. +For example, if your host is named +.q Cruft.Foo.ORG +and also has an alias of +.q FTP.Foo.ORG , +the former name must be used at all times. +This is enforced during host name canonification +($[ ... $] lookups). +If this option is set, the protocols are ignored and the +.q wrong +thing is done. +However, the IETF is moving toward changing this standard, +so the behaviour may become acceptable. +Please note that hosts downstream may still rewrite the address +to be the true canonical name however. +.ip DontInitGroups +[no short name] If set, -rebuild the alias database if necessary and possible. -If this option is not set, .i sendmail -will never rebuild the alias database -unless explicitly requested -using -.b \-bi . -.ip e\fIx\fP -Dispose of errors using mode -.i x . -The values for -.i x +will avoid using the initgroups(3) call. +If you are running NIS, +this causes a sequential scan of the groups.byname map, +which can cause your NIS server to be badly overloaded in a large domain. +The cost of this is that the only group found for users +will be their primary group (the one in the password file), +which will make file access permissions somewhat more restrictive. +Has no effect on systems that don't have group lists. +.ip DontPruneRoutes +[R] +Normally, +.i sendmail +tries to eliminate any unnecessary explicit routes +when sending an error message +(as discussed in RFC 1123 \(sc 5.2.6). +For example, +when sending an error message to +.(b +<@known1,@known2,@known3:user@unknown> +.)b +.i sendmail +will strip off the +.q @known1,@known2 +in order to make the route as direct as possible. +However, if the +.b R +option is set, this will be disabled, +and the mail will be sent to the first address in the route, +even if later addresses are known. +This may be useful if you are caught behind a firewall. +.ip EightBitMode=\fIaction\fP +[8] +Set handling of eight-bit data. +There are two kinds of eight-bit data: +that declared as such using the +.b BODY=8BITMIME +ESMTP declaration or the +.b \-B8BITMIME +command line flag, +and undeclared 8-bit data, that is, +input that just happens to be eight bits. +There are three basic operations that can happen: +undeclared 8-bit data can be automatically converted to 8BITMIME, +undeclared 8-bit data can be passed as-is without conversion to MIME +(``just send 8''), +and declared 8-bit data can be converted to 7-bits +for transmission to a non-8BITMIME mailer. +The possible +.i action s are: .(b -p Print error messages (default) -q No messages, just give exit status -m Mail back errors -w Write back errors (mail if user not logged in) -e Mail back errors and give zero exit stat always +.\" r Reject undeclared 8-bit data; +.\" don't convert 8BITMIME\(->7BIT (``reject'') + s Reject undeclared 8-bit data (``strict'') +.\" do convert 8BITMIME\(->7BIT (``strict'') +.\" c Convert undeclared 8-bit data to MIME; +.\" don't convert 8BITMIME\(->7BIT (``convert'') + m Convert undeclared 8-bit data to MIME (``mime'') +.\" do convert 8BITMIME\(->7BIT (``mime'') +.\" j Pass undeclared 8-bit data; +.\" don't convert 8BITMIME\(->7BIT (``just send 8'') + p Pass undeclared 8-bit data (``pass'') +.\" do convert 8BITMIME\(->7BIT (``pass'') +.\" a Adaptive algorithm: see below .)b -.ip E\fIfile/message\fP +.\"The adaptive algorithm is to accept 8-bit data, +.\"converting it to 8BITMIME only if the receiver understands that, +.\"otherwise just passing it as undeclared 8-bit data; +.\"8BITMIME\(->7BIT conversions are done. +In all cases properly declared 8BITMIME data will be converted to 7BIT +as needed. +.ip ErrorHeader=\fIfile-or-message\fP +[E] Prepend error messages with the indicated message. If it begins with a slash, it is assumed to be the pathname of a file @@ -3679,72 +4586,36 @@ in to end users. If the option is missing or null, or if it names a file which does not exist or which is not readable, no message is printed. -.ip f -Save -Unix-style -.q From -lines at the front of headers. -Normally they are assumed redundant -and discarded. -.ip F\fImode\fP -The file mode for queue files. -.ip g\fIn\fP -Set the default group id -for mailers to run in -to -.i n . -Defaults to 1. -The value can also be given as a symbolic group name. -.ip G -Allow fuzzy matching on the GECOS field. -If this flag is set, -and the usual user name lookups fail -(that is, there is no alias with this name and a -.i getpwnam -fails), -sequentially search the password file -for a matching entry in the GECOS field. -This also requires that MATCHGECOS -be turned on during compilation. -This option is not recommended. -.ip h\fIN\fP -The maximum hop count. -Messages that have been processed more than -.i N -times are assumed to be in a loop and are rejected. -Defaults to 25. -.ip H\fIfile\fP -Specify the help file -for SMTP. -.ip i -Ignore dots in incoming messages. -This is always disabled (that is, dots are always accepted) -when reading SMTP mail. -.ip I -Insist that the BIND name server be running -to resolve host names. -If this is not set and the name server is not running, -the -.i /etc/hosts -file will be considered complete. -In general, you do want to set this option -if your -.i /etc/hosts -file does not include all hosts known to you -or if you are using the MX (mail forwarding) feature of the BIND name server. -The name server will still be consulted -even if this option is not set, but -.i sendmail -will feel free to resort to reading -.i /etc/hosts -if the name server is not available. -Thus, you should -.i never -set this option if you do not run the name server. -.ip j -If set, send error messages in MIME format -(see RFC1341 and RFC1344 for details). -.ip J\fIpath\fP +.ip ErrorMode=\fIx\fP +[e] +Dispose of errors using mode +.i x . +The values for +.i x +are: +.(b +p Print error messages (default) +q No messages, just give exit status +m Mail back errors +w Write back errors (mail if user not logged in) +e Mail back errors and give zero exit stat always +.)b +.ip FallbackMXhost=\fIfallbackhost\fP +[V] +If specified, the +.i fallbackhost +acts like a very low priority MX +on every host. +This is intended to be used by sites with poor network connectivity. +.ip ForkEachJob +[Y] +If set, +deliver each job that is run from the queue in a separate process. +Use this option if you are short of memory, +since the default tends to consume considerable amounts of memory +while the queue is being processed. +.ip ForwardPath=\fIpath\fP +[J] Set the path for searching for users' .forward files. The default is .q $z/.forward . @@ -3761,57 +4632,131 @@ will search first in /var/forward/\c and then in .i ~username /.forward (but only if the first file does not exist). -.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 -or it terminates. -Setting it to zero defaults to the old behavior, -that is, connections are closed immediately. -.ip K\fItimeout\fP -The maximum amount of time a cached connection will be permitted to idle -without activity. -If this time is exceeded, -the connection is immediately closed. -This value should be small (on the order of ten minutes). -Before -.i sendmail -uses a cached connection, -it always sends a NOOP (no operation) command -to check the connection; -if this fails, it reopens the connection. -This keeps your end from failing if the other end times out. -The point of this option is to be a good network neighbor -and avoid using up excessive resources -on the other end. -The default is five minutes. -.ip l -If there is an -.q Errors-To: -header, send error messages to the addresses listed there. -They normally go to the envelope sender. -Use of this option causes -.i sendmail -to violate RFC 1123. -.ip L\fIn\fP +.ip HelpFile=\fIfile\fP +[H] +Specify the help file +for SMTP. +.ip HoldExpensive +[c] +If an outgoing mailer is marked as being expensive, +don't connect immediately. +This requires that queueing be compiled in, +since it will depend on a queue run process to +actually send the mail. +.ip IgnoreDots +[i] +Ignore dots in incoming messages. +This is always disabled (that is, dots are always accepted) +when reading SMTP mail. +.ip LogLevel=\fIn\fP +[L] Set the default log level to .i n . Defaults to 9. -.ip m -Send to me too, -even if I am in an alias expansion. .ip M\fIx\|value\fP +[no long version] Set the macro .i x to .i value . This is intended only for use from the command line. -.ip n -Validate the RHS of aliases when rebuilding the alias database. -.ip o +The +.b \-M +flag is preferred. +.ip MatchGECOS +[G] +Allow fuzzy matching on the GECOS field. +If this flag is set, +and the usual user name lookups fail +(that is, there is no alias with this name and a +.i getpwnam +fails), +sequentially search the password file +for a matching entry in the GECOS field. +This also requires that MATCHGECOS +be turned on during compilation. +This option is not recommended. +.ip MaxHopCount=\fIN\fP +[h] +The maximum hop count. +Messages that have been processed more than +.i N +times are assumed to be in a loop and are rejected. +Defaults to 25. +.ip MaxHostStatAge=\fIage\fP +[no short name] +Not yet implemented. +This option specifies how long host status information will be retained. +For example, if a host is found to be down, +connections to that host will not be retried for this interval. +The units default to minutes. +.ip MaxQueueRunSize=\fIN\fP +[no short name] +The maximum number of jobs that will be processed +in a single queue run. +If not set, there is no limit on the size. +If you have very large queues or a very short queue run interval +this could be unstable. +However, since the first +.i N +jobs in queue directory order are run (rather than the +.i N +highest priority jobs) +this should be set as high as possible to avoid +.q losing +jobs that happen to fall late in the queue directory. +.ip MeToo +[m] +Send to me too, +even if I am in an alias expansion. +.ip MaxMessageSize=\fIN\fP +[no short name] +Specify the maximum message size +to be advertised in the ESMTP EHLO response. +Messages larger than this will be rejected. +.ip MinFreeBlocks=\fIN\fP +[b] +Insist on at least +.i N +blocks free on the filesystem that holds the queue files +before accepting email via SMTP. +If there is insufficient space +.i sendmail +gives a 452 response +to the MAIL command. +This invites the sender to try again later. +.ip MinQueueAge=\fPage\fP +[no short name] +Don't process any queued jobs +that have been in the queue less than the indicated time interval. +This is intended to allow you to get responsiveness +by processing the queue fairly frequently +without thrashing your system by trying jobs too often. +The default units are minutes. +.ip NoRecipientAction +[no short name] +The action to take when you receive a message that has no valid +recipient headers (To:, Cc:, Bcc:). +It can be +.b None +to pass the message on unmodified, +which violates the protocol, +.b Add-To +to add a To: header with any recipients it can find in the envelope +(which might expose Bcc: recipients), +.b Add-Apparently-To +to add an Apparently-To: header +(this is only for back-compatibility +and is officially deprecated), +.b Add-To-Undisclosed +to add a header +.q "To: undisclosed-recipients:;" +to make the header legal without disclosing anything, +or +.b Add-Bcc +to add an empty Bcc: header. +.ip OldStyleHeaders +[o] Assume that the headers may be in old format, i.e., spaces delimit names. @@ -3823,24 +4768,38 @@ it will be assumed that commas already exist. If this flag is not on, only commas delimit names. Headers are always output with commas between the names. -.ip O\fIoptions\fP -Set server SMTP options. -The options are -.i key=value -pairs. -Known keys are: -.(b -.ta 1i -Port Name/number of listening port (defaults to "smtp") -Addr Address mask (defaults INADDR_ANY) -Family Address family (defaults to INET) -Listen Size of listen queue (defaults to 10) -.)b -The -.i Addr ess -mask may be a numeric address in dot notation -or a network name. -.ip p\fI\|opt,opt,...\fP +Defaults to off. +.ip OperatorChars=\fIcharlist\fP +[$o macro] +The list of characters that are considered to be +.q operators , +that is, characters that delimit tokens. +All operator characters are tokens by themselves; +sequences of non-operator characters are also tokens. +White space characters separate tokens +but are not tokens themselves \(em for example, +.q AAA.BBB +has three tokens, but +.q "AAA BBB" +has two. +If not set, OperatorChars defaults to +.q \&.\|:\|@\|[\|] ; +additionally, the characters +.q (\|)\|<\|>\|,\|; +are always operators. +.ip PostmasterCopy=\fIpostmaster\fP +[P] +If set, +copies of error messages will be sent to the named +.i postmaster . +Only the header of the failed message is sent. +Since most errors are user problems, +this is probably not a good idea on large sites, +and arguably contains all sorts of privacy violations, +but it seems to be popular with certain operating systems vendors. +Defaults to no postmaster copies. +.ip PrivacyOptions=\fI\|opt,opt,...\fP +[p] Set the privacy .i opt ions. ``Privacy'' is really a misnomer; @@ -3859,7 +4818,7 @@ needvrfyhelo Insist on HELO or EHLO command before VRFY novrfy Disallow VRFY entirely restrictmailq Restrict mailq command restrictqrun Restrict \-q command line flag -noreceipts Ignore Return-Receipt-To: header +noreceipts Don't return success DSNs goaway Disallow essentially all SMTP status queries authwarnings Put X-Authentication-Warning: headers in messages .)b @@ -3878,16 +4837,13 @@ 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 -.i postmaster . -Only the header of the failed message is sent. -Since most errors are user problems, -this is probably not a good idea on large sites, -and arguably contains all sorts of privacy violations, -but it seems to be popular with certain operating systems vendors. -.ip q\fIfactor\fP +.ip QueueDirectory=\fIdir\fP +[Q] +Use the named +.i dir +as the queue directory. +.ip QueueFactor=\fIfactor\fP +[q] Use .i factor as the multiplier in the map function @@ -3895,24 +4851,86 @@ to decide when to just queue up jobs rather than run them. This value is divided by the difference between the current load average and the load average limit (\c -.b x -flag) +.b QueueLA +option) to determine the maximum message priority that will be sent. Defaults to 600000. -.ip Q\fIdir\fP -Use the named -.i dir -as the queue directory. -.ip r\|\fItimeouts\fP -Timeout reads after -.i time -interval. -The -.i timeouts -argument is a list of -.i keyword=value -pairs. +.ip QueueLA=\fILA\fP +[x] +When the system load average exceeds +.i LA , +just queue messages +(i.e., don't try to send them). +Defaults to 8. +.ip QueueSortOrder=\fIalgorithm\fP +[no short name] +Sets the +.i algorithm +used for sorting the queue. +Only the first character of the value is used. +Legal values are +.q host +(to order by the name of the first host name of the first recipient) +and +.q priority +(to order strictly by message priority). +Host ordering makes better use of the connection cache, +but may tend to process low priority messages +that go to a single host +over high priority messages that go to several hosts; +it probably shouldn't be used on slow network links. +Priority ordering is the default. +.ip ResolverOptions=\fIoptions\fP +[I] +Set resolver options. +Values can be set using +.b + \c +.i flag +and cleared using +.b \- \c +.i flag ; +the +.i flag s +can be +.q debug , +.q aaonly , +.q usevc , +.q primary , +.q igntc , +.q recurse , +.q defnames , +.q stayopen , +or +.q dnsrch . +The string +.q HasWildcardMX +(without a +.b + +or +.b \- ) +can be specified to turn off matching against MX records +when doing name canonifications. +.b N.B. +Prior to 8.7, +this option indicated that the name server be responding +in order to accept addresses. +This has been replaced by checking to see +if the +.q dns +method is listed in the service switch entry for the +.q hosts +service. +.ip SmtpGreetingMessage=\fImessage\fP +[$e macro] +The message printed when the SMTP server starts up. +Defaults to +.q "$j Sendmail $v ready at $b". +.ip Timeout.\fItype\fP=\|\fItimeout\fP +[r; subsumes old T option as well] +Set timeout values. +The actual timeout is indicated by the +.i type . The recognized timeouts and their default values, and their minimum values specified in RFC 1123 section 5.3.2 are: .(b @@ -3927,37 +4945,128 @@ datafinal reply to final ``.'' in data [1h, 10m] rset reply to RSET command [5m, none] quit reply to QUIT command [2m, none] misc reply to NOOP and VERB commands [2m, none] -command command read [1h, 5m] ident IDENT protocol timeout [30s, none] +fileopen\(dg timeout on opening .forward and :include: files [60s, none] +command\(dg command read [1h, 5m] +queuereturn\(dg how long until a message is returned [5d, 5d] +queuewarn\(dg how long until a warning is sent [none, none] .)b -All but -.q command +All but those marked with a dagger (\(dg) apply to client SMTP. -For back compatibility, -a timeout with no ``keyword='' part -will set all of the longer values. -.ip R -Normally, +If the message is submitted using the +.sm NOTIFY +.sm SMTP +extension, +warning messages will only be sent if +.sm NOTIFY=DELAY +is specified. +The queuereturn and queuewarn timeouts +can be further qualified with a tag based on the Precedence: field +in the message; +they must be one of +.q urgent +(indicating a positive non-zero precedence) +.q normal +(indicating a zero precedence), or +.q non-urgent +(indicating negative precedences). +For example, setting +.q Timeout.queuewarn.urgent=1h +sets the warning timeout for urgent messages only +to one hour. +The default if no precedence is indicated +is to set the timeout for all precedences. +.ip RecipientFactor=\fIfact\fP +[y] +The indicated +.i fact or +is added to the priority (thus +.i lowering +the priority of the job) +for each recipient, +i.e., this value penalizes jobs with large numbers of recipients. +Defaults to 30000. +.ip RefuseLA=\fILA\fP +[X] +When the system load average exceeds +.i LA , +refuse incoming SMTP connections. +Defaults to 12. +.ip RetryFactor=\fIfact\fP +[Z] +The +.i fact or +is added to the priority +every time a job is processed. +Thus, +each time a job is processed, +its priority will be decreased by the indicated value. +In most environments this should be positive, +since hosts that are down are all too often down for a long time. +Defaults to 90000. +.ip SaveFromLine +[f] +Save +Unix-style +.q From +lines at the front of headers. +Normally they are assumed redundant +and discarded. +.ip SendMIMEErrors +[j] +If set, send error messages in MIME format +(see RFC1521 and RFC1344 for details). +.ip ServiceSwitchFile=\fIfilename\fP +[no short name] +If your host operating system has a service switch abstraction +(e.g., /etc/nsswitch.conf on Solaris +or /etc/svc.conf on Ultrix and DEC OSF/1) +that service will be consulted and this option is ignored. +Otherwise, this is the name of a file +that provides the list of methods used to implement particular services. +The syntax is a series of lines, +each of which is a sequence of words. +The first word is the service name, +and following words are service types. +The services that .i sendmail -tries to eliminate any unnecessary explicit routes -when sending an error message -(as discussed in RFC 1123 \(sc 5.2.6). -For example, -when sending an error message to +consults directly are +.q aliases +and +.q hosts. +Service types can be +.q dns , +.q nis , +.q nisplus , +or +.q files +(with the caveat that the appropriate support +must be compiled in +before the service can be referenced). +If ServiceSwitchFile is not specified, it defaults to /etc/service.switch. +If that file does not exist, the default switch is: .(b -<@known1,@known2,@unknown:user@known3> +aliases files +hosts dns nis files .)b -.i sendmail -will strip off the -.q @known1 -in order to make the route as direct as possible. -However, if the -.b R -option is set, this will be disabled, -and the mail will be sent to the first address in the route, -even if later addresses are known. -This may be useful if you are caught behind a firewall. -.ip s +The default file is +.q /etc/service.switch . +.ip SevenBitInput +[7] +Strip input to seven bits for compatibility with old systems. +This shouldn't be necessary. +.ip StatusFile=\fIfile\fP +[S] +Log summary statistics in the named +.i file . +If not set, +no summary statistics are saved. +This file does not grow in size. +It can be printed using the +.i mailstats (8) +program. +.ip SuperSafe +[s] Be super-safe when running things, i.e., always instantiate the queue file, @@ -3966,10 +5075,16 @@ even if you are going to attempt immediate delivery. always instantiates the queue file before returning control the client under any circumstances. -.ip S\fIfile\fP -Log statistics in the named -.i file . -.ip t\fItzinfo\fP +This should really +.i always +be set. +.ip TempFileMode=\fImode\fP +[F] +The file mode for queue files. +It is interpreted in octal by default. +Defaults to 0600. +.ip TimeZoneSpec=\fItzinfo\fP +[t] Set the local time zone info to .i tzinfo \*- for example, @@ -3978,61 +5093,14 @@ Actually, if this is not set, the TZ environment variable is cleared (so the system default is used); if set but null, the user's TZ variable is used, and if set and non-null the TZ variable is set to this value. -.ip T\fIrtime/wtime\fP -Set the queue timeout to -.i rtime . -After this interval, -messages that have not been successfully sent -will be returned to the sender. -Defaults to five days. -The optional -.i wtime -is the time after which a warning message is sent. -If it is missing or zero -then no warning messages are sent. -.ip u\fIn\fP -Set the default userid for mailers to -.i n . -Mailers without the -.i S -flag in the mailer definition -will run as this user. -Defaults to 1. -The value can also be given as a symbolic user name. -.ip U\fIudbspec\fP -The user database specification. -.ip v -Run in verbose mode. -If this is set, -.i sendmail -adjusts options -.b c -(don't connect to expensive mailers) -and -.b d -(delivery mode) -so that all mail is delivered completely -in a single job -so that you can see the entire delivery process. -Option -.b v -should -.i never -be set in the configuration file; -it is intended for command line use only. -.ip V\fIfallbackhost\fP -If specified, the -.i fallbackhost -acts like a very low priority MX -on every host. -This is intended to be used by sites with poor network connectivity. -.ip w -If you are the +.ip TryNullMXList +[w] +If this system is the .q best (that is, lowest preference) MX for a given host, -you should normally detect this situation -and treat that condition specially, +its configuration rules should normally detect this situation +and treat that condition specially by forwarding the mail to a UUCP feed, treating it as local, or whatever. @@ -4049,69 +5117,77 @@ or .q "message timed out" instead of something more meaningful. This option is disrecommended. -.ip x\fILA\fP -When the system load average exceeds -.i LA , -just queue messages -(i.e., don't try to send them). -Defaults to 8. -.ip X\fILA\fP -When the system load average exceeds -.i LA , -refuse incoming SMTP connections. -Defaults to 12. -.ip y\fIfact\fP -The indicated -.i fact or -is added to the priority (thus -.i lowering -the priority of the job) -for each recipient, -i.e., this value penalizes jobs with large numbers of recipients. -Defaults to 30000. -.ip Y -If set, -deliver each job that is run from the queue in a separate process. -Use this option if you are short of memory, -since the default tends to consume considerable amounts of memory -while the queue is being processed. -.ip z\fIfact\fP -The indicated -.i fact or -is multiplied by the message class -(determined by the Precedence: field in the user header -and the -.b P -lines in the configuration file) -and subtracted from the priority. -Thus, messages with a higher Priority: will be favored. -Defaults to 1800. -.ip Z\fIfact\fP -The -.i fact or -is added to the priority -every time a job is processed. -Thus, -each time a job is processed, -its priority will be decreased by the indicated value. -In most environments this should be positive, -since hosts that are down are all too often down for a long time. -Defaults to 90000. -.ip 7 -Strip input to seven bits for compatibility with old systems. -This shouldn't be necessary. +.ip UnixFromLine=\fIfromline\fP +[$l macro] +Defines the format used when +.i sendmail +must add a UNIX-style From_ line +(that is, a line beginning +.q From<space>user ). +Defaults to +.q "From $g $d" . +Don't change this unless your system uses a different UNIX mailbox format +(very unlikely). +.ip UseErrorsTo +[l] +If there is an +.q Errors-To: +header, send error messages to the addresses listed there. +They normally go to the envelope sender. +Use of this option causes +.i sendmail +to violate RFC 1123. +This option is disrecommended and deprecated. +.ip UserDatabaseSpec=\fIudbspec\fP +[U] +The user database specification. +.ip Verbose +[v] +Run in verbose mode. +If this is set, +.i sendmail +adjusts options +.b HoldExpensive +(old +.b c ) +and +.b DeliveryMode +(old +.b d ) +so that all mail is delivered completely +in a single job +so that you can see the entire delivery process. +Option +.b Verbose +should +.i never +be set in the configuration file; +it is intended for command line use only. .lp All options can be specified on the command line using the -\-o flag, +\-O or \-o flag, but most will cause .i sendmail to relinquish its setuid permissions. The options that will not cause this are -b, d, e, i, L, m, o, p, r, s, v, C, and 7. +MinFreeBlocks [b], +DeliveryMode [d], +ErrorMode [e], +IgnoreDots [i], +LogLevel [L], +MeToo [m], +OldStyleHeaders [o], +PrivacyOptions [p], +Timeouts [r], +SuperSafe [s], +Verbose [v], +CheckpointInterval [C], +and +SevenBitInput [7]. Also, M (define macro) when defining the r or s macros is also considered .q safe . -.sh 3 "P \*- precedence definitions" +.sh 2 "P \*- Precedence Definitions" .pp Values for the .q "Precedence:" @@ -4157,7 +5233,7 @@ didn't recognize this name, giving it a default precedence of zero. This allows list maintainers to see error returns on both old and new versions of .i sendmail . -.sh 3 "V \*- configuration version level" +.sh 2 "V \*- Configuration Version Level" .pp To provide compatibility with old configuration files, the @@ -4178,8 +5254,8 @@ on the files. For example, as of this writing version 8 config files -(specifically, 8.6) -used version level 5 configurations. +(specifically, 8.7) +used version level 6 configurations. .pp .q Old configuration files are defined as version level one. @@ -4237,6 +5313,22 @@ change the default definition of .b $w to be just the first component of the hostname. .pp +Version level six configuration files +change many of the local processing options +(such as aliasing and matching the beginning of the address for +`|' characters) +to be mailer flags; +this allows fine-grained control over the special local processing. +Level six configuration files may also use long option names. +The +.b ColonOkInAddr +option (to allow colons in the local-part of addresses) +defaults +.b on +for lower numbered configuration files; +the configuration file requires some additional intelligence +to properly handle the RFC 822 group construct. +.pp The .b V line may have an optional @@ -4250,8 +5342,15 @@ to the list of recognized vendors by editing the routine .i setvendor in .i conf.c . +Please send e-mail to sendmail@CS.Berkeley.EDU +to register your vendor dialect. .)f -.sh 3 "K \*- key file declaration" +You may use +.q /Berkeley +to emphasize that this configuration file +uses the Berkeley dialect of +.i sendmail . +.sh 2 "K \*- Key File Declaration" .pp Special maps can be defined using the line: .(b @@ -4281,7 +5380,7 @@ or .i default portion may be omitted. The -.i arguments +.i "$@ arguments" may appear more than once. The indicated .i key @@ -4309,7 +5408,7 @@ is always the database key. For example, the rule .(b .ta 1.5i -R$- ! $+ $: $(uucp $1 $@ $2 $: %1 @ %0 . UUCP $) +R$\- ! $+ $: $(uucp $1 $@ $2 $: %1 @ %0 . UUCP $) .)b Looks up the UUCP name in a (user defined) UUCP map; if not found it turns it into @@ -4334,24 +5433,156 @@ is equivalent to: $[\fIhostname\fP$] .)b .pp -There are four predefined database lookup classes: -.q dbm , -.q btree , -.q hash , +There are many defined classes. +.ip dbm +Database lookups using the ndbm(3) library. +.i Sendmail +must be compiled with +.b NDBM +defined. +.ip btree +Database lookups using the btree interface to the Berkeley db(3) library. +.i Sendmail +must be compiled with +.b NEWDB +defined. +.ip hash +Database lookups using the hash interface to the Berkeley db(3) library. +.i Sendmail +must be compiled with +.b NEWDB +defined. +.ip nis +NIS lookups. +.i Sendmail +must be compiled with +.b NIS +defined. +.ip nisplus +NIS+ lookups. +.i Sendmail +must be compiled with +.b NISPLUS +defined. +The argument is the name of the table to use for lookups, +and the +.b \-k and -.q nis . -The first requires that -.i sendmail -be compiled with the -.b ndbm -library; -the second two require the -.b db -library, -and the third requires that -.i sendmail -be compiled with NIS support. -All four accept as arguments the same optional flags +.b \-v +flags may be used to set the key and value columns respectively. +.ip hesiod +Hesiod lookups. +.i Sendmail +must be compiled with +.b HESIOD +defined. +.ip netinfo +NeXT NetInfo lookups. +.i Sendmail +must be compiled with +.b NETINFO +defined. +.ip text +Text file lookups. +The format of the text file is defined by the +.b \-k +(key field number), +.b \-v +(value field number), +and +.b \-z +(field delimiter) +flags. +.ip stab +Internal symbol table lookups. +Used internally for aliasing. +.ip implicit +Really should be called +.q alias +\(em this is used to get the default lookups +for alias files, +and is the default if no class is specified for alias files. +.ip user +Looks up users using +.i getpwnam (3). +The +.b \-v +flag can be used to specify the name of the field to return +(although this is normally used only to check the existence +of a user). +.ip host +Canonifies host domain names. +Given a host name it calls the name server +to find the canonical name for that host. +.ip sequence +The arguments on the `K' line are a list of maps; +the resulting map searches the argument maps in order +until it finds a match for the indicated key. +For example, if the key definition is: +.(b +Kmap1 ... +Kmap2 ... +Kseqmap sequence map1 map2 +.)b +then a lookup against +.q seqmap +first does a lookup in map1. +If that is found, it returns immediately. +Otherwise, the same key is used for map2. +.ip switch +Much like the +.q sequence +map except that the order of maps is determined by the service switch. +The argument is the name of the service to be looked up; +the values from the service switch are appended to the map name +to create new map names. +For example, consider the key definition: +.(b +Kali switch aliases +.)b +together with the service switch entry: +.(b +aliases nis files +.)b +This causes a query against the map +.q ali +to search maps named +.q ali.nis +and +.q ali.files +in that order. +.ip dequote +Strip double quotes (") from a name. +It does not strip backslashes, +and will not strip quotes if the resulting string +would contain unscannable syntax +(that is, basic errors like unbalanced angle brackets; +more sophisticated errors such as unknown hosts are not checked). +The intent is for use when trying to accept mail from systems such as +DECnet +that routinely quote odd syntax such as +.(b +"49ers::ubell" +.)b +A typical usage is probably something like: +.(b +Kdequote dequote + +\&... + +R$\- $: $(dequote $1 $) +R$\- $+ $: $>3 $1 $2 +.)b +Care must be taken to prevent unexpected results; +for example, +.(b +"|someprogram < input > output" +.)b +will have quotes stripped, +but the result is probably not what you had in mind. +Fortunately these cases are rare. +.pp +Most of these accept as arguments the same optional flags and a filename (or a mapname for NIS; the filename is the root of the database path, @@ -4367,14 +5598,7 @@ no error is produced, and .i sendmail will behave as if the map existed but was empty. -.ip "\-N" -Normally when maps are written, -the trailing null byte is not included as part of the key. -If this flag is indicated it will be included. -During lookups, only the null-byte-included form will be searched. -See also -.b \-O. -.ip "\-O" +.ip "\-N, \-O" If neither .b \-N or @@ -4386,9 +5610,14 @@ on the end of keys. It starts by trying both; if it finds any key with a null byte it never tries again without a null byte and vice versa. -If this flag is specified, -it never tries with a null byte; -this can speed matches but is never necessary. +If +.b \-N +is specified it never tries without a null byte and +if +.b \-O +is specified it never tries with a null byte. +Setting one of +these can speed matches but are never necessary. If both .b \-N and @@ -4416,6 +5645,25 @@ this flag prevents the map from substituting the value. However, The \-a argument is still appended on a match, and the default is still taken if the match fails. +.ip "\-k\fIkeycol\fP" +The key column name (for NIS+) or number +(for text lookups). +.ip "\-v\fIvalcol\fP" +The value column name (for NIS+) or number +(for text lookups). +.ip "\-z\fIdelim\fP" +The column delimiter (for text lookups). +It can be a single character or one of the special strings +.q \|\en +or +.q \|\et +to indicate newline or tab respectively. +If omitted entirely, +the column separator is any sequence of whitespace. +.ip "\-s\fIspacesub\fP +For the dequote map only, +the character to use to replace space characters +after a successful dequote. .pp The .i dbm @@ -4445,7 +5693,7 @@ The program can be used to build any of the three database-oriented maps. It takes the following flags: .ip \-f -Fold upper to lower case in the map. +Do not fold upper to lower case in the map. .ip \-N Include null bytes in keys. .ip \-o @@ -4466,691 +5714,14 @@ while they are being updated.\** \**That is, don't create new maps and then use .i mv (1) to move them into place. -I consider this a shortfall (a.k.a. bug) in -.i sendmail -which should be fixed in a future release. +Since the maps are already open +the new maps will never be seen. .)f .pp -There are also two builtin maps that are, -strictly speaking, -not database lookups. -.pp -The -.q host -map does host domain canonification; -given a host name it calls the name server -to find the canonical name for that host. -.pp -The -.q dequote -map strips double quotes (") from a name. -It does not strip backslashes. -It will not strip quotes if the resulting string -would contain unscannable syntax -(that is, basic errors like unbalanced angle brackets; -more sophisticated errors such as unknown hosts are not checked). -The intent is for use when trying to accept mail from systems such as -DECnet -that routinely quote odd syntax such as -.(b -"49ers::ubell" -.)b -A typical usage is probably something like: -.(b -Kdequote dequote - -\&... - -R$\- $: $(dequote $1 $) -R$\- $+ $: $>3 $1 $2 -.)b -Care must be taken to prevent unexpected results; -for example, -.(b -"|someprogram < input > output" -.)b -will have quotes stripped, -but the result is probably not what you had in mind. -Fortunately these cases are rare. -.pp New classes can be added in the routine .b setupmaps in file .b conf.c . -.sh 2 "Building a Configuration File From Scratch" -.pp -Building a configuration table from scratch is an extremely difficult job. -Fortunately, -it is almost never necessary to do so; -nearly every situation that may come up -may be resolved by changing an existing table. -In any case, -it is critical that you understand what it is that you are trying to do -and come up with a philosophy for the configuration table. -This section is intended to explain what the real purpose -of a configuration table is -and to give you some ideas -for what your philosophy might be. -.pp -.b "Do not even consider" -writing your own configuration file -without carefully studying -RFC 821, 822, and 1123. -You should also read RFC 976 -if you are doing UUCP exchange. -.sh 3 "What you are trying to do" -.pp -The configuration table has three major purposes. -The first and simplest -is to set up the environment for -.i sendmail . -This involves setting the options, -defining a few critical macros, -etc. -Since these are described in other places, -we will not go into more detail here. -.pp -The second purpose is to rewrite addresses in the message. -This should typically be done in two phases. -The first phase maps addresses in any format -into a canonical form. -This should be done in ruleset three. -The second phase maps this canonical form -into the syntax appropriate for the receiving mailer. -.i Sendmail -does this in three subphases. -Rulesets one and two -are applied to all sender and recipient addresses respectively. -After this, -you may specify per-mailer rulesets -for both sender and recipient addresses; -this allows mailer-specific customization. -Finally, -ruleset four is applied to do any default conversion -to external form. -.pp -The third purpose -is to map addresses into the actual set of instructions -necessary to get the message delivered. -Ruleset zero must resolve to the internal form, -which is in turn used as a pointer to a mailer descriptor. -The mailer descriptor describes the interface requirements -of the mailer. -.sh 3 "Philosophy" -.pp -The particular philosophy you choose will depend heavily -on the size and structure of your organization. -I will present a few possible philosophies here. -There are as many philosophies as there are config designers; -feel free to develop your own. -.pp -One general point applies to all of these philosophies: -it is almost always a mistake -to try to do full host route resolution. -For example, -if you are on a UUCP-only site -and you are trying to get names of the form -.q user@host -to the Internet, -it does not pay to route them to -.q xyzvax!decvax!ucbvax!c70!user@host -since you then depend on several links not under your control, -some of which are likely to misparse it anyway. -The best approach to this problem -is to simply forward the message for -.q user@host -to -.q xyzvax -and let xyzvax -worry about it from there. -In summary, -just get the message closer to the destination, -rather than determining the full path. -.sh 4 "Large site, many hosts \*- minimum information" -.pp -Berkeley is an example of a large site, -i.e., more than two or three hosts -and multiple mail connections. -We have decided that the only reasonable philosophy -in our environment -is to designate one host as the guru for our site. -It must be able to resolve any piece of mail it receives. -The other sites should have the minimum amount of information -they can get away with. -In addition, -any information they do have -should be hints rather than solid information. -.pp -For example, -a typical site on our local ether network is -.q monet -(actually -.q monet.CS.Berkeley.EDU ). -When monet receives mail for delivery, -it checks whether it knows -that the destination host is directly reachable; -if so, mail is sent to that host. -If it receives mail for any unknown host, -it just passes it directly to -.q ucbvax.CS.Berkeley.EDU , -our master host. -Ucbvax may determine that the host name is illegal -and reject the message, -or may be able to do delivery. -However, it is important to note that when a new mail connection is added, -the only host that -.i must -have its tables updated -is ucbvax; -the others -.i may -be updated if convenient, -but this is not critical. -.pp -This picture is slightly muddied -due to network connections that are not actually located -on ucbvax. -For example, -some UUCP connections are currently on -.q ucbarpa. -However, -monet -.i "does not" -know about this; -the information is hidden totally between ucbvax and ucbarpa. -Mail going from monet to a UUCP host -is transferred via the ethernet -from monet to ucbvax, -then via the ethernet from ucbvax to ucbarpa, -and then is submitted to UUCP. -Although this involves some extra hops, -we feel this is an acceptable tradeoff. -.pp -An interesting point is that it would be possible -to update monet -to send appropriate UUCP mail directly to ucbarpa -if the load got too high; -if monet failed to note a host as connected to ucbarpa -it would go via ucbvax as before, -and if monet incorrectly sent a message to ucbarpa -it would still be sent by ucbarpa -to ucbvax as before. -The only problem that can occur is loops, -for example, -if ucbarpa thought that ucbvax had the UUCP connection -and vice versa. -For this reason, -updates should -.i always -happen to the master host first. -.pp -This philosophy results as much from the need -to have a single source for the configuration files -(typically built using -.i m4 \|(1) -or some similar tool) -as any logical need. -Maintaining more than three separate tables by hand -is essentially an impossible job. -.sh 4 "Small site \*- complete information" -.pp -A small site -(two or three hosts and few external connections) -may find it more reasonable to have complete information -at each host. -This would require that each host -know exactly where each network connection is, -possibly including the names of each host on that network. -As long as the site remains small -and the configuration remains relatively static, -the update problem will probably not be too great. -.sh 4 "Single host" -.pp -This is in some sense the trivial case. -The only major issue is trying to insure that you don't -have to know too much about your environment. -For example, -if you have a UUCP connection -you might find it useful to know about the names of hosts -connected directly to you, -but this is really not necessary -since this may be determined from the syntax. -.sh 4 "A completely different philosophy" -.pp -This is adapted from Bruce Lilly. -Any errors in interpretation are mine. -.pp -Do minimal changes in ruleset 3: -fix some common but unambiguous errors (e.g. trailing dot on domains) and -hide bang paths foo!bar into bar@foo.UUCP. -The resulting "canonical" form is any valid RFC822/RFC1123/RFC976 address. -.pp -Ruleset 0 does the bulk of the work. -It removes the trailing "@.UUCP" that hides bang paths, -strips anything not needed to resolve, -e.g. the phrase from phrase <route-addr> and from named groups, -rejects unparseable addresses using $#error, -and finally -resolves to a mailer/host/user triple. -Ruleset 0 is rather lengthy -as it has to handle 3 basic address forms: -RFC976 bang paths, -RFC1123 %-hacks -(including vanilla RFC822 local-part@domain), -and RFC822 source routes. -It's also complicated by having to handle named lists. -.pp -The header rewriting rulesets 1 and 2 -remove the trailing "@.UUCP" that hides bang paths. -Ruleset 2 also strips the $# mailer $@ host (for test mode). -.pp -Ruleset 4 does absolutely nothing. -.pp -The per-mailer rewriting rulesets conform the envelope and -header addresses to the requirements of the specific -mailer. -.pp -Lots of rulesets-as-subroutines are used. -.pp -As a result, header addresses are subject to minimal munging -(per RFC1123), and the general plan is per RFC822 sect. 3.4.10. -.sh 3 "Relevant issues" -.pp -The canonical form you use -should almost certainly be as specified in -the Internet protocols -RFC819 and RFC822. -Copies of these RFC's are included on the -.i sendmail -tape -as -.i doc/rfc819.lpr -and -.i doc/rfc822.lpr . -.pp -RFC822 -describes the format of the mail message itself. -.i Sendmail -follows this RFC closely, -to the extent that many of the standards described in this document -can not be changed without changing the code. -In particular, -the following characters have special interpretations: -.(b -< > ( ) " \e -.)b -Any attempt to use these characters for other than their RFC822 -purpose in addresses is probably doomed to disaster. -.pp -RFC819 -describes the specifics of the domain-based addressing. -This is touched on in RFC822 as well. -Essentially each host is given a name -which is a right-to-left dot qualified pseudo-path -from a distinguished root. -The elements of the path need not be physical hosts; -the domain is logical rather than physical. -For example, -at Berkeley -one legal host might be -.q a.CC.Berkeley.EDU ; -reading from right to left, -.q EDU -is a top level domain -comprising educational institutions, -.q Berkeley -is a logical domain name, -.q CC -represents the Computer Center, -(in this case a strictly logical entity), -and -.q a -is a host in the Computer Center. -.pp -Beware when reading RFC819 -that there are a number of errors in it. -.sh 3 "How to proceed" -.pp -Once you have decided on a philosophy, -it is worth examining the available configuration tables -to decide if any of them are close enough -to steal major parts of. -Even under the worst of conditions, -there is a fair amount of boiler plate that can be collected safely. -.pp -The next step is to build ruleset three. -This will be the hardest part of the job. -Beware of doing too much to the address in this ruleset, -since anything you do will reflect through -to the message. -In particular, -stripping of local domains is best deferred, -since this can leave you with addresses with no domain spec at all. -Since -.i sendmail -likes to append the sending domain to addresses with no domain, -this can change the semantics of addresses. -Also try to avoid -fully qualifying domains in this ruleset. -Although technically legal, -this can lead to unpleasantly and unnecessarily long addresses -reflected into messages. -The Berkeley configuration files -define ruleset nine -to qualify domain names and strip local domains. -This is called from ruleset zero -to get all addresses into a cleaner form. -.pp -Once you have ruleset three finished, -the other rulesets should be relatively trivial. -If you need hints, -examine the supplied configuration tables. -.sh 3 "Testing the rewriting rules \*- the \-bt flag" -.pp -When you build a configuration table, -you can do a certain amount of testing -using the -.q "test mode" -of -.i sendmail . -For example, -you could invoke -.i sendmail -as: -.(b -sendmail \-bt \-Ctest.cf -.)b -which would read the configuration file -.q test.cf -and enter test mode. -In this mode, -you enter lines of the form: -.(b -rwset address -.)b -where -.i rwset -is the rewriting set you want to use -and -.i address -is an address to apply the set to. -Test mode shows you the steps it takes -as it proceeds, -finally showing you the address it ends up with. -You may use a comma separated list of rwsets -for sequential application of rules to an input. -For example: -.(b -3,1,21,4 monet:bollard -.)b -first applies ruleset three to the input -.q monet:bollard. -Ruleset one is then applied to the output of ruleset three, -followed similarly by rulesets twenty-one and four. -.pp -If you need more detail, -you can also use the -.q \-d21 -flag to turn on more debugging. -For example, -.(b -sendmail \-bt \-d21.99 -.)b -turns on an incredible amount of information; -a single word address -is probably going to print out several pages worth of information. -.pp -You should be warned that internally, -.i sendmail -applies ruleset 3 to all addresses. -In this version of -.i sendmail , -you will have to do that manually. -For example, older versions allowed you to use -.(b -0 bruce@broadcast.sony.com -.)b -This version requires that you use: -.(b -3,0 bruce@broadcast.sony.com -.)b -.sh 3 "Building mailer descriptions" -.pp -To add an outgoing mailer to your mail system, -you will have to define the characteristics of the mailer. -.pp -Each mailer must have an internal name. -This can be arbitrary, -except that the names -.q local -and -.q prog -must be defined. -.pp -The pathname of the mailer must be given in the P field. -If this mailer should be accessed via an IPC connection, -use the string -.q [IPC] -instead. -.pp -The F field defines the mailer flags. -You should specify an -.q f -or -.q r -flag to pass the name of the sender as a -.b \-f -or -.b \-r -flag respectively. -These flags are only passed if they were passed to -.i sendmail , -so that mailers that give errors under some circumstances -can be placated. -If the mailer is not picky -you can just specify -.q "\-f $g" -in the argv template. -If the mailer must be called as -.b root -the -.q S -flag should be given; -this will not reset the userid -before calling the mailer\**. -.(f -\**\c -.i Sendmail -must be running setuid to root -for this to work. -.)f -If this mailer is local -(i.e., will perform final delivery -rather than another network hop) -the -.q l -flag should be given. -Quote characters -(backslashes and " marks) -can be stripped from addresses if the -.q s -flag is specified; -if this is not given -they are passed through. -If the mailer is capable of sending to more than one user -on the same host -in a single transaction -the -.q m -flag should be stated. -If this flag is on, -then the argv template containing -.b $u -will be repeated for each unique user -on a given host. -The -.q e -flag will mark the mailer as being -.q expensive, -which will cause -.i sendmail -to defer connection -until a queue run\**. -.(f -\**The -.q c -configuration option must be given -for this to be effective. -.)f -.pp -An unusual case is the -.q C -flag. -This flag applies to the mailer that the message is received from, -rather than the mailer being sent to; -if set, -the domain spec of the sender -(i.e., the -.q @host.domain -part) -is saved -and is appended to any addresses in the message -that do not already contain a domain spec. -For example, -a message of the form: -.(b -From: eric@vangogh.CS.Berkeley.EDU -To: wnj@monet.CS.Berkeley.EDU, mckusick -.)b -will be modified to: -.(b -From: eric@vangogh.CS.Berkeley.EDU -To: wnj@monet.CS.Berkeley.EDU, mckusick@vangogh.CS.Berkeley.EDU -.)b -.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. -.pp -The S and R fields in the mailer description -are per-mailer rewriting sets -to be applied to sender and recipient addresses -respectively. -These are applied after the sending domain is appended -and the general rewriting sets -(numbers one and two) -are applied, -but before the output rewrite -(ruleset four) -is applied. -A typical use is to append the current domain -to addresses that do not already have a domain. -For example, -a header of the form: -.(b -From: eric -.)b -might be changed to be: -.(b -From: eric@vangogh.CS.Berkeley.EDU -.)b -or -.(b -From: ucbvax!eric -.)b -depending on the domain it is being shipped into. -These sets can also be used -to do special purpose output rewriting -in cooperation with ruleset four. -.pp -The S and R fields -can be specified as two numbers separated by a slash -(e.g., -.q "S=10/11" ), -meaning that all envelope addresses will be processed through ruleset 10 -and all header addresses will be processed through ruleset 11. -With only one number specified, -both envelope and header rewriting sets are set to the indicated ruleset. -.pp -The E field defines the string to use -as an end-of-line indication. -A string containing only newline is the default. -The usual backslash escapes -(\er, \en, \ef, \eb) -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 -macro in it, -.i sendmail -will speak SMTP -to the mailer. -If the pathname for this mailer is -.q [IPC], -the argv should be -.(b -IPC $h [ \fIport\fP ] -.)b -where -.i port -is the optional port number -to connect to. -.pp -For example, -the specifications: -.(b -.ta \w'Mlocal, 'u +\w'P=/bin/mail, 'u +\w'F=rlsm, 'u +\w'S=10, 'u +\w'R=20, 'u -Mlocal, P=/bin/mail, F=rlsm S=10, R=20, A=mail \-d $u -Mether, P=[IPC], F=meC, S=11, R=21, A=IPC $h, M=100000 -.)b -specifies a mailer to do local delivery -and a mailer for ethernet delivery. -The first is called -.q local, -is located in the file -.q /bin/mail, -takes a picky -.b \-r -flag, -does local delivery, -quotes should be stripped from addresses, -and multiple users can be delivered at once; -ruleset ten -should be applied to sender addresses in the message -and ruleset twenty -should be applied to recipient addresses; -the argv to send to a message will be the word -.q mail, -the word -.q \-d, -and words containing the name of the receiving user. -If a -.b \-r -flag is inserted -it will be between the words -.q mail -and -.q \-d. -The second mailer is called -.q ether, -it should be connected to via an IPC connection, -it can handle multiple users at once, -connections should be deferred, -and any domain from the sender address -should be appended to any receiver name -without a domain; -sender addresses should be processed by ruleset eleven -and recipient addresses by ruleset twenty-one. -There is a 100,000 byte limit on messages passed through this mailer. .sh 2 "The User Database" .pp If you have a version of @@ -5161,7 +5732,7 @@ the handling of sender and recipient addresses is modified. .pp The location of this database is controlled with the -.b U +.b UserDatabaseSpec option. .sh 3 "Structure of the user database" .pp @@ -5314,6 +5885,10 @@ recompiling .i sendmail . This section describes what changes can be made and what has to be modified to make them. +In most cases this should be unnecessary +unless you are porting +.i sendmail +to a new environment. .sh 2 "Parameters in src/Makefile" .pp These parameters are intended to describe the compilation environment, @@ -5339,113 +5914,22 @@ If set together with NEWDB and NDBM, .i sendmail will create both DBM and NEWDB files if and only if -the file /var/yp/Makefile -exists and is readable. +an alias file includes the substring +.q /yp/ +in the name. This is intended for compatibility with Sun Microsystems' .i mkalias program used on YP masters. -.ip SYSTEM5 -Set all of the compilation parameters appropriate for System V. -.ip LOCKF -Use System V -.b lockf -instead of Berkeley -.b flock . -Due to the highly unusual semantics of locks -across forks in -.b lockf , -this should never be used unless absolutely necessary. -Set by default if -SYSTEM5 is set. -.ip SYS5TZ -Use System V -time zone semantics. -.ip HASINITGROUPS -Set this if your system has the -.i initgroups() -call -(if you have multiple group support). -This is the default if SYSTEM5 is -.i not -defined or if you are on HPUX. -.ip HASUNAME -Set this if you have the -.i uname (2) -system call (or corresponding library routine). -Set by default if -SYSTEM5 -is set. -.ip HASSTATFS -Set this if you have the -.i statfs (2) -system call. -This will allow you to give a temporary failure -message to incoming SMTP email -when you are low on disk space. -It is set by default on 4.4BSD and OSF/1 systems. -.ip HASUSTAT -Set if you have the -.i ustat (2) -system call. -This is an alternative implementation of disk space control. -You should only set one of HASSTATFS or HASUSTAT; -the first is preferred. +.ip NISPLUS +Compile in support for NIS+. +.ip NETINFO +Compile in support for NetInfo (NeXT stations). +.ip HESIOD +Compile in support for Hesiod. .ip _PATH_SENDMAILCF The pathname of the sendmail.cf file. .ip _PATH_SENDMAILPID The pathname of the sendmail.pid file. -.ip LA_TYPE -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 -.i cc -option -.b \-DLA_TYPE= \c -.i type , -where -.i type -is: -.ip LA_INT -The kernel stores the load average in the kernel as an array of long integers. -The actual values are scaled by a factor FSCALE -(default 256). -.ip LA_SHORT -The kernel stores the load average in the kernel as an array of short integers. -The actual values are scaled by a factor FSCALE -(default 256). -.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 -routine to get the load average as an array of doubles. -.ip LA_ZERO -Always return zero as the load average. -This is the fallback case. -.lp -If type -.sm LA_INT , -.sm LA_SHORT , -or -.sm LA_FLOAT -is specified, -you may also need to specify -.sm _PATH_UNIX -(the path to your system binary) -and -.sm LA_AVENRUN -(the name of the variable containing the load average in the kernel; -usually -.q _avenrun -or -.q avenrun ). .pp There are also several compilation flags to indicate the environment such as @@ -5464,8 +5948,12 @@ However, the sizes of certain primitive vectors, etc., are included in this file. The numbers following the parameters are their default value. +.pp +This document is not the best source of information +for compilation flags in conf.h \(em +see src/READ_ME or src/conf.h itself. .nr ii 1.2i -.ip "MAXLINE [1024]" +.ip "MAXLINE [2048]" The maximum line length of any input line. If message lines exceed this length they will still be processed correctly; @@ -5496,9 +5984,15 @@ is seven atoms. .ip "MAXMAILERS [25]" The maximum number of mailers that may be defined in the configuration file. -.ip "MAXRWSETS [100]" +.ip "MAXRWSETS [200]" The maximum number of rewriting sets that may be defined. +The first half of these are reserved for numeric specification +(e.g., ``S92''), +while the upper half are reserved for auto-numbering +(e.g., ``Sfoo''). +Thus, with a value of 200 an attempt to use ``S99'' will succeed, +but ``S100'' will fail. .ip "MAXPRIORITIES [25]" The maximum number of values for the .q Precedence: @@ -5506,29 +6000,32 @@ field that may be defined (using the .b P line in sendmail.cf). -.ip "MAXUSERENVIRON [40]" +.ip "MAXUSERENVIRON [100]" The maximum number of items in the user environment that will be passed to subordinate mailers. -.ip "QUEUESIZE [1000]" -The maximum number of entries that will be processed -in a single queue run. .ip "MAXMXHOSTS [20]" The maximum number of MX records we will accept for any single host. +.ip "MAXALIASDB [12]" +The maximum number of alias databases that can be open at any time. +Note that there may also be an open file limit. +.ip "MAXMAPSTACK [12]" +The maximum number of maps that may be "stacked" in a +.b sequence +class map. +.ip "MAXMIMEARGS [20]" +The maximum number of arguments in a MIME Content-Type: header; +additional arguments will be ignored. +.ip "MAXMIMENESTING [20]" +The maximum depth to which MIME messages may be nested +(that is, nested Message or Multipart documents; +this does not limit the number of components in a single Multipart document). .lp A number of other compilation options exist. These specify whether or not specific code should be compiled in. +Ones marked with \(dg +are 0/1 valued. .nr ii 1.2i -.ip DEBUG -If set, debugging information is compiled in. -To actually get the debugging output, -the -.b \-d -flag must be used. -.b "WE STRONGLY RECOMMEND THAT THIS BE LEFT ON." -Some people, believing that it was a security hole -(it was, once) -have turned it off and thus crippled debuggers. -.ip NETINET +.ip NETINET\(dg If set, support for Internet protocol networking is compiled in. Previous versions of @@ -5536,7 +6033,10 @@ Previous versions of referred to this as .sm DAEMON ; this old usage is now incorrect. -.ip NETISO +Defaults on; +turn it off in the Makefile +if your system doesn't support the Internet protocols. +.ip NETISO\(dg If set, support for ISO protocol networking is compiled in (it may be appropriate to #define this in the Makefile instead of conf.h). @@ -5549,11 +6049,15 @@ This makes an informational log record for each message processed, and makes a higher priority log record for internal system errors. -.ip MATCHGECOS +.b "STRONGLY RECOMMENDED" +\(em if you want no logging, turn it off in the configuration file. +.ip MATCHGECOS\(dg Compile in the code to do ``fuzzy matching'' on the GECOS field in /etc/passwd. -This also requires that option G be turned on. -.ip NAMED_BIND +This also requires that the +.b MatchGECOS +option be turned on. +.ip NAMED_BIND\(dg Compile in code to use the Berkeley Internet Name Domain (BIND) server to resolve TCP/IP host names. @@ -5568,30 +6072,13 @@ This flag should be set to compile in the queueing code. If this is not set, mailers must accept the mail immediately or it will be returned to the sender. -.ip SETPROCTITLE -If defined, -.i sendmail -will change its -.i argv -array to indicate its current status. -This can be used in conjunction with the -.i ps -command to find out just what it's up to. .ip SMTP If set, the code to handle user and server SMTP will be compiled in. This is only necessary if your machine has some mailer that speaks SMTP (this means most machines everywhere). -.ip UGLYUUCP -If you have a UUCP host adjacent to you which is not running -a reasonable version of -.i rmail , -you will have to set this flag to include the -.q "remote from sysname" -info on the from line. -Otherwise, UUCP gets confused about where the mail came from. -.ip USERDB +.ip USERDB\(dg Include the .b experimental Berkeley user information database package. @@ -5599,7 +6086,10 @@ This adds a new level of local name expansion between aliasing and forwarding. It also uses the NEWDB package. This may change in future releases. -.ip IDENTPROTO +.lp +The following options are normally turned on +in per-operating-system clauses in conf.h. +.ip IDENTPROTO\(dg Compile in the IDENT protocol as defined in RFC 1413. This defaults on for all systems except Ultrix, which apparently has the interesting @@ -5610,6 +6100,104 @@ message it closes all open connections to that host. Since some firewall gateways send this error code when you access an unauthorized port (such as 113, used by IDENT), Ultrix cannot receive email from such hosts. +.ip SYSTEM5 +Set all of the compilation parameters appropriate for System V. +.ip HASFLOCK\(dg +Use Berkeley-style +.b flock +instead of System V +.b lockf +to do file locking. +Due to the highly unusual semantics of locks +across forks in +.b lockf , +this should always be used if at all possible. +.ip HASINITGROUPS +Set this if your system has the +.i initgroups() +call +(if you have multiple group support). +This is the default if SYSTEM5 is +.i not +defined or if you are on HPUX. +.ip HASUNAME +Set this if you have the +.i uname (2) +system call (or corresponding library routine). +Set by default if +SYSTEM5 +is set. +.ip HASGETDTABLESIZE +Set this if you have the +.i getdtablesize (2) +system call. +.ip HASWAITPID +Set this if you have the +.i haswaitpid (2) +system call. +.ip SFS_TYPE +The mechanism that can be used to get file system capacity information. +The values can be one of +SFS_USTAT (use the ustat(2) syscall), +SFS_4ARGS (use the four argument statfs(2) syscall), +SFS_VFS (use the two argument statfs(2) syscall including <sys/vfs.h>), +SFS_MOUNT (use the two argument statfs(2) syscall including <sys/mount.h>), +SFS_STATFS (use the two argument statfs(2) syscall including <sys/statfs.h>), +SFS_STATVFS (use the two argument statfs(2) syscall including <sys/statvfs.h>), +or +SFS_NONE (no way to get this information). +.ip LA_TYPE +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 +.i cc +option +.b \-DLA_TYPE= \c +.i type , +where +.i type +is: +.ip LA_INT +The kernel stores the load average in the kernel as an array of long integers. +The actual values are scaled by a factor FSCALE +(default 256). +.ip LA_SHORT +The kernel stores the load average in the kernel as an array of short integers. +The actual values are scaled by a factor FSCALE +(default 256). +.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 +routine to get the load average as an array of doubles. +.ip LA_ZERO +Always return zero as the load average. +This is the fallback case. +.lp +If type +.sm LA_INT , +.sm LA_SHORT , +or +.sm LA_FLOAT +is specified, +you may also need to specify +.sm _PATH_UNIX +(the path to your system binary) +and +.sm LA_AVENRUN +(the name of the variable containing the load average in the kernel; +usually +.q _avenrun +or +.q avenrun ). .sh 2 "Configuration in src/conf.c" .pp The following changes can be made in conf.c. @@ -5683,13 +6271,21 @@ table specifies .i sendmail 's preference for which field to return error messages to. +.ip H_ERRORSTO +Addresses in this header should receive error messages. +.ip H_CTE +This header is a Content-Transfer-Encoding header. +.ip H_CTYPE +This header is a Content-Type header. +.ip H_STRIPVAL +Strip the value from the header (for Bcc:). .nr ii 5n .lp Let's look at a sample .i HdrInfo specification: .(b -.ta 4n +\w'"return-receipt-to", 'u +.ta 4n +\w'"content-transfer-encoding", 'u struct hdrinfo HdrInfo[] = \&{ /* originator fields, most to least significant */ @@ -5698,15 +6294,20 @@ struct hdrinfo HdrInfo[] = "sender", H_FROM, "from", H_FROM, "full-name", H_ACHECK, + "errors-to", H_FROM\^|\^H_ERRORSTO, /* destination fields */ "to", H_RCPT, "resent-to", H_RCPT, "cc", H_RCPT, + "bcc", H_RCPT\^|\^H_STRIPVAL, /* message identification and control */ "message", H_EOH, "text", H_EOH, /* trace fields */ - "received", H_TRACE|H_FORCE, + "received", H_TRACE\^|\^H_FORCE, + /* miscellaneous fields */ + "content-transfer-encoding", H_CTE, + "content-type", H_CTYPE, NULL, 0, }; @@ -5824,10 +6425,10 @@ checkcompat(to, e) usrerr("No private net mail allowed through this machine"); return (EX_UNAVAILABLE); } - if (MsgSize > 50000 && to\->q_mailer != LocalMailer) + if (MsgSize > 50000 && bitnset(M_LOCALMAILER, to\->q_mailer)) { usrerr("Message too large for non-local delivery"); - NoReturn = TRUE; + e\->e_flags |= EF_NORETURN; return (EX_UNAVAILABLE); } return (EX_OK); @@ -5837,8 +6438,10 @@ checkcompat(to, e) This would reject messages greater than 50000 bytes unless they were local. The -.i NoReturn -flag can be sent to suppress the return of the actual body +.i EF_NORETURN +flag can be set in +.i e\(->e_flags +to suppress the return of the actual body of the message in the error return. The actual use of this routine is highly dependent on the implementation, @@ -5849,7 +6452,7 @@ The routine .i getla should return an approximation of the current system load average as an integer. -There are four versions included on compilation flags +There are several versions included on compilation flags as described above. .sh 3 "New Database Map Classes" .pp @@ -5917,8 +6520,6 @@ shouldqueue(pri, ctime) { if (CurrentLA < QueueLA) return (FALSE); - if (CurrentLA >= RefuseLA) - return (TRUE); return (pri > (QueueFactor / (CurrentLA \- QueueLA + 1))); } .)b @@ -5999,6 +6600,12 @@ The routine .i getla returns the current load average (as a rounded integer). The distribution includes several possible implementations. +If you are porting to a new environment +you may need to add some new tweaks.\** +.(f +\**If you do, please send updates to +sendmail@CS.Berkeley.EDU. +.)f .sh 2 "Configuration in src/daemon.c" .pp The file @@ -6021,7 +6628,13 @@ We now recommend that you create a new keyed map instead. The following summarizes changes since the last commonly available version of .i sendmail -(5.67): +(5.67). +For a detailed list, +consult the file +RELEASE_NOTES +in the root directory of the +.i sendmail +distribution. .sh 2 "Connection Caching" .pp Instead of closing SMTP connections immediately, @@ -6088,8 +6701,8 @@ doesn't always provide adequate concurrency limits. .sh 2 "Extended SMTP Support" .pp Version 8 includes both sending and receiving support for Extended -SMTP support as defined by RFC 1425 (basic) and RFC 1427 (SIZE); -and limited support for RFC 1426 (BODY). +SMTP support as defined by RFC 1651 (basic) and RFC 1653 (SIZE); +and limited support for RFC 1652 (BODY). .sh 2 "Eight-Bit Clean" .pp Previous versions of @@ -6199,6 +6812,10 @@ flag has been added to allow logging of all protocol in and out of .i sendmail for debugging. +.pp +The +.b \-O +flag simplies setting long-form options. .sh 2 "Enhanced Command Line Flags" .pp The @@ -6216,11 +6833,6 @@ respectively. .sh 2 "New and Old Configuration Line Types" .pp The -.b T -(Trusted users) configuration line has been deleted. -It will still be accepted but will be ignored. -.pp -The .b K line has been added to declare database maps. .pp @@ -6234,6 +6846,10 @@ line has a .q D= field that lets you change into a temporary directory while that mailer is running. +It also has a +.q U= +field to allow you to set the user and group id to be used +when running the mailer. .sh 2 "New Options" .pp Several new options have been added, @@ -6284,6 +6900,8 @@ host. handling technique. .ip 7 Do not run eight bit clean. +.ip 8 +Eight bit data handling mode. .sh 2 "Extended Options" .pp The @@ -6309,6 +6927,8 @@ If the EHLO (extended hello) command fails, .i sendmail falls back to old SMTP. +.ip A +Try the user part of addresses for this mailer as aliases. .ip b Ensure that there is a blank line at the end of all messages. .ip c @@ -6320,8 +6940,29 @@ Never use the null sender as the envelope sender, even when running SMTP. Although this violates RFC 1123, it may be necessary when you must deal with some obnoxious old hosts. +.ip k +Turn off the loopback check in the HELO protocol; +doing this may cause mailer loops. +.ip o +Always run the mailer as the recipient of the message. +.ip w +This user should have a passwd file entry. +.ip 5 +Try ruleset 5 if no local aliases. .ip 7 Strip all output to 7 bits. +.ip : +Check for :include: files. +.ip | +Check for |program addresses. +.ip / +Check for /file addresses. +.ip @ +Check this user against the user database. +.sh 2 "Long Option Names" +.pp +All options can be specified using long names, +and some new options can only be specified with long names. .sh 2 "New Pre-Defined Macros" .pp The following macros are pre-defined: @@ -6443,9 +7084,10 @@ for many years, and many employers have been remarkably patient about letting me work on a large project that was not part of my official job. -This includes time on the INGRES Project at Berkeley, +This includes time on the INGRES Project at +the University of California at Berkeley, at Britton Lee, -and again on the Mammoth Project at Berkeley. +and again on the Mammoth and Titan Projects at Berkeley. .pp Much of the second wave of improvements should be credited to Bryan Costales of ICSI. @@ -6460,7 +7102,9 @@ It has proven to be a group network effort. Version 8 in particular was a group project. The following people made notable contributions: .(l +John Beck, Hewlett-Packard Keith Bostic, CSRG, University of California, Berkeley +Andrew Cheng, Sun Microsystems Michael J. Corrigan, University of California, San Diego Bryan Costales, International Computer Science Institute Pa\*:r (Pell) Emanuelsson @@ -6473,17 +7117,26 @@ Brian Kantor, University of California, San Diego Murray S. Kucherawy, HookUp Communication Corp. Bruce Lilly, Sony U.S. Karl London -Nakamura Motonori, Kyoto University +Motonori Nakamura, Ritsumeikan University & Kyoto University John Gardiner Myers, Carnegie Mellon University Neil Rickert, Northern Illinois University Eric Schnoebelen, Convex Computer Corp. Eric Wassenaar, National Institute for Nuclear and High Energy Physics, Amsterdam -Christophe Wolfhugel, Herve Schauer Consultants (Paris) +Christophe Wolfhugel, Pasteur Institute & Herve Schauer Consultants (Paris) .)l I apologize for anyone I have omitted, misspelled, misattributed, or otherwise missed. -Many other people have contributed ideas, comments, and encouragement. +At this point, I suspect that at least a hundred people +have contributed code, +and many more have contributed ideas, comments, and encouragement. +I've tried to list them in the RELEASE_NOTES in the distribution directory. I appreciate their contribution as well. +.pp +Special thanks are reserved for Michael Corrigan and Christophe Wolfhugel, +who besides being wonderful guinea pigs and contributors +have also consented to be added to the ``sendmail@CS.Berkeley.EDU'' list +and, by answering the bulk of the questions sent to that list, +have freed me up to do other work. .++ A .+c "COMMAND LINE FLAGS" .ba 0 @@ -6499,12 +7152,16 @@ Operation modes are: .ta 4n m Deliver mail (default) s Speak SMTP on input side +a\(dg ``Arpanet'' mode (get envelope sender information from header) d Run as a daemon t Run in test mode v Just verify addresses, don't collect or deliver i Initialize the alias database p Print the mail queue .)b +.(f +\(dgDeprecated. +.)f .ip \-B\fItype\fP Indicate body type. .ip \-C\fIfile\fP @@ -6546,7 +7203,19 @@ Set option .i x to the specified .i value . -These options are described in Appendix B. +These options are described in Section 5.6. +.ip \-O\fIoption\fP\fB=\fP\fIvalue\fP +Set +.i option +to the specified +.i value +(for long form option names). +These options are described in Section 5.6. +.ip \-M\fIx\|value +Set macro +.i x +to the specified +.i value . .ip \-p\fIprotocol\fP Set the sending protocol. Programs are encouraged to set this. @@ -6646,31 +7315,6 @@ The types are: .ip d The data file. The message body (excluding the header) is kept in this file. -.ip l -The lock file. -If this file exists, -the job is currently being processed, -and a queue run will not process the file. -For that reason, -an extraneous -.b lf -file can cause a job to apparently disappear -(it will not even time out!). -[Actually, this file is obsolete on most systems that support the -.b flock -or -.b lockf -system calls.] -.ip n -This file is created when an id is being created. -It is a separate file to insure that no mail can ever be destroyed -due to a race condition. -It should exist for no more than a few milliseconds -at any given time. -[This is only used on old versions of -.i sendmail ; -it is not used -on newer versions.] .ip q The queue control file. This file contains the information necessary to process the job. @@ -6693,9 +7337,13 @@ The file is structured as a series of lines each beginning with a code letter. The lines are as follows: -.ip D -The name of the data file. -There may only be one of these lines. +.ip V +The version number of the queue file format, +used to allow new +.i sendmail +binaries to read queue files created by older versions. +Defaults to version zero. +Must be the first line of the file if present. .ip H A header definition. There may be any number of these lines. @@ -6714,19 +7362,30 @@ will be flagged so that deliveries will be run as the .i aliasname is the name of the alias that expanded to this address (used for printing messages). +.ip Q +The ``original recipient'', +specified by the ORCPT= field in an ESMTP transaction. +Used exclusively for Delivery Status Notifications. +It applies only to the immediately following `R' line. .ip R A recipient address. This will normally be completely aliased, but is actually realiased when the job is processed. There will be one line for each recipient. +Version 1 qf files +also include a leading colon-terminated list of flags, +which can be +`S' to return a message on successful final delivery, +`F' to return a message on failure, +`D' to return a message if the message is delayed, +`B' to indicate that the body should be returned, +`N' to suppress returning the body, +and +`P' to declare this as a ``primary'' (command line or SMTP-session) address. .ip S The sender address. There may only be one of these lines. -.ip E -An error address. -If any such lines exist, -they represent the addresses that should receive error messages. .ip T The job creation time. This is used to compute when to time out the job. @@ -6754,6 +7413,15 @@ and .b w indicating that a warning message has been sent announcing that the mail has been delayed. +.ip N +The total number of delivery attempts. +.ip K +The time (as seconds since January 1, 1970) +of the last delivery attempt. +.ip I +The i-number of the data file; +this can be used to recover your mail queue +after a disastrous disk crash. .ip $ A macro definition. The values of certain macros @@ -6773,6 +7441,12 @@ Legal values are .q 7BIT and .q 8BITMIME . +.ip O +The original MTS value (from the ESMTP transaction). +For Deliver Status Notifications only. +.ip Z +The original envelope id (from the ESMTP transaction). +For Deliver Status Notifications only. .pp As an example, the following is a queue file sent to @@ -6787,9 +7461,7 @@ nothing can replace looking at what your own system generates. .(b P835771 T404261372 -DdfAAA13557 Seric -Eowner-sendmail@vangogh.CS.Berkeley.EDU Ceric:sendmail@vangogh.CS.Berkeley.EDU Reric@mammoth.Berkeley.EDU Rbostic@okeeffe.CS.Berkeley.EDU @@ -6808,7 +7480,7 @@ Hmessage-id: <9207170931.AA22757@foo.bar.baz.de> HTo: sendmail@vangogh.CS.Berkeley.EDU Hsubject: this is an example message .)b -This shows the name of the data file, +This shows the person who sent the message, the submission time (in seconds since January 1, 1970), @@ -6891,7 +7563,7 @@ A transcript of the current session. .\"Eric Allman .\"Britton-Lee, Inc. .\".sp -.\"Version 8.36 +.\"Version 8.70 .\".ce 0 .bp 2 .rs diff --git a/usr.sbin/sendmail/doc/op/op.ps b/usr.sbin/sendmail/doc/op/op.ps deleted file mode 100644 index d0abd0c113cf8..0000000000000 --- a/usr.sbin/sendmail/doc/op/op.ps +++ /dev/null @@ -1,5477 +0,0 @@ -%!PS-Adobe-3.0 -%%Creator: groff version 1.08 -%%DocumentNeededResources: font Times-Bold -%%+ font Times-Roman -%%+ font Times-Italic -%%+ font Symbol -%%DocumentSuppliedResources: procset grops 1.08 0 -%%Pages: 64 -%%PageOrder: Ascend -%%Orientation: Portrait -%%EndComments -%%BeginProlog -%%BeginResource: procset grops 1.08 0 -/setpacking where{ -pop -currentpacking -true setpacking -}if -/grops 120 dict dup begin -/SC 32 def -/A/show load def -/B{0 SC 3 -1 roll widthshow}bind def -/C{0 exch ashow}bind def -/D{0 exch 0 SC 5 2 roll awidthshow}bind def -/E{0 rmoveto show}bind def -/F{0 rmoveto 0 SC 3 -1 roll widthshow}bind def -/G{0 rmoveto 0 exch ashow}bind def -/H{0 rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def -/I{0 exch rmoveto show}bind def -/J{0 exch rmoveto 0 SC 3 -1 roll widthshow}bind def -/K{0 exch rmoveto 0 exch ashow}bind def -/L{0 exch rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def -/M{rmoveto show}bind def -/N{rmoveto 0 SC 3 -1 roll widthshow}bind def -/O{rmoveto 0 exch ashow}bind def -/P{rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def -/Q{moveto show}bind def -/R{moveto 0 SC 3 -1 roll widthshow}bind def -/S{moveto 0 exch ashow}bind def -/T{moveto 0 exch 0 SC 5 2 roll awidthshow}bind def -/SF{ -findfont exch -[exch dup 0 exch 0 exch neg 0 0]makefont -dup setfont -[exch/setfont cvx]cvx bind def -}bind def -/MF{ -findfont -[5 2 roll -0 3 1 roll -neg 0 0]makefont -dup setfont -[exch/setfont cvx]cvx bind def -}bind def -/level0 0 def -/RES 0 def -/PL 0 def -/LS 0 def -/PLG{ -gsave newpath clippath pathbbox grestore -exch pop add exch pop -}bind def -/BP{ -/level0 save def -1 setlinecap -1 setlinejoin -72 RES div dup scale -LS{ -90 rotate -}{ -0 PL translate -}ifelse -1 -1 scale -}bind def -/EP{ -level0 restore -showpage -}bind def -/DA{ -newpath arcn stroke -}bind def -/SN{ -transform -.25 sub exch .25 sub exch -round .25 add exch round .25 add exch -itransform -}bind def -/DL{ -SN -moveto -SN -lineto stroke -}bind def -/DC{ -newpath 0 360 arc closepath -}bind def -/TM matrix def -/DE{ -TM currentmatrix pop -translate scale newpath 0 0 .5 0 360 arc closepath -TM setmatrix -}bind def -/RC/rcurveto load def -/RL/rlineto load def -/ST/stroke load def -/MT/moveto load def -/CL/closepath load def -/FL{ -currentgray exch setgray fill setgray -}bind def -/BL/fill load def -/LW/setlinewidth load def -/RE{ -findfont -dup maxlength 1 index/FontName known not{1 add}if dict begin -{ -1 index/FID ne{def}{pop pop}ifelse -}forall -/Encoding exch def -dup/FontName exch def -currentdict end definefont pop -}bind def -/DEFS 0 def -/EBEGIN{ -moveto -DEFS begin -}bind def -/EEND/end load def -/CNT 0 def -/level1 0 def -/PBEGIN{ -/level1 save def -translate -div 3 1 roll div exch scale -neg exch neg exch translate -0 setgray -0 setlinecap -1 setlinewidth -0 setlinejoin -10 setmiterlimit -[]0 setdash -/setstrokeadjust where{ -pop -false setstrokeadjust -}if -/setoverprint where{ -pop -false setoverprint -}if -newpath -/CNT countdictstack def -userdict begin -/showpage{}def -}bind def -/PEND{ -clear -countdictstack CNT sub{end}repeat -level1 restore -}bind def -end def -/setpacking where{ -pop -setpacking -}if -%%EndResource -%%IncludeResource: font Times-Bold -%%IncludeResource: font Times-Roman -%%IncludeResource: font Times-Italic -%%IncludeResource: font Symbol -grops begin/DEFS 1 dict def DEFS begin/u{.001 mul}bind def end/RES 72 def/PL -792 def/LS false def/ENC0[/asciicircum/asciitilde/Scaron/Zcaron/scaron/zcaron -/Ydieresis/trademark/quotesingle/.notdef/.notdef/.notdef/.notdef/.notdef -/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef -/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/space -/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright/parenleft -/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four -/five/six/seven/eight/nine/colon/semicolon/less/equal/greater/question/at/A/B/C -/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash -/bracketright/circumflex/underscore/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q -/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright/tilde/.notdef/quotesinglbase -/guillemotleft/guillemotright/bullet/florin/fraction/perthousand/dagger -/daggerdbl/endash/emdash/ff/fi/fl/ffi/ffl/dotlessi/dotlessj/grave/hungarumlaut -/dotaccent/breve/caron/ring/ogonek/quotedblleft/quotedblright/oe/lslash -/quotedblbase/OE/Lslash/.notdef/exclamdown/cent/sterling/currency/yen/brokenbar -/section/dieresis/copyright/ordfeminine/guilsinglleft/logicalnot/minus -/registered/macron/degree/plusminus/twosuperior/threesuperior/acute/mu -/paragraph/periodcentered/cedilla/onesuperior/ordmasculine/guilsinglright -/onequarter/onehalf/threequarters/questiondown/Agrave/Aacute/Acircumflex/Atilde -/Adieresis/Aring/AE/Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute -/Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis -/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls -/agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla/egrave/eacute -/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis/eth/ntilde/ograve -/oacute/ocircumflex/otilde/odieresis/divide/oslash/ugrave/uacute/ucircumflex -/udieresis/yacute/thorn/ydieresis]def/Times-Italic@0 ENC0/Times-Italic RE -/Times-Roman@0 ENC0/Times-Roman RE/Times-Bold@0 ENC0/Times-Bold RE -%%EndProlog -%%Page: 1 1 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 16/Times-Bold@0 SF(SENDMAIL)244.888 143.4 Q/F1 12/Times-Bold@0 SF(INST) -170.172 172.2 Q(ALLA)-1.08 E(TION AND OPERA)-1.14 E(TION GUIDE)-1.14 E/F2 10 -/Times-Roman@0 SF(Eric Allman)263.42 196.2 Q(Uni)219.725 208.2 Q -.15(ve)-.25 G -(rsity of California, Berk).15 E(ele)-.1 E(y)-.15 E(Mammoth Project)251.75 -220.2 Q(eric@CS.Berk)239.41 232.2 Q(ele)-.1 E -.65(y.)-.15 G(EDU).65 E -1.11 -(Ve)262.725 256.2 S(rsion 8.36)1.11 E -.15(Fo)236.965 280.2 S 2.5(rS).15 G -(endmail V)258.765 280.2 Q(ersion 8.6)-1.11 E/F3 10/Times-Italic@0 SF(Sendmail) -97 324.6 Q F2 .699(implements a general purpose internetw)3.199 F .698 -(ork mail routing f)-.1 F .698(acility under the UNIX* operat-)-.1 F .378 -(ing system.)72 336.6 R .378(It is not tied to an)5.378 F 2.878(yo)-.15 G .378 -(ne transport protocol \212 its function may be lik)208.214 336.6 R .378 -(ened to a crossbar switch,)-.1 F 1.036 -(relaying messages from one domain into another)72 348.6 R 6.036(.I)-.55 G -3.536(nt)284.502 348.6 S 1.036 -(he process, it can do a limited amount of message)295.818 348.6 R .604(header\ - editing to put the message into a format that is appropriate for the recei)72 -360.6 R .604(ving domain.)-.25 F .604(All of this is)5.604 F -(done under the control of a con\214guration \214le.)72 372.6 Q .711 -(Due to the requirements of \215e)97 388.8 R .711(xibility for)-.15 F F3 -(sendmail)3.211 E F2 3.211(,t)C .71(he con\214guration \214le can seem some) -311.688 388.8 R .71(what unap-)-.25 F 2.893(proachable. Ho)72 400.8 R(we)-.25 E --.15(ve)-.25 G 1.193 -.4(r, t).15 H .393(here are only a fe).4 F 2.893(wb)-.25 -G .394(asic con\214gurations for most sites, for which standard con\214gu-) -253.381 400.8 R .646(ration \214les ha)72 412.8 R .946 -.15(ve b)-.2 H .646 -(een supplied.).15 F .645(Most other con\214gurations can be b)5.646 F .645 -(uilt by adjusting an e)-.2 F .645(xisting con\214gura-)-.15 F -(tion \214les incrementally)72 424.8 Q(.)-.65 E F3(Sendmail)97 441 Q F2 .15 -(is based on RFC822 \(Internet Mail F)2.65 F .15 -(ormat Protocol\), RFC821 \(Simple Mail T)-.15 F .15(ransport Pro-)-.35 F .129 -(tocol\), RFC1123 \(Internet Host Requirements\), and RFC1425 \(SMTP Service E\ -xtensions\).)72 453 R(Ho)5.129 E(we)-.25 E -.15(ve)-.25 G .929 -.4(r, s).15 H -(ince).4 E F3(sendmail)72 465 Q F2 .749(is designed to w)3.249 F .749 -(ork in a wider w)-.1 F .749(orld, in man)-.1 F 3.25(yc)-.15 G .75 -(ases it can be con\214gured to e)309.31 465 R .75(xceed these proto-)-.15 F -2.5(cols. These)72 477 R(cases are described herein.)2.5 E(Although)97 493.2 Q -F3(sendmail)3.548 E F2 1.047(is intended to run without the need for monitorin\ -g, it has a number of features)3.548 F 1.972(that may be used to monitor or ad\ -just the operation under unusual circumstances.)72 505.2 R 1.972 -(These features are)6.972 F(described.)72 517.2 Q .817 -(Section one describes ho)97 533.4 R 3.317(wt)-.25 G 3.317(od)211.668 533.4 S -3.317(oa)224.985 533.4 S(basic)-.001 E F3(sendmail)3.316 E F2 3.316 -(installation. Section)3.316 F(tw)3.316 E 3.316(oe)-.1 G .816 -(xplains the day-to-day)412.938 533.4 R .282(information you should kno)72 -545.4 R 2.782(wt)-.25 G 2.782(om)196.768 545.4 S .282 -(aintain your mail system.)212.33 545.4 R .282(If you ha)5.282 F .583 -.15 -(ve a r)-.2 H(elati).15 E -.15(ve)-.25 G .283(ly normal site, these tw).15 F(o) --.1 E .635(sections should contain suf)72 557.4 R .635 -(\214cient information for you to install)-.25 F F3(sendmail)3.135 E F2 .634 -(and k)3.135 F .634(eep it happ)-.1 F 4.434 -.65(y. S)-.1 H .634(ection three) -.65 F .925(describes some parameters that may be safely tweak)72 569.4 R 3.425 -(ed. Section)-.1 F .925(four has information re)3.425 F -.05(ga)-.15 G .925 -(rding the com-).05 F .886(mand line ar)72 581.4 R 3.386(guments. Section)-.18 -F<8c76>3.386 E 3.386(ec)-.15 G .885 -(ontains the nitty-gritty information about the con\214guration \214le.)221.92 -581.4 R(This)5.885 E .004 -(section is for masochists and people who must write their o)72 593.4 R .005 -(wn con\214guration \214le.)-.25 F .005(Section six describes con-)5.005 F .886 -(\214guration that can be done at compile time.)72 605.4 R .886(Section se) -5.886 F -.15(ve)-.25 G 3.386(ng).15 G -2.15 -.25(iv e)322.1 605.4 T 3.386(sab) -.25 G .886(rief description of dif)354.022 605.4 R .885(ferences in this)-.25 F --.15(ve)72 617.4 S 1.619(rsion of).15 F F3(sendmail)4.119 E F2 6.619(.T)C 1.619 -(he appendix)169.197 617.4 R 1.619(es gi)-.15 F 1.919 -.15(ve a b)-.25 H 1.619 -(rief b).15 F 1.619(ut detailed e)-.2 F 1.62 -(xplanation of a number of features not)-.15 F -(described in the rest of the paper)72 629.4 Q(.)-.55 E .32 LW 76 680.4 72 -680.4 DL 80 680.4 76 680.4 DL 84 680.4 80 680.4 DL 88 680.4 84 680.4 DL 92 -680.4 88 680.4 DL 96 680.4 92 680.4 DL 100 680.4 96 680.4 DL 104 680.4 100 -680.4 DL 108 680.4 104 680.4 DL 112 680.4 108 680.4 DL 116 680.4 112 680.4 DL -120 680.4 116 680.4 DL 124 680.4 120 680.4 DL 128 680.4 124 680.4 DL 132 680.4 -128 680.4 DL 136 680.4 132 680.4 DL 140 680.4 136 680.4 DL 144 680.4 140 680.4 -DL 148 680.4 144 680.4 DL 152 680.4 148 680.4 DL 156 680.4 152 680.4 DL 160 -680.4 156 680.4 DL 164 680.4 160 680.4 DL 168 680.4 164 680.4 DL 172 680.4 168 -680.4 DL 176 680.4 172 680.4 DL 180 680.4 176 680.4 DL 184 680.4 180 680.4 DL -188 680.4 184 680.4 DL 192 680.4 188 680.4 DL 196 680.4 192 680.4 DL 200 680.4 -196 680.4 DL 204 680.4 200 680.4 DL 208 680.4 204 680.4 DL 212 680.4 208 680.4 -DL 216 680.4 212 680.4 DL/F4 8/Times-Roman@0 SF -(*UNIX is a trademark of Unix Systems Laboratories.)93.6 692.4 Q/F5 10 -/Times-Bold@0 SF(Sendmail Installation and Operation Guide)72 756 Q(SMM:08-1) -457.9 756 Q EP -%%Page: 7 2 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF(Sendmail Installation and Operation Guide)72 60 Q -(SMM:08-7)457.9 60 Q 2.5(1. B)72 96 R(ASIC INST)-.3 E(ALLA)-.9 E(TION)-.95 E/F1 -10/Times-Roman@0 SF .234(There are tw)112 112.2 R 2.733(ob)-.1 G .233 -(asic steps to installing)175.631 112.2 R/F2 10/Times-Italic@0 SF(sendmail) -2.733 E F1 5.233(.T)C .233(he hard part is to b)317.076 112.2 R .233 -(uild the con\214guration table.)-.2 F 1.185(This is a \214le that)87 124.2 R -F2(sendmail)3.686 E F1 1.186 -(reads when it starts up that describes the mailers it kno)3.686 F 1.186 -(ws about, ho)-.25 F 3.686(wt)-.25 G(o)499 124.2 Q .715(parse addresses, ho)87 -136.2 R 3.215(wt)-.25 G 3.215(or)178.315 136.2 S -.25(ew)189.86 136.2 S .715 -(rite the message header).25 F 3.215(,a)-.4 G .715(nd the settings of v)306.75 -136.2 R .714(arious options.)-.25 F .714(Although the)5.714 F .852 -(con\214guration table is quite comple)87 148.2 R .852 -(x, a con\214guration can usually be b)-.15 F .852(uilt by adjusting an e)-.2 F -.852(xisting of)-.15 F(f-)-.25 E 1.078(the-shelf con\214guration.)87 160.2 R -1.078(The second part is actually doing the installation, i.e., creating the n\ -ecessary)6.078 F(\214les, etc.)87 172.2 Q .192 -(The remainder of this section will describe the installation of)112 188.4 R F2 -(sendmail)2.692 E F1 .192(assuming you can use one)2.692 F 1.432(of the e)87 -200.4 R 1.432(xisting con\214gurations and that the standard installation para\ -meters are acceptable.)-.15 F 1.431(All path-)6.431 F 8.62(names and e)87 212.4 -R 8.62(xamples are gi)-.15 F -.15(ve)-.25 G 11.12(nf).15 G 8.62 -(rom the root of the)257.57 212.4 R F2(sendmail)378.16 212.4 Q F1 8.62 -(subtree, normally)425.39 212.4 R F2(/usr/sr)87 224.4 Q(c/usr)-.37 E -(.sbin/sendmail)-1.11 E F1(on 4.4BSD.)2.5 E .543(If you are loading this of)112 -240.6 R 3.042(ft)-.25 G .542(he tape, continue with the ne)222.766 240.6 R .542 -(xt section.)-.15 F .542(If you ha)5.542 F .842 -.15(ve a r)-.2 H .542 -(unning binary).15 F -(already on your system, you should probably skip to section 1.2.)87 252.6 Q F0 -2.5(1.1. Compiling)87 276.6 R(Sendmail)2.5 E F1(All)127 292.8 Q F2(sendmail) -2.934 E F1 .434(source is in the)2.934 F F2(sr)2.934 E(c)-.37 E F1 -(subdirectory)2.934 E 5.434(.I)-.65 G 2.934(fy)321.652 292.8 S .435 -(ou are running on a 4.4BSD system, com-)332.916 292.8 R -(pile by typing \231mak)102 304.8 Q 2.5(e\232. On)-.1 F -(other systems, you may ha)2.5 E .3 -.15(ve t)-.2 H 2.5(om).15 G(ak)348.75 -304.8 Q 2.5(es)-.1 G(ome other adjustments.)368.92 304.8 Q F0 2.5(1.1.1. Old) -102 328.8 R -.1(ve)2.5 G(rsions of mak).1 E(e)-.1 E F1 -(If you are not running the ne)142 345 Q 2.5(wv)-.25 G(ersion of)270.74 345 Q -F0(mak)2.5 E(e)-.1 E F1(you will probably ha)2.5 E .3 -.15(ve t)-.2 H 2.5(ou) -.15 G(se)444.16 345 Q(mak)157 361.2 Q 2.5<65ad>-.1 G 2.5(fM)186.7 361.2 S(ak) -201.42 361.2 Q(e\214le.dist)-.1 E .885(This \214le does not assume se)117 377.4 -R -.15(ve)-.25 G .885(ral ne).15 F 3.385(ws)-.25 G(yntax)280.025 377.4 Q .885 -(es, including the \231+=\232 syntax in macro de\214nition)-.15 F -(and the \231.include\232 syntax.)117 389.4 Q F0 2.5(1.1.2. Compilation)102 -413.4 R(\215ags)2.5 E F2(Sendmail)142 429.6 Q F1(supports tw)2.5 E 2.5(od)-.1 G -(if)240.51 429.6 Q(ferent formats for the)-.25 E F2(aliases)2.5 E F1 2.5 -(database. These)2.5 F(formats are:)2.5 E 39.5(NDBM The)117 445.8 R -.74(``) -3.166 G(ne).74 E 3.166(wD)-.25 G(BM')240.432 445.8 Q 3.166('f)-.74 G .666 -(ormat, a)268.408 445.8 R -.25(va)-.2 G .666 -(ilable on nearly all systems around today).25 F 5.667(.T)-.65 G(his)492.33 -445.8 Q -.1(wa)189 457.8 S 3.541(st).1 G 1.041 -(he preferred format prior to 4.4BSD.)210.771 457.8 R 1.041(It allo)6.041 F -1.041(ws such comple)-.25 F 3.54(xt)-.15 G 1.04(hings as)470.46 457.8 R -(multiple databases and closing a currently open database.)189 469.8 Q 32.84 -(NEWDB The)117 486 R(ne)3.323 E 3.323(wd)-.25 G .824(atabase package from Berk) -232.606 486 R(ele)-.1 E 4.624 -.65(y. I)-.15 H 3.324(fy).65 G .824(ou ha) -382.716 486 R 1.124 -.15(ve t)-.2 H .824(his, use it.).15 F .824(It allo)5.824 -F(ws)-.25 E .839 -(long records, multiple open databases, real in-memory caching, and so forth.) -189 498 R -1.1(Yo)189 510 S 3.581(uc)1.1 G 1.081 -(an de\214ne this in conjunction with one of the other tw)213.141 510 R 1.082 -(o; if you do, old)-.1 F .693(databases are read, b)189 522 R .693 -(ut when a ne)-.2 F 3.193(wd)-.25 G .693 -(atabase is created it will be in NEWDB)341.681 522 R 2.851(format. As)189 534 -R 2.851(an)2.851 G .351(asty hack, if you ha)249.763 534 R .652 -.15(ve N)-.2 H -.352(EWDB, NDBM, and NIS de\214ned, and).15 F 1.593(if the \214le)189 546 R F2 -(/var/yp/Mak)4.093 E(e\214le)-.1 E F1 -.15(ex)4.093 G 1.593 -(ists and is readable,).15 F F2(sendmail)4.093 E F1 1.592(will create both) -4.092 F(ne)189 558 Q 3.975(wa)-.25 G 1.475(nd old v)213.825 558 R 1.475 -(ersions of the alias \214le during a)-.15 F F2(ne)3.976 E(walias)-.15 E F1 -3.976(command. This)3.976 F(is)3.976 E .711 -(required because the Sun NIS/YP system reads the DBM v)189 570 R .71 -(ersion of the alias)-.15 F 2.5(\214le. It')189 582 R 2.5(su)-.55 G -(gly as sin, b)229.56 582 Q(ut it w)-.2 E(orks.)-.1 E 1.112 -(If neither of these are de\214ned,)117 598.2 R F2(sendmail)3.612 E F1 1.112 -(reads the alias \214le into memory on e)3.612 F -.15(ve)-.25 G 1.112(ry in).15 -F -.2(vo)-.4 G(cation.).2 E(This can be slo)117 610.2 Q 2.5(wa)-.25 G -(nd should be a)191.18 610.2 Q -.2(vo)-.2 G(ided.).2 E .719 -(System V based systems can de\214ne SYSTEM5 to mak)142 626.4 R 3.219(es)-.1 G --2.15 -.25(ev e)378.083 626.4 T .719(ral small adjustments.).25 F(This)5.719 E -1.076(changes the handling of timezones and uses the much less ef)117 638.4 R -(\214cient)-.25 E F2(loc)3.576 E(kf)-.2 E F1 1.076(call in preference to)3.576 -F F2(\215oc)117 650.4 Q(k)-.2 E F1 7.225(.T)C 2.224(hese can be speci\214ed se\ -parately using the compilation \215ags SYS5TZ and LOCKF)151.515 650.4 R -(respecti)117 662.4 Q -.15(ve)-.25 G(ly).15 E(.)-.65 E 1.646(If you don')142 -678.6 R 4.147(th)-.18 G -2.25 -.2(av e)202.03 678.6 T(the)4.347 E F2(unseten) -4.147 E(v)-.4 E F1 1.647(routine in your system library)4.147 F 4.147(,d)-.65 G -1.647(e\214ne the UNSETENV)411.276 678.6 R(compilation \215ag.)117 690.6 Q -1.1 -(Yo)142 706.8 S 3.855(um)1.1 G 1.355(ay also ha)169.755 706.8 R 1.655 -.15 -(ve t)-.2 H 3.855(od).15 G 1.355(e\214ne the compilation v)242.035 706.8 R -1.354(ariable LA_TYPE to describe ho)-.25 F 3.854(wy)-.25 G(our)490.67 706.8 Q -(load a)117 718.8 Q -.15(ve)-.2 G(rage is computed.).15 E -(This and other \215ags are detailed in section 6.1.)5 E EP -%%Page: 8 3 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF 198.36(SMM:08-8 Sendmail)72 60 R -(Installation and Operation Guide)2.5 E 2.5(1.1.3. Compilation)102 96 R -(and installation)2.5 E/F1 10/Times-Roman@0 SF .308 -(After making the local system con\214guration described abo)142 112.2 R -.15 -(ve)-.15 G 2.809(,Y).15 G .309(ou should be able to com-)398.855 112.2 R .87 -(pile and install the system.)117 126.2 R .87 -(Compilation can be performed using \231mak)5.87 F(e)-.1 E/F2 7/Times-Roman@0 -SF(1)412.24 122.2 Q F1 3.37<9a69>415.74 126.2 S 3.37(nt)426.33 126.2 S(he) -437.48 126.2 Q F0(sendmail/sr)3.37 E(c)-.18 E F1(directory)117 138.2 Q 5(.Y) --.65 G(ou may be able to install using)166.07 138.2 Q(mak)157 154.4 Q 2.5(ei) --.1 G(nstall)183.84 154.4 Q 3.346 -(This should install the binary in /usr/sbin and create links from /usr/bin/ne) -117 170.6 R -.1(wa)-.25 G 3.346(liases and).1 F 1.577 -(/usr/bin/mailq to /usr/sbin/sendmail.)117 182.6 R 1.577 -(On 4.4BSD systems it will also format and install man)6.577 F(pages.)117 194.6 -Q F0 2.5(1.2. Con\214guration)87 218.6 R(Files)2.5 E/F3 10/Times-Italic@0 SF -(Sendmail)127 234.8 Q F1 .355(cannot operate without a con\214guration \214le.) -2.855 F .355(The con\214guration de\214nes the mail sys-)5.355 F .286 -(tems understood at this site, ho)102 246.8 R 2.786(wt)-.25 G 2.786(oa)239.856 -246.8 S .286(ccess them, ho)252.082 246.8 R 2.786(wt)-.25 G 2.786(of)323.79 -246.8 S(orw)334.906 246.8 Q .286(ard email to remote mail systems, and)-.1 F -3.113(an)102 258.8 S .613(umber of tuning parameters.)114.553 258.8 R .614 -(This con\214guration \214le is detailed in the later portion of this docu-) -5.614 F(ment.)102 270.8 Q(The)127 287 Q F3(sendmail)2.764 E F1 .264 -(con\214guration can be daunting at \214rst.)2.764 F .264(The w)5.264 F .264 -(orld is comple)-.1 F .264(x, and the mail con-)-.15 F .108 -(\214guration re\215ects that.)102 299 R .108(The distrib)5.108 F .109 -(ution includes an m4-based con\214guration package that hides a lot)-.2 F -(of the comple)102 311 Q(xity)-.15 E(.)-.65 E .47 -(These con\214guration \214les are simpler than old v)127 327.2 R .47 -(ersions lar)-.15 F .47(gely because the w)-.18 F .47(orld has become)-.1 F -1.448(simpler; in particular)102 339.2 R 3.948(,t)-.4 G -.15(ex)197.604 339.2 S -1.448(t-based host \214les are of).15 F 1.449(\214cially eliminated, ob)-.25 F -1.449(viating the need to \231hide\232)-.15 F(hosts behind a re)102 351.2 Q -(gistered internet g)-.15 E(ate)-.05 E -.1(wa)-.25 G -.65(y.).1 G .092(These \ -\214les also assume that most of your neighbors use domain-based UUCP addressi\ -ng; that)127 367.4 R .361(is, instead of naming hosts as \231host!user\232 the) -102 379.4 R 2.861(yw)-.15 G .361(ill use \231host.domain!user\232.)299.435 -379.4 R .361(The con\214guration \214les)5.361 F(can be customized to w)102 -391.4 Q(ork around this, b)-.1 E(ut it is more comple)-.2 E(x.)-.15 E 2.828(Ih) -127 407.6 S -2.25 -.2(av e)138.158 407.6 T(n').2 E 2.828(tt)-.18 G .328 -(ested these yet on an isolated LAN en)168.226 407.6 R .328 -(vironment with a single UUCP connection to)-.4 F 4.408(the outside w)102 419.6 -R 6.908(orld. If)-.1 F 4.409(you are in such an en)6.908 F 4.409 -(vironment, please send comments to send-)-.4 F(mail@CS.Berk)102 431.6 Q(ele) --.1 E -.65(y.)-.15 G(EDU.).65 E .658 -(Our con\214guration \214les are processed by)127 447.8 R F3(m4)3.158 E F1 .658 -(to f)3.158 F .657(acilitate local customization; the directory)-.1 F F3(cf) -3.157 E F1 .396(of the)102 459.8 R F3(sendmail)2.896 E F1(distrib)2.896 E .396 -(ution directory contains the source \214les.)-.2 F .396 -(This directory contains se)5.396 F -.15(ve)-.25 G .397(ral sub-).15 F -(directories:)102 471.8 Q 61.73(cf Both)102 488 R .56 -(site-dependent and site-independent descriptions of hosts.)3.06 F .56 -(These can be lit-)5.56 F .445(eral host names \(e.g., \231ucb)174 500 R -.25 -(va)-.15 G .445(x.mc\232\) when the hosts are g).25 F(ate)-.05 E -.1(wa)-.25 G -.445(ys or more general).1 F 3.589(descriptions \(such as \231tcpproto.mc\232 \ -as a general description of an SMTP-)174 512 R .536(connected host or \231uucp\ -proto.mc\232 as a general description of a UUCP-connected)174 524 R 3.291 -(host\). Files)174 536 R(ending)3.291 E F0(.mc)3.291 E F1(\(`)3.291 E .791 -(`Master Con\214guration')-.74 F .791('\) are the input descriptions; the)-.74 -F 2.14(output is in the corresponding)174 548 R F0(.cf)4.64 E F1 4.64 -(\214le. The)4.64 F 2.14(general structure of these \214les is)4.64 F -(described belo)174 560 Q -.65(w.)-.25 G 39.5(domain Site-dependent)102 576.2 R -.428(subdomain descriptions.)2.928 F .428(These are tied to the w)5.428 F .428 -(ay your or)-.1 F -.05(ga)-.18 G(niza-).05 E .292(tion w)174 588.2 R .292 -(ants to do addressing.)-.1 F -.15(Fo)5.292 G 2.792(re).15 G(xample,)313.122 -588.2 Q F0(domain/cs.exposed.m4)2.792 E F1 .292(is our descrip-)2.792 F .443 -(tion for hosts in the CS.Berk)174 600.2 R(ele)-.1 E -.65(y.)-.15 G .443 -(EDU subdomain that w).65 F .442(ant their indi)-.1 F .442(vidual host-)-.25 F -.962(name to be e)174 612.2 R .963(xternally visible;)-.15 F F0 -(domain/cs.hidden.m4)3.463 E F1 .963(is the same e)3.463 F .963(xcept that the) --.15 F 2.628(hostname is hidden \(e)174 624.2 R -.15(ve)-.25 G 2.628 -(rything looks lik).15 F 5.128(ei)-.1 G 5.128(tc)362.038 624.2 S 2.627 -(omes from CS.Berk)374.386 624.2 R(ele)-.1 E -.65(y.)-.15 G(EDU\).).65 E -(These are referenced using the)174 636.2 Q/F4 9/Times-Roman@0 SF(DOMAIN)2.5 E -F0(m4)2.5 E F1(macro in the)2.5 E F0(.mc)2.5 E F1(\214le.)2.5 E 41.74 -(feature De\214nitions)102 652.4 R .728 -(of speci\214c features that some particular host in your site might w)3.228 F -(ant.)-.1 E 2.467(These are referenced using the)174 664.4 R F4(FEA)4.966 E -(TURE)-.999 E F0(m4)4.966 E F1 4.966(macro. An)4.966 F -.15(ex)4.966 G 2.466 -(ample feature is).15 F 1.316(use_cw_\214le \(which tells)174 676.4 R F3 -(sendmail)3.816 E F1 1.317(to read an /etc/sendmail.cw \214le on startup to) -3.816 F .32 LW 76 686 72 686 DL 80 686 76 686 DL 84 686 80 686 DL 88 686 84 686 -DL 92 686 88 686 DL 96 686 92 686 DL 100 686 96 686 DL 104 686 100 686 DL 108 -686 104 686 DL 112 686 108 686 DL 116 686 112 686 DL 120 686 116 686 DL 124 686 -120 686 DL 128 686 124 686 DL 132 686 128 686 DL 136 686 132 686 DL 140 686 136 -686 DL 144 686 140 686 DL 148 686 144 686 DL 152 686 148 686 DL 156 686 152 686 -DL 160 686 156 686 DL 164 686 160 686 DL 168 686 164 686 DL 172 686 168 686 DL -176 686 172 686 DL 180 686 176 686 DL 184 686 180 686 DL 188 686 184 686 DL 192 -686 188 686 DL 196 686 192 686 DL 200 686 196 686 DL 204 686 200 686 DL 208 686 -204 686 DL 212 686 208 686 DL 216 686 212 686 DL/F5 5/Times-Roman@0 SF(1)93.6 -696.4 Q/F6 8/Times-Roman@0 SF(where you may ha)3.2 I .24 -.12(ve t)-.16 H 2(or) -.12 G(eplace \231mak)175.132 699.6 Q(e\232 with \231mak)-.08 E 2<65ad>-.08 G 2 -(fM)267.452 699.6 S(ak)279.228 699.6 Q(e\214le.dist\232 as appropriate.)-.08 E -EP -%%Page: 9 4 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF(Sendmail Installation and Operation Guide)72 60 Q -(SMM:08-9)457.9 60 Q/F1 10/Times-Roman@0 SF(\214nd the set of local names\).) -174 96 Q 50.62(hack Local)102 112.2 R 1.886(hacks, referenced using the)4.387 F -/F2 9/Times-Roman@0 SF(HA)4.386 E(CK)-.36 E F0(m4)4.386 E F1 4.386(macro. T) -4.386 F 1.886(ry to a)-.35 F -.2(vo)-.2 G 1.886(id these.).2 F(The)6.886 E -(point of ha)174 124.2 Q(ving them here is to mak)-.2 E 2.5(ei)-.1 G 2.5(tc) -325.91 124.2 S(lear that the)335.63 124.2 Q 2.5(ys)-.15 G(mell.)394.08 124.2 Q -56.72(m4 Site-independent)102 140.4 R/F3 10/Times-Italic@0 SF(m4)2.538 E F1 -.038(\(1\) include \214les that ha)B .338 -.15(ve i)-.2 H .038 -(nformation common to all con\214gu-).15 F(ration \214les.)174 152.4 Q -(This can be thought of as a \231#include\232 directory)5 E(.)-.65 E 43.95 -(mailer De\214nitions)102 168.6 R .918(of mailers, referenced using the)3.418 F -F2(MAILER)3.417 E F0(m4)3.417 E F1 3.417(macro. De\214ned)3.417 F(mailer)3.417 -E(types in this distrib)174 180.6 Q(ution are f)-.2 E -(ax, local, smtp, uucp, and usenet.)-.1 E 43.39(ostype De\214nitions)102 196.8 -R 1.156(describing v)3.656 F 1.157(arious operating system en)-.25 F 1.157 -(vironments \(such as the loca-)-.4 F(tion of support \214les\).)174 208.8 Q -(These are referenced using the)5 E F2(OSTYPE)2.5 E F0(m4)2.5 E F1(macro.)2.5 E -60.61(sh Shell)102 225 R(\214les used by the)2.5 E F0(m4)2.5 E F1 -.2(bu)2.5 G -(ild process.).2 E -1.1(Yo)5 G 2.5(us)1.1 G(houldn')362.97 225 Q 2.5(th)-.18 G --2.25 -.2(av e)404.18 225 T(to mess with these.)2.7 E 30.61(sitecon\214g Local) -102 241.2 R .49(site con\214guration information, such as UUCP connecti)2.99 F -(vity)-.25 E 5.49(.T)-.65 G(he)450.61 241.2 Q 2.99(yn)-.15 G(ormally)472.89 -241.2 Q(contain lists of site information, for e)174 253.2 Q(xample:)-.15 E -(SITE\(contessa\))214 269.4 Q(SITE\(hoptoad\))214 281.4 Q(SITE\(nkainc\))214 -293.4 Q(SITE\(well\))214 305.4 Q(The)174 321.6 Q 2.5(ya)-.15 G -(re referenced using the SITECONFIG macro:)201.34 321.6 Q -(SITECONFIG\(site.con\214g.\214le, name_of_site, X\))214 337.8 Q(where)174 354 -Q F3(X)2.703 E F1 .203(is the macro/class name to use.)2.703 F .204 -(It can be U \(indicating locally connected)5.204 F(hosts\) or one of W)174 366 -Q 2.5(,X)-.92 G 2.5(,o)259.73 366 S 2.5(rYf)269.73 366 S -(or up to three remote UUCP hubs.)288.61 366 Q .757(If you are in a ne)127 -382.2 R 3.257(wd)-.25 G .757(omain \(e.g., a compan)214.042 382.2 R .756 -(y\), you will probably w)-.15 F .756(ant to create a cf/domain)-.1 F .87 -(\214le for your domain.)102 394.2 R .871 -(This consists primarily of relay de\214nitions: for e)5.871 F .871 -(xample, Berk)-.15 F(ele)-.1 E(y')-.15 E 3.371(sd)-.55 G(omain)479 394.2 Q .16 -(de\214nition de\214nes relays for BitNET)102 406.2 R 2.66(,C)-.74 G(SNET) -257.61 406.2 Q 2.66(,a)-.74 G .16(nd UUCP)291.47 406.2 R 5.16(.O)-1.11 G 2.66 -(ft)344.57 406.2 S .16(hese, only the UUCP relay is particu-)353.34 406.2 R .46 -(larly speci\214c to Berk)102 418.2 R(ele)-.1 E 4.26 -.65(y. A)-.15 H .46 -(ll of these are internet-style domain names.).65 F .46(Please check to mak) -5.46 F 2.96(ec)-.1 G(er)493.1 418.2 Q(-)-.2 E(tain the)102 430.2 Q 2.5(ya)-.15 -G(re reasonable for your domain.)143.51 430.2 Q 1.407(Subdomains at Berk)127 -446.4 R(ele)-.1 E 3.907(ya)-.15 G 1.407 -(re also represented in the cf/domain directory)235.681 446.4 R 6.406(.F)-.65 G -1.406(or e)439.408 446.4 R 1.406(xample, the)-.15 F 1.49(domain cs-e)102 458.4 -R 1.491(xposed is the Computer Science subdomain with the local hostname sho) --.15 F 1.491(wn to other)-.25 F 1.411(users; cs-hidden mak)102 470.4 R 1.411 -(es users appear to be from the CS.Berk)-.1 F(ele)-.1 E -.65(y.)-.15 G 1.41 -(EDU subdomain \(with no local).65 F 1.083(host information included\).)102 -482.4 R -1.1(Yo)6.083 G 3.583(uw)1.1 G 1.083(ill probably ha)246.332 482.4 R -1.384 -.15(ve t)-.2 H 3.584(ou).15 G 1.084 -(pdate this directory to be appropriate for)335.866 482.4 R(your domain.)102 -494.4 Q -1.1(Yo)127 510.6 S 4.373(uw)1.1 G 1.873(ill ha)154.713 510.6 R 2.173 --.15(ve t)-.2 H 4.373(ou).15 G 1.873(se or create)207.482 510.6 R F0(.mc)4.372 -E F1 1.872(\214les in the)4.372 F F3(cf/cf)4.372 E F1 1.872 -(subdirectory for your hosts.)4.372 F 1.872(This is)6.872 F -(detailed in the cf/README \214le.)102 522.6 Q F0 2.5(1.3. Details)87 546.6 R -(of Installation Files)2.5 E F1 -(This subsection describes the \214les that comprise the)127 562.8 Q F3 -(sendmail)2.5 E F1(installation.)2.5 E F0 2.5(1.3.1. /usr/sbin/sendmail)102 -586.8 R F1 .08(The binary for)142 605 R F3(sendmail)2.58 E F1 .079 -(is located in /usr/sbin)2.58 F/F4 7/Times-Roman@0 SF(2)326.708 601 Q F1 5.079 -(.I)330.208 605 S 2.579(ts)341.117 605 S .079(hould be setuid root.)350.366 605 -R -.15(Fo)5.079 G 2.579(rs).15 G .079(ecurity rea-)458.111 605 R(sons, /, /usr) -117 619 Q 2.5(,a)-.4 G(nd /usr/sbin should be o)171.6 619 Q -(wned by root, mode 755)-.25 E F4(3)364.4 615 Q F1(.)367.9 619 Q .32 LW 76 646 -72 646 DL 80 646 76 646 DL 84 646 80 646 DL 88 646 84 646 DL 92 646 88 646 DL -96 646 92 646 DL 100 646 96 646 DL 104 646 100 646 DL 108 646 104 646 DL 112 -646 108 646 DL 116 646 112 646 DL 120 646 116 646 DL 124 646 120 646 DL 128 646 -124 646 DL 132 646 128 646 DL 136 646 132 646 DL 140 646 136 646 DL 144 646 140 -646 DL 148 646 144 646 DL 152 646 148 646 DL 156 646 152 646 DL 160 646 156 646 -DL 164 646 160 646 DL 168 646 164 646 DL 172 646 168 646 DL 176 646 172 646 DL -180 646 176 646 DL 184 646 180 646 DL 188 646 184 646 DL 192 646 188 646 DL 196 -646 192 646 DL 200 646 196 646 DL 204 646 200 646 DL 208 646 204 646 DL 212 646 -208 646 DL 216 646 212 646 DL/F5 5/Times-Roman@0 SF(2)93.6 656.4 Q/F6 8 -/Times-Roman@0 SF .384(This is usually /usr/sbin on 4.4BSD and ne)3.2 J .384 -(wer systems; man)-.2 F 2.385(ys)-.12 G .385(ystems install it in /usr/lib) -302.957 659.6 R 4.385(.I)-.32 G .385(understand it is in /usr/ucblib on)398.739 -659.6 R(System V Release 4.)72 669.2 Q F5(3)93.6 679.6 Q F6 .149(Some v)3.2 J -.15(endors ship them o)-.12 F .15 -(wned by bin; this creates a security hole that is not actually related to)-.2 -F/F7 8/Times-Italic@0 SF(sendmail)2.15 E F6 4.15(.O)C .15(ther important di-) -447.26 682.8 R(rectories that should ha)72 692.4 Q .24 -.12(ve r)-.16 H -(estricti).12 E .24 -.12(ve o)-.2 H(wnerships and permissions are /bin, /usr/b\ -in, /etc, /usr/etc, /lib, and /usr/lib)-.08 E(.)-.32 E EP -%%Page: 10 5 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF 193.36(SMM:08-10 Sendmail)72 60 R -(Installation and Operation Guide)2.5 E 2.5(1.3.2. /etc/sendmail.cf)102 96 R/F1 -10/Times-Roman@0 SF .025(This is the con\214guration \214le for)142 112.2 R/F2 -10/Times-Italic@0 SF(sendmail)2.525 E F1 5.025(.T)C .025 -(his is the only non-library \214le name compiled)321.335 112.2 R(into)117 -126.2 Q F2(sendmail)2.5 E/F3 7/Times-Roman@0 SF(4)171.17 122.2 Q F1 5(.S)174.67 -126.2 S(ome older systems install it in)187.73 126.2 Q F0(/usr/lib/sendmail.cf) -2.5 E F1(.)A(If you w)142 142.4 Q(ant to mo)-.1 E .3 -.15(ve t)-.15 H -(his \214le, change).15 E F2(sr)2.5 E(c/pathnames.h)-.37 E F1(.)A .721 -(The con\214guration \214le is normally created using the distrib)142 158.6 R -.721(ution \214les described abo)-.2 F -.15(ve)-.15 G 5.72(.I).15 G(f)500.67 -158.6 Q .64(you ha)117 170.6 R .94 -.15(ve a p)-.2 H .64 -(articularly unusual system con\214guration you may need to create a special v) -.15 F(ersion.)-.15 E -(The format of this \214le is detailed in later sections of this document.)117 -182.6 Q F0 2.5(1.3.3. /usr/bin/newaliases)102 206.6 R F1(The)142 222.8 Q F2(ne) -2.5 E(waliases)-.15 E F1(command should just be a link to)2.5 E F2(sendmail)2.5 -E F1(:)A(rm \255f /usr/bin/ne)157 239 Q -.1(wa)-.25 G(liases).1 E -(ln \255s /usr/sbin/sendmail /usr/bin/ne)157 251 Q -.1(wa)-.25 G(liases).1 E -(This can be installed in whate)117 267.2 Q -.15(ve)-.25 G 2.5(rs).15 G -(earch path you prefer for your system.)254.91 267.2 Q F0 2.5(1.3.4. /v)102 -291.2 R(ar/spool/mqueue)-.1 E F1 .218(The directory)142 307.4 R F2 -(/var/spool/mqueue)2.718 E F1 .217(should be created to hold the mail queue.) -2.718 F .217(This directory)5.217 F(should be mode 700 and o)117 319.4 Q -(wned by root.)-.25 E(The actual path of this directory is de\214ned in the)142 -335.6 Q F0(Q)2.5 E F1(option of the)2.5 E F2(sendmail.cf)2.5 E F1(\214le.)2.5 E -F0 2.5(1.3.5. /etc/aliases*)102 359.6 R F1 1.492 -(The system aliases are held in \231/etc/aliases\232.)142 375.8 R 3.992(As) -6.492 G 1.492(ample is gi)350.006 375.8 R -.15(ve)-.25 G 3.993(ni).15 G 3.993 -<6e99>417.694 375.8 S 1.493(lib/aliases\232 which)431.127 375.8 R -(includes some aliases which)117 387.8 Q F2(must)2.5 E F1(be de\214ned:)2.5 E -(cp lib/aliases /etc/aliases)157 404 Q F2(edit /etc/aliases)157 416 Q F1 -1.1 -(Yo)117 432.2 S 2.5(us)1.1 G(hould e)139.51 432.2 Q(xtend this \214le with an) --.15 E 2.5(ya)-.15 G(liases that are apropos to your system.)267.54 432.2 Q -(Normally)142 448.4 Q F2(sendmail)3.61 E F1 1.109(looks at a v)3.61 F 1.109 -(ersion of these \214les maintained by the)-.15 F F2(dbm)3.609 E F1 1.109 -(\(3\) or)1.666 F F2(db)3.609 E F1(\(3\))1.666 E 3.46(routines. These)117 460.4 -R .96(are stored either in \231/etc/aliases.dir\232 and \231/etc/aliases.pag\ -\232 or \231/etc/aliases.db\232)3.46 F 1.022 -(depending on which database package you are using.)117 472.4 R 1.022 -(These can initially be created as empty)6.022 F(\214les, b)117 484.4 Q(ut the) --.2 E 2.5(yw)-.15 G(ill ha)180.54 484.4 Q .3 -.15(ve t)-.2 H 2.5(ob).15 G 2.5 -(ei)227.69 484.4 S(nitialized promptly)237.41 484.4 Q 5(.T)-.65 G -(hese should be mode 644:)326.76 484.4 Q(cp /de)157 500.6 Q -(v/null /etc/aliases.dir)-.25 E(cp /de)157 512.6 Q(v/null /etc/aliases.pag)-.25 -E(chmod 644 /etc/aliases.*)157 524.6 Q(ne)157 536.6 Q -.1(wa)-.25 G(liases).1 E -(The)117 552.8 Q F2(db)2.79 E F1 .29(routines preset the mode reasonably)2.79 F -2.79(,s)-.65 G 2.79(ot)301.68 552.8 S .29(his step can be skipped.)312.25 552.8 -R .29(The actual path of this)5.29 F(\214le is de\214ned in the)117 564.8 Q F0 -(A)2.5 E F1(option of the)2.5 E F2(sendmail.cf)2.5 E F1(\214le.)2.5 E F0 2.5 -(1.3.6. /etc/r)102 588.8 R(c)-.18 E F1 .156 -(It will be necessary to start up the)142 605 R F2(sendmail)2.655 E F1 .155 -(daemon when your system reboots.)2.655 F .155(This dae-)5.155 F 1.537 -(mon performs tw)117 617 R 4.037(of)-.1 G 1.537 -(unctions: it listens on the SMTP sock)201.221 617 R 1.537 -(et for connections \(to recei)-.1 F 1.838 -.15(ve m)-.25 H(ail).15 E .442(fro\ -m a remote system\) and it processes the queue periodically to insure that mai\ -l gets deli)117 629 R -.15(ve)-.25 G(red).15 E(when hosts come up.)117 641 Q -.505(Add the follo)142 657.2 R .505(wing lines to \231/etc/rc\232 \(or \231/et\ -c/rc.local\232 as appropriate\) in the area where it)-.25 F -(is starting up the daemons:)117 669.2 Q .32 LW 76 678.8 72 678.8 DL 80 678.8 -76 678.8 DL 84 678.8 80 678.8 DL 88 678.8 84 678.8 DL 92 678.8 88 678.8 DL 96 -678.8 92 678.8 DL 100 678.8 96 678.8 DL 104 678.8 100 678.8 DL 108 678.8 104 -678.8 DL 112 678.8 108 678.8 DL 116 678.8 112 678.8 DL 120 678.8 116 678.8 DL -124 678.8 120 678.8 DL 128 678.8 124 678.8 DL 132 678.8 128 678.8 DL 136 678.8 -132 678.8 DL 140 678.8 136 678.8 DL 144 678.8 140 678.8 DL 148 678.8 144 678.8 -DL 152 678.8 148 678.8 DL 156 678.8 152 678.8 DL 160 678.8 156 678.8 DL 164 -678.8 160 678.8 DL 168 678.8 164 678.8 DL 172 678.8 168 678.8 DL 176 678.8 172 -678.8 DL 180 678.8 176 678.8 DL 184 678.8 180 678.8 DL 188 678.8 184 678.8 DL -192 678.8 188 678.8 DL 196 678.8 192 678.8 DL 200 678.8 196 678.8 DL 204 678.8 -200 678.8 DL 208 678.8 204 678.8 DL 212 678.8 208 678.8 DL 216 678.8 212 678.8 -DL/F4 5/Times-Roman@0 SF(4)93.6 689.2 Q/F5 8/Times-Roman@0 SF .588 -(The system libraries can reference other \214les; in particular)3.2 J 2.589 -(,s)-.32 G .589(ystem library subroutines that)294.805 692.4 R/F6 8 -/Times-Italic@0 SF(sendmail)2.589 E F5 .589(calls probably reference)2.589 F F6 -(/etc/passwd)72 702 Q F5(and)2 E F6(/etc/r)2 E(esolv)-.296 E(.conf)-.592 E F5 -(.)A EP -%%Page: 11 6 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF(Sendmail Installation and Operation Guide)72 60 Q -(SMM:08-11)452.9 60 Q/F1 10/Times-Roman@0 SF -(if [ \255f /usr/sbin/sendmail \255a \255f /etc/sendmail.cf ]; then)157 96 Q -(\(cd /v)193 108 Q(ar/spool/mqueue; rm \255f [lnx]f*\))-.25 E -(/usr/sbin/sendmail \255bd \255q30m &)193 120 Q(echo \255n ' sendmail' >/de)193 -132 Q(v/console)-.25 E<8c>157 144 Q .174 -(The \231cd\232 and \231rm\232 commands insure that all lock \214les ha)117 -160.2 R .473 -.15(ve b)-.2 H .173(een remo).15 F -.15(ve)-.15 G .173(d; e).15 F -.173(xtraneous lock \214les)-.15 F .004 -(may be left around if the system goes do)117 172.2 R .005 -(wn in the middle of processing a message.)-.25 F .005(The line that)5.005 F -2.294(actually in)117 184.2 R -.2(vo)-.4 G -.1(ke).2 G(s).1 E/F2 10 -/Times-Italic@0 SF(sendmail)4.794 E F1 2.294(has tw)4.794 F 4.794<6f8d>-.1 G -2.293(ags: \231\255bd\232 causes it to listen on the SMTP port, and)272.94 -184.2 R(\231\255q30m\232 causes it to run the queue e)117 196.2 Q -.15(ve)-.25 -G(ry half hour).15 E(.)-.55 E .378(Some people use a more comple)142 212.4 R -2.879(xs)-.15 G .379(tartup script, remo)285.209 212.4 R .379 -(ving zero length qf \214les and df \214les)-.15 F -(for which there is no qf \214le.)117 224.4 Q -.15(Fo)5 G 2.5(re).15 G(xample:) -253.9 224.4 Q 2.5(#r)157 240.6 S(emo)167.83 240.6 Q .3 -.15(ve z)-.15 H -(ero length qf \214les).15 E(for qf)157 252.6 Q(\214le in qf*)-.25 E(do)157 -264.6 Q(if [ \255r $qf)193 276.6 Q(\214le ])-.25 E(then)193 288.6 Q -(if [ ! \255s $qf)229 300.6 Q(\214le ])-.25 E(then)229 312.6 Q -(echo \255n " <zero: $qf)265 324.6 Q(\214le>" > /de)-.25 E(v/console)-.25 E -(rm \255f $qf)265 336.6 Q(\214le)-.25 E<8c>229 348.6 Q<8c>193 360.6 Q(done)157 -372.6 Q 2.5(#r)157 384.6 S(ename tf \214les to be qf if the qf does not e) -167.83 384.6 Q(xist)-.15 E(for tf)157 396.6 Q(\214le in tf*)-.25 E(do)157 408.6 -Q(qf)193 420.6 Q(\214le=`echo $tf)-.25 E(\214le | sed ')-.25 E(s/t/q/'`)-.55 E -(if [ \255r $tf)193 432.6 Q(\214le \255a ! \255f $qf)-.25 E(\214le ])-.25 E -(then)193 444.6 Q(echo \255n " <reco)229 456.6 Q -.15(ve)-.15 G(ring: $tf).15 E -(\214le>" > /de)-.25 E(v/console)-.25 E(mv $tf)229 468.6 Q(\214le $qf)-.25 E -(\214le)-.25 E(else)193 480.6 Q(echo \255n " <e)229 492.6 Q(xtra: $tf)-.15 E -(\214le>" > /de)-.25 E(v/console)-.25 E(rm \255f $tf)229 504.6 Q(\214le)-.25 E -<8c>193 516.6 Q(done)157 528.6 Q 2.5(#r)157 540.6 S(emo)167.83 540.6 Q .3 -.15 -(ve d)-.15 H 2.5<668c>.15 G(les with no corresponding qf \214les)213.08 540.6 Q -(for df)157 552.6 Q(\214le in df*)-.25 E(do)157 564.6 Q(qf)193 576.6 Q -(\214le=`echo $df)-.25 E(\214le | sed ')-.25 E(s/d/q/'`)-.55 E(if [ \255r $df) -193 588.6 Q(\214le \255a ! \255f $qf)-.25 E(\214le ])-.25 E(then)193 600.6 Q -(echo \255n " <incomplete: $df)229 612.6 Q(\214le>" > /de)-.25 E(v/console)-.25 -E(mv $df)229 624.6 Q(\214le `echo $df)-.25 E(\214le | sed ')-.25 E(s/d/D/'`) --.55 E<8c>193 636.6 Q(done)157 648.6 Q 2.5(#a)157 660.6 S -(nnounce \214les that ha)168.94 660.6 Q .3 -.15(ve b)-.2 H(een sa).15 E -.15 -(ve)-.2 G 2.5(dd).15 G(uring disaster reco)314.32 660.6 Q -.15(ve)-.15 G(ry).15 -E(for xf)157 672.6 Q(\214le in [A-Z]f*)-.25 E(do)157 684.6 Q -(echo \255n " <panic: $xf)193 696.6 Q(\214le>" > /de)-.25 E(v/console)-.25 E -(done)157 708.6 Q EP -%%Page: 12 7 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF 193.36(SMM:08-12 Sendmail)72 60 R -(Installation and Operation Guide)2.5 E/F1 10/Times-Roman@0 SF .756 -(If you are not running a v)142 96 R .755(ersion of UNIX that supports Berk) --.15 F(ele)-.1 E 3.255(yT)-.15 G(CP/IP)416.725 96 Q 3.255(,d)-1.11 G 3.255(on) -450.27 96 S .755(ot include)463.525 96 R(the)117 108 Q F0(\255bd)2.5 E F1 -(\215ag.)2.5 E F0 2.5(1.3.7. /usr/lib/sendmail.hf)102 132 R F1 2.078 -(This is the help \214le used by the SMTP)142 148.2 R F0(HELP)4.578 E F1 4.578 -(command. It)4.578 F 2.078(should be copied from)4.578 F -(\231lib/sendmail.hf\232:)117 160.2 Q(cp lib/sendmail.hf /usr/lib)157 176.4 Q -(The actual path of this \214le is de\214ned in the)117 192.6 Q F0(H)2.5 E F1 -(option of the)2.5 E/F2 10/Times-Italic@0 SF(sendmail.cf)2.5 E F1(\214le.)2.5 E -F0 2.5(1.3.8. /etc/sendmail.st)102 216.6 R F1 3.04 -(If you wish to collect statistics about your mail traf)142 232.8 R 3.04 -(\214c, you should create the \214le)-.25 F(\231/etc/sendmail.st\232:)117 244.8 -Q(cp /de)157 261 Q(v/null /etc/sendmail.st)-.25 E(chmod 666 /etc/sendmail.st) -157 273 Q .715(This \214le does not gro)117 289.2 R 4.516 -.65(w. I)-.25 H -3.216(ti).65 G 3.216(sp)231.502 289.2 S .716 -(rinted with the program \231mailstats/mailstats.c.)243.608 289.2 R 5.716<9a54> --.7 G .716(he actual path)447.028 289.2 R(of this \214le is de\214ned in the) -117 301.2 Q F0(S)2.5 E F1(option of the)2.5 E F2(sendmail.cf)2.5 E F1(\214le.) -2.5 E F0 2.5(1.3.9. /usr/bin/newaliases)102 325.2 R F1(If)142 341.4 Q F2 -(sendmail)3.256 E F1 .756(is in)3.256 F -.2(vo)-.4 G -.1(ke).2 G 3.256(da).1 G -3.256<7399>240.424 341.4 S(ne)252.01 341.4 Q -.1(wa)-.25 G(liases,).1 E 3.255 -<9a69>-.7 G 3.255(tw)307.255 341.4 S .755(ill simulate the)320.51 341.4 R F0 -(\255bi)3.255 E F1 .755(\215ag \(i.e., will reb)3.255 F .755(uild the)-.2 F -(alias database; see belo)117 353.4 Q 2.5(w\). This)-.25 F -(should be a link to /usr/sbin/sendmail.)2.5 E F0 2.5(1.3.10. /usr/bin/mailq) -102 377.4 R F1(If)142 393.6 Q F2(sendmail)3.439 E F1 .939(is in)3.439 F -.2(vo) --.4 G -.1(ke).2 G 3.439(da).1 G 3.439<7399>241.156 393.6 S(mailq,)252.925 393.6 -Q 3.439<9a69>-.7 G 3.439(tw)288.164 393.6 S .939(ill simulate the)301.603 393.6 -R F0(\255bp)3.439 E F1 .94(\215ag \(i.e.,)3.44 F F2(sendmail)3.44 E F1 .94 -(will print)3.44 F(the contents of the mail queue; see belo)117 405.6 Q 2.5 -(w\). This)-.25 F(should be a link to /usr/sbin/sendmail.)2.5 E F0 2.5 -(2. NORMAL)72 429.6 R(OPERA)2.5 E(TIONS)-.95 E 2.5(2.1. The)87 453.6 R -(System Log)2.5 E F1 1.511(The system log is supported by the)127 469.8 R F2 -(syslo)4.011 E(gd)-.1 E F1 1.511(\(8\) program.)1.666 F 1.511 -(All messages from)6.511 F F2(sendmail)4.011 E F1(are)4.011 E(logged under the) -102 481.8 Q/F3 9/Times-Roman@0 SF(LOG_MAIL)2.5 E F1 -.1(fa)2.5 G(cility).1 E(.) --.65 E F0 2.5(2.1.1. F)102 505.8 R(ormat)-.25 E F1 .574(Each line in the syste\ -m log consists of a timestamp, the name of the machine that gener)142 522 R(-) --.2 E .849(ated it \(for logging from se)117 534 R -.15(ve)-.25 G .849 -(ral machines o).15 F -.15(ve)-.15 G 3.349(rt).15 G .848(he local area netw) -316.942 534 R .848(ork\), the w)-.1 F .848(ord \231sendmail:\232,)-.1 F -(and a message.)117 546 Q F0 2.5(2.1.2. Le)102 570 R -.1(ve)-.15 G(ls).1 E F1 -.204(If you ha)142 586.2 R -.15(ve)-.2 G F2(syslo)2.854 E(gd)-.1 E F1 .204 -(\(8\) or an equi)1.666 F -.25(va)-.25 G .205 -(lent installed, you will be able to do logging.).25 F .205(There is)5.205 F -2.788(al)117 598.2 S(ar)127.008 598.2 Q .287 -(ge amount of information that can be logged.)-.18 F .287 -(The log is arranged as a succession of le)5.287 F -.15(ve)-.25 G(ls.).15 E .65 -(At the lo)117 610.2 R .65(west le)-.25 F -.15(ve)-.25 G 3.15(lo).15 G .65 -(nly e)201.72 610.2 R .651(xtremely strange situations are logged.)-.15 F .651 -(At the highest le)5.651 F -.15(ve)-.25 G .651(l, e).15 F -.15(ve)-.25 G 3.151 -(nt).15 G(he)494.56 610.2 Q .826(most mundane and uninteresting e)117 622.2 R --.15(ve)-.25 G .825(nts are recorded for posterity).15 F 5.825(.A)-.65 G 3.325 -(sac)400.27 622.2 S(on)419.69 622.2 Q -.15(ve)-.4 G .825(ntion, log le).15 F --.15(ve)-.25 G(ls).15 E .2 -(under ten are considered generally \231useful;\232 log le)117 634.2 R -.15(ve) --.25 G .201(ls abo).15 F .501 -.15(ve 6)-.15 H 2.701(4a).15 G .201(re reserv) -381.566 634.2 R .201(ed for deb)-.15 F .201(ugging pur)-.2 F(-)-.2 E 2.5 -(poses. Le)117 646.2 R -.15(ve)-.25 G(ls from 11\25564 are reserv).15 E -(ed for v)-.15 E(erbose information that some sites might w)-.15 E(ant.)-.1 E -2.5(Ac)142 662.4 S(omplete description of the log le)156.16 662.4 Q -.15(ve) --.25 G(ls is gi).15 E -.15(ve)-.25 G 2.5(ni).15 G 2.5(ns)340.35 662.4 S -(ection 4.6.)351.74 662.4 Q F0 2.5(2.2. The)87 686.4 R(Mail Queue)2.5 E F1 .263 -(The mail queue should be processed transparently)127 702.6 R 5.262(.H)-.65 G --.25(ow)342.868 702.6 S -2.15 -.25(ev e).25 H 1.062 -.4(r, y).25 H .262 -(ou may \214nd that manual inter).4 F(-)-.2 E -.15(ve)102 714.6 S .081 -(ntion is sometimes necessary).15 F 5.081(.F)-.65 G .081(or e)240.254 714.6 R -.081(xample, if a major host is do)-.15 F .081 -(wn for a period of time the queue)-.25 F EP -%%Page: 13 8 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF(Sendmail Installation and Operation Guide)72 60 Q -(SMM:08-13)452.9 60 Q/F1 10/Times-Roman@0 SF .268(may become clogged.)102 96 R -(Although)5.268 E/F2 10/Times-Italic@0 SF(sendmail)2.768 E F1 .268 -(ought to reco)2.768 F -.15(ve)-.15 G 2.768(rg).15 G .268 -(racefully when the host comes up, you)348.254 96 R -(may \214nd performance unacceptably bad in the meantime.)102 108 Q F0 2.5 -(2.2.1. Printing)102 132 R(the queue)2.5 E F1 .526 -(The contents of the queue can be printed using the)142 148.2 R F2(mailq)3.026 -E F1 .526(command \(or by specifying the)3.026 F F0(\255bp)117 160.2 Q F1 -(\215ag to)2.5 E F2(sendmail)2.5 E F1(\):)A(mailq)157 176.4 Q 1.673 -(This will produce a listing of the queue id')117 192.6 R 1.673 -(s, the size of the message, the date the message)-.55 F -(entered the queue, and the sender and recipients.)117 204.6 Q F0 2.5(2.2.2. F) -102 228.6 R(or)-.25 E(cing the queue)-.18 E F2(Sendmail)142 244.8 Q F1 1.137 -(should run the queue automatically at interv)3.637 F 3.638(als. The)-.25 F -1.138(algorithm is to read and)3.638 F .355 -(sort the queue, and then to attempt to process all jobs in order)117 256.8 R -5.355(.W)-.55 G .355(hen it attempts to run the job,)384.37 256.8 R F2 -(sendmail)117 268.8 Q F1(\214rst checks to see if the job is lock)2.5 E 2.5 -(ed. If)-.1 F(so, it ignores the job)2.5 E(.)-.4 E .338 -(There is no attempt to insure that only one queue processor e)142 285 R .338 -(xists at an)-.15 F 2.838(yt)-.15 G .339(ime, since there)440.282 285 R .095 -(is no guarantee that a job cannot tak)117 297 R 2.595(ef)-.1 G(ore)272.07 297 -Q -.15(ve)-.25 G 2.595(rt).15 G 2.595(op)302.585 297 S .094(rocess \(ho)315.18 -297 R(we)-.25 E -.15(ve)-.25 G -.4(r,).15 G F2(sendmail)2.994 E F1 .094 -(does include heuris-)2.594 F 1.086 -(tics to try to abort jobs that are taking absurd amounts of time; technically) -117 309 R 3.587(,t)-.65 G 1.087(his violates RFC)435.146 309 R .462(821, b)117 -321 R .461(ut is blessed by RFC 1123\).)-.2 F .461 -(Due to the locking algorithm, it is impossible for one job to)5.461 F 1.086 -(freeze the entire queue.)117 333 R(Ho)6.086 E(we)-.25 E -.15(ve)-.25 G 1.886 --.4(r, a).15 H 3.586(nu).4 G(ncooperati)279.346 333 Q 1.386 -.15(ve r)-.25 H -1.086(ecipient host or a program recipient that).15 F(ne)117 345 Q -.15(ve)-.25 -G 3.351(rr).15 G .851(eturns can accumulate man)145.491 345 R 3.351(yp)-.15 G -.851(rocesses in your system.)269.825 345 R(Unfortunately)5.851 E 3.351(,t)-.65 -G .85(here is no com-)439.52 345 R(pletely general w)117 357 Q(ay to solv)-.1 E -2.5(et)-.15 G(his.)234.23 357 Q .082 -(In some cases, you may \214nd that a major host going do)142 373.2 R .083 -(wn for a couple of days may create)-.25 F 2.925(ap)117 385.2 S(rohibiti) -129.365 385.2 Q -.15(ve)-.25 G .425(ly lar).15 F .425(ge queue.)-.18 F .424 -(This will result in)5.425 F F2(sendmail)2.924 E F1 .424 -(spending an inordinate amount of time)2.924 F 1.084(sorting the queue.)117 -397.2 R 1.084(This situation can be \214x)6.084 F 1.084(ed by mo)-.15 F 1.085 -(ving the queue to a temporary place and)-.15 F .023(creating a ne)117 409.2 R -2.523(wq)-.25 G 2.523(ueue. The)182.629 409.2 R .022 -(old queue can be run later when the of)2.523 F .022 -(fending host returns to service.)-.25 F 1.6 -.8(To d)142 425.4 T 2.5(ot).8 G -(his, it is acceptable to mo)170.09 425.4 Q .3 -.15(ve t)-.15 H -(he entire queue directory:).15 E(cd /v)157 441.6 Q(ar/spool)-.25 E -(mv mqueue omqueue; mkdir mqueue; chmod 700 mqueue)157 453.6 Q -1.1(Yo)117 -469.8 S 2.708(us)1.1 G .208(hould then kill the e)139.718 469.8 R .209 -(xisting daemon \(since it will still be processing in the old queue direc-) --.15 F(tory\) and create a ne)117 481.8 Q 2.5(wd)-.25 G(aemon.)213.1 481.8 Q -1.6 -.8(To r)142 498 T(un the old mail queue, run the follo).8 E(wing command:) --.25 E(/usr/sbin/sendmail \255oQ/v)157 514.2 Q(ar/spool/omqueue \255q)-.25 E -(The)117 530.4 Q F0(\255oQ)2.868 E F1 .367 -(\215ag speci\214es an alternate queue directory and the)2.868 F F0<ad71>2.867 -E F1 .367(\215ag says to just run e)2.867 F -.15(ve)-.25 G .367(ry job in).15 F -.593(the queue.)117 542.4 R .593(If you ha)5.593 F .893 -.15(ve a t)-.2 H -(endenc).15 E 3.093(yt)-.15 G -2.1 -.25(ow a)263.111 542.4 T .593(rd v).25 F --.1(oy)-.2 G .593(eurism, you can use the).1 F F0<ad76>3.094 E F1 .594 -(\215ag to w)3.094 F .594(atch what is)-.1 F(going on.)117 554.4 Q -(When the queue is \214nally emptied, you can remo)142 570.6 Q .3 -.15(ve t) --.15 H(he directory:).15 E(rmdir /v)157 586.8 Q(ar/spool/omqueue)-.25 E F0 2.5 -(2.3. The)87 615 R(Alias Database)2.5 E F1 .361(The alias database e)127 631.2 -R .361(xists in tw)-.15 F 2.861(of)-.1 G 2.861(orms. One)261.116 631.2 R .361 -(is a te)2.861 F .36(xt form, maintained in the \214le)-.15 F F2(/etc/aliases.) -2.86 E F1(The aliases are of the form)102 643.2 Q(name: name1, name2, ...)142 -659.4 Q(Only local names may be aliased; e.g.,)102 675.6 Q(eric@prep.ai.MIT)142 -691.8 Q(.EDU: eric@CS.Berk)-.74 E(ele)-.1 E -.65(y.)-.15 G(EDU).65 E .348 -(will not ha)102 708 R .648 -.15(ve t)-.2 H .348(he desired ef).15 F 2.849 -(fect. Aliases)-.25 F .349(may be continued by starting an)2.849 F 2.849(yc) --.15 G .349(ontinuation lines with a)408.783 708 R(space or a tab)102 720 Q 5 -(.B)-.4 G(lank lines and lines be)170.47 720 Q -(ginning with a sharp sign \(\231#\232\) are comments.)-.15 E EP -%%Page: 14 9 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF 193.36(SMM:08-14 Sendmail)72 60 R -(Installation and Operation Guide)2.5 E/F1 10/Times-Roman@0 SF 1.593 -(The second form is processed by the)127 96 R/F2 10/Times-Italic@0 SF(dbm)4.093 -E F1 1.593(\(3\) \(or)1.666 F F2(db)4.093 E F1 1.593(\(3\)\) library)1.666 F -6.593(.T)-.65 G 1.593(his form is in the \214les)409.085 96 R F2 -(/etc/aliases.dir)102 108 Q F1(and)3.028 E F2(/etc/aliases.pa)3.028 E -.15(g.) --.1 G F1 .528(This is the form that)5.678 F F2(sendmail)3.029 E F1 .529 -(actually uses to resolv)3.029 F 3.029(ea)-.15 G(liases.)479.28 108 Q -(This technique is used to impro)102 120 Q .3 -.15(ve p)-.15 H(erformance.).15 -E -1.1(Yo)127 136.2 S 2.5(uc)1.1 G(an also use)150.06 136.2 Q/F3 9 -/Times-Roman@0 SF(NIS)2.5 E F1(-based alias \214les.)A -.15(Fo)5 G 2.5(re).15 G -(xample, the speci\214cation:)305.069 136.2 Q -.35(OA)142 152.4 S(/etc/aliases) -.35 E -.35(OA)142 164.4 S(nis:mail.aliases@my).35 E(.nis.domain)-.65 E 1.725(w\ -ill \214rst search the /etc/aliases \214le and then the map named \231mail.ali\ -ases\232 in \231my)102 180.6 R(.nis.domain\232.)-.65 E -.8(Wa)102 192.6 S .589 -(rning: if you b).8 F .589(uild your o)-.2 F(wn)-.25 E F3(NIS)3.089 E F1 .589 -(-based alias \214les, be sure to pro)B .59(vide the)-.15 F F0<ad6c>3.09 E F1 -.59(\215ag to)3.09 F F2(mak)3.09 E(edbm)-.1 E F1(\(8\))A .159 -(to map upper case letters in the k)102 204.6 R -.15(ey)-.1 G 2.659(st).15 G -2.659(ol)253.552 204.6 S -.25(ow)263.991 204.6 S .159 -(er case; otherwise, aliases with upper case letters in their).25 F(names w)102 -216.6 Q(on')-.1 E 2.5(tm)-.18 G(atch incoming addresses.)163.38 216.6 Q -(Additional \215ags can be added after the colon e)127 232.8 Q(xactly lik)-.15 -E 2.5(ea)-.1 G F0(K)A F1(line \212 for e)2.5 E(xample:)-.15 E -.35(OA)142 249 S -(nis:-N mail.aliases@my).35 E(.nis.domain)-.65 E -(will search the appropriate NIS map and al)102 265.2 Q -.1(wa)-.1 G -(ys include null bytes in the k).1 E -.15(ey)-.1 G(.)-.5 E F0 2.5(2.3.1. Reb) -102 289.2 R(uilding the alias database)-.2 E F1 .542(The DB or DBM v)142 305.4 -R .542(ersion of the database may be reb)-.15 F .542(uilt e)-.2 F .542 -(xplicitly by e)-.15 F -.15(xe)-.15 G .542(cuting the com-).15 F(mand)117 317.4 -Q(ne)157 333.6 Q -.1(wa)-.25 G(liases).1 E(This is equi)117 349.8 Q -.25(va) --.25 G(lent to gi).25 E(ving)-.25 E F2(sendmail)2.5 E F1(the)2.5 E F0(\255bi) -2.5 E F1(\215ag:)2.5 E(/usr/sbin/sendmail \255bi)157 366 Q .26 -(If the \231D\232 option is speci\214ed in the con\214guration,)142 386.4 R F2 -(sendmail)2.759 E F1 .259(will reb)2.759 F .259(uild the alias database)-.2 F -1.92(automatically if possible when it is out of date.)117 398.4 R(Auto-reb) -6.921 E 1.921(uild can be dangerous on hea)-.2 F(vily)-.2 E 1.451 -(loaded machines with lar)117 410.4 R 1.451(ge alias \214les; if it might tak) --.18 F 3.951(em)-.1 G 1.45(ore than \214v)355.66 410.4 R 3.95(em)-.15 G 1.45 -(inutes to reb)420.13 410.4 R 1.45(uild the)-.2 F -(database, there is a chance that se)117 422.4 Q -.15(ve)-.25 G -(ral processes will start the reb).15 E(uild process simultaneously)-.2 E(.) --.65 E 1.77(If you ha)142 438.6 R 2.07 -.15(ve m)-.2 H 1.77 -(ultiple aliases databases speci\214ed, the).15 F F0(\255bi)4.27 E F1 1.77 -(\215ag reb)4.27 F 1.77(uilds all the database)-.2 F -(types it understands \(for e)117 450.6 Q(xample, it can reb)-.15 E -(uild dbm databases b)-.2 E(ut not nis databases\).)-.2 E F0 2.5(2.3.2. P)102 -474.6 R(otential pr)-.2 E(oblems)-.18 E F1 1.131 -(There are a number of problems that can occur with the alias database.)142 -490.8 R(The)6.13 E 3.63(ya)-.15 G 1.13(ll result)472.59 490.8 R 1.103(from a) -117 502.8 R F2(sendmail)3.603 E F1 1.103(process accessing the DBM v)3.603 F -1.103(ersion while it is only partially b)-.15 F 3.604(uilt. This)-.2 F(can) -3.604 E 1.249(happen under tw)117 514.8 R 3.749(oc)-.1 G 1.248 -(ircumstances: One process accesses the database while another process is) -199.237 514.8 R(reb)117 526.8 Q .518(uilding it, or the process reb)-.2 F .518 -(uilding the database dies \(due to being killed or a system crash\))-.2 F -(before completing the reb)117 538.8 Q(uild.)-.2 E .793(Sendmail has tw)142 555 -R 3.293(ot)-.1 G .792(echniques to try to relie)220.669 555 R 1.092 -.15(ve t) --.25 H .792(hese problems.).15 F .792(First, it ignores interrupts)5.792 F .045 -(while reb)117 567 R .045(uilding the database; this a)-.2 F -.2(vo)-.2 G .045 -(ids the problem of someone aborting the process lea).2 F .045(ving a)-.2 F -(partially reb)117 579 Q(uilt database.)-.2 E(Second, at the end of the reb)5 E -(uild it adds an alias of the form)-.2 E(@: @)157 595.2 Q .336 -(\(which is not normally le)117 611.4 R -.05(ga)-.15 G 2.836(l\). Before).05 F -F2(sendmail)2.836 E F1 .336(will access the database, it checks to insure that) -2.836 F(this entry e)117 625.4 Q(xists)-.15 E/F4 7/Times-Roman@0 SF(5)179.63 -621.4 Q F1(.)183.13 625.4 Q F0 2.5(2.3.3. List)102 649.4 R -.1(ow)2.5 G(ners).1 -E F1 .4(If an error occurs on sending to a certain address, say \231)142 665.6 -R F2(x)A F1<9a2c>A F2(sendmail)2.901 E F1 .401(will look for an alias)2.901 F -.418(of the form \231o)117 677.6 R(wner)-.25 E(-)-.2 E F2(x)A F1 2.918<9a74>C -2.918(or)212.632 677.6 S(ecei)223.88 677.6 Q .718 -.15(ve t)-.25 H .418 -(he errors.).15 F .417(This is typically useful for a mailing list where the) -5.418 F .32 LW 76 687.2 72 687.2 DL 80 687.2 76 687.2 DL 84 687.2 80 687.2 DL -88 687.2 84 687.2 DL 92 687.2 88 687.2 DL 96 687.2 92 687.2 DL 100 687.2 96 -687.2 DL 104 687.2 100 687.2 DL 108 687.2 104 687.2 DL 112 687.2 108 687.2 DL -116 687.2 112 687.2 DL 120 687.2 116 687.2 DL 124 687.2 120 687.2 DL 128 687.2 -124 687.2 DL 132 687.2 128 687.2 DL 136 687.2 132 687.2 DL 140 687.2 136 687.2 -DL 144 687.2 140 687.2 DL 148 687.2 144 687.2 DL 152 687.2 148 687.2 DL 156 -687.2 152 687.2 DL 160 687.2 156 687.2 DL 164 687.2 160 687.2 DL 168 687.2 164 -687.2 DL 172 687.2 168 687.2 DL 176 687.2 172 687.2 DL 180 687.2 176 687.2 DL -184 687.2 180 687.2 DL 188 687.2 184 687.2 DL 192 687.2 188 687.2 DL 196 687.2 -192 687.2 DL 200 687.2 196 687.2 DL 204 687.2 200 687.2 DL 208 687.2 204 687.2 -DL 212 687.2 208 687.2 DL 216 687.2 212 687.2 DL/F5 5/Times-Roman@0 SF(5)93.6 -697.6 Q/F6 8/Times-Roman@0 SF(The \231a\232 option is required in the con\214g\ -uration for this action to occur)3.2 I 4(.T)-.44 G -(his should normally be speci\214ed.)329.18 700.8 Q EP -%%Page: 15 10 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF(Sendmail Installation and Operation Guide)72 60 Q -(SMM:08-15)452.9 60 Q/F1 10/Times-Roman@0 SF 1.116 -(submitter of the list has no control o)117 96 R -.15(ve)-.15 G 3.617(rt).15 G -1.117(he maintenance of the list itself; in this case the list)288.4 96 R -(maintainer w)117 108 Q(ould be the o)-.1 E(wner of the list.)-.25 E -.15(Fo)5 -G 2.5(re).15 G(xample:)309.38 108 Q -(unix-wizards: eric@ucbarpa, wnj@monet, nosuchuser)157 124.2 Q(,)-.4 E -(sam@matisse)193 136.2 Q -.25(ow)157 148.2 S(ner).25 E -(-unix-wizards: eric@ucbarpa)-.2 E -.1(wo)117 164.4 S 1.959(uld cause \231eric\ -@ucbarpa\232 to get the error that will occur when someone sends to unix-).1 F -(wizards due to the inclusion of \231nosuchuser\232 on the list.)117 176.4 Q -.958(List o)142 192.6 R .958(wners also cause the en)-.25 F -.15(ve)-.4 G .959 -(lope sender address to be modi\214ed.).15 F .959(The contents of the)5.959 F --.25(ow)117 204.6 S .429(ner alias are used if the).25 F 2.929(yp)-.15 G .429 -(oint to a single user)236.364 204.6 R 2.928(,o)-.4 G .428 -(therwise the name of the alias itself is used.)326.436 204.6 R -.15(Fo)117 -216.6 S 2.5(rt).15 G(his reason, and to obe)136.02 216.6 Q 2.5(yI)-.15 G -(nternet con)233.63 216.6 Q -.15(ve)-.4 G(ntions, a typical scheme w).15 E -(ould be:)-.1 E 18.49(list: some,)157 232.8 R(set, of, addresses)2.5 E 22.28 -(list-request: list-admin-1,)157 244.8 R(list-admin-2, ...)2.5 E -.25(ow)157 -256.8 S(ner).25 E 26.62(-list: list-request)-.2 F F0 2.5(2.4. User)87 285 R -(Inf)2.5 E(ormation Database)-.25 E F1 1.059(If you ha)127 301.2 R 1.359 -.15 -(ve a ve)-.2 H 1.059(rsion of).15 F/F2 10/Times-Italic@0 SF(sendmail)3.559 E F1 -1.06(with the user information database compiled in, and you)3.559 F(ha)102 -313.2 Q 2.206 -.15(ve s)-.2 H 1.906(peci\214ed one or more databases using the) -.15 F F0(U)4.406 E F1 1.905(option, the databases will be searched for a)4.406 -F F2(user)102 325.2 Q F1(:maildrop entry)A 5(.I)-.65 G 2.5(ff)191.34 325.2 S -(ound, the mail will be sent to the speci\214ed address.)200.5 325.2 Q 1.288 -(If the \214rst tok)127 341.4 R 1.288(en passed to user part of the \231local\ -\232 mailer is an at sign, the at sign will be)-.1 F(stripped of)102 353.4 Q -2.5(fa)-.25 G(nd this step will be skipped.)155.07 353.4 Q F0 2.5(2.5. P)87 -377.4 R(er)-.2 E(-User F)-.37 E(orwarding \(.f)-.25 E(orward Files\))-.25 E F1 -.121(As an alternati)127 393.6 R .421 -.15(ve t)-.25 H 2.621(ot).15 G .121 -(he alias database, an)210.404 393.6 R 2.621(yu)-.15 G .12 -(ser may put a \214le with the name \231.forw)304.878 393.6 R .12 -(ard\232 in his)-.1 F .205(or her home directory)102 405.6 R 5.205(.I)-.65 G -2.705(ft)199.92 405.6 S .205(his \214le e)208.735 405.6 R(xists,)-.15 E F2 -(sendmail)2.705 E F1 .205 -(redirects mail for that user to the list of addresses)2.705 F .909 -(listed in the .forw)102 417.6 R .908(ard \214le.)-.1 F -.15(Fo)5.908 G 3.408 -(re).15 G .908 -(xample, if the home directory for user \231mckusick\232 has a .forw)233.98 -417.6 R(ard)-.1 E(\214le with contents:)102 429.6 Q(mckusick@ernie)142 445.8 Q -(kirk@calder)142 457.8 Q(then an)102 474 Q 2.5(ym)-.15 G(ail arri)146.29 474 Q -(ving for \231mckusick\232 will be redirected to the speci\214ed accounts.)-.25 -E(Actually)127 490.2 Q 3.374(,t)-.65 G .874 -(he con\214guration \214le de\214nes a sequence of \214lenames to check.) -169.444 490.2 R .875(By def)5.875 F .875(ault, this is)-.1 F .688(the user')102 -502.2 R 3.188(s.)-.55 G(forw)146.426 502.2 Q .688(ard \214le, b)-.1 F .687 -(ut can be de\214ned to be more generally using the)-.2 F F0(J)3.187 E F1 3.187 -(option. If)3.187 F .687(you change)3.187 F .393(this, you will ha)102 514.2 R -.693 -.15(ve t)-.2 H 2.893(oi).15 G .393 -(nform your user base of the change; .forw)193.064 514.2 R .393 -(ard is pretty well incorporated into)-.1 F(the collecti)102 526.2 Q .3 -.15 -(ve s)-.25 H(ubconscious.).15 E F0 2.5(2.6. Special)87 550.2 R(Header Lines)2.5 -E F1(Se)127 566.4 Q -.15(ve)-.25 G 1.898(ral header lines ha).15 F 2.197 -.15 -(ve s)-.2 H 1.897 -(pecial interpretations de\214ned by the con\214guration \214le.).15 F(Others) -6.897 E(ha)102 578.4 Q 1.205 -.15(ve i)-.2 H .905(nterpretations b).15 F .905 -(uilt into)-.2 F F2(sendmail)3.405 E F1 .906 -(that cannot be changed without changing the code.)3.405 F(These)5.906 E -.2 -(bu)102 590.4 S(iltins are described here.).2 E F0 2.5(2.6.1. Retur)102 614.4 R -(n-Receipt-T)-.15 E(o:)-.92 E F1 1.371 -(If this header is sent, a message will be sent to an)142 630.6 R 3.87(ys)-.15 -G 1.37(peci\214ed addresses when the \214nal)366.88 630.6 R(deli)117 642.6 Q --.15(ve)-.25 G .367(ry is complete, that is, when successfully deli).15 F -.15 -(ve)-.25 G .368(red to a mailer with the).15 F F0(l)2.868 E F1 .368 -(\215ag \(local deli)2.868 F(v-)-.25 E .024(ery\) set in the mailer descriptor) -117 656.6 R/F3 7/Times-Roman@0 SF(6)242.37 652.6 Q F1 5.023(.T)245.87 656.6 S -.023(his header can be disabled with the \231noreceipts\232 pri)259.503 656.6 R --.25(va)-.25 G .323 -.15(cy \215).25 H(ag.).15 E .32 LW 76 666.2 72 666.2 DL 80 -666.2 76 666.2 DL 84 666.2 80 666.2 DL 88 666.2 84 666.2 DL 92 666.2 88 666.2 -DL 96 666.2 92 666.2 DL 100 666.2 96 666.2 DL 104 666.2 100 666.2 DL 108 666.2 -104 666.2 DL 112 666.2 108 666.2 DL 116 666.2 112 666.2 DL 120 666.2 116 666.2 -DL 124 666.2 120 666.2 DL 128 666.2 124 666.2 DL 132 666.2 128 666.2 DL 136 -666.2 132 666.2 DL 140 666.2 136 666.2 DL 144 666.2 140 666.2 DL 148 666.2 144 -666.2 DL 152 666.2 148 666.2 DL 156 666.2 152 666.2 DL 160 666.2 156 666.2 DL -164 666.2 160 666.2 DL 168 666.2 164 666.2 DL 172 666.2 168 666.2 DL 176 666.2 -172 666.2 DL 180 666.2 176 666.2 DL 184 666.2 180 666.2 DL 188 666.2 184 666.2 -DL 192 666.2 188 666.2 DL 196 666.2 192 666.2 DL 200 666.2 196 666.2 DL 204 -666.2 200 666.2 DL 208 666.2 204 666.2 DL 212 666.2 208 666.2 DL 216 666.2 212 -666.2 DL/F4 5/Times-Roman@0 SF(6)93.6 676.6 Q/F5 8/Times-Roman@0 SF .127 -(Some sites disable this header)3.2 J 2.127(,a)-.32 G .127(nd other \(non-) -199.959 679.8 R/F6 8/Times-Italic@0 SF(sendmail)A F5 2.127(\)s)C .127 -(ystems do not implement it.)282.772 679.8 R .127(Do not assume that a f)4.127 -F .126(ailure to get a re-)-.08 F .317 -(turn receipt means that the mail did not arri)72 689.4 R -.12(ve)-.2 G 4.317 -(.A).12 G .318(lso, do not assume that getting a return receipt means that the\ - mail has been read; it)232.509 689.4 R -(just means that the message has been deli)72 699 Q -.12(ve)-.2 G -(red to the recipient').12 E 2(sm)-.44 G(ailbox.)285.648 699 Q EP -%%Page: 16 11 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF 193.36(SMM:08-16 Sendmail)72 60 R -(Installation and Operation Guide)2.5 E 2.5(2.6.2. Err)102 96 R(ors-T)-.18 E -(o:)-.92 E/F1 10/Times-Roman@0 SF .22(If errors occur an)142 112.2 R .22 -(ywhere during processing, this header will cause error messages to go to)-.15 -F(the listed addresses.)117 124.2 Q(This is intended for mailing lists.)5 E -.385(The Errors-T)142 140.4 R .385(o: header w)-.8 F .384 -(as created in the bad old days when UUCP didn')-.1 F 2.884(tu)-.18 G .384 -(nderstand the)450.016 140.4 R .889(distinction between an en)117 152.4 R -.15 -(ve)-.4 G .889(lope and a header; this w).15 F .889(as a hack to pro)-.1 F .89 -(vide what should no)-.15 F 3.39(wb)-.25 G(e)499.56 152.4 Q(passed as the en) -117 164.4 Q -.15(ve)-.4 G(lope sender address.).15 E(It should go a)5 E -.1(wa) --.15 G 3.8 -.65(y. I).1 H 2.5(ti).65 G 2.5(so)365.22 164.4 S(nly used if the) -376.61 164.4 Q F0(l)2.5 E F1(option is set.)2.5 E F0 2.5(2.6.3. A)102 188.4 R -(ppar)-.25 E(ently-T)-.18 E(o:)-.92 E F1 .22 -(If a message comes in with no recipients listed in the message \(in a T)142 -204.6 R .22(o:, Cc:, or Bcc: line\))-.8 F(then)117 216.6 Q/F2 10/Times-Italic@0 -SF(sendmail)2.789 E F1 .289(will add an \231)2.789 F(Apparently-T)-.8 E .289 -(o:\232 header line for an)-.8 F 2.789(yr)-.15 G .29(ecipients it is a)378.08 -216.6 R -.1(wa)-.15 G .29(re of.).1 F .29(This is)5.29 F -(not put in as a standard recipient line to w)117 228.6 Q(arn an)-.1 E 2.5(yr) --.15 G(ecipients that the list is not complete.)319.77 228.6 Q -(At least one recipient line is required under RFC 822.)142 244.8 Q F0 2.5 -(2.7. IDENT)87 268.8 R(Pr)2.5 E(otocol Support)-.18 E F2(Sendmail)127 285 Q F1 -1.835(supports the IDENT protocol as de\214ned in RFC 1413.)4.335 F 1.835 -(Although this enhances)6.835 F .289 -(identi\214cation of the author of an email message by doing a `)102 297 R .29 -(`call back')-.74 F 2.79('t)-.74 G 2.79(ot)396.17 297 S .29 -(he originating system to)406.74 297 R .469(include the o)102 309 R .469(wner \ -of a particular TCP connection in the audit trail it is in no sense perfect; a\ - deter)-.25 F(-)-.2 E 1.293(mined for)102 321 R 1.294 -(ger can easily spoof the IDENT protocol.)-.18 F 1.294(The follo)6.294 F 1.294 -(wing description is e)-.25 F 1.294(xcerpted from)-.15 F(RFC 1413:)102 333 Q -2.5(6. Security)127 349.2 R(Considerations)2.5 E .006 -(The information returned by this protocol is at most as trustw)127 365.4 R -(orth)-.1 E 2.505(ya)-.05 G 2.505(st)400.505 365.4 S .005(he host pro)409.68 -365.4 R .005(viding it OR)-.15 F .273(the or)127 377.4 R -.05(ga)-.18 G .273 -(nization operating the host.).05 F -.15(Fo)5.273 G 2.773(re).15 G .274 -(xample, a PC in an open lab has fe)295.308 377.4 R 2.774(wi)-.25 G 2.774(fa) -448.612 377.4 S .574 -.15(ny c)459.156 377.4 T(ontrols).15 E .987(on it to pre) -127 389.4 R -.15(ve)-.25 G .986(nt a user from ha).15 F .986 -(ving this protocol return an)-.2 F 3.486(yi)-.15 G .986 -(denti\214er the user w)378.056 389.4 R 3.486(ants. Lik)-.1 F(e-)-.1 E 1.441(w\ -ise, if the host has been compromised the information returned may be complete\ -ly erro-)127 401.4 R(neous and misleading.)127 413.4 Q .521(The Identi\214cati\ -on Protocol is not intended as an authorization or access control protocol.)127 -429.6 R(At)5.52 E 1.036(best, it pro)127 441.6 R 1.037 -(vides some additional auditing information with respect to TCP connections.) --.15 F(At)6.037 E -.1(wo)127 453.6 S(rst, it can pro).1 E -(vide misleading, incorrect, or maliciously incorrect information.)-.15 E 1.006 -(The use of the information returned by this protocol for other than auditing \ -is strongly dis-)127 469.8 R 2.697(couraged. Speci\214cally)127 481.8 R 2.697 -(,u)-.65 G .197(sing Identi\214cation Protocol information to mak)228.114 481.8 -R 2.697(ea)-.1 G .197(ccess control deci-)429.186 481.8 R .514(sions - either \ -as the primary method \(i.e., no other checks\) or as an adjunct to other meth\ -ods)127 493.8 R(may result in a weak)127 505.8 Q(ening of normal host security) --.1 E(.)-.65 E 1.778(An Identi\214cation serv)127 522 R 1.778(er may re)-.15 F --.15(ve)-.25 G 1.778 -(al information about users, entities, objects or processes).15 F .337 -(which might normally be considered pri)127 534 R -.25(va)-.25 G 2.836(te. An) -.25 F .336(Identi\214cation serv)2.836 F .336(er pro)-.15 F .336 -(vides service which)-.15 F .806 -(is a rough analog of the CallerID services pro)127 546 R .806 -(vided by some phone companies and man)-.15 F 3.306(yo)-.15 G(f)500.67 546 Q -1.398(the same pri)127 558 R -.25(va)-.25 G 1.698 -.15(cy c).25 H 1.398 -(onsiderations and ar).15 F 1.398 -(guments that apply to the CallerID service apply to)-.18 F 3.545 -(Identi\214cation. If)127 570 R 1.045(you w)3.545 F(ouldn')-.1 E 3.545(tr)-.18 -G 1.045(un a "\214nger" serv)260.33 570 R 1.046(er due to pri)-.15 F -.25(va) --.25 G 1.346 -.15(cy c).25 H 1.046(onsiderations you may).15 F(not w)127 582 Q -(ant to run this protocol.)-.1 E F0 2.5(3. ARGUMENTS)72 606 R F1 .018 -(The complete list of ar)112 622.2 R .018(guments to)-.18 F F2(sendmail)2.517 E -F1 .017(is described in detail in Appendix A.)2.517 F .017(Some important)5.017 -F(ar)87 634.2 Q(guments are described here.)-.18 E F0 2.5(3.1. Queue)87 658.2 R -(Inter)2.5 E -.1(va)-.1 G(l).1 E F1 .455(The amount of time between forking a \ -process to run through the queue is de\214ned by the)127 674.4 R F0<ad71>2.956 -E F1 2.706(\215ag. If)102 686.4 R .206(you run in mode)2.706 F F0(f)2.706 E F1 -(or)2.706 E F0(a)2.706 E F1 .206(this can be relati)2.706 F -.15(ve)-.25 G .206 -(ly lar).15 F .206(ge, since it will only be rele)-.18 F -.25(va)-.25 G .205 -(nt when a host).25 F .07(that w)102 698.4 R .07(as do)-.1 F .07 -(wn comes back up.)-.25 F .07(If you run in)5.07 F F0(q)2.57 E F1 .07 -(mode it should be relati)2.57 F -.15(ve)-.25 G .07 -(ly short, since it de\214nes the).15 F -(maximum amount of time that a message may sit in the queue.)102 710.4 Q EP -%%Page: 17 12 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF(Sendmail Installation and Operation Guide)72 60 Q -(SMM:08-17)452.9 60 Q/F1 10/Times-Roman@0 SF 1.336 -(RFC 1123 section 5.3.1.1 says that this v)127 96 R 1.335 -(alue should be at least 30 minutes \(although that)-.25 F(probably doesn')102 -108 Q 2.5(tm)-.18 G(ak)179.59 108 Q 2.5(es)-.1 G(ense if you use `)199.76 108 Q -(`queue-only')-.74 E 2.5('m)-.74 G(ode\).)329.08 108 Q F0 2.5(3.2. Daemon)87 -132 R(Mode)2.5 E F1 .084(If you allo)127 148.2 R 2.584(wi)-.25 G .084 -(ncoming mail o)181.162 148.2 R -.15(ve)-.15 G 2.585(ra).15 G 2.585(nI)263.605 -148.2 S .085(PC connection, you should ha)274.52 148.2 R .385 -.15(ve a d)-.2 H -.085(aemon running.).15 F(This)5.085 E .07(should be set by your)102 160.2 R/F2 -10/Times-Italic@0 SF(/etc/r)2.57 E(c)-.37 E F1 .07(\214le using the)2.57 F F0 -(\255bd)2.57 E F1 2.569(\215ag. The)2.57 F F0(\255bd)2.569 E F1 .069 -(\215ag and the)2.569 F F0<ad71>2.569 E F1 .069(\215ag may be combined)2.569 F -(in one call:)102 172.2 Q(/usr/sbin/sendmail \255bd \255q30m)142 188.4 Q F0 2.5 -(3.3. F)87 216.6 R(or)-.25 E(cing the Queue)-.18 E F1 .04(In some cases you ma\ -y \214nd that the queue has gotten clogged for some reason.)127 232.8 R -1.1 -(Yo)5.04 G 2.54(uc)1.1 G .04(an force)471.48 232.8 R 3.185(aq)102 244.8 S .685 -(ueue run using the)114.625 244.8 R F0<ad71>3.184 E F1 .684(\215ag \(with no v) -3.184 F 3.184(alue\). It)-.25 F .684(is entertaining to use the)3.184 F F0 -<ad76>3.184 E F1 .684(\215ag \(v)3.184 F .684(erbose\) when)-.15 F -(this is done to w)102 256.8 Q(atch what happens:)-.1 E -(/usr/sbin/sendmail \255q \255v)142 273 Q -1.1(Yo)127 293.4 S 4.004(uc)1.1 G -1.504(an also limit the jobs to those with a particular queue identi\214er) -151.564 293.4 R 4.004(,s)-.4 G(ender)428.362 293.4 Q 4.004(,o)-.4 G 4.004(rr) -461.676 293.4 S(ecipient)472.34 293.4 Q .687 -(using one of the queue modi\214ers.)102 305.4 R -.15(Fo)5.687 G 3.187(re).15 G -.687(xample, \231\255qRberk)265.659 305.4 R(ele)-.1 E .686 -(y\232 restricts the queue run to jobs that)-.15 F(ha)102 317.4 Q .525 -.15 -(ve t)-.2 H .225(he string \231berk).15 F(ele)-.1 E .225(y\232 some)-.15 F .225 -(where in one of the recipient addresses.)-.25 F(Similarly)5.226 E 2.726<2c99> --.65 G .226(\255qSstring\232 lim-)441.184 317.4 R(its the run to particular se\ -nders and \231\255qIstring\232 limits it to particular identi\214ers.)102 329.4 -Q F0 2.5(3.4. Deb)87 353.4 R(ugging)-.2 E F1 1.365(There are a f)127 369.6 R -1.365(airly lar)-.1 F 1.365(ge number of deb)-.18 F 1.365(ug \215ags b)-.2 F -1.365(uilt into)-.2 F F2(sendmail)3.865 E F1 6.365(.E)C 1.365(ach deb)417.65 -369.6 R 1.365(ug \215ag has a)-.2 F 1.116(number and a le)102 381.6 R -.15(ve) --.25 G 1.116(l, where higher le).15 F -.15(ve)-.25 G 1.116 -(ls means to print out more information.).15 F 1.116(The con)6.116 F -.15(ve) --.4 G 1.116(ntion is).15 F .294(that le)102 393.6 R -.15(ve)-.25 G .294 -(ls greater than nine are \231absurd,).15 F 2.794<9a69>-.7 G .294(.e., the) -274.018 393.6 R 2.794(yp)-.15 G .293(rint out so much information that you w) -313.616 393.6 R(ouldn')-.1 E(t)-.18 E .691(normally w)102 405.6 R .692 -(ant to see them e)-.1 F .692(xcept for deb)-.15 F .692 -(ugging that particular piece of code.)-.2 F(Deb)5.692 E .692 -(ug \215ags are set)-.2 F(using the)102 417.6 Q F0<ad64>2.5 E F1 -(option; the syntax is:)2.5 E(deb)142 433.8 Q(ug-\215ag:)-.2 E F0<ad64>200.13 -433.8 Q F1(deb)2.5 E(ug-list)-.2 E(deb)142 445.8 Q 13.05(ug-list: deb)-.2 F -(ug-option [ , deb)-.2 E(ug-option ])-.2 E(deb)142 457.8 Q -.28(ug-option: deb) --.2 F(ug-range [ . deb)-.2 E(ug-le)-.2 E -.15(ve)-.25 G 2.5(l]).15 G(deb)142 -469.8 Q 3.07(ug-range: inte)-.2 F(ger | inte)-.15 E(ger \255 inte)-.15 E(ger) --.15 E(deb)142 481.8 Q(ug-le)-.2 E -.15(ve)-.25 G 6.24(l: inte).15 F(ger)-.15 E -(where spaces are for reading ease only)102 498 Q 5(.F)-.65 G(or e)268.64 498 Q -(xample,)-.15 E 34.99(\255d12 Set)142 514.2 R(\215ag 12 to le)2.5 E -.15(ve) --.25 G 2.5(l1).15 G 27.49(\255d12.3 Set)142 526.2 R(\215ag 12 to le)2.5 E -.15 -(ve)-.25 G 2.5(l3).15 G 26.66(\255d3-17 Set)142 538.2 R -(\215ags 3 through 17 to le)2.5 E -.15(ve)-.25 G 2.5(l1).15 G 19.16 -(\255d3-17.4 Set)142 550.2 R(\215ags 3 through 17 to le)2.5 E -.15(ve)-.25 G -2.5(l4).15 G -.15(Fo)102 566.4 S 4.066(rac).15 G 1.566(omplete list of the a) -132.752 566.4 R -.25(va)-.2 G 1.565(ilable deb).25 F 1.565 -(ug \215ags you will ha)-.2 F 1.865 -.15(ve t)-.2 H 4.065(ol).15 G 1.565 -(ook at the code \(the)380.9 566.4 R 4.065(ya)-.15 G 1.565(re too)479.385 566.4 -R(dynamic to k)102 578.4 Q(eep this documentation up to date\).)-.1 E F0 2.5 -(3.5. T)87 602.4 R(rying a Differ)-.74 E(ent Con\214guration File)-.18 E F1 -(An alternati)127 618.6 Q .3 -.15(ve c)-.25 H -(on\214guration \214le can be speci\214ed using the).15 E F0<ad43>2.5 E F1 -(\215ag; for e)2.5 E(xample,)-.15 E(/usr/sbin/sendmail \255Ctest.cf)142 634.8 Q -.428(uses the con\214guration \214le)102 651 R F2(test.cf)2.928 E F1 .428 -(instead of the def)2.928 F(ault)-.1 E F2(/etc/sendmail.cf)2.928 E(.)-.15 E F1 -.428(If the)5.428 F F0<ad43>2.928 E F1 .429(\215ag has no v)2.928 F(alue)-.25 E -(it def)102 663 Q(aults to)-.1 E F2(sendmail.cf)2.5 E F1 -(in the current directory)2.5 E(.)-.65 E F0 2.5(3.6. Changing)87 687 R(the V) -2.5 E(alues of Options)-.92 E F1(Options can be o)127 703.2 Q -.15(ve)-.15 G -(rridden using the).15 E F0<ad6f>2.5 E F1 2.5(\215ag. F)2.5 F(or e)-.15 E -(xample,)-.15 E EP -%%Page: 18 13 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF 193.36(SMM:08-18 Sendmail)72 60 R -(Installation and Operation Guide)2.5 E/F1 10/Times-Roman@0 SF -(/usr/sbin/sendmail \255oT2m)142 96 Q(sets the)102 112.2 Q F0(T)2.5 E F1 -(\(timeout\) option to tw)2.5 E 2.5(om)-.1 G(inutes for this run only)246.63 -112.2 Q(.)-.65 E .182(Some options ha)127 128.4 R .482 -.15(ve s)-.2 H .182 -(ecurity implications.).15 F .182(Sendmail allo)5.182 F .181 -(ws you to set these, b)-.25 F .181(ut refuses to run)-.2 F(as root thereafter) -102 140.4 Q(.)-.55 E F0 2.5(3.7. Logging)87 164.4 R -.74(Tr)2.5 G(af\214c).74 E -F1(Man)127 180.6 Q 3.254(yS)-.15 G .754 -(MTP implementations do not fully implement the protocol.)158.994 180.6 R -.15 -(Fo)5.754 G 3.254(re).15 G .755(xample, some per)428.54 180.6 R(-)-.2 E 1.178(\ -sonal computer based SMTPs do not understand continuation lines in reply codes\ -.)102 192.6 R 1.177(These can be)6.178 F -.15(ve)102 204.6 S .13 -(ry hard to trace.).15 F .13(If you suspect such a problem, you can set traf) -5.13 F .13(\214c logging using the)-.25 F F0<ad58>2.63 E F1 2.63(\215ag. F)2.63 -F(or)-.15 E -.15(ex)102 216.6 S(ample,).15 E -(/usr/sbin/sendmail \255X /tmp/traf)142 232.8 Q(\214c -bd)-.25 E -(will log all traf)102 249 Q(\214c in the \214le)-.25 E/F2 10/Times-Italic@0 SF -(/tmp/tr)2.5 E(af)-.15 E<8c63>-.18 E F1(.)A .128(This logs a lot of data v)127 -265.2 R .128(ery quickly and should ne)-.15 F -.15(ve)-.25 G 2.628(rb).15 G -2.628(eu)345.89 265.2 S .128(sed during normal operations.)357.958 265.2 R -(After)5.128 E 1.326(starting up such a daemon, force the errant implementatio\ -n to send a message to your host.)102 277.2 R(All)6.327 E .505(message traf)102 -289.2 R .505(\214c in and out of)-.25 F F2(sendmail)3.005 E F1 3.004(,i)C .504 -(ncluding the incoming SMTP traf)265.264 289.2 R .504 -(\214c, will be logged in this)-.25 F(\214le.)102 301.2 Q F0 2.5(3.8. Dumping) -87 325.2 R(State)2.5 E F1 -1.1(Yo)127 341.4 S 2.563(uc)1.1 G .063(an ask) -150.123 341.4 R F2(sendmail)2.563 E F1 .064 -(to log a dump of the open \214les and the connection cache by sending it a) -2.563 F/F3 9/Times-Roman@0 SF(SIGUSR1)102 353.4 Q F1 2.5(signal. The)2.5 F -(results are logged at)2.5 E F3(LOG_DEB)2.5 E(UG)-.09 E F1(priority)2.5 E(.) --.65 E F0 2.5(4. TUNING)72 377.4 R F1 1.922 -(There are a number of con\214guration parameters you may w)112 393.6 R 1.922 -(ant to change, depending on the)-.1 F .366(requirements of your site.)87 405.6 -R .367(Most of these are set using an option in the con\214guration \214le.) -5.366 F -.15(Fo)5.367 G 2.867(re).15 G(xample,)472.06 405.6 Q(the line \231O)87 -417.6 Q(T5d\232 sets option \231T\232 to the v)-.4 E(alue \2315d\232 \(\214v) --.25 E 2.5(ed)-.15 G(ays\).)312.55 417.6 Q .735(Most of these options ha)112 -433.8 R 1.035 -.15(ve a)-.2 H .735(ppropriate def).15 F .735 -(aults for most sites.)-.1 F(Ho)5.735 E(we)-.25 E -.15(ve)-.25 G 1.535 -.4 -(r, s).15 H .735(ites ha).4 F .735(ving v)-.2 F .735(ery high)-.15 F .045 -(mail loads may \214nd the)87 445.8 R 2.545(yn)-.15 G .046 -(eed to tune them as appropriate for their mail load.)193.465 445.8 R .046 -(In particular)5.046 F 2.546(,s)-.4 G .046(ites e)459.394 445.8 R(xperi-)-.15 E -1.088(encing a lar)87 457.8 R 1.088(ge number of small messages, man)-.18 F -3.588(yo)-.15 G 3.587(fw)294.504 457.8 S 1.087(hich are deli)308.641 457.8 R --.15(ve)-.25 G 1.087(red to man).15 F 3.587(yr)-.15 G 1.087 -(ecipients, may \214nd)425.996 457.8 R(that the)87 469.8 Q 2.5(yn)-.15 G -(eed to adjust the parameters dealing with queue priorities.)129.07 469.8 Q F0 -2.5(4.1. T)87 493.8 R(imeouts)-.18 E F1 .582(All time interv)127 510 R .583 -(als are set using a scaled syntax.)-.25 F -.15(Fo)5.583 G 3.083(re).15 G .583 -(xample, \23110m\232 represents ten minutes,)346.138 510 R -(whereas \2312h30m\232 represents tw)102 522 Q 2.5(oa)-.1 G(nd a half hours.) -241.3 522 Q(The full set of scales is:)5 E 16.11(ss)142 538.2 S(econds)165.89 -538.2 Q 12.22(mm)142 550.2 S(inutes)169.78 550.2 Q 15(hh)142 562.2 S(ours)167 -562.2 Q 15(dd)142 574.2 S(ays)167 574.2 Q 12.78(ww)142 586.2 S(eeks)169.22 -586.2 Q F0 2.5(4.1.1. Queue)102 614.4 R(inter)2.5 E -.1(va)-.1 G(l).1 E F1 .18 -(The ar)142 630.6 R .18(gument to the)-.18 F F0<ad71>2.68 E F1 .18 -(\215ag speci\214es ho)2.68 F 2.68(wo)-.25 G .18 -(ften a sub-daemon will run the queue.)319.25 630.6 R .18(This is)5.18 F .967 -(typically set to between \214fteen minutes and one hour)117 642.6 R 5.968(.R) --.55 G .968(FC 1123 section 5.3.1.1 recommends)350.968 642.6 R -(that this be at least 30 minutes.)117 654.6 Q F0 2.5(4.1.2. Read)102 678.6 R -(timeouts)2.5 E F1 .51(It is possible to time out when reading the standard in\ -put or when reading from a remote)142 694.8 R .324(SMTP serv)117 706.8 R(er) --.15 E 5.324(.T)-.55 G .324(hese timeouts are set using the)183.608 706.8 R F0 -(r)2.824 E F1 .324(option in the con\214guration \214le.)2.824 F .324(The ar) -5.324 F(gument)-.18 E 2.767(is a list of)117 718.8 R F2 -.1(ke)5.266 G(ywor)-.2 -E(d=value)-.37 E F1 5.266(pairs. The)5.266 F 2.766(recognized k)5.266 F -.15 -(ey)-.1 G -.1(wo).15 G 2.766(rds, their def).1 F 2.766(ault v)-.1 F 2.766 -(alues, and the)-.25 F EP -%%Page: 19 14 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF(Sendmail Installation and Operation Guide)72 60 Q -(SMM:08-19)452.9 60 Q/F1 10/Times-Roman@0 SF(minimum v)117 96 Q(alues allo)-.25 -E(wed by RFC 1123 section 5.3.2 are:)-.25 E 46.16(initial The)117 112.2 R -.1 -(wa)2.5 G(it for the initial 220 greeting message [5m, 5m].).1 E 52.28 -(helo The)117 128.4 R -.1(wa)4.226 G 1.727 -(it for a reply from a HELO or EHLO command [5m, unspeci\214ed].).1 F .1 -(This may require a host name lookup, so \214v)189 140.4 R 2.6(em)-.15 G .1 -(inutes is probably a reasonable)380.29 140.4 R(minimum.)189 152.4 Q 46.72 -(mail\207 The)117 168.6 R -.1(wa)2.5 G -(it for a reply from a MAIL command [10m, 5m].).1 E 48.95(rcpt\207 The)117 -184.8 R -.1(wa)3.481 G .981(it for a reply from a RCPT command [1h, 5m].).1 F -.982(This should be long)5.982 F -(because it could be pointing at a list that tak)189 196.8 Q -(es a long time to e)-.1 E(xpand.)-.15 E 34.5(datainit\207 The)117 213 R -.1 -(wa)2.5 G(it for a reply from a D).1 E -1.21 -1.11(AT A)-.4 H -(command [5m, 2m].)3.61 E 25.62(datablock\207 The)117 229.2 R -.1(wa)2.696 G -.196(it for reading a data block \(that is, the body of the message\).).1 F -.196([1h, 3m].)5.196 F .621 -(This should be long because it also applies to programs piping input to)189 -241.2 R/F2 10/Times-Italic@0 SF(send-)3.121 E(mail)189 253.2 Q F1(which ha)2.5 -E .3 -.15(ve n)-.2 H 2.5(og).15 G(uarantee of promptness.)274.75 253.2 Q 30.06 -(data\214nal\207 The)117 269.4 R -.1(wa)2.806 G .306 -(it for a reply from the dot terminating a message.).1 F .306([1h, 10m].)5.306 -F .306(If this is)5.306 F .883 -(shorter than the time actually needed for the recei)189 281.4 R -.15(ve)-.25 G -3.384(rt).15 G 3.384(od)412.878 281.4 S(eli)426.262 281.4 Q -.15(ve)-.25 G -3.384(rt).15 G .884(he message,)454.796 281.4 R(duplicates will be generated.) -189 293.4 Q(This is discussed in RFC 1047.)5 E 55.06(rset The)117 309.6 R -.1 -(wa)2.5 G(it for a reply from a RSET command [5m, unspeci\214ed].).1 E 53.94 -(quit The)117 325.8 R -.1(wa)2.5 G(it for a reply from a Q).1 E -(UIT command [2m, unspeci\214ed].)-.1 E 50.61(misc The)117 342 R -.1(wa)2.761 G -.261(it for a reply from miscellaneous \(b).1 F .261 -(ut short\) commands such as NOOP)-.2 F(\(no-operation\) and VERB \(go into v) -189 354 Q(erbose mode\).)-.15 E([2m, unspeci\214ed].)5 E 25.06(command\207 In) -117 370.2 R(serv)2.5 E(er SMTP)-.15 E 2.5(,t)-1.11 G(he time to w)259.4 370.2 Q -(ait for another command.)-.1 E([1h, 5m].)5 E 49.5(ident The)117 386.4 R -(timeout w)2.5 E(aiting for a reply to an IDENT query [30s, unspeci\214ed].)-.1 -E -.15(Fo)117 402.6 S 3.633(rc).15 G 1.134 -(ompatibility with old con\214guration \214les, if no `)138.813 402.6 R(`k)-.74 -E -.15(ey)-.1 G -.1(wo).15 G(rd=').1 E 3.634('i)-.74 G 3.634(ss)390.854 402.6 S -1.134(peci\214ed, all the timeouts)402.268 402.6 R(mark)117 414.6 Q -(ed with \207 are set to the indicated v)-.1 E(alue.)-.25 E(Man)142 430.8 Q -2.501(yo)-.15 G 2.501(ft)172.681 430.8 S .001(he RFC 1123 minimum v)181.292 -430.8 R .001(alues may well be too short.)-.25 F F2(Sendmail)5 E F1 -.1(wa)2.5 -G 2.5(sd).1 G(esigned to)463.17 430.8 Q .066 -(the RFC 822 protocols, which did not specify read timeouts; hence,)117 442.8 R -F2(sendmail)2.567 E F1 .067(does not guarantee)2.567 F .438 -(to reply to messages promptly)117 454.8 R 5.438(.I)-.65 G 2.938(np)249.92 -454.8 S(articular)262.858 454.8 Q 2.938(,a\231)-.4 G .438 -(RCPT\232 command specifying a mailing list will)313.034 454.8 R -.15(ex)117 -468.8 S .205(pand and v).15 F .205(erify the entire list; a lar)-.15 F .205 -(ge list on a slo)-.18 F 2.705(ws)-.25 G .205(ystem may tak)339.81 468.8 R -2.705(em)-.1 G .205(ore than \214v)413.375 468.8 R 2.705(em)-.15 G(inutes) -474.11 468.8 Q/F3 7/Times-Roman@0 SF(7)498 464.8 Q F1(.)501.5 468.8 Q 3.036(Ir) -117 480.8 S .536(ecommend a one hour timeout \212 since this f)126.696 480.8 R -.536(ailure is rare, a long timeout is not onerous and)-.1 F -(may ultimately help reduce netw)117 492.8 Q(ork load.)-.1 E -.15(Fo)142 509 S -2.5(re).15 G(xample, the line:)162.53 509 Q(Orcommand=25m,datablock=3h)157 -525.2 Q .344(sets the serv)117 541.4 R .344(er SMTP command timeout to 25 minu\ -tes and the input data block timeout to three)-.15 F(hours.)117 553.4 Q F0 2.5 -(4.1.3. Message)102 577.4 R(timeouts)2.5 E F1 .237 -(After sitting in the queue for a fe)142 593.6 R 2.737(wd)-.25 G .237 -(ays, a message will time out.)289.726 593.6 R .238(This is to insure that at) -5.238 F .283(least the sender is a)117 605.6 R -.1(wa)-.15 G .282 -(re of the inability to send a message.).1 F .282 -(The timeout is typically set to three)5.282 F 2.5(days. This)117 617.6 R -(timeout is set using the)2.5 E F0(T)2.5 E F1 -(option in the con\214guration \214le.)2.5 E .413(The time of submission is se\ -t in the queue, rather than the amount of time left until time-)142 633.8 R -3.263(out. As)117 645.8 R 3.263(ar)3.263 G .763 -(esult, you can \215ush messages that ha)163.449 645.8 R 1.062 -.15(ve b)-.2 H -.762(een hanging for a short period by running).15 F -(the queue with a short message timeout.)117 657.8 Q -.15(Fo)5 G 2.5(re).15 G -(xample,)302.79 657.8 Q .32 LW 76 669.2 72 669.2 DL 80 669.2 76 669.2 DL 84 -669.2 80 669.2 DL 88 669.2 84 669.2 DL 92 669.2 88 669.2 DL 96 669.2 92 669.2 -DL 100 669.2 96 669.2 DL 104 669.2 100 669.2 DL 108 669.2 104 669.2 DL 112 -669.2 108 669.2 DL 116 669.2 112 669.2 DL 120 669.2 116 669.2 DL 124 669.2 120 -669.2 DL 128 669.2 124 669.2 DL 132 669.2 128 669.2 DL 136 669.2 132 669.2 DL -140 669.2 136 669.2 DL 144 669.2 140 669.2 DL 148 669.2 144 669.2 DL 152 669.2 -148 669.2 DL 156 669.2 152 669.2 DL 160 669.2 156 669.2 DL 164 669.2 160 669.2 -DL 168 669.2 164 669.2 DL 172 669.2 168 669.2 DL 176 669.2 172 669.2 DL 180 -669.2 176 669.2 DL 184 669.2 180 669.2 DL 188 669.2 184 669.2 DL 192 669.2 188 -669.2 DL 196 669.2 192 669.2 DL 200 669.2 196 669.2 DL 204 669.2 200 669.2 DL -208 669.2 204 669.2 DL 212 669.2 208 669.2 DL 216 669.2 212 669.2 DL/F4 5 -/Times-Roman@0 SF(7)93.6 679.6 Q/F5 8/Times-Roman@0 SF .344(This v)3.2 J .344 -(eri\214cation includes looking up e)-.12 F -.12(ve)-.2 G .344 -(ry address with the name serv).12 F .344(er; this in)-.12 F -.16(vo)-.32 G(lv) -.16 E .344(es netw)-.12 F .343(ork delays, and can in some cases)-.08 F -(can be considerable.)72 692.4 Q EP -%%Page: 20 15 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF 193.36(SMM:08-20 Sendmail)72 60 R -(Installation and Operation Guide)2.5 E/F1 10/Times-Roman@0 SF -(/usr/sbin/sendmail \255oT1d \255q)157 96 Q(will run the queue and \215ush an) -117 112.2 Q(ything that is one day old.)-.15 E 1.077 -(Since this option is global, and since you can not)142 128.4 R/F2 10 -/Times-Italic@0 SF 3.577(ap)3.577 G(riori)364.395 128.4 Q F1(kno)3.577 E 3.577 -(wh)-.25 G 1.577 -.25(ow l)416.859 128.4 T 1.077(ong another host).25 F .476 -(outside your domain will be do)117 140.4 R .475(wn, a \214v)-.25 F 2.975(ed) --.15 G .475(ay timeout is recommended.)291.785 140.4 R .475(This allo)5.475 F -.475(ws a recipient)-.25 F 1.579(to \214x the problem e)117 152.4 R -.15(ve) --.25 G 4.079(ni).15 G 4.079(fi)222.545 152.4 S 4.079(to)232.734 152.4 S 1.579 -(ccurs at the be)244.593 152.4 R 1.58(ginning of a long week)-.15 F 4.08 -(end. RFC)-.1 F 1.58(1123 section)4.08 F -(5.3.1.1 says that this parameter should be `)117 164.4 Q -(`at least 4\2555 days')-.74 E('.)-.74 E(The)142 180.6 Q F0(T)2.711 E F1 .211 -(option can also tak)2.711 F 2.711(eas)-.1 G .21 -(econd timeout indicating a time after which a w)263.637 180.6 R .21 -(arning mes-)-.1 F(sage should be sent; the tw)117 192.6 Q 2.5(ot)-.1 G -(imeouts are separated by a slash.)234.67 192.6 Q -.15(Fo)5 G 2.5(re).15 G -(xample, the v)391.28 192.6 Q(alue)-.25 E(5d/4h)157 208.8 Q .971 -(causes email to f)117 225 R .971(ail after \214v)-.1 F 3.471(ed)-.15 G .971 -(ays, b)245.326 225 R .971(ut a w)-.2 F .971 -(arning message will be sent after four hours.)-.1 F(This)5.972 E -(should be lar)117 237 Q(ge enough that the message will ha)-.18 E .3 -.15 -(ve b)-.2 H(een tried se).15 E -.15(ve)-.25 G(ral times.).15 E F0 2.5(4.2. F)87 -261 R(orking During Queue Runs)-.25 E F1 .303(By setting the)127 277.2 R F0(Y) -2.802 E F1(option,)2.802 E F2(sendmail)2.802 E F1 .302 -(will fork before each indi)2.802 F .302(vidual message while running the)-.25 -F 2.513(queue. This)102 289.2 R .013(will pre)2.513 F -.15(ve)-.25 G(nt).15 E -F2(sendmail)2.513 E F1 .013(from consuming lar)2.513 F .013 -(ge amounts of memory)-.18 F 2.513(,s)-.65 G 2.513(oi)421.993 289.2 S 2.513(tm) -432.286 289.2 S .014(ay be useful in)445.359 289.2 R .592(memory-poor en)102 -301.2 R 3.092(vironments. Ho)-.4 F(we)-.25 E -.15(ve)-.25 G 1.392 -.4(r, i).15 -H 3.092(ft).4 G(he)275.388 301.2 Q F0(Y)3.092 E F1 .591(option is not set,) -3.091 F F2(sendmail)3.091 E F1 .591(will k)3.091 F .591(eep track of hosts)-.1 -F(that are do)102 313.2 Q(wn during a queue run, which can impro)-.25 E .3 -.15 -(ve p)-.15 H(erformance dramatically).15 E(.)-.65 E(If the)127 329.4 Q F0(Y)2.5 -E F1(option is set,)2.5 E F2(sendmail)2.5 E F1(can not use connection caching.) -2.5 E F0 2.5(4.3. Queue)87 353.4 R(Priorities)2.5 E F1(Ev)127 369.6 Q 1.128(er\ -y message is assigned a priority when it is \214rst instantiated, consisting o\ -f the message)-.15 F .003(size \(in bytes\) of)102 381.6 R .002 -(fset by the message class times the \231w)-.25 F .002(ork class f)-.1 F .002 -(actor\232 and the number of recipients)-.1 F .637(times the \231w)102 393.6 R -.637(ork recipient f)-.1 F(actor)-.1 E 4.537 -.7(.\232 T)-.55 H .638 -(he priority is used to order the queue.).7 F .638(Higher numbers for the)5.638 -F(priority mean that the message will be processed later when running the queu\ -e.)102 405.6 Q .329(The message size is included so that lar)127 421.8 R .328 -(ge messages are penalized relati)-.18 F .628 -.15(ve t)-.25 H 2.828(os).15 G -.328(mall messages.)443.122 421.8 R .285(The message class allo)102 433.8 R -.285(ws users to send \231high priority\232 messages by including a \231Preced\ -ence:\232 \214eld)-.25 F .008(in their message; the v)102 445.8 R .008 -(alue of this \214eld is look)-.25 F .007(ed up in the)-.1 F F0(P)2.507 E F1 -.007(lines of the con\214guration \214le.)2.507 F .007(Since the)5.007 F 1.966 -(number of recipients af)102 457.8 R 1.967 -(fects the amount of load a message presents to the system, this is also)-.25 F -(included into the priority)102 469.8 Q(.)-.65 E .895 -(The recipient and class f)127 486 R .895 -(actors can be set in the con\214guration \214le using the)-.1 F F0(y)3.394 E -F1(and)3.394 E F0(z)3.394 E F1(options)3.394 E(respecti)102 498 Q -.15(ve)-.25 -G(ly).15 E 5.962(.T)-.65 G(he)163.842 498 Q 3.462(yd)-.15 G(ef)186.594 498 Q -.962(ault to 30000 \(for the recipient f)-.1 F .963 -(actor\) and 1800 \(for the class f)-.1 F 3.463(actor\). The)-.1 F -(initial priority is:)102 510 Q F2(pri)223.76 528 Q/F3 10/Symbol SF(=)3.16 E F2 -(msgsize)3.18 E F3(-)2.38 E F1(\()2.2 E F2(class).2 E F3<b4>2.47 E F0(z\))2.2 E -F3(+)2.2 E F1(\()2.2 E F2(nrcpt).36 E F3<b4>2.88 E F0(y\))2.2 E F1(\(Remember) -102 546 Q 3.328(,h)-.4 G .828(igher v)159.638 546 R .828 -(alues for this parameter actually mean that the job will be treated with lo) --.25 F(wer)-.25 E(priority)102 558 Q(.\))-.65 E 1.519(The priority of a job ca\ -n also be adjusted each time it is processed \(that is, each time an)127 574.2 -R .256(attempt is made to deli)102 586.2 R -.15(ve)-.25 G 2.756(ri).15 G .256 -(t\) using the \231w)212.04 586.2 R .256(ork time f)-.1 F(actor)-.1 E 1.656 -.7 -(,\232 s)-.4 H .256(et by the).7 F F0(Z)2.756 E F1 2.756(option. This)2.756 F -.256(is added to the)2.756 F(priority)102 598.2 Q 2.702(,s)-.65 G 2.703(oi) -140.442 598.2 S 2.703(tn)150.925 598.2 S .203 -(ormally decreases the precedence of the job, on the grounds that jobs that ha) -161.408 598.2 R .503 -.15(ve f)-.2 H(ailed).05 E(man)102 610.2 Q 2.5(yt)-.15 G -(imes will tend to f)129.35 610.2 Q(ail ag)-.1 E(ain in the future.)-.05 E(The) -5 E F0(Z)2.5 E F1(option def)2.5 E(aults to 90000.)-.1 E F0 2.5(4.4. Load)87 -634.2 R(Limiting)2.5 E F2(Sendmail)127 650.4 Q F1 .102(can be ask)2.602 F .101 -(ed to queue \(b)-.1 F .101(ut not deli)-.2 F -.15(ve)-.25 G .101 -(r\) mail if the system load a).15 F -.15(ve)-.2 G .101(rage gets too high).15 -F .626(using the)102 662.4 R F0(x)3.126 E F1 3.126(option. When)3.126 F .626 -(the load a)3.126 F -.15(ve)-.2 G .626(rage e).15 F .626(xceeds the v)-.15 F -.626(alue of the)-.25 F F0(x)3.126 E F1 .626(option, the deli)3.126 F -.15(ve) --.25 G .627(ry mode is).15 F .987(set to)102 674.4 R F0(q)3.487 E F1 .987 -(\(queue only\) if the)3.487 F F2 .987(Queue F)3.487 F(actor)-.75 E F1(\()3.487 -E F0(q)A F1 .987(option\) di)3.487 F .986(vided by the dif)-.25 F .986 -(ference in the current load)-.25 F -2.25 -.2(av e)102 686.4 T 1.268 -(rage and the).2 F F0(x)3.769 E F1 1.269(option plus one e)3.769 F 1.269 -(xceeds the priority of the message \212 that is, the message is)-.15 F -(queued if)102 698.4 Q(f:)-.25 E EP -%%Page: 21 16 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF(Sendmail Installation and Operation Guide)72 60 Q -(SMM:08-21)452.9 60 Q/F1 10/Times-Italic@0 SF(pri)269.76 99.23 Q/F2 10 -/Times-Roman@0 SF(>)3.16 E F0(q)312.48 92.23 Q F1(LA)294.81 106.23 Q/F3 10 -/Symbol SF(-)2.23 E F0(x)2.2 E F3(+)2.2 E .4 LW 336.29 96.63 294.23 96.63 DL F2 -(1)331.29 106.23 Q(The)102 120.73 Q F0(q)3.143 E F2 .643(option def)3.143 F -.642(aults to 600000, so each point of load a)-.1 F -.15(ve)-.2 G .642 -(rage is w).15 F .642(orth 600000 priority points \(as)-.1 F(described abo)102 -132.73 Q -.15(ve)-.15 G(\).).15 E -.15(Fo)127 148.93 S 2.886(rd).15 G .386 -(rastic cases, the)148.626 148.93 R F0(X)2.887 E F2 .387 -(option de\214nes a load a)2.887 F -.15(ve)-.2 G .387(rage at which).15 F F1 -(sendmail)2.887 E F2 .387(will refuse to accept)2.887 F(netw)102 160.93 Q -(ork connections.)-.1 E -(Locally generated mail \(including incoming UUCP mail\) is still accepted.)5 E -F0 2.5(4.5. Deli)87 184.93 R -.1(ve)-.1 G(ry Mode).1 E F2 .417 -(There are a number of deli)127 201.13 R -.15(ve)-.25 G .416(ry modes that).15 -F F1(sendmail)2.916 E F2 .416 -(can operate in, set by the \231d\232 con\214gura-)2.916 F(tion option.)102 -213.13 Q(These modes specify ho)5 E 2.5(wq)-.25 G(uickly mail will be deli) -263.96 213.13 Q -.15(ve)-.25 G 2.5(red. Le).15 F -.05(ga)-.15 G 2.5(lm).05 G -(odes are:)418.9 213.13 Q 17.22(id)142 229.33 S(eli)167 229.33 Q -.15(ve)-.25 G -2.5(ri).15 G(nteracti)194.65 229.33 Q -.15(ve)-.25 G(ly \(synchronously\)).15 E -15(bd)142 241.33 S(eli)167 241.33 Q -.15(ve)-.25 G 2.5(ri).15 G 2.5(nb)194.65 -241.33 S(ackground \(asynchronously\))207.15 241.33 Q 15(qq)142 253.33 S -(ueue only \(don')167 253.33 Q 2.5(td)-.18 G(eli)240.42 253.33 Q -.15(ve)-.25 G -(r\)).15 E 1.49(There are tradeof)102 269.53 R 3.99(fs. Mode)-.25 F 1.491 -(\231i\232 passes the maximum amount of information to the sender)3.99 F 3.991 -(,b)-.4 G 1.491(ut is)485.559 269.53 R .433(hardly e)102 281.53 R -.15(ve)-.25 -G 2.933(rn).15 G(ecessary)155.226 281.53 Q 5.433(.M)-.65 G .433 -(ode \231q\232 puts the minimum load on your machine, b)205.269 281.53 R .432 -(ut means that deli)-.2 F -.15(ve)-.25 G(ry).15 E .437 -(may be delayed for up to the queue interv)102 293.53 R 2.937(al. Mode)-.25 F -.437(\231b\232 is probably a good compromise.)2.937 F(Ho)5.437 E(we)-.25 E -.15 -(ve)-.25 G -.4(r,).15 G .033(this mode can cause lar)102 305.53 R .032 -(ge numbers of processes if you ha)-.18 F .332 -.15(ve a m)-.2 H .032 -(ailer that tak).15 F .032(es a long time to deli)-.1 F -.15(ve)-.25 G(r).15 E -2.5(am)102 317.53 S(essage.)116.72 317.53 Q .337 -(If you run in mode \231q\232 \(queue only\) or \231b\232 \(deli)127 333.73 R --.15(ve)-.25 G 2.838(ri).15 G 2.838(nb)341.09 333.73 S(ackground\))353.928 -333.73 Q F1(sendmail)2.838 E F2 .338(will not e)2.838 F(xpand)-.15 E 1.314 -(aliases and follo)102 345.73 R 3.813(w.)-.25 G(forw)182.901 345.73 Q 1.313 -(ard \214les upon initial receipt of the mail.)-.1 F 1.313 -(This speeds up the response to)6.313 F(RCPT commands.)102 357.73 Q F0 2.5 -(4.6. Log)87 381.73 R(Le)2.5 E -.1(ve)-.15 G(l).1 E F2 .189(The le)127 397.93 R --.15(ve)-.25 G 2.689(lo).15 G 2.689(fl)171.968 397.93 S .189 -(ogging can be set for)180.767 397.93 R F1(sendmail)2.689 E F2 5.189(.T)C .189 -(he def)317.991 397.93 R .19(ault using a standard con\214guration table)-.1 F -(is le)102 409.93 Q -.15(ve)-.25 G 2.5(l9).15 G 5(.T)137.71 409.93 S(he le) -151.32 409.93 Q -.15(ve)-.25 G(ls are as follo).15 E(ws:)-.25 E 31(0N)102 -426.13 S 2.5(ol)145.22 426.13 S(ogging.)155.5 426.13 Q 31(1S)102 442.33 S -(erious system f)143.56 442.33 Q(ailures and potential security problems.)-.1 E -31(2L)102 458.53 S(ost communications \(netw)144.11 458.53 Q -(ork problems\) and protocol f)-.1 E(ailures.)-.1 E 31(3O)102 474.73 S -(ther serious f)145.22 474.73 Q(ailures.)-.1 E 31(4M)102 490.93 S(inor f)146.89 -490.93 Q(ailures.)-.1 E 31(5M)102 507.13 S(essage collection statistics.)146.89 -507.13 Q 31(6C)102 523.33 S(reation of error messages, VRFY and EXPN commands.) -144.67 523.33 Q 31(7D)102 539.53 S(eli)145.22 539.53 Q -.15(ve)-.25 G(ry f).15 -E(ailures \(host or user unkno)-.1 E(wn, etc.\).)-.25 E 31(8S)102 555.73 S -(uccessful deli)143.56 555.73 Q -.15(ve)-.25 G(ries.).15 E 31(9M)102 571.93 S -(essages being deferred \(due to a host being do)146.89 571.93 Q(wn, etc.\).) --.25 E 23.5(10 Database)102 588.13 R -.15(ex)2.5 G(pansion \(alias, forw).15 E -(ard, and userdb lookups\).)-.1 E 23.5(15 Automatic)102 604.33 R -(alias database reb)2.5 E(uilds.)-.2 E 23.5(20 Logs)102 620.53 R .603 -(attempts to run lock)3.103 F .603(ed queue \214les.)-.1 F .603 -(These are not errors, b)5.603 F .603(ut can be useful to note if)-.2 F -(your queue appears to be clogged.)138 632.53 Q 23.5(30 Lost)102 648.73 R -(locks \(only if using lockf instead of \215ock\).)2.5 E(Additionally)102 -664.93 Q 3.683(,v)-.65 G 1.183(alues abo)162.843 664.93 R 1.483 -.15(ve 6)-.15 -H 3.683(4a).15 G 1.183(re reserv)232.462 664.93 R 1.183(ed for e)-.15 F 1.183 -(xtremely v)-.15 F 1.184(erbose deb)-.15 F 1.184(uggging output.)-.2 F 1.184 -(No normal)6.184 F(site w)102 676.93 Q(ould e)-.1 E -.15(ve)-.25 G 2.5(rs).15 G -(et these.)168.99 676.93 Q EP -%%Page: 22 17 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF 193.36(SMM:08-22 Sendmail)72 60 R -(Installation and Operation Guide)2.5 E 2.5(4.7. File)87 96 R(Modes)2.5 E/F1 10 -/Times-Roman@0 SF .813(There are a number of \214les that may ha)127 112.2 R -1.113 -.15(ve a n)-.2 H .813(umber of modes.).15 F .813 -(The modes depend on what)5.813 F(functionality you w)102 124.2 Q -(ant and the le)-.1 E -.15(ve)-.25 G 2.5(lo).15 G 2.5(fs)253.15 124.2 S -(ecurity you require.)262.87 124.2 Q F0 2.5(4.7.1. T)102 148.2 R 2.5(os)-.92 G -(uid or not to suid?)146.64 148.2 Q/F2 10/Times-Italic@0 SF(Sendmail)142 164.4 -Q F1 .933(can safely be made setuid to root.)3.433 F .934 -(At the point where it is about to)5.934 F F2 -.2(ex)3.434 G(ec).2 E F1 .934 -(\(2\) a)1.666 F(mailer)117 176.4 Q 2.583(,i)-.4 G 2.583(tc)150.013 176.4 S -.082(hecks to see if the userid is zero; if so, it resets the userid and group\ -id to a def)159.816 176.4 R .082(ault \(set)-.1 F .576(by the)117 188.4 R F0(u) -3.076 E F1(and)3.076 E F0(g)3.076 E F1 3.076(options\). \(This)3.076 F .576 -(can be o)3.076 F -.15(ve)-.15 G .576(rridden by setting the).15 F F0(S)3.076 E -F1 .577(\215ag to the mailer for mailers)3.077 F 1.532 -(that are trusted and must be called as root.\))117 200.4 R(Ho)6.531 E(we)-.25 -E -.15(ve)-.25 G 2.331 -.4(r, t).15 H 1.531 -(his will cause mail processing to be).4 F(accounted \(using)117 212.4 Q F2(sa) -2.5 E F1(\(8\)\) to root rather than to the user sending the mail.)1.666 E F0 -2.5(4.7.2. Should)102 236.4 R(my alias database be writable?)2.5 E F1 .058 -(At Berk)142 252.6 R(ele)-.1 E 2.558(yw)-.15 G 2.558(eh)200.186 252.6 S -2.25 --.2(av e)212.184 252.6 T .058(the alias database \(/etc/aliases*\) mode 644.) -2.758 F .058(While this is not as \215e)5.058 F(x-)-.15 E 1.719 -(ible as if the database were more 666, it a)117 264.6 R -.2(vo)-.2 G 1.718 -(ids potential security problems with a globally).2 F(writable database.)117 -276.6 Q 1.19(The database that)142 292.8 R F2(sendmail)3.69 E F1 1.191 -(actually used is represented by the tw)3.691 F 3.691<6f8c>-.1 G(les)429.118 -292.8 Q F2(aliases.dir)3.691 E F1(and)3.691 E F2(aliases.pa)117 304.8 Q(g)-.1 E -F1 .159(\(both in /etc\) \(or)2.659 F F2(aliases.db)2.659 E F1 .159 -(if you are running with the ne)2.659 F 2.658(wB)-.25 G(erk)412.854 304.8 Q -(ele)-.1 E 2.658(yd)-.15 G .158(atabase prim-)449.692 304.8 R(iti)117 316.8 Q --.15(ve)-.25 G 3.606(s\). The).15 F 1.107 -(mode on these \214les should match the mode on /etc/aliases.)3.606 F(If)6.107 -E F2(aliases)3.607 E F1 1.107(is writable)3.607 F 1.624(and the DBM \214les \() -117 328.8 R F2(aliases.dir)A F1(and)4.124 E F2(aliases.pa)4.124 E(g)-.1 E F1 -4.124(\)a)C 1.624(re not, users will be unable to re\215ect their)324.648 328.8 -R .719(desired changes through to the actual database.)117 340.8 R(Ho)5.719 E -(we)-.25 E -.15(ve)-.25 G 1.519 -.4(r, i).15 H(f).4 E F2(aliases)3.219 E F1 .72 -(is read-only and the DBM)3.219 F(\214les are writable, a slightly sophisticat\ -ed user can arrange to steal mail an)117 352.8 Q(yw)-.15 E(ay)-.1 E(.)-.65 E -.621(If your DBM \214les are not writable by the w)142 369 R .62 -(orld or you do not ha)-.1 F .92 -.15(ve a)-.2 H(uto-reb).15 E .62 -(uild enabled)-.2 F .564(\(with the \231D\232 option\), then you must be caref\ -ul to reconstruct the alias database each time you)117 381 R(change the te)117 -393 Q(xt v)-.15 E(ersion:)-.15 E(ne)157 409.2 Q -.1(wa)-.25 G(liases).1 E -(If this step is ignored or for)117 425.4 Q(gotten an)-.18 E 2.5(yi)-.15 G -(ntended changes will also be ignored or for)273.32 425.4 Q(gotten.)-.18 E F0 -2.5(4.8. Connection)87 449.4 R(Caching)2.5 E F1 .642 -(When processing the queue,)127 465.6 R F2(sendmail)3.142 E F1 .642 -(will try to k)3.142 F .642(eep the last fe)-.1 F 3.142(wo)-.25 G .642 -(pen connections open to)405.144 465.6 R -.2(avo)102 477.6 S -(id startup and shutdo).2 E(wn costs.)-.25 E -(This only applies to IPC connections.)5 E .286 -(When trying to open a connection the cache is \214rst searched.)127 493.8 R -.287(If an open connection is found,)5.286 F .92 -(it is probed to see if it is still acti)102 505.8 R 1.22 -.15(ve b)-.25 H 3.42 -(ys).15 G .92(ending a)270.892 505.8 R/F3 9/Times-Roman@0 SF(NOOP)3.42 E F1 -3.42(command. It)3.42 F .92(is not an error if this f)3.42 F(ails;)-.1 E -(instead, the connection is closed and reopened.)102 517.8 Q -1 -.8(Tw o)127 -534 T .207(parameters control the connection cache.)3.506 F(The)5.207 E F0(k) -2.707 E F1 .207(option de\214nes the number of simultane-)2.707 F 1.82 -(ous open connections that will be permitted.)102 546 R 1.819 -(If it is set to zero, connections will be closed as)6.82 F .795 -(quickly as possible.)102 558 R .796(The def)5.796 F .796(ault is one.)-.1 F -.796(This should be set as appropriate for your system size; it)5.796 F -(will limit the amount of system resources that)102 570 Q F2(sendmail)2.5 E F1 -(will use during queue runs.)2.5 E(The)127 586.2 Q F0(K)3.648 E F1 1.148 -(option speci\214es the maximum time that an)3.648 F 3.648(yc)-.15 G 1.148 -(ached connection will be permitted to)347.452 586.2 R 2.895(idle. When)102 -598.2 R .395(the idle time e)2.895 F .395(xceeds this v)-.15 F .396 -(alue the connection is closed.)-.25 F .396(This number should be small)5.396 F -.163(\(under ten minutes\) to pre)102 610.2 R -.15(ve)-.25 G .163 -(nt you from grabbing too man).15 F 2.663(yr)-.15 G .162 -(esources from other hosts.)347.49 610.2 R .162(The def)5.162 F(ault)-.1 E -(is \214v)102 622.2 Q 2.5(em)-.15 G(inutes.)136.3 622.2 Q F0 2.5(4.9. Name)87 -646.2 R(Ser)2.5 E -.1(ve)-.1 G 2.5(rA).1 G(ccess)172.33 646.2 Q F1 .421 -(If your system supports the name serv)127 662.4 R(er)-.15 E 2.921(,t)-.4 G -.421(hen the probability is that)297.147 662.4 R F2(sendmail)2.921 E F1 .422 -(will be using it)2.922 F(re)102 674.4 Q -.05(ga)-.15 G 1.432(rdless of ho).05 -F 3.932(wy)-.25 G 1.432(ou con\214gure)184.436 674.4 R F2(sendmail)3.932 E F1 -6.432(.I)C 3.932(np)288.442 674.4 S(articular)302.374 674.4 Q 3.932(,t)-.4 G -1.431(he system routine)344.506 674.4 R F2 -.1(ge)3.931 G(thostbyname).1 E F1 -1.431(\(3\) is)B .43(used to look up host names, and most v)102 686.4 R .431 -(endor v)-.15 F .431(ersions try some combination of DNS, NIS, and \214le)-.15 -F(lookup in /etc/hosts.)102 698.4 Q EP -%%Page: 23 18 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF(Sendmail Installation and Operation Guide)72 60 Q -(SMM:08-23)452.9 60 Q/F1 10/Times-Roman@0 SF(Ho)127 96 Q(we)-.25 E -.15(ve)-.25 -G 2.12 -.4(r, i).15 H 3.82(fy).4 G 1.32(ou do not ha)183.85 96 R 1.62 -.15 -(ve a n)-.2 H(ameserv).15 E 1.32 -(er con\214gured at all, such as at a UUCP-only site,)-.15 F/F2 10 -/Times-Italic@0 SF(sendmail)102 108 Q F1 .14(will get a \231connection refused\ -\232 message when it tries to connect to the name serv)2.64 F .14(er \(either) --.15 F .915(indirectly by calling)102 120 R F2 -.1(ge)3.415 G(thostbyname).1 E -F1 .915(or directly by looking up MX records\).)3.415 F .915(If the)5.915 F F0 -(I)3.415 E F1 .915(option is set,)3.415 F F2(sendmail)102 132 Q F1 .135 -(will interpret this to mean a temporary f)2.635 F .135 -(ailure and will queue the mail for later processing;)-.1 F .884 -(otherwise, it ignores the name serv)102 144 R .884(er data.)-.15 F .884 -(If your name serv)5.884 F .884(er is running properly)-.15 F 3.383(,t)-.65 G -.883(he setting of)452.794 144 R 1.164(this option is not rele)102 156 R -.25 -(va)-.25 G 1.164(nt; ho).25 F(we)-.25 E -.15(ve)-.25 G 1.964 -.4(r, i).15 H -3.664(ti).4 G 3.664(si)265.818 156 S 1.164 -(mportant that it be set properly to mak)276.152 156 R 3.665(ee)-.1 G 1.165 -(rror handling)450.345 156 R -.1(wo)102 168 S(rk properly).1 E(.)-.65 E .633 -(This option also allo)127 184.2 R .633(ws you to tweak name serv)-.25 F .633 -(er options.)-.15 F .632(The command line tak)5.633 F .632(es a series)-.1 F -.442(of \215ags as documented in)102 196.2 R F2 -.37(re)2.942 G(solver).37 E F1 -.442(\(3\) \(with the leading \231RES_\232 deleted\).)B .442 -(Each can be preceded by)5.442 F(an optional `+' or `)102 208.2 Q/F3 10/Symbol -SF(-)A F1 2.5('. F)B(or e)-.15 E(xample, the line)-.15 E(OIT)142 224.4 Q -(rue +AA)-.35 E(ONL)-.55 E(Y)-1 E F3(-)2.5 E F1(DNSRCH)A .862(turns on the AA) -102 240.6 R(ONL)-.55 E 3.362(Y\()-1 G .862(accept authoritati)201.658 240.6 R -1.162 -.15(ve a)-.25 H .861(nswers only\) and turns of).15 F 3.361(ft)-.25 G -.861(he DNSRCH \(search the)402.827 240.6 R 2.039(domain path\) options.)102 -252.6 R 2.039(Most resolv)7.039 F 2.039(er libraries def)-.15 F 2.039 -(ault DNSRCH, DEFN)-.1 F 2.039(AMES, and RECURSE)-.35 F .187 -(\215ags on and all others of)102 264.6 R 2.687(f. Note)-.25 F .186 -(the use of the initial `)2.686 F(`T)-.74 E(rue')-.35 E 2.686('\212t)-.74 G -.186(his is for compatibility with pre)365.82 264.6 R(vi-)-.25 E(ous v)102 -276.6 Q(ersions of)-.15 E F2(sendmail)2.5 E F1 2.5(,b)C -(ut is not otherwise necessary)210.81 276.6 Q(.)-.65 E -1.11(Ve)127 292.8 S -2.256(rsion le)1.11 F -.15(ve)-.25 G 4.756(l1c).15 G 2.256 -(on\214gurations turn DNSRCH and DEFN)200.298 292.8 R 2.257(AMES of)-.35 F -4.757(fw)-.25 G 2.257(hen doing deli)424.896 292.8 R -.15(ve)-.25 G(ry).15 E -2.06(lookups, b)102 304.8 R 2.06(ut lea)-.2 F 2.36 -.15(ve t)-.2 H 2.06 -(hem on e).15 F -.15(ve)-.25 G 2.06(rywhere else.).15 F -1.11(Ve)7.06 G 2.06 -(rsion 8 of)1.11 F F2(sendmail)4.56 E F1 2.06(ignores them when doing)4.56 F -.313(canoni\214cation lookups \(that is, when using $[ ... $]\), and al)102 -316.8 R -.1(wa)-.1 G .313(ys does the search.).1 F .313(If you don')5.313 F -2.813(tw)-.18 G(ant)491.78 316.8 Q(to do automatic name e)102 328.8 Q -(xtension, don')-.15 E 2.5(tc)-.18 G(all $[ ... $].)261.93 328.8 Q .189 -(The search rules for $[ ... $] are some)127 345 R .189(what dif)-.25 F .189 -(ferent than usual.)-.25 F .189(If the name \(that is, the `)5.189 F(`...)-.74 -E -.74('')-.7 G(\)).74 E .109(has at least one dot, it al)102 357 R -.1(wa)-.1 -G .109(ys tries the unmodi\214ed name \214rst.).1 F .11(If that f)5.11 F .11 -(ails, it tries the reduced search)-.1 F .124 -(path, and lastly tries the unmodi\214ed name \(b)102 369 R .124 -(ut only for names without a dot, since names with a dot)-.2 F(ha)102 381 Q -.788 -.15(ve a)-.2 H .488(lready been tried\).).15 F .488(This allo)5.488 F -.489(ws names such as `)-.25 F(`utc.CS')-.74 E 2.989('t)-.74 G 2.989(om)362.805 -381 S .489(atch the site in Czechoslo)378.574 381 R -.25(va)-.15 G(kia).25 E -1.588(rather than the site in your local Computer Science department.)102 393 R -1.587(It also prefers A and CN)6.587 F(AME)-.35 E .512(records o)102 405 R -.15 -(ve)-.15 G 3.012(rM).15 G 3.012(Xr)163.814 405 S .512 -(ecords \212 that is, if it \214nds an MX record it mak)177.376 405 R .513 -(es note of it, b)-.1 F .513(ut k)-.2 F .513(eeps looking.)-.1 F 1.542(This w) -102 417 R(ay)-.1 E 4.042(,i)-.65 G 4.042(fy)149.054 417 S 1.541(ou ha)161.426 -417 R 1.841 -.15(ve a w)-.2 H 1.541 -(ildcard MX record matching your domain, it will not assume that all).15 F -(names match.)102 429 Q F0 2.5(4.10. Mo)87 453 R(ving the P)-.1 E(er)-.2 E -(-User F)-.37 E(orward Files)-.25 E F1 .772(Some sites mount each user')127 -469.2 R 3.272(sh)-.55 G .772(ome directory from a local disk on their w)256.13 -469.2 R .772(orkstation, so that)-.1 F .576(local access is f)102 481.2 R 3.076 -(ast. Ho)-.1 F(we)-.25 E -.15(ve)-.25 G 1.376 -.4(r, t).15 H .575 -(he result is that .forw).4 F .575(ard \214le lookups are slo)-.1 F 4.375 -.65 -(w. I)-.25 H 3.075(ns).65 G .575(ome cases, mail)439.25 481.2 R .216(can e)102 -493.2 R -.15(ve)-.25 G 2.716(nb).15 G 2.716(ed)144.792 493.2 S(eli)156.948 -493.2 Q -.15(ve)-.25 G .216 -(red on machines inappropriately because of a \214le serv).15 F .216 -(er being do)-.15 F 2.716(wn. The)-.25 F(perfor)2.716 E(-)-.2 E -(mance can be especially bad if you run the automounter)102 505.2 Q(.)-.55 E -(The)127 521.4 Q F0(J)2.5 E F1(option allo)2.5 E(ws you to set a path of forw) --.25 E(ard \214les.)-.1 E -.15(Fo)5 G 2.5(re).15 G -(xample, the con\214g \214le line)366.6 521.4 Q(OJ/v)142 537.6 Q(ar/forw)-.25 E -(ard/$u:$z/.forw)-.1 E(ard)-.1 E -.1(wo)102 553.8 S .208 -(uld \214rst look for a \214le with the same name as the user').1 F 2.707(sl) --.55 G .207(ogin in /v)343.191 553.8 R(ar/forw)-.25 E .207 -(ard; if that is not found)-.1 F .129 -(\(or is inaccessible\) the \214le \231.forw)102 565.8 R .129 -(ard\232 in the user')-.1 F 2.629(sh)-.55 G .13(ome directory is searched.) -311.901 565.8 R 2.63(At)5.13 G .13(ruly perv)435.02 565.8 R .13(erse site)-.15 -F(could also search by sender by using $r)102 577.8 Q 2.5(,$)-.4 G(s, or $f.) -269.07 577.8 Q .69(If you create a directory such as /v)127 594 R(ar/forw)-.25 -E .69(ard, it should be mode 1777 \(that is, the stick)-.1 F 3.19(yb)-.15 G(it) -498.44 594 Q(should be set\).)102 606 Q -(Users should create the \214les mode 644.)5 E F0 2.5(4.11. Fr)87 630 R -(ee Space)-.18 E F1 1.122(On systems that ha)127 646.2 R 1.422 -.15(ve t)-.2 H -(he).15 E F2(statfs)3.622 E F1 1.123 -(\(2\) system call, you can specify a minimum number of free)B .61 -(blocks on the queue \214lesystem using the)102 658.2 R F0(b)3.11 E F1 3.11 -(option. If)3.11 F .61(there are fe)3.11 F .61 -(wer than the indicated number of)-.25 F .406 -(blocks free on the \214lesystem on which the queue is mounted the SMTP serv) -102 670.2 R .407(er will reject mail with)-.15 F(the 452 error code.)102 682.2 -Q(This in)5 E(vites the SMTP client to try ag)-.4 E(ain later)-.05 E(.)-.55 E -(Be)127 698.4 Q -.1(wa)-.25 G .746(re of setting this option too high; it can \ -cause rejection of email when that mail w).1 F(ould)-.1 E -(be processed without dif)102 710.4 Q(\214culty)-.25 E(.)-.65 E EP -%%Page: 24 19 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF 193.36(SMM:08-24 Sendmail)72 60 R -(Installation and Operation Guide)2.5 E/F1 10/Times-Roman@0 SF 1.772 -(This option can also specify an adv)127 96 R 1.773 -(ertised \231maximum message size\232 for hosts that speak)-.15 F(ESMTP)102 108 -Q(.)-1.11 E F0 2.5(4.12. Pri)87 132 R -.1(va)-.1 G(cy Flags).1 E F1(The)127 -148.2 Q F0(p)3.591 E F1 1.091(option allo)3.591 F 1.091 -(ws you to set certain `)-.25 F(`pri)-.74 E -.25(va)-.25 G -.15(cy).25 G 2.571 --.74('' \215).15 H 3.591(ags. Actually).74 F 3.59(,m)-.65 G(an)409.27 148.2 Q -3.59(yo)-.15 G 3.59(ft)432.15 148.2 S 1.09(hem don')441.85 148.2 R 3.59(tg)-.18 -G -2.15 -.25(iv e)492.18 148.2 T .254(you an)102 160.2 R 2.754(ye)-.15 G .254 -(xtra pri)141.088 160.2 R -.25(va)-.25 G -.15(cy).25 G 2.754(,r)-.5 G .254 -(ather just insisting that client SMTP serv)196.666 160.2 R .254 -(ers use the HELO command before)-.15 F(using certain commands.)102 172.2 Q -.124(The option tak)127 188.4 R .124 -(es a series of \215ag names; the \214nal pri)-.1 F -.25(va)-.25 G .424 -.15 -(cy i).25 H 2.624(st).15 G .124(he inclusi)367.708 188.4 R .424 -.15(ve o)-.25 -H 2.624(ro).15 G 2.624(ft)434.06 188.4 S .123(hose \215ags.)442.794 188.4 R --.15(Fo)5.123 G(r).15 E -.15(ex)102 200.4 S(ample:).15 E(Op needmailhelo, noe) -142 216.6 Q(xpn)-.15 E .928(insists that the HELO or EHLO command be used befo\ -re a MAIL command is accepted and dis-)102 232.8 R(ables the EXPN command.)102 -244.8 Q .244(The \231restrictmailq\232 option restricts printing the queue to \ -the group that o)127 261 R .244(wns the queue direc-)-.25 F(tory)102 273 Q 5 -(.I)-.65 G 2.5(ti)128.29 273 S 2.5(sa)136.35 273 S -(bsurd to set this if you don')147.18 273 Q 2.5(ta)-.18 G -(lso protect the logs.)266.72 273 Q .83(The \231restrictqrun\232 option restri\ -cts people running the queue \(that is, using the)127 289.2 R F0<ad71>3.33 E F1 -(command)3.33 E(line \215ag\) to root and the o)102 301.2 Q -(wner of the queue directory)-.25 E(.)-.65 E F0 2.5(4.13. Send)87 325.2 R -(to Me T)2.5 E(oo)-.92 E F1(Normally)127 341.4 Q(,)-.65 E/F2 10/Times-Italic@0 -SF(sendmail)3.424 E F1 .924(deletes the \(en)3.424 F -.15(ve)-.4 G .923 -(lope\) sender from an).15 F 3.423(yl)-.15 G .923(ist e)375.488 341.4 R 3.423 -(xpansions. F)-.15 F .923(or e)-.15 F .923(xample, if)-.15 F .761(\231matt\232\ - sends to a list that contains \231matt\232 as one of the members he w)102 -353.4 R(on')-.1 E 3.261(tg)-.18 G .761(et a cop)416.705 353.4 R 3.261(yo)-.1 G -3.261(ft)462.488 353.4 S .761(he mes-)471.859 353.4 R 3.067(sage. If)102 365.4 -R(the)3.067 E F0<ad6d>3.067 E F1 .567 -(\(me too\) command line \215ag, or if the)3.067 F F0(m)3.066 E F1 .566 -(option is set in the con\214guration \214le, this)3.066 F(beha)102 377.4 Q -(viour is supressed.)-.2 E(Some sites lik)5 E 2.5(et)-.1 G 2.5(or)265.58 377.4 -S(un the)276.41 377.4 Q/F3 9/Times-Roman@0 SF(SMTP)2.5 E F1(daemon with)2.5 E -F0<ad6d>2.5 E F1(.)A F0 2.5(5. THE)72 401.4 R(WHOLE SCOOP ON THE CONFIGURA)2.5 -E(TION FILE)-.95 E F1 .264(This section describes the con\214guration \214le i\ -n detail, including hints on ho)112 417.6 R 2.764(wt)-.25 G 2.764(ow)426.294 -417.6 S .264(rite one of your)441.278 417.6 R -.25(ow)87 429.6 S 2.5(ni).25 G -2.5(fy)109.25 429.6 S(ou ha)120.08 429.6 Q .3 -.15(ve t)-.2 H(o.).15 E .648(Th\ -ere is one point that should be made clear immediately: the syntax of the con\ -\214guration \214le is)112 445.8 R 1.076 -(designed to be reasonably easy to parse, since this is done e)87 457.8 R -.15 -(ve)-.25 G 1.077(ry time).15 F F2(sendmail)3.577 E F1 1.077 -(starts up, rather than)3.577 F(easy for a human to read or write.)87 469.8 Q -(On the \231future project\232 list is a con\214guration-\214le compiler)5 E(.) --.55 E(An o)112 486 Q -.15(ve)-.15 G(rvie).15 E 2.5(wo)-.25 G 2.5(ft)170.88 486 -S(he con\214guration \214le is gi)179.49 486 Q -.15(ve)-.25 G 2.5<6e8c>.15 G -(rst, follo)301.59 486 Q(wed by details of the semantics.)-.25 E F0 2.5 -(5.1. Con\214guration)87 510 R(File Lines)2.5 E F1 1.316 -(The con\214guration \214le is or)127 526.2 R -.05(ga)-.18 G 1.316 -(nized as a series of lines, each of which be).05 F 1.315(gins with a single) --.15 F .741(character de\214ning the semantics for the rest of the line.)102 -538.2 R .742(Lines be)5.742 F .742(ginning with a space or a tab are)-.15 F -1.149 -(continuation lines \(although the semantics are not well de\214ned in man)102 -550.2 R 3.648(yp)-.15 G 3.648(laces\). Blank)407.516 550.2 R 1.148(lines and) -3.648 F(lines be)102 562.2 Q(ginning with a sharp symbol \(`#'\) are comments.) --.15 E F0 2.5(5.1.1. R)102 586.2 R(and S \212 r)2.5 E(ewriting rules)-.18 E F1 -.406(The core of address parsing are the re)142 602.4 R .406(writing rules.) --.25 F .407(These are an ordered production sys-)5.407 F(tem.)117 614.4 Q F2 -(Sendmail)5.283 E F1 .283(scans through the set of re)2.783 F .282 -(writing rules looking for a match on the left hand side)-.25 F .131 -(\(LHS\) of the rule.)117 626.4 R .131(When a rule matches, the address is rep\ -laced by the right hand side \(RHS\) of)5.131 F(the rule.)117 638.4 Q 1.126 -(There are se)142 654.6 R -.15(ve)-.25 G 1.126(ral sets of re).15 F 1.126 -(writing rules.)-.25 F 1.126(Some of the re)6.126 F 1.125 -(writing sets are used internally)-.25 F .21(and must ha)117 666.6 R .51 -.15 -(ve s)-.2 H .21(peci\214c semantics.).15 F .21(Other re)5.21 F .21 -(writing sets do not ha)-.25 F .51 -.15(ve s)-.2 H .21 -(peci\214cally assigned seman-).15 F -(tics, and may be referenced by the mailer de\214nitions or by other re)117 -678.6 Q(writing sets.)-.25 E(The syntax of these tw)142 694.8 Q 2.5(oc)-.1 G -(ommands are:)244.38 694.8 Q F0(S)157 711 Q F2(n)A EP -%%Page: 25 20 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF(Sendmail Installation and Operation Guide)72 60 Q -(SMM:08-25)452.9 60 Q/F1 10/Times-Roman@0 SF .278 -(Sets the current ruleset being collected to)117 96 R/F2 10/Times-Italic@0 SF -(n)2.778 E F1 5.278(.I)C 2.778(fy)302.524 96 S .278(ou be)313.632 96 R .278 -(gin a ruleset more than once it deletes the)-.15 F(old de\214nition.)117 108 Q -F0(R)157 124.2 Q F2(lhs rhs comments)A F1 .303(The \214elds must be separated \ -by at least one tab character; there may be embedded spaces in the)117 140.4 R -2.739(\214elds. The)117 152.4 R F2(lhs)2.739 E F1 .239 -(is a pattern that is applied to the input.)2.739 F .238 -(If it matches, the input is re)5.238 F .238(written to the)-.25 F F2(rhs)117 -164.4 Q F1 5(.T)C(he)143.39 164.4 Q F2(comments)2.5 E F1(are ignored.)2.5 E -2.265(Macro e)142 180.6 R 2.265(xpansions of the form)-.15 F F0($)4.765 E F2(x) -A F1 2.266(are performed when the con\214guration \214le is read.)4.765 F .081 -(Expansions of the form)117 192.6 R F0($&)2.581 E F2(x)A F1 .081 -(are performed at run time using a some)2.581 F .08 -(what less general algorithm.)-.25 F .639 -(This for is intended only for referencing internally de\214ned macros such as) -117 204.6 R F0($h)3.139 E F1 .639(that are changed)3.139 F(at runtime.)117 -216.6 Q F0 2.5(5.1.1.1. The)117 240.6 R(left hand side)2.5 E F1 1.617 -(The left hand side of re)157 256.8 R 1.617(writing rules contains a pattern.) --.25 F 1.617(Normal w)6.617 F 1.617(ords are simply)-.1 F(matched directly)132 -268.8 Q 5(.M)-.65 G(etasyntax is introduced using a dollar sign.)214.67 268.8 Q -(The metasymbols are:)5 E F0($*)172 285 Q F1(Match zero or more tok)192.14 285 -Q(ens)-.1 E F0($+)172 297 Q F1(Match one or more tok)9.44 E(ens)-.1 E F0<24ad> -172 309 Q F1(Match e)9.44 E(xactly one tok)-.15 E(en)-.1 E F0($=)172 321 Q F2 -(x)A F1(Match an)5 E 2.5(yp)-.15 G(hrase in class)241.98 321 Q F2(x)2.5 E F0 -($~)172 333 Q F2(x)A F1(Match an)7.37 E 2.5(yw)-.15 G(ord not in class)244.1 -333 Q F2(x)2.5 E F1 .498(If an)132 349.2 R 2.998(yo)-.15 G 2.998(ft)163.946 -349.2 S .499(hese match, the)173.054 349.2 R 2.999(ya)-.15 G .499 -(re assigned to the symbol)248.271 349.2 R F0($)2.999 E F2(n)A F1 .499 -(for replacement on the right hand)2.999 F(side, where)132 361.2 Q F2(n)2.5 E -F1(is the inde)2.5 E 2.5(xi)-.15 G 2.5(nt)238.78 361.2 S(he LHS.)249.06 361.2 Q --.15(Fo)5 G 2.5(re).15 G(xample, if the LHS:)307.92 361.2 Q($\255:$+)172 377.4 -Q(is applied to the input:)132 393.6 Q(UCB)172 409.8 Q(ARP)-.35 E(A:eric)-.92 E -(the rule will match, and the v)132 426 Q(alues passed to the RHS will be:)-.25 -E 7.5($1 UCB)172 442.2 R(ARP)-.35 E(A)-.92 E 7.5($2 eric)172 454.2 R -(Additionally)157 474.6 Q 3.398(,t)-.65 G .898(he LHS can include)215.588 474.6 -R F0($@)3.398 E F1 .898(to match zero tok)3.398 F 3.398(ens. This)-.1 F(is) -3.398 E F2(not)3.398 E F1 .898(bound to a)3.398 F F0($)132 486.6 Q F2(N)A F1 -.837(on the RHS, and is normally only used when it stands alone in order to ma\ -tch the null)3.337 F(input.)132 498.6 Q F0 2.5(5.1.1.2. The)117 522.6 R -(right hand side)2.5 E F1 .526(When the left hand side of a re)157 538.8 R .525 -(writing rule matches, the input is deleted and replaced)-.25 F .931 -(by the right hand side.)132 550.8 R -.8(To)5.932 G -.1(ke).8 G .932 -(ns are copied directly from the RHS unless the).1 F 3.432(yb)-.15 G -.15(eg) -457.846 550.8 S .932(in with a).15 F(dollar sign.)132 562.8 Q(Metasymbols are:) -5 E F0($)172 579 Q F2(n)A F1(Substitute inde\214nite tok)222.55 579 Q(en)-.1 E -F2(n)2.5 E F1(from LHS)2.5 E F0($[)172 591 Q F2(name)A F0($])A F1(Canonicalize) -222.55 591 Q F2(name)2.5 E F0($\()172 603 Q F2(map k)A -.3(ey)-.1 G F0($@)2.8 E -F2(ar)A(guments)-.37 E F0($:)2.5 E F2(default)A F0($\))2.5 E F1(Generalized k) -222.55 615 Q -.15(ey)-.1 G(ed mapping function).15 E F0($>)172 627 Q F2(n)A F1 -(\231Call\232 ruleset)222.55 627 Q F2(n)2.5 E F0($#)172 639 Q F2(mailer)A F1 -(Resolv)222.55 639 Q 2.5(et)-.15 G(o)259.9 639 Q F2(mailer)2.5 E F0($@)172 651 -Q F2(host)A F1(Specify)222.55 651 Q F2(host)2.5 E F0($:)172 663 Q F2(user)A F1 -(Specify)222.55 663 Q F2(user)2.5 E F1(The)157 683.4 Q F0($)3.013 E F2(n)A F1 -.513(syntax substitutes the corresponding v)3.013 F .513(alue from a)-.25 F F0 -($+)3.013 E F1(,)A F0<24ad>3.013 E F1(,)A F0($*)3.012 E F1(,)A F0($=)3.012 E F1 -3.012(,o)C(r)461.876 683.4 Q F0($~)3.012 E F1(match)3.012 E(on the LHS.)132 -695.4 Q(It may be used an)5 E(ywhere.)-.15 E 2.7(Ah)157 711.6 S .2 -(ost name enclosed between)171.92 711.6 R F0($[)2.7 E F1(and)2.7 E F0($])2.7 E -F1 .2(is look)2.7 F .201(ed up using the)-.1 F F2 -.1(ge)2.701 G(thostent).1 E -F1 .201(\(3\) routines)1.666 F EP -%%Page: 26 21 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF 193.36(SMM:08-26 Sendmail)72 60 R -(Installation and Operation Guide)2.5 E/F1 10/Times-Roman@0 SF 3.333 -(and replaced by the canonical name)132 98 R/F2 7/Times-Roman@0 SF(8)291.675 94 -Q F1 8.333(.F)295.175 98 S 3.333(or e)311.418 98 R 3.332 -(xample, \231$[csam$]\232 might become \231lbl-)-.15 F 1.923 -(csam.arpa\232 and \231$[[128.32.130.2]$]\232 w)132 110 R 1.923 -(ould become \231v)-.1 F(angogh.CS.Berk)-.25 E(ele)-.1 E -.65(y.)-.15 G(EDU.) -.65 E<9a>-.7 E/F3 10/Times-Italic@0 SF(Send-)6.924 E(mail)132 122 Q F1 .436 -(recognizes it')2.936 F 2.936(sn)-.55 G .436 -(umeric IP address without calling the name serv)218.578 122 R .435 -(er and replaces it with)-.15 F(it')132 134 Q 2.5(sc)-.55 G(anonical name.) -151.17 134 Q(The)157 150.2 Q F0($\()2.861 E F1(...)2.861 E F0($\))5.361 E F1 -.361(syntax is a more general form of lookup; it uses a named map instead of) -2.861 F .028(an implicit map.)132 162.2 R .027 -(If no lookup is found, the indicated)5.027 F F3(default)2.527 E F1 .027 -(is inserted; if no def)2.527 F .027(ault is spec-)-.1 F -(i\214ed and no lookup matches, the v)132 174.2 Q(alue is left unchanged.)-.25 -E(The)157 190.4 Q F0($>)3.571 E F3(n)A F1 1.071 -(syntax causes the remainder of the line to be substituted as usual and then) -3.571 F .572(passed as the ar)132 202.4 R .572(gument to ruleset)-.18 F F3(n) -3.072 E F1 5.572(.T)C .572(he \214nal v)288.854 202.4 R .572(alue of ruleset) --.25 F F3(n)3.072 E F1 .571(then becomes the substitu-)3.072 F -(tion for this rule.)132 214.4 Q(The)157 230.6 Q F0($#)3.358 E F1 .858 -(syntax should)3.358 F F3(only)3.358 E F1 .858 -(be used in ruleset zero or a subroutine of ruleset zero.)3.358 F(It)5.859 E -1.1(causes e)132 242.6 R -.25(va)-.25 G 1.1 -(luation of the ruleset to terminate immediately).25 F 3.6(,a)-.65 G 1.1 -(nd signals to)377.11 242.6 R F3(sendmail)3.6 E F1 1.1(that the)3.6 F -(address has completely resolv)132 254.6 Q 2.5(ed. The)-.15 F -(complete syntax is:)2.5 E F0($#)172 270.8 Q F3(mailer)A F0($@)2.5 E F3(host)A -F0($:)2.5 E F3(user)A F1 .394(This speci\214es the {mailer)132 287 R 2.894(,h) --.4 G .394(ost, user} 3-tuple necessary to direct the mailer)245.466 287 R -5.394(.I)-.55 G 2.894(ft)447.548 287 S .394(he mailer is)456.552 287 R .135 -(local the host part may be omitted)132 301 R F2(9)268.91 297 Q F1 5.135(.T) -272.41 301 S(he)286.155 301 Q F3(mailer)2.635 E F1 .136(must be a single w) -2.636 F .136(ord, b)-.1 F .136(ut the)-.2 F F3(host)2.636 E F1(and)2.636 E F3 -(user)2.636 E F1 .252(may be multi-part.)132 313 R .252(If the)5.252 F F3 -(mailer)2.752 E F1 .252(is the b)2.752 F .252(uiltin IPC mailer)-.2 F 2.752(,t) --.4 G(he)369.722 313 Q F3(host)2.752 E F1 .251(may be a colon-separated)2.752 F -2.439(list of hosts that are searched in order for the \214rst w)132 325 R -2.439(orking address \(e)-.1 F 2.439(xactly lik)-.15 F 4.939(eM)-.1 G(X)496.78 -325 Q 5.185(records\). The)132 337 R F3(user)5.185 E F1 2.685(is later re)5.185 -F 2.685(written by the mailer)-.25 F 2.685(-speci\214c en)-.2 F -.15(ve)-.4 G -2.685(lope re).15 F 2.685(writing set and)-.25 F .122(assigned to the)132 349 R -F0($u)2.622 E F1 2.622(macro. As)2.622 F 2.622(as)2.622 G .123 -(pecial case, if the v)264.784 349 R .123(alue to)-.25 F F0($#)2.623 E F1 .123 -(is \231local\232 and the \214rst charac-)2.623 F .458(ter of the)132 361 R F0 -($:)2.958 E F1 -.25(va)2.958 G .458 -(lue is \231@\232, the \231@\232 is stripped of).25 F .457 -(f, and a \215ag is set in the address descriptor)-.25 F -(that causes sendmail to not do ruleset 5 processing.)132 373 Q(Normally)157 -389.2 Q 3.593(,ar)-.65 G 1.093 -(ule that matches is retried, that is, the rule loops until it f)212.136 389.2 -R 3.594(ails. A)-.1 F(RHS)3.594 E .209(may also be preceded by a)132 401.2 R F0 -($@)2.709 E F1 .209(or a)2.709 F F0($:)2.708 E F1 .208(to change this beha) -2.708 F(vior)-.2 E 5.208(.A)-.55 G F0($@)398.338 401.2 Q F1 .208 -(pre\214x causes the rule-)2.708 F .527 -(set to return with the remainder of the RHS as the v)132 413.2 R 3.027 -(alue. A)-.25 F F0($:)3.028 E F1 .528(pre\214x causes the rule to ter)3.028 F -(-)-.2 E .295(minate immediately)132 425.2 R 2.795(,b)-.65 G .294 -(ut the ruleset to continue; this can be used to a)221.46 425.2 R -.2(vo)-.2 G -.294(id continued applica-).2 F(tion of a rule.)132 437.2 Q -(The pre\214x is stripped before continuing.)5 E(The)157 453.4 Q F0($@)2.5 E F1 -(and)2.5 E F0($:)2.5 E F1(pre\214x)2.5 E(es may precede a)-.15 E F0($>)2.5 E F1 -(spec; for e)2.5 E(xample:)-.15 E 20.19(R$+ $:)172 469.6 R($>7 $1)2.5 E .256 -(matches an)132 485.8 R .256(ything, passes that to ruleset se)-.15 F -.15(ve) --.25 G .256(n, and continues; the).15 F F0($:)2.756 E F1 .256 -(is necessary to a)2.756 F -.2(vo)-.2 G .256(id an).2 F(in\214nite loop.)132 -497.8 Q .051(Substitution occurs in the order described, that is, parameters f\ -rom the LHS are substi-)157 514 R .556(tuted, hostnames are canonicalized, \ -\231subroutines\232 are called, and \214nally)132 526 R F0($#)3.056 E F1(,)A F0 -($@)3.056 E F1 3.056(,a)C(nd)467.346 526 Q F0($:)3.057 E F1(are)3.057 E -(processed.)132 538 Q F0 2.5(5.1.1.3. Semantics)117 562 R(of r)2.5 E -(ewriting rule sets)-.18 E F1 2.922(There are \214v)157 578.2 R 5.422(er)-.15 G --.25(ew)226.976 578.2 S 2.922(riting sets that ha).25 F 3.222 -.15(ve s)-.2 H -2.922(peci\214c semantics.).15 F 2.921(These are related as)7.921 F -(depicted by \214gure 2.)132 590.2 Q 1.091 -(Ruleset three should turn the address into \231canonical form.)157 606.4 R -6.092<9a54>-.7 G 1.092(his form should ha)416.914 606.4 R -.15(ve)-.2 G -(the basic syntax:)132 618.4 Q(local-part@host-domain-spec)172 634.6 Q 1.296 -(If no \231@\232 sign is speci\214ed, then the host-domain-spec)132 650.8 R F3 -(may)3.796 E F1 1.295(be appended from the sender)3.796 F 1.284 -(address \(if the)132 662.8 R F0(C)3.784 E F1 1.284 -(\215ag is set in the mailer de\214nition corresponding to the)3.784 F F3 -(sending)3.784 E F1(mailer\).)3.784 E .32 LW 76 672.4 72 672.4 DL 80 672.4 76 -672.4 DL 84 672.4 80 672.4 DL 88 672.4 84 672.4 DL 92 672.4 88 672.4 DL 96 -672.4 92 672.4 DL 100 672.4 96 672.4 DL 104 672.4 100 672.4 DL 108 672.4 104 -672.4 DL 112 672.4 108 672.4 DL 116 672.4 112 672.4 DL 120 672.4 116 672.4 DL -124 672.4 120 672.4 DL 128 672.4 124 672.4 DL 132 672.4 128 672.4 DL 136 672.4 -132 672.4 DL 140 672.4 136 672.4 DL 144 672.4 140 672.4 DL 148 672.4 144 672.4 -DL 152 672.4 148 672.4 DL 156 672.4 152 672.4 DL 160 672.4 156 672.4 DL 164 -672.4 160 672.4 DL 168 672.4 164 672.4 DL 172 672.4 168 672.4 DL 176 672.4 172 -672.4 DL 180 672.4 176 672.4 DL 184 672.4 180 672.4 DL 188 672.4 184 672.4 DL -192 672.4 188 672.4 DL 196 672.4 192 672.4 DL 200 672.4 196 672.4 DL 204 672.4 -200 672.4 DL 208 672.4 204 672.4 DL 212 672.4 208 672.4 DL 216 672.4 212 672.4 -DL/F4 5/Times-Roman@0 SF(8)93.6 682.8 Q/F5 8/Times-Roman@0 SF -(This is actually completely equi)3.2 I -.2(va)-.2 G(lent to $\(host).2 E/F6 8 -/Times-Italic@0 SF(hostname)2 E F5 2($\). In)B(particular)2 E 2(,a)-.32 G/F7 8 -/Times-Bold@0 SF($:)A F5(def)2 E(ault can be used.)-.08 E F4(9)93.6 696.4 Q F5 --.88(Yo)3.2 K 2.208(um).88 G .208(ay w)117.428 699.6 R .208 -(ant to use it for special \231per user\232 e)-.08 F 2.208(xtensions. F)-.12 F -.208(or e)-.12 F .208 -(xample, at CMU you can send email to \231jgm+foo\232; the part af-)-.12 F(ter\ - the plus sign is not part of the user name, and is passed to the local mailer\ - for local use.)72 709.2 Q EP -%%Page: 27 22 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF(Sendmail Installation and Operation Guide)72 60 Q -(SMM:08-27)452.9 60 Q .4 LW 77 108 72 108 DL 79 108 74 108 DL 84 108 79 108 DL -89 108 84 108 DL 94 108 89 108 DL 99 108 94 108 DL 104 108 99 108 DL 109 108 -104 108 DL 114 108 109 108 DL 119 108 114 108 DL 124 108 119 108 DL 129 108 124 -108 DL 134 108 129 108 DL 139 108 134 108 DL 144 108 139 108 DL 149 108 144 108 -DL 154 108 149 108 DL 159 108 154 108 DL 164 108 159 108 DL 169 108 164 108 DL -174 108 169 108 DL 179 108 174 108 DL 184 108 179 108 DL 189 108 184 108 DL 194 -108 189 108 DL 199 108 194 108 DL 204 108 199 108 DL 209 108 204 108 DL 214 108 -209 108 DL 219 108 214 108 DL 224 108 219 108 DL 229 108 224 108 DL 234 108 229 -108 DL 239 108 234 108 DL 244 108 239 108 DL 249 108 244 108 DL 254 108 249 108 -DL 259 108 254 108 DL 264 108 259 108 DL 269 108 264 108 DL 274 108 269 108 DL -279 108 274 108 DL 284 108 279 108 DL 289 108 284 108 DL 294 108 289 108 DL 299 -108 294 108 DL 304 108 299 108 DL 309 108 304 108 DL 314 108 309 108 DL 319 108 -314 108 DL 324 108 319 108 DL 329 108 324 108 DL 334 108 329 108 DL 339 108 334 -108 DL 344 108 339 108 DL 349 108 344 108 DL 354 108 349 108 DL 359 108 354 108 -DL 364 108 359 108 DL 369 108 364 108 DL 374 108 369 108 DL 379 108 374 108 DL -384 108 379 108 DL 389 108 384 108 DL 394 108 389 108 DL 399 108 394 108 DL 404 -108 399 108 DL 409 108 404 108 DL 414 108 409 108 DL 419 108 414 108 DL 424 108 -419 108 DL 429 108 424 108 DL 434 108 429 108 DL 439 108 434 108 DL 444 108 439 -108 DL 449 108 444 108 DL 454 108 449 108 DL 459 108 454 108 DL 464 108 459 108 -DL 469 108 464 108 DL 474 108 469 108 DL 479 108 474 108 DL 484 108 479 108 DL -489 108 484 108 DL 494 108 489 108 DL 499 108 494 108 DL 504 108 499 108 DL/F1 -10/Times-Roman@0 SF(addr)91.915 202.4 Q 133.2 200.4 111.6 200.4 DL 133.2 200.4 -126 202.2 DL 133.2 200.4 126 198.6 DL(3)141.5 202.4 Q 133.2 189.6 133.2 211.2 -DL 154.8 189.6 133.2 189.6 DL 154.8 211.2 154.8 189.6 DL 133.2 211.2 154.8 -211.2 DL 176.4 200.4 154.8 200.4 DL 176.4 200.4 169.2 202.2 DL 176.4 200.4 -169.2 198.6 DL(D)183.59 202.4 Q 176.4 189.6 176.4 211.2 DL 198 189.6 176.4 -189.6 DL 198 211.2 198 189.6 DL 176.4 211.2 198 211.2 DL 219.6 200.4 198 200.4 -DL 277.2 182.4 255.6 182.4 DL 277.2 182.4 270 184.2 DL 277.2 182.4 270 180.6 DL -(1)285.5 184.4 Q 277.2 171.6 277.2 193.2 DL 298.8 171.6 277.2 171.6 DL 298.8 -193.2 298.8 171.6 DL 277.2 193.2 298.8 193.2 DL 320.4 182.4 298.8 182.4 DL -320.4 182.4 313.2 184.2 DL 320.4 182.4 313.2 180.6 DL(S)328.42 184.4 Q 320.4 -171.6 320.4 193.2 DL 342 171.6 320.4 171.6 DL 342 193.2 342 171.6 DL 320.4 -193.2 342 193.2 DL 363.6 182.4 342 182.4 DL 277.2 218.4 255.6 218.4 DL 277.2 -218.4 270 220.2 DL 277.2 218.4 270 216.6 DL(2)285.5 220.4 Q 277.2 207.6 277.2 -229.2 DL 298.8 207.6 277.2 207.6 DL 298.8 229.2 298.8 207.6 DL 277.2 229.2 -298.8 229.2 DL 320.4 218.4 298.8 218.4 DL 320.4 218.4 313.2 220.2 DL 320.4 -218.4 313.2 216.6 DL(R)327.865 220.4 Q 320.4 207.6 320.4 229.2 DL 342 207.6 -320.4 207.6 DL 342 229.2 342 207.6 DL 320.4 229.2 342 229.2 DL 363.6 218.4 342 -218.4 DL 421.2 200.4 399.6 200.4 DL 421.2 200.4 414 202.2 DL 421.2 200.4 414 -198.6 DL(4)429.5 202.4 Q 421.2 189.6 421.2 211.2 DL 442.8 189.6 421.2 189.6 DL -442.8 211.2 442.8 189.6 DL 421.2 211.2 442.8 211.2 DL 464.4 200.4 442.8 200.4 -DL 464.4 200.4 457.2 202.2 DL 464.4 200.4 457.2 198.6 DL(msg)466.865 202.4 Q -255.6 182.4 219.6 200.4 DL 255.6 218.4 219.6 200.4 DL 399.6 200.4 363.6 182.4 -DL 399.6 200.4 363.6 218.4 DL 208.8 146.4 187.2 146.4 DL 208.8 146.4 201.6 -148.2 DL 208.8 146.4 201.6 144.6 DL(0)217.1 148.4 Q 208.8 135.6 208.8 157.2 DL -230.4 135.6 208.8 135.6 DL 230.4 157.2 230.4 135.6 DL 208.8 157.2 230.4 157.2 -DL 252 146.4 230.4 146.4 DL 252 146.4 244.8 148.2 DL 252 146.4 244.8 144.6 DL -(resolv)265.69 148.4 Q(ed address)-.15 E 187.2 146.4 162 200.4 DL -(Figure 2 \212 Re)216.045 248.4 Q(writing set semantics)-.25 E 2.5(D\212s) -209.35 260.4 S(ender domain addition)235.46 260.4 Q 2.5(S\212m)209.35 272.4 S -(ailer)237.69 272.4 Q(-speci\214c sender re)-.2 E(writing)-.25 E 2.5(R\212m) -209.35 284.4 S(ailer)238.8 284.4 Q(-speci\214c recipient re)-.2 E(writing)-.25 -E 77 296.4 72 296.4 DL 79 296.4 74 296.4 DL 84 296.4 79 296.4 DL 89 296.4 84 -296.4 DL 94 296.4 89 296.4 DL 99 296.4 94 296.4 DL 104 296.4 99 296.4 DL 109 -296.4 104 296.4 DL 114 296.4 109 296.4 DL 119 296.4 114 296.4 DL 124 296.4 119 -296.4 DL 129 296.4 124 296.4 DL 134 296.4 129 296.4 DL 139 296.4 134 296.4 DL -144 296.4 139 296.4 DL 149 296.4 144 296.4 DL 154 296.4 149 296.4 DL 159 296.4 -154 296.4 DL 164 296.4 159 296.4 DL 169 296.4 164 296.4 DL 174 296.4 169 296.4 -DL 179 296.4 174 296.4 DL 184 296.4 179 296.4 DL 189 296.4 184 296.4 DL 194 -296.4 189 296.4 DL 199 296.4 194 296.4 DL 204 296.4 199 296.4 DL 209 296.4 204 -296.4 DL 214 296.4 209 296.4 DL 219 296.4 214 296.4 DL 224 296.4 219 296.4 DL -229 296.4 224 296.4 DL 234 296.4 229 296.4 DL 239 296.4 234 296.4 DL 244 296.4 -239 296.4 DL 249 296.4 244 296.4 DL 254 296.4 249 296.4 DL 259 296.4 254 296.4 -DL 264 296.4 259 296.4 DL 269 296.4 264 296.4 DL 274 296.4 269 296.4 DL 279 -296.4 274 296.4 DL 284 296.4 279 296.4 DL 289 296.4 284 296.4 DL 294 296.4 289 -296.4 DL 299 296.4 294 296.4 DL 304 296.4 299 296.4 DL 309 296.4 304 296.4 DL -314 296.4 309 296.4 DL 319 296.4 314 296.4 DL 324 296.4 319 296.4 DL 329 296.4 -324 296.4 DL 334 296.4 329 296.4 DL 339 296.4 334 296.4 DL 344 296.4 339 296.4 -DL 349 296.4 344 296.4 DL 354 296.4 349 296.4 DL 359 296.4 354 296.4 DL 364 -296.4 359 296.4 DL 369 296.4 364 296.4 DL 374 296.4 369 296.4 DL 379 296.4 374 -296.4 DL 384 296.4 379 296.4 DL 389 296.4 384 296.4 DL 394 296.4 389 296.4 DL -399 296.4 394 296.4 DL 404 296.4 399 296.4 DL 409 296.4 404 296.4 DL 414 296.4 -409 296.4 DL 419 296.4 414 296.4 DL 424 296.4 419 296.4 DL 429 296.4 424 296.4 -DL 434 296.4 429 296.4 DL 439 296.4 434 296.4 DL 444 296.4 439 296.4 DL 449 -296.4 444 296.4 DL 454 296.4 449 296.4 DL 459 296.4 454 296.4 DL 464 296.4 459 -296.4 DL 469 296.4 464 296.4 DL 474 296.4 469 296.4 DL 479 296.4 474 296.4 DL -484 296.4 479 296.4 DL 489 296.4 484 296.4 DL 494 296.4 489 296.4 DL 499 296.4 -494 296.4 DL 504 296.4 499 296.4 DL(Ruleset three is applied by)132 332.4 Q/F2 -10/Times-Italic@0 SF(sendmail)2.5 E F1(before doing an)2.5 E(ything with an) --.15 E 2.5(ya)-.15 G(ddress.)411.39 332.4 Q .506(Ruleset zero is applied after\ - ruleset three to addresses that are going to actually spec-)157 348.6 R .295 -(ify recipients.)132 360.6 R .295(It must resolv)5.295 F 2.795(et)-.15 G 2.795 -(oa)258.035 360.6 S F2({mailer).001 E 2.796(,h)-1.11 G .296(ost, user})312.362 -360.6 R F1 2.796(triple. The)2.796 F F2(mailer)2.796 E F1 .296 -(must be de\214ned in)2.796 F .561 -(the mailer de\214nitions from the con\214guration \214le.)132 372.6 R(The) -5.561 E F2(host)3.061 E F1 .56(is de\214ned into the)3.061 F F0($h)3.06 E F1 -.56(macro for)3.06 F(use in the ar)132 384.6 Q(gv e)-.18 E -(xpansion of the speci\214ed mailer)-.15 E(.)-.55 E 1.356(Rulesets one and tw) -157 400.8 R 3.856(oa)-.1 G 1.357 -(re applied to all sender and recipient addresses respecti)254.534 400.8 R -.15 -(ve)-.25 G(ly).15 E(.)-.65 E(The)132 412.8 Q 2.5(ya)-.15 G -(re applied before an)159.34 412.8 Q 2.5(ys)-.15 G -(peci\214cation in the mailer de\214nition.)250.27 412.8 Q(The)5 E 2.5(ym)-.15 -G(ust ne)429 412.8 Q -.15(ve)-.25 G 2.5(rr).15 G(esolv)470.81 412.8 Q(e.)-.15 E -.266(Ruleset four is applied to all addresses in the message.)157 429 R .265 -(It is typically used to translate)5.265 F(internal to e)132 441 Q -(xternal form.)-.15 E F0 2.5(5.1.1.4. IPC)117 465 R(mailers)2.5 E F1 .332 -(Some special processing occurs if the ruleset zero resolv)157 481.2 R .333 -(es to an IPC mailer \(that is, a)-.15 F .242 -(mailer that has \231[IPC]\232 listed as the P)132 493.2 R .241(ath in the)-.15 -F F0(M)2.741 E F1 .241(con\214guration line.)2.741 F .241(The host name passed) -5.241 F .884(after \231$@\232 has MX e)132 505.2 R .885 -(xpansion performed; this looks the name up in DNS to \214nd alternate)-.15 F -(deli)132 517.2 Q -.15(ve)-.25 G(ry sites.).15 E(The host name can also be pro) -157 533.4 Q(vided as a dotted quad in square brack)-.15 E(ets; for e)-.1 E -(xample:)-.15 E([128.32.149.78])172 549.6 Q(This causes direct con)132 565.8 Q --.15(ve)-.4 G(rsion of the numeric v).15 E(alue to a TCP/IP host address.)-.25 -E .894(The host name passed in after the \231$@\232 may also be a colon-separa\ -ted list of hosts.)157 582 R .629(Each is separately MX e)132 594 R .629 -(xpanded and the results are concatenated to mak)-.15 F 3.13(e\()-.1 G .63 -(essentially\) one)440.88 594 R .379(long MX list.)132 606 R .378 -(The intent here is to create \231f)5.379 F(ak)-.1 E .378 -(e\232 MX records that are not published in DNS)-.1 F(for pri)132 618 Q -.25 -(va)-.25 G(te internal netw).25 E(orks.)-.1 E .17 -(As a \214nal special case, the host name can be passed in as a te)157 634.2 R -.17(xt string in square brack-)-.15 F(ets:)132 646.2 Q([ucb)172 662.4 Q -.25 -(va)-.15 G(x.berk).25 E(ele)-.1 E -.65(y.)-.15 G(edu]).65 E 1.245(This form a) -132 678.6 R -.2(vo)-.2 G 1.245(ids the MX mapping.).2 F F0(N.B.:)6.244 E F1 -1.244(This is intended only for situations where you)3.744 F(ha)132 690.6 Q -.814 -.15(ve a n)-.2 H(etw).15 E .514(ork \214re)-.1 F -.1(wa)-.25 G .514 -(ll, so that your MX record points to a g).1 F(ate)-.05 E -.1(wa)-.25 G 3.014 -(ym).1 G .514(achine; this machine)420.762 690.6 R 1.604 -(could then do direct deli)132 702.6 R -.15(ve)-.25 G 1.604 -(ry to machines within your local domain.).15 F 1.603(Use of this feature)6.603 -F(directly violates RFC 1123 section 5.3.5: it should not be used lightly)132 -714.6 Q(.)-.65 E EP -%%Page: 28 23 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF 193.36(SMM:08-28 Sendmail)72 60 R -(Installation and Operation Guide)2.5 E 2.5(5.1.2. D)102 96 R 2.5<8a64>2.5 G -(e\214ne macr)157.28 96 Q(o)-.18 E/F1 10/Times-Roman@0 SF .546 -(Macros are named with a single character)142 112.2 R 5.546(.T)-.55 G .547 -(hese may be selected from the entire ASCII)325.492 112.2 R .892(set, b)117 -124.2 R .892(ut user)-.2 F .892 -(-de\214ned macros should be selected from the set of upper case letters only) --.2 F 5.892(.L)-.65 G -.25(ow)484.26 124.2 S(er).25 E -(case letters and special symbols are used internally)117 136.2 Q(.)-.65 E -(The syntax for macro de\214nitions is:)142 152.4 Q F0(D)157 168.6 Q/F2 10 -/Times-Italic@0 SF 1.666(xv)C(al)-1.666 E F1(where)117 184.8 Q F2(x)2.5 E F1 -(is the name of the macro and)2.5 E F2(val)2.5 E F1(is the v)2.5 E -(alue it should ha)-.25 E -.15(ve)-.2 G(.).15 E 1.085 -(Macros are interpolated using the construct)142 201 R F0($)3.585 E F2(x)A F1 -3.585(,w)C(here)346.775 201 Q F2(x)3.585 E F1 1.085 -(is the name of the macro to be)3.585 F 3.45(interpolated. This)117 213 R .95 -(interpolation is done when the con\214guration \214le is read, e)3.45 F .95 -(xcept in)-.15 F F0(M)3.45 E F1(lines.)3.45 E(The special construct)117 225 Q -F0($&)2.5 E F2(x)A F1(can be used in)2.5 E F0(R)2.5 E F1 -(lines to get deferred interpolation.)2.5 E -(Conditionals can be speci\214ed using the syntax:)142 241.2 Q($?x te)157 257.4 -Q(xt1 $| te)-.15 E(xt2 $.)-.15 E .245(This interpolates)117 273.6 R F2(te)2.745 -E(xt1)-.2 E F1 .245(if the macro)2.745 F F0($x)2.745 E F1 .245(is set, and) -2.745 F F2(te)2.745 E(xt2)-.2 E F1 2.745(otherwise. The)2.745 F .246 -(\231else\232 \()2.746 F F0($|)A F1 2.746(\)c)C .246(lause may be)451.298 273.6 -R(omitted.)117 285.6 Q(Lo)142 301.8 Q .262(wer case macro names are reserv)-.25 -F .262(ed to ha)-.15 F .561 -.15(ve s)-.2 H .261 -(pecial semantics, used to pass information).15 F 1.162(in or out of)117 313.8 -R F2(sendmail)3.663 E F1 3.663(,a)C 1.163(nd special characters are reserv) -215.583 313.8 R 1.163(ed to pro)-.15 F 1.163(vide conditionals, etc.)-.15 F -(Upper)6.163 E(case names \(that is,)117 325.8 Q F0($A)2.5 E F1(through)2.5 E -F0($Z)2.5 E F1 2.5(\)a)C(re speci\214cally reserv)267.53 325.8 Q -(ed for con\214guration \214le authors.)-.15 E .053(The follo)142 342 R .053 -(wing macros are de\214ned and/or used internally by)-.25 F F2(sendmail)2.552 E -F1 .052(for interpolation into)2.552 F(ar)117 354 Q(gv')-.18 E 5.178(sf)-.55 G -2.678(or mailers or for other conte)149.768 354 R 5.179(xts. The)-.15 F 2.679 -(ones mark)5.179 F 2.679(ed \207 are information passed into)-.1 F(sendmail)117 -368 Q/F3 7/Times-Roman@0 SF(10)153.11 364 Q F1 4.232(,t)160.11 368 S 1.732 -(he ones mark)169.622 368 R 1.732 -(ed \210 are information passed both in and out of sendmail, and the)-.1 F -(unmark)117 380 Q 2.177(ed macros are passed out of sendmail b)-.1 F 2.177 -(ut are not otherwise used internally)-.2 F 7.177(.T)-.65 G(hese)486.23 380 Q -(macros are:)117 392 Q($a)117 408.2 Q F0(The origination date in RFC 822 f)142 -408.2 Q(ormat.)-.25 E F1($b)117 424.4 Q F0(The curr)142 424.4 Q -(ent date in RFC 822 f)-.18 E(ormat.)-.25 E F1($c)117 440.6 Q F0 -(The hop count.)142 440.6 Q F1($d)117 456.8 Q F0(The curr)142 456.8 Q -(ent date in UNIX \(ctime\) f)-.18 E(ormat.)-.25 E F1($e\207)117 473 Q F0 1.342 -(The SMTP entry message.)142 473 R F1 1.341 -(This is printed out when SMTP starts up.)6.342 F 1.341(The \214rst w)6.341 F -(ord)-.1 E .428(must be the)142 485 R F0($j)2.928 E F1 .429 -(macro as speci\214ed by RFC821.)2.928 F(Def)5.429 E .429 -(aults to \231$j Sendmail $v ready at $b\232.)-.1 F 2.313 -(Commonly rede\214ned to include the con\214guration v)142 497 R 2.313 -(ersion number)-.15 F 4.813(,e)-.4 G 2.313(.g., \231$j Sendmail)431.874 497 R -($v/$Z ready at $b\232)142 509 Q($f)117 525.2 Q F0(The sender \(fr)142 525.2 Q -(om\) addr)-.18 E(ess.)-.18 E F1($g)117 541.4 Q F0(The sender addr)142 541.4 Q -(ess r)-.18 E(elati)-.18 E .2 -.1(ve t)-.1 H 2.5(ot).1 G(he r)275.59 541.4 Q -(ecipient.)-.18 E F1($h)117 557.6 Q F0(The r)142 557.6 Q(ecipient host.)-.18 E -F1($i)117 573.8 Q F0(The queue id.)142 573.8 Q F1($j\210)117 590 Q F0 .557 -(The \231of\214cial\232 domain name f)142 590 R .557(or this site.)-.25 F F1 -.557(This is fully quali\214ed if the full quali\214cation)5.557 F .137 -(can be found.)142 602 R(It)5.137 E F2(must)2.637 E F1 .136 -(be rede\214ned to be the fully quali\214ed domain name if your system is)2.637 -F(not con\214gured so that information can \214nd it automatically)142 614 Q(.) --.65 E($k)117 630.2 Q F0(The UUCP node name \(fr)142 630.2 Q -(om the uname system call\).)-.18 E F1($l\207)117 646.4 Q F0 .972(The f)142 -646.4 R .972(ormat of the UNIX fr)-.25 F .972(om line.)-.18 F F1 .972 -(Unless you ha)5.972 F 1.272 -.15(ve c)-.2 H .972(hanged the UNIX mailbox for) -.15 F(-)-.2 E(mat, you should not change the def)142 658.4 Q -(ault, which is \231From $g)-.1 E($d\232.)5 E .32 LW 76 678.8 72 678.8 DL 80 -678.8 76 678.8 DL 84 678.8 80 678.8 DL 88 678.8 84 678.8 DL 92 678.8 88 678.8 -DL 96 678.8 92 678.8 DL 100 678.8 96 678.8 DL 104 678.8 100 678.8 DL 108 678.8 -104 678.8 DL 112 678.8 108 678.8 DL 116 678.8 112 678.8 DL 120 678.8 116 678.8 -DL 124 678.8 120 678.8 DL 128 678.8 124 678.8 DL 132 678.8 128 678.8 DL 136 -678.8 132 678.8 DL 140 678.8 136 678.8 DL 144 678.8 140 678.8 DL 148 678.8 144 -678.8 DL 152 678.8 148 678.8 DL 156 678.8 152 678.8 DL 160 678.8 156 678.8 DL -164 678.8 160 678.8 DL 168 678.8 164 678.8 DL 172 678.8 168 678.8 DL 176 678.8 -172 678.8 DL 180 678.8 176 678.8 DL 184 678.8 180 678.8 DL 188 678.8 184 678.8 -DL 192 678.8 188 678.8 DL 196 678.8 192 678.8 DL 200 678.8 196 678.8 DL 204 -678.8 200 678.8 DL 208 678.8 204 678.8 DL 212 678.8 208 678.8 DL 216 678.8 212 -678.8 DL/F4 5/Times-Roman@0 SF(10)93.6 689.2 Q/F5 8/Times-Roman@0 SF(As of v) -3.2 I(ersion 8.6, all of these macros ha)-.12 E .24 -.12(ve r)-.16 H -(easonable def).12 E 2(aults. Pre)-.08 F(vious v)-.2 E -(ersions required that the)-.12 E 2(yb)-.12 G 2(ed)424.728 692.4 S(e\214ned.) -434.28 692.4 Q EP -%%Page: 29 24 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF(Sendmail Installation and Operation Guide)72 60 Q -(SMM:08-29)452.9 60 Q/F1 10/Times-Roman@0 SF($m)117 96 Q F0 .84 -(The domain part of the)142 96 R/F2 10/Times-Italic@0 SF -.1(ge)3.339 G -(thostname).1 E F0 -.18(re)3.339 G(tur).18 E 3.339(nv)-.15 G(alue.)337.055 96 Q -F1 .839(Under normal circumstances,)5.839 F F0($j)3.339 E F1(is)3.339 E(equi) -142 108 Q -.25(va)-.25 G(lent to).25 E F0($w)2.5 E(.$m)-.7 E F1(.)A($n\207)117 -124.2 Q F0(The name of the daemon \(f)142 124.2 Q(or err)-.25 E(or messages\).) --.18 E F1(Def)5 E(aults to \231MAILER-D)-.1 E(AEMON\232.)-.4 E($o\207)117 140.4 -Q F0 2.03(The set of \231operators\232 in addr)142 140.4 R(esses.)-.18 E F1 -4.531(Al)7.031 G 2.031(ist of characters which will be considered)325.744 140.4 -R(tok)142 152.4 Q .537(ens and which will separate tok)-.1 F .537 -(ens when doing parsing.)-.1 F -.15(Fo)5.537 G 3.037(re).15 G .537 -(xample, if \231@\232 were in)408.502 152.4 R(the)142 164.4 Q F0($o)2.898 E F1 -.398(macro, then the input \231a@b\232 w)2.898 F .398 -(ould be scanned as three tok)-.1 F .398(ens: \231a,)-.1 F 2.898<9a99>-.7 G(@,) -453.032 164.4 Q 2.899<9a61>-.7 G .399(nd \231b)475.821 164.4 R -.7<2e9a>-.4 G -(Def)142 176.4 Q .436(aults to \231.:@[]\232, which is the minimum set necessa\ -ry to do RFC 822 parsing; a richer)-.1 F 1.715 -(set of operators is \231.:%@!/[]\232, which adds support for UUCP)142 188.4 R -4.216(,t)-1.11 G 1.716(he %-hack, and X.400)409.712 188.4 R(addresses.)142 -200.4 Q($p)117 216.6 Q F0(Sendmail')142 216.6 Q 2.5(sp)-.37 G -.18(ro)196.92 -216.6 S(cess id.).18 E F1($q\207)117 232.8 Q F0 2.358(Default f)142 232.8 R -2.358(ormat of sender addr)-.25 F(ess.)-.18 E F1(The)7.358 E F0($q)4.858 E F1 -2.357(macro speci\214es ho)4.857 F 4.857(wa)-.25 G 4.857(na)432.626 232.8 S -2.357(ddress should)446.923 232.8 R .625(appear in a message when it is def)142 -244.8 R 3.126(aulted. Def)-.1 F .626(aults to \231<$g>\232.)-.1 F .626 -(It is commonly rede\214ned)5.626 F .183(to be \231$?x$x <$g>$|$g$.)142 256.8 R -5.183<9a6f>-.7 G 2.683<7299>255.852 256.8 S .183($g$?x \($x\)$.)266.305 256.8 R -.182(\232, corresponding to the follo)-.7 F .182(wing tw)-.25 F 2.682(of)-.1 G -(ormats:)474 256.8 Q(Eric Allman <eric@CS.Berk)182 273 Q(ele)-.1 E -.65(y.)-.15 -G(EDU>).65 E(eric@CS.Berk)182 285 Q(ele)-.1 E -.65(y.)-.15 G -(EDU \(Eric Allman\)).65 E F2(Sendmail)142 301.2 Q F1 -(properly quotes names that ha)2.5 E .3 -.15(ve s)-.2 H -(pecial characters if the \214rst form is used.).15 E($r)117 317.4 Q F0(Pr)142 -317.4 Q(otocol used to r)-.18 E(ecei)-.18 E .2 -.1(ve t)-.1 H(he message.).1 E -F1($s)117 333.6 Q F0(Sender')142 333.6 Q 2.5(sh)-.37 G(ost name.)186.91 333.6 Q -F1($t)117 349.8 Q F0 2.5(An)142 349.8 S(umeric r)157.28 349.8 Q(epr)-.18 E -(esentation of the curr)-.18 E(ent time.)-.18 E F1($u)117 366 Q F0(The r)142 -366 Q(ecipient user)-.18 E(.)-1 E F1($v)117 382.2 Q F0(The v)142 382.2 Q -(ersion number of)-.1 E F2(sendmail)2.5 E F0(.)A F1($w\210)117 398.4 Q F0 -(The hostname of this site.)7.78 E F1(The)142 414.6 Q F0($w)2.5 E F1 -(macro is set to the root name of this host \(b)2.5 E(ut see belo)-.2 E 2.5(wf) --.25 G(or ca)403.46 414.6 Q -.15(ve)-.2 G(ats\).).15 E($x)117 430.8 Q F0 -(The full name of the sender)142 430.8 Q(.)-1 E F1($z)117 447 Q F0 -(The home dir)142 447 Q(ectory of the r)-.18 E(ecipient.)-.18 E F1($_)117 463.2 -Q F0(The v)142 463.2 Q(alidated sender addr)-.1 E(ess.)-.18 E F1 .918 -(There are three types of dates that can be used.)142 479.4 R(The)5.918 E F0 -($a)3.418 E F1(and)3.418 E F0($b)3.418 E F1 .918(macros are in RFC 822)3.418 F -(format;)117 491.4 Q F0($a)3.047 E F1 .547(is the time as e)3.047 F .547 -(xtracted from the \231Date:\232 line of the message \(if there w)-.15 F .546 -(as one\), and)-.1 F F0($b)117 503.4 Q F1 .145 -(is the current date and time \(used for postmarks\).)2.645 F .145 -(If no \231Date:\232 line is found in the incoming)5.145 F(message,)117 515.4 Q -F0($a)2.547 E F1 .047(is set to the current time also.)2.547 F(The)5.046 E F0 -($d)2.546 E F1 .046(macro is equi)2.546 F -.25(va)-.25 G .046(lent to the).25 F -F0($b)2.546 E F1 .046(macro in UNIX)2.546 F(\(ctime\) format.)117 527.4 Q .606 -(The macros)142 543.6 R F0($w)3.106 E F1(,)A F0($j)3.106 E F1 3.106(,a)C(nd) -228.844 543.6 Q F0($m)3.106 E F1 .607(are set to the identity of this host.) -3.106 F F2(Sendmail)5.607 E F1 .607(tries to \214nd the)3.107 F .025(fully qua\ -li\214ed name of the host if at all possible; it does this by calling)117 555.6 -R F2 -.1(ge)2.525 G(thostname).1 E F1 .025(\(2\) to get the)B 1.511 -(current hostname and then passing that to)117 567.6 R F2 -.1(ge)4.012 G -(thostbyname).1 E F1 1.512(\(3\) which is supposed to return the)B .185 -(canonical v)117 581.6 R .185(ersion of that host name.)-.15 F/F3 7 -/Times-Roman@0 SF(11)262.195 577.6 Q F1 .184(Assuming this is successful,) -271.88 581.6 R F0($j)2.684 E F1 .184(is set to the fully quali\214ed)2.684 F -1.463(name and)117 593.6 R F0($m)3.963 E F1 1.464 -(is set to the domain part of the name \(e)3.964 F -.15(ve)-.25 G 1.464 -(rything after the \214rst dot\).).15 F(The)6.464 E F0($w)3.964 E F1 .166 -(macro is set to the \214rst w)117 605.6 R .166(ord \(e)-.1 F -.15(ve)-.25 G -.166(rything before the \214rst dot\) if you ha).15 F .466 -.15(ve a l)-.2 H --2.15 -.25(ev e).15 H 2.666(l5o).25 G 2.666(rh)452.018 605.6 S .166(igher con-) -463.014 605.6 R .183(\214guration \214le; otherwise, it is set to the same v) -117 617.6 R .184(alue as)-.25 F F0($j)2.684 E F1 5.184(.I)C 2.684(ft)355.32 -617.6 S .184(he canoni\214cation is not successful,)364.114 617.6 R -(it is imperati)117 631.6 Q .3 -.15(ve t)-.25 H(hat the con\214g \214le set).15 -E F0($j)2.5 E F1(to the fully quali\214ed domain name)2.5 E F3(12)416.59 627.6 -Q F1(.)423.59 631.6 Q(The)142 647.8 Q F0($f)3.115 E F1 .614(macro is the id of\ - the sender as originally determined; when mailing to a speci\214c)3.115 F .601 -(host the)117 659.8 R F0($g)3.101 E F1 .601 -(macro is set to the address of the sender)3.101 F F2 -.37(re)3.102 G .602 -(lative to the r).37 F(ecipient.)-.37 E F1 -.15(Fo)5.602 G 3.102(re).15 G .602 -(xample, if I)456.416 659.8 R .32 LW 76 669.4 72 669.4 DL 80 669.4 76 669.4 DL -84 669.4 80 669.4 DL 88 669.4 84 669.4 DL 92 669.4 88 669.4 DL 96 669.4 92 -669.4 DL 100 669.4 96 669.4 DL 104 669.4 100 669.4 DL 108 669.4 104 669.4 DL -112 669.4 108 669.4 DL 116 669.4 112 669.4 DL 120 669.4 116 669.4 DL 124 669.4 -120 669.4 DL 128 669.4 124 669.4 DL 132 669.4 128 669.4 DL 136 669.4 132 669.4 -DL 140 669.4 136 669.4 DL 144 669.4 140 669.4 DL 148 669.4 144 669.4 DL 152 -669.4 148 669.4 DL 156 669.4 152 669.4 DL 160 669.4 156 669.4 DL 164 669.4 160 -669.4 DL 168 669.4 164 669.4 DL 172 669.4 168 669.4 DL 176 669.4 172 669.4 DL -180 669.4 176 669.4 DL 184 669.4 180 669.4 DL 188 669.4 184 669.4 DL 192 669.4 -188 669.4 DL 196 669.4 192 669.4 DL 200 669.4 196 669.4 DL 204 669.4 200 669.4 -DL 208 669.4 204 669.4 DL 212 669.4 208 669.4 DL 216 669.4 212 669.4 DL/F4 5 -/Times-Roman@0 SF(11)93.6 679.8 Q/F5 8/Times-Roman@0 SF -.12(Fo)3.2 K 2(re).12 -G(xample, on some systems)115.024 683 Q/F6 8/Times-Italic@0 SF -.08(ge)2 G -(thostname).08 E F5(might return \231foo\232 which w)2 E -(ould be mapped to \231foo.bar)-.08 E(.com\232 by)-.44 E F6 -.08(ge)2 G -(thostbyname).08 E F5(.)A F4(12)93.6 693.4 Q F5(Older v)3.2 I -(ersions of sendmail didn')-.12 E 2(tp)-.144 G(re-de\214ne)211.88 696.6 Q/F7 8 -/Times-Bold@0 SF($j)2 E F5(at all, so up until 8.6, con\214g \214les)2 E F6 -(always)2 E F5(had to de\214ne)2 E F7($j)2 E F5(.)A EP -%%Page: 30 25 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF 193.36(SMM:08-30 Sendmail)72 60 R -(Installation and Operation Guide)2.5 E/F1 10/Times-Roman@0 SF 1.65 -(send to \231bollard@matisse.CS.Berk)117 96 R(ele)-.1 E -.65(y.)-.15 G 1.65 -(EDU\232 from the machine \231v).65 F(angogh.CS.Berk)-.25 E(ele)-.1 E -.65(y.) --.15 G(EDU\232).65 E(the)117 108 Q F0($f)2.5 E F1 -(macro will be \231eric\232 and the)2.5 E F0($g)2.5 E F1 -(macro will be \231eric@v)2.5 E(angogh.CS.Berk)-.25 E(ele)-.1 E -.65(y.)-.15 G -(EDU.).65 E<9a>-.7 E(The)142 124.2 Q F0($x)3.837 E F1 1.338 -(macro is set to the full name of the sender)3.837 F 6.338(.T)-.55 G 1.338 -(his can be determined in se)369.13 124.2 R -.15(ve)-.25 G(ral).15 E -.1(wa)117 -136.2 S 2.953(ys. It).1 F .453(can be passed as \215ag to)2.953 F/F2 10 -/Times-Italic@0 SF(sendmail)2.953 E F1 5.453(.T)C .453 -(he second choice is the v)303.447 136.2 R .453(alue of the \231Full-name:\232) --.25 F .512(line in the header if it e)117 148.2 R .513 -(xists, and the third choice is the comment \214eld of a \231From:\232 line.) --.15 F .513(If all)5.513 F 1.149(of these f)117 160.2 R 1.149 -(ail, and if the message is being originated locally)-.1 F 3.648(,t)-.65 G -1.148(he full name is look)369.684 160.2 R 1.148(ed up in the)-.1 F F2 -(/etc/passwd)117 172.2 Q F1(\214le.)2.5 E .438(When sending, the)142 188.4 R F0 -($h)2.938 E F1(,)A F0($u)2.938 E F1 2.938(,a)C(nd)256.96 188.4 Q F0($z)2.938 E -F1 .438(macros get set to the host, user)2.938 F 2.939(,a)-.4 G .439 -(nd home directory \(if)417.423 188.4 R 1.455(local\) of the recipient.)117 -200.4 R 1.455(The \214rst tw)6.455 F 3.955(oa)-.1 G 1.454(re set from the) -278.445 200.4 R F0($@)3.954 E F1(and)3.954 E F0($:)3.954 E F1 1.454 -(part of the re)3.954 F 1.454(writing rules,)-.25 F(respecti)117 212.4 Q -.15 -(ve)-.25 G(ly).15 E(.)-.65 E(The)142 228.6 Q F0($p)2.806 E F1(and)2.806 E F0 -($t)2.806 E F1 .306(macros are used to create unique strings \(e.g., for the \ -\231Message-Id:\232 \214eld\).)2.806 F(The)117 240.6 Q F0($i)2.538 E F1 .037(m\ -acro is set to the queue id on this host; if put into the timestamp line it ca\ -n be e)2.538 F(xtremely)-.15 E .407(useful for tracking messages.)117 252.6 R -(The)5.407 E F0($v)2.907 E F1 .407(macro is set to be the v)2.907 F .407 -(ersion number of)-.15 F F2(sendmail)2.907 E F1 2.907(;t)C .408(his is)482.752 -252.6 R(normally put in timestamps and has been pro)117 264.6 Q -.15(ve)-.15 G -2.5(ne).15 G(xtremely useful for deb)317.64 264.6 Q(ugging.)-.2 E(The)142 280.8 -Q F0($c)2.715 E F1 .215(\214eld is set to the \231hop count,)2.715 F 2.714 -<9a69>-.7 G .214(.e., the number of times this message has been pro-)297.664 -280.8 R 3.183(cessed. This)117 292.8 R .683(can be determined by the)3.183 F F0 -<ad68>3.183 E F1 .684(\215ag on the command line or by counting the times-) -3.183 F(tamps in the message.)117 304.8 Q(The)142 321 Q F0($r)3.427 E F1(and) -3.427 E F0($s)3.427 E F1 .926 -(\214elds are set to the protocol used to communicate with)3.427 F F2(sendmail) -3.426 E F1 .926(and the)3.426 F(sending hostname.)117 333 Q(The)142 349.2 Q F0 -($_)2.72 E F1 .22(is set to a v)2.72 F .22(alidated sender host name.)-.25 F -.22(If the sender is running an RFC 1413 com-)5.22 F(pliant IDENT serv)117 -361.2 Q(er)-.15 E 2.5(,i)-.4 G 2.5(tw)206.43 361.2 S -(ill include the user name on that host.)218.93 361.2 Q F0 2.5(5.1.3. C)102 -385.2 R(and F \212 de\214ne classes)2.5 E F1 .197 -(Classes of phrases may be de\214ned to match on the left hand side of re)142 -401.4 R .196(writing rules, where)-.25 F 2.79<6199>117 413.4 S .291 -(phrase\232 is a sequence of characters that do not contain space characters.) -128.67 413.4 R -.15(Fo)5.291 G 2.791(re).15 G .291(xample a class)445.098 413.4 -R .356(of all local names for this site might be created so that attempts to s\ -end to oneself can be elimi-)117 425.4 R 2.89(nated. These)117 437.4 R .39(can\ - either be de\214ned directly in the con\214guration \214le or read in from an\ -other \214le.)2.89 F .797(Classes may be gi)117 449.4 R -.15(ve)-.25 G 3.297 -(nn).15 G .796(ames from the set of upper case letters.)213.668 449.4 R(Lo) -5.796 E .796(wer case letters and special)-.25 F(characters are reserv)117 -461.4 Q(ed for system use.)-.15 E(The syntax is:)142 477.6 Q F0(C)157 493.8 Q -F2 1.666(cp)C(hr)-1.666 E(ase1 phr)-.15 E(ase2...)-.15 E F0(F)157 505.8 Q F2 -1.666<638c>C(le)-1.666 E F1 1.114(The \214rst form de\214nes the class)117 522 -R F2(c)3.614 E F1 1.114(to match an)3.614 F 3.614(yo)-.15 G 3.615(ft)319.63 522 -S 1.115(he named w)329.355 522 R 3.615(ords. It)-.1 F 1.115 -(is permissible to split)3.615 F(them among multiple lines; for e)117 534 Q -(xample, the tw)-.15 E 2.5(of)-.1 G(orms:)317.57 534 Q(CHmonet ucbmonet)157 -550.2 Q(and)117 566.4 Q(CHmonet)157 582.6 Q(CHucbmonet)157 594.6 Q(are equi)117 -610.8 Q -.25(va)-.25 G 2.5(lent. The).25 F -(second form reads the elements of the class)2.5 E F2(c)2.5 E F1 -(from the named)2.5 E F2(\214le)2.5 E F1(.)A(The)142 627 Q F0($~)3.113 E F1 -.613(\(match entries not in class\) only matches a single w)3.113 F .612 -(ord; multi-w)-.1 F .612(ord entries in the)-.1 F -(class are ignored in this conte)117 639 Q(xt.)-.15 E .383(The class)142 655.2 -R F0($=w)2.883 E F1 .384(is set to be the set of all names this host is kno) -2.883 F .384(wn by)-.25 F 5.384(.T)-.65 G .384(his can be used to)431.364 655.2 -R(match local hostnames.)117 667.2 Q(The class)142 683.4 Q F0($=k)2.5 E F1 -(is set to be the same as)2.5 E F0($k)2.5 E F1 2.5(,t)C -(hat is, the UUCP node name.)312.69 683.4 Q(The class)142 699.6 Q F0($=m)2.5 E -F1(is set to the set of domains by which this host is kno)2.5 E -(wn, initially just)-.25 E F0($m)2.5 E F1(.)A EP -%%Page: 31 26 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF(Sendmail Installation and Operation Guide)72 60 Q -(SMM:08-31)452.9 60 Q/F1 10/Times-Italic@0 SF(Sendmail)142 96 Q/F2 10 -/Times-Roman@0 SF .543(can be compiled to allo)3.043 F 3.043(wa)-.25 G F1 -(scanf)-.001 E F2 .542(\(3\) string on the)B F0(F)3.042 E F2 3.042(line. This) -3.042 F .542(lets you do sim-)3.042 F .519(plistic parsing of te)117 108 R .519 -(xt \214les.)-.15 F -.15(Fo)5.519 G 3.019(re).15 G .52 -(xample, to read all the user names in your system)251.884 108 R F1 -(/etc/passwd)3.02 E F2(\214le into a class, use)117 120 Q(FL/etc/passwd %[^:]) -157 136.2 Q(which reads e)117 152.4 Q -.15(ve)-.25 G -(ry line up to the \214rst colon.).15 E F0 2.5(5.1.4. M)102 176.4 R 2.5<8a64> -2.5 G(e\214ne mailer)159.5 176.4 Q F2(Programs and interf)142 192.6 Q -(aces to mailers are de\214ned in this line.)-.1 E(The format is:)5 E F0(M)157 -208.8 Q F1(name)A F2 2.5(,{)C F1(\214eld)197.9 208.8 Q F2(=)A F1(value)A F2(}*) -1.666 E(where)117 225 Q F1(name)3.244 E F2 .744(is the name of the mailer \(us\ -ed internally only\) and the \231\214eld=name\232 pairs de\214ne)3.244 F -(attrib)117 237 Q(utes of the mailer)-.2 E 5(.F)-.55 G(ields are:)220.13 237 Q --.15(Pa)157 253.2 S 51.87(th The).15 F(pathname of the mailer)2.5 E 47.83 -(Flags Special)157 265.2 R(\215ags for this mailer)2.5 E 41.73(Sender A)157 -277.2 R(re)2.5 E(writing set for sender addresses)-.25 E 31.17(Recipient A)157 -289.2 R(re)2.5 E(writing set for recipient addresses)-.25 E(Ar)157 301.2 Q -49.13(gv An)-.18 F(ar)2.5 E(gument v)-.18 E(ector to pass to this mailer)-.15 E -55.61(Eol The)157 313.2 R(end-of-line string for this mailer)2.5 E 35.62 -(Maxsize The)157 325.2 R(maximum message length to this mailer)2.5 E 32.27 -(Linelimit The)157 337.2 R(maximum line length in the message body)2.5 E 31.18 -(Directory The)157 349.2 R -.1(wo)2.5 G(rking directory for the mailer).1 E -(Only the \214rst character of the \214eld name is check)117 365.4 Q(ed.)-.1 E -1.144(The follo)142 381.6 R 1.144 -(wing \215ags may be set in the mailer description.)-.25 F(An)6.144 E 3.644(yo) --.15 G 1.144(ther \215ags may be used)409.994 381.6 R(freely to conditionally \ -assign headers to messages destined for particular mailers.)117 393.6 Q 15.56 -(aR)117 409.8 S(un Extended SMTP \(ESMTP\) protocol \(de\214ned in RFCs 1425, \ -1426, and 1427\).)143.67 409.8 Q 15(bF)117 426 S .674 -(orce a blank line on the end of a message.)142.41 426 R .674 -(This is intended to w)5.674 F .674(ork around some stupid)-.1 F -.15(ve)137 -438 S .851(rsions of /bin/mail that require a blank line, b).15 F .851 -(ut do not pro)-.2 F .852(vide it themselv)-.15 F 3.352(es. It)-.15 F -.1(wo) -3.352 G(uld).1 E(not normally be used on netw)137 450 Q(ork mail.)-.1 E 15.56 -(cD)117 466.2 S 4.166(on)144.22 466.2 S 1.666 -(ot include comments in addresses.)158.386 466.2 R 1.665 -(This should only be used if you ha)6.665 F 1.965 -.15(ve t)-.2 H 4.165(ow).15 -G(ork)490.67 466.2 Q(around a remote mailer that gets confused by comments.)137 -478.2 Q 13.33(CI)117 494.4 S 3.06(fm)140.33 494.4 S .56(ail is)154.5 494.4 R F1 --.37(re)3.06 G(ceived).37 E F2 .56(from a mailer with this \215ag set, an)3.06 -F 3.06(ya)-.15 G .56(ddresses in the header that do not)367.33 494.4 R(ha)137 -506.4 Q .331 -.15(ve a)-.2 H 2.531(na).15 G 2.531(ts)174.472 506.4 S .031 -(ign \(\231@\232\) after being re)183.673 506.4 R .031 -(written by ruleset three will ha)-.25 F .33 -.15(ve t)-.2 H .03 -(he \231@domain\232 clause).15 F(from the sender tack)137 518.4 Q(ed on.)-.1 E -(This allo)5 E(ws mail with headers of the form:)-.25 E(From: usera@hosta)177 -534.6 Q -.8(To)177 546.6 S 2.5(:u).8 G(serb@hostb, userc)197.59 546.6 Q -(to be re)137 562.8 Q(written as:)-.25 E(From: usera@hosta)177 579 Q -.8(To)177 -591 S 2.5(:u).8 G(serb@hostb, userc@hosta)197.59 591 Q(automatically)137 607.2 -Q(.)-.65 E 12.78(DT)117 623.4 S(his mailer w)143.11 623.4 Q -(ants a \231Date:\232 header line.)-.1 E 15.56(eT)117 639.6 S .562 -(his mailer is e)143.11 639.6 R(xpensi)-.15 E .862 -.15(ve t)-.25 H 3.062(oc) -.15 G .562(onnect to, so try to a)253.97 639.6 R -.2(vo)-.2 G .562 -(id connecting normally; an).2 F 3.063(yn)-.15 G(ecessary)470.13 639.6 Q -(connection will occur during a queue run.)137 651.6 Q 13.89(EE)117 667.8 S -(scape lines be)143.11 667.8 Q -(ginning with \231From\232 in the message with a `>' sign.)-.15 E 16.67(fT)117 -684 S .969(he mailer w)143.11 684 R .969(ants a)-.1 F F0<ad66>3.469 E F1(fr) -3.469 E(om)-.45 E F2 .969(\215ag, b)3.469 F .969(ut only if this is a netw)-.2 -F .969(ork forw)-.1 F .968(ard operation \(i.e., the)-.1 F(mailer will gi)137 -696 Q .3 -.15(ve a)-.25 H 2.5(ne).15 G(rror if the e)218.81 696 Q -.15(xe)-.15 -G(cuting user does not ha).15 E .3 -.15(ve s)-.2 H(pecial permissions\).).15 E -14.44(FT)117 712.2 S(his mailer w)143.11 712.2 Q -(ants a \231From:\232 header line.)-.1 E EP -%%Page: 32 27 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF 193.36(SMM:08-32 Sendmail)72 60 R -(Installation and Operation Guide)2.5 E/F1 10/Times-Roman@0 SF 15(gN)117 96 S -(ormally)144.22 96 Q(,)-.65 E/F2 10/Times-Italic@0 SF(sendmail)3.529 E F1 1.029 -(sends internally generated email \(e.g., error messages\) using the null)3.529 -F 1.767(return address)137 110 R/F3 7/Times-Roman@0 SF(13)195.137 106 Q F1 -1.766(as required by RFC 1123.)206.404 110 R(Ho)6.766 E(we)-.25 E -.15(ve)-.25 -G 2.566 -.4(r, s).15 H 1.766(ome mailers don').4 F 4.266(ta)-.18 G 1.766 -(ccept a null)454.368 110 R .922(return address.)137 122 R .922(If necessary) -5.922 F 3.422(,y)-.65 G .922(ou can set the)261.938 122 R F0(g)3.422 E F1 .922 -(\215ag to pre)3.422 F -.15(ve)-.25 G(nt).15 E F2(sendmail)3.422 E F1 .922 -(from obe)3.422 F .922(ying the)-.15 F .212 -(standards; error messages will be sent as from the MAILER-D)137 134 R .211 -(AEMON \(actually)-.4 F 2.711(,t)-.65 G .211(he v)470.439 134 R(alue)-.25 E -(of the)137 146 Q F0($n)2.5 E F1(macro\).)2.5 E 15(hU)117 162.2 S -(pper case should be preserv)144.22 162.2 Q(ed in host names for this mailer) --.15 E(.)-.55 E 16.67(IT)117 178.4 S .092 -(his mailer will be speaking SMTP to another)143.11 178.4 R F2(sendmail)2.592 E -F1 2.593<8a61>2.593 G 2.593(ss)381.242 178.4 S .093 -(uch it can use special proto-)391.615 178.4 R .319(col features.)137 190.4 R -.319(This option is not required \(i.e., if this option is omitted the transmi\ -ssion will)5.319 F(still operate successfully)137 202.4 Q 2.5(,a)-.65 G -(lthough perhaps not as ef)244.11 202.4 Q(\214ciently as possible\).)-.25 E -17.22(lT)117 218.6 S(his mailer is local \(i.e., \214nal deli)143.11 218.6 Q --.15(ve)-.25 G(ry will be performed\).).15 E 13.89(LL)117 234.8 S .69 -(imit the line lengths as speci\214ed in RFC821.)143.11 234.8 R .69 -(This deprecated option should be replaced)5.69 F(by the)137 246.8 Q F0(L=)2.5 -E F1(mail declaration.)2.5 E -.15(Fo)5 G 2.5(rh).15 G(istoric reasons, the) -272.54 246.8 Q F0(L)2.5 E F1(\215ag also sets the)2.5 E F0(7)2.5 E F1(\215ag.) -2.5 E 12.22(mT)117 263 S 1.273 -(his mailer can send to multiple users on the same host in one transaction.) -143.11 263 R 1.273(When a)6.273 F F0($u)3.773 E F1 .621(macro occurs in the)137 -275 R F2(ar)3.121 E(gv)-.37 E F1 .621 -(part of the mailer de\214nition, that \214eld will be repeated as neces-)3.121 -F(sary for all qualifying users.)137 287 Q 11.11(MT)117 303.2 S(his mailer w) -143.11 303.2 Q(ants a \231Message-Id:\232 header line.)-.1 E 15(nD)117 319.4 S -2.5(on)144.22 319.4 S -(ot insert a UNIX-style \231From\232 line on the front of the message.)156.72 -319.4 Q 15(pU)117 335.6 S .702(se the route-addr style re)144.22 335.6 R -.15 -(ve)-.25 G .702(rse-path in the SMTP \231MAIL FR).15 F .701 -(OM:\232 command rather than)-.4 F .421 -(just the return address; although this is required in RFC821 section 3.1, man) -137 347.6 R 2.922(yh)-.15 G .422(osts do not)459.816 347.6 R(process re)137 -359.6 Q -.15(ve)-.25 G(rse-paths properly).15 E 5(.R)-.65 G -2.15 -.25(ev e) -272.3 359.6 T(rse-paths are of).25 E(\214cially discouraged by RFC 1123.)-.25 E -14.44(PT)117 375.8 S(his mailer w)143.11 375.8 Q(ants a \231Return-P)-.1 E -(ath:\232 line.)-.15 E 16.67(rS)117 392 S(ame as)142.56 392 Q F0(f)2.5 E F1 2.5 -(,b)C(ut sends a)185.68 392 Q F0<ad72>2.5 E F1(\215ag.)2.5 E 16.11(sS)117 408.2 -S(trip quote characters of)142.56 408.2 Q 2.5(fo)-.25 G 2.5(ft)245.61 408.2 S -(he address before calling the mailer)254.22 408.2 Q(.)-.55 E 14.44(SD)117 -424.4 S(on')144.22 424.4 Q 3.443(tr)-.18 G .943 -(eset the userid before calling the mailer)166.923 424.4 R 5.943(.T)-.55 G .943 -(his w)344.324 424.4 R .942(ould be used in a secure en)-.1 F(viron-)-.4 E .49 -(ment where)137 436.4 R F2(sendmail)2.99 E F1 .49(ran as root.)2.99 F .491 -(This could be used to a)5.491 F -.2(vo)-.2 G .491(id for).2 F .491 -(ged addresses.)-.18 F .491(This \215ag)5.491 F(is suppressed if gi)137 448.4 Q --.15(ve)-.25 G 2.5(nf).15 G(rom an \231unsafe\232 en)228.81 448.4 Q -(vironment \(e.g, a user')-.4 E 2.5(sm)-.55 G(ail.cf \214le\).)410.31 448.4 Q -15(uU)117 464.6 S(pper case should be preserv)144.22 464.6 Q -(ed in user names for this mailer)-.15 E(.)-.55 E 12.78(UT)117 480.8 S 2.997 -(his mailer w)143.11 480.8 R 2.996 -(ants Unix-style \231From\232 lines with the ugly UUCP-style \231remote from) --.1 F(<host>\232 on the end.)137 492.8 Q 15(xT)117 509 S(his mailer w)143.11 -509 Q(ants a \231Full-Name:\232 header line.)-.1 E 12.78(XT)117 525.2 S 1.22 -(his mailer w)143.11 525.2 R 1.22 -(ant to use the hidden dot algorithm as speci\214ed in RFC821; basically)-.1 F -3.72(,a)-.65 G -.15(ny)494.15 525.2 S .225(line be)137 537.2 R .225 -(ginning with a dot will ha)-.15 F .525 -.15(ve a)-.2 H 2.725(ne).15 G .224 -(xtra dot prepended \(to be stripped at the other end\).)296.47 537.2 R .525(T\ -his insures that lines in the message containing a dot will not terminate the \ -message pre-)137 549.2 R(maturely)137 561.2 Q(.)-.65 E 15(7S)117 577.4 S .351 -(trip all output to se)142.56 577.4 R -.15(ve)-.25 G 2.851(nb).15 G 2.851 -(its. This)241.416 577.4 R .351(is the def)2.851 F .351(ault if the)-.1 F F0(L) -2.851 E F1 .351(\215ag is set.)2.851 F .351(Note that clearing this)5.351 F -.377(option is not suf)137 589.4 R .378 -(\214cient to get full eight bit data passed through)-.25 F F2(sendmail)2.878 E -F1 5.378(.I)C 2.878(ft)439.708 589.4 S(he)448.696 589.4 Q F0(7)2.878 E F1 .378 -(option is)2.878 F(set, this is essentially al)137 601.4 Q -.1(wa)-.1 G -(ys set, since the eighth bit w).1 E(as stripped on input.)-.1 E 2.122(The mai\ -ler with the special name \231error\232 can be used to generate a user error) -142 617.6 R 7.122(.T)-.55 G(he)494.56 617.6 Q .246 -(\(optional\) host \214eld is an e)117 629.6 R .247 -(xit status to be returned, and the user \214eld is a message to be printed.) --.15 F .337(The e)117 641.6 R .337(xit status may be numeric or one of the v) --.15 F .336(alues USA)-.25 F .336(GE, NOUSER, NOHOST)-.4 F 2.836(,U)-.74 G -.35 -(NA)465.4 641.6 S -1.35(VA)-1 G(IL-)1.35 E .828(ABLE, SOFTW)117 653.6 R .828 -(ARE, TEMPF)-1.2 F .828(AIL, PR)-.74 F -1.88 -.4(OT O)-.4 H .828 -(COL, or CONFIG to return the corresponding EX_).4 F -.15(ex)117 665.6 S -(it code.).15 E -.15(Fo)5 G 2.5(re).15 G(xample, the entry:)181.26 665.6 Q .32 -LW 76 678.8 72 678.8 DL 80 678.8 76 678.8 DL 84 678.8 80 678.8 DL 88 678.8 84 -678.8 DL 92 678.8 88 678.8 DL 96 678.8 92 678.8 DL 100 678.8 96 678.8 DL 104 -678.8 100 678.8 DL 108 678.8 104 678.8 DL 112 678.8 108 678.8 DL 116 678.8 112 -678.8 DL 120 678.8 116 678.8 DL 124 678.8 120 678.8 DL 128 678.8 124 678.8 DL -132 678.8 128 678.8 DL 136 678.8 132 678.8 DL 140 678.8 136 678.8 DL 144 678.8 -140 678.8 DL 148 678.8 144 678.8 DL 152 678.8 148 678.8 DL 156 678.8 152 678.8 -DL 160 678.8 156 678.8 DL 164 678.8 160 678.8 DL 168 678.8 164 678.8 DL 172 -678.8 168 678.8 DL 176 678.8 172 678.8 DL 180 678.8 176 678.8 DL 184 678.8 180 -678.8 DL 188 678.8 184 678.8 DL 192 678.8 188 678.8 DL 196 678.8 192 678.8 DL -200 678.8 196 678.8 DL 204 678.8 200 678.8 DL 208 678.8 204 678.8 DL 212 678.8 -208 678.8 DL 216 678.8 212 678.8 DL/F4 5/Times-Roman@0 SF(13)93.6 689.2 Q/F5 8 -/Times-Roman@0 SF(Actually)3.2 I 2(,t)-.52 G(his only applies to SMTP)131.856 -692.4 Q 2(,w)-.888 G(hich uses the `)222.088 692.4 Q(`MAIL FR)-.592 E(OM:<>') --.32 E 2('c)-.592 G(ommand.)336.48 692.4 Q EP -%%Page: 33 28 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF(Sendmail Installation and Operation Guide)72 60 Q -(SMM:08-33)452.9 60 Q/F1 10/Times-Roman@0 SF($#error $@ NOHOST $: Host unkno) -157 96 Q(wn in this domain)-.25 E .261(on the RHS of a rule will cause the spe\ -ci\214ed error to be generated and the \231Host unkno)117 112.2 R .261 -(wn\232 e)-.25 F(xit)-.15 E(status to be returned if the LHS matches.)117 124.2 -Q(This mailer is only functional in ruleset zero.)5 E 1.563 -(The mailer named \231local\232)142 140.4 R/F2 10/Times-Italic@0 SF(must)4.063 -E F1 1.564(be de\214ned in e)4.063 F -.15(ve)-.25 G 1.564 -(ry con\214guration \214le.).15 F 1.564(This is used to)6.564 F(deli)117 152.4 -Q -.15(ve)-.25 G 4.039(rl).15 G 1.539 -(ocal mail, and is treated specially in se)151.189 152.4 R -.15(ve)-.25 G 1.538 -(ral w).15 F 4.038(ays. Additionally)-.1 F 4.038(,t)-.65 G 1.538 -(hree other mailers)428.724 152.4 R 1.367(named \231prog\232, \231*\214le*\232\ -, and \231*include*\232 may be de\214ned to tune the deli)117 164.4 R -.15(ve) --.25 G 1.368(ry of messages to).15 F -(programs, \214les, and :include: lists respecti)117 176.4 Q -.15(ve)-.25 G(ly) -.15 E 5(.T)-.65 G(he)315.38 176.4 Q 2.5(yd)-.15 G(ef)337.17 176.4 Q(ault to:) --.1 E(Mprog, P=/bin/sh, F=lsD, A=sh \255c $u)157 192.6 Q(M*\214le*, P=/de)157 -204.6 Q(v/null, F=lsDFMPEu, A=FILE)-.25 E(M*include*, P=/de)157 216.6 Q -(v/null, F=su, A=INCLUDE)-.25 E 1.264(The Sender and Recipient re)142 237 R -1.263(writing sets may either be a simple inte)-.25 F 1.263(ger or may be tw) --.15 F(o)-.1 E(inte)117 249 Q .046 -(gers separated by a slash; if so, the \214rst re)-.15 F .047 -(writing set is applied to en)-.25 F -.15(ve)-.4 G .047(lope addresses and the) -.15 F(second is applied to headers.)117 261 Q 1.259 -(The Directory is actually a colon-separated path of directories to try)142 -277.2 R 6.258(.F)-.65 G 1.258(or e)439.704 277.2 R 1.258(xample, the)-.15 F -.143(de\214nition \231D=$z:/\232 \214rst tries to e)117 289.2 R -.15(xe)-.15 G -.143(cute in the recipient').15 F 2.643(sh)-.55 G .144 -(ome directory; if that is not a)353.327 289.2 R -.25(va)-.2 G(ilable,).25 E -.781(it tries to e)117 301.2 R -.15(xe)-.15 G .781 -(cute in the root of the \214lesystem.).15 F .78 -(This is intended to be used only on the \231prog\232)5.781 F(mailer)117 313.2 -Q 2.898(,s)-.4 G .398(ince some shells \(such as)151.438 313.2 R F2(csh)2.898 E -F1 2.898(\)r)C .398(efuse to e)279.356 313.2 R -.15(xe)-.15 G .398(cute if the) -.15 F 2.898(yc)-.15 G .398(annot read the home directory)380.586 313.2 R(.)-.65 -E .416(Since the queue directory is not normally readable by normal users)117 -325.2 R F2(csh)2.916 E F1 .416(scripts as recipients can)2.916 F -.1(fa)117 -337.2 S(il.).1 E F0 2.5(5.1.5. H)102 361.2 R 2.5<8a64>2.5 G(e\214ne header) -157.84 361.2 Q F1 .198(The format of the header lines that)142 377.4 R F2 -(sendmail)2.698 E F1 .198(inserts into the message are de\214ned by the)2.698 F -F0(H)2.699 E F1 2.5(line. The)117 389.4 R(syntax of this line is:)2.5 E F0(H) -157 405.6 Q F1([)A F0(?)A F2(m\215a)A(gs)-.1 E F0(?)A F1(])A F2(hname)A F0(:)A -F2(htemplate)2.5 E F1 .691(Continuation lines in this spec are re\215ected dir\ -ectly into the outgoing message.)117 421.8 R(The)5.69 E F2(htemplate)3.19 E F1 -1.566(is macro e)117 433.8 R 1.567(xpanded before insertion into the message.) --.15 F 1.567(If the)6.567 F F2(m\215a)4.067 E(gs)-.1 E F1 1.567 -(\(surrounded by question)4.067 F .219(marks\) are speci\214ed, at least one o\ -f the speci\214ed \215ags must be stated in the mailer de\214nition for)117 -445.8 R .093(this header to be automatically output.)117 457.8 R .093 -(If one of these headers is in the input it is re\215ected to the)5.093 F -(output re)117 469.8 Q -.05(ga)-.15 G(rdless of these \215ags.).05 E -(Some headers ha)142 486 Q .3 -.15(ve s)-.2 H -(pecial semantics that will be described belo).15 E -.65(w.)-.25 G F0 2.5 -(5.1.6. O)102 510 R 2.5<8a73>2.5 G(et option)156.17 510 Q F1 .045(There are a \ -number of \231random\232 options that can be set from a con\214guration \214le\ -.)142 526.2 R(Options)5.045 E(are represented by single characters.)117 538.2 Q -(The syntax of this line is:)5 E F0(O)157 554.4 Q F2 1.666(ov)C(alue)-1.666 E -F1 1.054(This sets option)117 570.6 R F2(o)3.554 E F1 1.054(to be)3.554 F F2 -(value)3.554 E F1 6.054(.D)C 1.054(epending on the option,)256.318 570.6 R F2 -(value)3.555 E F1 1.055(may be a string, an inte)3.555 F(ger)-.15 E 3.555(,a) --.4 G(boolean \(with le)117 582.6 Q -.05(ga)-.15 G 2.5(lv).05 G -(alues \231t\232, \231T\232, \231f\232, or \231F\232; the def)201.26 582.6 Q -(ault is TR)-.1 E(UE\), or a time interv)-.4 E(al.)-.25 E -(The options supported are:)142 598.8 Q(a)117 615 Q F2(N)A F1 .655(If set, w) -189 615 R .655(ait up to)-.1 F F2(N)3.155 E F1 .655 -(minutes for an \231@:@\232 entry to e)3.155 F .655(xist in the alias database) --.15 F .474(before starting up.)189 627 R .474(If it does not appear in)5.474 F -F2(N)2.974 E F1 .475(minutes, reb)2.974 F .475(uild the database \(if)-.2 F -(the)189 639 Q F0(D)2.5 E F1(option is also set\) or issue a w)2.5 E(arning.) --.1 E(A)117 655.2 Q F2 .507(spec, spec, ...)B F1 .507 -(Specify possible alias \214le\(s\).)190.014 655.2 R(Each)5.507 E F2(spec)3.006 -E F1 .506(should be in the format `)3.006 F(`)-.74 E F2(class)A F0(:)A F2 -(\214le)3.006 E F1 -.74('')C(where)189 667.2 Q F2(class)3.049 E F0(:)A F1 .549 -(is optional and def)3.049 F .549(aults to `)-.1 F(`implicit')-.74 E 3.049 -('. Depending)-.74 F .549(on ho)3.049 F(w)-.25 E F2(send-)3.05 E(mail)189 679.2 -Q F1 1.335(is compiled, v)3.835 F 1.335 -(alid classes are \231implicit\232 \(search through a compiled-in)-.25 F .193 -(list of alias \214le types, for back compatibility\), \231hash\232 \(if)189 -691.2 R/F3 9/Times-Roman@0 SF(NEWDB)2.693 E F1 .193(is speci\214ed\),)2.693 F -.882(\231dbm\232 \(if)189 703.2 R F3(NDBM)3.382 E F1 .882 -(is speci\214ed\), \231stab\232 \(internal symbol table \212 not normally)3.382 -F .475(used unless you ha)189 715.2 R .775 -.15(ve n)-.2 H 2.975(oo).15 G .476 -(ther database lookup\), or \231nis\232 \(if)295.735 715.2 R F3(NIS)2.976 E F1 -.476(is speci\214ed\).)2.976 F EP -%%Page: 34 29 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF 193.36(SMM:08-34 Sendmail)72 60 R -(Installation and Operation Guide)2.5 E/F1 10/Times-Roman@0 SF(If a list of)189 -96 Q/F2 10/Times-Italic@0 SF(spec)2.5 E F1 2.5(sa)C(re pro)259.26 96 Q(vided,) --.15 E F2(sendmail)2.5 E F1(searches them in order)2.5 E(.)-.55 E(b)117 112.2 Q -F2(N)A F1(/)A F2(M)A F1 1.589(Insist on at least)189 112.2 R F2(N)4.089 E F1 -1.588(blocks free on the \214lesystem that holds the queue \214les)4.089 F .19 -(before accepting email via SMTP)189 124.2 R 5.19(.I)-1.11 G 2.69(ft)334.09 -124.2 S .19(here is insuf)342.89 124.2 R .19(\214cient space)-.25 F F2 -(sendmail)2.69 E F1(gi)2.69 E -.15(ve)-.25 G(s).15 E 3.67(a4)189 136.2 S 1.17 -(52 response to the MAIL command.)202.11 136.2 R 1.17(This in)6.17 F 1.17 -(vites the sender to try ag)-.4 F(ain)-.05 E(later)189 148.2 Q 5.986(.T)-.55 G -.986(he optional)220.816 148.2 R F2(M)3.486 E F1 .987 -(is a maximum message size adv)3.486 F .987(ertised in the ESMTP)-.15 F -(EHLO response.)189 160.2 Q(It is currently otherwise unused.)5 E(B)117 176.4 Q -F2(c)A F1 1.445(Set the blank substitution character to)189 176.4 R F2(c)3.945 -E F1 6.444(.U)C 1.444(nquoted spaces in addresses are)371.594 176.4 R -(replaced by this character)189 188.4 Q 5(.D)-.55 G(ef)305.63 188.4 Q -(aults to space \(i.e., no change is made\).)-.1 E 67.56(cI)117 204.6 S 3.892 -(fa)192.33 204.6 S 3.892(no)203.992 204.6 S 1.393(utgoing mailer is mark) -217.884 204.6 R 1.393(ed as being e)-.1 F(xpensi)-.15 E -.15(ve)-.25 G 3.893 -(,d).15 G(on')415.294 204.6 Q 3.893(tc)-.18 G 1.393(onnect immedi-)439.557 -204.6 R(ately)189 216.6 Q 6.164(.T)-.65 G 1.164 -(his requires that queueing be compiled in, since it will depend on a)222.564 -216.6 R(queue run process to actually send the mail.)189 228.6 Q(C)117 244.8 Q -F2(N)A F1 1.49(Checkpoints the queue e)189 244.8 R -.15(ve)-.25 G(ry).15 E F2 -(N)3.99 E F1(\(def)3.99 E 1.49(ault 10\) addresses sent.)-.1 F 1.49 -(If your system)6.49 F .785(crashes during deli)189 256.8 R -.15(ve)-.25 G .785 -(ry to a lar).15 F .785(ge list, this pre)-.18 F -.15(ve)-.25 G .785 -(nts retransmission to an).15 F 3.285(yb)-.15 G(ut)496.22 256.8 Q -(the last recipients.)189 268.8 Q(d)117 285 Q F2(x)A F1(Deli)189 285 Q -.15(ve) --.25 G 2.5(ri).15 G 2.5(nm)223.87 285 S(ode)239.15 285 Q F2(x)2.5 E F1 5(.L)C --2.25 -.15(eg a)274.14 285 T 2.5(lm).15 G(odes are:)300.88 285 Q 17.22(iD)229 -301.2 S(eli)256.22 301.2 Q -.15(ve)-.25 G 2.5(ri).15 G(nteracti)283.87 301.2 Q --.15(ve)-.25 G(ly \(synchronously\)).15 E 15(bD)229 313.2 S(eli)256.22 313.2 Q --.15(ve)-.25 G 2.5(ri).15 G 2.5(nb)283.87 313.2 S(ackground \(asynchronously\)) -296.37 313.2 Q 15(qJ)229 325.2 S(ust queue the message \(deli)252.89 325.2 Q --.15(ve)-.25 G 2.5(rd).15 G(uring queue run\))382.74 325.2 Q(Def)189 341.4 Q -1.32(aults to `)-.1 F(`b')-.74 E 3.82('i)-.74 G 3.82(fn)261.64 341.4 S 3.82(oo) -273.79 341.4 S 1.32(ption is speci\214ed, `)287.61 341.4 R(`i')-.74 E 3.82('i) --.74 G 3.82(fi)385.57 341.4 S 3.82(ti)395.5 341.4 S 3.82(ss)404.88 341.4 S 1.32 -(peci\214ed b)416.48 341.4 R 1.32(ut gi)-.2 F -.15(ve)-.25 G 3.82(nn).15 G(o) -499 341.4 Q(ar)189 353.4 Q(gument \(i.e., `)-.18 E(`Od')-.74 E 2.5('i)-.74 G -2.5(se)278.98 353.4 S(qui)289.81 353.4 Q -.25(va)-.25 G(lent to `).25 E(`Odi') --.74 E('\).)-.74 E 64.78(DI)117 369.6 S 2.736(fs)192.33 369.6 S .236(et, reb) -202.286 369.6 R .236(uild the alias database if necessary and possible.)-.2 F -.235(If this option is not)5.236 F(set,)189 381.6 Q F2(sendmail)3.385 E F1 .885 -(will ne)3.385 F -.15(ve)-.25 G 3.385(rr).15 G(eb)292.96 381.6 Q .885 -(uild the alias database unless e)-.2 F .885(xplicitly requested)-.15 F(using) -189 393.6 Q F0(\255bi)2.5 E F1(.)A(e)117 409.8 Q F2(x)A F1 -(Dispose of errors using mode)189 409.8 Q F2(x)2.5 E F1 5(.T)C(he v)327.31 -409.8 Q(alues for)-.25 E F2(x)2.5 E F1(are:)2.5 E 15(pP)229 426 S -(rint error messages \(def)254.56 426 Q(ault\))-.1 E 15(qN)229 438 S 2.5(om) -256.22 438 S(essages, just gi)271.5 438 Q .3 -.15(ve ex)-.25 H(it status).15 E -12.22(mM)229 450 S(ail back errors)257.89 450 Q 12.78(wW)229 462 S -(rite back errors \(mail if user not logged in\))258.44 462 Q 15.56(eM)229 474 -S(ail back errors and gi)257.89 474 Q .3 -.15(ve z)-.25 H(ero e).15 E -(xit stat al)-.15 E -.1(wa)-.1 G(ys).1 E(E)117 494.4 Q F2(\214le/messa)A -.1 -(ge)-.1 G F1 .549(Prepend error messages with the indicated message.)189 494.4 -R .549(If it be)5.549 F .549(gins with a slash,)-.15 F .107(it is assumed to b\ -e the pathname of a \214le containing a message \(this is the rec-)189 506.4 R -1.317(ommended setting\).)189 518.4 R 1.316 -(Otherwise, it is a literal message.)6.317 F 1.316(The error \214le might)6.316 -F .99 -(contain the name, email address, and/or phone number of a local postmaster)189 -530.4 R .429(who could pro)189 542.4 R .429(vide assistance in to end users.) --.15 F .428(If the option is missing or null,)5.429 F .342 -(or if it names a \214le which does not e)189 554.4 R .342 -(xist or which is not readable, no message)-.15 F(is printed.)189 566.4 Q 68.67 -(fS)117 582.6 S -2.25 -.2(av e)194.56 582.6 T 2.399 -(Unix-style \231From\232 lines at the front of headers.)5.1 F 2.399 -(Normally the)7.399 F 4.899(ya)-.15 G(re)496.23 582.6 Q -(assumed redundant and discarded.)189 594.6 Q(F)117 610.8 Q F2(mode)A F1 -(The \214le mode for queue \214les.)189 610.8 Q(g)117 627 Q F2(n)A F1 .933 -(Set the def)189 627 R .933(ault group id for mailers to run in to)-.1 F F2(n) -3.433 E F1 5.933(.D)C(ef)408.966 627 Q .933(aults to 1.)-.1 F .934(The v)5.934 -F(alue)-.25 E(can also be gi)189 639 Q -.15(ve)-.25 G 2.5(na).15 G 2.5(sas) -264.69 639 S(ymbolic group name.)281.91 639 Q 64.78(GA)117 655.2 S(llo)196.22 -655.2 Q 3.492(wf)-.25 G .992(uzzy matching on the GECOS \214eld.)220.572 655.2 -R .991(If this \215ag is set, and the usual)5.991 F .793(user name lookups f) -189 667.2 R .793(ail \(that is, there is no alias with this name and a)-.1 F F2 --.1(ge)3.294 G(tpw-).1 E(nam)189 679.2 Q F1 -.1(fa)3.702 G 1.202 -(ils\), sequentially search the passw).1 F 1.201 -(ord \214le for a matching entry in the)-.1 F 1.446(GECOS \214eld.)189 691.2 R -1.446(This also requires that MA)6.446 F 1.446(TCHGECOS be turned on during) --1.11 F 2.5(compilation. This)189 703.2 R(option is not recommended.)2.5 E EP -%%Page: 35 30 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF(Sendmail Installation and Operation Guide)72 60 Q -(SMM:08-35)452.9 60 Q/F1 10/Times-Roman@0 SF(h)117 96 Q/F2 10/Times-Italic@0 SF -(N)A F1 1.274(The maximum hop count.)189 96 R 1.274(Messages that ha)6.274 F -1.574 -.15(ve b)-.2 H 1.273(een processed more than).15 F F2(N)3.773 E F1 -(times are assumed to be in a loop and are rejected.)189 108 Q(Def)5 E -(aults to 25.)-.1 E(H)117 124.2 Q F2(\214le)A F1 -(Specify the help \214le for SMTP)189 124.2 Q(.)-1.11 E 69.22(iI)117 140.4 S -1.014(gnore dots in incoming messages.)192.33 140.4 R 1.014(This is al)6.014 F --.1(wa)-.1 G 1.014(ys disabled \(that is, dots are).1 F(al)189 152.4 Q -.1(wa) --.1 G(ys accepted\) when reading SMTP mail.).1 E 68.67(II)117 168.6 S .62 -(nsist that the BIND name serv)192.33 168.6 R .619(er be running to resolv)-.15 -F 3.119(eh)-.15 G .619(ost names.)421.524 168.6 R .619(If this is)5.619 F .945 -(not set and the name serv)189 180.6 R .945(er is not running, the)-.15 F F2 -(/etc/hosts)3.445 E F1 .945(\214le will be consid-)3.445 F .188(ered complete.) -189 192.6 R .188(In general, you do w)5.188 F .188 -(ant to set this option if your)-.1 F F2(/etc/hosts)2.687 E F1(\214le)2.687 E -.412(does not include all hosts kno)189 204.6 R .412 -(wn to you or if you are using the MX \(mail for)-.25 F(-)-.2 E -.1(wa)189 -216.6 S .315(rding\) feature of the BIND name serv).1 F(er)-.15 E 5.315(.T)-.55 -G .315(he name serv)373.955 216.6 R .314(er will still be con-)-.15 F 1.522 -(sulted e)189 228.6 R -.15(ve)-.25 G 4.022(ni).15 G 4.022(ft)242.194 228.6 S -1.523(his option is not set, b)252.326 228.6 R(ut)-.2 E F2(sendmail)4.023 E F1 -1.523(will feel free to resort to)4.023 F(reading)189 240.6 Q F2(/etc/hosts) -3.053 E F1 .553(if the name serv)3.053 F .552(er is not a)-.15 F -.25(va)-.2 G -3.052(ilable. Thus,).25 F .552(you should)3.052 F F2(ne)3.052 E(ver)-.15 E F1 -(set this option if you do not run the name serv)189 252.6 Q(er)-.15 E(.)-.55 E -69.22(jI)117 268.8 S 3.128(fs)192.33 268.8 S .628 -(et, send error messages in MIME format \(see RFC1341 and RFC1344 for)202.678 -268.8 R(details\).)189 280.8 Q(J)117 297 Q F2(path)A F1 4.923 -(Set the path for searching for users' .forw)189 297 R 4.923(ard \214les.)-.1 F -4.922(The def)9.922 F 4.922(ault is)-.1 F(\231$z/.forw)189 309 Q 2.868 -(ard\232. Some)-.1 F .368 -(sites that use the automounter may prefer to change this)2.868 F .676 -(to \231/v)189 321 R(ar/forw)-.25 E .676 -(ard/$u\232 to search a \214le with the same name as the user in a sys-)-.1 F -.924(tem directory)189 333 R 5.924(.I)-.65 G 3.424(tc)254.628 333 S .924 -(an also be set to a sequence of paths separated by colons;)265.272 333 R F2 -(sendmail)189 345 Q F1 .645 -(stops at the \214rst \214le it can successfully and safely open.)3.146 F -.15 -(Fo)5.645 G 3.145(re).15 G(xam-)483.45 345 Q 1.535(ple, \231/v)189 357 R -(ar/forw)-.25 E(ard/$u:$z/.forw)-.1 E 1.535(ard\232 will search \214rst in /v) --.1 F(ar/forw)-.25 E(ard/)-.1 E F2(username)A F1(and then in)189 369 Q F2 -(~username)2.5 E F1(/.forw)A(ard \(b)-.1 E -(ut only if the \214rst \214le does not e)-.2 E(xist\).)-.15 E(k)117 385.2 Q F2 -(N)A F1 .196 -(The maximum number of open connections that will be cached at a time.)189 -385.2 R(The)5.196 E(def)189 397.2 Q 1.956(ault is one.)-.1 F 1.956 -(This delays closing the current connection until either this)6.956 F(in)189 -409.2 Q -.2(vo)-.4 G .516(cation of).2 F F2(sendmail)3.016 E F1 .516 -(needs to connect to another host or it terminates.)3.016 F(Set-)5.515 E 1.958 -(ting it to zero def)189 421.2 R 1.958(aults to the old beha)-.1 F(vior)-.2 E -4.459(,t)-.4 G 1.959(hat is, connections are closed)379.244 421.2 R -(immediately)189 433.2 Q(.)-.65 E(K)117 449.4 Q F2(timeout)A F1 .883 -(The maximum amount of time a cached connection will be permitted to idle)189 -449.4 R 2.746(without acti)189 461.4 R(vity)-.25 E 7.746(.I)-.65 G 5.246(ft) -267.482 461.4 S 2.746(his time is e)278.838 461.4 R 2.746 -(xceeded, the connection is immediately)-.15 F 4.423(closed. This)189 473.4 R --.25(va)4.423 G 1.922(lue should be small \(on the order of ten minutes\).).25 -F(Before)6.922 E F2(sendmail)189 485.4 Q F1 1.286 -(uses a cached connection, it al)3.786 F -.1(wa)-.1 G 1.287 -(ys sends a NOOP \(no operation\)).1 F 2.058 -(command to check the connection; if this f)189 497.4 R 2.058 -(ails, it reopens the connection.)-.1 F .478(This k)189 509.4 R .478 -(eeps your end from f)-.1 F .478(ailing if the other end times out.)-.1 F .478 -(The point of this)5.478 F 3.099(option is to be a good netw)189 521.4 R 3.099 -(ork neighbor and a)-.1 F -.2(vo)-.2 G 3.099(id using up e).2 F(xcessi)-.15 E --.15(ve)-.25 G(resources on the other end.)189 533.4 Q(The def)5 E -(ault is \214v)-.1 E 2.5(em)-.15 G(inutes.)383.99 533.4 Q 69.22(lI)117 549.6 S -3.14(ft)192.33 549.6 S .64(here is an \231Errors-T)201.58 549.6 R .64 -(o:\232 header)-.8 F 3.14(,s)-.4 G .64 -(end error messages to the addresses listed)333.53 549.6 R 3.951(there. The)189 -561.6 R 3.951(yn)-.15 G 1.451(ormally go to the en)247.292 561.6 R -.15(ve)-.4 -G 1.451(lope sender).15 F 6.451(.U)-.55 G 1.451(se of this option causes) -405.428 561.6 R F2(sendmail)189 573.6 Q F1(to violate RFC 1123.)2.5 E(L)117 -589.8 Q F2(n)A F1(Set the def)189 589.8 Q(ault log le)-.1 E -.15(ve)-.25 G 2.5 -(lt).15 G(o)288.77 589.8 Q F2(n)2.5 E F1 5(.D)C(ef)315.99 589.8 Q(aults to 9.) --.1 E 64.22(mS)117 606 S(end to me too, e)194.56 606 Q -.15(ve)-.25 G 2.5(ni) -.15 G 2.5(fIa)278.04 606 S 2.5(mi)294.14 606 S 2.5(na)307.2 606 S 2.5(na)319.14 -606 S(lias e)331.08 606 Q(xpansion.)-.15 E(M)117 622.2 Q F2 1.666(xv)C(alue) --1.666 E F1 1.312(Set the macro)189 622.2 R F2(x)3.812 E F1(to)3.812 E F2 -(value)3.812 E F1 6.312(.T)C 1.312 -(his is intended only for use from the command)306.852 622.2 R(line.)189 634.2 -Q 67(nV)117 650.4 S(alidate the RHS of aliases when reb)195.11 650.4 Q -(uilding the alias database.)-.2 E 67(oA)117 666.6 S 1.786 -(ssume that the headers may be in old format, i.e., spaces delimit names.) -196.22 666.6 R .432(This actually turns on an adapti)189 678.6 R .733 -.15 -(ve a)-.25 H .433(lgorithm: if an).15 F 2.933(yr)-.15 G .433 -(ecipient address contains)403.154 678.6 R 5.09(ac)189 690.6 S 2.589 -(omma, parenthesis, or angle brack)202.97 690.6 R 2.589 -(et, it will be assumed that commas)-.1 F .484(already e)189 702.6 R 2.984 -(xist. If)-.15 F .485(this \215ag is not on, only commas delimit names.)2.984 F -.485(Headers are)5.485 F(al)189 714.6 Q -.1(wa)-.1 G -(ys output with commas between the names.).1 E EP -%%Page: 36 31 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF 193.36(SMM:08-36 Sendmail)72 60 R -(Installation and Operation Guide)2.5 E/F1 10/Times-Roman@0 SF(O)117 96 Q/F2 10 -/Times-Italic@0 SF(options)A F1(Set serv)189 96 Q(er SMTP options.)-.15 E -(The options are)5 E F2 -.1(ke)2.5 G(y=value)-.2 E F1 2.5(pairs. Kno)2.5 F -(wn k)-.25 E -.15(ey)-.1 G 2.5(sa).15 G(re:)488.82 96 Q 52.83(Port Name/number) -229 112.2 R(of listening port \(def)2.5 E(aults to "smtp"\))-.1 E 48.95 -(Addr Address)229 124.2 R(mask \(def)2.5 E(aults IN)-.1 E(ADDR_ANY\))-.35 E --.15(Fa)229 136.2 S 41.31(mily Address).15 F -.1(fa)2.5 G(mily \(def).1 E -(aults to INET\))-.1 E 44.5(Listen Size)229 148.2 R(of listen queue \(def)2.5 E -(aults to 10\))-.1 E(The)189 164.4 Q F2(Addr)4.114 E F1 1.614 -(ess mask may be a numeric address in dot notation or a netw)B(ork)-.1 E(name.) -189 176.4 Q(p)117 192.6 Q F2(opt,opt,...)1.666 E F1 1.22(Set the pri)189 192.6 -R -.25(va)-.25 G -.15(cy).25 G F2(opt)3.871 E F1 3.721(ions. `)B(`Pri)-.74 E --.25(va)-.25 G -.15(cy).25 G 2.701 -.74('' i).15 H 3.721(sr).74 G 1.221 -(eally a misnomer; man)351.854 192.6 R 3.721(yo)-.15 G 3.721(ft)460.468 192.6 S -1.221(hese are)470.299 192.6 R 2.419(just a w)189 204.6 R 2.418 -(ay of insisting on stricter adherence to the SMTP protocol.)-.1 F(The)7.418 E -F2(opt)189 216.6 Q F1(ions can be selected from:)A 40.26(public Allo)229 232.8 -R 2.5(wo)-.25 G(pen access)329.01 232.8 Q 11.38(needmailhelo Insist)229 244.8 R -(on HELO or EHLO command before MAIL)2.5 E(neede)229 256.8 Q 9.87 -(xpnhelo Insist)-.15 F(on HELO or EHLO command before EXPN)2.5 E(noe)229 268.8 -Q 35.97(xpn Disallo)-.15 F 2.5(wE)-.25 G(XPN entirely)341.23 268.8 Q 12.5 -(needvrfyhelo Insist)229 280.8 R(on HELO or EHLO command before VRFY)2.5 E(no) -229 292.8 Q 38.75(vrfy Disallo)-.15 F 2.5(wV)-.25 G(RFY entirely)342.34 292.8 Q -14.71(restrictmailq Restrict)229 304.8 R(mailq command)2.5 E 19.16 -(restrictqrun Restrict)229 316.8 R(\255q command line \215ag)2.5 E 24.16 -(noreceipts Ignore)229 328.8 R(Return-Receipt-T)2.5 E(o: header)-.8 E(goa)229 -340.8 Q -.1(wa)-.15 G 36.91(yD).1 G(isallo)303.98 340.8 Q 2.5(we)-.25 G -(ssentially all SMTP status queries)339.56 340.8 Q(authw)229 352.8 Q 11.48 -(arnings Put)-.1 F(X-Authentication-W)2.5 E(arning: headers in messages)-.8 E -1.565(The \231goa)189 369 R -.1(wa)-.15 G 1.565 -(y\232 pseudo-\215ag sets all \215ags e).1 F 1.566 -(xcept \231restrictmailq\232 and \231restric-)-.15 F 4.299(tqrun\232. If)189 -381 R 1.798(mailq is restricted, only people in the same group as the queue) -4.299 F .946(directory can print the queue.)189 393 R .946 -(If queue runs are restricted, only root and the)5.946 F -.25(ow)189 405 S .178 -(ner of the queue directory can run the queue.).25 F .178(Authentication W) -5.178 F .178(arnings add)-.8 F -.1(wa)189 417 S .008(rnings about v).1 F .008 -(arious conditions that may indicate attempts to spoof the mail)-.25 F -(system, such as using an non-standard queue directory)189 429 Q(.)-.65 E(P)117 -445.2 Q F2(postmaster)A F1 1.115 -(If set, copies of error messages will be sent to the named)189 445.2 R F2 -(postmaster)3.614 E F1 6.114(.O)C(nly)491.22 445.2 Q .397(the header of the f) -189 457.2 R .398(ailed message is sent.)-.1 F .398 -(Since most errors are user problems,)5.398 F .564 -(this is probably not a good idea on lar)189 469.2 R .563(ge sites, and ar)-.18 -F .563(guably contains all sorts)-.18 F .05(of pri)189 481.2 R -.25(va)-.25 G -.35 -.15(cy v).25 H .05(iolations, b).15 F .05 -(ut it seems to be popular with certain operating systems)-.2 F -.15(ve)189 -493.2 S(ndors.).15 E(q)117 509.4 Q F2(factor)A F1(Use)189 509.4 Q F2(factor) -3.098 E F1 .597 -(as the multiplier in the map function to decide when to just queue)3.098 F -.425(up jobs rather than run them.)189 521.4 R .425(This v)5.425 F .425 -(alue is di)-.25 F .426(vided by the dif)-.25 F .426(ference between)-.25 F -1.064(the current load a)189 533.4 R -.15(ve)-.2 G 1.064(rage and the load a) -.15 F -.15(ve)-.2 G 1.064(rage limit \().15 F F0(x)A F1 1.063 -(\215ag\) to determine the)3.564 F(maximum message priority that will be sent.) -189 545.4 Q(Def)5 E(aults to 600000.)-.1 E(Q)117 561.6 Q F2(dir)A F1 -(Use the named)189 561.6 Q F2(dir)2.5 E F1(as the queue directory)2.5 E(.)-.65 -E(r)117 577.8 Q F2(timeouts)1.666 E F1 -.35(Ti)189 577.8 S 3.938 -(meout reads after).35 F F2(time)6.438 E F1(interv)6.438 E 6.438(al. The)-.25 F -F2(timeouts)6.438 E F1(ar)6.438 E 3.938(gument is a list of)-.18 F F2 -.1(ke) -189 589.8 S(ywor)-.2 E(d=value)-.37 E F1 3.61(pairs. The)3.61 F 1.11 -(recognized timeouts and their def)3.61 F 1.11(ault v)-.1 F 1.11(alues, and) --.25 F(their minimum v)189 601.8 Q -(alues speci\214ed in RFC 1123 section 5.3.2 are:)-.25 E EP -%%Page: 37 32 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF(Sendmail Installation and Operation Guide)72 60 Q -(SMM:08-37)452.9 60 Q/F1 10/Times-Roman@0 SF 23.6(initial w)229 96 R -(ait for initial greeting message [5m, 5m])-.1 E 29.72(helo reply)229 108 R -(to HELO or EHLO command [5m, none])2.5 E 29.16(mail reply)229 120 R -(to MAIL command [10m, 5m])2.5 E 31.39(rcpt reply)229 132 R -(to RCPT command [1h, 5m])2.5 E 16.94(datainit reply)229 144 R(to D)2.5 E -1.21 --1.11(AT A)-.4 H(command [5m, 2m])3.61 E 8.06(datablock data)229 156 R -(block read [1h, 3m])2.5 E 12.5(data\214nal reply)229 168 R(to \214nal `)2.5 E -(`.)-.74 E 1.48 -.74('' i)-.7 H 2.5(nd).74 G(ata [1h, 10m])363.47 168 Q 32.5 -(rset reply)229 180 R(to RSET command [5m, none])2.5 E 31.38(quit reply)229 192 -R(to Q)2.5 E(UIT command [2m, none])-.1 E 28.05(misc reply)229 204 R -(to NOOP and VERB commands [2m, none])2.5 E 7.5(command command)229 216 R -(read [1h, 5m])2.5 E 26.94(ident IDENT)229 228 R(protocol timeout [30s, none]) -2.5 E .798(All b)189 244.2 R .798(ut \231command\232 apply to client SMTP)-.2 F -5.798(.F)-1.11 G .798(or back compatibility)373.406 244.2 R 3.299(,at)-.65 G -(imeout)476.22 244.2 Q(with no `)189 256.2 Q(`k)-.74 E -.15(ey)-.1 G -.1(wo).15 -G(rd=').1 E 2.5('p)-.74 G(art will set all of the longer v)281.4 256.2 Q -(alues.)-.25 E 65.33(RN)117 272.4 S(ormally)196.22 272.4 Q(,)-.65 E/F2 10 -/Times-Italic@0 SF(sendmail)4.154 E F1 1.653(tries to eliminate an)4.154 F -4.153(yu)-.15 G 1.653(nnecessary e)371.721 272.4 R 1.653(xplicit routes when) --.15 F .931(sending an error message \(as discussed in RFC 1123 \247 5.2.6\).) -189 284.4 R -.15(Fo)5.931 G 3.431(re).15 G(xample,)472.06 284.4 Q -(when sending an error message to)189 296.4 Q(<@kno)229 312.6 Q(wn1,@kno)-.25 E -(wn2,@unkno)-.25 E(wn:user@kno)-.25 E(wn3>)-.25 E F2(sendmail)189 328.8 Q F1 -.46(will strip of)2.96 F 2.96(ft)-.25 G .46(he \231@kno)284.48 328.8 R .46 -(wn1\232 in order to mak)-.25 F 2.96(et)-.1 G .46(he route as direct as)422.74 -328.8 R 3.429(possible. Ho)189 340.8 R(we)-.25 E -.15(ve)-.25 G 1.729 -.4(r, i) -.15 H 3.429(ft).4 G(he)284.057 340.8 Q F0(R)3.429 E F1 .929 -(option is set, this will be disabled, and the mail)3.429 F .362 -(will be sent to the \214rst address in the route, e)189 352.8 R -.15(ve)-.25 G -2.862(ni).15 G 2.862(fl)391.452 352.8 S .362(ater addresses are kno)400.424 -352.8 R(wn.)-.25 E(This may be useful if you are caught behind a \214re)189 -364.8 Q -.1(wa)-.25 G(ll.).1 E 68.11(sB)117 381 S 2.729(es)195.67 381 S(uper) -206.729 381 Q .229(-safe when running things, i.e., al)-.2 F -.1(wa)-.1 G .229 -(ys instantiate the queue \214le, e).1 F -.15(ve)-.25 G(n).15 E .739 -(if you are going to attempt immediate deli)189 393 R -.15(ve)-.25 G(ry).15 E -(.)-.65 E F2(Sendmail)5.739 E F1(al)3.239 E -.1(wa)-.1 G .739(ys instantiates) -.1 F(the queue \214le before returning control the client under an)189 405 Q -2.5(yc)-.15 G(ircumstances.)429.35 405 Q(S)117 421.2 Q F2(\214le)A F1 -(Log statistics in the named)189 421.2 Q F2(\214le)2.5 E F1(.)A(t)117 437.4 Q -F2(tzinfo)A F1 .716(Set the local time zone info to)189 437.4 R F2(tzinfo)3.217 -E F1 3.217<8a66>3.217 G .717(or e)358.499 437.4 R .717 -(xample, \231PST8PDT\232.)-.15 F(Actually)5.717 E(,)-.65 E .315 -(if this is not set, the TZ en)189 449.4 R .314(vironment v)-.4 F .314 -(ariable is cleared \(so the system def)-.25 F(ault)-.1 E .55 -(is used\); if set b)189 461.4 R .55(ut null, the user')-.2 F 3.051(sT)-.55 G -3.051(Zv)334.032 461.4 S .551(ariable is used, and if set and non-null)347.943 -461.4 R(the TZ v)189 473.4 Q(ariable is set to this v)-.25 E(alue.)-.25 E(T)117 -489.6 Q F2(rtime/wtime)A F1 1.604(Set the queue timeout to)189 489.6 R F2 -(rtime)4.103 E F1 6.603(.A)C 1.603(fter this interv)334.172 489.6 R 1.603 -(al, messages that ha)-.25 F 1.903 -.15(ve n)-.2 H(ot).15 E 1.251 -(been successfully sent will be returned to the sender)189 501.6 R 6.252(.D) --.55 G(ef)422.724 501.6 Q 1.252(aults to \214v)-.1 F 3.752(ed)-.15 G(ays.) -488.17 501.6 Q .546(The optional)189 513.6 R F2(wtime)3.046 E F1 .546 -(is the time after which a w)3.046 F .546(arning message is sent.)-.1 F .546 -(If it is)5.546 F(missing or zero then no w)189 525.6 Q -(arning messages are sent.)-.1 E(u)117 541.8 Q F2(n)A F1 .175(Set the def)189 -541.8 R .175(ault userid for mailers to)-.1 F F2(n)2.675 E F1 5.175(.M)C .175 -(ailers without the)355.28 541.8 R F2(S)2.676 E F1 .176(\215ag in the mailer) -2.676 F .084(de\214nition will run as this user)189 553.8 R 5.084(.D)-.55 G(ef) -322.844 553.8 Q .084(aults to 1.)-.1 F .084(The v)5.084 F .084 -(alue can also be gi)-.25 F -.15(ve)-.25 G 2.583(na).15 G 2.583(sa)493.087 -553.8 S(symbolic user name.)189 565.8 Q(U)117 582 Q F2(udbspec)A F1 -(The user database speci\214cation.)189 582 Q 67(vR)117 598.2 S .411(un in v) -195.67 598.2 R .411(erbose mode.)-.15 F .411(If this is set,)5.411 F F2 -(sendmail)2.912 E F1 .412(adjusts options)2.912 F F0(c)2.912 E F1(\(don')2.912 -E 2.912(tc)-.18 G(onnect)477.34 598.2 Q .428(to e)189 610.2 R(xpensi)-.15 E -.728 -.15(ve m)-.25 H .428(ailers\) and).15 F F0(d)2.928 E F1(\(deli)2.928 E --.15(ve)-.25 G .428(ry mode\) so that all mail is deli).15 F -.15(ve)-.25 G -.427(red com-).15 F .048 -(pletely in a single job so that you can see the entire deli)189 622.2 R -.15 -(ve)-.25 G .048(ry process.).15 F(Option)5.048 E F0(v)2.548 E F1(should)189 -634.2 Q F2(ne)3.39 E(ver)-.15 E F1 .889 -(be set in the con\214guration \214le; it is intended for command line)3.39 F -(use only)189 646.2 Q(.)-.65 E(V)117 662.4 Q F2(fallbac)A(khost)-.2 E F1 .963 -(If speci\214ed, the)189 662.4 R F2(fallbac)3.464 E(khost)-.2 E F1 .964 -(acts lik)3.464 F 3.464(eav)-.1 G .964(ery lo)358.606 662.4 R 3.464(wp)-.25 G -.964(riority MX on e)398.054 662.4 R -.15(ve)-.25 G .964(ry host.).15 F -(This is intended to be used by sites with poor netw)189 674.4 Q(ork connecti) --.1 E(vity)-.25 E(.)-.65 E 64.78(wI)117 690.6 S 4.06(fy)192.33 690.6 S 1.56 -(ou are the \231best\232 \(that is, lo)204.72 690.6 R 1.56 -(west preference\) MX for a gi)-.25 F -.15(ve)-.25 G 4.06(nh).15 G 1.56 -(ost, you)470.77 690.6 R .433 -(should normally detect this situation and treat that condition specially)189 -702.6 R 2.933(,b)-.65 G 2.933(yf)481.277 702.6 S(or)492.54 702.6 Q(-)-.2 E -.1 -(wa)189 714.6 S .594 -(rding the mail to a UUCP feed, treating it as local, or whate).1 F -.15(ve) --.25 G 4.193 -.55(r. H).15 H -.25(ow).55 G -2.15 -.25(ev e).25 H -.4(r,).25 G -EP -%%Page: 38 33 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF 193.36(SMM:08-38 Sendmail)72 60 R -(Installation and Operation Guide)2.5 E/F1 10/Times-Roman@0 SF 1.897 -(in some cases \(such as Internet \214re)189 96 R -.1(wa)-.25 G 1.898 -(lls\) you may w).1 F 1.898(ant to try to connect)-.1 F .352 -(directly to that host as though it had no MX records at all.)189 108 R .352 -(Setting this option)5.352 F(causes)189 120 Q/F2 10/Times-Italic@0 SF(sendmail) -3.032 E F1 .532(to try this.)3.032 F .532(The do)5.532 F .533 -(wnside is that errors in your con\214guration)-.25 F .543(are lik)189 132 R -.543(ely to be diagnosed as \231host unkno)-.1 F .542 -(wn\232 or \231message timed out\232 instead)-.25 F -(of something more meaningful.)189 144 Q(This option is disrecommended.)5 E(x) -117 160.2 Q F2(LA)A F1 .108(When the system load a)189 160.2 R -.15(ve)-.2 G -.108(rage e).15 F(xceeds)-.15 E F2(LA)2.608 E F1 2.608(,j)C .109 -(ust queue messages \(i.e., don')367.546 160.2 R 2.609(tt)-.18 G(ry)495.67 -160.2 Q(to send them\).)189 172.2 Q(Def)5 E(aults to 8.)-.1 E(X)117 188.4 Q F2 -(LA)A F1 1.251(When the system load a)189 188.4 R -.15(ve)-.2 G 1.251(rage e) -.15 F(xceeds)-.15 E F2(LA)3.751 E F1 3.751(,r)C 1.251 -(efuse incoming SMTP connec-)376.097 188.4 R 2.5(tions. Def)189 200.4 R -(aults to 12.)-.1 E(y)117 216.6 Q F2(fact)A F1 .621(The indicated)189 216.6 R -F2(fact)3.121 E F1 .621(or is added to the priority \(thus)B F2(lowering)3.122 -E F1 .622(the priority of the)3.122 F 1.384 -(job\) for each recipient, i.e., this v)189 228.6 R 1.383 -(alue penalizes jobs with lar)-.25 F 1.383(ge numbers of)-.18 F 2.5 -(recipients. Def)189 240.6 R(aults to 30000.)-.1 E 64.78(YI)117 256.8 S 3.346 -(fs)192.33 256.8 S .846(et, deli)202.896 256.8 R -.15(ve)-.25 G 3.346(re).15 G -.847(ach job that is run from the queue in a separate process.)251.118 256.8 R -(Use)5.847 E .037(this option if you are short of memory)189 268.8 R 2.536(,s) --.65 G .036(ince the def)350.024 268.8 R .036(ault tends to consume con-)-.1 F -(siderable amounts of memory while the queue is being processed.)189 280.8 Q(z) -117 297 Q F2(fact)A F1 1.644(The indicated)189 297 R F2(fact)4.144 E F1 1.645 -(or is multiplied by the message class \(determined by the)B .923 -(Precedence: \214eld in the user header and the)189 309 R F0(P)3.423 E F1 .923 -(lines in the con\214guration \214le\))3.423 F .819 -(and subtracted from the priority)189 321 R 5.819(.T)-.65 G .819 -(hus, messages with a higher Priority: will)333.255 321 R(be f)189 333 Q -.2 -(avo)-.1 G 2.5(red. Def).2 F(aults to 1800.)-.1 E(Z)117 349.2 Q F2(fact)A F1 -(The)189 349.2 Q F2(fact)3.346 E F1 .846(or is added to the priority e)B -.15 -(ve)-.25 G .846(ry time a job is processed.).15 F .845(Thus, each)5.845 F .942 -(time a job is processed, its priority will be decreased by the indicated v)189 -361.2 R(alue.)-.25 E .297(In most en)189 373.2 R .296 -(vironments this should be positi)-.4 F -.15(ve)-.25 G 2.796(,s).15 G .296 -(ince hosts that are do)378.614 373.2 R .296(wn are all)-.25 F(too often do)189 -385.2 Q(wn for a long time.)-.25 E(Def)5 E(aults to 90000.)-.1 E 67(7S)117 -401.4 S .278(trip input to se)194.56 401.4 R -.15(ve)-.25 G 2.778(nb).15 G .278 -(its for compatibility with old systems.)275.272 401.4 R .279(This shouldn') -5.279 F 2.779(tb)-.18 G(e)499.56 401.4 Q(necessary)189 413.4 Q(.)-.65 E .78 -(All options can be speci\214ed on the command line using the \255o \215ag, b) -117 429.6 R .779(ut most will cause)-.2 F F2(send-)3.279 E(mail)117 441.6 Q F1 -.236(to relinquish its setuid permissions.)2.736 F .237 -(The options that will not cause this are b, d, e, i, L, m,)5.237 F .175 -(o, p, r)117 453.6 R 2.675(,s)-.4 G 2.675(,v)149.345 453.6 S 2.675(,C)158.87 -453.6 S 2.675(,a)170.715 453.6 S .174(nd 7.)180.33 453.6 R .174(Also, M \(de\ -\214ne macro\) when de\214ning the r or s macros is also considered)5.174 F -(\231safe\232.)117 465.6 Q F0 2.5(5.1.7. P)102 489.6 R 2.5<8a70>2.5 G -.18(re) -156.17 489.6 S(cedence de\214nitions).18 E F1 -1.11(Va)142 505.8 S .304 -(lues for the \231Precedence:\232 \214eld may be de\214ned using the)1.11 F F0 -(P)2.805 E F1 .305(control line.)2.805 F .305(The syntax of)5.305 F -(this \214eld is:)117 517.8 Q F0(P)157 534 Q F2(name)A F0(=)A F2(num)A F1 .286 -(When the)117 550.2 R F2(name)2.786 E F1 .285 -(is found in a \231Precedence:\232 \214eld, the message class is set to)2.786 F -F2(num)2.785 E F1 5.285(.H)C .285(igher num-)459.555 550.2 R .479 -(bers mean higher precedence.)117 562.2 R .479(Numbers less than zero ha)5.479 -F .779 -.15(ve t)-.2 H .48(he special property that if an error).15 F 1.11(occ\ -urs during processing the body of the message will not be returned; this is e) -117 574.2 R 1.11(xpected to be)-.15 F .678(used for \231b)117 586.2 R .678 -(ulk\232 mail such as through mailing lists.)-.2 F .678(The def)5.678 F .678 -(ault precedence is zero.)-.1 F -.15(Fo)5.678 G 3.178(re).15 G(xam-)483.45 -586.2 Q(ple, our list of precedences is:)117 598.2 Q(P\214rst-class=0)157 614.4 -Q(Pspecial-deli)157 626.4 Q -.15(ve)-.25 G(ry=100).15 E(Plist=\25530)157 638.4 -Q(Pb)157 650.4 Q(ulk=\25560)-.2 E(Pjunk=\255100)157 662.4 Q .8 -(People writing mailing list e)117 678.6 R .799 -(xploders are encouraged to use \231Precedence: list\232.)-.15 F .799(Older v) -5.799 F(ersions)-.15 E(of)117 690.6 Q F2(sendmail)3.759 E F1 1.259 -(\(which discarded all error returns for ne)3.759 F -.05(ga)-.15 G(ti).05 E -1.559 -.15(ve p)-.25 H 1.259(recedences\) didn').15 F 3.76(tr)-.18 G 1.26 -(ecognize this)450.25 690.6 R .255(name, gi)117 702.6 R .255(ving it a def)-.25 -F .255(ault precedence of zero.)-.1 F .254(This allo)5.254 F .254 -(ws list maintainers to see error returns on)-.25 F(both old and ne)117 714.6 Q -2.5(wv)-.25 G(ersions of)193.26 714.6 Q F2(sendmail)2.5 E F1(.)A EP -%%Page: 39 34 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF(Sendmail Installation and Operation Guide)72 60 Q -(SMM:08-39)452.9 60 Q 2.5(5.1.8. V)102 96 R 2.5<8a63>2.5 G(on\214guration v) -156.16 96 Q(ersion le)-.1 E -.1(ve)-.15 G(l).1 E/F1 10/Times-Roman@0 SF 2.11 --.8(To p)142 112.2 T(ro).8 E .51 -(vide compatibility with old con\214guration \214les, the)-.15 F F0(V)3.01 E F1 -.51(line has been added to de\214ne)3.01 F .173(some v)117 124.2 R .173 -(ery basic semantics of the con\214guration \214le.)-.15 F .172 -(These are not intended to be long term sup-)5.173 F 1.84(ports; rather)117 -136.2 R 4.34(,t)-.4 G(he)176.66 136.2 Q 4.34(yd)-.15 G 1.84 -(escribe compatibility features which will probably be remo)200.29 136.2 R -.15 -(ve)-.15 G 4.34(di).15 G 4.34(nf)470.78 136.2 S(uture)483.45 136.2 Q(releases.) -117 148.2 Q F0(N.B.:)142 164.4 Q F1 1.032(these v)3.532 F(ersion)-.15 E/F2 10 -/Times-Italic@0 SF(le)3.532 E(vels)-.15 E F1(ha)3.532 E 1.332 -.15(ve n)-.2 H -1.032(othing to do with the v).15 F(ersion)-.15 E F2(number)3.532 E F1 1.032 -(on the \214les.)3.532 F -.15(Fo)6.032 G(r).15 E -.15(ex)117 176.4 S .384 -(ample, as of this writing v).15 F .384 -(ersion 8 con\214g \214les \(speci\214cally)-.15 F 2.884(,8)-.65 G .384 -(.6\) used v)373.76 176.4 R .384(ersion le)-.15 F -.15(ve)-.25 G 2.884(l5c).15 -G(on\214gu-)475.11 176.4 Q(rations.)117 188.4 Q .031 -(\231Old\232 con\214guration \214les are de\214ned as v)142 204.6 R .031 -(ersion le)-.15 F -.15(ve)-.25 G 2.531(lo).15 G 2.531(ne. V)359.438 204.6 R -.031(ersion le)-1.11 F -.15(ve)-.25 G 2.53(lt).15 G .23 -.1(wo \214)433.84 -204.6 T .03(les mak).1 F 2.53(et)-.1 G(he)494.56 204.6 Q(follo)117 216.6 Q -(wing changes:)-.25 E 12.5(\(1\) Host)122 232.8 R .757(name canoni\214cation \ -\($[ ... $]\) appends a dot if the name is recognized; this gi)3.256 F -.15(ve) --.25 G(s).15 E .903(the con\214g \214le a w)148.66 244.8 R .903 -(ay of \214nding out if an)-.1 F .903(ything matched.)-.15 F(\(Actually)5.903 E -3.403(,t)-.65 G .902(his just initializes)432.186 244.8 R .424 -(the \231host\232 map with the \231\255a.)148.66 256.8 R 5.424<9a8d>-.7 G .424 -(ag \212 you can reset it to an)280.014 256.8 R .424 -(ything you prefer by declar)-.15 F(-)-.2 E(ing the map e)148.66 268.8 Q -(xplicitly)-.15 E(.\))-.65 E 12.5(\(2\) Def)122 285 R .436(ault host name e)-.1 -F .435(xtension is consistent throughout processing; v)-.15 F .435(ersion le) --.15 F -.15(ve)-.25 G 2.935(lo).15 G .435(ne con-)473.855 285 R .828 -(\214gurations turned of)148.66 297 R 3.328(fd)-.25 G .828(omain e)243.384 297 -R .828(xtension \(that is, adding the local domain name\) during)-.15 F .597 -(certain points in processing.)148.66 309 R -1.11(Ve)5.597 G .597(rsion le)1.11 -F -.15(ve)-.25 G 3.097(lt).15 G .797 -.1(wo c)326.822 309 T .597 -(on\214gurations are e).1 F .596(xpected to include a)-.15 F -(trailing dot to indicate that the name is already canonical.)148.66 321 Q 12.5 -(\(3\) Local)122 337.2 R .176 -(names that are not aliases are passed through a ne)2.675 F 2.676(wd)-.25 G -.176(istinguished ruleset \214v)388.892 337.2 R .176(e; this)-.15 F .797 -(can be used to append a local relay)148.66 349.2 R 5.797(.T)-.65 G .797 -(his beha)307.676 349.2 R .796(viour can be pre)-.2 F -.15(ve)-.25 G .796 -(nted by resolving the).15 F .62(local name with an initial `@'.)148.66 361.2 R -.621(That is, something that resolv)5.62 F .621(es to a local mailer and a)-.15 -F .844(user name of \231vikki\232 will be passed through ruleset \214v)148.66 -373.2 R .843(e, b)-.15 F .843(ut a user name of \231@vikki\232)-.2 F .328 -(will ha)148.66 385.2 R .628 -.15(ve t)-.2 H .328 -(he `@' stripped, will not be passed through ruleset \214v).15 F .328(e, b)-.15 -F .328(ut will otherwise be)-.2 F 1.509(treated the same as the prior e)148.66 -397.2 R 4.009(xample. The)-.15 F -.15(ex)4.009 G 1.508 -(pectation is that this might be used to).15 F .907(implement a polic)148.66 -409.2 R 3.407(yw)-.15 G .907(here mail sent to \231vikki\232 w)238.171 409.2 R -.908(as handled by a central hub, b)-.1 F .908(ut mail)-.2 F -(sent to \231vikki@localhost\232 w)148.66 421.2 Q(as deli)-.1 E -.15(ve)-.25 G -(red directly).15 E(.)-.65 E -1.11(Ve)142 437.4 S .229(rsion le)1.11 F -.15(ve) --.25 G 2.729(lt).15 G .229(hree \214les allo)199.828 437.4 R 2.729(w#i)-.25 G -.228(nitiated comments on all lines.)274.374 437.4 R .228 -(Exceptions are backslash)5.228 F(escaped # marks and the $# syntax.)117 449.4 -Q -1.11(Ve)142 465.6 S 1.593(rsion le)1.11 F -.15(ve)-.25 G 4.093(lf).15 G -1.593(our con\214gurations are completely equi)203.106 465.6 R -.25(va)-.25 G -1.594(lent to le).25 F -.15(ve)-.25 G 4.094(lt).15 G 1.594(hree for historical) -429.722 465.6 R(reasons.)117 477.6 Q -1.11(Ve)142 493.8 S .234(rsion le)1.11 F --.15(ve)-.25 G 2.734<6c8c>.15 G .534 -.15(ve c)202.618 493.8 T .234 -(on\214guration \214les change the def).15 F .234(ault de\214nition of)-.1 F F0 -($w)2.734 E F1 .234(to be just the \214rst)2.734 F(component of the hostname.) -117 505.8 Q(The)142 522 Q F0(V)2.64 E F1 .14(line may ha)2.64 F .44 -.15(ve a) --.2 H 2.64(no).15 G(ptional)245.8 522 Q F0(/)2.64 E F2(vendor)A F1 .14 -(to indicate that this con\214guration \214le uses modi-)2.64 F -(\214cations speci\214c to a particular v)117 536 Q(endor)-.15 E/F3 7 -/Times-Roman@0 SF(14)272.1 532 Q F1(.)279.1 536 Q F0 2.5(5.1.9. K)102 560 R 2.5 -<8a6b>2.5 G(ey \214le declaration)157.74 560 Q F1 -(Special maps can be de\214ned using the line:)142 576.2 Q -(Kmapname mapclass ar)157 592.4 Q(guments)-.18 E(The)117 608.6 Q F2(mapname) -3.443 E F1 .944(is the handle by which this map is referenced in the re)3.443 F -.944(writing rules.)-.25 F(The)5.944 E F2(map-)3.444 E(class)117 620.6 Q F1 -.301(is the name of a type of map; these are compiled in to)2.801 F F2 -(sendmail)2.8 E F1 5.3(.T)C(he)410.64 620.6 Q F2(ar)2.8 E(guments)-.37 E F1 .3 -(are inter)2.8 F(-)-.2 E .569(preted depending on the class; typically)117 -632.6 R 3.069(,t)-.65 G .569(here w)286.134 632.6 R .569(ould be a single ar) --.1 F .57(gument naming the \214le con-)-.18 F(taining the map.)117 644.6 Q .32 -LW 76 669.2 72 669.2 DL 80 669.2 76 669.2 DL 84 669.2 80 669.2 DL 88 669.2 84 -669.2 DL 92 669.2 88 669.2 DL 96 669.2 92 669.2 DL 100 669.2 96 669.2 DL 104 -669.2 100 669.2 DL 108 669.2 104 669.2 DL 112 669.2 108 669.2 DL 116 669.2 112 -669.2 DL 120 669.2 116 669.2 DL 124 669.2 120 669.2 DL 128 669.2 124 669.2 DL -132 669.2 128 669.2 DL 136 669.2 132 669.2 DL 140 669.2 136 669.2 DL 144 669.2 -140 669.2 DL 148 669.2 144 669.2 DL 152 669.2 148 669.2 DL 156 669.2 152 669.2 -DL 160 669.2 156 669.2 DL 164 669.2 160 669.2 DL 168 669.2 164 669.2 DL 172 -669.2 168 669.2 DL 176 669.2 172 669.2 DL 180 669.2 176 669.2 DL 184 669.2 180 -669.2 DL 188 669.2 184 669.2 DL 192 669.2 188 669.2 DL 196 669.2 192 669.2 DL -200 669.2 196 669.2 DL 204 669.2 200 669.2 DL 208 669.2 204 669.2 DL 212 669.2 -208 669.2 DL 216 669.2 212 669.2 DL/F4 5/Times-Roman@0 SF(14)93.6 679.6 Q/F5 8 -/Times-Roman@0 SF .214(And of course, v)3.2 J .214 -(endors are encouraged to add themselv)-.12 F .214 -(es to the list of recognized v)-.12 F .214(endors by editing the routine)-.12 -F/F6 8/Times-Italic@0 SF(setvendor)2.214 E F5(in)2.214 E F6(conf)72 692.4 Q(.c) --.12 E F5(.)A EP -%%Page: 40 35 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF 193.36(SMM:08-40 Sendmail)72 60 R -(Installation and Operation Guide)2.5 E/F1 10/Times-Roman@0 SF -(Maps are referenced using the syntax:)142 96 Q($\()157 112.2 Q/F2 10 -/Times-Italic@0 SF(map k)2.5 E -.3(ey)-.1 G F1($@)2.8 E F2(ar)2.5 E(guments) --.37 E F1($:)2.5 E F2(default)2.5 E F1($\))2.5 E .797 -(where either or both of the)117 128.4 R F2(ar)3.297 E(guments)-.37 E F1(or) -3.297 E F2(default)3.297 E F1 .796(portion may be omitted.)3.297 F(The)5.796 E -F2(ar)3.296 E(guments)-.37 E F1(may)3.296 E .205(appear more than once.)117 -140.4 R .205(The indicated)5.205 F F2 -.1(ke)2.705 G(y)-.2 E F1(and)2.705 E F2 -(ar)2.705 E(guments)-.37 E F1 .205(are passed to the appropriate mapping)2.705 -F 2.503(function. If)117 152.4 R .003(it returns a v)2.503 F .003 -(alue, it replaces the input.)-.25 F .003(If it does not return a v)5.003 F -.003(alue and the)-.25 F F2(default)2.503 E F1(is)2.503 E(speci\214ed, the)117 -164.4 Q F2(default)2.5 E F1(replaces the input.)2.5 E -(Otherwise, the input is unchanged.)5 E .159 -(During replacement of either a map v)142 180.6 R .159(alue or def)-.25 F .159 -(ault the string \231%)-.1 F F2(n)A F1 2.66<9a28>C(where)421.82 180.6 Q F2(n) -2.66 E F1 .16(is a digit\) is)2.66 F .204(replaced by the corresponding)117 -192.6 R F2(ar)2.704 E(gument)-.37 E F1 5.204(.A)C -.18(rg)294 192.6 S .204 -(ument zero is al).18 F -.1(wa)-.1 G .204(ys the database k).1 F -.15(ey)-.1 G -5.203(.F)-.5 G .203(or e)468.127 192.6 R(xam-)-.15 E(ple, the rule)117 204.6 Q -(R$- ! $+)157 220.8 Q($: $\(uucp $1 $@ $2 $: %1 @ %0 . UUCP $\))265 220.8 Q -.436(Looks up the UUCP name in a \(user de\214ned\) UUCP map; if not found it \ -turns it into \231.UUCP\232)117 237 R 2.5(form. The)117 249 R -(database might contain records lik)2.5 E(e:)-.1 E(decv)157 265.2 Q 77.43 -(ax %1@%0.DEC.COM)-.25 F 72.19(research %1@%0.A)157 277.2 R(TT)-1.11 E(.COM) --.74 E 2.065(The b)142 297.6 R 2.064(uilt in map with both name and class \231\ -host\232 is the host name canonicalization)-.2 F 2.5(lookup. Thus,)117 309.6 R -(the syntax:)2.5 E($\(host)157 325.8 Q F2(hostname)2.5 E F1($\))A(is equi)117 -342 Q -.25(va)-.25 G(lent to:).25 E($[)157 358.2 Q F2(hostname)A F1($])A 1.783 -(There are four prede\214ned database lookup classes: \231dbm\232, \231btree\ -\232, \231hash\232, and \231nis\232.)142 378.6 R .569 -(The \214rst requires that)117 390.6 R F2(sendmail)3.069 E F1 .569 -(be compiled with the)3.069 F F0(ndbm)3.069 E F1 .568(library; the second tw) -3.069 F 3.068(or)-.1 G .568(equire the)463.722 390.6 R F0(db)117 402.6 Q F1 -(library)3.198 E 3.198(,a)-.65 G .698(nd the third requires that)167.466 402.6 -R F2(sendmail)3.198 E F1 .698(be compiled with NIS support.)3.198 F .698 -(All four accept)5.698 F .345(as ar)117 414.6 R .344(guments the same optional\ - \215ags and a \214lename \(or a mapname for NIS; the \214lename is the)-.18 F -.105(root of the database path, so that \231.db\232 or some other e)117 426.6 R -.105(xtension appropriate for the database type)-.15 F -(will be added to get the actual database name\).)117 438.6 Q(Kno)5 E -(wn \215ags are:)-.25 E 58.86(\255o Indicates)117 454.8 R .21 -(that this map is optional \212 that is, if it cannot be opened, no error is) -2.71 F(produced, and)189 466.8 Q F2(sendmail)2.5 E F1(will beha)2.5 E .3 -.15 -(ve a)-.2 H 2.5(si).15 G 2.5(ft)348.9 466.8 S(he map e)357.51 466.8 Q(xisted b) --.15 E(ut w)-.2 E(as empty)-.1 E(.)-.65 E 56.64(\255N Normally)117 483 R .515 -(when maps are written, the trailing null byte is not included as part)3.015 F -.8(of the k)189 495 R -.15(ey)-.1 G 5.8(.I)-.5 G 3.3(ft)241.32 495 S .799 -(his \215ag is indicated it will be included.)250.73 495 R .799 -(During lookups, only)5.799 F(the null-byte-included form will be searched.)189 -507 Q(See also)5 E F0(\255O.)2.5 E F1 56.64(\255O If)117 523.2 R(neither)4.388 -E F0<ad4e>4.388 E F1(or)4.388 E F0<ad4f>4.388 E F1 1.888(are speci\214ed,)4.388 -F F2(sendmail)4.388 E F1 1.889(uses an adapti)4.388 F 2.189 -.15(ve a)-.25 H -1.889(lgorithm to).15 F 1.025 -(decide whether or not to look for null bytes on the end of k)189 535.2 R -.15 -(ey)-.1 G 3.525(s. It).15 F 1.025(starts by)3.525 F .922 -(trying both; if it \214nds an)189 547.2 R 3.422(yk)-.15 G 1.222 -.15(ey w) -304.29 547.2 T .922(ith a null byte it ne).15 F -.15(ve)-.25 G 3.422(rt).15 G -.922(ries ag)422.684 547.2 R .922(ain without a)-.05 F .124 -(null byte and vice v)189 559.2 R 2.623(ersa. If)-.15 F .123 -(this \215ag is speci\214ed, it ne)2.623 F -.15(ve)-.25 G 2.623(rt).15 G .123 -(ries with a null byte;)421.288 559.2 R .748(this can speed matches b)189 571.2 -R .748(ut is ne)-.2 F -.15(ve)-.25 G 3.249(rn).15 G(ecessary)341.667 571.2 Q -5.749(.I)-.65 G 3.249(fb)386.466 571.2 S(oth)398.045 571.2 Q F0<ad4e>3.249 E F1 -(and)3.249 E F0<ad4f>3.249 E F1 .749(are speci-)3.249 F(\214ed,)189 583.2 Q F2 -(sendmail)4.349 E F1 1.849(will ne)4.349 F -.15(ve)-.25 G 4.349(rt).15 G 1.849 -(ry an)300.156 583.2 R 4.349(ym)-.15 G 1.848(atches at all \212 that is, e) -339.254 583.2 R -.15(ve)-.25 G 1.848(rything will).15 F(appear to f)189 595.2 Q -(ail.)-.1 E<ad61>117 611.4 Q F2(x)A F1 .106(Append the string)189 611.4 R F2(x) -2.606 E F1 .107(on successful matches.)2.606 F -.15(Fo)5.107 G 2.607(re).15 G -.107(xample, the def)387.852 611.4 R(ault)-.1 E F2(host)2.607 E F1(map)2.607 E -(appends a dot on successful matches.)189 623.4 Q 60.53(\255f Do)117 639.6 R -(not fold upper to lo)2.5 E(wer case before looking up the k)-.25 E -.15(ey)-.1 -G(.)-.5 E 56.08(\255m Match)117 655.8 R .085(only \(without replacing the v) -2.585 F 2.585(alue\). If)-.25 F .085(you only care about the e)2.585 F -(xistence)-.15 E 2.618(of a k)189 667.8 R 2.918 -.15(ey a)-.1 H 2.618 -(nd not the v).15 F 2.619(alue \(as you might when searching the NIS map)-.25 F -.447(\231hosts.byname\232 for e)189 679.8 R .447(xample\), this \215ag pre)-.15 -F -.15(ve)-.25 G .447(nts the map from substituting the).15 F -.25(va)189 691.8 -S 4.935(lue. Ho).25 F(we)-.25 E -.15(ve)-.25 G 3.235 -.4(r, T).15 H 2.436 -(he \255a ar).4 F 2.436(gument is still appended on a match, and the)-.18 F -(def)189 703.8 Q(ault is still tak)-.1 E(en if the match f)-.1 E(ails.)-.1 E EP -%%Page: 41 36 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF(Sendmail Installation and Operation Guide)72 60 Q -(SMM:08-41)452.9 60 Q/F1 10/Times-Roman@0 SF(The)142 96 Q/F2 10/Times-Italic@0 -SF(dbm)3.874 E F1 1.374 -(map appends the strings \231.pag\232 and \231.dir\232 to the gi)3.874 F -.15 -(ve)-.25 G 3.874<6e8c>.15 G 1.374(lename; the tw)420.268 96 R(o)-.1 E F2(db) -3.874 E F1(-)A(based maps append \231.db\232.)117 108 Q -.15(Fo)5 G 2.5(re).15 -G(xample, the map speci\214cation)246.67 108 Q -.15(Ku)157 124.2 S -(ucp dbm \255o \255N /usr/lib/uucpmap).15 E .77 -(speci\214es an optional map named \231uucp\232 of class \231dbm\232; it al)117 -140.4 R -.1(wa)-.1 G .77(ys has null bytes at the end of).1 F -2.15 -.25(ev e) -117 152.4 T(ry string, and the data is located in /usr/lib/uucpmap.{dir).25 E -(,pag}.)-.4 E .023(The program)142 168.6 R F2(mak)2.523 E(emap)-.1 E F1 .023 -(\(8\) can be used to b)B .023(uild an)-.2 F 2.523(yo)-.15 G 2.523(ft)353.097 -168.6 S .023(he three database-oriented maps.)361.73 168.6 R(It)5.022 E(tak)117 -180.6 Q(es the follo)-.1 E(wing \215ags:)-.25 E 60.53(\255f F)117 196.8 R -(old upper to lo)-.15 E(wer case in the map.)-.25 E 56.64(\255N Include)117 213 -R(null bytes in k)2.5 E -.15(ey)-.1 G(s.).15 E 58.86(\255o Append)117 229.2 R -(to an e)2.5 E(xisting \(old\) \214le.)-.15 E 60.53(\255r Allo)117 245.4 R -3.479(wr)-.25 G .979(eplacement of e)220.559 245.4 R .979(xisting k)-.15 F -.15 -(ey)-.1 G .979(s; normally).15 F 3.479(,r)-.65 G .979(e-inserting an e)385.494 -245.4 R .979(xisting k)-.15 F 1.279 -.15(ey i)-.1 H(s).15 E(an error)189 257.4 -Q(.)-.55 E 58.86(\255v Print)117 273.6 R(what is happening.)2.5 E(The)117 289.8 -Q F2(sendmail)2.773 E F1 .273(daemon does not ha)2.773 F .572 -.15(ve t)-.2 H -2.772(ob).15 G 2.772(er)282.148 289.8 S .272(estarted to read the ne)292.69 -289.8 R 2.772(wm)-.25 G .272(aps as long as you change)399.05 289.8 R .042 -(them in place; \214le locking is used so that the maps w)117 303.8 R(on')-.1 E -2.542(tb)-.18 G 2.542(er)352.214 303.8 S .042(ead while the)362.526 303.8 R -2.543(ya)-.15 G .043(re being updated.)427.764 303.8 R/F3 7/Times-Roman@0 SF -(15)497 299.8 Q F1(There are also tw)142 320 Q 2.5(ob)-.1 G -(uiltin maps that are, strictly speaking, not database lookups.)223.34 320 Q -1.563(The \231host\232 map does host domain canoni\214cation; gi)142 336.2 R --.15(ve)-.25 G 4.063(nah).15 G 1.563(ost name it calls the name)392.585 336.2 R -(serv)117 348.2 Q(er to \214nd the canonical name for that host.)-.15 E .106 -(The \231dequote\232 map strips double quotes \("\) from a name.)142 364.4 R -.106(It does not strip backslashes.)5.106 F(It)5.106 E 1.838 -(will not strip quotes if the resulting string w)117 376.4 R 1.838 -(ould contain unscannable syntax \(that is, basic)-.1 F .601(errors lik)117 -388.4 R 3.101(eu)-.1 G .601(nbalanced angle brack)166.422 388.4 R .601 -(ets; more sophisticated errors such as unkno)-.1 F .6(wn hosts are not)-.25 F -(check)117 400.4 Q 3.398(ed\). The)-.1 F .899 -(intent is for use when trying to accept mail from systems such as DECnet that) -3.398 F(routinely quote odd syntax such as)117 412.4 Q("49ers::ubell")157 428.6 -Q 2.5(At)117 444.8 S(ypical usage is probably something lik)129.5 444.8 Q(e:) --.1 E(Kdequote dequote)157 461 Q(...)157 485 Q 88.19(R$\255 $:)157 509 R -($\(dequote $1 $\))2.5 E(R$\255 $+)157 521 Q($: $>3 $1 $2)265 521 Q -(Care must be tak)117 537.2 Q(en to pre)-.1 E -.15(ve)-.25 G(nt une).15 E -(xpected results; for e)-.15 E(xample,)-.15 E("|someprogram < input > output") -157 553.4 Q .084(will ha)117 569.6 R .384 -.15(ve q)-.2 H .083 -(uotes stripped, b).15 F .083 -(ut the result is probably not what you had in mind.)-.2 F -.15(Fo)5.083 G .083 -(rtunately these).15 F(cases are rare.)117 581.6 Q(Ne)142 597.8 Q 2.5(wc)-.25 G -(lasses can be added in the routine)167.57 597.8 Q F0(setupmaps)2.5 E F1 -(in \214le)2.5 E F0(conf)2.5 E(.c)-.15 E F1(.)A F0 2.5(5.2. Building)87 621.8 R -2.5(aC)2.5 G(on\214guration File Fr)160.91 621.8 Q(om Scratch)-.18 E F1 1.517 -(Building a con\214guration table from scratch is an e)127 638 R 1.518 -(xtremely dif)-.15 F 1.518(\214cult job)-.25 F 6.518(.F)-.4 G(ortunately) -441.334 638 Q 4.018(,i)-.65 G 4.018(ti)490.532 638 S(s)500.11 638 Q 1.855 -(almost ne)102 650 R -.15(ve)-.25 G 4.355(rn).15 G 1.855 -(ecessary to do so; nearly e)164.19 650 R -.15(ve)-.25 G 1.855 -(ry situation that may come up may be resolv).15 F 1.855(ed by)-.15 F 1.38 -(changing an e)102 662 R 1.38(xisting table.)-.15 F 1.38(In an)6.38 F 3.88(yc) --.15 G 1.381(ase, it is critical that you understand what it is that you are) -254.4 662 R .32 LW 76 671.6 72 671.6 DL 80 671.6 76 671.6 DL 84 671.6 80 671.6 -DL 88 671.6 84 671.6 DL 92 671.6 88 671.6 DL 96 671.6 92 671.6 DL 100 671.6 96 -671.6 DL 104 671.6 100 671.6 DL 108 671.6 104 671.6 DL 112 671.6 108 671.6 DL -116 671.6 112 671.6 DL 120 671.6 116 671.6 DL 124 671.6 120 671.6 DL 128 671.6 -124 671.6 DL 132 671.6 128 671.6 DL 136 671.6 132 671.6 DL 140 671.6 136 671.6 -DL 144 671.6 140 671.6 DL 148 671.6 144 671.6 DL 152 671.6 148 671.6 DL 156 -671.6 152 671.6 DL 160 671.6 156 671.6 DL 164 671.6 160 671.6 DL 168 671.6 164 -671.6 DL 172 671.6 168 671.6 DL 176 671.6 172 671.6 DL 180 671.6 176 671.6 DL -184 671.6 180 671.6 DL 188 671.6 184 671.6 DL 192 671.6 188 671.6 DL 196 671.6 -192 671.6 DL 200 671.6 196 671.6 DL 204 671.6 200 671.6 DL 208 671.6 204 671.6 -DL 212 671.6 208 671.6 DL 216 671.6 212 671.6 DL/F4 5/Times-Roman@0 SF(15)93.6 -682 Q/F5 8/Times-Roman@0 SF .129(That is, don')3.2 J 2.129(tc)-.144 G .129 -(reate ne)147.283 685.2 R 2.129(wm)-.2 G .129(aps and then use)186.437 685.2 R -/F6 8/Times-Italic@0 SF(mv)2.129 E F5 .129(\(1\) to mo)B .369 -.12(ve t)-.12 H -.129(hem into place.).12 F 2.129(Ic)4.129 G .128(onsider this a shortf)354.472 -685.2 R .128(all \(a.k.a. b)-.08 F .128(ug\) in)-.16 F F6(sendmail)2.128 E F5 -(which should be \214x)72 694.8 Q(ed in a future release.)-.12 E EP -%%Page: 42 37 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF 193.36(SMM:08-42 Sendmail)72 60 R -(Installation and Operation Guide)2.5 E/F1 10/Times-Roman@0 SF .498 -(trying to do and come up with a philosoph)102 96 R 2.998(yf)-.05 G .498 -(or the con\214guration table.)286.702 96 R .497(This section is intended to) -5.497 F -.15(ex)102 108 S .67 -(plain what the real purpose of a con\214guration table is and to gi).15 F .97 --.15(ve y)-.25 H .67(ou some ideas for what your).15 F(philosoph)102 120 Q 2.5 -(ym)-.05 G(ight be.)156.68 120 Q F0 1.32(Do not e)127 136.2 R -.1(ve)-.15 G -3.82(nc).1 G(onsider)188.2 136.2 Q F1 1.32(writing your o)3.82 F 1.32 -(wn con\214guration \214le without carefully studying RFC)-.25 F -(821, 822, and 1123.)102 148.2 Q -1.1(Yo)5 G 2.5(us)1.1 G -(hould also read RFC 976 if you are doing UUCP e)208.95 148.2 Q(xchange.)-.15 E -F0 2.5(5.2.1. What)102 172.2 R -.25(yo)2.5 G 2.5(ua).25 G .36 -.18(re t)178.7 -172.2 T(rying to do).18 E F1 .82 -(The con\214guration table has three major purposes.)142 188.4 R .821 -(The \214rst and simplest is to set up the)5.821 F(en)117 200.4 Q .35 -(vironment for)-.4 F/F2 10/Times-Italic@0 SF(sendmail)2.85 E F1 5.35(.T)C .35 -(his in)234.58 200.4 R -.2(vo)-.4 G(lv).2 E .35 -(es setting the options, de\214ning a fe)-.15 F 2.85(wc)-.25 G .35 -(ritical macros, etc.)429.43 200.4 R(Since these are described in other places\ -, we will not go into more detail here.)117 212.4 Q .283 -(The second purpose is to re)142 228.6 R .284(write addresses in the message.) --.25 F .284(This should typically be done)5.284 F .214(in tw)117 240.6 R 2.714 -(op)-.1 G 2.713(hases. The)150.108 240.6 R .213 -(\214rst phase maps addresses in an)2.713 F 2.713(yf)-.15 G .213 -(ormat into a canonical form.)337.182 240.6 R .213(This should)5.213 F .156 -(be done in ruleset three.)117 252.6 R .157 -(The second phase maps this canonical form into the syntax appropriate)5.156 F -1.998(for the recei)117 264.6 R 1.997(ving mailer)-.25 F(.)-.55 E F2(Sendmail) -6.997 E F1 1.997(does this in three subphases.)4.497 F 1.997 -(Rulesets one and tw)6.997 F 4.497(oa)-.1 G(re)496.23 264.6 Q .043 -(applied to all sender and recipient addresses respecti)117 276.6 R -.15(ve) --.25 G(ly).15 E 5.043(.A)-.65 G .043(fter this, you may specify per)357.904 -276.6 R(-mailer)-.2 E 2.723 -(rulesets for both sender and recipient addresses; this allo)117 288.6 R 2.723 -(ws mailer)-.25 F 2.723(-speci\214c customization.)-.2 F(Finally)117 300.6 Q -2.5(,r)-.65 G(uleset four is applied to do an)153.02 300.6 Q 2.5(yd)-.15 G(ef) -283.69 300.6 Q(ault con)-.1 E -.15(ve)-.4 G(rsion to e).15 E(xternal form.)-.15 -E .785(The third purpose is to map addresses into the actual set of instructio\ -ns necessary to get)142 316.8 R .154(the message deli)117 328.8 R -.15(ve)-.25 -G 2.654(red. Ruleset).15 F .154(zero must resolv)2.654 F 2.654(et)-.15 G 2.654 -(ot)321.658 328.8 S .153(he internal form, which is in turn used as a)332.092 -328.8 R .446(pointer to a mailer descriptor)117 340.8 R 5.446(.T)-.55 G .446 -(he mailer descriptor describes the interf)248.38 340.8 R .447 -(ace requirements of the)-.1 F(mailer)117 352.8 Q(.)-.55 E F0 2.5 -(5.2.2. Philosoph)102 376.8 R(y)-.15 E F1 1.481(The particular philosoph)142 -393 R 3.981(yy)-.05 G 1.481(ou choose will depend hea)257.213 393 R 1.481 -(vily on the size and structure of)-.2 F .55(your or)117 405 R -.05(ga)-.18 G -3.05(nization. I).05 F .55(will present a fe)3.05 F 3.05(wp)-.25 G .55 -(ossible philosophies here.)283.39 405 R .55(There are as man)5.55 F 3.05(yp) --.15 G(hiloso-)476.22 405 Q -(phies as there are con\214g designers; feel free to de)117 417 Q -.15(ve)-.25 -G(lop your o).15 E(wn.)-.25 E .388 -(One general point applies to all of these philosophies: it is almost al)142 -433.2 R -.1(wa)-.1 G .388(ys a mistak).1 F 2.888(et)-.1 G 2.888(ot)485.002 -433.2 S(ry)495.67 433.2 Q .176(to do full host route resolution.)117 445.2 R --.15(Fo)5.176 G 2.676(re).15 G .176 -(xample, if you are on a UUCP-only site and you are trying)267.652 445.2 R -1.223(to get names of the form \231user@host\232 to the Internet, it does not \ -pay to route them to \231xyz-)117 457.2 R -.25(va)117 469.2 S(x!decv).25 E -(ax!ucb)-.25 E -.25(va)-.15 G .304 -(x!c70!user@host\232 since you then depend on se).25 F -.15(ve)-.25 G .305 -(ral links not under your con-).15 F .996(trol, some of which are lik)117 481.2 -R .996(ely to misparse it an)-.1 F(yw)-.15 E(ay)-.1 E 5.996(.T)-.65 G .996 -(he best approach to this problem is to)347.32 481.2 R 1.048(simply forw)117 -493.2 R 1.048(ard the message for \231user@host\232 to \231xyzv)-.1 F 1.049 -(ax\232 and let xyzv)-.25 F 1.049(ax w)-.25 F 1.049(orry about it from)-.1 F -3.606(there. In)117 505.2 R(summary)3.606 E 3.606(,j)-.65 G 1.106 -(ust get the message closer to the destination, rather than determining the) -202.988 505.2 R(full path.)117 517.2 Q F0 2.5(5.2.2.1. Lar)117 541.2 R -(ge site, many hosts \212 minimum inf)-.1 E(ormation)-.25 E F1(Berk)157 557.4 Q -(ele)-.1 E 3.018(yi)-.15 G 3.018(sa)198.648 557.4 S 3.018(ne)209.996 557.4 S -.518(xample of a lar)222.304 557.4 R .518(ge site, i.e., more than tw)-.18 F -3.018(oo)-.1 G 3.018(rt)400.266 557.4 S .519(hree hosts and multiple)409.394 -557.4 R .444(mail connections.)132 569.4 R 2.044 -.8(We h)5.444 H -2.25 -.2 -(av e).8 H .443(decided that the only reasonable philosoph)3.144 F 2.943(yi) --.05 G 2.943(no)429.634 569.4 S .443(ur en)442.577 569.4 R(vironment)-.4 E .312 -(is to designate one host as the guru for our site.)132 581.4 R .312 -(It must be able to resolv)5.312 F 2.812(ea)-.15 G .612 -.15(ny p)438.504 581.4 -T .312(iece of mail).15 F 1.083(it recei)132 593.4 R -.15(ve)-.25 G 3.583 -(s. The).15 F 1.083(other sites should ha)3.583 F 1.383 -.15(ve t)-.2 H 1.083 -(he minimum amount of information the).15 F 3.582(yc)-.15 G 1.082(an get) -478.758 593.4 R -2.3 -.15(aw a)132 605.4 T 2.635(yw).15 G 2.635(ith. In)162.705 -605.4 R .135(addition, an)2.635 F 2.635(yi)-.15 G .135(nformation the)249.485 -605.4 R 2.635(yd)-.15 G 2.635(oh)321.265 605.4 S -2.25 -.2(av e)333.9 605.4 T -.136(should be hints rather than solid infor)2.835 F(-)-.2 E(mation.)132 617.4 -Q -.15(Fo)157 633.6 S 6.71(re).15 G 4.209 -(xample, a typical site on our local ether netw)181.74 633.6 R 4.209 -(ork is \231monet\232 \(actually)-.1 F(\231monet.CS.Berk)132 645.6 Q(ele)-.1 E --.65(y.)-.15 G 3.887(EDU\232\). When).65 F 1.387(monet recei)3.887 F -.15(ve) --.25 G 3.887(sm).15 G 1.387(ail for deli)354.258 645.6 R -.15(ve)-.25 G(ry).15 -E 3.887(,i)-.65 G 3.887(tc)424.579 645.6 S 1.387(hecks whether it)435.686 645.6 -R(kno)132 657.6 Q 1.342(ws that the destination host is directly reachable; if\ - so, mail is sent to that host.)-.25 F 1.342(If it)6.342 F(recei)132 669.6 Q --.15(ve)-.25 G 2.915(sm).15 G .415(ail for an)175.055 669.6 R 2.915(yu)-.15 G -(nkno)224.75 669.6 Q .415(wn host, it just passes it directly to \231ucb)-.25 F --.25(va)-.15 G(x.CS.Berk).25 E(ele)-.1 E -.65(y.)-.15 G(EDU\232,).65 E .178 -(our master host.)132 681.6 R(Ucb)5.178 E -.25(va)-.15 G 2.678(xm).25 G .177 -(ay determine that the host name is ille)242.852 681.6 R -.05(ga)-.15 G 2.677 -(la).05 G .177(nd reject the message,)415.159 681.6 R .754 -(or may be able to do deli)132 693.6 R -.15(ve)-.25 G(ry).15 E 5.754(.H)-.65 G --.25(ow)268.146 693.6 S -2.15 -.25(ev e).25 H 1.554 -.4(r, i).25 H 3.254(ti).4 -G 3.254(si)313.874 693.6 S .754(mportant to note that when a ne)323.798 693.6 R -3.254(wm)-.25 G .754(ail con-)472.976 693.6 R .164 -(nection is added, the only host that)132 705.6 R F2(must)2.664 E F1(ha)2.664 E -.464 -.15(ve i)-.2 H .164(ts tables updated is ucb).15 F -.25(va)-.15 G .164 -(x; the others).25 F F2(may)2.664 E F1(be)2.664 E(updated if con)132 717.6 Q --.15(ve)-.4 G(nient, b).15 E(ut this is not critical.)-.2 E EP -%%Page: 43 38 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF(Sendmail Installation and Operation Guide)72 60 Q -(SMM:08-43)452.9 60 Q/F1 10/Times-Roman@0 SF 2.121 -(This picture is slightly muddied due to netw)157 96 R 2.122 -(ork connections that are not actually)-.1 F 2.362(located on ucb)132 108 R --.25(va)-.15 G 4.862(x. F).25 F 2.362(or e)-.15 F 2.362 -(xample, some UUCP connections are currently on \231ucbarpa.)-.15 F<9a>-.7 E -(Ho)132 120 Q(we)-.25 E -.15(ve)-.25 G 1.044 -.4(r, m).15 H(onet).4 E/F2 10 -/Times-Italic@0 SF .244(does not)2.744 F F1(kno)2.744 E 2.744(wa)-.25 G .245 -(bout this; the information is hidden totally between ucb)266.34 120 R -.25(va) --.15 G(x).25 E 1.045(and ucbarpa.)132 132 R 1.045 -(Mail going from monet to a UUCP host is transferred via the ethernet from) -6.045 F 1.43(monet to ucb)132 144 R -.25(va)-.15 G 1.43 -(x, then via the ethernet from ucb).25 F -.25(va)-.15 G 3.931(xt).25 G 3.931 -(ou)355.704 144 S 1.431(cbarpa, and then is submitted to)369.635 144 R(UUCP)132 -156 Q 5(.A)-1.11 G(lthough this in)172.28 156 Q -.2(vo)-.4 G(lv).2 E(es some e) --.15 E(xtra hops, we feel this is an acceptable tradeof)-.15 E(f.)-.25 E .826 -(An interesting point is that it w)157 172.2 R .826 -(ould be possible to update monet to send appropriate)-.1 F .127 -(UUCP mail directly to ucbarpa if the load got too high; if monet f)132 184.2 R -.127(ailed to note a host as con-)-.1 F .353(nected to ucbarpa it w)132 196.2 R -.353(ould go via ucb)-.1 F -.25(va)-.15 G 2.853(xa).25 G 2.852(sb)305.954 196.2 -S .352(efore, and if monet incorrectly sent a message)317.696 196.2 R .395 -(to ucbarpa it w)132 208.2 R .396(ould still be sent by ucbarpa to ucb)-.1 F --.25(va)-.15 G 2.896(xa).25 G 2.896(sb)356.654 208.2 S 2.896(efore. The)368.44 -208.2 R .396(only problem that can)2.896 F .901(occur is loops, for e)132 220.2 -R .901(xample, if ucbarpa thought that ucb)-.15 F -.25(va)-.15 G 3.401(xh).25 G -.9(ad the UUCP connection and)383.75 220.2 R(vice v)132 232.2 Q 2.5(ersa. F) --.15 F(or this reason, updates should)-.15 E F2(always)2.5 E F1 -(happen to the master host \214rst.)2.5 E .144(This philosoph)157 248.4 R 2.644 -(yr)-.05 G .145(esults as much from the need to ha)227.798 248.4 R .445 -.15 -(ve a s)-.2 H .145(ingle source for the con\214gu-).15 F .289 -(ration \214les \(typically b)132 260.4 R .289(uilt using)-.2 F F2(m4)2.789 E -F1 .289(\(1\) or some similar tool\) as an)1.666 F 2.789(yl)-.15 G .288 -(ogical need.)410.664 260.4 R(Maintain-)5.288 E -(ing more than three separate tables by hand is essentially an impossible job) -132 272.4 Q(.)-.4 E F0 2.5(5.2.2.2. Small)117 296.4 R(site \212 complete inf) -2.5 E(ormation)-.25 E F1 3.356(As)157 312.6 S .856(mall site \(tw)171.466 312.6 -R 3.356(oo)-.1 G 3.356(rt)236.434 312.6 S .856(hree hosts and fe)245.9 312.6 R -3.356(we)-.25 G .856(xternal connections\) may \214nd it more rea-)330.564 -312.6 R .435(sonable to ha)132 324.6 R .735 -.15(ve c)-.2 H .435 -(omplete information at each host.).15 F .435(This w)5.435 F .435 -(ould require that each host kno)-.1 F(w)-.25 E -.15(ex)132 336.6 S .185 -(actly where each netw).15 F .185 -(ork connection is, possibly including the names of each host on that)-.1 F -(netw)132 348.6 Q 3.465(ork. As)-.1 F .965 -(long as the site remains small and the con\214guration remains relati)3.465 F --.15(ve)-.25 G .964(ly static,).15 F -(the update problem will probably not be too great.)132 360.6 Q F0 2.5 -(5.2.2.3. Single)117 384.6 R(host)2.5 E F1 .117(This is in some sense the tri) -157 400.8 R .117(vial case.)-.25 F .117 -(The only major issue is trying to insure that you)5.117 F(don')132 412.8 Q -3.425(th)-.18 G -2.25 -.2(av e)161.355 412.8 T .925(to kno)3.625 F 3.425(wt) --.25 G .925(oo much about your en)217.69 412.8 R 3.425(vironment. F)-.4 F .925 -(or e)-.15 F .924(xample, if you ha)-.15 F 1.224 -.15(ve a U)-.2 H(UCP).15 E -.614(connection you might \214nd it useful to kno)132 424.8 R 3.115(wa)-.25 G -.615(bout the names of hosts connected directly to)318.885 424.8 R(you, b)132 -436.8 Q -(ut this is really not necessary since this may be determined from the syntax.) --.2 E F0 2.5(5.2.2.4. A)117 460.8 R(completely differ)2.5 E(ent philosoph)-.18 -E(y)-.15 E F1(This is adapted from Bruce Lilly)157 477 Q 5(.A)-.65 G .3 -.15 -(ny e)301.89 477 T(rrors in interpretation are mine.).15 E .065 -(Do minimal changes in ruleset 3: \214x some common b)157 493.2 R .064 -(ut unambiguous errors \(e.g. trail-)-.2 F 2.758 -(ing dot on domains\) and hide bang paths foo!bar into bar@foo.UUCP)132 505.2 R -7.759(.T)-1.11 G 2.759(he resulting)454.301 505.2 R("canonical" form is an)132 -517.2 Q 2.5(yv)-.15 G(alid RFC822/RFC1123/RFC976 address.)233.63 517.2 Q 1.388 -(Ruleset 0 does the b)157 533.4 R 1.387(ulk of the w)-.2 F 3.887(ork. It)-.1 F -(remo)3.887 E -.15(ve)-.15 G 3.887(st).15 G 1.387 -(he trailing "@.UUCP" that hides)367.472 533.4 R .66(bang paths, strips an)132 -545.4 R .661(ything not needed to resolv)-.15 F .661 -(e, e.g. the phrase from phrase <route-addr>)-.15 F .497 -(and from named groups, rejects unparseable addresses using $#error)132 557.4 R -2.996(,a)-.4 G .496(nd \214nally resolv)419.052 557.4 R .496(es to)-.15 F 4.324 -(am)132 569.4 S 1.824(ailer/host/user triple.)148.544 569.4 R 1.824 -(Ruleset 0 is rather length)6.824 F 4.325(ya)-.05 G 4.325(si)360.965 569.4 S -4.325(th)371.96 569.4 S 1.825(as to handle 3 basic address)384.065 569.4 R -5.373(forms: RFC976 bang paths, RFC1123 %-hacks \(including v)132 581.4 R 5.373 -(anilla RFC822 local-)-.25 F .136(part@domain\), and RFC822 source routes.)132 -593.4 R(It')5.137 E 2.637(sa)-.55 G .137(lso complicated by ha)329.508 593.4 R -.137(ving to handle named)-.2 F(lists.)132 605.4 Q .617(The header re)157 621.6 -R .616(writing rulesets 1 and 2 remo)-.25 F .916 -.15(ve t)-.15 H .616 -(he trailing "@.UUCP" that hides bang).15 F 2.5(paths. Ruleset)132 633.6 R 2.5 -(2a)2.5 G(lso strips the $# mailer $@ host \(for test mode\).)205.05 633.6 Q -(Ruleset 4 does absolutely nothing.)157 649.8 Q 1.316(The per)157 666 R 1.316 -(-mailer re)-.2 F 1.316(writing rulesets conform the en)-.25 F -.15(ve)-.4 G -1.317(lope and header addresses to the).15 F -(requirements of the speci\214c mailer)132 678 Q(.)-.55 E -(Lots of rulesets-as-subroutines are used.)157 694.2 Q .35(As a result, header\ - addresses are subject to minimal munging \(per RFC1123\), and the)157 710.4 R -(general plan is per RFC822 sect. 3.4.10.)132 722.4 Q EP -%%Page: 44 39 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF 193.36(SMM:08-44 Sendmail)72 60 R -(Installation and Operation Guide)2.5 E 2.5(5.2.3. Rele)102 96 R -.1(va)-.15 G -(nt issues).1 E/F1 10/Times-Roman@0 SF .584(The canonical form you use should \ -almost certainly be as speci\214ed in the Internet proto-)142 112.2 R 2.604 -(cols RFC819 and RFC822.)117 124.2 R 2.604(Copies of these RFC')7.604 F 5.104 -(sa)-.55 G 2.603(re included on the)347.852 124.2 R/F2 10/Times-Italic@0 SF -(sendmail)5.103 E F1 2.603(tape as)5.103 F F2(doc/rfc819.lpr)117 136.2 Q F1 -(and)2.5 E F2(doc/rfc822.lpr)2.5 E F1(.)A 2.04 -(RFC822 describes the format of the mail message itself.)142 152.4 R F2 -(Sendmail)7.04 E F1(follo)4.54 E 2.04(ws this RFC)-.25 F(closely)117 164.4 Q -2.984(,t)-.65 G 2.984(ot)152.944 164.4 S .483(he e)163.708 164.4 R .483 -(xtent that man)-.15 F 2.983(yo)-.15 G 2.983(ft)251.44 164.4 S .483 -(he standards described in this document can not be changed)260.533 164.4 R -(without changing the code.)117 176.4 Q(In particular)5 E 2.5(,t)-.4 G -(he follo)286.85 176.4 Q(wing characters ha)-.25 E .3 -.15(ve s)-.2 H -(pecial interpretations:).15 E 2.5(<>\(\)"\\)157 192.6 S(An)117 208.8 Q 3.036 -(ya)-.15 G .537(ttempt to use these characters for other than their RFC822 pur\ -pose in addresses is proba-)141.546 208.8 R(bly doomed to disaster)117 220.8 Q -(.)-.55 E 1.327 -(RFC819 describes the speci\214cs of the domain-based addressing.)142 237 R -1.326(This is touched on in)6.327 F 1.439(RFC822 as well.)117 249 R 1.439 -(Essentially each host is gi)6.439 F -.15(ve)-.25 G 3.939(nan).15 G 1.44 -(ame which is a right-to-left dot quali\214ed)333.711 249 R .232 -(pseudo-path from a distinguished root.)117 261 R .232 -(The elements of the path need not be ph)5.232 F .232(ysical hosts; the)-.05 F -2.365(domain is logical rather than ph)117 273 R 4.866(ysical. F)-.05 F 2.366 -(or e)-.15 F 2.366(xample, at Berk)-.15 F(ele)-.1 E 4.866(yo)-.15 G 2.366 -(ne le)406.406 273 R -.05(ga)-.15 G 4.866(lh).05 G 2.366(ost might be)449.818 -273 R(\231a.CC.Berk)117 285 Q(ele)-.1 E -.65(y.)-.15 G .366 -(EDU\232; reading from right to left, \231EDU\232 is a top le).65 F -.15(ve) --.25 G 2.865(ld).15 G .365(omain comprising edu-)410.5 285 R .561 -(cational institutions, \231Berk)117 297 R(ele)-.1 E .562 -(y\232 is a logical domain name, \231CC\232 represents the Computer Cen-)-.15 F -(ter)117 309 Q 2.5(,\()-.4 G(in this case a strictly logical entity\), and \ -\231a\232 is a host in the Computer Center)135.48 309 Q(.)-.55 E(Be)142 325.2 Q --.1(wa)-.25 G(re when reading RFC819 that there are a number of errors in it.) -.1 E F0 2.5(5.2.4. Ho)102 349.2 R 2.5(wt)-.1 G 2.5(op)155.23 349.2 S -.18(ro) -168.29 349.2 S(ceed).18 E F1 .335(Once you ha)142 365.4 R .635 -.15(ve d)-.2 H -.335(ecided on a philosoph).15 F 1.635 -.65(y, i)-.05 H 2.835(ti).65 G 2.834 -(sw)319.44 365.4 S .334(orth e)333.284 365.4 R .334(xamining the a)-.15 F -.25 -(va)-.2 G .334(ilable con\214guration).25 F .174(tables to decide if an)117 -377.4 R 2.674(yo)-.15 G 2.674(ft)212.98 377.4 S .174 -(hem are close enough to steal major parts of.)221.764 377.4 R(Ev)5.174 E .175 -(en under the w)-.15 F .175(orst of)-.1 F(conditions, there is a f)117 389.4 Q -(air amount of boiler plate that can be collected safely)-.1 E(.)-.65 E .33 -(The ne)142 405.6 R .33(xt step is to b)-.15 F .33(uild ruleset three.)-.2 F -.329(This will be the hardest part of the job)5.33 F 5.329(.B)-.4 G -2.1 -.25 -(ew a)469.321 405.6 T .329(re of).25 F .781 -(doing too much to the address in this ruleset, since an)117 417.6 R .781 -(ything you do will re\215ect through to the)-.15 F 2.744(message. In)117 429.6 -R(particular)2.744 E 2.744(,s)-.4 G .243 -(tripping of local domains is best deferred, since this can lea)216.752 429.6 R -.543 -.15(ve y)-.2 H .243(ou with).15 F 1.234 -(addresses with no domain spec at all.)117 441.6 R(Since)6.235 E F2(sendmail) -3.735 E F1(lik)3.735 E 1.235(es to append the sending domain to)-.1 F .83 -(addresses with no domain, this can change the semantics of addresses.)117 -453.6 R .83(Also try to a)5.83 F -.2(vo)-.2 G .83(id fully).2 F .342 -(qualifying domains in this ruleset.)117 465.6 R .342(Although technically le) -5.342 F -.05(ga)-.15 G .343(l, this can lead to unpleasantly and).05 F 1.287 -(unnecessarily long addresses re\215ected into messages.)117 477.6 R 1.287 -(The Berk)6.287 F(ele)-.1 E 3.787(yc)-.15 G 1.287 -(on\214guration \214les de\214ne)406.426 477.6 R .093 -(ruleset nine to qualify domain names and strip local domains.)117 489.6 R .093 -(This is called from ruleset zero to)5.093 F -(get all addresses into a cleaner form.)117 501.6 Q .318(Once you ha)142 517.8 -R .618 -.15(ve r)-.2 H .318 -(uleset three \214nished, the other rulesets should be relati).15 F -.15(ve) --.25 G .318(ly tri).15 F 2.817(vial. If)-.25 F(you)2.817 E(need hints, e)117 -529.8 Q(xamine the supplied con\214guration tables.)-.15 E F0 2.5(5.2.5. T)102 -553.8 R(esting the r)-.92 E(ewriting rules \212 the \255bt \215ag)-.18 E F1 -1.075(When you b)142 570 R 1.075(uild a con\214guration table, you can do a ce\ -rtain amount of testing using the)-.2 F(\231test mode\232 of)117 582 Q F2 -(sendmail)2.5 E F1 5(.F)C(or e)226.84 582 Q(xample, you could in)-.15 E -.2(vo) --.4 G -.1(ke).2 G F2(sendmail)2.6 E F1(as:)2.5 E(sendmail \255bt \255Ctest.cf) -157 598.2 Q .904(which w)117 614.4 R .903 -(ould read the con\214guration \214le \231test.cf\232 and enter test mode.)-.1 -F .903(In this mode, you enter)5.903 F(lines of the form:)117 626.4 Q -(rwset address)157 642.6 Q(where)117 658.8 Q F2(rwset)3.376 E F1 .876 -(is the re)3.376 F .876(writing set you w)-.25 F .876(ant to use and)-.1 F F2 -(addr)3.376 E(ess)-.37 E F1 .877(is an address to apply the set to.)3.376 F -.7 -(Te)117 670.8 S .17(st mode sho).7 F .17(ws you the steps it tak)-.25 F .169 -(es as it proceeds, \214nally sho)-.1 F .169(wing you the address it ends up) --.25 F 3.635(with. Y)117 682.8 R 1.135(ou may use a comma separated list of rw\ -sets for sequential application of rules to an)-1.1 F 2.5(input. F)117 694.8 R -(or e)-.15 E(xample:)-.15 E(3,1,21,4 monet:bollard)157 711 Q EP -%%Page: 45 40 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF(Sendmail Installation and Operation Guide)72 60 Q -(SMM:08-45)452.9 60 Q/F1 10/Times-Roman@0 SF .386 -(\214rst applies ruleset three to the input \231monet:bollard.)117 96 R 5.385 -<9a52>-.7 G .385(uleset one is then applied to the output)347.145 96 R -(of ruleset three, follo)117 108 Q -(wed similarly by rulesets twenty-one and four)-.25 E(.)-.55 E .202(If you nee\ -d more detail, you can also use the \231\255d21\232 \215ag to turn on more deb) -142 124.2 R 2.702(ugging. F)-.2 F(or)-.15 E -.15(ex)117 136.2 S(ample,).15 E -(sendmail \255bt \255d21.99)157 152.4 Q .754 -(turns on an incredible amount of information; a single w)117 168.6 R .753 -(ord address is probably going to print)-.1 F(out se)117 180.6 Q -.15(ve)-.25 G -(ral pages w).15 E(orth of information.)-.1 E -1.1(Yo)142 196.8 S 3.234(us)1.1 -G .734(hould be w)165.244 196.8 R .734(arned that internally)-.1 F(,)-.65 E/F2 -10/Times-Italic@0 SF(sendmail)3.234 E F1 .734 -(applies ruleset 3 to all addresses.)3.234 F .735(In this)5.735 F -.15(ve)117 -208.8 S 1.23(rsion of).15 F F2(sendmail)3.73 E F1 3.73(,y)C 1.23(ou will ha) -209.42 208.8 R 1.53 -.15(ve t)-.2 H 3.73(od).15 G 3.73(ot)281.21 208.8 S 1.23 -(hat manually)292.72 208.8 R 6.23(.F)-.65 G 1.23(or e)359.38 208.8 R 1.23 -(xample, older v)-.15 F 1.23(ersions allo)-.15 F(wed)-.25 E(you to use)117 -220.8 Q 2.5(0b)157 237 S(ruce@broadcast.son)169.5 237 Q -.65(y.)-.15 G(com).65 -E(This v)117 253.2 Q(ersion requires that you use:)-.15 E -(3,0 bruce@broadcast.son)157 269.4 Q -.65(y.)-.15 G(com).65 E F0 2.5 -(5.2.6. Building)102 297.6 R(mailer descriptions)2.5 E F1 1.886 -.8(To a)142 -313.8 T .287(dd an outgoing mailer to your mail system, you will ha).8 F .587 --.15(ve t)-.2 H 2.787(od).15 G .287(e\214ne the characteristics)409.566 313.8 R -(of the mailer)117 325.8 Q(.)-.55 E 1.481(Each mailer must ha)142 342 R 1.781 --.15(ve a)-.2 H 3.981(ni).15 G 1.481(nternal name.)257.645 342 R 1.481 -(This can be arbitrary)6.481 F 3.98(,e)-.65 G 1.48(xcept that the names)417.63 -342 R(\231local\232 and \231prog\232 must be de\214ned.)117 354 Q .127 -(The pathname of the mailer must be gi)142 370.2 R -.15(ve)-.25 G 2.628(ni).15 -G 2.628(nt)317.038 370.2 S .128(he P \214eld.)327.446 370.2 R .128 -(If this mailer should be accessed)5.128 F -(via an IPC connection, use the string \231[IPC]\232 instead.)117 382.2 Q .021 -(The F \214eld de\214nes the mailer \215ags.)142 398.4 R -1.1(Yo)5.021 G 2.521 -(us)1.1 G .021(hould specify an \231f\232 or \231r\232 \215ag to pass the name) -311.06 398.4 R .465(of the sender as a)117 410.4 R F0<ad66>2.965 E F1(or)2.965 -E F0<ad72>2.965 E F1 .465(\215ag respecti)2.965 F -.15(ve)-.25 G(ly).15 E 5.465 -(.T)-.65 G .465(hese \215ags are only passed if the)306.95 410.4 R 2.966(yw) --.15 G .466(ere passed to)451.418 410.4 R F2(sendmail)117 422.4 Q F1 4.205(,s)C -4.205(ot)163.705 422.4 S 1.705(hat mailers that gi)175.69 422.4 R 2.005 -.15 -(ve e)-.25 H 1.705(rrors under some circumstances can be placated.).15 F 1.705 -(If the)6.705 F 1.362(mailer is not pick)117 434.4 R 3.862(yy)-.15 G 1.362 -(ou can just specify \231\255f $g\232 in the ar)204.518 434.4 R 1.362 -(gv template.)-.18 F 1.363(If the mailer must be)6.362 F 1.708(called as)117 -446.4 R F0 -.18(ro)4.207 G(ot).18 E F1 1.707(the \231S\232 \215ag should be gi) -4.207 F -.15(ve)-.25 G 1.707 -(n; this will not reset the userid before calling the).15 F(mailer)117 460.4 Q -/F3 7/Times-Roman@0 SF(16)142.55 456.4 Q F1 5.112(.I)149.55 460.4 S 2.612(ft) -160.492 460.4 S .112(his mailer is local \(i.e., will perform \214nal deli) -169.214 460.4 R -.15(ve)-.25 G .112(ry rather than another netw).15 F .112 -(ork hop\))-.1 F .728(the \231l\232 \215ag should be gi)117 472.4 R -.15(ve) --.25 G 3.227(n. Quote).15 F .727 -(characters \(backslashes and " marks\) can be stripped from)3.227 F .268 -(addresses if the \231s\232 \215ag is speci\214ed; if this is not gi)117 484.4 -R -.15(ve)-.25 G 2.769(nt).15 G(he)344.247 484.4 Q 2.769(ya)-.15 G .269 -(re passed through.)365.746 484.4 R .269(If the mailer is)5.269 F .67(capable \ -of sending to more than one user on the same host in a single transaction the \ -\231m\232 \215ag)117 496.4 R 1.176(should be stated.)117 508.4 R 1.176 -(If this \215ag is on, then the ar)6.176 F 1.177(gv template containing)-.18 F -F0($u)3.677 E F1 1.177(will be repeated for)3.677 F .089 -(each unique user on a gi)117 520.4 R -.15(ve)-.25 G 2.589(nh).15 G 2.589 -(ost. The)235.994 520.4 R .089 -(\231e\232 \215ag will mark the mailer as being \231e)2.589 F(xpensi)-.15 E --.15(ve)-.25 G 1.488 -.7(,\232 w).15 H(hich).7 E(will cause)117 534.4 Q F2 -(sendmail)2.5 E F1(to defer connection until a queue run)2.5 E F3(17)345.57 -530.4 Q F1(.)352.57 534.4 Q 2.037(An unusual case is the \231C\232 \215ag.)142 -550.6 R 2.037(This \215ag applies to the mailer that the message is)7.037 F -(recei)117 562.6 Q -.15(ve)-.25 G 2.654(df).15 G .153(rom, rather than the mai\ -ler being sent to; if set, the domain spec of the sender \(i.e., the)156.454 -562.6 R 1.519(\231@host.domain\232 part\) is sa)117 574.6 R -.15(ve)-.2 G 4.019 -(da).15 G 1.519(nd is appended to an)252.746 574.6 R 4.019(ya)-.15 G 1.52 -(ddresses in the message that do not)354.341 574.6 R -(already contain a domain spec.)117 586.6 Q -.15(Fo)5 G 2.5(re).15 G -(xample, a message of the form:)266.11 586.6 Q(From: eric@v)157 602.8 Q -(angogh.CS.Berk)-.25 E(ele)-.1 E -.65(y.)-.15 G(EDU).65 E -.8(To)157 614.8 S -2.5(:w).8 G(nj@monet.CS.Berk)179.81 614.8 Q(ele)-.1 E -.65(y.)-.15 G -(EDU, mckusick).65 E(will be modi\214ed to:)117 631 Q .32 LW 76 665.2 72 665.2 -DL 80 665.2 76 665.2 DL 84 665.2 80 665.2 DL 88 665.2 84 665.2 DL 92 665.2 88 -665.2 DL 96 665.2 92 665.2 DL 100 665.2 96 665.2 DL 104 665.2 100 665.2 DL 108 -665.2 104 665.2 DL 112 665.2 108 665.2 DL 116 665.2 112 665.2 DL 120 665.2 116 -665.2 DL 124 665.2 120 665.2 DL 128 665.2 124 665.2 DL 132 665.2 128 665.2 DL -136 665.2 132 665.2 DL 140 665.2 136 665.2 DL 144 665.2 140 665.2 DL 148 665.2 -144 665.2 DL 152 665.2 148 665.2 DL 156 665.2 152 665.2 DL 160 665.2 156 665.2 -DL 164 665.2 160 665.2 DL 168 665.2 164 665.2 DL 172 665.2 168 665.2 DL 176 -665.2 172 665.2 DL 180 665.2 176 665.2 DL 184 665.2 180 665.2 DL 188 665.2 184 -665.2 DL 192 665.2 188 665.2 DL 196 665.2 192 665.2 DL 200 665.2 196 665.2 DL -204 665.2 200 665.2 DL 208 665.2 204 665.2 DL 212 665.2 208 665.2 DL 216 665.2 -212 665.2 DL/F4 5/Times-Roman@0 SF(16)93.6 675.6 Q/F5 8/Times-Italic@0 SF -(Sendmail)3.2 I/F6 8/Times-Roman@0 SF -(must be running setuid to root for this to w)2 E(ork.)-.08 E F4(17)93.6 689.2 -Q F6(The \231c\232 con\214guration option must be gi)3.2 I -.12(ve)-.2 G 2(nf) -.12 G(or this to be ef)242.04 692.4 Q(fecti)-.2 E -.12(ve)-.2 G(.).12 E EP -%%Page: 46 41 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF 193.36(SMM:08-46 Sendmail)72 60 R -(Installation and Operation Guide)2.5 E/F1 10/Times-Roman@0 SF(From: eric@v)157 -96 Q(angogh.CS.Berk)-.25 E(ele)-.1 E -.65(y.)-.15 G(EDU).65 E -.8(To)157 108 S -2.5(:w).8 G(nj@monet.CS.Berk)179.81 108 Q(ele)-.1 E -.65(y.)-.15 G -(EDU, mckusick@v).65 E(angogh.CS.Berk)-.25 E(ele)-.1 E -.65(y.)-.15 G(EDU).65 E -/F2 10/Times-Italic@0 SF 6.608(if and only if)117 124.2 R F1 6.607 -(the \231C\232 \215ag is de\214ned in the mailer resolv)9.108 F 6.607 -(ed to by running)-.15 F(\231eric@v)117 136.2 Q(angogh.CS.Berk)-.25 E(ele)-.1 E --.65(y.)-.15 G(EDU\232 through rulesets 3 and 0.).65 E -(Other \215ags are described in Appendix C.)142 152.4 Q .538 -(The S and R \214elds in the mailer description are per)142 168.6 R .538 -(-mailer re)-.2 F .538(writing sets to be applied to)-.25 F 2.253 -(sender and recipient addresses respecti)117 180.6 R -.15(ve)-.25 G(ly).15 E -7.253(.T)-.65 G 2.252(hese are applied after the sending domain is)312.995 -180.6 R .546(appended and the general re)117 192.6 R .547 -(writing sets \(numbers one and tw)-.25 F .547(o\) are applied, b)-.1 F .547 -(ut before the out-)-.2 F .458(put re)117 204.6 R .458 -(write \(ruleset four\) is applied.)-.25 F 2.958(At)5.458 G .457 -(ypical use is to append the current domain to addresses)279.646 204.6 R -(that do not already ha)117 216.6 Q .3 -.15(ve a d)-.2 H 2.5(omain. F).15 F -(or e)-.15 E(xample, a header of the form:)-.15 E(From: eric)157 232.8 Q -(might be changed to be:)117 249 Q(From: eric@v)157 265.2 Q(angogh.CS.Berk)-.25 -E(ele)-.1 E -.65(y.)-.15 G(EDU).65 E(or)117 281.4 Q(From: ucb)157 297.6 Q -.25 -(va)-.15 G(x!eric).25 E .186(depending on the domain it is being shipped into.) -117 313.8 R .186(These sets can also be used to do special pur)5.186 F(-)-.2 E -(pose output re)117 325.8 Q(writing in cooperation with ruleset four)-.25 E(.) --.55 E .026(The S and R \214elds can be speci\214ed as tw)142 342 R 2.526(on) --.1 G .025(umbers separated by a slash \(e.g., \231S=10/11\232\),)318.25 342 R -2.915(meaning that all en)117 354 R -.15(ve)-.4 G 2.915 -(lope addresses will be processed through ruleset 10 and all header).15 F .403 -(addresses will be processed through ruleset 11.)117 366 R -.4(Wi)5.402 G .402 -(th only one number speci\214ed, both en).4 F -.15(ve)-.4 G(lope).15 E -(and header re)117 378 Q(writing sets are set to the indicated ruleset.)-.25 E -.228(The E \214eld de\214nes the string to use as an end-of-line indication.) -142 394.2 R 2.728(As)5.228 G .228(tring containing only)419.654 394.2 R(ne)117 -406.2 Q(wline is the def)-.25 E 2.5(ault. The)-.1 F -(usual backslash escapes \(\\r)2.5 E 2.5(,\\)-.4 G(n, \\f, \\b\) may be used.) -342.87 406.2 Q(Finally)142 422.4 Q 2.584(,a)-.65 G 2.584(na)179.214 422.4 S --.18(rg)191.238 422.4 S 2.584(vt).18 G .084(emplate is gi)209.752 422.4 R -.15 -(ve)-.25 G 2.584(na).15 G 2.584(st)282.094 422.4 S .084(he A \214eld.)291.348 -422.4 R .083(It may ha)5.083 F .383 -.15(ve e)-.2 H .083(mbedded spaces.).15 F -.083(If there is)5.083 F .203(no ar)117 434.4 R .203(gv with a)-.18 F F0($u) -2.703 E F1 .203(macro in it,)2.703 F F2(sendmail)2.704 E F1 .204 -(will speak SMTP to the mailer)2.704 F 5.204(.I)-.55 G 2.704(ft)412.644 434.4 S -.204(he pathname for this)421.458 434.4 R(mailer is \231[IPC],)117 446.4 Q 2.5 -<9a74>-.7 G(he ar)192.4 446.4 Q(gv should be)-.18 E(IPC $h [)157 462.6 Q F2 -(port)2.5 E F1(])2.5 E(where)117 478.8 Q F2(port)2.5 E F1 -(is the optional port number to connect to.)2.5 E -.15(Fo)142 495 S 2.5(re).15 -G(xample, the speci\214cations:)162.53 495 Q(Mlocal, P=/bin/mail, F=rlsm)157 -511.2 Q(S=10, R=20, A=mail \255d $u)5 E(Mether)157 523.2 Q 2.35(,P)-.4 G 13.9 -(=[IPC], F=meC,)195.89 523.2 R(S=11, R=21, A=IPC $h, M=100000)1.39 E 1.644 -(speci\214es a mailer to do local deli)117 539.4 R -.15(ve)-.25 G 1.644 -(ry and a mailer for ethernet deli).15 F -.15(ve)-.25 G(ry).15 E 6.643(.T)-.65 -G 1.643(he \214rst is called)436.021 539.4 R(\231local,)117 551.4 Q 2.648<9a69> --.7 G 2.648(sl)152.548 551.4 S .148(ocated in the \214le \231/bin/mail,)161.866 -551.4 R 2.649<9a74>-.7 G(ak)283.569 551.4 Q .149(es a pick)-.1 F(y)-.15 E F0 -<ad72>2.649 E F1 .149(\215ag, does local deli)2.649 F -.15(ve)-.25 G(ry).15 E -2.649(,q)-.65 G .149(uotes should)453.571 551.4 R 1.017 -(be stripped from addresses, and multiple users can be deli)117 563.4 R -.15 -(ve)-.25 G 1.016(red at once; ruleset ten should be).15 F 1.417(applied to sen\ -der addresses in the message and ruleset twenty should be applied to recipient) -117 575.4 R .123(addresses; the ar)117 587.4 R .123 -(gv to send to a message will be the w)-.18 F .123(ord \231mail,)-.1 F 2.623 -<9a74>-.7 G .123(he w)383.129 587.4 R .122(ord \231\255d,)-.1 F 2.622<9a61>-.7 -G .122(nd w)446.646 587.4 R .122(ords con-)-.1 F 1.484 -(taining the name of the recei)117 599.4 R 1.484(ving user)-.25 F 6.484(.I)-.55 -G 3.984(fa)288.496 599.4 S F0<ad72>A F1 1.484 -(\215ag is inserted it will be between the w)3.984 F(ords)-.1 E .289 -(\231mail\232 and \231\255d.)117 611.4 R 5.289<9a54>-.7 G .289 -(he second mailer is called \231ether)196.397 611.4 R 1.689 -.7(,\232 i)-.4 H -2.789(ts).7 G .289(hould be connected to via an IPC con-)348.95 611.4 R .932(n\ -ection, it can handle multiple users at once, connections should be deferred, \ -and an)117 623.4 R 3.433(yd)-.15 G(omain)479 623.4 Q 1.458 -(from the sender address should be appended to an)117 635.4 R 3.958(yr)-.15 G -(ecei)340.202 635.4 Q -.15(ve)-.25 G 3.958(rn).15 G 1.458 -(ame without a domain; sender)377.63 635.4 R .74 -(addresses should be processed by ruleset ele)117 647.4 R -.15(ve)-.25 G 3.24 -(na).15 G .74(nd recipient addresses by ruleset twenty-one.)320.34 647.4 R -(There is a 100,000 byte limit on messages passed through this mailer)117 659.4 -Q(.)-.55 E F0 2.5(5.3. The)87 683.4 R(User Database)2.5 E F1 .109(If you ha)127 -699.6 R .409 -.15(ve a ve)-.2 H .109(rsion of).15 F F2(sendmail)2.609 E F1 .109 -(with the user database package compiled in, the handling of)2.609 F -(sender and recipient addresses is modi\214ed.)102 711.6 Q EP -%%Page: 47 42 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF(Sendmail Installation and Operation Guide)72 60 Q -(SMM:08-47)452.9 60 Q/F1 10/Times-Roman@0 SF -(The location of this database is controlled with the)127 96 Q F0(U)2.5 E F1 -(option.)2.5 E F0 2.5(5.3.1. Structur)102 120 R 2.5(eo)-.18 G 2.5(ft)177.92 120 -S(he user database)187.08 120 Q F1(The database is a sorted \(BT)142 136.2 Q -(ree-based\) structure.)-.35 E(User records are stored with the k)5 E -.15(ey) --.1 G(:).15 E/F2 10/Times-Italic@0 SF(user)157 152.4 Q(-name)-.2 E F0(:)A F2 -(\214eld-name)A F1 .128 -(The sorted database format ensures that user records are clustered together) -117 168.6 R 5.129(.M)-.55 G .129(eta-information is)432.491 168.6 R(al)117 -180.6 Q -.1(wa)-.1 G(ys stored with a leading colon.).1 E -(Field names de\214ne both the syntax and semantics of the v)142 196.8 Q 2.5 -(alue. De\214ned)-.25 F(\214elds include:)2.5 E 33.39(maildrop The)117 213 R -(deli)4.873 E -.15(ve)-.25 G 2.373(ry address for this user).15 F 7.373(.T)-.55 -G 2.372(here may be multiple v)349.478 213 R 2.372(alues of this)-.25 F 2.675 -(record. In)189 225 R(particular)2.675 E 2.675(,m)-.4 G .175 -(ailing lists will ha)284.095 225 R .475 -.15(ve o)-.2 H(ne).15 E F2(maildr) -2.675 E(op)-.45 E F1 .175(record for each user)2.675 F(on the list.)189 237 Q -30.06(mailname The)117 253.2 R 1.027(outgoing mailname for this user)3.527 F -6.026(.F)-.55 G 1.026(or each outgoing name, there should)353.34 253.2 R .08 -(be an appropriate)189 265.2 R F2(maildr)2.58 E(op)-.45 E F1 .08 -(record for that name to allo)2.58 F 2.58(wr)-.25 G .08(eturn mail.)422.38 -265.2 R .08(See also)5.08 F F2(:default:mailname)189 277.2 Q F1(.)A 25.62 -(mailsender Changes)117 293.4 R(an)3.448 E 3.448(ym)-.15 G .948 -(ail sent to this address to ha)252.406 293.4 R 1.247 -.15(ve t)-.2 H .947 -(he indicated en).15 F -.15(ve)-.4 G .947(lope sender).15 F(.)-.55 E .498(This\ - is intended for mailing lists, and will normally be the name of an appro-)189 -305.4 R .755(priate -request address.)189 317.4 R .755(It is v)5.755 F .755 -(ery similar to the o)-.15 F(wner)-.25 E(-)-.2 E F2(list)A F1 .754 -(syntax in the alias)3.254 F(\214le.)189 329.4 Q 33.95(fullname The)117 345.6 R -(full name of the user)2.5 E(.)-.55 E(of)117 361.8 Q 13.66(\214ce-address The) --.25 F(of)2.5 E(\214ce address for this user)-.25 E(.)-.55 E(of)117 378 Q 19.21 -(\214ce-phone The)-.25 F(of)2.5 E(\214ce phone number for this user)-.25 E(.) --.55 E(of)117 394.2 Q(\214ce-f)-.25 E 30.98(ax The)-.1 F(of)2.5 E(\214ce F)-.25 -E(AX number for this user)-.74 E(.)-.55 E 13.96(home-address The)117 410.4 R -(home address for this user)2.5 E(.)-.55 E 19.51(home-phone The)117 426.6 R -(home phone number for this user)2.5 E(.)-.55 E(home-f)117 442.8 Q 31.28 -(ax The)-.1 F(home F)2.5 E(AX number for this user)-.74 E(.)-.55 E 41.73 -(project A)117 459 R .855 -(\(short\) description of the project this person is af)3.355 F .856 -(\214liated with.)-.25 F .856(In the Uni-)5.856 F -.15(ve)189 471 S -(rsity this is often just the name of their graduate advisor).15 E(.)-.55 E -52.28(plan A)117 487.2 R -(pointer to a \214le from which plan information can be g)2.5 E(athered.)-.05 E -.925(As of this writing, only a fe)142 503.4 R 3.424(wo)-.25 G 3.424(ft)273.214 -503.4 S .924(hese \214elds are actually being used by)282.748 503.4 R F2 -(sendmail)3.424 E F1(:)A F2(mail-)3.424 E(dr)117 515.4 Q(op)-.45 E F1(and)2.5 E -F2(mailname)2.5 E F1 5(.A)C F2(\214ng)211.54 515.4 Q(er)-.1 E F1 -(program that uses the other \214elds is planned.)2.5 E F0 2.5(5.3.2. User)102 -539.4 R(database semantics)2.5 E F1 .995(When the re)142 555.6 R .995 -(writing rules submit an address to the local mailer)-.25 F 3.496(,t)-.4 G .996 -(he user name is passed)408.926 555.6 R .781(through the alias \214le.)117 -567.6 R .78 -(If no alias is found \(or if the alias points back to the same address\), the) -5.781 F 1.777(name \(with \231:maildrop\232 appended\) is then used as a k)117 -579.6 R 2.078 -.15(ey i)-.1 H 4.278(nt).15 G 1.778(he user database.)375.98 -579.6 R 1.778(If no match)6.778 F -(occurs \(or if the maildrop points at the same address\), forw)117 591.6 Q -(arding is tried.)-.1 E .551(If the \214rst tok)142 607.8 R .55(en of the user\ - name returned by ruleset 0 is an \231@\232 sign, the user database)-.1 F .625 -(lookup is skipped.)117 619.8 R .625 -(The intent is that the user database will act as a set of def)5.625 F .626 -(aults for a cluster)-.1 F 1.533(\(in our case, the Computer Science Di)117 -631.8 R 1.533(vision\); mail sent to a speci\214c machine should ignore)-.25 F -(these def)117 643.8 Q(aults.)-.1 E .351 -(When mail is sent, the name of the sending user is look)142 660 R .351 -(ed up in the database.)-.1 F .352(If that user)5.351 F .041 -(has a \231mailname\232 record, the v)117 672 R .041 -(alue of that record is used as their outgoing name.)-.25 F -.15(Fo)5.04 G 2.54 -(re).15 G .04(xample, I)466.19 672 R(might ha)117 684 Q .3 -.15(ve a r)-.2 H -(ecord:).15 E 25.94(eric:mailname Eric.Allman@CS.Berk)157 700.2 R(ele)-.1 E --.65(y.)-.15 G(EDU).65 E(This w)117 716.4 Q -(ould cause my outgoing mail to be sent as Eric.Allman.)-.1 E EP -%%Page: 48 43 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF 193.36(SMM:08-48 Sendmail)72 60 R -(Installation and Operation Guide)2.5 E/F1 10/Times-Roman@0 SF .519 -(If a \231maildrop\232 is found for the user)142 96 R 3.019(,b)-.4 G .52 -(ut no corresponding \231mailname\232 record e)299.682 96 R .52(xists, the)-.15 -F 1.128(record \231:def)117 108 R 1.128(ault:mailname\232 is consulted.)-.1 F -1.127(If present, this is the name of a host to o)6.128 F -.15(ve)-.15 G 1.127 -(rride the).15 F .625(local host.)117 120 R -.15(Fo)5.625 G 3.125(re).15 G .625 -(xample, in our case we w)185.515 120 R .625(ould set it to \231CS.Berk)-.1 F -(ele)-.1 E -.65(y.)-.15 G 3.125(EDU\232. The).65 F(ef)3.125 E .625 -(fect is that)-.25 F(an)117 132 Q .882(yone kno)-.15 F .882 -(wn in the database gets their outgoing mail stamped as \231user@CS.Berk)-.25 F -(ele)-.1 E -.65(y.)-.15 G(EDU\232,).65 E -.2(bu)117 144 S 2.5(tp).2 G -(eople not listed in the database use the local hostname.)137.08 144 Q F0 2.5 -(5.3.3. Cr)102 170 R(eating the database)-.18 E/F2 7/Times-Bold@0 SF(18)223.2 -166 Q F1 .375(The user database is b)142 186.2 R .375(uilt from a te)-.2 F .375 -(xt \214le using the)-.15 F/F3 10/Times-Italic@0 SF(mak)2.875 E(emap)-.1 E F1 -.375(utility \(in the distrib)2.875 F .375(ution in)-.2 F 1.038(the mak)117 -198.2 R 1.038(emap subdirectory\).)-.1 F 1.038(The te)6.038 F 1.039 -(xt \214le is a series of lines corresponding to userdb records;)-.15 F 1.589 -(each line has a k)117 210.2 R 1.889 -.15(ey a)-.1 H 1.589(nd a v).15 F 1.589 -(alue separated by white space.)-.25 F 1.589(The k)6.589 F 1.889 -.15(ey i)-.1 -H 4.089(sa).15 G -.1(lwa)421.945 210.2 S 1.588(ys in the format).1 F -(described abo)117 222.2 Q .3 -.15(ve \212 f)-.15 H(or e).15 E(xample:)-.15 E -(eric:maildrop)157 238.4 Q .447 -(This \214le is normally installed in a system directory; for e)117 254.6 R -.448(xample, it might be called)-.15 F F3(/etc/user)2.948 E(db)-.37 E F1(.)A -1.6 -.8(To m)117 266.6 T(ak).8 E 2.5(et)-.1 G(he database v)156.65 266.6 Q -(ersion of the map, run the program:)-.15 E(mak)157 282.8 Q -(emap btree /etc/userdb)-.1 E(.db < /etc/userdb)-.4 E .077 -(Then create a con\214g \214le that uses this.)117 299 R -.15(Fo)5.077 G 2.577 -(re).15 G .077(xample, using the V8 M4 con\214guration, include the)296.533 299 -R(follo)117 311 Q(wing line in your .mc \214le:)-.25 E -(de\214ne\(\222confUSERDB_SPEC\264, /etc/userdb)157 327.2 Q(.db\))-.4 E F0 2.5 -(6. O)72 355.4 R(THER CONFIGURA)-.4 E(TION)-.95 E F1 .907 -(There are some con\214guration changes that can be made by recompiling)112 -371.6 R F3(sendmail)3.407 E F1 5.907(.T)C .907(his section)460.593 371.6 R -(describes what changes can be made and what has to be modi\214ed to mak)87 -383.6 Q 2.5(et)-.1 G(hem.)387.95 383.6 Q F0 2.5(6.1. P)87 407.6 R -(arameters in sr)-.1 E(c/Mak)-.18 E(e\214le)-.1 E F1 .92 -(These parameters are intended to describe the compilation en)127 423.8 R .92 -(vironment, not site polic)-.4 F 2.22 -.65(y, a)-.15 H(nd).65 E -(should normally be de\214ned in src/Mak)102 435.8 Q(e\214le.)-.1 E 39.5 -(NDBM If)102 452 R .664(set, the ne)3.164 F 3.164(wv)-.25 G .664 -(ersion of the DBM library that allo)240.406 452 R .665 -(ws multiple databases will be)-.25 F 2.543(used. If)174 464 R .042 -(neither NDBM nor NEWDB are set, a much less ef)2.543 F .042 -(\214cient method of alias)-.25 F(lookup is used.)174 476 Q 32.84(NEWDB If)102 -492.2 R .141(set, use the ne)2.641 F 2.642(wd)-.25 G .142 -(atabase package from Berk)254.436 492.2 R(ele)-.1 E 2.642(y\()-.15 G .142 -(from 4.4BSD\).)385.814 492.2 R .142(This package)5.142 F .267 -(is substantially f)174 504.2 R .267(aster than DBM or NDBM.)-.1 F .267 -(If NEWDB and NDBM are both set,)5.267 F F3(sendmail)174 516.2 Q F1 -(will read DBM \214les, b)2.5 E(ut will create and use NEWDB \214les.)-.2 E -53.39(NIS Include)102 532.4 R .119(support for NIS.)2.619 F .119 -(If set together with)5.119 F F3(both)2.619 E F1 .119(NEWDB and NDBM,)2.619 F -F3(sendmail)2.62 E F1 1.076 -(will create both DBM and NEWDB \214les if and only if the \214le /v)174 544.4 -R(ar/yp/Mak)-.25 E(e\214le)-.1 E -.15(ex)174 556.4 S .292 -(ists and is readable.).15 F .293 -(This is intended for compatibility with Sun Microsystems')5.293 F F3(mkalias) -174 568.4 Q F1(program used on YP masters.)2.5 E 25.05(SYSTEM5 Set)102 584.6 R -(all of the compilation parameters appropriate for System V)2.5 E(.)-1.29 E -36.72(LOCKF Use)102 600.8 R .3(System V)2.8 F F0(lockf)2.8 E F1 .299 -(instead of Berk)2.799 F(ele)-.1 E(y)-.15 E F0(\215ock)2.799 E F1 5.299(.D)C -.299(ue to the highly unusual seman-)375.015 600.8 R .051 -(tics of locks across forks in)174 612.8 R F0(lockf)2.551 E F1 2.551(,t)C .051 -(his should ne)314.897 612.8 R -.15(ve)-.25 G 2.552(rb).15 G 2.552(eu)387.702 -612.8 S .052(sed unless absolutely nec-)399.694 612.8 R(essary)174 624.8 Q 5 -(.S)-.65 G(et by def)211.4 624.8 Q(ault if SYSTEM5 is set.)-.1 E 33.94 -(SYS5TZ Use)102 641 R(System V time zone semantics.)2.5 E(HASINITGR)102 657.2 Q -(OUPS)-.4 E 2.392(Set this if your system has the)174 669.2 R F3(initgr)4.892 E -(oups\(\))-.45 E F1 2.391(call \(if you ha)4.891 F 2.691 -.15(ve m)-.2 H 2.391 -(ultiple group).15 F .32 LW 76 678.8 72 678.8 DL 80 678.8 76 678.8 DL 84 678.8 -80 678.8 DL 88 678.8 84 678.8 DL 92 678.8 88 678.8 DL 96 678.8 92 678.8 DL 100 -678.8 96 678.8 DL 104 678.8 100 678.8 DL 108 678.8 104 678.8 DL 112 678.8 108 -678.8 DL 116 678.8 112 678.8 DL 120 678.8 116 678.8 DL 124 678.8 120 678.8 DL -128 678.8 124 678.8 DL 132 678.8 128 678.8 DL 136 678.8 132 678.8 DL 140 678.8 -136 678.8 DL 144 678.8 140 678.8 DL 148 678.8 144 678.8 DL 152 678.8 148 678.8 -DL 156 678.8 152 678.8 DL 160 678.8 156 678.8 DL 164 678.8 160 678.8 DL 168 -678.8 164 678.8 DL 172 678.8 168 678.8 DL 176 678.8 172 678.8 DL 180 678.8 176 -678.8 DL 184 678.8 180 678.8 DL 188 678.8 184 678.8 DL 192 678.8 188 678.8 DL -196 678.8 192 678.8 DL 200 678.8 196 678.8 DL 204 678.8 200 678.8 DL 208 678.8 -204 678.8 DL 212 678.8 208 678.8 DL 216 678.8 212 678.8 DL/F4 5/Times-Roman@0 -SF(18)93.6 689.2 Q/F5 8/Times-Roman@0 SF .288(These instructions are kno)3.2 J -.289(wn to be incomplete.)-.2 F 2.289(Af)4.289 G .289(uture v)266.46 692.4 R -.289(ersion of the user database is planned including things such as \214n-) --.12 F(ger service \212 and good documentation.)72 702 Q EP -%%Page: 49 44 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF(Sendmail Installation and Operation Guide)72 60 Q -(SMM:08-49)452.9 60 Q/F1 10/Times-Roman@0 SF 2.5(support\). This)174 96 R -(is the def)2.5 E(ault if SYSTEM5 is)-.1 E/F2 10/Times-Italic@0 SF(not)2.5 E F1 -(de\214ned or if you are on HPUX.)2.5 E(HASUN)102 112.2 Q 13.19(AME Set)-.35 F -.89(this if you ha)3.39 F 1.19 -.15(ve t)-.2 H(he).15 E F2(uname)3.39 E F1 .89 -(\(2\) system call \(or corresponding library routine\).)B(Set by def)174 124.2 -Q(ault if SYSTEM5 is set.)-.1 E(HASST)102 140.4 Q -1.11(AT)-.93 G 15.42(FS Set) -1.11 F .202(this if you ha)2.702 F .502 -.15(ve t)-.2 H(he).15 E F2(statfs) -2.702 E F1 .202(\(2\) system call.)B .202(This will allo)5.202 F 2.702(wy)-.25 -G .202(ou to gi)425.824 140.4 R .501 -.15(ve a t)-.25 H(empo-).15 E .107 -(rary f)174 152.4 R .108(ailure message to incoming SMTP email when you are lo) --.1 F 2.608(wo)-.25 G 2.608(nd)441.186 152.4 S .108(isk space.)453.794 152.4 R -(It)5.108 E(is set by def)174 164.4 Q(ault on 4.4BSD and OSF/1 systems.)-.1 E -(HASUST)102 180.6 Q 21.54 -1.11(AT S)-.93 H .594(et if you ha)1.11 F .894 -.15 -(ve t)-.2 H(he).15 E F2(ustat)3.094 E F1 .594(\(2\) system call.)B .594 -(This is an alternati)5.594 F .893 -.15(ve i)-.25 H .593(mplementation of).15 F -.525(disk space control.)174 192.6 R -1.1(Yo)5.525 G 3.025(us)1.1 G .525 -(hould only set one of HASST)278.32 192.6 R -1.11(AT)-.93 G .525(FS or HASUST) -1.11 F -.83 -1.11(AT ;)-.93 H(the)4.135 E(\214rst is preferred.)174 204.6 Q(_P) -102 220.8 Q -1.11(AT)-.92 G(H_SENDMAILCF)1.11 E -(The pathname of the sendmail.cf \214le.)174 232.8 Q(_P)102 249 Q -1.11(AT)-.92 -G(H_SENDMAILPID)1.11 E(The pathname of the sendmail.pid \214le.)174 261 Q 26.17 -(LA_TYPE The)102 277.2 R(load a)2.5 E -.15(ve)-.2 G(rage type.).15 E -(Details are described belo)5 E -.65(w.)-.25 G .343(The are se)102 293.4 R -.15 -(ve)-.25 G .342(ral b).15 F .342(uilt-in w)-.2 F .342 -(ays of computing the load a)-.1 F -.15(ve)-.2 G(rage.).15 E F2(Sendmail)5.342 -E F1 .342(tries to auto-con\214gure them)2.842 F .266 -(based on imperfect guesses; you can select one using the)102 305.4 R F2(cc) -2.767 E F1(option)2.767 E F0(\255DLA_TYPE=)2.767 E F2(type)A F1 2.767(,w)C -(here)467.363 305.4 Q F2(type)2.767 E F1(is:)102 317.4 Q 34.51(LA_INT The)102 -333.6 R -.1(ke)2.979 G .479(rnel stores the load a).1 F -.15(ve)-.2 G .479 -(rage in the k).15 F .478(ernel as an array of long inte)-.1 F 2.978(gers. The) --.15 F(actual v)174 345.6 Q(alues are scaled by a f)-.25 E(actor FSCALE \(def) --.1 E(ault 256\).)-.1 E(LA_SHOR)102 361.8 Q 21.49(TT)-.6 G .33(he k)180.11 -361.8 R .33(ernel stores the load a)-.1 F -.15(ve)-.2 G .331(rage in the k).15 -F .331(ernel as an array of short inte)-.1 F 2.831(gers. The)-.15 F(actual v) -174 373.8 Q(alues are scaled by a f)-.25 E(actor FSCALE \(def)-.1 E -(ault 256\).)-.1 E(LA_FLO)102 390 Q 22.63 -1.11(AT T)-.35 H 1.118(he k)1.11 F -1.117(ernel stores the load a)-.1 F -.15(ve)-.2 G 1.117(rage in the k).15 F -1.117(ernel as an array of double precision)-.1 F(\215oats.)174 402 Q(LA_MA)102 -418.2 Q 21.57(CH Use)-.4 F(MA)2.5 E(CH-style load a)-.4 E -.15(ve)-.2 G(rages.) -.15 E 25.05(LA_SUBR Call)102 434.4 R(the)2.5 E F2 -.1(ge)2.5 G(tloadavg).1 E F1 -(routine to get the load a)2.5 E -.15(ve)-.2 G(rage as an array of doubles.).15 -E(LA_ZER)102 450.6 Q 27.96(OA)-.4 G -.1(lwa)181.22 450.6 S -(ys return zero as the load a).1 E -.15(ve)-.2 G 2.5(rage. This).15 F(is the f) -2.5 E(allback case.)-.1 E .493(If type)102 466.8 R/F3 9/Times-Roman@0 SF -(LA_INT)2.993 E F1(,)A F3(LA_SHOR)2.993 E(T)-.54 E F1 2.993(,o)C(r)224.802 -466.8 Q F3(LA_FLO)2.993 E -.999(AT)-.315 G F1 .493 -(is speci\214ed, you may also need to specify)3.992 F F3(_P)2.994 E -.999(AT) --.828 G(H_UNIX).999 E F1 .949(\(the path to your system binary\) and)102 478.8 -R F3(LA_A)3.448 E(VENR)-1.215 E(UN)-.36 E F1 .948(\(the name of the v)3.448 F -.948(ariable containing the load)-.25 F -2.25 -.2(av e)102 490.8 T -(rage in the k).2 E(ernel; usually \231_a)-.1 E -.15(ve)-.2 G -(nrun\232 or \231a).15 E -.15(ve)-.2 G(nrun\232\).).15 E 1.439 -(There are also se)127 507 R -.15(ve)-.25 G 1.439 -(ral compilation \215ags to indicate the en).15 F 1.44 -(vironment such as \231_AIX3\232 and)-.4 F 2.5(\231_SCO_unix_\232. See)102 519 -R(the READ_ME \214le for the latest scoop on these \215ags.)2.5 E F0 2.5 -(6.2. P)87 543 R(arameters in sr)-.1 E(c/conf)-.18 E(.h)-.15 E F1 -.15(Pa)127 -559.2 S .896(rameters and compilation options are de\214ned in conf.h.).15 F -.895(Most of these need not normally)5.895 F .192(be tweak)102 571.2 R .192 -(ed; common parameters are all in sendmail.cf.)-.1 F(Ho)5.192 E(we)-.25 E -.15 -(ve)-.25 G .992 -.4(r, t).15 H .192(he sizes of certain primiti).4 F .493 -.15 -(ve ve)-.25 H(c-).15 E(tors, etc., are included in this \214le.)102 583.2 Q -(The numbers follo)5 E(wing the parameters are their def)-.25 E(ault v)-.1 E -(alue.)-.25 E 1.91(MAXLINE [1024])102 599.4 R 1.909 -(The maximum line length of an)190.31 599.4 R 4.409(yi)-.15 G 1.909(nput line.) -338.276 599.4 R 1.909(If message lines e)6.909 F 1.909(xceed this)-.15 F .575 -(length the)188.4 611.4 R 3.075(yw)-.15 G .575 -(ill still be processed correctly; ho)243.84 611.4 R(we)-.25 E -.15(ve)-.25 G -1.375 -.4(r, h).15 H .575(eader lines, con\214gura-).4 F -(tion \214le lines, alias lines, etc., must \214t within this limit.)188.4 -623.4 Q(MAXN)102 639.6 Q(AME [256])-.35 E(The maximum length of an)9.82 E 2.5 -(yn)-.15 G(ame, such as a host or a user name.)309.63 639.6 Q .231(MAXPV [40]) -102 655.8 R .231(The maximum number of parameters to an)188.631 655.8 R 2.731 -(ym)-.15 G(ailer)376.458 655.8 Q 5.231(.T)-.55 G .23(his limits the number of) -407.519 655.8 R .375(recipients that may be passed in one transaction.)188.4 -667.8 R .376(It can be set to an)5.376 F 2.876(ya)-.15 G(rbitrary)474.01 667.8 -Q .876(number abo)188.4 679.8 R 1.176 -.15(ve a)-.15 H .876(bout 10, since).15 -F F2(sendmail)3.376 E F1 .876(will break up a deli)3.376 F -.15(ve)-.25 G .875 -(ry into smaller).15 F .886(batches as needed.)188.4 691.8 R 3.386(Ah)5.886 G -.887(igher number may reduce load on your system, ho)285.804 691.8 R(w-)-.25 E --2.15 -.25(ev e)188.4 703.8 T -.55(r.).25 G EP -%%Page: 50 45 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF 193.36(SMM:08-50 Sendmail)72 60 R -(Installation and Operation Guide)2.5 E/F1 10/Times-Roman@0 SF(MAXA)102 96 Q --.18(TO)-1.11 G 2.559(M[).18 G 8.26(100] The)159.369 96 R .059 -(maximum number of atoms \(tok)2.559 F .058(ens\) in a single address.)-.1 F --.15(Fo)5.058 G 2.558(re).15 G .058(xample, the)457.282 96 R -(address \231eric@CS.Berk)188.4 108 Q(ele)-.1 E -.65(y.)-.15 G(EDU\232 is se) -.65 E -.15(ve)-.25 G 2.5(na).15 G(toms.)367.93 108 Q .112(MAXMAILERS [25])102 -124.2 R .112(The maximum number of mailers that may be de\214ned in the con\ -\214guration \214le.).02 F(MAXR)102 140.4 Q(WSETS [100])-.55 E -(The maximum number of re).01 E(writing sets that may be de\214ned.)-.25 E -(MAXPRIORITIES [25])102 156.6 Q 2.482(The maximum number of v)188.4 168.6 R -2.482(alues for the \231Precedence:\232 \214eld that may be)-.25 F -(de\214ned \(using the)188.4 180.6 Q F0(P)2.5 E F1(line in sendmail.cf\).)2.5 E -(MAXUSERENVIR)102 196.8 Q(ON [40])-.4 E .399 -(The maximum number of items in the user en)188.4 208.8 R .4 -(vironment that will be passed to)-.4 F(subordinate mailers.)188.4 220.8 Q -.1 -(QU)102 237 S(EUESIZE [1000]).1 E -(The maximum number of entries that will be processed in a single queue run.) -2.35 E(MAXMXHOSTS [20])102 253.2 Q -(The maximum number of MX records we will accept for an)188.4 265.2 Q 2.5(ys) --.15 G(ingle host.)439.03 265.2 Q 2.851(An)102 281.4 S .351 -(umber of other compilation options e)117.071 281.4 R 2.851(xist. These)-.15 F -.35(specify whether or not speci\214c code should be)2.851 F(compiled in.)102 -293.4 Q(DEB)102 309.6 Q 49.56(UG If)-.1 F 1.226(set, deb)3.726 F 1.226 -(ugging information is compiled in.)-.2 F 2.827 -.8(To a)6.226 H 1.227 -(ctually get the deb).8 F(ugging)-.2 E .4(output, the)188.4 321.6 R F0<ad64>2.9 -E F1 .4(\215ag must be used.)2.9 F F0 .4(WE STR)5.4 F(ONGL)-.3 E 2.9(YR)-.92 G -.4(ECOMMEND THA)412.05 321.6 R(T)-.95 E .97(THIS BE LEFT ON.)188.4 333.6 R F1 -.97(Some people, belie)5.97 F .97(ving that it w)-.25 F .97 -(as a security hole \(it)-.1 F -.1(wa)188.4 345.6 S(s, once\) ha).1 E .3 -.15 -(ve t)-.2 H(urned it of).15 E 2.5(fa)-.25 G(nd thus crippled deb)309.05 345.6 Q -(uggers.)-.2 E 41.69(NETINET If)102 361.8 R .829 -(set, support for Internet protocol netw)3.33 F .829(orking is compiled in.)-.1 -F(Pre)5.829 E .829(vious v)-.25 F(er)-.15 E(-)-.2 E .177(sions of)188.4 373.8 R -/F2 10/Times-Italic@0 SF(sendmail)2.677 E F1 .177(referred to this as)2.677 F -/F3 9/Times-Roman@0 SF -.36(DA)2.678 G(EMON).36 E F1 2.678(;t)C .178 -(his old usage is no)381.71 373.8 R 2.678(wi)-.25 G(ncorrect.)468.74 373.8 Q -48.35(NETISO If)102 390 R .143(set, support for ISO protocol netw)2.643 F .142 -(orking is compiled in \(it may be appropri-)-.1 F -(ate to #de\214ne this in the Mak)188.4 402 Q(e\214le instead of conf.h\).)-.1 -E 63.35(LOG If)102 418.2 R .5(set, the)3 F F2(syslo)3 E(g)-.1 E F1 .5 -(routine in use at some sites is used.)3 F .5(This mak)5.5 F .5(es an informa-) --.1 F .504(tional log record for each message processed, and mak)188.4 430.2 R -.504(es a higher priority log)-.1 F(record for internal system errors.)188.4 -442.2 Q(MA)102 458.4 Q 16.12(TCHGECOS Compile)-1.11 F 3.555 -(in the code to do `)6.055 F 3.555(`fuzzy matching')-.74 F 6.055('o)-.74 G -6.055(nt)404.22 458.4 S 3.555(he GECOS \214eld in)418.055 458.4 R 2.5 -(/etc/passwd. This)188.4 470.4 R(also requires that option G be turned on.)2.5 -E -.35(NA)102 486.6 S 18.15(MED_BIND Compile).35 F .413 -(in code to use the Berk)2.913 F(ele)-.1 E 2.912(yI)-.15 G .412 -(nternet Name Domain \(BIND\) serv)342.41 486.6 R .412(er to)-.15 F(resolv) -188.4 498.6 Q 2.5(eT)-.15 G(CP/IP host names.)225.74 498.6 Q(NO)102 514.8 Q -38.76(TUNIX If)-.4 F .247 -(you are using a non-UNIX mail format, you can set this \215ag to turn of)2.747 -F 2.748(fs)-.25 G(pe-)491.23 514.8 Q -(cial processing of UNIX-style \231From \232 lines.)188.4 526.8 Q -.1(QU)102 -543 S 50.12(EUE This).1 F 1.559 -(\215ag should be set to compile in the queueing code.)4.06 F 1.559 -(If this is not set,)6.559 F -(mailers must accept the mail immediately or it will be returned to the sender) -188.4 555 Q(.)-.55 E(SETPR)102 571.2 Q 12.63(OCTITLE If)-.4 F(de\214ned,)3.88 E -F2(sendmail)3.88 E F1 1.381(will change its)3.881 F F2(ar)3.881 E(gv)-.37 E F1 -1.381(array to indicate its current status.)3.881 F .207 -(This can be used in conjunction with the)188.4 583.2 R F2(ps)2.707 E F1 .206 -(command to \214nd out just what it')2.707 F(s)-.55 E(up to.)188.4 595.2 Q -57.78(SMTP If)102 611.4 R .756(set, the code to handle user and serv)3.256 F -.756(er SMTP will be compiled in.)-.15 F .756(This is)5.756 F 2.507 -(only necessary if your machine has some mailer that speaks SMTP \(this)188.4 -623.4 R(means most machines e)188.4 635.4 Q -.15(ve)-.25 G(rywhere\).).15 E -(UGL)102 651.6 Q 30.46(YUUCP If)-1 F 1.023(you ha)3.523 F 1.323 -.15(ve a U)-.2 -H 1.024(UCP host adjacent to you which is not running a reasonable).15 F -.15 -(ve)188.4 663.6 S .112(rsion of).15 F F2(rmail)2.612 E F1 2.612(,y)C .112 -(ou will ha)263.026 663.6 R .412 -.15(ve t)-.2 H 2.612(os).15 G .112 -(et this \215ag to include the \231remote from sys-)329.234 663.6 R .031 -(name\232 info on the from line.)188.4 675.6 R .032 -(Otherwise, UUCP gets confused about where the)5.032 F(mail came from.)188.4 -687.6 Q 44.45(USERDB Include)102 703.8 R(the)3.449 E F0(experimental)3.449 E F1 -(Berk)3.449 E(ele)-.1 E 3.449(yu)-.15 G .949(ser information database package.) -341.356 703.8 R(This)5.948 E .27(adds a ne)188.4 715.8 R 2.77(wl)-.25 G -2.15 --.25(ev e)238.67 715.8 T 2.77(lo).25 G 2.77(fl)262.7 715.8 S .27(ocal name e) -271.58 715.8 R .27(xpansion between aliasing and forw)-.15 F 2.77(arding. It) --.1 F EP -%%Page: 51 46 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF(Sendmail Installation and Operation Guide)72 60 Q -(SMM:08-51)452.9 60 Q/F1 10/Times-Roman@0 SF(also uses the NEWDB package.)188.4 -96 Q(This may change in future releases.)5 E(IDENTPR)102 112.2 Q -1.88 -.4 -(OT O)-.4 H .376(Compile in the IDENT protocol as de\214ned in RFC 1413.)188.4 -112.2 R .375(This def)5.375 F .375(aults on for)-.1 F 1.053(all systems e)188.4 -124.2 R 1.053 -(xcept Ultrix, which apparently has the interesting \231feature\232 that)-.15 F -.83(when it recei)188.4 136.2 R -.15(ve)-.25 G 3.33(sa\231).15 G .83 -(host unreachable\232 message it closes all open connections)270.18 136.2 R -1.921(to that host.)188.4 148.2 R 1.921(Since some \214re)6.921 F -.1(wa)-.25 G -1.922(ll g).1 F(ate)-.05 E -.1(wa)-.25 G 1.922 -(ys send this error code when you).1 F 2.055 -(access an unauthorized port \(such as 113, used by IDENT\), Ultrix cannot) -188.4 160.2 R(recei)188.4 172.2 Q .3 -.15(ve e)-.25 H(mail from such hosts.).15 -E F0 2.5(6.3. Con\214guration)87 196.2 R(in sr)2.5 E(c/conf)-.18 E(.c)-.15 E F1 -(The follo)127 212.4 Q(wing changes can be made in conf.c.)-.25 E F0 2.5 -(6.3.1. Built-in)102 236.4 R(Header Semantics)2.5 E F1 1.248 -(Not all header semantics are de\214ned in the con\214guration \214le.)142 -252.6 R 1.248(Header lines that should)6.248 F .305(only be included by certai\ -n mailers \(as well as other more obscure semantics\) must be speci\214ed)117 -264.6 R .046(in the)117 276.6 R/F2 10/Times-Italic@0 SF(HdrInfo)2.546 E F1 .046 -(table in)2.546 F F2(conf)2.546 E(.c)-.15 E F1 5.046(.T)C .047 -(his table contains the header name \(which should be in all lo)246.836 276.6 R -(wer)-.25 E(case\) and a set of header control \215ags \(described belo)117 -288.6 Q(w\), The \215ags are:)-.25 E(H_A)117 304.8 Q 30.97(CHECK Normally)-.4 F -.007(when the check is made to see if a header line is compatible with)2.508 F -2.94(am)203.4 316.8 S(ailer)218.56 316.8 Q(,)-.4 E F2(sendmail)2.94 E F1 .441 -(will not delete an e)2.94 F .441(xisting line.)-.15 F .441 -(If this \215ag is set,)5.441 F F2(send-)2.941 E(mail)203.4 328.8 Q F1 .152 -(will delete e)2.652 F -.15(ve)-.25 G 2.652(ne).15 G .152 -(xisting header lines.)293.998 328.8 R .152 -(That is, if this bit is set and the)5.152 F 1.425(mailer does not ha)203.4 -340.8 R 1.725 -.15(ve \215)-.2 H 1.425 -(ag bits set that intersect with the required mailer).15 F 2.204 -(\215ags in the header de\214nition in sendmail.cf, the header line is)203.4 -352.8 R F2(always)4.703 E F1(deleted.)203.4 364.8 Q 51.13(H_EOH If)117 381 R -.206(this header \214eld is set, treat it lik)2.705 F 2.706(eab)-.1 G .206 -(lank line, i.e., it will signal the end)363.948 381 R -(of the header and the be)203.4 393 Q(ginning of the message te)-.15 E(xt.)-.15 -E 39.45(H_FORCE Add)117 409.2 R 2.039(this header entry e)4.539 F -.15(ve)-.25 -G 4.539(ni).15 G 4.539(fo)326.225 409.2 S 2.038(ne e)339.094 409.2 R 2.038 -(xisted in the message before.)-.15 F 2.038(If a)7.038 F 2.188 -(header entry does not ha)203.4 421.2 R 2.488 -.15(ve t)-.2 H 2.188 -(his bit set,).15 F F2(sendmail)4.688 E F1 2.189(will not add another)4.689 F -.62(header line if a header line of this name already e)203.4 433.2 R 3.12 -(xisted. This)-.15 F -.1(wo)3.12 G .62(uld nor).1 F(-)-.2 E -(mally be used to stamp the message by e)203.4 445.2 Q -.15(ve)-.25 G -(ryone who handled it.).15 E(H_TRA)117 461.4 Q 39.3(CE If)-.4 F 1.043 -(set, this is a timestamp \(trace\) \214eld.)3.543 F 1.044 -(If the number of trace \214elds in a)6.043 F .706(message e)203.4 473.4 R .705 -(xceeds a preset amount the message is returned on the assump-)-.15 F -(tion that it has an aliasing loop.)203.4 485.4 Q 46.67(H_RCPT If)117 501.6 R -.332(set, this \214eld contains recipient addresses.)2.832 F .332 -(This is used by the)5.332 F F0<ad74>2.832 E F1 .333(\215ag to)2.833 F 1.349 -(determine who to send to when it is collecting recipients from the mes-)203.4 -513.6 R(sage.)203.4 525.6 Q(H_FR)117 541.8 Q 43.74(OM This)-.4 F 1.673 -(\215ag indicates that this \214eld speci\214es a sender)4.173 F 6.674(.T)-.55 -G 1.674(he order of these)432.058 541.8 R .898(\214elds in the)203.4 553.8 R F2 -(HdrInfo)3.398 E F1 .898(table speci\214es)3.398 F F2(sendmail)3.398 E F1 1.998 --.55('s p)D .898(reference for which \214eld).55 F -(to return error messages to.)203.4 565.8 Q(Let')117 582 Q 2.5(sl)-.55 G -(ook at a sample)142.28 582 Q F2(HdrInfo)2.5 E F1(speci\214cation:)2.5 E EP -%%Page: 52 47 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF 193.36(SMM:08-52 Sendmail)72 60 R -(Installation and Operation Guide)2.5 E/F1 10/Times-Roman@0 SF(struct hdrinfo) -157 96 Q(HdrInfo[] =)258.19 96 Q({)157 108 Q -(/* originator \214elds, most to least signi\214cant)189.5 120 Q(*/)5 E 14.72 -("resent-sender", H_FR)177 132 R(OM,)-.4 E 21.38("resent-from", H_FR)177 144 R -(OM,)-.4 E 41.93("sender", H_FR)177 156 R(OM,)-.4 E 48.59("from", H_FR)177 168 -R(OM,)-.4 E 29.15("full-name", H_A)177 180 R(CHECK,)-.4 E -(/* destination \214elds */)189.5 192 Q 60.25("to", H_RCPT)177 204 R(,)-.74 E -33.04("resent-to", H_RCPT)177 216 R(,)-.74 E 59.15("cc", H_RCPT)177 228 R(,) --.74 E(/* message identi\214cation and control */)189.5 240 Q 34.15 -("message", H_EOH,)177 252 R("te)177 264 Q 53.18(xt", H_EOH,)-.15 F -(/* trace \214elds */)189.5 276 Q("recei)177 288 Q -.15(ve)-.25 G 34.56 -(d", H_TRA).15 F(CE|H_FORCE,)-.4 E 49.53(NULL, 0,)177 312 R(};)157 324 Q 2.435 -(This structure indicates that the \231T)117 340.2 R 2.435 -(o:\232, \231Resent-T)-.8 F 2.435 -(o:\232, and \231Cc:\232 \214elds all specify recipient)-.8 F 3.162 -(addresses. An)117 352.2 R 3.162<7999>-.15 G .661(Full-Name:\232 \214eld will \ -be deleted unless the required mailer \215ag \(indicated in)188.154 352.2 R -.245(the con\214guration \214le\) is speci\214ed.)117 364.2 R .245 -(The \231Message:\232 and \231T)5.245 F -.15(ex)-.7 G .246 -(t:\232 \214elds will terminate the header;).15 F 1.936 -(these are used by random dissenters around the netw)117 376.2 R 1.936(ork w) --.1 F 4.436(orld. The)-.1 F(\231Recei)4.436 E -.15(ve)-.25 G 1.936 -(d:\232 \214eld will).15 F(al)117 388.2 Q -.1(wa)-.1 G -(ys be added, and can be used to trace messages.).1 E .445 -(There are a number of important points here.)142 404.4 R .446 -(First, header \214elds are not added automati-)5.446 F .657 -(cally just because the)117 416.4 R 3.157(ya)-.15 G .657(re in the)216.678 -416.4 R/F2 10/Times-Italic@0 SF(HdrInfo)3.157 E F1 .657(structure; the)3.157 F -3.157(ym)-.15 G .656(ust be speci\214ed in the con\214guration)358.23 416.4 R -.727(\214le in order to be added to the message.)117 428.4 R(An)5.728 E 3.228 -(yh)-.15 G .728(eader \214elds mentioned in the con\214guration \214le)312.982 -428.4 R -.2(bu)117 440.4 S 3.24(tn).2 G .74(ot mentioned in the)137.82 440.4 R -F2(HdrInfo)3.24 E F1 .74(structure ha)3.24 F 1.04 -.15(ve d)-.2 H(ef).15 E .74 -(ault processing performed; that is, the)-.1 F 3.24(ya)-.15 G(re)496.23 440.4 Q -1.374(added unless the)117 452.4 R 3.874(yw)-.15 G 1.374 -(ere in the message already)201.792 452.4 R 6.375(.S)-.65 G 1.375(econd, the) -326.595 452.4 R F2(HdrInfo)3.875 E F1 1.375(structure only speci\214es)3.875 F -.324 -(cliched processing; certain headers are processed specially by ad hoc code re) -117 464.4 R -.05(ga)-.15 G .324(rdless of the sta-).05 F .48 -(tus speci\214ed in)117 476.4 R F2(HdrInfo)2.98 E F1 5.48(.F)C .481(or e)226.55 -476.4 R .481(xample, the \231Sender:\232 and \231From:\232 \214elds are al)-.15 -F -.1(wa)-.1 G .481(ys scanned on).1 F(ARP)117 490.4 Q .75 -(ANET mail to determine the sender)-.92 F/F3 7/Times-Roman@0 SF(19)282.31 486.4 -Q F1 3.251(;t)289.31 490.4 S .751 -(his is used to perform the \231return to sender\232 func-)298.121 490.4 R -2.977(tion. The)117 502.4 R .476(\231From:\232 and \231Full-Name:\232 \214elds\ - are used to determine the full name of the sender if)2.977 F -(possible; this is stored in the macro)117 514.4 Q F0($x)2.5 E F1 -(and used in a number of w)2.5 E(ays.)-.1 E F0 2.5(6.3.2. Restricting)102 538.4 -R(Use of Email)2.5 E F1 .149 -(If it is necessary to restrict mail through a relay)142 554.6 R 2.649(,t)-.65 -G(he)339.75 554.6 Q F2 -.15(ch)2.65 G(ec).15 E(kcompat)-.2 E F1 .15 -(routine can be modi\214ed.)2.65 F .163(This routine is called for e)117 566.6 -R -.15(ve)-.25 G .163(ry recipient address.).15 F .163(It returns an e)5.163 F -.163(xit status indicating the status of)-.15 F .895(the message.)117 578.6 R -.895(The status)5.895 F/F4 9/Times-Roman@0 SF(EX_OK)3.395 E F1 .895 -(accepts the address,)3.395 F F4(EX_TEMPF)3.395 E(AIL)-.666 E F1 .895 -(queues the message for a)3.395 F .264(later try)117 590.6 R 2.764(,a)-.65 G -.264(nd other v)157.698 590.6 R .264(alues \(commonly)-.25 F F4(EX_UN)2.764 E --1.215(AVA)-.315 G(ILABLE)1.215 E F1 2.764(\)r)C .264(eject the message.) -358.375 590.6 R .263(It is up to)5.264 F F2 -.15(ch)2.763 G(ec).15 E(k-)-.2 E -(compat)117 602.6 Q F1 .429(to print an error message \(using)2.929 F F2(usr) -2.929 E(err)-.37 E F1 2.929(\)i)C 2.929(ft)315.032 602.6 S .43 -(he message is rejected.)324.071 602.6 R -.15(Fo)5.43 G 2.93(re).15 G(xample,) -443.39 602.6 Q F2 -.15(ch)2.93 G(ec).15 E(k-)-.2 E(compat)117 614.6 Q F1 -(could read:)2.5 E .32 LW 76 669.2 72 669.2 DL 80 669.2 76 669.2 DL 84 669.2 80 -669.2 DL 88 669.2 84 669.2 DL 92 669.2 88 669.2 DL 96 669.2 92 669.2 DL 100 -669.2 96 669.2 DL 104 669.2 100 669.2 DL 108 669.2 104 669.2 DL 112 669.2 108 -669.2 DL 116 669.2 112 669.2 DL 120 669.2 116 669.2 DL 124 669.2 120 669.2 DL -128 669.2 124 669.2 DL 132 669.2 128 669.2 DL 136 669.2 132 669.2 DL 140 669.2 -136 669.2 DL 144 669.2 140 669.2 DL 148 669.2 144 669.2 DL 152 669.2 148 669.2 -DL 156 669.2 152 669.2 DL 160 669.2 156 669.2 DL 164 669.2 160 669.2 DL 168 -669.2 164 669.2 DL 172 669.2 168 669.2 DL 176 669.2 172 669.2 DL 180 669.2 176 -669.2 DL 184 669.2 180 669.2 DL 188 669.2 184 669.2 DL 192 669.2 188 669.2 DL -196 669.2 192 669.2 DL 200 669.2 196 669.2 DL 204 669.2 200 669.2 DL 208 669.2 -204 669.2 DL 212 669.2 208 669.2 DL 216 669.2 212 669.2 DL/F5 5/Times-Roman@0 -SF(19)93.6 679.6 Q/F6 8/Times-Roman@0 SF(Actually)3.2 I 2.632(,t)-.52 G .632 -(his is no longer true in SMTP; this information is contained in the en)132.488 -682.8 R -.12(ve)-.32 G 2.631(lope. The).12 F .631(older ARP)2.631 F .631 -(ANET protocols did)-.736 F(not completely distinguish en)72 692.4 Q -.12(ve) --.32 G(lope from header).12 E(.)-.44 E EP -%%Page: 53 48 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF(Sendmail Installation and Operation Guide)72 60 Q -(SMM:08-53)452.9 60 Q/F1 9/Times-Roman@0 SF(int)157 94.8 Q -(checkcompat\(to, e\))157 105.6 Q(re)175 116.4 Q(gister ADDRESS *to;)-.135 E -(re)175 127.2 Q(gister ENVELOPE *e;)-.135 E({)157 138 Q(re)175 148.8 Q -(gister ST)-.135 E(AB *s;)-.837 E 2.25(s=s)175 170.4 S(tab\("pri)191.578 170.4 -Q -.225(va)-.225 G(te", ST_MAILER, ST_FIND\);).225 E -(if \(s != NULL && e\255>e_from.q_mailer != LocalMailer &&)175 181.2 Q -(to->q_mailer == s->s_mailer\))184 192 Q({)175 202.8 Q(usrerr\("No pri)193 -213.6 Q -.225(va)-.225 G(te net mail allo).225 E(wed through this machine"\);) --.225 E(return \(EX_UN)193 224.4 Q -1.215(AVA)-.315 G(ILABLE\);)1.215 E(})175 -235.2 Q(if \(MsgSize > 50000 && to\255>q_mailer != LocalMailer\))175 246 Q({) -175 256.8 Q(usrerr\("Message too lar)193 267.6 Q(ge for non-local deli)-.162 E --.135(ve)-.225 G(ry"\);).135 E(NoReturn = TR)193 278.4 Q(UE;)-.36 E -(return \(EX_UN)193 289.2 Q -1.215(AVA)-.315 G(ILABLE\);)1.215 E(})175 300 Q -(return \(EX_OK\);)175 310.8 Q(})157 321.6 Q/F2 10/Times-Roman@0 SF .205 -(This w)117 337.8 R .205 -(ould reject messages greater than 50000 bytes unless the)-.1 F 2.705(yw)-.15 G -.205(ere local.)387.09 337.8 R(The)5.205 E/F3 10/Times-Italic@0 SF(NoReturn) -2.705 E F2(\215ag)2.705 E 1.196(can be sent to suppress the return of the actu\ -al body of the message in the error return.)117 349.8 R(The)6.197 E(actual use\ - of this routine is highly dependent on the implementation, and use should be \ -limited.)117 361.8 Q F0 2.5(6.3.3. Load)102 385.8 R -.6 -1(Av e)2.5 H -(rage Computation)1 E F2 .18(The routine)142 402 R F3 -.1(ge)2.68 G(tla).1 E F2 -.18(should return an approximation of the current system load a)2.68 F -.15(ve) --.2 G .18(rage as an).15 F(inte)117 414 Q(ger)-.15 E 5(.T)-.55 G -(here are four v)157.68 414 Q -(ersions included on compilation \215ags as described abo)-.15 E -.15(ve)-.15 G -(.).15 E F0 2.5(6.3.4. New)102 438 R(Database Map Classes)2.5 E F2(Ne)142 454.2 -Q 2.875(wk)-.25 G .675 -.15(ey m)168.405 454.2 T .375(aps can be added by crea\ -ting a class initialization function and a lookup func-).15 F 2.5(tion. These) -117 466.2 R(are then added to the routine)2.5 E F3(setupmaps.)2.5 E F2 -(The initialization function is called as)142 482.4 Q F3(xxx)157 498.6 Q F2 -(_map_init\(MAP *map, char *mapname, char *ar)A(gs\))-.18 E(The)117 514.8 Q F3 -(map)2.555 E F2 .055(is an internal data structure.)2.555 F(The)5.055 E F3 -(mapname)2.555 E F2 .054(is the name of the map \(used for error mes-)2.554 F -2.819(sages\). The)117 526.8 R F3(ar)2.819 E(gs)-.37 E F2 .32(is a pointer to \ -the rest of the con\214guration \214le line; \215ags and \214lenames can be) -2.819 F -.15(ex)117 538.8 S .675(tracted from this line.).15 F .675 -(The initialization function must return)5.675 F F1(TR)3.175 E(UE)-.36 E F2 -.674(if it successfully opened)3.174 F(the map,)117 550.8 Q F1 -.666(FA)2.5 G -(LSE).666 E F2(otherwise.)2.5 E(The lookup function is called as)142 567 Q F3 -(xxx)157 583.2 Q F2(_map_lookup\(MAP *map, char b)A(uf[], int b)-.2 E -(ufsize, char **a)-.2 E 1.3 -.65(v, i)-.2 H(nt *statp\)).65 E(The)117 599.4 Q -F3(map)3.475 E F2 .975(de\214nes the map internally)3.475 F 5.975(.T)-.65 G -.975(he parameters)277.18 599.4 R F3 -.2(bu)3.475 G(f).2 E F2(and)3.475 E F3 --.2(bu)3.475 G(fsize).2 E F2(ha)3.476 E 1.276 -.15(ve t)-.2 H .976(he input k) -.15 F -.15(ey)-.1 G 5.976(.T)-.5 G(his)492.33 599.4 Q .043 -(may be \(and often is\) used destructi)117 611.4 R -.15(ve)-.25 G(ly).15 E -5.043(.T)-.65 G(he)289.831 611.4 Q F3(av)2.543 E F2 .043(is a list of ar)2.543 -F .042(guments passed in from the re)-.18 F(write)-.25 E 3.654(line. The)117 -623.4 R 1.154(lookup function should return a pointer to the ne)3.654 F 3.655 -(wv)-.25 G 3.655(alue. IF)378.335 623.4 R 1.155(the map lookup f)3.655 F(ails,) --.1 E F3(*statp)117 635.4 Q F2 1.272(should be set to an e)3.772 F 1.272 -(xit status code; in particular)-.15 F 3.772(,i)-.4 G 3.771(ts)357.652 635.4 S -1.271(hould be set to)368.093 635.4 R F1(EX_TEMPF)3.771 E(AIL)-.666 E F2(if) -3.771 E(reco)117 647.4 Q -.15(ve)-.15 G(ry is to be attempted by the higher le) -.15 E -.15(ve)-.25 G 2.5(lc).15 G(ode.)308.76 647.4 Q F0 2.5(6.3.5. Queueing) -102 671.4 R(Function)2.5 E F2 .782(The routine)142 687.6 R F3(shouldqueue)3.282 -E F2 .783(is called to decide if a message should be queued or processed)3.283 -F(immediately)117 699.6 Q 6.619(.T)-.65 G 1.618 -(ypically this compares the message priority to the current load a)180.779 -699.6 R -.15(ve)-.2 G 4.118(rage. The).15 F(def)117 711.6 Q -(ault de\214nition is:)-.1 E EP -%%Page: 54 49 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF 193.36(SMM:08-54 Sendmail)72 60 R -(Installation and Operation Guide)2.5 E/F1 10/Times-Roman@0 SF(bool)157 96 Q -(shouldqueue\(pri, ctime\))157 108 Q(long pri;)175 120 Q(time_t ctime;)175 132 -Q({)157 144 Q(if \(CurrentLA < QueueLA\))175 156 Q(return \(F)193 168 Q -(ALSE\);)-.74 E(if \(CurrentLA >= RefuseLA\))175 180 Q(return \(TR)193 192 Q -(UE\);)-.4 E(return \(pri > \(QueueF)175 204 Q -(actor / \(CurrentLA \255 QueueLA + 1\)\)\);)-.15 E(})157 216 Q 2.062 -(If the current load a)117 232.2 R -.15(ve)-.2 G 2.062(rage \(global v).15 F -(ariable)-.25 E/F2 10/Times-Italic@0 SF(Curr)4.562 E(entLA)-.37 E F1 4.562(,w)C -2.062(hich is set before this function is)361.636 232.2 R 1.058 -(called\) is less than the lo)117 244.2 R 3.558(wt)-.25 G 1.058 -(hreshold load a)234.198 244.2 R -.15(ve)-.2 G 1.058(rage \(option).15 F F0(x) -3.557 E F1 3.557(,v)C(ariable)375.526 244.2 Q F2(QueueLA)3.557 E F1(\),)A F2 -(shouldqueue)3.557 E F1(returns)117 256.2 Q/F3 9/Times-Roman@0 SF -.666(FA) -2.586 G(LSE).666 E F1 .086(immediately \(that is, it should)2.586 F F2(not) -2.586 E F1 2.586(queue\). If)2.586 F .086(the current load a)2.586 F -.15(ve) --.2 G .087(rage e).15 F .087(xceeds the)-.15 F .588(high threshold load a)117 -268.2 R -.15(ve)-.2 G .588(rage \(option).15 F F0(X)3.087 E F1 3.087(,v)C -(ariable)281.846 268.2 Q F2(RefuseLA)3.087 E F1(\),)A F2(shouldqueue)3.087 E F1 -(returns)3.087 E F3(TR)3.087 E(UE)-.36 E F1(immedi-)3.087 E(ately)117 280.2 Q -7.125(.O)-.65 G 2.125 -(therwise, it computes the function based on the message priority)152.635 280.2 -R 4.626(,t)-.65 G 2.126(he queue f)438.208 280.2 R(actor)-.1 E(\(option)117 -292.2 Q F0(q)2.5 E F1 2.5(,g)C(lobal v)163.95 292.2 Q(ariable)-.25 E F2(QueueF) -2.5 E(actor)-.75 E F1(\), and the current and threshold load a)A -.15(ve)-.2 G -(rages.).15 E 1.067(An implementation wishing to tak)142 308.4 R 3.567(et)-.1 G -1.066(he actual age of the message into account can also)293.625 308.4 R 1.41 -(use the)117 320.4 R F2(ctime)3.91 E F1(parameter)3.91 E 3.91(,w)-.4 G 1.41 -(hich is the time that the message w)229.15 320.4 R 1.41 -(as \214rst submitted to)-.1 F F2(sendmail)3.91 E F1(.)A .929(Note that the)117 -332.4 R F2(pri)3.428 E F1 .928 -(parameter is already weighted by the number of times the message has been) -3.428 F .395(tried \(although this tends to lo)117 344.4 R .395 -(wer the priority of the message with time\); the e)-.25 F .395 -(xpectation is that)-.15 F(the)117 356.4 Q F2(ctime)2.674 E F1 -.1(wo)2.674 G -.174(uld be used as an \231escape clause\232 to ensure that messages are e).1 F --.15(ve)-.25 G .174(ntually processed.).15 F F0 2.5(6.3.6. Refusing)102 380.4 R -(Incoming SMTP Connections)2.5 E F1 1.148(The function)142 396.6 R F2 -.37(re) -3.648 G(fuseconnections).37 E F1(returns)3.648 E F3(TR)3.648 E(UE)-.36 E F1 -1.148(if incoming SMTP connections should be)3.648 F 3.564(refused. The)117 -408.6 R 1.063(current implementation is based e)3.563 F(xclusi)-.15 E -.15(ve) --.25 G 1.063(ly on the current load a).15 F -.15(ve)-.2 G 1.063(rage and the) -.15 F(refuse load a)117 420.6 Q -.15(ve)-.2 G(rage option \(option).15 E F0(X) -2.5 E F1 2.5(,g)C(lobal v)273.56 420.6 Q(ariable)-.25 E F2(RefuseLA)2.5 E F1 -(\):)A(bool)157 436.8 Q(refuseconnections\(\))157 448.8 Q({)157 460.8 Q -(return \(CurrentLA >= RefuseLA\);)175 472.8 Q(})157 484.8 Q 2.5(Am)117 501 S -(ore cle)134.5 501 Q -.15(ve)-.25 G 2.5(ri).15 G -(mplementation could look at more system resources.)179.08 501 Q F0 2.5 -(6.3.7. Load)102 525 R -.6 -1(Av e)2.5 H(rage Computation)1 E F1 .243 -(The routine)142 541.2 R F2 -.1(ge)2.743 G(tla).1 E F1 .243 -(returns the current load a)2.743 F -.15(ve)-.2 G .243 -(rage \(as a rounded inte).15 F 2.743(ger\). The)-.15 F(distrib)2.744 E(ution) --.2 E(includes se)117 553.2 Q -.15(ve)-.25 G(ral possible implementations.).15 -E F0 2.5(6.4. Con\214guration)87 577.2 R(in sr)2.5 E(c/daemon.c)-.18 E F1 .4 -(The \214le)127 593.4 R F2(sr)2.9 E(c/daemon.c)-.37 E F1 .4 -(contains a number of routines that are dependent on the local netw)2.9 F(ork-) --.1 E(ing en)102 605.4 Q 2.5(vironment. The)-.4 F -.15(ve)2.5 G -(rsion supplied assumes you ha).15 E .3 -.15(ve B)-.2 H(SD style sock).15 E -(ets.)-.1 E 2.16(In pre)127 621.6 R 2.16 -(vious releases, we recommended that you modify the routine)-.25 F F2 -(maphostname)4.66 E F1 2.16(if you)4.66 F -.1(wa)102 633.6 S 1.919 -(nted to generalize).1 F F0($[)4.418 E F1(...)4.418 E F0($])4.418 E F1 4.418 -(lookups. W)4.418 F 4.418(en)-.8 G 2.418 -.25(ow r)293.906 633.6 T 1.918 -(ecommend that you create a ne).25 F 4.418(wk)-.25 G -.15(ey)463.632 633.6 S -1.918(ed map).15 F(instead.)102 645.6 Q F0 2.5(7. CHANGES)72 669.6 R -(IN VERSION 8)2.5 E F1 .172(The follo)112 685.8 R .172 -(wing summarizes changes since the last commonly a)-.25 F -.25(va)-.2 G .173 -(ilable v).25 F .173(ersion of)-.15 F F2(sendmail)2.673 E F1(\(5.67\):)2.673 E -EP -%%Page: 55 50 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF(Sendmail Installation and Operation Guide)72 60 Q -(SMM:08-55)452.9 60 Q 2.5(7.1. Connection)87 96 R(Caching)2.5 E/F1 10 -/Times-Roman@0 SF .398(Instead of closing SMTP connections immediately)127 -112.2 R 2.897(,t)-.65 G .397(hose connections are cached for possible)339.005 -112.2 R .597(future use.)102 124.2 R .597(The adv)5.597 F .597 -(ent of MX records made this ef)-.15 F(fecti)-.25 E .897 -.15(ve f)-.25 H .598 -(or mailing lists; in addition, substantial).15 F(performance impro)102 136.2 Q --.15(ve)-.15 G(ments can be e).15 E(xpected for queue processing.)-.15 E F0 2.5 -(7.2. MX)87 160.2 R(Piggybacking)2.5 E F1 1.258(If tw)127 176.4 R 3.757(oh)-.1 -G 1.257(osts with dif)161.075 176.4 R 1.257 -(ferent names in a single message happen to ha)-.25 F 1.557 -.15(ve t)-.2 H -1.257(he same set of MX).15 F .94(hosts, the)102 188.4 R 3.44(yc)-.15 G .94 -(an be sent in the same transaction.)153.45 188.4 R -1.11(Ve)5.94 G .94 -(rsion 8 notices this and tries to batch the mes-)1.11 F(sages.)102 200.4 Q F0 -2.5(7.3. RFC)87 224.4 R(1123 Compliance)2.5 E F1 3.463(An)127 240.6 S .963 -(umber of changes ha)142.683 240.6 R 1.262 -.15(ve b)-.2 H .962 -(een made to mak).15 F(e)-.1 E/F2 10/Times-Italic@0 SF(sendmail)3.462 E F1 .962 -(\231conditionally compliant\232 \(that is,)3.462 F F2(sendmail)102 252.6 Q F1 -.049(satis\214es all of the \231MUST\232 clauses and most b)2.549 F .05 -(ut not all of the \231SHOULD\232 clauses in RFC)-.2 F(1123\).)102 264.6 Q -(The major areas of change are \(numbers are RFC 1123 section numbers\):)127 -280.8 Q 15(5.2.7 Response)102 297 R(to RCPT command is f)2.5 E(ast.)-.1 E 15 -(5.2.8 Numeric)102 313.2 R(IP addresses are logged in Recei)2.5 E -.15(ve)-.25 -G(d: lines.).15 E 10(5.2.17 Self)102 329.4 R -(domain literal is properly handled.)2.5 E 15(5.3.2 Better)102 345.6 R -(control o)2.5 E -.15(ve)-.15 G 2.5(ri).15 G(ndi)220.02 345.6 Q -(vidual timeouts.)-.25 E 15(5.3.3 Error)102 361.8 R -(messages are sent as \231From:<>\232.)2.5 E 15(5.3.3 Error)102 378 R -(messages are ne)2.5 E -.15(ve)-.25 G 2.5(rs).15 G(ent to \231<>\232.)246.28 -378 Q 15(5.3.3 Route-addrs)102 394.2 R(are pruned.)2.5 E(The areas in which)102 -410.4 Q F2(sendmail)2.5 E F1(is not \231unconditionally compliant\232 are:)2.5 -E(5.2.6)102 426.6 Q F2(Sendmail)139.5 426.6 Q F1(does do header munging.)2.5 E -(5.2.10)102 442.8 Q F2(Sendmail)139.5 442.8 Q F1(doesn')2.5 E 2.5(ta)-.18 G -.1 -(lwa)215.42 442.8 S(ys use the e).1 E(xact SMTP message te)-.15 E -(xt as listed in RFC 821.)-.15 E(5.3.1.1)102 459 Q F2(Sendmail)139.5 459 Q F1 -(doesn')2.5 E 2.5(tg)-.18 G -(uarantee only one connect for each host in queue runs.)215.98 459 Q(5.3.1.1) -102 475.2 Q F2(Sendmail)139.5 475.2 Q F1(doesn')2.5 E 2.5(ta)-.18 G -.1(lwa) -215.42 475.2 S(ys pro).1 E(vide adequate concurrenc)-.15 E 2.5(yl)-.15 G -(imits.)366.54 475.2 Q F0 2.5(7.4. Extended)87 499.2 R(SMTP Support)2.5 E F1 --1.11(Ve)127 515.4 S .155(rsion 8 includes both sending and recei)1.11 F .154 -(ving support for Extended SMTP support as de\214ned)-.25 F(by RFC 1425 \(basi\ -c\) and RFC 1427 \(SIZE\); and limited support for RFC 1426 \(BOD)102 527.4 Q -(Y\).)-.55 E F0 2.5(7.5. Eight-Bit)87 551.4 R(Clean)2.5 E F1(Pre)127 567.6 Q -1.263(vious v)-.25 F 1.263(ersions of)-.15 F F2(sendmail)3.763 E F1 1.264 -(used the 0200 bit for quoting.)3.763 F 1.264(This v)6.264 F 1.264(ersion a) --.15 F -.2(vo)-.2 G 1.264(ids that use.).2 F(Ho)102 579.6 Q(we)-.25 E -.15(ve) --.25 G .8 -.4(r, f).15 H -(or compatibility with RFC 822, you can set option `7' to get se).4 E -.15(ve) --.25 G 2.5(nb).15 G(it stripping.)418.86 579.6 Q(Indi)127 595.8 Q -(vidual mailers can still produce se)-.25 E -.15(ve)-.25 G 2.5(nb).15 G -(it output using the `7' mailer \215ag.)300.77 595.8 Q F0 2.5(7.6. User)87 -619.8 R(Database)2.5 E F1 1.073(The user database is an as-yet e)127 636 R -1.072(xperimental attempt to pro)-.15 F 1.072(vide uni\214ed lar)-.15 F 1.072 -(ge-site name sup-)-.18 F 2.5(port. W)102 648 R 2.5(ea)-.8 G -(re installing it at Berk)145.63 648 Q(ele)-.1 E(y; future v)-.15 E -(ersions may sho)-.15 E 2.5(ws)-.25 G(igni\214cant modi\214cations.)363.57 648 -Q F0 2.5(7.7. Impr)87 672 R -.1(ove)-.18 G 2.5(dB).1 G(IND Support)158.01 672 Q -F1 .489(The BIND support, particularly for MX records, had a number of anno)127 -688.2 R .49(ying \231features\232 which)-.1 F(ha)102 700.2 Q 1.212 -.15(ve b) --.2 H .912(een remo).15 F -.15(ve)-.15 G 3.412(di).15 G 3.412(nt)187.116 700.2 -S .912(his release.)198.308 700.2 R .912(In particular)5.912 F 3.412(,t)-.4 G -.912(hese more tightly bind \(pun intended\) the name)307.916 700.2 R(serv)102 -712.2 Q(er to)-.15 E F2(sendmail)2.5 E F1 2.5(,s)C 2.5(ot)184.06 712.2 S -(hat the name serv)194.34 712.2 Q -(er resolution rules are incorporated directly into)-.15 E F0(sendmail)2.5 E F1 -(.)A EP -%%Page: 56 51 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF 193.36(SMM:08-56 Sendmail)72 60 R -(Installation and Operation Guide)2.5 E 2.5(7.8. K)87 96 R(ey)-.25 E(ed Files) --.1 E/F1 10/Times-Roman@0 SF .365(Generalized k)127 112.2 R -.15(ey)-.1 G .365 -(ed \214les is an idea tak).15 F .365(en directly from)-.1 F/F2 9/Times-Roman@0 -SF(ID)2.866 E(A)-.36 E/F3 10/Times-Italic@0 SF(sendmail)2.866 E F1 .366 -(\(albeit with a completely)2.866 F(dif)102 124.2 Q(ferent implementation\).) --.25 E(The)5 E 2.5(yc)-.15 G(an be useful on lar)239.63 124.2 Q(ge sites.)-.18 -E -1.11(Ve)127 140.4 S(rsion 8 also understands YP)1.11 E(.)-1.11 E F0 2.5 -(7.9. Multi-W)87 164.4 R(ord Classes)-.75 E F1(Classes can no)127 180.6 Q 2.5 -(wb)-.25 G 2.5(em)200.35 180.6 S(ultiple w)215.07 180.6 Q 2.5(ords. F)-.1 F -(or e)-.15 E(xample,)-.15 E(CShofmann.CS.Berk)142 196.8 Q(ele)-.1 E -.65(y.) --.15 G(EDU).65 E(allo)102 213 Q 2.664 -(ws you to match the entire string \231hofmann.CS.Berk)-.25 F(ele)-.1 E -.65 -(y.)-.15 G 2.663(EDU\232 using the single construct).65 F(\231$=S\232.)102 225 -Q F0 2.5(7.10. Deferr)87 249 R(ed Macr)-.18 E 2.5(oE)-.18 G(xpansion)189.94 249 -Q F1(The)127 265.2 Q F0($&)2.5 E F3(x)A F1(construct has been adopted from)2.5 -E F2(ID)2.5 E(A)-.36 E F1(.)A F0 2.5(7.11. IDENT)87 289.2 R(Pr)2.5 E -(otocol Support)-.18 E F1 -(The IDENT protocol as de\214ned in RFC 1413 is supported.)127 305.4 Q F0 2.5 -(7.12. P)87 329.4 R(arsing Bug Fixes)-.1 E F1 4.03(An)127 345.6 S 1.53 -(umber of small b)143.25 345.6 R 1.53(ugs ha)-.2 F 1.53 -(ving to do with things lik)-.2 F 4.03(eb)-.1 G 1.53 -(ackslash-escaped quotes inside of)364.72 345.6 R(comments ha)102 357.6 Q .3 --.15(ve b)-.2 H(een \214x).15 E(ed.)-.15 E F0 2.5(7.13. Separate)87 381.6 R(En) -2.5 E -.1(ve)-.4 G(lope/Header Pr).1 E(ocessing)-.18 E F1 .854 -(Since the From: line is passed in separately from the en)127 397.8 R -.15(ve) --.4 G .854(lope sender).15 F 3.354(,t)-.4 G .854(hese ha)420.978 397.8 R 1.154 --.15(ve b)-.2 H .854(oth been).15 F .427(made visible; the)102 409.8 R F0($g) -2.927 E F1 .427(macro is set to the en)2.927 F -.15(ve)-.4 G .428 -(lope sender during processing of mailer ar).15 F .428(gument v)-.18 F(ec-)-.15 -E(tors and the header sender during processing of headers.)102 421.8 Q .085 -(It is also possible to specify separate per)127 438 R .085(-mailer en)-.2 F --.15(ve)-.4 G .084(lope and header processing.).15 F(The)5.084 E F0(S)2.584 E -F1(ender)A(-)-.2 E -.55(RW)102 450 S .512(Set and).55 F F0(R)3.012 E F1 -(ecipientR)A .512(Wset ar)-.55 F .512 -(guments for mailers can be speci\214ed as)-.18 F F3(en)3.013 E(velope/header) --.4 E F1 .513(to gi)3.013 F .813 -.15(ve d)-.25 H(if-).15 E(ferent re)102 462 Q -(writings for en)-.25 E -.15(ve)-.4 G(lope v).15 E(ersus header addresses.)-.15 -E F0 2.5(7.14. Owner)87 486 R(-List Pr)-.37 E(opagates to En)-.18 E -.1(ve)-.4 -G(lope).1 E F1 1.001(When an alias has an associated o)127 502.2 R 1 -(wner\255list name, that alias is used to change the en)-.25 F -.15(ve)-.4 G -(lope).15 E(sender address.)102 514.2 Q(This will cause do)5 E -(wnstream errors to be returned to that o)-.25 E(wner)-.25 E(.)-.55 E F0 2.5 -(7.15. Dynamic)87 538.2 R(Header Allocation)2.5 E F1(The \214x)127 554.4 Q -(ed size limit on header lines has been eliminated.)-.15 E F0 2.5(7.16. New)87 -578.4 R(Command Line Flags)2.5 E F1(The)127 594.6 Q F0<ad42>2.5 E F1 -(\215ag has been added to pass in body type information.)2.5 E(The)127 610.8 Q -F0<ad70>2.5 E F1(\215ag has been added to pass in protocol information.)2.5 E -(The)127 627 Q F0<ad58>2.6 E F1 .1(\215ag has been added to allo)2.6 F 2.6(wl) --.25 G .1(ogging of all protocol in and out of)279.89 627 R F3(sendmail)2.6 E -F1 .1(for deb)2.6 F(ug-)-.2 E(ging.)102 639 Q F0 2.5(7.17. Enhanced)87 663 R -(Command Line Flags)2.5 E F1(The)127 679.2 Q F0<ad71>4.007 E F1 1.507(\215ag c\ -an limit limit a queue run to speci\214c recipients, senders, or queue ids usi\ -ng)4.007 F F0(\255qR)102 691.2 Q F3(substring)A F0 2.5<2cad>C(qS)168.41 691.2 Q -F3(substring)A F0 2.5(,o)C 2.5<72ad>226.76 691.2 S(qI)239.4 691.2 Q F3 -(substring)A F0 -.18(re)2.5 G(specti).18 E -.1(ve)-.1 G(ly).1 E(.)-.7 E EP -%%Page: 57 52 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF(Sendmail Installation and Operation Guide)72 60 Q -(SMM:08-57)452.9 60 Q 2.5(7.18. New)87 96 R(and Old Con\214guration Line T)2.5 -E(ypes)-.74 E/F1 10/Times-Roman@0 SF(The)127 112.2 Q F0(T)2.766 E F1(\(T)2.766 -E .267(rusted users\) con\214guration line has been deleted.)-.35 F .267 -(It will still be accepted b)5.267 F .267(ut will be)-.2 F(ignored.)102 124.2 Q -(The)127 140.4 Q F0(K)2.5 E F1(line has been added to declare database maps.) -2.5 E(The)127 156.6 Q F0(V)2.5 E F1 -(line has been added to declare the con\214guration v)2.5 E(ersion le)-.15 E --.15(ve)-.25 G(l.).15 E(The)127 172.8 Q F0(M)2.797 E F1 .296(line has a \231D=\ -\232 \214eld that lets you change into a temporary directory while that mailer) -2.797 F(is running.)102 184.8 Q F0 2.5(7.19. New)87 208.8 R(Options)2.5 E F1 -(Se)127 225 Q -.15(ve)-.25 G .9(ral ne).15 F 3.4(wo)-.25 G .9(ptions ha)184.8 -225 R 1.2 -.15(ve b)-.2 H .9(een added, man).15 F 3.4(yt)-.15 G 3.4(os)314.89 -225 S .9(upport ne)327.18 225 R 3.4(wf)-.25 G .9(eatures, others to allo)379.83 -225 R 3.4(wt)-.25 G(uning)481.22 225 Q 1.187(that w)102 237 R 1.187(as pre)-.1 -F 1.187(viously a)-.25 F -.25(va)-.2 G 1.187(ilable only by recompiling.).25 F -(The)6.186 E 3.686(ya)-.15 G 1.186(re described in detail in Section 5.1.5.) -345.514 237 R(Brie\215y)102 249 Q(,)-.65 E 31(bI)102 265.2 S -(nsist on a minimum number of disk blocks.)141.33 265.2 Q 29.33(CS)102 281.4 S -(et checkpoint interv)143.56 281.4 Q(al.)-.25 E 29.89(ED)102 297.6 S(ef)145.22 -297.6 Q(ault error message.)-.1 E 28.78(GE)102 313.8 S(nable GECOS matching.) -144.11 313.8 Q 31(hM)102 330 S(aximum hop count.)146.89 330 Q 33.22(jS)102 -346.2 S(end errors in MIME-encapsulated format.)143.56 346.2 Q 32.11(JF)102 -362.4 S(orw)143.41 362.4 Q(ard \214le path.)-.1 E 31(kC)102 378.6 S -(onnection cache size)144.67 378.6 Q 28.78(KC)102 394.8 S -(onnection cache lifetime.)144.67 394.8 Q 33.22(lE)102 411 S .333 -(nable Errors-T)144.11 411 R .333(o: header)-.8 F 5.334(.T)-.55 G .334 -(hese headers violate RFC 1123; this option is included to pro-)252.89 411 R -(vide back compatibility with old v)138 423 Q(ersions of)-.15 E/F2 10 -/Times-Italic@0 SF(sendmail)2.5 E F1(.)A 28.78(OS)102 439.2 S -(et incoming SMTP daemon options, such as an alternate SMTP port.)143.56 439.2 -Q 31(pP)102 455.4 S(ri)143.56 455.4 Q -.25(va)-.25 G .3 -.15(cy o).25 H -(ptions.).15 E 29.33(RD)102 471.6 S(on')145.22 471.6 Q 2.5(tp)-.18 G -(rune route-addrs.)168.65 471.6 Q 28.78(UU)102 487.8 S(ser database spec.) -145.22 487.8 Q 28.78(VF)102 504 S(allback \231MX\232 host.)143.41 504 Q 28.78 -<7799>102 520.2 S(Best MX\232 handling technique.)142.44 520.2 Q 31(7D)102 -536.4 S 2.5(on)145.22 536.4 S(ot run eight bit clean.)157.72 536.4 Q F0 2.5 -(7.20. Extended)87 560.4 R(Options)2.5 E F1(The)127 576.6 Q F0(r)3.764 E F1 -1.264(\(read timeout\),)3.764 F F0(I)3.764 E F1 1.264(\(use BIND\), and)3.764 F -F0(T)3.764 E F1 1.264(\(queue timeout\) options ha)3.764 F 1.564 -.15(ve b)-.2 -H 1.264(een e).15 F 1.264(xtended to)-.15 F(pass in more information.)102 588.6 -Q F0 2.5(7.21. New)87 612.6 R(Mailer Flags)2.5 E F1(Se)127 628.8 Q -.15(ve)-.25 -G(ral ne).15 E 2.5(wm)-.25 G(ailer \215ags ha)185.78 628.8 Q .3 -.15(ve b)-.2 H -(een added.).15 E 31.56(aT)102 645 S .636 -(ry to use ESMTP when creating a connection.)143.76 645 R .636 -(If this is not set,)5.636 F F2(sendmail)3.136 E F1 .636(will still try if) -3.136 F .221(the other end hints that it kno)138 657 R .22 -(ws about ESMTP in its greeting message; this \215ag says to try)-.25 F -2.15 --.25(ev e)138 669 T 2.595(ni).25 G 2.595(fi)161.855 669 S 2.595(td)170.56 669 S -(oesn')180.935 669 Q 2.595(th)-.18 G 2.595(int. If)212.79 669 R .095 -(the EHLO \(e)2.595 F .095(xtended hello\) command f)-.15 F(ails,)-.1 E F2 -(sendmail)2.596 E F1 -.1(fa)2.596 G .096(lls back to).1 F(old SMTP)138 681 Q(.) --1.11 E 31(bE)102 697.2 S -(nsure that there is a blank line at the end of all messages.)144.11 697.2 Q -31.56(cS)102 713.4 S .68(trip all comments from addresses; this should only be\ - used as a last resort when dealing)143.56 713.4 R(with crank)138 725.4 Q 2.5 -(ym)-.15 G(ailers.)195.62 725.4 Q EP -%%Page: 58 53 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF 193.36(SMM:08-58 Sendmail)72 60 R -(Installation and Operation Guide)2.5 E/F1 10/Times-Roman@0 SF 31(gN)102 96 S --2.15 -.25(ev e)145.22 96 T 2.64(ru).25 G .14(se the null sender as the en) -169.67 96 R -.15(ve)-.4 G .141(lope sender).15 F 2.641(,e)-.4 G -.15(ve)341.495 -96 S 2.641(nw).15 G .141(hen running SMTP)365.646 96 R 5.141(.A)-1.11 G .141 -(lthough this)456.349 96 R 1.521(violates RFC 1123, it may be necessary when y\ -ou must deal with some obnoxious old)138 108 R(hosts.)138 120 Q 31(7S)102 136.2 -S(trip all output to 7 bits.)143.56 136.2 Q F0 2.5(7.22. New)87 160.2 R(Pr)2.5 -E(e-De\214ned Macr)-.18 E(os)-.18 E F1(The follo)127 176.4 Q -(wing macros are pre-de\214ned:)-.25 E 23.5($k The)102 192.6 R -(UUCP node name, nominally from)2.5 E/F2 10/Times-Italic@0 SF(uname)2.5 E F1 -(\(2\) call.)A 20.72($m The)102 208.8 R(domain part of our full hostname.)2.5 E -23.5($_ The)102 225 R(RFC 1413-pro)2.5 E(vided sender address.)-.15 E F0 2.5 -(7.23. New)87 249 R(LHS T)2.5 E(ok)-.92 E(en)-.1 E F1 -1.11(Ve)127 265.2 S -1.375(rsion 8 allo)1.11 F(ws)-.25 E F0($@)3.875 E F1 1.376 -(on the Left Hand Side of an \231R\232 line to match zero tok)3.875 F 3.876 -(ens. This)-.1 F(is)3.876 E(intended to be used to match the null input.)102 -277.2 Q F0 2.5(7.24. Bigger)87 301.2 R(Defaults)2.5 E F1 -1.11(Ve)127 317.4 S -1.284(rsion 8 allo)1.11 F 1.284(ws up to 100 rulesets instead of 30.)-.25 F -1.283(It is recommended that rulesets 0\2559 be)6.284 F(reserv)102 329.4 Q -(ed for)-.15 E F2(sendmail)2.5 E F1 1.1 -.55('s d)D -(edicated use in future releases.).55 E -(The total number of MX records that can be used has been raised to 20.)127 -345.6 Q .335(The number of queued messages that can be handled at one time has\ - been raised from 600 to)127 361.8 R(1000.)102 373.8 Q F0 2.5(7.25. Differ)87 -397.8 R(ent Default T)-.18 E(uning P)-.92 E(arameters)-.1 E F1 -1.11(Ve)127 414 -S .8(rsion 8 has changed the def)1.11 F .8 -(ault parameters for tuning queue costs to mak)-.1 F 3.3(et)-.1 G .8 -(he number of)449.08 414 R .712(recipients more important than the size of the\ - message \(for small messages\).)102 426 R .712(This is reasonable if)5.712 F -(you are connected with reasonably f)102 438 Q(ast links.)-.1 E F0 2.5(7.26. A) -87 462 R(uto-Quoting in Addr)-.5 E(esses)-.18 E F1(Pre)127 478.2 Q(viously)-.25 -E 2.611(,t)-.65 G .111(he \231Full Name <email address>\232 syntax w)176.771 -478.2 R .111(ould generate incorrect protocol output)-.1 F -(if \231Full Name\232 had special characters such as dot.)102 490.2 Q(This v)5 -E(ersion puts quotes around such names.)-.15 E F0 2.5(7.27. Symbolic)87 514.2 R -(Names On Err)2.5 E(or Mailer)-.18 E F1(Se)127 530.4 Q -.15(ve)-.25 G -(ral names ha).15 E .3 -.15(ve b)-.2 H(een b).15 E -(uilt in to the $@ portion of the $#error mailer)-.2 E(.)-.55 E F0 2.5 -(7.28. SMTP)87 554.4 R(VRFY Doesn't Expand)2.5 E F1(Pre)127 570.6 Q 1.437 -(vious v)-.25 F 1.437(ersions of)-.15 F F2(sendmail)3.937 E F1 1.438 -(treated VRFY and EXPN the same.)3.937 F 1.438(In this v)6.438 F 1.438 -(ersion, VRFY)-.15 F(doesn')102 582.6 Q 2.5(te)-.18 G(xpand aliases or follo) -138.05 582.6 Q 2.5(w.)-.25 G(forw)235.84 582.6 Q(ard \214les.)-.1 E -(EXPN still does.)5 E .682(As an optimization, if you run with your def)127 -598.8 R .681(ault deli)-.1 F -.15(ve)-.25 G .681 -(ry mode being queue-only or deli).15 F -.15(ve)-.25 G -.2(r-).15 G 1.582 -(in-background, the RCPT command will also not chase aliases and .forw)102 -610.8 R 1.582(ard \214les.)-.1 F 1.583(It will chase)6.582 F -(them when it processes the queue.)102 622.8 Q F0 2.5(7.29. [IPC])87 646.8 R -(Mailers Allo)2.5 E 2.5(wM)-.1 G(ultiple Hosts)210.49 646.8 Q F1 .448 -(When an address resolv)127 663 R .448 -(es to a mailer that has \231[IPC]\232 as its \231P)-.15 F .447 -(ath\232, the $@ part \(host name\))-.15 F .137 -(can be a colon-separated list of hosts instead of a single hostname.)102 675 R -.138(This asks)5.138 F F2(sendmail)2.638 E F1 .138(to search the)2.638 F .161 -(list for the \214rst entry that is a)102 687 R -.25(va)-.2 G .161(ilable e).25 -F .16(xactly as though it were an MX record.)-.15 F .16(The intent is to route) -5.16 F .737(internal traf)102 699 R .738(\214c through internal netw)-.25 F -.738(orks without publishing an MX record to the net.)-.1 F .738(MX e)5.738 F -(xpan-)-.15 E(sion is still done on the indi)102 711 Q(vidual items.)-.25 E EP -%%Page: 59 54 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF(Sendmail Installation and Operation Guide)72 60 Q -(SMM:08-59)452.9 60 Q 2.5(7.30. Aliases)87 96 R(Extended)2.5 E/F1 10 -/Times-Roman@0 SF 1.457(The implementation has been mer)127 112.2 R 1.457 -(ged with maps.)-.18 F 1.456(Among other things, this supports NIS-)6.457 F -(based aliases.)102 124.2 Q F0 2.5(7.31. P)87 148.2 R -(ortability and Security Enhancements)-.2 E F1 2.5(An)127 164.4 S -(umber of internal changes ha)141.72 164.4 Q .3 -.15(ve b)-.2 H -(een made to enhance portability).15 E(.)-.65 E(Se)127 180.6 Q -.15(ve)-.25 G -(ral \214x).15 E(es ha)-.15 E .3 -.15(ve b)-.2 H -(een made to increase the paranoia f).15 E(actor)-.1 E(.)-.55 E F0 2.5 -(7.32. Miscellaneous)87 204.6 R(Changes)2.5 E/F2 10/Times-Italic@0 SF(Sendmail) -127 220.8 Q F1(writes a)2.5 E F2(/etc/sendmail.pid)2.5 E F1 -(\214le with the current process id of the SMTP daemon.)2.5 E -1 -.8(Tw o)127 -237 T 1.646(people using the same program in their .forw)4.946 F 1.647 -(ard \214le are considered dif)-.1 F 1.647(ferent so that)-.25 F -(duplicate elimination doesn')102 249 Q 2.5(td)-.18 G(elete one of them.)225.98 -249 Q(The)127 265.2 Q F2(mailstats)3.181 E F1 .681 -(program prints mailer names and gets the location of the)3.181 F F2 -(sendmail.st)3.18 E F1 .68(\214le from)3.18 F F2(/etc/sendmail.cf)102 277.2 Q -F1(.)A(Man)127 293.4 Q 2.5(ym)-.15 G(inor b)160.46 293.4 Q(ugs ha)-.2 E .3 -.15 -(ve b)-.2 H(een \214x).15 E -(ed, such as handling of backslashes inside of quotes.)-.15 E 2.5(Ah)127 309.6 -S(ook \(ruleset 5\) has been added to allo)141.72 309.6 Q 2.5(wr)-.25 G -.25 -(ew)304.21 309.6 S(riting of local addresses after aliasing.).25 E F0 2.5(8. A) -72 333.6 R(CKNO)-.55 E(WLEDGEMENTS)-.5 E F1(I')112 349.8 Q 2.036 -.15(ve w)-.5 -H(ork).05 E 1.737(ed on)-.1 F F2(sendmail)4.237 E F1 1.737(for man)4.237 F -4.237(yy)-.15 G 1.737(ears, and man)267.501 349.8 R 4.237(ye)-.15 G(mplo) -339.762 349.8 Q 1.737(yers ha)-.1 F 2.037 -.15(ve b)-.2 H 1.737 -(een remarkably patient).15 F .404(about letting me w)87 361.8 R .404 -(ork on a lar)-.1 F .404(ge project that w)-.18 F .403(as not part of my of)-.1 -F .403(\214cial job)-.25 F 5.403(.T)-.4 G .403(his includes time on the)407.388 -361.8 R(INGRES Project at Berk)87 373.8 Q(ele)-.1 E 1.3 -.65(y, a)-.15 H 2.5 -(tB).65 G(ritton Lee, and ag)222.75 373.8 Q(ain on the Mammoth Project at Berk) --.05 E(ele)-.1 E -.65(y.)-.15 G .453(Much of the second w)112 390 R -2.25 -.2 -(av e)-.1 H .453(of impro)3.153 F -.15(ve)-.15 G .453 -(ments should be credited to Bryan Costales of ICSI.).15 F .454(As he)5.454 F -.781(passed me drafts of his book on)87 402 R F2(sendmail)3.281 E F1 3.281(Iw) -3.281 G .781(as inspired to start w)274.741 402 R .781(orking on things ag)-.1 -F 3.281(ain. Bryan)-.05 F -.1(wa)3.281 G(s).1 E(also a)87 414 Q -.25(va)-.2 G -(ilable to bounce ideas of).25 E 2.5(fo)-.25 G(f.)227.38 414 Q(Man)112 430.2 Q -2.856 -.65(y, m)-.15 H(an).65 E 4.056(yp)-.15 G 1.556(eople contrib)172.212 -430.2 R 1.556(uted chunks of code and ideas to)-.2 F F2(sendmail)4.056 E F1 -6.556(.I)C 4.056(th)418.476 430.2 S 1.557(as pro)430.312 430.2 R -.15(ve)-.15 G -4.057(nt).15 G 4.057(ob)477.006 430.2 S 4.057(ea)491.063 430.2 S .464 -(group netw)87 442.2 R .464(ork ef)-.1 F 2.964(fort. V)-.25 F .464 -(ersion 8 in particular w)-1.11 F .463(as a group project.)-.1 F .463 -(The follo)5.463 F .463(wing people made notable)-.25 F(contrib)87 454.2 Q -(utions:)-.2 E -.25(Ke)127 470.4 S(ith Bostic, CSRG, Uni).25 E -.15(ve)-.25 G -(rsity of California, Berk).15 E(ele)-.1 E(y)-.15 E(Michael J. Corrig)127 482.4 -Q(an, Uni)-.05 E -.15(ve)-.25 G(rsity of California, San Die).15 E(go)-.15 E -(Bryan Costales, International Computer Science Institute)127 494.4 Q -.15(Pa) -127 506.4 S -.5(..)132.298 500.4 S 2.5(r\()136.85 506.4 S(Pell\) Emanuelsson) -146.01 506.4 Q(Craig Ev)127 518.4 Q(erhart, T)-.15 E(ransarc Corporation)-.35 E --.8(To)127 530.4 S 2.5(mI).8 G -.25(va)150.92 530.4 S 2.5(rH).25 G -(elbekkmo, Norwe)173.16 530.4 Q(gian School of Economics)-.15 E -(Allan E. Johannesen, WPI)127 542.4 Q(Jonathan Kamens, OpenV)127 554.4 Q -(ision T)-.6 E(echnologies, Inc.)-.7 E -.8(Ta)127 566.4 S -(kahiro Kanbe, Fuji Xerox Information Systems Co., Ltd.).8 E(Brian Kantor)127 -578.4 Q 2.5(,U)-.4 G(ni)191.31 578.4 Q -.15(ve)-.25 G -(rsity of California, San Die).15 E(go)-.15 E(Murray S. K)127 590.4 Q(uchera) --.15 E(wy)-.15 E 2.5(,H)-.65 G(ookUp Communication Corp.)227.41 590.4 Q -(Bruce Lilly)127 602.4 Q 2.5(,S)-.65 G(on)182.74 602.4 Q 2.5(yU)-.15 G(.S.) -207.31 602.4 Q(Karl London)127 614.4 Q(Nakamura Motonori, K)127 626.4 Q -(yoto Uni)-.25 E -.15(ve)-.25 G(rsity).15 E(John Gardiner Myers, Carne)127 -638.4 Q(gie Mellon Uni)-.15 E -.15(ve)-.25 G(rsity).15 E(Neil Rick)127 650.4 Q -(ert, Northern Illinois Uni)-.1 E -.15(ve)-.25 G(rsity).15 E -(Eric Schnoebelen, Con)127 662.4 Q .3 -.15(vex C)-.4 H(omputer Corp.).15 E -(Eric W)127 674.4 Q(assenaar)-.8 E 2.5(,N)-.4 G -(ational Institute for Nuclear and High Ener)200.49 674.4 Q(gy Ph)-.18 E -(ysics, Amsterdam)-.05 E(Christophe W)127 686.4 Q(olfhugel, Herv)-.8 E 2.5(eS) --.15 G(chauer Consultants \(P)252.7 686.4 Q(aris\))-.15 E 2.687(Ia)87 702.6 S -.187(pologize for an)97.457 702.6 R .188(yone I ha)-.15 F .488 -.15(ve o)-.2 H -.188(mitted, misspelled, misattrib).15 F .188(uted, or otherwise missed.)-.2 F -(Man)5.188 E 2.688(yo)-.15 G .188(ther peo-)467.992 702.6 R(ple ha)87 714.6 Q -.3 -.15(ve c)-.2 H(ontrib).15 E(uted ideas, comments, and encouragement.)-.2 E -2.5(Ia)5 G(ppreciate their contrib)338.06 714.6 Q(ution as well.)-.2 E EP -%%Page: 60 55 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 12/Times-Bold@0 SF 3(APPENDIX A)257.172 98.4 R(COMMAND LINE FLA)224.832 -141.6 Q(GS)-.66 E/F1 10/Times-Roman@0 SF(Ar)97 201 Q -(guments must be presented with \215ags before addresses.)-.18 E -(The \215ags are:)5 E<ad62>72 217.2 Q/F2 10/Times-Italic@0 SF(x)A F1 -(Set operation mode to)144 217.2 Q F2(x)2.5 E F1 5(.O)C(peration modes are:) -253.71 217.2 Q 12.22(mD)184 233.4 S(eli)211.22 233.4 Q -.15(ve)-.25 G 2.5(rm) -.15 G(ail \(def)243.87 233.4 Q(ault\))-.1 E 16.11(sS)184 245.4 S -(peak SMTP on input side)209.56 245.4 Q 15(dR)184 257.4 S(un as a daemon)210.67 -257.4 Q 17.22(tR)184 269.4 S(un in test mode)210.67 269.4 Q 15(vJ)184 281.4 S -(ust v)207.89 281.4 Q(erify addresses, don')-.15 E 2.5(tc)-.18 G -(ollect or deli)319.48 281.4 Q -.15(ve)-.25 G(r).15 E 17.22(iI)184 293.4 S -(nitialize the alias database)207.33 293.4 Q 15(pP)184 305.4 S -(rint the mail queue)209.56 305.4 Q<ad42>72 325.8 Q F2(type)A F1 -(Indicate body type.)144 325.8 Q<ad43>72 342 Q F2(\214le)A F1 .947(Use a dif) -144 342 R .946(ferent con\214guration \214le.)-.25 F F2(Sendmail)5.946 E F1 -.946(runs as the in)3.446 F -.2(vo)-.4 G .946(king user \(rather than root\)).2 -F(when this \215ag is speci\214ed.)144 354 Q<ad64>72 370.2 Q F2(le)A(vel)-.15 E -F1(Set deb)144 370.2 Q(ugging le)-.2 E -.15(ve)-.25 G(l.).15 E<ad66>72 386.4 Q -F2(addr)2.5 E F1(The sender')144 386.4 Q 2.5(sm)-.55 G(achine address is)205.1 -386.4 Q F2(addr)2.5 E F1(.)A<ad46>72 402.6 Q F2(name)A F1 -(Sets the full name of this user to)144 402.6 Q F2(name)2.5 E F1(.)A<ad68>72 -418.8 Q F2(cnt)2.5 E F1 .725(Sets the \231hop count\232 to)144 418.8 R F2(cnt) -3.225 E F1 5.725(.T)C .726 -(his represents the number of times this message has been)269.45 418.8 R .02 -(processed by)144 430.8 R F2(sendmail)2.52 E F1 .02(\(to the e)2.52 F .02 -(xtent that it is supported by the underlying netw)-.15 F(orks\).)-.1 E F2(Cnt) -5.02 E F1 1.521 -(is incremented during processing, and if it reaches MAXHOP \(currently 30\)) -144 442.8 R F2(sendmail)4.021 E F1(thro)144 454.8 Q(ws a)-.25 E -.1(wa)-.15 G -2.5(yt).1 G(he message with an error)199.6 454.8 Q(.)-.55 E 58.86(\255n Don')72 -471 R 2.5(td)-.18 G 2.5(oa)174.65 471 S(liasing or forw)186.59 471 Q(arding.) --.1 E<ad72>72 487.2 Q F2(addr)2.5 E F1(An obsolete form of)144 487.2 Q/F3 10 -/Times-Bold@0 SF<ad66>2.5 E F1(.)A<ad6f>72 503.4 Q F2 1.666(xv)C(alue)-1.666 E -F1(Set option)144 503.4 Q F2(x)2.5 E F1(to the speci\214ed)2.5 E F2(value)2.5 E -F1 5(.T)C(hese options are described in Appendix B.)292.6 503.4 Q<ad70>72 519.6 -Q F2(pr)A(otocol)-.45 E F1 .401(Set the sending protocol.)144 519.6 R .401 -(Programs are encouraged to set this.)5.401 F .4(The protocol \214eld can be) -5.401 F .114(in the form)144 531.6 R F2(pr)2.614 E(otocol)-.45 E F3(:)A F2 -(host)A F1 .114(to set both the sending protocol and sending host.)2.614 F -.15 -(Fo)5.115 G 2.615(re).15 G(xample,)472.06 531.6 Q 2.147(\231\255pUUCP:uunet\ -\232 sets the sending protocol to UUCP and the sending host to uunet.)144 543.6 -R .973(\(Some e)144 555.6 R .974 -(xisting programs use \255oM to set the r and s macros; this is equi)-.15 F --.25(va)-.25 G .974(lent to using).25 F(\255p.\))144 567.6 Q<ad71>72 583.8 Q F2 -(time)A F1 -.35(Tr)144 583.8 S 3.168(yt).35 G 3.167(op)164.038 583.8 S .667 -(rocess the queued up mail.)177.205 583.8 R .667(If the time is gi)5.667 F -.15 -(ve)-.25 G .667(n, a).15 F F2(sendmail)3.167 E F1 .667(will run through the) -3.167 F(queue at the speci\214ed interv)144 595.8 Q(al to deli)-.25 E -.15(ve) --.25 G 2.5(rq).15 G(ueued mail; otherwise, it only runs once.)310.82 595.8 Q -<ad71>72 612 Q F2(Xstring)A F1 .312 -(Run the queue once, limiting the jobs to those matching)144 612 R F2(Xstring) -2.813 E F1 5.313(.T)C .313(he k)416.325 612 R .613 -.15(ey l)-.1 H(etter).15 E -F2(X)2.813 E F1 .313(can be)2.813 F F3(I)144 624 Q F1 .671 -(to limit based on queue identi\214er)3.171 F(,)-.4 E F3(R)3.171 E F1 .67 -(to limit based on recipient, or)3.171 F F3(S)3.17 E F1 .67(to limit based on) -3.17 F(sender)144 636 Q 6.053(.A)-.55 G 1.054 -(particular queued job is accepted if one of the corresponding addresses con-) -188.876 636 R(tains the indicated)144 648 Q F2(string)2.5 E F1(.)A 61.08 -(\255t Read)72 664.2 R .752(the header for \231T)3.252 F .752 -(o:\232, \231Cc:\232, and \231Bcc:\232 lines, and send to e)-.8 F -.15(ve)-.25 -G .752(ryone listed in those).15 F 2.539(lists. The)144 676.2 R .039 -(\231Bcc:\232 line will be deleted before sending.)2.539 F(An)5.039 E 2.539(ya) --.15 G .04(ddresses in the ar)385.31 676.2 R .04(gument v)-.18 F(ec-)-.15 E -(tor will be deleted from the send list.)144 688.2 Q<ad58>72 704.4 Q F2(lo)3.18 -E(g\214le)-.1 E F1 .68(Log all traf)144.68 704.4 R .68(\214c in and out of)-.25 -F F2(sendmail)3.179 E F1 .679(in the indicated)3.179 F F2(lo)3.179 E(g\214le) --.1 E F1 .679(for deb)3.179 F .679(ugging mailer prob-)-.2 F 2.5(lems. This)144 -716.4 R(produces a lot of data v)2.5 E -(ery quickly and should be used sparingly)-.15 E(.)-.65 E F3 193.36 -(SMM:08-60 Sendmail)72 756 R(Installation and Operation Guide)2.5 E EP -%%Page: 61 56 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF(Sendmail Installation and Operation Guide)72 60 Q -(SMM:08-61)452.9 60 Q/F1 10/Times-Roman@0 SF .637 -(There are a number of options that may be speci\214ed as primiti)97 96 R .938 --.15(ve \215)-.25 H 3.138(ags. These).15 F .638(are the e, i, m, and v)3.138 F -2.5(options. Also,)72 108 R(the f option may be speci\214ed as the)2.5 E F0 -<ad73>2.5 E F1(\215ag.)2.5 E EP -%%Page: 62 57 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 12/Times-Bold@0 SF 3(APPENDIX B)250.002 98.4 R -.12(QU)220.29 141.6 S -(EUE FILE FORMA).12 E(TS)-1.14 E/F1 10/Times-Roman@0 SF .292 -(This appendix describes the format of the queue \214les.)97 201 R .292 -(These \214les li)5.292 F .592 -.15(ve i)-.25 H 2.792(nt).15 G .291 -(he directory de\214ned by the)395.636 201 R/F2 10/Times-Bold@0 SF(Q)72 213 Q -F1(option in the)2.5 E/F3 10/Times-Italic@0 SF(sendmail.cf)2.5 E F1 -(\214le, usually)2.5 E F3(/var/spool/mqueue)2.5 E F1(or)2.5 E F3 -(/usr/spool/mqueue)2.5 E F1(.)A .229(All queue \214les ha)97 229.2 R .529 -.15 -(ve t)-.2 H .229(he name).15 F F3(x)2.729 E F2(f)1.666 E F3(AAA99999)A F1 -(where)2.73 E F3(AAA99999)2.73 E F1 .23(is the)2.73 F F3(id)2.73 E F1 .23 -(for this message and the)2.73 F F3(x)2.73 E F1 .23(is a)2.73 F 3.601 -(type. The)72 241.2 R 1.101 -(\214rst letter of the id encodes the hour of the day that the message w)3.601 -F 1.101(as recei)-.1 F -.15(ve)-.25 G 3.601(db).15 G 3.601(yt)451.798 241.2 S -1.101(he system)463.179 241.2 R .551 -(\(with A being the hour between midnight and 1:00AM\).)72 253.2 R .552 -(All \214les with the same id collecti)5.552 F -.15(ve)-.25 G .552 -(ly de\214ne one).15 F(message.)72 265.2 Q(The types are:)97 281.4 Q 31(dT)72 -297.6 S(he data \214le.)114.11 297.6 Q(The message body \(e)5 E -(xcluding the header\) is k)-.15 E(ept in this \214le.)-.1 E 33.22(lT)72 313.8 -S .312(he lock \214le.)114.11 313.8 R .312(If this \214le e)5.312 F .311 -(xists, the job is currently being processed, and a queue run will not pro-) --.15 F .523(cess the \214le.)108 325.8 R -.15(Fo)5.524 G 3.024(rt).15 G .524 -(hat reason, an e)183.274 325.8 R(xtraneous)-.15 E F2(lf)3.024 E F1 .524 -(\214le can cause a job to apparently disappear \(it will)3.024 F .285(not e) -108 337.8 R -.15(ve)-.25 G 2.785(nt).15 G .284(ime out!\).)147.61 337.8 R -([Actually)5.284 E 2.784(,t)-.65 G .284 -(his \214le is obsolete on most systems that support the)237.802 337.8 R F2 -(\215ock)2.784 E F1(or)2.784 E F2(lockf)2.784 E F1(system calls.])108 349.8 Q -31(nT)72 366 S .348(his \214le is created when an id is being created.)114.11 -366 R .348(It is a separate \214le to insure that no mail can e)5.348 F -.15 -(ve)-.25 G(r).15 E .805(be destro)108 378 R .805(yed due to a race condition.) --.1 F .805(It should e)5.805 F .805(xist for no more than a fe)-.15 F 3.305(wm) --.25 G .805(illiseconds at an)433.1 378 R(y)-.15 E(gi)108 390 Q -.15(ve)-.25 G -2.5(nt).15 G 2.5(ime. [This)135.1 390 R(is only used on old v)2.5 E(ersions of) --.15 E F3(sendmail)2.5 E F1 2.5(;i)C 2.5(ti)349.95 390 S 2.5(sn)358.01 390 S -(ot used on ne)369.4 390 Q(wer v)-.25 E(ersions.])-.15 E 31(qT)72 406.2 S -(he queue control \214le.)114.11 406.2 Q -(This \214le contains the information necessary to process the job)5 E(.)-.4 E -33.22(tA)72 422.4 S .344(temporary \214le.)118.064 422.4 R .344 -(These are an image of the)5.344 F F2(qf)2.844 E F1 .344 -(\214le when it is being reb)2.844 F 2.845(uilt. It)-.2 F .345 -(should be renamed)2.845 F(to a)108 434.4 Q F2(qf)2.5 E F1(\214le v)2.5 E -(ery quickly)-.15 E(.)-.65 E 31(xA)72 450.6 S .567(transcript \214le, e)118.287 -450.6 R .567(xisting during the life of a session sho)-.15 F .566(wing e)-.25 F --.15(ve)-.25 G .566(rything that happens during that).15 F(session.)108 462.6 Q -(The)97 478.8 Q F2(qf)3.333 E F1 .833 -(\214le is structured as a series of lines each be)3.333 F .834 -(ginning with a code letter)-.15 F 5.834(.T)-.55 G .834(he lines are as fol-) -427.354 478.8 R(lo)72 490.8 Q(ws:)-.25 E 28.78(DT)72 507 S -(he name of the data \214le.)114.11 507 Q -(There may only be one of these lines.)5 E 28.78(HA)72 523.2 S .33 -(header de\214nition.)118.05 523.2 R .33(There may be an)5.33 F 2.829(yn)-.15 G -.329(umber of these lines.)274.289 523.2 R .329(The order is important: the) -5.329 F 2.829(yr)-.15 G(epre-)483.46 523.2 Q .046 -(sent the order in the \214nal message.)108 535.2 R .046 -(These use the same syntax as header de\214nitions in the con\214gu-)5.046 F -(ration \214le.)108 547.2 Q 29.33(CT)72 563.4 S .575(he controlling address.) -114.11 563.4 R .575(The syntax is \231localuser:aliasname\232.)5.575 F .575 -(Recipient addresses follo)5.575 F .575(wing this)-.25 F 2.814 -(line will be \215agged so that deli)108 575.4 R -.15(ve)-.25 G 2.814 -(ries will be run as the).15 F F3(localuser)5.314 E F1 2.814 -(\(a user name from the)5.314 F .562(/etc/passwd \214le\);)108 587.4 R F3 -(aliasname)3.062 E F1 .561(is the name of the alias that e)3.062 F .561 -(xpanded to this address \(used for print-)-.15 F(ing messages\).)108 599.4 Q -29.33(RA)72 615.6 S .705(recipient address.)118.425 615.6 R .705 -(This will normally be completely aliased, b)5.705 F .705 -(ut is actually realiased when the)-.2 F(job is processed.)108 627.6 Q -(There will be one line for each recipient.)5 E 30.44(ST)72 643.8 S -(he sender address.)114.11 643.8 Q(There may only be one of these lines.)5 E -29.89(EA)72 660 S 3.742(ne)115.22 660 S 1.242(rror address.)128.402 660 R 1.242 -(If an)6.242 F 3.742(ys)-.15 G 1.241(uch lines e)218.19 660 R 1.241(xist, the) --.15 F 3.741(yr)-.15 G 1.241(epresent the addresses that should recei)308.124 -660 R 1.541 -.15(ve e)-.25 H(rror).15 E(messages.)108 672 Q 29.89(TT)72 688.2 S -(he job creation time.)114.11 688.2 Q -(This is used to compute when to time out the job)5 E(.)-.4 E 30.44(PT)72 704.4 -S .113(he current message priority)114.11 704.4 R 5.113(.T)-.65 G .113 -(his is used to order the queue.)236.662 704.4 R .114(Higher numbers mean lo) -5.114 F .114(wer priori-)-.25 F 3.677(ties. The)108 716.4 R 1.176 -(priority changes as the message sits in the queue.)3.677 F 1.176 -(The initial priority depends on the)6.176 F F2 193.36(SMM:08-62 Sendmail)72 -756 R(Installation and Operation Guide)2.5 E EP -%%Page: 63 58 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF(Sendmail Installation and Operation Guide)72 60 Q -(SMM:08-63)452.9 60 Q/F1 10/Times-Roman@0 SF -(message class and the size of the message.)108 96 Q 27.11(MA)72 112.2 S 2.703 -(message. This)117.923 112.2 R .203(line is printed by the)2.703 F/F2 10 -/Times-Italic@0 SF(mailq)2.703 E F1 .204 -(command, and is generally used to store status infor)2.704 F(-)-.2 E 2.5 -(mation. It)108 124.2 R(can contain an)2.5 E 2.5(yt)-.15 G -.15(ex)219.78 124.2 -S(t.).15 E 30.44(FF)72 140.4 S .044 -(lag bits, represented as one letter per \215ag.)113.56 140.4 R .043 -(De\214ned \215ag bits are)5.043 F F0(r)2.543 E F1 .043 -(indicating that this is a response)2.543 F .142(message and)108 152.4 R F0(w) -2.642 E F1 .142(indicating that a w)2.642 F .143 -(arning message has been sent announcing that the mail has been)-.1 F(delayed.) -108 164.4 Q 31($A)72 180.6 S .83(macro de\214nition.)118.55 180.6 R .83(The v) -5.83 F .829(alues of certain macros \(as of this writing, only)-.25 F F0($r) -3.329 E F1(and)3.329 E F0($s)3.329 E F1 3.329(\)a)C .829(re passed)466.241 -180.6 R(through to the queue run phase.)108 192.6 Q 29.33(BT)72 208.8 S .924 -(he body type.)114.11 208.8 R .925(The remainder of the line is a te)5.924 F -.925(xt string de\214ning the body type.)-.15 F .925(If this \214eld is)5.925 F -.009(missing, the body type is assumed to be \231unde\214ned\232 and no specia\ -l processing is attempted.)108 220.8 R(Le)5.008 E -.05(ga)-.15 G(l).05 E -.25 -(va)108 232.8 S(lues are \2317BIT\232 and \2318BITMIME\232.).25 E 4.072 -(As an e)97 249 R 4.072(xample, the follo)-.15 F 4.073 -(wing is a queue \214le sent to \231eric@mammoth.Berk)-.25 F(ele)-.1 E -.65(y.) --.15 G 4.073(EDU\232 and).65 F(\231bostic@ok)72 263 Q(eef)-.1 E(fe.CS.Berk)-.25 -E(ele)-.1 E -.65(y.)-.15 G(EDU\232).65 E/F3 7/Times-Roman@0 SF(1)219.09 259 Q -F1(:)222.59 263 Q(P835771)112 279.2 Q(T404261372)112 291.2 Q(DdfAAA13557)112 -303.2 Q(Seric)112 315.2 Q(Eo)112 327.2 Q(wner)-.25 E(-sendmail@v)-.2 E -(angogh.CS.Berk)-.25 E(ele)-.1 E -.65(y.)-.15 G(EDU).65 E(Ceric:sendmail@v)112 -339.2 Q(angogh.CS.Berk)-.25 E(ele)-.1 E -.65(y.)-.15 G(EDU).65 E -(Reric@mammoth.Berk)112 351.2 Q(ele)-.1 E -.65(y.)-.15 G(EDU).65 E(Rbostic@ok) -112 363.2 Q(eef)-.1 E(fe.CS.Berk)-.25 E(ele)-.1 E -.65(y.)-.15 G(EDU).65 E -(H?P?return-path: <o)112 375.2 Q(wner)-.25 E(-sendmail@v)-.2 E(angogh.CS.Berk) --.25 E(ele)-.1 E -.65(y.)-.15 G(EDU>).65 E(Hrecei)112 387.2 Q -.15(ve)-.25 G -(d: by v).15 E(angogh.CS.Berk)-.25 E(ele)-.1 E -.65(y.)-.15 G -(EDU \(5.108/2.7\) id AAA06703;).65 E(Fri, 17 Jul 92 00:28:55 -0700)132 399.2 Q -(Hrecei)112 411.2 Q -.15(ve)-.25 G(d: from mail.CS.Berk).15 E(ele)-.1 E -.65 -(y.)-.15 G(EDU by v).65 E(angogh.CS.Berk)-.25 E(ele)-.1 E -.65(y.)-.15 G -(EDU \(5.108/2.7\)).65 E(id AAA06698; Fri, 17 Jul 92 00:28:54 -0700)132 423.2 Q -(Hrecei)112 435.2 Q -.15(ve)-.25 G(d: from [128.32.31.21] by mail.CS.Berk).15 E -(ele)-.1 E -.65(y.)-.15 G(EDU \(5.96/2.5\)).65 E -(id AA22777; Fri, 17 Jul 92 03:29:14 -0400)132 447.2 Q(Hrecei)112 459.2 Q -.15 -(ve)-.25 G(d: by foo.bar).15 E(.baz.de \(5.57/Ultrix3.0-C\))-.55 E -(id AA22757; Fri, 17 Jul 92 09:31:25 GMT)132 471.2 Q(H?F?from: eric@foo.bar)112 -483.2 Q(.baz.de \(Eric Allman\))-.55 E(H?x?full-name: Eric Allman)112 495.2 Q -(Hmessage-id: <9207170931.AA22757@foo.bar)112 507.2 Q(.baz.de>)-.55 E(HT)112 -519.2 Q(o: sendmail@v)-.8 E(angogh.CS.Berk)-.25 E(ele)-.1 E -.65(y.)-.15 G(EDU) -.65 E(Hsubject: this is an e)112 531.2 Q(xample message)-.15 E 1.083(This sho) -72 547.4 R 1.084(ws the name of the data \214le, the person who sent the messa\ -ge, the submission time \(in seconds)-.25 F .26 -(since January 1, 1970\), the message priority)72 559.4 R 2.76(,t)-.65 G .259 -(he message class, the recipients, and the headers for the mes-)257.03 559.4 R -(sage.)72 571.4 Q .32 LW 76 669.2 72 669.2 DL 80 669.2 76 669.2 DL 84 669.2 80 -669.2 DL 88 669.2 84 669.2 DL 92 669.2 88 669.2 DL 96 669.2 92 669.2 DL 100 -669.2 96 669.2 DL 104 669.2 100 669.2 DL 108 669.2 104 669.2 DL 112 669.2 108 -669.2 DL 116 669.2 112 669.2 DL 120 669.2 116 669.2 DL 124 669.2 120 669.2 DL -128 669.2 124 669.2 DL 132 669.2 128 669.2 DL 136 669.2 132 669.2 DL 140 669.2 -136 669.2 DL 144 669.2 140 669.2 DL 148 669.2 144 669.2 DL 152 669.2 148 669.2 -DL 156 669.2 152 669.2 DL 160 669.2 156 669.2 DL 164 669.2 160 669.2 DL 168 -669.2 164 669.2 DL 172 669.2 168 669.2 DL 176 669.2 172 669.2 DL 180 669.2 176 -669.2 DL 184 669.2 180 669.2 DL 188 669.2 184 669.2 DL 192 669.2 188 669.2 DL -196 669.2 192 669.2 DL 200 669.2 196 669.2 DL 204 669.2 200 669.2 DL 208 669.2 -204 669.2 DL 212 669.2 208 669.2 DL 216 669.2 212 669.2 DL/F4 5/Times-Roman@0 -SF(1)93.6 679.6 Q/F5 8/Times-Roman@0 SF .719(This e)3.2 J .719 -(xample is contri)-.12 F -.12(ve)-.2 G 2.719(da).12 G .719 -(nd probably inaccurate for your en)186.968 682.8 R 2.719(vironment. Glance) --.32 F -.12(ove)2.718 G 2.718(ri).12 G 2.718(tt)384.998 682.8 S 2.718(og) -392.164 682.8 S .718(et an idea; nothing can replace)402.882 682.8 R -(looking at what your o)72 692.4 Q(wn system generates.)-.2 E EP -%%Page: 64 59 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 12/Times-Bold@0 SF 3(APPENDIX C)249.672 98.4 R(SUMMAR)198.282 141.6 Q 3(YO) --.42 G 3(FS)274.182 141.6 S(UPPOR)291.186 141.6 Q 3(TF)-.48 G(ILES)350.37 141.6 -Q/F1 10/Times-Roman@0 SF 1.519(This is a summary of the support \214les that)97 -201 R/F2 10/Times-Italic@0 SF(sendmail)4.019 E F1 1.52(creates or generates.) -4.019 F(Man)6.52 E 4.02(yo)-.15 G 4.02(ft)444.74 201 S 1.52(hese can be)454.87 -201 R(changed by editing the sendmail.cf \214le; check there to \214nd the act\ -ual pathnames.)72 213 Q(/usr/sbin/sendmail)72 229.2 Q(The binary of)144 241.2 Q -F2(sendmail)2.5 E F1(.)A(/usr/bin/ne)72 257.4 Q -.1(wa)-.25 G(liases).1 E 3.735 -(Al)144 269.4 S 1.235 -(ink to /usr/sbin/sendmail; causes the alias database to be reb)157.735 269.4 R -3.734(uilt. Running)-.2 F 1.234(this pro-)3.734 F(gram is completely equi)144 -281.4 Q -.25(va)-.25 G(lent to gi).25 E(ving)-.25 E F2(sendmail)2.5 E F1(the) -2.5 E/F3 10/Times-Bold@0 SF(\255bi)2.5 E F1(\215ag.)2.5 E 13.38 -(/usr/bin/mailq Prints)72 297.6 R 3.702(al)3.702 G 1.202 -(isting of the mail queue.)181.964 297.6 R 1.203(This program is equi)6.202 F --.25(va)-.25 G 1.203(lent to using the).25 F F3(\255bp)3.703 E F1 1.203 -(\215ag to)3.703 F F2(sendmail)144 309.6 Q F1(.)A 5.9(/etc/sendmail.cf The)72 -325.8 R(con\214guration \214le, in te)2.5 E(xtual form.)-.15 E -(/usr/lib/sendmail.hf)72 342 Q(The SMTP help \214le.)144 354 Q 7 -(/etc/sendmail.st A)72 370.2 R(statistics \214le; need not be present.)2.5 E -.89(/etc/sendmail.pid Created)72 386.4 R .318 -(in daemon mode; it contains the process id of the current SMTP daemon.)2.818 F -.318(If you)5.318 F .337(use this in scripts; use `)144 398.4 R .337 -(`head \2551')-.74 F 2.838('t)-.74 G 2.838(og)285.78 398.4 S .338 -(et just the \214rst line; later v)298.618 398.4 R .338(ersions of)-.15 F F2 -(sendmail)2.838 E F1(may)2.838 E(add information to subsequent lines.)144 410.4 -Q 25.62(/etc/aliases The)72 426.6 R(te)2.5 E(xtual v)-.15 E -(ersion of the alias \214le.)-.15 E(/etc/aliases.{pag,dir})72 442.8 Q -(The alias \214le in)144 454.8 Q F2(dbm)2.5 E F1(\(3\) format.)1.666 E(/v)72 -471 Q(ar/spool/mqueue)-.25 E -(The directory in which the mail queue and temporary \214les reside.)144 483 Q -(/v)72 499.2 Q(ar/spool/mqueue/qf*)-.25 E -(Control \(queue\) \214les for messages.)144 511.2 Q(/v)72 527.4 Q -(ar/spool/mqueue/df*)-.25 E(Data \214les.)144 539.4 Q(/v)72 555.6 Q -(ar/spool/mqueue/tf*)-.25 E -.7(Te)144 567.6 S(mporary v).7 E -(ersions of the qf \214les, used during queue \214le reb)-.15 E(uild.)-.2 E(/v) -72 583.8 Q(ar/spool/mqueue/xf*)-.25 E 2.5(At)144 595.8 S -(ranscript of the current session.)156.5 595.8 Q F3 193.36(SMM:08-64 Sendmail) -72 756 R(Installation and Operation Guide)2.5 E EP -%%Page: 2 60 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF 198.36(SMM:08-2 Sendmail)72 60 R -(Installation and Operation Guide)2.5 E/F1 10/Times-Roman@0 SF -(This page intentionally left blank;)256.225 300 Q -(replace it with a blank sheet for double-sided output.)218.6 312 Q EP -%%Page: 3 61 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF(Sendmail Installation and Operation Guide)72 60 Q -(SMM:08-3)457.9 60 Q/F1 12/Times-Roman@0 SF -1.116(TA)263.226 98.4 S -(BLE OF CONTENTS)1.116 E/F2 10/Times-Roman@0 SF 2.5(1. B)72 124.8 R(ASIC INST) --.35 E(ALLA)-.93 E 1.18(TION .................................................\ -..............................................................)-1.11 F(7)499 -124.8 Q 2.5(1.1. Compiling)87 139.2 R .43(Sendmail ...........................\ -..............................................................................\ -.....)2.5 F(7)499 139.2 Q 2.5(1.1.1. Old)102 153.6 R -.15(ve)2.5 G -(rsions of mak).15 E 2.93(e.)-.1 G 28.5(......................................\ -............................................................. 7)220.5 153.6 R -2.5(1.1.2. Compilation)102 168 R 2.1(\215ags .................................\ -........................................................................)2.5 F -(7)499 168 Q 2.5(1.1.3. Compilation)102 182.4 R(and installation)2.5 E 28.5(..\ -..............................................................................\ -........ 8)4.6 F 2.5(1.2. Con\214guration)87 196.8 R .99(Files ...............\ -..............................................................................\ -...................)2.5 F(8)499 196.8 Q 2.5(1.3. Details)87 211.2 R -(of Installation Files)2.5 E 28.5(............................................\ -....................................................... 9)4.89 F 2.5 -(1.3.1. /usr/sbin/sendmail)102 225.6 R 28.5(..................................\ -....................................................................... 9)2.66 -F 2.5(1.3.2. /etc/sendmail.cf)102 240 R 23.5(.................................\ -........................................................................... 10) -4.9 F 2.5(1.3.3. /usr/bin/ne)102 254.4 R -.1(wa)-.25 G 2.19(liases ...........\ -..............................................................................\ -..............).1 F(10)494 254.4 Q 2.5(1.3.4. /v)102 268.8 R 1.81(ar/spool/mqu\ -eue ..........................................................................\ -..............................)-.25 F(10)494 268.8 Q 2.5(1.3.5. /etc/aliases*) -102 283.2 R 23.5(.............................................................\ -..................................................... 10)4.62 F 2.5 -(1.3.6. /etc/rc)102 297.6 R 23.5(.............................................\ -..............................................................................\ -. 10)3.51 F 2.5(1.3.7. /usr/lib/sendmail.hf)102 312 R 23.5(...................\ -..............................................................................\ -...... 12)2.94 F 2.5(1.3.8. /etc/sendmail.st)102 326.4 R 23.5(................\ -..............................................................................\ -............... 12)3.5 F 2.5(1.3.9. /usr/bin/ne)102 340.8 R -.1(wa)-.25 G 2.19 -(liases ......................................................................\ -.................................).1 F(12)494 340.8 Q 2.5 -(1.3.10. /usr/bin/mailq)102 355.2 R 23.5(.....................................\ -........................................................................ 12) -4.88 F 2.5(2. NORMAL)72 369.6 R(OPERA)2.5 E 1.56(TIONS .......................\ -..............................................................................\ -........)-1.11 F(12)494 369.6 Q 2.5(2.1. The)87 384 R(System Log)2.5 E 23.5(..\ -..............................................................................\ -.................................... 12)4.89 F 2.5(2.1.1. F)102 398.4 R 2.26(o\ -rmat .........................................................................\ -.................................................)-.15 F(12)494 398.4 Q 2.5 -(2.1.2. Le)102 412.8 R -.15(ve)-.25 G 2.24(ls ................................\ -..............................................................................\ -.............).15 F(12)494 412.8 Q 2.5(2.2. The)87 427.2 R(Mail Queue)2.5 E -23.5(.........................................................................\ -............................................ 12)2.96 F 2.5(2.2.1. Printing)102 -441.6 R(the queue)2.5 E 23.5(.................................................\ -........................................................ 13)2.67 F 2.5 -(2.2.2. F)102 456 R(orcing the queue)-.15 E 23.5(.............................\ -............................................................................ 1\ -3)3.94 F 2.5(2.3. The)87 470.4 R(Alias Database)2.5 E 23.5(...................\ -..............................................................................\ -............... 13)2.69 F 2.5(2.3.1. Reb)102 484.8 R -(uilding the alias database)-.2 E 23.5(.......................................\ -................................................ 14)4.27 F 2.5 -(2.3.2. Potential)102 499.2 R .72(problems ...................................\ -.....................................................................)2.5 F(14) -494 499.2 Q 2.5(2.3.3. List)102 513.6 R -.25(ow)2.5 G 1.81(ners ..............\ -..............................................................................\ -.......................).25 F(14)494 513.6 Q 2.5(2.4. User)87 528 R -(Information Database)2.5 E 23.5(.............................................\ -....................................................... 15)2.7 F 2.5(2.5. Per) -87 542.4 R(-User F)-.2 E(orw)-.15 E(arding \(.forw)-.1 E(ard Files\))-.1 E 23.5 -(.............................................................................\ -...... 15)4.09 F 2.5(2.6. Special)87 556.8 R(Header Lines)2.5 E 23.5(.........\ -..............................................................................\ -...................... 15)2.97 F 2.5(2.6.1. Return-Receipt-T)102 571.2 R .98(o\ -: ............................................................................\ -...........................)-.8 F(15)494 571.2 Q 2.5(2.6.2. Errors-T)102 585.6 -R 2.09(o: ....................................................................\ -.................................................)-.8 F(16)494 585.6 Q 2.5 -(2.6.3. Apparently-T)102 600 R 2.09(o: .......................................\ -......................................................................)-.8 F -(16)494 600 Q 2.5(2.7. IDENT)87 614.4 R(Protocol Support)2.5 E 23.5(..........\ -..............................................................................\ -............... 16)2.95 F 2.5(3. ARGUMENTS)72 628.8 R 23.5(...................\ -..............................................................................\ -.............................. 16)3.78 F 2.5(3.1. Queue)87 643.2 R(Interv)2.5 E -1.55(al ......................................................................\ -.................................................)-.25 F(16)494 643.2 Q 2.5 -(3.2. Daemon)87 657.6 R 1.29(Mode ............................................\ -...........................................................................)2.5 -F(17)494 657.6 Q 2.5(3.3. F)87 672 R(orcing the Queue)-.15 E 23.5(............\ -..............................................................................\ -....................... 17)4.22 F 2.5(3.4. Deb)87 686.4 R 1.76(ugging ........\ -..............................................................................\ -.......................................)-.2 F(17)494 686.4 Q 2.5(3.5. T)87 -700.8 R(rying a Dif)-.35 E(ferent Con\214guration File)-.25 E 23.5(...........\ -........................................................................ 17) -4.67 F 2.5(3.6. Changing)87 715.2 R(the V)2.5 E(alues of Options)-1.11 E 23.5(\ -..............................................................................\ -.............. 17)3.23 F EP -%%Page: 4 62 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF 198.36(SMM:08-4 Sendmail)72 60 R -(Installation and Operation Guide)2.5 E/F1 10/Times-Roman@0 SF 2.5 -(3.7. Logging)87 96 R -.35(Tr)2.5 G(af).35 E .5(\214c ........................\ -..............................................................................\ -................)-.25 F(18)494 96 Q 2.5(3.8. Dumping)87 110.4 R .72(State ....\ -..............................................................................\ -.....................................)2.5 F(18)494 110.4 Q 2.5(4. TUNING)72 -124.8 R 23.5(.................................................................\ -........................................................................ 18) -2.68 F 2.5(4.1. T)87 139.2 R 1.07(imeouts ....................................\ -..............................................................................\ -..............)-.35 F(18)494 139.2 Q 2.5(4.1.1. Queue)102 153.6 R(interv)2.5 E -2.1(al .......................................................................\ -.......................................)-.25 F(18)494 153.6 Q 2.5(4.1.2. Read) -102 168 R 1(timeouts .........................................................\ -......................................................)2.5 F(18)494 168 Q 2.5 -(4.1.3. Message)102 182.4 R 1.56(timeouts ....................................\ -.....................................................................)2.5 F(19) -494 182.4 Q 2.5(4.2. F)87 196.8 R(orking During Queue Runs)-.15 E 23.5(.......\ -..............................................................................\ -............ 20)4.49 F 2.5(4.3. Queue)87 211.2 R .73(Priorities ..............\ -..............................................................................\ -.........................)2.5 F(20)494 211.2 Q 2.5(4.4. Load)87 225.6 R .44(Li\ -miting .......................................................................\ -.................................................)2.5 F(20)494 225.6 Q 2.5 -(4.5. Deli)87 240 R -.15(ve)-.25 G(ry Mode).15 E 23.5(........................\ -..............................................................................\ -................. 21)3.08 F 2.5(4.6. Log)87 254.4 R(Le)2.5 E -.15(ve)-.25 G -2.52(l.).15 G 23.5(...........................................................\ -................................................................... 21)153 -254.4 R 2.5(4.7. File)87 268.8 R .72(Modes ...................................\ -..............................................................................\ -............)2.5 F(22)494 268.8 Q 2.5(4.7.1. T)102 283.2 R 2.5(os)-.8 G -(uid or not to suid?)146.2 283.2 Q 23.5(......................................\ -........................................................... 22)6.52 F 2.5 -(4.7.2. Should)102 297.6 R(my alias database be writable?)2.5 E 23.5 -(........................................................................ 22) -5.47 F 2.5(4.8. Connection)87 312 R 1.56(Caching .............................\ -..............................................................................\ -...)2.5 F(22)494 312 Q 2.5(4.9. Name)87 326.4 R(Serv)2.5 E(er Access)-.15 E -23.5(.........................................................................\ -..................................... 22)2.85 F 2.5(4.10. Mo)87 340.8 R -(ving the Per)-.15 E(-User F)-.2 E(orw)-.15 E(ard Files)-.1 E 23.5(...........\ -......................................................................... 23) -3.84 F 2.5(4.11. Free)87 355.2 R 1.85(Space ..................................\ -..............................................................................\ -...........)2.5 F(23)494 355.2 Q 2.5(4.12. Pri)87 369.6 R -.25(va)-.25 G .3 --.15(cy F).25 H 1.93(lags ....................................................\ -...................................................................).15 F(24) -494 369.6 Q 2.5(4.13. Send)87 384 R(to Me T)2.5 E 2.08(oo ....................\ -..............................................................................\ -.................)-.8 F(24)494 384 Q 2.5(5. THE)72 398.4 R -(WHOLE SCOOP ON THE CONFIGURA)2.5 E(TION FILE)-1.11 E 23.5 -(........................................................ 24)4.64 F 2.5 -(5.1. Con\214guration)87 412.8 R(File Lines)2.5 E 23.5(.......................\ -..............................................................................\ -... 24)2.66 F 2.5(5.1.1. R)102 427.2 R(and S \212 re)2.5 E(writing rules)-.25 E -23.5(.........................................................................\ -................... 24)3.48 F 2.5(5.1.1.1. The)117 441.6 R(left hand side)2.5 E -23.5(.........................................................................\ -....................... 25)4.07 F 2.5(5.1.1.2. The)117 456 R(right hand side) -2.5 E 23.5(...................................................................\ -........................... 25)3.51 F 2.5(5.1.1.3. Semantics)117 470.4 R(of re) -2.5 E(writing rule sets)-.25 E 23.5 -(.......................................................................... 26) -4.6 F 2.5(5.1.1.4. IPC)117 484.8 R 1(mailers .................................\ -.........................................................................)2.5 F -(27)494 484.8 Q 2.5(5.1.2. D)102 499.2 R 2.5<8a64>2.5 G(e\214ne macro)156.72 -499.2 Q 23.5(.................................................................\ -....................................... 28)4.35 F 2.5(5.1.3. C)102 513.6 R -(and F \212 de\214ne classes)2.5 E 23.5(......................................\ -....................................................... 30)4.62 F 2.5(5.1.4. M) -102 528 R 2.5<8a64>2.5 G(e\214ne mailer)158.39 528 Q 23.5(....................\ -..............................................................................\ -..... 31)4.62 F 2.5(5.1.5. H)102 542.4 R 2.5<8a64>2.5 G(e\214ne header)156.72 -542.4 Q 23.5(.................................................................\ -....................................... 33)2.69 F 2.5(5.1.6. O)102 556.8 R 2.5 -<8a73>2.5 G(et option)155.61 556.8 Q 23.5(....................................\ -......................................................................... 33) -4.61 F 2.5(5.1.7. P)102 571.2 R 2.5<8a70>2.5 G(recedence de\214nitions)155.06 -571.2 Q 23.5(.................................................................\ -......................... 38)3.24 F 2.5(5.1.8. V)102 585.6 R 2.5<8a63>2.5 G -(on\214guration v)156.16 585.6 Q(ersion le)-.15 E -.15(ve)-.25 G 4.62(l.).15 G -23.5(.........................................................................\ -........ 39)265.5 585.6 R 2.5(5.1.9. K)102 600 R 2.5<8a6b>2.5 G .3 -.15 -(ey \214)156.62 600 T(le declaration).15 E 23.5(..............................\ -................................................................ 39)4.88 F 2.5 -(5.2. Building)87 614.4 R 2.5(aC)2.5 G(on\214guration File From Scratch)158.12 -614.4 Q 23.5 -(......................................................................... 41) -3.77 F 2.5(5.2.1. What)102 628.8 R(you are trying to do)2.5 E 23.5(...........\ -..............................................................................\ -.... 42)2.96 F 2.5(5.2.2. Philosoph)102 643.2 R 3.54(y.)-.05 G 23.5(..........\ -..............................................................................\ -........................... 42)180.5 643.2 R 2.5(5.2.2.1. Lar)117 657.6 R -(ge site, man)-.18 E 2.5(yh)-.15 G(osts \212 minimum information)226.1 657.6 Q -23.5(................................................ 42)2.72 F 2.5 -(5.2.2.2. Small)117 672 R(site \212 complete information)2.5 E 23.5 -(.................................................................... 43)4.89 F -2.5(5.2.2.3. Single)117 686.4 R 1.27(host ....................................\ -.......................................................................)2.5 F -(43)494 686.4 Q 2.5(5.2.2.4. A)117 700.8 R(completely dif)2.5 E -(ferent philosoph)-.25 E 3.26(y.)-.05 G 23.5 -(..................................................................... 43)295.5 -700.8 R 2.5(5.2.3. Rele)102 715.2 R -.25(va)-.25 G(nt issues).25 E 23.5(......\ -..............................................................................\ -......................... 44)4.56 F EP -%%Page: 5 63 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF(Sendmail Installation and Operation Guide)72 60 Q -(SMM:08-5)457.9 60 Q/F1 10/Times-Roman@0 SF 2.5(5.2.4. Ho)102 96 R 2.5(wt)-.25 -G 2.5(op)153.97 96 S 2.38(roceed .............................................\ -...............................................................)166.47 96 R(44) -494 96 Q 2.5(5.2.5. T)102 110.4 R(esting the re)-.7 E -(writing rules \212 the \255bt \215ag)-.25 E 23.5 -(.................................................................... 44)2.99 F -2.5(5.2.6. Building)102 124.8 R(mailer descriptions)2.5 E 23.5(...............\ -......................................................................... 45) -4.61 F 2.5(5.3. The)87 139.2 R(User Database)2.5 E 23.5(......................\ -..............................................................................\ -............ 46)4.92 F 2.5(5.3.1. Structure)102 153.6 R(of the user database) -2.5 E 23.5(...................................................................\ -.................... 47)2.7 F 2.5(5.3.2. User)102 168 R(database semantics)2.5 -E 23.5(.......................................................................\ -........................ 47)3.25 F 2.5(5.3.3. Creating)102 184.4 R -(the database)2.5 E/F2 7/Times-Roman@0 SF(18)215.59 180.4 Q F1 23.5(..........\ -..............................................................................\ -......... 48)225.5 184.4 R 2.5(6. O)72 198.8 R(THER CONFIGURA)-.4 E 1.97(TION \ -..............................................................................\ -...........................)-1.11 F(48)494 198.8 Q 2.5(6.1. P)87 213.2 R -(arameters in src/Mak)-.15 E 1.55(e\214le ....................................\ -................................................................)-.1 F(48)494 -213.2 Q 2.5(6.2. P)87 227.6 R(arameters in src/conf.h)-.15 E 23.5(............\ -..............................................................................\ -.............. 49)4.23 F 2.5(6.3. Con\214guration)87 242 R(in src/conf.c)2.5 E -23.5(.........................................................................\ -........................... 51)3.51 F 2.5(6.3.1. Built-in)102 256.4 R -(Header Semantics)2.5 E 23.5(.................................................\ -.......................................... 51)4.9 F 2.5(6.3.2. Restricting)102 -270.8 R(Use of Email)2.5 E 23.5(..............................................\ -................................................ 52)4.34 F 2.5(6.3.3. Load)102 -285.2 R -1.17 -.74(Av e)2.5 H(rage Computation).74 E 23.5(....................\ -...................................................................... 53)2.74 -F 2.5(6.3.4. Ne)102 299.6 R 2.5(wD)-.25 G(atabase Map Classes)157.85 299.6 Q -23.5(.........................................................................\ -................ 53)4.89 F 2.5(6.3.5. Queueing)102 314 R 1.56(Function .......\ -..............................................................................\ -..................)2.5 F(53)494 314 Q 2.5(6.3.6. Refusing)102 328.4 R -(Incoming SMTP Connections)2.5 E 23.5 -(....................................................................... 54) -2.94 F 2.5(6.3.7. Load)102 342.8 R -1.17 -.74(Av e)2.5 H(rage Computation).74 E -23.5(.........................................................................\ -................. 54)2.74 F 2.5(6.4. Con\214guration)87 357.2 R -(in src/daemon.c)2.5 E 23.5(..................................................\ -............................................ 54)4.62 F 2.5(7. CHANGES)72 371.6 -R(IN VERSION 8)2.5 E 23.5(....................................................\ -...................................................... 54)4.9 F 2.5 -(7.1. Connection)87 386 R 1.56(Caching .......................................\ -.......................................................................)2.5 F -(55)494 386 Q 2.5(7.2. MX)87 400.4 R 2.39(Piggybacking .......................\ -..............................................................................\ -............)2.5 F(55)494 400.4 Q 2.5(7.3. RFC)87 414.8 R(1123 Compliance)2.5 E -23.5(.........................................................................\ -................................. 55)3.77 F 2.5(7.4. Extended)87 429.2 R -(SMTP Support)2.5 E 23.5(.....................................................\ -.................................................. 55)2.94 F 2.5 -(7.5. Eight-Bit)87 443.6 R .44(Clean .........................................\ -.............................................................................) -2.5 F(55)494 443.6 Q 2.5(7.6. User)87 458 R .47(Database .....................\ -..............................................................................\ -.....................)2.5 F(55)494 458 Q 2.5(7.7. Impro)87 472.4 R -.15(ve)-.15 -G 2.5(dB).15 G(IND Support)154.75 472.4 Q 23.5(...............................\ -........................................................................ 55) -3.81 F 2.5(7.8. K)87 486.8 R -.15(ey)-.25 G(ed Files).15 E 23.5(..............\ -..............................................................................\ -................................ 56)3.35 F 2.5(7.9. Multi-W)87 501.2 R -(ord Classes)-.8 E 23.5(......................................................\ -......................................................... 56)3.47 F 2.5 -(7.10. Deferred)87 515.6 R(Macro Expansion)2.5 E 23.5(........................\ -......................................................................... 56) -4.65 F 2.5(7.11. IDENT)87 530 R(Protocol Support)2.5 E 23.5(..................\ -..............................................................................\ -..... 56)2.95 F 2.5(7.12. P)87 544.4 R(arsing Bug Fix)-.15 E .46(es ..........\ -..............................................................................\ -........................)-.15 F(56)494 544.4 Q 2.5(7.13. Separate)87 558.8 R -(En)2.5 E -.15(ve)-.4 G(lope/Header Processing).15 E 23.5(....................\ -............................................................ 56)4.37 F 2.5 -(7.14. Owner)87 573.2 R(-List Propag)-.2 E(ates to En)-.05 E -.15(ve)-.4 G 1.27 -(lope ........................................................................\ -............).15 F(56)494 573.2 Q 2.5(7.15. Dynamic)87 587.6 R -(Header Allocation)2.5 E 23.5(................................................\ -................................................ 56)3.25 F 2.5(7.16. Ne)87 602 -R 2.5(wC)-.25 G(ommand Line Flags)139.8 602 Q 23.5(...........................\ -....................................................................... 56)3.2 -F 2.5(7.17. Enhanced)87 616.4 R(Command Line Flags)2.5 E 23.5(................\ -......................................................................... 56) -4.9 F 2.5(7.18. Ne)87 630.8 R 2.5(wa)-.25 G(nd Old Con\214guration Line T) -137.57 630.8 Q .4(ypes .......................................................\ -.......................)-.8 F(57)494 630.8 Q 2.5(7.19. Ne)87 645.2 R 2.5(wO) --.25 G .7(ptions .............................................................\ -...........................................................)140.35 645.2 R(57) -494 645.2 Q 2.5(7.20. Extended)87 659.6 R 1.56(Options .......................\ -..............................................................................\ -...........)2.5 F(57)494 659.6 Q 2.5(7.21. Ne)87 674 R 2.5(wM)-.25 G -(ailer Flags)142.02 674 Q 23.5(...............................................\ -................................................................. 57)4.04 F 2.5 -(7.22. Ne)87 688.4 R 2.5(wP)-.25 G(re-De\214ned Macros)138.69 688.4 Q 23.5(...\ -..............................................................................\ -................... 58)4.06 F 2.5(7.23. Ne)87 702.8 R 2.5(wL)-.25 G(HS T)139.24 -702.8 Q(ok)-.8 E 1.33(en .....................................................\ -.............................................................)-.1 F(58)494 -702.8 Q 2.5(7.24. Bigger)87 717.2 R(Def)2.5 E(aults ..........................\ -..............................................................................\ -............)-.1 E(58)494 717.2 Q EP -%%Page: 6 64 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF 198.36(SMM:08-6 Sendmail)72 60 R -(Installation and Operation Guide)2.5 E/F1 10/Times-Roman@0 SF 2.5(7.25. Dif)87 -96 R(ferent Def)-.25 E(ault T)-.1 E(uning P)-.45 E 1.99(arameters ............\ -......................................................................)-.15 F -(58)494 96 Q 2.5(7.26. Auto-Quoting)87 110.4 R(in Addresses)2.5 E 23.5(.......\ -..............................................................................\ -............ 58)3.51 F 2.5(7.27. Symbolic)87 124.8 R(Names On Error Mailer)2.5 -E 23.5(.......................................................................\ -............... 58)4.91 F 2.5(7.28. SMTP)87 139.2 R(VRFY Doesn')2.5 E 2.5(tE) --.18 G 1.18(xpand ............................................................\ -................................)209.88 139.2 R(58)494 139.2 Q 2.5(7.29. [IPC]) -87 153.6 R(Mailers Allo)2.5 E 2.5(wM)-.25 G(ultiple Hosts)205.91 153.6 Q 23.5(\ -..............................................................................\ -..... 58)3.75 F 2.5(7.30. Aliases)87 168 R 1.29(Extended .....................\ -..............................................................................\ -..............)2.5 F(59)494 168 Q 2.5(7.31. Portability)87 182.4 R -(and Security Enhancements)2.5 E 23.5(........................................\ -....................................... 59)2.68 F 2.5(7.32. Miscellaneous)87 -196.8 R 1.29(Changes .........................................................\ -..............................................)2.5 F(59)494 196.8 Q 2.5(8. A)72 -211.2 R(CKNO)-.4 E .1(WLEDGEMENTS ............................................\ -................................................................)-.35 F(59)494 -211.2 Q(Appendix A.)72 225.6 Q(COMMAND LINE FLA)5 E 1.97(GS ..................\ -.......................................................................)-.4 F -(60)494 225.6 Q(Appendix B.)72 240 Q -.1(QU)5 G(EUE FILE FORMA).1 E 1.38(TS ..\ -..............................................................................\ -............)-1.11 F(62)494 240 Q(Appendix C.)72 254.4 Q(SUMMAR)5 E 2.5(YO)-.65 -G 2.5(FS)188.85 254.4 S(UPPOR)202.47 254.4 Q 2.5(TF)-.6 G 1.12(ILES ..........\ -....................................................................)248.27 -254.4 R(64)494 254.4 Q EP -%%Trailer -end -%%EOF diff --git a/usr.sbin/sendmail/doc/op/spell.ok b/usr.sbin/sendmail/doc/op/spell.ok deleted file mode 100644 index d1cb19e5af394..0000000000000 --- a/usr.sbin/sendmail/doc/op/spell.ok +++ /dev/null @@ -1,324 +0,0 @@ -AA06698 -AA06703 -AA22757 -AA22777 -AA99999 -ACHECK -ARPANET -AVENRUN -Allman -Arpa -Arpanet -BSD -BSD4.4 -BTree -Bcc -BitNET -CHmonet -CHucbmonet -CNAME -CS.Berkeley.EDU -Cdaemon -Ceric -Cnt -Ctest.cf -DB -DLA -DdfAA13557 -Dj -DlFrom -DnMAILER -Dq -EDU -EOH -EXPN -Eol -Eowner -Eric.Allman -FAX -FSCALE -Fri -GECOS -Guide''SMM:07 -H?F?from -H?P?return -H?x?full -HELO -HTo -HdrInfo -HiTech.COM -Hmessage -Hreceived -Hsubject -INT -IP -IPC -Jul -Kmapname -LAN -LHS -LOCKF -Linelimit -LocalMailer -MATCHGECOS -MAXATOM -MAXHOP -MAXLINE -MAXMAILERS -MAXMXHOSTS -MAXNAME -MAXPRIORITIES -MAXPV -MAXRWSETS -MAXTRUST -MAXUSERENVIRON -MX -Makefile -Makefile.dist -Maxsize -Meta -Mether -Mlocal -MsgSize -NEWDB -NIS -NOOP -NOTUNIX -NoReturn -OJ -OSTYPE -OT3d -PSyserr -Pfirst -Pjunk -Pspecial -QUEUESIZE -RCPT -README -RFC -RFC's -RFC1123 -RFC819 -RFC821 -RFC822 -RHS -Rbostic -Reric -Ruleset -Rulesets -S,D -SETPROCTITLE -SITECONFIG -SMM:07 -SMTP -SUBR -SYS5TZ -SYSTEM5 -Seric -TCP -TSyserr -UCBARPA -UCBARPA:eric -UGLYUUCP -USERDB -Ucbvax -Ultrix3.0 -Usrerr -VRFY -Wildcard -YP -a.CC.Berkeley.EDU -aliases.db -aliases.dir -aliases.pag -args -automounter -av -avenrun -bd -behaviour -bi -bollard -bool -bostic -bp -bt -btree -buf -bufsize -bz -c70:user -calder -canonification -checkcompat -cnt -conf.c -conf.h -contessa -cs -cs.exposed.m4 -cs.hidden.m4 -csam -csam.arpa -cw -daemon.c -db -decvax -default:mailname -delivermail -dev -dir -doc -ef -email -eric -eric:mailname -ernie -errno -fallback -fax -fi -filename -filenames -fo -foo.bar.baz.de -fullname -gateway.HiTech.COM -getla -getloadavg -groupid -hdrinfo -hname -hoptoad -host.domain -hosta -hostb -htemplate -ie -iff -int -ip -lbl -lf -lhs -lib -lnx -localhost -lockf -lp -mail.CS.Berkeley.EDU -mail.cf -maildrop -mailname -mailq -mailstats -mailstats.c -makemap -mammoth.Berkeley.EDU -mammoth.Berkeley.EDU.HiTech.COM -mapclass -maphostname -mapname -matisse -mc -mckusick -meC -mflags -monet -monet:bollard -mqueue -msg -name1 -name2 -nameserver -newalias -nkainc -nosuchuser -num -oM -oQ -oT1d -oT2m -okeeffe.CS.Berkeley.EDU -omqueue -ostype -pUUCP:uunet -pag -pag,dir -pathname -pathnames -pathnames.h -pid -pp -prep.ai.MIT.EDU -prog -q30m -qf -querytype -queueups -rc.local -resolv.conf -rfc819.lpr -rfc822.lpr -rhs -rlsm -ruleset -rulesets -rwset -rwsets -sam -sbin -sendmail.cf -sendmail.cw -sendmail.fc -sendmail.hf -sendmail.st -setupmaps -si -site.config.file -siteconfig -smtp -sp -src -suid -syserr -sysname -tcpproto.mc -test.cf -text1 -text2 -tf -timestamp -timestamps -ucb -ucbarpa -ucblib -ucbmonet -ucbvax -ucbvax.mc -udbspec -user1 -user2 -usera -userb -userc -userid -username -usrerr -uucpproto.mc -uunet -val -vangogh.CS.Berkeley.EDU -vangogh.berkeley.edu -var -vikki -voyeurism -wildcard -wildcards -wnj -word1 -word2 -xf -xxx -xyzvax -yp diff --git a/usr.sbin/sendmail/doc/usenix/usenix.ps b/usr.sbin/sendmail/doc/usenix/usenix.ps deleted file mode 100644 index 31f2f67640ee4..0000000000000 --- a/usr.sbin/sendmail/doc/usenix/usenix.ps +++ /dev/null @@ -1,1004 +0,0 @@ -%!PS-Adobe-3.0 -%%Creator: groff version 1.08 -%%DocumentNeededResources: font Times-Roman -%%+ font Times-Italic -%%+ font Times-Bold -%%DocumentSuppliedResources: procset grops 1.08 0 -%%Pages: 9 -%%PageOrder: Ascend -%%Orientation: Portrait -%%EndComments -%%BeginProlog -%%BeginResource: procset grops 1.08 0 -/setpacking where{ -pop -currentpacking -true setpacking -}if -/grops 120 dict dup begin -/SC 32 def -/A/show load def -/B{0 SC 3 -1 roll widthshow}bind def -/C{0 exch ashow}bind def -/D{0 exch 0 SC 5 2 roll awidthshow}bind def -/E{0 rmoveto show}bind def -/F{0 rmoveto 0 SC 3 -1 roll widthshow}bind def -/G{0 rmoveto 0 exch ashow}bind def -/H{0 rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def -/I{0 exch rmoveto show}bind def -/J{0 exch rmoveto 0 SC 3 -1 roll widthshow}bind def -/K{0 exch rmoveto 0 exch ashow}bind def -/L{0 exch rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def -/M{rmoveto show}bind def -/N{rmoveto 0 SC 3 -1 roll widthshow}bind def -/O{rmoveto 0 exch ashow}bind def -/P{rmoveto 0 exch 0 SC 5 2 roll awidthshow}bind def -/Q{moveto show}bind def -/R{moveto 0 SC 3 -1 roll widthshow}bind def -/S{moveto 0 exch ashow}bind def -/T{moveto 0 exch 0 SC 5 2 roll awidthshow}bind def -/SF{ -findfont exch -[exch dup 0 exch 0 exch neg 0 0]makefont -dup setfont -[exch/setfont cvx]cvx bind def -}bind def -/MF{ -findfont -[5 2 roll -0 3 1 roll -neg 0 0]makefont -dup setfont -[exch/setfont cvx]cvx bind def -}bind def -/level0 0 def -/RES 0 def -/PL 0 def -/LS 0 def -/PLG{ -gsave newpath clippath pathbbox grestore -exch pop add exch pop -}bind def -/BP{ -/level0 save def -1 setlinecap -1 setlinejoin -72 RES div dup scale -LS{ -90 rotate -}{ -0 PL translate -}ifelse -1 -1 scale -}bind def -/EP{ -level0 restore -showpage -}bind def -/DA{ -newpath arcn stroke -}bind def -/SN{ -transform -.25 sub exch .25 sub exch -round .25 add exch round .25 add exch -itransform -}bind def -/DL{ -SN -moveto -SN -lineto stroke -}bind def -/DC{ -newpath 0 360 arc closepath -}bind def -/TM matrix def -/DE{ -TM currentmatrix pop -translate scale newpath 0 0 .5 0 360 arc closepath -TM setmatrix -}bind def -/RC/rcurveto load def -/RL/rlineto load def -/ST/stroke load def -/MT/moveto load def -/CL/closepath load def -/FL{ -currentgray exch setgray fill setgray -}bind def -/BL/fill load def -/LW/setlinewidth load def -/RE{ -findfont -dup maxlength 1 index/FontName known not{1 add}if dict begin -{ -1 index/FID ne{def}{pop pop}ifelse -}forall -/Encoding exch def -dup/FontName exch def -currentdict end definefont pop -}bind def -/DEFS 0 def -/EBEGIN{ -moveto -DEFS begin -}bind def -/EEND/end load def -/CNT 0 def -/level1 0 def -/PBEGIN{ -/level1 save def -translate -div 3 1 roll div exch scale -neg exch neg exch translate -0 setgray -0 setlinecap -1 setlinewidth -0 setlinejoin -10 setmiterlimit -[]0 setdash -/setstrokeadjust where{ -pop -false setstrokeadjust -}if -/setoverprint where{ -pop -false setoverprint -}if -newpath -/CNT countdictstack def -userdict begin -/showpage{}def -}bind def -/PEND{ -clear -countdictstack CNT sub{end}repeat -level1 restore -}bind def -end def -/setpacking where{ -pop -setpacking -}if -%%EndResource -%%IncludeResource: font Times-Roman -%%IncludeResource: font Times-Italic -%%IncludeResource: font Times-Bold -grops begin/DEFS 1 dict def DEFS begin/u{.001 mul}bind def end/RES 72 def/PL -792 def/LS false def/ENC0[/asciicircum/asciitilde/Scaron/Zcaron/scaron/zcaron -/Ydieresis/trademark/quotesingle/.notdef/.notdef/.notdef/.notdef/.notdef -/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef -/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/space -/exclam/quotedbl/numbersign/dollar/percent/ampersand/quoteright/parenleft -/parenright/asterisk/plus/comma/hyphen/period/slash/zero/one/two/three/four -/five/six/seven/eight/nine/colon/semicolon/less/equal/greater/question/at/A/B/C -/D/E/F/G/H/I/J/K/L/M/N/O/P/Q/R/S/T/U/V/W/X/Y/Z/bracketleft/backslash -/bracketright/circumflex/underscore/quoteleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q -/r/s/t/u/v/w/x/y/z/braceleft/bar/braceright/tilde/.notdef/quotesinglbase -/guillemotleft/guillemotright/bullet/florin/fraction/perthousand/dagger -/daggerdbl/endash/emdash/ff/fi/fl/ffi/ffl/dotlessi/dotlessj/grave/hungarumlaut -/dotaccent/breve/caron/ring/ogonek/quotedblleft/quotedblright/oe/lslash -/quotedblbase/OE/Lslash/.notdef/exclamdown/cent/sterling/currency/yen/brokenbar -/section/dieresis/copyright/ordfeminine/guilsinglleft/logicalnot/minus -/registered/macron/degree/plusminus/twosuperior/threesuperior/acute/mu -/paragraph/periodcentered/cedilla/onesuperior/ordmasculine/guilsinglright -/onequarter/onehalf/threequarters/questiondown/Agrave/Aacute/Acircumflex/Atilde -/Adieresis/Aring/AE/Ccedilla/Egrave/Eacute/Ecircumflex/Edieresis/Igrave/Iacute -/Icircumflex/Idieresis/Eth/Ntilde/Ograve/Oacute/Ocircumflex/Otilde/Odieresis -/multiply/Oslash/Ugrave/Uacute/Ucircumflex/Udieresis/Yacute/Thorn/germandbls -/agrave/aacute/acircumflex/atilde/adieresis/aring/ae/ccedilla/egrave/eacute -/ecircumflex/edieresis/igrave/iacute/icircumflex/idieresis/eth/ntilde/ograve -/oacute/ocircumflex/otilde/odieresis/divide/oslash/ugrave/uacute/ucircumflex -/udieresis/yacute/thorn/ydieresis]def/Times-Bold@0 ENC0/Times-Bold RE -/Times-Italic@0 ENC0/Times-Italic RE/Times-Roman@0 ENC0/Times-Roman RE -%%EndProlog -%%Page: 1 1 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 14/Times-Roman@0 SF(Mail Systems and Addressing)204.196 141 Q(in 4.2bsd) -262.331 157.8 Q/F1 10/Times-Roman@0 SF(Eric Allman*)260.92 181.8 Q/F2 10 -/Times-Italic@0 SF(Britton-Lee)254.86 199.8 Q 2.5(,I)-.1 G(nc.)309.2 199.8 Q -(1919 Addison Str)225.13 211.8 Q(eet, Suite 105.)-.37 E(Berk)232.645 223.8 Q -(ele)-.1 E 1.1 -.55(y, C)-.3 H(alifornia 94704.).55 E F1(eric@Berk)244.175 -241.8 Q(ele)-.1 E -.65(y.)-.15 G(ARP).65 E(A)-.92 E(ucb)264.6 253.8 Q -.25(va) --.15 G(x!eric).25 E(ABSTRA)262.085 286.2 Q(CT)-.4 E .966 -(Routing mail through a heterogeneous internet presents man)112 302.4 R 3.466 -(yn)-.15 G 1.466 -.25(ew p)373.438 302.4 T 3.466(roblems. Among).25 F .297 -(the w)112 314.4 R .297(orst of these is that of address mapping.)-.1 F -(Historically)5.297 E 2.797(,t)-.65 G .298(his has been handled on an)355.03 -314.4 R(ad hoc basis.)112 326.4 Q(Ho)5 E(we)-.25 E -.15(ve)-.25 G .8 -.4(r, t) -.15 H(his approach has become unmanageable as internets gro).4 E -.65(w.)-.25 G -.099(Sendmail acts a uni\214ed \231post of)112 342.6 R .098 -(\214ce\232 to which all mail can be submitted.)-.25 F .098(Address inter)5.098 -F(-)-.2 E .754(pretation is controlled by a production system, which can parse\ - both old and ne)112 354.6 R 3.255(wf)-.25 G(or)452.54 354.6 Q(-)-.2 E .242 -(mat addresses.)112 366.6 R .242(The ne)5.242 F 2.742(wf)-.25 G .242 -(ormat is \231domain-based,)216.578 366.6 R 2.742<9a618d>-.7 G -.15(ex)334.326 -366.6 S .241(ible technique that can handle).15 F(man)112 378.6 Q 2.606(yc)-.15 -G .106(ommon situations.)141.116 378.6 R .106 -(Sendmail is not intended to perform user interf)5.106 F .107(ace functions.) --.1 F .399(Sendmail will replace deli)112 394.8 R -.15(ve)-.25 G .399 -(rmail in the Berk).15 F(ele)-.1 E 2.899(y4)-.15 G .399(.2 distrib)320.504 -394.8 R 2.899(ution. Se)-.2 F -.15(ve)-.25 G .399(ral major hosts).15 F .421 -(are no)112 406.8 R 2.921(wo)-.25 G 2.921(rw)152.022 406.8 S .421 -(ill soon be running sendmail.)165.493 406.8 R .421(This change will af)5.421 F -.422(fect an)-.25 F 2.922(yu)-.15 G .422(sers that route)407.056 406.8 R 1.5 -(mail through a sendmail g)112 418.8 R(ate)-.05 E -.1(wa)-.25 G 5.3 -.65(y. T) -.1 H 1.5(he changes that will be user visible are empha-).65 F(sized.)112 430.8 -Q .906(The mail system to appear in 4.2bsd will contain a number of changes.)97 -475.2 R .906(Most of these changes are)5.906 F .469 -(based on the replacement of)72 487.2 R F2(delivermail)2.969 E F1 .469 -(with a ne)2.969 F 2.969(wm)-.25 G .469(odule called)292.871 487.2 R F2 2.97 -(sendmail. Sendmail)2.97 F F1 .47(implements a gen-)2.97 F 1.834 -(eral internetw)72 499.2 R 1.834(ork mail routing f)-.1 F(acility)-.1 E 4.333 -(,f)-.65 G 1.833(eaturing aliasing and forw)239.739 499.2 R 1.833 -(arding, automatic routing to netw)-.1 F(ork)-.1 E -.05(ga)72 511.2 S(te).05 E --.1(wa)-.25 G .205(ys, and \215e).1 F .205(xible con\214guration.)-.15 F .205 -(Of k)5.205 F .505 -.15(ey i)-.1 H .205 -(nterest to the mail system user will be the changes in the net-).15 F -.1(wo) -72 523.2 S(rk addressing structure.).1 E .624(In a simple netw)97 539.4 R .624 -(ork, each node has an address, and resources can be identi\214ed with a host-\ -resource)-.1 F .374(pair; in particular)72 551.4 R 2.874(,t)-.4 G .374 -(he mail system can refer to users using a host-username pair)149.932 551.4 R -5.374(.H)-.55 G .375(ost names and numbers)409.276 551.4 R(ha)72 563.4 Q .3 --.15(ve t)-.2 H 2.5(ob).15 G 2.5(ea)108.31 563.4 S -(dministered by a central authority)119.69 563.4 Q 2.5(,b)-.65 G -(ut usernames can be assigned locally to each host.)263.82 563.4 Q .397 -(In an internet, multiple netw)97 579.6 R .396(orks with dif)-.1 F .396 -(ferent characteristics and managements must communicate.)-.25 F .389 -(In particular)72 591.6 R 2.889(,t)-.4 G .389 -(he syntax and semantics of resource identi\214cation change.)129.308 591.6 R -.39(Certain special cases can be han-)5.389 F 1.033(dled tri)72 603.6 R 1.033 -(vially by)-.25 F F2 1.033(ad hoc)3.533 F F1 1.032(techniques, such as pro) -3.533 F 1.032(viding netw)-.15 F 1.032 -(ork names that appear local to hosts on other)-.1 F(netw)72 615.6 Q 1.621 -(orks, as with the Ethernet at Xerox P)-.1 F 4.121(ARC. Ho)-.92 F(we)-.25 E --.15(ve)-.25 G 2.421 -.4(r, t).15 H 1.622(he general case is e).4 F 1.622 -(xtremely comple)-.15 F 4.122(x. F)-.15 F(or)-.15 E -.15(ex)72 627.6 S .29 -(ample, some netw).15 F .29(orks require that the route the message tak)-.1 F -.29(es be e)-.1 F .29(xplicitly speci\214ed by the sender)-.15 F 2.79(,s)-.4 G -(im-)490.11 627.6 Q 1.618(plifying the database update problem since only adja\ -cent hosts must be entered into the system tables,)72 639.6 R .573(while other\ -s use logical addressing, where the sender speci\214es the location of the rec\ -ipient b)72 651.6 R .573(ut not ho)-.2 F 3.072(wt)-.25 G(o)499 651.6 Q 1.065 -(get there.)72 663.6 R 1.065(Some netw)6.065 F 1.066(orks use a left-associati) --.1 F 1.366 -.15(ve s)-.25 H 1.066(yntax and others use a right-associati).15 F -1.366 -.15(ve s)-.25 H 1.066(yntax, causing).15 F .32 LW 76 673.2 72 673.2 DL -80 673.2 76 673.2 DL 84 673.2 80 673.2 DL 88 673.2 84 673.2 DL 92 673.2 88 -673.2 DL 96 673.2 92 673.2 DL 100 673.2 96 673.2 DL 104 673.2 100 673.2 DL 108 -673.2 104 673.2 DL 112 673.2 108 673.2 DL 116 673.2 112 673.2 DL 120 673.2 116 -673.2 DL 124 673.2 120 673.2 DL 128 673.2 124 673.2 DL 132 673.2 128 673.2 DL -136 673.2 132 673.2 DL 140 673.2 136 673.2 DL 144 673.2 140 673.2 DL 148 673.2 -144 673.2 DL 152 673.2 148 673.2 DL 156 673.2 152 673.2 DL 160 673.2 156 673.2 -DL 164 673.2 160 673.2 DL 168 673.2 164 673.2 DL 172 673.2 168 673.2 DL 176 -673.2 172 673.2 DL 180 673.2 176 673.2 DL 184 673.2 180 673.2 DL 188 673.2 184 -673.2 DL 192 673.2 188 673.2 DL 196 673.2 192 673.2 DL 200 673.2 196 673.2 DL -204 673.2 200 673.2 DL 208 673.2 204 673.2 DL 212 673.2 208 673.2 DL 216 673.2 -212 673.2 DL/F3 8/Times-Roman@0 SF .556(*A considerable part of this w)93.6 -685.2 R .556(ork w)-.08 F .556(as done while under the emplo)-.08 F 2.557(yo) --.08 G 2.557(ft)323.107 685.2 S .557(he INGRES Project at the Uni)330.552 685.2 -R -.12(ve)-.2 G .557(rsity of California at).12 F(Berk)72 694.8 Q(ele)-.08 E --.52(y.)-.12 G/F4 10/Times-Bold@0 SF(Mail Systems and Addr)72 756 Q -(essing in 4.2bsd)-.18 E(1)499 756 Q EP -%%Page: 2 2 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF(Mail Systems and Addr)72 60 Q(essing in 4.2bsd)-.18 E(2) -499 60 Q/F1 10/Times-Roman@0 SF(ambiguity in mix)72 96 Q(ed addresses.)-.15 E -.679(Internet standards seek to eliminate these problems.)97 112.2 R(Initially) -5.678 E 3.178(,t)-.65 G .678(hese proposed e)353.138 112.2 R .678 -(xpanding the address)-.15 F .331 -(pairs to address triples, consisting of {netw)72 124.2 R .331 -(ork, host, username} triples.)-.1 F(Netw)5.332 E .332(ork numbers must be uni) --.1 F -.15(ve)-.25 G -.2(r-).15 G 1.452 -(sally agreed upon, and hosts can be assigned locally on each netw)72 136.2 R -3.952(ork. The)-.1 F(user)3.952 E(-le)-.2 E -.15(ve)-.25 G 3.952(lp).15 G 1.452 -(resentation w)440.718 136.2 R(as)-.1 E .249(changed to address domains, compr\ -ised of a local resource identi\214cation and a hierarchical domain speci\214-) -72 148.2 R 1.54(cation with a common static root.)72 160.2 R 1.539 -(The domain technique separates the issue of ph)6.539 F 1.539(ysical v)-.05 F -1.539(ersus logical)-.15 F 3.001(addressing. F)72 172.2 R .501(or e)-.15 F .502 -(xample, an address of the form \231eric@a.cc.berk)-.15 F(ele)-.1 E -.65(y.) --.15 G .502(arpa\232 describes the logical or).65 F -.05(ga)-.18 G(niza-).05 E -.443(tion of the address space \(user \231eric\232 on host \231a\232 in the Co\ -mputer Center at Berk)72 184.2 R(ele)-.1 E .443(y\) b)-.15 F .443 -(ut not the ph)-.2 F(ysical)-.05 E(netw)72 196.2 Q .934(orks used \(for e)-.1 F -.934(xample, this could go o)-.15 F -.15(ve)-.15 G 3.434(rd).15 G(if)274.722 -196.2 Q .934(ferent netw)-.25 F .935 -(orks depending on whether \231a\232 were on an)-.1 F -(ethernet or a store-and-forw)72 208.2 Q(ard netw)-.1 E(ork\).)-.1 E/F2 10 -/Times-Italic@0 SF(Sendmail)97 224.4 Q F1 .493 -(is intended to help bridge the g)2.993 F .493(ap between the totally)-.05 F F2 -.493(ad hoc)2.993 F F1 -.1(wo)2.993 G .493(rld of netw).1 F .493(orks that kno) --.1 F(w)-.25 E .854(nothing of each other and the clean, tightly-coupled w)72 -236.4 R .854(orld of unique netw)-.1 F .855(ork numbers.)-.1 F .855 -(It can accept old)5.855 F .633(arbitrary address syntax)72 248.4 R .632(es, r\ -esolving ambiguities using heuristics speci\214ed by the system administrator) --.15 F 3.132(,a)-.4 G(s)500.11 248.4 Q .347(well as domain-based addressing.)72 -260.4 R .347(It helps guide the con)5.347 F -.15(ve)-.4 G .347 -(rsion of message formats between disparate net-).15 F -.1(wo)72 272.4 S 3.395 -(rks. In).1 F(short,)3.395 E F2(sendmail)3.395 E F1 .894 -(is designed to assist a graceful transition to consistent internetw)3.395 F -.894(ork addressing)-.1 F(schemes.)72 284.4 Q .689 -(Section 1 de\214nes some of the terms frequently left fuzzy when w)97 312.6 R -.69(orking in mail systems.)-.1 F .69(Section 2)5.69 F .595 -(discusses the design goals for)72 324.6 R F2(sendmail)3.095 E F1 5.595(.I)C -3.095(ns)243.33 324.6 S .595(ection 3, the ne)255.315 324.6 R 3.095(wa)-.25 G -.594(ddress formats and basic features of)332.705 324.6 R F2(send-)3.094 E -(mail)72 336.6 Q F1 .893(are described.)3.393 F .893 -(Section 4 discusses some of the special problems of the UUCP netw)5.893 F -3.394(ork. The)-.1 F(dif)3.394 E(fer)-.25 E(-)-.2 E(ences between)72 348.6 Q F2 -(sendmail)2.5 E F1(and)2.5 E F2(delivermail)2.5 E F1 -(are presented in section 5.)2.5 E F0(DISCLAIMER:)112 376.8 Q F1 3.333(An)3.333 -G .833(umber of e)199.216 376.8 R .832 -(xamples in this paper use names of actual people and)-.15 F(or)112 388.8 Q --.05(ga)-.18 G 4.572(nizations. This).05 F 2.072 -(is not intended to imply a commitment or e)4.572 F -.15(ve)-.25 G 4.573(na).15 -G 4.573(ni)409.987 388.8 S(ntellectual)422.34 388.8 Q 1.094 -(agreement on the part of these people or or)112 400.8 R -.05(ga)-.18 G 3.594 -(nizations. In).05 F(particular)3.594 E 3.594(,B)-.4 G 1.094(ell T)408.896 -400.8 R(elephone)-.7 E .656 -(Laboratories \(BTL\), Digital Equipment Corporation \(DEC\), La)112 412.8 R -.657(wrence Berk)-.15 F(ele)-.1 E 3.157(yL)-.15 G(abo-)446.23 412.8 Q 2.136 -(ratories \(LBL\), Britton-Lee Incorporated \(BLI\), and the Uni)112 424.8 R --.15(ve)-.25 G 2.136(rsity of California at).15 F(Berk)112 436.8 Q(ele)-.1 E -3.088(ya)-.15 G .588(re not committed to an)155.378 436.8 R 3.089(yo)-.15 G -3.089(ft)261.219 436.8 S .589(hese proposals at this time.)270.418 436.8 R .589 -(Much of this paper)5.589 F -(represents no more than the personal opinions of the author)112 448.8 Q(.)-.55 -E F0 2.5(1. DEFINITIONS)72 477 R F1 .266(There are four basic concepts that mu\ -st be clearly distinguished when dealing with mail systems:)112 493.2 R .514 -(the user \(or the user')87 505.2 R 3.014(sa)-.55 G .515(gent\), the user') -182.6 505.2 R 3.015(si)-.55 G .515(denti\214cation, the user')253.025 505.2 R -3.015(sa)-.55 G .515(ddress, and the route.)354.56 505.2 R .515(These are dis-) -5.515 F(tinguished primarily by their position independence.)87 517.2 Q F0 2.5 -(1.1. User)87 541.2 R(and Identi\214cation)2.5 E F1 .264 -(The user is the being \(a person or program\) that is creating or recei)127 -557.4 R .263(ving a message.)-.25 F(An)5.263 E F2 -.1(age)2.763 G(nt).1 E F1 -.659(is an entity operating on behalf of the user \212 such as a secretary who\ - handles my mail.)102 569.4 R .66(or a pro-)5.66 F(gram that automatically ret\ -urns a message such as \231I am at the UNICOM conference.)102 581.4 Q<9a>-.7 E -.931(The identi\214cation is the tag that goes along with the particular user) -127 597.6 R 5.931(.T)-.55 G .931(his tag is completely)418.707 597.6 R .216 -(independent of location.)102 609.6 R -.15(Fo)5.216 G 2.716(re).15 G .216 -(xample, my identi\214cation is the string \231Eric Allman,)225.324 609.6 R -2.717<9a61>-.7 G .217(nd this identi-)448.006 609.6 R 1.228 -(\214cation does not change whether I am located at U.C. Berk)102 621.6 R(ele) --.1 E 2.527 -.65(y, a)-.15 H 3.727(tB).65 G 1.227 -(ritton-Lee, or at a scienti\214c)390.502 621.6 R(institute in Austria.)102 -633.6 Q 2.379 -(Since the identi\214cation is frequently ambiguous \(e.g., there are tw)127 -649.8 R 4.879<6f99>-.1 G 2.38(Robert Henry\232s at)426.48 649.8 R(Berk)102 -661.8 Q(ele)-.1 E .316(y\) it is common to add other disambiguating informatio\ -n that is not strictly part of the iden-)-.15 F -(ti\214cation \(e.g., Robert \231Code Generator\232 Henry v)102 673.8 Q -(ersus Robert \231System Administrator\232 Henry\).)-.15 E F0 -1(Ve)72 756 S -(rsion 8.2)1 E(USENIX \255 J)249.805 756 Q(an 83)-.15 E(Last Mod 11/27/93) -424.55 756 Q EP -%%Page: 3 3 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF(Mail Systems and Addr)72 60 Q(essing in 4.2bsd)-.18 E(3) -499 60 Q 2.5(1.2. Addr)87 96 R(ess)-.18 E/F1 10/Times-Roman@0 SF .785 -(The address speci\214es a location.)127 112.2 R .786(As I mo)5.786 F 1.086 --.15(ve a)-.15 H .786(round, my address changes.).15 F -.15(Fo)5.786 G 3.286 -(re).15 G .786(xample, my)455.994 112.2 R 9.712 -(address might change from \231eric@Berk)102 124.2 R(ele)-.1 E -.65(y.)-.15 G -(ARP).65 E 9.711(A\232 to \231eric@bli.UUCP\232 or \231all-)-.92 F -(man@IIASA.Austria\232 depending on my current af)102 136.2 Q(\214liation.)-.25 -E(Ho)127 152.4 Q(we)-.25 E -.15(ve)-.25 G 2.819 -.4(r, a).15 H 4.519(na).4 G -2.019(ddress is independent of the location of an)188.018 152.4 R 2.019 -(yone else.)-.15 F 2.02(That is, my address)7.02 F .385(remains the same to e) -102 164.4 R -.15(ve)-.25 G .385(ryone who might be sending me mail.).15 F -.15 -(Fo)5.385 G 2.885(re).15 G .385(xample, a person at MIT and a)379.22 164.4 R -(person at USC could both send to \231eric@Berk)102 176.4 Q(ele)-.1 E -.65(y.) --.15 G(ARP).65 E(A\232 and ha)-.92 E .3 -.15(ve i)-.2 H 2.5(ta).15 G(rri)388.44 -176.4 Q .3 -.15(ve t)-.25 H 2.5(ot).15 G(he same mailbox.)422.48 176.4 Q .627 -(Ideally a \231white pages\232 service w)127 192.6 R .627(ould be pro)-.1 F -.627(vided to map user identi\214cations into addresses)-.15 F .444(\(for e)102 -204.6 R .444(xample, see [Solomon81]\).)-.15 F .444 -(Currently this is handled by passing around scraps of paper or by)5.444 F -(calling people on the telephone to \214nd out their address.)102 216.6 Q F0 -2.5(1.3. Route)87 240.6 R F1 .288(While an address speci\214es)127 256.8 R/F2 -10/Times-Italic@0 SF(wher)2.788 E(e)-.37 E F1 .289 -(to \214nd a mailbox, a route speci\214es)2.789 F F2(how)2.789 E F1 .289 -(to \214nd the mailbox.)2.789 F(Speci\214cally)102 268.8 Q 2.607(,i)-.65 G -2.607(ts)156.457 268.8 S .106(peci\214es a path from sender to recei)165.734 -268.8 R -.15(ve)-.25 G 3.706 -.55(r. A).15 H 2.606(ss).55 G .106 -(uch, the route is potentially dif)343.364 268.8 R .106(ferent for)-.25 F -2.15 --.25(ev e)102 280.8 T(ry pair of people in the electronic uni).25 E -.15(ve) --.25 G(rse.).15 E .258(Normally the route is hidden from the user by the softw) -127 297 R 2.758(are. Ho)-.1 F(we)-.25 E -.15(ve)-.25 G 1.058 -.4(r, s).15 H -.258(ome netw).4 F .258(orks put the)-.1 F -.2(bu)102 309 S 1.972 -(rden of determining the route onto the sender).2 F 6.971(.A)-.55 G 1.971 -(lthough this simpli\214es the softw)322.544 309 R 1.971(are, it also)-.1 F -(greatly impairs the usability for most users.)102 321 Q(The UUCP netw)5 E -(ork is an e)-.1 E(xample of such a netw)-.15 E(ork.)-.1 E F0 2.5(2. DESIGN)72 -345 R(GO)2.5 E(ALS)-.4 E F1(Design goals for)112 363.2 Q F2(sendmail)2.5 E/F3 7 -/Times-Roman@0 SF(1)216.71 359.2 Q F1(include:)222.71 363.2 Q 12.5 -(\(1\) Compatibility)92 379.4 R 1.363(with the e)3.863 F 1.363 -(xisting mail programs, including Bell v)-.15 F 1.363(ersion 6 mail, Bell v) --.15 F 1.364(ersion 7)-.15 F 3.589(mail, Berk)118.66 391.4 R(ele)-.1 E(y)-.15 E -F2(Mail)6.089 E F1 3.589 -([Shoens79], BerkNet mail [Schmidt79], and hopefully UUCP mail)6.089 F([No) -118.66 403.4 Q 2.5(witz78]. ARP)-.25 F(ANET mail [Crock)-.92 E(er82] w)-.1 E -(as also required.)-.1 E 12.5(\(2\) Reliability)92 419.6 R 4.002(,i)-.65 G -4.002(nt)169.522 419.6 S 1.502(he sense of guaranteeing that e)181.304 419.6 R --.15(ve)-.25 G 1.502(ry message is correctly deli).15 F -.15(ve)-.25 G 1.503 -(red or at least).15 F .368 -(brought to the attention of a human for correct disposal; no message should e) -118.66 431.6 R -.15(ve)-.25 G 2.868(rb).15 G 2.868(ec)452.252 431.6 S -(ompletely)464 431.6 Q 2.54(lost. This)118.66 443.6 R .04(goal w)2.54 F .041 -(as considered essential because of the emphasis on mail in our en)-.1 F 2.541 -(vironment. It)-.4 F 1.755 -(has turned out to be one of the hardest goals to satisfy)118.66 455.6 R 4.254 -(,e)-.65 G 1.754(specially in the f)363.756 455.6 R 1.754(ace of the man)-.1 F -(y)-.15 E .977(anomalous message formats produced by v)118.66 467.6 R .977 -(arious ARP)-.25 F .977(ANET sites.)-.92 F -.15(Fo)5.977 G 3.478(re).15 G .978 -(xample, certain sites)420.114 467.6 R .069 -(generate improperly formated addresses, occasionally causing error)118.66 -479.6 R .069(-message loops.)-.2 F .068(Some hosts)5.069 F .766(use blanks in \ -names, causing problems with mail programs that assume that an address is one) -118.66 491.6 R -.1(wo)118.66 503.6 S 3.924(rd. The).1 F 1.423 -(semantics of some \214elds are interpreted slightly dif)3.923 F 1.423 -(ferently by dif)-.25 F 1.423(ferent sites.)-.25 F(In)6.423 E(summary)118.66 -515.6 Q 3.022(,t)-.65 G .523(he obscure features of the ARP)163.532 515.6 R -.523(ANET mail protocol really)-.92 F F2(ar)3.023 E(e)-.37 E F1 .523 -(used and are dif)3.023 F(\214cult)-.25 E(to support, b)118.66 527.6 Q -(ut must be supported.)-.2 E 12.5(\(3\) Existing)92 543.8 R(softw)2.939 E .439 -(are to do actual deli)-.1 F -.15(ve)-.25 G .439(ry should be used whene).15 F --.15(ve)-.25 G 2.938(rp).15 G 2.938(ossible. This)387.658 543.8 R .438 -(goal deri)2.938 F -.15(ve)-.25 G 2.938(sa).15 G(s)500.11 543.8 Q -(much from political and practical considerations as technical.)118.66 555.8 Q -12.5(\(4\) Easy)92 572 R -.15(ex)2.898 G .398(pansion to f).15 F .398 -(airly comple)-.1 F 2.898(xe)-.15 G -.4(nv)261.06 572 S .399 -(ironments, including multiple connections to a single net-).4 F -.1(wo)118.66 -584 S .63(rk type \(such as with multiple UUCP or Ethernets\).).1 F .63 -(This goal requires consideration of the)5.63 F -(contents of an address as well as its syntax in order to determine which g) -118.66 596 Q(ate)-.05 E -.1(wa)-.25 G 2.5(yt).1 G 2.5(ou)443.48 596 S(se.) -455.98 596 Q 12.5(\(5\) Con\214guration)92 612.2 R 1.048 -(information should not be compiled into the code.)3.548 F 3.549(As)6.049 G -1.049(ingle compiled program)405.802 612.2 R .084 -(should be able to run as is at an)118.66 624.2 R 2.584(ys)-.15 G .083 -(ite \(barring such basic changes as the CPU type or the operat-)256.196 624.2 -R .342(ing system\).)118.66 636.2 R 1.942 -.8(We h)5.342 H -2.25 -.2(av e).8 H -.343(found this seemingly unimportant goal to be critical in real life.)3.042 F -(Besides)5.343 E .734(the simple problems that occur when an)118.66 648.2 R -3.234(yp)-.15 G .734(rogram gets recompiled in a dif)295.568 648.2 R .733 -(ferent en)-.25 F(vironment,)-.4 E(man)118.66 660.2 Q 2.5(ys)-.15 G(ites lik) -147.12 660.2 Q 2.5(et)-.1 G 2.5<6f99>183.69 660.2 S(\214ddle\232 with an)195.63 -660.2 Q(ything that the)-.15 E 2.5(yw)-.15 G(ill be recompiling an)327.27 660.2 -Q(yw)-.15 E(ay)-.1 E(.)-.65 E .32 LW 76 678.8 72 678.8 DL 80 678.8 76 678.8 DL -84 678.8 80 678.8 DL 88 678.8 84 678.8 DL 92 678.8 88 678.8 DL 96 678.8 92 -678.8 DL 100 678.8 96 678.8 DL 104 678.8 100 678.8 DL 108 678.8 104 678.8 DL -112 678.8 108 678.8 DL 116 678.8 112 678.8 DL 120 678.8 116 678.8 DL 124 678.8 -120 678.8 DL 128 678.8 124 678.8 DL 132 678.8 128 678.8 DL 136 678.8 132 678.8 -DL 140 678.8 136 678.8 DL 144 678.8 140 678.8 DL 148 678.8 144 678.8 DL 152 -678.8 148 678.8 DL 156 678.8 152 678.8 DL 160 678.8 156 678.8 DL 164 678.8 160 -678.8 DL 168 678.8 164 678.8 DL 172 678.8 168 678.8 DL 176 678.8 172 678.8 DL -180 678.8 176 678.8 DL 184 678.8 180 678.8 DL 188 678.8 184 678.8 DL 192 678.8 -188 678.8 DL 196 678.8 192 678.8 DL 200 678.8 196 678.8 DL 204 678.8 200 678.8 -DL 208 678.8 204 678.8 DL 212 678.8 208 678.8 DL 216 678.8 212 678.8 DL/F4 5 -/Times-Roman@0 SF(1)93.6 689.2 Q/F5 8/Times-Roman@0 SF(This section mak)3.2 I -(es no distinction between)-.08 E/F6 8/Times-Italic@0 SF(delivermail)2 E F5 -(and)2 E F6(sendmail.)2 E F0 -1(Ve)72 756 S(rsion 8.2)1 E(USENIX \255 J)249.805 -756 Q(an 83)-.15 E(Last Mod 11/27/93)424.55 756 Q EP -%%Page: 4 4 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF(Mail Systems and Addr)72 60 Q(essing in 4.2bsd)-.18 E(4) -499 60 Q/F1 10/Times-Roman@0 SF(\(6\))92 96 Q/F2 10/Times-Italic@0 SF(Sendmail) -118.66 96 Q F1 .184(must be able to let v)2.684 F .184 -(arious groups maintain their o)-.25 F .184(wn mailing lists, and let indi)-.25 -F(viduals)-.25 E(specify their o)118.66 108 Q(wn forw)-.25 E -(arding, without modifying the system alias \214le.)-.1 E 12.5(\(7\) Each)92 -124.2 R .313(user should be able to specify which mailer to e)2.814 F -.15(xe) --.15 G .313(cute to process mail being deli).15 F -.15(ve)-.25 G .313(red for) -.15 F 3.098(him. This)118.66 136.2 R .598(feature allo)3.098 F .598 -(ws users who are using specialized mailers that use a dif)-.25 F .598 -(ferent format to)-.25 F -.2(bu)118.66 148.2 S .25(ild their en).2 F .25 -(vironment without changing the system, and f)-.4 F .25 -(acilitates specialized functions \(such)-.1 F(as returning an \231I am on v) -118.66 160.2 Q(acation\232 message\).)-.25 E 12.5(\(8\) Netw)92 176.4 R 1.552 -(ork traf)-.1 F 1.552(\214c should be minimized by batching addresses to a sin\ -gle host where possible,)-.25 F(without assistance from the user)118.66 188.4 Q -(.)-.55 E .375(These goals moti)112 204.6 R -.25(va)-.25 G .375 -(ted the architecture illustrated in \214gure 1.).25 F .374 -(The user interacts with a mail gen-)5.375 F .49(erating and sending program.) -87 216.6 R .491(When the mail is created, the generator calls)5.49 F F2 -(sendmail)2.991 E F1 2.991(,w)C .491(hich routes the)444.138 216.6 R .841 -(message to the correct mailer\(s\).)87 228.6 R .841 -(Since some of the senders may be netw)5.841 F .84(ork serv)-.1 F .84 -(ers and some of the)-.15 F(mailers may be netw)87 240.6 Q(ork clients,)-.1 E -F2(sendmail)2.5 E F1(may be used as an internet mail g)2.5 E(ate)-.05 E -.1(wa) --.25 G -.65(y.).1 G F0 2.5(3. USA)72 264.6 R(GE)-.55 E 2.5(3.1. Addr)87 288.6 R -(ess F)-.18 E(ormats)-.25 E F1(Ar)127 304.8 Q .886 -(guments may be \215ags or addresses.)-.18 F .886(Flags set v)5.886 F .886 -(arious processing options.)-.25 F -.15(Fo)5.886 G(llo).15 E .886(wing \215ag) --.25 F(ar)102 316.8 Q .611(guments, address ar)-.18 F .611(guments may be gi) --.18 F -.15(ve)-.25 G 3.111(n. Addresses).15 F(follo)3.111 E 3.111(wt)-.25 G -.611(he syntax in RFC822 [Crock)365.558 316.8 R(er82])-.1 E(for ARP)102 328.8 Q -(ANET address formats.)-.92 E(In brief, the format is:)5 E 12.5(\(1\) An)107 -345 R(ything in parentheses is thro)-.15 E(wn a)-.25 E -.1(wa)-.15 G 2.5(y\().1 -G(as a comment\).)299.65 345 Q 12.5(\(2\) An)107 361.2 R .051 -(ything in angle brack)-.15 F .051(ets \(\231<)-.1 F .051 -(>\232\) is preferred o)1.666 F -.15(ve)-.15 G 2.551(ra).15 G -.15(ny)348.064 -361.2 S .051(thing else.).15 F .051(This rule implements the)5.051 F(ARP)133.66 -373.2 Q(ANET standard that addresses of the form)-.92 E .4 LW 77 408 72 408 DL -79 408 74 408 DL 84 408 79 408 DL 89 408 84 408 DL 94 408 89 408 DL 99 408 94 -408 DL 104 408 99 408 DL 109 408 104 408 DL 114 408 109 408 DL 119 408 114 408 -DL 124 408 119 408 DL 129 408 124 408 DL 134 408 129 408 DL 139 408 134 408 DL -144 408 139 408 DL 149 408 144 408 DL 154 408 149 408 DL 159 408 154 408 DL 164 -408 159 408 DL 169 408 164 408 DL 174 408 169 408 DL 179 408 174 408 DL 184 408 -179 408 DL 189 408 184 408 DL 194 408 189 408 DL 199 408 194 408 DL 204 408 199 -408 DL 209 408 204 408 DL 214 408 209 408 DL 219 408 214 408 DL 224 408 219 408 -DL 229 408 224 408 DL 234 408 229 408 DL 239 408 234 408 DL 244 408 239 408 DL -249 408 244 408 DL 254 408 249 408 DL 259 408 254 408 DL 264 408 259 408 DL 269 -408 264 408 DL 274 408 269 408 DL 279 408 274 408 DL 284 408 279 408 DL 289 408 -284 408 DL 294 408 289 408 DL 299 408 294 408 DL 304 408 299 408 DL 309 408 304 -408 DL 314 408 309 408 DL 319 408 314 408 DL 324 408 319 408 DL 329 408 324 408 -DL 334 408 329 408 DL 339 408 334 408 DL 344 408 339 408 DL 349 408 344 408 DL -354 408 349 408 DL 359 408 354 408 DL 364 408 359 408 DL 369 408 364 408 DL 374 -408 369 408 DL 379 408 374 408 DL 384 408 379 408 DL 389 408 384 408 DL 394 408 -389 408 DL 399 408 394 408 DL 404 408 399 408 DL 409 408 404 408 DL 414 408 409 -408 DL 419 408 414 408 DL 424 408 419 408 DL 429 408 424 408 DL 434 408 429 408 -DL 439 408 434 408 DL 444 408 439 408 DL 449 408 444 408 DL 454 408 449 408 DL -459 408 454 408 DL 464 408 459 408 DL 469 408 464 408 DL 474 408 469 408 DL 479 -408 474 408 DL 484 408 479 408 DL 489 408 484 408 DL 494 408 489 408 DL 499 408 -494 408 DL 504 408 499 408 DL(Figure 1 \212 Sendmail System Structure.)208 660 -Q 77 672 72 672 DL 79 672 74 672 DL 84 672 79 672 DL 89 672 84 672 DL 94 672 89 -672 DL 99 672 94 672 DL 104 672 99 672 DL 109 672 104 672 DL 114 672 109 672 DL -119 672 114 672 DL 124 672 119 672 DL 129 672 124 672 DL 134 672 129 672 DL 139 -672 134 672 DL 144 672 139 672 DL 149 672 144 672 DL 154 672 149 672 DL 159 672 -154 672 DL 164 672 159 672 DL 169 672 164 672 DL 174 672 169 672 DL 179 672 174 -672 DL 184 672 179 672 DL 189 672 184 672 DL 194 672 189 672 DL 199 672 194 672 -DL 204 672 199 672 DL 209 672 204 672 DL 214 672 209 672 DL 219 672 214 672 DL -224 672 219 672 DL 229 672 224 672 DL 234 672 229 672 DL 239 672 234 672 DL 244 -672 239 672 DL 249 672 244 672 DL 254 672 249 672 DL 259 672 254 672 DL 264 672 -259 672 DL 269 672 264 672 DL 274 672 269 672 DL 279 672 274 672 DL 284 672 279 -672 DL 289 672 284 672 DL 294 672 289 672 DL 299 672 294 672 DL 304 672 299 672 -DL 309 672 304 672 DL 314 672 309 672 DL 319 672 314 672 DL 324 672 319 672 DL -329 672 324 672 DL 334 672 329 672 DL 339 672 334 672 DL 344 672 339 672 DL 349 -672 344 672 DL 354 672 349 672 DL 359 672 354 672 DL 364 672 359 672 DL 369 672 -364 672 DL 374 672 369 672 DL 379 672 374 672 DL 384 672 379 672 DL 389 672 384 -672 DL 394 672 389 672 DL 399 672 394 672 DL 404 672 399 672 DL 409 672 404 672 -DL 414 672 409 672 DL 419 672 414 672 DL 424 672 419 672 DL 429 672 424 672 DL -434 672 429 672 DL 439 672 434 672 DL 444 672 439 672 DL 449 672 444 672 DL 454 -672 449 672 DL 459 672 454 672 DL 464 672 459 672 DL 469 672 464 672 DL 474 672 -469 672 DL 479 672 474 672 DL 484 672 479 672 DL 489 672 484 672 DL 494 672 489 -672 DL 499 672 494 672 DL 504 672 499 672 DL F0 -1(Ve)72 756 S(rsion 8.2)1 E -(USENIX \255 J)249.805 756 Q(an 83)-.15 E(Last Mod 11/27/93)424.55 756 Q EP -%%Page: 5 5 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF(Mail Systems and Addr)72 60 Q(essing in 4.2bsd)-.18 E(5) -499 60 Q/F1 10/Times-Roman@0 SF(user name <machine-address>)173.66 96 Q(will s\ -end to the electronic \231machine-address\232 rather than the human \231user n\ -ame.)133.66 112.2 Q<9a>-.7 E 12.5(\(3\) Double)107 128.4 R 2.246(quotes \() -4.746 F -2.754 2.5("\) q)2.5 H 2.246 -(uote phrases; backslashes quote characters.)224.188 128.4 R 2.246 -(Backslashes are more)7.246 F(po)133.66 140.4 Q .654(werful in that the)-.25 F -3.154(yw)-.15 G .655(ill cause otherwise equi)229.196 140.4 R -.25(va)-.25 G -.655(lent phrases to compare dif).25 F .655(ferently \212 for)-.25 F -.15(ex) -133.66 152.4 S(ample,).15 E/F2 10/Times-Italic@0 SF(user)3.873 E F1(and)3.873 E -F2("user")3.872 E F1 1.372(are equi)3.872 F -.25(va)-.25 G 1.372(lent, b).25 F -(ut)-.2 E F2(\\user)3.872 E F1 1.372(is dif)3.872 F 1.372 -(ferent from either of them.)-.25 F(This)6.372 E(might be used to a)133.66 -164.4 Q -.2(vo)-.2 G(id normal aliasing or duplicate suppression algorithms.).2 -E -.15(Pa)127 180.6 S 1.12(rentheses, angle brack).15 F 1.12 -(ets, and double quotes must be properly balanced and nested.)-.1 F(The)6.12 E -(re)102 194.6 Q(writing rules control remaining parsing)-.25 E/F3 7 -/Times-Roman@0 SF(2)266.17 190.6 Q F1(.)269.67 194.6 Q .644(Although old style\ - addresses are still accepted in most cases, the preferred address format is) -127 210.8 R .299(based on ARP)102 222.8 R(ANET)-.92 E .299 -(-style domain-based addresses [Su82a].)-.92 F .299 -(These addresses are based on a hierar)5.299 F(-)-.2 E .13 -(chical, logical decomposition of the address space.)102 234.8 R .13 -(The addresses are hierarchical in a sense similar)5.13 F 1.133(to the U.S. po\ -stal addresses: the messages may \214rst be routed to the correct state, with \ -no initial)102 246.8 R .72 -(consideration of the city or other addressing details.)102 258.8 R .72 -(The addresses are logical in that each step in)5.72 F(the hierarch)102 270.8 Q -2.5(yc)-.05 G -(orresponds to a set of \231naming authorities\232 rather than a ph)161.37 -270.8 Q(ysical netw)-.05 E(ork.)-.1 E -.15(Fo)127 287 S 2.5(re).15 G -(xample, the address:)147.53 287 Q(eric@HostA.BigSite.ARP)142 303.2 Q(A)-.92 E --.1(wo)102 319.4 S .851 -(uld \214rst look up the domain BigSite in the namespace administrated by ARP) -.1 F 3.351(A. A)-.92 F .851(query could)3.351 F 1.476 -(then be sent to BigSite for interpretation of HostA.)102 331.4 R(Ev)6.475 E -1.475(entually the mail w)-.15 F 1.475(ould arri)-.1 F 1.775 -.15(ve a)-.25 H -3.975(tH).15 G(ostA,)482.61 331.4 Q(which w)102 343.4 Q -(ould then do \214nal deli)-.1 E -.15(ve)-.25 G(ry to user \231eric.).15 E<9a> --.7 E F0 2.5(3.2. Mail)87 367.4 R(to Files and Pr)2.5 E(ograms)-.18 E F1 .609 -(Files and programs are le)127 383.6 R .609(gitimate message recipients.)-.15 F -.609(Files pro)5.609 F .609(vide archi)-.15 F -.25(va)-.25 G 3.109(ls).25 G .61 -(torage of mes-)445.02 383.6 R .124 -(sages, useful for project administration and history)102 395.6 R 5.124(.P)-.65 -G .124(rograms are useful as recipients in a v)318.308 395.6 R .124(ariety of) --.25 F .69(situations, for e)102 407.6 R .691(xample, to maintain a public rep\ -ository of systems messages \(such as the Berk)-.15 F(ele)-.1 E(y)-.15 E F2 -(msgs)102 419.6 Q F1(program\).)2.5 E(An)127 435.8 Q 3.188(ya)-.15 G .688(ddre\ -ss passing through the initial parsing algorithm as a local address \(i.e, not\ - appear)151.698 435.8 R(-)-.2 E .276(ing to be a v)102 447.8 R .276 -(alid address for another mailer\) is scanned for tw)-.25 F 2.776(os)-.1 G .277 -(pecial cases.)362.128 447.8 R .277(If pre\214x)5.277 F .277(ed by a v)-.15 F -(erti-)-.15 E .18(cal bar \(\231)102 459.8 R .833<7c9a>.833 G 2.68(\)t)-.833 G -.179(he rest of the address is processed as a shell command.)156.456 459.8 R -.179(If the user name be)5.179 F .179(gins with a)-.15 F(slash mark \(\231/)102 -471.8 Q(\232\) the name is used as a \214le name, instead of a login name.).833 -E F0 2.5(3.3. Aliasing,)87 495.8 R -.25(Fo)2.5 G(rwarding, Inclusion).25 E F2 -(Sendmail)127 512 Q F1 1.074(reroutes mail three w)3.574 F 3.574(ays. Aliasing) --.1 F 1.075(applies system wide.)3.575 F -.15(Fo)6.075 G(rw).15 E 1.075 -(arding allo)-.1 F 1.075(ws each)-.25 F .233 -(user to reroute incoming mail destined for that account.)102 524 R .233 -(Inclusion directs)5.233 F F2(sendmail)2.733 E F1 .233(to read a \214le for) -2.733 F 2.5(al)102 536 S -(ist of addresses, and is normally used in conjunction with aliasing.)111.72 -536 Q F0 2.5(3.3.1. Aliasing)102 560 R F1 .065 -(Aliasing maps local addresses to address lists using a system-wide \214le.)142 -576.2 R .065(This \214le is hashed)5.065 F 1.546(to speed access.)117 588.2 R -1.545(Only addresses that parse as local are allo)6.546 F 1.545 -(wed as aliases; this guarantees a)-.25 F(unique k)117 600.2 Q .3 -.15(ey \() --.1 H(since there are no nicknames for the local host\).).15 E F0 2.5(3.3.2. F) -102 624.2 R(orwarding)-.25 E F1 .641 -(After aliasing, if an recipient address speci\214es a local user)142 640.4 R -F2(sendmail)3.141 E F1 .641(searches for a \231.for)3.141 F(-)-.2 E -.1(wa)117 -652.4 S .413(rd\232 \214le in the recipient').1 F 2.913(sh)-.55 G .413 -(ome directory)235.335 652.4 R 5.413(.I)-.65 G 2.913(fi)302.161 652.4 S 2.913 -(te)311.184 652.4 S .413(xists, the message is)321.167 652.4 R F2(not)2.913 E -F1 .412(sent to that user)2.913 F 2.912(,b)-.4 G(ut)496.22 652.4 Q .745 -(rather to the list of addresses in that \214le.)117 664.4 R .746 -(Often this list will contain only one address, and the)5.746 F -(feature will be used for netw)117 676.4 Q(ork mail forw)-.1 E(arding.)-.1 E -.32 LW 76 686 72 686 DL 80 686 76 686 DL 84 686 80 686 DL 88 686 84 686 DL 92 -686 88 686 DL 96 686 92 686 DL 100 686 96 686 DL 104 686 100 686 DL 108 686 104 -686 DL 112 686 108 686 DL 116 686 112 686 DL 120 686 116 686 DL 124 686 120 686 -DL 128 686 124 686 DL 132 686 128 686 DL 136 686 132 686 DL 140 686 136 686 DL -144 686 140 686 DL 148 686 144 686 DL 152 686 148 686 DL 156 686 152 686 DL 160 -686 156 686 DL 164 686 160 686 DL 168 686 164 686 DL 172 686 168 686 DL 176 686 -172 686 DL 180 686 176 686 DL 184 686 180 686 DL 188 686 184 686 DL 192 686 188 -686 DL 196 686 192 686 DL 200 686 196 686 DL 204 686 200 686 DL 208 686 204 686 -DL 212 686 208 686 DL 216 686 212 686 DL/F4 5/Times-Roman@0 SF(2)93.6 696.4 Q -/F5 8/Times-Roman@0 SF(Disclaimer: Some special processing is done after re)3.2 -I(writing local names; see belo)-.2 E -.52(w.)-.2 G F0 -1(Ve)72 756 S -(rsion 8.2)1 E(USENIX \255 J)249.805 756 Q(an 83)-.15 E(Last Mod 11/27/93) -424.55 756 Q EP -%%Page: 6 6 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF(Mail Systems and Addr)72 60 Q(essing in 4.2bsd)-.18 E(6) -499 60 Q/F1 10/Times-Roman@0 SF -.15(Fo)142 96 S(rw).15 E 1.152 -(arding also permits a user to specify a pri)-.1 F -.25(va)-.25 G 1.151 -(te incoming mailer).25 F 6.151(.F)-.55 G 1.151(or e)437.348 96 R 1.151 -(xample, for)-.15 F(-)-.2 E -.1(wa)117 108 S(rding to:).1 E -2.5 .833("| /)157 -124.2 T(usr/local/ne)-.833 E(wmail myname")-.25 E(will use a dif)117 140.4 Q -(ferent incoming mailer)-.25 E(.)-.55 E F0 2.5(3.3.3. Inclusion)102 164.4 R F1 -(Inclusion is speci\214ed in RFC 733 [Crock)142 180.6 Q(er77] syntax:)-.1 E -(:Include: pathname)157 196.8 Q .391 -(An address of this form reads the \214le speci\214ed by)117 213 R/F2 10 -/Times-Italic@0 SF(pathname)2.891 E F1 .391 -(and sends to all users listed in that)2.891 F(\214le.)117 225 Q .645 -(The intent is)142 241.2 R F2(not)3.145 E F1 .644 -(to support direct use of this feature, b)3.145 F .644 -(ut rather to use this as a subset of)-.2 F 2.5(aliasing. F)117 253.2 R(or e) --.15 E(xample, an alias of the form:)-.15 E -(project: :include:/usr/project/userlist)157 269.4 Q 1.93(is a method of letti\ -ng a project maintain a mailing list without interaction with the system)117 -285.6 R(administration, e)117 297.6 Q -.15(ve)-.25 G 2.5(ni).15 G 2.5(ft)203.54 -297.6 S(he alias \214le is protected.)212.15 297.6 Q 2.025 -(It is not necessary to reb)142 313.8 R 2.025(uild the inde)-.2 F 4.524(xo)-.15 -G 4.524(nt)317.828 313.8 S 2.024(he alias database when a :include: list is) -330.132 313.8 R(changed.)117 325.8 Q F0 2.5(3.4. Message)87 349.8 R(Collection) -2.5 E F1 .857(Once all recipient addresses are parsed and v)127 366 R .857 -(eri\214ed, the message is collected.)-.15 F .857(The message)5.857 F .574 -(comes in tw)102 378 R 3.074(op)-.1 G .574 -(arts: a message header and a message body)164.452 378 R 3.074(,s)-.65 G .574 -(eparated by a blank line.)349.734 378 R .573(The body is)5.574 F -(an uninterpreted sequence of te)102 390 Q(xt lines.)-.15 E -(The header is formated as a series of lines of the form)127 406.2 Q -(\214eld-name: \214eld-v)178 422.4 Q(alue)-.25 E(Field-v)102 438.6 Q 1.366 -(alue can be split across lines by starting the follo)-.25 F 1.366 -(wing lines with a space or a tab)-.25 F 6.366(.S)-.4 G(ome)486.78 438.6 Q .211 -(header \214elds ha)102 450.6 R .511 -.15(ve s)-.2 H .211 -(pecial internal meaning, and ha).15 F .511 -.15(ve a)-.2 H .211 -(ppropriate special processing.).15 F .21(Other headers)5.21 F -(are simply passed through.)102 462.6 Q -(Some header \214elds may be added automatically)5 E 2.5(,s)-.65 G -(uch as time stamps.)413.53 462.6 Q F0 2.5(4. THE)72 486.6 R(UUCP PR)2.5 E -(OBLEM)-.3 E F1 .43(Of particular interest is the UUCP netw)112 502.8 R 2.93 -(ork. The)-.1 F -.15(ex)2.93 G .43(plicit routing used in the UUCP en).15 F -(vironment)-.4 E .909(causes a number of serious problems.)87 514.8 R .909 -(First, gi)5.909 F .908(ving out an address is impossible without kno)-.25 F -.908(wing the)-.25 F .453(address of your potential correspondent.)87 526.8 R -.454(This is typically handled by specifying the address relati)5.453 F .754 --.15(ve t)-.25 H(o).15 E 1.208(some \231well-kno)87 538.8 R 1.208 -(wn\232 host \(e.g., ucb)-.25 F -.25(va)-.15 G 3.708(xo).25 G 3.708(rd)253.47 -538.8 S(ecv)265.508 538.8 Q 3.708(ax\). Second,)-.25 F 1.207(it is often dif) -3.708 F 1.207(\214cult to compute the set of)-.25 F .157 -(addresses to reply to without some kno)87 550.8 R .157 -(wledge of the topology of the netw)-.25 F 2.657(ork. Although)-.1 F .157 -(it may be easy)2.657 F .352(for a human being to do this under man)87 562.8 R -2.851(yc)-.15 G .351(ircumstances, a program does not ha)259.713 562.8 R .651 --.15(ve e)-.2 H .351(qually sophisticated).15 F 1.153(heuristics b)87 574.8 R -1.153(uilt in.)-.2 F 1.154(Third, certain addresses will become painfully and \ -unnecessarily long, as when a)6.153 F .406(message is routed through man)87 -586.8 R 2.906(yh)-.15 G .406(osts in the USENET)225.81 586.8 R 5.406(.A)-.74 G -.406(nd \214nally)322.804 586.8 R 2.905(,c)-.65 G .405(ertain \231mix)370.465 -586.8 R .405(ed domain\232 addresses)-.15 F -(are impossible to parse unambiguously \212 e.g.,)87 598.8 Q(decv)127 615 Q -(ax!ucb)-.25 E -.25(va)-.15 G(x!lbl-h!user@LBL-CSAM).25 E .378(might ha)87 -631.2 R .678 -.15(ve m)-.2 H(an).15 E 2.878(yp)-.15 G .379 -(ossible resolutions, depending on whether the message w)164.574 631.2 R .379 -(as \214rst routed to decv)-.1 F .379(ax or)-.25 F(to LBL-CSAM.)87 643.2 Q 2.32 --.8(To s)112 659.4 T(olv).8 E 3.22(et)-.15 G .72 -(his problem, the UUCP syntax w)152.49 659.4 R .719(ould ha)-.1 F 1.019 -.15 -(ve t)-.2 H 3.219(ob).15 G 3.219(ec)346.956 659.4 S .719 -(hanged to use addresses rather than)359.055 659.4 R 3.718(routes. F)87 671.4 R -1.218(or e)-.15 F 1.218(xample, the address \231decv)-.15 F(ax!ucb)-.25 E -.25 -(va)-.15 G 1.218(x!eric\232 might be e).25 F 1.218(xpressed as \231eric@ucb) --.15 F -.25(va)-.15 G(x.UUCP\232).25 E .079(\(with the hop through decv)87 -683.4 R .079(ax implied\).)-.25 F .079(This address w)5.079 F .078 -(ould itself be a domain-based address; for e)-.1 F(xam-)-.15 E -(ple, an address might be of the form:)87 695.4 Q(mark@d.cbosg.btl.UUCP)127 -711.6 Q F0 -1(Ve)72 756 S(rsion 8.2)1 E(USENIX \255 J)249.805 756 Q(an 83)-.15 -E(Last Mod 11/27/93)424.55 756 Q EP -%%Page: 7 7 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF(Mail Systems and Addr)72 60 Q(essing in 4.2bsd)-.18 E(7) -499 60 Q/F1 10/Times-Roman@0 SF .311(Hosts outside of Bell T)87 96 R .311 -(elephone Laboratories w)-.7 F .311(ould then only need to kno)-.1 F 2.811(wh) --.25 G .811 -.25(ow t)402.982 96 T 2.811(og).25 G .312(et to a designated) -433.354 96 R(BTL relay)87 108 Q 2.5(,a)-.65 G(nd the BTL topology w)137.17 108 -Q(ould only be maintained inside Bell.)-.1 E .543(There are three major proble\ -ms associated with turning UUCP addresses into something reason-)112 124.2 R -.465(able: de\214ning the namespace, creating and propag)87 136.2 R .465 -(ating the necessary softw)-.05 F .466(are, and b)-.1 F .466(uilding and main-) --.2 F(taining the database.)87 148.2 Q F0 2.5(4.1. De\214ning)87 172.2 R -(the Namespace)2.5 E F1 1.015(Putting all UUCP hosts into a \215at namespace \ -\(e.g., \231...@host.UUCP\232\) is not practical for a)127 188.4 R .222 -(number of reasons.)102 200.4 R .222(First, with o)5.222 F -.15(ve)-.15 G 2.722 -(r1).15 G .222(600 sites already)253.292 200.4 R 2.722(,a)-.65 G .222 -(nd \(with the increasing a)329.958 200.4 R -.25(va)-.2 G .222 -(ilability of ine).25 F(x-)-.15 E(pensi)102 212.4 Q 1.973 -.15(ve m)-.25 H -1.673(icrocomputers and autodialers\) se).15 F -.15(ve)-.25 G 1.672 -(ral thousand more coming within a fe).15 F 4.172(wy)-.25 G 1.672(ears, the) -469.008 212.4 R .078 -(database update problem is simply intractable if the namespace is \215at.)102 -224.4 R .078(Second, there are almost cer)5.078 F(-)-.2 E 2.446 -(tainly name con\215icts today)102 236.4 R 7.446(.T)-.65 G 2.446 -(hird, as the number of sites gro)232.794 236.4 R 4.946(wt)-.25 G 2.446 -(he names become e)386.316 236.4 R -.15(ve)-.25 G 4.946(rl).15 G(ess)491.78 -236.4 Q(mnemonic.)102 248.4 Q .534(It seems ine)127 264.6 R .535 -(vitable that there be some sort of naming authority for the set of top le)-.25 -F -.15(ve)-.25 G 3.035(ln).15 G(ames)483.45 264.6 Q .157 -(in the UUCP domain, as unpleasant a possibility as that may seem.)102 276.6 R -.157(It will simply not be possible to)5.157 F(ha)102 288.6 Q .536 -.15(ve o) --.2 H .236(ne host resolving all names.).15 F .236(It may ho)5.236 F(we)-.25 E --.15(ve)-.25 G 2.736(rb).15 G 2.736(ep)316.144 288.6 S .236 -(ossible to handle this in a f)328.32 288.6 R .237(ashion similar to)-.1 F -1.582(that of assigning names of ne)102 300.6 R 1.582(wsgroups in USENET)-.25 F -6.582(.H)-.74 G -.25(ow)334.758 300.6 S -2.15 -.25(ev e).25 H 2.382 -.4(r, i) -.25 H 4.082(tw).4 G 1.582(ill be essential to encourage)386.582 300.6 R -2.15 --.25(ev e)102 312.6 T .52(ryone to become subdomains of an e).25 F .52 -(xisting domain whene)-.15 F -.15(ve)-.25 G 3.02(rp).15 G .52(ossible \212 e) -374.85 312.6 R -.15(ve)-.25 G 3.02(nt).15 G .52(hough this will)442.95 312.6 R -.077(certainly bruise some e)102 324.6 R 2.577(gos. F)-.15 F .077(or e)-.15 F -.077(xample, if a ne)-.15 F 2.577(wh)-.25 G .076 -(ost named \231blid\232 were to be added to the UUCP)310.843 324.6 R(netw)102 -336.6 Q .65(ork, it w)-.1 F .651(ould probably actually be addressed as \231d.\ -bli.UUCP\232 \(i.e., as host \231d\232 in the pseudo-)-.1 F -(domain \231bli\232 rather than as host \231blid\232 in the UUCP domain\).)102 -348.6 Q F0 2.5(4.2. Cr)87 372.6 R(eating and Pr)-.18 E(opagating the Softwar) --.18 E(e)-.18 E F1 .078(The softw)127 388.8 R .078 -(are required to implement a consistent namespace is relati)-.1 F -.15(ve)-.25 -G .077(ly tri).15 F 2.577(vial. T)-.25 F .277 -.1(wo m)-.8 H(odules).1 E -(are needed, one to handle incoming mail and one to handle outgoing mail.)102 -400.8 Q 1.136(The incoming module must be prepared to handle either old or ne) -127 417 R 3.636(ws)-.25 G 1.136(tyle addresses.)416.448 417 R(Ne)6.136 E(w-) --.25 E .025(style addresses can be passed through unchanged.)102 429 R .024 -(Old style addresses must be turned into ne)5.025 F 2.524(ws)-.25 G(tyle)489 -429 Q(addresses where possible.)102 441 Q 2.247 -(The outgoing module is slightly trickier)127 457.2 R 7.247(.I)-.55 G 4.747(tm) -309.932 457.2 S 2.247(ust do a database lookup on the recipient)325.239 457.2 R -.823(addresses \(passed on the command line\) to determine what hosts to send \ -the message to.)102 469.2 R .823(If those)5.823 F .023(hosts do not accept ne) -102 481.2 R .024(w-style addresses, it must transform all addresses in the hea\ -der of the message)-.25 F(into old style using the database lookup.)102 493.2 Q -1.197(Both of these modules are straightforw)127 509.4 R 1.197(ard e)-.1 F -1.197(xcept for the issue of modifying the header)-.15 F 6.197(.I)-.55 G(t) -501.22 509.4 Q .944 -(seems prudent to choose one format for the message headers.)102 521.4 R -.15 -(Fo)5.944 G 3.444(ran).15 G .944(umber of reasons, Berk)391.448 521.4 R(ele)-.1 -E(y)-.15 E .824(has elected to use the ARP)102 533.4 R .824 -(ANET protocols for message formats.)-.92 F(Ho)5.823 E(we)-.25 E -.15(ve)-.25 G -1.623 -.4(r, t).15 H .823(his protocol is some-).4 F(what dif)102 545.4 Q -(\214cult to parse.)-.25 E(Propag)127 561.6 Q 1.903(ation is some)-.05 F 1.903 -(what more dif)-.25 F 4.403(\214cult. There)-.25 F 1.903(are a lar)4.403 F -1.903(ge number of hosts connected to)-.18 F .812(UUCP that will w)102 573.6 R -.811(ant to run completely standard systems \(for v)-.1 F .811 -(ery good reasons\).)-.15 F .811(The strate)5.811 F .811(gy is)-.15 F -(not to con)102 585.6 Q -.15(ve)-.4 G(rt the entire netw).15 E -(ork \212 only enough of it it alle)-.1 E(viate the problem.)-.25 E F0 2.5 -(4.3. Building)87 609.6 R(and Maintaining the Database)2.5 E F1 .127 -(This is by f)127 625.8 R .127(ar the most dif)-.1 F .128(\214cult problem.) --.25 F 2.628(Ap)5.128 G .128(rototype for this database already e)309.736 625.8 -R .128(xists, b)-.15 F .128(ut it is)-.2 F -(maintained by hand and does not pretend to be complete.)102 637.8 Q .701(This\ - problem will be reduced considerably if people choose to group their hosts in\ -to subdo-)127 654 R 3.219(mains. This)102 666 R -.1(wo)3.219 G .719 -(uld require a global update only when a ne).1 F 3.22(wt)-.25 G .72(op le) -356.47 666 R -.15(ve)-.25 G 3.22(ld).15 G .72(omain joined the netw)396.95 666 -R(ork.)-.1 E 2.805(Am)102 678 S .305 -(essage to a host in a subdomain could simply be routed to a kno)119.805 678 R -.304(wn domain g)-.25 F(ate)-.05 E -.1(wa)-.25 G 2.804(yf).1 G .304(or further) -465.656 678 R 3.073(processing. F)102 690 R .573(or e)-.15 F .573(xample, the \ -address \231eric@a.bli.UUCP\232 might be routed to the \231bli\232 g)-.15 F -(ate)-.05 E -.1(wa)-.25 G 3.074(yf).1 G(or)495.67 690 Q(redistrib)102 702 Q -1.376(ution; ne)-.2 F 3.876(wh)-.25 G 1.375 -(osts could be added within BLI without notifying the rest of the w)187.632 702 -R 3.875(orld. Of)-.1 F(course, other hosts)102 714 Q/F2 10/Times-Italic@0 SF -(could)2.5 E F1(be noti\214ed as an ef)2.5 E(\214cienc)-.25 E 2.5(ym)-.15 G -(easure.)321.01 714 Q F0 -1(Ve)72 756 S(rsion 8.2)1 E(USENIX \255 J)249.805 756 -Q(an 83)-.15 E(Last Mod 11/27/93)424.55 756 Q EP -%%Page: 8 8 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Bold@0 SF(Mail Systems and Addr)72 60 Q(essing in 4.2bsd)-.18 E(8) -499 60 Q/F1 10/Times-Roman@0 SF .966(There may be more than one domain g)127 96 -R(ate)-.05 E -.1(wa)-.25 G 4.767 -.65(y. A).1 H .967 -(domain such as BTL, for instance, might)4.117 F(ha)102 108 Q .653 -.15(ve a d) --.2 H .353(ozen g).15 F(ate)-.05 E -.1(wa)-.25 G .353(ys to the outside w).1 F -.352(orld; a non-BTL site could choose the closest g)-.1 F(ate)-.05 E -.1(wa) --.25 G 4.152 -.65(y. T).1 H(he).65 E .308(only restriction w)102 120 R .308 -(ould be that all g)-.1 F(ate)-.05 E -.1(wa)-.25 G .308 -(ys maintain a consistent vie).1 F 2.808(wo)-.25 G 2.808(ft)390.998 120 S .308 -(he domain the)399.916 120 R 2.808(yr)-.15 G(epresent.)468.18 120 Q F0 2.5 -(4.4. Logical)87 144 R(Structur)2.5 E(e)-.18 E F1(Logically)127 160.2 Q 3.803 -(,d)-.65 G 1.303(omains are or)175.983 160.2 R -.05(ga)-.18 G 1.303 -(nized into a tree.).05 F 1.303(There need not be a host actually associated) -6.303 F .462(with each le)102 172.2 R -.15(ve)-.25 G 2.962(li).15 G 2.962(nt) -168.806 172.2 S .462(he tree \212 for e)179.548 172.2 R .462 -(xample, there will be no host associated with the name \231UUCP)-.15 F -.7 -<2e9a>-1.11 G(Similarly)102 184.2 Q 3.115(,a)-.65 G 3.115(no)148.635 184.2 S --2.19 -.18(rg a)161.75 184.2 T .614 -(nization might group names together for administrati).18 F .914 -.15(ve r)-.25 -H .614(easons; for e).15 F .614(xample, the)-.15 F(name)102 196.2 Q -(CAD.research.BigCorp.UUCP)142 212.4 Q(might not actually ha)102 228.6 Q .3 --.15(ve a h)-.2 H(ost representing \231research.).15 E<9a>-.7 E(Ho)127 244.8 Q -(we)-.25 E -.15(ve)-.25 G 1.531 -.4(r, i).15 H 3.231(tm).4 G .731 -(ay frequently be con)184.902 244.8 R -.15(ve)-.4 G .731(nient to ha).15 F -1.031 -.15(ve a h)-.2 H .732(ost or hosts that \231represent\232 a domain.).15 -F -.15(Fo)102 256.8 S 3.466(re).15 G .966(xample, if a single host e)123.496 -256.8 R .966(xists that represents Berk)-.15 F(ele)-.1 E 2.266 -.65(y, t)-.15 H -.966(hen mail from outside Berk).65 F(ele)-.1 E 3.466(yc)-.15 G(an)494.56 256.8 -Q(forw)102 268.8 Q .796 -(ard mail to that host for further resolution without kno)-.1 F .796(wing Berk) --.25 F(ele)-.1 E(y')-.15 E 3.296(s\()-.55 G .797(rather v)417.066 268.8 R .797 -(olatile\) topol-)-.2 F(ogy)102 280.8 Q 5(.T)-.65 G(his is not unlik)129.96 -280.8 Q 2.5(et)-.1 G(he operation of the telephone netw)198.76 280.8 Q(ork.)-.1 -E .053(This may also be useful inside certain lar)127 297 R .053(ge domains.) --.18 F -.15(Fo)5.053 G 2.553(re).15 G .053(xample, at Berk)365.352 297 R(ele) --.1 E 2.553(yi)-.15 G 2.553(tm)450.801 297 S .053(ay be pre-)463.914 297 R .722 -(sumed that most hosts kno)102 309 R 3.222(wa)-.25 G .722 -(bout other hosts inside the Berk)225.64 309 R(ele)-.1 E 3.223(yd)-.15 G 3.223 -(omain. But)380.825 309 R .723(if the)3.223 F 3.223(yp)-.15 G .723(rocess an) -466.347 309 R .405(address that is unkno)102 321 R .405(wn, the)-.25 F 2.905 -(yc)-.15 G .405(an pass it \231upstairs\232 for further e)229.165 321 R 2.905 -(xamination. Thus)-.15 F .405(as ne)2.905 F 2.905(wh)-.25 G .405(osts are) -473.325 321 R .488(added only one host \(the domain master\))102 333 R/F2 10 -/Times-Italic@0 SF(must)2.989 E F1 .489 -(be updated immediately; other hosts can be updated)2.989 F(as con)102 345 Q --.15(ve)-.4 G(nient.).15 E .583(Ideally this name resolution process w)127 -361.2 R .583(ould be performed by a name serv)-.1 F .582 -(er \(e.g., [Su82b]\) to)-.15 F -.2(avo)102 373.2 S .507(id unnecessary cop).2 -F .507(ying of the message.)-.1 F(Ho)5.507 E(we)-.25 E -.15(ve)-.25 G 1.307 -.4 -(r, i).15 H 3.007(nab).4 G .507(atch netw)346.623 373.2 R .508 -(ork such as UUCP this could)-.1 F(result in unnecessary delays.)102 385.2 Q F0 -2.5(5. COMP)72 409.2 R(ARISON WITH DELIVERMAIL)-.74 E F2(Sendmail)112 425.4 Q -F1(is an outgro)2.5 E(wth of)-.25 E F2(delivermail)2.5 E F1 5(.T)C -(he primary dif)286.18 425.4 Q(ferences are:)-.25 E 12.5(\(1\) Con\214guration) -92 441.6 R .573(information is not compiled in.)3.073 F .572 -(This change simpli\214es man)5.572 F 3.072(yo)-.15 G 3.072(ft)433.684 441.6 S -.572(he problems of)442.866 441.6 R(mo)118.66 453.6 Q(ving to other machines.) --.15 E(It also allo)5 E(ws easy deb)-.25 E(ugging of ne)-.2 E 2.5(wm)-.25 G -(ailers.)388.06 453.6 Q 12.5(\(2\) Address)92 469.8 R .491 -(parsing is more \215e)2.991 F 2.991(xible. F)-.15 F .491(or e)-.15 F(xample,) --.15 E F2(delivermail)2.992 E F1 .492(only supported one g)2.992 F(ate)-.05 E --.1(wa)-.25 G 2.992(yt).1 G 2.992(oa)481.718 469.8 S -.15(ny)494.15 469.8 S -(netw)118.66 481.8 Q(ork, whereas)-.1 E F2(sendmail)2.5 E F1(can be sensiti)2.5 -E .3 -.15(ve t)-.25 H 2.5(oh).15 G(ost names and reroute to dif)310.9 481.8 Q -(ferent g)-.25 E(ate)-.05 E -.1(wa)-.25 G(ys.).1 E 12.5(\(3\) F)92 498 R(orw) --.15 E 2.878(arding and :include: features eliminate the requirement that the \ -system alias \214le be)-.1 F 1.073(writable by an)118.66 510 R 3.573(yu)-.15 G -1.073 -(ser \(or that an update program be written, or that the system administration) -191.439 510 R(mak)118.66 522 Q 2.5(ea)-.1 G(ll changes\).)147.16 522 Q(\(4\))92 -538.2 Q F2(Sendmail)118.66 538.2 Q F1 .443 -(supports message batching across netw)2.944 F .443 -(orks when a message is being sent to multiple)-.1 F(recipients.)118.66 550.2 Q -12.5(\(5\) A)92 566.4 R 1.945(mail queue is pro)4.445 F 1.946(vided in)-.15 F -F2(sendmail.)4.446 E F1 1.946(Mail that cannot be deli)6.946 F -.15(ve)-.25 G -1.946(red immediately b).15 F 1.946(ut can)-.2 F .439(potentially be deli) -118.66 578.4 R -.15(ve)-.25 G .438 -(red later is stored in this queue for a later retry).15 F 5.438(.T)-.65 G .438 -(he queue also pro)404.088 578.4 R .438(vides a)-.15 F -.2(bu)118.66 590.4 S --.25(ff).2 G .838(er ag).25 F .839(ainst system crashes; after the message has\ - been collected it may be reliably redeli)-.05 F(v-)-.25 E(ered e)118.66 602.4 -Q -.15(ve)-.25 G 2.5(ni).15 G 2.5(ft)162.13 602.4 S -(he system crashes during the initial deli)170.74 602.4 Q -.15(ve)-.25 G(ry).15 -E(.)-.65 E(\(6\))92 618.6 Q F2(Sendmail)118.66 618.6 Q F1 1.351(uses the netw) -3.851 F 1.351(orking support pro)-.1 F 1.351(vided by 4.2BSD to pro)-.15 F 1.35 -(vide a direct interf)-.15 F 1.35(ace net-)-.1 F -.1(wo)118.66 630.6 S .283 -(rks such as the ARP).1 F .284 -(ANET and/or Ethernet using SMTP \(the Simple Mail T)-.92 F .284 -(ransfer Protocol\))-.35 F -.15(ove)118.66 642.6 S 2.5(raT).15 G -(CP/IP connection.)151.68 642.6 Q F0 -1(Ve)72 756 S(rsion 8.2)1 E -(USENIX \255 J)249.805 756 Q(an 83)-.15 E(Last Mod 11/27/93)424.55 756 Q EP -%%Page: 9 9 -%%BeginPageSetup -BP -%%EndPageSetup -/F0 10/Times-Roman@0 SF(REFERENCES)264.105 132 Q([Crock)87 148.2 Q 56.73 -(er77] Crock)-.1 F(er)-.1 E 3.535(,D)-.4 G 3.535(.H)239.965 148.2 S 1.035(., V) -253.22 148.2 R 1.035(ittal, J. J., Pogran, K. T)-.6 F 1.035 -(., and Henderson, D. A. Jr)-.74 F(.,)-.55 E/F1 10/Times-Italic@0 SF(Stan-) -3.535 E(dar)195 160.2 Q 2.627(df)-.37 G .127(or the F)218.927 160.2 R .127 -(ormat of ARP)-1.05 F 2.627(AN)-.9 G .128(etwork T)320.112 160.2 R -.2(ex)-.92 -G 2.628(tM).2 G(essa)377.018 160.2 Q -.1(ge)-.1 G(s.).1 E F0 .128 -(RFC 733, NIC 41952.)5.128 F(In [Feinler78].)195 172.2 Q(No)5 E -.15(ve)-.15 G -(mber 1977.).15 E([Crock)87 188.4 Q 56.73(er82] Crock)-.1 F(er)-.1 E 4.272(,D) --.4 G 4.272(.H)240.702 188.4 S(.,)254.694 188.4 Q F1(Standar)4.272 E 4.272(df) --.37 G 1.772(or the F)307.318 188.4 R 1.772(ormat of Arpa Internet T)-1.05 F --.2(ex)-.92 G 4.271(tM).2 G(essa)471.15 188.4 Q -.1(ge)-.1 G(s.).1 E F0 .025 -(RFC 822.)195 200.4 R(Netw)5.025 E .025(ork Information Center)-.1 F 2.526(,S) --.4 G .026(RI International, Menlo P)363.506 200.4 R .026(ark, Cali-)-.15 F 2.5 -(fornia. August)195 212.4 R(1982.)2.5 E 60.51([Feinler78] Feinler)87 228.6 R -2.938(,E)-.4 G .438(., and Postel, J.)234.478 228.6 R(\(eds.\),)5.438 E F1(ARP) -2.938 E .438(ANET Pr)-.9 F .438(otocol Handbook.)-.45 F F0 .438(NIC 7104,)5.438 -F(Netw)195 240.6 Q 3.011(ork Information Center)-.1 F 5.511(,S)-.4 G 3.012 -(RI International, Menlo P)328.513 240.6 R 3.012(ark, California.)-.15 F(1978.) -195 252.6 Q([No)87 268.8 Q 59.65(witz78] No)-.25 F .479 -(witz, D. A., and Lesk, M. E.,)-.25 F F1 2.978(AD)2.978 G .478 -(ial-Up Network of UNIX Systems.)344.67 268.8 R F0(Bell)5.478 E 3.528 -(Laboratories. In)195 280.8 R 1.029(UNIX Programmer')3.528 F 3.529(sM)-.55 G -1.029(anual, Se)363.524 280.8 R -.15(ve)-.25 G 1.029(nth Edition, V).15 F 1.029 -(olume 2.)-1.29 F(August, 1978.)195 292.8 Q 55.5([Schmidt79] Schmidt,)87 309 R -(E.,)2.631 E F1 .131(An Intr)2.631 F .131(oduction to the Berk)-.45 F(ele)-.1 E -2.631(yN)-.3 G(etwork.)382.277 309 Q F0(Uni)5.131 E -.15(ve)-.25 G .131 -(rsity of Califor).15 F(-)-.2 E(nia, Berk)195 321 Q(ele)-.1 E 2.5(yC)-.15 G 2.5 -(alifornia. 1979.)257.24 321 R 59.95([Shoens79] Shoens,)87 337.2 R(K.,)3.227 E -F1 .728(Mail Refer)3.227 F .728(ence Manual.)-.37 F F0(Uni)5.728 E -.15(ve)-.25 -G .728(rsity of California, Berk).15 F(ele)-.1 E 4.528 -.65(y. I)-.15 H(n).65 E -3.478(UNIX Programmer')195 349.2 R 5.977(sM)-.55 G 3.477(anual, Se)297.495 -349.2 R -.15(ve)-.25 G 3.477(nth Edition, V).15 F 3.477(olume 2C.)-1.29 F -(December)8.477 E(1979.)195 361.2 Q 52.72([Solomon81] Solomon,)87 377.4 R .251 -(M., Landweber)2.75 F 2.751(,L)-.4 G .251(., and Neuhengen, D.,)308.952 377.4 R -F1 .251(The Design of the CSNET)2.751 F .397(Name Server)195 389.4 R(.)-1.11 E -F0 2.896(CS-DN-2. Uni)5.397 F -.15(ve)-.25 G .396(rsity of W).15 F .396 -(isconsin, Madison.)-.4 F .396(October 1981.)5.396 F 73.84([Su82a] Su,)87 405.6 -R(Za)2.844 E .344(w-Sing, and Postel, Jon,)-.15 F F1 .344 -(The Domain Naming Con)2.844 F .344(vention for Internet)-.4 F 2.71 -(User Applications.)195 417.6 R F0 5.21(RFC819. Netw)7.71 F 2.71 -(ork Information Center)-.1 F 5.21(,S)-.4 G 2.71(RI Interna-)457.14 417.6 R -(tional, Menlo P)195 429.6 Q(ark, California.)-.15 E(August 1982.)5 E 73.28 -([Su82b] Su,)87 445.8 R(Za)4.174 E(w-Sing,)-.15 E F1 4.174(AD)4.174 G(istrib) -275.702 445.8 Q 1.675(uted System for Internet Name Service)-.2 F(.)-.15 E F0 -(RFC830.)6.675 E(Netw)195 457.8 Q 3.012(ork Information Center)-.1 F 5.512(,S) --.4 G 3.011(RI International, Menlo P)328.516 457.8 R 3.011(ark, California.) --.15 F(October 1982.)195 469.8 Q/F2 10/Times-Bold@0 SF(Mail Systems and Addr)72 -756 Q(essing in 4.2bsd)-.18 E(9)499 756 Q EP -%%Trailer -end -%%EOF diff --git a/usr.sbin/sendmail/mailstats/mailstats.c b/usr.sbin/sendmail/mailstats/mailstats.c index 1e11b014cd08a..97ec33be7e92a 100644 --- a/usr.sbin/sendmail/mailstats/mailstats.c +++ b/usr.sbin/sendmail/mailstats/mailstats.c @@ -40,7 +40,7 @@ static char copyright[] = #endif /* not lint */ #ifndef lint -static char sccsid[] = "@(#)mailstats.c 8.3 (Berkeley) 12/27/93"; +static char sccsid[] = "@(#)mailstats.c 8.4 (Berkeley) 8/14/94"; #endif /* not lint */ #include <sendmail.h> @@ -126,14 +126,32 @@ main(argc, argv) break; case 'O': /* option -- see if .st file */ - if (*b++ != 'S') + if (strncasecmp(b, " StatusFile", 11) == 0 && + !isalnum(b[11])) + { + /* new form -- find value */ + b = strchr(b, '='); + if (b == NULL) + continue; + while (isspace(*++b)) + continue; + } + else if (*b++ != 'S') + { + /* something else boring */ continue; + } - /* yep -- save this */ + /* this is the S or StatusFile option -- save it */ strcpy(sfilebuf, b); - b = strchr(sfilebuf, '\n'); - if (b != NULL) - *b = '\0'; + b = strchr(sfilebuf, '#'); + if (b == NULL) + b = strchr(sfilebuf, '\n'); + if (b == NULL) + b = &sfilebuf[strlen(sfilebuf)]; + while (isspace(*--b)) + continue; + *++b = '\0'; if (sfile == NULL) sfile = sfilebuf; diff --git a/usr.sbin/sendmail/makemap/Makefile b/usr.sbin/sendmail/makemap/Makefile index c4ac74eaea4d6..1cc9b5970d215 100644 --- a/usr.sbin/sendmail/makemap/Makefile +++ b/usr.sbin/sendmail/makemap/Makefile @@ -2,7 +2,7 @@ PROG= makemap MAN8= makemap.8 -CFLAGS+=-I${.CURDIR}/../src -DNDBM -DNEWDB +CFLAGS+=-I${.CURDIR}/../src -DNEWDB .include "../../Makefile.inc" .include <bsd.prog.mk> diff --git a/usr.sbin/sendmail/makemap/Makefile.dist b/usr.sbin/sendmail/makemap/Makefile.dist deleted file mode 100644 index 3e7817a2658b3..0000000000000 --- a/usr.sbin/sendmail/makemap/Makefile.dist +++ /dev/null @@ -1,81 +0,0 @@ -# -# 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 diff --git a/usr.sbin/sendmail/makemap/makemap.8 b/usr.sbin/sendmail/makemap/makemap.8 index 2ee45c2dd869d..23ac522a568fe 100644 --- a/usr.sbin/sendmail/makemap/makemap.8 +++ b/usr.sbin/sendmail/makemap/makemap.8 @@ -29,7 +29,7 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" @(#)makemap.8 8.2 (Berkeley) 9/22/93 +.\" @(#)makemap.8 8.3 (Berkeley) 7/24/94 .\" .Dd November 16, 1992 .Dt MAKEMAP 8 @@ -40,6 +40,7 @@ .Sh SYNOPSIS .Nm .Op Fl N +.Op Fl d .Op Fl f .Op Fl o .Op Fl r @@ -98,6 +99,11 @@ Include the null byte that terminates strings in the map. This must match the \-N flag in the sendmail.cf ``K'' line. +.It Fl d +Allow duplicate keys in the map. +This is only allowed on B-Tree format maps. +If two identical keys are read, +they will both be inserted into the map. .It Fl f Normally all upper case letters in the key are folded to lower case. diff --git a/usr.sbin/sendmail/makemap/makemap.c b/usr.sbin/sendmail/makemap/makemap.c index 14548bd2b50ab..c48a1c971360a 100644 --- a/usr.sbin/sendmail/makemap/makemap.c +++ b/usr.sbin/sendmail/makemap/makemap.c @@ -33,15 +33,18 @@ */ #ifndef lint -static char sccsid[] = "@(#)makemap.c 8.6.1.1 (Berkeley) 3/6/95"; +static char sccsid[] = "@(#)makemap.c 8.14 (Berkeley) 11/5/95"; #endif /* not lint */ #include <stdio.h> #include <sysexits.h> #include <sys/types.h> -#include <sys/file.h> #include <ctype.h> #include <string.h> +#include <sys/errno.h> +#ifndef ISC_UNIX +# include <sys/file.h> +#endif #include "useful.h" #include "conf.h" @@ -80,6 +83,7 @@ main(argc, argv) bool inclnull = FALSE; bool notrunc = FALSE; bool allowreplace = FALSE; + bool allowdups = FALSE; bool verbose = FALSE; bool foldcase = TRUE; int exitstat; @@ -87,10 +91,12 @@ main(argc, argv) char *typename; char *mapname; char *ext; + char *lext; int lineno; int st; int mode; enum type type; + int fd; union { #ifdef NDBM @@ -102,14 +108,19 @@ main(argc, argv) void *dbx; } dbp; union dbent key, val; +#ifdef NEWDB + BTREEINFO bti; +#endif char ibuf[BUFSIZE]; char fbuf[MAXNAME]; + char lbuf[MAXNAME]; extern char *optarg; extern int optind; + extern bool lockfile(); progname = argv[0]; - while ((opt = getopt(argc, argv, "Nforv")) != EOF) + while ((opt = getopt(argc, argv, "Ndforv")) != EOF) { switch (opt) { @@ -117,6 +128,10 @@ main(argc, argv) inclnull = TRUE; break; + case 'd': + allowdups = TRUE; + break; + case 'f': foldcase = FALSE; break; @@ -148,10 +163,12 @@ main(argc, argv) typename = argv[0]; mapname = argv[1]; ext = NULL; + lext = NULL; if (strcmp(typename, "dbm") == 0) { type = T_DBM; + lext = ".dir"; } else if (strcmp(typename, "btree") == 0) { @@ -170,7 +187,7 @@ main(argc, argv) switch (type) { case T_ERR: - fprintf(stderr, "Usage: %s [-N] [-o] [-v] type mapname\n", progname); + fprintf(stderr, "Usage: %s [-N] [-d] [-f] [-o] [-r] [-v] type mapname\n", progname); exit(EX_USAGE); case T_UNKNOWN: @@ -188,6 +205,26 @@ main(argc, argv) fprintf(stderr, "%s: Type %s not supported in this version\n", progname, typename); exit(EX_UNAVAILABLE); + +#ifdef NEWDB + case T_BTREE: + bzero(&bti, sizeof bti); + if (allowdups) + bti.flags |= R_DUP; + break; + + case T_HASH: +#endif +#ifdef NDBM + case T_DBM: +#endif + if (allowdups) + { + fprintf(stderr, "%s: Type %s does not support -d (allow dups)\n", + progname, typename); + exit(EX_UNAVAILABLE); + } + break; } /* @@ -208,6 +245,10 @@ main(argc, argv) } } + strcpy(lbuf, mapname); + if (lext != NULL) + strcat(lbuf, lext); + /* ** Create the database. */ @@ -215,6 +256,19 @@ main(argc, argv) mode = O_RDWR; if (!notrunc) mode |= O_CREAT|O_TRUNC; +#ifdef O_EXLOCK + mode |= O_EXLOCK; +#else + /* pre-lock the database */ + fd = open(lbuf, mode & ~O_TRUNC, 0644); + if (fd < 0) + { + fprintf(stderr, "%s: cannot create type %s map %s\n", + progname, typename, mapname); + exit(EX_CANTCREAT); + } + (void) lockfile(fd); +#endif switch (type) { #ifdef NDBM @@ -227,13 +281,25 @@ main(argc, argv) case T_HASH: dbp.db = dbopen(mapname, mode, 0644, DB_HASH, NULL); if (dbp.db != NULL) + { +# if OLD_NEWDB + (void) (*dbp.db->sync)(dbp.db); +# else (void) (*dbp.db->sync)(dbp.db, 0); +# endif + } break; case T_BTREE: - dbp.db = dbopen(mapname, mode, 0644, DB_BTREE, NULL); + dbp.db = dbopen(mapname, mode, 0644, DB_BTREE, &bti); if (dbp.db != NULL) + { +# if OLD_NEWDB + (void) (*dbp.db->sync)(dbp.db); +# else (void) (*dbp.db->sync)(dbp.db, 0); +# endif + } break; #endif @@ -244,7 +310,7 @@ main(argc, argv) if (dbp.dbx == NULL) { - fprintf(stderr, "%s: cannot create type %s map %s\n", + fprintf(stderr, "%s: cannot open type %s map %s\n", progname, typename, mapname); exit(EX_CANTCREAT); } @@ -373,5 +439,58 @@ main(argc, argv) #endif } +#ifndef O_EXLOCK + /* release locks */ + close(fd); +#endif + exit (exitstat); } +/* +** LOCKFILE -- lock a file using flock or (shudder) fcntl locking +** +** Parameters: +** fd -- the file descriptor of the file. +** +** Returns: +** TRUE if the lock was acquired. +** FALSE otherwise. +*/ + +bool +lockfile(fd) + int fd; +{ +# if !HASFLOCK + int action; + struct flock lfd; + extern int errno; + + bzero(&lfd, sizeof lfd); + lfd.l_type = F_WRLCK; + action = F_SETLKW; + + if (fcntl(fd, action, &lfd) >= 0) + return TRUE; + + /* + ** On SunOS, if you are testing using -oQ/tmp/mqueue or + ** -oA/tmp/aliases or anything like that, and /tmp is mounted + ** as type "tmp" (that is, served from swap space), the + ** previous fcntl will fail with "Invalid argument" errors. + ** Since this is fairly common during testing, we will assume + ** that this indicates that the lock is successfully grabbed. + */ + + if (errno == EINVAL) + return TRUE; + +# else /* HASFLOCK */ + + if (flock(fd, LOCK_EX) >= 0) + return TRUE; + +# endif + + return FALSE; +} diff --git a/usr.sbin/sendmail/praliases/Makefile.dist b/usr.sbin/sendmail/praliases/Makefile.dist deleted file mode 100644 index a7b07f4c7f80c..0000000000000 --- a/usr.sbin/sendmail/praliases/Makefile.dist +++ /dev/null @@ -1,81 +0,0 @@ -# -# 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 diff --git a/usr.sbin/sendmail/src/Makefile b/usr.sbin/sendmail/src/Makefile index 83d363e7760cb..86ba9d51bbb5c 100644 --- a/usr.sbin/sendmail/src/Makefile +++ b/usr.sbin/sendmail/src/Makefile @@ -1,4 +1,9 @@ -# @(#)Makefile 8.4 (Berkeley) 2/3/94 +# @(#)Makefile 8.7 (Berkeley) 10/31/95 + +######################################################################### +# This Makefile is for 4.4BSD only!!! For all other systems, use # +# the "makesendmail" script. # +######################################################################### PROG= sendmail @@ -10,17 +15,17 @@ PROG= sendmail # 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 +DBMDEF= -DNEWDB -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 \ + mci.c mime.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= +DPADD= ${LIBUTIL} +LDADD= -lutil MAN1= mailq.1 newaliases.1 MAN5= aliases.5 MAN8= sendmail.8 @@ -28,15 +33,14 @@ LINKS= /usr/sbin/sendmail /usr/bin/newaliases \ /usr/sbin/sendmail /usr/bin/mailq BINDIR= /usr/sbin BINOWN= root -BINGRP= kmem -BINMODE=6555 +BINMODE=4555 beforeinstall: -# install -c -o ${BINOWN} -g ${BINGRP} -m 644 /dev/null \ +# ${INSTALL} -c -o ${BINOWN} -g ${BINGRP} -m 644 /dev/null \ # ${DESTDIR}/etc/sendmail.fc - install -c -o ${BINOWN} -g ${BINGRP} -m 644 /dev/null \ + ${INSTALL} -c -o ${BINOWN} -g ${BINGRP} -m 644 /dev/null \ ${DESTDIR}/var/log/sendmail.st - install -c -o ${BINOWN} -g ${BINGRP} -m 444 ${.CURDIR}/sendmail.hf \ + ${INSTALL} -c -o ${BINOWN} -g ${BINGRP} -m 444 ${.CURDIR}/sendmail.hf \ ${DESTDIR}/usr/share/misc .include <bsd.prog.mk> diff --git a/usr.sbin/sendmail/src/Makefile.386BSD b/usr.sbin/sendmail/src/Makefile.386BSD deleted file mode 100644 index 397ce8b67db6e..0000000000000 --- a/usr.sbin/sendmail/src/Makefile.386BSD +++ /dev/null @@ -1,42 +0,0 @@ -# @(#)Makefile.386BSD 8.1 (Berkeley) 2/26/94 - -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 - -CFLAGS+=-I${.CURDIR} ${DBMDEF} -DMIME - -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) -MAN1= newaliases.0 mailq.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 <bsd.prog.mk> diff --git a/usr.sbin/sendmail/src/Makefile.AIX b/usr.sbin/sendmail/src/Makefile.AIX deleted file mode 100644 index 5d3041d8e77d3..0000000000000 --- a/usr.sbin/sendmail/src/Makefile.AIX +++ /dev/null @@ -1,113 +0,0 @@ -# -# 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 AIX 3.1.5 and 3.2.3e. -# -# @(#)Makefile.AIX 8.3 (Berkeley) 4/11/94 -# - -# use O=-O (usual) or O=-g (debugging) -# you can use -O3 on AIX 3.2.4 or greater ONLY! -O= -g - -# 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 -DNEWDB -DNIS -# -# If you did not install the NEWDB on your AIX platform, use: -#DBMDEF=-DNDBM - -# environment definitions (e.g., -D_AIX3) -ENVDEF= -D_AIX3 - -# 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= -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 - -# 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= - -INSTALL=/usr/ucb/install - -################### 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/sbin/newaliases ${DESTDIR}/usr/sbin/mailq -BINOWN= root -BINGRP= system -BINMODE=6555 - -ALL= sendmail aliases.0 mailq.0 newaliases.0 sendmail.0 - -all: ${ALL} - -sendmail: ${BEFORE} ${OBJS} - ${CC} -o sendmail ${OBJS} ${LIBDIRS} ${LIBS} - -NROFF= nroff -h - -aliases.0: aliases.5 - ${NROFF} -mandoc aliases.5 > aliases.0 - -mailq.0: mailq.1 - ${NROFF} -mandoc mailq.1 > mailq.0 - -newaliases.0: newaliases.1 - ${NROFF} -mandoc newaliases.1 > newaliases.0 - -sendmail.0: sendmail.8 - ${NROFF} -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} -o ${BINOWN} -g ${BINGRP} -m 644 /dev/null \ - ${STDIR}/sendmail.st - ${INSTALL} -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 mailq.0 newaliases.0 sendmail.0 - -clean: - rm -f ${OBJS} sendmail aliases.0 mailq.0 newaliases.0 sendmail.0 - -# dependencies -# gross overkill, and yet still not quite enough.... -${OBJS}: sendmail.h conf.h diff --git a/usr.sbin/sendmail/src/Makefile.AUX b/usr.sbin/sendmail/src/Makefile.AUX deleted file mode 100644 index dc84b21da874e..0000000000000 --- a/usr.sbin/sendmail/src/Makefile.AUX +++ /dev/null @@ -1,105 +0,0 @@ -# -# 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.AUX 8.3 (Berkeley) 4/11/94 -# - -# 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=-I/usr/sww/include/db - -# loader options -LDOPTS= - -# library directories -LIBDIRS=-L/usr/sww/lib - -# libraries required on your system -LIBS= -ldbm -lposix - -# 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= - -################### 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 mailq.0 newaliases.0 sendmail.0 - -all: ${ALL} - -sendmail: ${BEFORE} ${OBJS} - ${CC} -o sendmail ${LDOPTS} ${OBJS} ${LIBDIRS} ${LIBS} - -NROFF= nroff -h - -aliases.0: aliases.5 - ${NROFF} -mandoc aliases.5 > aliases.0 - -mailq.0: mailq.1 - ${NROFF} -mandoc mailq.1 > mailq.0 - -newaliases.0: newaliases.1 - ${NROFF} -mandoc newaliases.1 > newaliases.0 - -sendmail.0: sendmail.8 - ${NROFF} -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 mailq.0 newaliases.0 sendmail.0 - -clean: - rm -f ${OBJS} sendmail aliases.0 mailq.0 newaliases.0 sendmail.0 - -# dependencies -# gross overkill, and yet still not quite enough.... -${OBJS}: sendmail.h conf.h diff --git a/usr.sbin/sendmail/src/Makefile.BSD43 b/usr.sbin/sendmail/src/Makefile.BSD43 deleted file mode 100644 index 4177c3b783b1e..0000000000000 --- a/usr.sbin/sendmail/src/Makefile.BSD43 +++ /dev/null @@ -1,123 +0,0 @@ -# -# 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 is based on work from Jim Oldroyd -- I believe he was -# using a fairly old Mt Xinu port. -# -# It should also work on UMIPS-BSD from MIPS, if you still have -# any lying around. -# -# @(#)Makefile.BSD43 8.3 (Berkeley) 4/11/94 -# - -# use O=-O (usual) or O=-g (debugging) -O= -O - -# 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= -DoldBSD43 - -# 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= -ldbm -lresolv -ll - -# 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= - -# additional pseudo-sources needed -BEFORE= unistd.h stddef.h stdlib.h dirent.h sys/time.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 mailq.0 newaliases.0 sendmail.0 - -all: ${ALL} - -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 <sys/dir.h>" > dirent.h - echo "#define dirent direct" >> dirent.h - -NROFF= nroff -h - -aliases.0: aliases.5 - ${NROFF} -mandoc aliases.5 > aliases.0 - -mailq.0: mailq.1 - ${NROFF} -mandoc mailq.1 > mailq.0 - -newaliases.0: newaliases.1 - ${NROFF} -mandoc newaliases.1 > newaliases.0 - -sendmail.0: sendmail.8 - ${NROFF} -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 mailq.0 newaliases.0 sendmail.0 - -clean: - rm -f ${OBJS} sendmail aliases.0 mailq.0 newaliases.0 sendmail.0 - -# dependencies -# gross overkill, and yet still not quite enough.... -${OBJS}: sendmail.h conf.h diff --git a/usr.sbin/sendmail/src/Makefile.BSDI b/usr.sbin/sendmail/src/Makefile.BSDI deleted file mode 100644 index a45016dd1c7aa..0000000000000 --- a/usr.sbin/sendmail/src/Makefile.BSDI +++ /dev/null @@ -1,32 +0,0 @@ -# @(#)Makefile.BSDI 8.1 (Berkeley) 2/26/94 - -PROG= sendmail -DBMDEF= -DNEWDB -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} ${LIBKVM} -LDADD= -lutil -lkvm -MAN1= mailq.0 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 <bsd.prog.mk> diff --git a/usr.sbin/sendmail/src/Makefile.CLIX b/usr.sbin/sendmail/src/Makefile.CLIX deleted file mode 100644 index 7e54e366d0381..0000000000000 --- a/usr.sbin/sendmail/src/Makefile.CLIX +++ /dev/null @@ -1,115 +0,0 @@ -# -# This makefile is for clipper-based Intergraph systems running CLIX. -# It and the defines supporting it in the source tree should be considered -# alpha-quality and used at own risk. -# -# Porting done for CICNet, Inc., on behalf the Michigan State Department -# of Natural Resources. -# -# --Paul Southworth <pauls@cic.net> -# -# @(#)Makefile.CLIX 8.1 (Berkeley) 4/12/94 -# - -# 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 - -# 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= -DCLIX - -# see also conf.h for additional compilation flags - -# include directories -INCDIRS= -I/usr/include - -# library directories -LIBDIRS= - -# libraries required on your system -LIBS= -lnsl -lbsd - -# 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= getusershell.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/bin/newaliases ${DESTDIR}/usr/bin/mailq -BINOWN= root -BINGRP= mail -BINMODE=6555 -INSTALL=cp - -ALL= sendmail # aliases.0 mailq.0 newaliases.0 sendmail.0 - -all: ${ALL} - -sendmail: ${BEFORE} ${OBJS} - ${CC} -o sendmail ${OBJS} ${LIBDIRS} ${LIBS} - -NROFF= nroff -h - -aliases.0: aliases.5 - ${NROFF} -mandoc aliases.5 > aliases.0 - -mailq.0: mailq.1 - ${NROFF} -mandoc mailq.1 > mailq.0 - -newaliases.0: newaliases.1 - ${NROFF} -mandoc newaliases.1 > newaliases.0 - -sendmail.0: sendmail.8 - ${NROFF} -mandoc sendmail.8 > sendmail.0 - -install: install-sendmail #install-docs - -install-sendmail: sendmail - #${INSTALL} -o ${BINOWN} -g ${BINGRP} -m ${BINMODE} sendmail ${BINDIR} - ${INSTALL} sendmail ${BINDIR} - chmod ${BINMODE} ${BINDIR}/sendmail - 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} /dev/null ${STDIR}/sendmail.st - #${INSTALL} -c -o ${BINOWN} -g ${BINGRP} -m 444 sendmail.hf ${HFDIR} - ${INSTALL} sendmail.hf ${HFDIR} - -# doesn't actually install them -- you may want to install pre-nroff versions -install-docs: aliases.0 mailq.0 newaliases.0 sendmail.0 - -clean: - rm -f ${OBJS} sendmail #aliases.0 mailq.0 newaliases.0 sendmail.0 - -# dependencies -# gross overkill, and yet still not quite enough.... -${OBJS}: sendmail.h conf.h diff --git a/usr.sbin/sendmail/src/Makefile.ConvexOS b/usr.sbin/sendmail/src/Makefile.ConvexOS deleted file mode 100644 index 82a77d5be9430..0000000000000 --- a/usr.sbin/sendmail/src/Makefile.ConvexOS +++ /dev/null @@ -1,105 +0,0 @@ -# -# 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 CxOS 11.0 beta 1 and 10.x. -# -# @(#)Makefile.ConvexOS 8.3 (Berkeley) 4/11/94 -# - - -# use O=-O (usual) or O=-g (debugging) -O= -g -tm c1 -D__STDC__ -d non_int_bit_field - -# 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 -DYPCOMPAT -DNIS - -# environment definitions (e.g., -D_AIX3) -ENVDEF= - -# 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= - -# 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 mailq.0 newaliases.0 sendmail.0 - -all: ${ALL} - -sendmail: ${BEFORE} ${OBJS} - ${CC} -o sendmail ${OBJS} ${LIBDIRS} ${LIBS} - -NROFF= nroff -h - -aliases.0: aliases.5 - ${NROFF} -mandoc aliases.5 > aliases.0 - -mailq.0: mailq.1 - ${NROFF} -mandoc mailq.1 > mailq.0 - -newaliases.0: newaliases.1 - ${NROFF} -mandoc newaliases.1 > newaliases.0 - -sendmail.0: sendmail.8 - ${NROFF} -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 mailq.0 newaliases.0 sendmail.0 - -clean: - rm -f ${OBJS} sendmail aliases.0 mailq.0 newaliases.0 sendmail.0 - -# dependencies -# gross overkill, and yet still not quite enough.... -${OBJS}: sendmail.h conf.h diff --git a/usr.sbin/sendmail/src/Makefile.DGUX b/usr.sbin/sendmail/src/Makefile.DGUX deleted file mode 100644 index d7f63af38575e..0000000000000 --- a/usr.sbin/sendmail/src/Makefile.DGUX +++ /dev/null @@ -1,101 +0,0 @@ -# -# Tested on DG/UX 5.4.2 by A. Bryan Curnutt <bryan@Stoner.COM>. -# -# @(#)Makefile.DGUX 8.3 (Berkeley) 4/11/94 -# - -# 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 mailq.0 newaliases.0 sendmail.0 - -all: ${ALL} - -sendmail: ${BEFORE} ${OBJS} - ${CC} -o sendmail ${LDOPTS} ${OBJS} ${LIBDIRS} ${LIBS} - -NROFF= nroff -h - -aliases.0: aliases.5 - ${NROFF} -mandoc aliases.5 > aliases.0 - -mailq.0: mailq.1 - ${NROFF} -mandoc mailq.1 > mailq.0 - -newaliases.0: newaliases.1 - ${NROFF} -mandoc newaliases.1 > newaliases.0 - -sendmail.0: sendmail.8 - ${NROFF} -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 mailq.0 newaliases.0 sendmail.0 - -clean: - rm -f ${OBJS} sendmail aliases.0 mailq.0 newaliases.0 sendmail.0 - -# dependencies -# gross overkill, and yet still not quite enough.... -${OBJS}: sendmail.h conf.h diff --git a/usr.sbin/sendmail/src/Makefile.Dell b/usr.sbin/sendmail/src/Makefile.Dell deleted file mode 100644 index 39bc1e8f15c1c..0000000000000 --- a/usr.sbin/sendmail/src/Makefile.Dell +++ /dev/null @@ -1,113 +0,0 @@ -# -# 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 -# <kim@grendel.lut.fi> -- I haven't tested this myself. It may -# work on other SVR4 ports. -# -# @(#)Makefile.Dell 8.3 (Berkeley) 4/11/94 -# - -# 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 -# -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 mailq.0 newaliases.0 sendmail.0 - -all: ${ALL} - -sendmail: ${BEFORE} ${OBJS} - ${CC} -o sendmail ${OBJS} ${LIBDIRS} ${LIBS} - -NROFF= nroff -h - -aliases.0: aliases.5 - ${NROFF} -mandoc aliases.5 > aliases.0 - -mailq.0: mailq.1 - ${NROFF} -mandoc mailq.1 > mailq.0 - -newaliases.0: newaliases.1 - ${NROFF} -mandoc newaliases.1 > newaliases.0 - -sendmail.0: sendmail.8 - ${NROFF} -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 mailq.0 newaliases.0 sendmail.0 - -clean: - rm -f ${OBJS} sendmail aliases.0 mailq.0 newaliases.0 sendmail.0 - -# dependencies -# gross overkill, and yet still not quite enough.... -${OBJS}: sendmail.h conf.h diff --git a/usr.sbin/sendmail/src/Makefile.DomainOS b/usr.sbin/sendmail/src/Makefile.DomainOS deleted file mode 100644 index 5564ecb4a9ed3..0000000000000 --- a/usr.sbin/sendmail/src/Makefile.DomainOS +++ /dev/null @@ -1,123 +0,0 @@ -# -# 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 DomainOS 10.3.5 -# -# @(#)Makefile.DomainOS 8.5 (Berkeley) 4/12/94 -# -# - -# 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 -# -DNDBM -DNEWDB -DYPCOMPAT -- use both plus YP compatility -# -DNIS -- include client NIS support -# The really old (V7) DBM library is no longer supported. -# If YPCOMPAT is defined and /var/yp/Makefile exists, sendmail will build -# both the NEWDB and DBM libraries (the DBM just for YP). -# - -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 -# You might want to use the BIND 4.9 resolver library here -#LIBS= -ldb -ldbm -LIBS= -ldbm -lresolv - -# 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= - -# additional pseudo-sources needed -BEFORE= unistd.h dirent.h - -################### end of user configuration flags ###################### - -CFLAGS= -I. -A nansi $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 mailq.0 newaliases.0 sendmail.0 - -all: ${ALL} - -sendmail: ${BEFORE} ${OBJS} - ${CC} -o sendmail ${LDOPTS} ${OBJS} ${LIBDIRS} ${LIBS} - -unistd.h: - cp /dev/null unistd.h - -dirent.h: - echo "#include <sys/dir.h>" > dirent.h - echo "#define dirent direct" >> dirent.h - -NROFF= nroff -h - -aliases.0: aliases.5 - ${NROFF} -mandoc aliases.5 > aliases.0 - -mailq.0: mailq.1 - ${NROFF} -mandoc mailq.1 > mailq.0 - -newaliases.0: newaliases.1 - ${NROFF} -mandoc newaliases.1 > newaliases.0 - -sendmail.0: sendmail.8 - ${NROFF} -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 mailq.0 newaliases.0 sendmail.0 - -clean: - rm -f ${OBJS} sendmail aliases.0 mailq.0 newaliases.0 sendmail.0 - -# dependencies -# gross overkill, and yet still not quite enough.... -${OBJS}: sendmail.h conf.h diff --git a/usr.sbin/sendmail/src/Makefile.Dynix b/usr.sbin/sendmail/src/Makefile.Dynix deleted file mode 100644 index 344a9b70df502..0000000000000 --- a/usr.sbin/sendmail/src/Makefile.Dynix +++ /dev/null @@ -1,113 +0,0 @@ -# -# Tested on Dynix 3.2.0. -# -# From Jim Davis <jdavis@cs.arizona.edu>. -# -# ``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.'' -# -# @(#)Makefile.Dynix 8.3 (Berkeley) 4/11/94 -# - -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 mailq.0 newaliases.0 sendmail.0 - -all: ${ALL} - -sendmail: ${BEFORE} ${OBJS} - ${CC} -o sendmail ${LDOPTS} ${OBJS} ${LIBDIRS} ${LIBS} - -NROFF= nroff -h - -aliases.0: aliases.5 - ${NROFF} -mandoc aliases.5 > aliases.0 - -mailq.0: mailq.1 - ${NROFF} -mandoc mailq.1 > mailq.0 - -newaliases.0: newaliases.1 - ${NROFF} -mandoc newaliases.1 > newaliases.0 - -sendmail.0: sendmail.8 - ${NROFF} -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 mailq.0 newaliases.0 sendmail.0 - -clean: - rm -f ${OBJS} sendmail aliases.0 mailq.0 newaliases.0 sendmail.0 - -# dependencies -# gross overkill, and yet still not quite enough.... -${OBJS}: sendmail.h conf.h diff --git a/usr.sbin/sendmail/src/Makefile.FreeBSD b/usr.sbin/sendmail/src/Makefile.FreeBSD deleted file mode 100644 index 3a94730db203d..0000000000000 --- a/usr.sbin/sendmail/src/Makefile.FreeBSD +++ /dev/null @@ -1,50 +0,0 @@ -# -# Makefile for FreeBSD -# -# @(#)Makefile.FreeBSD 8.1 (Berkeley) 2/26/94 - -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 -# (assuming you consider a slower "man" command a feature) -# -MAN1= mailq.1 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 <bsd.prog.mk> diff --git a/usr.sbin/sendmail/src/Makefile.HP-UX b/usr.sbin/sendmail/src/Makefile.HP-UX deleted file mode 100644 index c1b51ec12721b..0000000000000 --- a/usr.sbin/sendmail/src/Makefile.HP-UX +++ /dev/null @@ -1,105 +0,0 @@ -# -# 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 HP-UX 8.07 on 7xx series. -# -# @(#)Makefile.HP-UX 8.3 (Berkeley) 4/11/94 -# - -# use O=-O (usual) or O=-g (debugging) -# +O is OK on 7xx, and 300xx at 9.0 -O= +O1 - -# 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 -DNEWDB -DNIS - -# environment definitions (e.g., -D_AIX3) -ENVDEF= - -# 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= -ldb -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/bin/newaliases ${DESTDIR}/usr/bin/mailq -BINOWN= root -BINGRP= mail -BINMODE=6555 - -ALL= sendmail aliases.0 mailq.0 newaliases.0 sendmail.0 - -all: ${ALL} - -sendmail: ${BEFORE} ${OBJS} - ${CC} -o sendmail ${OBJS} ${LIBDIRS} ${LIBS} - -NROFF= nroff -h - -aliases.0: aliases.5 - ${NROFF} -mandoc aliases.5 > aliases.0 - -mailq.0: mailq.1 - ${NROFF} -mandoc mailq.1 > mailq.0 - -newaliases.0: newaliases.1 - ${NROFF} -mandoc newaliases.1 > newaliases.0 - -sendmail.0: sendmail.8 - ${NROFF} -mandoc sendmail.8 > sendmail.0 - -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 mailq.0 newaliases.0 sendmail.0 - -clean: - rm -f ${OBJS} sendmail aliases.0 mailq.0 newaliases.0 sendmail.0 - -# dependencies -# gross overkill, and yet still not quite enough.... -${OBJS}: sendmail.h conf.h diff --git a/usr.sbin/sendmail/src/Makefile.IRIX b/usr.sbin/sendmail/src/Makefile.IRIX deleted file mode 100644 index 30e8f1c7573ab..0000000000000 --- a/usr.sbin/sendmail/src/Makefile.IRIX +++ /dev/null @@ -1,109 +0,0 @@ -# -# 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 IRIX 4.0.4. -# -# @(#)Makefile.IRIX 8.4 (Berkeley) 4/11/94 -# -SHELL= /bin/sh - -# use O=-O (usual) or O=-g (debugging) -O= -O -CC=gcc - -# define the database mechanisms available for map & alias lookups: -# -DNDBM -- use new DBM -# -DNEWDB -- use new Berkeley DB (requires -ldb) -# -DNIS -- include NIS support (requires -lsun) -# 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= -DIRIX - -# see also conf.h for additional compilation flags - -# include directories -INCDIRS= - -# library directories -LIBDIRS= - -# libraries required on your system -LIBS= -lmld -#LIBS= -lsun -ldb -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}/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/bsd/newaliases ${DESTDIR}/usr/bsd/mailq -BINOWN= root -BINGRP= sys -BINMODE=6555 - -ALL= sendmail aliases.0 mailq.0 newaliases.0 sendmail.0 - -all: ${ALL} - -sendmail: ${BEFORE} ${OBJS} - ${CC} -o sendmail ${OBJS} ${LIBDIRS} ${LIBS} - -NROFF= nroff -h - -aliases.0: aliases.5 - ${NROFF} -mandoc aliases.5 > aliases.0 - -mailq.0: mailq.1 - ${NROFF} -mandoc mailq.1 > mailq.0 - -newaliases.0: newaliases.1 - ${NROFF} -mandoc newaliases.1 > newaliases.0 - -sendmail.0: sendmail.8 - ${NROFF} -mandoc sendmail.8 > sendmail.0 - -install: install-sendmail install-docs - -install-sendmail: sendmail - install -u ${BINOWN} -g ${BINGRP} -m ${BINMODE} -f ${BINDIR} sendmail - 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} ${STDIR}/sendmail.st - chgrp ${BINGRP} ${STDIR}/sendmail.st - install -u ${BINOWN} -g ${BINGRP} -m 444 -f ${HFDIR} sendmail.hf - -# doesn't actually install them -- you may want to install pre-nroff versions -install-docs: aliases.0 mailq.0 newaliases.0 sendmail.0 - -clean: - rm -f ${OBJS} sendmail aliases.0 mailq.0 newaliases.0 sendmail.0 - -# dependencies -# gross overkill, and yet still not quite enough.... -${OBJS}: sendmail.h conf.h diff --git a/usr.sbin/sendmail/src/Makefile.Linux b/usr.sbin/sendmail/src/Makefile.Linux deleted file mode 100644 index 3c8f3e56ddc69..0000000000000 --- a/usr.sbin/sendmail/src/Makefile.Linux +++ /dev/null @@ -1,120 +0,0 @@ -# -# 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 Linux 0.99p10. -# -# Linux doesn't really have standard places to install things, so this -# Makefile is likely to require a lot of customization. Read it over -# carefully before proceeding. -# -# @(#)Makefile.Linux 8.7 (Berkeley) 4/11/94 -# - -# 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=-I/usr/local/include - -# library directories -LIBDIRS=-L/usr/local/lib - -# libraries required on your system -LIBS= -lndbm - -# 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}/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= - -################### 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/bin/newaliases ${DESTDIR}/usr/bin/mailq -BINOWN= root -BINGRP= kmem -BINMODE=6555 - -ALL= sendmail aliases.0 mailq.0 newaliases.0 sendmail.0 - -all: ${ALL} - -sendmail: ${BEFORE} ${OBJS} - ${CC} -o sendmail ${OBJS} ${LIBDIRS} ${LIBS} - -unistd.h: - cp /dev/null unistd.h - -dirent.h: - echo "#include <sys/dir.h>" > dirent.h - echo "#define dirent direct" >> dirent.h - -NROFF= nroff - -aliases.0: aliases.5 - ${NROFF} -mandoc aliases.5 > aliases.0 - -mailq.0: mailq.1 - ${NROFF} -mandoc mailq.1 > mailq.0 - -newaliases.0: newaliases.1 - ${NROFF} -mandoc newaliases.1 > newaliases.0 - -sendmail.0: sendmail.8 - ${NROFF} -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 - cp /dev/null ${STDIR}/sendmail.st - chmod 644 ${STDIR}/sendmail.st - chown ${BINOWN} ${STDIR}/sendmail.st - chgrp ${BINGRP} ${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 mailq.0 newaliases.0 sendmail.0 - -clean: - rm -f ${OBJS} sendmail aliases.0 mailq.0 newaliases.0 sendmail.0 - -# dependencies -# gross overkill, and yet still not quite enough.... -${OBJS}: sendmail.h conf.h diff --git a/usr.sbin/sendmail/src/Makefile.Mach386 b/usr.sbin/sendmail/src/Makefile.Mach386 deleted file mode 100644 index eaed6cabbf7cc..0000000000000 --- a/usr.sbin/sendmail/src/Makefile.Mach386 +++ /dev/null @@ -1,107 +0,0 @@ -# -# 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.Mach386 8.3 (Berkeley) 4/11/94 -# - -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 mailq.0 newaliases.0 sendmail.0 - -all: ${ALL} - -sendmail: ${BEFORE} ${OBJS} - ${CC} -o sendmail ${LDOPTS} ${OBJS} ${LIBDIRS} ${LIBS} - -NROFF= nroff -h - -aliases.0: aliases.5 - ${NROFF} -mandoc aliases.5 > aliases.0 - -mailq.0: mailq.1 - ${NROFF} -mandoc mailq.1 > mailq.0 - -newaliases.0: newaliases.1 - ${NROFF} -mandoc newaliases.1 > newaliases.0 - -sendmail.0: sendmail.8 - ${NROFF} -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 mailq.0 newaliases.0 sendmail.0 - -clean: - rm -f ${OBJS} sendmail aliases.0 mailq.0 newaliases.0 sendmail.0 - -# dependencies -# gross overkill, and yet still not quite enough.... -${OBJS}: sendmail.h conf.h diff --git a/usr.sbin/sendmail/src/Makefile.NCR3000 b/usr.sbin/sendmail/src/Makefile.NCR3000 deleted file mode 100644 index a55695142c005..0000000000000 --- a/usr.sbin/sendmail/src/Makefile.NCR3000 +++ /dev/null @@ -1,109 +0,0 @@ -# -# 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). -# -# NCR 3000 support from Kevin Darcy <kevin@tech.mis.cfc.com>. -# -# @(#)Makefile.NCR3000 8.2 (Berkeley) 4/16/94 -# - -# 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= -DNCR3000 - -# see also conf.h for additional compilation flags - -# include directories -INCDIRS=-I/usr/ucbinclude - -# loader options -LDOPTS= - -# library directories -LIBDIRS=-L/usr/ucblib - -# libraries required on your system -LIBS= -lsocket -lc -lelf -lucb -ldbm -lnet -lnsl - -# 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}/var/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= kmem -BINMODE=6555 - -ALL= sendmail aliases.0 mailq.0 newaliases.0 sendmail.0 - -all: ${ALL} - -sendmail: ${BEFORE} ${OBJS} - ${CC} -o sendmail ${LDOPTS} ${OBJS} ${LIBDIRS} ${LIBS} - -NROFF= nroff -h - -aliases.0: aliases.5 - ${NROFF} -mandoc aliases.5 > aliases.0 - -mailq.0: mailq.1 - ${NROFF} -mandoc mailq.1 > mailq.0 - -newaliases.0: newaliases.1 - ${NROFF} -mandoc newaliases.1 > newaliases.0 - -sendmail.0: sendmail.8 - ${NROFF} -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 mailq.0 newaliases.0 sendmail.0 - -clean: - rm -f ${OBJS} sendmail aliases.0 mailq.0 newaliases.0 sendmail.0 - -# dependencies -# gross overkill, and yet still not quite enough.... -${OBJS}: sendmail.h conf.h diff --git a/usr.sbin/sendmail/src/Makefile.NeXT b/usr.sbin/sendmail/src/Makefile.NeXT deleted file mode 100644 index de0dc7fb5f0fa..0000000000000 --- a/usr.sbin/sendmail/src/Makefile.NeXT +++ /dev/null @@ -1,114 +0,0 @@ -# -# 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 NeXT 2.1. -# -# @(#)Makefile.NeXT 8.3 (Berkeley) 4/11/94 -# - -# 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= -DNeXT -DNETINFO - -# see also conf.h for additional compilation flags - -# include directories -INCDIRS= - -# library directories -LIBDIRS=-L/usr/local/lib - -# 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}/etc/sendmail - -# 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= unistd.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 mailq.0 newaliases.0 sendmail.0 - -all: ${ALL} - -sendmail: ${BEFORE} ${OBJS} - ${CC} -o sendmail ${OBJS} ${LIBDIRS} ${LIBS} - -unistd.h: - cp /dev/null unistd.h - -dirent.h: - echo "#include <sys/dir.h>" > dirent.h - echo "#define dirent direct" >> dirent.h - -NROFF= nroff -h - -aliases.0: aliases.5 - ${NROFF} -mandoc aliases.5 > aliases.0 - -mailq.0: mailq.1 - ${NROFF} -mandoc mailq.1 > mailq.0 - -newaliases.0: newaliases.1 - ${NROFF} -mandoc newaliases.1 > newaliases.0 - -sendmail.0: sendmail.8 - ${NROFF} -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 mailq.0 newaliases.0 sendmail.0 - -clean: - rm -f ${OBJS} sendmail aliases.0 mailq.0 newaliases.0 sendmail.0 - -# dependencies -# gross overkill, and yet still not quite enough.... -${OBJS}: sendmail.h conf.h diff --git a/usr.sbin/sendmail/src/Makefile.NetBSD b/usr.sbin/sendmail/src/Makefile.NetBSD deleted file mode 100644 index b253c0b0b83ad..0000000000000 --- a/usr.sbin/sendmail/src/Makefile.NetBSD +++ /dev/null @@ -1,46 +0,0 @@ -# -# NetBSD Makefile -# -# @(#)Makefile.NetBSD 8.1 (Berkeley) 2/26/94 -# @Id: Makefile.NetBSD,v 1.3 1994/02/01 05:33:44 glass Exp $ -# - -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 -DNIS - -#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 -MAN1= mailq.0 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 -BINMODE=4555 - -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 <bsd.prog.mk> diff --git a/usr.sbin/sendmail/src/Makefile.OSF1 b/usr.sbin/sendmail/src/Makefile.OSF1 deleted file mode 100644 index c79b2bbce8f8d..0000000000000 --- a/usr.sbin/sendmail/src/Makefile.OSF1 +++ /dev/null @@ -1,109 +0,0 @@ -# -# 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 OSF/1 1.3 -# -# @(#)Makefile.OSF1 8.3 (Berkeley) 4/11/94 -# - -# use O=-O (usual) or O=-g (debugging) -O= -O - -# 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= -Olimit 1000 - -# 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/shlib -L/usr/lib - -# libraries required on your system -LIBS= -ldbm - -# 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/adm/sendmail - -# location of sendmail.hf file (usually /usr/share/misc or /usr/lib) -HFDIR= ${DESTDIR}/usr/share/lib - -# additional .o files needed -OBJADD= - -# additional link flags -#LDADD= -non_shared - -################### 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= ${BINDIR}/newaliases ${BINDIR}/mailq -BINOWN= root -BINGRP= kmem -BINMODE=6555 - -ALL= sendmail aliases.0 mailq.0 newaliases.0 sendmail.0 - -all: ${ALL} - -sendmail: ${BEFORE} ${OBJS} - ${CC} -o sendmail ${LDADD} ${OBJS} ${LIBDIRS} ${LIBS} - -NROFF= nroff -h - -aliases.0: aliases.5 - ${NROFF} -mandoc aliases.5 > aliases.0 - -mailq.0: mailq.1 - ${NROFF} -mandoc mailq.1 > mailq.0 - -newaliases.0: newaliases.1 - ${NROFF} -mandoc newaliases.1 > newaliases.0 - -sendmail.0: sendmail.8 - ${NROFF} -mandoc sendmail.8 > sendmail.0 - -install: install-sendmail install-docs - -install-sendmail: sendmail - 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 - -# doesn't actually install them -- you may want to install pre-nroff versions -install-docs: aliases.0 mailq.0 newaliases.0 sendmail.0 - -clean: - rm -f ${OBJS} sendmail aliases.0 mailq.0 newaliases.0 sendmail.0 - -# dependencies -# gross overkill, and yet still not quite enough.... -${OBJS}: sendmail.h conf.h diff --git a/usr.sbin/sendmail/src/Makefile.PTX b/usr.sbin/sendmail/src/Makefile.PTX deleted file mode 100644 index f27238b59dd32..0000000000000 --- a/usr.sbin/sendmail/src/Makefile.PTX +++ /dev/null @@ -1,114 +0,0 @@ -# -# 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 Sequent DYNIX/ptx. -# -# From Tim "Pinball Wizard" Wright <timw@sequent.com>. -# -# @(#)Makefile.PTX 8.3 (Berkeley) 4/11/94 -# - -# use O=-O (usual) or O=-g (debugging) -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=-I/usr/sww/include/db -INCDIRS= - -# loader options -LDOPTS= - -# library directories -#LIBDIRS=-L/usr/sww/lib -LIBDIRS= - -# libraries required on your system -#LIBS= -ldb -ldbm -LIBS= -lsocket -linet -lnsl -lseq - -# 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/bin/newaliases ${DESTDIR}/usr/bin/mailq -BINOWN= root -BINGRP= sys -BINMODE=6555 - -ALL= sendmail aliases.0 newaliases.0 sendmail.0 - -all: ${ALL} - -sendmail: $& ${BEFORE} ${OBJS} - ${CC} -o sendmail ${LDOPTS} ${OBJS} ${LIBDIRS} ${LIBS} - -NROFF= nroff -h - -aliases.0: aliases.5 - ${NROFF} -mandoc aliases.5 > aliases.0 - -mailq.0: mailq.1 - ${NROFF} -mandoc mailq.1 > mailq.0 - -newaliases.0: newaliases.1 - ${NROFF} -mandoc newaliases.1 > newaliases.0 - -sendmail.0: sendmail.8 - ${NROFF} -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 mailq.0 newaliases.0 sendmail.0 - -clean: - rm -f ${OBJS} sendmail aliases.0 mailq.0 newaliases.0 sendmail.0 - -# dependencies -# gross overkill, and yet still not quite enough.... -${OBJS}: sendmail.h conf.h diff --git a/usr.sbin/sendmail/src/Makefile.RISCos b/usr.sbin/sendmail/src/Makefile.RISCos deleted file mode 100644 index b4c4b369d7ba3..0000000000000 --- a/usr.sbin/sendmail/src/Makefile.RISCos +++ /dev/null @@ -1,117 +0,0 @@ -# -# 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. -# -# @(#)Makefile.RISCos 8.3 (Berkeley) 4/11/94 -# - -# 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 mailq.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 <sys/dir.h>" > dirent.h - echo "#define dirent direct" >> dirent.h - -NROFF= nroff -h - -aliases.0: aliases.5 - ${NROFF} -mandoc aliases.5 > aliases.0 - -mailq.0: mailq.1 - ${NROFF} -mandoc mailq.1 > mailq.0 - -newaliases.0: newaliases.1 - ${NROFF} -mandoc newaliases.1 > newaliases.0 - -sendmail.0: sendmail.8 - ${NROFF} -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 mailq.0 newaliases.0 sendmail.0 - -clean: - rm -f ${OBJS} sendmail aliases.0 mailq.0 newaliases.0 sendmail.0 - -# dependencies -# gross overkill, and yet still not quite enough.... -${OBJS}: sendmail.h conf.h diff --git a/usr.sbin/sendmail/src/Makefile.SCO b/usr.sbin/sendmail/src/Makefile.SCO deleted file mode 100644 index 0eccdabc3b31d..0000000000000 --- a/usr.sbin/sendmail/src/Makefile.SCO +++ /dev/null @@ -1,104 +0,0 @@ -# -# 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. -# -# @(#)Makefile.SCO 8.4 (Berkeley) 4/12/94 -# - -# 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= - -################### 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 mailq.0 newaliases.0 sendmail.0 - -all: ${ALL} - -sendmail: ${BEFORE} ${OBJS} - ${CC} -o sendmail ${OBJS} ${LIBDIRS} ${LIBS} - -NROFF= nroff -h - -aliases.0: aliases.5 - ${NROFF} -mandoc aliases.5 > aliases.0 - -mailq.0: mailq.1 - ${NROFF} -mandoc mailq.1 > mailq.0 - -newaliases.0: newaliases.1 - ${NROFF} -mandoc newaliases.1 > newaliases.0 - -sendmail.0: sendmail.8 - ${NROFF} -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 mailq.0 newaliases.0 sendmail.0 - -clean: - rm -f ${OBJS} sendmail aliases.0 mailq.0 newaliases.0 sendmail.0 - -# dependencies -# gross overkill, and yet still not quite enough.... -${OBJS}: sendmail.h conf.h diff --git a/usr.sbin/sendmail/src/Makefile.SVR4 b/usr.sbin/sendmail/src/Makefile.SVR4 deleted file mode 100644 index 92de6dda66a2e..0000000000000 --- a/usr.sbin/sendmail/src/Makefile.SVR4 +++ /dev/null @@ -1,113 +0,0 @@ -# -# 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 -# <kim@grendel.lut.fi> -- I haven't tested this myself. It may -# work on other SVR4 ports. -# -# @(#)Makefile.SVR4 8.3 (Berkeley) 4/11/94 -# - -# 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 mailq.0 newaliases.0 sendmail.0 - -all: ${ALL} - -sendmail: ${BEFORE} ${OBJS} - ${CC} -o sendmail ${OBJS} ${LIBDIRS} ${LIBS} - -NROFF= nroff -h - -aliases.0: aliases.5 - ${NROFF} -mandoc aliases.5 > aliases.0 - -mailq.0: mailq.1 - ${NROFF} -mandoc mailq.1 > mailq.0 - -newaliases.0: newaliases.1 - ${NROFF} -mandoc newaliases.1 > newaliases.0 - -sendmail.0: sendmail.8 - ${NROFF} -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 mailq.0 newaliases.0 sendmail.0 - -clean: - rm -f ${OBJS} sendmail aliases.0 mailq.0 newaliases.0 sendmail.0 - -# dependencies -# gross overkill, and yet still not quite enough.... -${OBJS}: sendmail.h conf.h diff --git a/usr.sbin/sendmail/src/Makefile.Solaris b/usr.sbin/sendmail/src/Makefile.Solaris deleted file mode 100644 index 8256a3e624641..0000000000000 --- a/usr.sbin/sendmail/src/Makefile.Solaris +++ /dev/null @@ -1,115 +0,0 @@ -# -# 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 Solaris 2.1 and 2.2. -# -# @(#)Makefile.Solaris 8.5 (Berkeley) 4/12/94 -# - -# 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 -# -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) -# 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 - -# 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= - -# things to be made before compilation begins -BEFORE= sysexits.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= sys -BINMODE=6555 -INSTALL=/usr/ucb/install - -ALL= sendmail aliases.0 mailq.0 newaliases.0 sendmail.0 - -all: ${ALL} - -sendmail: ${BEFORE} ${OBJS} - ${CC} -o sendmail ${OBJS} ${LIBDIRS} ${LIBS} - -sysexits.h: /usr/ucbinclude/sysexits.h - ln -s /usr/ucbinclude/sysexits.h - -NROFF= nroff -h - -aliases.0: aliases.5 - ${NROFF} -mandoc aliases.5 > aliases.0 - -mailq.0: mailq.1 - ${NROFF} -mandoc mailq.1 > mailq.0 - -newaliases.0: newaliases.1 - ${NROFF} -mandoc newaliases.1 > newaliases.0 - -sendmail.0: sendmail.8 - ${NROFF} -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 mailq.0 newaliases.0 sendmail.0 - -clean: - rm -f ${OBJS} sendmail aliases.0 mailq.0 newaliases.0 sendmail.0 - -# dependencies -# gross overkill, and yet still not quite enough.... -${OBJS}: sendmail.h conf.h diff --git a/usr.sbin/sendmail/src/Makefile.SunOS b/usr.sbin/sendmail/src/Makefile.SunOS deleted file mode 100644 index ee3025fcc352e..0000000000000 --- a/usr.sbin/sendmail/src/Makefile.SunOS +++ /dev/null @@ -1,111 +0,0 @@ -# -# 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 SunOS 4.1.[12]. -# For SunOS 4.0.3, add -DSUNOS403 to the ENVDEF macro, and -# create empty files stdlib.h and stddef.h in your -# compile directory. -# -# @(#)Makefile.SunOS 8.3 (Berkeley) 4/11/94 -# - -# 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 -DNEWDB -DNIS - -# environment definitions (e.g., -D_AIX3) -# need to add -DSUNOS403 if you are on a SunOS 4.0.3 system -ENVDEF= - -# see also conf.h for additional compilation flags - -# include directories -INCDIRS=-I/usr/sww/include/db - -# loader options -LDOPTS= -Bstatic - -# library directories -LIBDIRS=-L/usr/sww/lib - -# libraries required on your system -LIBS= -ldb -ldbm -lresolv - -# 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= - -################### 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 mailq.0 newaliases.0 sendmail.0 - -all: ${ALL} - -sendmail: ${BEFORE} ${OBJS} - ${CC} -o sendmail ${LDOPTS} ${OBJS} ${LIBDIRS} ${LIBS} - -NROFF= nroff -h - -aliases.0: aliases.5 - ${NROFF} -mandoc aliases.5 > aliases.0 - -mailq.0: mailq.1 - ${NROFF} -mandoc mailq.1 > mailq.0 - -newaliases.0: newaliases.1 - ${NROFF} -mandoc newaliases.1 > newaliases.0 - -sendmail.0: sendmail.8 - ${NROFF} -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 mailq.0 newaliases.0 sendmail.0 - -clean: - rm -f ${OBJS} sendmail aliases.0 mailq.0 newaliases.0 sendmail.0 - -# dependencies -# gross overkill, and yet still not quite enough.... -${OBJS}: sendmail.h conf.h diff --git a/usr.sbin/sendmail/src/Makefile.SunOS.4.0.3 b/usr.sbin/sendmail/src/Makefile.SunOS.4.0.3 deleted file mode 100644 index 126ac6486a2df..0000000000000 --- a/usr.sbin/sendmail/src/Makefile.SunOS.4.0.3 +++ /dev/null @@ -1,113 +0,0 @@ -# -# 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). -# -# You may find you need to find versions of some routines -# such as strcasecmp in order to link this on SunOS 4.0.3. -# -# @(#)Makefile.SunOS.4.0.3 8.3 (Berkeley) 4/11/94 -# - -# 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 -DNEWDB -DNIS - -# environment definitions (e.g., -D_AIX3) -ENVDEF= -DSUNOS403 - -# see also conf.h for additional compilation flags - -# include directories -INCDIRS=-I/usr/sww/include/db - -# loader options -LDOPTS= -Bstatic - -# library directories -LIBDIRS=-L/usr/sww/lib - -# libraries required on your system -LIBS= -ldb -ldbm -lresolv - -# 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= - -BEFORE= stdlib.h stddef.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 mailq.0 newaliases.0 sendmail.0 - -all: ${ALL} - -sendmail: ${BEFORE} ${OBJS} - ${CC} -o sendmail ${LDOPTS} ${OBJS} ${LIBDIRS} ${LIBS} - -stddef.h stdlib.h: - cp /dev/null $@ - -NROFF= nroff -h - -aliases.0: aliases.5 - ${NROFF} -mandoc aliases.5 > aliases.0 - -mailq.0: mailq.1 - ${NROFF} -mandoc mailq.1 > mailq.0 - -newaliases.0: newaliases.1 - ${NROFF} -mandoc newaliases.1 > newaliases.0 - -sendmail.0: sendmail.8 - ${NROFF} -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 mailq.0 newaliases.0 sendmail.0 - -clean: - rm -f ${OBJS} sendmail aliases.0 mailq.0 newaliases.0 sendmail.0 - -# dependencies -# gross overkill, and yet still not quite enough.... -${OBJS}: sendmail.h conf.h diff --git a/usr.sbin/sendmail/src/Makefile.SunOS.5.1 b/usr.sbin/sendmail/src/Makefile.SunOS.5.1 deleted file mode 100644 index 8256a3e624641..0000000000000 --- a/usr.sbin/sendmail/src/Makefile.SunOS.5.1 +++ /dev/null @@ -1,115 +0,0 @@ -# -# 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 Solaris 2.1 and 2.2. -# -# @(#)Makefile.Solaris 8.5 (Berkeley) 4/12/94 -# - -# 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 -# -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) -# 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 - -# 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= - -# things to be made before compilation begins -BEFORE= sysexits.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= sys -BINMODE=6555 -INSTALL=/usr/ucb/install - -ALL= sendmail aliases.0 mailq.0 newaliases.0 sendmail.0 - -all: ${ALL} - -sendmail: ${BEFORE} ${OBJS} - ${CC} -o sendmail ${OBJS} ${LIBDIRS} ${LIBS} - -sysexits.h: /usr/ucbinclude/sysexits.h - ln -s /usr/ucbinclude/sysexits.h - -NROFF= nroff -h - -aliases.0: aliases.5 - ${NROFF} -mandoc aliases.5 > aliases.0 - -mailq.0: mailq.1 - ${NROFF} -mandoc mailq.1 > mailq.0 - -newaliases.0: newaliases.1 - ${NROFF} -mandoc newaliases.1 > newaliases.0 - -sendmail.0: sendmail.8 - ${NROFF} -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 mailq.0 newaliases.0 sendmail.0 - -clean: - rm -f ${OBJS} sendmail aliases.0 mailq.0 newaliases.0 sendmail.0 - -# dependencies -# gross overkill, and yet still not quite enough.... -${OBJS}: sendmail.h conf.h diff --git a/usr.sbin/sendmail/src/Makefile.SunOS.5.2 b/usr.sbin/sendmail/src/Makefile.SunOS.5.2 deleted file mode 100644 index 8256a3e624641..0000000000000 --- a/usr.sbin/sendmail/src/Makefile.SunOS.5.2 +++ /dev/null @@ -1,115 +0,0 @@ -# -# 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 Solaris 2.1 and 2.2. -# -# @(#)Makefile.Solaris 8.5 (Berkeley) 4/12/94 -# - -# 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 -# -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) -# 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 - -# 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= - -# things to be made before compilation begins -BEFORE= sysexits.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= sys -BINMODE=6555 -INSTALL=/usr/ucb/install - -ALL= sendmail aliases.0 mailq.0 newaliases.0 sendmail.0 - -all: ${ALL} - -sendmail: ${BEFORE} ${OBJS} - ${CC} -o sendmail ${OBJS} ${LIBDIRS} ${LIBS} - -sysexits.h: /usr/ucbinclude/sysexits.h - ln -s /usr/ucbinclude/sysexits.h - -NROFF= nroff -h - -aliases.0: aliases.5 - ${NROFF} -mandoc aliases.5 > aliases.0 - -mailq.0: mailq.1 - ${NROFF} -mandoc mailq.1 > mailq.0 - -newaliases.0: newaliases.1 - ${NROFF} -mandoc newaliases.1 > newaliases.0 - -sendmail.0: sendmail.8 - ${NROFF} -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 mailq.0 newaliases.0 sendmail.0 - -clean: - rm -f ${OBJS} sendmail aliases.0 mailq.0 newaliases.0 sendmail.0 - -# dependencies -# gross overkill, and yet still not quite enough.... -${OBJS}: sendmail.h conf.h diff --git a/usr.sbin/sendmail/src/Makefile.SunOS.5.x b/usr.sbin/sendmail/src/Makefile.SunOS.5.x deleted file mode 100644 index 1b7d2687421cc..0000000000000 --- a/usr.sbin/sendmail/src/Makefile.SunOS.5.x +++ /dev/null @@ -1,115 +0,0 @@ -# -# 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 Solaris 2.3. -# -# @(#)Makefile.SunOS.5.x 8.5 (Berkeley) 4/12/94 -# - -# 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 -# -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) -# include -DSOLARIS_2_3 for version 2.3 and higher -ENVDEF= -DSOLARIS_2_3 - -# 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= -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= - -# things to be made before compilation begins -BEFORE= sysexits.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= sys -BINMODE=6555 -INSTALL=/usr/ucb/install - -ALL= sendmail aliases.0 mailq.0 newaliases.0 sendmail.0 - -all: ${ALL} - -sendmail: ${BEFORE} ${OBJS} - ${CC} -o sendmail ${OBJS} ${LIBDIRS} ${LIBS} - -sysexits.h: /usr/ucbinclude/sysexits.h - ln -s /usr/ucbinclude/sysexits.h - -NROFF= nroff -h - -aliases.0: aliases.5 - ${NROFF} -mandoc aliases.5 > aliases.0 - -mailq.0: mailq.1 - ${NROFF} -mandoc mailq.1 > mailq.0 - -newaliases.0: newaliases.1 - ${NROFF} -mandoc newaliases.1 > newaliases.0 - -sendmail.0: sendmail.8 - ${NROFF} -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 mailq.0 newaliases.0 sendmail.0 - -clean: - rm -f ${OBJS} sendmail aliases.0 mailq.0 newaliases.0 sendmail.0 - -# dependencies -# gross overkill, and yet still not quite enough.... -${OBJS}: sendmail.h conf.h diff --git a/usr.sbin/sendmail/src/Makefile.Titan b/usr.sbin/sendmail/src/Makefile.Titan deleted file mode 100644 index 89b156aa7b1d8..0000000000000 --- a/usr.sbin/sendmail/src/Makefile.Titan +++ /dev/null @@ -1,114 +0,0 @@ -# -# 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.Titan 8.3 (Berkeley) 4/11/94 -# - -# 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 mailq.0 newaliases.0 sendmail.0 - -all: ${ALL} - -sendmail: ${BEFORE} ${OBJS} - ${CC} -o sendmail ${LDOPTS} ${OBJS} ${LIBDIRS} ${LIBS} - -stddef.h stdlib.h: - cp /dev/null $@ - -NROFF= nroff -h - -aliases.0: aliases.5 - ${NROFF} -mandoc aliases.5 > aliases.0 - -mailq.0: mailq.1 - ${NROFF} -mandoc mailq.1 > mailq.0 - -newaliases.0: newaliases.1 - ${NROFF} -mandoc newaliases.1 > newaliases.0 - -sendmail.0: sendmail.8 - ${NROFF} -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 mailq.0 newaliases.0 sendmail.0 - -clean: - rm -f ${OBJS} sendmail aliases.0 mailq.0 newaliases.0 sendmail.0 - -# dependencies -# gross overkill, and yet still not quite enough.... -${OBJS}: sendmail.h conf.h diff --git a/usr.sbin/sendmail/src/Makefile.ULTRIX b/usr.sbin/sendmail/src/Makefile.ULTRIX deleted file mode 100644 index a3f222eec445b..0000000000000 --- a/usr.sbin/sendmail/src/Makefile.ULTRIX +++ /dev/null @@ -1,107 +0,0 @@ -# -# 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 Ultrix 4.2A and 4.3A. -# -# @(#)Makefile.ULTRIX 8.3 (Berkeley) 4/11/94 -# - -# 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 -DNEWDB -DNIS - -# environment definitions (e.g., -D_AIX3) -ENVDEF= -Olimit 800 - -# 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= -ldb - -# 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/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 mailq.0 newaliases.0 sendmail.0 - -all: ${ALL} - -sendmail: ${BEFORE} ${OBJS} - ${CC} -o sendmail ${LDOPTS} ${OBJS} ${LIBDIRS} ${LIBS} - -NROFF= nroff -h - -aliases.0: aliases.5 - ${NROFF} -mandoc aliases.5 > aliases.0 - -mailq.0: mailq.1 - ${NROFF} -mandoc mailq.1 > mailq.0 - -newaliases.0: newaliases.1 - ${NROFF} -mandoc newaliases.1 > newaliases.0 - -sendmail.0: sendmail.8 - ${NROFF} -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 mailq.0 newaliases.0 sendmail.0 - -clean: - rm -f ${OBJS} sendmail aliases.0 mailq.0 newaliases.0 sendmail.0 - -# dependencies -# gross overkill, and yet still not quite enough.... -${OBJS}: sendmail.h conf.h diff --git a/usr.sbin/sendmail/src/Makefile.UMAX b/usr.sbin/sendmail/src/Makefile.UMAX deleted file mode 100644 index c69e2b6ccd187..0000000000000 --- a/usr.sbin/sendmail/src/Makefile.UMAX +++ /dev/null @@ -1,114 +0,0 @@ -# -# 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 Encore UMAX V -# -# @(#)Makefile.UMAX 8.3 (Berkeley) 4/11/94 -# - -# 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= -DNIS - -# environment definitions (e.g., -D_AIX3) -ENVDEF= -DUMAXV - -# see also conf.h for additional compilation flags - -# include directories -INCDIRS= - -# loader options -LDOPTS= - -# library directories -LIBDIRS= - -# libraries required on your system -LIBS= -lyp -lrpc - -# 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/lib - -# additional .o files needed -OBJADD= - -# things to do before compilation -BEFORE= stddef.h - -stddef.h: - echo "#define _STDDEF_H" > stddef.h - chmod 444 stddef.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 mailq.0 newaliases.0 sendmail.0 - -all: ${ALL} - -sendmail: ${BEFORE} ${OBJS} - ${CC} -o sendmail ${LDOPTS} ${OBJS} ${LIBDIRS} ${LIBS} - -NROFF= nroff -h - -aliases.0: aliases.5 - ${NROFF} -mandoc aliases.5 > aliases.0 - -mailq.0: mailq.1 - ${NROFF} -mandoc mailq.1 > mailq.0 - -newaliases.0: newaliases.1 - ${NROFF} -mandoc newaliases.1 > newaliases.0 - -sendmail.0: sendmail.8 - ${NROFF} -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 mailq.0 newaliases.0 sendmail.0 - -clean: - rm -f ${OBJS} sendmail aliases.0 mailq.0 newaliases.0 sendmail.0 - -# dependencies -# gross overkill, and yet still not quite enough.... -${OBJS}: sendmail.h conf.h diff --git a/usr.sbin/sendmail/src/Makefile.Utah b/usr.sbin/sendmail/src/Makefile.Utah deleted file mode 100644 index 84f2403f6403e..0000000000000 --- a/usr.sbin/sendmail/src/Makefile.Utah +++ /dev/null @@ -1,40 +0,0 @@ -# @(#)Makefile.Utah 8.1 (Berkeley) 2/26/94 - -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 -DOLD_NEWDB - -CFLAGS+=-I${.CURDIR} ${DBMDEF} -Dsetpgid=setpgrp - -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= ${LIBDBM} ${LIBCOMPAT} -LDADD= -MAN1= mailq.0 newaliases.0 -MAN5= aliases.0 -MAN8= sendmail.0 -LINKS= ${DESTDIR}/usr/sbin/sendmail ${DESTDIR}/usr/bin/newaliases \ - ${DESTDIR}/usr/sbin/sendmail ${DESTDIR}/usr/bin/mailq -BINDIR= /usr/sbin -BINOWN= root -BINGRP= kmem -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 - -.include <bsd.prog.mk> diff --git a/usr.sbin/sendmail/src/Makefile.dist b/usr.sbin/sendmail/src/Makefile.dist deleted file mode 100644 index 5fab596e2d249..0000000000000 --- a/usr.sbin/sendmail/src/Makefile.dist +++ /dev/null @@ -1,107 +0,0 @@ -# -# 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.12 (Berkeley) 4/11/94 -# - -# 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 -DNEWDB - -# environment definitions (e.g., -D_AIX3) -ENVDEF= - -# 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= -ldb -ldbm - -# 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= - -################### 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 mailq.0 newaliases.0 sendmail.0 - -all: ${ALL} - -sendmail: ${BEFORE} ${OBJS} - ${CC} -o sendmail ${LDOPTS} ${OBJS} ${LIBDIRS} ${LIBS} - -NROFF= nroff -h - -aliases.0: aliases.5 - ${NROFF} -mandoc aliases.5 > aliases.0 - -mailq.0: mailq.1 - ${NROFF} -mandoc mailq.1 > mailq.0 - -newaliases.0: newaliases.1 - ${NROFF} -mandoc newaliases.1 > newaliases.0 - -sendmail.0: sendmail.8 - ${NROFF} -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 mailq.0 newaliases.0 sendmail.0 - -clean: - rm -f ${OBJS} sendmail aliases.0 mailq.0 newaliases.0 sendmail.0 - -# dependencies -# gross overkill, and yet still not quite enough.... -${OBJS}: sendmail.h conf.h diff --git a/usr.sbin/sendmail/src/READ_ME b/usr.sbin/sendmail/src/READ_ME index ace0d3ab9bb30..264b2ebaac99d 100644 --- a/usr.sbin/sendmail/src/READ_ME +++ b/usr.sbin/sendmail/src/READ_ME @@ -1,4 +1,4 @@ -# Copyright (c) 1983 Eric P. Allman +# Copyright (c) 1983, 1995 Eric P. Allman # Copyright (c) 1988 The Regents of the University of California. # All rights reserved. # @@ -30,32 +30,30 @@ # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF # SUCH DAMAGE. # -# @(#)READ_ME 8.61.1.1 (Berkeley) 3/5/95 +# @(#)READ_ME 8.113 (Berkeley) 11/29/95 # This directory contains the source files for sendmail. -For detailed instructions, please read the document ../doc/op.me: - - eqn ../doc/op.me | pic | ditroff -me +********************* +!! DO NOT USE MAKE !! to compile sendmail -- instead, use the +********************* "makesendmail" script located in the src +directory. It will find an appropriate Makefile, and create an +appropriate obj.* subdirectory so that multiplatform support +works easily. 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: +If you are porting to a new architecture for which there is no existing +Makefile, you might start with Makefile.dist. This works on the old +traditional make, but isn't customized for any particular architecture. - 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. + ************************************************** + ** Read below for more details of Makefiles. ** + ************************************************** ************************************************************************** ** IMPORTANT: DO NOT USE OPTIMIZATION (``-O'') IF YOU ARE RUNNING ** @@ -67,16 +65,34 @@ 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. +This problem is reported to have been fixed in gcc 2.6. + ************************************************************************** ** IMPORTANT: Read the appropriate paragraphs in the section on ** ** ``Operating System and Compile Quirks''. ** ************************************************************************** +For detailed instructions, please read the document ../doc/op.me: + + eqn ../doc/op.me | pic | ditroff -me + +-----------+ | MAKEFILES | +-----------+ +By far, the easiest way to compile sendmail is to use the "makesendmail" +script: + + sh makesendmail + +This uses the "uname" command to figure out what architecture you are +on and selects a proper Makefile accordingly. It also creates a +subdirectory per object format, so that multiarchitecture support is +easy. In general this should be all you need. However, if for some +reason this doesn't work (e.g., NeXT systems don't have the "uname" +command) you may have to set up your compile environment by hand. + 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, @@ -88,17 +104,15 @@ 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. +system. All other Makefiles are in the "src/Makefiles" subdirectory. +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. +In particular, Many of them include -I/usr/sww/include/db and +-L/usr/sww/lib -- these are Berkeley's locations in 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, +but you may have to remove -DNEWDB from the DBMDEF definition. Please look for an appropriate Makefile before you start trying to compile with Makefile or Makefile.dist. @@ -107,9 +121,10 @@ 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 +/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. +For Ultrix, try ftp.vix.com:~ftp/pub/patches/pmake-for-ultrix.Z. Paul Southworth <pauls@umich.edu> published a description of porting this make in comp.unix.bsd. @@ -133,10 +148,11 @@ The three options are NEWDB (the new Berkeley DB package), NDBM (the older DBM implementation -- the very old V7 implementation is no longer supported), and NIS (Network Information Services). Used alone these just include the support they indicate. [If you are using NEWDB, -get the latest version from FTP.CS.Berkeley.EDU in /ucb/4bsd. DO NOT -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 1 to do this.] +get the latest version from FTP.CS.Berkeley.EDU in /ucb/4bsd/db.tar.Z +(or db.tar.gz). 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 +1 to do this.] [NOTE WELL: it is CRITICAL that you remove ndbm.o from libdb.a and ndbm.h from the appropriate include directories if you want to get @@ -152,19 +168,28 @@ the NEWDB library also catches and maps NDBM calls; you will have to back out this feature to get this to work. See ``Quirks'' section below for details.] -If all three are defined, sendmail operates as described above, and also -looks for the file /var/yp/Makefile. If it exists, newaliases will -build BOTH the NEWDB and NDBM format alias files. However, it will -only use the NEWDB file; the NDBM format file is used only by the -NIS subsystem. +If all three are defined and the name of the file includes the string +"/yp/", sendmail will rebuild BOTH the NEWDB and NDBM format alias +files. However, it will only read the NEWDB file; the NDBM format file +is used only by the NIS subsystem. -If NDBM and NIS are defined (regardless of the definition of NEWDB -or the existance of /var/yp/Makefile), sendmail adds the special +If NDBM and NIS are defined (regardless of the definition of NEWDB), +and the filename includes the string "/yp/", sendmail adds the special tokens "YP_LAST_MODIFIED" and "YP_MASTER_NAME", both of which are required if the NDBM file is to be used as an NIS map. -All of -DNEWDB, -DNDBM, and -DNIS are normally defined in the DBMDEF -line in the Makefile. +There is also preliminary support for NIS+ (-DNISPLUS), Hesiod +(-DHESIOD), and NetInfo (-DNETINFO). These have not been well +tested. + +All of -DNEWDB, -DNDBM, -DNIS, -DNISPLUS, -DHESIOD, and -DNETINFO are +normally defined in the DBMDEF line in the Makefile. + +If you define NEWDB or HESIOD you get the User Database (USERDB) +automatically. Generally you do want to have NEWDB for it to do +anything interesting. See above for getting the Berkeley "db" +package (i.e., NEWDB). There is no separate "user database" +package -- don't bother searching for it on the net. +---------------+ @@ -174,25 +199,14 @@ line in the Makefile. Whereever possible, I try to make sendmail pull in the correct compilation options needed to compile on various environments based on automatically defined symbols. Some machines don't seem to have useful -symbols availble, requiring the following compilation flags in the -Makefile: - -SOLARIS Define this if you are running Solaris 2.0 or higher. -SOLARIS_2_3 Define this if you are running Solaris 2.3 or higher. -SUNOS403 Define this if you are running SunOS 4.0.3. -NeXT Define this if you are on a NeXT box. (This one may - be pre-defined for you.) There are other hacks you - have to make -- see below. -_AIX3 Define this if you are IBM AIX 3.x. -RISCOS Define this if you are running RISC/os from MIPS. -IRIX Define this if you are running IRIX from SGI. -_SCO_unix_ Define this if you are on SCO UNIX. -_SCO_unix_4_2 Define this if you are on SCO Open Server 3.2v4. - -If you are a system that sendmail has already been ported to, you -probably won't have to touch these. But if you are porting, you may -have to tweak the following compilation flags in conf.h in order to -get it to compile and link properly: +symbols available, requiring that a compilation flag be defined in +the Makefile; see the Makefiles subdirectory for the supported +architectures. + +If you are a system to which sendmail has already been ported you +should not have to touch the following symbols. But if you are porting, +you may have to tweak the following compilation flags in conf.h in order +to get it to compile and link properly: SYSTEM5 Adjust for System V (not necessarily Release 4). SYS5SIGNALS Use System V signal semantics -- the signal handler @@ -201,12 +215,18 @@ SYS5SIGNALS Use System V signal semantics -- the signal handler signal handler stays in force until an exec or an explicit delete. Implied by SYSTEM5. SYS5SETPGRP Use System V setpgrp() semantics. Implied by SYSTEM5. +HASFCHMOD Define this to one if you have the fchmod(2) system call. + This improves security. HASFLOCK Set this if you prefer to use the flock(2) system call rather than using fcntl-based locking. Fcntl locking has some semantic gotchas, but many vendor systems also interface it to lockd(8) to do NFS-style locking. - For this reason, this should not be set unless you - don't have an alternative. + Unfortunately, may vendors implementations of fcntl locking + is just plain broken (e.g., locks are never released, + causing your sendmail to deadlock; when the kernel runs + out of locks your system crashes). For this reason, I + recommend always defining this unless you are absolutely + certain that your fcntl locking implementation really works. HASUNAME Set if you have the "uname" system call. Implied by SYSTEM5. HASUNSETENV Define this if your system library has the "unsetenv" @@ -234,11 +254,28 @@ HASSETREUID Define this if you have setreuid(2) ***AND*** root can 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. +USESETEUID Define this to 1 if you have seteuid(2) if you have a seteuid + system call that will allow root to set only the effective + user id to an arbitrary value ***AND*** you have saved user + ids. This is preferable to HASSETREUID if these conditions + are fulfilled. These are the semantics of the to-be-released + revision of Posix.1. The test program ../test/t_seteuid.c + will try this out on your system. If you define both + HASSETREUID and USESETEUID, the former is ignored. 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). +HASSETRLIMIT Define this to 1 if you have the setrlimit(2) syscall. + You can define it to 0 to force it off. It is assumed + if you are running a BSD-like system. +HASULIMIT Define this if you have the ulimit(2) syscall (System V + style systems). HASSETRLIMIT overrides, as it is more + general. +HASWAITPID Define this if you have the waitpid(2) syscall. +HASGETDTABLESIZE + Define this if you have the getdtablesize(2) syscall. 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 @@ -261,6 +298,12 @@ HASGETUSERSHELL Define this to 1 if you have getusershell(3) in your 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. +NEEDPUTENV Define this if your system needs am emulation of the + putenv(3) call. Define to 1 to implement it in terms + of setenv(3) or to 2 to do it in terms of primitives. +NOFTRUNCATE Define this if you don't have the ftruncate(2) syscall. + If you don't have this system call, there is an unavoidable + race condition that occurs when creating alias databases. 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 @@ -276,35 +319,71 @@ ARBPTR_T The type of an arbitrary pointer -- defaults to "void *". this to be "char *". LA_TYPE The type of load average your kernel supports. These can be one of: - LA_ZERO (1) -- it always returns the load average as + LA_ZERO (1) -- it always returns the load average as "zero" (and does so on all architectures). - LA_SUBR (4) if you have the getloadavg(3) routine, - LA_MACH (5) to use MACH-style load averages (calls + LA_INT (2) to read /dev/kmem for the symbol avenrun and + interpret as a long integer. + LA_FLOAT (3) same, but interpret the result as a floating + point number. + LA_SHORT (6) to interpret as a short integer. + LA_SUBR (4) if you have the getloadavg(3) routine in your + system library. + LA_MACH (5) to use MACH-style load averages (calls processor_set_info()), - LA_PROCSTR (7) to read /proc/loadavg and interpret it + LA_PROCSTR (7) to read /proc/loadavg and interpret it as a string representing a floating-point - number (Linux-style), - LA_FLOAT (3) if you read kmem and interpret the value - as a floating point number, - LA_INT (2) to interpret as a long integer, - LA_SHORT (6) to interpret as a short integer. - These last three have several other parameters that they - try to divine: the name of your kernel, the name of the - variable in the kernel to examine, the number of bits of - precision in a fixed point load average, and so forth. + number (Linux-style). + LA_READKSYM (8) is an implementation suitable for some + versions of SVr4 that uses the MIOC_READKSYM ioctl + call to read /dev/kmem. + LA_DGUX (9) is a special implementation for DG/UX that uses + the dg_sys_info system call. + LA_HPUX (10) is an HP-UX specific version that uses the + pstat_getdynamic system call. + LA_INT, LA_SHORT, LA_FLOAT, and LA_READKSYM have several + other parameters that they try to divine: the name of your + kernel, the name of the variable in the kernel to examine, + the number of bits of precision in a fixed point load average, + and so forth. In desperation, use LA_ZERO. The actual code is in conf.c -- it can be tweaked if you are brave. +FSHIFT For LA_INT, LA_SHORT, and LA_READKSYM, this is the number + of bits of load average after the binary point -- i.e., + the number of bits to shift right in order to scale the + integer to get the true integer load average. Defaults to 8. +_PATH_UNIX The path to your kernel. Needed only for LA_INT, LA_SHORT, + and LA_FLOAT. Defaults to "/unix" on System V, "/vmunix" + everywhere else. +LA_AVENRUN For LA_INT, LA_SHORT, and LA_FLOAT, the name of the kernel + variable that holds the load average. Defaults to "avenrun" + on System V, "_avenrun" everywhere else. SFS_TYPE Encodes how your kernel can locate the amount of free space on a disk partition. This can be set to SFS_NONE (0) if you have no way of getting this information, SFS_USTAT (1) if you have the ustat(2) system call, SFS_4ARGS (2) if you have a four-argument statfs(2) system call (and the include file is <sys/statfs.h>), - and SFS_VFS (3), SFS_MOUNT (4), SFS_STATFS (5) or - SFS_STATVFS (6) if you have the two-argument statfs(2) - system call, with includes in <sys/vfs.h>, <sys/mount.h>, - <sys/statfs.h>, or <sys/statvfs.h> respectively. The - default if nothing is defined is SFS_NONE. + SFS_VFS (3), SFS_MOUNT (4), SFS_STATFS (5) if you have + the two-argument statfs(2) system call with includes in + <sys/vfs.h>, <sys/mount.h>, or <sys/statfs.h> respectively, + or SFS_STATVFS (6) if you have the two-argument statvfs(2) + call. The default if nothing is defined is SFS_NONE. +SFS_BAVAIL with SFS_4ARGS hou can also set SFS_BAVAIL to the field name + in the statfs structure that holds the useful information; + this defaults to f_bavail. +SPT_TYPE Encodes how your system can display what a process is doing + on a ps(1) command (SPT stands for Set Process Title). Can + be set to: + SPT_NONE (0) -- Don't try to set the process title at all. + SPT_REUSEARGV (1) -- Pad out your argv with the information; + this is the default if none specified. + SPT_BUILTIN (2) -- The system library has setproctitle. + SPT_PSTAT (3) -- Use the PSTAT_SETCMD option to pstat(2) + to set the process title; this is used by HP-UX. + SPT_PSSTRINGS (4) -- Use the magic PS_STRINGS pointer (4.4BSD). +SPT_PADCHAR Character used to pad the process title; if undefined, + the space character (0x20) is used. This is ignored if + SPT_TYPE != SPT_REUSEARGV ERRLIST_PREDEFINED If set, assumes that some header file defines sys_errlist. This may be needed if you get type conflicts on this @@ -329,6 +408,12 @@ BROKEN_RES_SEARCH -1 but sets h_errno to 0 instead of HOST_NOT_FOUND. If you set this, sendmail considers 0 to be the same as HOST_NOT_FOUND. +NAMELISTMASK If defined, values returned by nlist(3) are masked + against this value before use -- a common value is + 0x7fffffff to strip off the top bit. +BSD4_4_SOCKADDR If defined, socket addresses have an sa_len field that + defines the length of this address. + +-----------------------+ @@ -351,24 +436,50 @@ OLD_NEWDB If non-zero, the version of NEWDB you have is the old use -DOLD_NEWDB=0 it forces you to use the new interface. NIS Define this to get NIS (YP) support for aliases and maps. Normally defined in the Makefile. -USERDB Include support for the User Information Database. Implied - by NEWDB in conf.h. +NISPLUS Define this to get NIS+ support for aliases and maps. + Normally defined in the Makefile. +HESIOD Define this to get Hesiod support for aliases and maps. + Normally defined in the Makefile. +NETINFO Define this to get NeXT NetInfo support for aliases and maps. + Normally defined in the Makefile. +USERDB Define this to 1 to include support for the User Information + Database. Implied by NEWDB or HESIOD. You can use + -DUSERDB=0 to explicitly turn it off. 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. + turn off IDENT protocol support. If defined off, the code + is actually still compiled in, but it defaults off; you + can turn it on by setting the IDENT timeout to 30s in the + configuration file. +IP_SRCROUTE Define this to 1 to get IP source routing information + displayed in the Received: header. This is assumed on + most systems, but some (e.g., Ultrix) apparently have a + broken version of getsockopt that doesn't properly + support the IP_OPTIONS call. You probably want this if + your OS can cope with it. Symptoms of failure will be that + it won't compile properly (that is, no support for fetching + IP_OPTIONs), or it compiles but source-routed TCP connections + either refuse to open or open and hang for no apparent reason. + Ultrix and AIX are known to fail this way. LOG Set this to get syslog(3) support. Defined by default in conf.h. You want this if at all possible. NETINET Set this to get TCP/IP support. Defined by default in conf.h. You probably want this. NETISO Define this to get ISO networking support. +NETUNIX Define this to get Unix domain networking support. Defined + by default. A few bizarre systems (SCO, ISC, Altos) don't + support this networking domain. SMTP Define this to get the SMTP code. Implied by NETINET or NETISO. -NAMED_BIND Define this to get DNS (name daemon) support, including - MX support. The specs you must use this if you run - SMTP. Defined by default in conf.h. +NAMED_BIND If non-zero, include DNS (name daemon) support, including + MX support. The specs say you must use this if you run + SMTP. You don't have to be running a name server daemon + on your machine to need this -- any use of the DNS resolver, + including remote access to another machine, requires this + option. Defined by default in conf.h. Define it to zero + ONLY on machines that do not use DNS in any way. QUEUE Define this to get queueing code. Implied by NETINET or NETISO; required by SMTP. This gives you other good stuff -- it should be on. @@ -379,9 +490,16 @@ MATCHGECOS Permit fuzzy matching of user names against the full name (GECOS) field in the /etc/passwd file. This should probably be on, since you can disable it from the config file if you want to. Defined by default in conf.h. -SETPROCTITLE Try to set the string printed by "ps" to something - informative about what sendmail is doing. Defined by - default in conf.h. +MIME8TO7 If non-zero, include 8 to 7 bit MIME conversions. This + also controls advertisement of 8BITMIME in the ESMTP + startup dialogue. +MIME7TO8 If non-zero, include 7 to 8 bit MIME conversions. Not yet + implemented. +HES_GETMAILHOST Define this to 1 if you are using Hesiod with the + hes_getmailhost() routine. This is included with the MIT + Hesiod distribution, but not with the DEC Hesiod distribution. +XDEBUG Do additional internal checking. These don't cost too + much; you might as well leave this on. +---------------------+ @@ -405,6 +523,13 @@ 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 subtly don't work. +WILDCARD MX RECORDS ARE A BAD IDEA! The only situation in which they +work reliably is if you have two versions of DNS, one in the real world +which has a wildcard pointing to your firewall, and a completely +different version of the database internally that does not include +wildcard MX records that match your domain. ANYTHING ELSE WILL GIVE +YOU HEADACHES! + +-------------------------------------+ | OPERATING SYSTEM AND COMPILE QUIRKS | @@ -431,7 +556,7 @@ GCC 2.5.x problems *** IMPORTANT *** *************** 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)) @@ -439,13 +564,28 @@ GCC 2.5.x problems *** IMPORTANT *** #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 +GCC 2.7.x problems + Apparently GCC 2.7.0 on the Pentium processor has optimization + problems. I recommend against using -O on that architecture. This + has been seen on FreeBSD 2.0.5 RELEASE. + +Configuration file location + Up to 8.6, sendmail tried to find the sendmail.cf file in the same + place as the vendors had put it, even when this was obviously + stupid. As of 8.7, sendmail ALWAYS looks for /etc/sendmail.cf. + You can get sendmail to use the stupid vendor .cf location by + adding -DUSE_VENDOR_CF_PATH during compilation, but this may break + support programs and scripts that need to find sendmail.cf. You + are STRONGLY urged to use symbolic links if you want to use the + vendor location rather than changing the location in the sendmail + binary. SunOS 4.x (Solaris 1.x) You may have to use -lresolv on SunOS. However, beware that @@ -469,6 +609,40 @@ SunOS 4.x (Solaris 1.x) Should you want to try resolv+, it is on ftp.uu.net in /networking/ip/dns. + Apparently getservbyname() can fail under moderate to high + load under some circumstances. This will exhibit itself as + the message ``554 makeconnection: service "smtp" unknown''. + The problem has been traced to one or more blank lines in + /etc/services on the NIS server machine. Delete these + and it should work. This info is thanks to Brian Bartholomew + <bb@math.ufl.edu> of I-Kinetics, Inc. + +SunOS 4.0.2 (Sun 386i) + Date: Fri, 25 Aug 1995 11:13:58 +0200 (MET DST) + From: teus@oce.nl + + Sendmail 8.7.Beta.12 compiles and runs nearly out of the box with the + following changes: + * Don't use /usr/5bin in your PATH, but make /usr/5bin/uname + available as "uname" command. + * Use the defines "-DBSD4_3 -DNAMED_BIND=0" in the + Makefile.SunOS.4.0, which is selected via the "uname" command. + I recommend to make available the db-library on the system first + (and change the Makefile to use this library). + Note that the sendmail.cf and aliases files are found in /etc. + +SunOS 4.1.3_U1 + Sendmail causes crashes on SunOS 4.1.3_U1. According to Sun + bug number 1077939: + + If an application does a getsockopt() on a SOCK_STREAM (TCP) socket + after the other side of the connection has sent a TCP RESET for + the stream, the kernel gets a Bus Trap in the tcp_ctloutput() or + ip_ctloutput() routine. + + This is fixed in patch 101790-01 (SunOS 4.1.3_U1: TCP socket and + reset problems). + Solaris 2.x (SunOS 5.x) To compile for Solaris, be sure you use -DSOLARIS. @@ -478,7 +652,7 @@ Solaris 2.x (SunOS 5.x) From a correspondent: - For solaris 2.2, I have + For solaris 2.2, I have hosts: files dns @@ -522,8 +696,54 @@ Solaris 2.x (SunOS 5.x) Be sure you have the appropriate patch installed or you won't see system logging. +Solaris 2.4 (SunOS 5.4) + If you include /usr/lib at the end of your LD_LIBRARY_PATH you run + the risk of getting the wrong libraries under some circumstances. + This is because of a new feature in Solaris 2.4, described by + Rod.Evans@Eng.Sun.COM: + + >> Prior to SunOS 5.4, any LD_LIBRARY_PATH setting was ignored by the + >> runtime linker if the application was setxid (secure), thus your + >> applications search path would be: + >> + >> /usr/local/lib LD_LIBRARY_PATH component - IGNORED + >> /usr/lib LD_LIBRARY_PATH component - IGNORED + >> /usr/local/lib RPATH - honored + >> /usr/lib RPATH - honored + >> + >> the effect is that path 3 would be the first used, and this would + >> satisfy your resolv.so lookup. + >> + >> In SunOS 5.4 we made the LD_LIBRARY_PATH a little more flexible. + >> People who developed setxid applications wanted to be able to alter + >> the library search path to some degree to allow for their own + >> testing and debugging mechanisms. It was decided that the only + >> secure way to do this was to allow a `trusted' path to be used in + >> LD_LIBRARY_PATH. The only trusted directory we presently define + >> is /usr/lib. Thus a setuid root developer could play with some + >> alternative shared object implementations and place them in + >> /usr/lib (being root we assume they'ed have access to write in this + >> directory). This change was made as part of 1155380 - after a + >> *huge* amount of discussion regarding the security aspect of things. + >> + >> So, in SunOS 5.4 your applications search path would be: + >> + >> /usr/local/lib from LD_LIBRARY_PATH - IGNORED (untrustworthy) + >> /usr/lib from LD_LIBRARY_PATH - honored (trustworthy) + >> /usr/local/lib from RPATH - honored + >> /usr/lib from RPATH - honored + >> + >> here, path 2 would be the first used. + +Ultrix + By default, the IDENT protocol is turned off on Ultrix. If you + are running Ultrix 4.4 or later, or if you have included patch + CXO-8919 for Ultrix 4.2 or 4.3 to fix the TCP problem, you can turn + IDENT on in the configuration file by setting the "ident" timeout + to 30 seconds. + OSF/1 - If you are compiling on OSF/1 (DEC Alpha), you must use + 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. @@ -542,9 +762,17 @@ IRIX when compiling map.c; this is not important because the function being prototyped is not used in that file. -NeXT - If you are compiling on NeXT, you will have to create an empty - file "unistd.h" and create a file "dirent.h" containing: + In order to compile sendmail you will have had to install + the developers' option in order to get the necessary include + files. + +NeXT or NEXTSTEP + NEXTSTEP 3.3 and earlier ship with the old DBM library. You will + need to acquire the new Berkeley DB from ftp.cs.berkeley.edu. + Install it in /usr/local/{lib,include}. + + If you are compiling on NEXTSTEP, you will have to create an + empty file "unistd.h" and create a file "dirent.h" containing: #include <sys/dir.h> #define dirent direct @@ -626,10 +854,29 @@ A/UX (not easy at least); the gnu-dbm package "configured" and compiled easily. +SCO Unix + From: Thomas Essebier <tom@stallion.oz.au> + Organisation: Stallion Technologies Pty Ltd. + + It will probably help those who are trying to configure sendmail 8.6.9 + to know that if they are on SCO, they had better set + OI-dnsrch + or they will core dump as soon as they try to use the resolver. + ie. although SCO has _res.dnsrch defined, and is kinda BIND 4.8.3, it + does not inititialise it, nor does it understand 'search' in + /etc/named.boot. + - sigh - + DG/UX - Apparently, /bin/mail doesn't work properly for delivery on - DG/UX -- the person who has this working, Douglas Anderson - <dlander@afterlife.ncsc.mil>, used procmail instead. + Doug Anderson <dlander@afterlife.ncsc.mil> has successfully run + V8 on the DG/UX 5.4.2 and 5.4R3.x platforms under heavy usage. + Originally, the DG /bin/mail program wasn't compatible with + the V8 sendmail, since the DG /bin/mail requires the environment + variable "_FORCE_MAIL_LOCAL_=yes" be set. Version 8.7 now includes + this in the environment before invoking the local mailer. Some + have used procmail to avoid this problem in the past. It works + but some have experienced file locking problems with their DG/UX + ports of procmail. Apollo DomainOS If you are compiling on Apollo, you will have to create an empty @@ -677,10 +924,22 @@ Linux with sendmail's version of cdefs.h. Deleting sendmail's version on those systems should be non-harmful, and new versions don't care. + Sendmail assumes that libc has snprintf, which has been true since + libc 4.7.0. If you are running an older version, you will need to + use -DHASSNPRINTF=0 in the Makefile. If may be able to use -lbsd + (which includes snprintf) instead of turning this off on versions + of libc between 4.4.4 and 4.7.0 (snprintf improves security, so + you want to use this if at all possible). + AIX This version of sendmail does not support MB, MG, and MR resource records, which are supported by AIX sendmail. + Several people have reported that the IBM-supplied named returns + fairly random results -- the named should be replaced. It is not + necessary to replace the resolver, which will simplify installation. + A new BIND resolver can be found at http://www.isc.org/isc/. + RISC/os RISC/os from MIPS is a merged AT&T/Berkeley system. When you compile on that platform you will get duplicate definitions @@ -727,7 +986,7 @@ DELL SVR4 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. + 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 @@ -738,11 +997,32 @@ DELL SVR4 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 * +ConvexOS 10.1 and below + In order to use the name server, you must create the file + /etc/use_nameserver. If this file does not exist, the call + to res_init() will fail and you will have absolutely no + access to DNS, including MX records. + +Amdahl UTS 2.1.5 + In order to get UTS to work, you will have to port BIND 4.9. + The vendor's BIND is reported to be ``totally inadequate.'' + See sendmail/contrib/AmdahlUTS.patch for the patches necessary + to get BIND 4.9 compiled for UTS. + +UnixWare 2.0 + According to Alexander Kolbasov <sasha@unitech.gamma.ru>, + the m4 on UnixWare 2.0 (still in Beta) will core dump on the + config files. GNU m4 and the m4 from UnixWare 1.x both work. + +UNICOS 8.0.3.4 + Some people have reported that the -O flag on UNICOS can cause + problems. You may want to turn this off if you have problems + running sendmail. Reported by Jerry G. DeLapp <jgd@acl.lanl.gov>. Non-DNS based sites This version of sendmail always tries to connect to the Domain @@ -769,9 +1049,10 @@ GNU getopt by the double call. Use the version in conf.c instead. BIND 4.9.2 and Ultrix - If you are running on Ultrix, be sure you read the conf/Info.Ultrix - carefully -- there is information in there that you need to know - in order to avoid errors of the form: + If you are running on Ultrix, be sure you read conf/Info.Ultrix + in the BIND distribution very carefully -- there is information + in there that you need to know in order to avoid errors of the + form: /lib/libc.a(gethostent.o): sethostent: multiply defined /lib/libc.a(gethostent.o): endhostent: multiply defined @@ -780,6 +1061,35 @@ BIND 4.9.2 and Ultrix during the link stage. +strtoul + Some compilers (notably gcc) claim to be ANSI C but do not + include the ANSI-required routine "strtoul". If your compiler + has this problem, you will get an error in srvrsmtp.c on the + code: + + # ifdef defined(__STDC__) && !defined(BROKEN_ANSI_LIBRARY) + e->e_msgsize = strtoul(vp, (char **) NULL, 10); + # else + e->e_msgsize = strtol(vp, (char **) NULL, 10); + # endif + + You can use -DBROKEN_ANSI_LIBRARY to get around this problem. + +Listproc 6.0c + Date: 23 Sep 1995 23:56:07 GMT + Message-ID: <95925101334.~INN-AUMa00187.comp-news@dl.ac.uk> + From: alansz@mellers1.psych.berkeley.edu (Alan Schwartz) + Subject: Listproc 6.0c + Sendmail 8.7 [Helpful hint] + + Just upgraded to sendmail 8.7, and discovered that listproc 6.0c + breaks, because it, by default, sends a blank "HELO" rather than + a "HELO hostname" when using the 'system' or 'telnet' mailmethod. + + The fix is to include -DZMAILER in the compilation, which will + cause it to use "HELO hostname" (which Z-mail apparently requires + as well. :) + + +--------------+ | MANUAL PAGES | @@ -880,4 +1190,4 @@ version.c The version number and information about this Eric Allman -(Version 8.61.1.1, last update 3/5/95 12:52:16) +(Version 8.113, last update 11/29/95 11:05:14) diff --git a/usr.sbin/sendmail/src/TODO b/usr.sbin/sendmail/src/TODO deleted file mode 100644 index 80d35d01c8dfb..0000000000000 --- a/usr.sbin/sendmail/src/TODO +++ /dev/null @@ -1,287 +0,0 @@ -(Version 8.22 of 3/12/94) - -Key: - X -- extension (user visible change) - B -- bug fix - S -- security fix - E -- enhancement to existing algorithm - - -X **** 8 -> 7 bit MIME conversion. - -E **** Change NoReturn to be an envelope flag. [8.7] - -X **** Add M_NOLOOPBACKCHK (k) mailer flag to turn off check of name in - HELO command. [8.8] - -X **** Merge Sun changes. [8.7] - -X **** Macro giving size of the message in bytes. - -X **** Create a "service switch" abstraction that will interface with - Sun NSS, Ultrix /etc/svc.conf, etc. This will allow you to - turn off DNS entirely, a la ``OIoff''. [8.7] - -X **** Should have new mailer flags to override LocalMailer stuff: - - M_ALIASABLE (A) -- can use as the LHS of an alias. - - M_HASPWENT (w) -- should have a /etc/passwd entry. If not found - there, implies user unknown. Also implies .forward and UDB - searching, search for |, /, and :include:, etc.). - - Actually, UDB searching and |, /, and :include: mapping should - probably be on another flag. (Cannot be 'l' for back compat - reasons.) - - Need for $@host part of triple and Return-Receipt-To: processing - should also be split apart. - [8.8] - -X **** Mailer flag to enable/disable surrounding route-addrs with - angle brackets in setsender(). UUCP cleanup scripts treat - these as file redirection. - -X **** Mailer flag to override MX lookups. - -E **** Fix parseaddr to return a dummy mailer with QBADADDR set for - all cases except null input; change calls to be more sceptical - about the return value, checking this bit instead of just - checking for == NULL. (Eric Wassenaar) [8.7] - -X **** Run time configurable locking -- e.g., compile in HASFLOCK and - HASLOCKF, and then choose at runtime between these. - -B **** Aliases with .REDIRECT fail during newaliases if the "n" flag - is given. Problem is, sometimes you want them to, sometimes - you don't. Perhaps two flavors of "error" mailer? - -B **** Calls to gethostbyname with a trailing dot fail if you are - not running DNS. - -E **** Move delivery forking from sendenvelope to sendall so that - the connection cache works between split envelopes, and to - avoid a flurry of processes should you be sending to lots of - sub-lists. - -X **** Add uucp-bang mailer that strips off any domain name from - the envelope recipient address first; this is for use in - mailer table entries. - -X **** "quote" map (inverse of dequote). Lets you turn node::user - into "node::user"@DECNET.gateway - -X **** Named rulesets. - -? **** Should $( [1.2.3.4] $) convert the address to a name? - -E **** Change collect() handling to use high level timeouts instead - of per-line timeouts -- the current mechanism is swamping - the machine with system calls. (Look at KJS code.) - -E *** Long term host status -- store host status on disk for sharing - between runs. - -X *** Extend I option to allow setting of retry and timeout values. - drl@vuse.vanderbilt.edu (David R. Linn). - -X *** Total connection cache lifespan timeout -- a way to give a - timeout on connections regardless of whether they are active - or not. For single threaded servers such as Microsoft SMTP - gateway. Douglas Anderson <dlander@afterlife.ncsc.mil>. - -X *** Mailer flag that does a "ping" equivalent -- if it fails, wait - 30 seconds and try again (for dialup PPP connections). Could - just try the connection and then immediately retry on some - kinds of failures. - -X *** Create a macro that has message size. - Peter Wemm <peter@DIALix.oz.au> - -E *** Dynamically allocate MAXNAME buffers for headers. - -E *** Dynamically allocate "line" buffer in readaliases(). - -X *** Add ability to disable Return-Receipt-To: on a privacy flag. [8.8] - -X *** Add -P to set precedence (e.g., -Pbulk). [8.8] (BCX) - -X *** Runtime option to enable/disable IDENT protocol. - -E *** Don't send ErrMsgFile to postmaster bounces. (Josh Smith, - josh@osiris.ac.hmc.edu). - -X *** Add "user" map to look up a user name via getpwnam -- so that - non-local names can be forwarded to another site. [8.8] - -E *** Have daemons that start up check the alias database for - correctness and auto-rebuild if necessary. This is to handle - the case of a system crash during an alias database rebuild. - -E *** Eliminate E qf line and e_errorqueue; use e_errorsto a la - e_receiptto. This simplifies and gives symmetry. (Eric - Wassenaar) - -X *** DECNET_RELAY support in configs. - -X *** -wN command line flag to set the width of mailq output. - (Allan Johannesen) - -E *** Move mailertable lookup after UUCP-specific class checks? - (Kimmo Suominen <kim@tac.nyc.ny.us>) - -E *** Users in more than one list with different owners get duplicate - deliveries -- maybe just assign them arbitrarily to one - envelope or the other? - -X ** Make MAXBADCOMMANDS run time configurable. - -E ** Allow mailertable entries of the form ``error:message''. - -X ** Have .forward files re-queue if the home directory isn't - accessible? On some option... - (Q.G.Campbell@newcastle.ac.uk) - -X ** Have local delivery queue if NIS is down? On some option... - (Q.G.Campbell@newcastle.ac.uk) - -E ** Have nullclient configuration resolve local names to the local - mailer and then redirect them in ruleset 5; this allows you to - redirect root differently depending on the client. It's not - clear this is really a good idea though. - -E ** Move CurHostAddr into mci struct, and make CurMCI variable - point to this, so that logging will give the correct address - instead of (0) for cached connections. Motonori Nakamura. - -X ** Allow use of a generalized network service for aliasing? - How would the protocol be defined? - James Gritton <gritton@byu.edu>. - -E ** Make "local configuration error" a temporary failure? - (add EX_CONFIG to the markfailure list) - -X ** (sigh) BSMTP. - -X ** "E" configuration line that sets environment variables. - -E ** Change listen() high-load backoff to accept and issue a 4xx - message so that it responds more quickly. - -E ** Change "/usr/tmp/dead.letter" to be based on _PATH_VARTMP. - -B ** Commas in NAME envariable cause problems (Peter Wan - <peter@cc.gatech.edu>). Merge with suggestions to use - MIME-format for 8-bit characters? - -E ** Save address information that comes back as the "additional - records" part of an MX lookup, to avoid additional name server - attempts. If there is an MX record without an additional A - record, delete it (this avoids a problem with misconfigured - DNS situations). - -X ** Allow a way to extend the $Z macro with local configuration - information. - -X ** Allow $x in -bt mode to expand macro "x". (BCX) [8.8] - -X ** Allow /address in -bt mode to expand address through ruleset 0, - aliases, etc. and display results. [8.8] - -X ** "R mailer address" in -bt mode does remotename on address. - -E ** Adjust "infinite loop in rule" code to handle entire ruleset - (Code from Michael Corrigan). - -E ** Allow :include: from command line (not SMTP) to assist in - "personal list" management -- i.e., creating lists that - cannot be EXPNed. - -X ** Database (keyed lookup) auto-rebuild. - -X ** Find a good test suite and include in the distribution. - -S ** You can use symbolic links to point into protected directories. - (AEJ) - -X ** Extend OI to allow separate settings for canonification, MX, and A - lookups. [8.8?] - -X ** Add $!x class to match any number of words not in class x. (KRE) - -X ** LOCAL_RULE_5 (Spencer Sun, spencer@phoenix.Princeton.EDU) - -X ** Add "bestmx" map -- returns "best MX host" for this address. - Allows you to do automatic detection of when you are the best - MX for a given address. [8.7?] - -X ** Some way to diddle resolver flags on a per-lookup basis, such - as a flag to the map declaration. (Rick McCarty) - - Is this really a good idea? DNSRCH can be turned off by - putting a dot at the end. AAONLY? - -X ** Extend makemap to "gather" values -- i.e., merge entries that - have the same keys. [8.8] (BCX) - -E ** Allow error messages on individual addresses in the qf file. - (BCX) - -X ** Multi-character option names. [9.1] - -X ** User database extensions for mailing lists: - list:precedence -- Precedence: value for new message - list:envelopefrom -- envelope "from" value for new message - others? [8.8] - -X ** Command line switch to set precedence (for mailing list - generation). (BCX) - -B ** Restore `T' line to eliminate X-Authentication-Warning: at - inappropriate times. (Christophe Wolfhugel) - - T could become a shorthand for Ct -- i.e., create a new - predefined class. - - Eliminate "<user> set sender to <address>" message entirely? - (this is the workaround) - -B ** Return-Path: header should have <> added if not already there. - -X ** Add heuristic to determine if other end is a sendmail; use - that to decide whether or not to honor F=I mailer flag. - [der Mouse <mouse@collatz.mcrcim.mcgill.edu>] - -X ** Automatically drop into MIME mode if you have a full name - with 8-bit characters. See envelope.c 8.19.1.1 and util.c - 8.17.1.1. From Anders Ellefsrud <anders@ifi.uio.no>. - -X ** -b? flag to read a header and show you what it will look like - after all rewriting for an indicated address. - -E ** Log $u in logsender() (for=<someaddress>). - -B ** Include SOCKADDR in MCI struct for logging (currently gives - a sockaddr of zero when printing from the cache). - -X ** Allow option to set the characters that are autoquoted in - addresses? - -X * Map that does MB/MR lookups. Rick McCarty <mccarty@io.com>. - -X * Allow $> anywhere in RHS. John Boeske <jboeske@ualberta.ca>. - -X * -V flag to print state of all (?) compilation flags. - -X * Handle Expires: header field (if still in queue). - -X * WIN/3B support (non-atomic rename, no h_addr_list, others?) - (Bruce Lilly <blilly!bruce@uu.psi.com>) - -X * Sun YBTS daemon uses -ba. [Martin Kiff <MGK@newton.npl.co.uk>] - -B * EXPN adds @domain to all mailers, including prog. Is this right? - [Bob Henry] - -B * EXPN adds @localhost instead of @$M. [Pel Emanuelsson] - -E * Change body put code to time out around individual puts. This will - make the timeout algorithm more responsive and more resilient. - Unfortunately, it's also a pain in the butt. - -X * Some way to relay unfound local users to another site. - -X * Disable all default RW sets except mailer-specific? diff --git a/usr.sbin/sendmail/src/TRACEFLAGS b/usr.sbin/sendmail/src/TRACEFLAGS index f05c219c8711b..f2499aac0913c 100644 --- a/usr.sbin/sendmail/src/TRACEFLAGS +++ b/usr.sbin/sendmail/src/TRACEFLAGS @@ -4,7 +4,7 @@ 0, 44 util.c printav print address of each string 1 main.c main print from person 2 main.c finis -3 conf.c getla +3 conf.c getla, shouldqueue 4 conf.c enoughspace 5 clock.c setevent, clrevent, tick 6 savemail.c savemail, returntosender @@ -50,6 +50,9 @@ 40 queue.c queueup, orderq, dowork 41 queue.c orderq 42 mci.c mci_get +43 mime.c mime8to7 +44 recipient.c writeable +44 util.c safefile 45 envelope.c setsender 46 envelope.c openxscript 49 conf.c checkcompat @@ -61,4 +64,8 @@ 55 conf.c lockfile 59 Extended Load Average implementation from Christophe Wolfhugel 60 map.c +61 conf.c sm_gethostbyname +80 content length +81 sun remote mode 91 mci.c syslogging of MCI cache information +99 main.c avoid backgrounding (no printed output) diff --git a/usr.sbin/sendmail/src/alias.c b/usr.sbin/sendmail/src/alias.c index 9952db53fd448..2bc4487d4a361 100644 --- a/usr.sbin/sendmail/src/alias.c +++ b/usr.sbin/sendmail/src/alias.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1983 Eric P. Allman + * Copyright (c) 1983, 1995 Eric P. Allman * Copyright (c) 1988, 1993 * The Regents of the University of California. All rights reserved. * @@ -33,15 +33,14 @@ */ # include "sendmail.h" -# include <pwd.h> #ifndef lint -static char sccsid[] = "@(#)alias.c 8.25 (Berkeley) 4/14/94"; +static char sccsid[] = "@(#)alias.c 8.52 (Berkeley) 10/28/95"; #endif /* not lint */ -MAP *AliasDB[MAXALIASDB + 1]; /* actual database list */ -int NAliasDBs; /* number of alias databases */ +MAP *AliasFileMap = NULL; /* the actual aliases.files map */ +int NAliasFileMaps; /* the number of entries in AliasFileMap */ /* ** ALIAS -- Compute aliases. ** @@ -53,6 +52,7 @@ int NAliasDBs; /* number of alias databases */ ** a -- address to alias. ** sendq -- a pointer to the head of the send queue ** to put the aliases in. +** aliaslevel -- the current alias nesting depth. ** e -- the current envelope. ** ** Returns: @@ -66,19 +66,22 @@ int NAliasDBs; /* number of alias databases */ ** nothing. */ -alias(a, sendq, e) +void +alias(a, sendq, aliaslevel, e) register ADDRESS *a; ADDRESS **sendq; + int aliaslevel; register ENVELOPE *e; { register char *p; int naliases; char *owner; + auto int stat = EX_OK; char obuf[MAXNAME + 6]; extern char *aliaslookup(); if (tTd(27, 1)) - printf("alias(%s)\n", a->q_paddr); + printf("alias(%s)\n", a->q_user); /* don't realias already aliased names */ if (bitset(QDONTSEND|QBADADDR|QVERIFIED, a->q_flags)) @@ -90,10 +93,21 @@ alias(a, sendq, e) e->e_to = a->q_paddr; /* - ** Look up this name + ** Look up this name. + ** + ** If the map was unavailable, we will queue this message + ** until the map becomes available; otherwise, we could + ** bounce messages inappropriately. */ - p = aliaslookup(a->q_user, e); + p = aliaslookup(a->q_user, &stat, e); + if (stat == EX_TEMPFAIL || stat == EX_UNAVAILABLE) + { + a->q_flags |= QQUEUEUP; + if (e->e_message == NULL) + e->e_message = "alias database unavailable"; + return; + } if (p == NULL) return; @@ -108,29 +122,25 @@ alias(a, sendq, e) if (bitset(EF_VRFYONLY, e->e_flags)) { a->q_flags |= QVERIFIED; - e->e_nrcpts++; return; } - message("aliased to %s", p); + message("aliased to %s", shortenstring(p, 203)); #ifdef LOG if (LogLevel > 9) - syslog(LOG_INFO, "%s: alias %s => %s", + syslog(LOG_INFO, "%s: alias %.100s => %s", e->e_id == NULL ? "NOQUEUE" : e->e_id, - a->q_paddr, p); + a->q_paddr, shortenstring(p, 203)); #endif a->q_flags &= ~QSELFREF; - AliasLevel++; - naliases = sendtolist(p, a, sendq, e); - AliasLevel--; - if (!bitset(QSELFREF, a->q_flags)) + if (tTd(27, 5)) { - if (tTd(27, 5)) - { - printf("alias: QDONTSEND "); - printaddr(a, FALSE); - } - a->q_flags |= QDONTSEND; + printf("alias: QDONTSEND "); + printaddr(a, FALSE); } + a->q_flags |= QDONTSEND; + naliases = sendtolist(p, a, sendq, aliaslevel + 1, e); + if (bitset(QSELFREF, a->q_flags)) + a->q_flags &= ~QDONTSEND; /* ** Look for owner of alias @@ -143,7 +153,7 @@ alias(a, sendq, e) (void) strcat(obuf, a->q_user); if (!bitnset(M_USR_UPPER, a->q_mailer->m_flags)) makelower(obuf); - owner = aliaslookup(obuf, e); + owner = aliaslookup(obuf, &stat, e); if (owner == NULL) return; @@ -154,17 +164,18 @@ alias(a, sendq, e) /* announce delivery to this alias; NORECEIPT bit set later */ if (e->e_xfp != NULL) - { fprintf(e->e_xfp, "Message delivered to mailing list %s\n", a->q_paddr); - e->e_flags |= EF_SENDRECEIPT; - } + e->e_flags |= EF_SENDRECEIPT; + a->q_flags |= QDELIVERED|QEXPANDED; } /* ** ALIASLOOKUP -- look up a name in the alias file. ** ** Parameters: ** name -- the name to look up. +** pstat -- a pointer to a place to put the status. +** e -- the current envelope. ** ** Returns: ** the value of name. @@ -178,26 +189,24 @@ alias(a, sendq, e) */ char * -aliaslookup(name, e) +aliaslookup(name, pstat, e) char *name; + int *pstat; ENVELOPE *e; { - register int dbno; - register MAP *map; - register char *p; + static MAP *map = NULL; - for (dbno = 0; dbno < NAliasDBs; dbno++) + if (map == NULL) { - auto int stat; + STAB *s = stab("aliases", ST_MAP, ST_FIND); - map = AliasDB[dbno]; - if (!bitset(MF_OPEN, map->map_mflags)) - continue; - p = (*map->map_class->map_lookup)(map, name, NULL, &stat); - if (p != NULL) - return p; + if (s == NULL) + return NULL; + map = &s->s_map; } - return NULL; + if (!bitset(MF_OPEN, map->map_mflags)) + return NULL; + return (*map->map_class->map_lookup)(map, name, NULL, pstat); } /* ** SETALIAS -- set up an alias map @@ -211,6 +220,7 @@ aliaslookup(name, e) ** none. */ +void setalias(spec) char *spec; { @@ -224,7 +234,7 @@ setalias(spec) for (p = spec; p != NULL; ) { - char aname[50]; + char buf[50]; while (isspace(*p)) p++; @@ -232,16 +242,27 @@ setalias(spec) break; spec = p; - if (NAliasDBs >= MAXALIASDB) + if (NAliasFileMaps >= MAXMAPSTACK) { - syserr("Too many alias databases defined, %d max", MAXALIASDB); + syserr("Too many alias databases defined, %d max", + MAXMAPSTACK); return; } - (void) sprintf(aname, "Alias%d", NAliasDBs); - s = stab(aname, ST_MAP, ST_ENTER); + if (AliasFileMap == NULL) + { + strcpy(buf, "aliases.files sequence"); + AliasFileMap = makemapentry(buf); + if (AliasFileMap == NULL) + { + syserr("setalias: cannot create aliases.files map"); + return; + } + } + (void) sprintf(buf, "Alias%d", NAliasFileMaps); + s = stab(buf, ST_MAP, ST_ENTER); map = &s->s_map; - AliasDB[NAliasDBs] = map; bzero(map, sizeof *map); + map->map_mname = s->s_name; p = strpbrk(p, " ,/:"); if (p != NULL && *p == ':') @@ -263,6 +284,9 @@ setalias(spec) if (p != NULL) *p++ = '\0'; + if (tTd(27, 20)) + printf(" map %s:%s %s\n", class, s->s_name, spec); + /* look up class */ s = stab(class, ST_MAPCLASS, ST_FIND); if (s == NULL) @@ -281,7 +305,7 @@ setalias(spec) if (map->map_class->map_parse(map, spec)) { map->map_mflags |= MF_VALID|MF_ALIAS; - NAliasDBs++; + AliasFileMap->map_stack[NAliasFileMaps++] = map; } } } @@ -313,7 +337,7 @@ aliaswait(map, ext, isopen) bool attimeout = FALSE; time_t mtime; struct stat stb; - char buf[MAXNAME]; + char buf[MAXNAME + 1]; if (tTd(27, 3)) printf("aliaswait(%s:%s)\n", @@ -348,6 +372,7 @@ aliaswait(map, ext, isopen) sleeptime); map->map_class->map_close(map); + map->map_mflags &= ~(MF_OPEN|MF_WRITABLE); sleep(sleeptime); sleeptime *= 2; if (sleeptime > 60) @@ -380,11 +405,19 @@ aliaswait(map, ext, isopen) /* database is out of date */ if (AutoRebuild && stb.st_ino != 0 && stb.st_uid == geteuid()) { + bool oldSuprErrs; + message("auto-rebuilding alias database %s", buf); + oldSuprErrs = SuprErrs; + SuprErrs = TRUE; if (isopen) + { map->map_class->map_close(map); + map->map_mflags &= ~(MF_OPEN|MF_WRITABLE); + } rebuildaliases(map, TRUE); isopen = map->map_class->map_open(map, O_RDONLY); + SuprErrs = oldSuprErrs; } else { @@ -414,13 +447,17 @@ aliaswait(map, ext, isopen) ** DBM or DB version. */ +void rebuildaliases(map, automatic) register MAP *map; bool automatic; { FILE *af; bool nolock = FALSE; - sigfunc_t oldsigint; + sigfunc_t oldsigint, oldsigquit; +#ifdef SIGTSTP + sigfunc_t oldsigtstp; +#endif if (!bitset(MCF_REBUILDABLE, map->map_class->map_cflags)) return; @@ -428,6 +465,8 @@ rebuildaliases(map, automatic) /* try to lock the source file */ if ((af = fopen(map->map_file, "r+")) == NULL) { + struct stat stb; + if ((errno != EACCES && errno != EROFS) || automatic || (af = fopen(map->map_file, "r")) == NULL) { @@ -436,15 +475,18 @@ rebuildaliases(map, automatic) if (tTd(27, 1)) printf("Can't open %s: %s\n", map->map_file, errstring(saveerr)); - if (!automatic) + if (!automatic && !bitset(MF_OPTIONAL, map->map_mflags)) message("newaliases: cannot open %s: %s", map->map_file, errstring(saveerr)); errno = 0; return; } nolock = TRUE; - message("warning: cannot lock %s: %s", - map->map_file, errstring(errno)); + if (tTd(27, 1) || + fstat(fileno(af), &stb) < 0 || + bitset(S_IWUSR|S_IWGRP|S_IWOTH, stb.st_mode)) + message("warning: cannot lock %s: %s", + map->map_file, errstring(errno)); } /* see if someone else is rebuilding the alias file */ @@ -465,7 +507,13 @@ rebuildaliases(map, automatic) return; } + /* avoid denial-of-service attacks */ + resetlimits(); oldsigint = setsignal(SIGINT, SIG_IGN); + oldsigquit = setsignal(SIGQUIT, SIG_IGN); +#ifdef SIGTSTP + oldsigtstp = setsignal(SIGTSTP, SIG_IGN); +#endif if (map->map_class->map_open(map, O_RDWR)) { @@ -478,7 +526,7 @@ rebuildaliases(map, automatic) } #endif /* LOG */ map->map_mflags |= MF_OPEN|MF_WRITABLE; - readaliases(map, af, automatic); + readaliases(map, af, !automatic, TRUE); } else { @@ -495,10 +543,17 @@ rebuildaliases(map, automatic) /* add distinguished entries and close the database */ if (bitset(MF_OPEN, map->map_mflags)) + { map->map_class->map_close(map); + map->map_mflags &= ~(MF_OPEN|MF_WRITABLE); + } - /* restore the old signal */ + /* restore the old signals */ (void) setsignal(SIGINT, oldsigint); + (void) setsignal(SIGQUIT, oldsigquit); +#ifdef SIGTSTP + (void) setsignal(SIGTSTP, oldsigtstp); +#endif } /* ** READALIASES -- read and process the alias file. @@ -509,7 +564,9 @@ rebuildaliases(map, automatic) ** Parameters: ** map -- the alias database descriptor. ** af -- file to read the aliases from. -** automatic -- set if this was an automatic rebuild. +** announcestats -- anounce statistics regarding number of +** aliases, longest alias, etc. +** logstats -- lot the same info. ** ** Returns: ** none. @@ -519,10 +576,12 @@ rebuildaliases(map, automatic) ** Optionally, builds the .dir & .pag files. */ -readaliases(map, af, automatic) +void +readaliases(map, af, announcestats, logstats) register MAP *map; FILE *af; - int automatic; + bool announcestats; + bool logstats; { register char *p; char *rhs; @@ -627,7 +686,7 @@ readaliases(map, af, automatic) } /* see if there should be a continuation line */ - c = fgetc(af); + c = getc(af); if (!feof(af)) (void) ungetc(c, af); if (c != ' ' && c != '\t') @@ -645,7 +704,7 @@ readaliases(map, af, automatic) break; } } - if (al.q_mailer != LocalMailer) + if (!bitnset(M_ALIASABLE, al.q_mailer->m_flags)) { syserr("554 %s... cannot alias non-local names", al.q_paddr); @@ -679,11 +738,11 @@ readaliases(map, af, automatic) CurEnv->e_to = NULL; FileName = NULL; - if (Verbose || !automatic) + if (Verbose || announcestats) message("%s: %d aliases, longest %d bytes, %d bytes total", map->map_file, naliases, longest, bytes); # ifdef LOG - if (LogLevel > 7) + if (LogLevel > 7 && logstats) syslog(LOG_INFO, "%s: %d aliases, longest %d bytes, %d bytes total", map->map_file, naliases, longest, bytes); # endif /* LOG */ @@ -700,6 +759,8 @@ readaliases(map, af, automatic) ** in. ** sendq -- a pointer to the head of the send queue to ** put this user's aliases in. +** aliaslevel -- the current alias nesting depth. +** e -- the current envelope. ** ** Returns: ** none. @@ -708,9 +769,11 @@ readaliases(map, af, automatic) ** New names are added to send queues. */ -forward(user, sendq, e) +void +forward(user, sendq, aliaslevel, e) ADDRESS *user; ADDRESS **sendq; + int aliaslevel; register ENVELOPE *e; { char *pp; @@ -719,7 +782,8 @@ forward(user, sendq, e) if (tTd(27, 1)) printf("forward(%s)\n", user->q_paddr); - if (user->q_mailer != LocalMailer || bitset(QBADADDR, user->q_flags)) + if (!bitnset(M_HASPWENT, user->q_mailer->m_flags) || + bitset(QBADADDR, user->q_flags)) return; if (user->q_home == NULL) { @@ -738,17 +802,18 @@ forward(user, sendq, e) { int err; char buf[MAXPATHLEN+1]; + extern int include(); ep = strchr(pp, ':'); if (ep != NULL) *ep = '\0'; - expand(pp, buf, &buf[sizeof buf - 1], e); + expand(pp, buf, sizeof buf, e); if (ep != NULL) *ep++ = ':'; if (tTd(27, 3)) printf("forward: trying %s\n", buf); - err = include(buf, TRUE, user, sendq, e); + err = include(buf, TRUE, user, sendq, aliaslevel, e); if (err == 0) break; else if (transienterror(err)) diff --git a/usr.sbin/sendmail/src/arpadate.c b/usr.sbin/sendmail/src/arpadate.c index d3f9ac574a6fd..f6764704db07d 100644 --- a/usr.sbin/sendmail/src/arpadate.c +++ b/usr.sbin/sendmail/src/arpadate.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1983 Eric P. Allman + * Copyright (c) 1983, 1995 Eric P. Allman * Copyright (c) 1988, 1993 * The Regents of the University of California. All rights reserved. * @@ -33,7 +33,7 @@ */ #ifndef lint -static char sccsid[] = "@(#)arpadate.c 8.1 (Berkeley) 6/7/93"; +static char sccsid[] = "@(#)arpadate.c 8.4 (Berkeley) 4/21/95"; #endif /* not lint */ # include "sendmail.h" @@ -64,6 +64,17 @@ static char sccsid[] = "@(#)arpadate.c 8.1 (Berkeley) 6/7/93"; ** the format is and work appropriately. */ +#ifndef TZNAME_MAX +# define TZNAME_MAX 50 /* max size of timezone */ +#endif + +/* values for TZ_TYPE */ +#define TZ_NONE 0 /* no character timezone support */ +#define TZ_TM_NAME 1 /* use tm->tm_name */ +#define TZ_TM_ZONE 2 /* use tm->tm_zone */ +#define TZ_TZNAME 3 /* use tzname[] */ +#define TZ_TIMEZONE 4 /* use timezone() */ + char * arpadate(ud) register char *ud; @@ -75,7 +86,8 @@ arpadate(ud) register struct tm *lt; time_t t; struct tm gmt; - static char b[40]; + char *tz; + static char b[43 + TZNAME_MAX]; /* ** Get current time. @@ -147,15 +159,41 @@ arpadate(ud) off += 24 * 60; *q++ = ' '; - if (off == 0) { + if (off == 0) + { *q++ = 'G'; *q++ = 'M'; *q++ = 'T'; - } else { - if (off < 0) { + } + else + { + tz = NULL; +#if TZ_TYPE == TZ_TM_NAME + tz = lt->tm_name; +#endif +#if TZ_TYPE == TZ_TM_ZONE + tz = lt->tm_zone; +#endif +#if TZ_TYPE == TZ_TZNAME + { + extern char *tzname[]; + + tz = tzname[lt->tm_isdst]; + } +#endif +#if TZ_TYPE == TZ_TIMEZONE + { + extern char *timezone(); + + tz = timezone(off, lt->tm_isdst); + } +#endif + if (off < 0) + { off = -off; *q++ = '-'; - } else + } + else *q++ = '+'; if (off >= 24*60) /* should be impossible */ @@ -166,6 +204,14 @@ arpadate(ud) off %= 60; *q++ = (off / 10) + '0'; *q++ = (off % 10) + '0'; + if (tz != NULL && *tz != '\0') + { + *q++ = ' '; + *q++ = '('; + while (*tz != '\0') + *q++ = *tz++; + *q++ = ')'; + } } *q = '\0'; diff --git a/usr.sbin/sendmail/src/clock.c b/usr.sbin/sendmail/src/clock.c index 45ef1c2782c63..1490137170e24 100644 --- a/usr.sbin/sendmail/src/clock.c +++ b/usr.sbin/sendmail/src/clock.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1983 Eric P. Allman + * Copyright (c) 1983, 1995 Eric P. Allman * Copyright (c) 1988, 1993 * The Regents of the University of California. All rights reserved. * @@ -33,7 +33,7 @@ */ #ifndef lint -static char sccsid[] = "@(#)clock.c 8.8 (Berkeley) 1/12/94"; +static char sccsid[] = "@(#)clock.c 8.12 (Berkeley) 5/23/95"; #endif /* not lint */ # include "sendmail.h" @@ -65,7 +65,7 @@ static void tick __P((int)); EVENT * setevent(intvl, func, arg) time_t intvl; - int (*func)(); + void (*func)(); int arg; { register EVENT **evp; @@ -117,6 +117,7 @@ setevent(intvl, func, arg) ** arranges for event ev to not happen. */ +void clrevent(ev) register EVENT *ev; { @@ -182,7 +183,7 @@ tick(arg) while ((ev = EventQueue) != NULL && (ev->ev_time <= now || ev->ev_pid != mypid)) { - int (*f)(); + void (*f)(); int arg; int pid; @@ -216,10 +217,10 @@ tick(arg) sigaddset(&ss, SIGALRM); sigprocmask(SIG_UNBLOCK, &ss, NULL); #else -#ifdef SIGVTALRM +#if HASSIGSETMASK /* reset 4.2bsd signal mask to allow future alarms */ (void) sigsetmask(sigblock(0) & ~sigmask(SIGALRM)); -#endif /* SIGVTALRM */ +#endif /* HASSIGSETMASK */ #endif /* SIG_UNBLOCK */ /* call ev_func */ @@ -251,7 +252,7 @@ tick(arg) */ static bool SleepDone; -static int endsleep(); +static void endsleep(); #ifndef SLEEP_T # define SLEEP_T unsigned int @@ -262,14 +263,15 @@ sleep(intvl) unsigned int intvl; { if (intvl == 0) - return; + return (SLEEP_T) 0; SleepDone = FALSE; (void) setevent((time_t) intvl, endsleep, 0); while (!SleepDone) pause(); + return (SLEEP_T) 0; } -static +static void endsleep() { SleepDone = TRUE; diff --git a/usr.sbin/sendmail/src/collect.c b/usr.sbin/sendmail/src/collect.c index b77f6e985e31a..7e43c5f5ffa21 100644 --- a/usr.sbin/sendmail/src/collect.c +++ b/usr.sbin/sendmail/src/collect.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1983 Eric P. Allman + * Copyright (c) 1983, 1995 Eric P. Allman * Copyright (c) 1988, 1993 * The Regents of the University of California. All rights reserved. * @@ -33,7 +33,7 @@ */ #ifndef lint -static char sccsid[] = "@(#)collect.c 8.14 (Berkeley) 4/18/94"; +static char sccsid[] = "@(#)collect.c 8.49 (Berkeley) 10/29/95"; #endif /* not lint */ # include <errno.h> @@ -47,12 +47,14 @@ static char sccsid[] = "@(#)collect.c 8.14 (Berkeley) 4/18/94"; ** stripped off (after important information is extracted). ** ** Parameters: +** fp -- file to read. ** smtpmode -- if set, we are running SMTP: give an RFC821 ** style message to say we are ready to collect ** input, and never ignore a single dot to mean ** end of message. ** requeueflag -- this message will be requeued later, so ** don't do final processing on it. +** hdrp -- the location to stash the header. ** e -- the current envelope. ** ** Returns: @@ -63,36 +65,77 @@ static char sccsid[] = "@(#)collect.c 8.14 (Berkeley) 4/18/94"; ** The from person may be set. */ -char *CollectErrorMessage; -bool CollectErrno; - -collect(smtpmode, requeueflag, e) +static jmp_buf CtxCollectTimeout; +static void collecttimeout(); +static bool CollectProgress; +static EVENT *CollectTimeout; + +/* values for input state machine */ +#define IS_NORM 0 /* middle of line */ +#define IS_BOL 1 /* beginning of line */ +#define IS_DOT 2 /* read a dot at beginning of line */ +#define IS_DOTCR 3 /* read ".\r" at beginning of line */ +#define IS_CR 4 /* read a carriage return */ + +/* values for message state machine */ +#define MS_UFROM 0 /* reading Unix from line */ +#define MS_HEADER 1 /* reading message header */ +#define MS_BODY 2 /* reading message body */ + +void +collect(fp, smtpmode, requeueflag, hdrp, e) + FILE *fp; bool smtpmode; bool requeueflag; + HDR **hdrp; register ENVELOPE *e; { register FILE *tf; bool ignrdot = smtpmode ? FALSE : IgnrDot; - char buf[MAXLINE], buf2[MAXLINE]; - register char *workbuf, *freebuf; + time_t dbto = smtpmode ? TimeOuts.to_datablock : 0; + register char *bp; + int c = '\0'; bool inputerr = FALSE; - extern char *hvalue(); - extern bool isheader(), flusheol(); - - CollectErrorMessage = NULL; - CollectErrno = 0; + bool headeronly; + char *buf; + int buflen; + int istate; + int mstate; + char *pbp; + char peekbuf[8]; + char dfname[20]; + char bufbuf[MAXLINE]; + extern bool isheader(); + extern void eatheader(); + extern void tferror(); + + headeronly = hdrp != NULL; /* ** Create the temp file name and create the file. */ - e->e_df = queuename(e, 'd'); - e->e_df = newstr(e->e_df); - if ((tf = dfopen(e->e_df, O_WRONLY|O_CREAT|O_TRUNC, FileMode)) == NULL) + if (!headeronly) { - syserr("Cannot create %s", e->e_df); - NoReturn = TRUE; - finis(); + struct stat stbuf; + + strcpy(dfname, queuename(e, 'd')); + if ((tf = dfopen(dfname, O_WRONLY|O_CREAT|O_TRUNC, FileMode)) == NULL) + { + syserr("Cannot create %s", dfname); + e->e_flags |= EF_NO_BODY_RETN; + finis(); + } + if (fstat(fileno(tf), &stbuf) < 0) + e->e_dfino = -1; + else + { + e->e_dfdev = stbuf.st_dev; + e->e_dfino = stbuf.st_ino; + } + HasEightBits = FALSE; + e->e_msgsize = 0; + e->e_flags |= EF_HAS_DF; } /* @@ -102,224 +145,296 @@ collect(smtpmode, requeueflag, e) if (smtpmode) message("354 Enter mail, end with \".\" on a line by itself"); - /* set global timer to monitor progress */ - sfgetset(TimeOuts.to_datablock); + if (tTd(30, 2)) + printf("collect\n"); /* - ** Try to read a UNIX-style From line + ** Read the message. + ** + ** This is done using two interleaved state machines. + ** The input state machine is looking for things like + ** hidden dots; the message state machine is handling + ** the larger picture (e.g., header versus body). */ - if (sfgets(buf, MAXLINE, InChannel, TimeOuts.to_datablock, - "initial message read") == NULL) - goto readerr; - fixcrlf(buf, FALSE); -# ifndef NOTUNIX - if (!SaveFrom && strncmp(buf, "From ", 5) == 0) + buf = bp = bufbuf; + buflen = sizeof bufbuf; + pbp = peekbuf; + istate = IS_BOL; + mstate = SaveFrom ? MS_HEADER : MS_UFROM; + CollectProgress = FALSE; + + if (dbto != 0) { - if (!flusheol(buf, InChannel)) - goto readerr; - eatfrom(buf, e); - if (sfgets(buf, MAXLINE, InChannel, TimeOuts.to_datablock, - "message header read") == NULL) + /* handle possible input timeout */ + if (setjmp(CtxCollectTimeout) != 0) + { +#ifdef LOG + syslog(LOG_NOTICE, + "timeout waiting for input from %s during message collect", + CurHostName ? CurHostName : "<local machine>"); +#endif + errno = 0; + usrerr("451 timeout waiting for input during message collect"); goto readerr; - fixcrlf(buf, FALSE); + } + CollectTimeout = setevent(dbto, collecttimeout, dbto); } -# endif /* NOTUNIX */ - /* - ** Copy InChannel to temp file & do message editing. - ** To keep certain mailers from getting confused, - ** and to keep the output clean, lines that look - ** like UNIX "From" lines are deleted in the header. - */ - - workbuf = buf; /* `workbuf' contains a header field */ - freebuf = buf2; /* `freebuf' can be used for read-ahead */ for (;;) { - char *curbuf; - int curbuffree; - register int curbuflen; - char *p; - - /* first, see if the header is over */ - if (!isheader(workbuf)) - { - fixcrlf(workbuf, TRUE); - break; - } - - /* if the line is too long, throw the rest away */ - if (!flusheol(workbuf, InChannel)) - goto readerr; - - /* it's okay to toss '\n' now (flusheol() needed it) */ - fixcrlf(workbuf, TRUE); - - curbuf = workbuf; - curbuflen = strlen(curbuf); - curbuffree = MAXLINE - curbuflen; - p = curbuf + curbuflen; - - /* get the rest of this field */ + if (tTd(30, 35)) + printf("top, istate=%d, mstate=%d\n", istate, mstate); for (;;) { - int clen; - - if (sfgets(freebuf, MAXLINE, InChannel, - TimeOuts.to_datablock, - "message header read") == NULL) + if (pbp > peekbuf) + c = *--pbp; + else { - freebuf[0] = '\0'; - break; + while (!feof(fp) && !ferror(fp)) + { + errno = 0; + c = getc(fp); + if (errno != EINTR) + break; + clearerr(fp); + } + CollectProgress = TRUE; + if (TrafficLogFile != NULL && !headeronly) + { + if (istate == IS_BOL) + fprintf(TrafficLogFile, "%05d <<< ", + getpid()); + if (c == EOF) + fprintf(TrafficLogFile, "[EOF]\n"); + else + putc(c, TrafficLogFile); + } + if (c == EOF) + goto readerr; + if (SevenBitInput) + c &= 0x7f; + else + HasEightBits |= bitset(0x80, c); + if (!headeronly) + e->e_msgsize++; } + if (tTd(30, 94)) + printf("istate=%d, c=%c (0x%x)\n", + istate, c, c); + switch (istate) + { + case IS_BOL: + if (c == '.') + { + istate = IS_DOT; + continue; + } + break; - /* is this a continuation line? */ - if (*freebuf != ' ' && *freebuf != '\t') + case IS_DOT: + if (c == '\n' && !ignrdot && + !bitset(EF_NL_NOT_EOL, e->e_flags)) + goto readerr; + else if (c == '\r' && + !bitset(EF_CRLF_NOT_EOL, e->e_flags)) + { + istate = IS_DOTCR; + continue; + } + else if (c != '.' || + (OpMode != MD_SMTP && + OpMode != MD_DAEMON && + OpMode != MD_ARPAFTP)) + { + *pbp++ = c; + c = '.'; + } break; - if (!flusheol(freebuf, InChannel)) - goto readerr; + case IS_DOTCR: + if (c == '\n') + goto readerr; + else + { + /* push back the ".\rx" */ + *pbp++ = c; + *pbp++ = '\r'; + c = '.'; + } + break; - fixcrlf(freebuf, TRUE); - clen = strlen(freebuf) + 1; + case IS_CR: + if (c == '\n') + istate = IS_BOL; + else + { + ungetc(c, fp); + c = '\r'; + istate = IS_NORM; + } + goto bufferchar; + } - /* if insufficient room, dynamically allocate buffer */ - if (clen >= curbuffree) + if (c == '\r' && !bitset(EF_CRLF_NOT_EOL, e->e_flags)) { - /* reallocate buffer */ - int nbuflen = ((p - curbuf) + clen) * 2; - char *nbuf = xalloc(nbuflen); - - p = nbuf + curbuflen; - curbuffree = nbuflen - curbuflen; - bcopy(curbuf, nbuf, curbuflen); - if (curbuf != buf && curbuf != buf2) - free(curbuf); - curbuf = nbuf; + istate = IS_CR; + continue; } - *p++ = '\n'; - bcopy(freebuf, p, clen - 1); - p += clen - 1; - curbuffree -= clen; - curbuflen += clen; - } - *p++ = '\0'; - - e->e_msgsize += curbuflen; - - /* - ** The working buffer now becomes the free buffer, since - ** the free buffer contains a new header field. - ** - ** This is premature, since we still havent called - ** chompheader() to process the field we just created - ** (so the call to chompheader() will use `freebuf'). - ** This convolution is necessary so that if we break out - ** of the loop due to H_EOH, `workbuf' will always be - ** the next unprocessed buffer. - */ + else if (c == '\n' && !bitset(EF_NL_NOT_EOL, e->e_flags)) + istate = IS_BOL; + else + istate = IS_NORM; - { - register char *tmp = workbuf; - workbuf = freebuf; - freebuf = tmp; - } +bufferchar: + if (mstate == MS_BODY) + { + /* just put the character out */ + if (MaxMessageSize <= 0 || + e->e_msgsize <= MaxMessageSize) + putc(c, tf); + continue; + } - /* - ** Snarf header away. - */ + /* header -- buffer up */ + if (bp >= &buf[buflen - 2]) + { + char *obuf; + + if (mstate != MS_HEADER) + break; + + /* out of space for header */ + obuf = buf; + if (buflen < MEMCHUNKSIZE) + buflen *= 2; + else + buflen += MEMCHUNKSIZE; + buf = xalloc(buflen); + bcopy(obuf, buf, bp - obuf); + bp = &buf[bp - obuf]; + if (obuf != bufbuf) + free(obuf); + } + if (c != '\0') + *bp++ = c; + if (istate == IS_BOL) + break; + } + *bp = '\0'; - if (bitset(H_EOH, chompheader(curbuf, FALSE, e))) - break; +nextstate: + if (tTd(30, 35)) + printf("nextstate, istate=%d, mstate=%d, line = \"%s\"\n", + istate, mstate, buf); + switch (mstate) + { + extern int chompheader(); - /* - ** If the buffer was dynamically allocated, free it. - */ + case MS_UFROM: + mstate = MS_HEADER; +#ifndef NOTUNIX + if (strncmp(buf, "From ", 5) == 0) + { + extern void eatfrom(); - if (curbuf != buf && curbuf != buf2) - free(curbuf); - } + bp = buf; + eatfrom(buf, e); + continue; + } +#endif + /* fall through */ - if (tTd(30, 1)) - printf("EOH\n"); + case MS_HEADER: + if (!isheader(buf)) + { + mstate = MS_BODY; + goto nextstate; + } - if (*workbuf == '\0') - { - /* throw away a blank line */ - if (sfgets(buf, MAXLINE, InChannel, TimeOuts.to_datablock, - "message separator read") == NULL) - goto readerr; - } - else if (workbuf == buf2) /* guarantee `buf' contains data */ - (void) strcpy(buf, buf2); + /* check for possible continuation line */ + do + { + clearerr(fp); + errno = 0; + c = getc(fp); + } while (errno == EINTR); + if (c != EOF) + ungetc(c, fp); + if (c == ' ' || c == '\t') + { + /* yep -- defer this */ + continue; + } - /* - ** Collect the body of the message. - */ + /* trim off trailing CRLF or NL */ + if (*--bp != '\n' || *--bp != '\r') + bp++; + *bp = '\0'; + if (bitset(H_EOH, chompheader(buf, FALSE, hdrp, e))) + mstate = MS_BODY; + break; - for (;;) - { - register char *bp = buf; + case MS_BODY: + if (tTd(30, 1)) + printf("EOH\n"); + if (headeronly) + goto readerr; + bp = buf; - fixcrlf(buf, TRUE); + /* toss blank line */ + if ((!bitset(EF_CRLF_NOT_EOL, e->e_flags) && + bp[0] == '\r' && bp[1] == '\n') || + (!bitset(EF_NL_NOT_EOL, e->e_flags) && + bp[0] == '\n')) + { + break; + } - /* check for end-of-message */ - if (!ignrdot && buf[0] == '.' && (buf[1] == '\n' || buf[1] == '\0')) + /* if not a blank separator, write it out */ + if (MaxMessageSize <= 0 || + e->e_msgsize <= MaxMessageSize) + { + while (*bp != '\0') + putc(*bp++, tf); + } break; - - /* check for transparent dot */ - if ((OpMode == MD_SMTP || OpMode == MD_DAEMON) && - bp[0] == '.' && bp[1] == '.') - bp++; - - /* - ** Figure message length, output the line to the temp - ** file, and insert a newline if missing. - */ - - e->e_msgsize += strlen(bp) + 1; - fputs(bp, tf); - fputs("\n", tf); - if (ferror(tf)) - tferror(tf, e); - if (sfgets(buf, MAXLINE, InChannel, TimeOuts.to_datablock, - "message body read") == NULL) - goto readerr; + } + bp = buf; } - if (feof(InChannel) || ferror(InChannel)) - { readerr: + if ((feof(fp) && smtpmode) || ferror(fp)) + { + const char *errmsg = errstring(errno); + if (tTd(30, 1)) - printf("collect: read error\n"); + printf("collect: premature EOM: %s\n", errmsg); +#ifdef LOG + if (LogLevel >= 2) + syslog(LOG_WARNING, "collect: premature EOM: %s", errmsg); +#endif inputerr = TRUE; } /* reset global timer */ - sfgetset((time_t) 0); + clrevent(CollectTimeout); - if (fflush(tf) != 0) - tferror(tf, e); - if (fsync(fileno(tf)) < 0 || fclose(tf) < 0) + if (headeronly) + return; + + if (tf != NULL && + (fflush(tf) != 0 || ferror(tf) || fsync(fileno(tf)) < 0 || + fclose(tf) < 0)) { tferror(tf, e); + flush_errors(TRUE); finis(); } - if (CollectErrorMessage != NULL && Errors <= 0) - { - if (CollectErrno != 0) - { - errno = CollectErrno; - syserr(CollectErrorMessage, e->e_df); - finis(); - } - usrerr(CollectErrorMessage); - } - else if (inputerr && (OpMode == MD_SMTP || OpMode == MD_DAEMON)) + /* An EOF when running SMTP is an error */ + if (inputerr && (OpMode == MD_SMTP || OpMode == MD_DAEMON)) { - /* An EOF when running SMTP is an error */ char *host; char *problem; @@ -327,24 +442,28 @@ readerr: if (host == NULL) host = "localhost"; - if (feof(InChannel)) + if (feof(fp)) problem = "unexpected close"; - else if (ferror(InChannel)) + else if (ferror(fp)) problem = "I/O error"; else problem = "read timeout"; # ifdef LOG - if (LogLevel > 0 && feof(InChannel)) + if (LogLevel > 0 && feof(fp)) syslog(LOG_NOTICE, - "collect: %s on connection from %s, sender=%s: %s\n", - problem, host, e->e_from.q_paddr, errstring(errno)); + "collect: %s on connection from %.100s, sender=%s: %s", + problem, host, + shortenstring(e->e_from.q_paddr, 203), + errstring(errno)); # endif - if (feof(InChannel)) + if (feof(fp)) usrerr("451 collect: %s on connection from %s, from=%s", - problem, host, e->e_from.q_paddr); + problem, host, + shortenstring(e->e_from.q_paddr, 203)); else syserr("451 collect: %s on connection from %s, from=%s", - problem, host, e->e_from.q_paddr); + problem, host, + shortenstring(e->e_from.q_paddr, 203)); /* don't return an error indication */ e->e_to = NULL; @@ -364,84 +483,128 @@ readerr: eatheader(e, !requeueflag); + if (GrabTo && e->e_sendqueue == NULL) + usrerr("No recipient addresses found in header"); + /* collect statistics */ if (OpMode != MD_VERIFY) + { + extern void markstats(); + markstats(e, (ADDRESS *) NULL); + } /* ** Add an Apparently-To: line if we have no recipient lines. */ - if (hvalue("to", e) == NULL && hvalue("cc", e) == NULL && - hvalue("bcc", e) == NULL && hvalue("apparently-to", e) == NULL) + if (hvalue("to", e->e_header) != NULL || + hvalue("cc", e->e_header) != NULL || + hvalue("apparently-to", e->e_header) != NULL) { + /* have a valid recipient header -- delete Bcc: headers */ + e->e_flags |= EF_DELETE_BCC; + } + else if (hvalue("bcc", e->e_header) == NULL) + { + /* no valid recipient headers */ register ADDRESS *q; + char *hdr = NULL; + extern void addheader(); /* create an Apparently-To: field */ /* that or reject the message.... */ - for (q = e->e_sendqueue; q != NULL; q = q->q_next) + switch (NoRecipientAction) { - if (q->q_alias != NULL) - continue; - if (tTd(30, 3)) - printf("Adding Apparently-To: %s\n", q->q_paddr); - addheader("Apparently-To", q->q_paddr, e); + case NRA_ADD_APPARENTLY_TO: + hdr = "Apparently-To"; + break; + + case NRA_ADD_TO: + hdr = "To"; + break; + + case NRA_ADD_BCC: + addheader("Bcc", "", &e->e_header); + break; + + case NRA_ADD_TO_UNDISCLOSED: + addheader("To", "undisclosed-recipients:;", &e->e_header); + break; + } + + if (hdr != NULL) + { + for (q = e->e_sendqueue; q != NULL; q = q->q_next) + { + if (q->q_alias != NULL) + continue; + if (tTd(30, 3)) + printf("Adding %s: %s\n", + hdr, q->q_paddr); + addheader(hdr, q->q_paddr, &e->e_header); + } } } /* check for message too large */ if (MaxMessageSize > 0 && e->e_msgsize > MaxMessageSize) { + e->e_status = "5.2.3"; usrerr("552 Message exceeds maximum fixed size (%ld)", MaxMessageSize); +# ifdef LOG + if (LogLevel > 6) + syslog(LOG_NOTICE, "%s: message size (%ld) exceeds maximum (%ld)", + e->e_id, e->e_msgsize, MaxMessageSize); +# endif } - if ((e->e_dfp = fopen(e->e_df, "r")) == NULL) + /* check for illegal 8-bit data */ + if (HasEightBits) + { + e->e_flags |= EF_HAS8BIT; + if (!bitset(MM_PASS8BIT|MM_MIME8BIT, MimeMode)) + { + e->e_status = "5.6.1"; + usrerr("554 Eight bit data not allowed"); + } + } + else + { + /* if it claimed to be 8 bits, well, it lied.... */ + if (e->e_bodytype != NULL && + strcasecmp(e->e_bodytype, "8BITMIME") == 0) + e->e_bodytype = "7BIT"; + } + + if ((e->e_dfp = fopen(dfname, "r")) == NULL) { /* we haven't acked receipt yet, so just chuck this */ - syserr("Cannot reopen %s", e->e_df); + syserr("Cannot reopen %s", dfname); finis(); } } -/* -** FLUSHEOL -- if not at EOL, throw away rest of input line. -** -** Parameters: -** buf -- last line read in (checked for '\n'), -** fp -- file to be read from. -** -** Returns: -** FALSE on error from sfgets(), TRUE otherwise. -** -** Side Effects: -** none. -*/ -bool -flusheol(buf, fp) - char *buf; - FILE *fp; -{ - register char *p = buf; - char junkbuf[MAXLINE]; - while (strchr(p, '\n') == NULL) - { - CollectErrorMessage = "553 header line too long"; - CollectErrno = 0; - if (sfgets(junkbuf, MAXLINE, fp, TimeOuts.to_datablock, - "long line flush") == NULL) - return (FALSE); - p = junkbuf; - } +static void +collecttimeout(timeout) + time_t timeout; +{ + /* if no progress was made, die now */ + if (!CollectProgress) + longjmp(CtxCollectTimeout, 1); - return (TRUE); + /* otherwise reset the timeout */ + CollectTimeout = setevent(timeout, collecttimeout, timeout); + CollectProgress = FALSE; } /* ** TFERROR -- signal error on writing the temporary file. ** ** Parameters: ** tf -- the file pointer for the temporary file. +** e -- the current envelope. ** ** Returns: ** none. @@ -451,21 +614,22 @@ flusheol(buf, fp) ** Arranges for following output to go elsewhere. */ +void tferror(tf, e) FILE *tf; register ENVELOPE *e; { - CollectErrno = errno; + setstat(EX_IOERR); if (errno == ENOSPC) { struct stat st; long avail; long bsize; - NoReturn = TRUE; + e->e_flags |= EF_NO_BODY_RETN; if (fstat(fileno(tf), &st) < 0) st.st_size = 0; - (void) freopen(e->e_df, "w", tf); + (void) freopen(queuename(e, 'd'), "w", tf); if (st.st_size <= 0) fprintf(tf, "\n*** Mail could not be accepted"); else if (sizeof st.st_size > sizeof (long)) @@ -476,7 +640,7 @@ tferror(tf, e) st.st_size); fprintf(tf, "*** at %s due to lack of disk space for temp file.\n", MyHostName); - avail = freespace(QueueDir, &bsize); + avail = freediskspace(QueueDir, &bsize); if (avail > 0) { if (bsize > 1024) @@ -486,12 +650,11 @@ tferror(tf, e) fprintf(tf, "*** Currently, %ld kilobytes are available for mail temp files.\n", avail); } - CollectErrorMessage = "452 Out of disk space for temp file"; + e->e_status = "4.3.1"; + usrerr("452 Out of disk space for temp file"); } else - { - CollectErrorMessage = "cannot write message body to disk (%s)"; - } + syserr("collect: Cannot write tf%s", e->e_id); (void) freopen("/dev/null", "w", tf); } /* @@ -525,6 +688,7 @@ char *MonthList[] = NULL }; +void eatfrom(fm, e) char *fm; register ENVELOPE *e; diff --git a/usr.sbin/sendmail/src/conf.c b/usr.sbin/sendmail/src/conf.c index de71851298276..5a7e8e0ce9baf 100644 --- a/usr.sbin/sendmail/src/conf.c +++ b/usr.sbin/sendmail/src/conf.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1983 Eric P. Allman + * Copyright (c) 1983, 1995 Eric P. Allman * Copyright (c) 1988, 1993 * The Regents of the University of California. All rights reserved. * @@ -33,15 +33,13 @@ */ #ifndef lint -static char sccsid[] = "@(#)conf.c 8.89.1.3 (Berkeley) 3/7/95"; +static char sccsid[] = "@(#)conf.c 8.243 (Berkeley) 11/20/95"; #endif /* not lint */ # include "sendmail.h" # include "pathnames.h" # include <sys/ioctl.h> # include <sys/param.h> -# include <netdb.h> -# include <pwd.h> /* ** CONF.C -- Sendmail Configuration Tables. @@ -80,44 +78,47 @@ static char sccsid[] = "@(#)conf.c 8.89.1.3 (Berkeley) 3/7/95"; struct hdrinfo HdrInfo[] = { /* originator fields, most to least significant */ - "resent-sender", H_FROM|H_RESENT, - "resent-from", H_FROM|H_RESENT, - "resent-reply-to", H_FROM|H_RESENT, - "sender", H_FROM, - "from", H_FROM, - "reply-to", H_FROM, - "full-name", H_ACHECK, - "return-receipt-to", H_FROM|H_RECEIPTTO, - "errors-to", H_FROM|H_ERRORSTO, + "resent-sender", H_FROM|H_RESENT, + "resent-from", H_FROM|H_RESENT, + "resent-reply-to", H_FROM|H_RESENT, + "sender", H_FROM, + "from", H_FROM, + "reply-to", H_FROM, + "full-name", H_ACHECK, + "return-receipt-to", H_FROM|H_RECEIPTTO, + "errors-to", H_FROM|H_ERRORSTO, /* destination fields */ - "to", H_RCPT, - "resent-to", H_RCPT|H_RESENT, - "cc", H_RCPT, - "resent-cc", H_RCPT|H_RESENT, - "bcc", H_RCPT|H_ACHECK, - "resent-bcc", H_RCPT|H_ACHECK|H_RESENT, - "apparently-to", H_RCPT, + "to", H_RCPT, + "resent-to", H_RCPT|H_RESENT, + "cc", H_RCPT, + "resent-cc", H_RCPT|H_RESENT, + "bcc", H_RCPT|H_BCC, + "resent-bcc", H_RCPT|H_BCC|H_RESENT, + "apparently-to", H_RCPT, /* message identification and control */ - "message-id", 0, - "resent-message-id", H_RESENT, - "message", H_EOH, - "text", H_EOH, + "message-id", 0, + "resent-message-id", H_RESENT, + "message", H_EOH, + "text", H_EOH, /* date fields */ - "date", 0, - "resent-date", H_RESENT, + "date", 0, + "resent-date", H_RESENT, /* trace fields */ - "received", H_TRACE|H_FORCE, - "x400-received", H_TRACE|H_FORCE, - "via", H_TRACE|H_FORCE, - "mail-from", H_TRACE|H_FORCE, + "received", H_TRACE|H_FORCE, + "x400-received", H_TRACE|H_FORCE, + "via", H_TRACE|H_FORCE, + "mail-from", H_TRACE|H_FORCE, /* miscellaneous fields */ - "comments", H_FORCE, - "return-path", H_FORCE|H_ACHECK, + "comments", H_FORCE, + "return-path", H_FORCE|H_ACHECK, + "content-transfer-encoding", H_CTE, + "content-type", H_CTYPE, + "content-length", H_ACHECK, NULL, 0, }; @@ -159,25 +160,6 @@ struct prival PrivacyValues[] = */ int DtableSize = 50; /* max open files; reset in 4.2bsd */ - - -/* -** Following should be config parameters (and probably will be in -** future releases). In the meantime, setting these is considered -** unsupported, and is intentionally undocumented. -*/ - -#ifdef BROKENSMTPPEERS -bool BrokenSmtpPeers = TRUE; /* set if you have broken SMTP peers */ -#else -bool BrokenSmtpPeers = FALSE; /* set if you have broken SMTP peers */ -#endif -#ifdef NOLOOPBACKCHECK -bool CheckLoopBack = FALSE; /* set to check HELO loopback */ -#else -bool CheckLoopBack = TRUE; /* set to check HELO loopback */ -#endif - /* ** SETDEFAULTS -- set default values ** @@ -195,11 +177,24 @@ bool CheckLoopBack = TRUE; /* set to check HELO loopback */ ** default values. */ -#define DAYS * 24 * 60 * 60 +#define MINUTES * 60 +#define HOURS * 60 MINUTES +#define DAYS * 24 HOURS + +#ifndef MAXRULERECURSION +# define MAXRULERECURSION 50 /* max ruleset recursion depth */ +#endif +void setdefaults(e) register ENVELOPE *e; { + int i; + extern void inittimeouts(); + extern void setdefuser(); + extern void setupmaps(); + extern void setupmailers(); + SpaceSub = ' '; /* option B */ QueueLA = 8; /* option x */ RefuseLA = 12; /* option X */ @@ -215,14 +210,29 @@ setdefaults(e) MaxHopCount = 25; /* option h */ e->e_sendmode = SM_FORK; /* option d */ e->e_errormode = EM_PRINT; /* option e */ - SevenBit = FALSE; /* option 7 */ + SevenBitInput = FALSE; /* option 7 */ MaxMciCache = 1; /* option k */ - MciCacheTimeout = 300; /* option K */ + MciCacheTimeout = 5 MINUTES; /* option K */ LogLevel = 9; /* option L */ - settimeouts(NULL); /* option r */ - TimeOuts.to_q_return = 5 DAYS; /* option T */ - TimeOuts.to_q_warning = 0; /* option T */ + inittimeouts(NULL); /* option r */ PrivacyFlags = 0; /* option p */ +#if MIME8TO7 + MimeMode = MM_CVTMIME|MM_PASS8BIT; /* option 8 */ +#else + MimeMode = MM_PASS8BIT; +#endif + for (i = 0; i < MAXTOCLASS; i++) + { + TimeOuts.to_q_return[i] = 5 DAYS; /* option T */ + TimeOuts.to_q_warning[i] = 0; /* option T */ + } + ServiceSwitchFile = "/etc/service.switch"; + HostsFile = _PATH_HOSTS; + MustQuoteChars = "@,;:\\()[].'"; + MciInfoTimeout = 30 MINUTES; + MaxRuleRecursion = MAXRULERECURSION; + MaxAliasRecursion = 10; + ColonOkInAddr = TRUE; setdefuser(); setupmaps(); setupmailers(); @@ -233,13 +243,14 @@ setdefaults(e) ** SETDEFUSER -- set/reset DefUser using DefUid (for initgroups()) */ +void setdefuser() { struct passwd *defpwent; static char defuserbuf[40]; DefUser = defuserbuf; - if ((defpwent = getpwuid(DefUid)) != NULL) + if ((defpwent = sm_getpwuid(DefUid)) != NULL) strcpy(defuserbuf, defpwent->pw_name); else strcpy(defuserbuf, "nobody"); @@ -248,6 +259,8 @@ setdefuser() ** HOST_MAP_INIT -- initialize host class structures */ +bool host_map_init __P((MAP *map, char *args)); + bool host_map_init(MAP *map, char *args) { @@ -278,14 +291,16 @@ host_map_init(MAP *map, char *args) ** SETUPMAILERS -- initialize default mailers */ +void setupmailers() { char buf[100]; + extern void makemailer(); - strcpy(buf, "prog, P=/bin/sh, F=lsD, A=sh -c $u"); + strcpy(buf, "prog, P=/bin/sh, F=lsoD, T=DNS/RFC822/X-Unix, A=sh -c \201u"); makemailer(buf); - strcpy(buf, "*file*, P=/dev/null, F=lsDFMPEu, A=FILE"); + strcpy(buf, "*file*, P=[FILE], F=lsDFMPEou, T=DNS/RFC822/X-Unix, A=FILE"); makemailer(buf); strcpy(buf, "*include*, P=/dev/null, F=su, A=INCLUDE"); @@ -313,6 +328,7 @@ setupmailers() s->s_mapclass.map_store = store; \ } +void setupmaps() { register STAB *s; @@ -321,6 +337,7 @@ setupmaps() MAPDEF("hash", ".db", MCF_ALIASOK|MCF_REBUILDABLE, map_parseargs, hash_map_open, db_map_close, db_map_lookup, db_map_store); + MAPDEF("btree", ".db", MCF_ALIASOK|MCF_REBUILDABLE, map_parseargs, bt_map_open, db_map_close, db_map_lookup, db_map_store); @@ -334,40 +351,490 @@ setupmaps() #ifdef NIS MAPDEF("nis", NULL, MCF_ALIASOK, - map_parseargs, nis_map_open, nis_map_close, - nis_map_lookup, nis_map_store); + map_parseargs, nis_map_open, null_map_close, + nis_map_lookup, null_map_store); #endif +#ifdef NISPLUS + MAPDEF("nisplus", NULL, MCF_ALIASOK, + map_parseargs, nisplus_map_open, null_map_close, + nisplus_map_lookup, null_map_store); +#endif + +#ifdef HESIOD + MAPDEF("hesiod", NULL, MCF_ALIASOK|MCF_ALIASONLY, + map_parseargs, hes_map_open, null_map_close, + hes_map_lookup, null_map_store); +#endif + +#if NETINFO + MAPDEF("netinfo", NULL, MCF_ALIASOK, + map_parseargs, ni_map_open, null_map_close, + ni_map_lookup, null_map_store); +#endif + +#if 0 + MAPDEF("dns", NULL, 0, + dns_map_init, null_map_open, null_map_close, + dns_map_lookup, null_map_store); +#endif + +#if NAMED_BIND + /* best MX DNS lookup */ + MAPDEF("bestmx", NULL, MCF_OPTFILE, + map_parseargs, null_map_open, null_map_close, + bestmx_map_lookup, null_map_store); +#endif + + MAPDEF("host", NULL, 0, + host_map_init, null_map_open, null_map_close, + host_map_lookup, null_map_store); + + MAPDEF("text", NULL, MCF_ALIASOK, + map_parseargs, text_map_open, null_map_close, + text_map_lookup, null_map_store); + MAPDEF("stab", NULL, MCF_ALIASOK|MCF_ALIASONLY, - map_parseargs, stab_map_open, stab_map_close, + map_parseargs, stab_map_open, null_map_close, stab_map_lookup, stab_map_store); MAPDEF("implicit", NULL, MCF_ALIASOK|MCF_ALIASONLY|MCF_REBUILDABLE, map_parseargs, impl_map_open, impl_map_close, impl_map_lookup, impl_map_store); - /* host DNS lookup */ - MAPDEF("host", NULL, 0, - host_map_init, null_map_open, null_map_close, - host_map_lookup, null_map_store); + /* access to system passwd file */ + MAPDEF("user", NULL, MCF_OPTFILE, + map_parseargs, user_map_open, null_map_close, + user_map_lookup, null_map_store); /* dequote map */ MAPDEF("dequote", NULL, 0, dequote_init, null_map_open, null_map_close, dequote_map, null_map_store); -#if 0 -# ifdef USERDB +#if USERDB /* user database */ - MAPDEF("udb", ".db", 0, - udb_map_parse, null_map_open, null_map_close, + MAPDEF("userdb", ".db", 0, + map_parseargs, null_map_open, null_map_close, udb_map_lookup, null_map_store); -# endif #endif + + /* arbitrary programs */ + MAPDEF("program", NULL, MCF_ALIASOK, + map_parseargs, null_map_open, null_map_close, + prog_map_lookup, null_map_store); + + /* sequenced maps */ + MAPDEF("sequence", NULL, MCF_ALIASOK, + seq_map_parse, null_map_open, null_map_close, + seq_map_lookup, seq_map_store); + + /* switched interface to sequenced maps */ + MAPDEF("switch", NULL, MCF_ALIASOK, + map_parseargs, switch_map_open, null_map_close, + seq_map_lookup, seq_map_store); + + /* null map lookup -- really for internal use only */ + MAPDEF("null", NULL, MCF_ALIASOK|MCF_OPTFILE, + map_parseargs, null_map_open, null_map_close, + null_map_lookup, null_map_store); } #undef MAPDEF /* +** INITHOSTMAPS -- initial host-dependent maps +** +** This should act as an interface to any local service switch +** provided by the host operating system. +** +** Parameters: +** none +** +** Returns: +** none +** +** Side Effects: +** Should define maps "host" and "users" as necessary +** for this OS. If they are not defined, they will get +** a default value later. It should check to make sure +** they are not defined first, since it's possible that +** the config file has provided an override. +*/ + +void +inithostmaps() +{ + register int i; + int nmaps; + char *maptype[MAXMAPSTACK]; + short mapreturn[MAXMAPACTIONS]; + char buf[MAXLINE]; + + /* + ** Set up default hosts maps. + */ + +#if 0 + nmaps = switch_map_find("hosts", maptype, mapreturn); + for (i = 0; i < nmaps; i++) + { + if (strcmp(maptype[i], "files") == 0 && + stab("hosts.files", ST_MAP, ST_FIND) == NULL) + { + strcpy(buf, "hosts.files text -k 0 -v 1 /etc/hosts"); + (void) makemapentry(buf); + } +#if NAMED_BIND + else if (strcmp(maptype[i], "dns") == 0 && + stab("hosts.dns", ST_MAP, ST_FIND) == NULL) + { + strcpy(buf, "hosts.dns dns A"); + (void) makemapentry(buf); + } +#endif +#ifdef NISPLUS + else if (strcmp(maptype[i], "nisplus") == 0 && + stab("hosts.nisplus", ST_MAP, ST_FIND) == NULL) + { + strcpy(buf, "hosts.nisplus nisplus -k name -v address -d hosts.org_dir"); + (void) makemapentry(buf); + } +#endif +#ifdef NIS + else if (strcmp(maptype[i], "nis") == 0 && + stab("hosts.nis", ST_MAP, ST_FIND) == NULL) + { + strcpy(buf, "hosts.nis nis -d -k 0 -v 1 hosts.byname"); + (void) makemapentry(buf); + } +#endif +#if NETINFO + else if (strcmp(maptype[i], "netinfo") == 0) && + stab("hosts.netinfo", ST_MAP, ST_FIND) == NULL) + { + strcpy(buf, "hosts.netinfo netinfo -v name /machines"); + (void) makemapentry(buf); + } +#endif + } +#endif + + /* + ** Make sure we have a host map. + */ + + if (stab("host", ST_MAP, ST_FIND) == NULL) + { + /* user didn't initialize: set up host map */ + strcpy(buf, "host host"); +#if NAMED_BIND + if (ConfigLevel >= 2) + strcat(buf, " -a."); +#endif + (void) makemapentry(buf); + } + + /* + ** Set up default aliases maps + */ + + nmaps = switch_map_find("aliases", maptype, mapreturn); + for (i = 0; i < nmaps; i++) + { + if (strcmp(maptype[i], "files") == 0 && + stab("aliases.files", ST_MAP, ST_FIND) == NULL) + { + strcpy(buf, "aliases.files null"); + (void) makemapentry(buf); + } +#ifdef NISPLUS + else if (strcmp(maptype[i], "nisplus") == 0 && + stab("aliases.nisplus", ST_MAP, ST_FIND) == NULL) + { + strcpy(buf, "aliases.nisplus nisplus -kalias -vexpansion -d mail_aliases.org_dir"); + (void) makemapentry(buf); + } +#endif +#ifdef NIS + else if (strcmp(maptype[i], "nis") == 0 && + stab("aliases.nis", ST_MAP, ST_FIND) == NULL) + { + strcpy(buf, "aliases.nis nis -d mail.aliases"); + (void) makemapentry(buf); + } +#endif +#ifdef NETINFO + else if (strcmp(maptype[i], "netinfo") == 0 && + stab("aliases.netinfo", ST_MAP, ST_FIND) == NULL) + { + strcpy(buf, "aliases.netinfo netinfo /aliases"); + (void) makemapentry(buf); + } +#endif +#ifdef HESIOD + else if (strcmp(maptype[i], "hesiod") == 0 && + stab("aliases.hesiod", ST_MAP, ST_FIND) == NULL) + { + strcpy(buf, "aliases.hesiod hesiod aliases"); + (void) makemapentry(buf); + } +#endif + } + if (stab("aliases", ST_MAP, ST_FIND) == NULL) + { + strcpy(buf, "aliases switch aliases"); + (void) makemapentry(buf); + } + +#if 0 /* "user" map class is a better choice */ + /* + ** Set up default users maps. + */ + + nmaps = switch_map_find("passwd", maptype, mapreturn); + for (i = 0; i < nmaps; i++) + { + if (strcmp(maptype[i], "files") == 0 && + stab("users.files", ST_MAP, ST_FIND) == NULL) + { + strcpy(buf, "users.files text -m -z: -k0 -v6 /etc/passwd"); + (void) makemapentry(buf); + } +#ifdef NISPLUS + else if (strcmp(maptype[i], "nisplus") == 0 && + stab("users.nisplus", ST_MAP, ST_FIND) == NULL) + { + strcpy(buf, "users.nisplus nisplus -m -kname -vhome -d passwd.org_dir"); + (void) makemapentry(buf); + } +#endif +#ifdef NIS + else if (strcmp(maptype[i], "nis") == 0 && + stab("users.nis", ST_MAP, ST_FIND) == NULL) + { + strcpy(buf, "users.nis nis -m -d passwd.byname"); + (void) makemapentry(buf); + } +#endif +#ifdef HESIOD + else if (strcmp(maptype[i], "hesiod") == 0) && + stab("users.hesiod", ST_MAP, ST_FIND) == NULL) + { + strcpy(buf, "users.hesiod hesiod"); + (void) makemapentry(buf); + } +#endif + } + if (stab("users", ST_MAP, ST_FIND) == NULL) + { + strcpy(buf, "users switch -m passwd"); + (void) makemapentry(buf); + } +#endif +} +/* +** SWITCH_MAP_FIND -- find the list of types associated with a map +** +** This is the system-dependent interface to the service switch. +** +** Parameters: +** service -- the name of the service of interest. +** maptype -- an out-array of strings containing the types +** of access to use for this service. There can +** be at most MAXMAPSTACK types for a single service. +** mapreturn -- an out-array of return information bitmaps +** for the map. +** +** Returns: +** The number of map types filled in, or -1 for failure. +*/ + +#if defined(SOLARIS) || (defined(sony_news) && defined(__svr4)) +# define _USE_SUN_NSSWITCH_ +#endif + +#ifdef _USE_SUN_NSSWITCH_ +# include <nsswitch.h> +#endif + +#if defined(ultrix) || (defined(__osf__) && defined(__alpha)) +# define _USE_DEC_SVC_CONF_ +#endif + +#ifdef _USE_DEC_SVC_CONF_ +# include <sys/svcinfo.h> +#endif + +int +switch_map_find(service, maptype, mapreturn) + char *service; + char *maptype[MAXMAPSTACK]; + short mapreturn[MAXMAPACTIONS]; +{ + register FILE *fp; + int svcno; + static char buf[MAXLINE]; + +#ifdef _USE_SUN_NSSWITCH_ + struct __nsw_switchconfig *nsw_conf; + enum __nsw_parse_err pserr; + struct __nsw_lookup *lk; + int nsw_rc; + static struct __nsw_lookup lkp0 = + { "files", {1, 0, 0, 0}, NULL, NULL }; + static struct __nsw_switchconfig lkp_default = + { 0, "sendmail", 3, &lkp0 }; + + for (svcno = 0; svcno < MAXMAPACTIONS; svcno++) + mapreturn[svcno] = 0; + + if ((nsw_conf = __nsw_getconfig(service, &pserr)) == NULL) + lk = lkp_default.lookups; + else + lk = nsw_conf->lookups; + svcno = 0; + while (lk != NULL) + { + maptype[svcno] = lk->service_name; + if (lk->actions[__NSW_NOTFOUND] == __NSW_RETURN) + mapreturn[MA_NOTFOUND] |= 1 << svcno; + if (lk->actions[__NSW_TRYAGAIN] == __NSW_RETURN) + mapreturn[MA_TRYAGAIN] |= 1 << svcno; + if (lk->actions[__NSW_UNAVAIL] == __NSW_RETURN) + mapreturn[MA_TRYAGAIN] |= 1 << svcno; + svcno++; + lk = lk->next; + } + return svcno; +#endif + +#ifdef _USE_DEC_SVC_CONF_ + struct svcinfo *svcinfo; + int svc; + + for (svcno = 0; svcno < MAXMAPACTIONS; svcno++) + mapreturn[svcno] = 0; + + svcinfo = getsvc(); + if (svcinfo == NULL) + goto punt; + if (strcmp(service, "hosts") == 0) + svc = SVC_HOSTS; + else if (strcmp(service, "aliases") == 0) + svc = SVC_ALIASES; + else if (strcmp(service, "passwd") == 0) + svc = SVC_PASSWD; + else + return -1; + for (svcno = 0; svcno < SVC_PATHSIZE; svcno++) + { + switch (svcinfo->svcpath[svc][svcno]) + { + case SVC_LOCAL: + maptype[svcno] = "files"; + break; + + case SVC_YP: + maptype[svcno] = "nis"; + break; + + case SVC_BIND: + maptype[svcno] = "dns"; + break; + +#ifdef SVC_HESIOD + case SVC_HESIOD: + maptype[svcno] = "hesiod"; + break; +#endif + + case SVC_LAST: + return svcno; + } + } + return svcno; +#endif + +#if !defined(_USE_SUN_NSSWITCH_) && !defined(_USE_DEC_SVC_CONF_) + /* + ** Fall-back mechanism. + */ + + for (svcno = 0; svcno < MAXMAPACTIONS; svcno++) + mapreturn[svcno] = 0; + + svcno = 0; + fp = fopen(ServiceSwitchFile, "r"); + if (fp != NULL) + { + while (fgets(buf, sizeof buf, fp) != NULL) + { + register char *p; + + p = strpbrk(buf, "#\n"); + if (p != NULL) + *p = '\0'; + p = strpbrk(buf, " \t"); + if (p != NULL) + *p++ = '\0'; + if (strcmp(buf, service) != 0) + continue; + + /* got the right service -- extract data */ + do + { + while (isspace(*p)) + p++; + if (*p == '\0') + break; + maptype[svcno++] = p; + p = strpbrk(p, " \t"); + if (p != NULL) + *p++ = '\0'; + } while (p != NULL); + fclose(fp); + return svcno; + } + + /* service was not found -- use compiled in default */ + fclose(fp); + } +#endif + + /* if the service file doesn't work, use an absolute fallback */ + punt: + for (svcno = 0; svcno < MAXMAPACTIONS; svcno++) + mapreturn[svcno] = 0; + svcno = 0; + if (strcmp(service, "aliases") == 0) + { + maptype[svcno++] = "files"; +#ifdef AUTO_NIS_ALIASES +# ifdef NISPLUS + maptype[svcno++] = "nisplus"; +# endif +# ifdef NIS + maptype[svcno++] = "nis"; +# endif +#endif + return svcno; + } + if (strcmp(service, "hosts") == 0) + { +# if NAMED_BIND + maptype[svcno++] = "dns"; +# else +# if defined(sun) && !defined(BSD) && !defined(_USE_SUN_NSSWITCH_) + /* SunOS */ + maptype[svcno++] = "nis"; +# endif +# endif + maptype[svcno++] = "files"; + return svcno; + } + return -1; +} +/* ** USERNAME -- return the user id of the logged in user. ** ** Parameters: @@ -396,7 +863,7 @@ username() myname = getlogin(); if (myname == NULL || myname[0] == '\0') { - pw = getpwuid(RealUid); + pw = sm_getpwuid(RealUid); if (pw != NULL) myname = newstr(pw->pw_name); } @@ -405,10 +872,10 @@ username() uid_t uid = RealUid; myname = newstr(myname); - if ((pw = getpwnam(myname)) == NULL || + if ((pw = sm_getpwnam(myname)) == NULL || (uid != 0 && uid != pw->pw_uid)) { - pw = getpwuid(uid); + pw = sm_getpwuid(uid); if (pw != NULL) myname = newstr(pw->pw_name); } @@ -485,11 +952,14 @@ ttypath() ** forwarding or registration of users. ** ** If the hosts are found to be incompatible, an error -** message should be given using "usrerr" and 0 should -** be returned. +** message should be given using "usrerr" and an EX_ code +** should be returned. You can also set to->q_status to +** a DSN-style status code. ** -** 'NoReturn' can be set to suppress the return-to-sender -** function; this should be done on huge messages. +** EF_NO_BODY_RETN can be set in e->e_flags to suppress the +** body during the return-to-sender function; this should be done +** on huge messages. This bit may already be set by the ESMTP +** protocol. ** ** Parameters: ** to -- the person being sent to. @@ -501,6 +971,7 @@ ttypath() ** none (unless you include the usrerr stuff) */ +int checkcompat(to, e) register ADDRESS *to; register ENVELOPE *e; @@ -519,11 +990,12 @@ checkcompat(to, e) register STAB *s; s = stab("arpa", ST_MAILER, ST_FIND); - if (s != NULL && e->e_from.q_mailer != LocalMailer && + if (s != NULL && strcmp(e->e_from.q_mailer->m_name, "local") != 0 && to->q_mailer == s->s_mailer) { usrerr("553 No ARPA mail through this machine: see your system administration"); - /* NoReturn = TRUE; to supress return copy */ + /* e->e_flags |= EF_NO_BODY_RETN; to supress body on return */ + to->q_status = "5.7.1"; return (EX_UNAVAILABLE); } # endif /* EXAMPLE_CODE */ @@ -540,19 +1012,47 @@ setsignal(sig, handler) int sig; sigfunc_t handler; { -#if defined(SYS5SIGNALS) || defined(BSD4_3) || defined(_AUX_SOURCE) +#if defined(SYS5SIGNALS) || defined(BSD4_3) return signal(sig, handler); #else struct sigaction n, o; bzero(&n, sizeof n); n.sa_handler = handler; +# ifdef SA_RESTART + n.sa_flags = SA_RESTART; +# endif if (sigaction(sig, &n, &o) < 0) return SIG_ERR; return o.sa_handler; #endif } /* +** RELEASESIGNAL -- release a held signal +** +** Parameters: +** sig -- the signal to release. +** +** Returns: +** 0 on success. +** -1 on failure. +*/ + +int +releasesignal(sig) + int sig; +{ +#ifdef BSD4_3 + return sigsetmask(sigblock(0) & ~(1 << sig)); +#else + sigset_t sset; + + sigemptyset(&sset); + sigaddset(&sset, sig); + return sigprocmask(SIG_UNBLOCK, &sset, NULL); +#endif +} +/* ** HOLDSIGS -- arrange to hold all signals ** ** Parameters: @@ -565,6 +1065,7 @@ setsignal(sig, handler) ** Arranges that signals are held. */ +void holdsigs() { } @@ -583,6 +1084,7 @@ holdsigs() ** Arranges that signals are released. */ +void rlsesigs() { } @@ -597,6 +1099,7 @@ rlsesigs() # include <compat.h> #endif +void init_md(argc, argv) int argc; char **argv; @@ -604,6 +1107,32 @@ init_md(argc, argv) #ifdef _AUX_SOURCE setcompat(getcompat() | COMPAT_BSDPROT); #endif + +#ifdef VENDOR_DEFAULT + VendorCode = VENDOR_DEFAULT; +#else + VendorCode = VENDOR_BERKELEY; +#endif +} +/* +** INIT_VENDOR_MACROS -- vendor-dependent macro initializations +** +** Called once, on startup. +** +** Parameters: +** e -- the global envelope. +** +** Returns: +** none. +** +** Side Effects: +** vendor-dependent. +*/ + +void +init_vendor_macros(e) + register ENVELOPE *e; +{ } /* ** GETLA -- get the current load average @@ -628,15 +1157,36 @@ init_md(argc, argv) #define LA_MACH 5 /* MACH load averages (as on NeXT boxes) */ #define LA_SHORT 6 /* read kmem for avenrun; interpret as short */ #define LA_PROCSTR 7 /* read string ("1.17") from /proc/loadavg */ +#define LA_READKSYM 8 /* SVR4: use MIOC_READKSYM ioctl call */ +#define LA_DGUX 9 /* special DGUX implementation */ +#define LA_HPUX 10 /* special HPUX implementation */ /* do guesses based on general OS type */ #ifndef LA_TYPE # define LA_TYPE LA_ZERO #endif -#if (LA_TYPE == LA_INT) || (LA_TYPE == LA_FLOAT) || (LA_TYPE == LA_SHORT) +#ifndef FSHIFT +# if defined(unixpc) +# define FSHIFT 5 +# endif -#include <nlist.h> +# if defined(__alpha) || defined(IRIX) +# define FSHIFT 10 +# endif + +# if defined(_AIX3) +# define FSHIFT 16 +# endif +#endif + +#ifndef FSHIFT +# define FSHIFT 8 +#endif + +#ifndef FSCALE +# define FSCALE (1 << FSHIFT) +#endif #ifndef LA_AVENRUN # ifdef SYSTEM5 @@ -646,39 +1196,38 @@ init_md(argc, argv) # endif #endif +/* _PATH_KMEM should be defined in <paths.h> */ +#ifndef _PATH_KMEM +# define _PATH_KMEM "/dev/kmem" +#endif + +#if (LA_TYPE == LA_INT) || (LA_TYPE == LA_FLOAT) || (LA_TYPE == LA_SHORT) + +#include <nlist.h> + +#ifdef IRIX64 +# define nlist nlist64 +#endif + /* _PATH_UNIX should be defined in <paths.h> */ #ifndef _PATH_UNIX # if defined(SYSTEM5) # define _PATH_UNIX "/unix" # else -# define _PATH_UNIX "/kernel" +# define _PATH_UNIX "/vmunix" # endif #endif -struct nlist Nl[] = +#ifdef _AUX_SOURCE +struct nlist Nl[2]; +#else +struct nlist Nl[] = { { LA_AVENRUN }, -#define X_AVENRUN 0 { 0 }, }; - -#ifndef FSHIFT -# if defined(unixpc) -# define FSHIFT 5 -# endif - -# if defined(__alpha) || defined(IRIX) -# define FSHIFT 10 -# endif -#endif - -#ifndef FSHIFT -# define FSHIFT 8 -#endif - -#ifndef FSCALE -# define FSCALE (1 << FSHIFT) #endif +#define X_AVENRUN 0 getla() { @@ -692,12 +1241,12 @@ getla() double avenrun[3]; # endif #endif - extern off_t lseek(); extern int errno; + extern off_t lseek(); if (kmem < 0) { - kmem = open("/dev/kmem", 0, 0); + kmem = open(_PATH_KMEM, 0, 0); if (kmem < 0) { if (tTd(3, 1)) @@ -706,7 +1255,17 @@ getla() return (-1); } (void) fcntl(kmem, F_SETFD, 1); + +#ifdef _AUX_SOURCE + strcpy(Nl[X_AVENRUN].n_name, LA_AVENRUN); + Nl[1].n_name[0] = '\0'; +#endif + +#ifdef _AIX3 + if (knlist(Nl, 1, sizeof Nl[0]) < 0) +#else if (nlist(_PATH_UNIX, Nl) < 0) +#endif { if (tTd(3, 1)) printf("getla: nlist(%s): %s\n", _PATH_UNIX, @@ -720,13 +1279,13 @@ getla() _PATH_UNIX, LA_AVENRUN); return (-1); } -#ifdef IRIX - Nl[X_AVENRUN].n_value &= 0x7fffffff; +#ifdef NAMELISTMASK + Nl[X_AVENRUN].n_value &= NAMELISTMASK; #endif } if (tTd(3, 20)) printf("getla: symbol address = %#x\n", Nl[X_AVENRUN].n_value); - if (lseek(kmem, (off_t) Nl[X_AVENRUN].n_value, 0) == -1 || + if (lseek(kmem, (off_t) Nl[X_AVENRUN].n_value, SEEK_SET) == -1 || read(kmem, (char *) avenrun, sizeof(avenrun)) < sizeof(avenrun)) { /* thank you Ian */ @@ -734,7 +1293,7 @@ getla() printf("getla: lseek or read: %s\n", errstring(errno)); return (-1); } -#if (LA_TYPE == LA_INT) || (LA_TYPE == LA_SHORT) +# if (LA_TYPE == LA_INT) || (LA_TYPE == LA_SHORT) if (tTd(3, 5)) { printf("getla: avenrun = %d", avenrun[0]); @@ -745,7 +1304,7 @@ getla() if (tTd(3, 1)) printf("getla: %d\n", (int) (avenrun[0] + FSCALE/2) >> FSHIFT); return ((int) (avenrun[0] + FSCALE/2) >> FSHIFT); -#else +# else /* LA_TYPE == LA_FLOAT */ if (tTd(3, 5)) { printf("getla: avenrun = %g", avenrun[0]); @@ -756,28 +1315,113 @@ getla() if (tTd(3, 1)) printf("getla: %d\n", (int) (avenrun[0] +0.5)); return ((int) (avenrun[0] + 0.5)); -#endif +# endif } -#else -#if LA_TYPE == LA_SUBR +#endif /* LA_TYPE == LA_INT or LA_SHORT or LA_FLOAT */ + +#if LA_TYPE == LA_READKSYM + +# include <sys/ksym.h> + +getla() +{ + static int kmem = -1; + long avenrun[3]; + extern int errno; + struct mioc_rksym mirk; + + if (kmem < 0) + { + kmem = open("/dev/kmem", 0, 0); + if (kmem < 0) + { + if (tTd(3, 1)) + printf("getla: open(/dev/kmem): %s\n", + errstring(errno)); + return (-1); + } + (void) fcntl(kmem, F_SETFD, 1); + } + mirk.mirk_symname = LA_AVENRUN; + mirk.mirk_buf = avenrun; + mirk.mirk_buflen = sizeof(avenrun); + if (ioctl(kmem, MIOC_READKSYM, &mirk) < 0) + { + if (tTd(3, 1)) + printf("getla: ioctl(MIOC_READKSYM) failed: %s\n", + errstring(errno)); + return -1; + } + if (tTd(3, 5)) + { + printf("getla: avenrun = %d", avenrun[0]); + if (tTd(3, 15)) + printf(", %d, %d", avenrun[1], avenrun[2]); + printf("\n"); + } + if (tTd(3, 1)) + printf("getla: %d\n", (int) (avenrun[0] + FSCALE/2) >> FSHIFT); + return ((int) (avenrun[0] + FSCALE/2) >> FSHIFT); +} -#ifdef DGUX +#endif /* LA_TYPE == LA_READKSYM */ -#include <sys/dg_sys_info.h> +#if LA_TYPE == LA_DGUX -int getla() +# include <sys/dg_sys_info.h> + +int +getla() { struct dg_sys_info_load_info load_info; dg_sys_info((long *)&load_info, DG_SYS_INFO_LOAD_INFO_TYPE, DG_SYS_INFO_LOAD_VERSION_0); + if (tTd(3, 1)) + printf("getla: %d\n", (int) (load_info.one_minute + 0.5)); + return((int) (load_info.one_minute + 0.5)); } -#else +#endif /* LA_TYPE == LA_DGUX */ + +#if LA_TYPE == LA_HPUX + +/* forward declarations to keep gcc from complaining */ +struct pst_dynamic; +struct pst_status; +struct pst_static; +struct pst_vminfo; +struct pst_diskinfo; +struct pst_processor; +struct pst_lv; +struct pst_swapinfo; + +# include <sys/param.h> +# include <sys/pstat.h> + +int +getla() +{ + struct pst_dynamic pstd; + + if (pstat_getdynamic(&pstd, sizeof(struct pst_dynamic), + (size_t) 1, 0) == -1) + return 0; + + if (tTd(3, 1)) + printf("getla: %d\n", (int) (pstd.psd_avg_1_min + 0.5)); + + return (int) (pstd.psd_avg_1_min + 0.5); +} + +#endif /* LA_TYPE == LA_HPUX */ +#if LA_TYPE == LA_SUBR + +int getla() { double avenrun[3]; @@ -793,8 +1437,8 @@ getla() return ((int) (avenrun[0] + 0.5)); } -#endif /* DGUX */ -#else +#endif /* LA_TYPE == LA_SUBR */ + #if LA_TYPE == LA_MACH /* @@ -828,8 +1472,8 @@ getla() return (int) (info.load_average + (LOAD_SCALE / 2)) / LOAD_SCALE; } +#endif /* LA_TYPE == LA_MACH */ -#else #if LA_TYPE == LA_PROCSTR /* @@ -875,7 +1519,9 @@ getla() return ((int) (avenrun + 0.5)); } -#else +#endif /* LA_TYPE == LA_PROCSTR */ + +#if LA_TYPE == LA_ZERO getla() { @@ -884,10 +1530,7 @@ getla() return (0); } -#endif -#endif -#endif -#endif +#endif /* LA_TYPE == LA_ZERO */ /* @@ -915,7 +1558,7 @@ getla() /* Non Apollo stuff removed by Don Lewis 11/15/93 */ #ifndef lint -static char rcsid[] = "@(#)$Id: conf.c,v 1.6 1995/03/10 05:08:13 pst Exp $"; +static char rcsid[] = "@(#)$Id: conf.c,v 1.11 1995/12/15 13:31:48 peter Exp $"; #endif /* !lint */ #ifdef apollo @@ -958,11 +1601,28 @@ shouldqueue(pri, ctime) long pri; time_t ctime; { + bool rval; + + if (tTd(3, 30)) + printf("shouldqueue: CurrentLA=%d, pri=%d: ", CurrentLA, pri); if (CurrentLA < QueueLA) + { + if (tTd(3, 30)) + printf("FALSE (CurrentLA < QueueLA)\n"); return (FALSE); - if (CurrentLA >= RefuseLA) + } +#if 0 /* this code is reported to cause oscillation around RefuseLA */ + if (CurrentLA >= RefuseLA && QueueLA < RefuseLA) + { + if (tTd(3, 30)) + printf("TRUE (CurrentLA >= RefuseLA)\n"); return (TRUE); - return (pri > (QueueFactor / (CurrentLA - QueueLA + 1))); + } +#endif + rval = pri > (QueueFactor / (CurrentLA - QueueLA + 1)); + if (tTd(3, 30)) + printf("%s (by calculation)\n", rval ? "TRUE" : "FALSE"); + return rval; } /* ** REFUSECONNECTIONS -- decide if connections should be refused @@ -976,19 +1636,38 @@ shouldqueue(pri, ctime) ** FALSE if we should accept new work. ** ** Side Effects: -** none. +** Sets process title when it is rejecting connections. */ bool refuseconnections() { + extern bool enoughdiskspace(); + extern void setproctitle __P((const char *, ...)); + #ifdef XLA if (!xla_smtp_ok()) return TRUE; #endif - /* this is probably too simplistic */ - return (CurrentLA >= RefuseLA); + if (CurrentLA >= RefuseLA) + { + setproctitle("rejecting connections: load average: %d", + CurrentLA); + } + else if (!enoughdiskspace(MinBlocksFree + 1)) + { + setproctitle("rejecting connections: min free: %d", + MinBlocksFree); + } + else if (MaxChildren > 0 && CurChildren >= MaxChildren) + { + setproctitle("rejecting connections: maximum children: %d", + CurChildren); + } + else + return FALSE; + return TRUE; } /* ** SETPROCTITLE -- set process title for ps @@ -1005,58 +1684,135 @@ refuseconnections() ** display the title. */ -#ifdef SETPROCTITLE -# ifdef HASSETPROCTITLE - *** ERROR *** Cannot have both SETPROCTITLE and HASSETPROCTITLE defined -# endif -# ifdef __hpux +#define SPT_NONE 0 /* don't use it at all */ +#define SPT_REUSEARGV 1 /* cover argv with title information */ +#define SPT_BUILTIN 2 /* use libc builtin */ +#define SPT_PSTAT 3 /* use pstat(PSTAT_SETCMD, ...) */ +#define SPT_PSSTRINGS 4 /* use PS_STRINGS->... */ +#define SPT_SYSMIPS 5 /* use sysmips() supported by NEWS-OS 6 */ +#define SPT_SCO 6 /* write kernel u. area */ + +#ifndef SPT_TYPE +# define SPT_TYPE SPT_REUSEARGV +#endif + +#if SPT_TYPE != SPT_NONE && SPT_TYPE != SPT_BUILTIN + +# if SPT_TYPE == SPT_PSTAT # include <sys/pstat.h> # endif -# ifdef BSD4_4 +# if SPT_TYPE == SPT_PSSTRINGS # include <machine/vmparam.h> # include <sys/exec.h> -# ifdef __bsdi__ -# undef PS_STRINGS /* BSDI 1.0 doesn't do PS_STRINGS as we expect */ -# define PROCTITLEPAD '\0' -# endif -# ifdef __FreeBSD__ -# undef PS_STRINGS /* XXX This is broken due to needing<machine/pmap.h> */ -# define PROCTITLEPAD '\0' -# endif -# ifdef PS_STRINGS -# define SETPROC_STATIC static +# ifndef PS_STRINGS /* hmmmm.... apparently not available after all */ +# undef SPT_TYPE +# define SPT_TYPE SPT_REUSEARGV +# else +# ifndef NKPDE /* FreeBSD 2.0 */ +# define NKPDE 63 +typedef unsigned int *pt_entry_t; +# endif # endif # endif -# ifndef SETPROC_STATIC + +# if SPT_TYPE == SPT_PSSTRINGS +# define SETPROC_STATIC static +# else # define SETPROC_STATIC # endif -#endif -#ifndef PROCTITLEPAD -# define PROCTITLEPAD ' ' -#endif +# if SPT_TYPE == SPT_SYSMIPS +# include <sys/sysmips.h> +# include <sys/sysnews.h> +# endif + +# if SPT_TYPE == SPT_SCO +# include <sys/immu.h> +# include <sys/dir.h> +# include <sys/user.h> +# include <sys/fs/s5param.h> +# if PSARGSZ > MAXLINE +# define SPT_BUFSIZE PSARGSZ +# endif +# endif + +# ifndef SPT_PADCHAR +# define SPT_PADCHAR ' ' +# endif + +# ifndef SPT_BUFSIZE +# define SPT_BUFSIZE MAXLINE +# endif + +#endif /* SPT_TYPE != SPT_NONE && SPT_TYPE != SPT_BUILTIN */ + +/* +** Pointers for setproctitle. +** This allows "ps" listings to give more useful information. +*/ + +char **Argv = NULL; /* pointer to argument vector */ +char *LastArgv = NULL; /* end of argv */ + +void +initsetproctitle(argc, argv, envp) + int argc; + char **argv; + char **envp; +{ + register int i; + extern char **environ; + + /* + ** Move the environment so setproctitle can use the space at + ** the top of memory. + */ + + for (i = 0; envp[i] != NULL; i++) + continue; + environ = (char **) xalloc(sizeof (char *) * (i + 1)); + for (i = 0; envp[i] != NULL; i++) + environ[i] = newstr(envp[i]); + environ[i] = NULL; + + /* + ** Save start and extent of argv for setproctitle. + */ + + Argv = argv; + if (i > 0) + LastArgv = envp[i - 1] + strlen(envp[i - 1]); + else + LastArgv = argv[argc - 1] + strlen(argv[argc - 1]); +} + +#if SPT_TYPE != SPT_BUILTIN -#ifndef HASSETPROCTITLE /*VARARGS1*/ -#ifdef __STDC__ -setproctitle(char *fmt, ...) -#else +void +# ifdef __STDC__ +setproctitle(const char *fmt, ...) +# else setproctitle(fmt, va_alist) - char *fmt; + const char *fmt; va_dcl -#endif +# endif { -# ifdef SETPROCTITLE +# if SPT_TYPE != SPT_NONE register char *p; register int i; - SETPROC_STATIC char buf[MAXLINE]; + SETPROC_STATIC char buf[SPT_BUFSIZE]; VA_LOCAL_DECL -# ifdef __hpux +# if SPT_TYPE == SPT_PSTAT union pstun pst; # endif - extern char **Argv; - extern char *LastArgv; +# if SPT_TYPE == SPT_SCO + off_t seek_off; + static int kmem = -1; + static int kmempid = -1; + struct user u; +# endif p = buf; @@ -1066,19 +1822,39 @@ setproctitle(fmt, va_alist) /* print the argument string */ VA_START(fmt); - (void) vsprintf(p, fmt, ap); + (void) vsnprintf(p, sizeof buf - (p - buf), fmt, ap); VA_END; i = strlen(buf); -# ifdef __hpux +# if SPT_TYPE == SPT_PSTAT pst.pst_command = buf; pstat(PSTAT_SETCMD, pst, i, 0, 0); -# else -# ifdef PS_STRINGS +# endif +# if SPT_TYPE == SPT_PSSTRINGS PS_STRINGS->ps_nargvstr = 1; PS_STRINGS->ps_argvstr = buf; -# else +# endif +# if SPT_TYPE == SPT_SYSMIPS + sysmips(SONY_SYSNEWS, NEWS_SETPSARGS, buf); +# endif +# if SPT_TYPE == SPT_SCO + if (kmem < 0 || kmempid != getpid()) + { + if (kmem >= 0) + close(kmem); + kmem = open(_PATH_KMEM, O_RDWR, 0); + if (kmem < 0) + return; + (void) fcntl(kmem, F_SETFD, 1); + kmempid = getpid(); + } + buf[PSARGSZ - 1] = '\0'; + seek_off = UVUBLK + (off_t) u.u_psargs - (off_t) &u; + if (lseek(kmem, (char *) seek_off, SEEK_SET) == seek_off) + (void) write(kmem, buf, PSARGSZ); +# endif +# if SPT_TYPE == SPT_REUSEARGV if (i > LastArgv - Argv[0] - 2) { i = LastArgv - Argv[0] - 2; @@ -1087,18 +1863,18 @@ setproctitle(fmt, va_alist) (void) strcpy(Argv[0], buf); p = &Argv[0][i]; while (p < LastArgv) - *p++ = PROCTITLEPAD; -# endif + *p++ = SPT_PADCHAR; + Argv[1] = NULL; # endif -# endif /* SETPROCTITLE */ +# endif /* SPT_TYPE != SPT_NONE */ } -#endif +#endif /* SPT_TYPE != SPT_BUILTIN */ /* ** REAPCHILD -- pick up the body of my child, lest it become a zombie ** ** Parameters: -** none. +** sig -- the signal that got us here (unused). ** ** Returns: ** none. @@ -1108,7 +1884,8 @@ setproctitle(fmt, va_alist) */ void -reapchild() +reapchild(sig) + int sig; { int olderrno = errno; # ifdef HASWAITPID @@ -1127,18 +1904,19 @@ reapchild() #endif break; } + CurChildren--; } # else # ifdef WNOHANG union wait status; while (wait3(&status, WNOHANG, (struct rusage *) NULL) > 0) - continue; + CurChildren--; # else /* WNOHANG */ auto int status; while (wait(&status) > 0) - continue; + CurChildren--; # endif /* WNOHANG */ # endif # ifdef SYS5SIGNALS @@ -1147,6 +1925,107 @@ reapchild() errno = olderrno; } /* +** PUTENV -- emulation of putenv() in terms of setenv() +** +** Not needed on Posix-compliant systems. +** This doesn't have full Posix semantics, but it's good enough +** for sendmail. +** +** Parameter: +** env -- the environment to put. +** +** Returns: +** none. +*/ + +#ifdef NEEDPUTENV + +# if NEEDPUTENV == 2 /* no setenv(3) call available */ + +int +putenv(str) + char *str; +{ + char **current; + int matchlen, envlen=0; + char *tmp; + char **newenv; + static int first=1; + extern char **environ; + + /* + * find out how much of str to match when searching + * for a string to replace. + */ + if ((tmp = index(str, '=')) == NULL || tmp == str) + matchlen = strlen(str); + else + matchlen = (int) (tmp - str); + ++matchlen; + + /* + * Search for an existing string in the environment and find the + * length of environ. If found, replace and exit. + */ + for (current=environ; *current; current++) { + ++envlen; + + if (strncmp(str, *current, matchlen) == 0) { + /* found it, now insert the new version */ + *current = (char *)str; + return(0); + } + } + + /* + * There wasn't already a slot so add space for a new slot. + * If this is our first time through, use malloc(), else realloc(). + */ + if (first) { + newenv = (char **) malloc(sizeof(char *) * (envlen + 2)); + if (newenv == NULL) + return(-1); + + first=0; + (void) memcpy(newenv, environ, sizeof(char *) * envlen); + } else { + newenv = (char **) realloc((char *)environ, sizeof(char *) * (envlen + 2)); + if (newenv == NULL) + return(-1); + } + + /* actually add in the new entry */ + environ = newenv; + environ[envlen] = (char *)str; + environ[envlen+1] = NULL; + + return(0); +} + +#else /* implement putenv() in terms of setenv() */ + +int +putenv(env) + char *env; +{ + char *p; + int l; + char nbuf[100]; + + p = strchr(env, '='); + if (p == NULL) + return 0; + l = p - env; + if (l > sizeof nbuf - 1) + l = sizeof nbuf - 1; + bcopy(env, nbuf, l); + nbuf[l] = '\0'; + return setenv(nbuf, ++p, 1); +} + +# endif +#endif +/* ** UNSETENV -- remove a variable from the environment ** ** Not needed on newer systems. @@ -1353,10 +2232,11 @@ fsync(fd) ** DGUX_INET_ADDR -- inet_addr for DG/UX ** ** Data General DG/UX version of inet_addr returns a struct in_addr -** instead of a long. This patches things. +** instead of a long. This patches things. Only needed on versions +** prior to 5.4.3. */ -#ifdef DGUX +#ifdef DGUX_5_4_2 #undef inet_addr @@ -1399,13 +2279,14 @@ static char sccsid[] = "@(#)getopt.c 4.3 (Berkeley) 3/9/86"; * get option letter from argument vector */ #ifdef _CONVEX_SOURCE -extern int optind, opterr; +extern int optind, opterr, optopt; +extern char *optarg; #else int opterr = 1; /* if error message should be printed */ int optind = 1; /* index into parent argv vector */ -#endif int optopt = 0; /* character checked for validity */ char *optarg = NULL; /* argument associated with option */ +#endif #define BADCH (int)'?' #define EMSG "" @@ -1467,12 +2348,12 @@ getopt(nargc,nargv,ostr) #define MAXARG 16 vfprintf(fp, fmt, ap) - FILE * fp; - char * fmt; - char ** ap; + FILE *fp; + char *fmt; + char **ap; { - char * bp[MAXARG]; - int i = 0; + char *bp[MAXARG]; + int i = 0; while (*ap && i < MAXARG) bp[i++] = *ap++; @@ -1483,12 +2364,12 @@ vfprintf(fp, fmt, ap) } vsprintf(s, fmt, ap) - char * s; - char * fmt; - char ** ap; + char *s; + char *fmt; + char **ap; { - char * bp[MAXARG]; - int i = 0; + char *bp[MAXARG]; + int i = 0; while (*ap && i < MAXARG) bp[i++] = *ap++; @@ -1500,9 +2381,60 @@ vsprintf(s, fmt, ap) #endif /* +** SNPRINTF, VSNPRINT -- counted versions of printf +** +** These are at best crude emulations. +*/ + +#if !HASSNPRINTF + +void +# ifdef __STDC__ +snprintf(char *buf, size_t bufsize, const char *fmt, ...) +# else +snprintf(buf, bufsize, fmt, va_alist) + char *buf; + size_t bufsize; + const char *fmt; + va_dcl +# endif +{ + VA_LOCAL_DECL + + VA_START(fmt); + vsprintf(buf, fmt, ap); + VA_END; +# if defined(XDEBUG) && defined(LOG) + if (strlen(buf) > bufsize) + syslog(LOG_ALERT, "INTERNAL ERROR: snprintf overflow: %s", + shortenstring(buf, 200)); +# endif +} + + +#ifndef luna2 +void +vsnprintf(buf, bufsize, fmt, ap) + char *buf; + size_t bufsize; + const char *fmt; + va_list ap; +{ + vsprintf(buf, fmt, ap); +# if defined(XDEBUG) && defined(LOG) + if (strlen(buf) > bufsize) + syslog(LOG_ALERT, "INTERNAL ERROR: vsnprintf overflow: %s", + shortenstring(buf, 200)); +# endif +} +#endif + +#endif +/* ** USERSHELLOK -- tell if a user's shell is ok for unrestricted use ** ** Parameters: +** user -- the name of the user we are checking. ** shell -- the user's shell from /etc/passwd ** ** Returns: @@ -1516,19 +2448,45 @@ vsprintf(s, fmt, ap) # define _PATH_SHELLS "/etc/shells" # endif +# ifdef _AIX3 +# include <userconf.h> +# include <usersec.h> +# endif + char *DefaultUserShells[] = { - "/bin/sh", + "/bin/sh", /* standard shell */ "/usr/bin/sh", - "/bin/csh", + "/bin/csh", /* C shell */ "/usr/bin/csh", #ifdef __hpux - "/bin/rsh", - "/bin/ksh", - "/bin/rksh", +# ifdef V4FS + "/usr/bin/rsh", /* restricted Bourne shell */ + "/usr/bin/ksh", /* Korn shell */ + "/usr/bin/rksh", /* restricted Korn shell */ + "/usr/bin/pam", + "/usr/bin/keysh", /* key shell (extended Korn shell) */ + "/usr/bin/posix/sh", +# else + "/bin/rsh", /* restricted Bourne shell */ + "/bin/ksh", /* Korn shell */ + "/bin/rksh", /* restricted Korn shell */ "/bin/pam", - "/usr/bin/keysh", + "/usr/bin/keysh", /* key shell (extended Korn shell) */ "/bin/posix/sh", +# endif +#endif +#ifdef _AIX3 + "/bin/ksh", /* Korn shell */ + "/usr/bin/ksh", + "/bin/tsh", /* trusted shell */ + "/usr/bin/tsh", + "/bin/bsh", /* Bourne shell */ + "/usr/bin/bsh", +#endif +#ifdef __svr4__ + "/bin/ksh", /* Korn shell */ + "/usr/bin/ksh", #endif NULL }; @@ -1538,14 +2496,16 @@ char *DefaultUserShells[] = #define WILDCARD_SHELL "/SENDMAIL/ANY/SHELL/" bool -usershellok(shell) +usershellok(user, shell) + char *user; char *shell; { #if HASGETUSERSHELL register char *p; extern char *getusershell(); - if (shell == NULL || shell[0] == '\0') + if (shell == NULL || shell[0] == '\0' || wordinclass(user, 't') || + ConfigLevel <= 1) return TRUE; setusershell(); @@ -1555,12 +2515,41 @@ usershellok(shell) endusershell(); return p != NULL; #else +# if USEGETCONFATTR + auto char *v; +# endif register FILE *shellf; char buf[MAXLINE]; - if (shell == NULL || shell[0] == '\0') + if (shell == NULL || shell[0] == '\0' || wordinclass(user, 't')) return TRUE; +# if USEGETCONFATTR + /* + ** Naturally IBM has a "better" idea..... + ** + ** What a crock. This interface isn't documented, it is + ** considered part of the security library (-ls), and it + ** only works if you are running as root (since the list + ** of valid shells is obviously a source of great concern). + ** I recommend that you do NOT define USEGETCONFATTR, + ** especially since you are going to have to set up an + ** /etc/shells anyhow to handle the cases where getconfattr + ** fails. + */ + + if (getconfattr(SC_SYS_LOGIN, SC_SHELLS, &v, SEC_LIST) == 0 && v != NULL) + { + while (*v != '\0') + { + if (strcmp(v, shell) == 0 || strcmp(v, WILDCARD_SHELL) == 0) + return TRUE; + v += strlen(v) + 1; + } + return FALSE; + } +# endif + shellf = fopen(_PATH_SHELLS, "r"); if (shellf == NULL) { @@ -1599,7 +2588,7 @@ usershellok(shell) #endif } /* -** FREESPACE -- see how much free space is on the queue filesystem +** FREEDISKSPACE -- see how much free space is on the queue filesystem ** ** Only implemented if you have statfs. ** @@ -1646,7 +2635,7 @@ usershellok(shell) #endif long -freespace(dir, bsize) +freediskspace(dir, bsize) char *dir; long *bsize; { @@ -1655,26 +2644,25 @@ freespace(dir, bsize) struct ustat fs; struct stat statbuf; # define FSBLOCKSIZE DEV_BSIZE -# define f_bavail f_tfree +# define SFS_BAVAIL f_tfree # else # if defined(ultrix) struct fs_data fs; -# define f_bavail fd_bfreen -# define FSBLOCKSIZE fs.fd_bsize +# define SFS_BAVAIL fd_bfreen +# define FSBLOCKSIZE 1024L # else # if SFS_TYPE == SFS_STATVFS struct statvfs fs; -# define FSBLOCKSIZE fs.f_bsize +# define FSBLOCKSIZE fs.f_frsize # else struct statfs fs; # define FSBLOCKSIZE fs.f_bsize -# if defined(_SCO_unix_) || defined(IRIX) || defined(apollo) -# define f_bavail f_bfree -# endif # endif # endif # endif - extern int errno; +# ifndef SFS_BAVAIL +# define SFS_BAVAIL f_bavail +# endif # if SFS_TYPE == SFS_USTAT if (stat(dir, &statbuf) == 0 && ustat(statbuf.st_dev, &fs) == 0) @@ -1682,23 +2670,30 @@ freespace(dir, bsize) # if SFS_TYPE == SFS_4ARGS if (statfs(dir, &fs, sizeof fs, 0) == 0) # else -# if defined(ultrix) - if (statfs(dir, &fs) > 0) +# if SFS_TYPE == SFS_STATVFS + if (statvfs(dir, &fs) == 0) # else +# if defined(ultrix) + if (statfs(dir, &fs) > 0) +# else if (statfs(dir, &fs) == 0) +# endif # endif # endif # endif { if (bsize != NULL) *bsize = FSBLOCKSIZE; - return (fs.f_bavail); + if (fs.SFS_BAVAIL < 0) + return 0; + else + return fs.SFS_BAVAIL; } #endif return (-1); } /* -** ENOUGHSPACE -- check to see if there is enough free space on the queue fs +** ENOUGHDISKSPACE -- is there enough free space on the queue fs? ** ** Only implemented if you have statfs. ** @@ -1713,7 +2708,7 @@ freespace(dir, bsize) */ bool -enoughspace(msize) +enoughdiskspace(msize) long msize; { long bfree, bsize; @@ -1721,14 +2716,14 @@ enoughspace(msize) if (MinBlocksFree <= 0 && msize <= 0) { if (tTd(4, 80)) - printf("enoughspace: no threshold\n"); + printf("enoughdiskspace: no threshold\n"); return TRUE; } - if ((bfree = freespace(QueueDir, &bsize)) >= 0) + if ((bfree = freediskspace(QueueDir, &bsize)) >= 0) { if (tTd(4, 80)) - printf("enoughspace: bavail=%ld, need=%ld\n", + printf("enoughdiskspace: bavail=%ld, need=%ld\n", bfree, msize); /* convert msize to block count */ @@ -1742,14 +2737,16 @@ enoughspace(msize) if (LogLevel > 0) syslog(LOG_ALERT, "%s: low on space (have %ld, %s needs %ld in %s)", - CurEnv->e_id, bfree, - CurHostName, msize, QueueDir); + CurEnv->e_id == NULL ? "[NOQUEUE]" : CurEnv->e_id, + bfree, + CurHostName == NULL ? "SMTP-DAEMON" : CurHostName, + msize, QueueDir); #endif return FALSE; } } else if (tTd(4, 80)) - printf("enoughspace failure: min=%ld, need=%ld: %s\n", + printf("enoughdiskspace failure: min=%ld, need=%ld: %s\n", MinBlocksFree, msize, errstring(errno)); return TRUE; } @@ -1850,6 +2847,7 @@ transienterror(err) #if defined(ENOSR) && (!defined(ENOBUFS) || (ENOBUFS != ENOSR)) case ENOSR: /* Out of streams resources */ #endif + case EOPENTIMEOUT: /* PSEUDO: open timed out */ return TRUE; } @@ -2011,7 +3009,7 @@ chownsafe(fd) rval = fchown(tfd, DefUid, DefGid) != 0; close(tfd); unlink(s); - setreuid(o_uid, o_euid); + setresuid(o_uid, o_euid, -1); setresgid(o_gid, o_egid, -1); return rval; #else @@ -2023,18 +3021,62 @@ chownsafe(fd) # endif # else # ifdef _PC_CHOWN_RESTRICTED - return fpathconf(fd, _PC_CHOWN_RESTRICTED) > 0; -# else -# ifdef BSD + int rval; + + /* + ** Some systems (e.g., SunOS) seem to have the call and the + ** #define _PC_CHOWN_RESTRICTED, but don't actually implement + ** the call. This heuristic checks for that. + */ + + errno = 0; + rval = fpathconf(fd, _PC_CHOWN_RESTRICTED); + if (errno == 0) + return rval > 0; +# endif +# ifdef BSD return TRUE; -# else +# else return FALSE; -# endif # endif # endif #endif } /* +** RESETLIMITS -- reset system controlled resource limits +** +** This is to avoid denial-of-service attacks +** +** Parameters: +** none +** +** Returns: +** none +*/ + +#if HASSETRLIMIT +# ifdef apollo +# include <sys/time.h> +# endif +# include <sys/resource.h> +#endif + +void +resetlimits() +{ +#if HASSETRLIMIT + struct rlimit lim; + + lim.rlim_cur = lim.rlim_max = RLIM_INFINITY; + (void) setrlimit(RLIMIT_CPU, &lim); + (void) setrlimit(RLIMIT_FSIZE, &lim); +#else +# if HASULIMIT + (void) ulimit(2, 0x3fffff); +# endif +#endif +} +/* ** GETCFNAME -- return the name of the .cf file. ** ** Some systems (e.g., NeXT) determine this dynamically. @@ -2043,18 +3085,21 @@ chownsafe(fd) char * getcfname() { + if (ConfFile != NULL) return ConfFile; -#ifdef NETINFO +#if NETINFO { extern char *ni_propval(); char *cflocation; - cflocation = ni_propval("/locations/sendmail", "sendmail.cf"); + cflocation = ni_propval("/locations", NULL, "sendmail", + "sendmail.cf", '\0'); if (cflocation != NULL) return cflocation; } #endif + return _PATH_SENDMAILCF; } /* @@ -2079,13 +3124,49 @@ setvendor(vendor) char *vendor; { if (strcasecmp(vendor, "Berkeley") == 0) + { + VendorCode = VENDOR_BERKELEY; return TRUE; + } /* add vendor extensions here */ +#ifdef SUN_EXTENSIONS + if (strcasecmp(vendor, "Sun") == 0) + { + VendorCode = VENDOR_SUN; + return TRUE; + } +#endif + return FALSE; } /* +** VENDOR_PRE_DEFAULTS, VENDOR_POST_DEFAULTS -- set vendor-specific defaults +** +** Vendor_pre_defaults is called before reading the configuration +** file; vendor_post_defaults is called immediately after. +** +** Parameters: +** e -- the global environment to initialize. +** +** Returns: +** none. +*/ + +void +vendor_pre_defaults(e) + ENVELOPE *e; +{ +} + + +void +vendor_post_defaults(e) + ENVELOPE *e; +{ +} +/* ** STRTOL -- convert string to long integer ** ** For systems that don't have it in the C library. @@ -2191,40 +3272,127 @@ strtol(nptr, endptr, base) #endif /* -** SOLARIS_GETHOSTBY{NAME,ADDR} -- compatibility routines for gethostbyXXX +** STRSTR -- find first substring in string +** +** Parameters: +** big -- the big (full) string. +** little -- the little (sub) string. ** -** Solaris versions prior through 2.3 don't properly deliver a -** canonical h_name field. This tries to work around it. +** Returns: +** A pointer to the first instance of little in big. +** big if little is the null string. +** NULL if little is not contained in big. */ -#ifdef SOLARIS +#ifdef NEEDSTRSTR + +char * +strstr(big, little) + char *big; + char *little; +{ + register char *p = big; + int l; -extern int h_errno; + if (*little == '\0') + return big; + l = strlen(little); + + while ((p = strchr(p, *little)) != NULL) + { + if (strncmp(p, little, l) == 0) + return p; + p++; + } + return NULL; +} + +#endif +/* +** SM_GETHOSTBY{NAME,ADDR} -- compatibility routines for gethostbyXXX +** +** Some operating systems have wierd problems with the gethostbyXXX +** routines. For example, Solaris versions at least through 2.3 +** don't properly deliver a canonical h_name field. This tries to +** work around these problems. +*/ struct hostent * -solaris_gethostbyname(name) - const char *name; +sm_gethostbyname(name) + char *name; { -# ifdef SOLARIS_2_3 + struct hostent *h; +#if defined(SOLARIS) && SOLARIS < 204 || defined(sony_news) && defined(__svr4) +# if SOLARIS == 203 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); + if (tTd(61, 10)) + printf("_switch_gethostbyname_r(%s)... ", name); + h = _switch_gethostbyname_r(name, &hp, buf, sizeof(buf), &h_errno); # else extern struct hostent *__switch_gethostbyname(); - return __switch_gethostbyname(name); + if (tTd(61, 10)) + printf("__switch_gethostbyname(%s)... ", name); + h = __switch_gethostbyname(name); # endif +#else + int nmaps; + char *maptype[MAXMAPSTACK]; + short mapreturn[MAXMAPACTIONS]; + char hbuf[MAXNAME]; + + if (tTd(61, 10)) + printf("gethostbyname(%s)... ", name); + h = gethostbyname(name); + if (h == NULL) + { + if (tTd(61, 10)) + printf("failure\n"); + + nmaps = switch_map_find("hosts", maptype, mapreturn); + while (--nmaps >= 0) + if (strcmp(maptype[nmaps], "nis") == 0 || + strcmp(maptype[nmaps], "files") == 0) + break; + if (nmaps >= 0) + { + /* try short name */ + if (strlen(name) > sizeof hbuf - 1) + return NULL; + strcpy(hbuf, name); + shorten_hostname(hbuf); + + /* if it hasn't been shortened, there's no point */ + if (strcmp(hbuf, name) != 0) + { + if (tTd(61, 10)) + printf("gethostbyname(%s)... ", hbuf); + h = gethostbyname(hbuf); + } + } + } +#endif + if (tTd(61, 10)) + { + if (h == NULL) + printf("failure\n"); + else + printf("%s\n", h->h_name); + } + return h; } struct hostent * -solaris_gethostbyaddr(addr, len, type) - const char *addr; +sm_gethostbyaddr(addr, len, type) + char *addr; int len; int type; { -# ifdef SOLARIS_2_3 +#if defined(SOLARIS) && SOLARIS < 204 +# if SOLARIS == 203 static struct hostent hp; static char buf[1000]; extern struct hostent *_switch_gethostbyaddr_r(); @@ -2235,122 +3403,155 @@ solaris_gethostbyaddr(addr, len, type) return __switch_gethostbyaddr(addr, len, type); # endif +#else + return gethostbyaddr(addr, len, type); +#endif } +/* +** SM_GETPW{NAM,UID} -- wrapper for getpwnam and getpwuid +*/ -#endif +struct passwd * +sm_getpwnam(user) + char *user; +{ + return getpwnam(user); +} + +struct passwd * +sm_getpwuid(uid) + UID_T uid; +{ + return getpwuid(uid); +} /* -** NI_PROPVAL -- netinfo property value lookup routine +** LOAD_IF_NAMES -- load interface-specific names into $=w ** ** Parameters: -** directory -- the Netinfo directory name. -** propname -- the Netinfo property name. +** none. ** ** 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. +** none. ** -** Notes: -** Caller should free the return value of ni_proval +** Side Effects: +** Loads $=w with the names of all the interfaces. */ -#ifdef NETINFO - -# include <netinfo/ni.h> - -# define LOCAL_NETINFO_DOMAIN "." -# define PARENT_NETINFO_DOMAIN ".." -# define MAX_NI_LEVELS 256 +#ifdef SIOCGIFCONF +struct rtentry; +struct mbuf; +# include <arpa/inet.h> +# ifndef SUNOS403 +# include <sys/time.h> +# endif +# include <net/if.h> +#endif -char * -ni_propval(directory, propname) - char *directory; - char *propname; +void +load_if_names() { - char *propval = NULL; +#ifdef SIOCGIFCONF + int s; int i; - void *ni = NULL; - void *lastni = NULL; - ni_status nis; - ni_id nid; - ni_namelist ninl; + struct ifconf ifc; + char interfacebuf[1024]; - /* - ** 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. - */ + s = socket(AF_INET, SOCK_DGRAM, 0); + if (s == -1) + return; - for (i = 0; i < MAX_NI_LEVELS; ++i) + /* get the list of known IP address from the kernel */ + ifc.ifc_buf = interfacebuf; + ifc.ifc_len = sizeof interfacebuf; + if (ioctl(s, SIOCGIFCONF, (char *)&ifc) < 0) { - 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); - } + if (tTd(0, 4)) + printf("SIOGIFCONF failed: %s\n", errstring(errno)); + close(s); + return; + } + close(s); - /* - ** 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! - */ + /* scan the list of IP address */ + if (tTd(0, 40)) + printf("scanning for interface specific names, ifc_len=%d\n", + ifc.ifc_len); - if (nis != 0) - break; + for (i = 0; i < ifc.ifc_len; ) + { + struct ifreq *ifr = (struct ifreq *) &ifc.ifc_buf[i]; + struct sockaddr *sa = &ifr->ifr_addr; + struct in_addr ia; + struct hostent *hp; + char ip_addr[256]; + extern char *inet_ntoa(); + extern struct hostent *gethostbyaddr(); + +#ifdef BSD4_4_SOCKADDR + if (sa->sa_len > sizeof ifr->ifr_addr) + i += sizeof ifr->ifr_name + sa->sa_len; + else +#endif + i += sizeof *ifr; - /* - ** Find the path to the server information. - */ + if (tTd(0, 20)) + printf("%s\n", anynet_ntoa((SOCKADDR *) sa)); - if (ni_pathsearch(ni, &nid, directory) != 0) + /* for some reason gcc 2.3 pukes on || here */ + if (!bitset(IFF_UP, ifr->ifr_flags)) continue; - - /* - ** Find "host" information. - */ - - if (ni_lookupprop(ni, &nid, propname, &ninl) != 0) + if (ifr->ifr_addr.sa_family != AF_INET) continue; - /* - ** If there's only one name in - ** the list, assume we've got - ** what we want. - */ + /* extract IP address from the list*/ + ia = (((struct sockaddr_in *) sa)->sin_addr); - if (ninl.ni_namelist_len == 1) + /* save IP address in text from */ + (void) sprintf(ip_addr, "[%.*s]", + sizeof ip_addr - 3, + inet_ntoa(((struct sockaddr_in *) sa)->sin_addr)); + if (!wordinclass(ip_addr, 'w')) { - propval = ni_name_dup(ninl.ni_namelist_val[0]); - break; + setclass('w', ip_addr); + if (tTd(0, 4)) + printf("\ta.k.a.: %s\n", ip_addr); } - } - /* - ** Clean up. - */ + /* skip "loopback" interface "lo" */ + if (strcmp("lo0", ifr->ifr_name) == 0) + continue; - if (ni != NULL) - ni_free(ni); - if (lastni != NULL && ni != lastni) - ni_free(lastni); + /* lookup name with IP address */ + hp = sm_gethostbyaddr((char *) &ia, sizeof(ia), AF_INET); + if (hp == NULL) + { + syslog(LOG_CRIT, "gethostbyaddr() failed for %.100s\n", + inet_ntoa(ia)); + continue; + } - return propval; -} + /* save its cname */ + if (!wordinclass((char *) hp->h_name, 'w')) + { + setclass('w', (char *) hp->h_name); + if (tTd(0, 4)) + printf("\ta.k.a.: %s\n", hp->h_name); + } -#endif /* NETINFO */ + /* save all it aliases name */ + while (*hp->h_aliases) + { + if (!wordinclass(*hp->h_aliases, 'w')) + { + setclass('w', *hp->h_aliases); + if (tTd(0, 4)) + printf("\ta.k.a.: %s\n", *hp->h_aliases); + } + hp->h_aliases++; + } + } +#endif +} /* ** HARD_SYSLOG -- call syslog repeatedly until it works ** @@ -2364,6 +3565,7 @@ ni_propval(directory, propname) # undef syslog # ifdef __STDC__ +void hard_syslog(int pri, char *msg, ...) # else hard_syslog(pri, msg, va_alist) @@ -2377,7 +3579,7 @@ hard_syslog(pri, msg, va_alist) VA_LOCAL_DECL; VA_START(msg); - vsprintf(buf, msg, ap); + vsnprintf(buf, sizeof buf, msg, ap); VA_END; for (i = MAXSYSLOGTRIES; --i >= 0 && syslog(pri, "%s", buf) < 0; ) @@ -2385,3 +3587,167 @@ hard_syslog(pri, msg, va_alist) } #endif +/* +** LOCAL_HOSTNAME_LENGTH +** +** This is required to get sendmail to compile against BIND 4.9.x +** on Ultrix. +*/ + +#if defined(ultrix) && NAMED_BIND + +# include <resolv.h> +# if __RES >= 19931104 && __RES < 19950621 + +int +local_hostname_length(hostname) + char *hostname; +{ + int len_host, len_domain; + + if (!*_res.defdname) + res_init(); + len_host = strlen(hostname); + len_domain = strlen(_res.defdname); + if (len_host > len_domain && + (strcasecmp(hostname + len_host - len_domain,_res.defdname) == 0) && + hostname[len_host - len_domain - 1] == '.') + return len_host - len_domain - 1; + else + return 0; +} + +# endif +#endif +/* +** Compile-Time options +*/ + +char *CompileOptions[] = +{ +#if HESIOD + "HESIOD", +#endif +#if HES_GETMAILHOST + "HES_GETMAILHOST", +#endif +#ifdef LOG + "LOG", +#endif +#if MATCHGECOS + "MATCHGECOS", +#endif +#if MIME8TO7 + "MIME8TO7", +#endif +#if NAMED_BIND + "NAMED_BIND", +#endif +#if NDBM + "NDBM", +#endif +#if NETINET + "NETINET", +#endif +#if NETINFO + "NETINFO", +#endif +#if NETISO + "NETISO", +#endif +#if NETNS + "NETNS", +#endif +#if NETUNIX + "NETUNIX", +#endif +#if NETX25 + "NETX25", +#endif +#if NEWDB + "NEWDB", +#endif +#if NIS + "NIS", +#endif +#if NISPLUS + "NISPLUS", +#endif +#if SCANF + "SCANF", +#endif +#if SUID_ROOT_FILES_OK + "SUID_ROOT_FILES_OK", +#endif +#if USERDB + "USERDB", +#endif +#if XDEBUG + "XDEBUG", +#endif +#if XLA + "XLA", +#endif + NULL +}; + + +/* +** OS compile options. +*/ + +char *OsCompileOptions[] = +{ +#if HASFCHMOD + "HASFCHMOD", +#endif +#if HASFLOCK + "HASFLOCK", +#endif +#if HASGETUSERSHELL + "HASGETUSERSHELL", +#endif +#if HASINITGROUPS + "HASINITGROUPS", +#endif +#if HASLSTAT + "HASLSTAT", +#endif +#if HASSETREUID + "HASSETREUID", +#endif +#if HASSETSID + "HASSETSID", +#endif +#if HASSETVBUF + "HASSETVBUF", +#endif +#if HASSNPRINTF + "HASSNPRINTF", +#endif +#if HASUNAME + "HASUNAME", +#endif +#if IDENTPROTO + "IDENTPROTO", +#endif +#if IP_SRCROUTE + "IP_SRCROUTE", +#endif +#if NEEDFSYNC + "NEEDFSYNC", +#endif +#if NOFTRUNCATE + "NOFTRUNCATE", +#endif +#if SYS5SETPGRP + "SYS5SETPGRP", +#endif +#if SYSTEM5 + "SYSTEM5", +#endif +#if USESETEUID + "USESETEUID", +#endif + NULL +}; diff --git a/usr.sbin/sendmail/src/conf.h b/usr.sbin/sendmail/src/conf.h index 10a8d3dd46c74..ca6cae3fa84d7 100644 --- a/usr.sbin/sendmail/src/conf.h +++ b/usr.sbin/sendmail/src/conf.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 1983 Eric P. Allman + * Copyright (c) 1983, 1995 Eric P. Allman * Copyright (c) 1988, 1993 * The Regents of the University of California. All rights reserved. * @@ -31,20 +31,28 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * @(#)conf.h 8.104 (Berkeley) 4/17/94 + * @(#)conf.h 8.220 (Berkeley) 11/29/95 */ /* ** CONF.H -- All user-configurable parameters for sendmail +** +** Send updates to sendmail@Sendmail.ORG so they will be +** included in the next release. */ +struct rusage; /* forward declaration to get gcc to shut up in wait.h */ + # include <sys/param.h> # include <sys/types.h> # include <sys/stat.h> # include <sys/file.h> # include <sys/wait.h> +# include <limits.h> # include <fcntl.h> # include <signal.h> +# include <netdb.h> +# include <pwd.h> /********************************************************************** ** Table sizes, etc.... @@ -56,7 +64,7 @@ # define MAXPV 40 /* max # of parms to mailers */ # define MAXATOM 200 /* max atoms per address */ # define MAXMAILERS 25 /* maximum mailers known to system */ -# define MAXRWSETS 100 /* max # of sets of rewriting rules */ +# define MAXRWSETS 200 /* max # of sets of rewriting rules */ # define MAXPRIORITIES 25 /* max values for Precedence: field */ # define MAXMXHOSTS 20 /* max # of MX records */ # define SMTPLINELIM 990 /* maximum SMTP line length */ @@ -64,46 +72,68 @@ # define MEMCHUNKSIZE 1024 /* chunk size for memory allocation */ # define MAXUSERENVIRON 100 /* max envars saved, must be >= 3 */ # define MAXALIASDB 12 /* max # of alias databases */ - -# ifndef QUEUESIZE -# define QUEUESIZE 1000 /* max # of jobs per queue run */ -# endif +# define MAXMAPSTACK 12 /* max # of stacked or sequenced maps */ +# define MAXTOCLASS 8 /* max # of message timeout classes */ +# define MAXMIMEARGS 20 /* max args in Content-Type: */ +# define MAXMIMENESTING 20 /* max MIME multipart nesting */ +# define QUEUESEGSIZE 1000 /* increment for queue size */ /********************************************************************** ** Compilation options. -** -** #define these if they are available; comment them out otherwise. +** #define these to 1 if they are available; +** #define them to 0 otherwise. +** All can be overridden from Makefile. **********************************************************************/ -# 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 MATCHGECOS 1 /* match user names from gecos field */ -# define XDEBUG 1 /* enable extended debugging */ -# ifdef NEWDB -# define USERDB 1 /* look in user database (requires NEWDB) */ +# ifndef NETINET +# define NETINET 1 /* include internet support */ # endif -/********************************************************************** -** 0/1 Compilation options. -** #define these to 1 if they are available; -** #define them to 0 otherwise. -**********************************************************************/ +# ifndef NETISO +# define NETISO 0 /* do not include ISO socket support */ +# endif # ifndef NAMED_BIND # define NAMED_BIND 1 /* use Berkeley Internet Domain Server */ # endif -/* -** Most systems have symbolic links today, so default them on. You -** can turn them off by #undef'ing this below. -*/ +# ifndef XDEBUG +# define XDEBUG 1 /* enable extended debugging */ +# endif -# define HASLSTAT 1 /* has lstat(2) call */ +# ifndef MATCHGECOS +# define MATCHGECOS 1 /* match user names from gecos field */ +# endif -/* +# ifndef DSN +# define DSN 1 /* include delivery status notification code */ +# endif + +# if !defined(USERDB) && (defined(NEWDB) || defined(HESIOD)) +# define USERDB 1 /* look in user database */ +# endif + +# ifndef MIME8TO7 +# define MIME8TO7 1 /* 8->7 bit MIME conversions */ +# endif + +# ifndef MIME7TO8 +# define MIME7TO8 1 /* 7->8 bit MIME conversions */ +# endif + +/********************************************************************** +** "Hard" compilation options. +** #define these if they are available; comment them out otherwise. +** These cannot be overridden from the Makefile, and should really not +** be turned off unless absolutely necessary. +**********************************************************************/ + +# define LOG /* enable logging -- don't turn off */ + +/********************************************************************** +** End of site-specific configuration. +**********************************************************************/ +/* ** General "standard C" defines. ** ** These may be undone later, to cope with systems that claim to @@ -118,7 +148,12 @@ # define HASSETVBUF 1 /* we have setvbuf(3) in libc */ #endif -/********************************************************************** +/* +** Assume you have standard calls; can be #undefed below if necessary. +*/ + +# define HASLSTAT 1 /* has lstat(2) call */ +/********************************************************************** ** Operating system configuration. ** ** Unless you are porting to a new OS, you shouldn't have to @@ -126,80 +161,126 @@ **********************************************************************/ /* -** Per-Operating System defines -*/ - - -/* ** HP-UX -- tested for 8.07, 9.00, and 9.01. +** +** If V4FS is defined, compile for HP-UX 10.0. */ -# ifdef __hpux -/* avoid m_flags conflict between db.h & sys/sysmacros.h on HP 300 */ -# undef m_flags +#ifdef __hpux + /* common definitions for HP-UX 9.x and 10.x */ +# undef m_flags /* conflict between db.h & sys/sysmacros.h on HP 300 */ # define SYSTEM5 1 /* include all the System V defines */ # define HASINITGROUPS 1 /* has initgroups(3) call */ -# define HASSETREUID 1 /* has setreuid(2) call */ -# define setreuid(r, e) setresuid(r, e, -1) -# define LA_TYPE LA_FLOAT +# define HASFCHMOD 1 /* has fchmod(2) syscall */ +# define USESETEUID 1 /* has useable seteuid(2) call */ +# define seteuid(e) setresuid(-1, e, -1) +# define IP_SRCROUTE 1 /* can check IP source routing */ +# define LA_TYPE LA_HPUX +# define SPT_TYPE SPT_PSTAT # define SFS_TYPE SFS_VFS /* use <sys/vfs.h> statfs() implementation */ # 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 *, ...); +extern void hard_syslog(int, char *, ...); # endif + +# ifdef V4FS + /* HP-UX 10.x */ +# define _PATH_UNIX "/stand/vmunix" +# define _PATH_VENDOR_CF "/etc/mail/sendmail.cf" +# ifndef _PATH_SENDMAILPID +# define _PATH_SENDMAILPID "/etc/mail/sendmail.pid" +# endif +# ifndef IDENTPROTO +# define IDENTPROTO 1 /* TCP/IP implementation fixed in 10.0 */ +# endif + +# else + /* HP-UX 9.x */ +# define _PATH_UNIX "/hp-ux" +# define _PATH_VENDOR_CF "/usr/lib/sendmail.cf" +# ifndef IDENTPROTO +# define IDENTPROTO 0 /* TCP/IP implementation is broken */ +# endif # endif +#endif + /* ** IBM AIX 3.x -- actually tested for 3.2.3 */ -# ifdef _AIX3 +#ifdef _AIX3 +# include <paths.h> +# include <sys/machine.h> /* to get byte order */ # define HASINITGROUPS 1 /* has initgroups(3) call */ # define HASUNAME 1 /* use System V uname(2) system call */ # define HASGETUSERSHELL 0 /* does not have getusershell(3) call */ +# define HASFCHMOD 1 /* has fchmod(2) syscall */ +# define IP_SRCROUTE 0 /* Something is broken with getsockopt() */ # define FORK fork /* no vfork primitive available */ -# undef SETPROCTITLE /* setproctitle confuses AIX */ +# define GIDSET_T gid_t # define SFS_TYPE SFS_STATFS /* use <sys/statfs.h> statfs() impl */ -# endif +# define SPT_PADCHAR '\0' /* pad process title with nulls */ +# define LA_TYPE LA_INT +# define LA_AVENRUN "avenrun" +#endif /* ** Silicon Graphics IRIX ** ** Compiles on 4.0.1. +** +** Use IRIX64 instead of IRIX for 64-bit IRIX (6.0). +** Use IRIX5 instead of IRIX for IRIX 5.x. +** +** IRIX64 changes from Mark R. Levinson <ml@cvdev.rochester.edu>. +** IRIX5 changes from Kari E. Hurtta <Kari.Hurtta@fmi.fi>. */ -# ifdef IRIX +#if defined(IRIX64) || defined(IRIX5) +# define IRIX +#endif + +#ifdef IRIX # define SYSTEM5 1 /* this is a System-V derived system */ # define HASSETREUID 1 /* has setreuid(2) call */ # define HASINITGROUPS 1 /* has initgroups(3) call */ +# define HASFCHMOD 1 /* has fchmod(2) syscall */ # define HASGETUSERSHELL 0 /* does not have getusershell(3) call */ +# define IP_SRCROUTE 1 /* can check IP source routing */ # define FORK fork /* no vfork primitive available */ -# define WAITUNION 1 /* use "union wait" as wait argument type */ # define setpgid BSDsetpgrp # define GIDSET_T gid_t # define SFS_TYPE SFS_4ARGS /* four argument statfs() call */ +# define SFS_BAVAIL f_bfree /* alternate field name */ # define LA_TYPE LA_INT +# ifdef IRIX64 +# define NAMELISTMASK 0x7fffffffffffffff /* mask for nlist() values */ +# else +# define NAMELISTMASK 0x7fffffff /* mask for nlist() values */ # endif +# if defined(IRIX64) || defined(IRIX5) +# define ARGV_T char *const * +# define HASSETRLIMIT 1 /* has setrlimit(2) syscall */ +# define HASGETDTABLESIZE 1 /* has getdtablesize(2) syscall */ +# else +# define ARGV_T const char ** +# define WAITUNION 1 /* use "union wait" as wait argument type */ +# endif +#endif /* ** 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). +** Solaris 2.4 (a.k.a. SunOS 5.4). */ #if defined(sun) && !defined(BSD) @@ -207,10 +288,12 @@ extern int syslog(int, char *, ...); # 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 */ +# define HASFCHMOD 1 /* has fchmod(2) syscall */ +# define IP_SRCROUTE 1 /* can check IP source routing */ # define LA_TYPE LA_INT # ifdef SOLARIS_2_3 -# define SOLARIS +# define SOLARIS 203 /* for back compat only -- use -DSOLARIS=203 */ # endif # ifdef SOLARIS @@ -219,18 +302,17 @@ extern int syslog(int, char *, ...); # define __svr4__ /* use all System V Releae 4 defines below */ # endif # include <sys/time.h> -# 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" +# define _PATH_UNIX "/dev/ksyms" # endif +# define _PATH_VENDOR_CF "/etc/mail/sendmail.cf" # ifndef _PATH_SENDMAILPID # define _PATH_SENDMAILPID "/etc/mail/sendmail.pid" # endif +# ifndef _PATH_HOSTS +# define _PATH_HOSTS "/etc/inet/hosts" +# endif # ifndef SYSLOG_BUFSIZE # define SYSLOG_BUFSIZE 1024 /* allow full size syslog buffer */ # endif @@ -242,12 +324,14 @@ extern int syslog(int, char *, ...); # define HASFLOCK 1 /* has flock(2) call */ # endif # define SFS_TYPE SFS_VFS /* use <sys/vfs.h> statfs() implementation */ +# define TZ_TYPE TZ_TM_ZONE /* use tm->tm_zone */ # include <vfork.h> # ifdef SUNOS403 /* special tweaking for SunOS 4.0.3 */ # include <malloc.h> -# define SYS5SIGNALS 1 /* SysV signal semantics -- reset on each sig */ +# define BSD4_3 1 /* 4.3 BSD-based */ +# define NEEDSTRSTR 1 /* need emulation of strstr(3) routine */ # define WAITUNION 1 /* use "union wait" as wait argument type */ # undef WIFEXITED # undef WEXITSTATUS @@ -268,29 +352,41 @@ extern char *getenv(); /* ** DG/UX ** -** Tested on 5.4.2 +** Tested on 5.4.2 and 5.4.3. Use DGUX_5_4_2 to get the +** older support. +** 5.4.3 changes from Mark T. Robinson <mtr@ornl.gov>. */ +#ifdef DGUX_5_4_2 +# define DGUX 1 +#endif + #ifdef DGUX # define SYSTEM5 1 -# define LA_TYPE LA_SUBR +# define LA_TYPE LA_DGUX # define HASSETREUID 1 /* has setreuid(2) call */ # define HASUNAME 1 /* use System V uname(2) system call */ # define HASSETSID 1 /* has Posix setsid(2) call */ # define HASINITGROUPS 1 /* has initgroups(3) call */ +# define IP_SRCROUTE 0 /* does not have <netinet/ip_var.h> */ # define HASGETUSERSHELL 0 /* does not have getusershell(3) */ # ifndef IDENTPROTO # define IDENTPROTO 0 /* TCP/IP implementation is broken */ # endif -# undef SETPROCTITLE +# define SPT_TYPE SPT_NONE /* don't use setproctitle */ # define SFS_TYPE SFS_4ARGS /* four argument statfs() call */ /* these include files must be included early on DG/UX */ # include <netinet/in.h> # include <arpa/inet.h> -# define inet_addr dgux_inet_addr +/* compiler doesn't understand const? */ +# define const + +# ifdef DGUX_5_4_2 +# define inet_addr dgux_inet_addr extern long dgux_inet_addr(); +# endif #endif @@ -307,11 +403,14 @@ extern long dgux_inet_addr(); # define HASUNSETENV 1 /* has unsetenv(3) call */ # define HASINITGROUPS 1 /* has initgroups(3) call */ # define HASUNAME 1 /* use System V uname(2) system call */ +# define HASFCHMOD 1 /* has fchmod(2) syscall */ # ifndef HASFLOCK # define HASFLOCK 1 /* has flock(2) call */ # endif # define HASGETUSERSHELL 0 /* does not have getusershell(3) call */ -# define BROKEN_RES_SEARCH 1 /* res_search(unknown) returns h_errno=0 */ +# ifndef BROKEN_RES_SEARCH +# define BROKEN_RES_SEARCH 1 /* res_search(unknown) returns h_errno=0 */ +# endif # ifdef vax # define LA_TYPE LA_FLOAT # else @@ -320,19 +419,50 @@ extern long dgux_inet_addr(); # endif # define SFS_TYPE SFS_MOUNT /* use <sys/mount.h> statfs() impl */ # ifndef IDENTPROTO -# define IDENTPROTO 0 /* TCP/IP implementation is broken */ +# define IDENTPROTO 0 /* pre-4.4 TCP/IP implementation is broken */ +# endif +#endif + + +/* +** OSF/1 for KSR. +** +** Contributed by Todd C. Miller <Todd.Miller@cs.colorado.edu> +*/ + +#ifdef __ksr__ +# define __osf__ 1 /* get OSF/1 defines below */ +# define FORK fork /* no vfork primitive available */ +# define _PATH_VENDOR_CF "/var/adm/sendmail/sendmail.cf" +# ifndef TZ_TYPE +# define TZ_TYPE TZ_TZNAME /* use tzname[] vector */ # endif #endif /* +** OSF/1 for Intel Paragon. +** +** Contributed by Jeff A. Earickson <jeff@ssd.intel.com> +** of Intel Scalable Systems Divison. +*/ + +#ifdef __PARAGON__ +# define __osf__ 1 /* get OSF/1 defines below */ +# define _PATH_VENDOR_CF "/var/adm/sendmail/sendmail.cf" +#endif + + +/* ** OSF/1 (tested on Alpha) */ #ifdef __osf__ # define HASUNSETENV 1 /* has unsetenv(3) call */ -# define HASSETREUID 1 /* has setreuid(2) call */ +# define USESETEUID 1 /* has useable seteuid(2) call */ # define HASINITGROUPS 1 /* has initgroups(3) call */ +# define HASFCHMOD 1 /* has fchmod(2) syscall */ +# define IP_SRCROUTE 1 /* can check IP source routing */ # ifndef HASFLOCK # define HASFLOCK 1 /* has flock(2) call */ # endif @@ -350,11 +480,13 @@ extern long dgux_inet_addr(); #ifdef NeXT # define HASINITGROUPS 1 /* has initgroups(3) call */ +# define NEEDPUTENV 2 /* need putenv(3) call; no setenv(3) call */ # ifndef HASFLOCK # define HASFLOCK 1 /* has flock(2) call */ # endif # define NEEDGETOPT 1 /* need a replacement for getopt(3) */ # define WAITUNION 1 /* use "union wait" as wait argument type */ +# define UID_T int /* compiler gripes on uid_t */ # define sleep sleepX # define setpgid setpgrp # ifndef LA_TYPE @@ -366,9 +498,7 @@ typedef int pid_t; # undef WEXITSTATUS # undef WIFEXITED # endif -# ifndef _PATH_SENDMAILCF -# define _PATH_SENDMAILCF "/etc/sendmail/sendmail.cf" -# endif +# define _PATH_VENDOR_CF "/etc/sendmail/sendmail.cf" # ifndef _PATH_SENDMAILPID # define _PATH_SENDMAILPID "/etc/sendmail/sendmail.pid" # endif @@ -381,14 +511,20 @@ typedef int pid_t; ** See also BSD defines. */ -#ifdef BSD4_4 +#if defined(BSD4_4) && !defined(__bsdi__) # define HASUNSETENV 1 /* has unsetenv(3) call */ +# define USESETEUID 1 /* has useable seteuid(2) call */ +# define HASFCHMOD 1 /* has fchmod(2) syscall */ +# define HASSNPRINTF 1 /* has snprintf(3) and vsnprintf(3) */ # include <sys/cdefs.h> # define ERRLIST_PREDEFINED /* don't declare sys_errlist */ +# define BSD4_4_SOCKADDR /* has sa_len */ +# define NETLINK 1 /* supports AF_LINK */ # ifndef LA_TYPE # define LA_TYPE LA_SUBR # endif # define SFS_TYPE SFS_MOUNT /* use <sys/mount.h> statfs() impl */ +# define SPT_TYPE SPT_PSSTRINGS /* use PS_STRINGS pointer */ #endif @@ -400,46 +536,78 @@ typedef int pid_t; #ifdef __bsdi__ # define HASUNSETENV 1 /* has the unsetenv(3) call */ # define HASSETSID 1 /* has the setsid(2) POSIX syscall */ +# define USESETEUID 1 /* has useable seteuid(2) call */ +# define HASFCHMOD 1 /* has fchmod(2) syscall */ +# define HASSNPRINTF 1 /* has snprintf(3) and vsnprintf(3) */ +# define HASUNAME 1 /* has uname(2) syscall */ # include <sys/cdefs.h> # define ERRLIST_PREDEFINED /* don't declare sys_errlist */ +# define BSD4_4_SOCKADDR /* has sa_len */ +# define NETLINK 1 /* supports AF_LINK */ # define SFS_TYPE SFS_MOUNT /* use <sys/mount.h> statfs() impl */ # ifndef LA_TYPE # define LA_TYPE LA_SUBR # endif +# define GIDSET_T gid_t # if defined(_BSDI_VERSION) && _BSDI_VERSION >= 199312 /* version 1.1 or later */ -# define HASSETPROCTITLE 1 /* setproctitle is in libc */ -# undef SETPROCTITLE /* so don't redefine it in conf.c */ +# undef SPT_TYPE +# define SPT_TYPE SPT_BUILTIN /* setproctitle is in libc */ # else /* version 1.0 or earlier */ # ifndef OLD_NEWDB # define OLD_NEWDB 1 /* old version of newdb library */ # endif +# define SPT_PADCHAR '\0' /* pad process title with nulls */ # endif #endif /* -** 386BSD / FreeBSD 1.0E / NetBSD (all architectures, all versions) +** FreeBSD / NetBSD (all architectures, all versions) ** -** Were 4.3BSD clone, closer to 4.4BSD -** Now real 4.4BSD. +** 4.3BSD clone, closer to 4.4BSD for FreeBSD 1.x and NetBSD 0.9x +** 4.4BSD-Lite based for FreeBSD 2.x and NetBSD 1.x ** ** See also BSD defines. */ #if defined(__FreeBSD__) || defined(__NetBSD__) +# include <paths.h> # define HASUNSETENV 1 /* has unsetenv(3) call */ # define HASSETSID 1 /* has the setsid(2) POSIX syscall */ +# define USESETEUID 1 /* has useable seteuid(2) call */ +# define HASFCHMOD 1 /* has fchmod(2) syscall */ +# define HASSNPRINTF 1 /* has snprintf(3) and vsnprintf(3) */ # define HASUNAME 1 /* has uname(2) syscall */ -# define GIDSET_T gid_t -# include <sys/cdefs.h> # define ERRLIST_PREDEFINED /* don't declare sys_errlist */ +# define BSD4_4_SOCKADDR /* has sa_len */ +# define NETLINK 1 /* supports AF_LINK */ +# define GIDSET_T gid_t # ifndef LA_TYPE # define LA_TYPE LA_SUBR # endif # define SFS_TYPE SFS_MOUNT /* use <sys/mount.h> statfs() impl */ +# if defined(__NetBSD__) && (NetBSD > 199307 || NetBSD0_9 > 1) +# undef SPT_TYPE +# define SPT_TYPE SPT_BUILTIN /* setproctitle is in libc */ +# define setreuid __setreuid +# endif +# if defined(__FreeBSD__) +# undef SPT_TYPE +# if __FreeBSD__ == 2 +# include <osreldate.h> /* and this works */ +# if __FreeBSD_version >= 199512 /* 2.2-current right now */ +# define SPT_TYPE SPT_BUILTIN +# include <libutil.h> +# endif +# endif +# ifndef SPT_TYPE +# define SPT_TYPE SPT_REUSEARGV +# define SPT_PADCHAR '\0' /* pad process title with nulls */ +# endif +# endif #endif @@ -466,9 +634,7 @@ typedef int pid_t; # undef HASSETVBUF /* don't actually have setvbuf(3) */ # undef WEXITSTATUS # undef WIFEXITED -# ifndef _PATH_SENDMAILCF -# define _PATH_SENDMAILCF "/usr/lib/sendmail.cf" -# endif +# define _PATH_VENDOR_CF "/usr/lib/sendmail.cf" # ifndef _PATH_SENDMAILPID # define _PATH_SENDMAILPID "/etc/sendmail.pid" # endif @@ -492,9 +658,7 @@ typedef int pid_t; # ifndef LA_TYPE # define LA_TYPE LA_FLOAT # endif -# ifndef _PATH_SENDMAILCF -# define _PATH_SENDMAILCF "/usr/lib/sendmail.cf" -# endif +# define _PATH_VENDOR_CF "/usr/lib/sendmail.cf" # ifndef IDENTPROTO # define IDENTPROTO 0 /* TCP/IP implementation is broken */ # endif @@ -516,25 +680,86 @@ extern int errno; #ifdef _SCO_unix_4_2 # define _SCO_unix_ # define HASSETREUID 1 /* has setreuid(2) call */ -# define NEEDFSYNC 1 /* needs the fsync(2) call stub */ -# define _PATH_UNIX "/unix" -# ifndef _PATH_SENDMAILCF -# define _PATH_SENDMAILCF "/usr/lib/sendmail.cf" -# endif +# define _PATH_UNIX "/unix" +# define _PATH_VENDOR_CF "/usr/lib/sendmail.cf" # ifndef _PATH_SENDMAILPID # define _PATH_SENDMAILPID "/etc/sendmail.pid" # endif #endif #ifdef _SCO_unix_ +# include <sys/stream.h> /* needed for IP_SRCROUTE */ +# define SYSTEM5 1 /* include all the System V defines */ +# define SYS5SIGNALS 1 /* SysV signal semantics -- reset on each sig */ +# define HASGETUSERSHELL 0 /* does not have getusershell(3) call */ +# define NOFTRUNCATE 0 /* does not have ftruncate(3) call */ +# define NEEDFSYNC 1 /* needs the fsync(2) call stub */ +# define FORK fork +# define MAXPATHLEN PATHSIZE +# define LA_TYPE LA_SHORT +# define SFS_TYPE SFS_4ARGS /* use <sys/statfs.h> 4-arg impl */ +# define SFS_BAVAIL f_bfree /* alternate field name */ +# define SPT_TYPE SPT_SCO /* write kernel u. area */ +# define TZ_TYPE TZ_TM_NAME /* use tm->tm_name */ +# define NETUNIX 0 /* no unix domain socket support */ +#endif + + +/* +** ISC (SunSoft) Unix. +** +** Contributed by J.J. Bailey <jjb@jagware.bcc.com> +*/ + +#ifdef ISC_UNIX +# include <net/errno.h> +# include <sys/stream.h> /* needed for IP_SRCROUTE */ +# include <sys/bsdtypes.h> +# define SYSTEM5 1 /* include all the System V defines */ +# define SYS5SIGNALS 1 /* SysV signal semantics -- reset on each sig */ +# define HASGETUSERSHELL 0 /* does not have getusershell(3) call */ +# define HASSETREUID 1 /* has setreuid(2) call */ +# define NEEDFSYNC 1 /* needs the fsync(2) call stub */ +# define NETUNIX 0 /* no unix domain socket support */ +# define FORK fork +# define MAXPATHLEN 1024 +# define LA_TYPE LA_SHORT +# define SFS_TYPE SFS_STATFS /* use <sys/statfs.h> statfs() impl */ +# define SFS_BAVAIL f_bfree /* alternate field name */ +# define _PATH_UNIX "/unix" +# define _PATH_VENDOR_CF "/usr/lib/sendmail.cf" +# ifndef _PATH_SENDMAILPID +# define _PATH_SENDMAILPID "/etc/sendmail.pid" +# endif + +#endif + + +/* +** Altos System V. +** Contributed by Tim Rice <timr@crl.com>. +*/ + +#ifdef ALTOS_SYS_V # define SYSTEM5 1 /* include all the System V defines */ # define SYS5SIGNALS 1 /* SysV signal semantics -- reset on each sig */ # define HASGETUSERSHELL 0 /* does not have getusershell(3) call */ +# define WAITUNION 1 /* use "union wait" as wait argument type */ +# define NEEDFSYNC 1 /* no fsync(2) in system library */ # define FORK fork # define MAXPATHLEN PATHSIZE # define LA_TYPE LA_SHORT # define SFS_TYPE SFS_STATFS /* use <sys/statfs.h> statfs() impl */ -# undef NETUNIX /* no unix domain socket support */ +# define SFS_BAVAIL f_bfree /* alternate field name */ +# define TZ_TYPE TZ_TM_NAME /* use tm->tm_name */ +# define NETUNIX 0 /* no unix domain socket support */ +# undef WIFEXITED +# undef WEXITSTATUS +# define strtoul strtol /* gcc library bogosity */ + +typedef unsigned short uid_t; +typedef unsigned short gid_t; +typedef short pid_t; #endif @@ -550,11 +775,10 @@ extern int errno; # define HASUNAME 1 /* use System V uname(2) system call */ # define HASSETSID 1 /* has POSIX setsid(2) call */ # define NEEDGETOPT 1 /* need replacement for getopt(3) */ +# define IP_SRCROUTE 0 /* Something is broken with getsockopt() */ # define LA_TYPE LA_FLOAT # define SFS_TYPE SFS_VFS /* use <sys/vfs.h> statfs() implementation */ -# ifndef _PATH_SENDMAILCF -# define _PATH_SENDMAILCF "/usr/lib/sendmail.cf" -# endif +# define _PATH_VENDOR_CF "/usr/lib/sendmail.cf" # ifndef S_IREAD # define S_IREAD _S_IREAD # define S_IWRITE _S_IWRITE @@ -583,6 +807,9 @@ extern int errno; # endif # define WAITUNION 1 /* use "union wait" as wait argument type */ # define NEEDGETOPT 1 /* need a replacement for getopt(3) */ +# define NEEDPUTENV 1 /* need putenv(3) call */ +# define NEEDSTRSTR 1 /* need emulation of the strstr(3) call */ +# define SFS_TYPE SFS_VFS /* use <sys/vfs.h> statfs() implementation */ # define LA_TYPE LA_INT # define LA_AVENRUN "avenrun" # define _PATH_UNIX "/unix" @@ -597,6 +824,8 @@ typedef int (*sigfunc_t)(); extern char *getenv(); extern void *malloc(); +# include <sys/time.h> + #endif @@ -606,13 +835,13 @@ extern void *malloc(); ** Thanks to, in reverse order of contact: ** ** John Kennedy <warlock@csuchico.edu> +** Andrew Pam <avatar@aus.xanadu.com> ** Florian La Roche <rzsfl@rz.uni-sb.de> ** Karl London <karl@borg.demon.co.uk> ** -** Last compiled against: [03/02/94 @ 05:34 PM (Wednesday)] -** sendmail 8.6.6.b9 named 4.9.2-931205-p1 db-1.73 -** gcc 2.5.8 libc.so.4.5.19 -** slackware 1.1.2 linux 0.99.15 +** Last compiled against: [09/06/95 @ 10:20:58 AM (Wednesday)] +** sendmail 8.7-b14 named 4.9.3-beta17 db-1.85 +** gcc 2.7.0 libc-5.2.7 linux 1.2.13 */ #ifdef __linux__ @@ -620,12 +849,24 @@ extern void *malloc(); # define NEEDGETOPT 1 /* need a replacement for getopt(3) */ # define HASUNAME 1 /* use System V uname(2) system call */ # define HASUNSETENV 1 /* has unsetenv(3) call */ +# ifndef HASSNPRINTF +# define HASSNPRINTF 1 /* has snprintf(3) and vsnprintf(3) */ +# endif # define ERRLIST_PREDEFINED /* don't declare sys_errlist */ # define GIDSET_T gid_t /* from <linux/types.h> */ +# define HASGETUSERSHELL 0 /* getusershell(3) broken in Slackware 2.0 */ +# define IP_SRCROUTE 0 /* linux <= 1.2.8 doesn't support IP_OPTIONS */ +# ifndef HASFLOCK +# define HASFLOCK 0 /* flock(2) is broken after 0.99.13 */ +# endif # ifndef LA_TYPE # define LA_TYPE LA_PROCSTR # endif # define SFS_TYPE SFS_VFS /* use <sys/vfs.h> statfs() impl */ +# ifndef _PATH_SENDMAILPID +# define _PATH_SENDMAILPID "/var/run/sendmail.pid" +# endif +# define TZ_TYPE TZ_TNAME # include <sys/sysmacros.h> # undef atol /* wounded in <stdlib.h> */ #endif @@ -656,20 +897,28 @@ extern void *malloc(); #ifdef _AUX_SOURCE # include <sys/sysmacros.h> # define BSD /* has BSD routines */ +# define HASSETRLIMIT 0 /* ... but not setrlimit(2) */ +# define BROKEN_RES_SEARCH 1 /* res_search(unknown) returns h_errno=0 */ # define HASUNAME 1 /* use System V uname(2) system call */ +# define HASFCHMOD 1 /* has fchmod(2) syscall */ +# define HASINITGROUPS 1 /* has initgroups(3) call */ # 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" -# endif # ifndef LA_TYPE -# define LA_TYPE LA_ZERO +# define LA_TYPE LA_INT +# define FSHIFT 16 # endif +# define LA_AVENRUN "avenrun" # define SFS_TYPE SFS_VFS /* use <sys/vfs.h> statfs() implementation */ +# define TZ_TYPE TZ_TZNAME +# ifndef _PATH_UNIX +# define _PATH_UNIX "/unix" /* should be in <paths.h> */ +# endif +# define _PATH_VENDOR_CF "/usr/lib/sendmail.cf" # undef WIFEXITED # undef WEXITSTATUS #endif @@ -682,7 +931,6 @@ extern void *malloc(); */ #ifdef UMAXV -# include <limits.h> # define HASUNAME 1 /* use System V uname(2) system call */ # define HASSETVBUF 1 /* we have setvbuf(3) in libc */ # define HASINITGROUPS 1 /* has initgroups(3) call */ @@ -749,11 +997,9 @@ typedef int pid_t; # endif # ifndef _PATH_UNIX -# define _PATH_UNIX "/dynix" -# endif -# ifndef _PATH_SENDMAILCF -# define _PATH_SENDMAILCF "/usr/lib/sendmail.cf" +# define _PATH_UNIX "/dynix" # endif +# define _PATH_VENDOR_CF "/usr/lib/sendmail.cf" #endif @@ -775,13 +1021,11 @@ typedef int pid_t; # define GIDSET_T gid_t # define LA_TYPE LA_INT # define SFS_TYPE SFS_STATFS /* use <sys/statfs.h> statfs() impl */ -# undef SETPROCTITLE +# define SPT_TYPE SPT_NONE /* don't use setproctitle */ # ifndef IDENTPROTO # define IDENTPROTO 0 /* TCP/IP implementation is broken */ # endif -# ifndef _PATH_SENDMAILCF -# define _PATH_SENDMAILCF "/usr/lib/sendmail.cf" -# endif +# define _PATH_VENDOR_CF "/usr/lib/sendmail.cf" # ifndef _PATH_SENDMAILPID # define _PATH_SENDMAILPID "/etc/sendmail.pid" # endif @@ -800,6 +1044,7 @@ typedef int pid_t; # define MAXPATHLEN PATHSIZE # define LA_TYPE LA_ZERO # define SFS_TYPE SFS_4ARGS /* four argument statfs() call */ +# define SFS_BAVAIL f_bfree /* alternate field name */ #endif @@ -808,19 +1053,20 @@ typedef int pid_t; ** ** From Todd Martin <tmartint@tus.ssi1.com> & Don Lewis <gdonl@gv.ssi1.com> ** -** 15 Jan 1994 +** 15 Jan 1994; updated 2 Aug 1995 ** */ #ifdef apollo # define HASSETREUID 1 /* has setreuid(2) call */ # define HASINITGROUPS 1 /* has initgroups(2) call */ -# undef SETPROCTITLE +# define IP_SRCROUTE 0 /* does not have <netinet/ip_var.h> */ +# define SPT_TYPE SPT_NONE /* don't use setproctitle */ # define LA_TYPE LA_SUBR /* use getloadavg.c */ # define SFS_TYPE SFS_4ARGS /* four argument statfs() call */ -# ifndef _PATH_SENDMAILCF -# define _PATH_SENDMAILCF "/usr/lib/sendmail.cf" -# endif +# define SFS_BAVAIL f_bfree /* alternate field name */ +# define TZ_TYPE TZ_TZNAME +# define _PATH_VENDOR_CF "/usr/lib/sendmail.cf" # ifndef _PATH_SENDMAILPID # define _PATH_SENDMAILPID "/etc/sendmail.pid" # endif @@ -834,26 +1080,37 @@ typedef int pid_t; /* -** UnixWare +** UnixWare 2.x +*/ + +#ifdef UNIXWARE2 +# define UNIXWARE 1 +# define HASSNPRINTF 1 /* has snprintf(3) and vsnprintf(3) */ +#endif + + +/* +** UnixWare 1.1.2. ** +** Updated by Petr Lampa <lampa@fee.vutbr.cz>. ** From Evan Champion <evanc@spatial.synapse.org>. */ #ifdef UNIXWARE +# include <sys/mkdev.h> # define SYSTEM5 1 -# ifndef HASGETUSERSHELL -# define HASGETUSERSHELL 0 /* does not have getusershell(3) call */ -# endif -# define GIDSET_T int -# define SLEEP_T int +# define HASGETUSERSHELL 0 /* does not have getusershell(3) call */ +# define HASSETREUID 1 +# define HASSETSID 1 +# define HASINITGROUPS 1 +# define GIDSET_T gid_t +# define SLEEP_T unsigned # define SFS_TYPE SFS_STATVFS # define LA_TYPE LA_ZERO # undef WIFEXITED # undef WEXITSTATUS # define _PATH_UNIX "/unix" -# ifndef _PATH_SENDMAILCF -# define _PATH_SENDMAILCF "/usr/ucblib/sendmail.cf" -# endif +# define _PATH_VENDOR_CF "/usr/ucblib/sendmail.cf" # ifndef _PATH_SENDMAILPID # define _PATH_SENDMAILPID "/usr/ucblib/sendmail.pid" # endif @@ -883,24 +1140,257 @@ typedef int pid_t; /* ** NCR 3000 Series (SysVr4) ** -** From From: Kevin Darcy <kevin@tech.mis.cfc.com>. +** From Kevin Darcy <kevin@tech.mis.cfc.com>. */ #ifdef NCR3000 +# include <sys/sockio.h> # define __svr4__ +# define IP_SRCROUTE 0 /* Something is broken with getsockopt() */ # undef BSD # define LA_AVENRUN "avenrun" +# define SYSLOG_BUFSIZE 1024 #endif +/* +** Tandem NonStop-UX SVR4 +** +** From Rick McCarty <mccarty@mpd.tandem.com>. +*/ + +#ifdef NonStop_UX_BXX +# define __svr4__ +#endif + + +/* +** Hitachi 3050R & 3050RX Workstations running HI-UX/WE2. +** +** Tested for 1.04 and 1.03 +** From Akihiro Hashimoto ("Hash") <hash@dominic.ipc.chiba-u.ac.jp>. +*/ + +#ifdef __H3050R +# define SYSTEM5 1 /* include all the System V defines */ +# define HASINITGROUPS 1 /* has initgroups(3) call */ +# define setreuid(r, e) setresuid(r, e, -1) +# define LA_TYPE LA_FLOAT +# define SFS_TYPE SFS_VFS /* use <sys/vfs.h> statfs() implementation */ +# define HASSETVBUF /* HI-UX has no setlinebuf */ +# ifndef GIDSET_T +# define GIDSET_T gid_t +# endif +# ifndef _PATH_UNIX +# define _PATH_UNIX "/HI-UX" +# endif +# define _PATH_VENDOR_CF "/usr/lib/sendmail.cf" +# ifndef IDENTPROTO +# define IDENTPROTO 0 /* TCP/IP implementation is broken */ +# endif +# ifndef HASGETUSERSHELL +# define HASGETUSERSHELL 0 /* getusershell(3) causes core dumps */ +# endif + +/* avoid m_flags conflict between db.h & sys/sysmacros.h on HIUX 3050 */ +# undef m_flags + +# ifdef __STDC__ +extern int syslog(int, char *, ...); +# endif + +#endif + + +/* +** Amdahl UTS System V 2.1.5 (SVr3-based) +** +** From: Janet Jackson <janet@dialix.oz.au>. +*/ + +#ifdef _UTS +# include <sys/sysmacros.h> +# undef HASLSTAT /* has symlinks, but they cause problems */ +# define NEEDFSYNC 1 /* system fsync(2) fails on non-EFS filesys */ +# define SYS5SIGNALS 1 /* System V signal semantics */ +# define SYS5SETPGRP 1 /* use System V setpgrp(2) syscall */ +# define HASUNAME 1 /* use System V uname(2) system call */ +# define HASINITGROUPS 1 /* has initgroups(3) function */ +# define HASSETVBUF 1 /* has setvbuf(3) function */ +# define HASSIGSETMASK 0 /* does not have sigsetmask(2) function */ +# ifndef HASGETUSERSHELL +# define HASGETUSERSHELL 0 /* does not have getusershell(3) function */ +# endif +# define GIDSET_T gid_t /* type of 2nd arg to getgroups(2) isn't int */ +# define LA_TYPE LA_ZERO /* doesn't have load average */ +# define SFS_TYPE SFS_4ARGS /* use 4-arg statfs() */ +# define SFS_BAVAIL f_bfree /* alternate field name */ +# define _PATH_UNIX "/unix" +# define _PATH_VENDOR_CF "/usr/lib/sendmail.cf" +#endif + +/* +** Cray Computer Corporation's CSOS +** +** From Scott Bolte <scott@craycos.com>. +*/ + +#ifdef _CRAYCOM +# define SYSTEM5 1 /* include all the System V defines */ +# define SYS5SIGNALS 1 /* SysV signal semantics -- reset on each sig */ +# define NEEDFSYNC 1 /* no fsync in system library */ +# define MAXPATHLEN PATHSIZE +# define LA_TYPE LA_ZERO +# define SFS_TYPE SFS_4ARGS /* four argument statfs() call */ +# define SFS_BAVAIL f_bfree /* alternate field name */ +# define _POSIX_CHOWN_RESTRICTED -1 +extern struct group *getgrent(), *getgrnam(), *getgrgid(); +#endif + + +/* +** Sony NEWS-OS 4.2.1R and 6.0.3 +** +** From Motonori NAKAMURA <motonori@cs.ritsumei.ac.jp>. +*/ + +#ifdef sony_news +# ifndef __svr4 + /* NEWS-OS 4.2.1R */ +# ifndef BSD +# define BSD /* has BSD routines */ +# endif +# define HASUNSETENV 1 /* has unsetenv(2) call */ +# undef HASSETVBUF /* don't actually have setvbuf(3) */ +# define WAITUNION 1 /* use "union wait" as wait argument type */ +# define LA_TYPE LA_INT +# define SFS_TYPE SFS_VFS /* use <sys/vfs.h> statfs() implementation */ +# ifndef HASFLOCK +# define HASFLOCK 1 /* has flock(2) call */ +# endif +# define setpgid setpgrp +# undef WIFEXITED +# undef WEXITSTATUS +typedef int pid_t; +typedef int (*sigfunc_t)(); +# define SIGFUNC_DEFINED + +# else + /* NEWS-OS 6.0.3 with /bin/cc */ +# ifndef __svr4__ +# define __svr4__ /* use all System V Releae 4 defines below */ +# endif +# define HASSETSID 1 /* has Posix setsid(2) call */ +# define HASGETUSERSHELL 1 /* DOES have getusershell(3) call in libc */ +# define LA_TYPE LA_READKSYM /* use MIOC_READKSYM ioctl */ +# ifndef SPT_TYPE +# define SPT_TYPE SPT_SYSMIPS /* use sysmips() (OS 6.0.2 or later) */ +# endif +# define GIDSET_T gid_t +# undef WIFEXITED +# undef WEXITSTATUS +# ifndef SYSLOG_BUFSIZE +# define SYSLOG_BUFSIZE 1024 +# endif +# define _PATH_UNIX "/stand/unix" +# define _PATH_VENDOR_CF "/etc/mail/sendmail.cf" +# ifndef _PATH_SENDMAILPID +# define _PATH_SENDMAILPID "/etc/mail/sendmail.pid" +# endif + +# endif +#endif + + +/* +** Omron LUNA/UNIOS-B 3.0, LUNA2/Mach and LUNA88K Mach +** +** From Motonori NAKAMURA <motonori@cs.ritsumei.ac.jp>. +*/ + +#ifdef luna +# ifndef IDENTPROTO +# define IDENTPROTO 0 /* TCP/IP implementation is broken */ +# endif +# define HASUNSETENV 1 /* has unsetenv(2) call */ +# define NEEDPUTENV 1 /* need putenv(3) call */ +# define NEEDGETOPT 1 /* need a replacement for getopt(3) */ +# define NEEDSTRSTR 1 /* need emulation of the strstr(3) call */ +# define WAITUNION 1 /* use "union wait" as wait argument type */ +# ifdef uniosb +# include <sys/time.h> +# define NEEDVPRINTF 1 /* need a replacement for vprintf(3) */ +# define LA_TYPE LA_INT +# define TZ_TYPE TZ_TM_ZONE /* use tm->tm_zone */ +# endif +# ifdef luna2 +# define LA_TYPE LA_SUBR +# define TZ_TYPE TZ_TM_ZONE /* use tm->tm_zone */ +# endif +# ifdef luna88k +# define HASSNPRINTF 1 /* has snprintf(3) and vsnprintf(3) */ +# define LA_TYPE LA_INT +# endif +# define SFS_TYPE SFS_VFS /* use <sys/vfs.h> statfs() implementation */ +# define setpgid setpgrp +# undef WIFEXITED +# undef WEXITSTATUS +typedef int pid_t; +typedef int (*sigfunc_t)(); +# define SIGFUNC_DEFINED +extern char *getenv(); +extern int errno; +# define _PATH_VENDOR_CF "/usr/lib/sendmail.cf" +#endif + + +/* +** NEC EWS-UX/V 4.2 (with /usr/ucb/cc) +** +** From Motonori NAKAMURA <motonori@cs.ritsumei.ac.jp>. +*/ + +#if defined(nec_ews_svr4) || defined(_nec_ews_svr4) +# ifndef __svr4__ +# define __svr4__ /* use all System V Releae 4 defines below */ +# endif +# define SYS5SIGNALS 1 /* SysV signal semantics -- reset on each sig */ +# define HASSETSID 1 /* has Posix setsid(2) call */ +# define LA_TYPE LA_READKSYM /* use MIOC_READSYM ioctl */ +# define SFS_TYPE SFS_USTAT /* use System V ustat(2) syscall */ +# define GIDSET_T gid_t +# undef WIFEXITED +# undef WEXITSTATUS +# define NAMELISTMASK 0x7fffffff /* mask for nlist() values */ +# ifndef SYSLOG_BUFSIZE +# define SYSLOG_BUFSIZE 1024 /* allow full size syslog buffer */ +# endif +#endif + + +/* +** Fujitsu/ICL UXP/DS (For the DS/90 Series) +** +** From Diego R. Lopez <drlopez@cica.es>. +*/ + +#ifdef UXPDS +# define __svr4__ +# define HASGETUSERSHELL 1 +# define HASFLOCK 0 +# define _PATH_UNIX "/stand/unix" +# define _PATH_VENDOR_CF "/etc/mail/sendmail.cf" +# ifndef _PATH_SENDMAILPID +# define _PATH_SENDMAILPID "/etc/mail/sendmail.pid" +# endif +#endif /********************************************************************** ** End of Per-Operating System defines **********************************************************************/ - -/********************************************************************** +/********************************************************************** ** More general defines **********************************************************************/ @@ -908,26 +1398,39 @@ typedef int pid_t; #ifdef BSD # define HASGETDTABLESIZE 1 /* has getdtablesize(2) call */ # define HASSETREUID 1 /* has setreuid(2) call */ -# define HASINITGROUPS 1 /* has initgroups(2) call */ +# define HASINITGROUPS 1 /* has initgroups(3) call */ +# ifndef IP_SRCROUTE +# define IP_SRCROUTE 1 /* can check IP source routing */ +# endif +# ifndef HASSETRLIMIT +# define HASSETRLIMIT 1 /* has setrlimit(2) call */ +# endif # ifndef HASFLOCK # define HASFLOCK 1 /* has flock(2) call */ # endif +# ifndef TZ_TYPE +# define TZ_TYPE TZ_TM_ZONE /* use tm->tm_zone variable */ +# endif #endif /* general System V Release 4 defines */ #ifdef __svr4__ # define SYSTEM5 1 -# define HASSETREUID 1 /* has seteuid(2) call & working saved uids */ +# define USESETEUID 1 /* has useable seteuid(2) call */ +# define HASINITGROUPS 1 /* has initgroups(3) call */ +# define BSD_COMP 1 /* get BSD ioctl calls */ +# ifndef HASSETRLIMIT +# define HASSETRLIMIT 1 /* has setrlimit(2) call */ +# endif # 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" +# ifndef _PATH_VENDOR_CF +# define _PATH_VENDOR_CF "/usr/ucblib/sendmail.cf" # endif # ifndef _PATH_SENDMAILPID # define _PATH_SENDMAILPID "/usr/ucblib/sendmail.pid" @@ -935,6 +1438,13 @@ typedef int pid_t; # ifndef SYSLOG_BUFSIZE # define SYSLOG_BUFSIZE 128 # endif +# ifndef SFS_TYPE +# define SFS_TYPE SFS_STATVFS +# endif + +# define jmp_buf sigjmp_buf +# define setjmp(env) sigsetjmp(env, 1) +# define longjmp(env, val) siglongjmp(env, val) #endif /* general System V defines */ @@ -943,12 +1453,22 @@ typedef int pid_t; # define HASUNAME 1 /* use System V uname(2) system call */ # define SYS5SETPGRP 1 /* use System V setpgrp(2) syscall */ # define HASSETVBUF 1 /* we have setvbuf(3) in libc */ +# ifndef HASULIMIT +# define HASULIMIT 1 /* has the ulimit(2) syscall */ +# endif # ifndef LA_TYPE -# define LA_TYPE LA_INT /* assume integer load average */ +# ifdef MIOC_READKSYM +# define LA_TYPE LA_READKSYM /* use MIOC_READKSYM ioctl */ +# else +# define LA_TYPE LA_INT /* assume integer load average */ +# endif # endif # ifndef SFS_TYPE # define SFS_TYPE SFS_USTAT /* use System V ustat(2) syscall */ # endif +# ifndef TZ_TYPE +# define TZ_TYPE TZ_TZNAME /* use tzname[] vector */ +# endif # define bcopy(s, d, l) (memmove((d), (s), (l))) # define bzero(d, l) (memset((d), '\0', (l))) # define bcmp(s, d, l) (memcmp((s), (d), (l))) @@ -958,25 +1478,31 @@ typedef int pid_t; #ifdef _POSIX_VERSION # define HASSETSID 1 /* has Posix setsid(2) call */ # define HASWAITPID 1 /* has Posix waitpid(2) call */ +# if _POSIX_VERSION >= 199500 && !defined(USESETEUID) +# define USESETEUID 1 /* has useable seteuid(2) call */ +# endif #endif - -/* -** If no type for argument two of getgroups call is defined, assume -** it's an integer -- unfortunately, there seem to be several choices -** here. +/* +** Tweaking for systems that (for example) claim to be BSD or POSIX +** but don't have all the standard BSD or POSIX routines (boo hiss). */ -#ifndef GIDSET_T -# define GIDSET_T int +#ifdef titan +# undef HASINITGROUPS /* doesn't have initgroups(3) call */ #endif -/* -** Tweaking for systems that (for example) claim to be BSD but -** don't have all the standard BSD routines (boo hiss). -*/ +#ifdef _CRAYCOM +# undef HASSETSID /* despite POSIX claim, doesn't have setsid */ +#endif -#ifdef titan -# undef HASINITGROUPS /* doesn't have initgroups(3) call */ +#ifdef ISC_UNIX +# undef bcopy /* despite SystemV claim, uses BSD bcopy */ +#endif + +#ifdef ALTOS_SYS_V +# undef bcopy /* despite SystemV claim, uses BSD bcopy */ +# undef bzero /* despite SystemV claim, uses BSD bzero */ +# undef bcmp /* despite SystemV claim, uses BSD bcmp */ #endif @@ -995,20 +1521,77 @@ typedef int pid_t; # define IDENTPROTO 1 /* use IDENT proto (RFC 1413) */ #endif +#ifndef IP_SRCROUTE +# define IP_SRCROUTE 1 /* Detect IP source routing */ +#endif + #ifndef HASGETUSERSHELL # define HASGETUSERSHELL 1 /* libc has getusershell(3) call */ #endif +#ifndef NETUNIX +# define NETUNIX 1 /* include unix domain support */ +#endif + #ifndef HASFLOCK # define HASFLOCK 0 /* assume no flock(2) support */ #endif +#ifndef HASSETREUID +# define HASSETREUID 0 /* assume no setreuid(2) call */ +#endif + +#ifndef HASFCHMOD +# define HASFCHMOD 0 /* assume no fchmod(2) syscall */ +#endif + +#ifndef USESETEUID +# define USESETEUID 0 /* assume no seteuid(2) call or no saved ids */ +#endif + +#ifndef HASSETRLIMIT +# define HASSETRLIMIT 0 /* assume no setrlimit(2) support */ +#endif + +#ifndef HASULIMIT +# define HASULIMIT 0 /* assume no ulimit(2) support */ +#endif + #ifndef OLD_NEWDB # define OLD_NEWDB 0 /* assume newer version of newdb */ #endif +/* heuristic setting of HASSETSIGMASK; can override above */ +#ifndef HASSIGSETMASK +# ifdef SIGVTALRM +# define HASSETSIGMASK 1 +# else +# define HASSETSIGMASK 0 +# endif +#endif + +/* +** If no type for argument two of getgroups call is defined, assume +** it's an integer -- unfortunately, there seem to be several choices +** here. +*/ -/********************************************************************** +#ifndef GIDSET_T +# define GIDSET_T int +#endif + +#ifndef UID_T +# define UID_T uid_t +#endif + +#ifndef SIZE_T +# define SIZE_T size_t +#endif + +#ifndef ARGV_T +# define ARGV_T char ** +#endif +/********************************************************************** ** Remaining definitions should never have to be changed. They are ** primarily to provide back compatibility for older systems -- for ** example, it includes some POSIX compatibility definitions @@ -1021,11 +1604,14 @@ typedef int pid_t; #if !defined(S_ISLNK) && defined(S_IFLNK) # define S_ISLNK(foo) ((foo & S_IFMT) == S_IFLNK) #endif +#ifndef S_IWUSR +# define S_IWUSR 0200 +#endif #ifndef S_IWGRP -#define S_IWGRP 020 +# define S_IWGRP 0020 #endif #ifndef S_IWOTH -#define S_IWOTH 002 +# define S_IWOTH 0002 #endif /* @@ -1063,11 +1649,45 @@ typedef int pid_t; # include "cdefs.h" #endif +#if NAMED_BIND +# include <arpa/nameser.h> +# ifdef __svr4__ +# ifdef NOERROR +# undef NOERROR /* avoid compiler conflict with stream.h */ +# endif +# endif +# ifndef __ksr__ +extern int h_errno; +# endif +#endif + +/* +** The size of an IP address -- can't use sizeof because of problems +** on Crays, where everything is 64 bits. This will break if/when +** IP addresses are expanded to eight bytes. +*/ + +#ifndef INADDRSZ +# define INADDRSZ 4 +#endif + +/* +** The size of various known types -- for reading network protocols. +** Again, we can't use sizeof because of compiler randomness. +*/ + +#ifndef INT16SZ +# define INT16SZ 2 +#endif +#ifndef INT32SZ +# define INT32SZ 4 +#endif + /* ** Do some required dependencies */ -#if defined(NETINET) || defined(NETISO) +#if NETINET || NETISO # define SMTP 1 /* enable user and server SMTP */ # define QUEUE 1 /* enable queueing */ # define DAEMON 1 /* include the daemon (requires IPC & SMTP) */ @@ -1109,7 +1729,7 @@ struct utsname }; #endif /* HASUNAME */ -#if !defined(MAXHOSTNAMELEN) && !defined(_SCO_unix_) +#if !defined(MAXHOSTNAMELEN) && !defined(_SCO_unix_) && !defined(NonStop_UX_BXX) && !defined(ALTOS_SYS_V) # define MAXHOSTNAMELEN 256 #endif @@ -1118,15 +1738,15 @@ struct utsname #endif #ifndef STDIN_FILENO -#define STDIN_FILENO 0 +# define STDIN_FILENO 0 #endif #ifndef STDOUT_FILENO -#define STDOUT_FILENO 1 +# define STDOUT_FILENO 1 #endif #ifndef STDERR_FILENO -#define STDERR_FILENO 2 +# define STDERR_FILENO 2 #endif #ifndef LOCK_SH @@ -1136,6 +1756,12 @@ struct utsname # define LOCK_UN 0x08 /* unlock */ #endif +#ifndef SEEK_SET +# define SEEK_SET 0 +# define SEEK_CUR 1 +# define SEEK_END 2 +#endif + #ifndef SIG_ERR # define SIG_ERR ((void (*)()) -1) #endif @@ -1163,13 +1789,19 @@ typedef void (*sigfunc_t) __P((int)); */ #ifndef TOBUFSIZE -# if (SYSLOG_BUFSIZE) > 512 -# define TOBUFSIZE (SYSLOG_BUFSIZE - 256) +# if (SYSLOG_BUFSIZE) > 768 +# define TOBUFSIZE (SYSLOG_BUFSIZE - 512) # else # define TOBUFSIZE 256 # endif #endif +/* TOBUFSIZE must never be permitted to exceed MAXLINE - 128 */ +#if TOBUFSIZE > (MAXLINE - 128) +# undef TOBUFSIZE +# define TOBUFSIZE (MAXLINE - 128) +#endif + /* ** Size of prescan buffer. ** Despite comments in the _sendmail_ book, this probably should @@ -1183,9 +1815,9 @@ typedef void (*sigfunc_t) __P((int)); # endif /* -** If we are going to link scanf anyway, use it in readcf +** Default to using scanf in readcf. */ -#if !defined(HASUNAME) && !defined(SCANF) +#ifndef SCANF # define SCANF 1 #endif diff --git a/usr.sbin/sendmail/src/convtime.c b/usr.sbin/sendmail/src/convtime.c index 5cb5e49cd3f3a..f978e92f15ed7 100644 --- a/usr.sbin/sendmail/src/convtime.c +++ b/usr.sbin/sendmail/src/convtime.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1983 Eric P. Allman + * Copyright (c) 1983, 1995 Eric P. Allman * Copyright (c) 1988, 1993 * The Regents of the University of California. All rights reserved. * @@ -33,10 +33,11 @@ */ #ifndef lint -static char sccsid[] = "@(#)convtime.c 8.1 (Berkeley) 6/7/93"; +static char sccsid[] = "@(#)convtime.c 8.4 (Berkeley) 5/19/95"; #endif /* not lint */ # include <ctype.h> +# include <string.h> # include "useful.h" /* @@ -81,6 +82,11 @@ convtime(p, units) c = units; p--; } + else if (strchr("wdhms", c) == NULL) + { + usrerr("Invalid time unit `%c'", c); + c = units; + } switch (c) { case 'w': /* weeks */ diff --git a/usr.sbin/sendmail/src/daemon.c b/usr.sbin/sendmail/src/daemon.c index b4b4e8b156b95..4bb9a99e4e4c2 100644 --- a/usr.sbin/sendmail/src/daemon.c +++ b/usr.sbin/sendmail/src/daemon.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1983 Eric P. Allman + * Copyright (c) 1983, 1995 Eric P. Allman * Copyright (c) 1988, 1993 * The Regents of the University of California. All rights reserved. * @@ -37,20 +37,27 @@ #ifndef lint #ifdef DAEMON -static char sccsid[] = "@(#)daemon.c 8.48.1.5 (Berkeley) 3/28/95 (with daemon mode)"; +static char sccsid[] = "@(#)daemon.c 8.119 (Berkeley) 11/29/95 (with daemon mode)"; #else -static char sccsid[] = "@(#)daemon.c 8.48.1.5 (Berkeley) 3/28/95 (without daemon mode)"; +static char sccsid[] = "@(#)daemon.c 8.119 (Berkeley) 11/29/95 (without daemon mode)"; #endif #endif /* not lint */ #ifdef DAEMON -# include <netdb.h> # include <arpa/inet.h> #if NAMED_BIND -# include <arpa/nameser.h> # include <resolv.h> +# ifndef NO_DATA +# define NO_DATA NO_ADDRESS +# endif +#endif + +#if IP_SRCROUTE +# include <netinet/in_systm.h> +# include <netinet/ip.h> +# include <netinet/ip_var.h> #endif /* @@ -106,13 +113,14 @@ int ListenQueueSize = 10; /* size of listen queue */ int TcpRcvBufferSize = 0; /* size of TCP receive buffer */ int TcpSndBufferSize = 0; /* size of TCP send buffer */ +void getrequests() { int t; bool refusingconnections = TRUE; FILE *pidf; int socksize; -#ifdef XDEBUG +#if XDEBUG bool j_has_dot; #endif extern void reapchild(); @@ -167,11 +175,11 @@ getrequests() fclose(pidf); } -#ifdef XDEBUG +#if XDEBUG { char jbuf[MAXHOSTNAMELEN]; - expand("\201j", jbuf, &jbuf[sizeof jbuf - 1], CurEnv); + expand("\201j", jbuf, sizeof jbuf, CurEnv); j_has_dot = strchr(jbuf, '.') != NULL; } #endif @@ -184,6 +192,7 @@ getrequests() register int pid; auto int lotherend; extern bool refuseconnections(); + extern int getla(); /* see if we are rejecting connections */ CurrentLA = getla(); @@ -196,29 +205,24 @@ getrequests() DaemonSocket = -1; } refusingconnections = TRUE; - setproctitle("rejecting connections: load average: %d", - CurrentLA); sleep(15); continue; } + /* arrange to (re)open the socket if necessary */ if (refusingconnections) { - /* start listening again */ (void) opendaemonsocket(FALSE); - setproctitle("accepting connections"); refusingconnections = FALSE; } -#ifdef XDEBUG +#if XDEBUG /* check for disaster */ { - register STAB *s; char jbuf[MAXHOSTNAMELEN]; - expand("\201j", jbuf, &jbuf[sizeof jbuf - 1], CurEnv); - if ((s = stab(jbuf, ST_CLASS, ST_FIND)) == NULL || - !bitnset('w', s->s_class)) + expand("\201j", jbuf, sizeof jbuf, CurEnv); + if (!wordinclass(jbuf, 'w')) { dumpstate("daemon lost $j"); syslog(LOG_ALERT, "daemon process doesn't have $j in $=w; see syslog"); @@ -234,6 +238,7 @@ getrequests() #endif /* wait for a connection */ + setproctitle("accepting connections"); do { errno = 0; @@ -244,6 +249,11 @@ getrequests() if (t < 0) { syserr("getrequests: accept"); + + /* arrange to re-open the socket next time around */ + (void) close(DaemonSocket); + DaemonSocket = -1; + refusingconnections = TRUE; sleep(5); continue; } @@ -268,6 +278,8 @@ getrequests() { char *p; extern char *hostnamebyanyaddr(); + extern void intsig(); + FILE *inchannel, *outchannel; /* ** CHILD -- return to caller. @@ -276,34 +288,31 @@ getrequests() */ (void) setsignal(SIGCHLD, SIG_DFL); - DisConnected = FALSE; + (void) setsignal(SIGHUP, intsig); + (void) close(DaemonSocket); setproctitle("startup with %s", anynet_ntoa(&RealHostAddr)); /* determine host name */ p = hostnamebyanyaddr(&RealHostAddr); + if (strlen(p) > MAXNAME) + p[MAXNAME] = '\0'; RealHostName = newstr(p); setproctitle("startup with %s", p); -#ifdef LOG - if (LogLevel > 11) - { - /* log connection information */ - syslog(LOG_INFO, "connect from %s (%s)", - RealHostName, anynet_ntoa(&RealHostAddr)); - } -#endif - - (void) close(DaemonSocket); - if ((InChannel = fdopen(t, "r")) == NULL || + if ((inchannel = fdopen(t, "r")) == NULL || (t = dup(t)) < 0 || - (OutChannel = fdopen(t, "w")) == NULL) + (outchannel = fdopen(t, "w")) == NULL) { syserr("cannot open SMTP server channel, fd=%d", t); exit(0); } + InChannel = inchannel; + OutChannel = outchannel; + DisConnected = FALSE; + /* should we check for illegal connection here? XXX */ #ifdef XLA if (!xla_host_ok(RealHostName)) @@ -318,6 +327,8 @@ getrequests() return; } + CurChildren++; + /* close the port so that others will hang (for a while) */ (void) close(t); } @@ -347,7 +358,7 @@ opendaemonsocket(firsttime) bool firsttime; { int on = 1; - int socksize; + int socksize = 0; int ntries = 0; int saveerrno; @@ -363,7 +374,6 @@ opendaemonsocket(firsttime) DaemonSocket = socket(DaemonAddr.sa.sa_family, SOCK_STREAM, 0); if (DaemonSocket < 0) { - /* probably another daemon already */ saveerrno = errno; syserr("opendaemonsocket: can't create server SMTP socket"); severe: @@ -393,19 +403,19 @@ opendaemonsocket(firsttime) SO_RCVBUF, (char *) &TcpRcvBufferSize, sizeof(TcpRcvBufferSize)) < 0) - syserr("getrequests: setsockopt(SO_RCVBUF)"); + syserr("opendaemonsocket: setsockopt(SO_RCVBUF)"); } #endif switch (DaemonAddr.sa.sa_family) { -# ifdef NETINET +# if NETINET case AF_INET: socksize = sizeof DaemonAddr.sin; break; # endif -# ifdef NETISO +# if NETISO case AF_ISO: socksize = sizeof DaemonAddr.siso; break; @@ -418,8 +428,9 @@ opendaemonsocket(firsttime) if (bind(DaemonSocket, &DaemonAddr.sa, socksize) < 0) { + /* probably another daemon already */ saveerrno = errno; - syserr("getrequests: cannot bind"); + syserr("opendaemonsocket: cannot bind"); (void) close(DaemonSocket); goto severe; } @@ -427,12 +438,13 @@ opendaemonsocket(firsttime) if (!firsttime && listen(DaemonSocket, ListenQueueSize) < 0) { saveerrno = errno; - syserr("getrequests: cannot listen"); + syserr("opendaemonsocket: cannot listen"); (void) close(DaemonSocket); goto severe; } return socksize; } while (ntries++ < MAXOPENTRIES && transienterror(saveerrno)); + syserr("!opendaemonsocket: server SMTP socket wedged: exiting"); finis(); } /* @@ -448,6 +460,7 @@ opendaemonsocket(firsttime) ** releases any resources used by the passive daemon. */ +void clrdaemon() { if (DaemonSocket >= 0) @@ -464,6 +477,7 @@ clrdaemon() ** none. */ +void setdaemonoptions(p) register char *p; { @@ -488,25 +502,27 @@ setdaemonoptions(p) continue; while (isascii(*++v) && isspace(*v)) continue; + if (isascii(*f) && islower(*f)) + *f = toupper(*f); switch (*f) { case 'F': /* address family */ if (isascii(*v) && isdigit(*v)) DaemonAddr.sa.sa_family = atoi(v); -#ifdef NETINET +#if NETINET else if (strcasecmp(v, "inet") == 0) DaemonAddr.sa.sa_family = AF_INET; #endif -#ifdef NETISO +#if NETISO else if (strcasecmp(v, "iso") == 0) DaemonAddr.sa.sa_family = AF_ISO; #endif -#ifdef NETNS +#if NETNS else if (strcasecmp(v, "ns") == 0) DaemonAddr.sa.sa_family = AF_NS; #endif -#ifdef NETX25 +#if NETX25 else if (strcasecmp(v, "x.25") == 0) DaemonAddr.sa.sa_family = AF_CCITT; #endif @@ -517,10 +533,10 @@ setdaemonoptions(p) case 'A': /* address */ switch (DaemonAddr.sa.sa_family) { -#ifdef NETINET +#if NETINET case AF_INET: if (isascii(*v) && isdigit(*v)) - DaemonAddr.sin.sin_addr.s_addr = inet_network(v); + DaemonAddr.sin.sin_addr.s_addr = htonl(inet_network(v)); else { register struct netent *np; @@ -546,7 +562,7 @@ setdaemonoptions(p) { short port; -#ifdef NETINET +#if NETINET case AF_INET: if (isascii(*v) && isdigit(*v)) DaemonAddr.sin.sin_port = htons(atoi(v)); @@ -563,7 +579,7 @@ setdaemonoptions(p) break; #endif -#ifdef NETISO +#if NETISO case AF_ISO: /* assume two byte transport selector */ if (isascii(*v) && isdigit(*v)) @@ -600,6 +616,9 @@ setdaemonoptions(p) case 'R': /* receive buffer size */ TcpRcvBufferSize = atoi(v); break; + + default: + syserr("554 DaemonPortOptions parameter \"%s\" unknown", f); } } } @@ -622,6 +641,15 @@ setdaemonoptions(p) ** none. */ +static jmp_buf CtxConnectTimeout; + +static void +connecttimeout() +{ + errno = ETIMEDOUT; + longjmp(CtxConnectTimeout, 1); +} + SOCKADDR CurHostAddr; /* address of current host */ int @@ -631,14 +659,14 @@ makeconnection(host, port, mci, usesecureport) register MCI *mci; bool usesecureport; { - register int i, s; + register int i = 0; + register int s; register struct hostent *hp = (struct hostent *)NULL; SOCKADDR addr; int sav_errno; int addrlen; -#if NAMED_BIND - extern int h_errno; -#endif + bool firstconnect; + EVENT *ev; /* ** Set up the address for the mailer. @@ -661,18 +689,26 @@ makeconnection(host, port, mci, usesecureport) if (p != NULL) { *p = '\0'; -#ifdef NETINET +#if NETINET hid = inet_addr(&host[1]); if (hid == -1) #endif { /* try it as a host name (avoid MX lookup) */ - hp = gethostbyname(&host[1]); + hp = sm_gethostbyname(&host[1]); if (hp == NULL && p[-1] == '.') { +#if NAMED_BIND + int oldopts = _res.options; + + _res.options &= ~(RES_DEFNAMES|RES_DNSRCH); +#endif p[-1] = '\0'; - hp = gethostbyname(&host[1]); + hp = sm_gethostbyname(&host[1]); p[-1] = '.'; +#if NAMED_BIND + _res.options = oldopts; +#endif } *p = ']'; goto gothostent; @@ -682,9 +718,10 @@ makeconnection(host, port, mci, usesecureport) if (p == NULL) { usrerr("553 Invalid numeric domain spec \"%s\"", host); + mci->mci_status = "5.1.2"; return (EX_NOHOST); } -#ifdef NETINET +#if NETINET addr.sin.sin_family = AF_INET; /*XXX*/ addr.sin.sin_addr.s_addr = hid; #endif @@ -693,34 +730,43 @@ makeconnection(host, port, mci, usesecureport) { register char *p = &host[strlen(host) - 1]; - hp = gethostbyname(host); + hp = sm_gethostbyname(host); if (hp == NULL && *p == '.') { +#if NAMED_BIND + int oldopts = _res.options; + + _res.options &= ~(RES_DEFNAMES|RES_DNSRCH); +#endif *p = '\0'; - hp = gethostbyname(host); + hp = sm_gethostbyname(host); *p = '.'; +#if NAMED_BIND + _res.options = oldopts; +#endif } gothostent: if (hp == NULL) { #if NAMED_BIND - if (errno == ETIMEDOUT || h_errno == TRY_AGAIN) - return (EX_TEMPFAIL); - - /* if name server is specified, assume temp fail */ - if (errno == ECONNREFUSED && UseNameServer) + /* check for name server timeouts */ + if (errno == ETIMEDOUT || h_errno == TRY_AGAIN || + (errno == ECONNREFUSED && UseNameServer)) + { + mci->mci_status = "4.4.3"; return (EX_TEMPFAIL); + } #endif return (EX_NOHOST); } addr.sa.sa_family = hp->h_addrtype; switch (hp->h_addrtype) { -#ifdef NETINET +#if NETINET case AF_INET: bcopy(hp->h_addr, &addr.sin.sin_addr, - sizeof addr.sin.sin_addr); + INADDRSZ); break; #endif @@ -737,15 +783,16 @@ gothostent: ** Determine the port number. */ - if (port != 0) - port = htons(port); - else + if (port == 0) { register struct servent *sp = getservbyname("smtp", "tcp"); if (sp == NULL) { - syserr("554 makeconnection: service \"smtp\" unknown"); +#ifdef LOG + if (LogLevel > 2) + syslog(LOG_ERR, "makeconnection: service \"smtp\" unknown"); +#endif port = htons(25); } else @@ -754,14 +801,14 @@ gothostent: switch (addr.sa.sa_family) { -#ifdef NETINET +#if NETINET case AF_INET: addr.sin.sin_port = port; addrlen = sizeof (struct sockaddr_in); break; #endif -#ifdef NETISO +#if NETISO case AF_ISO: /* assume two byte transport selector */ bcopy((char *) &port, TSEL((struct sockaddr_iso *) &addr), 2); @@ -784,6 +831,7 @@ gothostent: return EX_TEMPFAIL; #endif + firstconnect = TRUE; for (;;) { if (tTd(16, 1)) @@ -806,7 +854,7 @@ gothostent: if (s < 0) { sav_errno = errno; - syserr("makeconnection: no socket"); + syserr("makeconnection: cannot create socket"); goto failure; } @@ -833,24 +881,54 @@ gothostent: if (CurEnv->e_xfp != NULL) (void) fflush(CurEnv->e_xfp); /* for debugging */ errno = 0; /* for debugging */ - if (connect(s, (struct sockaddr *) &addr, addrlen) >= 0) - break; - /* couldn't connect.... figure out why */ + /* + ** Linux seems to hang in connect for 90 minutes (!!!). + ** Time out the connect to avoid this problem. + */ + + if (setjmp(CtxConnectTimeout) == 0) + { + if (TimeOuts.to_connect == 0) + ev = NULL; + else + ev = setevent(TimeOuts.to_connect, connecttimeout, 0); + if (connect(s, (struct sockaddr *) &addr, addrlen) >= 0) + { + if (ev != NULL) + clrevent(ev); + break; + } + } sav_errno = errno; + if (ev != NULL) + clrevent(ev); + + /* if running demand-dialed connection, try again */ + if (DialDelay > 0 && firstconnect) + { + if (tTd(16, 1)) + printf("Connect failed (%s); trying again...\n", + errstring(sav_errno)); + firstconnect = FALSE; + sleep(DialDelay); + continue; + } + + /* couldn't connect.... figure out why */ (void) close(s); - if (hp && hp->h_addr_list[i]) + if (hp != NULL && hp->h_addr_list[i]) { if (tTd(16, 1)) printf("Connect failed (%s); trying new address....\n", errstring(sav_errno)); switch (addr.sa.sa_family) { -#ifdef NETINET +#if NETINET case AF_INET: bcopy(hp->h_addr_list[i++], &addr.sin.sin_addr, - sizeof addr.sin.sin_addr); + INADDRSZ); break; #endif @@ -902,61 +980,77 @@ gothostent: ** Adds numeric codes to $=w. */ -char ** +struct hostent * myhostname(hostbuf, size) char hostbuf[]; int size; { register struct hostent *hp; - extern struct hostent *gethostbyname(); + extern bool getcanonname(); if (gethostname(hostbuf, size) < 0) { (void) strcpy(hostbuf, "localhost"); } - hp = gethostbyname(hostbuf); + hp = sm_gethostbyname(hostbuf); if (hp == NULL) + return NULL; + if (strchr(hp->h_name, '.') != NULL || strchr(hostbuf, '.') == NULL) { - syserr("!My host name (%s) does not seem to exist!", hostbuf); + (void) strncpy(hostbuf, hp->h_name, size - 1); + hostbuf[size - 1] = '\0'; } - (void) strncpy(hostbuf, hp->h_name, size - 1); - hostbuf[size - 1] = '\0'; -#if NAMED_BIND - /* if still no dot, try DNS directly (i.e., avoid NIS problems) */ + /* + ** If there is still no dot in the name, try looking for a + ** dotted alias. + */ + if (strchr(hostbuf, '.') == NULL) { - extern bool getcanonname(); - extern int h_errno; + char **ha; - /* try twice in case name server not yet started up */ - if (!getcanonname(hostbuf, size, TRUE) && - UseNameServer && - (h_errno != TRY_AGAIN || - (sleep(30), !getcanonname(hostbuf, size, TRUE)))) + for (ha = hp->h_aliases; *ha != NULL; ha++) { - errno = h_errno + E_DNSBASE; - syserr("!My host name (%s) not known to DNS", - hostbuf); + if (strchr(*ha, '.') != NULL) + { + (void) strncpy(hostbuf, *ha, size - 1); + hostbuf[size - 1] = '\0'; + break; + } } } -#endif - if (hp->h_addrtype == AF_INET && hp->h_length == 4) - { - register int i; + /* + ** If _still_ no dot, wait for a while and try again -- it is + ** possible that some service is starting up. This can result + ** in excessive delays if the system is badly configured, but + ** there really isn't a way around that, particularly given that + ** the config file hasn't been read at this point. + ** All in all, a bit of a mess. + */ - for (i = 0; hp->h_addr_list[i] != NULL; i++) + if (strchr(hostbuf, '.') == NULL && + !getcanonname(hostbuf, size, TRUE)) + { +#ifdef LOG + syslog(LOG_CRIT, "My unqualified host name (%s) unknown; sleeping for retry", + hostbuf); +#endif + message("My unqualified host name (%s) unknown; sleeping for retry", + hostbuf); + sleep(60); + if (!getcanonname(hostbuf, size, TRUE)) { - char ipbuf[100]; - - sprintf(ipbuf, "[%s]", - inet_ntoa(*((struct in_addr *) hp->h_addr_list[i]))); - setclass('w', ipbuf); +#ifdef LOG + syslog(LOG_ALERT, "unable to qualify my own domain name (%s) -- using short name", + hostbuf); +#endif + message("WARNING: unable to qualify my own domain name (%s) -- using short name", + hostbuf); } } - - return (hp->h_aliases); + return (hp); } /* ** GETAUTHINFO -- get the real host name asociated with a file descriptor @@ -970,41 +1064,34 @@ myhostname(hostbuf, size) ** The user@host information associated with this descriptor. */ -#if IDENTPROTO - static jmp_buf CtxAuthTimeout; -static +static void authtimeout() { longjmp(CtxAuthTimeout, 1); } -#endif - char * getauthinfo(fd) int fd; { int falen; register char *p; -#if IDENTPROTO SOCKADDR la; int lalen; register struct servent *sp; - int s; + volatile int s; int i; EVENT *ev; int nleft; char ibuf[MAXNAME + 1]; -#endif static char hbuf[MAXNAME * 2 + 2]; extern char *hostnamebyanyaddr(); - extern char RealUserName[]; /* main.c */ falen = sizeof RealHostAddr; - if (getpeername(fd, &RealHostAddr.sa, &falen) < 0 || falen <= 0 || - RealHostAddr.sa.sa_family == 0) + if (isatty(fd) || getpeername(fd, &RealHostAddr.sa, &falen) < 0 || + falen <= 0 || RealHostAddr.sa.sa_family == 0) { (void) sprintf(hbuf, "%s@localhost", RealUserName); if (tTd(9, 1)) @@ -1018,7 +1105,6 @@ getauthinfo(fd) RealHostName = newstr(hostnamebyanyaddr(&RealHostAddr)); } -#if IDENTPROTO if (TimeOuts.to_ident == 0) goto noident; @@ -1120,6 +1206,14 @@ getauthinfo(fd) } /* p now points to the OSTYPE field */ + while (isascii(*p) && isspace(*p)) + p++; + if (strncasecmp(p, "other", 5) == 0 && + (p[5] == ':' || p[5] == ' ' || p[5] == ',' || p[5] == '\0')) + { + /* not useful information */ + goto noident; + } p = strchr(p, ':'); if (p == NULL) { @@ -1136,14 +1230,12 @@ getauthinfo(fd) i = strlen(hbuf); hbuf[i++] = '@'; strcpy(&hbuf[i], RealHostName == NULL ? "localhost" : RealHostName); - goto finish; + goto postident; closeident: (void) close(s); clrevent(ev); -#endif /* IDENTPROTO */ - noident: if (RealHostName == NULL) { @@ -1153,12 +1245,92 @@ noident: } (void) strcpy(hbuf, RealHostName); -finish: +postident: +#if IP_SRCROUTE + /* + ** Extract IP source routing information. + ** + ** Format of output for a connection from site a through b + ** through c to d: + ** loose: @site-c@site-b:site-a + ** strict: !@site-c@site-b:site-a + ** + ** o - pointer within ipopt_list structure. + ** q - pointer within ls/ss rr route data + ** p - pointer to hbuf + */ + + if (RealHostAddr.sa.sa_family == AF_INET) + { + int ipoptlen, j; + u_char *q; + u_char *o; + struct in_addr addr; + struct ipoption ipopt; + + ipoptlen = sizeof ipopt; + if (getsockopt(fd, IPPROTO_IP, IP_OPTIONS, + (char *) &ipopt, &ipoptlen) < 0) + goto noipsr; + if (ipoptlen == 0) + goto noipsr; + o = (u_char *) ipopt.ipopt_list; + while (o != NULL && o < (u_char *) &ipopt + ipoptlen) + { + switch (*o) + { + case IPOPT_EOL: + o = NULL; + break; + + case IPOPT_NOP: + o++; + break; + + case IPOPT_SSRR: + case IPOPT_LSRR: + p = &hbuf[strlen(hbuf)]; + sprintf(p, " [%s@%.120s", + *o == IPOPT_SSRR ? "!" : "", + inet_ntoa(ipopt.ipopt_dst)); + p += strlen(p); + + /* o[1] is option length */ + j = *++o / sizeof(struct in_addr) - 1; + + /* q skips length and router pointer to data */ + q = o + 2; + for ( ; j >= 0; j--) + { + memcpy(&addr, q, sizeof(addr)); + sprintf(p, "%c%.120s", + j ? '@' : ':', + inet_ntoa(addr)); + p += strlen(p); + q += sizeof(struct in_addr); + } + o += *o; + break; + + default: + /* Skip over option */ + o += o[1]; + break; + } + } + strcat(hbuf,"]"); + goto postipsr; + } +#endif + +noipsr: if (RealHostName != NULL && RealHostName[0] != '[') { p = &hbuf[strlen(hbuf)]; - (void) sprintf(p, " [%s]", anynet_ntoa(&RealHostAddr)); + (void) sprintf(p, " [%.100s]", anynet_ntoa(&RealHostAddr)); } + +postipsr: if (tTd(9, 1)) printf("getauthinfo: %s\n", hbuf); return hbuf; @@ -1192,15 +1364,10 @@ host_map_lookup(map, name, av, statp) int *statp; { register struct hostent *hp; - u_long in_addr; + struct in_addr in_addr; char *cp; - int i; register STAB *s; - char hbuf[MAXNAME]; - extern struct hostent *gethostbyaddr(); -#if NAMED_BIND - extern int h_errno; -#endif + char hbuf[MAXNAME + 1]; /* ** See if we have already looked up this name. If so, just @@ -1212,22 +1379,39 @@ host_map_lookup(map, name, av, statp) { if (tTd(9, 1)) printf("host_map_lookup(%s) => CACHE %s\n", - name, s->s_namecanon.nc_cname); + name, + s->s_namecanon.nc_cname == NULL + ? "NULL" + : s->s_namecanon.nc_cname); errno = s->s_namecanon.nc_errno; #if NAMED_BIND h_errno = s->s_namecanon.nc_herrno; #endif *statp = s->s_namecanon.nc_stat; - if (CurEnv->e_message == NULL && *statp == EX_TEMPFAIL) + if (*statp == EX_TEMPFAIL) { - sprintf(hbuf, "%s: Name server timeout", + CurEnv->e_status = "4.4.3"; + message("851 %s: Name server timeout", shortenstring(name, 33)); - CurEnv->e_message = newstr(hbuf); } return s->s_namecanon.nc_cname; } /* + ** If we are running without a regular network connection (usually + ** dial-on-demand) and we are just queueing, we want to avoid DNS + ** lookups because those could try to connect to a server. + */ + + if (CurEnv->e_sendmode == SM_DEFER) + { + if (tTd(9, 1)) + printf("host_map_lookup(%s) => DEFERRED\n", name); + *statp = EX_TEMPFAIL; + return NULL; + } + + /* ** If first character is a bracket, then it is an address ** lookup. Address is copied into a temporary buffer to ** strip the brackets and to preserve name if address is @@ -1241,8 +1425,14 @@ host_map_lookup(map, name, av, statp) if (tTd(9, 1)) printf("host_map_lookup(%s) => ", name); s->s_namecanon.nc_flags |= NCF_VALID; /* will be soon */ - (void) strcpy(hbuf, name); - if (getcanonname(hbuf, sizeof hbuf - 1, TRUE)) + if (strlen(name) < sizeof hbuf) + (void) strcpy(hbuf, name); + else + { + bcopy(name, hbuf, sizeof hbuf - 1); + hbuf[sizeof hbuf - 1] = '\0'; + } + if (getcanonname(hbuf, sizeof hbuf - 1, !HasWildcardMX)) { if (tTd(9, 1)) printf("%s\n", hbuf); @@ -1264,16 +1454,15 @@ host_map_lookup(map, name, av, statp) case TRY_AGAIN: if (UseNameServer) { - sprintf(hbuf, "%s: Name server timeout", + CurEnv->e_status = "4.4.3"; + message("851 %s: Name server timeout", shortenstring(name, 33)); - message("%s", hbuf); - if (CurEnv->e_message == NULL) - CurEnv->e_message = newstr(hbuf); } *statp = EX_TEMPFAIL; break; case HOST_NOT_FOUND: + case NO_DATA: *statp = EX_NOHOST; break; @@ -1291,34 +1480,16 @@ host_map_lookup(map, name, av, statp) *statp = EX_NOHOST; #endif s->s_namecanon.nc_stat = *statp; - if (*statp != EX_TEMPFAIL || UseNameServer) - return NULL; - - /* - ** Try to look it up in /etc/hosts - */ - - hp = gethostbyname(name); - if (hp == NULL) - { - /* no dice there either */ - s->s_namecanon.nc_stat = *statp = EX_NOHOST; - return NULL; - } - - s->s_namecanon.nc_stat = *statp = EX_OK; - cp = map_rewrite(map, hp->h_name, strlen(hp->h_name), av); - s->s_namecanon.nc_cname = newstr(cp); - return cp; + return NULL; } } if ((cp = strchr(name, ']')) == NULL) return (NULL); *cp = '\0'; - in_addr = inet_addr(&name[1]); + in_addr.s_addr = inet_addr(&name[1]); /* nope -- ask the name server */ - hp = gethostbyaddr((char *)&in_addr, sizeof(struct in_addr), AF_INET); + hp = sm_gethostbyaddr((char *)&in_addr, INADDRSZ, AF_INET); s->s_namecanon.nc_errno = errno; #if NAMED_BIND s->s_namecanon.nc_herrno = h_errno; @@ -1331,7 +1502,7 @@ host_map_lookup(map, name, av, statp) } /* found a match -- copy out */ - cp = map_rewrite(map, hp->h_name, strlen(hp->h_name), av); + cp = map_rewrite(map, (char *) hp->h_name, strlen(hp->h_name), av); s->s_namecanon.nc_stat = *statp = EX_OK; s->s_namecanon.nc_cname = newstr(cp); return cp; @@ -1346,6 +1517,10 @@ host_map_lookup(map, name, av, statp) ** A printable version of that sockaddr. */ +#if NETLINK +# include <net/if_dl.h> +#endif + char * anynet_ntoa(sap) register SOCKADDR *sap; @@ -1363,8 +1538,7 @@ anynet_ntoa(sap) switch (sap->sa.sa_family) { -#ifdef MAYBENEXTRELEASE /*** UNTESTED *** UNTESTED *** UNTESTED ***/ -#ifdef NETUNIX +#if NETUNIX case AF_UNIX: if (sap->sunix.sun_path[0] != '\0') sprintf(buf, "[UNIX: %.64s]", sap->sunix.sun_path); @@ -1372,16 +1546,22 @@ anynet_ntoa(sap) sprintf(buf, "[UNIX: localhost]"); return buf; #endif -#endif -#ifdef NETINET +#if NETINET case AF_INET: - return inet_ntoa(((struct sockaddr_in *) sap)->sin_addr); + return inet_ntoa(sap->sin.sin_addr); #endif +#if NETLINK + case AF_LINK: + sprintf(buf, "[LINK: %s]", + link_ntoa((struct sockaddr_dl *) &sap->sa)); + return buf; +#endif default: - /* this case is only to ensure syntactic correctness */ - break; + /* this case is needed when nothing is #defined */ + /* in order to keep the switch syntactically correct */ + break; } /* unknown family -- just dump bytes */ @@ -1424,30 +1604,28 @@ hostnamebyanyaddr(sap) switch (sap->sa.sa_family) { -#ifdef NETINET +#if NETINET case AF_INET: - hp = gethostbyaddr((char *) &sap->sin.sin_addr, - sizeof sap->sin.sin_addr, + hp = sm_gethostbyaddr((char *) &sap->sin.sin_addr, + INADDRSZ, AF_INET); break; #endif -#ifdef NETISO +#if NETISO case AF_ISO: - hp = gethostbyaddr((char *) &sap->siso.siso_addr, + hp = sm_gethostbyaddr((char *) &sap->siso.siso_addr, sizeof sap->siso.siso_addr, AF_ISO); break; #endif -#ifdef MAYBENEXTRELEASE /*** UNTESTED *** UNTESTED *** UNTESTED ***/ case AF_UNIX: hp = NULL; break; -#endif default: - hp = gethostbyaddr(sap->sa.sa_data, + hp = sm_gethostbyaddr(sap->sa.sa_data, sizeof sap->sa.sa_data, sap->sa.sa_family); break; @@ -1458,13 +1636,13 @@ hostnamebyanyaddr(sap) #endif /* NAMED_BIND */ if (hp != NULL) - return hp->h_name; + return (char *) hp->h_name; else { /* produce a dotted quad */ - static char buf[512]; + static char buf[203]; - (void) sprintf(buf, "[%s]", anynet_ntoa(sap)); + (void) sprintf(buf, "[%.200s]", anynet_ntoa(sap)); return buf; } } @@ -1548,7 +1726,7 @@ host_map_lookup(map, name, avp, statp) { register struct hostent *hp; - hp = gethostbyname(name); + hp = sm_gethostbyname(name); if (hp != NULL) return hp->h_name; *statp = EX_NOHOST; diff --git a/usr.sbin/sendmail/src/deliver.c b/usr.sbin/sendmail/src/deliver.c index 437b1ad92086d..51367ce443926 100644 --- a/usr.sbin/sendmail/src/deliver.c +++ b/usr.sbin/sendmail/src/deliver.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1983 Eric P. Allman + * Copyright (c) 1983, 1995 Eric P. Allman * Copyright (c) 1988, 1993 * The Regents of the University of California. All rights reserved. * @@ -33,20 +33,20 @@ */ #ifndef lint -static char sccsid[] = "@(#)deliver.c 8.84.1.4 (Berkeley) 3/28/95"; +static char sccsid[] = "@(#)deliver.c 8.185 (Berkeley) 11/18/95"; #endif /* not lint */ #include "sendmail.h" -#include <netdb.h> #include <errno.h> #if NAMED_BIND -#include <arpa/nameser.h> #include <resolv.h> extern int h_errno; #endif +#ifdef SMTP extern char SmtpError[]; +#endif /* ** SENDALL -- actually send all the messages. @@ -66,6 +66,7 @@ extern char SmtpError[]; ** appropriate action. */ +void sendall(e, mode) ENVELOPE *e; char mode; @@ -75,7 +76,10 @@ sendall(e, mode) int otherowners; register ENVELOPE *ee; ENVELOPE *splitenv = NULL; - bool announcequeueup; + bool oldverbose = Verbose; + bool somedeliveries = FALSE; + int pid; + extern void sendenvelope(); /* ** If we have had global, fatal errors, don't bother sending @@ -96,19 +100,20 @@ sendall(e, mode) if (mode == SM_DEFAULT) { mode = e->e_sendmode; - if (mode != SM_VERIFY && + if (mode != SM_VERIFY && mode != SM_DEFER && shouldqueue(e->e_msgpriority, e->e_ctime)) mode = SM_QUEUE; - announcequeueup = mode == SM_QUEUE; } - else - announcequeueup = FALSE; if (tTd(13, 1)) { + extern void printenvflags(); + printf("\n===== SENDALL: mode %c, id %s, e_from ", mode, e->e_id); printaddr(&e->e_from, FALSE); + printf("\te_flags = "); + printenvflags(e); printf("sendqueue:\n"); printaddr(e->e_sendqueue, TRUE); } @@ -124,12 +129,15 @@ sendall(e, mode) if (e->e_hopcount > MaxHopCount) { errno = 0; - queueup(e, TRUE, announcequeueup); +#ifdef QUEUE + queueup(e, mode == SM_QUEUE || mode == SM_DEFER); +#endif e->e_flags |= EF_FATALERRS|EF_PM_NOTIFY|EF_CLRQUEUE; - syserr("554 too many hops %d (%d max): from %s via %s, to %s", + syserr("554 Too many hops %d (%d max): from %s via %s, to %s", e->e_hopcount, MaxHopCount, e->e_from.q_paddr, RealHostName == NULL ? "localhost" : RealHostName, e->e_sendqueue->q_paddr); + e->e_sendqueue->q_status = "5.4.6"; return; } @@ -151,7 +159,7 @@ sendall(e, mode) printaddr(&e->e_from, FALSE); } e->e_from.q_flags |= QDONTSEND; - (void) recipient(&e->e_from, &e->e_sendqueue, e); + (void) recipient(&e->e_from, &e->e_sendqueue, 0, e); } /* @@ -185,8 +193,17 @@ sendall(e, mode) for (q = e->e_sendqueue; q != NULL; q = q->q_next) { + if (tTd(13, 30)) + { + printf("Checking "); + printaddr(q, FALSE); + } if (bitset(QDONTSEND, q->q_flags)) + { + if (tTd(13, 30)) + printf(" ... QDONTSEND\n"); continue; + } if (q->q_owner != NULL) { @@ -210,6 +227,35 @@ sendall(e, mode) { otherowners++; } + + /* + ** If this mailer is expensive, and if we don't + ** want to make connections now, just mark these + ** addresses and return. This is useful if we + ** want to batch connections to reduce load. This + ** will cause the messages to be queued up, and a + ** daemon will come along to send the messages later. + */ + + if (bitset(QBADADDR|QQUEUEUP, q->q_flags)) + { + if (tTd(13, 30)) + printf(" ... QBADADDR|QQUEUEUP\n"); + continue; + } + if (NoConnect && !Verbose && + bitnset(M_EXPENSIVE, q->q_mailer->m_flags)) + { + if (tTd(13, 30)) + printf(" ... expensive\n"); + q->q_flags |= QQUEUEUP; + } + else + { + if (tTd(13, 30)) + printf(" ... deliverable\n"); + somedeliveries = TRUE; + } } if (owner != NULL && otherowners > 0) @@ -233,7 +279,7 @@ sendall(e, mode) ee->e_header = copyheader(e->e_header); ee->e_sendqueue = copyqueue(e->e_sendqueue); ee->e_errorqueue = copyqueue(e->e_errorqueue); - ee->e_flags = e->e_flags & ~(EF_INQUEUE|EF_CLRQUEUE|EF_FATALERRS|EF_SENDRECEIPT); + ee->e_flags = e->e_flags & ~(EF_INQUEUE|EF_CLRQUEUE|EF_FATALERRS|EF_SENDRECEIPT|EF_RET_PARAM); ee->e_flags |= EF_NORECEIPT; setsender(owner, ee, NULL, TRUE); if (tTd(13, 5)) @@ -244,33 +290,61 @@ sendall(e, mode) ee->e_from.q_flags |= QDONTSEND; ee->e_dfp = NULL; ee->e_xfp = NULL; - ee->e_df = NULL; ee->e_errormode = EM_MAIL; ee->e_sibling = splitenv; splitenv = ee; for (q = e->e_sendqueue; q != NULL; q = q->q_next) + { if (q->q_owner == owner) { q->q_flags |= QDONTSEND; q->q_flags &= ~QQUEUEUP; } + } for (q = ee->e_sendqueue; q != NULL; q = q->q_next) + { if (q->q_owner != owner) { q->q_flags |= QDONTSEND; q->q_flags &= ~QQUEUEUP; } + else + { + /* clear DSN parameters */ + q->q_flags &= ~(QHASNOTIFY|QPINGONSUCCESS); + q->q_flags |= QPINGONFAILURE|QPINGONDELAY; + } + } - if (e->e_df != NULL && mode != SM_VERIFY) + if (mode != SM_VERIFY && bitset(EF_HAS_DF, e->e_flags)) { + char df1buf[20], df2buf[20]; + ee->e_dfp = NULL; - ee->e_df = queuename(ee, 'd'); - ee->e_df = newstr(ee->e_df); - if (link(e->e_df, ee->e_df) < 0) + strcpy(df1buf, queuename(e, 'd')); + strcpy(df2buf, queuename(ee, 'd')); + if (link(df1buf, df2buf) < 0) { + int saverrno = errno; + syserr("sendall: link(%s, %s)", - e->e_df, ee->e_df); + df1buf, df2buf); + if (saverrno == EEXIST) + { + if (unlink(df2buf) < 0) + { + syserr("!sendall: unlink(%s): permanent", + df2buf); + /*NOTREACHED*/ + } + if (link(df1buf, df2buf) < 0) + { + syserr("!sendall: link(%s, %s): permanent", + df1buf, df2buf); + /*NOTREACHED*/ + } + } } } #ifdef LOG @@ -294,65 +368,33 @@ sendall(e, mode) e->e_flags |= EF_NORECEIPT; } + /* if nothing to be delivered, just queue up everything */ + if (!somedeliveries && mode != SM_QUEUE && mode != SM_DEFER && + mode != SM_VERIFY) + { + if (tTd(13, 29)) + printf("No deliveries: auto-queuing\n"); + mode = SM_QUEUE; + } + # ifdef QUEUE - if ((mode == SM_QUEUE || mode == SM_FORK || + if ((mode == SM_QUEUE || mode == SM_DEFER || mode == SM_FORK || (mode != SM_VERIFY && SuperSafe)) && !bitset(EF_INQUEUE, e->e_flags)) { /* be sure everything is instantiated in the queue */ - queueup(e, TRUE, announcequeueup); + queueup(e, mode == SM_QUEUE || mode == SM_DEFER); for (ee = splitenv; ee != NULL; ee = ee->e_sibling) - queueup(ee, TRUE, announcequeueup); + queueup(ee, mode == SM_QUEUE || mode == SM_DEFER); } #endif /* QUEUE */ - if (splitenv != NULL) - { - if (tTd(13, 1)) - { - printf("\nsendall: Split queue; remaining queue:\n"); - printaddr(e->e_sendqueue, TRUE); - } - - for (ee = splitenv; ee != NULL; ee = ee->e_sibling) - { - CurEnv = ee; - if (mode != SM_VERIFY) - openxscript(ee); - sendenvelope(ee, mode); - dropenvelope(ee); - } - - CurEnv = e; - } - sendenvelope(e, mode); -} - -sendenvelope(e, mode) - register ENVELOPE *e; - char mode; -{ - bool oldverbose; - int pid; - register ADDRESS *q; - char *qf; - char *id; - /* - ** If we have had global, fatal errors, don't bother sending - ** the message at all if we are in SMTP mode. Local errors - ** (e.g., a single address failing) will still cause the other - ** addresses to be sent. + ** If we belong in background, fork now. */ - if (bitset(EF_FATALERRS, e->e_flags) && - (OpMode == MD_SMTP || OpMode == MD_DAEMON)) - { - e->e_flags |= EF_CLRQUEUE; - return; - } - - oldverbose = Verbose; + if (tTd(13, 20)) + printf("sendall: final mode = %c\n", mode); switch (mode) { case SM_VERIFY: @@ -360,8 +402,10 @@ sendenvelope(e, mode) break; case SM_QUEUE: + case SM_DEFER: queueonly: - e->e_flags |= EF_INQUEUE|EF_KEEPQUEUE; + if (e->e_nrcpts > 0) + e->e_flags |= EF_INQUEUE; return; case SM_FORK: @@ -376,15 +420,17 @@ sendenvelope(e, mode) ** then restart from scratch in the child. */ - /* save id for future use */ - id = e->e_id; + { + /* save id for future use */ + char *qid = e->e_id; - /* now drop the envelope in the parent */ - e->e_flags |= EF_INQUEUE|EF_KEEPQUEUE; - dropenvelope(e); + /* now drop the envelope in the parent */ + e->e_flags |= EF_INQUEUE; + dropenvelope(e); - /* and reacquire in the child */ - (void) dowork(id, TRUE, FALSE, e); + /* and reacquire in the child */ + (void) dowork(qid, TRUE, FALSE, e); + } return; @@ -400,15 +446,16 @@ sendenvelope(e, mode) /* be sure we leave the temp files to our child */ /* can't call unlockqueue to avoid unlink of xfp */ if (e->e_lockfp != NULL) - (void) xfclose(e->e_lockfp, "sendenvelope", "lockfp"); + (void) xfclose(e->e_lockfp, "sendenvelope lockfp", e->e_id); e->e_lockfp = NULL; /* close any random open files in the envelope */ closexscript(e); if (e->e_dfp != NULL) - (void) xfclose(e->e_dfp, "sendenvelope", e->e_df); + (void) xfclose(e->e_dfp, "sendenvelope dfp", e->e_id); e->e_dfp = NULL; - e->e_id = e->e_df = NULL; + e->e_id = NULL; + e->e_flags &= ~EF_HAS_DF; /* catch intermediate zombie */ (void) waitfor(pid); @@ -426,7 +473,7 @@ sendenvelope(e, mode) /* prevent parent from waiting if there was an error */ if (pid < 0) { - e->e_flags |= EF_INQUEUE|EF_KEEPQUEUE; + e->e_flags |= EF_INQUEUE; finis(); } @@ -447,6 +494,64 @@ sendenvelope(e, mode) break; } + if (splitenv != NULL) + { + if (tTd(13, 2)) + { + printf("\nsendall: Split queue; remaining queue:\n"); + printaddr(e->e_sendqueue, TRUE); + } + + for (ee = splitenv; ee != NULL; ee = ee->e_sibling) + { + CurEnv = ee; + if (mode != SM_VERIFY) + openxscript(ee); + sendenvelope(ee, mode); + dropenvelope(ee); + } + + CurEnv = e; + } + sendenvelope(e, mode); + Verbose = oldverbose; + if (mode == SM_FORK) + finis(); +} + +void +sendenvelope(e, mode) + register ENVELOPE *e; + char mode; +{ + register ADDRESS *q; + bool didany; + + if (tTd(13, 10)) + printf("sendenvelope(%s) e_flags=0x%x\n", + e->e_id == NULL ? "[NOQUEUE]" : e->e_id, + e->e_flags); +#ifdef LOG + if (LogLevel > 80) + syslog(LOG_DEBUG, "%s: sendenvelope, flags=0x%x", + e->e_id == NULL ? "[NOQUEUE]" : e->e_id, + e->e_flags); +#endif + + /* + ** If we have had global, fatal errors, don't bother sending + ** the message at all if we are in SMTP mode. Local errors + ** (e.g., a single address failing) will still cause the other + ** addresses to be sent. + */ + + if (bitset(EF_FATALERRS, e->e_flags) && + (OpMode == MD_SMTP || OpMode == MD_DAEMON)) + { + e->e_flags |= EF_CLRQUEUE; + return; + } + /* ** Run through the list and send everything. ** @@ -456,14 +561,15 @@ sendenvelope(e, mode) e->e_nsent = 0; e->e_flags |= EF_GLOBALERRS; + didany = FALSE; /* now run through the queue */ for (q = e->e_sendqueue; q != NULL; q = q->q_next) { -#ifdef XDEBUG +#if XDEBUG char wbuf[MAXNAME + 20]; - (void) sprintf(wbuf, "sendall(%s)", q->q_paddr); + (void) sprintf(wbuf, "sendall(%.*s)", MAXNAME, q->q_paddr); checkfd012(wbuf); #endif if (mode == SM_VERIFY) @@ -491,21 +597,23 @@ sendenvelope(e, mode) if (e->e_nsent >= CheckpointInterval) { - queueup(e, TRUE, FALSE); + queueup(e, FALSE); e->e_nsent = 0; } # endif /* QUEUE */ (void) deliver(e, q); + didany = TRUE; } } - Verbose = oldverbose; + if (didany) + { + e->e_dtime = curtime(); + e->e_ntries++; + } -#ifdef XDEBUG +#if XDEBUG checkfd012("end of sendenvelope"); #endif - - if (mode == SM_FORK) - finis(); } /* ** DOFORK -- do a fork, retrying a couple of times on failure. @@ -563,9 +671,10 @@ sendenvelope(e, mode) ** returns twice, once in parent and once in child. */ +int dofork() { - register int pid; + register int pid = -1; DOFORK(fork); return (pid); @@ -592,6 +701,7 @@ dofork() ** The standard input is passed off to someone. */ +int deliver(e, firstto) register ENVELOPE *e; ADDRESS *firstto; @@ -602,22 +712,24 @@ deliver(e, firstto) register char **mvp; register char *p; register MAILER *m; /* mailer for this recipient */ - ADDRESS *ctladdr; - register MCI *mci; + ADDRESS *volatile ctladdr; + register MCI *volatile mci; register ADDRESS *to = firstto; - bool clever = FALSE; /* running user smtp to this mailer */ - ADDRESS *tochain = NULL; /* chain of users in this mailer call */ + volatile bool clever = FALSE; /* running user smtp to this mailer */ + ADDRESS *volatile tochain = NULL; /* users chain in this mailer call */ int rcode; /* response code */ char *firstsig; /* signature of firstto */ - int pid; - char *curhost; + int pid = -1; + char *volatile curhost; + time_t xstart; int mpvect[2]; int rpvect[2]; char *pv[MAXPV+1]; char tobuf[TOBUFSIZE]; /* text line of to people */ - char buf[MAXNAME]; - char rpathbuf[MAXNAME]; /* translated return path */ + char buf[MAXNAME + 1]; + char rpathbuf[MAXNAME + 1]; /* translated return path */ extern int checkcompat(); + extern void markfailure __P((ENVELOPE *, ADDRESS *, MCI *, int)); errno = 0; if (bitset(QDONTSEND|QBADADDR|QQUEUEUP, to->q_flags)) @@ -636,7 +748,10 @@ deliver(e, firstto) host = to->q_host; CurEnv = e; /* just in case */ e->e_statmsg = NULL; +#ifdef SMTP SmtpError[0] = '\0'; +#endif + xstart = curtime(); if (tTd(10, 1)) printf("\n--deliver, id=%s, mailer=%s, host=`%s', first user=`%s'\n", @@ -645,33 +760,6 @@ deliver(e, firstto) printopenfds(FALSE); /* - ** If this mailer is expensive, and if we don't want to make - ** connections now, just mark these addresses and return. - ** This is useful if we want to batch connections to - ** reduce load. This will cause the messages to be - ** queued up, and a daemon will come along to send the - ** messages later. - ** This should be on a per-mailer basis. - */ - - if (NoConnect && bitnset(M_EXPENSIVE, m->m_flags) && !Verbose) - { - for (; to != NULL; to = to->q_next) - { - if (bitset(QDONTSEND|QBADADDR|QQUEUEUP, to->q_flags) || - to->q_mailer != m) - continue; - to->q_flags |= QQUEUEUP; - e->e_to = to->q_paddr; - message("queued"); - if (LogLevel > 8) - logdelivery(m, NULL, "queued", NULL, e); - } - e->e_to = NULL; - return (0); - } - - /* ** Do initial argv setup. ** Insert the mailer name. Notice that $x expansion is ** NOT done on the mailer name. Then, if the mailer has @@ -684,7 +772,11 @@ deliver(e, firstto) /* rewrite from address, using rewriting rules */ rcode = EX_OK; - (void) strcpy(rpathbuf, remotename(e->e_from.q_paddr, m, + if (bitnset(M_UDBENVELOPE, e->e_from.q_mailer->m_flags)) + p = e->e_sender; + else + p = e->e_from.q_paddr; + (void) strcpy(rpathbuf, remotename(p, m, RF_SENDERADDR|RF_CANONICAL, &rcode, e)); define('g', rpathbuf, e); /* translated return path */ @@ -726,7 +818,7 @@ deliver(e, firstto) break; /* this entry is safe -- go ahead and process it */ - expand(*mvp, buf, &buf[sizeof buf - 1], e); + expand(*mvp, buf, sizeof buf, e); *pvp++ = newstr(buf); if (pvp >= &pv[MAXPV - 3]) { @@ -788,11 +880,15 @@ deliver(e, firstto) } /* 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) + if (bitnset(M_RUNASRCPT, to->q_mailer->m_flags)) ctladdr = getctladdr(to); + if (tTd(10, 2)) + { + printf("ctladdr="); + printaddr(ctladdr, FALSE); + } + user = to->q_user; e->e_to = to->q_paddr; if (tTd(10, 5)) @@ -809,16 +905,20 @@ deliver(e, firstto) if (m->m_maxsize != 0 && e->e_msgsize > m->m_maxsize) { - NoReturn = TRUE; + e->e_flags |= EF_NO_BODY_RETN; + to->q_status = "5.2.3"; usrerr("552 Message is too large; %ld bytes max", m->m_maxsize); - giveresponse(EX_UNAVAILABLE, m, NULL, ctladdr, e); + giveresponse(EX_UNAVAILABLE, m, NULL, ctladdr, xstart, e); continue; } +#if NAMED_BIND + h_errno = 0; +#endif rcode = checkcompat(to, e); if (rcode != EX_OK) { - markfailure(e, to, rcode); - giveresponse(rcode, m, NULL, ctladdr, e); + markfailure(e, to, NULL, rcode); + giveresponse(rcode, m, NULL, ctladdr, xstart, e); continue; } @@ -860,12 +960,25 @@ deliver(e, firstto) ** with the others, so we fudge on the To person. */ - if (m == FileMailer) + if (strcmp(m->m_mailer, "[FILE]") == 0) { - rcode = mailfile(user, ctladdr, e); - giveresponse(rcode, m, NULL, ctladdr, e); + rcode = mailfile(user, ctladdr, SFF_CREAT, e); + giveresponse(rcode, m, NULL, ctladdr, xstart, e); + e->e_nsent++; if (rcode == EX_OK) + { to->q_flags |= QSENT; + if (bitnset(M_LOCALMAILER, m->m_flags) && + (e->e_receiptto != NULL || + bitset(QPINGONSUCCESS, to->q_flags))) + { + to->q_flags |= QDELIVERED; + to->q_status = "2.1.5"; + fprintf(e->e_xfp, "%s... Successfully delivered\n", + to->q_paddr); + } + } + to->q_statdate = curtime(); continue; } @@ -893,7 +1006,7 @@ deliver(e, firstto) if (!clever) { - expand(*mvp, buf, &buf[sizeof buf - 1], e); + expand(*mvp, buf, sizeof buf, e); *pvp++ = newstr(buf); if (pvp >= &pv[MAXPV - 2]) { @@ -919,7 +1032,7 @@ deliver(e, firstto) while (!clever && *++mvp != NULL) { - expand(*mvp, buf, &buf[sizeof buf - 1], e); + expand(*mvp, buf, sizeof buf, e); *pvp++ = newstr(buf); if (pvp >= &pv[MAXPV]) syserr("554 deliver: pv overflow after $u for %s", pv[0]); @@ -935,7 +1048,7 @@ deliver(e, firstto) */ /*XXX this seems a bit wierd */ - if (ctladdr == NULL && m != ProgMailer && + if (ctladdr == NULL && m != ProgMailer && m != FileMailer && bitset(QGOODUID, e->e_from.q_flags)) ctladdr = &e->e_from; @@ -950,6 +1063,9 @@ deliver(e, firstto) printav(pv); } errno = 0; +#if NAMED_BIND + h_errno = 0; +#endif CurHostName = NULL; @@ -966,16 +1082,31 @@ deliver(e, firstto) SmtpPhase = NULL; mci = NULL; -#ifdef XDEBUG +#if XDEBUG { char wbuf[MAXLINE]; /* make absolutely certain 0, 1, and 2 are in use */ - sprintf(wbuf, "%s... openmailer(%s)", e->e_to, m->m_name); + sprintf(wbuf, "%s... openmailer(%s)", + shortenstring(e->e_to, 203), m->m_name); checkfd012(wbuf); } #endif + /* check for 8-bit available */ + if (bitset(EF_HAS8BIT, e->e_flags) && + bitnset(M_7BITS, m->m_flags) && + (bitset(EF_DONT_MIME, e->e_flags) || + !(bitset(MM_MIME8BIT, MimeMode) || + (bitset(EF_IS_MIME, e->e_flags) && + bitset(MM_CVTMIME, MimeMode))))) + { + usrerr("554 Cannot send 8-bit data to 7-bit destination"); + rcode = EX_DATAERR; + e->e_status = "5.6.3"; + goto give_up; + } + /* check for Local Person Communication -- not for mortals!!! */ if (strcmp(m->m_mailer, "[LPC]") == 0) { @@ -991,7 +1122,7 @@ deliver(e, firstto) { #ifdef DAEMON register int i; - register u_short port; + register volatile u_short port = 0; if (pv[0] == NULL || pv[1] == NULL || pv[1][0] == '\0') { @@ -1017,14 +1148,23 @@ deliver(e, firstto) goto give_up; } if (pv[2] != NULL) - port = atoi(pv[2]); - else - port = 0; + { + port = htons(atoi(pv[2])); + if (port == 0) + { + struct servent *sp = getservbyname(pv[2], "tcp"); + + if (sp == NULL) + syserr("Service %s unknown", pv[2]); + else + port = sp->s_port; + } + } tryhost: while (*curhost != '\0') { register char *p; - static char hostbuf[MAXNAME]; + static char hostbuf[MAXNAME + 1]; /* pull the next host from the signature */ p = strchr(curhost, ':'); @@ -1053,6 +1193,9 @@ tryhost: mci_dump(mci, FALSE); } CurHostName = mci->mci_host; + message("Using cached %sSMTP connection to %s via %s...", + bitset(MCIF_ESMTP, mci->mci_flags) ? "E" : "", + hostbuf, m->m_name); break; } mci->mci_mailer = m; @@ -1061,10 +1204,11 @@ tryhost: /* try the connection */ setproctitle("%s %s: %s", e->e_id, hostbuf, "user open"); - message("Connecting to %s (%s)...", + message("Connecting to %s via %s...", hostbuf, m->m_name); i = makeconnection(hostbuf, port, mci, bitnset(M_SECURE_PORT, m->m_flags)); + mci->mci_lastuse = curtime(); mci->mci_exitstat = i; mci->mci_errno = errno; #if NAMED_BIND @@ -1105,6 +1249,14 @@ tryhost: } else { + /* flush any expired connections */ + (void) mci_scan(NULL); + + /* announce the connection to verbose listeners */ + if (host == NULL || host[0] == '\0') + message("Connecting to %s...", m->m_name); + else + message("Connecting to %s via %s...", host, m->m_name); if (TrafficLogFile != NULL) { char **av; @@ -1119,7 +1271,7 @@ tryhost: if (pipe(mpvect) < 0) { syserr("%s... openmailer(%s): pipe (to mailer)", - e->e_to, m->m_name); + shortenstring(e->e_to, 203), m->m_name); if (tTd(11, 1)) printf("openmailer: NULL\n"); rcode = EX_OSERR; @@ -1127,10 +1279,11 @@ tryhost: } /* if this mailer speaks smtp, create a return pipe */ +#ifdef SMTP if (clever && pipe(rpvect) < 0) { syserr("%s... openmailer(%s): pipe (from mailer)", - e->e_to, m->m_name); + shortenstring(e->e_to, 203), m->m_name); (void) close(mpvect[0]); (void) close(mpvect[1]); if (tTd(11, 1)) @@ -1138,6 +1291,7 @@ tryhost: rcode = EX_OSERR; goto give_up; } +#endif /* ** Actually fork the mailer process. @@ -1159,14 +1313,16 @@ tryhost: { /* failure */ syserr("%s... openmailer(%s): cannot fork", - e->e_to, m->m_name); + shortenstring(e->e_to, 203), m->m_name); (void) close(mpvect[0]); (void) close(mpvect[1]); +#ifdef SMTP if (clever) { (void) close(rpvect[0]); (void) close(rpvect[1]); } +#endif if (tTd(11, 1)) printf("openmailer: NULL\n"); rcode = EX_OSERR; @@ -1176,9 +1332,7 @@ tryhost: { int i; int saveerrno; - char **ep; - char *env[MAXUSERENVIRON]; - extern char **environ; + struct stat stb; extern int DtableSize; if (e->e_lockfp != NULL) @@ -1189,23 +1343,61 @@ tryhost: (void) setsignal(SIGHUP, SIG_IGN); (void) setsignal(SIGTERM, SIG_DFL); - /* reset user and group */ - if (!bitnset(M_RESTR, m->m_flags)) + if (m != FileMailer || stat(tochain->q_user, &stb) < 0) + stb.st_mode = 0; + + /* tweak niceness */ + if (m->m_nice != 0) + nice(m->m_nice); + + /* reset group id */ + if (bitnset(M_SPECIFIC_UID, m->m_flags)) + (void) setgid(m->m_gid); + else if (bitset(S_ISGID, stb.st_mode)) + (void) setgid(stb.st_gid); + else if (ctladdr != NULL && ctladdr->q_gid != 0) { - if (ctladdr == NULL || ctladdr->q_uid == 0) - { + if (!DontInitGroups) + (void) initgroups(ctladdr->q_ruser != NULL ? + ctladdr->q_ruser : ctladdr->q_user, + ctladdr->q_gid); + (void) setgid(ctladdr->q_gid); + } + else + { + if (!DontInitGroups) (void) initgroups(DefUser, DefGid); + if (m->m_gid == 0) (void) setgid(DefGid); + else + (void) setgid(m->m_gid); + } + + /* reset user id */ + endpwent(); + if (bitnset(M_SPECIFIC_UID, m->m_flags)) + { +#if USESETEUID + (void) seteuid(m->m_uid); +#else +# if HASSETREUID + (void) setreuid(-1, m->m_uid); +# else + if (m->m_uid != geteuid()) + (void) setuid(m->m_uid); +# endif +#endif + } + else if (bitset(S_ISUID, stb.st_mode)) + (void) setuid(stb.st_uid); + else if (ctladdr != NULL && ctladdr->q_uid != 0) + (void) setuid(ctladdr->q_uid); + else + { + if (m->m_uid == 0) (void) setuid(DefUid); - } else - { - (void) initgroups(ctladdr->q_ruser? - ctladdr->q_ruser: ctladdr->q_user, - ctladdr->q_gid); - (void) setgid(ctladdr->q_gid); - (void) setuid(ctladdr->q_uid); - } + (void) setuid(m->m_uid); } if (tTd(11, 2)) @@ -1216,14 +1408,14 @@ tryhost: if (m->m_execdir != NULL) { char *p, *q; - char buf[MAXLINE]; + char buf[MAXLINE + 1]; for (p = m->m_execdir; p != NULL; p = q) { q = strchr(p, ':'); if (q != NULL) *q = '\0'; - expand(p, buf, &buf[sizeof buf] - 1, e); + expand(p, buf, sizeof buf, e); if (q != NULL) *q++ = ':'; if (tTd(11, 20)) @@ -1235,13 +1427,15 @@ tryhost: } /* arrange to filter std & diag output of command */ +#ifdef SMTP if (clever) { (void) close(rpvect[0]); if (dup2(rpvect[1], STDOUT_FILENO) < 0) { syserr("%s... openmailer(%s): cannot dup pipe %d for stdout", - e->e_to, m->m_name, rpvect[1]); + shortenstring(e->e_to, 203), + m->m_name, rpvect[1]); _exit(EX_OSERR); } (void) close(rpvect[1]); @@ -1253,15 +1447,16 @@ tryhost: if (dup2(fileno(e->e_xfp), STDOUT_FILENO) < 0) { syserr("%s... openmailer(%s): cannot dup xscript %d for stdout", - e->e_to, m->m_name, - fileno(e->e_xfp)); + shortenstring(e->e_to, 203), + m->m_name, fileno(e->e_xfp)); _exit(EX_OSERR); } } +#endif if (dup2(STDOUT_FILENO, STDERR_FILENO) < 0) { syserr("%s... openmailer(%s): cannot dup stdout for stderr", - e->e_to, m->m_name); + shortenstring(e->e_to, 203), m->m_name); _exit(EX_OSERR); } @@ -1270,7 +1465,8 @@ tryhost: if (dup2(mpvect[0], STDIN_FILENO) < 0) { syserr("%s... openmailer(%s): cannot dup pipe %d for stdin", - e->e_to, m->m_name, mpvect[0]); + shortenstring(e->e_to, 203), + m->m_name, mpvect[0]); _exit(EX_OSERR); } (void) close(mpvect[0]); @@ -1284,32 +1480,15 @@ tryhost: (void) fcntl(i, F_SETFD, j | 1); } - /* - ** Set up the mailer environment - ** TZ is timezone information. - ** SYSTYPE is Apollo software sys type (required). - ** ISP is Apollo hardware system type (required). - */ - - i = 0; - env[i++] = "AGENT=sendmail"; - for (ep = environ; *ep != NULL; ep++) - { - if (strncmp(*ep, "TZ=", 3) == 0 || - strncmp(*ep, "ISP=", 4) == 0 || - strncmp(*ep, "SYSTYPE=", 8) == 0) - env[i++] = *ep; - } - env[i++] = NULL; - /* run disconnected from terminal */ (void) setsid(); /* try to execute the mailer */ - execve(m->m_mailer, pv, env); + execve(m->m_mailer, (ARGV_T) pv, (ARGV_T) UserEnviron); saveerrno = errno; syserr("Cannot exec %s", m->m_mailer); - if (m == LocalMailer || transienterror(saveerrno)) + if (bitnset(M_LOCALMAILER, m->m_flags) || + transienterror(saveerrno)) _exit(EX_OSERR); _exit(EX_UNAVAILABLE); } @@ -1330,14 +1509,17 @@ tryhost: syserr("deliver: cannot create mailer output channel, fd=%d", mpvect[1]); (void) close(mpvect[1]); +#ifdef SMTP if (clever) { (void) close(rpvect[0]); (void) close(rpvect[1]); } +#endif rcode = EX_OSERR; goto give_up; } +#ifdef SMTP if (clever) { (void) close(rpvect[1]); @@ -1354,6 +1536,7 @@ tryhost: } } else +#endif { mci->mci_flags |= MCIF_TEMP; mci->mci_in = NULL; @@ -1364,10 +1547,21 @@ tryhost: ** If we are in SMTP opening state, send initial protocol. */ + if (bitnset(M_7BITS, m->m_flags) && + (!clever || mci->mci_state == MCIS_CLOSED)) + mci->mci_flags |= MCIF_7BIT; +#ifdef SMTP if (clever && mci->mci_state != MCIS_CLOSED) - { smtpinit(m, mci, e); - } +#endif + + if (bitset(EF_HAS8BIT, e->e_flags) && + !bitset(EF_DONT_MIME, e->e_flags) && + bitnset(M_7BITS, m->m_flags)) + mci->mci_flags |= MCIF_CVT8TO7; + else + mci->mci_flags &= ~MCIF_CVT8TO7; + if (tTd(11, 1)) { printf("openmailer: "); @@ -1389,11 +1583,13 @@ tryhost: rcode, mci->mci_state, firstsig); rcode = EX_SOFTWARE; } - else if (rcode == EX_TEMPFAIL && curhost != NULL && *curhost != '\0') +#ifdef DAEMON + else if (curhost != NULL && *curhost != '\0') { /* try next MX site */ goto tryhost; } +#endif } else if (!clever) { @@ -1402,8 +1598,7 @@ tryhost: */ putfromline(mci, e); - (*e->e_puthdr)(mci, e); - putline("\n", mci); + (*e->e_puthdr)(mci, e->e_header, e); (*e->e_putbody)(mci, e, NULL); /* get the exit status */ @@ -1429,8 +1624,8 @@ tryhost: e->e_to = to->q_paddr; if ((i = smtprcpt(to, m, mci, e)) != EX_OK) { - markfailure(e, to, i); - giveresponse(i, m, mci, ctladdr, e); + markfailure(e, to, mci, i); + giveresponse(i, m, mci, ctladdr, xstart, e); } else { @@ -1494,21 +1689,40 @@ tryhost: give_up: if (tobuf[0] != '\0') - giveresponse(rcode, m, mci, ctladdr, e); + giveresponse(rcode, m, mci, ctladdr, xstart, e); for (to = tochain; to != NULL; to = to->q_tchain) { + /* see if address already marked */ + if (bitset(QBADADDR|QQUEUEUP, to->q_flags)) + continue; + + /* mark bad addresses */ if (rcode != EX_OK) - markfailure(e, to, rcode); - else { - to->q_flags |= QSENT; - e->e_nsent++; - if (e->e_receiptto != NULL && - bitnset(M_LOCALMAILER, m->m_flags)) - { - fprintf(e->e_xfp, "%s... Successfully delivered\n", - to->q_paddr); - } + markfailure(e, to, mci, rcode); + continue; + } + + /* successful delivery */ + to->q_flags |= QSENT; + to->q_statdate = curtime(); + e->e_nsent++; + if (bitnset(M_LOCALMAILER, m->m_flags) && + (e->e_receiptto != NULL || + bitset(QPINGONSUCCESS, to->q_flags))) + { + to->q_flags |= QDELIVERED; + to->q_status = "2.1.5"; + fprintf(e->e_xfp, "%s... Successfully delivered\n", + to->q_paddr); + } + else if (bitset(QPINGONSUCCESS, to->q_flags) && + bitset(QPRIMARY, to->q_flags) && + !bitset(MCIF_DSN, mci->mci_flags)) + { + to->q_flags |= QRELAYED; + fprintf(e->e_xfp, "%s... relayed; expect no further notifications\n", + to->q_paddr); } } @@ -1516,13 +1730,14 @@ tryhost: ** Restore state and return. */ -#ifdef XDEBUG +#if XDEBUG { char wbuf[MAXLINE]; /* make absolutely certain 0, 1, and 2 are in use */ sprintf(wbuf, "%s... end of deliver(%s)", - e->e_to == NULL ? "NO-TO-LIST" : e->e_to, + e->e_to == NULL ? "NO-TO-LIST" + : shortenstring(e->e_to, 203), m->m_name); checkfd012(wbuf); } @@ -1538,6 +1753,7 @@ tryhost: ** Parameters: ** e -- the envelope we are sending. ** q -- the address to mark. +** mci -- mailer connection information. ** rcode -- the code signifying the particular failure. ** ** Returns: @@ -1549,12 +1765,14 @@ tryhost: ** the message will be queued, as appropriate. */ -markfailure(e, q, rcode) +void +markfailure(e, q, mci, rcode) register ENVELOPE *e; register ADDRESS *q; + register MCI *mci; int rcode; { - char buf[MAXLINE]; + char *stat = NULL; switch (rcode) { @@ -1571,6 +1789,71 @@ markfailure(e, q, rcode) q->q_flags |= QBADADDR; break; } + + /* find most specific error code possible */ + if (q->q_status == NULL && mci != NULL) + q->q_status = mci->mci_status; + if (q->q_status == NULL) + q->q_status = e->e_status; + if (q->q_status == NULL) + { + switch (rcode) + { + case EX_USAGE: + stat = "5.5.4"; + break; + + case EX_DATAERR: + stat = "5.5.2"; + break; + + case EX_NOUSER: + stat = "5.1.1"; + break; + + case EX_NOHOST: + stat = "5.1.2"; + break; + + case EX_NOINPUT: + case EX_CANTCREAT: + case EX_NOPERM: + stat = "5.3.0"; + break; + + case EX_UNAVAILABLE: + case EX_SOFTWARE: + case EX_OSFILE: + case EX_PROTOCOL: + case EX_CONFIG: + stat = "5.5.0"; + break; + + case EX_OSERR: + case EX_IOERR: + stat = "4.5.0"; + break; + + case EX_TEMPFAIL: + stat = "4.2.0"; + break; + } + if (stat != NULL) + q->q_status = stat; + } + + q->q_statdate = curtime(); + if (CurHostName != NULL && CurHostName[0] != '\0') + q->q_statmta = newstr(CurHostName); + if (rcode != EX_OK && q->q_rstatus == NULL && + q->q_mailer != NULL && q->q_mailer->m_diagtype != NULL && + strcasecmp(q->q_mailer->m_diagtype, "UNIX") == 0) + { + char buf[30]; + + (void) sprintf(buf, "%d", rcode); + q->q_rstatus = newstr(buf); + } } /* ** ENDMAILER -- Wait for mailer to terminate. @@ -1593,6 +1876,7 @@ markfailure(e, q, rcode) ** none. */ +int endmailer(mci, e, pv) register MCI *mci; register ENVELOPE *e; @@ -1656,6 +1940,8 @@ endmailer(mci, e, pv) ** response is given before the connection is made. ** ctladdr -- the controlling address for the recipient ** address(es). +** xstart -- the transaction start time, for computing +** transaction delays. ** e -- the current envelope. ** ** Returns: @@ -1666,11 +1952,13 @@ endmailer(mci, e, pv) ** ExitStat may be set. */ -giveresponse(stat, m, mci, ctladdr, e) +void +giveresponse(stat, m, mci, ctladdr, xstart, e) int stat; register MAILER *m; register MCI *mci; ADDRESS *ctladdr; + time_t xstart; ENVELOPE *e; { register const char *statmsg; @@ -1689,7 +1977,8 @@ giveresponse(stat, m, mci, ctladdr, e) statmsg = "250 Sent"; if (e->e_statmsg != NULL) { - (void) sprintf(buf, "%s (%s)", statmsg, e->e_statmsg); + (void) sprintf(buf, "%s (%s)", + statmsg, shortenstring(e->e_statmsg, 403)); statmsg = buf; } } @@ -1773,7 +2062,7 @@ giveresponse(stat, m, mci, ctladdr, e) */ if (LogLevel > ((stat == EX_TEMPFAIL) ? 8 : (stat == EX_OK) ? 7 : 6)) - logdelivery(m, mci, &statmsg[4], ctladdr, e); + logdelivery(m, mci, &statmsg[4], ctladdr, xstart, e); if (tTd(11, 2)) printf("giveresponse: stat=%d, e->e_message=%s\n", @@ -1805,6 +2094,8 @@ giveresponse(stat, m, mci, ctladdr, e) ** log is occuring when no connection is active. ** stat -- the message to print for the status. ** ctladdr -- the controlling address for the to list. +** xstart -- the transaction start time, used for +** computing transaction delay. ** e -- the current envelope. ** ** Returns: @@ -1814,20 +2105,25 @@ giveresponse(stat, m, mci, ctladdr, e) ** none */ -logdelivery(m, mci, stat, ctladdr, e) +#define SPACELEFT(bp) (sizeof buf - ((bp) - buf)) + +void +logdelivery(m, mci, stat, ctladdr, xstart, e) MAILER *m; register MCI *mci; - char *stat; + const char *stat; ADDRESS *ctladdr; + time_t xstart; register ENVELOPE *e; { # ifdef LOG register char *bp; register char *p; int l; - char buf[512]; + char buf[1024]; # if (SYSLOG_BUFSIZE) >= 256 + /* ctladdr: max 106 bytes */ bp = buf; if (ctladdr != NULL) { @@ -1836,35 +2132,48 @@ logdelivery(m, mci, stat, ctladdr, e) bp += strlen(bp); if (bitset(QGOODUID, ctladdr->q_flags)) { - (void) sprintf(bp, " (%d/%d)", + (void) snprintf(bp, SPACELEFT(bp), " (%d/%d)", ctladdr->q_uid, ctladdr->q_gid); bp += strlen(bp); } } - (void) sprintf(bp, ", delay=%s", pintvl(curtime() - e->e_ctime, TRUE)); + /* delay & xdelay: max 41 bytes */ + snprintf(bp, SPACELEFT(bp), ", delay=%s", + pintvl(curtime() - e->e_ctime, TRUE)); bp += strlen(bp); + if (xstart != (time_t) 0) + { + snprintf(bp, SPACELEFT(bp), ", xdelay=%s", + pintvl(curtime() - xstart, TRUE)); + bp += strlen(bp); + } + + /* mailer: assume about 19 bytes (max 10 byte mailer name) */ if (m != NULL) { - (void) strcpy(bp, ", mailer="); - (void) strcat(bp, m->m_name); + snprintf(bp, SPACELEFT(bp), ", mailer=%s", m->m_name); bp += strlen(bp); } + /* relay: max 66 bytes for IPv4 addresses */ if (mci != NULL && mci->mci_host != NULL) { # ifdef DAEMON extern SOCKADDR CurHostAddr; # endif - (void) strcpy(bp, ", relay="); - (void) strcat(bp, mci->mci_host); + snprintf(bp, SPACELEFT(bp), ", relay=%s", + shortenstring(mci->mci_host, 40)); + bp += strlen(bp); # ifdef DAEMON - (void) strcat(bp, " ["); - (void) strcat(bp, anynet_ntoa(&CurHostAddr)); - (void) strcat(bp, "]"); + if (CurHostAddr.sa.sa_family != 0) + { + snprintf(bp, SPACELEFT(bp), " [%s]", + anynet_ntoa(&CurHostAddr)); + } # endif } else if (strcmp(stat, "queued") != 0) @@ -1873,8 +2182,8 @@ logdelivery(m, mci, stat, ctladdr, e) if (p != NULL && p[0] != '\0') { - (void) strcpy(bp, ", relay="); - (void) strcat(bp, p); + snprintf(bp, SPACELEFT(bp), ", relay=%s", + shortenstring(p, 40)); } } bp += strlen(bp); @@ -1889,6 +2198,7 @@ logdelivery(m, mci, stat, ctladdr, e) # define STATLEN 203 #endif + /* stat: max 210 bytes */ if ((bp - buf) > (sizeof buf - ((STATLEN) + 20))) { /* desperation move -- truncate data */ @@ -1901,10 +2211,11 @@ logdelivery(m, mci, stat, ctladdr, e) bp += strlen(bp); (void) strcpy(bp, shortenstring(stat, (STATLEN))); - + + /* id, to: max 13 + TOBUFSIZE bytes */ l = SYSLOG_BUFSIZE - 100 - strlen(buf); p = e->e_to; - while (strlen(p) >= l) + while (strlen(p) >= (SIZE_T) l) { register char *q = strchr(p + l, ','); @@ -1950,13 +2261,18 @@ logdelivery(m, mci, stat, ctladdr, e) bp = buf; sprintf(bp, "delay=%s", pintvl(curtime() - e->e_ctime, TRUE)); bp += strlen(bp); + if (xstart != (time_t) 0) + { + sprintf(bp, ", xdelay=%s", pintvl(curtime() - xstart, TRUE)); + bp += strlen(bp); + } if (m != NULL) { sprintf(bp, ", mailer=%s", m->m_name); bp += strlen(bp); } - syslog(LOG_INFO, "%s: %s", e->e_id, buf); + syslog(LOG_INFO, "%s: %.1000s", e->e_id, buf); buf[0] = '\0'; if (mci != NULL && mci->mci_host != NULL) @@ -1965,12 +2281,11 @@ logdelivery(m, mci, stat, ctladdr, e) extern SOCKADDR CurHostAddr; # endif - sprintf(buf, "relay=%s", mci->mci_host); + sprintf(buf, "relay=%.100s", mci->mci_host); # ifdef DAEMON - (void) strcat(buf, " ["); - (void) strcat(buf, anynet_ntoa(&CurHostAddr)); - (void) strcat(buf, "]"); + if (CurHostAddr.sa.sa_family != 0) + sprintf(bp, " [%.100s]", anynet_ntoa(&CurHostAddr)); # endif } else if (strcmp(stat, "queued") != 0) @@ -1978,15 +2293,17 @@ logdelivery(m, mci, stat, ctladdr, e) char *p = macvalue('h', e); if (p != NULL && p[0] != '\0') - sprintf(buf, "relay=%s", p); + sprintf(buf, "relay=%.100s", p); } if (buf[0] != '\0') - syslog(LOG_INFO, "%s: %s", e->e_id, buf); + syslog(LOG_INFO, "%s: %.1000s", e->e_id, buf); syslog(LOG_INFO, "%s: stat=%s", e->e_id, shortenstring(stat, 63)); # endif /* short log buffer */ # endif /* LOG */ } + +#undef SPACELEFT /* ** PUTFROMLINE -- output a UNIX-style from line (or whatever) ** @@ -2008,23 +2325,23 @@ logdelivery(m, mci, stat, ctladdr, e) ** outputs some text to fp. */ +void putfromline(mci, e) register MCI *mci; ENVELOPE *e; { - char *template = "\201l\n"; + char *template = UnixFromLine; char buf[MAXLINE]; if (bitnset(M_NHDR, mci->mci_mailer->m_flags)) return; -# ifdef UGLYUUCP if (bitnset(M_UGLYUUCP, mci->mci_mailer->m_flags)) { char *bang; char xbuf[MAXLINE]; - expand("\201g", buf, &buf[sizeof buf - 1], e); + expand("\201g", buf, sizeof buf, e); bang = strchr(buf, '!'); if (bang == NULL) { @@ -2034,13 +2351,13 @@ putfromline(mci, e) else { *bang++ = '\0'; - (void) sprintf(xbuf, "From %s \201d remote from %s\n", bang, buf); + (void) sprintf(xbuf, "From %.800s \201d remote from %.100s\n", + bang, buf); template = xbuf; } } -# endif /* UGLYUUCP */ - expand(template, buf, &buf[sizeof buf - 1], e); - putline(buf, mci); + expand(template, buf, sizeof buf, e); + putxline(buf, mci, PXLF_NOTHINGSPECIAL); } /* ** PUTBODY -- put the body of a message. @@ -2058,6 +2375,12 @@ putfromline(mci, e) ** The message is written onto fp. */ +/* values for output state variable */ +#define OS_HEAD 0 /* at beginning of line */ +#define OS_CR 1 /* read a carriage return */ +#define OS_INLINE 2 /* putting rest of line */ + +void putbody(mci, e, separator) register MCI *mci; register ENVELOPE *e; @@ -2069,45 +2392,244 @@ putbody(mci, e, separator) ** Output the body of the message */ + if (e->e_dfp == NULL && bitset(EF_HAS_DF, e->e_flags)) + { + char *df = queuename(e, 'd'); + + e->e_dfp = fopen(df, "r"); + if (e->e_dfp == NULL) + syserr("putbody: Cannot open %s for %s from %s", + df, e->e_to, e->e_from.q_paddr); + } if (e->e_dfp == NULL) { - if (e->e_df != NULL) + if (bitset(MCIF_INHEADER, mci->mci_flags)) { - e->e_dfp = fopen(e->e_df, "r"); - if (e->e_dfp == NULL) - syserr("putbody: Cannot open %s for %s from %s", - e->e_df, e->e_to, e->e_from.q_paddr); + putline("", mci); + mci->mci_flags &= ~MCIF_INHEADER; } + putline("<<< No Message Collected >>>", mci); + goto endofmessage; + } + if (e->e_dfino == (ino_t) 0) + { + struct stat stbuf; + + if (fstat(fileno(e->e_dfp), &stbuf) < 0) + e->e_dfino = -1; else - putline("<<< No Message Collected >>>", mci); + { + e->e_dfdev = stbuf.st_dev; + e->e_dfino = stbuf.st_ino; + } } - if (e->e_dfp != NULL) + rewind(e->e_dfp); + +#if MIME8TO7 + if (bitset(MCIF_CVT8TO7, mci->mci_flags)) { - rewind(e->e_dfp); - while (!ferror(mci->mci_out) && fgets(buf, sizeof buf, e->e_dfp) != NULL) + char *boundaries[MAXMIMENESTING + 1]; + + /* + ** Do 8 to 7 bit MIME conversion. + */ + + /* make sure it looks like a MIME message */ + if (hvalue("MIME-Version", e->e_header) == NULL) + putline("MIME-Version: 1.0", mci); + + if (hvalue("Content-Type", e->e_header) == NULL) { - if (buf[0] == 'F' && - bitnset(M_ESCFROM, mci->mci_mailer->m_flags) && - strncmp(buf, "From ", 5) == 0) - (void) putc('>', mci->mci_out); - if (buf[0] == '-' && buf[1] == '-' && separator != NULL) + sprintf(buf, "Content-Type: text/plain; charset=%s", + defcharset(e)); + putline(buf, mci); + } + + /* now do the hard work */ + boundaries[0] = NULL; + mime8to7(mci, e->e_header, e, boundaries, M87F_OUTER); + } + else +#endif + { + int ostate; + register char *bp; + register char *pbp; + register int c; + int padc; + char *buflim; + int pos = 0; + char peekbuf[10]; + + /* we can pass it through unmodified */ + if (bitset(MCIF_INHEADER, mci->mci_flags)) + { + putline("", mci); + mci->mci_flags &= ~MCIF_INHEADER; + } + + /* determine end of buffer; allow for short mailer lines */ + buflim = &buf[sizeof buf - 1]; + if (mci->mci_mailer->m_linelimit > 0 && + mci->mci_mailer->m_linelimit < sizeof buf - 1) + buflim = &buf[mci->mci_mailer->m_linelimit - 1]; + + /* copy temp file to output with mapping */ + ostate = OS_HEAD; + bp = buf; + pbp = peekbuf; + while (!ferror(mci->mci_out)) + { + register char *xp; + + if (pbp > peekbuf) + c = *--pbp; + else if ((c = getc(e->e_dfp)) == EOF) + break; + if (bitset(MCIF_7BIT, mci->mci_flags)) + c &= 0x7f; + switch (ostate) { - /* possible separator */ - int sl = strlen(separator); + case OS_HEAD: + if (c != '\r' && c != '\n' && bp < buflim) + { + *bp++ = c; + break; + } + + /* check beginning of line for special cases */ + *bp = '\0'; + pos = 0; + padc = EOF; + if (buf[0] == 'F' && + bitnset(M_ESCFROM, mci->mci_mailer->m_flags) && + strncmp(buf, "From ", 5) == 0) + { + padc = '>'; + } + if (buf[0] == '-' && buf[1] == '-' && + separator != NULL) + { + /* possible separator */ + int sl = strlen(separator); + + if (strncmp(&buf[2], separator, sl) == 0) + padc = ' '; + } + if (buf[0] == '.' && + bitnset(M_XDOT, mci->mci_mailer->m_flags)) + { + padc = '.'; + } + + /* now copy out saved line */ + if (TrafficLogFile != NULL) + { + fprintf(TrafficLogFile, "%05d >>> ", getpid()); + if (padc != EOF) + putc(padc, TrafficLogFile); + for (xp = buf; xp < bp; xp++) + putc(*xp, TrafficLogFile); + if (c == '\n') + fputs(mci->mci_mailer->m_eol, + TrafficLogFile); + } + if (padc != EOF) + { + putc(padc, mci->mci_out); + pos++; + } + for (xp = buf; xp < bp; xp++) + putc(*xp, mci->mci_out); + if (c == '\n') + { + fputs(mci->mci_mailer->m_eol, + mci->mci_out); + pos = 0; + } + else + { + pos += bp - buf; + if (c != '\r') + *pbp++ = c; + } + bp = buf; - if (strncmp(&buf[2], separator, sl) == 0) - (void) putc(' ', mci->mci_out); + /* determine next state */ + if (c == '\n') + ostate = OS_HEAD; + else if (c == '\r') + ostate = OS_CR; + else + ostate = OS_INLINE; + continue; + + case OS_CR: + if (c == '\n') + { + /* got CRLF */ + fputs(mci->mci_mailer->m_eol, mci->mci_out); + if (TrafficLogFile != NULL) + { + fputs(mci->mci_mailer->m_eol, + TrafficLogFile); + } + ostate = OS_HEAD; + continue; + } + + /* had a naked carriage return */ + *pbp++ = c; + c = '\r'; + goto putch; + + case OS_INLINE: + if (c == '\r') + { + ostate = OS_CR; + continue; + } +putch: + if (mci->mci_mailer->m_linelimit > 0 && + pos > mci->mci_mailer->m_linelimit && + c != '\n') + { + putc('!', mci->mci_out); + fputs(mci->mci_mailer->m_eol, mci->mci_out); + if (TrafficLogFile != NULL) + { + fprintf(TrafficLogFile, "!%s", + mci->mci_mailer->m_eol); + } + ostate = OS_HEAD; + *pbp++ = c; + continue; + } + if (TrafficLogFile != NULL) + putc(c, TrafficLogFile); + putc(c, mci->mci_out); + pos++; + ostate = c == '\n' ? OS_HEAD : OS_INLINE; + break; } - putline(buf, mci); } - if (ferror(e->e_dfp)) + /* make sure we are at the beginning of a line */ + if (bp > buf) { - syserr("putbody: %s: read error", e->e_df); - ExitStat = EX_IOERR; + *bp = '\0'; + fputs(buf, mci->mci_out); + fputs(mci->mci_mailer->m_eol, mci->mci_out); } } + if (ferror(e->e_dfp)) + { + syserr("putbody: df%s: read error", e->e_id); + ExitStat = EX_IOERR; + } + +endofmessage: /* some mailers want extra blank line at end of message */ if (bitnset(M_BLANKEND, mci->mci_mailer->m_flags) && buf[0] != '\0' && buf[0] != '\n') @@ -2139,6 +2661,8 @@ putbody(mci, e, separator) ** filename -- the name of the file to send to. ** ctladdr -- the controlling address header -- includes ** the userid/groupid to be when sending. +** sfflags -- flags for opening. +** e -- the current envelope. ** ** Returns: ** The exit code associated with the operation. @@ -2147,13 +2671,15 @@ putbody(mci, e, separator) ** none. */ -mailfile(filename, ctladdr, e) +int +mailfile(filename, ctladdr, sfflags, e) char *filename; ADDRESS *ctladdr; + int sfflags; register ENVELOPE *e; { register FILE *f; - register int pid; + register int pid = -1; int mode; if (tTd(11, 1)) @@ -2184,22 +2710,27 @@ mailfile(filename, ctladdr, e) int oflags = O_WRONLY|O_APPEND; if (e->e_lockfp != NULL) - { - fclose(e->e_lockfp); - e->e_lockfp = NULL; - } + (void) close(fileno(e->e_lockfp)); (void) setsignal(SIGINT, SIG_DFL); (void) setsignal(SIGHUP, SIG_DFL); (void) setsignal(SIGTERM, SIG_DFL); (void) umask(OldUmask); + e->e_to = filename; + ExitStat = EX_OK; +#ifdef HASLSTAT + if ((SafeFileEnv != NULL ? lstat(filename, &stb) + : stat(filename, &stb)) < 0) +#else if (stat(filename, &stb) < 0) +#endif { stb.st_mode = FileMode; oflags |= O_CREAT|O_EXCL; } - else if (bitset(0111, stb.st_mode)) + else if (bitset(0111, stb.st_mode) || stb.st_nlink != 1 || + (SafeFileEnv != NULL && !S_ISREG(stb.st_mode))) exit(EX_CANTCREAT); mode = stb.st_mode; @@ -2207,59 +2738,108 @@ mailfile(filename, ctladdr, e) errno = 0; ExitStat = EX_OK; - if (ctladdr != NULL) + if (ctladdr != NULL || bitset(SFF_RUNASREALUID, sfflags)) { /* ignore setuid and setgid bits */ mode &= ~(S_ISGID|S_ISUID); } /* we have to open the dfile BEFORE setuid */ - if (e->e_dfp == NULL && e->e_df != NULL) + if (e->e_dfp == NULL && bitset(EF_HAS_DF, e->e_flags)) { - e->e_dfp = fopen(e->e_df, "r"); + char *df = queuename(e, 'd'); + + e->e_dfp = fopen(df, "r"); if (e->e_dfp == NULL) { syserr("mailfile: Cannot open %s for %s from %s", - e->e_df, e->e_to, e->e_from.q_paddr); + df, e->e_to, e->e_from.q_paddr); } } - if (!bitset(S_ISGID, mode) || setgid(stb.st_gid) < 0) + /* select a new user to run as */ + if (!bitset(SFF_RUNASREALUID, sfflags)) { - if (ctladdr == NULL || ctladdr->q_uid == 0) + if (bitset(S_ISUID, mode)) { - (void) initgroups(DefUser, DefGid); + RealUserName = NULL; + RealUid = stb.st_uid; + } + else if (ctladdr != NULL && ctladdr->q_uid != 0) + { + if (ctladdr->q_ruser != NULL) + RealUserName = ctladdr->q_ruser; + else + RealUserName = ctladdr->q_user; + RealUid = ctladdr->q_uid; + } + else if (FileMailer != NULL && FileMailer->m_uid != 0) + { + RealUserName = DefUser; + RealUid = FileMailer->m_uid; } else { - (void) initgroups(ctladdr->q_ruser ? - ctladdr->q_ruser : ctladdr->q_user, - ctladdr->q_gid); + RealUserName = DefUser; + RealUid = DefUid; } + + /* select a new group to run as */ + if (bitset(S_ISGID, mode)) + RealGid = stb.st_gid; + else if (ctladdr != NULL && ctladdr->q_uid != 0) + RealGid = ctladdr->q_gid; + else if (FileMailer != NULL && FileMailer->m_gid != 0) + RealGid = FileMailer->m_gid; + else + RealGid = DefGid; } - if (!bitset(S_ISUID, mode) || setuid(stb.st_uid) < 0) + + /* last ditch */ + if (!bitset(SFF_ROOTOK, sfflags)) { - if (ctladdr == NULL || ctladdr->q_uid == 0) - (void) setuid(DefUid); - else - (void) setuid(ctladdr->q_uid); + if (RealUid == 0) + RealUid = DefUid; + if (RealGid == 0) + RealGid = DefGid; + } + + /* now set the group and user ids */ + endpwent(); + if (RealUserName != NULL && !DontInitGroups) + (void) initgroups(RealUserName, RealGid); + (void) setgid(RealGid); + (void) setuid(RealUid); + + /* if you have a safe environment, go into it */ + if (SafeFileEnv != NULL && SafeFileEnv[0] != '\0') + { + int i; + + if (chroot(SafeFileEnv) < 0) + { + syserr("mailfile: Cannot chroot(%s)", + SafeFileEnv); + exit(EX_CANTCREAT); + } + i = strlen(SafeFileEnv); + if (strncmp(SafeFileEnv, filename, i) == 0) + filename += i; } - FileName = filename; - LineNumber = 0; - f = dfopen(filename, oflags, FileMode); + if (chdir("/") < 0) + syserr("mailfile: cannot chdir(/)"); + + sfflags |= SFF_NOPATHCHECK; + sfflags &= ~SFF_OPENASROOT; + f = safefopen(filename, oflags, FileMode, sfflags); if (f == NULL) { message("554 cannot open: %s", errstring(errno)); exit(EX_CANTCREAT); } - if (fstat(fileno(f), &fsb) < 0 || - !bitset(O_CREAT, oflags) && - (stb.st_nlink != fsb.st_nlink || - stb.st_dev != fsb.st_dev || - stb.st_ino != fsb.st_ino || - stb.st_uid != fsb.st_uid)) + if (fstat(fileno(f), &stb) < 0) { - message("554 cannot write: file changed after open"); + message("554 cannot fstat %s", errstring(errno)); exit(EX_CANTCREAT); } @@ -2270,20 +2850,23 @@ mailfile(filename, ctladdr, e) mcibuf.mci_flags |= MCIF_7BIT; putfromline(&mcibuf, e); - (*e->e_puthdr)(&mcibuf, e); - putline("\n", &mcibuf); + (*e->e_puthdr)(&mcibuf, e->e_header, e); (*e->e_putbody)(&mcibuf, e, NULL); putline("\n", &mcibuf); - if (ferror(f)) + if (fflush(f) < 0 || ferror(f)) { message("451 I/O error: %s", errstring(errno)); setstat(EX_IOERR); } - (void) xfclose(f, "mailfile", filename); - (void) fflush(stdout); /* reset ISUID & ISGID bits for paranoid systems */ +#if HASFCHMOD + (void) fchmod(fileno(f), (int) stb.st_mode); +#else (void) chmod(filename, (int) stb.st_mode); +#endif + (void) xfclose(f, "mailfile", filename); + (void) fflush(stdout); exit(ExitStat); /*NOTREACHED*/ } @@ -2337,7 +2920,7 @@ hostsignature(m, host, e) auto int rcode; char *hp; char *endp; - int oldoptions; + int oldoptions = _res.options; char *mxhosts[MAXMXHOSTS + 1]; #endif @@ -2366,10 +2949,7 @@ hostsignature(m, host, e) #if NAMED_BIND if (ConfigLevel < 2) - { - oldoptions = _res.options; _res.options &= ~(RES_DEFNAMES | RES_DNSRCH); /* XXX */ - } for (hp = host; hp != NULL; hp = endp) { @@ -2385,11 +2965,10 @@ hostsignature(m, host, e) /* update the connection info for this host */ mci = mci_get(hp, m); + mci->mci_lastuse = curtime(); mci->mci_exitstat = rcode; mci->mci_errno = errno; -#if NAMED_BIND mci->mci_herrno = h_errno; -#endif /* and return the original host name as the signature */ nmx = 1; diff --git a/usr.sbin/sendmail/src/domain.c b/usr.sbin/sendmail/src/domain.c index da2a79587a629..8058330f962ac 100644 --- a/usr.sbin/sendmail/src/domain.c +++ b/usr.sbin/sendmail/src/domain.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1986 Eric P. Allman + * Copyright (c) 1986, 1995 Eric P. Allman * Copyright (c) 1988, 1993 * The Regents of the University of California. All rights reserved. * @@ -36,23 +36,21 @@ #ifndef lint #if NAMED_BIND -static char sccsid[] = "@(#)domain.c 8.19.1.1 (Berkeley) 3/6/95 (with name server)"; +static char sccsid[] = "@(#)domain.c 8.54 (Berkeley) 9/28/95 (with name server)"; #else -static char sccsid[] = "@(#)domain.c 8.19.1.1 (Berkeley) 3/6/95 (without name server)"; +static char sccsid[] = "@(#)domain.c 8.54 (Berkeley) 9/28/95 (without name server)"; #endif #endif /* not lint */ #if NAMED_BIND #include <errno.h> -#include <arpa/nameser.h> #include <resolv.h> -#include <netdb.h> typedef union { HEADER qb1; - char qb2[PACKETSZ]; + u_char qb2[PACKETSZ]; } querybuf; static char MXHostBuf[MAXMXHOSTS*PACKETSZ]; @@ -69,15 +67,17 @@ static char MXHostBuf[MAXMXHOSTS*PACKETSZ]; # define NO_DATA NO_ADDRESS #endif -#ifndef HEADERSZ -# define HEADERSZ sizeof(HEADER) +#ifndef HFIXEDSZ +# define HFIXEDSZ 12 /* sizeof(HEADER) */ #endif -/* don't use sizeof because sizeof(long) is different on 64-bit machines */ -#define SHORTSIZE 2 /* size of a short (really, must be 2) */ -#define LONGSIZE 4 /* size of a long (really, must be 4) */ - #define MAXCNAMEDEPTH 10 /* maximum depth of CNAME recursion */ + +#if defined(__RES) && (__RES >= 19940415) +# define RES_UNC_T char * +#else +# define RES_UNC_T u_char * +#endif /* ** GETMXRR -- get MX resource records for a domain ** @@ -96,13 +96,13 @@ static char MXHostBuf[MAXMXHOSTS*PACKETSZ]; ** and 1 is returned. */ +int getmxrr(host, mxhosts, droplocalhost, rcode) char *host; char **mxhosts; bool droplocalhost; int *rcode; { - extern int h_errno; register u_char *eom, *cp; register int i, j, n; int nmx = 0; @@ -111,11 +111,13 @@ getmxrr(host, mxhosts, droplocalhost, rcode) querybuf answer; int ancount, qdcount, buflen; bool seenlocal = FALSE; - u_short pref, localpref, type; + u_short pref, type; + u_short localpref = 256; char *fallbackMX = FallBackMX; static bool firsttime = TRUE; - STAB *st; bool trycanon = FALSE; + int (*resfunc)(); + extern int res_query(), res_search(); u_short prefer[MAXMXHOSTS]; int weight[MAXMXHOSTS]; extern bool getcanonname(); @@ -125,15 +127,14 @@ getmxrr(host, mxhosts, droplocalhost, rcode) if (fallbackMX != NULL) { - if (firsttime && res_query(FallBackMX, C_IN, T_A, - (char *) &answer, sizeof answer) < 0) + if (firsttime && + res_query(FallBackMX, C_IN, T_A, + (u_char *) &answer, sizeof answer) < 0) { /* this entry is bogus */ fallbackMX = FallBackMX = NULL; } - else if (droplocalhost && - (st = stab(fallbackMX, ST_CLASS, ST_FIND)) != NULL && - bitnset('w', st->s_class)) + else if (droplocalhost && wordinclass(fallbackMX, 'w')) { /* don't use fallback for this pass */ fallbackMX = NULL; @@ -141,12 +142,29 @@ getmxrr(host, mxhosts, droplocalhost, rcode) firsttime = FALSE; } + *rcode = EX_OK; + /* efficiency hack -- numeric or non-MX lookups */ if (host[0] == '[') goto punt; + /* + ** If we don't have MX records in our host switch, don't + ** try for MX records. Note that this really isn't "right", + ** since we might be set up to try NIS first and then DNS; + ** if the host is found in NIS we really shouldn't be doing + ** MX lookups. However, that should be a degenerate case. + */ + + if (!UseNameServer) + goto punt; + if (HasWildcardMX && ConfigLevel >= 6) + resfunc = res_query; + else + resfunc = res_search; + errno = 0; - n = res_search(host, C_IN, T_MX, (char *)&answer, sizeof(answer)); + n = (*resfunc)(host, C_IN, T_MX, (u_char *) &answer, sizeof(answer)); if (n < 0) { if (tTd(8, 1)) @@ -163,25 +181,22 @@ getmxrr(host, mxhosts, droplocalhost, rcode) goto punt; case HOST_NOT_FOUND: -#ifdef BROKEN_RES_SEARCH - /* Ultrix resolver returns failure w/ h_errno=0 */ - case 0: +#if BROKEN_RES_SEARCH + case 0: /* Ultrix resolver retns failure w/ h_errno=0 */ #endif - /* the host just doesn't exist */ + /* host doesn't exist in DNS; might be in /etc/hosts */ + trycanon = TRUE; *rcode = EX_NOHOST; - - if (!UseNameServer) - { - /* might exist in /etc/hosts */ - goto punt; - } - break; + goto punt; case TRY_AGAIN: /* couldn't connect to the name server */ - if (!UseNameServer && errno == ECONNREFUSED) - goto punt; - + if (fallbackMX != NULL) + { + /* name server is hosed -- push to fallback */ + mxhosts[nmx++] = fallbackMX; + return nmx; + } /* it might come up later; better queue it up */ *rcode = EX_TEMPFAIL; break; @@ -199,7 +214,7 @@ getmxrr(host, mxhosts, droplocalhost, rcode) /* find first satisfactory answer */ hp = (HEADER *)&answer; - cp = (u_char *)&answer + HEADERSZ; + cp = (u_char *)&answer + HFIXEDSZ; eom = (u_char *)&answer + n; for (qdcount = ntohs(hp->qdcount); qdcount--; cp += n + QFIXEDSZ) if ((n = dn_skipname(cp, eom)) < 0) @@ -210,11 +225,11 @@ getmxrr(host, mxhosts, droplocalhost, rcode) while (--ancount >= 0 && cp < eom && nmx < MAXMXHOSTS - 1) { if ((n = dn_expand((u_char *)&answer, - eom, cp, (u_char *)bp, buflen)) < 0) + eom, cp, (RES_UNC_T) bp, buflen)) < 0) break; cp += n; GETSHORT(type, cp); - cp += SHORTSIZE + LONGSIZE; + cp += INT16SZ + INT32SZ; GETSHORT(n, cp); if (type != T_MX) { @@ -226,22 +241,25 @@ getmxrr(host, mxhosts, droplocalhost, rcode) } GETSHORT(pref, cp); if ((n = dn_expand((u_char *)&answer, eom, cp, - (u_char *)bp, buflen)) < 0) + (RES_UNC_T) bp, buflen)) < 0) break; cp += n; - if (droplocalhost && - (st = stab(bp, ST_CLASS, ST_FIND)) != NULL && - bitnset('w', st->s_class)) + if (wordinclass(bp, 'w')) { if (tTd(8, 3)) printf("found localhost (%s) in MX list, pref=%d\n", bp, pref); - if (!seenlocal || pref < localpref) - localpref = pref; - seenlocal = TRUE; - continue; + if (droplocalhost) + { + if (!seenlocal || pref < localpref) + localpref = pref; + seenlocal = TRUE; + continue; + } + weight[nmx] = 0; } - weight[nmx] = mxrand(bp); + else + weight[nmx] = mxrand(bp); prefer[nmx] = pref; mxhosts[nmx++] = bp; n = strlen(bp); @@ -284,11 +302,25 @@ getmxrr(host, mxhosts, droplocalhost, rcode) } } + /* delete duplicates from list (yes, some bozos have duplicates) */ + for (i = 0; i < nmx - 1; ) + { + if (strcasecmp(mxhosts[i], mxhosts[i + 1]) != 0) + i++; + else + { + /* compress out duplicate */ + for (j = i + 1; j < nmx; j++) + mxhosts[j] = mxhosts[j + 1]; + nmx--; + } + } + if (nmx == 0) { punt: if (seenlocal && - (!TryNullMXList || gethostbyname(host) == NULL)) + (!TryNullMXList || sm_gethostbyname(host) == NULL)) { /* ** If we have deleted all MX entries, this is @@ -336,8 +368,8 @@ punt: *bp++ = '.'; *bp = '\0'; } + nmx = 1; } - nmx = 1; } /* if we have a default lowest preference, include that */ @@ -364,6 +396,7 @@ punt: ** none. */ +int mxrand(host) register char *host; { @@ -391,13 +424,43 @@ mxrand(host) } hfunc &= 0xff; + hfunc++; if (tTd(17, 9)) printf(" = %d\n", hfunc); return hfunc; } /* -** GETCANONNAME -- get the canonical name for named host +** BESTMX -- find the best MX for a name +** +** This is really a hack, but I don't see any obvious way +** to generalize it at the moment. +*/ + +char * +bestmx_map_lookup(map, name, av, statp) + MAP *map; + char *name; + char **av; + int *statp; +{ + int nmx; + auto int rcode; + int saveopts = _res.options; + char *mxhosts[MAXMXHOSTS + 1]; + + _res.options &= ~(RES_DNSRCH|RES_DEFNAMES); + nmx = getmxrr(name, mxhosts, FALSE, &rcode); + _res.options = saveopts; + if (nmx <= 0) + return NULL; + if (bitset(MF_MATCHONLY, map->map_mflags)) + return map_rewrite(map, name, strlen(name), NULL); + else + return map_rewrite(map, mxhosts[0], strlen(mxhosts[0]), av); +} +/* +** DNS_GETCANONNAME -- get the canonical name for named host using DNS ** ** This algorithm tries to be smart about wildcard MX records. ** This is hard to do because DNS doesn't tell is if we matched @@ -419,6 +482,7 @@ mxrand(host) ** This is a value-result parameter. ** hbsize -- the size of the host buffer. ** trymx -- if set, try MX records as well as A and CNAME. +** statp -- pointer to place to store status. ** ** Returns: ** TRUE -- if the host matched. @@ -426,12 +490,12 @@ mxrand(host) */ bool -getcanonname(host, hbsize, trymx) +dns_getcanonname(host, hbsize, trymx, statp) char *host; int hbsize; bool trymx; + int *statp; { - extern int h_errno; register u_char *eom, *ap; register char *cp; register int n; @@ -444,7 +508,7 @@ getcanonname(host, hbsize, trymx) char **dp; char *mxmatch; bool amatch; - bool gotmx; + bool gotmx = FALSE; int qtype; int loopcnt; char *xp; @@ -453,10 +517,13 @@ getcanonname(host, hbsize, trymx) extern char *gethostalias(); if (tTd(8, 2)) - printf("getcanonname(%s)\n", host); + printf("dns_getcanonname(%s, trymx=%d)\n", host, trymx); if ((_res.options & RES_INIT) == 0 && res_init() == -1) - return (FALSE); + { + *statp = EX_UNAVAILABLE; + return FALSE; + } /* ** Initialize domain search list. If there is at least one @@ -470,10 +537,15 @@ getcanonname(host, hbsize, trymx) loopcnt = 0; cnameloop: - for (cp = host, n = 0; *cp; cp++) + /* Check for dots in the name */ + for (cp = host, n = 0; *cp != '\0'; cp++) if (*cp == '.') n++; + /* + ** If this is a simple name, determine whether it matches an + ** alias in the file defined by the environment variable HOSTALIASES. + */ if (n == 0 && (xp = gethostalias(host)) != NULL) { if (loopcnt++ > MAXCNAMEDEPTH) @@ -488,6 +560,17 @@ cnameloop: } } + /* + ** Build the search list. + ** If there is at least one dot in name, start with a null + ** domain to search the unmodified name first. + ** If name does not end with a dot and search up local domain + ** tree desired, append each local domain component to the + ** search list; if name contains no dots and default domain + ** name is desired, append default domain name to search list; + ** else if name ends in a dot, remove that dot. + */ + dp = searchlist; if (n > 0) *dp++ = ""; @@ -507,7 +590,8 @@ cnameloop: *dp = NULL; /* - ** Now run through the search list for the name in question. + ** Now loop through the search list, appending each domain in turn + ** name and searching for a match. */ mxmatch = NULL; @@ -518,11 +602,12 @@ cnameloop: if (qtype == T_ANY) gotmx = FALSE; if (tTd(8, 5)) - printf("getcanonname: trying %s.%s (%s)\n", host, *dp, + printf("dns_getcanonname: trying %s.%s (%s)\n", + host, *dp, qtype == T_ANY ? "ANY" : qtype == T_A ? "A" : qtype == T_MX ? "MX" : "???"); ret = res_querydomain(host, *dp, C_IN, qtype, - (u_char *) &answer, sizeof(answer)); + answer.qb2, sizeof(answer.qb2)); if (ret <= 0) { if (tTd(8, 7)) @@ -533,6 +618,7 @@ cnameloop: { /* the name server seems to be down */ h_errno = TRY_AGAIN; + *statp = EX_TEMPFAIL; return FALSE; } @@ -551,13 +637,7 @@ cnameloop: } } - if (mxmatch != NULL) - { - /* we matched before -- use that one */ - break; - } - - /* otherwise, try the next name */ + /* definite no -- try the next domain */ dp++; qtype = T_ANY; continue; @@ -566,13 +646,13 @@ cnameloop: printf("\tYES\n"); /* - ** This might be a bogus match. Search for A or - ** CNAME records. If we don't have a matching + ** Appear to have a match. Confirm it by searching for A or + ** CNAME records. If we don't have a local domain ** wild card MX record, we will accept MX as well. */ hp = (HEADER *) &answer; - ap = (u_char *) &answer + HEADERSZ; + ap = (u_char *) &answer + HFIXEDSZ; eom = (u_char *) &answer + ret; /* skip question part of response -- we know what we asked */ @@ -583,44 +663,66 @@ cnameloop: if (tTd(8, 20)) printf("qdcount failure (%d)\n", ntohs(hp->qdcount)); + *statp = EX_SOFTWARE; return FALSE; /* ???XXX??? */ } } amatch = FALSE; - for (ancount = ntohs(hp->ancount); --ancount >= 0 && ap < eom; ap += n) + for (ancount = ntohs(hp->ancount); --ancount >= 0 && ap < eom; + ap += n) { n = dn_expand((u_char *) &answer, eom, ap, - (u_char *) nbuf, sizeof nbuf); + (RES_UNC_T) nbuf, sizeof nbuf); if (n < 0) break; ap += n; GETSHORT(type, ap); - ap += SHORTSIZE + LONGSIZE; + ap += INT16SZ + INT32SZ; GETSHORT(n, ap); switch (type) { case T_MX: gotmx = TRUE; - if (**dp != '\0') + if (**dp != '\0' && HasWildcardMX) { - /* got a match -- save that info */ + /* + ** If we are using MX matches and have + ** not yet gotten one, save this one + ** but keep searching for an A or + ** CNAME match. + */ + if (trymx && mxmatch == NULL) mxmatch = *dp; continue; } - /* exact MX matches are as good as an A match */ - /* fall through */ + /* + ** If we did not append a domain name, this + ** must have been a canonical name to start + ** with. Even if we did append a domain name, + ** in the absence of a wildcard MX this must + ** still be a real MX match. + ** Such MX matches are as good as an A match, + ** fall through. + */ case T_A: - /* good show */ + /* Flag that a good match was found */ amatch = TRUE; /* continue in case a CNAME also exists */ continue; case T_CNAME: + if (DontExpandCnames) + { + /* got CNAME -- guaranteed canonical */ + amatch = TRUE; + break; + } + if (loopcnt++ > MAXCNAMEDEPTH) { /*XXX should notify postmaster XXX*/ @@ -630,17 +732,18 @@ cnameloop: { char ebuf[MAXLINE]; - sprintf(ebuf, "Deferred: DNS failure: CNAME loop for %s", + sprintf(ebuf, "Deferred: DNS failure: CNAME loop for %.100s", host); CurEnv->e_message = newstr(ebuf); } h_errno = NO_RECOVERY; + *statp = EX_CONFIG; return FALSE; } /* value points at name */ if ((ret = dn_expand((u_char *)&answer, - eom, ap, (u_char *)nbuf, sizeof(nbuf))) < 0) + eom, ap, (RES_UNC_T) nbuf, sizeof(nbuf))) < 0) break; (void)strncpy(host, nbuf, hbsize); /* XXX */ host[hbsize - 1] = '\0'; @@ -661,14 +764,24 @@ cnameloop: if (amatch) { - /* got an A record and no CNAME */ + /* + ** Got a good match -- either an A, CNAME, or an + ** exact MX record. Save it and get out of here. + */ + mxmatch = *dp; break; } /* - ** If this was a T_ANY query, we may have the info but - ** need an explicit query. Try T_A, then T_MX. + ** Nothing definitive yet. + ** If this was a T_ANY query, we don't really know what + ** was returned -- it might have been a T_NS, + ** for example. Try T_A to be more specific + ** during the next pass. + ** If this was a T_A query and we haven't yet found a MX + ** match, try T_MX if allowed to do so. + ** Otherwise, try the next domain. */ if (qtype == T_ANY) @@ -677,39 +790,51 @@ cnameloop: qtype = T_MX; else { - /* really nothing in this domain; try the next */ qtype = T_ANY; dp++; } } + /* if nothing was found, we are done */ if (mxmatch == NULL) + { + *statp = EX_NOHOST; return FALSE; + } + + /* + ** Create canonical name and return. + ** If saved domain name is null, name was already canonical. + ** Otherwise append the saved domain name. + */ - /* create matching name and return */ (void) sprintf(nbuf, "%.*s%s%.*s", MAXDNAME, host, *mxmatch == '\0' ? "" : ".", MAXDNAME, mxmatch); strncpy(host, nbuf, hbsize); host[hbsize - 1] = '\0'; + if (tTd(8, 5)) + printf("dns_getcanonname: %s\n", host); + *statp = EX_OK; return TRUE; } + char * gethostalias(host) char *host; { char *fname; FILE *fp; - register char *p; + register char *p = NULL; char buf[MAXLINE]; static char hbuf[MAXDNAME]; fname = getenv("HOSTALIASES"); - if (fname == NULL || (fp = fopen(fname, "r")) == NULL) + if (fname == NULL || + (fp = safefopen(fname, O_RDONLY, 0, SFF_REGONLY)) == NULL) return NULL; - setbuf(fp, NULL); while (fgets(buf, sizeof buf, fp) != NULL) { for (p = buf; p != '\0' && !(isascii(*p) && isspace(*p)); p++) @@ -743,28 +868,4 @@ gethostalias(host) return hbuf; } - -#else /* not NAMED_BIND */ - -#include <netdb.h> - -bool -getcanonname(host, hbsize, trymx) - char *host; - int hbsize; - bool trymx; -{ - struct hostent *hp; - - hp = gethostbyname(host); - if (hp == NULL) - return (FALSE); - - if (strlen(hp->h_name) >= hbsize) - return (FALSE); - - (void) strcpy(host, hp->h_name); - return (TRUE); -} - -#endif /* not NAMED_BIND */ +#endif /* NAMED_BIND */ diff --git a/usr.sbin/sendmail/src/envelope.c b/usr.sbin/sendmail/src/envelope.c index e8bb1e479fe84..4bf7ac231ddf0 100644 --- a/usr.sbin/sendmail/src/envelope.c +++ b/usr.sbin/sendmail/src/envelope.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1983 Eric P. Allman + * Copyright (c) 1983, 1995 Eric P. Allman * Copyright (c) 1988, 1993 * The Regents of the University of California. All rights reserved. * @@ -33,11 +33,10 @@ */ #ifndef lint -static char sccsid[] = "@(#)envelope.c 8.34.1.1 (Berkeley) 2/28/95"; +static char sccsid[] = "@(#)envelope.c 8.76 (Berkeley) 11/11/95"; #endif /* not lint */ #include "sendmail.h" -#include <pwd.h> /* ** NEWENVELOPE -- allocate a new envelope @@ -60,9 +59,6 @@ newenvelope(e, parent) register ENVELOPE *e; register ENVELOPE *parent; { - extern putheader(), putbody(); - extern ENVELOPE BlankEnvelope; - if (e == parent && e->e_parent != NULL) parent = e->e_parent; clearenvelope(e, TRUE); @@ -100,16 +96,20 @@ dropenvelope(e) register ENVELOPE *e; { bool queueit = FALSE; - bool saveit = bitset(EF_FATALERRS, e->e_flags); + bool failure_return = FALSE; + bool success_return = FALSE; register ADDRESS *q; char *id = e->e_id; char buf[MAXLINE]; if (tTd(50, 1)) { + extern void printenvflags(); + printf("dropenvelope %x: id=", e); xputs(e->e_id); - printf(", flags=0x%x\n", e->e_flags); + printf(", flags="); + printenvflags(e); if (tTd(50, 10)) { printf("sendq="); @@ -117,17 +117,23 @@ dropenvelope(e) } } +#ifdef LOG + if (LogLevel > 84) + syslog(LOG_DEBUG, "%s: dropenvelope, e_flags=0x%x, OpMode=%c, pid=%d", + id == NULL ? "[NOQUEUE]" : id, + e->e_flags, OpMode, getpid()); +#endif + /* we must have an id to remove disk files */ if (id == NULL) return; -#ifdef LOG + /* if verify-only mode, we can skip most of this */ + if (OpMode == MD_VERIFY) + goto simpledrop; + 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 */ @@ -140,69 +146,116 @@ dropenvelope(e) e->e_flags &= ~EF_QUEUERUN; for (q = e->e_sendqueue; q != NULL; q = q->q_next) { - if (bitset(QQUEUEUP, q->q_flags)) + if (!bitset(QBADADDR|QDONTSEND|QSENT, q->q_flags) || + bitset(QQUEUEUP, q->q_flags)) queueit = TRUE; - if (!bitset(QDONTSEND, q->q_flags) && - bitset(QBADADDR, q->q_flags)) + + /* see if a notification is needed */ + if (bitset(QBADADDR, q->q_flags) && + bitset(QPINGONFAILURE, q->q_flags)) { - if (q->q_owner == NULL && - strcmp(e->e_from.q_paddr, "<>") != 0) + failure_return = TRUE; + if (q->q_owner == NULL && !emptyaddr(&e->e_from)) (void) sendtolist(e->e_from.q_paddr, NULL, - &e->e_errorqueue, e); + &e->e_errorqueue, 0, e); + } + else if (bitset(QPINGONSUCCESS, q->q_flags) && + ((bitset(QSENT, q->q_flags) && + bitnset(M_LOCALMAILER, q->q_mailer->m_flags)) || + bitset(QRELAYED|QEXPANDED|QDELIVERED, q->q_flags))) + { + success_return = TRUE; } } + if (e->e_class < 0) + e->e_flags |= EF_NO_BODY_RETN; + /* ** See if the message timed out. */ if (!queueit) /* nothing to do */ ; - else if (curtime() > e->e_ctime + TimeOuts.to_q_return) + else if (curtime() > e->e_ctime + TimeOuts.to_q_return[e->e_timeoutclass]) { (void) sprintf(buf, "Cannot send message for %s", - pintvl(TimeOuts.to_q_return, FALSE)); + pintvl(TimeOuts.to_q_return[e->e_timeoutclass], FALSE)); if (e->e_message != NULL) free(e->e_message); e->e_message = newstr(buf); message(buf); e->e_flags |= EF_CLRQUEUE; - saveit = TRUE; + failure_return = TRUE; fprintf(e->e_xfp, "Message could not be delivered for %s\n", - pintvl(TimeOuts.to_q_return, FALSE)); + pintvl(TimeOuts.to_q_return[e->e_timeoutclass], FALSE)); fprintf(e->e_xfp, "Message will be deleted from queue\n"); for (q = e->e_sendqueue; q != NULL; q = q->q_next) { - if (bitset(QQUEUEUP, q->q_flags)) + if (bitset(QQUEUEUP, q->q_flags) || + !bitset(QBADADDR|QDONTSEND|QSENT, q->q_flags)) + { q->q_flags |= QBADADDR; + q->q_status = "4.4.7"; + } } } - else if (TimeOuts.to_q_warning > 0 && - curtime() > e->e_ctime + TimeOuts.to_q_warning) + else if (TimeOuts.to_q_warning[e->e_timeoutclass] > 0 && + curtime() > e->e_ctime + TimeOuts.to_q_warning[e->e_timeoutclass]) { - if (!bitset(EF_WARNING|EF_RESPONSE, e->e_flags) && + bool delay_return = FALSE; + + for (q = e->e_sendqueue; q != NULL; q = q->q_next) + { + if (bitset(QQUEUEUP, q->q_flags) && + bitset(QPINGONDELAY, q->q_flags)) + { + q->q_flags |= QDELAYED; + delay_return = TRUE; + } + } + if (delay_return && + !bitset(EF_WARNING|EF_RESPONSE, e->e_flags) && e->e_class >= 0 && - strcmp(e->e_from.q_paddr, "<>") != 0) + e->e_from.q_paddr != NULL && + strcmp(e->e_from.q_paddr, "<>") != 0 && + strncasecmp(e->e_from.q_paddr, "owner-", 6) != 0 && + (strlen(e->e_from.q_paddr) <= (SIZE_T) 8 || + strcasecmp(&e->e_from.q_paddr[strlen(e->e_from.q_paddr) - 8], "-request") != 0)) { (void) sprintf(buf, - "warning: cannot send message for %s", - pintvl(TimeOuts.to_q_warning, FALSE)); + "Warning: could not send message for past %s", + pintvl(TimeOuts.to_q_warning[e->e_timeoutclass], FALSE)); if (e->e_message != NULL) free(e->e_message); e->e_message = newstr(buf); message(buf); e->e_flags |= EF_WARNING; - saveit = TRUE; + failure_return = TRUE; } fprintf(e->e_xfp, "Warning: message still undelivered after %s\n", - pintvl(TimeOuts.to_q_warning, FALSE)); + pintvl(TimeOuts.to_q_warning[e->e_timeoutclass], FALSE)); fprintf(e->e_xfp, "Will keep trying until message is %s old\n", - pintvl(TimeOuts.to_q_return, FALSE)); + pintvl(TimeOuts.to_q_return[e->e_timeoutclass], FALSE)); + } + + if (tTd(50, 2)) + printf("failure_return=%d success_return=%d queueit=%d\n", + failure_return, success_return, queueit); + + /* + ** If we had some fatal error, but no addresses are marked as + ** bad, mark them _all_ as bad. + */ + + if (bitset(EF_FATALERRS, e->e_flags) && !failure_return) + { + failure_return = TRUE; for (q = e->e_sendqueue; q != NULL; q = q->q_next) { - if (bitset(QQUEUEUP, q->q_flags)) - q->q_flags |= QREPORT; + if (!bitset(QDONTSEND, q->q_flags)) + q->q_flags |= QBADADDR; } } @@ -210,33 +263,42 @@ dropenvelope(e) ** Send back return receipts as requested. */ +/* if (e->e_receiptto != NULL && bitset(EF_SENDRECEIPT, e->e_flags) && !bitset(PRIV_NORECEIPTS, PrivacyFlags)) +*/ + if (e->e_receiptto == NULL) + e->e_receiptto = e->e_from.q_paddr; + if (success_return && !failure_return && + !bitset(PRIV_NORECEIPTS, PrivacyFlags) && + strcmp(e->e_receiptto, "<>") != 0) { auto ADDRESS *rlist = NULL; - (void) sendtolist(e->e_receiptto, NULLADDR, &rlist, e); + e->e_flags |= EF_SENDRECEIPT; + (void) sendtolist(e->e_receiptto, NULLADDR, &rlist, 0, e); (void) returntosender("Return receipt", rlist, FALSE, e); - e->e_flags &= ~EF_SENDRECEIPT; } + e->e_flags &= ~EF_SENDRECEIPT; /* ** Arrange to send error messages if there are fatal errors. */ - if (saveit && e->e_errormode != EM_QUIET) - savemail(e); + if (failure_return && e->e_errormode != EM_QUIET) + savemail(e, !bitset(EF_NO_BODY_RETN, e->e_flags)); /* ** Arrange to send warning messages to postmaster as requested. */ - if (bitset(EF_PM_NOTIFY, e->e_flags) && PostMasterCopy != NULL && + if ((failure_return || bitset(EF_PM_NOTIFY, e->e_flags)) && + PostMasterCopy != NULL && !bitset(EF_RESPONSE, e->e_flags) && e->e_class >= 0) { auto ADDRESS *rlist = NULL; - (void) sendtolist(PostMasterCopy, NULLADDR, &rlist, e); + (void) sendtolist(PostMasterCopy, NULLADDR, &rlist, 0, e); (void) returntosender(e->e_message, rlist, FALSE, e); } @@ -244,13 +306,18 @@ dropenvelope(e) ** Instantiate or deinstantiate the queue. */ - if ((!queueit && !bitset(EF_KEEPQUEUE, e->e_flags)) || - bitset(EF_CLRQUEUE, e->e_flags)) +simpledrop: + if (!queueit || bitset(EF_CLRQUEUE, e->e_flags)) { if (tTd(50, 1)) - printf("\n===== Dropping [dq]f%s =====\n\n", e->e_id); - if (e->e_df != NULL) - xunlink(e->e_df); + { + extern void printenvflags(); + + printf("\n===== Dropping [dq]f%s... queueit=%d, e_flags=", + e->e_id, queueit); + printenvflags(e); + } + xunlink(queuename(e, 'd')); xunlink(queuename(e, 'q')); #ifdef LOG @@ -261,7 +328,7 @@ dropenvelope(e) else if (queueit || !bitset(EF_INQUEUE, e->e_flags)) { #ifdef QUEUE - queueup(e, bitset(EF_KEEPQUEUE, e->e_flags), FALSE); + queueup(e, FALSE); #else /* QUEUE */ syserr("554 dropenvelope: queueup"); #endif /* QUEUE */ @@ -273,9 +340,10 @@ dropenvelope(e) /* make sure that this envelope is marked unused */ if (e->e_dfp != NULL) - (void) xfclose(e->e_dfp, "dropenvelope", e->e_df); + (void) xfclose(e->e_dfp, "dropenvelope df", e->e_id); e->e_dfp = NULL; - e->e_id = e->e_df = NULL; + e->e_id = NULL; + e->e_flags &= ~EF_HAS_DF; } /* ** CLEARENVELOPE -- clear an envelope without unlocking @@ -312,7 +380,7 @@ clearenvelope(e, fullclear) if (e->e_xfp != NULL) (void) xfclose(e->e_xfp, "clearenvelope xfp", e->e_id); if (e->e_dfp != NULL) - (void) xfclose(e->e_dfp, "clearenvelope dfp", e->e_df); + (void) xfclose(e->e_dfp, "clearenvelope dfp", e->e_id); e->e_xfp = e->e_dfp = NULL; } @@ -359,7 +427,6 @@ initsys(e) #endif /* TTYNAME */ extern char *ttyname(); extern void settime(); - extern char Version[]; /* ** Give this envelope a reality. @@ -491,9 +558,12 @@ openxscript(e) } e->e_xfp = fdopen(fd, "a"); if (e->e_xfp == NULL) - { syserr("!Can't create transcript stream %s", p); - } +#ifdef HASSETVBUF + setvbuf(e->e_xfp, NULL, _IOLBF, 0); +#else + setlinebuf(e->e_xfp); +#endif if (tTd(46, 9)) { printf("openxscript(%s):\n ", p); @@ -573,7 +643,6 @@ setsender(from, e, delimptr, internal) char *bp; char buf[MAXNAME + 2]; char pvpbuf[PSBUFSIZE]; - extern struct passwd *getpwnam(); extern char *FullName; if (tTd(45, 1)) @@ -614,9 +683,12 @@ setsender(from, e, delimptr, internal) if (p == NULL) { char *host = RealHostName; + if (host == NULL) host = MyHostName; - (void) sprintf(ebuf, "%s@%s", realname, host); + (void) sprintf(ebuf, "%.*s@%.*s", + MAXNAME, realname, + MAXNAME, host); p = ebuf; } syslog(LOG_NOTICE, @@ -629,6 +701,7 @@ setsender(from, e, delimptr, internal) if (!bitset(QBADADDR, e->e_from.q_flags)) { /* it was a bogus mailer in the from addr */ + e->e_status = "5.1.7"; usrerr("553 Invalid sender address"); } SuprErrs = TRUE; @@ -640,7 +713,7 @@ setsender(from, e, delimptr, internal) char nbuf[100]; SuprErrs = TRUE; - expand("\201n", nbuf, &nbuf[sizeof nbuf], e); + expand("\201n", nbuf, sizeof nbuf, e); if (parseaddr(from = newstr(nbuf), &e->e_from, RF_COPYALL, ' ', NULL, e) == NULL && parseaddr(from = "postmaster", &e->e_from, @@ -658,37 +731,30 @@ setsender(from, e, delimptr, internal) } SuprErrs = FALSE; - pvp = NULL; - if (e->e_from.q_mailer == LocalMailer) +# if USERDB + if (bitnset(M_CHECKUDB, e->e_from.q_mailer->m_flags)) { -# ifdef USERDB register char *p; extern char *udbsender(); -# endif + p = udbsender(e->e_from.q_user); + if (p != NULL) + from = p; + } +# endif /* USERDB */ + + if (bitnset(M_HASPWENT, e->e_from.q_mailer->m_flags)) + { if (!internal) { - /* if the user has given fullname already, don't redefine */ + /* if the user already given fullname don't redefine */ if (FullName == NULL) FullName = macvalue('x', e); if (FullName != NULL && FullName[0] == '\0') FullName = NULL; - -# ifdef USERDB - p = udbsender(e->e_from.q_user); - - if (p != NULL) - { - /* - ** We have an alternate address for the sender - */ - - pvp = prescan(p, '\0', pvpbuf, sizeof pvpbuf, NULL); - } -# endif /* USERDB */ } - if ((pw = getpwnam(e->e_from.q_user)) != NULL) + if ((pw = sm_getpwnam(e->e_from.q_user)) != NULL) { /* ** Process passwd file entry. @@ -738,14 +804,14 @@ setsender(from, e, delimptr, internal) ** links in the net. */ - if (pvp == NULL) - pvp = prescan(from, delimchar, pvpbuf, sizeof pvpbuf, NULL); + pvp = prescan(from, delimchar, pvpbuf, sizeof pvpbuf, NULL, NULL); if (pvp == NULL) { /* don't need to give error -- prescan did that already */ # ifdef LOG if (LogLevel > 2) - syslog(LOG_NOTICE, "cannot prescan from (%s)", from); + syslog(LOG_NOTICE, "cannot prescan from (%s)", + shortenstring(from, 203)); # endif finis(); } @@ -754,7 +820,7 @@ setsender(from, e, delimptr, internal) (void) rewrite(pvp, 4, 0, e); bp = buf + 1; cataddr(pvp, NULL, bp, sizeof buf - 2, '\0'); - if (*bp == '@') + if (*bp == '@' && !bitnset(M_NOBRACKET, e->e_from.q_mailer->m_flags)) { /* heuristic: route-addr: add angle brackets */ strcat(bp, ">"); @@ -767,11 +833,92 @@ setsender(from, e, delimptr, internal) if (e->e_from.q_mailer != NULL && bitnset(M_CANONICAL, e->e_from.q_mailer->m_flags)) { + char **lastat; extern char **copyplist(); - while (*pvp != NULL && strcmp(*pvp, "@") != 0) - pvp++; - if (*pvp != NULL) - e->e_fromdomain = copyplist(pvp, TRUE); + /* get rid of any pesky angle brackets */ + (void) rewrite(pvp, 3, 0, e); + (void) rewrite(pvp, 1, 0, e); + (void) rewrite(pvp, 4, 0, e); + + /* strip off to the last "@" sign */ + for (lastat = NULL; *pvp != NULL; pvp++) + if (strcmp(*pvp, "@") == 0) + lastat = pvp; + if (lastat != NULL) + { + e->e_fromdomain = copyplist(lastat, TRUE); + if (tTd(45, 3)) + { + printf("Saving from domain: "); + printav(e->e_fromdomain); + } + } + } +} +/* +** PRINTENVFLAGS -- print envelope flags for debugging +** +** Parameters: +** e -- the envelope with the flags to be printed. +** +** Returns: +** none. +*/ + +struct eflags +{ + char *ef_name; + u_long ef_bit; +}; + +struct eflags EnvelopeFlags[] = +{ + "OLDSTYLE", EF_OLDSTYLE, + "INQUEUE", EF_INQUEUE, + "NO_BODY_RETN", EF_NO_BODY_RETN, + "CLRQUEUE", EF_CLRQUEUE, + "SENDRECEIPT", EF_SENDRECEIPT, + "FATALERRS", EF_FATALERRS, + "DELETE_BCC", EF_DELETE_BCC, + "RESPONSE", EF_RESPONSE, + "RESENT", EF_RESENT, + "VRFYONLY", EF_VRFYONLY, + "WARNING", EF_WARNING, + "QUEUERUN", EF_QUEUERUN, + "GLOBALERRS", EF_GLOBALERRS, + "PM_NOTIFY", EF_PM_NOTIFY, + "METOO", EF_METOO, + "LOGSENDER", EF_LOGSENDER, + "NORECEIPT", EF_NORECEIPT, + "HAS8BIT", EF_HAS8BIT, + "NL_NOT_EOL", EF_NL_NOT_EOL, + "CRLF_NOT_EOL", EF_CRLF_NOT_EOL, + "RET_PARAM", EF_RET_PARAM, + "HAS_DF", EF_HAS_DF, + "IS_MIME", EF_IS_MIME, + "DONT_MIME", EF_DONT_MIME, + NULL +}; + +void +printenvflags(e) + register ENVELOPE *e; +{ + register struct eflags *ef; + bool first = TRUE; + + printf("%lx", e->e_flags); + for (ef = EnvelopeFlags; ef->ef_name != NULL; ef++) + { + if (!bitset(ef->ef_bit, e->e_flags)) + continue; + if (first) + printf("<%s", ef->ef_name); + else + printf(",%s", ef->ef_name); + first = FALSE; } + if (!first) + printf(">\n"); } diff --git a/usr.sbin/sendmail/src/err.c b/usr.sbin/sendmail/src/err.c index c6a87e9f30d8e..241a4865c8a23 100644 --- a/usr.sbin/sendmail/src/err.c +++ b/usr.sbin/sendmail/src/err.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1983 Eric P. Allman + * Copyright (c) 1983, 1995 Eric P. Allman * Copyright (c) 1988, 1993 * The Regents of the University of California. All rights reserved. * @@ -33,13 +33,11 @@ */ #ifndef lint -static char sccsid[] = "@(#)err.c 8.27 (Berkeley) 4/18/94"; +static char sccsid[] = "@(#)err.c 8.42 (Berkeley) 11/29/95"; #endif /* not lint */ # include "sendmail.h" # include <errno.h> -# include <netdb.h> -# include <pwd.h> /* ** SYSERR -- Print error message. @@ -53,8 +51,11 @@ static char sccsid[] = "@(#)err.c 8.27 (Berkeley) 4/18/94"; ** be used lightly. ** ** Parameters: -** f -- the format string -** a, b, c, d, e -- parameters +** fmt -- the format string. If it does not begin with +** a three-digit SMTP reply code, either 554 or +** 451 is assumed depending on whether errno +** is set. +** (others) -- parameters ** ** Returns: ** none @@ -65,9 +66,12 @@ static char sccsid[] = "@(#)err.c 8.27 (Berkeley) 4/18/94"; ** sets ExitStat. */ -char MsgBuf[BUFSIZ*2]; /* text of most recent message */ +char MsgBuf[BUFSIZ*2]; /* text of most recent message */ +char HeldMessageBuf[sizeof MsgBuf]; /* for held messages */ -static void fmtmsg(); +extern void putoutmsg __P((char *, bool, bool)); +extern void puterrmsg __P((char *)); +static void fmtmsg __P((char *, const char *, const char *, int, const char *, va_list)); #if NAMED_BIND && !defined(NO_DATA) # define NO_DATA NO_ADDRESS @@ -107,6 +111,14 @@ syserr(fmt, va_alist) VA_END; puterrmsg(MsgBuf); + /* save this message for mailq printing */ + if (!panic) + { + if (CurEnv->e_message != NULL) + free(CurEnv->e_message); + CurEnv->e_message = newstr(MsgBuf + 4); + } + /* determine exit status if not already set */ if (ExitStat == EX_OK) { @@ -119,7 +131,7 @@ syserr(fmt, va_alist) } # ifdef LOG - pw = getpwuid(getuid()); + pw = sm_getpwuid(getuid()); if (pw != NULL) uname = pw->pw_name; else @@ -129,7 +141,7 @@ syserr(fmt, va_alist) } if (LogLevel > 0) - syslog(panic ? LOG_ALERT : LOG_CRIT, "%s: SYSERR(%s): %s", + syslog(panic ? LOG_ALERT : LOG_CRIT, "%s: SYSERR(%s): %.900s", CurEnv->e_id == NULL ? "NOQUEUE" : CurEnv->e_id, uname, &MsgBuf[4]); # endif /* LOG */ @@ -143,6 +155,8 @@ syserr(fmt, va_alist) #ifdef XLA xla_all_end(); #endif + if (tTd(0, 1)) + abort(); exit(EX_OSERR); } errno = 0; @@ -155,7 +169,9 @@ syserr(fmt, va_alist) ** This is much like syserr except it is for user errors. ** ** Parameters: -** fmt, a, b, c, d -- printf strings +** fmt -- the format string. If it does not begin with +** a three-digit SMTP reply code, 501 is assumed. +** (others) -- printf strings ** ** Returns: ** none @@ -183,11 +199,41 @@ usrerr(fmt, va_alist) VA_START(fmt); fmtmsg(MsgBuf, CurEnv->e_to, "501", 0, fmt, ap); VA_END; + + /* save this message for mailq printing */ + switch (MsgBuf[0]) + { + case '4': + case '8': + if (CurEnv->e_message != NULL) + break; + + /* fall through.... */ + + case '5': + case '6': + if (CurEnv->e_message != NULL) + free(CurEnv->e_message); + if (MsgBuf[0] == '6') + { + char buf[MAXLINE]; + + sprintf(buf, "Postmaster warning: %.*s", + sizeof buf - 22, MsgBuf + 4); + CurEnv->e_message = newstr(buf); + } + else + { + CurEnv->e_message = newstr(MsgBuf + 4); + } + break; + } + puterrmsg(MsgBuf); # ifdef LOG if (LogLevel > 3 && LogUsrErrs) - syslog(LOG_NOTICE, "%s: %s", + syslog(LOG_NOTICE, "%s: %.900s", CurEnv->e_id == NULL ? "NOQUEUE" : CurEnv->e_id, &MsgBuf[4]); # endif /* LOG */ @@ -201,7 +247,7 @@ usrerr(fmt, va_alist) ** Parameters: ** msg -- the message (printf fmt) -- it can begin with ** an SMTP reply code. If not, 050 is assumed. -** a, b, c, d, e -- printf arguments +** (others) -- printf arguments ** ** Returns: ** none @@ -226,7 +272,23 @@ message(msg, va_alist) VA_START(msg); fmtmsg(MsgBuf, CurEnv->e_to, "050", 0, msg, ap); VA_END; - putoutmsg(MsgBuf, FALSE); + putoutmsg(MsgBuf, FALSE, FALSE); + + /* save this message for mailq printing */ + switch (MsgBuf[0]) + { + case '4': + case '8': + if (CurEnv->e_message != NULL) + break; + /* fall through.... */ + + case '5': + if (CurEnv->e_message != NULL) + free(CurEnv->e_message); + CurEnv->e_message = newstr(MsgBuf + 4); + break; + } } /* ** NMESSAGE -- print message (not necessarily an error) @@ -234,10 +296,10 @@ message(msg, va_alist) ** Just like "message" except it never puts the to... tag on. ** ** Parameters: -** num -- the default ARPANET error number (in ascii) ** msg -- the message (printf fmt) -- if it begins -** with three digits, this number overrides num. -** a, b, c, d, e -- printf arguments +** with a three digit SMTP reply code, that is used, +** otherwise 050 is assumed. +** (others) -- printf arguments ** ** Returns: ** none @@ -262,7 +324,23 @@ nmessage(msg, va_alist) VA_START(msg); fmtmsg(MsgBuf, (char *) NULL, "050", 0, msg, ap); VA_END; - putoutmsg(MsgBuf, FALSE); + putoutmsg(MsgBuf, FALSE, FALSE); + + /* save this message for mailq printing */ + switch (MsgBuf[0]) + { + case '4': + case '8': + if (CurEnv->e_message != NULL) + break; + /* fall through.... */ + + case '5': + if (CurEnv->e_message != NULL) + free(CurEnv->e_message); + CurEnv->e_message = newstr(MsgBuf + 4); + break; + } } /* ** PUTOUTMSG -- output error message to transcript and channel @@ -271,6 +349,8 @@ nmessage(msg, va_alist) ** msg -- message to output (in SMTP format). ** holdmsg -- if TRUE, don't output a copy of the message to ** our output channel. +** heldmsg -- if TRUE, this is a previously held message; +** don't log it to the transcript file. ** ** Returns: ** none. @@ -281,25 +361,42 @@ nmessage(msg, va_alist) ** Deletes SMTP reply code number as appropriate. */ -putoutmsg(msg, holdmsg) +void +putoutmsg(msg, holdmsg, heldmsg) char *msg; bool holdmsg; + bool heldmsg; { + char msgcode = msg[0]; + /* display for debugging */ if (tTd(54, 8)) - printf("--- %s%s\n", msg, holdmsg ? " (held)" : ""); + printf("--- %s%s%s\n", msg, holdmsg ? " (hold)" : "", + heldmsg ? " (held)" : ""); + + /* map warnings to something SMTP can handle */ + if (msgcode == '6') + msg[0] = '5'; + else if (msgcode == '8') + msg[0] = '4'; /* output to transcript if serious */ - if (CurEnv->e_xfp != NULL && strchr("456", msg[0]) != NULL) + if (!heldmsg && CurEnv->e_xfp != NULL && strchr("45", msg[0]) != NULL) fprintf(CurEnv->e_xfp, "%s\n", msg); + if (msgcode == '8') + msg[0] = '0'; + /* output to channel if appropriate */ - if (holdmsg || (!Verbose && msg[0] == '0')) + if (!Verbose && msg[0] == '0') return; - - /* map warnings to something SMTP can handle */ - if (msg[0] == '6') - msg[0] = '5'; + if (holdmsg) + { + /* save for possible future display */ + msg[0] = msgcode; + strcpy(HeldMessageBuf, msg); + return; + } (void) fflush(stdout); @@ -334,7 +431,7 @@ putoutmsg(msg, holdmsg) "%s: SYSERR: putoutmsg (%s): error on output channel sending \"%s\": %s", CurEnv->e_id == NULL ? "NOQUEUE" : CurEnv->e_id, CurHostName == NULL ? "NO-HOST" : CurHostName, - msg, errstring(errno)); + shortenstring(msg, 203), errstring(errno)); #endif } /* @@ -350,13 +447,14 @@ putoutmsg(msg, holdmsg) ** Sets the fatal error bit in the envelope as appropriate. */ +void puterrmsg(msg) char *msg; { char msgcode = msg[0]; /* output the message as usual */ - putoutmsg(msg, HoldErrs); + putoutmsg(msg, HoldErrs, FALSE); /* signal the error */ Errors++; @@ -392,14 +490,16 @@ puterrmsg(msg) static void fmtmsg(eb, to, num, eno, fmt, ap) register char *eb; - char *to; - char *num; + const char *to; + const char *num; int eno; - char *fmt; + const char *fmt; va_list ap; { char del; char *meb; + int l; + int spaceleft = sizeof MsgBuf; /* output the reply code */ if (isdigit(fmt[0]) && isdigit(fmt[1]) && isdigit(fmt[2])) @@ -413,18 +513,23 @@ fmtmsg(eb, to, num, eno, fmt, ap) del = ' '; (void) sprintf(eb, "%3.3s%c", num, del); eb += 4; + spaceleft -= 4; /* output the file name and line number */ if (FileName != NULL) { - (void) sprintf(eb, "%s: line %d: ", FileName, LineNumber); - eb += strlen(eb); + (void) snprintf(eb, spaceleft, "%s: line %d: ", + shortenstring(FileName, 83), LineNumber); + eb += (l = strlen(eb)); + spaceleft -= l; } /* output the "to" person */ if (to != NULL && to[0] != '\0') { - (void) sprintf(eb, "%s... ", shortenstring(to, 203)); + (void) snprintf(eb, spaceleft, "%s... ", + shortenstring(to, 203)); + spaceleft -= strlen(eb); while (*eb != '\0') *eb++ &= 0177; } @@ -432,23 +537,50 @@ fmtmsg(eb, to, num, eno, fmt, ap) meb = eb; /* output the message */ - (void) vsprintf(eb, fmt, ap); + (void) vsnprintf(eb, spaceleft, fmt, ap); + spaceleft -= strlen(eb); while (*eb != '\0') *eb++ &= 0177; /* output the error code, if any */ if (eno != 0) - { - (void) sprintf(eb, ": %s", errstring(eno)); - eb += strlen(eb); - } + (void) snprintf(eb, spaceleft, ": %s", errstring(eno)); +} +/* +** BUFFER_ERRORS -- arrange to buffer future error messages +** +** Parameters: +** none +** +** Returns: +** none. +*/ - if (num[0] == '5' || (CurEnv->e_message == NULL && num[0] == '4')) - { - if (CurEnv->e_message != NULL) - free(CurEnv->e_message); - CurEnv->e_message = newstr(meb); - } +void +buffer_errors() +{ + HeldMessageBuf[0] = '\0'; + HoldErrs = TRUE; +} +/* +** FLUSH_ERRORS -- flush the held error message buffer +** +** Parameters: +** print -- if set, print the message, otherwise just +** delete it. +** +** Returns: +** none. +*/ + +void +flush_errors(print) + bool print; +{ + if (print && HeldMessageBuf[0] != '\0') + putoutmsg(HeldMessageBuf, FALSE, TRUE); + HeldMessageBuf[0] = '\0'; + HoldErrs = FALSE; } /* ** ERRSTRING -- return string description of error code @@ -505,13 +637,15 @@ errstring(errnum) case EHOSTDOWN: if (CurHostName == NULL) break; - (void) sprintf(buf, "Host %s is down", CurHostName); + (void) sprintf(buf, "Host %s is down", + shortenstring(CurHostName, 203)); return (buf); case ECONNREFUSED: if (CurHostName == NULL) break; - (void) sprintf(buf, "Connection refused by %s", CurHostName); + (void) sprintf(buf, "Connection refused by %s", + shortenstring(CurHostName, 203)); return (buf); # endif diff --git a/usr.sbin/sendmail/src/headers.c b/usr.sbin/sendmail/src/headers.c index a55ba95c7ee59..3d20635e89319 100644 --- a/usr.sbin/sendmail/src/headers.c +++ b/usr.sbin/sendmail/src/headers.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1983 Eric P. Allman + * Copyright (c) 1983, 1995 Eric P. Allman * Copyright (c) 1988, 1993 * The Regents of the University of California. All rights reserved. * @@ -33,7 +33,7 @@ */ #ifndef lint -static char sccsid[] = "@(#)headers.c 8.32 (Berkeley) 4/14/94"; +static char sccsid[] = "@(#)headers.c 8.82.1.1 (Berkeley) 2/18/96"; #endif /* not lint */ # include <errno.h> @@ -47,6 +47,7 @@ static char sccsid[] = "@(#)headers.c 8.32 (Berkeley) 4/14/94"; ** Parameters: ** line -- header as a text line. ** def -- if set, this is a default value. +** hdrp -- a pointer to the place to save the header. ** e -- the envelope including this header. ** ** Returns: @@ -57,9 +58,11 @@ static char sccsid[] = "@(#)headers.c 8.32 (Berkeley) 4/14/94"; ** Contents of 'line' are destroyed. */ -chompheader(line, def, e) +int +chompheader(line, def, hdrp, e) char *line; bool def; + HDR **hdrp; register ENVELOPE *e; { register char *p; @@ -69,11 +72,20 @@ chompheader(line, def, e) char *fvalue; struct hdrinfo *hi; bool cond = FALSE; + bool headeronly; BITMAP mopts; - char buf[MAXNAME]; + char buf[MAXNAME + 1]; if (tTd(31, 6)) - printf("chompheader: %s\n", line); + { + printf("chompheader: "); + xputs(line); + printf("\n"); + } + + headeronly = hdrp != NULL; + if (!headeronly) + hdrp = &e->e_header; /* strip off options */ clrbitmap(mopts); @@ -91,7 +103,7 @@ chompheader(line, def, e) p = q; } else - usrerr("553 header syntax error, line \"%s\"", line); + syserr("553 header syntax error, line \"%s\"", line); cond = TRUE; } @@ -114,6 +126,10 @@ chompheader(line, def, e) if (*fvalue == ' ') fvalue++; + /* security scan: long field names are end-of-header */ + if (strlen(fname) > 100) + return H_EOH; + /* see if it is a known type */ for (hi = HdrInfo; hi->hi_field != NULL; hi++) { @@ -126,17 +142,38 @@ chompheader(line, def, e) if (hi->hi_field == NULL) printf("no header match\n"); else - printf("header match, hi_flags=%o\n", hi->hi_flags); + printf("header match, hi_flags=%x\n", hi->hi_flags); } /* see if this is a resent message */ - if (!def && bitset(H_RESENT, hi->hi_flags)) + if (!def && !headeronly && bitset(H_RESENT, hi->hi_flags)) e->e_flags |= EF_RESENT; + /* if this is an Errors-To: header keep track of it now */ + if (UseErrorsTo && !def && !headeronly && + bitset(H_ERRORSTO, hi->hi_flags)) + (void) sendtolist(fvalue, NULLADDR, &e->e_errorqueue, 0, e); + /* if this means "end of header" quit now */ if (bitset(H_EOH, hi->hi_flags)) return (hi->hi_flags); +#ifdef LOTUS_NOTES_HACK + /* + ** Horrible hack to work around problem with Lotus Notes SMTP + ** mail gateway, which generates From: headers with newlines in + ** them and the <address> on the second line. Although this is + ** legal RFC 822, many MUAs don't handle this properly and thus + ** never find the actual address. + */ + + if (bitset(H_FROM, hi->hi_flags) && SingleLineFromHeader) + { + while ((p = strchr(fvalue, '\n')) != NULL) + *p = ' '; + } +#endif + /* ** Drop explicit From: if same as what we would generate. ** This is to make MH (which doesn't always give a full name) @@ -146,7 +183,8 @@ chompheader(line, def, e) p = "resent-from"; if (!bitset(EF_RESENT, e->e_flags)) p += 7; - if (!def && !bitset(EF_QUEUERUN, e->e_flags) && strcasecmp(fname, p) == 0) + if (!def && !headeronly && !bitset(EF_QUEUERUN, e->e_flags) && + strcasecmp(fname, p) == 0) { if (tTd(31, 2)) { @@ -158,7 +196,7 @@ chompheader(line, def, e) strcmp(fvalue, e->e_from.q_user) == 0)) return (hi->hi_flags); #ifdef MAYBENEXTRELEASE /* XXX UNTESTED XXX UNTESTED XXX UNTESTED XXX */ -#ifdef USERDB +#if USERDB else { auto ADDRESS a; @@ -183,13 +221,13 @@ chompheader(line, def, e) SuprErrs = TRUE; fancy = crackaddr(fvalue); if (parseaddr(fvalue, &a, RF_COPYNONE, '\0', NULL, e) != NULL && - a.q_mailer == LocalMailer && + bitnset(M_CHECKUDB, a.q_mailer->m_flags) && (p = udbsender(a.q_user)) != NULL) { char *oldg = macvalue('g', e); define('g', p, e); - expand(fancy, buf, &buf[sizeof buf], e); + expand(fancy, buf, sizeof buf, e); define('g', oldg, e); fvalue = buf; } @@ -200,12 +238,20 @@ chompheader(line, def, e) } /* delete default value for this header */ - for (hp = &e->e_header; (h = *hp) != NULL; hp = &h->h_link) + for (hp = hdrp; (h = *hp) != NULL; hp = &h->h_link) { if (strcasecmp(fname, h->h_field) == 0 && bitset(H_DEFAULT, h->h_flags) && !bitset(H_FORCE, h->h_flags)) + { h->h_value = NULL; + if (!cond) + { + /* copy conditions from default case */ + bcopy((char *)h->h_mflags, (char *)mopts, + sizeof mopts); + } + } } /* create a new node */ @@ -222,7 +268,7 @@ chompheader(line, def, e) h->h_flags |= H_CHECK; /* hack to see if this is a new format message */ - if (!def && bitset(H_RCPT|H_FROM, h->h_flags) && + if (!def && !headeronly && bitset(H_RCPT|H_FROM, h->h_flags) && (strchr(fvalue, ',') != NULL || strchr(fvalue, '(') != NULL || strchr(fvalue, '<') != NULL || strchr(fvalue, ';') != NULL)) { @@ -239,7 +285,7 @@ chompheader(line, def, e) ** Parameters: ** field -- the name of the header field. ** value -- the value of the field. -** e -- the envelope to add them to. +** hp -- an indirect pointer to the header structure list. ** ** Returns: ** none. @@ -248,10 +294,11 @@ chompheader(line, def, e) ** adds the field on the list of headers for this envelope. */ -addheader(field, value, e) +void +addheader(field, value, hdrlist) char *field; char *value; - ENVELOPE *e; + HDR **hdrlist; { register HDR *h; register struct hdrinfo *hi; @@ -265,7 +312,7 @@ addheader(field, value, e) } /* find current place in list -- keep back pointer? */ - for (hp = &e->e_header; (h = *hp) != NULL; hp = &h->h_link) + for (hp = hdrlist; (h = *hp) != NULL; hp = &h->h_link) { if (strcasecmp(field, h->h_field) == 0) break; @@ -288,7 +335,7 @@ addheader(field, value, e) ** ** Parameters: ** field -- the field name. -** e -- the envelope containing the header. +** header -- the header list. ** ** Returns: ** pointer to the value part. @@ -299,13 +346,13 @@ addheader(field, value, e) */ char * -hvalue(field, e) +hvalue(field, header) char *field; - register ENVELOPE *e; + HDR *header; { register HDR *h; - for (h = e->e_header; h != NULL; h = h->h_link) + for (h = header; h != NULL; h = h->h_link) { if (!bitset(H_DEFAULT, h->h_flags) && strcasecmp(h->h_field, field) == 0) @@ -319,11 +366,17 @@ hvalue(field, e) ** A line is a header if it has a single word followed by ** optional white space followed by a colon. ** +** Header fields beginning with two dashes, although technically +** permitted by RFC822, are automatically rejected in order +** to make MIME work out. Without this we could have a technically +** legal header such as ``--"foo:bar"'' that would also be a legal +** MIME separator. +** ** Parameters: -** s -- string to check for possible headerness. +** h -- string to check for possible headerness. ** ** Returns: -** TRUE if s is a header. +** TRUE if h is a header. ** FALSE otherwise. ** ** Side Effects: @@ -331,12 +384,20 @@ hvalue(field, e) */ bool -isheader(s) - register char *s; +isheader(h) + char *h; { + register char *s = h; + + if (s[0] == '-' && s[1] == '-') + return FALSE; + while (*s > ' ' && *s != ':' && *s != '\0') s++; + if (h == s) + return FALSE; + /* following technically violates RFC822 */ while (isascii(*s) && isspace(*s)) s++; @@ -349,7 +410,9 @@ isheader(s) ** Parameters: ** e -- the envelope to process. ** full -- if set, do full processing (e.g., compute -** message priority). +** message priority). This should not be set +** when reading a queue file because some info +** needed to compute the priority is wrong. ** ** Returns: ** none. @@ -360,6 +423,7 @@ isheader(s) ** Aborts the message if the hop count is exceeded. */ +void eatheader(e, full) register ENVELOPE *e; bool full; @@ -382,28 +446,42 @@ eatheader(e, full) define('u', NULL, e); /* full name of from person */ - p = hvalue("full-name", e); + p = hvalue("full-name", e->e_header); if (p != NULL) define('x', p, e); if (tTd(32, 1)) printf("----- collected header -----\n"); - msgid = "<none>"; + msgid = NULL; for (h = e->e_header; h != NULL; h = h->h_link) { + if (tTd(32, 1)) + printf("%s: ", h->h_field); if (h->h_value == NULL) { if (tTd(32, 1)) - printf("%s: <NULL>\n", h->h_field); + printf("<NULL>\n"); continue; } /* do early binding */ if (bitset(H_DEFAULT, h->h_flags)) { - expand(h->h_value, buf, &buf[sizeof buf], e); + if (tTd(32, 1)) + { + printf("("); + xputs(h->h_value); + printf(") "); + } + expand(h->h_value, buf, sizeof buf, e); if (buf[0] != '\0') { + if (bitset(H_FROM, h->h_flags)) + { + extern char *crackaddr(); + + expand(crackaddr(buf), buf, sizeof buf, e); + } h->h_value = newstr(buf); h->h_flags &= ~H_DEFAULT; } @@ -411,7 +489,6 @@ eatheader(e, full) if (tTd(32, 1)) { - printf("%s: ", h->h_field); xputs(h->h_value); printf("\n"); } @@ -428,7 +505,7 @@ eatheader(e, full) int saveflags = e->e_flags; (void) sendtolist(h->h_value, NULLADDR, - &e->e_sendqueue, e); + &e->e_sendqueue, 0, e); /* delete fatal errors generated by this address */ if (!GrabTo && !bitset(EF_FATALERRS, saveflags)) @@ -436,7 +513,10 @@ eatheader(e, full) } /* save the message-id for logging */ - if (full && strcasecmp(h->h_field, "message-id") == 0) + p = "resent-message-id"; + if (!bitset(EF_RESENT, e->e_flags)) + p += 7; + if (strcasecmp(h->h_field, p) == 0) { msgid = h->h_value; while (isascii(*msgid) && isspace(*msgid)) @@ -446,11 +526,6 @@ eatheader(e, full) /* see if this is a return-receipt header */ if (bitset(H_RECEIPTTO, h->h_flags)) e->e_receiptto = h->h_value; - - /* see if this is an errors-to header */ - if (UseErrorsTo && bitset(H_ERRORSTO, h->h_flags)) - (void) sendtolist(h->h_value, NULLADDR, - &e->e_errorqueue, e); } if (tTd(32, 1)) printf("----------------------------\n"); @@ -464,21 +539,60 @@ eatheader(e, full) e->e_hopcount = hopcnt; /* message priority */ - p = hvalue("precedence", e); + p = hvalue("precedence", e->e_header); if (p != NULL) e->e_class = priencode(p); + if (e->e_class < 0) + e->e_timeoutclass = TOC_NONURGENT; + else if (e->e_class > 0) + e->e_timeoutclass = TOC_URGENT; if (full) + { e->e_msgpriority = e->e_msgsize - e->e_class * WkClassFact + e->e_nrcpts * WkRecipFact; + } + + /* message timeout priority */ + p = hvalue("priority", e->e_header); + if (p != NULL) + { + /* (this should be in the configuration file) */ + if (strcasecmp(p, "urgent")) + e->e_timeoutclass = TOC_URGENT; + else if (strcasecmp(p, "normal")) + e->e_timeoutclass = TOC_NORMAL; + else if (strcasecmp(p, "non-urgent")) + e->e_timeoutclass = TOC_NONURGENT; + } /* date message originated */ - p = hvalue("posted-date", e); + p = hvalue("posted-date", e->e_header); if (p == NULL) - p = hvalue("date", e); + p = hvalue("date", e->e_header); if (p != NULL) define('a', p, e); + /* check to see if this is a MIME message */ + if ((e->e_bodytype != NULL && + strcasecmp(e->e_bodytype, "8BITMIME") == 0) || + hvalue("MIME-Version", e->e_header) != NULL) + { + e->e_flags |= EF_IS_MIME; + if (HasEightBits) + e->e_bodytype = "8BITMIME"; + } + else if ((p = hvalue("Content-Type", e->e_header)) != NULL) + { + /* this may be an RFC 1049 message */ + p = strpbrk(p, ";/"); + if (p == NULL || *p == ';') + { + /* yep, it is */ + e->e_flags |= EF_DONT_MIME; + } + } + /* ** From person in antiquated ARPANET mode ** required by UK Grey Book e-mail gateways (sigh) @@ -493,7 +607,7 @@ eatheader(e, full) if (bitset(H_FROM, hi->hi_flags) && (!bitset(H_RESENT, hi->hi_flags) || bitset(EF_RESENT, e->e_flags)) && - (p = hvalue(hi->hi_field, e)) != NULL) + (p = hvalue(hi->hi_field, e->e_header)) != NULL) break; } if (hi->hi_field != NULL) @@ -510,7 +624,7 @@ eatheader(e, full) */ # ifdef LOG - if (full && LogLevel > 4) + if (bitset(EF_LOGSENDER, e->e_flags) && LogLevel > 4) logsender(e, msgid); # endif /* LOG */ e->e_flags &= ~EF_LOGSENDER; @@ -526,6 +640,7 @@ eatheader(e, full) ** none */ +void logsender(e, msgid) register ENVELOPE *e; char *msgid; @@ -534,8 +649,23 @@ logsender(e, msgid) char *name; register char *sbp; register char *p; - char hbuf[MAXNAME]; - char sbuf[MAXLINE]; + int l; + char hbuf[MAXNAME + 1]; + char sbuf[MAXLINE + 1]; + char mbuf[MAXNAME + 1]; + + /* don't allow newlines in the message-id */ + if (msgid != NULL) + { + l = strlen(msgid); + if (l > sizeof mbuf - 1) + l = sizeof mbuf - 1; + bcopy(msgid, mbuf, l); + mbuf[l] = '\0'; + p = mbuf; + while ((p = strchr(p, '\n')) != NULL) + *p++ = ' '; + } if (bitset(EF_RESPONSE, e->e_flags)) name = "[RESPONSE]"; @@ -552,7 +682,7 @@ logsender(e, msgid) if (RealHostAddr.sa.sa_family != 0) { p = &hbuf[strlen(hbuf)]; - (void) sprintf(p, " (%s)", + (void) sprintf(p, " (%.100s)", anynet_ntoa(&RealHostAddr)); } } @@ -561,12 +691,12 @@ logsender(e, msgid) # 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); + e->e_from.q_paddr == NULL ? "<NONE>" : 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); + sprintf(sbp, ", msgid=%.100s", mbuf); sbp += strlen(sbp); } if (e->e_bodytype != NULL) @@ -577,33 +707,35 @@ logsender(e, msgid) p = macvalue('r', e); if (p != NULL) (void) sprintf(sbp, ", proto=%.20s", p); - syslog(LOG_INFO, "%s: %s, relay=%s", + syslog(LOG_INFO, "%s: %.850s, relay=%.100s", 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)); + e->e_id, e->e_from.q_paddr == NULL ? "<NONE>" : + 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); + syslog(LOG_INFO, "%s: msgid=%s", + e->e_id, shortenstring(mbuf, 83)); sbp = sbuf; sprintf(sbp, "%s:", e->e_id); sbp += strlen(sbp); if (e->e_bodytype != NULL) { - sprintf(sbp, " bodytype=%s,", e->e_bodytype); + sprintf(sbp, " bodytype=%.20s,", e->e_bodytype); sbp += strlen(sbp); } p = macvalue('r', e); if (p != NULL) { - sprintf(sbp, " proto=%s,", p); + sprintf(sbp, " proto=%.20s,", p); sbp += strlen(sbp); } - syslog(LOG_INFO, "%s relay=%s", sbuf, name); + syslog(LOG_INFO, "%.400s relay=%.100s", sbuf, name); # endif # endif } @@ -620,6 +752,7 @@ logsender(e, msgid) ** none. */ +int priencode(p) char *p; { @@ -678,9 +811,12 @@ crackaddr(addr) bool putgmac = FALSE; bool quoteit = FALSE; bool gotangle = FALSE; + bool gotcolon = FALSE; register char *bp; char *buflim; - static char buf[MAXNAME]; + char *bufhead; + char *addrhead; + static char buf[MAXNAME + 1]; if (tTd(33, 1)) printf("crackaddr(%s)\n", addr); @@ -694,9 +830,9 @@ crackaddr(addr) ** adjusted later if we find them. */ - bp = buf; + bp = bufhead = buf; buflim = &buf[sizeof buf - 5]; - p = addr; + p = addrhead = addr; copylev = anglelev = realanglelev = cmtlev = realcmtlev = 0; qmode = realqmode = FALSE; @@ -780,8 +916,80 @@ crackaddr(addr) bp--; } + /* check for group: list; syntax */ + if (c == ':' && anglelev <= 0 && !gotcolon && !ColonOkInAddr) + { + register char *q; + + if (*p == ':') + { + /* special case -- :: syntax */ + if (cmtlev <= 0 && !qmode) + quoteit = TRUE; + if (copylev > 0 && !skipping) + { + *bp++ = c; + *bp++ = c; + } + p++; + goto putg; + } + + gotcolon = TRUE; + + bp = bufhead; + if (quoteit) + { + *bp++ = '"'; + + /* back up over the ':' and any spaces */ + --p; + while (isascii(*--p) && isspace(*p)) + continue; + p++; + } + for (q = addrhead; q < p; ) + { + c = *q++; + if (bp < buflim) + { + if (quoteit && c == '"') + *bp++ = '\\'; + *bp++ = c; + } + } + if (quoteit) + { + if (bp == &bufhead[1]) + bp--; + else + *bp++ = '"'; + while ((c = *p++) != ':') + { + if (bp < buflim) + *bp++ = c; + } + *bp++ = c; + } + + /* any trailing white space is part of group: */ + while (isascii(*p) && isspace(*p) && bp < buflim) + *bp++ = *p++; + copylev = 0; + putgmac = quoteit = FALSE; + bufhead = bp; + addrhead = p; + continue; + } + + if (c == ';' && copylev <= 0 && !ColonOkInAddr) + { + if (bp < buflim) + *bp++ = c; + } + /* check for characters that may have to be quoted */ - if (strchr(".'@,;:\\()[]", c) != NULL) + if (strchr(MustQuoteChars, c) != NULL) { /* ** If these occur as the phrase part of a <> @@ -809,7 +1017,7 @@ crackaddr(addr) if (!skipping) realanglelev = 1; - bp = buf; + bp = bufhead; if (quoteit) { *bp++ = '"'; @@ -820,7 +1028,7 @@ crackaddr(addr) continue; p++; } - for (q = addr; q < p; ) + for (q = addrhead; q < p; ) { c = *q++; if (bp < buflim) @@ -901,6 +1109,7 @@ crackaddr(addr) ** ** Parameters: ** mci -- the connection information. +** h -- the header to put. ** e -- envelope to use. ** ** Returns: @@ -917,27 +1126,45 @@ crackaddr(addr) # define MAX(a,b) (((a)>(b))?(a):(b)) #endif -putheader(mci, e) +void +putheader(mci, h, e) register MCI *mci; + register HDR *h; register ENVELOPE *e; { char buf[MAX(MAXLINE,BUFSIZ)]; - register HDR *h; char obuf[MAXLINE]; if (tTd(34, 1)) printf("--- putheader, mailer = %s ---\n", mci->mci_mailer->m_name); - for (h = e->e_header; h != NULL; h = h->h_link) + mci->mci_flags |= MCIF_INHEADER; + for (; h != NULL; h = h->h_link) { - register char *p; + register char *p = h->h_value; extern bool bitintersect(); if (tTd(34, 11)) { printf(" %s: ", h->h_field); - xputs(h->h_value); + xputs(p); + } + + /* suppress Content-Transfer-Encoding: if we are MIMEing */ + if (bitset(H_CTE, h->h_flags) && + bitset(MCIF_CVT8TO7|MCIF_INMIME, mci->mci_flags)) + { + if (tTd(34, 11)) + printf(" (skipped (content-transfer-encoding))\n"); + continue; + } + + if (bitset(MCIF_INMIME, mci->mci_flags)) + { + if (tTd(34, 11)) + printf("\n"); + goto vanilla; } if (bitset(H_CHECK|H_ACHECK, h->h_flags) && @@ -966,10 +1193,9 @@ putheader(mci, e) } /* macro expand value if generated internally */ - p = h->h_value; if (bitset(H_DEFAULT, h->h_flags)) { - expand(p, buf, &buf[sizeof buf], e); + expand(p, buf, sizeof buf, e); p = buf; if (p == NULL || *p == '\0') { @@ -979,6 +1205,23 @@ putheader(mci, e) } } + if (bitset(H_BCC, h->h_flags)) + { + /* Bcc: field -- either truncate or delete */ + if (bitset(EF_DELETE_BCC, e->e_flags)) + { + if (tTd(34, 11)) + printf(" (skipped -- bcc)\n"); + } + else + { + /* no other recipient headers: truncate value */ + (void) sprintf(obuf, "%s:", h->h_field); + putline(obuf, mci); + } + continue; + } + if (tTd(34, 11)) printf("\n"); @@ -995,21 +1238,53 @@ putheader(mci, e) { /* vanilla header line */ register char *nlp; + register char *obp; - (void) sprintf(obuf, "%s: ", h->h_field); +vanilla: + (void) sprintf(obuf, "%.200s: ", h->h_field); + obp = obuf + strlen(obuf); while ((nlp = strchr(p, '\n')) != NULL) { + *nlp = '\0'; - (void) strcat(obuf, p); + sprintf(obp, "%.*s", + sizeof obuf - (obp - obuf) - 1, p); *nlp = '\n'; putline(obuf, mci); p = ++nlp; - obuf[0] = '\0'; + obp = obuf; + if (*p != ' ' && *p != '\t') + *obp++ = ' '; } - (void) strcat(obuf, p); + sprintf(obp, "%.*s", sizeof obuf - (obp - obuf) - 1, p); + putline(obuf, mci); + } + } + + /* + ** If we are converting this to a MIME message, add the + ** MIME headers. + */ + +#if MIME8TO7 + if (bitset(MM_MIME8BIT, MimeMode) && + bitset(EF_HAS8BIT, e->e_flags) && + !bitset(EF_DONT_MIME, e->e_flags) && + !bitnset(M_8BITS, mci->mci_mailer->m_flags) && + !bitset(MCIF_CVT8TO7, mci->mci_flags)) + { + if (hvalue("MIME-Version", e->e_header) == NULL) + putline("MIME-Version: 1.0", mci); + if (hvalue("Content-Type", e->e_header) == NULL) + { + sprintf(obuf, "Content-Type: text/plain; charset=%s", + defcharset(e)); putline(obuf, mci); } + if (hvalue("Content-Transfer-Encoding", e->e_header) == NULL) + putline("Content-Transfer-Encoding: 8bit", mci); } +#endif } /* ** COMMAIZE -- output a header field, making a comma-translated list. @@ -1051,7 +1326,7 @@ commaize(h, p, oldstyle, mci, e) printf("commaize(%s: %s)\n", h->h_field, p); obp = obuf; - (void) sprintf(obp, "%s: ", h->h_field); + (void) sprintf(obp, "%.200s: ", h->h_field); opos = strlen(h->h_field) + 2; obp += opos; omax = mci->mci_mailer->m_linelimit - 2; @@ -1088,7 +1363,7 @@ commaize(h, p, oldstyle, mci, e) char pvpbuf[PSBUFSIZE]; (void) prescan(p, oldstyle ? ' ' : ',', pvpbuf, - sizeof pvpbuf, &oldp); + sizeof pvpbuf, &oldp, NULL); p = oldp; /* look to see if we have an at sign */ @@ -1119,6 +1394,18 @@ commaize(h, p, oldstyle, mci, e) flags = RF_HEADERADDR|RF_ADDDOMAIN; if (bitset(H_FROM, h->h_flags)) flags |= RF_SENDERADDR; +#if USERDB + else if (e->e_from.q_mailer != NULL && + bitnset(M_UDBRECIPIENT, e->e_from.q_mailer->m_flags)) + { + extern char *udbsender(); + char *q; + + q = udbsender(name); + if (q != NULL) + name = q; + } +#endif stat = EX_OK; name = remotename(name, mci->mci_mailer, flags, &stat, e); if (*name == '\0') @@ -1152,7 +1439,7 @@ commaize(h, p, oldstyle, mci, e) firstone = FALSE; *p = savechar; } - (void) strcpy(obp, "\n"); + *obp = '\0'; putline(obuf, mci); } /* diff --git a/usr.sbin/sendmail/src/macro.c b/usr.sbin/sendmail/src/macro.c index 8a8a90b4f0f94..94ef834bb082c 100644 --- a/usr.sbin/sendmail/src/macro.c +++ b/usr.sbin/sendmail/src/macro.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1983 Eric P. Allman + * Copyright (c) 1983, 1995 Eric P. Allman * Copyright (c) 1988, 1993 * The Regents of the University of California. All rights reserved. * @@ -33,19 +33,22 @@ */ #ifndef lint -static char sccsid[] = "@(#)macro.c 8.3 (Berkeley) 2/7/94"; +static char sccsid[] = "@(#)macro.c 8.13 (Berkeley) 7/10/95"; #endif /* not lint */ # include "sendmail.h" +char *MacroName[256]; /* macro id to name table */ +int NextMacroId = 0240; /* codes for long named macros */ + + /* ** EXPAND -- macro expand a string using $x escapes. ** ** Parameters: ** s -- the string to expand. ** buf -- the place to put the expansion. -** buflim -- the buffer limit, i.e., the address -** of the last usable position in buf. +** bufsize -- the size of the buffer. ** e -- envelope in which to work. ** ** Returns: @@ -56,10 +59,10 @@ static char sccsid[] = "@(#)macro.c 8.3 (Berkeley) 2/7/94"; */ void -expand(s, buf, buflim, e) +expand(s, buf, bufsize, e) register char *s; register char *buf; - char *buflim; + size_t bufsize; register ENVELOPE *e; { register char *xp; @@ -115,7 +118,7 @@ expand(s, buf, buflim, e) continue; case MACROEXPAND: /* macro interpolation */ - c = *++s & 0177; + c = *++s & 0377; if (c != '\0') q = macvalue(c, e); else @@ -160,14 +163,14 @@ expand(s, buf, buflim, e) /* recurse as appropriate */ if (recurse) { - expand(xbuf, buf, buflim, e); + expand(xbuf, buf, bufsize, e); return; } /* copy results out */ - i = buflim - buf - 1; - if (i > xp - xbuf) - i = xp - xbuf; + i = xp - xbuf; + if (i >= bufsize) + i = bufsize - 1; bcopy(xbuf, buf, i); buf[i] = '\0'; } @@ -242,11 +245,12 @@ define(n, v, e) { if (tTd(35, 9)) { - printf("define(%c as ", n); + printf("%sdefine(%s as ", + (e->e_macro[n & 0377] == NULL) ? "" : "re", macname(n)); xputs(v); printf(")\n"); } - e->e_macro[n & 0177] = v; + e->e_macro[n & 0377] = v; } /* ** MACVALUE -- return uninterpreted value of a macro. @@ -266,7 +270,7 @@ macvalue(n, e) int n; register ENVELOPE *e; { - n &= 0177; + n &= 0377; while (e != NULL) { register char *p = e->e_macro[n]; @@ -277,3 +281,161 @@ macvalue(n, e) } return (NULL); } +/* +** MACNAME -- return the name of a macro given its internal id +** +** Parameter: +** n -- the id of the macro +** +** Returns: +** The name of n. +** +** Side Effects: +** none. +*/ + +char * +macname(n) + int n; +{ + static char mbuf[2]; + + n &= 0377; + if (bitset(0200, n)) + { + char *p = MacroName[n]; + + if (p != NULL) + return p; + return "***UNDEFINED MACRO***"; + } + mbuf[0] = n; + mbuf[1] = '\0'; + return mbuf; +} +/* +** MACID -- return id of macro identified by its name +** +** Parameters: +** p -- pointer to name string -- either a single +** character or {name}. +** ep -- filled in with the pointer to the byte +** after the name. +** +** Returns: +** The internal id code for this macro. This will +** fit into a single byte. +** +** Side Effects: +** If this is a new macro name, a new id is allocated. +*/ + +int +macid(p, ep) + register char *p; + char **ep; +{ + int mid; + register char *bp; + char mbuf[21]; + + if (tTd(35, 14)) + { + printf("macid("); + xputs(p); + printf(") => "); + } + + if (*p == '\0' || (p[0] == '{' && p[1] == '}')) + { + syserr("Name required for macro/class"); + if (ep != NULL) + *ep = p; + if (tTd(35, 14)) + printf("NULL\n"); + return '\0'; + } + if (*p != '{') + { + /* the macro is its own code */ + if (ep != NULL) + *ep = p + 1; + if (tTd(35, 14)) + printf("%c\n", *p); + return *p; + } + bp = mbuf; + while (*++p != '\0' && *p != '}' && bp < &mbuf[sizeof mbuf]) + { + if (isascii(*p) && (isalnum(*p) || *p == '_')) + *bp++ = *p; + else + syserr("Invalid macro/class character %c", *p); + } + *bp = '\0'; + mid = -1; + if (*p == '\0') + { + syserr("Unbalanced { on %s", mbuf); /* missing } */ + } + else if (*p != '}') + { + syserr("Macro/class name ({%s}) too long (%d chars max)", + mbuf, sizeof mbuf - 1); + } + else if (mbuf[1] == '\0') + { + /* ${x} == $x */ + mid = mbuf[0]; + p++; + } + else + { + register STAB *s; + + s = stab(mbuf, ST_MACRO, ST_ENTER); + if (s->s_macro != 0) + mid = s->s_macro; + else + { + if (NextMacroId > 0377) + { + syserr("Macro/class {%s}: too many long names", mbuf); + s->s_macro = -1; + } + else + { + MacroName[NextMacroId] = s->s_name; + s->s_macro = mid = NextMacroId++; + } + } + p++; + } + if (ep != NULL) + *ep = p; + if (tTd(35, 14)) + printf("0x%x\n", mid); + return mid; +} +/* +** WORDINCLASS -- tell if a word is in a specific class +** +** Parameters: +** str -- the name of the word to look up. +** cl -- the class name. +** +** Returns: +** TRUE if str can be found in cl. +** FALSE otherwise. +*/ + +bool +wordinclass(str, cl) + char *str; + int cl; +{ + register STAB *s; + + s = stab(str, ST_CLASS, ST_FIND); + return s != NULL && bitnset(cl & 0xff, s->s_class); +} diff --git a/usr.sbin/sendmail/src/main.c b/usr.sbin/sendmail/src/main.c index bae41d5f67d63..1b2b9da15023b 100644 --- a/usr.sbin/sendmail/src/main.c +++ b/usr.sbin/sendmail/src/main.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1983 Eric P. Allman + * Copyright (c) 1983, 1995 Eric P. Allman * Copyright (c) 1988, 1993 * The Regents of the University of California. All rights reserved. * @@ -39,17 +39,15 @@ static char copyright[] = #endif /* not lint */ #ifndef lint -static char sccsid[] = "@(#)main.c 8.55.1.7 (Berkeley) 3/5/95"; +static char sccsid[] = "@(#)main.c 8.162 (Berkeley) 11/18/95"; #endif /* not lint */ #define _DEFINE #include "sendmail.h" #if NAMED_BIND -#include <arpa/nameser.h> #include <resolv.h> #endif -#include <pwd.h> # ifdef lint char edata, end; @@ -94,21 +92,9 @@ ENVELOPE BlankEnvelope; /* a "blank" envelope */ ENVELOPE MainEnvelope; /* the envelope around the basic letter */ ADDRESS NullAddress = /* a null address */ { "", "", NULL, "" }; -char *UserEnviron[MAXUSERENVIRON + 2]; - /* saved user environment */ -char RealUserName[256]; /* the actual user id on this host */ char *CommandLineArgs; /* command line args for pid file */ bool Warn_Q_option = FALSE; /* warn about Q option use */ - -/* -** Pointers for setproctitle. -** This allows "ps" listings to give more useful information. -*/ - -# ifdef SETPROCTITLE -char **Argv = NULL; /* pointer to argument vector */ -char *LastArgv = NULL; /* end of argv */ -# endif /* SETPROCTITLE */ +char **SaveArgv; /* argument vector for re-execing */ static void obsolete(); @@ -118,8 +104,9 @@ ERROR %%%% Cannot have daemon mode without SMTP %%%% ERROR #endif /* SMTP */ #endif /* DAEMON */ -#define MAXCONFIGLEVEL 5 /* highest config version level known */ +#define MAXCONFIGLEVEL 6 /* highest config version level known */ +int main(argc, argv, envp) int argc; char **argv; @@ -127,7 +114,6 @@ main(argc, argv, envp) { register char *p; char **av; - extern int finis(); extern char Version[]; char *ep, *from; typedef int (*fnptr)(); @@ -139,22 +125,25 @@ main(argc, argv, envp) bool warn_C_flag = FALSE; char warn_f_flag = '\0'; static bool reenter = FALSE; - char *argv0 = argv[0]; struct passwd *pw; struct stat stb; + struct hostent *hp; char jbuf[MAXHOSTNAMELEN]; /* holds MyHostName */ + static char rnamebuf[MAXNAME]; /* holds RealUserName */ extern int DtableSize; extern int optind; + extern int opterr; extern time_t convtime(); - extern putheader(), putbody(); extern void intsig(); - extern char **myhostname(); + extern struct hostent *myhostname(); extern char *arpadate(); extern char *getauthinfo(); extern char *getcfname(); extern char *optarg; extern char **environ; extern void sigusr1(); + extern void sighup(); + extern void initmacros __P((ENVELOPE *)); /* ** Check to see if we reentered. @@ -172,8 +161,8 @@ main(argc, argv, envp) /* do machine-dependent initializations */ init_md(argc, argv); - /* arrange to dump state on signal */ #ifdef SIGUSR1 + /* arrange to dump state on user-1 signal */ setsignal(SIGUSR1, sigusr1); #endif @@ -211,7 +200,9 @@ main(argc, argv, envp) # else openlog("sendmail", LOG_PID); # endif -#endif +#endif + + tTsetup(tTdvect, sizeof tTdvect, "0-99.1"); /* set up the blank envelope */ BlankEnvelope.e_puthdr = putheader; @@ -231,25 +222,29 @@ main(argc, argv, envp) RealUid = getuid(); RealGid = getgid(); - pw = getpwuid(RealUid); + pw = sm_getpwuid(RealUid); if (pw != NULL) - (void) strcpy(RealUserName, pw->pw_name); + (void) strcpy(rnamebuf, pw->pw_name); else - (void) sprintf(RealUserName, "Unknown UID %d", RealUid); + (void) sprintf(rnamebuf, "Unknown UID %d", RealUid); + RealUserName = rnamebuf; /* save command line arguments */ i = 0; for (av = argv; *av != NULL; ) i += strlen(*av++) + 1; + SaveArgv = (char **) xalloc(sizeof (char *) * (argc + 1)); CommandLineArgs = xalloc(i); p = CommandLineArgs; - for (av = argv; *av != NULL; ) + for (av = argv, i = 0; *av != NULL; ) { + SaveArgv[i++] = newstr(*av); if (av != argv) *p++ = ' '; strcpy(p, *av++); p += strlen(p); } + SaveArgv[i] = NULL; /* Handle any non-getoptable constructions. */ obsolete(argv); @@ -259,63 +254,98 @@ main(argc, argv, envp) */ #if defined(__osf__) || defined(_AIX3) -# define OPTIONS "B:b:C:cd:e:F:f:h:Iimno:p:q:r:sTtvX:x" -#endif -#if defined(ultrix) -# define OPTIONS "B:b:C:cd:e:F:f:h:IiM:mno:p:q:r:sTtvX:" +# define OPTIONS "B:b:C:cd:e:F:f:h:IiM:mnO:o:p:q:r:sTtvX:x" #endif -#if defined(NeXT) -# define OPTIONS "B:b:C:cd:e:F:f:h:IimnOo:p:q:r:sTtvX:" +#if defined(sony_news) +# define OPTIONS "B:b:C:cd:E:e:F:f:h:IiJ:M:mnO:o:p:q:r:sTtvX:" #endif #ifndef OPTIONS -# define OPTIONS "B:b:C:cd:e:F:f:h:Iimno:p:q:r:sTtvX:" +# define OPTIONS "B:b:C:cd:e:F:f:h:IiM:mnO:o:p:q:r:sTtvX:" #endif + opterr = 0; while ((j = getopt(argc, argv, OPTIONS)) != EOF) { switch (j) { case 'd': - tTsetup(tTdvect, sizeof tTdvect, "0-99.1"); tTflag(optarg); setbuf(stdout, (char *) NULL); - printf("Version %s\n", Version); break; } } + opterr = 1; - InChannel = stdin; - OutChannel = stdout; - - /* - ** Move the environment so setproctitle can use the space at - ** the top of memory. - */ + if (tTd(0, 1)) + { + int ll; + extern char *CompileOptions[]; - for (i = j = 0; j < MAXUSERENVIRON && (p = envp[i]) != NULL; i++) + printf("Version %s\n Compiled with:", Version); + av = CompileOptions; + ll = 7; + while (*av != NULL) + { + if (ll + strlen(*av) > 63) + { + putchar('\n'); + ll = 0; + } + if (ll == 0) + { + putchar('\t'); + putchar('\t'); + } + else + putchar(' '); + printf("%s", *av); + ll += strlen(*av++) + 1; + } + putchar('\n'); + } + if (tTd(0, 10)) { - if (strncmp(p, "IFS=", 4) == 0 || strncmp(p, "LD_", 3) == 0) - continue; - UserEnviron[j++] = newstr(p); + int ll; + extern char *OsCompileOptions[]; + + printf(" OS Defines:", Version); + av = OsCompileOptions; + ll = 7; + while (*av != NULL) + { + if (ll + strlen(*av) > 63) + { + putchar('\n'); + ll = 0; + } + if (ll == 0) + { + putchar('\t'); + putchar('\t'); + } + else + putchar(' '); + printf("%s", *av); + ll += strlen(*av++) + 1; + } + putchar('\n'); +#ifdef _PATH_UNIX + printf("Kernel symbols:\t%s\n", _PATH_UNIX); +#endif + printf(" Config file:\t%s\n", getcfname()); + printf(" Pid file:\t%s\n", PidFile); } - UserEnviron[j] = NULL; - environ = UserEnviron; -# ifdef SETPROCTITLE - /* - ** Save start and extent of argv for setproctitle. - */ + InChannel = stdin; + OutChannel = stdout; - Argv = argv; - if (i > 0) - LastArgv = envp[i - 1] + strlen(envp[i - 1]); - else - LastArgv = argv[argc - 1] + strlen(argv[argc - 1]); -# endif /* SETPROCTITLE */ + /* initialize for setproctitle */ + initsetproctitle(argc, argv, envp); + + /* prime the child environment */ + setuserenv("AGENT", "sendmail"); if (setsignal(SIGINT, SIG_IGN) != SIG_IGN) (void) setsignal(SIGINT, intsig); - if (setsignal(SIGHUP, SIG_IGN) != SIG_IGN) - (void) setsignal(SIGHUP, intsig); (void) setsignal(SIGTERM, intsig); (void) setsignal(SIGPIPE, SIG_IGN); OldUmask = umask(022); @@ -335,12 +365,13 @@ main(argc, argv, envp) /* initialize some macros, etc. */ initmacros(CurEnv); + init_vendor_macros(CurEnv); /* version */ define('v', Version, CurEnv); /* hostname */ - av = myhostname(jbuf, sizeof jbuf); + hp = myhostname(jbuf, sizeof jbuf); if (jbuf[0] != '\0') { struct utsname utsname; @@ -357,7 +388,6 @@ main(argc, argv, envp) if (p[1] != '\0') { define('m', newstr(&p[1]), CurEnv); - setclass('m', &p[1]); } while (p != NULL && strchr(&p[1], '.') != NULL) { @@ -378,19 +408,42 @@ main(argc, argv, envp) p = jbuf; } if (tTd(0, 4)) - printf("UUCP nodename: %s\n", p); + printf(" UUCP nodename: %s\n", p); p = newstr(p); define('k', p, CurEnv); setclass('k', p); setclass('w', p); } - while (av != NULL && *av != NULL) + if (hp != NULL) { - if (tTd(0, 4)) - printf("\ta.k.a.: %s\n", *av); - setclass('w', *av++); + for (av = hp->h_aliases; av != NULL && *av != NULL; av++) + { + if (tTd(0, 4)) + printf("\ta.k.a.: %s\n", *av); + setclass('w', *av); + } +#if NETINET + if (hp->h_addrtype == AF_INET && hp->h_length == INADDRSZ) + { + register int i; + + for (i = 0; hp->h_addr_list[i] != NULL; i++) + { + char ipbuf[103]; + + sprintf(ipbuf, "[%.100s]", + inet_ntoa(*((struct in_addr *) hp->h_addr_list[i]))); + if (tTd(0, 4)) + printf("\ta.k.a.: %s\n", ipbuf); + setclass('w', ipbuf); + } + } +#endif } + /* probe interfaces and locate any additional names */ + load_if_names(); + /* current time */ define('b', arpadate((char *) NULL), CurEnv); @@ -447,9 +500,7 @@ main(argc, argv, envp) case MD_TEST: case MD_INITALIAS: case MD_PRINT: -#ifdef MAYBE_NEXT_RELEASE case MD_ARPAFTP: -#endif OpMode = j; break; @@ -466,17 +517,14 @@ main(argc, argv, envp) break; case 'B': /* body type */ - if (strcasecmp(optarg, "7bit") == 0 || - strcasecmp(optarg, "8bitmime") == 0) - CurEnv->e_bodytype = newstr(optarg); - else - usrerr("Illegal body type %s", optarg); + CurEnv->e_bodytype = optarg; break; case 'C': /* select configuration file (already done) */ if (RealUid != 0) warn_C_flag = TRUE; ConfFile = optarg; + endpwent(); (void) setgid(RealGid); (void) setuid(RealUid); safecf = FALSE; @@ -520,6 +568,10 @@ main(argc, argv, envp) setoption(*optarg, optarg + 1, FALSE, TRUE, CurEnv); break; + case 'O': /* set option (long form) */ + setoption(' ', optarg, FALSE, TRUE, CurEnv); + break; + case 'p': /* set protocol */ p = strchr(optarg, ':'); if (p != NULL) @@ -574,6 +626,7 @@ main(argc, argv, envp) break; case 'X': /* traffic log file */ + endpwent(); setgid(RealGid); setuid(RealUid); TrafficLogFile = fopen(optarg, "a"); @@ -599,9 +652,7 @@ main(argc, argv, envp) break; case 'e': /* error message disposition */ -# if defined(ultrix) case 'M': /* define macro */ -# endif setoption(j, optarg, FALSE, TRUE, CurEnv); break; @@ -619,8 +670,10 @@ main(argc, argv, envp) case 'x': /* random flag that OSF/1 & AIX mailx passes */ break; # endif -# if defined(NeXT) - case 'O': /* random flag that NeXT Mail.app passes */ +# if defined(sony_news) + case 'E': + case 'J': /* ignore flags for Japanese code conversion + impremented on Sony NEWS */ break; # endif @@ -638,23 +691,42 @@ main(argc, argv, envp) ** Extract special fields for local use. */ -#ifdef XDEBUG + /* set up ${opMode} for use in config file */ + { + char mbuf[2]; + + mbuf[0] = OpMode; + mbuf[1] = '\0'; + define(MID_OPMODE, newstr(mbuf), CurEnv); + } + +#if XDEBUG checkfd012("before readcf"); #endif + vendor_pre_defaults(CurEnv); readcf(getcfname(), safecf, CurEnv); + vendor_post_defaults(CurEnv); + + /* suppress error printing if errors mailed back or whatever */ + if (CurEnv->e_errormode != EM_PRINT) + HoldErrs = TRUE; + + /* set up the $=m class now, after .cf has a chance to redefine $m */ + expand("\201m", jbuf, sizeof jbuf, CurEnv); + setclass('m', jbuf); if (tTd(0, 1)) { - printf("SYSTEM IDENTITY (after readcf):"); - printf("\n\t (short domain name) $w = "); + printf("\n============ SYSTEM IDENTITY (after readcf) ============"); + printf("\n (short domain name) $w = "); xputs(macvalue('w', CurEnv)); - printf("\n\t(canonical domain name) $j = "); + printf("\n (canonical domain name) $j = "); xputs(macvalue('j', CurEnv)); - printf("\n\t (subdomain name) $m = "); + printf("\n (subdomain name) $m = "); xputs(macvalue('m', CurEnv)); - printf("\n\t (node name) $k = "); + printf("\n (node name) $k = "); xputs(macvalue('k', CurEnv)); - printf("\n"); + printf("\n========================================================\n\n"); } /* @@ -662,47 +734,48 @@ main(argc, argv, envp) */ #if NAMED_BIND - if (!bitset(RES_INIT, _res.options)) + if (UseNameServer && !bitset(RES_INIT, _res.options)) res_init(); +# ifdef RES_NOALIASES + _res.options |= RES_NOALIASES; +# endif #endif /* - ** Process authorization warnings from command line. + ** Do more command line checking -- these are things that + ** have to modify the results of reading the config file. */ + /* process authorization warnings from command line */ if (warn_C_flag) auth_warning(CurEnv, "Processed by %s with -C %s", RealUserName, ConfFile); -/* - if (warn_f_flag != '\0') - auth_warning(CurEnv, "%s set sender to %s using -%c", - RealUserName, from, warn_f_flag); -*/ if (Warn_Q_option) auth_warning(CurEnv, "Processed from queue %s", QueueDir); + /* check body type for legality */ + if (CurEnv->e_bodytype == NULL) + /* nothing */ ; + else if (strcasecmp(CurEnv->e_bodytype, "7BIT") == 0) + SevenBitInput = TRUE; + else if (strcasecmp(CurEnv->e_bodytype, "8BITMIME") == 0) + SevenBitInput = FALSE; + else + { + usrerr("Illegal body type %s", CurEnv->e_bodytype); + CurEnv->e_bodytype = NULL; + } + /* Enforce use of local time (null string overrides this) */ if (TimeZoneSpec == NULL) unsetenv("TZ"); else if (TimeZoneSpec[0] != '\0') - { - char **evp = UserEnviron; - char tzbuf[100]; - - strcpy(tzbuf, "TZ="); - strcpy(&tzbuf[3], TimeZoneSpec); - - while (*evp != NULL && strncmp(*evp, "TZ=", 3) != 0) - evp++; - if (*evp == NULL) - { - *evp++ = newstr(tzbuf); - *evp = NULL; - } - else - *evp++ = newstr(tzbuf); - } + setuserenv("TZ", TimeZoneSpec); + else + setuserenv("TZ", NULL); + tzset(); + /* check for sane configuration level */ if (ConfigLevel > MAXCONFIGLEVEL) { syserr("Warning: .cf version level (%d) exceeds program functionality (%d)", @@ -712,32 +785,24 @@ main(argc, argv, envp) if (MeToo) BlankEnvelope.e_flags |= EF_METOO; -# ifdef QUEUE - if (queuemode && RealUid != 0 && bitset(PRIV_RESTRICTQRUN, PrivacyFlags)) + switch (OpMode) { - struct stat stbuf; + case MD_DAEMON: + /* remove things that don't make sense in daemon mode */ + FullName = NULL; + GrabTo = FALSE; - /* check to see if we own the queue directory */ - if (stat(QueueDir, &stbuf) < 0) - syserr("main: cannot stat %s", QueueDir); - if (stbuf.st_uid != RealUid) - { - /* nope, really a botch */ - usrerr("You do not have permission to process the queue"); - exit (EX_NOPERM); - } - } -# endif /* QUEUE */ + /* arrange to restart on hangup signal */ + setsignal(SIGHUP, sighup); + break; - switch (OpMode) - { case MD_INITALIAS: Verbose = TRUE; - break; + /* fall through... */ - case MD_DAEMON: - /* remove things that don't make sense in daemon mode */ - FullName = NULL; + default: + /* arrange to exit cleanly on hangup signal */ + setsignal(SIGHUP, intsig); break; } @@ -760,31 +825,56 @@ main(argc, argv, envp) UseErrorsTo = TRUE; } + /* set options that were previous macros */ + if (SmtpGreeting == NULL) + { + if (ConfigLevel < 7 && (p = macvalue('e', CurEnv)) != NULL) + SmtpGreeting = newstr(p); + else + SmtpGreeting = "\201j Sendmail \201v ready at \201b"; + } + if (UnixFromLine == NULL) + { + if (ConfigLevel < 7 && (p = macvalue('l', CurEnv)) != NULL) + UnixFromLine = newstr(p); + else + UnixFromLine = "From \201g \201d"; + } + /* our name for SMTP codes */ - expand("\201j", jbuf, &jbuf[sizeof jbuf - 1], CurEnv); + expand("\201j", jbuf, sizeof jbuf, CurEnv); MyHostName = jbuf; + if (strchr(jbuf, '.') == NULL) + message("WARNING: local host name (%s) is not qualified; fix $j in config file", + jbuf); /* make certain that this name is part of the $=w class */ setclass('w', MyHostName); /* the indices of built-in mailers */ st = stab("local", ST_MAILER, ST_FIND); - if (st == NULL) - syserr("No local mailer defined"); - else + if (st != NULL) LocalMailer = st->s_mailer; + else if (OpMode != MD_TEST || !warn_C_flag) + syserr("No local mailer defined"); st = stab("prog", ST_MAILER, ST_FIND); if (st == NULL) syserr("No prog mailer defined"); else + { ProgMailer = st->s_mailer; + clrbitn(M_MUSER, ProgMailer->m_flags); + } st = stab("*file*", ST_MAILER, ST_FIND); if (st == NULL) syserr("No *file* mailer defined"); else + { FileMailer = st->s_mailer; + clrbitn(M_MUSER, FileMailer->m_flags); + } st = stab("*include*", ST_MAILER, ST_FIND); if (st == NULL) @@ -792,6 +882,39 @@ main(argc, argv, envp) else InclMailer = st->s_mailer; + if (ConfigLevel < 6) + { + /* heuristic tweaking of local mailer for back compat */ + if (LocalMailer != NULL) + { + setbitn(M_ALIASABLE, LocalMailer->m_flags); + setbitn(M_HASPWENT, LocalMailer->m_flags); + setbitn(M_TRYRULESET5, LocalMailer->m_flags); + setbitn(M_CHECKINCLUDE, LocalMailer->m_flags); + setbitn(M_CHECKPROG, LocalMailer->m_flags); + setbitn(M_CHECKFILE, LocalMailer->m_flags); + setbitn(M_CHECKUDB, LocalMailer->m_flags); + } + if (ProgMailer != NULL) + setbitn(M_RUNASRCPT, ProgMailer->m_flags); + if (FileMailer != NULL) + setbitn(M_RUNASRCPT, FileMailer->m_flags); + + /* propogate some envariables into children */ + setuserenv("ISP", NULL); + setuserenv("SYSTYPE", NULL); + } + + /* MIME Content-Types that cannot be transfer encoded */ + setclass('n', "multipart/signed"); + + /* MIME message/* subtypes that can be treated as messages */ + setclass('s', "rfc822"); + + /* MIME Content-Transfer-Encodings that can be encoded */ + setclass('e', "7bit"); + setclass('e', "8bit"); + setclass('e', "binary"); /* operate in queue directory */ if (OpMode != MD_TEST && chdir(QueueDir) < 0) @@ -800,14 +923,32 @@ main(argc, argv, envp) ExitStat = EX_SOFTWARE; } +# ifdef QUEUE + if (queuemode && RealUid != 0 && bitset(PRIV_RESTRICTQRUN, PrivacyFlags)) + { + struct stat stbuf; + + /* check to see if we own the queue directory */ + if (stat(".", &stbuf) < 0) + syserr("main: cannot stat %s", QueueDir); + if (stbuf.st_uid != RealUid) + { + /* nope, really a botch */ + usrerr("You do not have permission to process the queue"); + exit (EX_NOPERM); + } + } +# endif /* QUEUE */ + /* if we've had errors so far, exit now */ if (ExitStat != EX_OK && OpMode != MD_TEST) { + endpwent(); setuid(RealUid); exit(ExitStat); } -#ifdef XDEBUG +#if XDEBUG checkfd012("before main() initmaps"); #endif @@ -822,6 +963,7 @@ main(argc, argv, envp) #ifdef QUEUE dropenvelope(CurEnv); printqueue(); + endpwent(); setuid(RealUid); exit(EX_OK); #else /* QUEUE */ @@ -832,10 +974,12 @@ main(argc, argv, envp) case MD_INITALIAS: /* initialize alias database */ initmaps(TRUE, CurEnv); + endpwent(); setuid(RealUid); exit(EX_OK); case MD_DAEMON: + case MD_SMTP: /* don't open alias database -- done in srvrsmtp */ break; @@ -848,35 +992,12 @@ main(argc, argv, envp) if (tTd(0, 15)) { /* print configuration table (or at least part of it) */ - printrules(); + if (tTd(0, 90)) + printrules(); for (i = 0; i < MAXMAILERS; i++) { - register struct mailer *m = Mailer[i]; - int j; - - if (m == NULL) - continue; - printf("mailer %d (%s): P=%s S=%d/%d R=%d/%d M=%ld F=", i, m->m_name, - m->m_mailer, m->m_se_rwset, m->m_sh_rwset, - m->m_re_rwset, m->m_rh_rwset, m->m_maxsize); - for (j = '\0'; j <= '\177'; j++) - if (bitnset(j, m->m_flags)) - (void) putchar(j); - printf(" E="); - xputs(m->m_eol); - if (m->m_argv != NULL) - { - char **a = m->m_argv; - - printf(" A="); - while (*a != NULL) - { - if (a != m->m_argv) - printf(" "); - xputs(*a++); - } - } - printf("\n"); + if (Mailer[i] != NULL) + printmailer(Mailer[i]); } } @@ -894,6 +1015,7 @@ main(argc, argv, envp) if (OpMode == MD_TEST) { char buf[MAXLINE]; + void intindebug(); if (isatty(fileno(stdin))) Verbose = TRUE; @@ -903,69 +1025,24 @@ main(argc, argv, envp) printf("ADDRESS TEST MODE (ruleset 3 NOT automatically invoked)\n"); printf("Enter <ruleset> <address>\n"); } + if (setjmp(TopFrame) > 0) + printf("\n"); + (void) setsignal(SIGINT, intindebug); for (;;) { - register char **pvp; - char *q; - auto char *delimptr; - extern bool invalidaddr(); - extern char *crackaddr(); + extern void testmodeline __P((char *, ENVELOPE *)); if (Verbose) printf("> "); (void) fflush(stdout); if (fgets(buf, sizeof buf, stdin) == NULL) finis(); + p = strchr(buf, '\n'); + if (p != NULL) + *p = '\0'; if (!Verbose) - printf("> %s", buf); - switch (buf[0]) - { - case '#': - continue; - -#ifdef MAYBENEXTRELEASE - case 'C': /* try crackaddr */ - q = crackaddr(&buf[1]); - xputs(q); - printf("\n"); - continue; -#endif - } - - for (p = buf; isascii(*p) && isspace(*p); p++) - continue; - q = p; - while (*p != '\0' && !(isascii(*p) && isspace(*p))) - p++; - if (*p == '\0') - { - printf("No address!\n"); - continue; - } - *p = '\0'; - if (invalidaddr(p + 1, NULL)) - continue; - do - { - char pvpbuf[PSBUFSIZE]; - - pvp = prescan(++p, ',', pvpbuf, sizeof pvpbuf, - &delimptr); - if (pvp == NULL) - continue; - p = q; - while (*p != '\0') - { - int stat; - - stat = rewrite(pvp, atoi(p), 0, CurEnv); - if (stat != EX_OK) - printf("== Ruleset %s status %d\n", - p, stat); - while (*p != '\0' && *p++ != ',') - continue; - } - } while (*(p = delimptr) != '\0'); + printf("> %s\n", buf); + testmodeline(buf, CurEnv); } } @@ -976,6 +1053,7 @@ main(argc, argv, envp) if (queuemode && OpMode != MD_DAEMON && QueueIntvl == 0) { + (void) unsetenv("HOSTALIASES"); runqueue(FALSE); finis(); } @@ -994,7 +1072,7 @@ main(argc, argv, envp) { char dtype[200]; - if (!tTd(0, 1)) + if (!tTd(99, 100)) { /* put us in background */ i = fork(); @@ -1066,11 +1144,12 @@ main(argc, argv, envp) { CurEnv->e_sendmode = SM_VERIFY; CurEnv->e_errormode = EM_QUIET; + PostMasterCopy = NULL; } else { /* interactive -- all errors are global */ - CurEnv->e_flags |= EF_GLOBALERRS; + CurEnv->e_flags |= EF_GLOBALERRS|EF_LOGSENDER; } /* @@ -1078,6 +1157,9 @@ main(argc, argv, envp) */ initsys(CurEnv); + if (warn_f_flag != '\0' && !wordinclass(RealUserName, 't')) + auth_warning(CurEnv, "%s set sender to %s using -%c", + RealUserName, from, warn_f_flag); setsender(from, CurEnv, NULL, FALSE); if (macvalue('s', CurEnv) == NULL) define('s', RealHostName, CurEnv); @@ -1089,7 +1171,7 @@ main(argc, argv, envp) /* collect body for UUCP return */ if (OpMode != MD_VERIFY) - collect(FALSE, FALSE, CurEnv); + collect(InChannel, FALSE, FALSE, NULL, CurEnv); finis(); } @@ -1111,7 +1193,7 @@ main(argc, argv, envp) if (OpMode != MD_VERIFY || GrabTo) { CurEnv->e_flags |= EF_GLOBALERRS; - collect(FALSE, FALSE, CurEnv); + collect(InChannel, FALSE, FALSE, NULL, CurEnv); } errno = 0; @@ -1139,6 +1221,15 @@ main(argc, argv, envp) finis(); } + + +void +intindebug() +{ + longjmp(TopFrame, 1); +} + + /* ** FINIS -- Clean up and exit. ** @@ -1152,12 +1243,18 @@ main(argc, argv, envp) ** exits sendmail */ +void finis() { if (tTd(2, 1)) - printf("\n====finis: stat %d e_flags %o, e_id=%s\n", - ExitStat, CurEnv->e_flags, + { + extern void printenvflags(); + + printf("\n====finis: stat %d e_id=%s e_flags=", + ExitStat, CurEnv->e_id == NULL ? "NOQUEUE" : CurEnv->e_id); + printenvflags(CurEnv); + } if (tTd(2, 9)) printopenfds(FALSE); @@ -1178,10 +1275,11 @@ finis() if (LogLevel > 78) syslog(LOG_DEBUG, "finis, pid=%d", getpid()); # endif /* LOG */ - if (ExitStat == EX_TEMPFAIL) + if (ExitStat == EX_TEMPFAIL || CurEnv->e_errormode == EM_BERKNET) ExitStat = EX_OK; /* reset uid for process accounting */ + endpwent(); setuid(RealUid); exit(ExitStat); @@ -1212,6 +1310,7 @@ intsig() #endif /* reset uid for process accounting */ + endpwent(); setuid(RealUid); exit(EX_OK); @@ -1255,12 +1354,18 @@ struct metamac MetaMacros[] = '\0' }; +#define MACBINDING(name, mid) \ + stab(name, ST_MACRO, ST_ENTER)->s_macro = mid; \ + MacroName[mid] = name; + +void initmacros(e) register ENVELOPE *e; { register struct metamac *m; - char buf[5]; register int c; + char buf[5]; + extern char *MacroName[256]; for (m = MetaMacros; m->metaname != '\0'; m++) { @@ -1277,11 +1382,11 @@ initmacros(e) } /* set defaults for some macros sendmail will use later */ - define('e', "\201j Sendmail \201v ready at \201b", e); - define('l', "From \201g \201d", e); define('n', "MAILER-DAEMON", e); - define('o', ".:@[]", e); - define('q', "<\201g>", e); + + /* set up external names for some internal macros */ + MACBINDING("opMode", MID_OPMODE); + /*XXX should probably add equivalents for all short macros here XXX*/ } /* ** DISCONNECT -- remove our connection with any foreground process @@ -1303,6 +1408,7 @@ initmacros(e) ** the controlling tty. */ +void disconnect(droplev, e) int droplev; register ENVELOPE *e; @@ -1312,14 +1418,13 @@ disconnect(droplev, e) if (tTd(52, 1)) printf("disconnect: In %d Out %d, e=%x\n", fileno(InChannel), fileno(OutChannel), e); - if (tTd(52, 5)) + if (tTd(52, 100)) { printf("don't\n"); return; } /* be sure we don't get nasty signals */ - (void) setsignal(SIGHUP, SIG_IGN); (void) setsignal(SIGINT, SIG_IGN); (void) setsignal(SIGQUIT, SIG_IGN); @@ -1363,7 +1468,7 @@ disconnect(droplev, e) errno = 0; } -#ifdef XDEBUG +#if XDEBUG checkfd012("disconnect"); #endif @@ -1391,7 +1496,11 @@ obsolete(argv) /* skip over options that do have a value */ op = strchr(OPTIONS, ap[1]); if (op != NULL && *++op == ':' && ap[2] == '\0' && - ap[1] != 'd' && argv[1] != NULL && argv[1][0] != '-') + ap[1] != 'd' && +#if defined(sony_news) + ap[1] != 'E' && ap[1] != 'J' && +#endif + argv[1] != NULL && argv[1][0] != '-') { argv++; continue; @@ -1414,6 +1523,16 @@ obsolete(argv) /* if -d doesn't have an argument, use 0-99.1 */ if (ap[1] == 'd' && ap[2] == '\0') *argv = "-d0-99.1"; + +# if defined(sony_news) + /* if -E doesn't have an argument, use -EC */ + if (ap[1] == 'E' && ap[2] == '\0') + *argv = "-EC"; + + /* if -J doesn't have an argument, use -JJ */ + if (ap[1] == 'J' && ap[2] == '\0') + *argv = "-JJ"; +# endif } } /* @@ -1445,7 +1564,7 @@ auth_warning(e, msg, va_alist) { register char *p; static char hostbuf[48]; - extern char **myhostname(); + extern struct hostent *myhostname(); if (hostbuf[0] == '\0') (void) myhostname(hostbuf, sizeof hostbuf); @@ -1453,10 +1572,67 @@ auth_warning(e, msg, va_alist) (void) sprintf(buf, "%s: ", hostbuf); p = &buf[strlen(buf)]; VA_START(msg); - vsprintf(p, msg, ap); + vsnprintf(p, sizeof buf - (p - buf), msg, ap); VA_END; - addheader("X-Authentication-Warning", buf, e); + addheader("X-Authentication-Warning", buf, &e->e_header); +#ifdef LOG + if (LogLevel > 3) + syslog(LOG_INFO, "%s: Authentication-Warning: %.400s", + e->e_id == NULL ? "[NOQUEUE]" : e->e_id, buf); +#endif + } +} +/* +** SETUSERENV -- set an environment in the propogated environment +** +** Parameters: +** envar -- the name of the environment variable. +** value -- the value to which it should be set. If +** null, this is extracted from the incoming +** environment. If that is not set, the call +** to setuserenv is ignored. +** +** Returns: +** none. +*/ + +void +setuserenv(envar, value) + const char *envar; + const char *value; +{ + int i; + char **evp = UserEnviron; + char *p; + + if (value == NULL) + { + value = getenv(envar); + if (value == NULL) + return; + } + + i = strlen(envar); + p = (char *) xalloc(strlen(value) + i + 2); + strcpy(p, envar); + p[i++] = '='; + strcpy(&p[i], value); + + while (*evp != NULL && strncmp(*evp, p, i) != 0) + evp++; + if (*evp != NULL) + { + *evp++ = p; + } + else if (evp < &UserEnviron[MAXUSERENVIRON]) + { + *evp++ = p; + *evp = NULL; } + + /* make sure it is in our environment as well */ + if (putenv(p) < 0) + syserr("setuserenv: putenv(%s) failed", p); } /* ** DUMPSTATE -- dump state @@ -1470,17 +1646,16 @@ dumpstate(when) { #ifdef LOG register char *j = macvalue('j', CurEnv); - register STAB *s; syslog(LOG_DEBUG, "--- dumping state on %s: $j = %s ---", when, j == NULL ? "<NULL>" : j); if (j != NULL) { - s = stab(j, ST_CLASS, ST_FIND); - if (s == NULL || !bitnset('w', s->s_class)) + if (!wordinclass(j, 'w')) syslog(LOG_DEBUG, "*** $j not in $=w ***"); } + syslog(LOG_DEBUG, "CurChildren = %d", CurChildren); syslog(LOG_DEBUG, "--- open file descriptors: ---"); printopenfds(TRUE); syslog(LOG_DEBUG, "--- connection cache: ---"); @@ -1508,3 +1683,431 @@ sigusr1() { dumpstate("user signal"); } + + +void +sighup() +{ +#ifdef LOG + if (LogLevel > 3) + syslog(LOG_INFO, "restarting %s on signal", SaveArgv[0]); +#endif + releasesignal(SIGHUP); + execv(SaveArgv[0], (ARGV_T) SaveArgv); +#ifdef LOG + if (LogLevel > 0) + syslog(LOG_ALERT, "could not exec %s: %m", SaveArgv[0]); +#endif + exit(EX_OSFILE); +} +/* +** TESTMODELINE -- process a test mode input line +** +** Parameters: +** line -- the input line. +** e -- the current environment. +** Syntax: +** # a comment +** .X process X as a configuration line +** =X dump a configuration item (such as mailers) +** $X dump a macro or class +** /X try an activity +** X normal process through rule set X +*/ + +void +testmodeline(line, e) + char *line; + ENVELOPE *e; +{ + register char *p; + char *q; + auto char *delimptr; + int mid; + int i, rs; + STAB *map; + char **s; + struct rewrite *rw; + ADDRESS a; + static int tryflags = RF_COPYNONE; + char exbuf[MAXLINE]; + extern bool invalidaddr __P((char *, char *)); + extern char *crackaddr __P((char *)); + extern void dump_class __P((STAB *, int)); + extern void translate_dollars __P((char *)); + + switch (line[0]) + { + case '#': + case 0: + return; + + case '?': + help("-bt"); + return; + + case '.': /* config-style settings */ + switch (line[1]) + { + case 'D': + mid = macid(&line[2], &delimptr); + if (mid == '\0') + return; + translate_dollars(delimptr); + define(mid, newstr(delimptr), e); + break; + + case 'C': + if (line[2] == '\0') /* not to call syserr() */ + return; + + mid = macid(&line[2], &delimptr); + if (mid == '\0') + return; + translate_dollars(delimptr); + expand(delimptr, exbuf, sizeof exbuf, e); + p = exbuf; + while (*p != '\0') + { + register char *wd; + char delim; + + while (*p != '\0' && isascii(*p) && isspace(*p)) + p++; + wd = p; + while (*p != '\0' && !(isascii(*p) && isspace(*p))) + p++; + delim = *p; + *p = '\0'; + if (wd[0] != '\0') + setclass(mid, wd); + *p = delim; + } + break; + + case '\0': + printf("Usage: .[DC]macro value(s)\n"); + break; + + default: + printf("Unknown \".\" command %s\n", line); + break; + } + return; + + case '=': /* config-style settings */ + switch (line[1]) + { + case 'S': /* dump rule set */ + rs = strtorwset(&line[2], NULL, ST_FIND); + if (rs < 0) + return; + rw = RewriteRules[rs]; + if (rw == NULL) + return; + do + { + putchar('R'); + s = rw->r_lhs; + while (*s != NULL) + { + xputs(*s++); + putchar(' '); + } + putchar('\t'); + putchar('\t'); + s = rw->r_rhs; + while (*s != NULL) + { + xputs(*s++); + putchar(' '); + } + putchar('\n'); + } while (rw = rw->r_next); + break; + + case 'M': + for (i = 0; i < MAXMAILERS; i++) + { + if (Mailer[i] != NULL) + printmailer(Mailer[i]); + } + break; + + case '\0': + printf("Usage: =Sruleset or =M\n"); + break; + + default: + printf("Unknown \"=\" command %s\n", line); + break; + } + return; + + case '-': /* set command-line-like opts */ + switch (line[1]) + { + case 'd': + tTflag(&line[2]); + break; + + case '\0': + printf("Usage: -d{debug arguments}\n"); + break; + + default: + printf("Unknown \"-\" command %s\n", line); + break; + } + return; + + case '$': + if (line[1] == '=') + { + mid = macid(&line[2], NULL); + if (mid != '\0') + stabapply(dump_class, mid); + return; + } + mid = macid(&line[1], NULL); + if (mid == '\0') + return; + p = macvalue(mid, e); + if (p == NULL) + printf("Undefined\n"); + else + { + xputs(p); + printf("\n"); + } + return; + + case '/': /* miscellaneous commands */ + p = &line[strlen(line)]; + while (--p >= line && isascii(*p) && isspace(*p)) + *p = '\0'; + p = strpbrk(line, " \t"); + if (p != NULL) + { + while (isascii(*p) && isspace(*p)) + *p++ = '\0'; + } + else + p = ""; + if (line[1] == '\0') + { + printf("Usage: /[canon|map|mx|parse|try|tryflags]\n"); + return; + } + if (strcasecmp(&line[1], "mx") == 0) + { +#if NAMED_BIND + /* look up MX records */ + int nmx; + auto int rcode; + char *mxhosts[MAXMXHOSTS + 1]; + + if (*p == '\0') + { + printf("Usage: /mx address\n"); + return; + } + nmx = getmxrr(p, mxhosts, FALSE, &rcode); + printf("getmxrr(%s) returns %d value(s):\n", p, nmx); + for (i = 0; i < nmx; i++) + printf("\t%s\n", mxhosts[i]); +#else + printf("No MX code compiled in\n"); +#endif + } + else if (strcasecmp(&line[1], "canon") == 0) + { + auto int rcode = EX_OK; + char host[MAXHOSTNAMELEN]; + + if (*p == '\0') + { + printf("Usage: /canon address\n"); + return; + } + strcpy(host, p); + getcanonname(host, sizeof(host), HasWildcardMX, &rcode); + printf("getcanonname(%s) returns %s (%d)\n", + p, host, rcode); + } + else if (strcasecmp(&line[1], "map") == 0) + { + auto int rcode = EX_OK; + + if (*p == '\0') + { + printf("Usage: /map mapname key\n"); + return; + } + for (q = p; *q != '\0' && !isspace(*q); q++) + continue; + if (*q == '\0') + { + printf("No key specified\n"); + return; + } + *q++ = '\0'; + map = stab(p, ST_MAP, ST_FIND); + if (map == NULL) + { + printf("Map named \"%s\" not found\n", p); + return; + } + printf("map_lookup: %s (%s) ", p, q); + p = (*map->s_map.map_class->map_lookup) + (&map->s_map, q, NULL, &rcode); + if (p == NULL) + printf("no match (%d)\n", rcode); + else + printf("returns %s (%d)\n", p, rcode); + } + else if (strcasecmp(&line[1], "try") == 0) + { + MAILER *m; + STAB *s; + auto int rcode = EX_OK; + + q = strpbrk(p, " \t"); + if (q != NULL) + { + while (isascii(*q) && isspace(*q)) + *q++ = '\0'; + } + if (q == NULL || *q == '\0') + { + printf("Usage: /try mailer address\n"); + return; + } + s = stab(p, ST_MAILER, ST_FIND); + if (s == NULL) + { + printf("Unknown mailer %s\n", p); + return; + } + m = s->s_mailer; + printf("Trying %s %s address %s for mailer %s\n", + bitset(RF_HEADERADDR, tryflags) ? "header" : "envelope", + bitset(RF_SENDERADDR, tryflags) ? "sender" : "recipient", + q, p); + p = remotename(q, m, tryflags, &rcode, CurEnv); + printf("Rcode = %d, addr = %s\n", + rcode, p == NULL ? "<NULL>" : p); + } + else if (strcasecmp(&line[1], "tryflags") == 0) + { + if (*p == '\0') + { + printf("Usage: /tryflags [Hh|Ee][Ss|Rr]\n"); + return; + } + for (; *p != '\0'; p++) + { + switch (*p) + { + case 'H': + case 'h': + tryflags |= RF_HEADERADDR; + break; + + case 'E': + case 'e': + tryflags &= ~RF_HEADERADDR; + break; + + case 'S': + case 's': + tryflags |= RF_SENDERADDR; + break; + + case 'R': + case 'r': + tryflags &= ~RF_SENDERADDR; + break; + } + } + } + else if (strcasecmp(&line[1], "parse") == 0) + { + if (*p == '\0') + { + printf("Usage: /parse address\n"); + return; + } + q = crackaddr(p); + printf("Cracked address = "); + xputs(q); + printf("\nParsing %s %s address\n", + bitset(RF_HEADERADDR, tryflags) ? "header" : "envelope", + bitset(RF_SENDERADDR, tryflags) ? "sender" : "recipient"); + if (parseaddr(p, &a, tryflags, '\0', NULL, e) == NULL) + printf("Cannot parse\n"); + else if (a.q_host != NULL && a.q_host[0] != '\0') + printf("mailer %s, host %s, user %s\n", + a.q_mailer->m_name, a.q_host, a.q_user); + else + printf("mailer %s, user %s\n", + a.q_mailer->m_name, a.q_user); + } + else + { + printf("Unknown \"/\" command %s\n", line); + } + return; + } + + for (p = line; isascii(*p) && isspace(*p); p++) + continue; + q = p; + while (*p != '\0' && !(isascii(*p) && isspace(*p))) + p++; + if (*p == '\0') + { + printf("No address!\n"); + return; + } + *p = '\0'; + if (invalidaddr(p + 1, NULL)) + return; + do + { + register char **pvp; + char pvpbuf[PSBUFSIZE]; + + pvp = prescan(++p, ',', pvpbuf, sizeof pvpbuf, + &delimptr, NULL); + if (pvp == NULL) + continue; + p = q; + while (*p != '\0') + { + int stat; + int rs = strtorwset(p, NULL, ST_FIND); + + if (rs < 0) + break; + stat = rewrite(pvp, rs, 0, e); + if (stat != EX_OK) + printf("== Ruleset %s (%d) status %d\n", + p, rs, stat); + while (*p != '\0' && *p++ != ',') + continue; + } + } while (*(p = delimptr) != '\0'); +} + + +void +dump_class(s, id) + register STAB *s; + int id; +{ + if (s->s_type != ST_CLASS) + return; + if (bitnset(id & 0xff, s->s_class)) + printf("%s\n", s->s_name); +} diff --git a/usr.sbin/sendmail/src/makesendmail b/usr.sbin/sendmail/src/makesendmail index 7c13db9fd9fcd..df202e9163e22 100644 --- a/usr.sbin/sendmail/src/makesendmail +++ b/usr.sbin/sendmail/src/makesendmail @@ -32,7 +32,7 @@ # OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF # SUCH DAMAGE. # -# @(#)makesendmail 8.5 (Berkeley) 2/27/94 +# @(#)makesendmail 8.29 (Berkeley) 8/1/95 # # @@ -40,8 +40,65 @@ # multiple architectures and Makefiles. # -# determine machine architecture -arch=`uname -m` +if [ "x${1-""}" = "x-m" ] +then + # show Makefile name only + mflag=1 +else + mflag="" +fi + +# +# Do heuristic guesses !ONLY! for machines that do not have uname +# +if [ -d /LocalApps -a ! -f /bin/uname -a ! -f /usr/bin/uname ] +then + # probably a NeXT box + arch=NeXT + os=Mach + rel=`strings /mach | grep 'Mach.*:' | sed -e 's/.* Mach //' -e 's/:.*//'` +elif [ -f /usr/sony/bin/machine -a -f /etc/osversion ] +then + # probably a Sony NEWS 4.x + os=NEWS-OS + rel=`awk '{ print $3}' /etc/osversion` + arch=`/usr/sony/bin/machine` +elif [ -d /usr/omron -a -f /bin/luna ] +then + # probably a Omron LUNA + os=LUNA + if [ -f /bin/luna1 ] && /bin/luna1 + then + rel=unios-b + arch=luna1 + elif [ -f /bin/luna2 ] && /bin/luna2 + then + rel=Mach + arch=luna2 + elif [ -f /bin/luna88k ] && /bin/luna88k + then + rel=Mach + arch=luna88k + fi +fi + +if [ ! "$arch" -a ! "$os" -a ! "$rel" ] +then + arch=`uname -m | sed -e 's/ //g'` + os=`uname -s | sed 's/\//-/g'` + rel=`uname -r` +fi + +# +# Tweak the values we have already got. PLEASE LIMIT THESE to +# tweaks that are absolutely necessary because your system uname +# routine doesn't return something sufficiently unique. Don't do +# it just because you don't like the name that is returned. You +# can combine the architecture name with the os name to create a +# unique Makefile name. +# + +# tweak machine architecture case $arch in sun4*) arch=sun4;; @@ -49,65 +106,177 @@ in 9000/*) arch=`echo $arch | sed -e 's/9000.//' -e 's/..$/xx/'`;; esac -# determine operating system type -os=`uname -s` +# tweak operating system type and release +case $os +in + DYNIX-ptx) os=PTX;; + Paragon*) os=Paragon;; + HP-UX) rel=`echo $rel | sed -e 's/^[^.]*\.0*//'`;; + AIX) rel=`uname -v`;; + BSD-386) os=BSD-OS;; +esac + +# get "base part" of operating system release +rbase=`echo $rel | sed -e 's/\..*//'` -# determine operating system release -rel=`uname -r` -rbase=`echo $rel | sed 's/\..*//''` +# heuristic tweaks to clean up names -- PLEASE LIMIT THESE! +if [ "$os" = "unix" ] +then + # might be Altos System V + case $rel + in + 5.3*) os=Altos;; + esac +elif [ -r /unix -a -r /usr/lib/libseq.a -a -r /lib/cpp ] +then + # might be a DYNIX/ptx 2.x system, which has a broken uname + if strings /lib/cpp | grep _SEQUENT_ > /dev/null + then + os=PTX + fi +elif [ -d /usr/nec ] +then + # NEC machine -- what is it running? + if [ "$os" = "UNIX_System_V" ] + then + os=EWS-UX_V + elif [ "$os" = "UNIX_SV" ] + then + os=UX4800 + fi +elif [ "$arch" = "mips" ] +then + case $rel + in + 4_*) + if [ `uname -v` = "UMIPS" ] + then + os=RISCos + fi;; + esac +fi + +# see if there is a "user suffix" specified +if [ "${SENDMAIL_SUFFIX-}x" = "x" ] +then + sfx="" +else + sfx=".${SENDMAIL_SUFFIX}" +fi + +echo "Configuration: os=$os, rel=$rel, rbase=$rbase, arch=$arch, sfx=$sfx" # now try to find a reasonable object directory -if [ -r obj.$os.$arch.$rel ]; then - obj=obj.$os.$arch.$rel -elif [ -r obj.$os.$arch.$rbase.x ]; then - obj=obj.$os.$arch.$rbase.x -elif [ -r obj.$os.$rel ]; then - obj=obj.$os.$rel -elif [ -r obj.$os.$rbase.x ]; then - obj=obj.$os.$rbase.x -elif [ -r obj.$os.$arch ]; then - obj=obj.$os.$arch -elif [ -r obj.$arch.$rel ]; then - obj=obj.$arch.$rel -elif [ -r obj.$arch.$rbase.x ]; then - obj=obj.$arch.$rbase.x -elif [ -r obj.$os ]; then - obj=obj.$os -elif [ -r obj.$arch ]; then - obj=obj.$arch -elif [ -r obj.$rel ]; then - obj=obj.$rel +if [ -r obj.$os.$rel.$arch$sfx ]; then + obj=obj.$os.$rel.$arch$sfx +elif [ -r obj.$os.$rbase.x.$arch$sfx ]; then + obj=obj.$os.$rbase.x.$arch$sfx +elif [ -r obj.$os.$rel$sfx ]; then + obj=obj.$os.$rel$sfx +elif [ -r obj.$os.$rbase.x$sfx ]; then + obj=obj.$os.$rbase.x$sfx +elif [ -r obj.$os.$arch$sfx ]; then + obj=obj.$os.$arch$sfx +elif [ -r obj.$rel.$arch$sfx ]; then + obj=obj.$rel.$arch$sfx +elif [ -r obj.$rbase.x.$arch$sfx ]; then + obj=obj.$rbase.x.$arch$sfx +elif [ -r obj.$os$sfx ]; then + obj=obj.$os$sfx +elif [ -r obj.$arch$sfx ]; then + obj=obj.$arch$sfx +elif [ -r obj.$rel$sfx ]; then + obj=obj.$rel$sfx +elif [ -r obj$sfx ]; then + obj=obj$sfx else # no existing obj directory -- try to create one if Makefile found - obj=obj.$os.$arch.$rel - if [ -r Makefile.$os.$arch.$rel ]; then - makefile=Makefile.$os.$arch.$rel - elif [ -r Makefile.$os.$arch.$rbase.x ]; then - makefile=Makefile.$os.$arch.$rbase.x - elif [ -r Makefile.$os.$rel ]; then + obj=obj.$os.$rel.$arch$sfx + if [ -r Makefiles/Makefile.$os.$rel.$arch$sfx ]; then + makefile=Makefile.$os.$rel.$arch$sfx + elif [ -r Makefiles/Makefile.$os.$rel.$arch ]; then + makefile=Makefile.$os.$rel.$arch + elif [ -r Makefiles/Makefile.$os.$rbase.x.$arch$sfx ]; then + makefile=Makefile.$os.$rbase.x.$arch$sfx + elif [ -r Makefiles/Makefile.$os.$rbase.x.$arch ]; then + makefile=Makefile.$os.$rbase.x.$arch + elif [ -r Makefiles/Makefile.$os.$rel$sfx ]; then + makefile=Makefile.$os.$rel$sfx + elif [ -r Makefiles/Makefile.$os.$rel ]; then makefile=Makefile.$os.$rel - elif [ -r Makefile.$os.$rbase.x ]; then + elif [ -r Makefiles/Makefile.$os.$rbase.x$sfx ]; then + makefile=Makefile.$os.$rbase.x$sfx + elif [ -r Makefiles/Makefile.$os.$rbase.x ]; then makefile=Makefile.$os.$rbase.x - elif [ -r Makefile.$os.$arch ]; then + elif [ -r Makefiles/Makefile.$os.$arch$sfx ]; then + makefile=Makefile.$os.$arch$sfx + elif [ -r Makefiles/Makefile.$os.$arch ]; then makefile=Makefile.$os.$arch - elif [ -r Makefile.$arch.$rel ]; then - makefile=Makefile.$arch.$rel - elif [ -r Makefile.$arch.$rbase.x ]; then - makefile=Makefile.$arch.$rbase.x - elif [ -r Makefile.$os ]; then + elif [ -r Makefiles/Makefile.$rel.$arch$sfx ]; then + makefile=Makefile.$rel.$arch$sfx + elif [ -r Makefiles/Makefile.$rel.$arch ]; then + makefile=Makefile.$rel.$arch + elif [ -r Makefiles/Makefile.$rbase.x.$arch$sfx ]; then + makefile=Makefile.$rbase.x.$arch$sfx + elif [ -r Makefiles/Makefile.$rbase.x.$arch ]; then + makefile=Makefile.$rbase.x.$arch + elif [ -r Makefiles/Makefile.$os$sfx ]; then + makefile=Makefile.$os$sfx + elif [ -r Makefiles/Makefile.$os ]; then makefile=Makefile.$os - elif [ -r Makefile.$arch ]; then + elif [ -r Makefiles/Makefile.$arch$sfx ]; then + makefile=Makefile.$arch$sfx + elif [ -r Makefiles/Makefile.$arch ]; then makefile=Makefile.$arch - elif [ -r Makefile.$rel ]; then + elif [ -r Makefiles/Makefile.$rel$sfx ]; then + makefile=Makefile.$rel$sfx + elif [ -r Makefiles/Makefile.$rel ]; then makefile=Makefile.$rel + elif [ -r Makefiles/Makefile.$rel$sfx ]; then + makefile=Makefile.$rel$sfx else echo "Cannot determine how to support $arch.$os.$rel" exit 1 fi + if [ "$mflag" ] + then + echo "Will run in virgin $obj using $makefile" + exit 0 + fi echo "Creating $obj using $makefile" mkdir $obj - (cd $obj; ln -s ../*.[ch158] ../sendmail.hf .; ln -s ../$makefile Makefile) + (cd $obj; ln -s ../*.[ch158] ../sendmail.hf .; ln -s ../Makefiles/$makefile Makefile) + echo "Making dependencies in $obj" + (cd $obj; ${MAKE-make} depend) fi + +if [ "$mflag" ] +then + makefile=`ls -l $obj/Makefile | sed 's/.* //'` + if [ -z "$makefile" ] + then + echo "ERROR: $obj exists but has no Makefile" + exit 1 + fi + case $makefile + in + ../Makefiles/*) + makefile=`echo $makefile | sed 's/...Makefiles.//'` + echo "Will run in existing $obj using $makefile" + ;; + + *) + echo "Will run in existing $obj using custom $makefile" + ;; + esac + exit 0 +fi + echo "Making in $obj" cd $obj -exec make -f Makefile $* +if [ $# = 0 ] +then + exec ${MAKE-make} +else + exec ${MAKE-make} "$@" +fi diff --git a/usr.sbin/sendmail/src/map.c b/usr.sbin/sendmail/src/map.c index a2b3337bb0f08..23060d07e6e9b 100644 --- a/usr.sbin/sendmail/src/map.c +++ b/usr.sbin/sendmail/src/map.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1992 Eric P. Allman. + * Copyright (c) 1992, 1995 Eric P. Allman. * Copyright (c) 1992, 1993 * The Regents of the University of California. All rights reserved. * @@ -33,19 +33,25 @@ */ #ifndef lint -static char sccsid[] = "@(#)map.c 8.25.1.1 (Berkeley) 2/10/95"; +static char sccsid[] = "@(#)map.c 8.108 (Berkeley) 11/29/95"; #endif /* not lint */ #include "sendmail.h" #ifdef NDBM -#include <ndbm.h> +# include <ndbm.h> #endif #ifdef NEWDB -#include <db.h> +# ifdef R_FIRST + ERROR README: You are running the Berkeley DB version of ndbm.h. See + ERROR README: the READ_ME file about tweaking Berkeley DB so it can + ERROR README: coexist with NDBM, or delete -DNDBM from the Makefile. +# endif +# include <db.h> #endif #ifdef NIS -#include <rpcsvc/ypclnt.h> + struct dom_binding; /* forward reference needed on IRIX */ +# include <rpcsvc/ypclnt.h> #endif /* @@ -82,11 +88,24 @@ static char sccsid[] = "@(#)map.c 8.25.1.1 (Berkeley) 2/10/95"; ** ** void map_close(MAP *map) ** Close the map. +** +** This file also includes the implementation for getcanonname. +** It is currently implemented in a pretty ad-hoc manner; it ought +** to be more properly integrated into the map structure. */ #define DBMMODE 0644 +#define EX_NOTFOUND EX_NOHOST + extern bool aliaswait __P((MAP *, char *, int)); +extern bool extract_canonname __P((char *, char *, char[])); + +#if defined(O_EXLOCK) && HASFLOCK +# define LOCK_ON_OPEN 1 /* we can open/create a locked file */ +#else +# define LOCK_ON_OPEN 0 /* no such luck -- bend over backwards */ +#endif /* ** MAP_PARSEARGS -- parse config line arguments for database lookup ** @@ -141,9 +160,59 @@ map_parseargs(map, ap) map->map_mflags |= MF_MATCHONLY; break; + case 'A': + map->map_mflags |= MF_APPEND; + break; + + case 'q': + map->map_mflags |= MF_KEEPQUOTES; + break; + case 'a': map->map_app = ++p; break; + + case 'k': + while (isascii(*++p) && isspace(*p)) + continue; + map->map_keycolnm = p; + break; + + case 'v': + while (isascii(*++p) && isspace(*p)) + continue; + map->map_valcolnm = p; + break; + + case 'z': + if (*++p != '\\') + map->map_coldelim = *p; + else + { + switch (*++p) + { + case 'n': + map->map_coldelim = '\n'; + break; + + case 't': + map->map_coldelim = '\t'; + break; + + default: + map->map_coldelim = '\\'; + } + } + break; +#ifdef RESERVED_FOR_SUN + case 'd': + map->map_mflags |= MF_DOMAIN_WIDE; + break; + + case 's': + /* info type */ + break; +#endif } while (*p != '\0' && !(isascii(*p) && isspace(*p))) p++; @@ -152,6 +221,10 @@ map_parseargs(map, ap) } if (map->map_app != NULL) map->map_app = newstr(map->map_app); + if (map->map_keycolnm != NULL) + map->map_keycolnm = newstr(map->map_keycolnm); + if (map->map_valcolnm != NULL) + map->map_valcolnm = newstr(map->map_valcolnm); if (*p != '\0') { @@ -168,7 +241,8 @@ map_parseargs(map, ap) if (*p != '\0') map->map_rebuild = newstr(p); - if (map->map_file == NULL) + if (map->map_file == NULL && + !bitset(MCF_OPTFILE, map->map_class->map_cflags)) { syserr("No file name for %s map %s", map->map_class->map_cname, map->map_mname); @@ -316,13 +390,14 @@ map_rewrite(map, s, slen, av) ** if ~NDBM: reads the aliases into the symbol table. */ +void initmaps(rebuild, e) bool rebuild; register ENVELOPE *e; { extern void map_init(); -#ifdef XDEBUG +#if XDEBUG checkfd012("entering initmaps"); #endif CurEnv = e; @@ -335,7 +410,7 @@ initmaps(rebuild, e) { stabapply(map_init, 0); } -#ifdef XDEBUG +#if XDEBUG checkfd012("exiting initmaps"); #endif } @@ -356,9 +431,10 @@ map_init(s, rebuild) return; if (tTd(38, 2)) - printf("map_init(%s:%s, %d)\n", + printf("map_init(%s:%s, %s, %d)\n", map->map_class->map_cname == NULL ? "NULL" : map->map_class->map_cname, + map->map_mname == NULL ? "NULL" : map->map_mname, map->map_file == NULL ? "NULL" : map->map_file, rebuild); @@ -386,23 +462,241 @@ map_init(s, rebuild) if (map->map_class->map_open(map, O_RDONLY)) { if (tTd(38, 4)) - printf("\t%s:%s: valid\n", + printf("\t%s:%s %s: valid\n", map->map_class->map_cname == NULL ? "NULL" : map->map_class->map_cname, + map->map_mname == NULL ? "NULL" : + map->map_mname, map->map_file == NULL ? "NULL" : map->map_file); 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" : - map->map_file, - errstring(errno)); + else + { + if (tTd(38, 4)) + printf("\t%s:%s %s: invalid: %s\n", + map->map_class->map_cname == NULL ? "NULL" : + map->map_class->map_cname, + map->map_mname == NULL ? "NULL" : + map->map_mname, + map->map_file == NULL ? "NULL" : + map->map_file, + errstring(errno)); + if (!bitset(MF_OPTIONAL, map->map_mflags)) + { + extern MAPCLASS BogusMapClass; + + map->map_class = &BogusMapClass; + map->map_mflags |= MF_OPEN; + } + } } } /* +** GETCANONNAME -- look up name using service switch +** +** Parameters: +** host -- the host name to look up. +** hbsize -- the size of the host buffer. +** trymx -- if set, try MX records. +** +** Returns: +** TRUE -- if the host was found. +** FALSE -- otherwise. +*/ + +bool +getcanonname(host, hbsize, trymx) + char *host; + int hbsize; + bool trymx; +{ + int nmaps; + int mapno; + bool found = FALSE; + bool got_tempfail = FALSE; + auto int stat; + char *maptype[MAXMAPSTACK]; + short mapreturn[MAXMAPACTIONS]; + + nmaps = switch_map_find("hosts", maptype, mapreturn); + for (mapno = 0; mapno < nmaps; mapno++) + { + int i; + + if (tTd(38, 20)) + printf("getcanonname(%s), trying %s\n", + host, maptype[mapno]); + if (strcmp("files", maptype[mapno]) == 0) + { + extern bool text_getcanonname __P((char *, int, int *)); + + found = text_getcanonname(host, hbsize, &stat); + } +#ifdef NIS + else if (strcmp("nis", maptype[mapno]) == 0) + { + extern bool nis_getcanonname __P((char *, int, int *)); + + found = nis_getcanonname(host, hbsize, &stat); + } +#endif +#ifdef NISPLUS + else if (strcmp("nisplus", maptype[mapno]) == 0) + { + extern bool nisplus_getcanonname __P((char *, int, int *)); + + found = nisplus_getcanonname(host, hbsize, &stat); + } +#endif +#if NAMED_BIND + else if (strcmp("dns", maptype[mapno]) == 0) + { + extern bool dns_getcanonname __P((char *, int, bool, int *)); + + found = dns_getcanonname(host, hbsize, trymx, &stat); + } +#endif +#if NETINFO + else if (strcmp("netinfo", maptype[mapno]) == 0) + { + extern bool ni_getcanonname __P((char *, int, int *)); + + found = ni_getcanonname(host, hbsize, &stat); + } +#endif + else + { + found = FALSE; + stat = EX_UNAVAILABLE; + } + + /* + ** Heuristic: if $m is not set, we are running during system + ** startup. In this case, when a name is apparently found + ** but has no dot, treat is as not found. This avoids + ** problems if /etc/hosts has no FQDN but is listed first + ** in the service switch. + */ + + if (found && + (macvalue('m', CurEnv) != NULL || strchr(host, '.') != NULL)) + break; + + /* see if we should continue */ + if (stat == EX_TEMPFAIL) + { + i = MA_TRYAGAIN; + got_tempfail = TRUE; + } + else if (stat == EX_NOTFOUND) + i = MA_NOTFOUND; + else + i = MA_UNAVAIL; + if (bitset(1 << mapno, mapreturn[i])) + break; + } + + if (found) + { + char *d; + + if (tTd(38, 20)) + printf("getcanonname(%s), found\n", host); + + /* + ** If returned name is still single token, compensate + ** by tagging on $m. This is because some sites set + ** up their DNS or NIS databases wrong. + */ + + if ((d = strchr(host, '.')) == NULL || d[1] == '\0') + { + d = macvalue('m', CurEnv); + if (d != NULL && + hbsize > (int) (strlen(host) + strlen(d) + 1)) + { + if (host[strlen(host) - 1] != '.') + strcat(host, "."); + strcat(host, d); + } + else + { + return FALSE; + } + } + return TRUE; + } + + if (tTd(38, 20)) + printf("getcanonname(%s), failed, stat=%d\n", host, stat); + +#if NAMED_BIND + if (stat == EX_NOHOST && !got_tempfail) + h_errno = HOST_NOT_FOUND; + else + h_errno = TRY_AGAIN; +#endif + + return FALSE; +} +/* +** EXTRACT_CANONNAME -- extract canonical name from /etc/hosts entry +** +** Parameters: +** name -- the name against which to match. +** line -- the /etc/hosts line. +** cbuf -- the location to store the result. +** +** Returns: +** TRUE -- if the line matched the desired name. +** FALSE -- otherwise. +*/ + +bool +extract_canonname(name, line, cbuf) + char *name; + char *line; + char cbuf[]; +{ + int i; + char *p; + bool found = FALSE; + extern char *get_column(); + + cbuf[0] = '\0'; + if (line[0] == '#') + return FALSE; + + for (i = 1; ; i++) + { + char nbuf[MAXNAME + 1]; + + p = get_column(line, i, '\0', nbuf); + if (p == NULL) + break; + if (cbuf[0] == '\0' || + (strchr(cbuf, '.') == NULL && strchr(p, '.') != NULL)) + strcpy(cbuf, p); + if (strcasecmp(name, p) == 0) + found = TRUE; + } + if (found && strchr(cbuf, '.') == NULL) + { + /* try to add a domain on the end of the name */ + char *domain = macvalue('m', CurEnv); + + if (domain != NULL && + strlen(domain) + strlen(cbuf) + 1 < MAXNAME) + { + p = &cbuf[strlen(cbuf)]; + *p++ = '.'; + strcpy(p, domain); + } + } + return found; +} +/* ** NDBM modules */ @@ -419,40 +713,99 @@ ndbm_map_open(map, mode) { register DBM *dbm; struct stat st; + int fd; if (tTd(38, 2)) - printf("ndbm_map_open(%s, %d)\n", map->map_file, mode); + printf("ndbm_map_open(%s, %s, %d)\n", + map->map_mname, map->map_file, mode); +#if LOCK_ON_OPEN + if (mode == O_RDONLY) + mode |= O_SHLOCK; + else + mode |= O_CREAT|O_TRUNC|O_EXLOCK; +#else if (mode == O_RDWR) + { +# ifdef NOFTRUNCATE + /* + ** Warning: race condition. Try to lock the file as + ** quickly as possible after opening it. + */ + mode |= O_CREAT|O_TRUNC; +# else + /* + ** This ugly code opens the map without truncating it, + ** locks the file, then truncates it. Necessary to + ** avoid race conditions. + */ + + int dirfd; + int pagfd; + char dirfile[MAXNAME + 1]; + char pagfile[MAXNAME + 1]; + + sprintf(dirfile, "%s.dir", map->map_file); + sprintf(pagfile, "%s.pag", map->map_file); + dirfd = open(dirfile, mode|O_CREAT, DBMMODE); + pagfd = open(pagfile, mode|O_CREAT, DBMMODE); + + if (dirfd < 0 || pagfd < 0) + { + syserr("ndbm_map_open: cannot create database %s", + map->map_file); + close(dirfd); + close(pagfd); + return FALSE; + } + if (!lockfile(dirfd, map->map_file, ".dir", LOCK_EX)) + syserr("ndbm_map_open: cannot lock %s.dir", + map->map_file); + if (ftruncate(dirfd, 0) < 0) + syserr("ndbm_map_open: cannot truncate %s.dir", + map->map_file); + if (ftruncate(pagfd, 0) < 0) + syserr("ndbm_map_open: cannot truncate %s.pag", + map->map_file); + + /* we can safely unlock because others will wait for @:@ */ + close(dirfd); + close(pagfd); +# endif + } +#endif /* open the database */ dbm = dbm_open(map->map_file, mode, DBMMODE); if (dbm == NULL) { -#ifdef MAYBENEXTRELEASE - if (aliaswait(map, ".pag", FALSE)) + if (bitset(MF_ALIAS, map->map_mflags) && + aliaswait(map, ".pag", FALSE)) return TRUE; -#endif if (!bitset(MF_OPTIONAL, map->map_mflags)) syserr("Cannot open DBM database %s", map->map_file); return FALSE; } map->map_db1 = (void *) dbm; + fd = dbm_dirfno((DBM *) map->map_db1); if (mode == O_RDONLY) { +#if LOCK_ON_OPEN + if (fd >= 0) + (void) lockfile(fd, map->map_file, ".pag", LOCK_UN); +#endif 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 !LOCK_ON_OPEN if (fd >= 0 && !bitset(MF_LOCKED, map->map_mflags) && lockfile(fd, map->map_file, ".dir", LOCK_EX)) +#endif map->map_mflags |= MF_LOCKED; } if (fstat(dbm_dirfno((DBM *) map->map_db1), &st) >= 0) @@ -477,7 +830,8 @@ ndbm_map_lookup(map, name, av, statp) char keybuf[MAXNAME + 1]; if (tTd(38, 20)) - printf("ndbm_map_lookup(%s)\n", name); + printf("ndbm_map_lookup(%s, %s)\n", + map->map_mname, name); key.dptr = name; key.dsize = strlen(name); @@ -532,7 +886,8 @@ ndbm_map_store(map, lhs, rhs) int stat; if (tTd(38, 12)) - printf("ndbm_map_store(%s, %s)\n", lhs, rhs); + printf("ndbm_map_store(%s, %s, %s)\n", + map->map_mname, lhs, rhs); key.dsize = strlen(lhs); key.dptr = lhs; @@ -549,7 +904,33 @@ ndbm_map_store(map, lhs, rhs) stat = dbm_store((DBM *) map->map_db1, key, data, DBM_INSERT); if (stat > 0) { - usrerr("050 Warning: duplicate alias name %s", lhs); + if (!bitset(MF_APPEND, map->map_mflags)) + usrerr("050 Warning: duplicate alias name %s", lhs); + else + { + static char *buf = NULL; + static int bufsiz = 0; + auto int xstat; + datum old; + + old.dptr = ndbm_map_lookup(map, key.dptr, NULL, &xstat); + if (old.dptr != NULL && *old.dptr != '\0') + { + old.dsize = strlen(old.dptr); + if (data.dsize + old.dsize + 2 > bufsiz) + { + if (buf != NULL) + (void) free(buf); + bufsiz = data.dsize + old.dsize + 2; + buf = xalloc(bufsiz); + } + sprintf(buf, "%s,%s", data.dptr, old.dptr); + data.dsize = data.dsize + old.dsize + 1; + data.dptr = buf; + if (tTd(38, 9)) + printf("ndbm_map_store append=%s\n", data.dptr); + } + } stat = dbm_store((DBM *) map->map_db1, key, data, DBM_REPLACE); } if (stat != 0) @@ -566,7 +947,8 @@ ndbm_map_close(map) register MAP *map; { if (tTd(38, 9)) - printf("ndbm_map_close(%s, %x)\n", map->map_file, map->map_mflags); + printf("ndbm_map_close(%s, %s, %x)\n", + map->map_mname, map->map_file, map->map_mflags); if (bitset(MF_WRITABLE, map->map_mflags)) { @@ -577,11 +959,14 @@ ndbm_map_close(map) inclnull = bitset(MF_INCLNULL, map->map_mflags); map->map_mflags &= ~MF_INCLNULL; - (void) sprintf(buf, "%010ld", curtime()); - ndbm_map_store(map, "YP_LAST_MODIFIED", buf); + if (strstr(map->map_file, "/yp/") != NULL) + { + (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); + (void) gethostname(buf, sizeof buf); + ndbm_map_store(map, "YP_MASTER_NAME", buf); + } if (inclnull) map->map_mflags |= MF_INCLNULL; @@ -617,143 +1002,111 @@ bt_map_open(map, mode) MAP *map; int mode; { - DB *db; - int i; - int omode; - int fd; - struct stat st; - char buf[MAXNAME]; - if (tTd(38, 2)) - printf("bt_map_open(%s, %d)\n", map->map_file, mode); - - omode = mode; - if (omode == O_RDWR) - { - omode |= O_CREAT|O_TRUNC; -#if defined(O_EXLOCK) && HASFLOCK - omode |= O_EXLOCK; -# if !OLD_NEWDB - } - else - { - omode |= O_SHLOCK; -# endif -#endif - } - - (void) strcpy(buf, map->map_file); - i = strlen(buf); - if (i < 3 || strcmp(&buf[i - 3], ".db") != 0) - (void) strcat(buf, ".db"); - db = dbopen(buf, omode, DBMMODE, DB_BTREE, NULL); - if (db == NULL) - { -#ifdef MAYBENEXTRELEASE - if (aliaswait(map, ".db", FALSE)) - return TRUE; -#endif - if (!bitset(MF_OPTIONAL, map->map_mflags)) - syserr("Cannot open BTREE database %s", map->map_file); - return FALSE; - } -#if !OLD_NEWDB && HASFLOCK - fd = db->fd(db); -# if !defined(O_EXLOCK) - if (mode == O_RDWR && fd >= 0) - { - if (lockfile(fd, map->map_file, ".db", LOCK_EX)) - map->map_mflags |= MF_LOCKED; - } -# else - if (mode == O_RDONLY && fd >= 0) - (void) lockfile(fd, map->map_file, ".db", LOCK_UN); - else - map->map_mflags |= MF_LOCKED; -# endif -#endif - - /* try to make sure that at least the database header is on disk */ - if (mode == O_RDWR) -#if OLD_NEWDB - (void) db->sync(db); -#else - (void) db->sync(db, 0); - - if (fd >= 0 && fstat(fd, &st) >= 0) - map->map_mtime = st.st_mtime; -#endif - - map->map_db2 = (void *) db; - if (mode == O_RDONLY && bitset(MF_ALIAS, map->map_mflags)) - if (!aliaswait(map, ".db", TRUE)) - return FALSE; - return TRUE; + printf("bt_map_open(%s, %s, %d)\n", + map->map_mname, map->map_file, mode); + return db_map_open(map, mode, DB_BTREE); } - -/* -** HASH_MAP_INIT -- HASH-style map initialization -*/ - bool hash_map_open(map, mode) MAP *map; int mode; { + if (tTd(38, 2)) + printf("hash_map_open(%s, %s, %d)\n", + map->map_mname, map->map_file, mode); + return db_map_open(map, mode, DB_HASH); +} + +bool +db_map_open(map, mode, dbtype) + MAP *map; + int mode; + DBTYPE dbtype; +{ DB *db; int i; int omode; int fd; + int saveerrno; struct stat st; - char buf[MAXNAME]; + char buf[MAXNAME + 1]; - if (tTd(38, 2)) - printf("hash_map_open(%s, %d)\n", map->map_file, mode); + (void) strcpy(buf, map->map_file); + i = strlen(buf); + if (i < 3 || strcmp(&buf[i - 3], ".db") != 0) + (void) strcat(buf, ".db"); omode = mode; - if (omode == O_RDWR) - { - omode |= O_CREAT|O_TRUNC; -#if defined(O_EXLOCK) && HASFLOCK - omode |= O_EXLOCK; + +#if LOCK_ON_OPEN + if (mode == O_RDWR) + omode |= O_CREAT|O_TRUNC|O_EXLOCK; # if !OLD_NEWDB - } else - { omode |= O_SHLOCK; # endif -#endif +#else + if (mode == O_RDWR) + omode |= O_CREAT; + + /* + ** Pre-lock the file to avoid race conditions. In particular, + ** since dbopen returns NULL if the file is zero length, we + ** must have a locked instance around the dbopen. + */ + + fd = open(buf, omode, DBMMODE); + + if (fd < 0) + { + syserr("db_map_open: cannot pre-open database %s", + buf); + close(fd); + return FALSE; } + if (!lockfile(fd, map->map_file, ".db", + mode == O_RDONLY ? LOCK_SH : LOCK_EX)) + syserr("db_map_open: cannot lock %s", buf); + if (mode == O_RDWR) + omode |= O_TRUNC; +#endif + + db = dbopen(buf, omode, DBMMODE, dbtype, NULL); + saveerrno = errno; + +#if !LOCK_ON_OPEN + /* we can safely unlock now because others will wait for @:@ */ + close(fd); +#endif - (void) strcpy(buf, map->map_file); - i = strlen(buf); - if (i < 3 || strcmp(&buf[i - 3], ".db") != 0) - (void) strcat(buf, ".db"); - db = dbopen(buf, omode, DBMMODE, DB_HASH, NULL); if (db == NULL) { -#ifdef MAYBENEXTRELEASE - if (aliaswait(map, ".db", FALSE)) + if (mode == O_RDONLY && bitset(MF_ALIAS, map->map_mflags) && + aliaswait(map, ".db", FALSE)) return TRUE; -#endif + errno = saveerrno; if (!bitset(MF_OPTIONAL, map->map_mflags)) - syserr("Cannot open HASH database %s", map->map_file); + syserr("Cannot open DB database %s", map->map_file); return FALSE; } -#if !OLD_NEWDB && HASFLOCK +#if !OLD_NEWDB fd = db->fd(db); -# if !defined(O_EXLOCK) +# if LOCK_ON_OPEN + if (fd >= 0) + { + if (mode == O_RDONLY) + (void) lockfile(fd, map->map_file, ".db", LOCK_UN); + else + map->map_mflags |= MF_LOCKED; + } +# else if (mode == O_RDWR && fd >= 0) { if (lockfile(fd, map->map_file, ".db", LOCK_EX)) map->map_mflags |= MF_LOCKED; } -# else - if (mode == O_RDONLY && fd >= 0) - (void) lockfile(fd, map->map_file, ".db", LOCK_UN); - else - map->map_mflags |= MF_LOCKED; # endif #endif @@ -769,9 +1122,9 @@ hash_map_open(map, mode) #endif map->map_db2 = (void *) db; - if (mode == O_RDONLY && bitset(MF_ALIAS, map->map_mflags)) - if (!aliaswait(map, ".db", TRUE)) - return FALSE; + if (mode == O_RDONLY && bitset(MF_ALIAS, map->map_mflags) && + !aliaswait(map, ".db", TRUE)) + return FALSE; return TRUE; } @@ -795,7 +1148,8 @@ db_map_lookup(map, name, av, statp) char keybuf[MAXNAME + 1]; if (tTd(38, 20)) - printf("db_map_lookup(%s)\n", name); + printf("db_map_lookup(%s, %s)\n", + map->map_mname, name); key.size = strlen(name); if (key.size > sizeof keybuf - 1) @@ -857,8 +1211,9 @@ db_map_store(map, lhs, rhs) DBT data; register DB *db = map->map_db2; - if (tTd(38, 20)) - printf("db_map_store(%s, %s)\n", lhs, rhs); + if (tTd(38, 12)) + printf("db_map_store(%s, %s, %s)\n", + map->map_mname, lhs, rhs); key.size = strlen(lhs); key.data = lhs; @@ -875,7 +1230,32 @@ db_map_store(map, lhs, rhs) stat = db->put(db, &key, &data, R_NOOVERWRITE); if (stat > 0) { - usrerr("050 Warning: duplicate alias name %s", lhs); + if (!bitset(MF_APPEND, map->map_mflags)) + usrerr("050 Warning: duplicate alias name %s", lhs); + else + { + static char *buf = NULL; + static int bufsiz = 0; + DBT old; + + old.data = db_map_lookup(map, key.data, NULL, &stat); + if (old.data != NULL) + { + old.size = strlen(old.data); + if (data.size + old.size + 2 > bufsiz) + { + if (buf != NULL) + (void) free(buf); + bufsiz = data.size + old.size + 2; + buf = xalloc(bufsiz); + } + sprintf(buf, "%s,%s", data.data, old.data); + data.size = data.size + old.size + 1; + data.data = buf; + if (tTd(38, 9)) + printf("db_map_store append=%s\n", data.data); + } + } stat = db->put(db, &key, &data, 0); } if (stat != 0) @@ -894,7 +1274,8 @@ db_map_close(map) register DB *db = map->map_db2; if (tTd(38, 9)) - printf("db_map_close(%s, %x)\n", map->map_file, map->map_mflags); + printf("db_map_close(%s, %s, %x)\n", + map->map_mname, map->map_file, map->map_mflags); if (bitset(MF_WRITABLE, map->map_mflags)) { @@ -930,10 +1311,10 @@ nis_map_open(map, mode) register char *p; auto char *vp; auto int vsize; - char *master; if (tTd(38, 2)) - printf("nis_map_open(%s)\n", map->map_file); + printf("nis_map_open(%s, %s, %d)\n", + map->map_mname, map->map_file, mode); if (mode != O_RDONLY) { @@ -967,7 +1348,7 @@ nis_map_open(map, mode) if (yperr != 0) { if (!bitset(MF_OPTIONAL, map->map_mflags)) - syserr("NIS map %s specified, but NIS not running\n", + syserr("421 NIS map %s specified, but NIS not running\n", map->map_file); return FALSE; } @@ -977,14 +1358,29 @@ nis_map_open(map, mode) yperr = yp_match(map->map_domain, map->map_file, "@", 1, &vp, &vsize); if (tTd(38, 10)) - printf("nis_map_open: yp_match(%s, %s) => %s\n", + printf("nis_map_open: yp_match(@, %s, %s) => %s\n", map->map_domain, map->map_file, yperr_string(yperr)); if (yperr == 0 || yperr == YPERR_KEY || yperr == YPERR_BUSY) - return TRUE; + { + /* + ** We ought to be calling aliaswait() here if this is an + ** alias file, but powerful HP-UX NIS servers apparently + ** don't insert the @:@ token into the alias map when it + ** is rebuilt, so aliaswait() just hangs. I hate HP-UX. + */ + +#if 0 + if (!bitset(MF_ALIAS, map->map_mflags) || + aliaswait(map, NULL, TRUE)) +#endif + return TRUE; + } if (!bitset(MF_OPTIONAL, map->map_mflags)) - syserr("Cannot bind to domain %s: %s", map->map_domain, - yperr_string(yperr)); + { + syserr("421 Cannot bind to map %s in domain %s: %s", + map->map_file, map->map_domain, yperr_string(yperr)); + } return FALSE; } @@ -1008,7 +1404,8 @@ nis_map_lookup(map, name, av, statp) char keybuf[MAXNAME + 1]; if (tTd(38, 20)) - printf("nis_map_lookup(%s)\n", name); + printf("nis_map_lookup(%s, %s)\n", + map->map_mname, name); buflen = strlen(name); if (buflen > sizeof keybuf - 1) @@ -1046,31 +1443,1131 @@ nis_map_lookup(map, name, av, statp) /* -** NIS_MAP_STORE +** NIS_GETCANONNAME -- look up canonical name in NIS */ -void -nis_map_store(map, lhs, rhs) +bool +nis_getcanonname(name, hbsize, statp) + char *name; + int hbsize; + int *statp; +{ + char *vp; + auto int vsize; + int keylen; + int yperr; + static bool try0null = TRUE; + static bool try1null = TRUE; + static char *yp_domain = NULL; + char host_record[MAXLINE]; + char cbuf[MAXNAME]; + char nbuf[MAXNAME + 1]; + + if (tTd(38, 20)) + printf("nis_getcanonname(%s)\n", name); + + if (strlen(name) >= sizeof nbuf) + { + *statp = EX_UNAVAILABLE; + return FALSE; + } + (void) strcpy(nbuf, name); + shorten_hostname(nbuf); + keylen = strlen(nbuf); + + if (yp_domain == NULL) + yp_get_default_domain(&yp_domain); + makelower(nbuf); + yperr = YPERR_KEY; + if (try0null) + { + yperr = yp_match(yp_domain, "hosts.byname", nbuf, keylen, + &vp, &vsize); + if (yperr == 0) + try1null = FALSE; + } + if (yperr == YPERR_KEY && try1null) + { + keylen++; + yperr = yp_match(yp_domain, "hosts.byname", nbuf, keylen, + &vp, &vsize); + if (yperr == 0) + try0null = FALSE; + } + if (yperr != 0) + { + if (yperr == YPERR_KEY) + *statp = EX_NOHOST; + else if (yperr == YPERR_BUSY) + *statp = EX_TEMPFAIL; + else + *statp = EX_UNAVAILABLE; + return FALSE; + } + strncpy(host_record, vp, vsize); + host_record[vsize] = '\0'; + if (tTd(38, 44)) + printf("got record `%s'\n", host_record); + if (!extract_canonname(nbuf, host_record, cbuf)) + { + /* this should not happen, but.... */ + *statp = EX_NOHOST; + return FALSE; + } + if (hbsize < strlen(cbuf)) + { + *statp = EX_UNAVAILABLE; + return FALSE; + } + strcpy(name, cbuf); + *statp = EX_OK; + return TRUE; +} + +#endif +/* +** NISPLUS Modules +** +** This code donated by Sun Microsystems. +*/ + +#ifdef NISPLUS + +#undef NIS /* symbol conflict in nis.h */ +#include <rpcsvc/nis.h> +#include <rpcsvc/nislib.h> + +#define EN_col(col) zo_data.objdata_u.en_data.en_cols.en_cols_val[(col)].ec_value.ec_value_val +#define COL_NAME(res,i) ((res->objects.objects_val)->TA_data.ta_cols.ta_cols_val)[i].tc_name +#define COL_MAX(res) ((res->objects.objects_val)->TA_data.ta_cols.ta_cols_len) +#define PARTIAL_NAME(x) ((x)[strlen(x) - 1] != '.') + +/* +** NISPLUS_MAP_OPEN -- open nisplus table +*/ + +bool +nisplus_map_open(map, mode) MAP *map; - char *lhs; - char *rhs; + int mode; { - /* nothing */ + register char *p; + char qbuf[MAXLINE + NIS_MAXNAMELEN]; + nis_result *res = NULL; + u_int objs_len; + nis_object *obj_ptr; + int retry_cnt, max_col, i; + + if (tTd(38, 2)) + printf("nisplus_map_open(%s, %s, %d)\n", + map->map_mname, map->map_file, mode); + + if (mode != O_RDONLY) + { + errno = ENODEV; + return FALSE; + } + + if (*map->map_file == '\0') + map->map_file = "mail_aliases.org_dir"; + + if (PARTIAL_NAME(map->map_file) && map->map_domain == NULL) + { + /* set default NISPLUS Domain to $m */ + extern char *nisplus_default_domain(); + + map->map_domain = newstr(nisplus_default_domain()); + if (tTd(38, 2)) + printf("nisplus_map_open(%s): using domain %s\n", + map->map_file, map->map_domain); + } + if (!PARTIAL_NAME(map->map_file)) + map->map_domain = newstr(""); + + /* check to see if this map actually exists */ + if (PARTIAL_NAME(map->map_file)) + sprintf(qbuf, "%s.%s", map->map_file, map->map_domain); + else + strcpy(qbuf, map->map_file); + + retry_cnt = 0; + while (res == NULL || res->status != NIS_SUCCESS) + { + res = nis_lookup(qbuf, FOLLOW_LINKS); + switch (res->status) + { + case NIS_SUCCESS: + break; + + case NIS_TRYAGAIN: + case NIS_RPCERROR: + case NIS_NAMEUNREACHABLE: + if (retry_cnt++ > 4) + { + errno = EBADR; + return FALSE; + } + /* try not to overwhelm hosed server */ + sleep(2); + break; + + default: /* all other nisplus errors */ +#if 0 + if (!bitset(MF_OPTIONAL, map->map_mflags)) + syserr("421 Cannot find table %s.%s: %s", + map->map_file, map->map_domain, + nis_sperrno(res->status)); +#endif + errno = EBADR; + return FALSE; + } + } + + if (NIS_RES_NUMOBJ(res) != 1 || + (NIS_RES_OBJECT(res)->zo_data.zo_type != TABLE_OBJ)) + { + if (tTd(38, 10)) + printf("nisplus_map_open: %s is not a table\n", qbuf); +#if 0 + if (!bitset(MF_OPTIONAL, map->map_mflags)) + syserr("421 %s.%s: %s is not a table", + map->map_file, map->map_domain, + nis_sperrno(res->status)); +#endif + errno = EBADR; + return FALSE; + } + /* default key column is column 0 */ + if (map->map_keycolnm == NULL) + map->map_keycolnm = newstr(COL_NAME(res,0)); + + max_col = COL_MAX(res); + + /* verify the key column exist */ + for (i=0; i< max_col; i++) + { + if (!strcmp(map->map_keycolnm, COL_NAME(res,i))) + break; + } + if (i == max_col) + { + if (tTd(38, 2)) + printf("nisplus_map_open(%s): can not find key column %s\n", + map->map_file, map->map_keycolnm); + errno = EBADR; + return FALSE; + } + + /* default value column is the last column */ + if (map->map_valcolnm == NULL) + { + map->map_valcolno = max_col - 1; + return TRUE; + } + + for (i=0; i< max_col; i++) + { + if (strcmp(map->map_valcolnm, COL_NAME(res,i)) == 0) + { + map->map_valcolno = i; + return TRUE; + } + } + + if (tTd(38, 2)) + printf("nisplus_map_open(%s): can not find column %s\n", + map->map_file, map->map_keycolnm); + errno = EBADR; + return FALSE; } /* -** NIS_MAP_CLOSE +** NISPLUS_MAP_LOOKUP -- look up a datum in a NISPLUS table */ -void -nis_map_close(map) +char * +nisplus_map_lookup(map, name, av, statp) + MAP *map; + char *name; + char **av; + int *statp; +{ + char *vp; + auto int vsize; + int buflen; + char search_key[MAXNAME + 1]; + char qbuf[MAXLINE + NIS_MAXNAMELEN]; + nis_result *result; + + if (tTd(38, 20)) + printf("nisplus_map_lookup(%s, %s)\n", + map->map_mname, name); + + if (!bitset(MF_OPEN, map->map_mflags)) + { + if (nisplus_map_open(map, O_RDONLY)) + map->map_mflags |= MF_OPEN; + else + { + *statp = EX_UNAVAILABLE; + return NULL; + } + } + + buflen = strlen(name); + if (buflen > sizeof search_key - 1) + buflen = sizeof search_key - 1; + bcopy(name, search_key, buflen + 1); + if (!bitset(MF_NOFOLDCASE, map->map_mflags)) + makelower(search_key); + + /* construct the query */ + if (PARTIAL_NAME(map->map_file)) + sprintf(qbuf, "[%s=%s],%s.%s", map->map_keycolnm, + search_key, map->map_file, map->map_domain); + else + sprintf(qbuf, "[%s=%s],%s", map->map_keycolnm, + search_key, map->map_file); + + if (tTd(38, 20)) + printf("qbuf=%s\n", qbuf); + result = nis_list(qbuf, FOLLOW_LINKS | FOLLOW_PATH, NULL, NULL); + if (result->status == NIS_SUCCESS) + { + int count; + char *str; + + if ((count = NIS_RES_NUMOBJ(result)) != 1) + { + if (LogLevel > 10) + syslog(LOG_WARNING, + "%s: lookup error, expected 1 entry, got %d", + map->map_file, count); + + /* ignore second entry */ + if (tTd(38, 20)) + printf("nisplus_map_lookup(%s), got %d entries, additional entries ignored\n", + name, count); + } + + vp = ((NIS_RES_OBJECT(result))->EN_col(map->map_valcolno)); + /* set the length of the result */ + if (vp == NULL) + vp = ""; + vsize = strlen(vp); + if (tTd(38, 20)) + printf("nisplus_map_lookup(%s), found %s\n", + name, vp); + if (bitset(MF_MATCHONLY, map->map_mflags)) + str = map_rewrite(map, name, strlen(name), NULL); + else + str = map_rewrite(map, vp, vsize, av); + nis_freeresult(result); + *statp = EX_OK; + return str; + } + else + { + if (result->status == NIS_NOTFOUND) + *statp = EX_NOTFOUND; + else if (result->status == NIS_TRYAGAIN) + *statp = EX_TEMPFAIL; + else + { + *statp = EX_UNAVAILABLE; + map->map_mflags &= ~(MF_VALID|MF_OPEN); + } + } + if (tTd(38, 20)) + printf("nisplus_map_lookup(%s), failed\n", name); + nis_freeresult(result); + return NULL; +} + + + +/* +** NISPLUS_GETCANONNAME -- look up canonical name in NIS+ +*/ + +bool +nisplus_getcanonname(name, hbsize, statp) + char *name; + int hbsize; + int *statp; +{ + char *vp; + auto int vsize; + nis_result *result; + char *p; + char nbuf[MAXNAME + 1]; + char qbuf[MAXLINE + NIS_MAXNAMELEN]; + + if (strlen(name) >= sizeof nbuf) + { + *statp = EX_UNAVAILABLE; + return FALSE; + } + (void) strcpy(nbuf, name); + shorten_hostname(nbuf); + + p = strchr(nbuf, '.'); + if (p == NULL) + { + /* single token */ + sprintf(qbuf, "[name=%s],hosts.org_dir", nbuf); + } + else if (p[1] != '\0') + { + /* multi token -- take only first token in nbuf */ + *p = '\0'; + sprintf(qbuf, "[name=%s],hosts.org_dir.%s", nbuf, &p[1]); + } + else + { + *statp = EX_NOHOST; + return FALSE; + } + + if (tTd(38, 20)) + printf("\nnisplus_getcanoname(%s), qbuf=%s\n", + name, qbuf); + + result = nis_list(qbuf, EXPAND_NAME|FOLLOW_LINKS|FOLLOW_PATH, + NULL, NULL); + + if (result->status == NIS_SUCCESS) + { + int count; + char *str; + char *domain; + + if ((count = NIS_RES_NUMOBJ(result)) != 1) + { +#ifdef LOG + if (LogLevel > 10) + syslog(LOG_WARNING, + "nisplus_getcanonname: lookup error, expected 1 entry, got %d", + count); +#endif + + /* ignore second entry */ + if (tTd(38, 20)) + printf("nisplus_getcanoname(%s), got %d entries, all but first ignored\n", name); + } + + if (tTd(38, 20)) + printf("nisplus_getcanoname(%s), found in directory \"%s\"\n", + name, (NIS_RES_OBJECT(result))->zo_domain); + + + vp = ((NIS_RES_OBJECT(result))->EN_col(0)); + vsize = strlen(vp); + if (tTd(38, 20)) + printf("nisplus_getcanonname(%s), found %s\n", + name, vp); + if (strchr(vp, '.') != NULL) + { + domain = ""; + } + else + { + domain = macvalue('m', CurEnv); + if (domain == NULL) + domain = ""; + } + if (hbsize > vsize + (int) strlen(domain) + 1) + { + if (domain[0] == '\0') + strcpy(name, vp); + else + sprintf(name, "%s.%s", vp, domain); + *statp = EX_OK; + } + else + *statp = EX_NOHOST; + nis_freeresult(result); + return TRUE; + } + else + { + if (result->status == NIS_NOTFOUND) + *statp = EX_NOHOST; + else if (result->status == NIS_TRYAGAIN) + *statp = EX_TEMPFAIL; + else + *statp = EX_UNAVAILABLE; + } + if (tTd(38, 20)) + printf("nisplus_getcanonname(%s), failed, status=%d, nsw_stat=%d\n", + name, result->status, *statp); + nis_freeresult(result); + return FALSE; +} + + +char * +nisplus_default_domain() +{ + static char default_domain[MAXNAME + 1] = ""; + char *p; + + if (default_domain[0] != '\0') + return(default_domain); + + p = nis_local_directory(); + strcpy(default_domain, p); + return default_domain; +} + +#endif /* NISPLUS */ +/* +** HESIOD Modules +*/ + +#ifdef HESIOD + +#include <hesiod.h> + +bool +hes_map_open(map, mode) + MAP *map; + int mode; +{ + if (tTd(38, 2)) + printf("hes_map_open(%s, %s, %d)\n", + map->map_mname, map->map_file, mode); + + if (mode != O_RDONLY) + { + /* issue a pseudo-error message */ +#ifdef ENOSYS + errno = ENOSYS; +#else +# ifdef EFTYPE + errno = EFTYPE; +# else + errno = ENXIO; +# endif +#endif + return FALSE; + } + + if (hes_error() == HES_ER_UNINIT) + hes_init(); + switch (hes_error()) + { + case HES_ER_OK: + case HES_ER_NOTFOUND: + return TRUE; + } + + if (!bitset(MF_OPTIONAL, map->map_mflags)) + syserr("421 cannot initialize Hesiod map (%d)", hes_error()); + + return FALSE; +} + +char * +hes_map_lookup(map, name, av, statp) + MAP *map; + char *name; + char **av; + int *statp; +{ + char **hp; + + if (tTd(38, 20)) + printf("hes_map_lookup(%s, %s)\n", map->map_file, name); + + if (name[0] == '\\') + { + char *np; + int nl; + char nbuf[MAXNAME]; + + nl = strlen(name); + if (nl < sizeof nbuf - 1) + np = nbuf; + else + np = xalloc(strlen(name) + 2); + np[0] = '\\'; + strcpy(&np[1], name); + hp = hes_resolve(np, map->map_file); + if (np != nbuf) + free(np); + } + else + { + hp = hes_resolve(name, map->map_file); + } + if (hp == NULL || hp[0] == NULL) + { + switch (hes_error()) + { + case HES_ER_OK: + *statp = EX_OK; + break; + + case HES_ER_NOTFOUND: + *statp = EX_NOTFOUND; + break; + + case HES_ER_CONFIG: + *statp = EX_UNAVAILABLE; + break; + + case HES_ER_NET: + *statp = EX_TEMPFAIL; + break; + } + return NULL; + } + + if (bitset(MF_MATCHONLY, map->map_mflags)) + return map_rewrite(map, name, strlen(name), NULL); + else + return map_rewrite(map, hp[0], strlen(hp[0]), av); +} + +#endif +/* +** NeXT NETINFO Modules +*/ + +#if NETINFO + +# define NETINFO_DEFAULT_DIR "/aliases" +# define NETINFO_DEFAULT_PROPERTY "members" + +extern char *ni_propval __P((char *, char *, char *, char *, int)); + + +/* +** NI_MAP_OPEN -- open NetInfo Aliases +*/ + +bool +ni_map_open(map, mode) + MAP *map; + int mode; +{ + char *p; + + if (tTd(38, 20)) + printf("ni_map_open(%s, %s, %d)\n", + map->map_mname, map->map_file, mode); + + if (*map->map_file == '\0') + map->map_file = NETINFO_DEFAULT_DIR; + + if (map->map_valcolnm == NULL) + map->map_valcolnm = NETINFO_DEFAULT_PROPERTY; + + if (map->map_coldelim == '\0' && bitset(MF_ALIAS, map->map_mflags)) + map->map_coldelim = ','; + + return TRUE; +} + + +/* +** NI_MAP_LOOKUP -- look up a datum in NetInfo +*/ + +char * +ni_map_lookup(map, name, av, statp) MAP *map; + char *name; + char **av; + int *statp; { - /* nothing */ + char *res; + char *propval; + + if (tTd(38, 20)) + printf("ni_map_lookup(%s, %s)\n", map->map_mname, name); + + propval = ni_propval(map->map_file, map->map_keycolnm, name, + map->map_valcolnm, map->map_coldelim); + + if (propval == NULL) + return NULL; + + if (bitset(MF_MATCHONLY, map->map_mflags)) + res = map_rewrite(map, name, strlen(name), NULL); + else + res = map_rewrite(map, propval, strlen(propval), av); + free(propval); + return res; } -#endif /* NIS */ + +bool +ni_getcanonname(name, hbsize, statp) + char *name; + int hbsize; + int *statp; +{ + char *vptr; + char nbuf[MAXNAME + 1]; + + if (tTd(38, 20)) + printf("ni_getcanonname(%s)\n", name); + + if (strlen(name) >= sizeof nbuf) + { + *statp = EX_UNAVAILABLE; + return FALSE; + } + (void) strcpy(nbuf, name); + shorten_hostname(nbuf); + + /* we only accept single token search key */ + if (strchr(nbuf, '.')) + { + *statp = EX_NOHOST; + return FALSE; + } + + /* Do the search */ + vptr = ni_propval("/machines", NULL, nbuf, "name", '\0'); + + if (vptr == NULL) + { + *statp = EX_NOHOST; + return FALSE; + } + + if (hbsize >= strlen(vptr)) + { + strcpy(name, vptr); + *statp = EX_OK; + return TRUE; + } + *statp = EX_UNAVAILABLE; + free(vptr); + return FALSE; +} + + +/* +** NI_PROPVAL -- NetInfo property value lookup routine +** +** Parameters: +** keydir -- the NetInfo directory name in which to search +** for the key. +** keyprop -- the name of the property in which to find the +** property we are interested. Defaults to "name". +** keyval -- the value for which we are really searching. +** valprop -- the property name for the value in which we +** are interested. +** sepchar -- if non-nil, this can be multiple-valued, and +** we should return a string separated by this +** character. +** +** 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 value of the lookup. +** +** Example: +** To search for an alias value, use: +** ni_propval("/aliases", "name", aliasname, "members", ',') +** +** Notes: +** Caller should free the return value of ni_proval +*/ + +# include <netinfo/ni.h> + +# define LOCAL_NETINFO_DOMAIN "." +# define PARENT_NETINFO_DOMAIN ".." +# define MAX_NI_LEVELS 256 + +char * +ni_propval(keydir, keyprop, keyval, valprop, sepchar) + char *keydir; + char *keyprop; + char *keyval; + char *valprop; + int sepchar; +{ + char *propval = NULL; + int i; + int j, alen; + void *ni = NULL; + void *lastni = NULL; + ni_status nis; + ni_id nid; + ni_namelist ninl; + register char *p; + char keybuf[1024]; + + /* + ** Create the full key from the two parts. + ** + ** Note that directory can end with, e.g., "name=" to specify + ** an alternate search property. + */ + + i = strlen(keydir) + strlen(keyval) + 2; + if (keyprop != NULL) + i += strlen(keyprop) + 1; + if (i > sizeof keybuf) + return NULL; + strcpy(keybuf, keydir); + strcat(keybuf, "/"); + if (keyprop != NULL) + { + strcat(keybuf, keyprop); + strcat(keybuf, "="); + } + strcat(keybuf, keyval); + + /* + ** 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, keybuf) != 0) + continue; + + /* + ** Find associated value information. + */ + + if (ni_lookupprop(ni, &nid, valprop, &ninl) != 0) + continue; + + /* + ** See if we have an acceptable number of values. + */ + + if (ninl.ni_namelist_len <= 0) + continue; + + if (sepchar == '\0' && ninl.ni_namelist_len > 1) + { + ni_namelist_free(&ninl); + continue; + } + + /* + ** Calculate number of bytes needed and build result + */ + + alen = 1; + for (j = 0; j < ninl.ni_namelist_len; j++) + alen += strlen(ninl.ni_namelist_val[j]) + 1; + propval = p = xalloc(alen); + for (j = 0; j < ninl.ni_namelist_len; j++) + { + strcpy(p, ninl.ni_namelist_val[j]); + p += strlen(p); + *p++ = sepchar; + } + *--p = '\0'; + + ni_namelist_free(&ninl); + } + + /* + ** Clean up. + */ + + if (ni != NULL) + ni_free(ni); + if (lastni != NULL && ni != lastni) + ni_free(lastni); + + return propval; +} + +#endif +/* +** TEXT (unindexed text file) Modules +** +** This code donated by Sun Microsystems. +*/ + + +/* +** TEXT_MAP_OPEN -- open text table +*/ + +bool +text_map_open(map, mode) + MAP *map; + int mode; +{ + struct stat sbuf; + + if (tTd(38, 2)) + printf("text_map_open(%s, %s, %d)\n", + map->map_mname, map->map_file, mode); + + if (mode != O_RDONLY) + { + errno = ENODEV; + return FALSE; + } + + if (*map->map_file == '\0') + { + if (tTd(38, 2)) + printf("text_map_open(%s): file name required\n", + map->map_mname); + return FALSE; + } + + if (map->map_file[0] != '/') + { + if (tTd(38, 2)) + printf("text_map_open(%s, %s): file name must be fully qualified\n", + map->map_mname, map->map_file); + return FALSE; + } + /* check to see if this map actually accessable */ + if (access(map->map_file, R_OK) <0) + return FALSE; + + /* check to see if this map actually exist */ + if (stat(map->map_file, &sbuf) <0) + { + if (tTd(38, 2)) + printf("text_map_open(%s, %s): cannot stat\n", + map->map_mname, map->map_file); + return FALSE; + } + + if (!S_ISREG(sbuf.st_mode)) + { + if (tTd(38, 2)) + printf("text_map_open(%s): %s is not a regular file\n", + map->map_mname, map->map_file); + return FALSE; + } + + if (map->map_keycolnm == NULL) + map->map_keycolno = 0; + else + { + if (!isdigit(*map->map_keycolnm)) + { + if (tTd(38, 2)) + printf("text_map_open(%s, %s): -k should specify a number, not %s\n", + map->map_mname, map->map_file, + map->map_keycolnm); + return FALSE; + } + map->map_keycolno = atoi(map->map_keycolnm); + } + + if (map->map_valcolnm == NULL) + map->map_valcolno = 0; + else + { + if (!isdigit(*map->map_valcolnm)) + { + if (tTd(38, 2)) + printf("text_map_open(%s, %s): -v should specify a number, not %s\n", + map->map_mname, map->map_file, + map->map_valcolnm); + return FALSE; + } + map->map_valcolno = atoi(map->map_valcolnm); + } + + if (tTd(38, 2)) + { + printf("text_map_open(%s, %s): delimiter = ", + map->map_mname, map->map_file); + if (map->map_coldelim == '\0') + printf("(white space)\n"); + else + printf("%c\n", map->map_coldelim); + } + + return TRUE; +} + + +/* +** TEXT_MAP_LOOKUP -- look up a datum in a TEXT table +*/ + +char * +text_map_lookup(map, name, av, statp) + MAP *map; + char *name; + char **av; + int *statp; +{ + char *vp; + auto int vsize; + int buflen; + char search_key[MAXNAME + 1]; + char linebuf[MAXLINE]; + FILE *f; + char buf[MAXNAME + 1]; + char delim; + int key_idx; + bool found_it; + extern char *get_column(); + + + found_it = FALSE; + if (tTd(38, 20)) + printf("text_map_lookup(%s, %s)\n", map->map_mname, name); + + buflen = strlen(name); + if (buflen > sizeof search_key - 1) + buflen = sizeof search_key - 1; + bcopy(name, search_key, buflen + 1); + if (!bitset(MF_NOFOLDCASE, map->map_mflags)) + makelower(search_key); + + f = fopen(map->map_file, "r"); + if (f == NULL) + { + map->map_mflags &= ~(MF_VALID|MF_OPEN); + *statp = EX_UNAVAILABLE; + return NULL; + } + key_idx = map->map_keycolno; + delim = map->map_coldelim; + while (fgets(linebuf, MAXLINE, f) != NULL) + { + char *p; + + /* skip comment line */ + if (linebuf[0] == '#') + continue; + p = strchr(linebuf, '\n'); + if (p != NULL) + *p = '\0'; + p = get_column(linebuf, key_idx, delim, buf); + if (p != NULL && strcasecmp(search_key, p) == 0) + { + found_it = TRUE; + break; + } + } + fclose(f); + if (!found_it) + { + *statp = EX_NOTFOUND; + return NULL; + } + vp = get_column(linebuf, map->map_valcolno, delim, buf); + vsize = strlen(vp); + *statp = EX_OK; + if (bitset(MF_MATCHONLY, map->map_mflags)) + return map_rewrite(map, name, strlen(name), NULL); + else + return map_rewrite(map, vp, vsize, av); +} + + +/* +** TEXT_GETCANONNAME -- look up canonical name in hosts file +*/ + +bool +text_getcanonname(name, hbsize, statp) + char *name; + int hbsize; + int *statp; +{ + int key_idx; + bool found; + FILE *f; + char linebuf[MAXLINE]; + char cbuf[MAXNAME + 1]; + char fbuf[MAXNAME + 1]; + char nbuf[MAXNAME + 1]; + extern char *get_column(); + + if (tTd(38, 20)) + printf("text_getcanonname(%s)\n", name); + + if (strlen(name) >= sizeof nbuf) + { + *statp = EX_UNAVAILABLE; + return FALSE; + } + (void) strcpy(nbuf, name); + shorten_hostname(nbuf); + + f = fopen(HostsFile, "r"); + if (f == NULL) + { + *statp = EX_UNAVAILABLE; + return FALSE; + } + found = FALSE; + while (!found && fgets(linebuf, MAXLINE, f) != NULL) + { + char *p = strpbrk(linebuf, "#\n"); + + if (p != NULL) + *p = '\0'; + if (linebuf[0] != '\0') + found = extract_canonname(nbuf, linebuf, cbuf); + } + fclose(f); + if (!found) + { + *statp = EX_NOHOST; + return FALSE; + } + + if (hbsize >= strlen(cbuf)) + { + strcpy(name, cbuf); + *statp = EX_OK; + return TRUE; + } + *statp = EX_UNAVAILABLE; + return FALSE; +} /* ** STAB (Symbol Table) Modules */ @@ -1090,7 +2587,8 @@ stab_map_lookup(map, name, av, pstat) register STAB *s; if (tTd(38, 20)) - printf("stab_lookup(%s)\n", name); + printf("stab_lookup(%s, %s)\n", + map->map_mname, name); s = stab(name, ST_ALIAS, ST_FIND); if (s != NULL) @@ -1134,7 +2632,8 @@ stab_map_open(map, mode) struct stat st; if (tTd(38, 2)) - printf("stab_map_open(%s)\n", map->map_file); + printf("stab_map_open(%s, %s, %d)\n", + map->map_mname, map->map_file, mode); if (mode != O_RDONLY) { @@ -1145,7 +2644,7 @@ stab_map_open(map, mode) af = fopen(map->map_file, "r"); if (af == NULL) return FALSE; - readaliases(map, af, TRUE); + readaliases(map, af, FALSE, FALSE); if (fstat(fileno(af), &st) >= 0) map->map_mtime = st.st_mtime; @@ -1153,20 +2652,6 @@ stab_map_open(map, mode) return TRUE; } - - -/* -** STAB_MAP_CLOSE -- close symbol table. -** -** Since this is in memory, there is nothing to do. -*/ - -void -stab_map_close(map) - MAP *map; -{ - /* ignore it */ -} /* ** Implicit Modules ** @@ -1186,7 +2671,8 @@ impl_map_lookup(map, name, av, pstat) int *pstat; { if (tTd(38, 20)) - printf("impl_map_lookup(%s)\n", name); + printf("impl_map_lookup(%s, %s)\n", + map->map_mname, name); #ifdef NEWDB if (bitset(MF_IMPL_HASH, map->map_mflags)) @@ -1209,6 +2695,9 @@ impl_map_store(map, lhs, rhs) char *lhs; char *rhs; { + if (tTd(38, 12)) + printf("impl_map_store(%s, %s, %s)\n", + map->map_mname, lhs, rhs); #ifdef NEWDB if (bitset(MF_IMPL_HASH, map->map_mflags)) db_map_store(map, lhs, rhs); @@ -1229,25 +2718,16 @@ impl_map_open(map, mode) MAP *map; int mode; { - struct stat stb; - if (tTd(38, 2)) - printf("impl_map_open(%s, %d)\n", map->map_file, mode); - - if (stat(map->map_file, &stb) < 0) - { - /* no alias file at all */ - if (tTd(38, 3)) - printf("no map file\n"); - return FALSE; - } + printf("impl_map_open(%s, %s, %d)\n", + map->map_mname, map->map_file, mode); #ifdef NEWDB map->map_mflags |= MF_IMPL_HASH; if (hash_map_open(map, mode)) { #if defined(NDBM) && defined(NIS) - if (mode == O_RDONLY || access("/var/yp/Makefile", R_OK) != 0) + if (mode == O_RDONLY || strstr(map->map_file, "/yp/") == NULL) #endif return TRUE; } @@ -1284,6 +2764,9 @@ void impl_map_close(map) MAP *map; { + if (tTd(38, 9)) + printf("impl_map_close(%s, %s, %x)\n", + map->map_mname, map->map_file, map->map_mflags); #ifdef NEWDB if (bitset(MF_IMPL_HASH, map->map_mflags)) { @@ -1301,6 +2784,490 @@ impl_map_close(map) #endif } /* +** User map class. +** +** Provides access to the system password file. +*/ + +/* +** USER_MAP_OPEN -- open user map +** +** Really just binds field names to field numbers. +*/ + +bool +user_map_open(map, mode) + MAP *map; + int mode; +{ + if (tTd(38, 2)) + printf("user_map_open(%s, %d)\n", + map->map_mname, mode); + + if (mode != O_RDONLY) + { + /* issue a pseudo-error message */ +#ifdef ENOSYS + errno = ENOSYS; +#else +# ifdef EFTYPE + errno = EFTYPE; +# else + errno = ENXIO; +# endif +#endif + return FALSE; + } + if (map->map_valcolnm == NULL) + /* nothing */ ; + else if (strcasecmp(map->map_valcolnm, "name") == 0) + map->map_valcolno = 1; + else if (strcasecmp(map->map_valcolnm, "passwd") == 0) + map->map_valcolno = 2; + else if (strcasecmp(map->map_valcolnm, "uid") == 0) + map->map_valcolno = 3; + else if (strcasecmp(map->map_valcolnm, "gid") == 0) + map->map_valcolno = 4; + else if (strcasecmp(map->map_valcolnm, "gecos") == 0) + map->map_valcolno = 5; + else if (strcasecmp(map->map_valcolnm, "dir") == 0) + map->map_valcolno = 6; + else if (strcasecmp(map->map_valcolnm, "shell") == 0) + map->map_valcolno = 7; + else + { + syserr("User map %s: unknown column name %s", + map->map_mname, map->map_valcolnm); + return FALSE; + } + return TRUE; +} + + +/* +** USER_MAP_LOOKUP -- look up a user in the passwd file. +*/ + +char * +user_map_lookup(map, key, av, statp) + MAP *map; + char *key; + char **av; + int *statp; +{ + struct passwd *pw; + + if (tTd(38, 20)) + printf("user_map_lookup(%s, %s)\n", + map->map_mname, key); + + pw = sm_getpwnam(key); + if (pw == NULL) + return NULL; + if (bitset(MF_MATCHONLY, map->map_mflags)) + return map_rewrite(map, key, strlen(key), NULL); + else + { + char *rwval = NULL; + char buf[30]; + + switch (map->map_valcolno) + { + case 0: + case 1: + rwval = pw->pw_name; + break; + + case 2: + rwval = pw->pw_passwd; + break; + + case 3: + sprintf(buf, "%d", pw->pw_uid); + rwval = buf; + break; + + case 4: + sprintf(buf, "%d", pw->pw_gid); + rwval = buf; + break; + + case 5: + rwval = pw->pw_gecos; + break; + + case 6: + rwval = pw->pw_dir; + break; + + case 7: + rwval = pw->pw_shell; + break; + } + return map_rewrite(map, rwval, strlen(rwval), av); + } +} +/* +** Program map type. +** +** This provides access to arbitrary programs. It should be used +** only very sparingly, since there is no way to bound the cost +** of invoking an arbitrary program. +*/ + +char * +prog_map_lookup(map, name, av, statp) + MAP *map; + char *name; + char **av; + int *statp; +{ + int i; + register char *p; + int fd; + auto pid_t pid; + char *rval; + int stat; + char *argv[MAXPV + 1]; + char buf[MAXLINE]; + + if (tTd(38, 20)) + printf("prog_map_lookup(%s, %s) %s\n", + map->map_mname, name, map->map_file); + + i = 0; + argv[i++] = map->map_file; + if (map->map_rebuild != NULL) + { + strcpy(buf, map->map_rebuild); + for (p = strtok(buf, " \t"); p != NULL; p = strtok(NULL, " \t")) + { + if (i >= MAXPV - 1) + break; + argv[i++] = p; + } + } + argv[i++] = name; + argv[i] = NULL; + if (tTd(38, 21)) + { + printf("prog_open:"); + for (i = 0; argv[i] != NULL; i++) + printf(" %s", argv[i]); + printf("\n"); + } + pid = prog_open(argv, &fd, CurEnv); + if (pid < 0) + { + if (!bitset(MF_OPTIONAL, map->map_mflags)) + syserr("prog_map_lookup(%s) failed (%s) -- closing", + map->map_mname, errstring(errno)); + else if (tTd(38, 9)) + printf("prog_map_lookup(%s) failed (%s) -- closing", + map->map_mname, errstring(errno)); + map->map_mflags &= ~(MF_VALID|MF_OPEN); + *statp = EX_OSFILE; + return NULL; + } + i = read(fd, buf, sizeof buf - 1); + if (i < 0) + { + syserr("prog_map_lookup(%s): read error %s\n", + map->map_mname, errstring(errno)); + rval = NULL; + } + else if (i == 0 && tTd(38, 20)) + { + printf("prog_map_lookup(%s): empty answer\n", + map->map_mname); + rval = NULL; + } + if (i > 0) + { + buf[i] = '\0'; + p = strchr(buf, '\n'); + if (p != NULL) + *p = '\0'; + + /* collect the return value */ + if (bitset(MF_MATCHONLY, map->map_mflags)) + rval = map_rewrite(map, name, strlen(name), NULL); + else + rval = map_rewrite(map, buf, strlen(buf), NULL); + + /* now flush any additional output */ + while ((i = read(fd, buf, sizeof buf)) > 0) + continue; + } + + /* wait for the process to terminate */ + close(fd); + stat = waitfor(pid); + + if (stat == -1) + { + syserr("prog_map_lookup(%s): wait error %s\n", + map->map_mname, errstring(errno)); + *statp = EX_SOFTWARE; + rval = NULL; + } + else if (WIFEXITED(stat)) + { + if ((*statp = WEXITSTATUS(stat)) != EX_OK) + rval = NULL; + } + else + { + syserr("prog_map_lookup(%s): child died on signal %d", + map->map_mname, stat); + *statp = EX_UNAVAILABLE; + rval = NULL; + } + return rval; +} +/* +** Sequenced map type. +** +** Tries each map in order until something matches, much like +** implicit. Stores go to the first map in the list that can +** support storing. +** +** This is slightly unusual in that there are two interfaces. +** The "sequence" interface lets you stack maps arbitrarily. +** The "switch" interface builds a sequence map by looking +** at a system-dependent configuration file such as +** /etc/nsswitch.conf on Solaris or /etc/svc.conf on Ultrix. +** +** We don't need an explicit open, since all maps are +** opened during startup, including underlying maps. +*/ + +/* +** SEQ_MAP_PARSE -- Sequenced map parsing +*/ + +bool +seq_map_parse(map, ap) + MAP *map; + char *ap; +{ + int maxmap; + + if (tTd(38, 2)) + printf("seq_map_parse(%s, %s)\n", map->map_mname, ap); + maxmap = 0; + while (*ap != '\0') + { + register char *p; + STAB *s; + + /* find beginning of map name */ + while (isascii(*ap) && isspace(*ap)) + ap++; + for (p = ap; isascii(*p) && isalnum(*p); p++) + continue; + if (*p != '\0') + *p++ = '\0'; + while (*p != '\0' && (!isascii(*p) || !isalnum(*p))) + p++; + if (*ap == '\0') + { + ap = p; + continue; + } + s = stab(ap, ST_MAP, ST_FIND); + if (s == NULL) + { + syserr("Sequence map %s: unknown member map %s", + map->map_mname, ap); + } + else if (maxmap == MAXMAPSTACK) + { + syserr("Sequence map %s: too many member maps (%d max)", + map->map_mname, MAXMAPSTACK); + maxmap++; + } + else if (maxmap < MAXMAPSTACK) + { + map->map_stack[maxmap++] = &s->s_map; + } + ap = p; + } + return TRUE; +} + + +/* +** SWITCH_MAP_OPEN -- open a switched map +** +** This looks at the system-dependent configuration and builds +** a sequence map that does the same thing. +** +** Every system must define a switch_map_find routine in conf.c +** that will return the list of service types associated with a +** given service class. +*/ + +bool +switch_map_open(map, mode) + MAP *map; + int mode; +{ + int mapno; + int nmaps; + char *maptype[MAXMAPSTACK]; + + if (tTd(38, 2)) + printf("switch_map_open(%s, %s, %d)\n", + map->map_mname, map->map_file, mode); + + nmaps = switch_map_find(map->map_file, maptype, map->map_return); + if (tTd(38, 19)) + { + printf("\tswitch_map_find => %d\n", nmaps); + for (mapno = 0; mapno < nmaps; mapno++) + printf("\t\t%s\n", maptype[mapno]); + } + if (nmaps <= 0 || nmaps > MAXMAPSTACK) + return FALSE; + + for (mapno = 0; mapno < nmaps; mapno++) + { + register STAB *s; + char nbuf[MAXNAME + 1]; + + if (maptype[mapno] == NULL) + continue; + (void) sprintf(nbuf, "%s.%s", map->map_mname, maptype[mapno]); + s = stab(nbuf, ST_MAP, ST_FIND); + if (s == NULL) + { + syserr("Switch map %s: unknown member map %s", + map->map_mname, nbuf); + } + else + { + map->map_stack[mapno] = &s->s_map; + if (tTd(38, 4)) + printf("\tmap_stack[%d] = %s:%s\n", + mapno, s->s_map.map_class->map_cname, + nbuf); + } + } + return TRUE; +} + + +/* +** SEQ_MAP_CLOSE -- close all underlying maps +*/ + +void +seq_map_close(map) + MAP *map; +{ + int mapno; + + if (tTd(38, 9)) + printf("seq_map_close(%s)\n", map->map_mname); + + for (mapno = 0; mapno < MAXMAPSTACK; mapno++) + { + MAP *mm = map->map_stack[mapno]; + + if (mm == NULL || !bitset(MF_OPEN, mm->map_mflags)) + continue; + mm->map_class->map_close(mm); + mm->map_mflags &= ~(MF_OPEN|MF_WRITABLE); + } +} + + +/* +** SEQ_MAP_LOOKUP -- sequenced map lookup +*/ + +char * +seq_map_lookup(map, key, args, pstat) + MAP *map; + char *key; + char **args; + int *pstat; +{ + int mapno; + int mapbit = 0x01; + bool tempfail = FALSE; + + if (tTd(38, 20)) + printf("seq_map_lookup(%s, %s)\n", map->map_mname, key); + + for (mapno = 0; mapno < MAXMAPSTACK; mapbit <<= 1, mapno++) + { + MAP *mm = map->map_stack[mapno]; + char *rv; + + if (mm == NULL) + continue; + if (!bitset(MF_OPEN, mm->map_mflags)) + { + if (bitset(mapbit, map->map_return[MA_UNAVAIL])) + { + *pstat = EX_UNAVAILABLE; + return NULL; + } + continue; + } + *pstat = EX_OK; + rv = mm->map_class->map_lookup(mm, key, args, pstat); + if (rv != NULL) + return rv; + if (*pstat == EX_TEMPFAIL) + { + if (bitset(mapbit, map->map_return[MA_TRYAGAIN])) + return NULL; + tempfail = TRUE; + } + else if (bitset(mapbit, map->map_return[MA_NOTFOUND])) + break; + } + if (tempfail) + *pstat = EX_TEMPFAIL; + else if (*pstat == EX_OK) + *pstat = EX_NOTFOUND; + return NULL; +} + + +/* +** SEQ_MAP_STORE -- sequenced map store +*/ + +void +seq_map_store(map, key, val) + MAP *map; + char *key; + char *val; +{ + int mapno; + + if (tTd(38, 12)) + printf("seq_map_store(%s, %s, %s)\n", + map->map_mname, key, val); + + for (mapno = 0; mapno < MAXMAPSTACK; mapno++) + { + MAP *mm = map->map_stack[mapno]; + + if (mm == NULL || !bitset(MF_WRITABLE, mm->map_mflags)) + continue; + + mm->map_class->map_store(mm, key, val); + return; + } + syserr("seq_map_store(%s, %s, %s): no writable map", + map->map_mname, key, val); +} +/* ** NULL stubs */ @@ -1319,6 +3286,17 @@ null_map_close(map) return; } +char * +null_map_lookup(map, key, args, pstat) + MAP *map; + char *key; + char **args; + int *pstat; +{ + *pstat = EX_NOTFOUND; + return NULL; +} + void null_map_store(map, key, val) MAP *map; @@ -1327,3 +3305,26 @@ null_map_store(map, key, val) { return; } + + +/* +** BOGUS stubs +*/ + +char * +bogus_map_lookup(map, key, args, pstat) + MAP *map; + char *key; + char **args; + int *pstat; +{ + *pstat = EX_TEMPFAIL; + return NULL; +} + +MAPCLASS BogusMapClass = +{ + "bogus-map", NULL, 0, + NULL, bogus_map_lookup, null_map_store, + null_map_open, null_map_close, +}; diff --git a/usr.sbin/sendmail/src/mci.c b/usr.sbin/sendmail/src/mci.c index 8211a6280d0ca..ee0da2d1f3245 100644 --- a/usr.sbin/sendmail/src/mci.c +++ b/usr.sbin/sendmail/src/mci.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1983 Eric P. Allman + * Copyright (c) 1995 Eric P. Allman * Copyright (c) 1988, 1993 * The Regents of the University of California. All rights reserved. * @@ -33,7 +33,7 @@ */ #ifndef lint -static char sccsid[] = "@(#)mci.c 8.14 (Berkeley) 5/15/94"; +static char sccsid[] = "@(#)mci.c 8.22 (Berkeley) 11/18/95"; #endif /* not lint */ #include "sendmail.h" @@ -65,6 +65,8 @@ static char sccsid[] = "@(#)mci.c 8.14 (Berkeley) 5/15/94"; */ MCI **MciCache; /* the open connection cache */ + +extern void mci_uncache __P((MCI **, bool)); /* ** MCI_CACHE -- enter a connection structure into the open connection cache ** @@ -77,6 +79,7 @@ MCI **MciCache; /* the open connection cache */ ** none. */ +void mci_cache(mci) register MCI *mci; { @@ -108,7 +111,7 @@ mci_cache(mci) mci, mci->mci_host, mcislot - MciCache); #ifdef LOG if (tTd(91, 100)) - syslog(LOG_DEBUG, "%s: mci_cache: caching %x (%s) in slot %d", + syslog(LOG_DEBUG, "%s: mci_cache: caching %x (%.100s) in slot %d", CurEnv->e_id ? CurEnv->e_id : "NOQUEUE", mci, mci->mci_host, mcislot - MciCache); #endif @@ -188,6 +191,7 @@ mci_scan(savemci) ** none. */ +void mci_uncache(mcislot, doquit) register MCI **mcislot; bool doquit; @@ -205,11 +209,12 @@ mci_uncache(mcislot, doquit) mci, mci->mci_host, mcislot - MciCache, doquit); #ifdef LOG if (tTd(91, 100)) - syslog(LOG_DEBUG, "%s: mci_uncache: uncaching %x (%s) from slot %d (%d)", + syslog(LOG_DEBUG, "%s: mci_uncache: uncaching %x (%.100s) from slot %d (%d)", CurEnv->e_id ? CurEnv->e_id : "NOQUEUE", mci, mci->mci_host, mcislot - MciCache, doquit); #endif +#ifdef SMTP if (doquit) { message("Closing connection to %s", mci->mci_host); @@ -224,6 +229,7 @@ mci_uncache(mcislot, doquit) #endif } else +#endif { if (mci->mci_in != NULL) xfclose(mci->mci_in, "mci_uncache", "mci_in"); @@ -248,6 +254,7 @@ mci_uncache(mcislot, doquit) ** none. */ +void mci_flush(doquit, allbut) bool doquit; MCI *allbut; @@ -297,6 +304,7 @@ mci_get(host, m) mci->mci_exitstat, mci->mci_errno); } +#ifdef SMTP if (mci->mci_state == MCIS_OPEN) { /* poke the connection to see if it's still alive */ @@ -309,6 +317,7 @@ mci_get(host, m) mci->mci_exitstat = EX_OK; mci->mci_state = MCIS_CLOSED; } +# ifdef DAEMON else { /* get peer host address for logging reasons only */ @@ -318,13 +327,23 @@ mci_get(host, m) (void) getpeername(fileno(mci->mci_in), (struct sockaddr *) &CurHostAddr, &socksize); } +# endif } +#endif +#ifdef MAYBE_NEXT_RELEASE if (mci->mci_state == MCIS_CLOSED) { - /* copy out any mailer flags needed in connection state */ - if (bitnset(M_7BITS, m->m_flags)) - mci->mci_flags |= MCIF_7BIT; + time_t now = curtime(); + + /* if this info is stale, ignore it */ + if (now > mci->mci_lastuse + MciInfoTimeout) + { + mci->mci_lastuse = now; + mci->mci_errno = 0; + mci->mci_exitstat = EX_OK; + } } +#endif return mci; } @@ -341,13 +360,14 @@ mci_get(host, m) ** none. */ +void mci_dump(mci, logit) register MCI *mci; bool logit; { register char *p; char *sep; - char buf[1000]; + char buf[4000]; extern char *ctime(); sep = logit ? " " : "\n\t"; @@ -359,7 +379,7 @@ mci_dump(mci, logit) sprintf(p, "NULL"); goto printit; } - sprintf(p, "flags=%o, errno=%d, herrno=%d, exitstat=%d, state=%d, pid=%d,%s", + sprintf(p, "flags=%x, errno=%d, herrno=%d, exitstat=%d, state=%d, pid=%d,%s", mci->mci_flags, mci->mci_errno, mci->mci_herrno, mci->mci_exitstat, mci->mci_state, mci->mci_pid, sep); p += strlen(p); @@ -375,7 +395,7 @@ mci_dump(mci, logit) printit: #ifdef LOG if (logit) - syslog(LOG_DEBUG, "%s", buf); + syslog(LOG_DEBUG, "%.1000s", buf); else #endif printf("%s\n", buf); @@ -391,6 +411,7 @@ printit: ** none. */ +void mci_dump_all(logit) bool logit; { diff --git a/usr.sbin/sendmail/src/parseaddr.c b/usr.sbin/sendmail/src/parseaddr.c index 2683728beb14c..bea7184e4a4fb 100644 --- a/usr.sbin/sendmail/src/parseaddr.c +++ b/usr.sbin/sendmail/src/parseaddr.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1983 Eric P. Allman + * Copyright (c) 1983, 1995 Eric P. Allman * Copyright (c) 1988, 1993 * The Regents of the University of California. All rights reserved. * @@ -33,7 +33,7 @@ */ #ifndef lint -static char sccsid[] = "@(#)parseaddr.c 8.31 (Berkeley) 4/15/94"; +static char sccsid[] = "@(#)parseaddr.c 8.87 (Berkeley) 11/29/95"; #endif /* not lint */ # include "sendmail.h" @@ -91,6 +91,7 @@ parseaddr(addr, a, flags, delim, delimptr, e) char pvpbuf[PSBUFSIZE]; extern ADDRESS *buildaddr(); extern bool invalidaddr(); + extern void allocaddr __P((ADDRESS *, int, char *)); /* ** Initialize and prescan address. @@ -103,7 +104,7 @@ parseaddr(addr, a, flags, delim, delimptr, e) if (delimptr == NULL) delimptr = &delimptrbuf; - pvp = prescan(addr, delim, pvpbuf, sizeof pvpbuf, delimptr); + pvp = prescan(addr, delim, pvpbuf, sizeof pvpbuf, delimptr, NULL); if (pvp == NULL) { if (tTd(20, 1)) @@ -172,12 +173,15 @@ parseaddr(addr, a, flags, delim, delimptr, e) { char *msg = "Transient parse error -- message queued for future delivery"; + if (e->e_sendmode == SM_DEFER) + msg = "Deferring message until queue run"; if (tTd(20, 1)) printf("parseaddr: queuing message\n"); message(msg); - if (e->e_message == NULL) + if (e->e_message == NULL && e->e_sendmode != SM_DEFER) e->e_message = newstr(msg); a->q_flags |= QQUEUEUP; + a->q_status = "4.4.3"; } /* @@ -208,7 +212,7 @@ invalidaddr(addr, delimptr) register char *addr; char *delimptr; { - char savedelim; + char savedelim = '\0'; if (delimptr != NULL) { @@ -231,14 +235,14 @@ invalidaddr(addr, delimptr) } if (*addr == '\0') { - if (savedelim != '\0' && delimptr != NULL) + if (delimptr != NULL && savedelim != '\0') *delimptr = savedelim; return FALSE; } setstat(EX_USAGE); usrerr("553 Address contained invalid control characters"); addrfailure: - if (savedelim != '\0' && delimptr != NULL) + if (delimptr != NULL && savedelim != '\0') *delimptr = savedelim; return TRUE; } @@ -260,13 +264,14 @@ invalidaddr(addr, delimptr) ** Copies portions of a into local buffers as requested. */ +void allocaddr(a, flags, paddr) register ADDRESS *a; int flags; char *paddr; { if (tTd(24, 4)) - printf("allocaddr(flags=%o, paddr=%s)\n", flags, paddr); + printf("allocaddr(flags=%x, paddr=%s)\n", flags, paddr); a->q_paddr = paddr; @@ -311,6 +316,8 @@ allocaddr(a, flags, paddr) ** pvpbsize -- size of pvpbuf. ** delimptr -- if non-NULL, set to the location of the ** terminating delimiter. +** toktab -- if set, a token table to use for parsing. +** If NULL, use the default table. ** ** Returns: ** A pointer to a vector of tokens. @@ -323,8 +330,9 @@ allocaddr(a, flags, paddr) # define QST 2 /* in quoted string */ # define SPC 3 /* chewing up spaces */ # define ONE 4 /* pick up one character */ +# define ILL 5 /* illegal character */ -# define NSTATES 5 /* number of states */ +# define NSTATES 6 /* number of states */ # define TYPE 017 /* mask to select state type */ /* meta bits for table */ @@ -334,46 +342,102 @@ allocaddr(a, flags, paddr) static short StateTab[NSTATES][NSTATES] = { - /* oldst chtype> OPR ATM QST SPC ONE */ - /*OPR*/ OPR|B, ATM|B, QST|B, SPC|MB, ONE|B, - /*ATM*/ OPR|B, ATM, QST|B, SPC|MB, ONE|B, - /*QST*/ QST, QST, OPR, QST, QST, - /*SPC*/ OPR, ATM, QST, SPC|M, ONE, - /*ONE*/ OPR, OPR, OPR, OPR, OPR, + /* oldst chtype> OPR ATM QST SPC ONE ILL */ + /*OPR*/ OPR|B, ATM|B, QST|B, SPC|MB, ONE|B, ILL|MB, + /*ATM*/ OPR|B, ATM, QST|B, SPC|MB, ONE|B, ILL|MB, + /*QST*/ QST, QST, OPR, QST, QST, QST, + /*SPC*/ OPR, ATM, QST, SPC|M, ONE, ILL|MB, + /*ONE*/ OPR, OPR, OPR, OPR, OPR, ILL|MB, + /*ILL*/ OPR|B, ATM|B, QST|B, SPC|MB, ONE|B, ILL|M, }; /* token type table -- it gets modified with $o characters */ -static TokTypeTab[256] = +static u_char 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, + /* nul soh stx etx eot enq ack bel bs ht nl vt np cr so si */ + ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM, ATM,SPC,SPC,SPC,SPC,SPC,ATM,ATM, + /* dle dc1 dc2 dc3 dc4 nak syn etb can em sub esc fs gs rs us */ + ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM, ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM, + /* sp ! " # $ % & ' ( ) * + , - . / */ + SPC,ATM,QST,ATM,ATM,ATM,ATM,ATM, ATM,SPC,ATM,ATM,ATM,ATM,ATM,ATM, + /* 0 1 2 3 4 5 6 7 8 9 : ; < = > ? */ + ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM, ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM, + /* @ A B C D E F G H I J K L M N O */ + ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM, ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM, + /* P Q R S T U V W X Y Z [ \ ] ^ _ */ + ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM, ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM, + /* ` a b c d e f g h i j k l m n o */ + ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM, ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM, + /* p q r s t u v w x y z { | } ~ del */ + ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM, ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM, + + /* nul soh stx etx eot enq ack bel bs ht nl vt np cr so si */ + OPR,OPR,ONE,OPR,OPR,OPR,OPR,OPR, OPR,OPR,OPR,OPR,OPR,OPR,OPR,OPR, + /* dle dc1 dc2 dc3 dc4 nak syn etb can em sub esc fs gs rs us */ + OPR,OPR,OPR,ONE,ONE,ONE,OPR,OPR, OPR,OPR,OPR,OPR,OPR,OPR,OPR,OPR, + /* sp ! " # $ % & ' ( ) * + , - . / */ + ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM, ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM, + /* 0 1 2 3 4 5 6 7 8 9 : ; < = > ? */ + ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM, ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM, + /* @ A B C D E F G H I J K L M N O */ + ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM, ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM, + /* P Q R S T U V W X Y Z [ \ ] ^ _ */ + ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM, ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM, + /* ` a b c d e f g h i j k l m n o */ + ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM, ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM, + /* p q r s t u v w x y z { | } ~ del */ + ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM, ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM, }; -#define toktype(c) ((int) TokTypeTab[(c) & 0xff]) +/* token type table for MIME parsing */ +u_char MimeTokenTab[256] = +{ + /* nul soh stx etx eot enq ack bel bs ht nl vt np cr so si */ + ILL,ILL,ILL,ILL,ILL,ILL,ILL,ILL, ILL,SPC,SPC,SPC,SPC,SPC,ILL,ILL, + /* dle dc1 dc2 dc3 dc4 nak syn etb can em sub esc fs gs rs us */ + ILL,ILL,ILL,ILL,ILL,ILL,ILL,ILL, ILL,ILL,ILL,ILL,ILL,ILL,ILL,ILL, + /* sp ! " # $ % & ' ( ) * + , - . / */ + SPC,ATM,QST,ATM,ATM,ATM,ATM,ATM, ATM,SPC,ATM,ATM,OPR,ATM,ATM,OPR, + /* 0 1 2 3 4 5 6 7 8 9 : ; < = > ? */ + ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM, ATM,ATM,OPR,OPR,OPR,OPR,OPR,OPR, + /* @ A B C D E F G H I J K L M N O */ + OPR,ATM,ATM,ATM,ATM,ATM,ATM,ATM, ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM, + /* P Q R S T U V W X Y Z [ \ ] ^ _ */ + ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM, ATM,ATM,ATM,OPR,OPR,OPR,ATM,ATM, + /* ` a b c d e f g h i j k l m n o */ + ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM, ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM, + /* p q r s t u v w x y z { | } ~ del */ + ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM, ATM,ATM,ATM,ATM,ATM,ATM,ATM,ATM, + + /* nul soh stx etx eot enq ack bel bs ht nl vt np cr so si */ + ILL,ILL,ILL,ILL,ILL,ILL,ILL,ILL, ILL,ILL,ILL,ILL,ILL,ILL,ILL,ILL, + /* dle dc1 dc2 dc3 dc4 nak syn etb can em sub esc fs gs rs us */ + ILL,ILL,ILL,ILL,ILL,ILL,ILL,ILL, ILL,ILL,ILL,ILL,ILL,ILL,ILL,ILL, + /* sp ! " # $ % & ' ( ) * + , - . / */ + ILL,ILL,ILL,ILL,ILL,ILL,ILL,ILL, ILL,ILL,ILL,ILL,ILL,ILL,ILL,ILL, + /* 0 1 2 3 4 5 6 7 8 9 : ; < = > ? */ + ILL,ILL,ILL,ILL,ILL,ILL,ILL,ILL, ILL,ILL,ILL,ILL,ILL,ILL,ILL,ILL, + /* @ A B C D E F G H I J K L M N O */ + ILL,ILL,ILL,ILL,ILL,ILL,ILL,ILL, ILL,ILL,ILL,ILL,ILL,ILL,ILL,ILL, + /* P Q R S T U V W X Y Z [ \ ] ^ _ */ + ILL,ILL,ILL,ILL,ILL,ILL,ILL,ILL, ILL,ILL,ILL,ILL,ILL,ILL,ILL,ILL, + /* ` a b c d e f g h i j k l m n o */ + ILL,ILL,ILL,ILL,ILL,ILL,ILL,ILL, ILL,ILL,ILL,ILL,ILL,ILL,ILL,ILL, + /* p q r s t u v w x y z { | } ~ del */ + ILL,ILL,ILL,ILL,ILL,ILL,ILL,ILL, ILL,ILL,ILL,ILL,ILL,ILL,ILL,ILL, +}; # define NOCHAR -1 /* signal nothing in lookahead token */ char ** -prescan(addr, delim, pvpbuf, pvpbsize, delimptr) +prescan(addr, delim, pvpbuf, pvpbsize, delimptr, toktab) char *addr; - char delim; + int delim; char pvpbuf[]; + int pvpbsize; char **delimptr; + u_char *toktab; { register char *p; register char *q; @@ -396,7 +460,14 @@ prescan(addr, delim, pvpbuf, pvpbsize, delimptr) char obuf[50]; firsttime = FALSE; - expand("\201o", obuf, &obuf[sizeof obuf - sizeof DELIMCHARS], CurEnv); + if (OperatorChars == NULL) + { + if (ConfigLevel < 7) + OperatorChars = macvalue('o', CurEnv); + if (OperatorChars == NULL) + OperatorChars = ".:@[]"; + } + expand(OperatorChars, obuf, sizeof obuf - sizeof DELIMCHARS, CurEnv); strcat(obuf, DELIMCHARS); for (p = obuf; *p != '\0'; p++) { @@ -404,6 +475,8 @@ prescan(addr, delim, pvpbuf, pvpbsize, delimptr) TokTypeTab[*p & 0xff] = OPR; } } + if (toktab == NULL) + toktab = TokTypeTab; /* make sure error messages don't have garbage on them */ errno = 0; @@ -437,6 +510,8 @@ prescan(addr, delim, pvpbuf, pvpbsize, delimptr) if (q >= &pvpbuf[pvpbsize - 5]) { usrerr("553 Address too long"); + if (strlen(addr) > MAXNAME) + addr[MAXNAME] = '\0'; returnnull: if (delimptr != NULL) *delimptr = p; @@ -546,10 +621,17 @@ prescan(addr, delim, pvpbuf, pvpbsize, delimptr) if (c == delim && anglecnt <= 0 && state != QST) break; - newstate = StateTab[state][toktype(c)]; + newstate = StateTab[state][toktab[c & 0xff]]; if (tTd(22, 101)) printf("ns=%02o\n", newstate); state = newstate & TYPE; + if (state == ILL) + { + if (isascii(c) && isprint(c)) + usrerr("653 Illegal character %c", c); + else + usrerr("653 Illegal character 0x%02x", c); + } if (bitset(M, newstate)) c = NOCHAR; if (bitset(B, newstate)) @@ -642,10 +724,6 @@ struct match # define MAXMATCH 9 /* max params per rewrite */ -# ifndef MAXRULERECURSION -# define MAXRULERECURSION 50 /* max recursion depth */ -# endif - int rewrite(pvp, ruleset, reclevel, e) @@ -666,7 +744,7 @@ rewrite(pvp, ruleset, reclevel, e) struct match mlist[MAXMATCH]; /* stores match on LHS */ char *npvp[MAXATOM+1]; /* temporary space for rebuild */ - if (OpMode == MD_TEST || tTd(21, 2)) + if (OpMode == MD_TEST || tTd(21, 1)) { printf("rewrite: ruleset %2d input:", ruleset); printav(pvp); @@ -676,9 +754,10 @@ rewrite(pvp, ruleset, reclevel, e) syserr("554 rewrite: illegal ruleset number %d", ruleset); return EX_CONFIG; } - if (reclevel++ > MAXRULERECURSION) + if (reclevel++ > MaxRuleRecursion) { - syserr("rewrite: infinite recursion, ruleset %d", ruleset); + syserr("rewrite: excessive recursion (max %d), ruleset %d", + MaxRuleRecursion, ruleset); return EX_CONFIG; } if (pvp == NULL) @@ -740,7 +819,6 @@ rewrite(pvp, ruleset, reclevel, e) switch (*rp & 0377) { - register STAB *s; char buf[MAXLINE]; case MATCHCLASS: @@ -753,8 +831,7 @@ rewrite(pvp, ruleset, reclevel, e) goto backup; mlp->last = avp++; cataddr(mlp->first, mlp->last, buf, sizeof buf, '\0'); - s = stab(buf, ST_CLASS, ST_FIND); - if (s == NULL || !bitnset(rp[1], s->s_class)) + if (!wordinclass(buf, rp[1])) { if (tTd(21, 36)) { @@ -773,8 +850,7 @@ rewrite(pvp, ruleset, reclevel, e) case MATCHNCLASS: /* match any token not in a class */ - s = stab(ap, ST_CLASS, ST_FIND); - if (s != NULL && bitnset(rp[1], s->s_class)) + if (wordinclass(ap, rp[1])) goto backup; /* fall through */ @@ -812,8 +888,8 @@ rewrite(pvp, ruleset, reclevel, e) ap = macvalue(rp[1], e); mlp->first = avp; if (tTd(21, 2)) - printf("rewrite: LHS $&%c => \"%s\"\n", - rp[1], + printf("rewrite: LHS $&%s => \"%s\"\n", + macname(rp[1]), ap == NULL ? "(NULL)" : ap); if (ap == NULL) @@ -984,8 +1060,8 @@ rewrite(pvp, ruleset, reclevel, e) { *avp = macvalue(rp[1], e); if (tTd(21, 2)) - printf("rewrite: RHS $&%c => \"%s\"\n", - rp[1], + printf("rewrite: RHS $&%s => \"%s\"\n", + macname(rp[1]), *avp == NULL ? "(NULL)" : *avp); if (*avp != NULL) avp++; @@ -1097,10 +1173,22 @@ rewrite(pvp, ruleset, reclevel, e) /* look it up */ cataddr(key_rvp, NULL, buf, sizeof buf, '\0'); argvect[0] = buf; - if (map != NULL && bitset(MF_OPEN, map->s_map.map_mflags)) + if (e->e_sendmode == SM_DEFER) + { + /* don't do any map lookups */ + if (tTd(60, 1)) + printf("map_lookup(%s, %s) => DEFERRED\n", + mapname, buf); + replac = NULL; + rstat = EX_TEMPFAIL; + } + else if (map != NULL && bitset(MF_OPEN, map->s_map.map_mflags)) { auto int stat = EX_OK; + if (!bitset(MF_KEEPQUOTES, map->s_map.map_mflags)) + stripquotes(buf); + /* XXX should try to auto-open the map here */ if (tTd(60, 1)) @@ -1115,7 +1203,21 @@ rewrite(pvp, ruleset, reclevel, e) /* should recover if stat == EX_TEMPFAIL */ if (stat == EX_TEMPFAIL) - rstat = stat; + { + rstat = EX_TEMPFAIL; + if (tTd(60, 1)) + printf("map_lookup(%s, %s) tempfail: errno=%d\n", + mapname, buf, errno); + if (e->e_message == NULL) + { + char mbuf[300]; + + sprintf(mbuf, "%.80s map: lookup (%s): deferred", + mapname, + shortenstring(buf, 203)); + e->e_message = newstr(mbuf); + } + } } else replac = NULL; @@ -1142,7 +1244,7 @@ rewrite(pvp, ruleset, reclevel, e) { /* scan the new replacement */ xpvp = prescan(replac, '\0', pvpbuf, - sizeof pvpbuf, NULL); + sizeof pvpbuf, NULL, NULL); if (xpvp == NULL) { /* prescan already printed error */ @@ -1182,11 +1284,15 @@ rewrite(pvp, ruleset, reclevel, e) } else { + int ruleset; + STAB *s; + 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); + ruleset = strtorwset(npvp[1], NULL, ST_FIND); + stat = rewrite(pvp, ruleset, reclevel, e); if (rstat == EX_OK || stat == EX_TEMPFAIL) rstat = stat; if (*pvp != NULL && (**pvp & 0377) == CANONNET) @@ -1205,7 +1311,7 @@ rewrite(pvp, ruleset, reclevel, e) } } - if (OpMode == MD_TEST || tTd(21, 2)) + if (OpMode == MD_TEST || tTd(21, 1)) { printf("rewrite: ruleset %2d returns:", ruleset); printav(pvp); @@ -1260,15 +1366,17 @@ buildaddr(tv, a, flags, e) { struct mailer **mp; register struct mailer *m; - char *bp; - int spaceleft; + register char *p; + char *mname; + char **hostp; + char hbuf[MAXNAME + 1]; static MAILER errormailer; static char *errorargv[] = { "ERROR", NULL }; - static char buf[MAXNAME]; + static char ubuf[MAXNAME + 1]; if (tTd(24, 5)) { - printf("buildaddr, flags=%o, tv=", flags); + printf("buildaddr, flags=%x, tv=", flags); printav(tv); } @@ -1276,10 +1384,13 @@ buildaddr(tv, a, flags, e) a = (ADDRESS *) xalloc(sizeof *a); bzero((char *) a, sizeof *a); + /* set up default error return flags */ + a->q_flags |= QPINGONFAILURE|QPINGONDELAY; + /* figure out what net/mailer to use */ if (*tv == NULL || (**tv & 0377) != CANONNET) { - syserr("554 buildaddr: no net"); + syserr("554 buildaddr: no mailer in parsed address"); badaddr: a->q_flags |= QBADADDR; a->q_mailer = &errormailer; @@ -1292,91 +1403,97 @@ badaddr: } return a; } - tv++; - if (strcasecmp(*tv, "error") == 0) + mname = *++tv; + + /* extract host and user portions */ + if ((**++tv & 0377) == CANONHOST) + hostp = ++tv; + else + hostp = NULL; + while (*tv != NULL && (**tv & 0377) != CANONUSER) + tv++; + if (*tv == NULL) { - if ((**++tv & 0377) == CANONHOST) + syserr("554 buildaddr: no user"); + goto badaddr; + } + if (tv == hostp) + hostp = NULL; + else if (hostp != NULL) + cataddr(hostp, tv - 1, hbuf, sizeof hbuf, '\0'); + cataddr(++tv, NULL, ubuf, sizeof ubuf, ' '); + + /* save away the host name */ + if (strcasecmp(mname, "error") == 0) + { + if (hostp != NULL) { register struct errcodes *ep; - if (isascii(**++tv) && isdigit(**tv)) + if (strchr(hbuf, '.') != NULL) + { + a->q_status = newstr(hbuf); + setstat(dsntoexitstat(hbuf)); + } + else if (isascii(hbuf[0]) && isdigit(hbuf[0])) { - setstat(atoi(*tv)); + setstat(atoi(hbuf)); } else { for (ep = ErrorCodes; ep->ec_name != NULL; ep++) - if (strcasecmp(ep->ec_name, *tv) == 0) + if (strcasecmp(ep->ec_name, hbuf) == 0) break; setstat(ep->ec_code); } - tv++; } else setstat(EX_UNAVAILABLE); - if ((**tv & 0377) != CANONUSER) - syserr("554 buildaddr: error: no user"); - cataddr(++tv, NULL, buf, sizeof buf, ' '); - stripquotes(buf); - if (isascii(buf[0]) && isdigit(buf[0]) && - isascii(buf[1]) && isdigit(buf[1]) && - isascii(buf[2]) && isdigit(buf[2]) && - buf[3] == ' ') + stripquotes(ubuf); + if (isascii(ubuf[0]) && isdigit(ubuf[0]) && + isascii(ubuf[1]) && isdigit(ubuf[1]) && + isascii(ubuf[2]) && isdigit(ubuf[2]) && + ubuf[3] == ' ') { char fmt[10]; - strncpy(fmt, buf, 3); + strncpy(fmt, ubuf, 3); strcpy(&fmt[3], " %s"); - usrerr(fmt, buf + 4); + usrerr(fmt, ubuf + 4); + + /* + ** If this is a 4xx code and we aren't running + ** SMTP on our input, bounce this message; + ** otherwise it disappears without a trace. + */ + + if (fmt[0] == '4' && OpMode != MD_SMTP && + OpMode != MD_DAEMON) + { + e->e_flags |= EF_FATALERRS; + } } else { - usrerr("553 %s", buf); + usrerr("553 %s", ubuf); } goto badaddr; } for (mp = Mailer; (m = *mp++) != NULL; ) { - if (strcasecmp(m->m_name, *tv) == 0) + if (strcasecmp(m->m_name, mname) == 0) break; } if (m == NULL) { - syserr("554 buildaddr: unknown mailer %s", *tv); + syserr("554 buildaddr: unknown mailer %s", mname); goto badaddr; } a->q_mailer = m; /* figure out what host (if any) */ - tv++; - if ((**tv & 0377) == CANONHOST) - { - bp = buf; - spaceleft = sizeof buf - 1; - while (*++tv != NULL && (**tv & 0377) != CANONUSER) - { - int i = strlen(*tv); - - if (i > spaceleft) - { - /* out of space for this address */ - if (spaceleft >= 0) - syserr("554 buildaddr: host too long (%.40s...)", - buf); - i = spaceleft; - spaceleft = 0; - } - if (i <= 0) - continue; - bcopy(*tv, bp, i); - bp += i; - spaceleft -= i; - } - *bp = '\0'; - a->q_host = newstr(buf); - } - else + if (hostp == NULL) { if (!bitnset(M_LOCALMAILER, m->m_flags)) { @@ -1385,47 +1502,38 @@ badaddr: } a->q_host = NULL; } + else + a->q_host = newstr(hbuf); /* figure out the user */ - if (*tv == NULL || (**tv & 0377) != CANONUSER) + p = ubuf; + if (bitnset(M_CHECKUDB, m->m_flags) && *p == '@') { - syserr("554 buildaddr: no user"); - goto badaddr; + p++; + tv++; + a->q_flags |= QNOTREMOTE; } - tv++; /* do special mapping for local mailer */ - if (m == LocalMailer && *tv != NULL) + if (*p == '"') + p++; + if (*p == '|' && bitnset(M_CHECKPROG, m->m_flags)) + a->q_mailer = m = ProgMailer; + else if (*p == '/' && bitnset(M_CHECKFILE, m->m_flags)) + a->q_mailer = m = FileMailer; + else if (*p == ':' && bitnset(M_CHECKINCLUDE, m->m_flags)) { - register char *p = *tv; - - if (*p == '"') - p++; - if (*p == '|') - a->q_mailer = m = ProgMailer; - else if (*p == '/') - a->q_mailer = m = FileMailer; - else if (*p == ':') + /* may be :include: */ + stripquotes(ubuf); + if (strncasecmp(ubuf, ":include:", 9) == 0) { - /* may be :include: */ - cataddr(tv, NULL, buf, sizeof buf, '\0'); - stripquotes(buf); - if (strncasecmp(buf, ":include:", 9) == 0) - { - /* if :include:, don't need further rewriting */ - a->q_mailer = m = InclMailer; - a->q_user = &buf[9]; - return (a); - } + /* if :include:, don't need further rewriting */ + a->q_mailer = m = InclMailer; + a->q_user = newstr(&ubuf[9]); + return a; } } - if (m == LocalMailer && *tv != NULL && strcmp(*tv, "@") == 0) - { - tv++; - a->q_flags |= QNOTREMOTE; - } - /* rewrite according recipient mailer rewriting rules */ define('h', a->q_host, e); if (!bitset(RF_SENDERADDR|RF_HEADERADDR, flags)) @@ -1438,8 +1546,8 @@ badaddr: (void) rewrite(tv, 4, 0, e); /* save the result for the command line/RCPT argument */ - cataddr(tv, NULL, buf, sizeof buf, '\0'); - a->q_user = buf; + cataddr(tv, NULL, ubuf, sizeof ubuf, '\0'); + a->q_user = ubuf; /* ** Do mapping to lower case as requested by mailer @@ -1450,7 +1558,12 @@ badaddr: if (!bitnset(M_USR_UPPER, m->m_flags)) makelower(a->q_user); - return (a); + if (tTd(24, 6)) + { + printf("buildaddr => "); + printaddr(a, FALSE); + } + return a; } /* ** CATADDR -- concatenate pieces of addresses (putting in <LWSP> subs) @@ -1471,12 +1584,13 @@ badaddr: ** Destroys buf. */ +void cataddr(pvp, evp, buf, sz, spacesub) char **pvp; char **evp; char *buf; register int sz; - char spacesub; + int spacesub; { bool oatomtok = FALSE; bool natomtok = FALSE; @@ -1495,7 +1609,7 @@ cataddr(pvp, evp, buf, sz, spacesub) sz -= 2; while (*pvp != NULL && (i = strlen(*pvp)) < sz) { - natomtok = (toktype(**pvp) == ATM); + natomtok = (TokTypeTab[**pvp & 0xff] == ATM); if (oatomtok && natomtok) *p++ = spacesub; (void) strcpy(p, *pvp); @@ -1580,17 +1694,55 @@ sameaddr(a, b) ** none. */ +struct qflags +{ + char *qf_name; + u_long qf_bit; +}; + +struct qflags AddressFlags[] = +{ + "QDONTSEND", QDONTSEND, + "QBADADDR", QBADADDR, + "QGOODUID", QGOODUID, + "QPRIMARY", QPRIMARY, + "QQUEUEUP", QQUEUEUP, + "QSENT", QSENT, + "QNOTREMOTE", QNOTREMOTE, + "QSELFREF", QSELFREF, + "QVERIFIED", QVERIFIED, + "QBOGUSSHELL", QBOGUSSHELL, + "QUNSAFEADDR", QUNSAFEADDR, + "QPINGONSUCCESS", QPINGONSUCCESS, + "QPINGONFAILURE", QPINGONFAILURE, + "QPINGONDELAY", QPINGONDELAY, + "QHASNOTIFY", QHASNOTIFY, + "QRELAYED", QRELAYED, + "QEXPANDED", QEXPANDED, + "QDELIVERED", QDELIVERED, + "QDELAYED", QDELAYED, + "QTHISPASS", QTHISPASS, + NULL +}; + +void printaddr(a, follow) register ADDRESS *a; bool follow; { - bool first = TRUE; register MAILER *m; MAILER pseudomailer; + register struct qflags *qfp; + bool firstone; + + if (a == NULL) + { + printf("[NULL]\n"); + return; + } while (a != NULL) { - first = FALSE; printf("%x=", a); (void) fflush(stdout); @@ -1603,25 +1755,60 @@ printaddr(a, follow) m->m_name = "NULL"; } - printf("%s:\n\tmailer %d (%s), host `%s', user `%s', ruser `%s'\n", - a->q_paddr, m->m_mno, m->m_name, - a->q_host, a->q_user, - a->q_ruser ? a->q_ruser : "<null>"); - printf("\tnext=%x, flags=%o, alias %x, uid %d, gid %d\n", - a->q_next, a->q_flags, a->q_alias, a->q_uid, a->q_gid); + printf("%s:\n\tmailer %d (%s), host `%s'\n", + a->q_paddr == NULL ? "<null>" : a->q_paddr, + m->m_mno, m->m_name, + a->q_host == NULL ? "<null>" : a->q_host); + printf("\tuser `%s', ruser `%s'\n", + a->q_user, + a->q_ruser == NULL ? "<null>" : a->q_ruser); + printf("\tnext=%x, alias %x, uid %d, gid %d\n", + a->q_next, a->q_alias, a->q_uid, a->q_gid); + printf("\tflags=%lx<", a->q_flags); + firstone = TRUE; + for (qfp = AddressFlags; qfp->qf_name != NULL; qfp++) + { + if (!bitset(qfp->qf_bit, a->q_flags)) + continue; + if (!firstone) + printf(","); + firstone = FALSE; + printf("%s", qfp->qf_name); + } + printf(">\n"); printf("\towner=%s, home=\"%s\", fullname=\"%s\"\n", a->q_owner == NULL ? "(none)" : a->q_owner, a->q_home == NULL ? "(none)" : a->q_home, a->q_fullname == NULL ? "(none)" : a->q_fullname); + printf("\torcpt=\"%s\", statmta=%s, rstatus=%s\n", + a->q_orcpt == NULL ? "(none)" : a->q_orcpt, + a->q_statmta == NULL ? "(none)" : a->q_statmta, + a->q_rstatus == NULL ? "(none)" : a->q_rstatus); if (!follow) return; a = a->q_next; } - if (first) - printf("[NULL]\n"); } +/* +** EMPTYADDR -- return TRUE if this address is empty (``<>'') +** +** Parameters: +** a -- pointer to the address +** +** Returns: +** TRUE -- if this address is "empty" (i.e., no one should +** ever generate replies to it. +** FALSE -- if it is a "regular" (read: replyable) address. +*/ +bool +emptyaddr(a) + register ADDRESS *a; +{ + return a->q_paddr == NULL || strcmp(a->q_paddr, "<>") == 0 || + a->q_user == NULL || strcmp(a->q_user, "<>") == 0; +} /* ** REMOTENAME -- return the name relative to the current mailer ** @@ -1657,8 +1844,8 @@ remotename(name, m, flags, pstat, e) char *fancy; char *oldg = macvalue('g', e); int rwset; - static char buf[MAXNAME]; - char lbuf[MAXNAME]; + static char buf[MAXNAME + 1]; + char lbuf[MAXNAME + 1]; char pvpbuf[PSBUFSIZE]; extern char *crackaddr(); @@ -1693,7 +1880,7 @@ remotename(name, m, flags, pstat, e) ** domain will be appended. */ - pvp = prescan(name, '\0', pvpbuf, sizeof pvpbuf, NULL); + pvp = prescan(name, '\0', pvpbuf, sizeof pvpbuf, NULL, NULL); if (pvp == NULL) return (name); if (rewrite(pvp, 3, 0, e) == EX_TEMPFAIL) @@ -1760,9 +1947,9 @@ remotename(name, m, flags, pstat, e) /* need to make sure route-addrs have <angle brackets> */ if (bitset(RF_CANONICAL, flags) && lbuf[0] == '@') - expand("<\201g>", buf, &buf[sizeof buf - 1], e); + expand("<\201g>", buf, sizeof buf, e); else - expand(fancy, buf, &buf[sizeof buf - 1], e); + expand(fancy, buf, sizeof buf, e); define('g', oldg, e); @@ -1777,14 +1964,18 @@ remotename(name, m, flags, pstat, e) ** a -- the address to map (but just the user name part). ** sendq -- the sendq in which to install any replacement ** addresses. +** aliaslevel -- the alias nesting depth. +** e -- the envelope. ** ** Returns: ** none. */ -maplocaluser(a, sendq, e) +void +maplocaluser(a, sendq, aliaslevel, e) register ADDRESS *a; ADDRESS **sendq; + int aliaslevel; ENVELOPE *e; { register char **pvp; @@ -1797,7 +1988,7 @@ maplocaluser(a, sendq, e) printf("maplocaluser: "); printaddr(a, FALSE); } - pvp = prescan(a->q_user, '\0', pvpbuf, sizeof pvpbuf, &delimptr); + pvp = prescan(a->q_user, '\0', pvpbuf, sizeof pvpbuf, &delimptr, NULL); if (pvp == NULL) return; @@ -1818,8 +2009,8 @@ maplocaluser(a, sendq, e) printaddr(a, FALSE); } a1->q_alias = a; - allocaddr(a1, RF_COPYALL, NULL); - (void) recipient(a1, sendq, e); + allocaddr(a1, RF_COPYALL, a->q_paddr); + (void) recipient(a1, sendq, aliaslevel, e); } /* ** DEQUOTE_INIT -- initialize dequote map @@ -1841,6 +2032,7 @@ dequote_init(map, args) { register char *p = args; + map->map_mflags |= MF_KEEPQUOTES; for (;;) { while (isascii(*p) && isspace(*p)) @@ -1852,6 +2044,10 @@ dequote_init(map, args) case 'a': map->map_app = ++p; break; + + case 's': + map->map_coldelim = *++p; + break; } while (*p != '\0' && !(isascii(*p) && isspace(*p))) p++; @@ -1888,19 +2084,13 @@ dequote_map(map, name, av, statp) register char *p; register char *q; register char c; - int anglecnt; - int cmntcnt; - int quotecnt; - int spacecnt; - bool quotemode; - bool bslashmode; - - anglecnt = 0; - cmntcnt = 0; - quotecnt = 0; - spacecnt = 0; - quotemode = FALSE; - bslashmode = FALSE; + int anglecnt = 0; + int cmntcnt = 0; + int quotecnt = 0; + int spacecnt = 0; + bool quotemode = FALSE; + bool bslashmode = FALSE; + char spacesub = map->map_coldelim; for (p = q = name; (c = *p++) != '\0'; ) { @@ -1911,6 +2101,9 @@ dequote_map(map, name, av, statp) continue; } + if (c == ' ' && spacesub != '\0') + c = spacesub; + switch (c) { case '\\': diff --git a/usr.sbin/sendmail/src/pathnames.h b/usr.sbin/sendmail/src/pathnames.h index a611c0b0b2b06..a364fbab33a7d 100644 --- a/usr.sbin/sendmail/src/pathnames.h +++ b/usr.sbin/sendmail/src/pathnames.h @@ -30,11 +30,15 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * @(#)pathnames.h 8.2 (Berkeley) 8/20/93 + * @(#)pathnames.h 8.4 (Berkeley) 6/19/95 */ #ifndef _PATH_SENDMAILCF -# define _PATH_SENDMAILCF "/etc/sendmail.cf" +# if defined(USE_VENDOR_CF_PATH) && defined(_PATH_VENDOR_CF) +# define _PATH_SENDMAILCF _PATH_VENDOR_CF +# else +# define _PATH_SENDMAILCF "/etc/sendmail.cf" +# endif #endif #ifndef _PATH_SENDMAILPID @@ -44,3 +48,7 @@ # define _PATH_SENDMAILPID "/etc/sendmail.pid" # endif #endif + +#ifndef _PATH_HOSTS +# define _PATH_HOSTS "/etc/hosts" +#endif diff --git a/usr.sbin/sendmail/src/queue.c b/usr.sbin/sendmail/src/queue.c index 1dc56a6839abf..bd89a31806a83 100644 --- a/usr.sbin/sendmail/src/queue.c +++ b/usr.sbin/sendmail/src/queue.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1983 Eric P. Allman + * Copyright (c) 1983, 1995 Eric P. Allman * Copyright (c) 1988, 1993 * The Regents of the University of California. All rights reserved. * @@ -36,14 +36,13 @@ #ifndef lint #ifdef QUEUE -static char sccsid[] = "@(#)queue.c 8.41.1.3 (Berkeley) 3/5/95 (with queueing)"; +static char sccsid[] = "@(#)queue.c 8.98.1.1 (Berkeley) 2/18/96 (with queueing)"; #else -static char sccsid[] = "@(#)queue.c 8.41.1.3 (Berkeley) 3/5/95 (without queueing)"; +static char sccsid[] = "@(#)queue.c 8.98.1.1 (Berkeley) 2/18/96 (without queueing)"; #endif #endif /* not lint */ # include <errno.h> -# include <pwd.h> # include <dirent.h> # ifdef QUEUE @@ -55,6 +54,9 @@ static char sccsid[] = "@(#)queue.c 8.41.1.3 (Berkeley) 3/5/95 (without queueing struct work { char *w_name; /* name of control file */ + char *w_host; /* name of recipient host */ + bool w_lock; /* is message locked? */ + bool w_tooyoung; /* is it too young to run? */ long w_pri; /* priority of message, see below */ time_t w_ctime; /* creation time of message */ struct work *w_next; /* next in queue */ @@ -63,13 +65,17 @@ struct work typedef struct work WORK; WORK *WorkQ; /* queue of things to be done */ + +#define QF_VERSION 1 /* version number of this queue format */ + +#if !defined(NGROUPS_MAX) && defined(NGROUPS) +# define NGROUPS_MAX NGROUPS /* POSIX naming convention */ +#endif /* ** QUEUEUP -- queue a message up for future transmission. ** ** Parameters: ** e -- the envelope to queue up. -** queueall -- if TRUE, queue all addresses, rather than -** just those with the QQUEUEUP flag set. ** announce -- if TRUE, tell when you are queueing up. ** ** Returns: @@ -80,9 +86,9 @@ WORK *WorkQ; /* queue of things to be done */ ** The queue file is left locked. */ -queueup(e, queueall, announce) +void +queueup(e, announce) register ENVELOPE *e; - bool queueall; bool announce; { char *qf; @@ -96,6 +102,7 @@ queueup(e, queueall, announce) MAILER nullmailer; MCI mcibuf; char buf[MAXLINE], tf[MAXLINE]; + extern void printctladdr __P((ADDRESS *, FILE *)); /* ** Create control file. @@ -157,6 +164,18 @@ queueup(e, queueall, announce) if (tTd(40, 1)) printf("\n>>>>> queueing %s%s >>>>>\n", e->e_id, newid ? " (new id)" : ""); + if (tTd(40, 3)) + { + extern void printenvflags(); + + printf(" e_flags="); + printenvflags(e); + } + if (tTd(40, 32)) + { + printf(" sendq="); + printaddr(e->e_sendqueue, TRUE); + } if (tTd(40, 9)) { printf(" tfp="); @@ -172,17 +191,25 @@ queueup(e, queueall, announce) ** If there is no data file yet, create one. */ - if (e->e_df == NULL) + if (!bitset(EF_HAS_DF, e->e_flags)) { register FILE *dfp; - extern putbody(); + char dfname[20]; + struct stat stbuf; - e->e_df = queuename(e, 'd'); - e->e_df = newstr(e->e_df); - fd = open(e->e_df, O_WRONLY|O_CREAT|O_TRUNC, FileMode); + strcpy(dfname, queuename(e, 'd')); + fd = open(dfname, O_WRONLY|O_CREAT|O_TRUNC, FileMode); if (fd < 0 || (dfp = fdopen(fd, "w")) == NULL) syserr("!queueup: cannot create data temp file %s, uid=%d", - e->e_df, geteuid()); + dfname, geteuid()); + if (fstat(fd, &stbuf) < 0) + e->e_dfino = -1; + else + { + e->e_dfdev = stbuf.st_dev; + e->e_dfino = stbuf.st_ino; + } + e->e_flags |= EF_HAS_DF; bzero(&mcibuf, sizeof mcibuf); mcibuf.mci_out = dfp; mcibuf.mci_mailer = FileMailer; @@ -197,16 +224,30 @@ queueup(e, queueall, announce) ** they are required by orderq. */ - /* output message priority */ - fprintf(tfp, "P%ld\n", e->e_msgpriority); + /* output queue version number (must be first!) */ + fprintf(tfp, "V%d\n", QF_VERSION); /* output creation time */ fprintf(tfp, "T%ld\n", e->e_ctime); - /* output type and name of data file */ + /* output last delivery time */ + fprintf(tfp, "K%ld\n", e->e_dtime); + + /* output number of delivery attempts */ + fprintf(tfp, "N%d\n", e->e_ntries); + + /* output message priority */ + fprintf(tfp, "P%ld\n", e->e_msgpriority); + + /* output inode number of data file */ + /* XXX should probably include device major/minor too */ + if (e->e_dfino != -1) + fprintf(tfp, "I%d/%d/%ld\n", + major(e->e_dfdev), minor(e->e_dfdev), e->e_dfino); + + /* output body type */ if (e->e_bodytype != NULL) - fprintf(tfp, "B%s\n", e->e_bodytype); - fprintf(tfp, "D%s\n", e->e_df); + fprintf(tfp, "B%s\n", denlstring(e->e_bodytype, TRUE, FALSE)); /* message from envelope, if it exists */ if (e->e_message != NULL) @@ -218,6 +259,8 @@ queueup(e, queueall, announce) *p++ = 'w'; if (bitset(EF_RESPONSE, e->e_flags)) *p++ = 'r'; + if (bitset(EF_HAS8BIT, e->e_flags)) + *p++ = '8'; *p++ = '\0'; if (buf[0] != '\0') fprintf(tfp, "F%s\n", buf); @@ -231,33 +274,45 @@ queueup(e, queueall, announce) fprintf(tfp, "$_%s\n", denlstring(p, TRUE, FALSE)); /* output name of sender */ - fprintf(tfp, "S%s\n", denlstring(e->e_from.q_paddr, TRUE, FALSE)); + if (bitnset(M_UDBENVELOPE, e->e_from.q_mailer->m_flags)) + p = e->e_sender; + else + p = e->e_from.q_paddr; + fprintf(tfp, "S%s\n", denlstring(p, TRUE, FALSE)); - /* output list of error recipients */ - printctladdr(NULL, NULL); - for (q = e->e_errorqueue; q != NULL; q = q->q_next) - { - if (!bitset(QDONTSEND|QBADADDR, q->q_flags)) - { - printctladdr(q, tfp); - fprintf(tfp, "E%s\n", denlstring(q->q_paddr, TRUE, FALSE)); - } - } + /* output ESMTP-supplied "original" information */ + if (e->e_envid != NULL) + fprintf(tfp, "Z%s\n", denlstring(e->e_envid, TRUE, FALSE)); /* output list of recipient addresses */ + printctladdr(NULL, NULL); for (q = e->e_sendqueue; q != NULL; q = q->q_next) { if (bitset(QQUEUEUP, q->q_flags) || - (queueall && !bitset(QDONTSEND|QBADADDR|QSENT, q->q_flags))) + !bitset(QDONTSEND|QBADADDR|QSENT, q->q_flags)) { printctladdr(q, tfp); - fprintf(tfp, "R%s\n", denlstring(q->q_paddr, TRUE, FALSE)); + if (q->q_orcpt != NULL) + fprintf(tfp, "Q%s\n", + denlstring(q->q_orcpt, TRUE, FALSE)); + putc('R', tfp); + if (bitset(QPRIMARY, q->q_flags)) + putc('P', tfp); + if (bitset(QPINGONSUCCESS, q->q_flags)) + putc('S', tfp); + if (bitset(QPINGONFAILURE, q->q_flags)) + putc('F', tfp); + if (bitset(QPINGONDELAY, q->q_flags)) + putc('D', tfp); + putc(':', tfp); + fprintf(tfp, "%s\n", denlstring(q->q_paddr, TRUE, FALSE)); if (announce) { e->e_to = q->q_paddr; message("queued"); if (LogLevel > 8) - logdelivery(NULL, NULL, "queued", NULL, e); + logdelivery(q->q_mailer, NULL, "queued", + NULL, (time_t) 0, e); e->e_to = NULL; } if (tTd(40, 1)) @@ -302,7 +357,7 @@ queueup(e, queueall, announce) /* 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); + (void) expand(h->h_value, buf, sizeof buf, e); if (buf[0] == '\0') continue; } @@ -325,7 +380,9 @@ queueup(e, queueall, announce) /* output the header: expand macros, convert addresses */ if (bitset(H_DEFAULT, h->h_flags)) { - fprintf(tfp, "%s: %s\n", h->h_field, buf); + fprintf(tfp, "%s: %s\n", + h->h_field, + denlstring(buf, FALSE, TRUE)); } else if (bitset(H_FROM|H_RCPT, h->h_flags)) { @@ -342,13 +399,22 @@ queueup(e, queueall, announce) TrafficLogFile = savetrace; } else - fprintf(tfp, "%s: %s\n", h->h_field, h->h_value); + { + fprintf(tfp, "%s: %s\n", + h->h_field, + denlstring(h->h_value, FALSE, TRUE)); + } } /* ** Clean up. + ** + ** Write a terminator record -- this is to prevent + ** scurrilous crackers from appending any data. */ + fprintf(tfp, ".\n"); + if (fflush(tfp) < 0 || fsync(fileno(tfp)) < 0 || ferror(tfp)) { if (newid) @@ -362,8 +428,8 @@ queueup(e, queueall, announce) /* 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()); + syserr("cannot rename(%s, %s), uid=%d", + tf, qf, geteuid()); /* close and unlock old (locked) qf */ if (e->e_lockfp != NULL) @@ -378,7 +444,7 @@ queueup(e, queueall, announce) # ifdef LOG /* save log info */ if (LogLevel > 79) - syslog(LOG_DEBUG, "%s: queueup, qf=%s, df=%s\n", e->e_id, qf, e->e_df); + syslog(LOG_DEBUG, "%s: queueup, qf=%s", e->e_id, qf); # endif /* LOG */ if (tTd(40, 1)) @@ -386,6 +452,7 @@ queueup(e, queueall, announce) return; } +void printctladdr(a, tfp) register ADDRESS *a; FILE *tfp; @@ -422,14 +489,13 @@ printctladdr(a, tfp) lastuid = uid; lastctladdr = a; - if (uid == 0 || (pw = getpwuid(uid)) == NULL) + if (uid == 0 || (pw = sm_getpwuid(uid)) == NULL) uname = ""; else uname = pw->pw_name; fprintf(tfp, "C%s:%s\n", uname, denlstring(a->q_paddr, TRUE, FALSE)); } - /* ** RUNQUEUE -- run the jobs in the queue. ** @@ -450,10 +516,13 @@ printctladdr(a, tfp) ENVELOPE QueueEnvelope; /* the queue run envelope */ +void runqueue(forkflag) bool forkflag; { register ENVELOPE *e; + int njobs; + int sequenceno = 0; extern ENVELOPE BlankEnvelope; /* @@ -465,8 +534,14 @@ runqueue(forkflag) if (shouldqueue(0L, curtime())) { + char *msg = "Skipping queue run -- load average too high"; + if (Verbose) - printf("Skipping queue run -- load average too high\n"); + printf("%s\n", msg); +#ifdef LOG + if (LogLevel > 8) + syslog(LOG_INFO, "runqueue: %s", msg); +#endif if (forkflag && QueueIntvl != 0) (void) setevent(QueueIntvl, runqueue, TRUE); return; @@ -479,6 +554,7 @@ runqueue(forkflag) if (forkflag) { int pid; + extern void intsig(); #ifdef SIGCHLD extern void reapchild(); @@ -491,18 +567,21 @@ runqueue(forkflag) /* parent -- pick up intermediate zombie */ #ifndef SIGCHLD (void) waitfor(pid); +#else + CurChildren++; #endif /* SIGCHLD */ if (QueueIntvl != 0) (void) setevent(QueueIntvl, runqueue, TRUE); return; } - /* child -- double fork */ + /* child -- double fork and clean up signals */ #ifndef SIGCHLD if (fork() != 0) exit(EX_OK); #else /* SIGCHLD */ (void) setsignal(SIGCHLD, SIG_DFL); #endif /* SIGCHLD */ + (void) setsignal(SIGHUP, intsig); } setproctitle("running queue: %s", QueueDir); @@ -546,7 +625,7 @@ runqueue(forkflag) */ /* order the existing work requests */ - (void) orderq(FALSE); + njobs = orderq(FALSE); /* process them once at a time */ while (WorkQ != NULL) @@ -559,22 +638,29 @@ runqueue(forkflag) ** Ignore jobs that are too expensive for the moment. */ + sequenceno++; if (shouldqueue(w->w_pri, w->w_ctime)) { if (Verbose) - printf("\nSkipping %s\n", w->w_name + 2); + printf("\nSkipping %s (sequence %d of %d)\n", + w->w_name + 2, sequenceno, njobs); } else { pid_t pid; extern pid_t dowork(); + if (Verbose) + printf("\nRunning %s (sequence %d of %d)\n", + w->w_name + 2, sequenceno, njobs); pid = dowork(w->w_name + 2, ForkQueueRuns, FALSE, e); errno = 0; if (pid != 0) (void) waitfor(pid); } free(w->w_name); + if (w->w_host) + free(w->w_host); free((char *) w); } @@ -604,6 +690,10 @@ runqueue(forkflag) # define NEED_R 004 # define NEED_S 010 +static WORK *WorkList = NULL; +static int WorkListSize = 0; + +int orderq(doall) bool doall; { @@ -611,9 +701,8 @@ orderq(doall) register WORK *w; DIR *f; register int i; - WORK wlist[QUEUESIZE+1]; int wn = -1; - extern workcmpf(); + int wc; if (tTd(41, 1)) { @@ -633,6 +722,8 @@ orderq(doall) WorkQ = nw; free(w->w_name); + if (w->w_host) + free(w->w_host); free((char *) w); w = nw; } @@ -653,9 +744,12 @@ orderq(doall) { FILE *cf; register char *p; - char lbuf[MAXNAME]; + char lbuf[MAXNAME + 1]; extern bool strcontainedin(); + if (tTd(41, 50)) + printf("orderq: checking %s\n", d->d_name); + /* is this an interesting entry? */ if (d->d_name[0] != 'q' || d->d_name[1] != 'f') continue; @@ -664,6 +758,7 @@ orderq(doall) !strcontainedin(QueueLimitId, d->d_name)) continue; +#ifdef PICKY_QF_NAME_CHECK /* ** Check queue name for plausibility. This handles ** both old and new type ids. @@ -682,22 +777,38 @@ orderq(doall) { if (Verbose) printf("orderq: bogus qf name %s\n", d->d_name); -#ifdef LOG - if (LogLevel > 3) - syslog(LOG_CRIT, "orderq: bogus qf name %s", +# ifdef LOG + if (LogLevel > 0) + syslog(LOG_ALERT, "orderq: bogus qf name %s", d->d_name); -#endif - if (strlen(d->d_name) >= MAXNAME) - d->d_name[MAXNAME - 1] = '\0'; +# endif + if (strlen(d->d_name) > (SIZE_T) MAXNAME) + d->d_name[MAXNAME] = '\0'; strcpy(lbuf, d->d_name); lbuf[0] = 'Q'; (void) rename(d->d_name, lbuf); continue; } +#endif - /* yes -- open control file (if not too many files) */ - if (++wn >= QUEUESIZE) + /* open control file (if not too many files) */ + if (++wn >= MaxQueueRun && MaxQueueRun > 0) + { +# ifdef LOG + if (wn == MaxQueueRun && LogLevel > 0) + syslog(LOG_ALERT, "WorkList for %s maxed out at %d", + QueueDir, MaxQueueRun); +# endif continue; + } + if (wn >= WorkListSize) + { + extern void grow_wlist __P((void)); + + grow_wlist(); + if (wn >= WorkListSize) + continue; + } cf = fopen(d->d_name, "r"); if (cf == NULL) @@ -705,14 +816,17 @@ orderq(doall) /* this may be some random person sending hir msgs */ /* syserr("orderq: cannot open %s", cbuf); */ if (tTd(41, 2)) - printf("orderq: cannot open %s (%d)\n", - d->d_name, errno); + printf("orderq: cannot open %s: %s\n", + d->d_name, errstring(errno)); errno = 0; wn--; continue; } - w = &wlist[wn]; + w = &WorkList[wn]; w->w_name = newstr(d->d_name); + w->w_host = NULL; + w->w_lock = !lockfile(fileno(cf), w->w_name, NULL, LOCK_SH|LOCK_NB); + w->w_tooyoung = FALSE; /* make sure jobs in creation don't clog queue */ w->w_pri = 0x7fffffff; @@ -722,11 +836,10 @@ orderq(doall) i = NEED_P | NEED_T; if (QueueLimitSender != NULL) i |= NEED_S; - if (QueueLimitRecipient != NULL) + if (QueueSortOrder == QS_BYHOST || QueueLimitRecipient != NULL) i |= NEED_R; while (i != 0 && fgets(lbuf, sizeof lbuf, cf) != NULL) { - extern long atol(); extern bool strcontainedin(); switch (lbuf[0]) @@ -742,7 +855,10 @@ orderq(doall) break; case 'R': - if (QueueLimitRecipient != NULL && + if (w->w_host == NULL && + (p = strrchr(&lbuf[1], '@')) != NULL) + w->w_host = newstr(&p[1]); + if (QueueLimitRecipient == NULL || strcontainedin(QueueLimitRecipient, &lbuf[1])) i &= ~NEED_R; break; @@ -752,6 +868,16 @@ orderq(doall) strcontainedin(QueueLimitSender, &lbuf[1])) i &= ~NEED_S; break; + + case 'K': + if ((curtime() - (time_t) atol(&lbuf[1])) < MinQueueAge) + w->w_tooyoung = TRUE; + break; + + case 'N': + if (atol(&lbuf[1]) == 0) + w->w_tooyoung = FALSE; + break; } } (void) fclose(cf); @@ -760,17 +886,78 @@ orderq(doall) bitset(NEED_R|NEED_S, i)) { /* don't even bother sorting this job in */ + if (tTd(41, 49)) + printf("skipping %s (%x)\n", w->w_name, i); + free(w->w_name); + if (w->w_host) + free(w->w_host); wn--; } } (void) closedir(f); wn++; - /* - ** Sort the work directory. - */ + wc = min(wn, WorkListSize); + if (wc > MaxQueueRun && MaxQueueRun > 0) + wc = MaxQueueRun; + + if (QueueSortOrder == QS_BYHOST) + { + extern workcmpf1(); + extern workcmpf2(); - qsort((char *) wlist, min(wn, QUEUESIZE), sizeof *wlist, workcmpf); + /* + ** Sort the work directory for the first time, + ** based on host name, lock status, and priority. + */ + + qsort((char *) WorkList, wc, sizeof *WorkList, workcmpf1); + + /* + ** If one message to host is locked, "lock" all messages + ** to that host. + */ + + i = 0; + while (i < wc) + { + if (!WorkList[i].w_lock) + { + i++; + continue; + } + w = &WorkList[i]; + while (++i < wc) + { + if (WorkList[i].w_host == NULL && + w->w_host == NULL) + WorkList[i].w_lock = TRUE; + else if (WorkList[i].w_host != NULL && + w->w_host != NULL && + strcmp(WorkList[i].w_host, w->w_host) == 0) + WorkList[i].w_lock = TRUE; + else + break; + } + } + + /* + ** Sort the work directory for the second time, + ** based on lock status, host name, and priority. + */ + + qsort((char *) WorkList, wc, sizeof *WorkList, workcmpf2); + } + else + { + extern workcmpf0(); + + /* + ** Simple sort based on queue priority only. + */ + + qsort((char *) WorkList, wc, sizeof *WorkList, workcmpf0); + } /* ** Convert the work list into canonical form. @@ -778,15 +965,21 @@ orderq(doall) */ WorkQ = NULL; - for (i = min(wn, QUEUESIZE); --i >= 0; ) + for (i = wc; --i >= 0; ) { w = (WORK *) xalloc(sizeof *w); - w->w_name = wlist[i].w_name; - w->w_pri = wlist[i].w_pri; - w->w_ctime = wlist[i].w_ctime; + w->w_name = WorkList[i].w_name; + w->w_host = WorkList[i].w_host; + w->w_lock = WorkList[i].w_lock; + w->w_tooyoung = WorkList[i].w_tooyoung; + w->w_pri = WorkList[i].w_pri; + w->w_ctime = WorkList[i].w_ctime; w->w_next = WorkQ; WorkQ = w; } + if (WorkList != NULL) + free(WorkList); + WorkList = NULL; if (tTd(40, 1)) { @@ -797,7 +990,59 @@ orderq(doall) return (wn); } /* -** WORKCMPF -- compare function for ordering work. +** GROW_WLIST -- make the work list larger +** +** Parameters: +** none. +** +** Returns: +** none. +** +** Side Effects: +** Adds another QUEUESEGSIZE entries to WorkList if possible. +** It can fail if there isn't enough memory, so WorkListSize +** should be checked again upon return. +*/ + +void +grow_wlist() +{ + if (tTd(41, 1)) + printf("grow_wlist: WorkListSize=%d\n", WorkListSize); + if (WorkList == NULL) + { + WorkList = (WORK *) xalloc(sizeof(WORK) * (QUEUESEGSIZE + 1)); + WorkListSize = QUEUESEGSIZE; + } + else + { + int newsize = WorkListSize + QUEUESEGSIZE; + WORK *newlist = (WORK *) realloc((char *)WorkList, + (unsigned)sizeof(WORK) * (newsize + 1)); + + if (newlist != NULL) + { + WorkListSize = newsize; + WorkList = newlist; +# ifdef LOG + if (LogLevel > 1) + { + syslog(LOG_NOTICE, "grew WorkList for %s to %d", + QueueDir, WorkListSize); + } + } + else if (LogLevel > 0) + { + syslog(LOG_ALERT, "FAILED to grow WorkList for %s to %d", + QueueDir, newsize); +# endif + } + } + if (tTd(41, 1)) + printf("grow_wlist: WorkListSize now %d\n", WorkListSize); +} +/* +** WORKCMPF0 -- simple priority-only compare function. ** ** Parameters: ** a -- the first argument. @@ -812,7 +1057,8 @@ orderq(doall) ** none. */ -workcmpf(a, b) +int +workcmpf0(a, b) register WORK *a; register WORK *b; { @@ -820,11 +1066,93 @@ workcmpf(a, b) long pb = b->w_pri; if (pa == pb) - return (0); + return 0; else if (pa > pb) - return (1); + return 1; else - return (-1); + return -1; +} +/* +** WORKCMPF1 -- first compare function for ordering work based on host name. +** +** Sorts on host name, lock status, and priority in that order. +** +** Parameters: +** a -- the first argument. +** b -- the second argument. +** +** Returns: +** <0 if a < b +** 0 if a == b +** >0 if a > b +** +** Side Effects: +** none. +*/ + +int +workcmpf1(a, b) + register WORK *a; + register WORK *b; +{ + int i; + + /* host name */ + if (a->w_host != NULL && b->w_host == NULL) + return 1; + else if (a->w_host == NULL && b->w_host != NULL) + return -1; + if (a->w_host != NULL && b->w_host != NULL && + (i = strcmp(a->w_host, b->w_host))) + return i; + + /* lock status */ + if (a->w_lock != b->w_lock) + return b->w_lock - a->w_lock; + + /* job priority */ + return a->w_pri - b->w_pri; +} +/* +** WORKCMPF2 -- second compare function for ordering work based on host name. +** +** Sorts on lock status, host name, and priority in that order. +** +** Parameters: +** a -- the first argument. +** b -- the second argument. +** +** Returns: +** <0 if a < b +** 0 if a == b +** >0 if a > b +** +** Side Effects: +** none. +*/ + +int +workcmpf2(a, b) + register WORK *a; + register WORK *b; +{ + int i; + + /* lock status */ + if (a->w_lock != b->w_lock) + return a->w_lock - b->w_lock; + + /* host name */ + if (a->w_host != NULL && b->w_host == NULL) + return 1; + else if (a->w_host == NULL && b->w_host != NULL) + return -1; + if (a->w_host != NULL && b->w_host != NULL && + (i = strcmp(a->w_host, b->w_host))) + return i; + + /* job priority */ + return a->w_pri - b->w_pri; } /* ** DOWORK -- do a work request. @@ -895,6 +1223,7 @@ dowork(id, forkflag, requeueflag, e) (void) alarm(0); clearenvelope(e, FALSE); e->e_flags |= EF_QUEUERUN|EF_GLOBALERRS; + e->e_sendmode = SM_DELIVER; e->e_errormode = EM_MAIL; e->e_id = id; GrabTo = UseErrorsTo = FALSE; @@ -928,7 +1257,7 @@ dowork(id, forkflag, requeueflag, e) eatheader(e, requeueflag); if (requeueflag) - queueup(e, TRUE, FALSE); + queueup(e, FALSE); /* do the delivery */ sendall(e, SM_DELIVER); @@ -964,10 +1293,14 @@ readqf(e) ADDRESS *ctladdr; struct stat st; char *bp; + int qfver = 0; + register char *p; + char *orcpt = NULL; + bool nomore = FALSE; char qf[20]; char buf[MAXLINE]; - extern long atol(); extern ADDRESS *setctluser(); + extern void loseqfile(); /* ** Read and process the file. @@ -988,9 +1321,7 @@ readqf(e) if (!lockfile(fileno(qfp), qf, NULL, LOCK_EX|LOCK_NB)) { /* being processed by another queuer */ - if (tTd(40, 8)) - printf("readqf(%s): locked\n", qf); - if (Verbose) + if (Verbose || tTd(40, 8)) printf("%s: locked\n", e->e_id); # ifdef LOG if (LogLevel > 19) @@ -1014,7 +1345,7 @@ readqf(e) return FALSE; } - if (st.st_uid != geteuid()) + if (st.st_uid != geteuid() || bitset(S_IWOTH|S_IWGRP, st.st_mode)) { # ifdef LOG if (LogLevel > 0) @@ -1025,7 +1356,7 @@ readqf(e) # endif /* LOG */ if (tTd(40, 8)) printf("readqf(%s): bogus file\n", qf); - rename(qf, queuename(e, 'Q')); + loseqfile(e, "bogus file uid in mqueue"); fclose(qfp); return FALSE; } @@ -1059,32 +1390,91 @@ readqf(e) LineNumber = 0; e->e_flags |= EF_GLOBALERRS; OpMode = MD_DELIVER; - if (Verbose) - printf("\nRunning %s\n", e->e_id); ctladdr = NULL; + e->e_dfino = -1; + e->e_msgsize = -1; while ((bp = fgetfolded(buf, sizeof buf, qfp)) != NULL) { register char *p; - struct stat st; + u_long qflags; + ADDRESS *q; if (tTd(40, 4)) printf("+++++ %s\n", bp); + if (nomore) + { + /* hack attack */ + syserr("SECURITY ALERT: extra data in qf: %s", bp); + fclose(qfp); + loseqfile(e, "bogus queue line"); + return FALSE; + } switch (bp[0]) { + case 'V': /* queue file version number */ + qfver = atoi(&bp[1]); + if (qfver > QF_VERSION) + { + syserr("Version number in qf (%d) greater than max (%d)", + qfver, QF_VERSION); + } + break; + case 'C': /* specify controlling user */ ctladdr = setctluser(&bp[1]); break; + case 'Q': /* original recipient */ + orcpt = newstr(&bp[1]); + break; + case 'R': /* specify recipient */ - (void) sendtolist(&bp[1], ctladdr, &e->e_sendqueue, e); + p = bp; + qflags = 0; + if (qfver >= 1) + { + /* get flag bits */ + while (*++p != '\0' && *p != ':') + { + switch (*p) + { + case 'S': + qflags |= QPINGONSUCCESS; + break; + + case 'F': + qflags |= QPINGONFAILURE; + break; + + case 'D': + qflags |= QPINGONDELAY; + break; + + case 'P': + qflags |= QPRIMARY; + break; + } + } + } + else + qflags |= QPRIMARY; + q = parseaddr(++p, NULLADDR, RF_COPYALL, '\0', NULL, e); + if (q != NULL) + { + q->q_alias = ctladdr; + q->q_flags |= qflags; + q->q_orcpt = orcpt; + (void) recipient(q, &e->e_sendqueue, 0, e); + } + orcpt = NULL; break; case 'E': /* specify error recipient */ - (void) sendtolist(&bp[1], ctladdr, &e->e_errorqueue, e); + /* no longer used */ break; case 'H': /* header */ - (void) chompheader(&bp[1], FALSE, e); + (void) chompheader(&bp[1], FALSE, NULL, e); break; case 'M': /* message */ @@ -1100,26 +1490,39 @@ readqf(e) break; case 'D': /* data file name */ - e->e_df = newstr(&bp[1]); - e->e_dfp = fopen(e->e_df, "r"); - if (e->e_dfp == NULL) - { - syserr("readqf: cannot open %s", e->e_df); - e->e_msgsize = -1; - } - else if (fstat(fileno(e->e_dfp), &st) >= 0) - e->e_msgsize = st.st_size; + /* obsolete -- ignore */ break; case 'T': /* init time */ e->e_ctime = atol(&bp[1]); break; + case 'I': /* data file's inode number */ + if (e->e_dfino == -1) + e->e_dfino = atol(&buf[1]); + break; + + case 'K': /* time of last deliver attempt */ + e->e_dtime = atol(&buf[1]); + break; + + case 'N': /* number of delivery attempts */ + e->e_ntries = atoi(&buf[1]); + break; + case 'P': /* message priority */ e->e_msgpriority = atol(&bp[1]) + WkTimeFact; break; case 'F': /* flag bits */ + if (strncmp(bp, "From ", 5) == 0) + { + /* we are being spoofed! */ + syserr("SECURITY ALERT: bogus qf line %s", bp); + fclose(qfp); + loseqfile(e, "bogus queue line"); + return FALSE; + } for (p = &bp[1]; *p != '\0'; p++) { switch (*p) @@ -1131,22 +1534,31 @@ readqf(e) case 'r': /* response */ e->e_flags |= EF_RESPONSE; break; + + case '8': /* has 8 bit data */ + e->e_flags |= EF_HAS8BIT; + break; } } break; + case 'Z': /* original envelope id from ESMTP */ + e->e_envid = newstr(&bp[1]); + break; + case '$': /* define macro */ define(bp[1], newstr(&bp[2]), e); break; - case '\0': /* blank line; ignore */ + case '.': /* terminate file */ + nomore = TRUE; break; default: syserr("readqf: %s: line %d: bad line \"%s\"", qf, LineNumber, bp); fclose(qfp); - rename(qf, queuename(e, 'Q')); + loseqfile(e, "unrecognized line"); return FALSE; } @@ -1163,7 +1575,49 @@ readqf(e) { errno = 0; e->e_flags |= EF_CLRQUEUE | EF_FATALERRS | EF_RESPONSE; + return TRUE; + } + + /* if this has been tried recently, let it be */ + if (e->e_ntries > 0 && (curtime() - e->e_dtime) < MinQueueAge) + { + char *howlong = pintvl(curtime() - e->e_dtime, TRUE); + extern void unlockqueue(); + + if (Verbose || tTd(40, 8)) + printf("%s: too young (%s)\n", + e->e_id, howlong); +#ifdef LOG + if (LogLevel > 19) + syslog(LOG_DEBUG, "%s: too young (%s)", + e->e_id, howlong); +#endif + e->e_id = NULL; + unlockqueue(e); + return FALSE; + } + + /* + ** Arrange to read the data file. + */ + + p = queuename(e, 'd'); + e->e_dfp = fopen(p, "r"); + if (e->e_dfp == NULL) + { + syserr("readqf: cannot open %s", p); + } + else + { + e->e_flags |= EF_HAS_DF; + if (fstat(fileno(e->e_dfp), &st) >= 0) + { + e->e_msgsize = st.st_size; + e->e_dfdev = st.st_dev; + e->e_dfino = st.st_ino; + } } + return TRUE; } /* @@ -1179,6 +1633,7 @@ readqf(e) ** Prints a listing of the mail queue on the standard output. */ +void printqueue() { register WORK *w; @@ -1193,9 +1648,9 @@ printqueue() if (bitset(PRIV_RESTRICTMAILQ, PrivacyFlags) && RealUid != 0) { struct stat st; -# ifdef NGROUPS +# ifdef NGROUPS_MAX int n; - GIDSET_T gidset[NGROUPS]; + GIDSET_T gidset[NGROUPS_MAX]; # endif if (stat(QueueDir, &st) < 0) @@ -1203,14 +1658,14 @@ printqueue() syserr("Cannot stat %s", QueueDir); return; } -# ifdef NGROUPS - n = getgroups(NGROUPS, gidset); +# ifdef NGROUPS_MAX + n = getgroups(NGROUPS_MAX, gidset); while (--n >= 0) { if (gidset[n] == st.st_gid) break; } - if (n < 0) + if (n < 0 && RealGid != st.st_gid) # else if (RealGid != st.st_gid) # endif @@ -1241,8 +1696,8 @@ printqueue() CurrentLA = getla(); /* get load average */ printf("\t\tMail Queue (%d request%s", nrequests, nrequests == 1 ? "" : "s"); - if (nrequests > QUEUESIZE) - printf(", only %d printed", QUEUESIZE); + if (nrequests > WorkListSize) + printf(", only %d printed", WorkListSize); if (Verbose) printf(")\n--Q-ID-- --Size-- -Priority- ---Q-Time--- -----------Sender/Recipient-----------\n"); else @@ -1251,10 +1706,11 @@ printqueue() { struct stat st; auto time_t submittime = 0; - long dfsize = -1; + long dfsize; int flags = 0; - char message[MAXLINE]; - char bodytype[MAXNAME]; + int qfver; + char statmsg[MAXLINE]; + char bodytype[MAXNAME + 1]; printf("%8s", w->w_name + 2); f = fopen(w->w_name, "r"); @@ -1264,15 +1720,23 @@ printqueue() errno = 0; continue; } - if (!lockfile(fileno(f), w->w_name, NULL, LOCK_SH|LOCK_NB)) + w->w_name[0] = 'd'; + if (stat(w->w_name, &st) >= 0) + dfsize = st.st_size; + else + dfsize = -1; + if (w->w_lock) printf("*"); + else if (w->w_tooyoung) + printf("-"); else if (shouldqueue(w->w_pri, w->w_ctime)) printf("X"); else printf(" "); errno = 0; - message[0] = bodytype[0] = '\0'; + statmsg[0] = bodytype[0] = '\0'; + qfver = 0; while (fgets(buf, sizeof buf, f) != NULL) { register int i; @@ -1281,11 +1745,15 @@ printqueue() fixcrlf(buf, TRUE); switch (buf[0]) { + case 'V': /* queue file version */ + qfver = atoi(&buf[1]); + break; + case 'M': /* error message */ - if ((i = strlen(&buf[1])) >= sizeof message) - i = sizeof message - 1; - bcopy(&buf[1], message, i); - message[i] = '\0'; + if ((i = strlen(&buf[1])) >= sizeof statmsg) + i = sizeof statmsg - 1; + bcopy(&buf[1], statmsg, i); + statmsg[i] = '\0'; break; case 'B': /* body type */ @@ -1306,11 +1774,11 @@ printqueue() else printf("%8ld %.16s %.45s", dfsize, ctime(&submittime), &buf[1]); - if (message[0] != '\0' || bodytype[0] != '\0') + if (statmsg[0] != '\0' || bodytype[0] != '\0') { printf("\n %10.10s", bodytype); - if (message[0] != '\0') - printf(" (%.60s)", message); + if (statmsg[0] != '\0') + printf(" (%.60s)", statmsg); } break; @@ -1321,21 +1789,24 @@ printqueue() break; case 'R': /* recipient name */ + p = &buf[1]; + if (qfver >= 1) + { + p = strchr(p, ':'); + if (p == NULL) + break; + p++; + } if (Verbose) - printf("\n\t\t\t\t\t %.38s", &buf[1]); + printf("\n\t\t\t\t\t %.38s", p); else - printf("\n\t\t\t\t %.45s", &buf[1]); + printf("\n\t\t\t\t %.45s", p); break; case 'T': /* creation time */ submittime = atol(&buf[1]); break; - case 'D': /* data file name */ - if (stat(&buf[1], &st) >= 0) - dfsize = st.st_size; - break; - case 'F': /* flag bits */ for (p = &buf[1]; *p != '\0'; p++) { @@ -1388,7 +1859,7 @@ queuename(e, type) static char c2; time_t now; struct tm *tm; - static char buf[MAXNAME]; + static char buf[MAXNAME + 1]; if (e->e_id == NULL) { @@ -1480,6 +1951,7 @@ queuename(e, type) ** unlocks the queue for `e'. */ +void unlockqueue(e) ENVELOPE *e; { @@ -1545,7 +2017,7 @@ setctluser(user) p = strchr(user, ':'); if (p != NULL) *p++ = '\0'; - if (*user != '\0' && (pw = getpwnam(user)) != NULL) + if (*user != '\0' && (pw = sm_getpwnam(user)) != NULL) { if (strcmp(pw->pw_dir, "/") == 0) a->q_home = ""; @@ -1553,13 +2025,15 @@ setctluser(user) a->q_home = newstr(pw->pw_dir); a->q_uid = pw->pw_uid; a->q_gid = pw->pw_gid; - a->q_user = newstr(user); a->q_flags |= QGOODUID; } + + if (*user != '\0') + a->q_user = newstr(user); + else if (p != NULL) + a->q_user = newstr(p); else - { a->q_user = newstr(DefUser); - } a->q_flags |= QPRIMARY; /* flag as a "ctladdr" */ a->q_mailer = LocalMailer; @@ -1569,3 +2043,35 @@ setctluser(user) a->q_paddr = newstr(p); return a; } +/* +** LOSEQFILE -- save the qf as Qf and try to let someone know +** +** Parameters: +** e -- the envelope (e->e_id will be used). +** why -- reported to whomever can hear. +** +** Returns: +** none. +*/ + +void +loseqfile(e, why) + register ENVELOPE *e; + char *why; +{ + char *p; + char buf[40]; + + if (e == NULL || e->e_id == NULL) + return; + if (strlen(e->e_id) > sizeof buf - 4) + return; + strcpy(buf, queuename(e, 'q')); + p = queuename(e, 'Q'); + if (rename(buf, p) < 0) + syserr("cannot rename(%s, %s), uid=%d", buf, p, geteuid()); +#ifdef LOG + else if (LogLevel > 0) + syslog(LOG_ALERT, "Losing %s: %s", buf, why); +#endif +} diff --git a/usr.sbin/sendmail/src/readcf.c b/usr.sbin/sendmail/src/readcf.c index 4a2a820e1875f..b41c8ac0535d4 100644 --- a/usr.sbin/sendmail/src/readcf.c +++ b/usr.sbin/sendmail/src/readcf.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1983 Eric P. Allman + * Copyright (c) 1983, 1995 Eric P. Allman * Copyright (c) 1988, 1993 * The Regents of the University of California. All rights reserved. * @@ -33,14 +33,12 @@ */ #ifndef lint -static char sccsid[] = "@(#)readcf.c 8.23.1.3 (Berkeley) 3/5/95"; +static char sccsid[] = "@(#)readcf.c 8.139 (Berkeley) 11/29/95"; #endif /* not lint */ # include "sendmail.h" -# include <pwd.h> # include <grp.h> #if NAMED_BIND -# include <arpa/nameser.h> # include <resolv.h> #endif @@ -76,6 +74,7 @@ static char sccsid[] = "@(#)readcf.c 8.23.1.3 (Berkeley) 3/5/95"; ** Kmapname mapclass arguments.... ** Define keyed lookup of a given class. ** Arguments are class dependent. +** Eenvar=value Set the environment value to the given value. ** ** Parameters: ** cfname -- control file name. @@ -90,6 +89,7 @@ static char sccsid[] = "@(#)readcf.c 8.23.1.3 (Berkeley) 3/5/95"; ** Builds several internal tables. */ +void readcf(cfname, safe, e) char *cfname; bool safe; @@ -104,14 +104,18 @@ readcf(cfname, safe, e) int nfuzzy; char *file; bool optional; + int mid; char buf[MAXLINE]; register char *p; extern char **copyplist(); struct stat statb; char exbuf[MAXLINE]; char pvpbuf[MAXLINE + MAXATOM]; - extern char *munchstring(); - extern void makemapentry(); + static char *null_list[1] = { NULL }; + extern char *munchstring __P((char *, char **)); + extern void fileclass __P((int, char *, char *, bool, bool)); + extern void toomany __P((int, int)); + extern void translate_dollars __P((char *)); FileName = cfname; LineNumber = 0; @@ -137,7 +141,7 @@ readcf(cfname, safe, e) if (OpMode != MD_TEST && bitset(S_IWGRP|S_IWOTH, statb.st_mode)) { - if (OpMode == MD_DAEMON || OpMode == MD_FREEZE) + if (OpMode == MD_DAEMON || OpMode == MD_INITALIAS) fprintf(stderr, "%s: WARNING: dangerous write permissions\n", FileName); #ifdef LOG @@ -160,52 +164,8 @@ readcf(cfname, safe, e) continue; } - /* map $ into \201 for macro expansion */ - for (p = bp; *p != '\0'; p++) - { - if (*p == '#' && p > bp && ConfigLevel >= 3) - { - /* this is an on-line comment */ - register char *e; - - switch (*--p & 0377) - { - case MACROEXPAND: - /* it's from $# -- let it go through */ - p++; - break; - - case '\\': - /* it's backslash escaped */ - (void) strcpy(p, p + 1); - break; - - default: - /* delete preceeding white space */ - while (isascii(*p) && isspace(*p) && p > bp) - p--; - if ((e = strchr(++p, '\n')) != NULL) - (void) strcpy(p, e); - else - p[0] = p[1] = '\0'; - break; - } - continue; - } - - if (*p != '$') - continue; - - if (p[1] == '$') - { - /* actual dollar sign.... */ - (void) strcpy(p, p + 1); - continue; - } - - /* convert to macro expansion character */ - *p = MACROEXPAND; - } + /* do macro expansion mappings */ + translate_dollars(bp); /* interpret this line */ errno = 0; @@ -240,9 +200,9 @@ readcf(cfname, safe, e) /* expand and save the LHS */ *p = '\0'; - expand(&bp[1], exbuf, &exbuf[sizeof exbuf], e); + expand(&bp[1], exbuf, sizeof exbuf, e); rwp->r_lhs = prescan(exbuf, '\t', pvpbuf, - sizeof pvpbuf, NULL); + sizeof pvpbuf, NULL, NULL); nfuzzy = 0; if (rwp->r_lhs != NULL) { @@ -316,7 +276,10 @@ readcf(cfname, safe, e) } } else + { syserr("R line: null LHS"); + rwp->r_lhs = null_list; + } /* expand and save the RHS */ while (*++p == '\t') @@ -325,9 +288,9 @@ readcf(cfname, safe, e) while (*p != '\0' && *p != '\t') p++; *p = '\0'; - expand(q, exbuf, &exbuf[sizeof exbuf], e); + expand(q, exbuf, sizeof exbuf, e); rwp->r_rhs = prescan(exbuf, '\t', pvpbuf, - sizeof pvpbuf, NULL); + sizeof pvpbuf, NULL, NULL); if (rwp->r_rhs != NULL) { register char **ap; @@ -377,40 +340,51 @@ readcf(cfname, safe, e) } } else + { syserr("R line: null RHS"); + rwp->r_rhs = null_list; + } break; case 'S': /* select rewriting set */ - for (p = &bp[1]; isascii(*p) && isspace(*p); p++) - continue; - if (!isascii(*p) || !isdigit(*p)) - { - syserr("invalid argument to S line: \"%.20s\"", - &bp[1]); + expand(&bp[1], exbuf, sizeof exbuf, e); + ruleset = strtorwset(exbuf, NULL, ST_ENTER); + if (ruleset < 0) break; - } - ruleset = atoi(p); - if (ruleset >= MAXRWSETS || ruleset < 0) + rwp = RewriteRules[ruleset]; + if (rwp != NULL) { - syserr("bad ruleset %d (%d max)", ruleset, MAXRWSETS); - ruleset = 0; + while (rwp->r_next != NULL) + rwp = rwp->r_next; + fprintf(stderr, "WARNING: Ruleset %s redefined\n", + &bp[1]); } - rwp = NULL; break; case 'D': /* macro definition */ - p = munchstring(&bp[2], NULL); - define(bp[1], newstr(p), e); + mid = macid(&bp[1], &ep); + p = munchstring(ep, NULL); + define(mid, newstr(p), e); break; case 'H': /* required header line */ - (void) chompheader(&bp[1], TRUE, e); + (void) chompheader(&bp[1], TRUE, NULL, e); break; case 'C': /* word class */ - /* scan the list of words and set class for all */ - expand(&bp[2], exbuf, &exbuf[sizeof exbuf], e); - for (p = exbuf; *p != '\0'; ) + case 'T': /* trusted user (set class `t') */ + if (bp[0] == 'C') + { + mid = macid(&bp[1], &ep); + expand(ep, exbuf, sizeof exbuf, e); + p = exbuf; + } + else + { + mid = 't'; + p = &bp[1]; + } + while (*p != '\0') { register char *wd; char delim; @@ -423,13 +397,14 @@ readcf(cfname, safe, e) delim = *p; *p = '\0'; if (wd[0] != '\0') - setclass(bp[1], wd); + setclass(mid, wd); *p = delim; } break; case 'F': /* word class from file */ - for (p = &bp[2]; isascii(*p) && isspace(*p); ) + mid = macid(&bp[1], &ep); + for (p = ep; isascii(*p) && isspace(*p); ) p++; if (p[0] == '-' && p[1] == 'o') { @@ -437,22 +412,27 @@ readcf(cfname, safe, e) while (*p != '\0' && !(isascii(*p) && isspace(*p))) p++; while (isascii(*p) && isspace(*p)) - *p++; + p++; } else optional = FALSE; file = p; - while (*p != '\0' && !(isascii(*p) && isspace(*p))) - p++; - if (*p == '\0') + if (*file == '|') p = "%s"; else { - *p = '\0'; - while (isascii(*++p) && isspace(*p)) - continue; + while (*p != '\0' && !(isascii(*p) && isspace(*p))) + p++; + if (*p == '\0') + p = "%s"; + else + { + *p = '\0'; + while (isascii(*++p) && isspace(*p)) + continue; + } } - fileclass(bp[1], file, p, safe, optional); + fileclass(mid, file, p, safe, optional); break; #ifdef XLA @@ -475,7 +455,7 @@ readcf(cfname, safe, e) toomany('P', MAXPRIORITIES); break; } - for (p = &bp[1]; *p != '\0' && *p != '=' && *p != '\t'; p++) + for (p = &bp[1]; *p != '\0' && *p != '='; p++) continue; if (*p == '\0') goto badline; @@ -485,10 +465,6 @@ readcf(cfname, safe, e) NumPriorities++; break; - case 'T': /* trusted user(s) */ - /* this option is obsolete, but will be ignored */ - break; - case 'V': /* configuration syntax version */ for (p = &bp[1]; isascii(*p) && isspace(*p); p++) continue; @@ -499,13 +475,28 @@ readcf(cfname, safe, e) break; } ConfigLevel = strtol(p, &ep, 10); + + /* + ** Do heuristic tweaking for back compatibility. + */ + if (ConfigLevel >= 5) { /* level 5 configs have short name in $w */ p = macvalue('w', e); if (p != NULL && (p = strchr(p, '.')) != NULL) *p = '\0'; + define('w', macvalue('w', e), e); } + if (ConfigLevel >= 6) + { + ColonOkInAddr = FALSE; + } + + /* + ** Look for vendor code. + */ + if (*ep++ == '/') { /* extract vendor code */ @@ -520,7 +511,15 @@ readcf(cfname, safe, e) break; case 'K': - makemapentry(&bp[1]); + expand(&bp[1], exbuf, sizeof exbuf, e); + (void) makemapentry(exbuf); + break; + + case 'E': + p = strchr(bp, '='); + if (p != NULL) + *p++ = '\0'; + setuserenv(&bp[1], p); break; default: @@ -532,24 +531,133 @@ readcf(cfname, safe, e) } if (ferror(cf)) { - syserr("I/O read error", cfname); + syserr("I/O read error"); exit(EX_OSFILE); } fclose(cf); FileName = NULL; - if (stab("host", ST_MAP, ST_FIND) == NULL) + /* initialize host maps from local service tables */ + inithostmaps(); + + /* determine if we need to do special name-server frotz */ { - /* user didn't initialize: set up host map */ - strcpy(buf, "host host"); -#if NAMED_BIND - if (ConfigLevel >= 2) - strcat(buf, " -a."); + int nmaps; + char *maptype[MAXMAPSTACK]; + short mapreturn[MAXMAPACTIONS]; + + nmaps = switch_map_find("hosts", maptype, mapreturn); + UseNameServer = FALSE; + if (nmaps > 0 && nmaps <= MAXMAPSTACK) + { + register int mapno; + + for (mapno = 0; mapno < nmaps && !UseNameServer; mapno++) + { + if (strcmp(maptype[mapno], "dns") == 0) + UseNameServer = TRUE; + } + } + +#ifdef HESIOD + nmaps = switch_map_find("passwd", maptype, mapreturn); + UseHesiod = FALSE; + if (nmaps > 0 && nmaps <= MAXMAPSTACK) + { + register int mapno; + + for (mapno = 0; mapno < nmaps && !UseHesiod; mapno++) + { + if (strcmp(maptype[mapno], "hesiod") == 0) + UseHesiod = TRUE; + } + } #endif - makemapentry(buf); } } /* +** TRANSLATE_DOLLARS -- convert $x into internal form +** +** Actually does all appropriate pre-processing of a config line +** to turn it into internal form. +** +** Parameters: +** bp -- the buffer to translate. +** +** Returns: +** None. The buffer is translated in place. Since the +** translations always make the buffer shorter, this is +** safe without a size parameter. +*/ + +void +translate_dollars(bp) + char *bp; +{ + register char *p; + auto char *ep; + + for (p = bp; *p != '\0'; p++) + { + if (*p == '#' && p > bp && ConfigLevel >= 3) + { + /* this is an on-line comment */ + register char *e; + + switch (*--p & 0377) + { + case MACROEXPAND: + /* it's from $# -- let it go through */ + p++; + break; + + case '\\': + /* it's backslash escaped */ + (void) strcpy(p, p + 1); + break; + + default: + /* delete preceeding white space */ + while (isascii(*p) && isspace(*p) && + *p != '\n' && p > bp) + p--; + if ((e = strchr(++p, '\n')) != NULL) + (void) strcpy(p, e); + else + *p-- = '\0'; + break; + } + continue; + } + + if (*p != '$' || p[1] == '\0') + continue; + + if (p[1] == '$') + { + /* actual dollar sign.... */ + (void) strcpy(p, p + 1); + continue; + } + + /* convert to macro expansion character */ + *p++ = MACROEXPAND; + + /* special handling for $=, $~, $&, and $? */ + if (*p == '=' || *p == '~' || *p == '&' || *p == '?') + p++; + + /* convert macro name to code */ + *p = macid(p, &ep); + if (ep != p) + strcpy(p + 1, ep); + } + + /* strip trailing white space from the line */ + while (--p > bp && isascii(*p) && isspace(*p)) + *p = '\0'; +} +/* ** TOOMANY -- signal too many of some option ** ** Parameters: @@ -563,8 +671,9 @@ readcf(cfname, safe, e) ** gives a syserr. */ +void toomany(id, maxcnt) - char id; + int id; int maxcnt; { syserr("too many %c lines, %d max", id, maxcnt); @@ -589,6 +698,7 @@ toomany(id, maxcnt) ** the named class. */ +void fileclass(class, filename, fmt, safe, optional) int class; char *filename; @@ -597,7 +707,9 @@ fileclass(class, filename, fmt, safe, optional) bool optional; { FILE *f; - struct stat stbuf; + int sff; + int pid; + register char *p; char buf[MAXLINE]; if (tTd(37, 2)) @@ -605,42 +717,49 @@ fileclass(class, filename, fmt, safe, optional) if (filename[0] == '|') { - syserr("fileclass: pipes (F%c%s) not supported due to security problems", - class, filename); - return; - } - if (stat(filename, &stbuf) < 0) - { - if (tTd(37, 2)) - printf(" cannot stat (%s)\n", errstring(errno)); - if (!optional) - syserr("fileclass: cannot stat %s", filename); - return; - } - if (!S_ISREG(stbuf.st_mode)) - { - syserr("fileclass: %s not a regular file", filename); - return; + auto int fd; + int i; + char *argv[MAXPV + 1]; + + i = 0; + for (p = strtok(&filename[1], " \t"); p != NULL; p = strtok(NULL, " \t")) + { + if (i >= MAXPV) + break; + argv[i++] = p; + } + argv[i] = NULL; + pid = prog_open(argv, &fd, CurEnv); + if (pid < 0) + f = NULL; + else + f = fdopen(fd, "r"); } - if (!safe && access(filename, R_OK) < 0) + else { - syserr("fileclass: access denied on %s", filename); - return; + pid = -1; + sff = SFF_REGONLY; + if (safe) + sff |= SFF_OPENASROOT; + f = safefopen(filename, O_RDONLY, 0, sff); } - f = fopen(filename, "r"); if (f == NULL) { - syserr("fileclass: cannot open %s", filename); + if (!optional) + syserr("fileclass: cannot open %s", filename); return; } while (fgets(buf, sizeof buf, f) != NULL) { - register STAB *s; register char *p; -# ifdef SCANF +# if SCANF char wordbuf[MAXNAME+1]; +# endif + if (buf[0] == '#') + continue; +# if SCANF if (sscanf(buf, fmt, wordbuf) != 1) continue; p = wordbuf; @@ -675,6 +794,8 @@ fileclass(class, filename, fmt, safe, optional) } (void) fclose(f); + if (pid > 0) + (void) waitfor(pid); } /* ** MAKEMAILER -- define a new mailer. @@ -682,12 +803,19 @@ fileclass(class, filename, fmt, safe, optional) ** Parameters: ** line -- description of mailer. This is in labeled ** fields. The fields are: -** P -- the path to the mailer -** F -- the flags associated with the mailer ** A -- the argv for this mailer -** S -- the sender rewriting set -** R -- the recipient rewriting set +** C -- the character set for MIME conversions +** D -- the directory to run in ** E -- the eol string +** F -- the flags associated with the mailer +** L -- the maximum line length +** M -- the maximum message size +** N -- the niceness at which to run +** P -- the path to the mailer +** R -- the recipient rewriting set +** S -- the sender rewriting set +** T -- the mailer type (for DSNs) +** U -- the uid to run as ** The first word is the canonical name of the mailer. ** ** Returns: @@ -697,6 +825,7 @@ fileclass(class, filename, fmt, safe, optional) ** enters the mailer into the mailer table. */ +void makemailer(line) char *line; { @@ -709,18 +838,20 @@ makemailer(line) extern int NextMailer; extern char **makeargv(); extern char *munchstring(); - extern long atol(); /* allocate a mailer and set up defaults */ m = (struct mailer *) xalloc(sizeof *m); bzero((char *) m, sizeof *m); m->m_eol = "\n"; + m->m_uid = m->m_gid = 0; /* collect the mailer name */ for (p = line; *p != '\0' && *p != ',' && !(isascii(*p) && isspace(*p)); p++) continue; if (*p != '\0') *p++ = '\0'; + if (line[0] == '\0') + syserr("name required for mailer"); m->m_name = newstr(line); /* now scan through and assign info from the fields */ @@ -750,6 +881,8 @@ makemailer(line) switch (fcode) { case 'P': /* pathname */ + if (*p == '\0') + syserr("mailer %s: empty path name", m->m_name); m->m_mailer = newstr(p); break; @@ -761,12 +894,9 @@ makemailer(line) case 'S': /* sender rewriting ruleset */ case 'R': /* recipient rewriting ruleset */ - i = strtol(p, &endp, 10); - if (i < 0 || i >= MAXRWSETS) - { - syserr("invalid rewrite set, %d max", MAXRWSETS); + i = strtorwset(p, &endp, ST_ENTER); + if (i < 0) return; - } if (fcode == 'S') m->m_sh_rwset = m->m_se_rwset = i; else @@ -775,13 +905,9 @@ makemailer(line) p = endp; if (*p++ == '/') { - i = strtol(p, NULL, 10); - if (i < 0 || i >= MAXRWSETS) - { - syserr("invalid rewrite set, %d max", - MAXRWSETS); + i = strtorwset(p, NULL, ST_ENTER); + if (i < 0) return; - } if (fcode == 'S') m->m_sh_rwset = i; else @@ -790,10 +916,16 @@ makemailer(line) break; case 'E': /* end of line string */ + if (*p == '\0') + syserr("mailer %s: null end-of-line string", + m->m_name); m->m_eol = newstr(p); break; case 'A': /* argument vector */ + if (*p == '\0') + syserr("mailer %s: null argument vector", + m->m_name); m->m_argv = makeargv(p); break; @@ -803,25 +935,122 @@ makemailer(line) case 'L': /* maximum line length */ m->m_linelimit = atoi(p); + if (m->m_linelimit < 0) + m->m_linelimit = 0; + break; + + case 'N': /* run niceness */ + m->m_nice = atoi(p); break; case 'D': /* working directory */ + if (*p == '\0') + syserr("mailer %s: null working directory", + m->m_name); m->m_execdir = newstr(p); break; + + case 'C': /* default charset */ + if (*p == '\0') + syserr("mailer %s: null charset", m->m_name); + m->m_defcharset = newstr(p); + break; + + case 'T': /* MTA-Name/Address/Diagnostic types */ + /* extract MTA name type; default to "dns" */ + m->m_mtatype = newstr(p); + p = strchr(m->m_mtatype, '/'); + if (p != NULL) + { + *p++ = '\0'; + if (*p == '\0') + p = NULL; + } + if (*m->m_mtatype == '\0') + m->m_mtatype = "dns"; + + /* extract address type; default to "rfc822" */ + m->m_addrtype = p; + if (p != NULL) + p = strchr(p, '/'); + if (p != NULL) + { + *p++ = '\0'; + if (*p == '\0') + p = NULL; + } + if (m->m_addrtype == NULL || *m->m_addrtype == '\0') + m->m_addrtype = "rfc822"; + + /* extract diagnostic type; default to "smtp" */ + m->m_diagtype = p; + if (m->m_diagtype == NULL || *m->m_diagtype == '\0') + m->m_diagtype = "smtp"; + break; + + case 'U': /* user id */ + if (isascii(*p) && !isdigit(*p)) + { + char *q = p; + struct passwd *pw; + + while (*p != '\0' && isascii(*p) && + (isalnum(*p) || strchr("-_", *p) != NULL)) + p++; + while (isascii(*p) && isspace(*p)) + *p++ = '\0'; + if (*p != '\0') + *p++ = '\0'; + if (*q == '\0') + syserr("mailer %s: null user name", + m->m_name); + pw = sm_getpwnam(q); + if (pw == NULL) + syserr("readcf: mailer U= flag: unknown user %s", q); + else + { + m->m_uid = pw->pw_uid; + m->m_gid = pw->pw_gid; + } + } + else + { + auto char *q; + + m->m_uid = strtol(p, &q, 0); + p = q; + } + while (isascii(*p) && isspace(*p)) + p++; + if (*p == '\0') + break; + if (isascii(*p) && !isdigit(*p)) + { + char *q = p; + struct group *gr; + + while (isascii(*p) && isalnum(*p)) + p++; + *p++ = '\0'; + if (*q == '\0') + syserr("mailer %s: null group name", + m->m_name); + gr = getgrnam(q); + if (gr == NULL) + syserr("readcf: mailer U= flag: unknown group %s", q); + else + m->m_gid = gr->gr_gid; + } + else + { + m->m_gid = strtol(p, NULL, 0); + } + break; } p = delimptr; } - /* do some heuristic cleanup for back compatibility */ - if (bitnset(M_LIMITS, m->m_flags)) - { - if (m->m_linelimit == 0) - m->m_linelimit = SMTPLINELIM; - if (ConfigLevel < 2) - setbitn(M_7BITS, m->m_flags); - } - /* do some rationality checking */ if (m->m_argv == NULL) { @@ -840,6 +1069,27 @@ makemailer(line) return; } + /* do some heuristic cleanup for back compatibility */ + if (bitnset(M_LIMITS, m->m_flags)) + { + if (m->m_linelimit == 0) + m->m_linelimit = SMTPLINELIM; + if (ConfigLevel < 2) + setbitn(M_7BITS, m->m_flags); + } + + if (strcmp(m->m_mailer, "[IPC]") == 0 || + strcmp(m->m_mailer, "[TCP]") == 0) + { + if (m->m_mtatype == NULL) + m->m_mtatype = "dns"; + if (m->m_addrtype == NULL) + m->m_addrtype = "rfc822"; + if (m->m_diagtype == NULL) + m->m_diagtype = "smtp"; + } + + /* enter the mailer into the symbol table */ s = stab(m->m_name, ST_MAILER, ST_ENTER); if (s->s_mailer != NULL) { @@ -875,7 +1125,7 @@ munchstring(p, delimptr) bool quotemode = FALSE; static char buf[MAXLINE]; - for (q = buf; *p != '\0'; p++) + for (q = buf; *p != '\0' && q < &buf[sizeof buf - 1]; p++) { if (backslash) { @@ -973,6 +1223,7 @@ makeargv(p) ** prints rewrite rules. */ +void printrules() { register struct rewrite *rwp; @@ -993,7 +1244,52 @@ printrules() } } } +/* +** PRINTMAILER -- print mailer structure (for debugging) +** +** Parameters: +** m -- the mailer to print +** +** Returns: +** none. +*/ + +void +printmailer(m) + register MAILER *m; +{ + int j; + + printf("mailer %d (%s): P=%s S=%d/%d R=%d/%d M=%ld U=%d:%d F=", + m->m_mno, m->m_name, + m->m_mailer, m->m_se_rwset, m->m_sh_rwset, + m->m_re_rwset, m->m_rh_rwset, m->m_maxsize, + m->m_uid, m->m_gid); + for (j = '\0'; j <= '\177'; j++) + if (bitnset(j, m->m_flags)) + (void) putchar(j); + printf(" L=%d E=", m->m_linelimit); + xputs(m->m_eol); + if (m->m_defcharset != NULL) + printf(" C=%s", m->m_defcharset); + printf(" T=%s/%s/%s", + m->m_mtatype == NULL ? "<undefined>" : m->m_mtatype, + m->m_addrtype == NULL ? "<undefined>" : m->m_addrtype, + m->m_diagtype == NULL ? "<undefined>" : m->m_diagtype); + if (m->m_argv != NULL) + { + char **a = m->m_argv; + printf(" A="); + while (*a != NULL) + { + if (a != m->m_argv) + printf(" "); + xputs(*a++); + } + } + printf("\n"); +} /* ** SETOPTION -- set global processing option ** @@ -1015,6 +1311,7 @@ printrules() */ static BITMAP StickyOpt; /* set if option is stuck */ +extern void settimeout __P((char *, char *)); #if NAMED_BIND @@ -1040,23 +1337,222 @@ struct resolverflags #endif +struct optioninfo +{ + char *o_name; /* long name of option */ + u_char o_code; /* short name of option */ + bool o_safe; /* safe for random people to use */ +} OptionTab[] = +{ + "SevenBitInput", '7', TRUE, +#if MIME8TO7 + "EightBitMode", '8', TRUE, +#endif + "AliasFile", 'A', FALSE, + "AliasWait", 'a', FALSE, + "BlankSub", 'B', FALSE, + "MinFreeBlocks", 'b', TRUE, + "CheckpointInterval", 'C', TRUE, + "HoldExpensive", 'c', FALSE, + "AutoRebuildAliases", 'D', FALSE, + "DeliveryMode", 'd', TRUE, + "ErrorHeader", 'E', FALSE, + "ErrorMode", 'e', TRUE, + "TempFileMode", 'F', FALSE, + "SaveFromLine", 'f', FALSE, + "MatchGECOS", 'G', FALSE, + "HelpFile", 'H', FALSE, + "MaxHopCount", 'h', FALSE, + "ResolverOptions", 'I', FALSE, + "IgnoreDots", 'i', TRUE, + "ForwardPath", 'J', FALSE, + "SendMimeErrors", 'j', TRUE, + "ConnectionCacheSize", 'k', FALSE, + "ConnectionCacheTimeout", 'K', FALSE, + "UseErrorsTo", 'l', FALSE, + "LogLevel", 'L', FALSE, + "MeToo", 'm', TRUE, + "CheckAliases", 'n', FALSE, + "OldStyleHeaders", 'o', TRUE, + "DaemonPortOptions", 'O', FALSE, + "PrivacyOptions", 'p', TRUE, + "PostmasterCopy", 'P', FALSE, + "QueueFactor", 'q', FALSE, + "QueueDirectory", 'Q', FALSE, + "DontPruneRoutes", 'R', FALSE, + "Timeout", 'r', TRUE, + "StatusFile", 'S', FALSE, + "SuperSafe", 's', TRUE, + "QueueTimeout", 'T', FALSE, + "TimeZoneSpec", 't', FALSE, + "UserDatabaseSpec", 'U', FALSE, + "DefaultUser", 'u', FALSE, + "FallbackMXhost", 'V', FALSE, + "Verbose", 'v', TRUE, + "TryNullMXList", 'w', TRUE, + "QueueLA", 'x', FALSE, + "RefuseLA", 'X', FALSE, + "RecipientFactor", 'y', FALSE, + "ForkEachJob", 'Y', FALSE, + "ClassFactor", 'z', FALSE, + "RetryFactor", 'Z', FALSE, +#define O_QUEUESORTORD 0x81 + "QueueSortOrder", O_QUEUESORTORD, TRUE, +#define O_HOSTSFILE 0x82 + "HostsFile", O_HOSTSFILE, FALSE, +#define O_MQA 0x83 + "MinQueueAge", O_MQA, TRUE, +#define O_MHSA 0x84 +/* + "MaxHostStatAge", O_MHSA, TRUE, +*/ +#define O_DEFCHARSET 0x85 + "DefaultCharSet", O_DEFCHARSET, TRUE, +#define O_SSFILE 0x86 + "ServiceSwitchFile", O_SSFILE, FALSE, +#define O_DIALDELAY 0x87 + "DialDelay", O_DIALDELAY, TRUE, +#define O_NORCPTACTION 0x88 + "NoRecipientAction", O_NORCPTACTION, TRUE, +#define O_SAFEFILEENV 0x89 + "SafeFileEnvironment", O_SAFEFILEENV, FALSE, +#define O_MAXMSGSIZE 0x8a + "MaxMessageSize", O_MAXMSGSIZE, FALSE, +#define O_COLONOKINADDR 0x8b + "ColonOkInAddr", O_COLONOKINADDR, TRUE, +#define O_MAXQUEUERUN 0x8c + "MaxQueueRunSize", O_MAXQUEUERUN, TRUE, +#define O_MAXCHILDREN 0x8d +/* + "MaxDaemonChildren", O_MAXCHILDREN, FALSE, +*/ +#define O_KEEPCNAMES 0x8e + "DontExpandCnames", O_KEEPCNAMES, FALSE, +#define O_MUSTQUOTE 0x8f +/* + "MustQuoteChars", O_MUSTQUOTE, FALSE, +*/ +#define O_SMTPGREETING 0x90 + "SmtpGreetingMessage", O_SMTPGREETING, FALSE, +#define O_UNIXFROM 0x91 + "UnixFromLine", O_UNIXFROM, FALSE, +#define O_OPCHARS 0x92 + "OperatorChars", O_OPCHARS, FALSE, +#define O_DONTINITGRPS 0x93 + "DontInitGroups", O_DONTINITGRPS, TRUE, +#define O_SLFH 0x94 +#ifdef LOTUS_NOTES_HACK + "SingleLineFromHeader", O_SLFH, TRUE, +#endif + + NULL, '\0', FALSE, +}; + + + +void setoption(opt, val, safe, sticky, e) - char opt; + int opt; char *val; bool safe; bool sticky; register ENVELOPE *e; { register char *p; + register struct optioninfo *o; + char *subopt; + char buf[50]; extern bool atobool(); extern time_t convtime(); extern int QueueLA; extern int RefuseLA; extern bool Warn_Q_option; - extern bool trusteduser(); + + errno = 0; + if (opt == ' ') + { + /* full word options */ + struct optioninfo *sel; + + p = strchr(val, '='); + if (p == NULL) + p = &val[strlen(val)]; + while (*--p == ' ') + continue; + while (*++p == ' ') + *p = '\0'; + if (p == val) + { + syserr("readcf: null option name"); + return; + } + if (*p == '=') + *p++ = '\0'; + while (*p == ' ') + p++; + subopt = strchr(val, '.'); + if (subopt != NULL) + *subopt++ = '\0'; + sel = NULL; + for (o = OptionTab; o->o_name != NULL; o++) + { + if (strncasecmp(o->o_name, val, strlen(val)) != 0) + continue; + if (strlen(o->o_name) == strlen(val)) + { + /* completely specified -- this must be it */ + sel = NULL; + break; + } + if (sel != NULL) + break; + sel = o; + } + if (sel != NULL && o->o_name == NULL) + o = sel; + else if (o->o_name == NULL) + { + syserr("readcf: unknown option name %s", val); + return; + } + else if (sel != NULL) + { + syserr("readcf: ambiguous option name %s (matches %s and %s)", + val, sel->o_name, o->o_name); + return; + } + if (strlen(val) != strlen(o->o_name)) + { + bool oldVerbose = Verbose; + + Verbose = TRUE; + message("Option %s used as abbreviation for %s", + val, o->o_name); + Verbose = oldVerbose; + } + opt = o->o_code; + val = p; + } + else + { + for (o = OptionTab; o->o_name != NULL; o++) + { + if (o->o_code == opt) + break; + } + subopt = NULL; + } if (tTd(37, 1)) - printf("setoption %c=%s", opt, val); + { + printf(isascii(opt) && isprint(opt) ? + "setoption %s (%c).%s=" : + "setoption %s (0x%x).%s=", + o->o_name == NULL ? "<unknown>" : o->o_name, + opt, + subopt == NULL ? "" : subopt); + xputs(val); + } /* ** See if this option is preset for us. @@ -1075,7 +1571,7 @@ setoption(opt, val, safe, sticky, e) if (!safe && RealUid == 0) safe = TRUE; - if (!safe && strchr("bCdeijLmoprsvw7", opt) == NULL) + if (!safe && !o->o_safe) { if (opt != 'M' || (val[0] != 'r' && val[0] != 's')) { @@ -1085,6 +1581,7 @@ setoption(opt, val, safe, sticky, e) { if (tTd(37, 1)) printf("(Resetting uid)"); + endpwent(); (void) setgid(RealGid); (void) setuid(RealUid); } @@ -1093,12 +1590,53 @@ setoption(opt, val, safe, sticky, e) if (tTd(37, 1)) printf("\n"); - switch (opt) + switch (opt & 0xff) { case '7': /* force seven-bit input */ - SevenBit = atobool(val); + SevenBitInput = atobool(val); break; +#if MIME8TO7 + case '8': /* handling of 8-bit input */ + switch (*val) + { + case 'm': /* convert 8-bit, convert MIME */ + MimeMode = MM_CVTMIME|MM_MIME8BIT; + break; + + case 'p': /* pass 8 bit, convert MIME */ + MimeMode = MM_CVTMIME|MM_PASS8BIT; + break; + + case 's': /* strict adherence */ + MimeMode = MM_CVTMIME; + break; + +#if 0 + case 'r': /* reject 8-bit, don't convert MIME */ + MimeMode = 0; + break; + + case 'j': /* "just send 8" */ + MimeMode = MM_PASS8BIT; + break; + + case 'a': /* encode 8 bit if available */ + MimeMode = MM_MIME8BIT|MM_PASS8BIT|MM_CVTMIME; + break; + + case 'c': /* convert 8 bit to MIME, never 7 bit */ + MimeMode = MM_MIME8BIT; + break; +#endif + + default: + syserr("Unknown 8-bit mode %c", *val); + exit(EX_USAGE); + } + break; +#endif + case 'A': /* set default alias file */ if (val[0] == '\0') setalias("aliases"); @@ -1145,8 +1683,9 @@ setoption(opt, val, safe, sticky, e) break; case SM_QUEUE: /* queue only */ + case SM_DEFER: /* queue only and defer map lookups */ #ifndef QUEUE - syserr("need QUEUE to set -odqueue"); + syserr("need QUEUE to set -odqueue or -oddefer"); #endif /* QUEUE */ /* fall through..... */ @@ -1177,9 +1716,6 @@ setoption(opt, val, safe, sticky, e) case EM_MAIL: /* mail back */ case EM_BERKNET: /* do berknet error processing */ case EM_WRITE: /* write back (or mail) */ - HoldErrs = TRUE; - /* fall through... */ - case EM_PRINT: /* print errors normally (default) */ e->e_errormode = *val; break; @@ -1199,6 +1735,7 @@ setoption(opt, val, safe, sticky, e) break; case 'g': /* default gid */ + g_opt: if (isascii(*val) && isdigit(*val)) DefGid = atoi(val); else @@ -1208,7 +1745,8 @@ setoption(opt, val, safe, sticky, e) DefGid = -1; gr = getgrnam(val); if (gr == NULL) - syserr("readcf: option g: unknown group %s", val); + syserr("readcf: option %c: unknown group %s", + opt, val); else DefGid = gr->gr_gid; } @@ -1227,7 +1765,6 @@ setoption(opt, val, safe, sticky, e) case 'I': /* use internet domain name server */ #if NAMED_BIND - UseNameServer = TRUE; for (p = val; *p != 0; ) { bool clearmode; @@ -1249,6 +1786,11 @@ setoption(opt, val, safe, sticky, e) p++; if (*p != '\0') *p++ = '\0'; + if (strcasecmp(q, "HasWildcardMX") == 0) + { + HasWildcardMX = !clearmode; + continue; + } for (rfp = ResolverFlags; rfp->rf_name != NULL; rfp++) { if (strcasecmp(q, rfp->rf_name) == 0) @@ -1262,7 +1804,8 @@ setoption(opt, val, safe, sticky, e) _res.options |= rfp->rf_bits; } if (tTd(8, 2)) - printf("_res.options = %x\n", _res.options); + printf("_res.options = %x, HasWildcardMX = %d\n", + _res.options, HasWildcardMX); #else usrerr("name server (I option) specified but BIND not compiled in"); #endif @@ -1318,7 +1861,11 @@ setoption(opt, val, safe, sticky, e) /* 'N' available -- was "net name" */ case 'O': /* daemon options */ +#ifdef DAEMON setdaemonoptions(val); +#else + syserr("DaemonPortOptions (O option) set but DAEMON not compiled in"); +#endif break; case 'o': /* assume old style headers */ @@ -1379,7 +1926,10 @@ setoption(opt, val, safe, sticky, e) break; case 'r': /* read timeout */ - settimeouts(val); + if (subopt == NULL) + inittimeouts(val); + else + settimeout(subopt, val); break; case 'S': /* status file */ @@ -1398,9 +1948,9 @@ setoption(opt, val, safe, sticky, e) if (p != NULL) { *p++ = '\0'; - TimeOuts.to_q_warning = convtime(p, 'd'); + settimeout("queuewarn", p); } - TimeOuts.to_q_return = convtime(val, 'h'); + settimeout("queuereturn", val); break; case 't': /* time zone name */ @@ -1412,6 +1962,14 @@ setoption(opt, val, safe, sticky, e) break; case 'u': /* set default uid */ + for (p = val; *p != '\0'; p++) + { + if (*p == '.' || *p == '/' || *p == ':') + { + *p++ = '\0'; + break; + } + } if (isascii(*val) && isdigit(*val)) DefUid = atoi(val); else @@ -1419,14 +1977,22 @@ setoption(opt, val, safe, sticky, e) register struct passwd *pw; DefUid = -1; - pw = getpwnam(val); + pw = sm_getpwnam(val); if (pw == NULL) syserr("readcf: option u: unknown user %s", val); else + { DefUid = pw->pw_uid; + DefGid = pw->pw_gid; + } } setdefuser(); - break; + + /* handle the group if it is there */ + if (*p == '\0') + break; + val = p; + goto g_opt; case 'V': /* fallback MX host */ FallBackMX = newstr(val); @@ -1466,19 +2032,133 @@ setoption(opt, val, safe, sticky, e) WkTimeFact = atoi(val); break; + case O_QUEUESORTORD: /* queue sorting order */ + switch (*val) + { + case 'h': /* Host first */ + case 'H': + QueueSortOrder = QS_BYHOST; + break; + + case 'p': /* Priority order */ + case 'P': + QueueSortOrder = QS_BYPRIORITY; + break; + + default: + syserr("Invalid queue sort order \"%s\"", val); + } + break; + + case O_HOSTSFILE: /* pathname of /etc/hosts file */ + HostsFile = newstr(val); + break; + + case O_MQA: /* minimum queue age between deliveries */ + MinQueueAge = convtime(val, 'm'); + break; + + case O_MHSA: /* maximum age of cached host status */ + MaxHostStatAge = convtime(val, 'm'); + break; + + case O_DEFCHARSET: /* default character set for mimefying */ + DefaultCharSet = newstr(denlstring(val, TRUE, TRUE)); + break; + + case O_SSFILE: /* service switch file */ + ServiceSwitchFile = newstr(val); + break; + + case O_DIALDELAY: /* delay for dial-on-demand operation */ + DialDelay = convtime(val, 's'); + break; + + case O_NORCPTACTION: /* what to do if no recipient */ + if (strcasecmp(val, "none") == 0) + NoRecipientAction = NRA_NO_ACTION; + else if (strcasecmp(val, "add-to") == 0) + NoRecipientAction = NRA_ADD_TO; + else if (strcasecmp(val, "add-apparently-to") == 0) + NoRecipientAction = NRA_ADD_APPARENTLY_TO; + else if (strcasecmp(val, "add-bcc") == 0) + NoRecipientAction = NRA_ADD_BCC; + else if (strcasecmp(val, "add-to-undisclosed") == 0) + NoRecipientAction = NRA_ADD_TO_UNDISCLOSED; + else + syserr("Invalid NoRecipientAction: %s", val); + break; + + case O_SAFEFILEENV: /* chroot() environ for writing to files */ + SafeFileEnv = newstr(val); + break; + + case O_MAXMSGSIZE: /* maximum message size */ + MaxMessageSize = atol(val); + break; + + case O_COLONOKINADDR: /* old style handling of colon addresses */ + ColonOkInAddr = atobool(val); + break; + + case O_MAXQUEUERUN: /* max # of jobs in a single queue run */ + MaxQueueRun = atol(val); + break; + + case O_MAXCHILDREN: /* max # of children of daemon */ + MaxChildren = atoi(val); + break; + + case O_KEEPCNAMES: /* don't expand CNAME records */ + DontExpandCnames = atobool(val); + break; + + case O_MUSTQUOTE: /* must quote these characters in phrases */ + strcpy(buf, "@,;:\\()[]"); + if (strlen(val) < sizeof buf - 10) + strcat(buf, val); + MustQuoteChars = newstr(buf); + break; + + case O_SMTPGREETING: /* SMTP greeting message (old $e macro) */ + SmtpGreeting = newstr(munchstring(val, NULL)); + break; + + case O_UNIXFROM: /* UNIX From_ line (old $l macro) */ + UnixFromLine = newstr(munchstring(val, NULL)); + break; + + case O_OPCHARS: /* operator characters (old $o macro) */ + OperatorChars = newstr(munchstring(val, NULL)); + break; + + case O_DONTINITGRPS: /* don't call initgroups(3) */ + DontInitGroups = atobool(val); + break; + + case O_SLFH: /* make sure from fits on one line */ + SingleLineFromHeader = atobool(val); + break; + default: + if (tTd(37, 1)) + { + if (isascii(opt) && isprint(opt)) + printf("Warning: option %c unknown\n", opt); + else + printf("Warning: option 0x%x unknown\n", opt); + } break; } if (sticky) setbitn(opt, StickyOpt); - return; } /* -** SETCLASS -- set a word into a class +** SETCLASS -- set a string into a class ** ** Parameters: -** class -- the class to put the word in. -** word -- the word to enter +** class -- the class to put the string in. +** str -- the string to enter ** ** Returns: ** none. @@ -1487,15 +2167,16 @@ setoption(opt, val, safe, sticky, e) ** puts the word into the symbol table. */ -setclass(class, word) +void +setclass(class, str) int class; - char *word; + char *str; { register STAB *s; if (tTd(37, 8)) - printf("setclass(%c, %s)\n", class, word); - s = stab(word, ST_CLASS, ST_ENTER); + printf("setclass(%s, %s)\n", macname(class), str); + s = stab(str, ST_CLASS, ST_ENTER); setbitn(class, s->s_class); } /* @@ -1505,14 +2186,14 @@ setclass(class, word) ** line -- the config file line ** ** Returns: -** TRUE if it successfully entered the map entry. -** FALSE otherwise (usually syntax error). +** A pointer to the map that has been created. +** NULL if there was a syntax error. ** ** Side Effects: ** Enters the map into the dictionary. */ -void +MAP * makemapentry(line) char *line; { @@ -1527,11 +2208,11 @@ makemapentry(line) if (!(isascii(*p) && isalnum(*p))) { syserr("readcf: config K line: no map name"); - return; + return NULL; } mapname = p; - while (isascii(*++p) && isalnum(*p)) + while ((isascii(*++p) && isalnum(*p)) || *p == '_' || *p == '.') continue; if (*p != '\0') *p++ = '\0'; @@ -1540,7 +2221,7 @@ makemapentry(line) if (!(isascii(*p) && isalnum(*p))) { syserr("readcf: config K line, map %s: no map class", mapname); - return; + return NULL; } classname = p; while (isascii(*++p) && isalnum(*p)) @@ -1555,7 +2236,7 @@ makemapentry(line) if (class == NULL) { syserr("readcf: map %s: class %s not available", mapname, classname); - return; + return NULL; } /* enter the map */ @@ -1577,9 +2258,128 @@ makemapentry(line) s->s_map.map_domain == NULL ? "(null)" : s->s_map.map_domain, s->s_map.map_rebuild == NULL ? "(null)" : s->s_map.map_rebuild); } + + return &s->s_map; } /* -** SETTIMEOUTS -- parse and set timeout values +** STRTORWSET -- convert string to rewriting set number +** +** Parameters: +** p -- the pointer to the string to decode. +** endp -- if set, store the trailing delimiter here. +** stabmode -- ST_ENTER to create this entry, ST_FIND if +** it must already exist. +** +** Returns: +** The appropriate ruleset number. +** -1 if it is not valid (error already printed) +*/ + +int +strtorwset(p, endp, stabmode) + char *p; + char **endp; + int stabmode; +{ + int ruleset; + static int nextruleset = MAXRWSETS; + + while (isascii(*p) && isspace(*p)) + p++; + if (!isascii(*p)) + { + syserr("invalid ruleset name: \"%.20s\"", p); + return -1; + } + if (isdigit(*p)) + { + ruleset = strtol(p, endp, 10); + if (ruleset >= MAXRWSETS / 2 || ruleset < 0) + { + syserr("bad ruleset %d (%d max)", + ruleset, MAXRWSETS / 2); + ruleset = -1; + } + } + else + { + STAB *s; + char delim; + char *q; + + q = p; + while (*p != '\0' && isascii(*p) && + (isalnum(*p) || *p == '_')) + p++; + if (q == p || !isalpha(*q)) + { + /* no valid characters */ + syserr("invalid ruleset name: \"%.20s\"", q); + return -1; + } + while (isascii(*p) && isspace(*p)) + *p++ = '\0'; + delim = *p; + if (delim != '\0') + *p = '\0'; + s = stab(q, ST_RULESET, stabmode); + if (delim != '\0') + *p = delim; + + if (s == NULL) + { + syserr("unknown ruleset %s", q); + return -1; + } + + if (stabmode == ST_ENTER && delim == '=') + { + while (isascii(*++p) && isspace(*p)) + continue; + if (!isdigit(*p)) + { + syserr("bad ruleset definition \"%s\" (number required after `=')", q); + ruleset = -1; + } + else + { + ruleset = strtol(p, endp, 10); + if (ruleset >= MAXRWSETS / 2 || ruleset < 0) + { + syserr("bad ruleset number %d in \"%s\" (%d max)", + ruleset, q, MAXRWSETS / 2); + ruleset = -1; + } + } + } + else + { + if (endp != NULL) + *endp = p; + if (s->s_ruleset > 0) + ruleset = s->s_ruleset; + else if ((ruleset = --nextruleset) < MAXRWSETS / 2) + { + syserr("%s: too many named rulesets (%d max)", + q, MAXRWSETS / 2); + ruleset = -1; + } + } + if (s->s_ruleset > 0 && ruleset >= 0 && ruleset != s->s_ruleset) + { + syserr("%s: ruleset changed value (old %d, new %d)", + q, ruleset, s->s_ruleset); + ruleset = s->s_ruleset; + } + else if (ruleset > 0) + { + s->s_ruleset = ruleset; + } + } + return ruleset; +} +/* +** INITTIMEOUTS -- parse and set timeout values ** ** Parameters: ** val -- a pointer to the values. If NULL, do initial @@ -1596,7 +2396,8 @@ makemapentry(line) #define MINUTES * 60 #define HOUR * 3600 -settimeouts(val) +void +inittimeouts(val) register char *val; { register char *p; @@ -1604,6 +2405,7 @@ settimeouts(val) if (val == NULL) { + TimeOuts.to_connect = (time_t) 0 SECONDS; TimeOuts.to_initial = (time_t) 5 MINUTES; TimeOuts.to_helo = (time_t) 5 MINUTES; TimeOuts.to_mail = (time_t) 10 MINUTES; @@ -1615,7 +2417,12 @@ settimeouts(val) TimeOuts.to_quit = (time_t) 2 MINUTES; TimeOuts.to_nextcommand = (time_t) 1 HOUR; TimeOuts.to_miscshort = (time_t) 2 MINUTES; +#if IDENTPROTO TimeOuts.to_ident = (time_t) 30 SECONDS; +#else + TimeOuts.to_ident = (time_t) 0 SECONDS; +#endif + TimeOuts.to_fileopen = (time_t) 60 SECONDS; return; } @@ -1643,43 +2450,107 @@ settimeouts(val) } else { - register char *q = strchr(val, '='); - time_t to; + register char *q = strchr(val, ':'); - if (q == NULL) + if (q == NULL && (q = strchr(val, '=')) == NULL) { /* syntax error */ continue; } *q++ = '\0'; - to = convtime(q, 'm'); - - if (strcasecmp(val, "initial") == 0) - TimeOuts.to_initial = to; - else if (strcasecmp(val, "mail") == 0) - TimeOuts.to_mail = to; - else if (strcasecmp(val, "rcpt") == 0) - TimeOuts.to_rcpt = to; - else if (strcasecmp(val, "datainit") == 0) - TimeOuts.to_datainit = to; - else if (strcasecmp(val, "datablock") == 0) - TimeOuts.to_datablock = to; - else if (strcasecmp(val, "datafinal") == 0) - TimeOuts.to_datafinal = to; - else if (strcasecmp(val, "command") == 0) - TimeOuts.to_nextcommand = to; - else if (strcasecmp(val, "rset") == 0) - TimeOuts.to_rset = to; - else if (strcasecmp(val, "helo") == 0) - TimeOuts.to_helo = to; - else if (strcasecmp(val, "quit") == 0) - TimeOuts.to_quit = to; - else if (strcasecmp(val, "misc") == 0) - TimeOuts.to_miscshort = to; - else if (strcasecmp(val, "ident") == 0) - TimeOuts.to_ident = to; - else - syserr("settimeouts: invalid timeout %s", val); + settimeout(val, q); } } } +/* +** SETTIMEOUT -- set an individual timeout +** +** Parameters: +** name -- the name of the timeout. +** val -- the value of the timeout. +** +** Returns: +** none. +*/ + +void +settimeout(name, val) + char *name; + char *val; +{ + register char *p; + time_t to; + extern time_t convtime(); + + to = convtime(val, 'm'); + p = strchr(name, '.'); + if (p != NULL) + *p++ = '\0'; + + if (strcasecmp(name, "initial") == 0) + TimeOuts.to_initial = to; + else if (strcasecmp(name, "mail") == 0) + TimeOuts.to_mail = to; + else if (strcasecmp(name, "rcpt") == 0) + TimeOuts.to_rcpt = to; + else if (strcasecmp(name, "datainit") == 0) + TimeOuts.to_datainit = to; + else if (strcasecmp(name, "datablock") == 0) + TimeOuts.to_datablock = to; + else if (strcasecmp(name, "datafinal") == 0) + TimeOuts.to_datafinal = to; + else if (strcasecmp(name, "command") == 0) + TimeOuts.to_nextcommand = to; + else if (strcasecmp(name, "rset") == 0) + TimeOuts.to_rset = to; + else if (strcasecmp(name, "helo") == 0) + TimeOuts.to_helo = to; + else if (strcasecmp(name, "quit") == 0) + TimeOuts.to_quit = to; + else if (strcasecmp(name, "misc") == 0) + TimeOuts.to_miscshort = to; + else if (strcasecmp(name, "ident") == 0) + TimeOuts.to_ident = to; + else if (strcasecmp(name, "fileopen") == 0) + TimeOuts.to_fileopen = to; + else if (strcasecmp(name, "connect") == 0) + TimeOuts.to_connect = to; + else if (strcasecmp(name, "queuewarn") == 0) + { + to = convtime(val, 'h'); + if (p == NULL || strcmp(p, "*") == 0) + { + TimeOuts.to_q_warning[TOC_NORMAL] = to; + TimeOuts.to_q_warning[TOC_URGENT] = to; + TimeOuts.to_q_warning[TOC_NONURGENT] = to; + } + else if (strcasecmp(p, "normal") == 0) + TimeOuts.to_q_warning[TOC_NORMAL] = to; + else if (strcasecmp(p, "urgent") == 0) + TimeOuts.to_q_warning[TOC_URGENT] = to; + else if (strcasecmp(p, "non-urgent") == 0) + TimeOuts.to_q_warning[TOC_NONURGENT] = to; + else + syserr("settimeout: invalid queuewarn subtimeout %s", p); + } + else if (strcasecmp(name, "queuereturn") == 0) + { + to = convtime(val, 'd'); + if (p == NULL || strcmp(p, "*") == 0) + { + TimeOuts.to_q_return[TOC_NORMAL] = to; + TimeOuts.to_q_return[TOC_URGENT] = to; + TimeOuts.to_q_return[TOC_NONURGENT] = to; + } + else if (strcasecmp(p, "normal") == 0) + TimeOuts.to_q_return[TOC_NORMAL] = to; + else if (strcasecmp(p, "urgent") == 0) + TimeOuts.to_q_return[TOC_URGENT] = to; + else if (strcasecmp(p, "non-urgent") == 0) + TimeOuts.to_q_return[TOC_NONURGENT] = to; + else + syserr("settimeout: invalid queuereturn subtimeout %s", p); + } + else + syserr("settimeout: invalid timeout %s", name); +} diff --git a/usr.sbin/sendmail/src/recipient.c b/usr.sbin/sendmail/src/recipient.c index 0b12c2cdf3f87..79126e9ccc5da 100644 --- a/usr.sbin/sendmail/src/recipient.c +++ b/usr.sbin/sendmail/src/recipient.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1983 Eric P. Allman + * Copyright (c) 1983, 1995 Eric P. Allman * Copyright (c) 1988, 1993 * The Regents of the University of California. All rights reserved. * @@ -33,11 +33,10 @@ */ #ifndef lint -static char sccsid[] = "@(#)recipient.c 8.44.1.6 (Berkeley) 3/5/95"; +static char sccsid[] = "@(#)recipient.c 8.108 (Berkeley) 10/30/95"; #endif /* not lint */ # include "sendmail.h" -# include <pwd.h> /* ** SENDTOLIST -- Designate a send list. @@ -53,6 +52,8 @@ static char sccsid[] = "@(#)recipient.c 8.44.1.6 (Berkeley) 3/5/95"; ** expansion. ** sendq -- a pointer to the head of a queue to put ** these people into. +** aliaslevel -- the current alias nesting depth -- to +** diagnose loops. ** e -- the envelope in which to add these recipients. ** ** Returns: @@ -62,12 +63,15 @@ static char sccsid[] = "@(#)recipient.c 8.44.1.6 (Berkeley) 3/5/95"; ** none. */ -# define MAXRCRSN 10 +/* q_flags bits inherited from ctladdr */ +#define QINHERITEDBITS (QPINGONSUCCESS|QPINGONFAILURE|QPINGONDELAY|QHASNOTIFY) -sendtolist(list, ctladdr, sendq, e) +int +sendtolist(list, ctladdr, sendq, aliaslevel, e) char *list; ADDRESS *ctladdr; ADDRESS **sendq; + int aliaslevel; register ENVELOPE *e; { register char *p; @@ -128,13 +132,58 @@ sendtolist(list, ctladdr, sendq, e) a->q_next = al; a->q_alias = ctladdr; - /* see if this should be marked as a primary address */ - if (ctladdr == NULL || - (firstone && *p == '\0' && bitset(QPRIMARY, ctladdr->q_flags))) - a->q_flags |= QPRIMARY; + /* arrange to inherit attributes from parent */ + if (ctladdr != NULL) + { + ADDRESS *b; + extern ADDRESS *self_reference(); + + /* self reference test */ + if (sameaddr(ctladdr, a)) + { + if (tTd(27, 5)) + { + printf("sendtolist: QSELFREF "); + printaddr(ctladdr, FALSE); + } + ctladdr->q_flags |= QSELFREF; + } + + /* check for address loops */ + b = self_reference(a, e); + if (b != NULL) + { + b->q_flags |= QSELFREF; + if (tTd(27, 5)) + { + printf("sendtolist: QSELFREF "); + printaddr(b, FALSE); + } + if (a != b) + { + if (tTd(27, 5)) + { + printf("sendtolist: QDONTSEND "); + printaddr(a, FALSE); + } + a->q_flags |= QDONTSEND; + b->q_flags |= a->q_flags & QNOTREMOTE; + continue; + } + } + + /* full name */ + if (a->q_fullname == NULL) + a->q_fullname = ctladdr->q_fullname; + + /* various flag bits */ + a->q_flags &= ~QINHERITEDBITS; + a->q_flags |= ctladdr->q_flags & QINHERITEDBITS; + + /* original recipient information */ + a->q_orcpt = ctladdr->q_orcpt; + } - if (ctladdr != NULL && sameaddr(ctladdr, a)) - ctladdr->q_flags |= QSELFREF; al = a; firstone = FALSE; } @@ -145,11 +194,7 @@ sendtolist(list, ctladdr, sendq, e) register ADDRESS *a = al; al = a->q_next; - a = recipient(a, sendq, e); - - /* arrange to inherit full name */ - if (a->q_fullname == NULL && ctladdr != NULL) - a->q_fullname = ctladdr->q_fullname; + a = recipient(a, sendq, aliaslevel, e); naddrs++; } @@ -168,6 +213,7 @@ sendtolist(list, ctladdr, sendq, e) ** sendq -- a pointer to the head of a queue to put the ** recipient in. Duplicate supression is done ** in this queue. +** aliaslevel -- the current alias nesting depth. ** e -- the current envelope. ** ** Returns: @@ -179,9 +225,10 @@ sendtolist(list, ctladdr, sendq, e) */ ADDRESS * -recipient(a, sendq, e) +recipient(a, sendq, aliaslevel, e) register ADDRESS *a; register ADDRESS **sendq; + int aliaslevel; register ENVELOPE *e; { register ADDRESS *q; @@ -190,15 +237,20 @@ recipient(a, sendq, e) register char *p; bool quoted = FALSE; /* set if the addr has a quote bit */ int findusercount = 0; - char buf[MAXNAME]; /* unquoted image of the user name */ + bool initialdontsend = bitset(QDONTSEND, a->q_flags); + int i; + char *buf; + char buf0[MAXNAME + 1]; /* unquoted image of the user name */ extern int safefile(); e->e_to = a->q_paddr; m = a->q_mailer; errno = 0; + if (aliaslevel == 0) + a->q_flags |= QPRIMARY; if (tTd(26, 1)) { - printf("\nrecipient: "); + printf("\nrecipient (%d): ", aliaslevel); printaddr(a, FALSE); } @@ -212,9 +264,11 @@ recipient(a, sendq, e) } /* break aliasing loops */ - if (AliasLevel > MAXRCRSN) + if (aliaslevel > MaxAliasRecursion) { - usrerr("554 aliasing/forwarding loop broken"); + a->q_status = "5.4.6"; + usrerr("554 aliasing/forwarding loop broken (%d aliases deep; %d max", + aliaslevel, MaxAliasRecursion); return (a); } @@ -222,10 +276,12 @@ recipient(a, sendq, e) ** Finish setting up address structure. */ - /* set the queue timeout */ - a->q_timeout = TimeOuts.to_q_return; - /* get unquoted user for file, program or user.name check */ + i = strlen(a->q_user); + if (i >= sizeof buf0) + buf = xalloc(i + 1); + else + buf = buf0; (void) strcpy(buf, a->q_user); for (p = buf; *p != '\0' && !quoted; p++) { @@ -240,17 +296,20 @@ recipient(a, sendq, e) if (a->q_alias == NULL) { a->q_flags |= QBADADDR; + a->q_status = "5.7.1"; usrerr("550 Cannot mail directly to programs"); } else if (bitset(QBOGUSSHELL, a->q_alias->q_flags)) { a->q_flags |= QBADADDR; + a->q_status = "5.7.1"; 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; + a->q_status = "5.7.1"; usrerr("550 Address %s is unsafe for mailing to programs", a->q_alias->q_paddr); } @@ -283,7 +342,7 @@ recipient(a, sendq, e) else if (bitset(QSELFREF, q->q_flags)) q->q_flags |= a->q_flags & ~QDONTSEND; a = q; - goto testselfdestruct; + goto done; } } @@ -308,6 +367,7 @@ recipient(a, sendq, e) if (a->q_alias == NULL) { a->q_flags |= QBADADDR; + a->q_status = "5.7.1"; usrerr("550 Cannot mail directly to :include:s"); } else @@ -315,25 +375,29 @@ recipient(a, sendq, e) int ret; message("including file %s", a->q_user); - ret = include(a->q_user, FALSE, a, sendq, e); + ret = include(a->q_user, FALSE, a, sendq, aliaslevel, e); if (transienterror(ret)) { #ifdef LOG if (LogLevel > 2) syslog(LOG_ERR, "%s: include %s: transient error: %s", e->e_id == NULL ? "NOQUEUE" : e->e_id, - a->q_user, errstring(ret)); + shortenstring(a->q_user, 203), + errstring(ret)); #endif a->q_flags |= QQUEUEUP; a->q_flags &= ~QDONTSEND; usrerr("451 Cannot open %s: %s", - a->q_user, errstring(ret)); + shortenstring(a->q_user, 203), + errstring(ret)); } else if (ret != 0) { a->q_flags |= QBADADDR; + a->q_status = "5.2.4"; usrerr("550 Cannot open %s: %s", - a->q_user, errstring(ret)); + shortenstring(a->q_user, 203), + errstring(ret)); } } } @@ -345,44 +409,44 @@ recipient(a, sendq, e) if (a->q_alias == NULL) { a->q_flags |= QBADADDR; + a->q_status = "5.7.1"; usrerr("550 Cannot mail directly to files"); } else if (bitset(QBOGUSSHELL, a->q_alias->q_flags)) { a->q_flags |= QBADADDR; + a->q_status = "5.7.1"; 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; + a->q_status = "5.7.1"; usrerr("550 Address %s is unsafe for mailing to files", a->q_alias->q_paddr); } - else if (!writable(buf, getctladdr(a), SFF_ANYFILE)) + else if (!writable(buf, a->q_alias, SFF_CREAT)) { a->q_flags |= QBADADDR; - giveresponse(EX_CANTCREAT, m, NULL, a->q_alias, e); + giveresponse(EX_CANTCREAT, m, NULL, a->q_alias, + (time_t) 0, e); } } - if (m != LocalMailer) - { - if (!bitset(QDONTSEND, a->q_flags)) - e->e_nrcpts++; - goto testselfdestruct; - } - /* try aliasing */ - alias(a, sendq, e); + if (!quoted && !bitset(QDONTSEND, a->q_flags) && + bitnset(M_ALIASABLE, m->m_flags)) + alias(a, sendq, aliaslevel, e); -# ifdef USERDB +# if USERDB /* if not aliased, look it up in the user database */ - if (!bitset(QDONTSEND|QNOTREMOTE|QVERIFIED, a->q_flags)) + if (!bitset(QDONTSEND|QNOTREMOTE|QVERIFIED, a->q_flags) && + bitnset(M_CHECKUDB, m->m_flags)) { extern int udbexpand(); - if (udbexpand(a, sendq, e) == EX_TEMPFAIL) + if (udbexpand(a, sendq, aliaslevel, e) == EX_TEMPFAIL) { a->q_flags |= QQUEUEUP; if (e->e_message == NULL) @@ -401,10 +465,6 @@ recipient(a, sendq, e) } # endif - /* if it was an alias or a UDB expansion, just return now */ - if (bitset(QDONTSEND|QQUEUEUP|QVERIFIED, a->q_flags)) - goto testselfdestruct; - /* ** If we have a level two config file, then pass the name through ** Ruleset 5 before sending it off. Ruleset 5 has the right @@ -418,10 +478,11 @@ recipient(a, sendq, e) ConfigLevel, RewriteRules[5]); printaddr(a, FALSE); } - if (!bitset(QNOTREMOTE, a->q_flags) && ConfigLevel >= 2 && - RewriteRules[5] != NULL) + if (!bitset(QNOTREMOTE|QDONTSEND|QQUEUEUP|QVERIFIED, a->q_flags) && + ConfigLevel >= 2 && RewriteRules[5] != NULL && + bitnset(M_TRYRULESET5, m->m_flags)) { - maplocaluser(a, sendq, e); + maplocaluser(a, sendq, aliaslevel + 1, e); } /* @@ -429,7 +490,8 @@ recipient(a, sendq, e) ** and deliver it. */ - if (!bitset(QDONTSEND|QQUEUEUP, a->q_flags)) + if (!bitset(QDONTSEND|QQUEUEUP|QVERIFIED, a->q_flags) && + bitnset(M_HASPWENT, m->m_flags)) { auto bool fuzzy; register struct passwd *pw; @@ -440,11 +502,13 @@ recipient(a, sendq, e) if (pw == NULL) { a->q_flags |= QBADADDR; - giveresponse(EX_NOUSER, m, NULL, a->q_alias, e); + a->q_status = "5.1.1"; + giveresponse(EX_NOUSER, m, NULL, a->q_alias, + (time_t) 0, e); } else { - char nbuf[MAXNAME]; + char nbuf[MAXNAME + 1]; if (fuzzy) { @@ -453,9 +517,10 @@ recipient(a, sendq, e) if (findusercount++ > 3) { a->q_flags |= QBADADDR; + a->q_status = "5.4.6"; usrerr("554 aliasing/forwarding loop for %s broken", pw->pw_name); - return (a); + goto done; } /* see if it aliases */ @@ -473,36 +538,103 @@ recipient(a, sendq, e) 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)) + if (!usershellok(pw->pw_name, pw->pw_shell)) { a->q_flags |= QBOGUSSHELL; } - if (!quoted) - forward(a, sendq, e); + if (bitset(EF_VRFYONLY, e->e_flags)) + { + /* don't do any more now */ + a->q_flags |= QVERIFIED; + } + else if (!quoted) + forward(a, sendq, aliaslevel, e); } } if (!bitset(QDONTSEND, a->q_flags)) e->e_nrcpts++; testselfdestruct: + a->q_flags |= QTHISPASS; if (tTd(26, 8)) { printf("testselfdestruct: "); - printaddr(a, TRUE); + printaddr(a, FALSE); + if (tTd(26, 10)) + { + printf("SENDQ:\n"); + printaddr(*sendq, TRUE); + printf("----\n"); + } } if (a->q_alias == NULL && a != &e->e_from && bitset(QDONTSEND, a->q_flags)) { - q = *sendq; - while (q != NULL && bitset(QDONTSEND, q->q_flags)) - q = q->q_next; + for (q = *sendq; q != NULL; q = q->q_next) + { + if (!bitset(QDONTSEND, q->q_flags)) + break; + } if (q == NULL) { a->q_flags |= QBADADDR; + a->q_status = "5.4.6"; usrerr("554 aliasing/forwarding loop broken"); } } + + done: + a->q_flags |= QTHISPASS; + if (buf != buf0) + free(buf); + + /* + ** If we are at the top level, check to see if this has + ** expanded to exactly one address. If so, it can inherit + ** the primaryness of the address. + ** + ** While we're at it, clear the QTHISPASS bits. + */ + + if (aliaslevel == 0) + { + int nrcpts = 0; + ADDRESS *only; + + for (q = *sendq; q != NULL; q = q->q_next) + { + if (bitset(QTHISPASS, q->q_flags) && + !bitset(QDONTSEND|QBADADDR, q->q_flags)) + { + nrcpts++; + only = q; + } + q->q_flags &= ~QTHISPASS; + } + if (nrcpts == 1) + { + /* check to see if this actually got a new owner */ + q = only; + while ((q = q->q_alias) != NULL) + { + if (q->q_owner != NULL) + break; + } + if (q == NULL) + only->q_flags |= QPRIMARY; + } + else if (!initialdontsend && nrcpts > 0) + { + /* arrange for return receipt */ + e->e_flags |= EF_SENDRECEIPT; + a->q_flags |= QEXPANDED; + if (e->e_xfp != NULL && bitset(QPINGONSUCCESS, a->q_flags)) + fprintf(e->e_xfp, + "%s... expanded to multiple addresses\n", + a->q_paddr); + } + } + return (a); } /* @@ -535,14 +667,14 @@ finduser(name, fuzzyp) { register struct passwd *pw; register char *p; - extern struct passwd *getpwent(); - extern struct passwd *getpwnam(); + bool tryagain; if (tTd(29, 4)) printf("finduser(%s): ", name); *fuzzyp = FALSE; +#ifdef HESIOD /* DEC Hesiod getpwnam accepts numeric strings -- short circuit it */ for (p = name; *p != '\0'; p++) if (!isascii(*p) || !isdigit(*p)) @@ -553,16 +685,35 @@ finduser(name, fuzzyp) printf("failed (numeric input)\n"); return NULL; } +#endif /* look up this login name using fast path */ - if ((pw = getpwnam(name)) != NULL) + if ((pw = sm_getpwnam(name)) != NULL) { if (tTd(29, 4)) printf("found (non-fuzzy)\n"); return (pw); } -#ifdef MATCHGECOS + /* try mapping it to lower case */ + tryagain = FALSE; + for (p = name; *p != '\0'; p++) + { + if (isascii(*p) && isupper(*p)) + { + *p = tolower(*p); + tryagain = TRUE; + } + } + if (tryagain && (pw = sm_getpwnam(name)) != NULL) + { + if (tTd(29, 4)) + printf("found (lower case)\n"); + *fuzzyp = TRUE; + return pw; + } + +#if MATCHGECOS /* see if fuzzy matching allowed */ if (!MatchGecos) { @@ -580,7 +731,17 @@ finduser(name, fuzzyp) (void) setpwent(); while ((pw = getpwent()) != NULL) { - char buf[MAXNAME]; + char buf[MAXNAME + 1]; + +# if 0 + if (strcasecmp(pw->pw_name, name) == 0) + { + if (tTd(29, 4)) + printf("found (case wrapped)\n"); + *fuzzyp = TRUE; + return pw; + } +# endif buildfname(pw->pw_gecos, pw->pw_name, buf); if (strchr(buf, ' ') != NULL && !strcasecmp(buf, name)) @@ -632,90 +793,53 @@ writable(filename, ctladdr, 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 + if (tTd(44, 5)) + printf("writable(%s, 0x%x)\n", filename, flags); /* ** 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 + else if (bitset(SFF_RUNASREALUID, flags)) { euid = RealUid; egid = RealGid; uname = RealUserName; } - if (euid == 0) + else if (FileMailer != NULL && !bitset(SFF_ROOTOK, flags)) { - euid = DefUid; - uname = DefUser; + euid = FileMailer->m_uid; + egid = FileMailer->m_gid; + uname = NULL; + } + else + { + euid = egid = 0; + uname = NULL; } - if (egid == 0) - egid = DefGid; - if (geteuid() == 0) + if (!bitset(SFF_ROOTOK, flags)) { - if (bitset(S_ISUID, stb.st_mode) && - (stb.st_uid != 0 || bitset(SFF_ROOTOK, flags))) + if (euid == 0) { - euid = stb.st_uid; - uname = NULL; + euid = DefUid; + uname = DefUser; } - if (bitset(S_ISGID, stb.st_mode) && - (stb.st_gid != 0 || bitset(SFF_ROOTOK, flags))) - egid = stb.st_gid; + if (egid == 0) + egid = DefGid; } + if (geteuid() == 0 && + (ctladdr == NULL || !bitset(QGOODUID, ctladdr->q_flags))) + flags |= SFF_SETUIDOK; - 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); + errno = safefile(filename, euid, egid, uname, flags, S_IWRITE, NULL); return errno == 0; } /* @@ -730,6 +854,8 @@ writable(filename, ctladdr, flags) ** the important things. ** sendq -- a pointer to the head of the send queue ** to put these addresses in. +** aliaslevel -- the alias nesting depth. +** e -- the current envelope. ** ** Returns: ** open error status @@ -753,32 +879,29 @@ writable(filename, ctladdr, flags) */ static jmp_buf CtxIncludeTimeout; -static int includetimeout(); - -#ifndef S_IWOTH -# define S_IWOTH (S_IWRITE >> 6) -#endif +static void includetimeout(); int -include(fname, forwarding, ctladdr, sendq, e) +include(fname, forwarding, ctladdr, sendq, aliaslevel, e) char *fname; bool forwarding; ADDRESS *ctladdr; ADDRESS **sendq; + int aliaslevel; ENVELOPE *e; { - register FILE *fp = NULL; + FILE *volatile fp = NULL; char *oldto = e->e_to; char *oldfilename = FileName; int oldlinenumber = LineNumber; register EVENT *ev = NULL; int nincludes; register ADDRESS *ca; - uid_t saveduid, uid; - gid_t savedgid, gid; - char *uname; + volatile uid_t saveduid, uid; + volatile gid_t savedgid, gid; + char *volatile uname; int rval = 0; - int sfflags = forwarding ? SFF_MUSTOWN : SFF_ANYFILE; + int sfflags = SFF_REGONLY; struct stat st; char buf[MAXLINE]; #ifdef _POSIX_CHOWN_RESTRICTED @@ -813,30 +936,47 @@ include(fname, forwarding, ctladdr, sendq, e) if (tTd(27, 9)) printf("include: old uid = %d/%d\n", getuid(), geteuid()); + if (forwarding) + sfflags |= SFF_MUSTOWN|SFF_ROOTOK|SFF_NOSLINK; + ca = getctladdr(ctladdr); if (ca == NULL) { uid = DefUid; gid = DefGid; uname = DefUser; - saveduid = -1; } else { uid = ca->q_uid; gid = ca->q_gid; uname = ca->q_user; -#ifdef HASSETREUID - saveduid = geteuid(); - savedgid = getegid(); - if (saveduid == 0) - { + } +#if HASSETREUID || USESETEUID + saveduid = geteuid(); + savedgid = getegid(); + if (saveduid == 0) + { + if (!DontInitGroups) initgroups(uname, gid); - if (uid != 0) - (void) setreuid(0, uid); + if (gid != 0) + (void) setgid(gid); + if (uid != 0) + { +# if USESETEUID + if (seteuid(uid) < 0) + syserr("seteuid(%d) failure (real=%d, eff=%d)", + uid, getuid(), geteuid()); +# else + if (setreuid(0, uid) < 0) + syserr("setreuid(0, %d) failure (real=%d, eff=%d)", + uid, getuid(), geteuid()); +# endif + else + sfflags |= SFF_NOPATHCHECK; } -#endif } +#endif if (tTd(27, 9)) printf("include: new uid = %d/%d\n", getuid(), geteuid()); @@ -855,10 +995,13 @@ include(fname, forwarding, ctladdr, sendq, e) rval = EOPENTIMEOUT; goto resetuid; } - ev = setevent((time_t) 60, includetimeout, 0); + if (TimeOuts.to_fileopen > 0) + ev = setevent(TimeOuts.to_fileopen, includetimeout, 0); + else + ev = NULL; /* the input file must be marked safe */ - rval = safefile(fname, uid, gid, uname, sfflags, S_IREAD); + rval = safefile(fname, uid, gid, uname, sfflags, S_IREAD, NULL); if (rval != 0) { /* don't use this :include: file */ @@ -876,17 +1019,29 @@ include(fname, forwarding, ctladdr, sendq, e) printf("include: open: %s\n", errstring(rval)); } } - clrevent(ev); + if (ev != NULL) + clrevent(ev); resetuid: -#ifdef HASSETREUID +#if HASSETREUID || USESETEUID if (saveduid == 0) { if (uid != 0) - if (setreuid(-1, 0) < 0 || setreuid(RealUid, 0) < 0) + { +# if USESETEUID + if (seteuid(0) < 0) + syserr("seteuid(0) failure (real=%d, eff=%d)", + getuid(), geteuid()); +# else + if (setreuid(-1, 0) < 0) + syserr("setreuid(-1, 0) failure (real=%d, eff=%d)", + getuid(), geteuid()); + if (setreuid(RealUid, 0) < 0) syserr("setreuid(%d, 0) failure (real=%d, eff=%d)", RealUid, getuid(), geteuid()); +# endif + } setgid(savedgid); } #endif @@ -924,25 +1079,34 @@ resetuid: } else { - char *sh; register struct passwd *pw; - sh = "/SENDMAIL/ANY/SHELL/"; - pw = getpwuid(st.st_uid); - if (pw != NULL) - { - ctladdr->q_ruser = newstr(pw->pw_name); - if (safechown) - sh = pw->pw_shell; - } + pw = sm_getpwuid(st.st_uid); if (pw == NULL) ctladdr->q_flags |= QBOGUSSHELL; - else if(!usershellok(sh)) + else { + char *sh; + + ctladdr->q_ruser = newstr(pw->pw_name); if (safechown) - ctladdr->q_flags |= QBOGUSSHELL; + sh = pw->pw_shell; else - ctladdr->q_flags |= QUNSAFEADDR; + sh = "/SENDMAIL/ANY/SHELL/"; + if (!usershellok(pw->pw_name, sh)) + { +#ifdef LOG + if (LogLevel >= 12) + syslog(LOG_INFO, "%s: user %s has bad shell %s, marked %s", + shortenstring(fname, 203), + pw->pw_name, sh, + safechown ? "bogus" : "unsafe"); +#endif + if (safechown) + ctladdr->q_flags |= QBOGUSSHELL; + else + ctladdr->q_flags |= QUNSAFEADDR; + } } } @@ -966,7 +1130,15 @@ resetuid: */ if (bitset(S_IWOTH, st.st_mode)) + { +#ifdef LOG + if (LogLevel >= 12) + syslog(LOG_INFO, "%s: world writable %s file, marked unsafe", + shortenstring(fname, 203), + forwarding ? "forward" : ":include:"); +#endif ctladdr->q_flags |= QUNSAFEADDR; + } /* read the file -- each line is a comma-separated list. */ FileName = fname; @@ -982,19 +1154,33 @@ resetuid: *p = '\0'; if (buf[0] == '#' || buf[0] == '\0') continue; + + /* <sp>#@# introduces a comment anywhere */ + /* for Japanese character sets */ + for (p = buf; (p = strchr(++p, '#')) != NULL; ) + { + if (p[1] == '@' && p[2] == '#' && + isascii(p[-1]) && isspace(p[-1]) && + (p[3] == '\0' || (isascii(p[3]) && isspace(p[3])))) + { + p[-1] = '\0'; + break; + } + } + if (buf[0] == '\0') + continue; + e->e_to = NULL; message("%s to %s", forwarding ? "forwarding" : "sending", buf); #ifdef LOG if (forwarding && LogLevel > 9) - syslog(LOG_INFO, "%s: forward %s => %s", + syslog(LOG_INFO, "%s: forward %.200s => %s", e->e_id == NULL ? "NOQUEUE" : e->e_id, - oldto, buf); + oldto, shortenstring(buf, 203)); #endif - AliasLevel++; - nincludes += sendtolist(buf, ctladdr, sendq, e); - AliasLevel--; + nincludes += sendtolist(buf, ctladdr, sendq, aliaslevel + 1, e); } if (ferror(fp) && tTd(27, 3)) @@ -1016,7 +1202,7 @@ resetuid: return rval; } -static +static void includetimeout() { longjmp(CtxIncludeTimeout, 1); @@ -1036,6 +1222,7 @@ includetimeout() ** send queue. */ +void sendtoargv(argv, e) register char **argv; register ENVELOPE *e; @@ -1044,7 +1231,7 @@ sendtoargv(argv, e) while ((p = *argv++) != NULL) { - (void) sendtolist(p, NULLADDR, &e->e_sendqueue, e); + (void) sendtolist(p, NULLADDR, &e->e_sendqueue, 0, e); } } /* @@ -1070,3 +1257,93 @@ getctladdr(a) a = a->q_alias; return (a); } +/* +** SELF_REFERENCE -- check to see if an address references itself +** +** The check is done through a chain of aliases. If it is part of +** a loop, break the loop at the "best" address, that is, the one +** that exists as a real user. +** +** This is to handle the case of: +** awc: Andrew.Chang +** Andrew.Chang: awc@mail.server +** which is a problem only on mail.server. +** +** Parameters: +** a -- the address to check. +** e -- the current envelope. +** +** Returns: +** The address that should be retained. +*/ + +ADDRESS * +self_reference(a, e) + ADDRESS *a; + ENVELOPE *e; +{ + ADDRESS *b; /* top entry in self ref loop */ + ADDRESS *c; /* entry that point to a real mail box */ + + if (tTd(27, 1)) + printf("self_reference(%s)\n", a->q_paddr); + + for (b = a->q_alias; b != NULL; b = b->q_alias) + { + if (sameaddr(a, b)) + break; + } + + if (b == NULL) + { + if (tTd(27, 1)) + printf("\t... no self ref\n"); + return NULL; + } + + /* + ** Pick the first address that resolved to a real mail box + ** i.e has a pw entry. The returned value will be marked + ** QSELFREF in recipient(), which in turn will disable alias() + ** from marking it QDONTSEND, which mean it will be used + ** as a deliverable address. + ** + ** The 2 key thing to note here are: + ** 1) we are in a recursive call sequence: + ** alias->sentolist->recipient->alias + ** 2) normally, when we return back to alias(), the address + ** will be marked QDONTSEND, since alias() assumes the + ** expanded form will be used instead of the current address. + ** This behaviour is turned off if the address is marked + ** QSELFREF We set QSELFREF when we return to recipient(). + */ + + c = a; + while (c != NULL) + { + if (bitnset(M_HASPWENT, c->q_mailer->m_flags)) + { + if (tTd(27, 2)) + printf("\t... getpwnam(%s)... ", c->q_user); + if (sm_getpwnam(c->q_user) != NULL) + { + if (tTd(27, 2)) + printf("found\n"); + + /* ought to cache results here */ + if (sameaddr(b, c)) + return b; + else + return c; + } + if (tTd(27, 2)) + printf("failed\n"); + } + c = c->q_alias; + } + + if (tTd(27, 1)) + printf("\t... cannot break loop for \"%s\"\n", a->q_paddr); + + return NULL; +} diff --git a/usr.sbin/sendmail/src/savemail.c b/usr.sbin/sendmail/src/savemail.c index 65c915d37893f..9898cdd57d81e 100644 --- a/usr.sbin/sendmail/src/savemail.c +++ b/usr.sbin/sendmail/src/savemail.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1983 Eric P. Allman + * Copyright (c) 1983, 1995 Eric P. Allman * Copyright (c) 1988, 1993 * The Regents of the University of California. All rights reserved. * @@ -33,11 +33,10 @@ */ #ifndef lint -static char sccsid[] = "@(#)savemail.c 8.29 (Berkeley) 5/10/94"; +static char sccsid[] = "@(#)savemail.c 8.87 (Berkeley) 10/28/95"; #endif /* not lint */ # include "sendmail.h" -# include <pwd.h> /* ** SAVEMAIL -- Save mail on error @@ -49,6 +48,8 @@ static char sccsid[] = "@(#)savemail.c 8.29 (Berkeley) 5/10/94"; ** ** Parameters: ** e -- the envelope containing the message in error. +** sendbody -- if TRUE, also send back the body of the +** message; otherwise just send the header. ** ** Returns: ** none @@ -74,8 +75,10 @@ static char sccsid[] = "@(#)savemail.c 8.29 (Berkeley) 5/10/94"; # endif -savemail(e) +void +savemail(e, sendbody) register ENVELOPE *e; + bool sendbody; { register struct passwd *pw; register FILE *fp; @@ -83,8 +86,8 @@ savemail(e) auto ADDRESS *q = NULL; register char *p; MCI mcibuf; + int sfflags; char buf[MAXLINE+1]; - extern struct passwd *getpwnam(); extern char *ttypath(); typedef int (*fnptr)(); extern bool writable(); @@ -143,11 +146,6 @@ savemail(e) break; case EM_BERKNET: - /* mail back, but return o.k. exit status */ - ExitStat = EX_OK; - - /* fall through.... */ - case EM_MAIL: state = ESM_MAIL; break; @@ -187,7 +185,7 @@ savemail(e) switch (state) { case ESM_QUIET: - if (e->e_from.q_mailer == LocalMailer) + if (bitnset(M_LOCALMAILER, e->e_from.q_mailer->m_flags)) state = ESM_DEADLETTER; else state = ESM_MAIL; @@ -207,7 +205,7 @@ savemail(e) break; } - expand("\201n", buf, &buf[sizeof buf - 1], e); + expand("\201n", buf, sizeof buf, e); printf("\r\nMessage from %s...\r\n", buf); printf("Errors occurred while sending mail.\r\n"); if (e->e_xfp != NULL) @@ -256,12 +254,12 @@ savemail(e) if (ExitStat == EX_CONFIG || ExitStat == EX_SOFTWARE) { (void) sendtolist("postmaster", - NULLADDR, &e->e_errorqueue, e); + NULLADDR, &e->e_errorqueue, 0, e); } - if (strcmp(e->e_from.q_paddr, "<>") != 0) + if (!emptyaddr(&e->e_from)) { (void) sendtolist(e->e_from.q_paddr, - NULLADDR, &e->e_errorqueue, e); + NULLADDR, &e->e_errorqueue, 0, e); } /* @@ -285,7 +283,7 @@ savemail(e) break; } if (returntosender(e->e_message, e->e_errorqueue, - (e->e_class >= 0), e) == 0) + sendbody, e) == 0) { state = ESM_DONE; break; @@ -301,15 +299,14 @@ savemail(e) */ q = NULL; - if (sendtolist("postmaster", NULL, &q, e) <= 0) + if (sendtolist("postmaster", NULL, &q, 0, e) <= 0) { syserr("553 cannot parse postmaster!"); ExitStat = EX_SOFTWARE; state = ESM_USRTMP; break; } - if (returntosender(e->e_message, - q, (e->e_class >= 0), e) == 0) + if (returntosender(e->e_message, q, sendbody, e) == 0) { state = ESM_DONE; break; @@ -330,44 +327,36 @@ savemail(e) */ p = NULL; - if (e->e_from.q_mailer == LocalMailer) + if (bitnset(M_HASPWENT, e->e_from.q_mailer->m_flags)) { if (e->e_from.q_home != NULL) p = e->e_from.q_home; - else if ((pw = getpwnam(e->e_from.q_user)) != NULL) + else if ((pw = sm_getpwnam(e->e_from.q_user)) != NULL) p = pw->pw_dir; } - if (p == NULL) + if (p == NULL || e->e_dfp == NULL) { - /* no local directory */ + /* no local directory or no data file */ state = ESM_MAIL; break; } - if (e->e_dfp != NULL) + + /* we have a home directory; write dead.letter */ + define('z', p, e); + expand("\201z/dead.letter", buf, sizeof buf, e); + sfflags = SFF_NOSLINK|SFF_CREAT|SFF_REGONLY|SFF_RUNASREALUID; + e->e_to = buf; + if (mailfile(buf, NULL, sfflags, e) == EX_OK) { bool oldverb = Verbose; - /* we have a home directory; open dead.letter */ - define('z', p, e); - expand("\201z/dead.letter", buf, &buf[sizeof buf - 1], e); Verbose = TRUE; - message("Saving message in %s", buf); + message("Saved message in %s", buf); Verbose = oldverb; - e->e_to = buf; - q = NULL; - (void) sendtolist(buf, &e->e_from, &q, e); - if (q != NULL && - !bitset(QBADADDR, q->q_flags) && - deliver(e, q) == 0) - state = ESM_DONE; - else - state = ESM_MAIL; - } - else - { - /* no data file -- try mailing back */ - state = ESM_MAIL; + state = ESM_DONE; + break; } + state = ESM_MAIL; break; case ESM_USRTMP: @@ -381,15 +370,19 @@ savemail(e) break; } - strcpy(buf, _PATH_VARTMP); - strcat(buf, "dead.letter"); - if (!writable(buf, NULLADDR, SFF_NOSLINK)) + if (SafeFileEnv != NULL && SafeFileEnv[0] != '\0') { state = ESM_PANIC; break; } - fp = dfopen(buf, O_WRONLY|O_CREAT|O_APPEND, FileMode); - if (fp == NULL) + + strcpy(buf, _PATH_VARTMP); + strcat(buf, "dead.letter"); + + sfflags = SFF_NOSLINK|SFF_CREAT|SFF_REGONLY|SFF_ROOTOK|SFF_OPENASROOT; + if (!writable(buf, NULL, sfflags) || + (fp = safefopen(buf, O_WRONLY|O_CREAT|O_APPEND, + FileMode, sfflags)) == NULL) { state = ESM_PANIC; break; @@ -402,13 +395,26 @@ savemail(e) mcibuf.mci_flags |= MCIF_7BIT; putfromline(&mcibuf, e); - (*e->e_puthdr)(&mcibuf, e); - putline("\n", &mcibuf); + (*e->e_puthdr)(&mcibuf, e->e_header, e); (*e->e_putbody)(&mcibuf, e, NULL); putline("\n", &mcibuf); (void) fflush(fp); - state = ferror(fp) ? ESM_PANIC : ESM_DONE; - (void) xfclose(fp, "savemail", "/usr/tmp/dead.letter"); + if (!ferror(fp)) + { + bool oldverb = Verbose; + + Verbose = TRUE; + message("Saved message in %s", buf); + Verbose = oldverb; +#ifdef LOG + if (LogLevel > 3) + syslog(LOG_NOTICE, "Saved message in %s", buf); +#endif + state = ESM_DONE; + break; + } + state = ESM_PANIC; + (void) xfclose(fp, "savemail", buf); break; default: @@ -418,6 +424,7 @@ savemail(e) case ESM_PANIC: /* leave the locked queue & transcript files around */ + loseqfile(e, "savemail panic"); syserr("!554 savemail: cannot save rejected email anywhere"); } } @@ -441,24 +448,24 @@ savemail(e) ** mail. */ -static bool SendBody; - #define MAXRETURNS 6 /* max depth of returning messages */ #define ERRORFUDGE 100 /* nominal size of error message text */ +int returntosender(msg, returnq, sendbody, e) char *msg; ADDRESS *returnq; bool sendbody; register ENVELOPE *e; { - char buf[MAXNAME]; - extern putheader(), errbody(); register ENVELOPE *ee; ENVELOPE *oldcur = CurEnv; ENVELOPE errenvelope; static int returndepth; register ADDRESS *q; + char *p; + char buf[MAXNAME + 1]; + extern void errbody __P((MCI *, ENVELOPE *, char *)); if (returnq == NULL) return (-1); @@ -468,9 +475,14 @@ returntosender(msg, returnq, sendbody, e) if (tTd(6, 1)) { - printf("Return To Sender: msg=\"%s\", depth=%d, e=%x, returnq=", + printf("\n*** Return To Sender: msg=\"%s\", depth=%d, e=%x, returnq=", msg, returndepth, e); printaddr(returnq, TRUE); + if (tTd(6, 20)) + { + printf("Sendq="); + printaddr(e->e_sendqueue, TRUE); + } } if (++returndepth >= MAXRETURNS) @@ -482,9 +494,10 @@ returntosender(msg, returnq, sendbody, e) return (0); } - SendBody = sendbody; define('g', e->e_from.q_paddr, e); define('u', NULL, e); + + /* initialize error envelope */ ee = newenvelope(&errenvelope, e); define('a', "\201b", ee); define('r', "internal", ee); @@ -497,45 +510,97 @@ returntosender(msg, returnq, sendbody, e) ee->e_flags &= ~EF_OLDSTYLE; ee->e_sendqueue = returnq; ee->e_msgsize = ERRORFUDGE; - if (!NoReturn) + if (sendbody) ee->e_msgsize += e->e_msgsize; + else + ee->e_flags |= EF_NO_BODY_RETN; initsys(ee); for (q = returnq; q != NULL; q = q->q_next) { if (bitset(QBADADDR, q->q_flags)) continue; - if (!bitset(QDONTSEND, q->q_flags)) - ee->e_nrcpts++; - if (!DontPruneRoutes && pruneroute(q->q_paddr)) + { + register ADDRESS *p; + parseaddr(q->q_paddr, q, RF_COPYPARSE, '\0', NULL, e); + for (p = returnq; p != NULL; p = p->q_next) + { + if (p != q && sameaddr(p, q)) + q->q_flags |= QDONTSEND; + } + } + + if (!bitset(QDONTSEND, q->q_flags)) + ee->e_nrcpts++; if (q->q_alias == NULL) - addheader("To", q->q_paddr, ee); + addheader("To", q->q_paddr, &ee->e_header); } # ifdef LOG if (LogLevel > 5) - syslog(LOG_INFO, "%s: %s: return to sender: %s", - e->e_id, ee->e_id, msg); + { + if (bitset(EF_RESPONSE|EF_WARNING, e->e_flags)) + p = "return to sender"; + else + p = "postmaster notify"; + syslog(LOG_INFO, "%s: %s: %s: %s", + e->e_id, ee->e_id, p, shortenstring(msg, 203)); + } # endif - (void) sprintf(buf, "Returned mail: %.*s", sizeof buf - 20, msg); - addheader("Subject", buf, ee); if (SendMIMEErrors) { - addheader("MIME-Version", "1.0", ee); - (void) sprintf(buf, "%s.%ld/%s", + addheader("MIME-Version", "1.0", &ee->e_header); + + (void) sprintf(buf, "%s.%ld/%.100s", ee->e_id, curtime(), MyHostName); ee->e_msgboundary = newstr(buf); - (void) sprintf(buf, "multipart/mixed; boundary=\"%s\"", - ee->e_msgboundary); - addheader("Content-Type", buf, ee); + (void) sprintf(buf, +#if DSN + "multipart/report; report-type=delivery-status;\n\tboundary=\"%s\"", +#else + "multipart/mixed; boundary=\"%s\"", +#endif + ee->e_msgboundary); + addheader("Content-Type", buf, &ee->e_header); + + p = hvalue("Content-Transfer-Encoding", e->e_header); + if (p != NULL && strcasecmp(p, "binary") != 0) + p = NULL; + if (p == NULL && bitset(EF_HAS8BIT, e->e_flags)) + p = "8bit"; + if (p != NULL) + addheader("Content-Transfer-Encoding", p, &ee->e_header); + } + if (strncmp(msg, "Warning:", 8) == 0) + { + addheader("Subject", msg, &ee->e_header); + p = "warning-timeout"; + } + else if (strncmp(msg, "Postmaster warning:", 19) == 0) + { + addheader("Subject", msg, &ee->e_header); + p = "postmaster-warning"; + } + else if (strcmp(msg, "Return receipt") == 0) + { + addheader("Subject", msg, &ee->e_header); + p = "return-receipt"; + } + else + { + sprintf(buf, "Returned mail: %.*s", sizeof buf - 20, msg); + addheader("Subject", buf, &ee->e_header); + p = "failure"; } + (void) sprintf(buf, "auto-generated (%s)", p); + addheader("Auto-Submitted", buf, &ee->e_header); /* fake up an address header for the from person */ - expand("\201n", buf, &buf[sizeof buf - 1], e); + expand("\201n", buf, sizeof buf, e); if (parseaddr(buf, &ee->e_from, RF_COPYALL|RF_SENDERADDR, '\0', NULL, e) == NULL) { syserr("553 Can't parse myself!"); @@ -562,8 +627,15 @@ returntosender(msg, returnq, sendbody, e) CurEnv = oldcur; returndepth--; - /* should check for delivery errors here */ - return (0); + /* check for delivery errors */ + if (ee->e_parent == NULL || !bitset(EF_RESPONSE, ee->e_parent->e_flags)) + return 0; + for (q = ee->e_sendqueue; q != NULL; q = q->q_next) + { + if (bitset(QSENT, q->q_flags)) + return 0; + } + return -1; } /* ** ERRBODY -- output the body of an error message. @@ -574,6 +646,8 @@ returntosender(msg, returnq, sendbody, e) ** Parameters: ** mci -- the mailer connection information. ** e -- the envelope we are working in. +** separator -- any possible MIME separator. +** flags -- to modify the behaviour. ** ** Returns: ** none @@ -582,16 +656,25 @@ returntosender(msg, returnq, sendbody, e) ** Outputs the body of an error message. */ -errbody(mci, e) +void +errbody(mci, e, separator) register MCI *mci; register ENVELOPE *e; + char *separator; { register FILE *xfile; char *p; register ADDRESS *q; bool printheader; + bool sendbody; char buf[MAXLINE]; + extern char *xuntextify(); + if (bitset(MCIF_INHEADER, mci->mci_flags)) + { + putline("", mci); + mci->mci_flags &= ~MCIF_INHEADER; + } if (e->e_parent == NULL) { syserr("errbody: null parent"); @@ -635,7 +718,7 @@ errbody(mci, e) sprintf(buf, "The original message was received at %s", arpadate(ctime(&e->e_parent->e_ctime))); putline(buf, mci); - expand("from \201_", buf, &buf[sizeof buf - 1], e->e_parent); + expand("from \201_", buf, sizeof buf, e->e_parent); putline(buf, mci); putline("", mci); @@ -643,7 +726,7 @@ errbody(mci, e) ** Output error message header (if specified and available). */ - if (ErrMsgFile != NULL) + if (ErrMsgFile != NULL && !bitset(EF_SENDRECEIPT, e->e_parent->e_flags)) { if (*ErrMsgFile == '/') { @@ -652,7 +735,7 @@ errbody(mci, e) { while (fgets(buf, sizeof buf, xfile) != NULL) { - expand(buf, buf, &buf[sizeof buf - 1], e); + expand(buf, buf, sizeof buf, e); putline(buf, mci); } (void) fclose(xfile); @@ -661,7 +744,7 @@ errbody(mci, e) } else { - expand(ErrMsgFile, buf, &buf[sizeof buf - 1], e); + expand(ErrMsgFile, buf, sizeof buf, e); putline(buf, mci); putline("", mci); } @@ -674,27 +757,46 @@ errbody(mci, e) printheader = TRUE; for (q = e->e_parent->e_sendqueue; q != NULL; q = q->q_next) { - if (bitset(QBADADDR|QREPORT, q->q_flags)) + if (bitset(QBADADDR, q->q_flags)) { - if (printheader) - { - putline(" ----- The following addresses had delivery problems -----", - mci); - printheader = FALSE; - } - strcpy(buf, q->q_paddr); - if (bitset(QBADADDR, q->q_flags)) - strcat(buf, " (unrecoverable error)"); + if (!bitset(QPINGONFAILURE, q->q_flags)) + continue; + p = "unrecoverable error"; + } + else if (!bitset(QPRIMARY, q->q_flags)) + continue; + else if (bitset(QDELAYED, q->q_flags)) + p = "transient failure"; + else if (!bitset(QPINGONSUCCESS, q->q_flags)) + continue; + else if (bitset(QRELAYED, q->q_flags)) + p = "relayed to non-DSN-aware mailer"; + else if (bitset(QDELIVERED, q->q_flags)) + { + if (bitset(QEXPANDED, q->q_flags)) + p = "successfully delivered to mailing list"; else - strcat(buf, " (transient failure)"); + p = "successfully delivered to mailbox"; + } + else if (bitset(QEXPANDED, q->q_flags)) + p = "expanded by alias"; + else + continue; + + if (printheader) + { + putline(" ----- The following addresses have delivery notifications -----", + mci); + printheader = FALSE; + } + + sprintf(buf, "%s (%s)", shortenstring(q->q_paddr, 203), p); + putline(buf, mci); + if (q->q_alias != NULL) + { + sprintf(buf, " (expanded from: %s)", + shortenstring(q->q_alias->q_paddr, 203)); putline(buf, mci); - if (q->q_alias != NULL) - { - strcpy(buf, " (expanded from: "); - strcat(buf, q->q_alias->q_paddr); - strcat(buf, ")"); - putline(buf, mci); - } } } if (!printheader) @@ -713,46 +815,256 @@ errbody(mci, e) } else { - putline(" ----- Transcript of session follows -----\n", mci); + printheader = TRUE; if (e->e_xfp != NULL) (void) fflush(e->e_xfp); while (fgets(buf, sizeof buf, xfile) != NULL) + { + if (printheader) + putline(" ----- Transcript of session follows -----\n", mci); + printheader = FALSE; putline(buf, mci); + } (void) xfclose(xfile, "errbody xscript", p); } errno = 0; +#if DSN + /* + ** Output machine-readable version. + */ + + if (e->e_msgboundary != NULL) + { + putline("", mci); + (void) sprintf(buf, "--%s", e->e_msgboundary); + putline(buf, mci); + putline("Content-Type: message/delivery-status", mci); + putline("", mci); + + /* + ** Output per-message information. + */ + + /* original envelope id from MAIL FROM: line */ + if (e->e_parent->e_envid != NULL) + { + (void) sprintf(buf, "Original-Envelope-Id: %.800s", + xuntextify(e->e_parent->e_envid)); + putline(buf, mci); + } + + /* Reporting-MTA: is us (required) */ + (void) sprintf(buf, "Reporting-MTA: dns; %.800s", MyHostName); + putline(buf, mci); + + /* DSN-Gateway: not relevant since we are not translating */ + + /* Received-From-MTA: shows where we got this message from */ + if (RealHostName != NULL) + { + /* XXX use $s for type? */ + if (e->e_parent->e_from.q_mailer == NULL || + (p = e->e_parent->e_from.q_mailer->m_mtatype) == NULL) + p = "dns"; + (void) sprintf(buf, "Received-From-MTA: %s; %.800s", + p, RealHostName); + putline(buf, mci); + } + + /* Arrival-Date: -- when it arrived here */ + (void) sprintf(buf, "Arrival-Date: %s", + arpadate(ctime(&e->e_parent->e_ctime))); + putline(buf, mci); + + /* + ** Output per-address information. + */ + + for (q = e->e_parent->e_sendqueue; q != NULL; q = q->q_next) + { + register ADDRESS *r; + char *action; + + if (bitset(QBADADDR, q->q_flags)) + action = "failed"; + else if (!bitset(QPRIMARY, q->q_flags)) + continue; + else if (bitset(QDELIVERED, q->q_flags)) + { + if (bitset(QEXPANDED, q->q_flags)) + action = "delivered (to mailing list)"; + else + action = "delivered (to mailbox)"; + } + else if (bitset(QRELAYED, q->q_flags)) + action = "relayed (to non-DSN-aware mailer)"; + else if (bitset(QEXPANDED, q->q_flags)) + action = "expanded (to multi-recipient alias)"; + else if (bitset(QDELAYED, q->q_flags)) + action = "delayed"; + else + continue; + + putline("", mci); + + /* Original-Recipient: -- passed from on high */ + if (q->q_orcpt != NULL) + { + (void) sprintf(buf, "Original-Recipient: %.800s", + q->q_orcpt); + putline(buf, mci); + } + + /* Final-Recipient: -- the name from the RCPT command */ + p = e->e_parent->e_from.q_mailer->m_addrtype; + if (p == NULL) + p = "rfc822"; + for (r = q; r->q_alias != NULL; r = r->q_alias) + continue; + if (strchr(r->q_user, '@') == NULL) + { + (void) sprintf(buf, "Final-Recipient: %s; %.700s@%.100s", + p, r->q_user, MyHostName); + } + else + { + (void) sprintf(buf, "Final-Recipient: %s; %.800s", + p, r->q_user); + } + putline(buf, mci); + + /* X-Actual-Recipient: -- the real problem address */ + if (r != q && q->q_user[0] != '\0') + { + if (strchr(q->q_user, '@') == NULL) + { + (void) sprintf(buf, "X-Actual-Recipient: %s; %.700s@%.100s", + p, q->q_user, MyHostName); + } + else + { + (void) sprintf(buf, "X-Actual-Recipient: %s; %.800s", + p, q->q_user); + } + putline(buf, mci); + } + + /* Action: -- what happened? */ + sprintf(buf, "Action: %s", action); + putline(buf, mci); + + /* Status: -- what _really_ happened? */ + strcpy(buf, "Status: "); + if (q->q_status != NULL) + strcat(buf, q->q_status); + else if (bitset(QBADADDR, q->q_flags)) + strcat(buf, "5.0.0"); + else if (bitset(QQUEUEUP, q->q_flags)) + strcat(buf, "4.0.0"); + else + strcat(buf, "2.0.0"); + putline(buf, mci); + + /* Remote-MTA: -- who was I talking to? */ + if (q->q_statmta != NULL) + { + if (q->q_mailer == NULL || + (p = q->q_mailer->m_mtatype) == NULL) + p = "dns"; + (void) sprintf(buf, "Remote-MTA: %s; %.800s", + p, q->q_statmta); + p = &buf[strlen(buf) - 1]; + if (*p == '.') + *p = '\0'; + putline(buf, mci); + } + + /* Diagnostic-Code: -- actual result from other end */ + if (q->q_rstatus != NULL) + { + p = q->q_mailer->m_diagtype; + if (p == NULL) + p = "smtp"; + (void) sprintf(buf, "Diagnostic-Code: %s; %.800s", + p, q->q_rstatus); + putline(buf, mci); + } + + /* Last-Attempt-Date: -- fine granularity */ + if (q->q_statdate == (time_t) 0L) + q->q_statdate = curtime(); + (void) sprintf(buf, "Last-Attempt-Date: %s", + arpadate(ctime(&q->q_statdate))); + putline(buf, mci); + + /* Will-Retry-Until: -- for delayed messages only */ + if (bitset(QQUEUEUP, q->q_flags) && + !bitset(QBADADDR, q->q_flags)) + { + time_t xdate; + + xdate = e->e_parent->e_ctime + + TimeOuts.to_q_return[e->e_parent->e_timeoutclass]; + sprintf(buf, "Will-Retry-Until: %s", + arpadate(ctime(&xdate))); + putline(buf, mci); + } + } + } +#endif + /* ** Output text of original message */ - if (NoReturn) - SendBody = FALSE; putline("", mci); - if (e->e_parent->e_df != NULL) + if (bitset(EF_HAS_DF, e->e_parent->e_flags)) { - if (SendBody) - putline(" ----- Original message follows -----\n", mci); - else - putline(" ----- Message header follows -----\n", mci); - (void) fflush(mci->mci_out); + sendbody = !bitset(EF_NO_BODY_RETN, e->e_parent->e_flags) && + !bitset(EF_NO_BODY_RETN, e->e_flags); - if (e->e_msgboundary != NULL) + if (e->e_msgboundary == NULL) + { + if (sendbody) + putline(" ----- Original message follows -----\n", mci); + else + putline(" ----- Message header follows -----\n", mci); + (void) fflush(mci->mci_out); + } + else { - putline("", mci); (void) sprintf(buf, "--%s", e->e_msgboundary); + putline(buf, mci); - putline("Content-Type: message/rfc822", mci); - putline("", mci); + (void) sprintf(buf, "Content-Type: %s", + sendbody ? "message/rfc822" + : "text/rfc822-headers"); + putline(buf, mci); + + p = hvalue("Content-Transfer-Encoding", e->e_parent->e_header); + if (p != NULL && strcasecmp(p, "binary") != 0) + p = NULL; + if (p == NULL && bitset(EF_HAS8BIT, e->e_parent->e_flags)) + p = "8bit"; + if (p != NULL) + { + (void) sprintf(buf, "Content-Transfer-Encoding: %s", + p); + putline(buf, mci); + } } - putheader(mci, e->e_parent); putline("", mci); - if (SendBody) + putheader(mci, e->e_parent->e_header, e->e_parent); + if (sendbody) putbody(mci, e->e_parent, e->e_msgboundary); - else + else if (e->e_msgboundary == NULL) + { + putline("", mci); putline(" ----- Message body suppressed -----", mci); + } } - else + else if (e->e_msgboundary == NULL) { putline(" ----- No message was collected -----\n", mci); } @@ -773,8 +1085,250 @@ errbody(mci, e) syserr("errbody: I/O error"); } /* -** PRUNEROUTE -- prune an RFC-822 source route +** SMTPTODSN -- convert SMTP to DSN status code ** +** Parameters: +** smtpstat -- the smtp status code (e.g., 550). +** +** Returns: +** The DSN version of the status code. +*/ + +char * +smtptodsn(smtpstat) + int smtpstat; +{ + if (smtpstat < 0) + return "4.4.2"; + + switch (smtpstat) + { + case 450: /* Req mail action not taken: mailbox unavailable */ + return "4.2.0"; + + case 451: /* Req action aborted: local error in processing */ + return "4.3.0"; + + case 452: /* Req action not taken: insufficient sys storage */ + return "4.3.1"; + + case 500: /* Syntax error, command unrecognized */ + return "5.5.2"; + + case 501: /* Syntax error in parameters or arguments */ + return "5.5.4"; + + case 502: /* Command not implemented */ + return "5.5.1"; + + case 503: /* Bad sequence of commands */ + return "5.5.1"; + + case 504: /* Command parameter not implemented */ + return "5.5.4"; + + case 550: /* Req mail action not taken: mailbox unavailable */ + return "5.2.0"; + + case 551: /* User not local; please try <...> */ + return "5.1.6"; + + case 552: /* Req mail action aborted: exceeded storage alloc */ + return "5.2.2"; + + case 553: /* Req action not taken: mailbox name not allowed */ + return "5.1.3"; + + case 554: /* Transaction failed */ + return "5.0.0"; + } + + if ((smtpstat / 100) == 2) + return "2.0.0"; + if ((smtpstat / 100) == 4) + return "4.0.0"; + return "5.0.0"; +} +/* +** XTEXTIFY -- take regular text and turn it into DSN-style xtext +** +** Parameters: +** t -- the text to convert. +** +** Returns: +** The xtext-ified version of the same string. +*/ + +char * +xtextify(t) + register char *t; +{ + register char *p; + int l; + int nbogus; + static char *bp = NULL; + static int bplen = 0; + + /* figure out how long this xtext will have to be */ + nbogus = l = 0; + for (p = t; *p != '\0'; p++) + { + register int c = (*p & 0xff); + + /* ASCII dependence here -- this is the way the spec words it */ + if (c < '!' || c > '~' || c == '+' || c == '\\' || c == '(') + nbogus++; + l++; + } + if (nbogus == 0) + return t; + l += nbogus * 2 + 1; + + /* now allocate space if necessary for the new string */ + if (l > bplen) + { + if (bp != NULL) + free(bp); + bp = xalloc(l); + bplen = l; + } + + /* ok, copy the text with byte expansion */ + for (p = bp; *t != '\0'; ) + { + register int c = (*t++ & 0xff); + + /* ASCII dependence here -- this is the way the spec words it */ + if (c < '!' || c > '~' || c == '+' || c == '\\' || c == '(') + { + *p++ = '+'; + *p++ = "0123456789abcdef"[c >> 4]; + *p++ = "0123456789abcdef"[c & 0xf]; + } + else + *p++ = c; + } + *p = '\0'; + return bp; +} +/* +** XUNTEXTIFY -- take xtext and turn it into plain text +** +** Parameters: +** t -- the xtextified text. +** +** Returns: +** The decoded text. No attempt is made to deal with +** null strings in the resulting text. +*/ + +char * +xuntextify(t) + register char *t; +{ + register char *p; + int l; + static char *bp = NULL; + static int bplen = 0; + + /* heuristic -- if no plus sign, just return the input */ + if (strchr(t, '+') == NULL) + return t; + + /* xtext is always longer than decoded text */ + l = strlen(t); + if (l > bplen) + { + if (bp != NULL) + free(bp); + bp = xalloc(l); + bplen = l; + } + + /* ok, copy the text with byte compression */ + for (p = bp; *t != '\0'; t++) + { + register int c = *t & 0xff; + + if (c != '+') + { + *p++ = c; + continue; + } + + c = *++t & 0xff; + if (!isascii(c) || !isxdigit(c)) + { + /* error -- first digit is not hex */ + usrerr("bogus xtext: +%c", c); + t--; + continue; + } + if (isdigit(c)) + c -= '0'; + else if (isupper(c)) + c -= 'A' - 10; + else + c -= 'a' - 10; + *p = c << 4; + + c = *++t & 0xff; + if (!isascii(c) || !isxdigit(c)) + { + /* error -- second digit is not hex */ + usrerr("bogus xtext: +%x%c", *p >> 4, c); + t--; + continue; + } + if (isdigit(c)) + c -= '0'; + else if (isupper(c)) + c -= 'A' - 10; + else + c -= 'a' - 10; + *p++ |= c; + } + return bp; +} +/* +** XTEXTOK -- check if a string is legal xtext +** +** Xtext is used in Delivery Status Notifications. The spec was +** taken from draft-ietf-notary-mime-delivery-04.txt. +** +** Parameters: +** s -- the string to check. +** +** Returns: +** TRUE -- if 's' is legal xtext. +** FALSE -- if it has any illegal characters in it. +*/ + +bool +xtextok(s) + char *s; +{ + int c; + + while ((c = *s++) != '\0') + { + if (c == '+') + { + c = *s++; + if (!isascii(c) || !isxdigit(c)) + return FALSE; + c = *s++; + if (!isascii(c) || !isxdigit(c)) + return FALSE; + } + else if (c < '!' || c > '~' || c == '=') + return FALSE; + } + return TRUE; +} +/* +** PRUNEROUTE -- prune an RFC-822 source route +** ** Trims down a source route to the last internet-registered hop. ** This is encouraged by RFC 1123 section 5.3.3. ** @@ -789,6 +1343,7 @@ errbody(mci, e) ** modifies addr in-place */ +bool pruneroute(addr) char *addr; { diff --git a/usr.sbin/sendmail/src/sendmail.8 b/usr.sbin/sendmail/src/sendmail.8 index ee0f700d83a0e..58060deeeaca2 100644 --- a/usr.sbin/sendmail/src/sendmail.8 +++ b/usr.sbin/sendmail/src/sendmail.8 @@ -29,9 +29,9 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" @(#)sendmail.8 8.4 (Berkeley) 12/11/93 +.\" @(#)sendmail.8 8.6 (Berkeley) 5/27/95 .\" -.Dd December 11, 1993 +.Dd May 27, 1995 .Dt SENDMAIL 8 .Os BSD 4 .Sh NAME @@ -209,6 +209,18 @@ is specified, will run in background. This option can be used safely with .Fl bd . +.It Fl qI Ns Ar substr +Limit processed jobs to those containing +.Ar substr +as a substring of the queue id. +.It Fl qR Ns Ar substr +Limit processed jobs to those containing +.Ar substr +as a substring of one of the recipients. +.It Fl qS Ns Ar substr +Limit processed jobs to those containing +.Ar substr +as a substring of the sender. .It Fl r Ns Ar name An alternate and obsolete form of the .Fl f @@ -259,6 +271,7 @@ successful deliveries (default 10). This avoids excessive duplicate deliveries when sending to long mailing lists interrupted by system crashes. +.ne 1i .It Li d Ns Ar x Set the delivery mode to .Ar x . @@ -461,7 +474,7 @@ raw data for alias names data base of alias names .It Pa /etc/sendmail.cf configuration file -.It Pa /etc/sendmail.hf +.It Pa /usr/share/misc/sendmail.hf help file .It Pa /var/log/sendmail.st collected statistics @@ -471,13 +484,13 @@ temp files The process id of the daemon .El .Sh SEE ALSO -.Xr binmail 1 , .Xr mail 1 , -.Xr rmail 1 , .Xr syslog 3 , .Xr aliases 5 , .Xr mailaddr 7 , -.Xr rc 8 ; +.Xr mail.local 8 , +.Xr rc 8 , +.Xr rmail 8 ; .Pp DARPA Internet Request For Comments diff --git a/usr.sbin/sendmail/src/sendmail.h b/usr.sbin/sendmail/src/sendmail.h index e61ebfbc248d5..66c75764a5f10 100644 --- a/usr.sbin/sendmail/src/sendmail.h +++ b/usr.sbin/sendmail/src/sendmail.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 1983 Eric P. Allman + * Copyright (c) 1983, 1995 Eric P. Allman * Copyright (c) 1988, 1993 * The Regents of the University of California. All rights reserved. * @@ -31,7 +31,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * @(#)sendmail.h 8.43.1.3 (Berkeley) 3/5/95 + * @(#)sendmail.h 8.159 (Berkeley) 11/18/95 */ /* @@ -41,7 +41,7 @@ # ifdef _DEFINE # define EXTERN # ifndef lint -static char SmailSccsId[] = "@(#)sendmail.h 8.43.1.3 3/5/95"; +static char SmailSccsId[] = "@(#)sendmail.h 8.159 11/18/95"; # endif # else /* _DEFINE */ # define EXTERN extern @@ -53,10 +53,13 @@ static char SmailSccsId[] = "@(#)sendmail.h 8.43.1.3 3/5/95"; # include <stdio.h> # include <ctype.h> # include <setjmp.h> -# include <sysexits.h> # include <string.h> # include <time.h> # include <errno.h> +# ifdef EX_OK +# undef EX_OK /* for SVr4.2 SMP */ +# endif +# include <sysexits.h> # include "conf.h" # include "useful.h" @@ -68,38 +71,42 @@ static char SmailSccsId[] = "@(#)sendmail.h 8.43.1.3 3/5/95"; # ifdef DAEMON # include <sys/socket.h> # endif -# ifdef NETUNIX +# if NETUNIX # include <sys/un.h> # endif -# ifdef NETINET +# if NETINET # include <netinet/in.h> # endif -# ifdef NETISO +# if NETISO # include <netiso/iso.h> # endif -# ifdef NETNS +# if NETNS # include <netns/ns.h> # endif -# ifdef NETX25 +# if NETX25 # include <netccitt/x25.h> # endif +/* forward references for prototypes */ +typedef struct envelope ENVELOPE; +typedef struct mailer MAILER; + /* ** Data structure for bit maps. ** ** Each bit in this map can be referenced by an ascii character. -** This is 128 possible bits, or 12 8-bit bytes. +** This is 256 possible bits, or 32 8-bit bytes. */ -#define BITMAPBYTES 16 /* number of bytes in a bit map */ +#define BITMAPBYTES 32 /* number of bytes in a bit map */ #define BYTEBITS 8 /* number of bits in a byte */ /* internal macros */ -#define _BITWORD(bit) (bit / (BYTEBITS * sizeof (int))) -#define _BITBIT(bit) (1 << (bit % (BYTEBITS * sizeof (int)))) +#define _BITWORD(bit) ((bit) / (BYTEBITS * sizeof (int))) +#define _BITBIT(bit) (1 << ((bit) % (BYTEBITS * sizeof (int)))) typedef int BITMAP[BITMAPBYTES / sizeof (int)]; @@ -126,7 +133,7 @@ struct address char *q_ruser; /* real user name, or NULL if q_user */ char *q_host; /* host name */ struct mailer *q_mailer; /* mailer to use */ - u_short q_flags; /* status flags, see below */ + u_long q_flags; /* status flags, see below */ uid_t q_uid; /* user-id of receiver (if known) */ gid_t q_gid; /* group-id of receiver (if known) */ char *q_home; /* home dir (local mailer only) */ @@ -135,25 +142,51 @@ struct address struct address *q_alias; /* address this results from */ char *q_owner; /* owner of q_alias */ struct address *q_tchain; /* temporary use chain */ - time_t q_timeout; /* timeout for this address */ + char *q_orcpt; /* ORCPT parameter from RCPT TO: line */ + char *q_status; /* status code for DSNs */ + char *q_rstatus; /* remote status message for DSNs */ + time_t q_statdate; /* date of status messages */ + char *q_statmta; /* MTA generating q_rstatus */ + short q_specificity; /* how "specific" this address is */ }; typedef struct address ADDRESS; -# define QDONTSEND 000001 /* don't send to this address */ -# define QBADADDR 000002 /* this address is verified bad */ -# define QGOODUID 000004 /* the q_uid q_gid fields are good */ -# define QPRIMARY 000010 /* set from argv */ -# define QQUEUEUP 000020 /* queue for later transmission */ -# define QSENT 000040 /* has been successfully delivered */ -# define QNOTREMOTE 000100 /* not an address for remote forwarding */ -# 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 QDONTSEND 0x00000001 /* don't send to this address */ +# define QBADADDR 0x00000002 /* this address is verified bad */ +# define QGOODUID 0x00000004 /* the q_uid q_gid fields are good */ +# define QPRIMARY 0x00000008 /* set from RCPT or argv */ +# define QQUEUEUP 0x00000010 /* queue for later transmission */ +# define QSENT 0x00000020 /* has been successfully delivered */ +# define QNOTREMOTE 0x00000040 /* address not for remote forwarding */ +# define QSELFREF 0x00000080 /* this address references itself */ +# define QVERIFIED 0x00000100 /* verified, but not expanded */ +# define QBOGUSSHELL 0x00000400 /* user has no valid shell listed */ +# define QUNSAFEADDR 0x00000800 /* address aquired via unsafe path */ +# define QPINGONSUCCESS 0x00001000 /* give return on successful delivery */ +# define QPINGONFAILURE 0x00002000 /* give return on failure */ +# define QPINGONDELAY 0x00004000 /* give return on message delay */ +# define QHASNOTIFY 0x00008000 /* propogate notify parameter */ +# define QRELAYED 0x00010000 /* DSN: relayed to non-DSN aware sys */ +# define QEXPANDED 0x00020000 /* DSN: undergone list expansion */ +# define QDELIVERED 0x00040000 /* DSN: successful final delivery */ +# define QDELAYED 0x00080000 /* DSN: message delayed */ +# define QTHISPASS 0x80000000 /* temp: address set this pass */ # define NULLADDR ((ADDRESS *) NULL) + +/* functions */ +extern ADDRESS *parseaddr __P((char *, ADDRESS *, int, int, char **, ENVELOPE *)); +extern ADDRESS *recipient __P((ADDRESS *, ADDRESS **, int, ENVELOPE *)); +extern char **prescan __P((char *, int, char[], int, char **, u_char *)); +extern int rewrite __P((char **, int, int, ENVELOPE *)); +extern char *remotename __P((char *, MAILER *, int, int *, ENVELOPE *)); +extern ADDRESS *getctladdr __P((ADDRESS *)); +extern bool sameaddr __P((ADDRESS *, ADDRESS *)); +extern bool emptyaddr __P((ADDRESS *)); +extern void printaddr __P((ADDRESS *, bool)); +extern void cataddr __P((char **, char **, char *, int, int)); +extern int sendtolist __P((char *, ADDRESS *, ADDRESS **, int, ENVELOPE *)); /* ** Mailer definition structure. ** Every mailer known to the system is declared in this @@ -170,8 +203,12 @@ struct mailer { char *m_name; /* symbolic name of this mailer */ char *m_mailer; /* pathname of the mailer to use */ + char *m_mtatype; /* type of this MTA */ + char *m_addrtype; /* type for addresses */ + char *m_diagtype; /* type for diagnostics */ BITMAP m_flags; /* status flags, see below */ short m_mno; /* mailer number internally */ + short m_nice; /* niceness to run at (mostly for prog) */ char **m_argv; /* template argument vector */ short m_sh_rwset; /* rewrite set: sender header addresses */ short m_se_rwset; /* rewrite set: sender envelope addresses */ @@ -181,15 +218,18 @@ struct mailer long m_maxsize; /* size limit on message to this mailer */ int m_linelimit; /* max # characters per line */ char *m_execdir; /* directory to chdir to before execv */ + uid_t m_uid; /* UID to run as */ + gid_t m_gid; /* GID to run as */ + char *m_defcharset; /* default character set */ }; -typedef struct mailer MAILER; - /* bits for m_flags */ # define M_ESMTP 'a' /* run Extended SMTP protocol */ +# define M_ALIASABLE 'A' /* user can be LHS of an alias */ # define M_BLANKEND 'b' /* ensure blank line at end of message */ # define M_NOCOMMENT 'c' /* don't include comment part of address */ # define M_CANONICAL 'C' /* make addresses canonical "u@dom" */ +# define M_NOBRACKET 'd' /* never angle bracket envelope route-addrs */ /* 'D' CF: include Date: */ # define M_EXPENSIVE 'e' /* it costs to use this mailer.... */ # define M_ESCFROM 'E' /* escape From lines to >From */ @@ -198,25 +238,39 @@ typedef struct mailer MAILER; # define M_NO_NULL_FROM 'g' /* sender of errors should be $g */ # define M_HST_UPPER 'h' /* preserve host case distinction */ # define M_PREHEAD 'H' /* MAIL11V3: preview headers */ +# define M_UDBENVELOPE 'i' /* do udbsender rewriting on envelope */ # define M_INTERNAL 'I' /* SMTP to another sendmail site */ +# define M_UDBRECIPIENT 'j' /* do udbsender rewriting on recipient lines */ +# define M_NOLOOPCHECK 'k' /* don't check for loops in HELO command */ # define M_LOCALMAILER 'l' /* delivery is to this host */ # define M_LIMITS 'L' /* must enforce SMTP line limits */ # define M_MUSER 'm' /* can handle multiple users at once */ /* 'M' CF: include Message-Id: */ # define M_NHDR 'n' /* don't insert From line */ # define M_MANYSTATUS 'N' /* MAIL11V3: DATA returns multi-status */ +# define M_RUNASRCPT 'o' /* always run mailer as recipient */ # define M_FROMPATH 'p' /* use reverse-path in MAIL FROM: */ /* 'P' CF: include Return-Path: */ # define M_ROPT 'r' /* mailer takes picky -r flag */ # define M_SECURE_PORT 'R' /* try to send on a reserved TCP port */ # define M_STRIPQ 's' /* strip quote chars from user/host */ -# define M_RESTR 'S' /* must be daemon to execute */ +# define M_SPECIFIC_UID 'S' /* run as specific uid/gid */ # define M_USR_UPPER 'u' /* preserve user case distinction */ # define M_UGLYUUCP 'U' /* this wants an ugly UUCP from line */ +# define M_CONTENT_LEN 'v' /* add Content-Length: header (SVr4) */ /* 'V' UIUC: !-relativize all addresses */ +# define M_HASPWENT 'w' /* check for /etc/passwd entry */ /* 'x' CF: include Full-Name: */ # define M_XDOT 'X' /* use hidden-dot algorithm */ +# define M_EBCDIC '3' /* extend Q-P encoding for EBCDIC */ +# define M_TRYRULESET5 '5' /* use ruleset 5 after local aliasing */ # define M_7BITS '7' /* use 7-bit path */ +# define M_8BITS '8' /* force "just send 8" behaviour */ +# define M_MAKE8BIT '9' /* convert 7 -> 8 bit if appropriate */ +# define M_CHECKINCLUDE ':' /* check for :include: files */ +# define M_CHECKPROG '|' /* check for |program addresses */ +# define M_CHECKFILE '/' /* check for /file addresses */ +# define M_CHECKUDB '@' /* user can be user database key */ EXTERN MAILER *Mailer[MAXMAILERS+1]; @@ -255,18 +309,21 @@ struct hdrinfo extern struct hdrinfo HdrInfo[]; /* bits for h_flags and hi_flags */ -# define H_EOH 00001 /* this field terminates header */ -# define H_RCPT 00002 /* contains recipient addresses */ -# define H_DEFAULT 00004 /* if another value is found, drop this */ -# define H_RESENT 00010 /* this address is a "Resent-..." address */ -# define H_CHECK 00020 /* check h_mflags against m_flags */ -# define H_ACHECK 00040 /* ditto, but always (not just default) */ -# define H_FORCE 00100 /* force this field, even if default */ -# define H_TRACE 00200 /* this field contains trace information */ -# define H_FROM 00400 /* this is a from-type field */ -# define H_VALID 01000 /* this field has a validated value */ -# define H_RECEIPTTO 02000 /* this field has return receipt info */ -# define H_ERRORSTO 04000 /* this field has error address info */ +# define H_EOH 0x0001 /* this field terminates header */ +# define H_RCPT 0x0002 /* contains recipient addresses */ +# define H_DEFAULT 0x0004 /* if another value is found, drop this */ +# define H_RESENT 0x0008 /* this address is a "Resent-..." address */ +# define H_CHECK 0x0010 /* check h_mflags against m_flags */ +# define H_ACHECK 0x0020 /* ditto, but always (not just default) */ +# define H_FORCE 0x0040 /* force this field, even if default */ +# define H_TRACE 0x0080 /* this field contains trace information */ +# define H_FROM 0x0100 /* this is a from-type field */ +# define H_VALID 0x0200 /* this field has a validated value */ +# define H_RECEIPTTO 0x0400 /* this field has return receipt info */ +# define H_ERRORSTO 0x0800 /* this field has error address info */ +# define H_CTE 0x1000 /* this field is a content-transfer-encoding */ +# define H_CTYPE 0x2000 /* this is a content-type field */ +# define H_BCC 0x4000 /* Bcc: header: strip value or delete */ /* ** Information about currently open connections to mailers, or to ** hosts that we have looked up recently. @@ -288,20 +345,27 @@ MCI char *mci_phase; /* SMTP phase string */ struct mailer *mci_mailer; /* ptr to the mailer for this conn */ char *mci_host; /* host name */ + char *mci_status; /* DSN status to be copied to addrs */ time_t mci_lastuse; /* last usage time */ }; /* flag bits */ -#define MCIF_VALID 000001 /* this entry is valid */ -#define MCIF_TEMP 000002 /* don't cache this connection */ -#define MCIF_CACHED 000004 /* currently in open cache */ -#define MCIF_ESMTP 000010 /* this host speaks ESMTP */ -#define MCIF_EXPN 000020 /* EXPN command supported */ -#define MCIF_SIZE 000040 /* SIZE option supported */ -#define MCIF_8BITMIME 000100 /* BODY=8BITMIME supported */ -#define MCIF_7BIT 000200 /* strip this message to 7 bits */ -#define MCIF_MULTSTAT 000400 /* MAIL11V3: handles MULT status */ +#define MCIF_VALID 0x0001 /* this entry is valid */ +#define MCIF_TEMP 0x0002 /* don't cache this connection */ +#define MCIF_CACHED 0x0004 /* currently in open cache */ +#define MCIF_ESMTP 0x0008 /* this host speaks ESMTP */ +#define MCIF_EXPN 0x0010 /* EXPN command supported */ +#define MCIF_SIZE 0x0020 /* SIZE option supported */ +#define MCIF_8BITMIME 0x0040 /* BODY=8BITMIME supported */ +#define MCIF_7BIT 0x0080 /* strip this message to 7 bits */ +#define MCIF_MULTSTAT 0x0100 /* MAIL11V3: handles MULT status */ +#define MCIF_INHEADER 0x0200 /* currently outputing header */ +#define MCIF_CVT8TO7 0x0400 /* convert from 8 to 7 bits */ +#define MCIF_DSN 0x0800 /* DSN extension supported */ +#define MCIF_8BITOK 0x1000 /* OK to send 8 bit characters */ +#define MCIF_CVT7TO8 0x2000 /* convert from 7 to 8 bits */ +#define MCIF_INMIME 0x4000 /* currently reading MIME header */ /* states */ #define MCIS_CLOSED 0 /* no traffic on this connection */ @@ -311,6 +375,11 @@ MCI #define MCIS_QUITING 4 /* running quit protocol */ #define MCIS_SSD 5 /* service shutting down */ #define MCIS_ERROR 6 /* I/O error on connection */ + +/* functions */ +extern MCI *mci_get __P((char *, MAILER *)); +extern void mci_cache __P((MCI *)); +extern void mci_flush __P((bool, MCI *)); /* ** Envelope structure. ** This structure defines the message itself. There is usually @@ -320,9 +389,7 @@ MCI ** will have their own envelope. */ -# define ENVELOPE struct envelope - -ENVELOPE +struct envelope { HDR *e_header; /* head of header list */ long e_msgpriority; /* adjusted priority of this message */ @@ -342,14 +409,14 @@ ENVELOPE short e_nsent; /* number of sends since checkpoint */ short e_sendmode; /* message send mode */ short e_errormode; /* error return mode */ - int (*e_puthdr)__P((MCI *, ENVELOPE *)); + short e_timeoutclass; /* message timeout class */ + void (*e_puthdr)__P((MCI *, HDR *, ENVELOPE *)); /* function to put header of message */ - int (*e_putbody)__P((MCI *, ENVELOPE *, char *)); + void (*e_putbody)__P((MCI *, ENVELOPE *, char *)); /* function to put body of message */ struct envelope *e_parent; /* the message this one encloses */ struct envelope *e_sibling; /* the next envelope of interest */ char *e_bodytype; /* type of message body */ - char *e_df; /* location of temp file */ FILE *e_dfp; /* temporary file */ char *e_id; /* code for this entry in queue */ FILE *e_xfp; /* transcript file */ @@ -358,16 +425,23 @@ ENVELOPE char *e_statmsg; /* stat msg (changes per delivery) */ char *e_msgboundary; /* MIME-style message part boundary */ char *e_origrcpt; /* original recipient (one only) */ - char *e_macro[128]; /* macro definitions */ + char *e_envid; /* envelope id from MAIL FROM: line */ + char *e_status; /* DSN status for this message */ + time_t e_dtime; /* time of last delivery attempt */ + int e_ntries; /* number of delivery attempts */ + dev_t e_dfdev; /* df file's device, for crash recov */ + ino_t e_dfino; /* df file's ino, for crash recovery */ + char *e_macro[256]; /* macro definitions */ }; /* 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_NO_BODY_RETN 0x0000004 /* omit message body on error */ #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_DELETE_BCC 0x0000040 /* delete Bcc: headers entirely */ #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) */ @@ -378,8 +452,23 @@ ENVELOPE #define EF_METOO 0x0004000 /* send to me too */ #define EF_LOGSENDER 0x0008000 /* need to log the sender */ #define EF_NORECEIPT 0x0010000 /* suppress all return-receipts */ +#define EF_HAS8BIT 0x0020000 /* at least one 8-bit char in body */ +#define EF_NL_NOT_EOL 0x0040000 /* don't accept raw NL as EOLine */ +#define EF_CRLF_NOT_EOL 0x0080000 /* don't accept CR-LF as EOLine */ +#define EF_RET_PARAM 0x0100000 /* RCPT command had RET argument */ +#define EF_HAS_DF 0x0200000 /* set when df file is instantiated */ +#define EF_IS_MIME 0x0400000 /* really is a MIME message */ +#define EF_DONT_MIME 0x0800000 /* never MIME this message */ EXTERN ENVELOPE *CurEnv; /* envelope currently being processed */ + +/* functions */ +extern ENVELOPE *newenvelope __P((ENVELOPE *, ENVELOPE *)); +extern void dropenvelope __P((ENVELOPE *)); +extern void clearenvelope __P((ENVELOPE *, bool)); + +extern void putheader __P((MCI *, HDR *, ENVELOPE *)); +extern void putbody __P((MCI *, ENVELOPE *, char *)); /* ** Message priority classes. ** @@ -434,35 +523,35 @@ EXTERN struct rewrite *RewriteRules[MAXRWSETS]; */ /* left hand side items */ -# define MATCHZANY 0220 /* match zero or more tokens */ -# define MATCHANY 0221 /* match one or more tokens */ -# define MATCHONE 0222 /* match exactly one token */ -# define MATCHCLASS 0223 /* match one token in a class */ -# define MATCHNCLASS 0224 /* match anything not in class */ -# define MATCHREPL 0225 /* replacement on RHS for above */ +# define MATCHZANY ((u_char)0220) /* match zero or more tokens */ +# define MATCHANY ((u_char)0221) /* match one or more tokens */ +# define MATCHONE ((u_char)0222) /* match exactly one token */ +# define MATCHCLASS ((u_char)0223) /* match one token in a class */ +# define MATCHNCLASS ((u_char)0224) /* match anything not in class */ +# define MATCHREPL ((u_char)0225) /* replacement on RHS for above */ /* right hand side items */ -# define CANONNET 0226 /* canonical net, next token */ -# define CANONHOST 0227 /* canonical host, next token */ -# define CANONUSER 0230 /* canonical user, next N tokens */ -# define CALLSUBR 0231 /* call another rewriting set */ +# define CANONNET ((u_char)0226) /* canonical net, next token */ +# define CANONHOST ((u_char)0227) /* canonical host, next token */ +# define CANONUSER ((u_char)0230) /* canonical user, next N tokens */ +# define CALLSUBR ((u_char)0231) /* call another rewriting set */ /* conditionals in macros */ -# define CONDIF 0232 /* conditional if-then */ -# define CONDELSE 0233 /* conditional else */ -# define CONDFI 0234 /* conditional fi */ +# define CONDIF ((u_char)0232) /* conditional if-then */ +# define CONDELSE ((u_char)0233) /* conditional else */ +# define CONDFI ((u_char)0234) /* conditional fi */ /* bracket characters for host name lookup */ -# define HOSTBEGIN 0235 /* hostname lookup begin */ -# define HOSTEND 0236 /* hostname lookup end */ +# define HOSTBEGIN ((u_char)0235) /* hostname lookup begin */ +# define HOSTEND ((u_char)0236) /* hostname lookup end */ /* bracket characters for generalized lookup */ -# define LOOKUPBEGIN 0205 /* generalized lookup begin */ -# define LOOKUPEND 0206 /* generalized lookup end */ +# define LOOKUPBEGIN ((u_char)0205) /* generalized lookup begin */ +# define LOOKUPEND ((u_char)0206) /* generalized lookup end */ /* macro substitution character */ -# define MACROEXPAND 0201 /* macro expansion */ -# define MACRODEXPAND 0202 /* deferred macro expansion */ +# define MACROEXPAND ((u_char)0201) /* macro expansion */ +# define MACRODEXPAND ((u_char)0202) /* deferred macro expansion */ /* to make the code clearer */ # define MATCHZERO CANONHOST @@ -473,6 +562,16 @@ struct metamac char metaname; /* external code (after $) */ u_char metaval; /* internal code (as above) */ }; + +/* values for macros with external names only */ +# define MID_OPMODE 0202 /* operation mode */ + +/* functions */ +extern void expand __P((char *, char *, size_t, ENVELOPE *)); +extern void define __P((int, char *, ENVELOPE *)); +extern char *macvalue __P((int, ENVELOPE *)); +extern char *macname __P((int)); +extern int macid __P((char *, char **)); /* ** Name canonification short circuit. ** @@ -505,6 +604,7 @@ NAMECANON # define MAPCLASS struct _mapclass # define MAP struct _map +# define MAXMAPACTIONS 3 /* size of map_actions array */ /* @@ -515,32 +615,47 @@ MAP { MAPCLASS *map_class; /* the class of this map */ char *map_mname; /* name of this map */ - int map_mflags; /* flags, see below */ + long map_mflags; /* flags, see below */ char *map_file; /* the (nominal) filename */ ARBPTR_T map_db1; /* the open database ptr */ ARBPTR_T map_db2; /* an "extra" database pointer */ + char *map_keycolnm; /* key column name */ + char *map_valcolnm; /* value column name */ + u_char map_keycolno; /* key column number */ + u_char map_valcolno; /* value column number */ + char map_coldelim; /* column delimiter */ char *map_app; /* to append to successful matches */ char *map_domain; /* the (nominal) NIS domain */ char *map_rebuild; /* program to run to do auto-rebuild */ time_t map_mtime; /* last database modification time */ + short map_specificity; /* specificity of alaases */ + MAP *map_stack[MAXMAPSTACK]; /* list for stacked maps */ + short map_return[MAXMAPACTIONS]; /* return bitmaps for stacked maps */ }; -/* bit values for map_flags */ -# define MF_VALID 0x0001 /* this entry is valid */ -# define MF_INCLNULL 0x0002 /* include null byte in key */ -# define MF_OPTIONAL 0x0004 /* don't complain if map not found */ -# define MF_NOFOLDCASE 0x0008 /* don't fold case in keys */ -# define MF_MATCHONLY 0x0010 /* don't use the map value */ -# define MF_OPEN 0x0020 /* this entry is open */ -# define MF_WRITABLE 0x0040 /* open for writing */ -# define MF_ALIAS 0x0080 /* this is an alias file */ -# define MF_TRY0NULL 0x0100 /* try with no null byte */ -# define MF_TRY1NULL 0x0200 /* try with the null byte */ -# define MF_LOCKED 0x0400 /* this map is currently locked */ -# define MF_ALIASWAIT 0x0800 /* alias map in aliaswait state */ -# define MF_IMPL_HASH 0x1000 /* implicit: underlying hash database */ -# define MF_IMPL_NDBM 0x2000 /* implicit: underlying NDBM database */ - +/* bit values for map_mflags */ +# define MF_VALID 0x00000001 /* this entry is valid */ +# define MF_INCLNULL 0x00000002 /* include null byte in key */ +# define MF_OPTIONAL 0x00000004 /* don't complain if map not found */ +# define MF_NOFOLDCASE 0x00000008 /* don't fold case in keys */ +# define MF_MATCHONLY 0x00000010 /* don't use the map value */ +# define MF_OPEN 0x00000020 /* this entry is open */ +# define MF_WRITABLE 0x00000040 /* open for writing */ +# define MF_ALIAS 0x00000080 /* this is an alias file */ +# define MF_TRY0NULL 0x00000100 /* try with no null byte */ +# define MF_TRY1NULL 0x00000200 /* try with the null byte */ +# define MF_LOCKED 0x00000400 /* this map is currently locked */ +# define MF_ALIASWAIT 0x00000800 /* alias map in aliaswait state */ +# define MF_IMPL_HASH 0x00001000 /* implicit: underlying hash database */ +# define MF_IMPL_NDBM 0x00002000 /* implicit: underlying NDBM database */ +# define MF_UNSAFEDB 0x00004000 /* this map is world writable */ +# define MF_APPEND 0x00008000 /* append new entry on rebuiled */ +# define MF_KEEPQUOTES 0x00010000 /* don't dequote key before lookup */ + +/* indices for map_actions */ +# define MA_NOTFOUND 0 /* member map returned "not found" */ +# define MA_UNAVAIL 1 /* member map is not available */ +# define MA_TRYAGAIN 2 /* member map returns temp failure */ /* ** The class of a map -- essentially the functions to call @@ -567,6 +682,11 @@ MAPCLASS #define MCF_ALIASOK 0x0001 /* can be used for aliases */ #define MCF_ALIASONLY 0x0002 /* usable only for aliases */ #define MCF_REBUILDABLE 0x0004 /* can rebuild alias files */ +#define MCF_OPTFILE 0x0008 /* file name is optional */ + +/* functions */ +extern char *map_rewrite __P((MAP *, char *, int, char **)); +extern MAP *makemapentry __P((char *)); /* ** Symbol table definitions */ @@ -587,6 +707,8 @@ struct symtab char *sv_hostsig; /* host signature */ MCI sv_mci; /* mailer connection info */ NAMECANON sv_namecanon; /* canonical name cache */ + int sv_macro; /* macro name => id mapping */ + int sv_ruleset; /* ruleset index */ } s_value; }; @@ -602,6 +724,8 @@ typedef struct symtab STAB; # define ST_MAP 6 /* mapping function */ # define ST_HOSTSIG 7 /* host signature */ # define ST_NAMECANON 8 /* cached canonical name */ +# define ST_MACRO 9 /* macro name to id mapping */ +# define ST_RULESET 10 /* ruleset index */ # define ST_MCI 16 /* mailer connection info (offset) */ # define s_class s_value.sv_class @@ -613,6 +737,8 @@ typedef struct symtab STAB; # define s_hostsig s_value.sv_hostsig # define s_map s_value.sv_map # define s_namecanon s_value.sv_namecanon +# define s_macro s_value.sv_macro +# define s_ruleset s_value.sv_ruleset extern STAB *stab __P((char *, int, int)); extern void stabapply __P((void (*)(STAB *, int), int)); @@ -632,7 +758,7 @@ extern void stabapply __P((void (*)(STAB *, int), int)); struct event { time_t ev_time; /* time of the function call */ - int (*ev_func)__P((int)); + void (*ev_func)__P((int)); /* function to call */ int ev_arg; /* argument to ev_func */ int ev_pid; /* pid that set this event */ @@ -642,8 +768,12 @@ struct event typedef struct event EVENT; EXTERN EVENT *EventQueue; /* head of event queue */ + +/* functions */ +extern EVENT *setevent __P((time_t, void(*)(), int)); +extern void clrevent __P((EVENT *)); /* -** Operation, send, and error modes +** Operation, send, error, and MIME modes ** ** The operation mode describes the basic operation of sendmail. ** This can be set from the command line, and is "send mail" by @@ -673,9 +803,9 @@ EXTERN char OpMode; /* operation mode, see below */ /* values for e_sendmode -- send modes */ #define SM_DELIVER 'i' /* interactive delivery */ -#define SM_QUICKD 'j' /* deliver w/o queueing */ #define SM_FORK 'b' /* deliver in background */ #define SM_QUEUE 'q' /* queue, don't deliver */ +#define SM_DEFER 'd' /* defer map lookups as well as queue */ #define SM_VERIFY 'v' /* verify only (used internally) */ /* used only as a parameter to sendall */ @@ -688,6 +818,37 @@ EXTERN char OpMode; /* operation mode, see below */ #define EM_WRITE 'w' /* write back errors */ #define EM_BERKNET 'e' /* special berknet processing */ #define EM_QUIET 'q' /* don't print messages (stat only) */ + + +/* MIME processing mode */ +EXTERN int MimeMode; + +/* bit values for MimeMode */ +#define MM_CVTMIME 0x0001 /* convert 8 to 7 bit MIME */ +#define MM_PASS8BIT 0x0002 /* just send 8 bit data blind */ +#define MM_MIME8BIT 0x0004 /* convert 8-bit data to MIME */ + +/* queue sorting order algorithm */ +EXTERN int QueueSortOrder; + +#define QS_BYPRIORITY 0 /* sort by message priority */ +#define QS_BYHOST 1 /* sort by first host name */ + + +/* how to handle messages without any recipient addresses */ +EXTERN int NoRecipientAction; + +#define NRA_NO_ACTION 0 /* just leave it as is */ +#define NRA_ADD_TO 1 /* add To: header */ +#define NRA_ADD_APPARENTLY_TO 2 /* add Apparently-To: header */ +#define NRA_ADD_BCC 3 /* add empty Bcc: header */ +#define NRA_ADD_TO_UNDISCLOSED 4 /* add To: undisclosed:; header */ + + +/* flags to putxline */ +#define PXLF_NOTHINGSPECIAL 0 /* no special mapping */ +#define PXLF_MAPFROM 0x0001 /* map From_ to >From_ */ +#define PXLF_STRIP8BIT 0x0002 /* strip 8th bit *e /* ** Additional definitions */ @@ -699,16 +860,16 @@ EXTERN char OpMode; /* operation mode, see below */ */ #define PRIV_PUBLIC 0 /* what have I got to hide? */ -#define PRIV_NEEDMAILHELO 00001 /* insist on HELO for MAIL, at least */ -#define PRIV_NEEDEXPNHELO 00002 /* insist on HELO for EXPN */ -#define PRIV_NEEDVRFYHELO 00004 /* insist on HELO for VRFY */ -#define PRIV_NOEXPN 00010 /* disallow EXPN command entirely */ -#define PRIV_NOVRFY 00020 /* disallow VRFY command entirely */ -#define PRIV_AUTHWARNINGS 00040 /* flag possible authorization probs */ -#define PRIV_NORECEIPTS 00100 /* disallow return receipts */ -#define PRIV_RESTRICTMAILQ 01000 /* restrict mailq command */ -#define PRIV_RESTRICTQRUN 02000 /* restrict queue run */ -#define PRIV_GOAWAY 00777 /* don't give no info, anyway, anyhow */ +#define PRIV_NEEDMAILHELO 0x0001 /* insist on HELO for MAIL, at least */ +#define PRIV_NEEDEXPNHELO 0x0002 /* insist on HELO for EXPN */ +#define PRIV_NEEDVRFYHELO 0x0004 /* insist on HELO for VRFY */ +#define PRIV_NOEXPN 0x0008 /* disallow EXPN command entirely */ +#define PRIV_NOVRFY 0x0010 /* disallow VRFY command entirely */ +#define PRIV_AUTHWARNINGS 0x0020 /* flag possible authorization probs */ +#define PRIV_NORECEIPTS 0x0040 /* disallow return receipts */ +#define PRIV_RESTRICTMAILQ 0x1000 /* restrict mailq command */ +#define PRIV_RESTRICTQRUN 0x2000 /* restrict queue run */ +#define PRIV_GOAWAY 0x0fff /* don't give no info, anyway, anyhow */ /* struct defining such things */ struct prival @@ -722,12 +883,12 @@ struct prival ** Flags passed to remotename, parseaddr, allocaddr, and buildaddr. */ -#define RF_SENDERADDR 0001 /* this is a sender address */ -#define RF_HEADERADDR 0002 /* this is a header address */ -#define RF_CANONICAL 0004 /* strip comment information */ -#define RF_ADDDOMAIN 0010 /* OK to do domain extension */ -#define RF_COPYPARSE 0020 /* copy parsed user & host */ -#define RF_COPYPADDR 0040 /* copy print address */ +#define RF_SENDERADDR 0x001 /* this is a sender address */ +#define RF_HEADERADDR 0x002 /* this is a header address */ +#define RF_CANONICAL 0x004 /* strip comment information */ +#define RF_ADDDOMAIN 0x008 /* OK to do domain extension */ +#define RF_COPYPARSE 0x010 /* copy parsed user & host */ +#define RF_COPYPADDR 0x020 /* copy print address */ #define RF_COPYALL (RF_COPYPARSE|RF_COPYPADDR) #define RF_COPYNONE 0 @@ -740,6 +901,23 @@ struct prival #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 */ +#define SFF_RUNASREALUID 0x0008 /* if no ctladdr, run as real uid */ +#define SFF_NOPATHCHECK 0x0010 /* don't bother checking dir path */ +#define SFF_SETUIDOK 0x0020 /* setuid files are ok */ +#define SFF_CREAT 0x0040 /* ok to create file if necessary */ +#define SFF_REGONLY 0x0080 /* regular files only */ + +/* flags that are actually specific to safefopen */ +#define SFF_OPENASROOT 0x1000 /* open as root instead of real user */ + + +/* +** Flags passed to mime8to7. +*/ + +#define M87F_OUTER 0 /* outer context */ +#define M87F_NO8BIT 0x0001 /* can't have 8-bit in this section */ +#define M87F_DIGEST 0x0002 /* processing multipart/digest */ /* @@ -747,27 +925,56 @@ struct prival ** we are forced to declare a supertype here. */ +#ifdef DAEMON union bigsockaddr { struct sockaddr sa; /* general version */ -#ifdef NETUNIX +#if NETUNIX struct sockaddr_un sunix; /* UNIX family */ #endif -#ifdef NETINET +#if NETINET struct sockaddr_in sin; /* INET family */ #endif -#ifdef NETISO +#if NETISO struct sockaddr_iso siso; /* ISO family */ #endif -#ifdef NETNS +#if NETNS struct sockaddr_ns sns; /* XNS family */ #endif -#ifdef NETX25 +#if NETX25 struct sockaddr_x25 sx25; /* X.25 family */ #endif }; #define SOCKADDR union bigsockaddr + +EXTERN SOCKADDR RealHostAddr; /* address of host we are talking to */ +extern char *anynet_ntoa __P((SOCKADDR *)); + +#endif + + +/* +** Vendor codes +** +** Vendors can customize sendmail to add special behaviour, +** generally for back compatibility. Ideally, this should +** be set up in the .cf file using the "V" command. However, +** it's quite reasonable for some vendors to want the default +** be their old version; this can be set using +** -DVENDOR_DEFAULT=VENDOR_xxx +** in the Makefile. +** +** Vendors should apply to sendmail@CS.Berkeley.EDU for +** unique vendor codes. +*/ + +#define VENDOR_BERKELEY 1 /* Berkeley-native configuration file */ +#define VENDOR_SUN 2 /* Sun-native configuration file */ +#define VENDOR_HP 3 /* Hewlett-Packard specific config syntax */ +#define VENDOR_IBM 4 /* IBM specific config syntax */ + +EXTERN int VendorCode; /* vendor-specific operation enhancements */ /* ** Global variables. */ @@ -778,7 +985,6 @@ EXTERN bool IgnrDot; /* don't let dot end messages */ EXTERN bool SaveFrom; /* save leading "From" lines */ EXTERN bool Verbose; /* set if blow-by-blow desired */ EXTERN bool GrabTo; /* if set, get recipients from msg */ -EXTERN bool NoReturn; /* don't return letter to sender */ EXTERN bool SuprErrs; /* set if we are suppressing errors */ EXTERN bool HoldErrs; /* only output errors to transcript */ EXTERN bool NoConnect; /* don't connect to non-local mailers */ @@ -787,20 +993,22 @@ EXTERN bool ForkQueueRuns; /* fork for each job when running the queue */ EXTERN bool AutoRebuild; /* auto-rebuild the alias database as needed */ EXTERN bool CheckAliases; /* parse addresses during newaliases */ EXTERN bool NoAlias; /* suppress aliasing */ -EXTERN bool UseNameServer; /* use internet domain name server */ -EXTERN bool SevenBit; /* force 7-bit data */ +EXTERN bool UseNameServer; /* using DNS -- interpret h_errno & MX RRs */ +EXTERN bool UseHesiod; /* using Hesiod -- interpret Hesiod errors */ +EXTERN bool SevenBitInput; /* force 7-bit data on input */ +EXTERN bool HasEightBits; /* has at least one eight bit input byte */ EXTERN time_t SafeAlias; /* interval to wait until @:@ in alias file */ EXTERN FILE *InChannel; /* input connection */ EXTERN FILE *OutChannel; /* output connection */ -EXTERN uid_t RealUid; /* when Daemon, real uid of caller */ -EXTERN gid_t RealGid; /* when Daemon, real gid of caller */ +EXTERN char *RealUserName; /* real user name of caller */ +EXTERN uid_t RealUid; /* real uid of caller */ +EXTERN gid_t RealGid; /* real gid of caller */ EXTERN uid_t DefUid; /* default uid to run as */ EXTERN gid_t DefGid; /* default gid to run as */ EXTERN char *DefUser; /* default user to run as (from DefUid) */ EXTERN int OldUmask; /* umask when sendmail starts up */ EXTERN int Errors; /* set if errors (local to single pass) */ EXTERN int ExitStat; /* exit status code */ -EXTERN int AliasLevel; /* depth of aliasing */ EXTERN int LineNumber; /* line number in current input */ EXTERN int LogLevel; /* level of logging to perform */ EXTERN int FileMode; /* mode on files */ @@ -817,7 +1025,6 @@ EXTERN char *FileName; /* name to print on error messages */ EXTERN char *SmtpPhase; /* current phase in SMTP processing */ EXTERN char *MyHostName; /* name of this host for SMTP messages */ EXTERN char *RealHostName; /* name of host we are talking to */ -EXTERN SOCKADDR RealHostAddr; /* address of host we are talking to */ EXTERN char *CurHostName; /* current host we are dealing with */ EXTERN jmp_buf TopFrame; /* branch-to-top-of-loop-on-error frame */ EXTERN bool QuickAbort; /* .... but only if we want a quick abort */ @@ -826,9 +1033,10 @@ EXTERN bool SendMIMEErrors; /* send error messages in MIME format */ EXTERN bool MatchGecos; /* look for user names in gecos field */ EXTERN bool UseErrorsTo; /* use Errors-To: header (back compat) */ EXTERN bool TryNullMXList; /* if we are the best MX, try host directly */ -extern bool CheckLoopBack; /* check for loopback on HELO packet */ EXTERN bool InChild; /* true if running in an SMTP subprocess */ EXTERN bool DisConnected; /* running with OutChannel redirected to xf */ +EXTERN bool ColonOkInAddr; /* single colon legal in address */ +EXTERN bool HasWildcardMX; /* don't use MX records when canonifying */ EXTERN char SpaceSub; /* substitution for <lwsp> */ EXTERN int PrivacyFlags; /* privacy flags */ EXTERN char *ConfFile; /* location of configuration file [conf.c] */ @@ -845,16 +1053,38 @@ EXTERN char *ForwardPath; /* path to search for .forward files */ EXTERN long MinBlocksFree; /* min # of blocks free on queue fs */ EXTERN char *FallBackMX; /* fall back MX host */ EXTERN long MaxMessageSize; /* advertised max size we will accept */ +EXTERN time_t MaxHostStatAge; /* max age of cached host status info */ +EXTERN time_t MinQueueAge; /* min delivery interval */ +EXTERN time_t DialDelay; /* delay between dial-on-demand tries */ +EXTERN char *SafeFileEnv; /* chroot location for file delivery */ +EXTERN char *HostsFile; /* path to /etc/hosts file */ +EXTERN int MaxQueueRun; /* maximum number of jobs in one queue run */ +EXTERN int MaxChildren; /* maximum number of daemonic children */ +EXTERN int CurChildren; /* current number of daemonic children */ +EXTERN char *SmtpGreeting; /* SMTP greeting message (old $e macro) */ +EXTERN char *UnixFromLine; /* UNIX From_ line (old $l macro) */ +EXTERN char *OperatorChars; /* operators (old $o macro) */ +EXTERN bool DontInitGroups; /* avoid initgroups() because of NIS cost */ +EXTERN bool SingleLineFromHeader; /* force From: header to be one line */ +EXTERN int MaxAliasRecursion; /* maximum depth of alias recursion */ +EXTERN int MaxRuleRecursion; /* maximum depth of ruleset recursion */ +EXTERN char *MustQuoteChars; /* quote these characters in phrases */ +EXTERN char *ServiceSwitchFile; /* backup service switch */ +EXTERN char *DefaultCharSet; /* default character set for MIME */ +EXTERN int DeliveryNiceness; /* how nice to be during delivery */ EXTERN char *PostMasterCopy; /* address to get errs cc's */ EXTERN int CheckpointInterval; /* queue file checkpoint interval */ EXTERN bool DontPruneRoutes; /* don't prune source routes */ -extern bool BrokenSmtpPeers; /* peers can't handle 2-line greeting */ +EXTERN bool DontExpandCnames; /* do not $[...$] expand CNAMEs */ EXTERN int MaxMciCache; /* maximum entries in MCI cache */ EXTERN time_t MciCacheTimeout; /* maximum idle time on connections */ +EXTERN time_t MciInfoTimeout; /* how long 'til we retry down hosts */ EXTERN char *QueueLimitRecipient; /* limit queue runs to this recipient */ EXTERN char *QueueLimitSender; /* limit queue runs to this sender */ EXTERN char *QueueLimitId; /* limit queue runs to this id */ EXTERN FILE *TrafficLogFile; /* file in which to log all traffic */ +EXTERN char *UserEnviron[MAXUSERENVIRON + 1]; + /* saved user environment */ extern int errno; @@ -875,16 +1105,23 @@ EXTERN struct time_t to_datafinal; /* DATA completion [10m] */ time_t to_nextcommand; /* next command [5m] */ /* following timeouts are not mentioned in RFC 1123 */ + time_t to_connect; /* initial connection timeout */ time_t to_rset; /* RSET command */ time_t to_helo; /* HELO command */ time_t to_quit; /* QUIT command */ time_t to_miscshort; /* misc short commands (NOOP, VERB, etc) */ time_t to_ident; /* IDENT protocol requests */ + time_t to_fileopen; /* opening :include: and .forward files */ /* following are per message */ - time_t to_q_return; /* queue return timeout */ - time_t to_q_warning; /* queue warning timeout */ + time_t to_q_return[MAXTOCLASS]; /* queue return timeouts */ + time_t to_q_warning[MAXTOCLASS]; /* queue warning timeouts */ } TimeOuts; +/* timeout classes for return and warning timeouts */ +# define TOC_NORMAL 0 /* normal delivery */ +# define TOC_URGENT 1 /* urgent delivery */ +# define TOC_NONURGENT 2 /* non-urgent delivery */ + /* ** Trace information @@ -920,43 +1157,59 @@ EXTERN u_char tTdvect[100]; ** Declarations of useful functions */ -extern ADDRESS *parseaddr __P((char *, ADDRESS *, int, int, char **, ENVELOPE *)); -extern char *xalloc __P((int)); -extern bool sameaddr __P((ADDRESS *, ADDRESS *)); -extern FILE *dfopen __P((char *, int, int)); -extern EVENT *setevent __P((time_t, int(*)(), int)); -extern char *sfgets __P((char *, int, FILE *, time_t, char *)); -extern char *queuename __P((ENVELOPE *, int)); -extern time_t curtime __P(()); -extern bool transienterror __P((int)); +extern char *xalloc __P((int)); +extern FILE *dfopen __P((char *, int, int)); +extern char *sfgets __P((char *, int, FILE *, time_t, char *)); +extern char *queuename __P((ENVELOPE *, int)); +extern time_t curtime __P(()); +extern bool transienterror __P((int)); +extern char *fgetfolded __P((char *, int, FILE *)); +extern char *username __P(()); +extern char *pintvl __P((time_t, bool)); +extern bool shouldqueue __P((long, time_t)); +extern bool lockfile __P((int, char *, char *, int)); +extern char *hostsignature __P((MAILER *, char *, ENVELOPE *)); +extern void openxscript __P((ENVELOPE *)); +extern void closexscript __P((ENVELOPE *)); +extern char *shortenstring __P((const char *, int)); +extern bool usershellok __P((char *, char *)); +extern void commaize __P((HDR *, char *, bool, MCI *, ENVELOPE *)); +extern char *hvalue __P((char *, HDR *)); +extern char *defcharset __P((ENVELOPE *)); +extern bool wordinclass __P((char *, int)); +extern char *denlstring __P((char *, bool, bool)); +extern void makelower __P((char *)); +extern void rebuildaliases __P((MAP *, bool)); +extern void readaliases __P((MAP *, FILE *, bool, bool)); +extern void finis __P(()); +extern void setsender __P((char *, ENVELOPE *, char **, bool)); +extern FILE *safefopen __P((char *, int, int, int)); +extern void xputs __P((const char *)); +extern void logsender __P((ENVELOPE *, char *)); +extern void smtprset __P((MAILER *, MCI *, ENVELOPE *)); +extern void smtpquit __P((MAILER *, MCI *, ENVELOPE *)); +extern void setuserenv __P((const char *, const char *)); +extern void disconnect __P((int, ENVELOPE *)); +extern void putxline __P((char *, MCI *, int)); +extern void dumpfd __P((int, bool, bool)); +extern void makemailer __P((char *)); +extern void putfromline __P((MCI *, ENVELOPE *)); +extern void setoption __P((int, char *, bool, bool, ENVELOPE *)); +extern void setclass __P((int, char *)); +extern void inittimeouts __P((char *)); +extern void logdelivery __P((MAILER *, MCI *, const char *, ADDRESS *, time_t, ENVELOPE *)); +extern void giveresponse __P((int, MAILER *, MCI *, ADDRESS *, time_t, ENVELOPE *)); + extern const char *errstring __P((int)); -extern void expand __P((char *, char *, char *, ENVELOPE *)); -extern void define __P((int, char *, ENVELOPE *)); -extern char *macvalue __P((int, ENVELOPE *)); -extern char **prescan __P((char *, int, char[], int, char **)); -extern int rewrite __P((char **, int, int, ENVELOPE *)); -extern char *fgetfolded __P((char *, int, FILE *)); -extern ADDRESS *recipient __P((ADDRESS *, ADDRESS **, ENVELOPE *)); -extern ENVELOPE *newenvelope __P((ENVELOPE *, ENVELOPE *)); -extern void dropenvelope __P((ENVELOPE *)); -extern void clearenvelope __P((ENVELOPE *, int)); -extern char *username __P(()); -extern MCI *mci_get __P((char *, MAILER *)); -extern char *pintvl __P((time_t, int)); -extern char *map_rewrite __P((MAP *, char *, int, char **)); -extern ADDRESS *getctladdr __P((ADDRESS *)); -extern char *anynet_ntoa __P((SOCKADDR *)); -extern char *remotename __P((char *, MAILER *, int, int *, ENVELOPE *)); -extern bool shouldqueue __P((long, time_t)); -extern bool lockfile __P((int, char *, char *, int)); -extern char *hostsignature __P((MAILER *, char *, ENVELOPE *)); -extern void openxscript __P((ENVELOPE *)); -extern void closexscript __P((ENVELOPE *)); extern sigfunc_t setsignal __P((int, sigfunc_t)); -extern char *shortenstring __P((char *, int)); -extern bool usershellok __P((char *)); -extern void commaize __P((HDR *, char *, int, MCI *, ENVELOPE *)); -extern char *denlstring __P((char *, int, int)); +extern struct hostent *sm_gethostbyname __P((char *)); +extern struct hostent *sm_gethostbyaddr __P((char *, int, int)); +extern struct passwd *sm_getpwnam __P((char *)); +extern struct passwd *sm_getpwuid __P((UID_T)); + +#ifdef XDEBUG +extern void checkfd012 __P((char *)); +#endif /* ellipsis is a different case though */ #ifdef __STDC__ @@ -972,3 +1225,13 @@ extern void usrerr(); extern void message(); extern void nmessage(); #endif + +#if !HASSNPRINTF +# ifdef __STDC__ +extern void snprintf(char *, size_t, const char *, ...); +extern void vsnprintf(char *, size_t, const char *, va_list); +# else +extern void snprintf(); +extern void vsnprintf(); +# endif +#endif diff --git a/usr.sbin/sendmail/src/sendmail.hf b/usr.sbin/sendmail/src/sendmail.hf index 142a7f5770546..14db22c68ee55 100644 --- a/usr.sbin/sendmail/src/sendmail.hf +++ b/usr.sbin/sendmail/src/sendmail.hf @@ -1,9 +1,9 @@ cpyr -cpyr Copyright (c) 1983 Eric P. Allman +cpyr Copyright (c) 1983, 1995 Eric P. Allman cpyr Copyright (c) 1988, 1993 cpyr The Regents of the University of California. All rights reserved. cpyr -cpyr @(#)sendmail.hf 8.2 (Berkeley) 7/16/93 +cpyr @(#)sendmail.hf 8.7 (Berkeley) 10/1/95 cpyr smtp Commands: smtp HELO EHLO MAIL RCPT DATA @@ -11,7 +11,7 @@ smtp RSET NOOP QUIT HELP VRFY smtp EXPN VERB smtp For more info use "HELP <topic>". smtp To report bugs in the implementation send email to -smtp sendmail@CS.Berkeley.EDU. +smtp sendmail-bugs@sendmail.org. smtp For local information send email to Postmaster at your site. help HELP [ <topic> ] help The HELP command gives help info. @@ -32,7 +32,7 @@ quit QUIT quit Exit sendmail (SMTP). verb VERB verb Go into verbose mode. This sends 0xy responses that are -verb are not RFC821 standard (but should be) They are recognized +verb not RFC821 standard (but should be) They are recognized verb by humans and other sendmail implementations. vrfy VRFY <recipient> vrfy Verify an address. If you want to see what it aliases @@ -56,3 +56,23 @@ saml implementation. turn TURN turn Reverses the direction of the connection. Not currently turn implemented. +-bt Help for test mode: +-bt ? :this help message. +-bt .Dmvalue :define macro `m' to `value'. +-bt .Ccvalue :add `value' to class `c'. +-bt =Sruleset :dump the contents of the indicated ruleset. +-bt =M :display the known mailers. +-bt -ddebug-spec :equivalent to the command-line -d debug flag. +-bt $m :print the value of macro $m. +-bt $=c :print the contents of class $=c. +-bt /mx host :returns the MX records for `host'. +-bt /parse address :parse address, returning the value of crackaddr, and +-bt the parsed address (same as -bv). +-bt /try mailer addr :rewrite address into the form it will have when +-bt presented to the indicated mailer. +-bt /tryflags flags :set flags used by parsing. The flags can be `H' for +-bt Header or `E' for Envelope, and `S' for Sender or `R' +-bt for Recipient. These can be combined, `HR' sets +-bt flags for header recipients. +-bt /canon hostname :try to canonify hostname. +-bt /map mapname key :look up `key' in the indicated `mapname'. diff --git a/usr.sbin/sendmail/src/srvrsmtp.c b/usr.sbin/sendmail/src/srvrsmtp.c index e2a09e400f52b..69a4fbe350078 100644 --- a/usr.sbin/sendmail/src/srvrsmtp.c +++ b/usr.sbin/sendmail/src/srvrsmtp.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1983 Eric P. Allman + * Copyright (c) 1983, 1995 Eric P. Allman * Copyright (c) 1988, 1993 * The Regents of the University of California. All rights reserved. * @@ -36,9 +36,9 @@ #ifndef lint #ifdef SMTP -static char sccsid[] = "@(#)srvrsmtp.c 8.37 (Berkeley) 4/13/94 (with SMTP)"; +static char sccsid[] = "@(#)srvrsmtp.c 8.97 (Berkeley) 11/18/95 (with SMTP)"; #else -static char sccsid[] = "@(#)srvrsmtp.c 8.37 (Berkeley) 4/13/94 (without SMTP)"; +static char sccsid[] = "@(#)srvrsmtp.c 8.97 (Berkeley) 11/18/95 (without SMTP)"; #endif #endif /* not lint */ @@ -117,35 +117,34 @@ bool OneXact = FALSE; /* one xaction only this run */ char *CurSmtpClient; /* who's at the other end of channel */ static char *skipword(); -extern char RealUserName[]; #define MAXBADCOMMANDS 25 /* maximum number of bad commands */ +void smtp(e) - register ENVELOPE *e; + register ENVELOPE *volatile e; { register char *p; register struct cmd *c; char *cmd; auto ADDRESS *vrfyqueue; ADDRESS *a; - bool gotmail; /* mail command received */ - bool gothello; /* helo command received */ + volatile bool gotmail; /* mail command received */ + volatile bool gothello; /* helo command received */ bool vrfy; /* set if this is a vrfy command */ - char *protocol; /* sending protocol */ - char *sendinghost; /* sending hostname */ - unsigned long msize; /* approximate maximum message size */ - char *peerhostname; /* name of SMTP peer or "localhost" */ + char *volatile protocol; /* sending protocol */ + char *volatile sendinghost; /* sending hostname */ + char *volatile peerhostname; /* name of SMTP peer or "localhost" */ auto char *delimptr; char *id; - int nrcpts; /* number of RCPT commands */ + volatile int nrcpts = 0; /* number of RCPT commands */ bool doublequeue; - int badcommands = 0; /* count of bad commands */ + volatile int badcommands = 0; /* count of bad commands */ char inp[MAXLINE]; char cmdbuf[MAXLINE]; - extern char Version[]; extern ENVELOPE BlankEnvelope; + extern void help __P((char *)); if (fileno(OutChannel) != fileno(stdout)) { @@ -162,28 +161,41 @@ smtp(e) CurSmtpClient = CurHostName; setproctitle("server %s startup", CurSmtpClient); - expand("\201e", inp, &inp[sizeof inp], e); - if (BrokenSmtpPeers) +#ifdef LOG + if (LogLevel > 11) { - p = strchr(inp, '\n'); - if (p != NULL) - *p = '\0'; - message("220 %s", inp); + /* log connection information */ + syslog(LOG_INFO, "SMTP connect from %.100s (%.100s)", + CurSmtpClient, anynet_ntoa(&RealHostAddr)); } - else - { - char *q = inp; +#endif - while (q != NULL) - { - p = strchr(q, '\n'); - if (p != NULL) - *p++ = '\0'; - message("220-%s", q); - q = p; - } - message("220 ESMTP spoken here"); + /* output the first line, inserting "ESMTP" as second word */ + expand(SmtpGreeting, inp, sizeof inp, e); + p = strchr(inp, '\n'); + if (p != NULL) + *p++ = '\0'; + id = strchr(inp, ' '); + if (id == NULL) + id = &inp[strlen(inp)]; + cmd = p == NULL ? "220 %.*s ESMTP%s" : "220-%.*s ESMTP%s"; + message(cmd, id - inp, inp, id); + + /* output remaining lines */ + while ((id = p) != NULL && (p = strchr(id, '\n')) != NULL) + { + *p++ = '\0'; + if (isascii(*id) && isspace(*id)) + id++; + message("220-%s", id); + } + if (id != NULL) + { + if (isascii(*id) && isspace(*id)) + id++; + message("220 %s", id); } + protocol = NULL; sendinghost = macvalue('s', e); gothello = FALSE; @@ -213,7 +225,7 @@ smtp(e) /* read the input line */ SmtpPhase = "server cmd read"; - setproctitle("server %s cmd read", CurHostName); + setproctitle("server %s cmd read", CurSmtpClient); p = sfgets(inp, sizeof inp, InChannel, TimeOuts.to_nextcommand, SmtpPhase); @@ -226,7 +238,7 @@ smtp(e) MyHostName, CurSmtpClient); #ifdef LOG if (LogLevel > (gotmail ? 1 : 19)) - syslog(LOG_NOTICE, "lost input channel from %s", + syslog(LOG_NOTICE, "lost input channel from %.100s", CurSmtpClient); #endif if (InChild) @@ -285,6 +297,39 @@ smtp(e) protocol = "SMTP"; SmtpPhase = "server HELO"; } + + /* check for valid domain name (re 1123 5.2.5) */ + if (*p == '\0') + { + message("501 %s requires domain address", + cmdbuf); + break; + } + else + { + register char *q; + + for (q = p; *q != '\0'; q++) + { + if (!isascii(*q)) + break; + if (isalnum(*q)) + continue; + if (isspace(*q)) + { + *q = '\0'; + break; + } + if (strchr("[].-_#", *q) == NULL) + break; + } + if (*q != '\0') + { + message("501 Invalid domain name"); + break; + } + } + sendinghost = newstr(p); gothello = TRUE; if (c->cmdcode != CMDEHLO) @@ -300,10 +345,19 @@ smtp(e) MyHostName, CurSmtpClient); if (!bitset(PRIV_NOEXPN, PrivacyFlags)) message("250-EXPN"); +#if MIME8TO7 + message("250-8BITMIME"); +#endif if (MaxMessageSize > 0) message("250-SIZE %ld", MaxMessageSize); else message("250-SIZE"); +#if DSN + if (SendMIMEErrors) + message("250-DSN"); +#endif + message("250-VERB"); + message("250-ONEX"); message("250 HELP"); break; @@ -344,7 +398,7 @@ smtp(e) { auth_warning(e, "Host %s didn't use HELO protocol", - peerhostname); + CurSmtpClient); } #ifdef PICKY_HELO_CHECK if (strcasecmp(sendinghost, peerhostname) != 0 && @@ -352,7 +406,7 @@ smtp(e) strcasecmp(sendinghost, MyHostName) != 0)) { auth_warning(e, "Host %s claimed to be %s", - peerhostname, sendinghost); + CurSmtpClient, sendinghost); } #endif @@ -362,7 +416,7 @@ smtp(e) define('s', sendinghost, e); initsys(e); nrcpts = 0; - e->e_flags |= EF_LOGSENDER; + e->e_flags |= EF_LOGSENDER|EF_CLRQUEUE; setproctitle("%s %s: %.80s", e->e_id, CurSmtpClient, inp); /* child -- go do the processing */ @@ -392,19 +446,21 @@ smtp(e) /* check for possible spoofing */ if (RealUid != 0 && OpMode == MD_SMTP && - (e->e_from.q_mailer != LocalMailer && - strcmp(e->e_from.q_user, RealUserName) != 0)) + !wordinclass(RealUserName, 't') && + !bitnset(M_LOCALMAILER, e->e_from.q_mailer->m_flags) && + strcmp(e->e_from.q_user, RealUserName) != 0) { auth_warning(e, "%s owned process doing -bs", RealUserName); } /* now parse ESMTP arguments */ - msize = 0; + e->e_msgsize = 0; while (p != NULL && *p != '\0') { char *kp; char *vp = NULL; + extern void mail_esmtp_args __P((char *, char *, ENVELOPE *)); /* locate the beginning of the keyword */ while (isascii(*p) && isspace(*p)) @@ -435,59 +491,17 @@ smtp(e) printf("MAIL: got arg %s=\"%s\"\n", kp, vp == NULL ? "<null>" : vp); - if (strcasecmp(kp, "size") == 0) - { - if (vp == NULL) - { - usrerr("501 SIZE requires a value"); - /* NOTREACHED */ - } -# ifdef __STDC__ - msize = strtoul(vp, (char **) NULL, 10); -# else - msize = strtol(vp, (char **) NULL, 10); -# endif - } - else if (strcasecmp(kp, "body") == 0) - { - if (vp == NULL) - { - usrerr("501 BODY requires a value"); - /* NOTREACHED */ - } -# ifdef MIME - if (strcasecmp(vp, "8bitmime") == 0) - { - e->e_bodytype = "8BITMIME"; - SevenBit = FALSE; - } - else if (strcasecmp(vp, "7bit") == 0) - { - e->e_bodytype = "7BIT"; - SevenBit = TRUE; - } - else - { - usrerr("501 Unknown BODY type %s", - vp); - } -# endif - } - else - { - usrerr("501 %s parameter unrecognized", kp); - /* NOTREACHED */ - } + mail_esmtp_args(kp, vp, e); } - if (MaxMessageSize > 0 && msize > MaxMessageSize) + if (MaxMessageSize > 0 && e->e_msgsize > MaxMessageSize) { usrerr("552 Message size exceeds fixed maximum message size (%ld)", MaxMessageSize); /* NOTREACHED */ } - - if (!enoughspace(msize)) + + if (!enoughdiskspace(e->e_msgsize)) { message("452 Insufficient disk space; try again later"); break; @@ -517,11 +531,53 @@ smtp(e) p = skipword(p, "to"); if (p == NULL) break; - a = parseaddr(p, NULLADDR, RF_COPYALL, ' ', NULL, e); + a = parseaddr(p, NULLADDR, RF_COPYALL, ' ', &delimptr, e); if (a == NULL) break; - a->q_flags |= QPRIMARY; - a = recipient(a, &e->e_sendqueue, e); + p = delimptr; + + /* now parse ESMTP arguments */ + while (p != NULL && *p != '\0') + { + char *kp; + char *vp = NULL; + extern void rcpt_esmtp_args __P((ADDRESS *, char *, char *, ENVELOPE *)); + + /* locate the beginning of the keyword */ + while (isascii(*p) && isspace(*p)) + p++; + if (*p == '\0') + break; + kp = p; + + /* skip to the value portion */ + while (isascii(*p) && isalnum(*p) || *p == '-') + p++; + if (*p == '=') + { + *p++ = '\0'; + vp = p; + + /* skip to the end of the value */ + while (*p != '\0' && *p != ' ' && + !(isascii(*p) && iscntrl(*p)) && + *p != '=') + p++; + } + + if (*p != '\0') + *p++ = '\0'; + + if (tTd(19, 1)) + printf("RCPT: got arg %s=\"%s\"\n", kp, + vp == NULL ? "<null>" : vp); + + rcpt_esmtp_args(a, kp, vp, e); + } + + /* save in recipient list after ESMTP mods */ + a = recipient(a, &e->e_sendqueue, 0, e); + if (Errors != 0) break; @@ -575,10 +631,18 @@ smtp(e) /* collect the text of the message */ SmtpPhase = "collect"; - collect(TRUE, doublequeue, e); + buffer_errors(); + collect(InChannel, TRUE, doublequeue, NULL, e); + flush_errors(TRUE); if (Errors != 0) goto abortmessage; - HoldErrs = TRUE; + + /* make sure we actually do delivery */ + e->e_flags &= ~EF_CLRQUEUE; + + /* from now on, we have to operate silently */ + buffer_errors(); + e->e_errormode = EM_MAIL; /* ** Arrange to send to everyone. @@ -599,42 +663,32 @@ smtp(e) */ SmtpPhase = "delivery"; - if (nrcpts != 1 && !doublequeue) - { - HoldErrs = TRUE; - e->e_errormode = EM_MAIL; - } e->e_xfp = freopen(queuename(e, 'x'), "w", e->e_xfp); id = e->e_id; - /* send to all recipients */ - sendall(e, doublequeue ? SM_QUEUE : SM_DEFAULT); - e->e_to = NULL; - - /* issue success if appropriate and reset */ - if (Errors == 0 || HoldErrs) - message("250 %s Message accepted for delivery", id); - - if (bitset(EF_FATALERRS, e->e_flags) && !HoldErrs) + if (doublequeue) { - /* avoid sending back an extra message */ - e->e_flags &= ~EF_FATALERRS; - e->e_flags |= EF_CLRQUEUE; + /* make sure it is in the queue */ + queueup(e, FALSE); } else { - /* from now on, we have to operate silently */ - HoldErrs = TRUE; - e->e_errormode = EM_MAIL; + /* send to all recipients */ + sendall(e, SM_DEFAULT); + } + e->e_to = NULL; - /* if we just queued, poke it */ - if (doublequeue && e->e_sendmode != SM_QUEUE) - { - extern pid_t dowork(); + /* issue success message */ + message("250 %s Message accepted for delivery", id); - unlockqueue(e); - (void) dowork(id, TRUE, TRUE, e); - } + /* if we just queued, poke it */ + if (doublequeue && e->e_sendmode != SM_QUEUE && + e->e_sendmode != SM_DEFER) + { + extern pid_t dowork(); + + unlockqueue(e); + (void) dowork(id, TRUE, TRUE, e); } abortmessage: @@ -651,6 +705,9 @@ smtp(e) case CMDRSET: /* rset -- reset state */ message("250 Reset state"); + + /* arrange to ignore any current send list */ + e->e_sendqueue = NULL; e->e_flags |= EF_CLRQUEUE; if (InChild) finis(); @@ -668,13 +725,14 @@ smtp(e) PrivacyFlags)) { if (vrfy) - message("252 Who's to say?"); + message("252 Cannot VRFY user; try RCPT to attempt delivery (or try finger)"); else message("502 Sorry, we do not allow this operation"); #ifdef LOG if (LogLevel > 5) - syslog(LOG_INFO, "%s: %s [rejected]", - CurSmtpClient, inp); + syslog(LOG_INFO, "%.100s: %s [rejected]", + CurSmtpClient, + shortenstring(inp, 203)); #endif break; } @@ -689,14 +747,16 @@ smtp(e) break; #ifdef LOG if (LogLevel > 5) - syslog(LOG_INFO, "%s: %s", CurSmtpClient, inp); + syslog(LOG_INFO, "%.100s: %s", + CurSmtpClient, + shortenstring(inp, 203)); #endif vrfyqueue = NULL; QuickAbort = TRUE; if (vrfy) e->e_flags |= EF_VRFYONLY; while (*p != '\0' && isascii(*p) && isspace(*p)) - *p++; + p++; if (*p == '\0') { message("501 Argument required"); @@ -704,7 +764,7 @@ smtp(e) } else { - (void) sendtolist(p, NULLADDR, &vrfyqueue, e); + (void) sendtolist(p, NULLADDR, &vrfyqueue, 0, e); } if (Errors != 0) { @@ -718,6 +778,8 @@ smtp(e) } while (vrfyqueue != NULL) { + extern void printvrfyaddr __P((ADDRESS *, bool)); + a = vrfyqueue; while ((a = a->q_next) != NULL && bitset(QDONTSEND|QBADADDR, a->q_flags)) @@ -742,6 +804,9 @@ smtp(e) message("221 %s closing connection", MyHostName); doquit: + /* arrange to ignore any current send list */ + e->e_sendqueue = NULL; + /* avoid future 050 messages */ disconnect(1, e); @@ -786,8 +851,8 @@ doquit: # ifdef LOG if (LogLevel > 0) syslog(LOG_CRIT, - "\"%s\" command from %s (%s)", - c->cmdname, peerhostname, + "\"%s\" command from %.100s (%.100s)", + c->cmdname, CurSmtpClient, anynet_ntoa(&RealHostAddr)); # endif /* FALL THROUGH */ @@ -847,7 +912,7 @@ skipword(p, w) { syntax: message("501 Syntax error in parameters scanning \"%s\"", - firstp); + shortenstring(firstp, 203)); Errors++; return (NULL); } @@ -865,6 +930,183 @@ skipword(p, w) return (p); } /* +** MAIL_ESMTP_ARGS -- process ESMTP arguments from MAIL line +** +** Parameters: +** kp -- the parameter key. +** vp -- the value of that parameter. +** e -- the envelope. +** +** Returns: +** none. +*/ + +void +mail_esmtp_args(kp, vp, e) + char *kp; + char *vp; + ENVELOPE *e; +{ + if (strcasecmp(kp, "size") == 0) + { + if (vp == NULL) + { + usrerr("501 SIZE requires a value"); + /* NOTREACHED */ + } +# if defined(__STDC__) && !defined(BROKEN_ANSI_LIBRARY) + e->e_msgsize = strtoul(vp, (char **) NULL, 10); +# else + e->e_msgsize = strtol(vp, (char **) NULL, 10); +# endif + } + else if (strcasecmp(kp, "body") == 0) + { + if (vp == NULL) + { + usrerr("501 BODY requires a value"); + /* NOTREACHED */ + } + else if (strcasecmp(vp, "8bitmime") == 0) + { + SevenBitInput = FALSE; + } + else if (strcasecmp(vp, "7bit") == 0) + { + SevenBitInput = TRUE; + } + else + { + usrerr("501 Unknown BODY type %s", + vp); + /* NOTREACHED */ + } + e->e_bodytype = newstr(vp); + } + else if (strcasecmp(kp, "envid") == 0) + { + if (vp == NULL) + { + usrerr("501 ENVID requires a value"); + /* NOTREACHED */ + } + if (!xtextok(vp)) + { + usrerr("501 Syntax error in ENVID parameter value"); + /* NOTREACHED */ + } + if (e->e_envid != NULL) + { + usrerr("501 Duplicate ENVID parameter"); + /* NOTREACHED */ + } + e->e_envid = newstr(vp); + } + else if (strcasecmp(kp, "ret") == 0) + { + if (vp == NULL) + { + usrerr("501 RET requires a value"); + /* NOTREACHED */ + } + if (bitset(EF_RET_PARAM, e->e_flags)) + { + usrerr("501 Duplicate RET parameter"); + /* NOTREACHED */ + } + e->e_flags |= EF_RET_PARAM; + if (strcasecmp(vp, "hdrs") == 0) + e->e_flags |= EF_NO_BODY_RETN; + else if (strcasecmp(vp, "full") != 0) + { + usrerr("501 Bad argument \"%s\" to RET", vp); + /* NOTREACHED */ + } + } + else + { + usrerr("501 %s parameter unrecognized", kp); + /* NOTREACHED */ + } +} +/* +** RCPT_ESMTP_ARGS -- process ESMTP arguments from RCPT line +** +** Parameters: +** a -- the address corresponding to the To: parameter. +** kp -- the parameter key. +** vp -- the value of that parameter. +** e -- the envelope. +** +** Returns: +** none. +*/ + +void +rcpt_esmtp_args(a, kp, vp, e) + ADDRESS *a; + char *kp; + char *vp; + ENVELOPE *e; +{ + if (strcasecmp(kp, "notify") == 0) + { + char *p; + + if (vp == NULL) + { + usrerr("501 NOTIFY requires a value"); + /* NOTREACHED */ + } + a->q_flags &= ~(QPINGONSUCCESS|QPINGONFAILURE|QPINGONDELAY); + a->q_flags |= QHASNOTIFY; + if (strcasecmp(vp, "never") == 0) + return; + for (p = vp; p != NULL; vp = p) + { + p = strchr(p, ','); + if (p != NULL) + *p++ = '\0'; + if (strcasecmp(vp, "success") == 0) + a->q_flags |= QPINGONSUCCESS; + else if (strcasecmp(vp, "failure") == 0) + a->q_flags |= QPINGONFAILURE; + else if (strcasecmp(vp, "delay") == 0) + a->q_flags |= QPINGONDELAY; + else + { + usrerr("501 Bad argument \"%s\" to NOTIFY", + vp); + /* NOTREACHED */ + } + } + } + else if (strcasecmp(kp, "orcpt") == 0) + { + if (vp == NULL) + { + usrerr("501 ORCPT requires a value"); + /* NOTREACHED */ + } + if (strchr(vp, ';') == NULL || !xtextok(vp)) + { + usrerr("501 Syntax error in ORCPT parameter value"); + /* NOTREACHED */ + } + if (a->q_orcpt != NULL) + { + usrerr("501 Duplicate ORCPT parameter"); + /* NOTREACHED */ + } + a->q_orcpt = newstr(vp); + } + else + { + usrerr("501 %s parameter unrecognized", kp); + /* NOTREACHED */ + } +} +/* ** PRINTVRFYADDR -- print an entry in the verify queue ** ** Parameters: @@ -878,6 +1120,7 @@ skipword(p, w) ** Prints the appropriate 250 codes. */ +void printvrfyaddr(a, last) register ADDRESS *a; bool last; @@ -905,66 +1148,6 @@ printvrfyaddr(a, last) } } /* -** HELP -- implement the HELP command. -** -** Parameters: -** topic -- the topic we want help for. -** -** Returns: -** none. -** -** Side Effects: -** outputs the help file to message output. -*/ - -help(topic) - char *topic; -{ - register FILE *hf; - int len; - char buf[MAXLINE]; - bool noinfo; - - if (HelpFile == NULL || (hf = fopen(HelpFile, "r")) == NULL) - { - /* no help */ - errno = 0; - message("502 HELP not implemented"); - return; - } - - if (topic == NULL || *topic == '\0') - topic = "smtp"; - else - makelower(topic); - - len = strlen(topic); - noinfo = TRUE; - - while (fgets(buf, sizeof buf, hf) != NULL) - { - if (strncmp(buf, topic, len) == 0) - { - register char *p; - - p = strchr(buf, '\t'); - if (p == NULL) - p = buf; - else - p++; - fixcrlf(p, TRUE); - message("214-%s", p); - noinfo = FALSE; - } - } - - if (noinfo) - message("504 HELP topic unknown"); - else - message("214 End of HELP info"); - (void) fclose(hf); -} -/* ** RUNINCHILD -- return twice -- once in the child, then in the parent again ** ** Parameters: @@ -978,6 +1161,7 @@ help(topic) ** none. */ +int runinchild(label, e) char *label; register ENVELOPE *e; @@ -989,7 +1173,7 @@ runinchild(label, e) childpid = dofork(); if (childpid < 0) { - syserr("%s: cannot fork", label); + syserr("451 %s: cannot fork", label); return (1); } if (childpid > 0) @@ -997,12 +1181,12 @@ runinchild(label, e) auto int st; /* parent -- wait for child to complete */ - setproctitle("server %s child wait", CurHostName); + setproctitle("server %s child wait", CurSmtpClient); st = waitfor(childpid); if (st == -1) - syserr("%s: lost child", label); + syserr("451 %s: lost child", label); else if (!WIFEXITED(st)) - syserr("%s: died on signal %d", + syserr("451 %s: died on signal %d", label, st & 0177); /* if we exited on a QUIT command, complete the process */ @@ -1030,3 +1214,72 @@ runinchild(label, e) } # endif /* SMTP */ +/* +** HELP -- implement the HELP command. +** +** Parameters: +** topic -- the topic we want help for. +** +** Returns: +** none. +** +** Side Effects: +** outputs the help file to message output. +*/ + +void +help(topic) + char *topic; +{ + register FILE *hf; + int len; + bool noinfo; + char buf[MAXLINE]; + extern char Version[]; + + + if (HelpFile == NULL || (hf = fopen(HelpFile, "r")) == NULL) + { + /* no help */ + errno = 0; + message("502 Sendmail %s -- HELP not implemented", Version); + return; + } + + if (topic == NULL || *topic == '\0') + { + topic = "smtp"; + message("214-This is Sendmail version %s", Version); + noinfo = FALSE; + } + else + { + makelower(topic); + noinfo = TRUE; + } + + len = strlen(topic); + + while (fgets(buf, sizeof buf, hf) != NULL) + { + if (strncmp(buf, topic, len) == 0) + { + register char *p; + + p = strchr(buf, '\t'); + if (p == NULL) + p = buf; + else + p++; + fixcrlf(p, TRUE); + message("214-%s", p); + noinfo = FALSE; + } + } + + if (noinfo) + message("504 HELP topic \"%.10s\" unknown", topic); + else + message("214 End of HELP info"); + (void) fclose(hf); +} diff --git a/usr.sbin/sendmail/src/stab.c b/usr.sbin/sendmail/src/stab.c index 07893e5b5d9c9..cfb02c69686b0 100644 --- a/usr.sbin/sendmail/src/stab.c +++ b/usr.sbin/sendmail/src/stab.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1983 Eric P. Allman + * Copyright (c) 1983, 1995 Eric P. Allman * Copyright (c) 1988, 1993 * The Regents of the University of California. All rights reserved. * @@ -33,7 +33,7 @@ */ #ifndef lint -static char sccsid[] = "@(#)stab.c 8.1 (Berkeley) 6/7/93"; +static char sccsid[] = "@(#)stab.c 8.6 (Berkeley) 8/31/95"; #endif /* not lint */ # include "sendmail.h" @@ -57,7 +57,7 @@ static char sccsid[] = "@(#)stab.c 8.1 (Berkeley) 6/7/93"; ** can update the symbol table. */ -# define STABSIZE 400 +# define STABSIZE 2003 static STAB *SymTab[STABSIZE]; @@ -78,20 +78,28 @@ stab(name, type, op) /* ** Compute the hashing function - ** - ** We could probably do better.... */ hfunc = type; for (p = name; *p != '\0'; p++) - hfunc = (((hfunc << 7) | lower(*p)) & 077777) % STABSIZE; + hfunc = ((hfunc << 1) ^ (lower(*p) & 0377)) % STABSIZE; if (tTd(36, 9)) printf("(hfunc=%d) ", hfunc); ps = &SymTab[hfunc]; - while ((s = *ps) != NULL && (strcasecmp(name, s->s_name) || s->s_type != type)) - ps = &s->s_next; + if (type == ST_MACRO || type == ST_RULESET) + { + while ((s = *ps) != NULL && + (s->s_type != type || strcmp(name, s->s_name))) + ps = &s->s_next; + } + else + { + while ((s = *ps) != NULL && + (s->s_type != type || strcasecmp(name, s->s_name))) + ps = &s->s_next; + } /* ** Dispose of the entry. @@ -125,7 +133,6 @@ stab(name, type, op) s = (STAB *) xalloc(sizeof *s); bzero((char *) s, sizeof *s); s->s_name = newstr(name); - makelower(s->s_name); s->s_type = type; /* link it in */ @@ -157,7 +164,7 @@ stabapply(func, arg) { for (s = *shead; s != NULL; s = s->s_next) { - if (tTd(38, 90)) + if (tTd(36, 90)) printf("stabapply: trying %d/%s\n", s->s_type, s->s_name); func(s, arg); diff --git a/usr.sbin/sendmail/src/stats.c b/usr.sbin/sendmail/src/stats.c index 2dc68272fbc18..f59885a606745 100644 --- a/usr.sbin/sendmail/src/stats.c +++ b/usr.sbin/sendmail/src/stats.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1983 Eric P. Allman + * Copyright (c) 1983, 1995 Eric P. Allman * Copyright (c) 1988, 1993 * The Regents of the University of California. All rights reserved. * @@ -33,7 +33,7 @@ */ #ifndef lint -static char sccsid[] = "@(#)stats.c 8.3 (Berkeley) 8/28/93"; +static char sccsid[] = "@(#)stats.c 8.5 (Berkeley) 5/28/95"; #endif /* not lint */ # include "sendmail.h" @@ -49,6 +49,7 @@ bool GotStats = FALSE; /* set when we have stats to merge */ ** MARKSTATS -- mark statistics */ +void markstats(e, to) register ENVELOPE *e; register ADDRESS *to; @@ -82,6 +83,7 @@ markstats(e, to) ** merges the Stat structure with the sfile file. */ +void poststats(sfile) char *sfile; { diff --git a/usr.sbin/sendmail/src/sysexits.c b/usr.sbin/sendmail/src/sysexits.c index fff3783f91142..ad4f1e1cffb8d 100644 --- a/usr.sbin/sendmail/src/sysexits.c +++ b/usr.sbin/sendmail/src/sysexits.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1983 Eric P. Allman + * Copyright (c) 1983, 1995 Eric P. Allman * Copyright (c) 1988, 1993 * The Regents of the University of California. All rights reserved. * @@ -33,10 +33,10 @@ */ #ifndef lint -static char sccsid[] = "@(#)sysexits.c 8.1 (Berkeley) 6/7/93"; +static char sccsid[] = "@(#)sysexits.c 8.5 (Berkeley) 5/24/95"; #endif /* not lint */ -#include <sysexits.h> +#include <sendmail.h> /* ** SYSEXITS.C -- error messages corresponding to sysexits.h @@ -65,3 +65,120 @@ char *SysExMsg[] = }; int N_SysEx = sizeof(SysExMsg) / sizeof(SysExMsg[0]); +/* +** DSNTOEXITSTAT -- convert DSN-style error code to EX_ style. +** +** Parameters: +** dsncode -- the text of the DSN-style code. +** +** Returns: +** The corresponding exit status. +*/ + +int +dsntoexitstat(dsncode) + char *dsncode; +{ + int code2, code3; + + /* first the easy cases.... */ + if (*dsncode == '2') + return EX_OK; + if (*dsncode == '4') + return EX_TEMPFAIL; + + /* now decode the other two field parts */ + if (*++dsncode == '.') + dsncode++; + code2 = atoi(dsncode); + while (*dsncode != '\0' && *dsncode != '.') + dsncode++; + if (*dsncode != '\0') + dsncode++; + code3 = atoi(dsncode); + + /* and do a nested switch to work them out */ + switch (code2) + { + case 0: /* Other or Undefined status */ + return EX_UNAVAILABLE; + + case 1: /* Address Status */ + switch (code3) + { + case 0: /* Other Address Status */ + return EX_DATAERR; + + case 1: /* Bad destination mailbox address */ + case 6: /* Mailbox has moved, No forwarding address */ + return EX_NOUSER; + + case 2: /* Bad destination system address */ + case 8: /* Bad senders system address */ + return EX_NOHOST; + + case 3: /* Bad destination mailbox address syntax */ + case 7: /* Bad senders mailbox address syntax */ + return EX_USAGE; + + case 4: /* Destination mailbox address ambiguous */ + return EX_UNAVAILABLE; + + case 5: /* Destination address valid */ + return EX_OK; + } + break; + + case 2: /* Mailbox Status */ + switch (code3) + { + case 0: /* Other or Undefined mailbox status */ + case 1: /* Mailbox disabled, not acccepting messages */ + case 2: /* Mailbox full */ + case 4: /* Mailing list expansion problem */ + return EX_UNAVAILABLE; + + case 3: /* Message length exceeds administrative lim */ + return EX_DATAERR; + } + break; + + case 3: /* System Status */ + return EX_OSERR; + + case 4: /* Network and Routing Status */ + switch (code3) + { + case 0: /* Other or undefined network or routing stat */ + return EX_IOERR; + + case 1: /* No answer from host */ + case 3: /* Routing server failure */ + case 5: /* Network congestion */ + return EX_TEMPFAIL; + + case 2: /* Bad connection */ + return EX_IOERR; + + case 4: /* Unable to route */ + return EX_PROTOCOL; + + case 6: /* Routing loop detected */ + return EX_CONFIG; + + case 7: /* Delivery time expired */ + return EX_UNAVAILABLE; + } + break; + + case 5: /* Protocol Status */ + return EX_PROTOCOL; + + case 6: /* Message Content or Media Status */ + return EX_UNAVAILABLE; + + case 7: /* Security Status */ + return EX_DATAERR; + } + return EX_CONFIG; +} diff --git a/usr.sbin/sendmail/src/trace.c b/usr.sbin/sendmail/src/trace.c index 29421eee3c6bf..9762cab18f591 100644 --- a/usr.sbin/sendmail/src/trace.c +++ b/usr.sbin/sendmail/src/trace.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1983 Eric P. Allman + * Copyright (c) 1983, 1995 Eric P. Allman * Copyright (c) 1988, 1993 * The Regents of the University of California. All rights reserved. * @@ -33,7 +33,7 @@ */ #ifndef lint -static char sccsid[] = "@(#)trace.c 8.2 (Berkeley) 3/14/94"; +static char sccsid[] = "@(#)trace.c 8.4 (Berkeley) 5/28/95"; #endif /* not lint */ # include "sendmail.h" @@ -57,6 +57,7 @@ u_char *tTvect; int tTsize; static char *DefFlags; +void tTsetup(vect, size, defflags) u_char *vect; int size; @@ -79,6 +80,7 @@ tTsetup(vect, size, defflags) ** sets/clears trace flags. */ +void tTflag(s) register char *s; { diff --git a/usr.sbin/sendmail/src/udb.c b/usr.sbin/sendmail/src/udb.c index 4739a081cf76c..9212bb4ed015a 100644 --- a/usr.sbin/sendmail/src/udb.c +++ b/usr.sbin/sendmail/src/udb.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1983 Eric P. Allman + * Copyright (c) 1983, 1995 Eric P. Allman * Copyright (c) 1988, 1993 * The Regents of the University of California. All rights reserved. * @@ -35,21 +35,30 @@ #include "sendmail.h" #ifndef lint -#ifdef USERDB -static char sccsid [] = "@(#)udb.c 8.8 (Berkeley) 4/14/94 (with USERDB)"; +#if USERDB +static char sccsid [] = "@(#)udb.c 8.33 (Berkeley) 11/29/95 (with USERDB)"; #else -static char sccsid [] = "@(#)udb.c 8.8 (Berkeley) 4/14/94 (without USERDB)"; +static char sccsid [] = "@(#)udb.c 8.33 (Berkeley) 11/29/95 (without USERDB)"; #endif #endif -#ifdef USERDB +#if USERDB #include <errno.h> -#include <netdb.h> -#include <db.h> + +#ifdef NEWDB +# include <db.h> +#else +# define DBT struct _data_base_thang_ +DBT +{ + void *data; /* pointer to data */ + size_t size; /* length of data */ +}; +#endif #ifdef HESIOD -#include <hesiod.h> +# include <hesiod.h> #endif /* HESIOD */ /* @@ -82,6 +91,7 @@ struct udbent } udb_forward; #define udb_fwdhost udb_u.udb_forward._udb_fwdhost +#ifdef NEWDB /* type UE_FETCH -- lookup in local database */ struct { @@ -90,6 +100,7 @@ struct udbent } udb_lookup; #define udb_dbname udb_u.udb_lookup._udb_dbname #define udb_dbp udb_u.udb_lookup._udb_dbp +#endif } udb_u; }; @@ -114,6 +125,8 @@ struct option ** Parameters: ** a -- address to expand. ** sendq -- pointer to head of sendq to put the expansions in. +** aliaslevel -- the current alias nesting depth. +** e -- the current envelope. ** ** Returns: ** EX_TEMPFAIL -- if something "odd" happened -- probably due @@ -132,13 +145,13 @@ int UdbSock = -1; bool UdbInitialized = FALSE; int -udbexpand(a, sendq, e) +udbexpand(a, sendq, aliaslevel, e) register ADDRESS *a; ADDRESS **sendq; + int aliaslevel; register ENVELOPE *e; { int i; - register char *p; DBT key; DBT info; bool breakout; @@ -201,6 +214,7 @@ udbexpand(a, sendq, e) switch (up->udb_type) { +#ifdef NEWDB case UDB_DBFETCH: key.data = keybuf; key.size = keylen; @@ -227,7 +241,6 @@ udbexpand(a, sendq, e) if (bitset(EF_VRFYONLY, e->e_flags)) { a->q_flags |= QVERIFIED; - e->e_nrcpts++; return EX_OK; } @@ -242,12 +255,11 @@ udbexpand(a, sendq, e) message("expanded to %s", user); #ifdef LOG if (LogLevel >= 10) - syslog(LOG_INFO, "%s: expand %s => %s", - e->e_id, e->e_to, user); + syslog(LOG_INFO, "%s: expand %.100s => %s", + e->e_id, e->e_to, + shortenstring(user, 203)); #endif - AliasLevel++; - naddrs += sendtolist(user, a, sendq, e); - AliasLevel--; + naddrs += sendtolist(user, a, sendq, aliaslevel + 1, e); if (user != buf) free(user); @@ -299,9 +311,11 @@ udbexpand(a, sendq, e) fprintf(e->e_xfp, "Message delivered to mailing list %s\n", a->q_paddr); - e->e_flags |= EF_SENDRECEIPT; } + e->e_flags |= EF_SENDRECEIPT; + a->q_flags |= QDELIVERED|QEXPANDED; break; +#endif #ifdef HESIOD case UDB_HESIOD: @@ -312,12 +326,45 @@ udbexpand(a, sendq, e) keybuf, keylen); /* look up the key via hesiod */ i = hes_udb_get(&key, &info); - if (i > 0 || info.size <= 0) + if (i < 0) { + syserr("udbexpand: hesiod-get %.*s stat %d", + key.size, key.data, i); + return EX_TEMPFAIL; + } + else if (i > 0 || info.size <= 0) + { +#if HES_GETMAILHOST + struct hes_postoffice *hp; +#endif + if (tTd(28, 2)) - printf("udbexpand: no match on %s (%d)\n", - keybuf, keylen); + printf("udbexpand: no match on %s (%d)\n", + keybuf, keylen); +#if HES_GETMAILHOST + if (tTd(28, 8)) + printf(" ... trying hes_getmailhost(%s)\n", + a->q_user); + hp = hes_getmailhost(a->q_user); + if (hp == NULL) + { + if (hes_error() == HES_ER_NET) + { + syserr("udbexpand: hesiod-getmail %s stat %d", + a->q_user, hes_error()); + return EX_TEMPFAIL; + } + if (tTd(28, 2)) + printf("hes_getmailhost(%s): %d\n", + a->q_user, hes_error()); + continue; + } + sprintf(info.data, "%s@%s", + hp->po_name, hp->po_host); + info.size = strlen(info.data); +#else continue; +#endif } if (tTd(28, 80)) printf("udbexpand: match %.*s: %.*s\n", @@ -327,8 +374,6 @@ udbexpand(a, sendq, e) if (bitset(EF_VRFYONLY, e->e_flags)) { a->q_flags |= QVERIFIED; - e->e_nrcpts++; - free(info.data); return EX_OK; } @@ -339,17 +384,15 @@ udbexpand(a, sendq, e) user = xalloc(info.size + 1); bcopy(info.data, user, info.size); user[info.size] = '\0'; - free(info.data); message("hesioded to %s", user); #ifdef LOG if (LogLevel >= 10) - syslog(LOG_INFO, "%s: hesiod %s => %s", - e->e_id, e->e_to, user); + syslog(LOG_INFO, "%s: hesiod %.100s => %s", + e->e_id, e->e_to, + shortenstring(user, 203)); #endif - AliasLevel++; - naddrs = sendtolist(user, a, sendq, e); - AliasLevel--; + naddrs = sendtolist(user, a, sendq, aliaslevel + 1, e); if (user != buf) free(user); @@ -363,12 +406,6 @@ udbexpand(a, sendq, e) } a->q_flags |= QDONTSEND; } - if (i < 0) - { - syserr("udbexpand: hesiod-get %.*s stat %d", - key.size, key.data, i); - return EX_TEMPFAIL; - } /* ** If this address has a -request address, reflect @@ -386,7 +423,6 @@ udbexpand(a, sendq, e) a->q_owner = xalloc(info.size + 1); bcopy(info.data, a->q_owner, info.size); a->q_owner[info.size] = '\0'; - free(info.data); break; #endif /* HESIOD */ @@ -405,9 +441,7 @@ udbexpand(a, sendq, e) (void) sprintf(user, "%s@%s", a->q_user, up->udb_fwdhost); message("expanded to %s", user); a->q_flags &= ~QSELFREF; - AliasLevel++; - naddrs = sendtolist(user, a, sendq, e); - AliasLevel--; + naddrs = sendtolist(user, a, sendq, aliaslevel + 1, e); if (naddrs > 0 && !bitset(QSELFREF, a->q_flags)) { if (tTd(28, 5)) @@ -509,6 +543,7 @@ udbmatch(user, field) switch (up->udb_type) { +#ifdef NEWDB case UDB_DBFETCH: key.data = keybuf; key.size = keylen; @@ -528,6 +563,7 @@ udbmatch(user, field) printf("udbmatch ==> %s\n", p); return p; break; +#endif #ifdef HESIOD case UDB_HESIOD: @@ -545,11 +581,9 @@ udbmatch(user, field) p = xalloc(info.size + 1); bcopy(info.data, p, info.size); p[info.size] = '\0'; - free(info.data); if (tTd(28, 1)) printf("udbmatch ==> %s\n", p); return p; - break; #endif /* HESIOD */ } } @@ -572,6 +606,7 @@ udbmatch(user, field) { switch (up->udb_type) { +#ifdef NEWDB case UDB_DBFETCH: /* get the default case for this database */ if (up->udb_default == NULL) @@ -613,6 +648,7 @@ udbmatch(user, field) printf("udbmatch ==> %s\n", p); return p; break; +#endif #ifdef HESIOD case UDB_HESIOD: @@ -634,7 +670,6 @@ udbmatch(user, field) up->udb_default = xalloc(info.size + 1); bcopy(info.data, up->udb_default, info.size); up->udb_default[info.size] = '\0'; - free(info.data); } else if (up->udb_default[0] == '\0') continue; @@ -649,7 +684,6 @@ udbmatch(user, field) continue; } - free(info.data); /* they exist -- build the actual address */ p = xalloc(strlen(user) + strlen(up->udb_default) + 2); (void) strcpy(p, user); @@ -667,6 +701,57 @@ udbmatch(user, field) return NULL; } /* +** UDB_MAP_LOOKUP -- look up arbitrary entry in user database map +** +** Parameters: +** map -- the map being queried. +** name -- the name to look up. +** av -- arguments to the map lookup. +** statp -- to get any error status. +** +** Returns: +** NULL if name not found in map. +** The rewritten name otherwise. +*/ + +char * +udb_map_lookup(map, name, av, statp) + MAP *map; + char *name; + char **av; + int *statp; +{ + char *val; + char *key; + char keybuf[MAXNAME + 1]; + + if (tTd(28, 20) || tTd(38, 20)) + printf("udb_map_lookup(%s, %s)\n", map->map_mname, name); + + if (bitset(MF_NOFOLDCASE, map->map_mflags)) + { + key = name; + } + else + { + int keysize = strlen(name); + + if (keysize > sizeof keybuf - 1) + keysize = sizeof keybuf - 1; + bcopy(name, keybuf, keysize); + keybuf[keysize] = '\0'; + makelower(keybuf); + key = keybuf; + } + val = udbmatch(key, map->map_file); + if (val == NULL) + return NULL; + if (bitset(MF_MATCHONLY, map->map_mflags)) + return map_rewrite(map, name, strlen(name), NULL); + else + return map_rewrite(map, val, strlen(val), av); +} +/* ** _UDBX_INIT -- parse the UDB specification, opening any valid entries. ** ** Parameters: @@ -688,9 +773,7 @@ int _udbx_init() { register char *p; - int i; register struct udbent *up; - char buf[BUFSIZ]; if (UdbInitialized) return EX_OK; @@ -705,11 +788,14 @@ _udbx_init() while (p != NULL) { char *spec; - auto int rcode; int nopts; +# if 0 + auto int rcode; int nmx; + int i; register struct hostent *h; char *mxhosts[MAXMXHOSTS + 1]; +# endif struct option opts[MAXUDBOPTS + 1]; while (*p == ' ' || *p == '\t' || *p == ',') @@ -743,10 +829,13 @@ _udbx_init() ** since it always matches the input. ** /dbname -- search the named database on the local ** host using the Berkeley db package. + ** Hesiod -- search the named database with BIND + ** using the MIT Hesiod package. */ switch (*spec) { +#if 0 case '+': /* search remote database */ case '*': /* search remote database (expand MX) */ if (*spec == '*') @@ -776,14 +865,14 @@ _udbx_init() for (i = 0; i < nmx; i++) { - h = gethostbyname(mxhosts[i]); + h = sm_gethostbyname(mxhosts[i]); if (h == NULL) continue; up->udb_type = UDB_REMOTE; 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); + INADDRSZ); up->udb_addr.sin_port = UdbPort; up->udb_timeout = UdbTimeout; up++; @@ -796,6 +885,7 @@ _udbx_init() (void) fcntl(UdbSock, F_SETFD, 1); } break; +#endif case '@': /* forward to remote host */ up->udb_type = UDB_FORWARD; @@ -803,22 +893,31 @@ _udbx_init() up++; break; +#ifdef HESIOD case 'h': /* use hesiod */ case 'H': -#ifdef HESIOD if (strcasecmp(spec, "hesiod") != 0) - break; + goto badspec; up->udb_type = UDB_HESIOD; up++; -#endif /* HESIOD */ break; +#endif /* HESIOD */ +#ifdef NEWDB case '/': /* look up remote name */ up->udb_dbname = spec; errno = 0; up->udb_dbp = dbopen(spec, O_RDONLY, 0644, DB_BTREE, NULL); if (up->udb_dbp == NULL) { + if (tTd(28, 1)) + { + int saveerrno = errno; + + printf("dbopen(%s): %s", + spec, errstring(errno)); + errno = saveerrno; + } if (errno != ENOENT && errno != EACCES) { #ifdef LOG @@ -834,6 +933,12 @@ _udbx_init() up->udb_type = UDB_DBFETCH; up++; break; +#endif + + default: +badspec: + syserr("Unknown UDB spec %s", spec); + break; } } up->udb_type = UDB_EOLIST; @@ -844,15 +949,21 @@ _udbx_init() { switch (up->udb_type) { +#ifdef DAEMON case UDB_REMOTE: printf("REMOTE: addr %s, timeo %d\n", anynet_ntoa((SOCKADDR *) &up->udb_addr), up->udb_timeout); break; +#endif case UDB_DBFETCH: +#ifdef NEWDB printf("FETCH: file %s\n", up->udb_dbname); +#else + printf("FETCH\n"); +#endif break; case UDB_FORWARD: @@ -880,6 +991,7 @@ _udbx_init() */ tempfail: +#ifdef NEWDB for (up = UdbEnts; up->udb_type != UDB_EOLIST; up++) { if (up->udb_type == UDB_DBFETCH) @@ -887,6 +999,7 @@ _udbx_init() (*up->udb_dbp->close)(up->udb_dbp); } } +#endif return EX_TEMPFAIL; } @@ -929,20 +1042,24 @@ hes_udb_get(key, info) { char *name, *type; char *p, **hp; + char kbuf[MAXKEY + 1]; - name = key->data; - type = strchr(name, ':'); + strcpy(kbuf, key->data); + name = kbuf; + type = strrchr(name, ':'); if (type == NULL) return 1; - *type++ = '\0'; + if (strchr(name, '@') != NULL) + return 1; if (tTd(28, 1)) printf("hes_udb_get(%s, %s)\n", name, type); /* make the hesiod query */ hp = hes_resolve(name, type); - if (hp == NULL) + *--type = ':'; + if (hp == NULL || hp[0] == NULL) { /* network problem or timeout */ if (hes_error() == HES_ER_NET) @@ -954,19 +1071,19 @@ hes_udb_get(key, info) { /* ** If there are multiple matches, just return the - ** first one and free the others. + ** first one. ** ** XXX These should really be returned; for example, ** XXX it is legal for :maildrop to be multi-valued. */ - for (p = hp[1]; p; p++) - free(p); - info->data = hp[0]; info->size = (size_t) strlen(info->data); } + if (tTd(28, 80)) + printf("hes_udb_get => %s\n", *hp); + return 0; } #endif /* HESIOD */ @@ -974,9 +1091,10 @@ hes_udb_get(key, info) #else /* not USERDB */ int -udbexpand(a, sendq, e) +udbexpand(a, sendq, aliaslevel, e) ADDRESS *a; ADDRESS **sendq; + int aliaslevel; ENVELOPE *e; { return EX_OK; diff --git a/usr.sbin/sendmail/src/useful.h b/usr.sbin/sendmail/src/useful.h index ba33a792db08e..8f9009ecf0b04 100644 --- a/usr.sbin/sendmail/src/useful.h +++ b/usr.sbin/sendmail/src/useful.h @@ -1,4 +1,5 @@ /* + * Copyright (c) 1995 Eric P. Allman * Copyright (c) 1988, 1993 * The Regents of the University of California. All rights reserved. * @@ -30,13 +31,13 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * @(#)useful.h 8.2 (Berkeley) 9/24/93 + * @(#)useful.h 8.4 (Berkeley) 4/21/95 */ # include <sys/types.h> /* support for bool type */ -typedef char bool; +typedef int bool; # define TRUE 1 # define FALSE 0 diff --git a/usr.sbin/sendmail/src/usersmtp.c b/usr.sbin/sendmail/src/usersmtp.c index 2850defa53ba5..6233e0f1bcfc7 100644 --- a/usr.sbin/sendmail/src/usersmtp.c +++ b/usr.sbin/sendmail/src/usersmtp.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1983 Eric P. Allman + * Copyright (c) 1983, 1995 Eric P. Allman * Copyright (c) 1988, 1993 * The Regents of the University of California. All rights reserved. * @@ -36,9 +36,9 @@ #ifndef lint #ifdef SMTP -static char sccsid[] = "@(#)usersmtp.c 8.18 (Berkeley) 1/24/94 (with SMTP)"; +static char sccsid[] = "@(#)usersmtp.c 8.65 (Berkeley) 9/28/95 (with SMTP)"; #else -static char sccsid[] = "@(#)usersmtp.c 8.18 (Berkeley) 1/24/94 (without SMTP)"; +static char sccsid[] = "@(#)usersmtp.c 8.65 (Berkeley) 9/28/95 (without SMTP)"; #endif #endif /* not lint */ @@ -63,9 +63,7 @@ char SmtpError[MAXLINE] = ""; /* save failure error messages */ int SmtpPid; /* pid of mailer */ bool SmtpNeedIntro; /* need "while talking" in transcript */ -#ifdef __STDC__ -extern smtpmessage(char *f, MAILER *m, MCI *mci, ...); -#endif +extern void smtpmessage __P((char *f, MAILER *m, MCI *mci, ...)); /* ** SMTPINIT -- initialize SMTP. ** @@ -83,6 +81,7 @@ extern smtpmessage(char *f, MAILER *m, MCI *mci, ...); ** creates connection and sends initial protocol. */ +void smtpinit(m, mci, e) struct mailer *m; register MCI *mci; @@ -105,6 +104,8 @@ smtpinit(m, mci, e) SmtpError[0] = '\0'; CurHostName = mci->mci_host; /* XXX UGLY XXX */ + if (CurHostName == NULL) + CurHostName = MyHostName; SmtpNeedIntro = TRUE; switch (mci->mci_state) { @@ -186,18 +187,16 @@ tryhelo: ** Check to see if we actually ended up talking to ourself. ** This means we didn't know about an alias or MX, or we managed ** to connect to an echo server. - ** - ** If this code remains at all, "CheckLoopBack" should be - ** a mailer flag. This is a MAYBENEXTRELEASE feature. */ p = strchr(&SmtpReplyBuffer[4], ' '); if (p != NULL) *p = '\0'; - if (CheckLoopBack && strcasecmp(&SmtpReplyBuffer[4], MyHostName) == 0) + if (!bitnset(M_NOLOOPCHECK, m->m_flags) && + strcasecmp(&SmtpReplyBuffer[4], MyHostName) == 0) { - syserr("553 %s config error: mail loops back to myself", - MyHostName); + syserr("553 %s config error: mail loops back to me (MX problem?)", + mci->mci_host); mci->mci_exitstat = EX_CONFIG; mci->mci_errno = 0; smtpquit(m, mci, e); @@ -244,9 +243,9 @@ tryhelo: /* ** ESMTP_CHECK -- check to see if this implementation likes ESMTP protocol ** -** ** Parameters: ** line -- the response line. +** firstline -- set if this is the first line of the reply. ** m -- the mailer. ** mci -- the mailer connection info. ** e -- the envelope. @@ -256,23 +255,24 @@ tryhelo: */ void -esmtp_check(line, m, mci, e) +esmtp_check(line, firstline, m, mci, e) char *line; + bool firstline; MAILER *m; register MCI *mci; ENVELOPE *e; { - if (strlen(line) < 5) - return; - line += 4; - if (strncmp(line, "ESMTP ", 6) == 0) + if (strstr(line, "ESMTP") != NULL) mci->mci_flags |= MCIF_ESMTP; + if (strstr(line, "8BIT-OK") != NULL) + mci->mci_flags |= MCIF_8BITOK; } /* ** HELO_OPTIONS -- process the options on a HELO line. ** ** Parameters: ** line -- the response line. +** firstline -- set if this is the first line of the reply. ** m -- the mailer. ** mci -- the mailer connection info. ** e -- the envelope. @@ -282,15 +282,19 @@ esmtp_check(line, m, mci, e) */ void -helo_options(line, m, mci, e) +helo_options(line, firstline, m, mci, e) char *line; + bool firstline; MAILER *m; register MCI *mci; ENVELOPE *e; { register char *p; - if (strlen(line) < 5) + if (firstline) + return; + + if (strlen(line) < (SIZE_T) 5) return; line += 4; p = strchr(line, ' '); @@ -309,6 +313,8 @@ helo_options(line, m, mci, e) } else if (strcasecmp(line, "expn") == 0) mci->mci_flags |= MCIF_EXPN; + else if (strcasecmp(line, "dsn") == 0) + mci->mci_flags |= MCIF_DSN; } /* ** SMTPMAILFROM -- send MAIL command @@ -319,6 +325,7 @@ helo_options(line, m, mci, e) ** e -- the envelope (including the sender to specify). */ +int smtpmailfrom(m, mci, e) struct mailer *m; MCI *mci; @@ -326,7 +333,8 @@ smtpmailfrom(m, mci, e) { int r; char *bufp; - char buf[MAXNAME]; + char *bodytype; + char buf[MAXNAME + 1]; char optbuf[MAXLINE]; if (tTd(18, 2)) @@ -338,6 +346,64 @@ smtpmailfrom(m, mci, e) else strcpy(optbuf, ""); + bodytype = e->e_bodytype; + if (bitset(MCIF_8BITMIME, mci->mci_flags)) + { + if (bodytype == NULL && + bitset(MM_MIME8BIT, MimeMode) && + bitset(EF_HAS8BIT, e->e_flags) && + !bitset(EF_DONT_MIME, e->e_flags) && + !bitnset(M_8BITS, m->m_flags)) + bodytype = "8BITMIME"; + if (bodytype != NULL) + { + strcat(optbuf, " BODY="); + strcat(optbuf, bodytype); + } + } + else if (bitnset(M_8BITS, m->m_flags) || + !bitset(EF_HAS8BIT, e->e_flags) || + bitset(MCIF_8BITOK, mci->mci_flags)) + { + /* just pass it through */ + } +#if MIME8TO7 + else if (bitset(MM_CVTMIME, MimeMode) && + !bitset(EF_DONT_MIME, e->e_flags) && + (!bitset(MM_PASS8BIT, MimeMode) || + bitset(EF_IS_MIME, e->e_flags))) + { + /* must convert from 8bit MIME format to 7bit encoded */ + mci->mci_flags |= MCIF_CVT8TO7; + } +#endif + else if (!bitset(MM_PASS8BIT, MimeMode)) + { + /* cannot just send a 8-bit version */ + usrerr("%s does not support 8BITMIME", mci->mci_host); + mci->mci_status = "5.6.3"; + return EX_DATAERR; + } + + if (bitset(MCIF_DSN, mci->mci_flags)) + { + if (e->e_envid != NULL) + { + strcat(optbuf, " ENVID="); + strcat(optbuf, e->e_envid); + } + + /* RET= parameter */ + if (bitset(EF_RET_PARAM, e->e_flags)) + { + strcat(optbuf, " RET="); + if (bitset(EF_NO_BODY_RETN, e->e_flags)) + strcat(optbuf, "HDRS"); + else + strcat(optbuf, "FULL"); + } + } + /* ** Send the MAIL command. ** Designates the sender. @@ -349,7 +415,7 @@ smtpmailfrom(m, mci, e) !bitnset(M_NO_NULL_FROM, m->m_flags)) (void) strcpy(buf, ""); else - expand("\201g", buf, &buf[sizeof buf - 1], e); + expand("\201g", buf, sizeof buf, e); if (buf[0] == '<') { /* strip off <angle brackets> (put back on below) */ @@ -360,7 +426,7 @@ smtpmailfrom(m, mci, e) } else bufp = buf; - if (e->e_from.q_mailer == LocalMailer || + if (bitnset(M_LOCALMAILER, e->e_from.q_mailer->m_flags) || !bitnset(M_FROMPATH, m->m_flags)) { smtpmessage("MAIL From:<%s>%s", m, mci, bufp, optbuf); @@ -373,37 +439,57 @@ smtpmailfrom(m, mci, e) SmtpPhase = mci->mci_phase = "client MAIL"; setproctitle("%s %s: %s", e->e_id, CurHostName, mci->mci_phase); r = reply(m, mci, e, TimeOuts.to_mail, NULL); - if (r < 0 || REPLYTYPE(r) == 4) + if (r < 0 || r == 421) { + /* communications failure/service shutting down */ mci->mci_exitstat = EX_TEMPFAIL; mci->mci_errno = errno; smtpquit(m, mci, e); return EX_TEMPFAIL; } - else if (r == 250) + else if (REPLYTYPE(r) == 4) + { + return EX_TEMPFAIL; + } + else if (REPLYTYPE(r) == 2) { - mci->mci_exitstat = EX_OK; return EX_OK; } + else if (r == 501) + { + /* syntax error in arguments */ + mci->mci_status = "5.5.2"; + return EX_DATAERR; + } + else if (r == 553) + { + /* mailbox name not allowed */ + mci->mci_status = "5.1.3"; + return EX_DATAERR; + } else if (r == 552) { - /* signal service unavailable */ - mci->mci_exitstat = EX_UNAVAILABLE; - smtpquit(m, mci, e); + /* exceeded storage allocation */ + mci->mci_status = "5.2.2"; + return EX_UNAVAILABLE; + } + else if (REPLYTYPE(r) == 5) + { + /* unknown error */ return EX_UNAVAILABLE; } #ifdef LOG if (LogLevel > 1) { - syslog(LOG_CRIT, "%s: SMTP MAIL protocol error: %s", - e->e_id, SmtpReplyBuffer); + syslog(LOG_CRIT, "%s: %.100s: SMTP MAIL protocol error: %s", + e->e_id, mci->mci_host, + shortenstring(SmtpReplyBuffer, 403)); } #endif /* protocol error -- close up */ smtpquit(m, mci, e); - mci->mci_exitstat = EX_PROTOCOL; return EX_PROTOCOL; } /* @@ -422,6 +508,7 @@ smtpmailfrom(m, mci, e) ** Sends the mail via SMTP. */ +int smtprcpt(to, m, mci, e) ADDRESS *to; register MAILER *m; @@ -429,30 +516,77 @@ smtprcpt(to, m, mci, e) ENVELOPE *e; { register int r; + char optbuf[MAXLINE]; + extern char *smtptodsn(); + + strcpy(optbuf, ""); + if (bitset(MCIF_DSN, mci->mci_flags)) + { + /* NOTIFY= parameter */ + if (bitset(QHASNOTIFY, to->q_flags) && + bitset(QPRIMARY, to->q_flags)) + { + bool firstone = TRUE; - smtpmessage("RCPT To:<%s>", m, mci, to->q_user); + strcat(optbuf, " NOTIFY="); + if (bitset(QPINGONSUCCESS, to->q_flags)) + { + strcat(optbuf, "SUCCESS"); + firstone = FALSE; + } + if (bitset(QPINGONFAILURE, to->q_flags)) + { + if (!firstone) + strcat(optbuf, ","); + strcat(optbuf, "FAILURE"); + firstone = FALSE; + } + if (bitset(QPINGONDELAY, to->q_flags)) + { + if (!firstone) + strcat(optbuf, ","); + strcat(optbuf, "DELAY"); + firstone = FALSE; + } + if (firstone) + strcat(optbuf, "NEVER"); + } + + /* ORCPT= parameter */ + if (to->q_orcpt != NULL) + { + strcat(optbuf, " ORCPT="); + strcat(optbuf, to->q_orcpt); + } + } + + smtpmessage("RCPT To:<%s>%s", m, mci, to->q_user, optbuf); SmtpPhase = mci->mci_phase = "client RCPT"; setproctitle("%s %s: %s", e->e_id, CurHostName, mci->mci_phase); r = reply(m, mci, e, TimeOuts.to_rcpt, NULL); + to->q_rstatus = newstr(SmtpReplyBuffer); + to->q_status = smtptodsn(r); + to->q_statmta = mci->mci_host; if (r < 0 || REPLYTYPE(r) == 4) - return (EX_TEMPFAIL); + return EX_TEMPFAIL; else if (REPLYTYPE(r) == 2) - return (EX_OK); + return EX_OK; else if (r == 550 || r == 551 || r == 553) - return (EX_NOUSER); - else if (r == 552 || r == 554) - return (EX_UNAVAILABLE); + return EX_NOUSER; + else if (REPLYTYPE(r) == 5) + return EX_UNAVAILABLE; #ifdef LOG if (LogLevel > 1) { - syslog(LOG_CRIT, "%s: SMTP RCPT protocol error: %s", - e->e_id, SmtpReplyBuffer); + syslog(LOG_CRIT, "%s: %.100s: SMTP RCPT protocol error: %s", + e->e_id, mci->mci_host, + shortenstring(SmtpReplyBuffer, 403)); } #endif - return (EX_PROTOCOL); + return EX_PROTOCOL; } /* ** SMTPDATA -- send the data and clean up the transaction. @@ -469,8 +603,9 @@ smtprcpt(to, m, mci, e) */ static jmp_buf CtxDataTimeout; -static int datatimeout(); +static void datatimeout(); +int smtpdata(m, mci, e) struct mailer *m; register MCI *mci; @@ -496,20 +631,21 @@ smtpdata(m, mci, e) if (r < 0 || REPLYTYPE(r) == 4) { smtpquit(m, mci, e); - return (EX_TEMPFAIL); + return EX_TEMPFAIL; } - else if (r == 554) + else if (REPLYTYPE(r) == 5) { smtprset(m, mci, e); - return (EX_UNAVAILABLE); + return EX_UNAVAILABLE; } else if (r != 354) { #ifdef LOG if (LogLevel > 1) { - syslog(LOG_CRIT, "%s: SMTP DATA-1 protocol error: %s", - e->e_id, SmtpReplyBuffer); + syslog(LOG_CRIT, "%s: %.100s: SMTP DATA-1 protocol error: %s", + e->e_id, mci->mci_host, + shortenstring(SmtpReplyBuffer, 403)); } #endif smtprset(m, mci, e); @@ -533,16 +669,22 @@ smtpdata(m, mci, e) } timeout = e->e_msgsize / 16; - if (timeout < (time_t) 60) - timeout = (time_t) 60; - timeout += e->e_nrcpts * 90; + if (timeout < (time_t) 600) + timeout = (time_t) 600; + timeout += e->e_nrcpts * 300; ev = setevent(timeout, datatimeout, 0); - /* now output the actual message */ - (*e->e_puthdr)(mci, e); - putline("\n", mci); + /* + ** Output the actual message. + */ + + (*e->e_puthdr)(mci, e->e_header, e); (*e->e_putbody)(mci, e, NULL); + /* + ** Cleanup after sending message. + */ + clrevent(ev); if (ferror(mci->mci_out)) @@ -569,28 +711,31 @@ smtpdata(m, mci, e) if (r < 0) { smtpquit(m, mci, e); - return (EX_TEMPFAIL); + return EX_TEMPFAIL; } mci->mci_state = MCIS_OPEN; e->e_statmsg = newstr(&SmtpReplyBuffer[4]); if (REPLYTYPE(r) == 4) - return (EX_TEMPFAIL); - else if (r == 250) - return (EX_OK); - else if (r == 552 || r == 554) - return (EX_UNAVAILABLE); + return EX_TEMPFAIL; + else if (REPLYCLASS(r) != 5) + /* fall through */ ; + else if (REPLYTYPE(r) == 2) + return EX_OK; + else if (REPLYTYPE(r) == 5) + return EX_UNAVAILABLE; #ifdef LOG if (LogLevel > 1) { - syslog(LOG_CRIT, "%s: SMTP DATA-2 protocol error: %s", - e->e_id, SmtpReplyBuffer); + syslog(LOG_CRIT, "%s: %.100s: SMTP DATA-2 protocol error: %s", + e->e_id, mci->mci_host, + shortenstring(SmtpReplyBuffer, 403)); } #endif - return (EX_PROTOCOL); + return EX_PROTOCOL; } -static int +static void datatimeout() { longjmp(CtxDataTimeout, 1); @@ -608,6 +753,7 @@ datatimeout() ** sends the final protocol and closes the connection. */ +void smtpquit(m, mci, e) register MAILER *m; register MCI *mci; @@ -647,6 +793,7 @@ smtpquit(m, mci, e) ** SMTPRSET -- send a RSET (reset) command */ +void smtprset(m, mci, e) register MAILER *m; register MCI *mci; @@ -670,6 +817,7 @@ smtprset(m, mci, e) ** SMTPPROBE -- check the connection state */ +int smtpprobe(mci) register MCI *mci; { @@ -693,9 +841,8 @@ smtpprobe(mci) ** mci -- the mailer connection info structure. ** e -- the current envelope. ** timeout -- the timeout for reads. -** pfunc -- processing function for second and subsequent -** lines of response -- if null, no special -** processing is done. +** pfunc -- processing function called on each line of response. +** If null, no special processing is done. ** ** Returns: ** reply code it reads. @@ -704,6 +851,7 @@ smtpprobe(mci) ** flushes the mail file. */ +int reply(m, mci, e, timeout, pfunc) MAILER *m; MCI *mci; @@ -749,7 +897,6 @@ reply(m, mci, e, timeout, pfunc) if (p == NULL) { bool oldholderrs; - extern char MsgBuf[]; /* err.c */ /* if the remote end closed early, fake an error */ if (errno == 0) @@ -770,16 +917,18 @@ reply(m, mci, e, timeout, pfunc) pause(); mci->mci_state = MCIS_ERROR; smtpquit(m, mci, e); -#ifdef XDEBUG +#if XDEBUG { char wbuf[MAXLINE]; char *p = wbuf; + if (e->e_to != NULL) { - sprintf(p, "%s... ", e->e_to); + sprintf(p, "%s... ", + shortenstring(e->e_to, 203)); p += strlen(p); } - sprintf(p, "reply(%s) during %s", + sprintf(p, "reply(%.100s) during %s", mci->mci_host, SmtpPhase); checkfd012(wbuf); } @@ -815,8 +964,8 @@ reply(m, mci, e, timeout, pfunc) nmessage("050 %s", bufp); /* process the line */ - if (pfunc != NULL && !firstline) - (*pfunc)(bufp, m, mci, e); + if (pfunc != NULL) + (*pfunc)(bufp, firstline, m, mci, e); firstline = FALSE; @@ -871,6 +1020,7 @@ reply(m, mci, e, timeout, pfunc) */ /*VARARGS1*/ +void #ifdef __STDC__ smtpmessage(char *f, MAILER *m, MCI *mci, ...) #else @@ -884,7 +1034,7 @@ smtpmessage(f, m, mci, va_alist) VA_LOCAL_DECL VA_START(mci); - (void) vsprintf(SmtpMsgBuffer, f, ap); + (void) vsnprintf(SmtpMsgBuffer, sizeof SmtpMsgBuffer, f, ap); VA_END; if (tTd(18, 1) || Verbose) diff --git a/usr.sbin/sendmail/src/util.c b/usr.sbin/sendmail/src/util.c index b7e1d14a7bb35..20c98670f1adb 100644 --- a/usr.sbin/sendmail/src/util.c +++ b/usr.sbin/sendmail/src/util.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1983 Eric P. Allman + * Copyright (c) 1983, 1995 Eric P. Allman * Copyright (c) 1988, 1993 * The Regents of the University of California. All rights reserved. * @@ -33,7 +33,7 @@ */ #ifndef lint -static char sccsid[] = "@(#)util.c 8.39.1.5 (Berkeley) 3/5/95"; +static char sccsid[] = "@(#)util.c 8.84.1.2 (Berkeley) 3/4/96"; #endif /* not lint */ # include "sendmail.h" @@ -57,6 +57,7 @@ static char sccsid[] = "@(#)util.c 8.39.1.5 (Berkeley) 3/5/95"; ** deliver */ +void stripquotes(s) char *s; { @@ -107,8 +108,7 @@ xalloc(sz) p = malloc((unsigned) sz); if (p == NULL) { - syserr("Out of memory!!"); - abort(); + syserr("!Out of memory!!"); /* exit(EX_UNAVAILABLE); */ } return (p); @@ -208,6 +208,7 @@ copyqueue(addr) ** prints av. */ +void printav(av) register char **av; { @@ -253,8 +254,9 @@ lower(c) ** output to stdout */ +void xputs(s) - register char *s; + register const char *s; { register int c; register struct metamac *mp; @@ -269,11 +271,20 @@ xputs(s) { if (!isascii(c)) { - if (c == MATCHREPL || c == MACROEXPAND) + if (c == MATCHREPL) { putchar('$'); continue; } + if (c == MACROEXPAND) + { + putchar('$'); + if (strchr("=~&?", *s) != NULL) + putchar(*s++); + if (bitset(0200, *s)) + printf("{%s}", macname(*s++ & 0377)); + continue; + } for (mp = MetaMacros; mp->metaname != '\0'; mp++) { if ((mp->metaval & 0377) == c) @@ -282,6 +293,12 @@ xputs(s) break; } } + if (c == MATCHCLASS || c == MATCHNCLASS) + { + if (!bitset(0200, *s)) + continue; + printf("{%s}", macname(*s++ & 0377)); + } if (mp->metaname != '\0') continue; (void) putchar('\\'); @@ -296,9 +313,6 @@ xputs(s) /* wasn't a meta-macro -- find another way to print it */ switch (c) { - case '\0': - continue; - case '\n': c = 'n'; break; @@ -316,6 +330,8 @@ xputs(s) (void) putchar(c ^ 0100); continue; } + (void) putchar('\\'); + (void) putchar(c); } (void) fflush(stdout); } @@ -336,6 +352,7 @@ xputs(s) ** parse */ +void makelower(p) register char *p; { @@ -365,6 +382,7 @@ makelower(p) ** none. */ +void buildfname(gecos, login, buf) register char *gecos; char *login; @@ -415,6 +433,8 @@ buildfname(gecos, login, buf) ** SFF_MUSTOWN -- "uid" must own this file. ** SFF_NOSLINK -- file cannot be a symbolic link. ** mode -- mode bits that must match. +** st -- if set, points to a stat structure that will +** get the stat info for the file. ** ** Returns: ** 0 if fn exists, is owned by uid, and matches mode. @@ -438,104 +458,195 @@ buildfname(gecos, login, buf) # define S_IXUSR (S_IEXEC) #endif +#define ST_MODE_NOFILE 0171147 /* unlikely to occur */ + int -safefile(fn, uid, gid, uname, flags, mode) +safefile(fn, uid, gid, uname, flags, mode, st) char *fn; uid_t uid; gid_t gid; char *uname; int flags; int mode; + struct stat *st; { register char *p; register struct group *gr = NULL; + int file_errno = 0; struct stat stbuf; + struct stat fstbuf; - if (tTd(54, 4)) + if (tTd(44, 4)) printf("safefile(%s, uid=%d, gid=%d, flags=%x, mode=%o):\n", fn, uid, gid, flags, mode); errno = 0; + if (st == NULL) + st = &fstbuf; - for (p = fn; (p = strchr(++p, '/')) != NULL; *p = '/') + /* first check to see if the file exists at all */ +#ifdef HASLSTAT + if ((bitset(SFF_NOSLINK, flags) ? lstat(fn, st) + : stat(fn, st)) < 0) +#else + if (stat(fn, st) < 0) +#endif { - *p = '\0'; - if (stat(fn, &stbuf) < 0) - break; - if (uid == 0 && !bitset(SFF_ROOTOK, flags)) + file_errno = errno; + } + else if (bitset(SFF_SETUIDOK, flags) && + !bitset(S_IXUSR|S_IXGRP|S_IXOTH, st->st_mode) && + S_ISREG(st->st_mode)) + { + /* + ** If final file is setuid, run as the owner of that + ** file. Gotta be careful not to reveal anything too + ** soon here! + */ + +#ifdef SUID_ROOT_FILES_OK + if (bitset(S_ISUID, st->st_mode)) +#else + if (bitset(S_ISUID, st->st_mode) && st->st_uid != 0) +#endif { - if (bitset(S_IXOTH, stbuf.st_mode)) - continue; - break; + uid = st->st_uid; + uname = NULL; } - if (stbuf.st_uid == uid && bitset(S_IXUSR, stbuf.st_mode)) - continue; - if (stbuf.st_gid == gid && bitset(S_IXGRP, stbuf.st_mode)) - continue; -#ifndef NO_GROUP_SET - if (uname != NULL && - ((gr != NULL && gr->gr_gid == stbuf.st_gid) || - (gr = getgrgid(stbuf.st_gid)) != NULL)) - { - register char **gp; +#ifdef SUID_ROOT_FILES_OK + if (bitset(S_ISGID, st->st_mode)) +#else + if (bitset(S_ISGID, st->st_mode) && st->st_gid != 0) +#endif + gid = st->st_gid; + } - for (gp = gr->gr_mem; *gp != NULL; gp++) - if (strcmp(*gp, uname) == 0) - break; - if (*gp != NULL && bitset(S_IXGRP, stbuf.st_mode)) + if (!bitset(SFF_NOPATHCHECK, flags) || + (uid == 0 && !bitset(SFF_ROOTOK, flags))) + { + /* check the path to the file for acceptability */ + for (p = fn; (p = strchr(++p, '/')) != NULL; *p = '/') + { + *p = '\0'; + if (stat(fn, &stbuf) < 0) + break; + if (uid == 0 && bitset(S_IWGRP|S_IWOTH, stbuf.st_mode)) + message("051 WARNING: writable directory %s", + fn); + 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)) + continue; +#ifndef NO_GROUP_SET + if (uname != NULL && + ((gr != NULL && gr->gr_gid == stbuf.st_gid) || + (gr = getgrgid(stbuf.st_gid)) != NULL)) + { + register char **gp; + + for (gp = gr->gr_mem; gp != NULL && *gp != NULL; gp++) + if (strcmp(*gp, uname) == 0) + break; + if (gp != NULL && *gp != NULL && + bitset(S_IXGRP, stbuf.st_mode)) + continue; + } #endif - if (!bitset(S_IXOTH, stbuf.st_mode)) - break; + if (!bitset(S_IXOTH, stbuf.st_mode)) + break; + } + if (p != NULL) + { + int ret = errno; + + if (ret == 0) + ret = EACCES; + if (tTd(44, 4)) + printf("\t[dir %s] %s\n", fn, errstring(ret)); + *p = '/'; + return ret; + } } - if (p != NULL) - { - int ret = errno; - if (ret == 0) - ret = EACCES; - if (tTd(54, 4)) - printf("\t[dir %s] %s\n", fn, errstring(ret)); - *p = '/'; - return ret; - } + /* + ** If the target file doesn't exist, check the directory to + ** ensure that it is writable by this user. + */ -#ifdef HASLSTAT - if ((bitset(SFF_NOSLINK, flags) ? lstat(fn, &stbuf) - : stat(fn, &stbuf)) < 0) -#else - if (stat(fn, &stbuf) < 0) -#endif + if (file_errno != 0) { - int ret = errno; + int ret = file_errno; - if (tTd(54, 4)) + if (tTd(44, 4)) printf("\t%s\n", errstring(ret)); errno = 0; + if (!bitset(SFF_CREAT, flags)) + return ret; + + /* check to see if legal to create the file */ + p = strrchr(fn, '/'); + if (p == NULL) + return ENOTDIR; + *p = '\0'; + if (stat(fn, &stbuf) >= 0) + { + int md = S_IWRITE|S_IEXEC; + if (stbuf.st_uid != uid) + md >>= 6; + if ((stbuf.st_mode & md) != md) + errno = EACCES; + } + ret = errno; + if (tTd(44, 4)) + printf("\t[final dir %s uid %d mode %o] %s\n", + fn, stbuf.st_uid, stbuf.st_mode, + errstring(ret)); + *p = '/'; + st->st_mode = ST_MODE_NOFILE; return ret; } #ifdef S_ISLNK - if (bitset(SFF_NOSLINK, flags) && S_ISLNK(stbuf.st_mode)) + if (bitset(SFF_NOSLINK, flags) && S_ISLNK(st->st_mode)) { - if (tTd(54, 4)) - printf("\t[slink mode %o]\tEPERM\n", stbuf.st_mode); + if (tTd(44, 4)) + printf("\t[slink mode %o]\tEPERM\n", st->st_mode); return EPERM; } #endif + if (bitset(SFF_REGONLY, flags) && !S_ISREG(st->st_mode)) + { + if (tTd(44, 4)) + printf("\t[non-reg mode %o]\tEPERM\n", st->st_mode); + return EPERM; + } + if (bitset(S_IWUSR|S_IWGRP|S_IWOTH, mode) && + bitset(S_IXUSR|S_IXGRP|S_IXOTH, st->st_mode)) + { + if (tTd(44, 4)) + printf("\t[exec bits %o]\tEPERM]\n", st->st_mode); + return EPERM; + } if (uid == 0 && !bitset(SFF_ROOTOK, flags)) mode >>= 6; - else if (stbuf.st_uid != uid) + else if (st->st_uid != uid) { mode >>= 3; - if (stbuf.st_gid == gid) + if (st->st_gid == gid) ; #ifndef NO_GROUP_SET else if (uname != NULL && - ((gr != NULL && gr->gr_gid == stbuf.st_gid) || - (gr = getgrgid(stbuf.st_gid)) != NULL)) + ((gr != NULL && gr->gr_gid == st->st_gid) || + (gr = getgrgid(st->st_gid)) != NULL)) { register char **gp; @@ -549,22 +660,104 @@ safefile(fn, uid, gid, uname, flags, mode) else mode >>= 3; } - if (tTd(54, 4)) + if (tTd(44, 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 || + st->st_uid, st->st_mode, mode); + if ((st->st_uid == uid || st->st_uid == 0 || !bitset(SFF_MUSTOWN, flags)) && - (stbuf.st_mode & mode) == mode) + (st->st_mode & mode) == mode) { - if (tTd(54, 4)) + if (tTd(44, 4)) printf("\tOK\n"); return 0; } - if (tTd(54, 4)) + if (tTd(44, 4)) printf("\tEACCES\n"); return EACCES; } /* +** SAFEFOPEN -- do a file open with extra checking +** +** Parameters: +** fn -- the file name to open. +** omode -- the open-style mode flags. +** cmode -- the create-style mode flags. +** sff -- safefile flags. +** +** Returns: +** Same as fopen. +*/ + +#ifndef O_ACCMODE +# define O_ACCMODE (O_RDONLY|O_WRONLY|O_RDWR) +#endif + +FILE * +safefopen(fn, omode, cmode, sff) + char *fn; + int omode; + int cmode; + int sff; +{ + int rval; + FILE *fp; + int smode; + struct stat stb, sta; + + if (bitset(O_CREAT, omode)) + sff |= SFF_CREAT; + smode = 0; + switch (omode & O_ACCMODE) + { + case O_RDONLY: + smode = S_IREAD; + break; + + case O_WRONLY: + smode = S_IWRITE; + break; + + case O_RDWR: + smode = S_IREAD|S_IWRITE; + break; + + default: + smode = 0; + break; + } + if (bitset(SFF_OPENASROOT, sff)) + rval = safefile(fn, 0, 0, NULL, sff, smode, &stb); + else + rval = safefile(fn, RealUid, RealGid, RealUserName, + sff, smode, &stb); + if (rval != 0) + { + errno = rval; + return NULL; + } + if (stb.st_mode == ST_MODE_NOFILE) + omode |= O_EXCL; + + fp = dfopen(fn, omode, cmode); + if (fp == NULL) + return NULL; + if (bitset(O_EXCL, omode)) + return fp; + if (fstat(fileno(fp), &sta) < 0 || + sta.st_nlink != stb.st_nlink || + sta.st_dev != stb.st_dev || + sta.st_ino != stb.st_ino || + sta.st_uid != stb.st_uid || + sta.st_gid != stb.st_gid) + { + syserr("554 cannot open: file %s changed after open", fn); + fclose(fp); + errno = EPERM; + return NULL; + } + return fp; +} +/* ** FIXCRLF -- fix <CR><LF> in line. ** ** Looks for the <CR><LF> combination and turns it into the @@ -583,6 +776,7 @@ safefile(fn, uid, gid, uname, flags, mode) ** line is changed in place. */ +void fixcrlf(line, stripnl) char *line; bool stripnl; @@ -607,10 +801,6 @@ fixcrlf(line, stripnl) ** whatever), so this tries to get around it. */ -#ifndef O_ACCMODE -# define O_ACCMODE (O_RDONLY|O_WRONLY|O_RDWR) -#endif - struct omodes { int mask; @@ -693,16 +883,46 @@ dfopen(filename, omode, cmode) ** output of l to fp. */ +void putline(l, mci) register char *l; register MCI *mci; { + putxline(l, mci, PXLF_MAPFROM); +} +/* +** PUTXLINE -- putline with flags bits. +** +** This routine always guarantees outputing a newline (or CRLF, +** as appropriate) at the end of the string. +** +** Parameters: +** l -- line to put. +** mci -- the mailer connection information. +** pxflags -- flag bits: +** PXLF_MAPFROM -- map From_ to >From_. +** PXLF_STRIP8BIT -- strip 8th bit. +** +** Returns: +** none +** +** Side Effects: +** output of l to fp. +*/ + +void +putxline(l, mci, pxflags) + register char *l; + register MCI *mci; + int pxflags; +{ register char *p; register char svchar; int slop = 0; /* strip out 0200 bits -- these can look like TELNET protocol */ - if (bitset(MCIF_7BIT, mci->mci_flags)) + if (bitset(MCIF_7BIT, mci->mci_flags) || + bitset(PXLF_STRIP8BIT, pxflags)) { for (p = l; (svchar = *p) != '\0'; ++p) if (bitset(0200, svchar)) @@ -734,6 +954,15 @@ putline(l, mci) if (TrafficLogFile != NULL) (void) putc('.', TrafficLogFile); } + else if (l[0] == 'F' && slop == 0 && + bitset(PXLF_MAPFROM, pxflags) && + strncmp(l, "From ", 5) == 0 && + bitnset(M_ESCFROM, mci->mci_mailer->m_flags)) + { + (void) putc('>', mci->mci_out); + if (TrafficLogFile != NULL) + (void) putc('>', TrafficLogFile); + } fputs(l, mci->mci_out); (void) putc('!', mci->mci_out); fputs(mci->mci_mailer->m_eol, mci->mci_out); @@ -760,7 +989,14 @@ putline(l, mci) (void) putc(*l, mci->mci_out); fputs(mci->mci_mailer->m_eol, mci->mci_out); if (*l == '\n') - ++l; + { + if (*++l != ' ' && *l != '\t' && *l != '\0') + { + (void) putc(' ', mci->mci_out); + if (TrafficLogFile != NULL) + (void) putc(' ', TrafficLogFile); + } + } } while (l[0] != '\0'); } /* @@ -776,6 +1012,7 @@ putline(l, mci) ** f is unlinked. */ +void xunlink(f) char *f; { @@ -806,13 +1043,14 @@ xunlink(f) ** fp is closed. */ +void xfclose(fp, a, b) FILE *fp; char *a, *b; { if (tTd(53, 99)) printf("xfclose(%x) %s %s\n", fp, a, b); -#ifdef XDEBUG +#if XDEBUG if (fileno(fp) == 1) syserr("xfclose(%s %s): fd = 1", a, b); #endif @@ -839,10 +1077,7 @@ xfclose(fp, a, b) */ static jmp_buf CtxReadTimeout; -static int readtimeout(); -static EVENT *GlobalTimeout = NULL; -static bool EnableTimeout = FALSE; -static int ReadProgress; +static void readtimeout(); char * sfgets(buf, siz, fp, timeout, during) @@ -868,22 +1103,19 @@ sfgets(buf, siz, fp, timeout, during) { # ifdef LOG syslog(LOG_NOTICE, - "timeout waiting for input from %s during %s\n", + "timeout waiting for input from %.100s during %s", CurHostName? CurHostName: "local", during); # endif errno = 0; usrerr("451 timeout waiting for input during %s", during); buf[0] = '\0'; -#ifdef XDEBUG +#if XDEBUG checkfd012(during); #endif return (NULL); } - if (GlobalTimeout == NULL) - ev = setevent(timeout, readtimeout, 0); - else - EnableTimeout = TRUE; + ev = setevent(timeout, readtimeout, 0); } /* try to read */ @@ -898,10 +1130,7 @@ sfgets(buf, siz, fp, timeout, during) } /* clear the event if it has not sprung */ - if (GlobalTimeout == NULL) - clrevent(ev); - else - EnableTimeout = FALSE; + clrevent(ev); /* clean up the books and exit */ LineNumber++; @@ -914,50 +1143,30 @@ sfgets(buf, siz, fp, timeout, during) } if (TrafficLogFile != NULL) fprintf(TrafficLogFile, "%05d <<< %s", getpid(), buf); - if (SevenBit) + if (SevenBitInput) + { for (p = buf; *p != '\0'; p++) *p &= ~0200; - return (buf); -} - -void -sfgetset(timeout) - time_t timeout; -{ - /* cancel pending timer */ - if (GlobalTimeout != NULL) - { - clrevent(GlobalTimeout); - GlobalTimeout = NULL; } - - /* schedule fresh one if so requested */ - if (timeout != 0) + else if (!HasEightBits) { - ReadProgress = LineNumber; - GlobalTimeout = setevent(timeout, readtimeout, timeout); + for (p = buf; *p != '\0'; p++) + { + if (bitset(0200, *p)) + { + HasEightBits = TRUE; + break; + } + } } + return (buf); } -static +static void readtimeout(timeout) time_t timeout; { - /* terminate if ordinary timeout */ - if (GlobalTimeout == NULL) - longjmp(CtxReadTimeout, 1); - - /* terminate if no progress was made -- reset state */ - if (EnableTimeout && (LineNumber <= ReadProgress)) - { - EnableTimeout = FALSE; - GlobalTimeout = NULL; - longjmp(CtxReadTimeout, 2); - } - - /* schedule a new timeout */ - GlobalTimeout = NULL; - sfgetset(timeout); + longjmp(CtxReadTimeout, 1); } /* ** FGETFOLDED -- like fgets, but know about folded lines. @@ -1033,7 +1242,9 @@ fgetfolded(buf, n, f) } if (p == bp) return (NULL); - *--p = '\0'; + if (p[-1] == '\n') + p--; + *p = '\0'; return (bp); } /* @@ -1095,6 +1306,7 @@ atobool(s) ** none. */ +int atooct(s) register char *s; { @@ -1241,10 +1453,11 @@ strcontainedin(a, b) ** none */ +void checkfd012(where) char *where; { -#ifdef XDEBUG +#if XDEBUG register int i; struct stat stbuf; @@ -1277,9 +1490,9 @@ checkfd012(where) ** none. */ -#include <netdb.h> #include <arpa/inet.h> +void printopenfds(logit) bool logit; { @@ -1299,18 +1512,22 @@ printopenfds(logit) ** logit -- if set, send output to syslog instead of stdout. */ +void dumpfd(fd, printclosed, logit) int fd; bool printclosed; bool logit; { - register struct hostent *hp; register char *p; + char *hp; char *fmtstr; - struct sockaddr_in sin; +#ifdef S_IFSOCK + SOCKADDR sa; +#endif auto int slen; struct stat st; char buf[200]; + extern char *hostnamebyanyaddr(); p = buf; sprintf(p, "%3d: ", fd); @@ -1341,26 +1558,30 @@ dumpfd(fd, printclosed, logit) case S_IFSOCK: sprintf(p, "SOCK "); p += strlen(p); - slen = sizeof sin; - if (getsockname(fd, (struct sockaddr *) &sin, &slen) < 0) - sprintf(p, "(badsock)"); + slen = sizeof sa; + if (getsockname(fd, &sa.sa, &slen) < 0) + sprintf(p, "(%s)", errstring(errno)); else { - hp = gethostbyaddr((char *) &sin.sin_addr, slen, AF_INET); - sprintf(p, "%s/%d", hp == NULL ? inet_ntoa(sin.sin_addr) - : hp->h_name, ntohs(sin.sin_port)); + hp = hostnamebyanyaddr(&sa); + if (sa.sa.sa_family == AF_INET) + sprintf(p, "%s/%d", hp, ntohs(sa.sin.sin_port)); + else + sprintf(p, "%s", hp); } p += strlen(p); sprintf(p, "->"); p += strlen(p); - slen = sizeof sin; - if (getpeername(fd, (struct sockaddr *) &sin, &slen) < 0) - sprintf(p, "(badsock)"); + slen = sizeof sa; + if (getpeername(fd, &sa.sa, &slen) < 0) + sprintf(p, "(%s)", errstring(errno)); else { - hp = gethostbyaddr((char *) &sin.sin_addr, slen, AF_INET); - sprintf(p, "%s/%d", hp == NULL ? inet_ntoa(sin.sin_addr) - : hp->h_name, ntohs(sin.sin_port)); + hp = hostnamebyanyaddr(&sa); + if (sa.sa.sa_family == AF_INET) + sprintf(p, "%s/%d", hp, ntohs(sa.sin.sin_port)); + else + sprintf(p, "%s", hp); } break; #endif @@ -1411,7 +1632,7 @@ defprint: printit: #ifdef LOG if (logit) - syslog(LOG_DEBUG, "%s", buf); + syslog(LOG_DEBUG, "%.800s", buf); else #endif printf("%s\n", buf); @@ -1436,7 +1657,7 @@ printit: char * shortenstring(s, m) - register char *s; + register const char *s; int m; { int l; @@ -1444,7 +1665,7 @@ shortenstring(s, m) l = strlen(s); if (l < m) - return s; + return (char *) s; if (m > MAXSHORTSTR) m = MAXSHORTSTR; else if (m < 10) @@ -1466,6 +1687,240 @@ shortenstring(s, m) return buf; } /* +** SHORTEN_HOSTNAME -- strip local domain information off of hostname. +** +** Parameters: +** host -- the host to shorten (stripped in place). +** +** Returns: +** none. +*/ + +void +shorten_hostname(host) + char host[]; +{ + register char *p; + char *mydom; + int i; + bool canon = FALSE; + + /* strip off final dot */ + p = &host[strlen(host) - 1]; + if (*p == '.') + { + *p = '\0'; + canon = TRUE; + } + + /* see if there is any domain at all -- if not, we are done */ + p = strchr(host, '.'); + if (p == NULL) + return; + + /* yes, we have a domain -- see if it looks like us */ + mydom = macvalue('m', CurEnv); + if (mydom == NULL) + mydom = ""; + i = strlen(++p); + if ((canon ? strcasecmp(p, mydom) : strncasecmp(p, mydom, i)) == 0 && + (mydom[i] == '.' || mydom[i] == '\0')) + *--p = '\0'; +} +/* +** PROG_OPEN -- open a program for reading +** +** Parameters: +** argv -- the argument list. +** pfd -- pointer to a place to store the file descriptor. +** e -- the current envelope. +** +** Returns: +** pid of the process -- -1 if it failed. +*/ + +int +prog_open(argv, pfd, e) + char **argv; + int *pfd; + ENVELOPE *e; +{ + int pid; + int i; + int saveerrno; + int fdv[2]; + char *p, *q; + char buf[MAXLINE + 1]; + extern int DtableSize; + + if (pipe(fdv) < 0) + { + syserr("%s: cannot create pipe for stdout", argv[0]); + return -1; + } + pid = fork(); + if (pid < 0) + { + syserr("%s: cannot fork", argv[0]); + close(fdv[0]); + close(fdv[1]); + return -1; + } + if (pid > 0) + { + /* parent */ + close(fdv[1]); + *pfd = fdv[0]; + return pid; + } + + /* child -- close stdin */ + close(0); + + /* stdout goes back to parent */ + close(fdv[0]); + if (dup2(fdv[1], 1) < 0) + { + syserr("%s: cannot dup2 for stdout", argv[0]); + _exit(EX_OSERR); + } + close(fdv[1]); + + /* stderr goes to transcript if available */ + if (e->e_xfp != NULL) + { + if (dup2(fileno(e->e_xfp), 2) < 0) + { + syserr("%s: cannot dup2 for stderr", argv[0]); + _exit(EX_OSERR); + } + } + + /* this process has no right to the queue file */ + if (e->e_lockfp != NULL) + close(fileno(e->e_lockfp)); + + /* run as default user */ + endpwent(); + setgid(DefGid); + setuid(DefUid); + + /* run in some directory */ + if (ProgMailer != NULL) + p = ProgMailer->m_execdir; + else + p = NULL; + for (; p != NULL; p = q) + { + q = strchr(p, ':'); + if (q != NULL) + *q = '\0'; + expand(p, buf, sizeof buf, e); + if (q != NULL) + *q++ = ':'; + if (buf[0] != '\0' && chdir(buf) >= 0) + break; + } + if (p == NULL) + { + /* backup directories */ + if (chdir("/tmp") < 0) + (void) chdir("/"); + } + + /* arrange for all the files to be closed */ + for (i = 3; i < DtableSize; i++) + { + register int j; + + if ((j = fcntl(i, F_GETFD, 0)) != -1) + (void) fcntl(i, F_SETFD, j | 1); + } + + /* now exec the process */ + execve(argv[0], (ARGV_T) argv, (ARGV_T) UserEnviron); + + /* woops! failed */ + saveerrno = errno; + syserr("%s: cannot exec", argv[0]); + if (transienterror(saveerrno)) + _exit(EX_OSERR); + _exit(EX_CONFIG); +} +/* +** GET_COLUMN -- look up a Column in a line buffer +** +** Parameters: +** line -- the raw text line to search. +** col -- the column number to fetch. +** delim -- the delimiter between columns. If null, +** use white space. +** buf -- the output buffer. +** +** Returns: +** buf if successful. +** NULL otherwise. +*/ + +char * +get_column(line, col, delim, buf) + char line[]; + int col; + char delim; + char buf[]; +{ + char *p; + char *begin, *end; + int i; + char delimbuf[3]; + + if (delim == '\0') + strcpy(delimbuf, "\n\t "); + else + { + delimbuf[0] = delim; + delimbuf[1] = '\0'; + } + + p = line; + if (*p == '\0') + return NULL; /* line empty */ + if (*p == delim && col == 0) + return NULL; /* first column empty */ + + begin = line; + + if (col == 0 && delim == '\0') + { + while (*begin && isspace(*begin)) + begin++; + } + + for (i = 0; i < col; i++) + { + if ((begin = strpbrk(begin, delimbuf)) == NULL) + return NULL; /* no such column */ + begin++; + if (delim == '\0') + { + while (*begin && isspace(*begin)) + begin++; + } + } + + end = strpbrk(begin, delimbuf); + if (end == NULL) + { + strcpy(buf, begin); + } + else + { + strncpy(buf, begin, end - begin); + buf[end - begin] = '\0'; + } + return buf; +} +/* ** CLEANSTRCPY -- copy string keeping out bogus characters ** ** Parameters: @@ -1517,8 +1972,8 @@ cleanstrcpy(t, f, l) char * denlstring(s, strict, logattacks) char *s; - int strict; - int logattacks; + bool strict; + bool logattacks; { register char *p; int l; @@ -1548,9 +2003,9 @@ denlstring(s, strict, logattacks) #ifdef LOG if (logattacks) { - syslog(LOG_NOTICE, "POSSIBLE ATTACK from %s: newline in string \"%s\"", + syslog(LOG_NOTICE, "POSSIBLE ATTACK from %.100s: newline in string \"%s\"", RealHostName == NULL ? "[UNKNOWN]" : RealHostName, - shortenstring(bp, 80)); + shortenstring(bp, 203)); } #endif diff --git a/usr.sbin/sendmail/src/version.c b/usr.sbin/sendmail/src/version.c index ad4dd520c80af..3c6f7d18fa7ff 100644 --- a/usr.sbin/sendmail/src/version.c +++ b/usr.sbin/sendmail/src/version.c @@ -33,7 +33,7 @@ */ #ifndef lint -static char sccsid[] = "@(#)version.c 8.6.12.1 (Berkeley) 3/28/95"; +static char sccsid[] = "@(#)version.c 8.7.5.1 (Berkeley) 3/4/96"; #endif /* not lint */ -char Version[] = "8.6.12"; +char Version[] = "8.7.5"; |