put getcanonname into service switch
[unix-history] / usr / src / usr.sbin / sendmail / src / sendmail.h
index e73b955..b63fcbc 100644 (file)
@@ -1,11 +1,11 @@
 /*
 /*
- * 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.
  *
  * %sccs.include.redist.c%
  *
  * Copyright (c) 1988, 1993
  *     The Regents of the University of California.  All rights reserved.
  *
  * %sccs.include.redist.c%
  *
- *     @(#)sendmail.h  8.42 (Berkeley) %G%
+ *     @(#)sendmail.h  8.132 (Berkeley) %G%
  */
 
 /*
  */
 
 /*
@@ -15,7 +15,7 @@
 # ifdef _DEFINE
 # define EXTERN
 # ifndef lint
 # ifdef _DEFINE
 # define EXTERN
 # ifndef lint
-static char SmailSccsId[] =    "@(#)sendmail.h 8.42            %G%";
+static char SmailSccsId[] =    "@(#)sendmail.h 8.132           %G%";
 # endif
 # else /*  _DEFINE */
 # define EXTERN extern
 # endif
 # else /*  _DEFINE */
 # define EXTERN extern
@@ -27,10 +27,13 @@ static char SmailSccsId[] = "@(#)sendmail.h 8.42            %G%";
 # include <stdio.h>
 # include <ctype.h>
 # include <setjmp.h>
 # include <stdio.h>
 # include <ctype.h>
 # include <setjmp.h>
-# include <sysexits.h>
 # include <string.h>
 # include <time.h>
 # include <errno.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 "conf.h"
 
 # include "conf.h"
 # include "conf.h"
@@ -66,15 +69,15 @@ static char SmailSccsId[] = "@(#)sendmail.h 8.42            %G%";
 **  Data structure for bit maps.
 **
 **     Each bit in this map can be referenced by an ascii character.
 **  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 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)];
 
 
 typedef int    BITMAP[BITMAPBYTES / sizeof (int)];
 
@@ -112,13 +115,12 @@ 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 */
        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) */
        char            *q_fullname;    /* full name if known */
        char            *q_fullname;    /* full name of this person */
        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) */
        char            *q_fullname;    /* full name if known */
        char            *q_fullname;    /* full name of this person */
-       time_t          q_timeout;      /* timeout for this address */
        struct address  *q_next;        /* chain */
        struct address  *q_alias;       /* parent in alias tree */
        struct address  *q_sibling;     /* sibling in alias tree */
        struct address  *q_next;        /* chain */
        struct address  *q_alias;       /* parent in alias tree */
        struct address  *q_sibling;     /* sibling in alias tree */
@@ -127,18 +129,26 @@ struct address
 
 typedef struct address ADDRESS;
 
 
 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)
 # define QPSEUDO       000040  /* only on the list for verification */
 
 # define NULLADDR      ((ADDRESS *) NULL)
 # define QPSEUDO       000040  /* only on the list for verification */
@@ -158,8 +168,12 @@ struct mailer
 {
        char    *m_name;        /* symbolic name of this mailer */
        char    *m_mailer;      /* pathname of the mailer to use */
 {
        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 */
        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 */
        char    **m_argv;       /* template argument vector */
        short   m_sh_rwset;     /* rewrite set: sender header addresses */
        short   m_se_rwset;     /* rewrite set: sender envelope addresses */
@@ -169,15 +183,20 @@ 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 */
        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 */
 };
 
 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_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 */
                /*      'D'     /* CF: include Date: */
 # define M_EXPENSIVE   'e'     /* it costs to use this mailer.... */
 # define M_ESCFROM     'E'     /* escape From lines to >From */
@@ -186,25 +205,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_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_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_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_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_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 */
                /*      '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 */
                /*      '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_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];
 
 
 EXTERN MAILER  *Mailer[MAXMAILERS+1];
 
@@ -243,18 +276,21 @@ struct hdrinfo
 extern struct hdrinfo  HdrInfo[];
 
 /* bits for h_flags and hi_flags */
 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_STRIPVAL    0x4000  /* strip value from header (Bcc:) */
 \f/*
 **  Information about currently open connections to mailers, or to
 **  hosts that we have looked up recently.
 \f/*
 **  Information about currently open connections to mailers, or to
 **  hosts that we have looked up recently.
@@ -276,20 +312,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_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 */
        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 */
 
 /* states */
 #define MCIS_CLOSED    0               /* no traffic on this connection */
@@ -331,14 +374,14 @@ ENVELOPE
        short           e_nsent;        /* number of sends since checkpoint */
        short           e_sendmode;     /* message send mode */
        short           e_errormode;    /* error return mode */
        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 */
+       int             (*e_puthdr)__P((MCI *, HDR *, ENVELOPE *));
                                        /* function to put header of message */
        int             (*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 */
                                        /* function to put header of message */
        int             (*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 */
        FILE            *e_dfp;         /* temporary file */
        char            *e_id;          /* code for this entry in queue */
        FILE            *e_xfp;         /* transcript file */
@@ -348,12 +391,19 @@ 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_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 */
 };
 
 /* 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_CLRQUEUE    0x0000008       /* disk copy is no longer needed */
 #define EF_SENDRECEIPT 0x0000010       /* send a return receipt */
 #define EF_FATALERRS   0x0000020       /* fatal errors occured */
@@ -368,6 +418,12 @@ 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_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 */
 
 EXTERN ENVELOPE        *CurEnv;        /* envelope currently being processed */
 \f/*
 
 EXTERN ENVELOPE        *CurEnv;        /* envelope currently being processed */
 \f/*
@@ -424,37 +480,37 @@ EXTERN struct rewrite     *RewriteRules[MAXRWSETS];
 */
 
 /* left hand side items */
 */
 
 /* 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 */
 # define MATCHLOOKUP   '\035'  /* look up and replace a sequence */
 # define MATCHELOOKUP  '\036'  /* end of the sequence */
 
 /* right hand side items */
 # define MATCHLOOKUP   '\035'  /* look up and replace a sequence */
 # define MATCHELOOKUP  '\036'  /* end of the sequence */
 
 /* 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 */
 
 /* 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 */
 
 /* 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 */
 
 /* 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 */
 
 /* 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
 
 /* to make the code clearer */
 # define MATCHZERO     CANONHOST
@@ -497,6 +553,7 @@ NAMECANON
 
 # define MAPCLASS      struct _mapclass
 # define MAP           struct _map
 
 # define MAPCLASS      struct _mapclass
 # define MAP           struct _map
+# define MAXMAPACTIONS 3               /* size of map_actions array */
 
 
 /*
 
 
 /*
@@ -507,32 +564,46 @@ MAP
 {
        MAPCLASS        *map_class;     /* the class of this map */
        char            *map_mname;     /* name of this 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_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 */
        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 */
+
+/* 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
 
 /*
 **  The class of a map -- essentially the functions to call
@@ -559,6 +630,7 @@ 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_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 */
 \f/*
 **  Symbol table definitions
 */
 \f/*
 **  Symbol table definitions
 */
@@ -579,6 +651,8 @@ struct symtab
                char            *sv_hostsig;    /* host signature */
                MCI             sv_mci;         /* mailer connection info */
                NAMECANON       sv_namecanon;   /* canonical name cache */
                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;
 };
 
        }       s_value;
 };
 
@@ -594,6 +668,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_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
 # define ST_MCI                16      /* mailer connection info (offset) */
 
 # define s_class       s_value.sv_class
@@ -620,7 +696,7 @@ extern void         stabapply __P((void (*)(STAB *, int), int));
 struct event
 {
        time_t          ev_time;        /* time of the function call */
 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 */
                                        /* function to call */
        int             ev_arg;         /* argument to ev_func */
        int             ev_pid;         /* pid that set this event */
@@ -631,7 +707,7 @@ typedef struct event        EVENT;
 
 EXTERN EVENT   *EventQueue;            /* head of event queue */
 \f/*
 
 EXTERN EVENT   *EventQueue;            /* head of event queue */
 \f/*
-**  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
 **
 **     The operation mode describes the basic operation of sendmail.
 **     This can be set from the command line, and is "send mail" by
@@ -661,7 +737,6 @@ EXTERN char OpMode;         /* operation mode, see below */
 
 /* values for e_sendmode -- send modes */
 #define SM_DELIVER     'i'             /* interactive delivery */
 
 /* 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_VERIFY      'v'             /* verify only (used internally) */
 #define SM_FORK                'b'             /* deliver in background */
 #define SM_QUEUE       'q'             /* queue, don't deliver */
 #define SM_VERIFY      'v'             /* verify only (used internally) */
@@ -676,6 +751,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) */
 #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
 \f/*
 **  Additional definitions
 */
 \f/*
 **  Additional definitions
 */
@@ -687,15 +793,16 @@ EXTERN char       OpMode;         /* operation mode, see below */
 */
 
 #define PRIV_PUBLIC            0       /* what have I got to hide? */
 */
 
 #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_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
 
 /* struct defining such things */
 struct prival
@@ -709,12 +816,12 @@ struct prival
 **  Flags passed to remotename, parseaddr, allocaddr, and buildaddr.
 */
 
 **  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
 
 #define RF_COPYALL             (RF_COPYPARSE|RF_COPYPADDR)
 #define RF_COPYNONE            0
 
@@ -727,6 +834,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_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 */
 
 
 /*
 
 
 /*
@@ -755,6 +879,28 @@ union bigsockaddr
 };
 
 #define SOCKADDR       union bigsockaddr
 };
 
 #define SOCKADDR       union bigsockaddr
+
+
+/*
+**  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 */
+
+EXTERN int     VendorCode;     /* vendor-specific operation enhancements */
 \f/*
 **  Global variables.
 */
 \f/*
 **  Global variables.
 */
@@ -765,7 +911,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    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 */
 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 */
@@ -774,8 +919,10 @@ 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    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 time_t  SafeAlias;      /* interval to wait until @:@ in alias file */
 EXTERN FILE    *InChannel;     /* input connection */
 EXTERN FILE    *OutChannel;    /* output connection */
@@ -787,7 +934,6 @@ 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     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 */
 EXTERN int     LineNumber;     /* line number in current input */
 EXTERN int     LogLevel;       /* level of logging to perform */
 EXTERN int     FileMode;       /* mode on files */
@@ -813,9 +959,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    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    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    NoMXforCanon;   /* 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] */
 EXTERN char    SpaceSub;       /* substitution for <lwsp> */
 EXTERN int     PrivacyFlags;   /* privacy flags */
 EXTERN char    *ConfFile;      /* location of configuration file [conf.c] */
@@ -832,10 +979,17 @@ 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 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 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 char    *PostMasterCopy;        /* address to get errs cc's */
 EXTERN int     CheckpointInterval;     /* queue file checkpoint interval */
 EXTERN bool    DontPruneRoutes;        /* don't prune source routes */
-extern bool    BrokenSmtpPeers;        /* peers can't handle 2-line greeting */
 EXTERN int     MaxMciCache;            /* maximum entries in MCI cache */
 EXTERN time_t  MciCacheTimeout;        /* maximum idle time on connections */
 EXTERN char    *QueueLimitRecipient;   /* limit queue runs to this recipient */
 EXTERN int     MaxMciCache;            /* maximum entries in MCI cache */
 EXTERN time_t  MciCacheTimeout;        /* maximum idle time on connections */
 EXTERN char    *QueueLimitRecipient;   /* limit queue runs to this recipient */
@@ -867,11 +1021,17 @@ EXTERN struct
        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_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 */
                        /* 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;
 
 } 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
 
 /*
 **  Trace information
@@ -911,25 +1071,27 @@ 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 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 EVENT           *setevent __P((time_t, void(*)(), 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 const char      *errstring __P((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 const char      *errstring __P((int));
-extern void            expand __P((char *, char *, char *, ENVELOPE *));
+extern void            expand __P((char *, char *, size_t, ENVELOPE *));
 extern void            define __P((int, char *, ENVELOPE *));
 extern char            *macvalue __P((int, ENVELOPE *));
 extern void            define __P((int, char *, ENVELOPE *));
 extern char            *macvalue __P((int, ENVELOPE *));
-extern char            **prescan __P((char *, int, char[], int, char **));
+extern char            *macname __P((int));
+extern int             macid __P((char *, char **));
+extern char            **prescan __P((char *, int, char[], int, char **, char *));
 extern int             rewrite __P((char **, int, int, ENVELOPE *));
 extern char            *fgetfolded __P((char *, int, FILE *));
 extern int             rewrite __P((char **, int, int, ENVELOPE *));
 extern char            *fgetfolded __P((char *, int, FILE *));
-extern ADDRESS         *recipient __P((ADDRESS *, ADDRESS **, ENVELOPE *));
+extern ADDRESS         *recipient __P((ADDRESS *, ADDRESS **, int, ENVELOPE *));
 extern ENVELOPE                *newenvelope __P((ENVELOPE *, ENVELOPE *));
 extern void            dropenvelope __P((ENVELOPE *));
 extern ENVELOPE                *newenvelope __P((ENVELOPE *, ENVELOPE *));
 extern void            dropenvelope __P((ENVELOPE *));
-extern void            clearenvelope __P((ENVELOPE *, int));
+extern void            clearenvelope __P((ENVELOPE *, bool));
 extern char            *username __P(());
 extern MCI             *mci_get __P((char *, MAILER *));
 extern char            *username __P(());
 extern MCI             *mci_get __P((char *, MAILER *));
-extern char            *pintvl __P((time_t, int));
+extern char            *pintvl __P((time_t, bool));
 extern char            *map_rewrite __P((MAP *, char *, int, char **));
 extern ADDRESS         *getctladdr __P((ADDRESS *));
 extern char            *anynet_ntoa __P((SOCKADDR *));
 extern char            *map_rewrite __P((MAP *, char *, int, char **));
 extern ADDRESS         *getctladdr __P((ADDRESS *));
 extern char            *anynet_ntoa __P((SOCKADDR *));
@@ -942,7 +1104,25 @@ 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 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 void            commaize __P((HDR *, char *, bool, MCI *, ENVELOPE *));
+extern char            *hvalue __P((char *, HDR *));
+extern char            *defcharset __P((ENVELOPE *));
+extern bool            emptyaddr __P((ADDRESS *));
+extern int             sendtolist __P((char *, ADDRESS *, ADDRESS **, int, ENVELOPE *));
+extern bool            wordinclass __P((char *, int));
+extern char            *denlstring __P((char *, bool, bool));
+extern void            printaddr __P((ADDRESS *, 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            clrevent __P((EVENT *));
+extern void            setsender __P((char *, ENVELOPE *, char **, bool));
+extern FILE            *safefopen __P((char *, int, 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));
 
 /* ellipsis is a different case though */
 #ifdef __STDC__
 
 /* ellipsis is a different case though */
 #ifdef __STDC__