Annotation of 43BSD/usr.lib/sendmail/src/sendmail.h, revision 1.1.1.1

1.1       root        1: /*
                      2: **  Sendmail
                      3: **  Copyright (c) 1983  Eric P. Allman
                      4: **  Berkeley, California
                      5: **
                      6: **  Copyright (c) 1983 Regents of the University of California.
                      7: **  All rights reserved.  The Berkeley software License Agreement
                      8: **  specifies the terms and conditions for redistribution.
                      9: **
                     10: **     @(#)sendmail.h  5.8 (Berkeley) 1/10/86
                     11: */
                     12: 
                     13: /*
                     14: **  SENDMAIL.H -- Global definitions for sendmail.
                     15: */
                     16: 
                     17: 
                     18: 
                     19: # ifdef _DEFINE
                     20: # define EXTERN
                     21: # ifndef lint
                     22: static char SmailSccsId[] =    "@(#)sendmail.h 5.8             1/10/86";
                     23: # endif lint
                     24: # else  _DEFINE
                     25: # define EXTERN extern
                     26: # endif _DEFINE
                     27: 
                     28: # include <stdio.h>
                     29: # include <ctype.h>
                     30: # include <setjmp.h>
                     31: # include "conf.h"
                     32: # include "useful.h"
                     33: 
                     34: # ifdef LOG
                     35: # include <sys/syslog.h>
                     36: # endif LOG
                     37: 
                     38: # ifdef DAEMON
                     39: # ifdef VMUNIX
                     40: # include <sys/socket.h>
                     41: # include <netinet/in.h>
                     42: # endif VMUNIX
                     43: # endif DAEMON
                     44: 
                     45: 
                     46: # define PSBUFSIZE     (MAXNAME + MAXATOM)     /* size of prescan buffer */
                     47: 
                     48: 
                     49: /*
                     50: **  Data structure for bit maps.
                     51: **
                     52: **     Each bit in this map can be referenced by an ascii character.
                     53: **     This is 128 possible bits, or 12 8-bit bytes.
                     54: */
                     55: 
                     56: #define BITMAPBYTES    16      /* number of bytes in a bit map */
                     57: #define BYTEBITS       8       /* number of bits in a byte */
                     58: 
                     59: /* internal macros */
                     60: #define _BITWORD(bit)  (bit / (BYTEBITS * sizeof (int)))
                     61: #define _BITBIT(bit)   (1 << (bit % (BYTEBITS * sizeof (int))))
                     62: 
                     63: typedef int    BITMAP[BITMAPBYTES / sizeof (int)];
                     64: 
                     65: /* test bit number N */
                     66: #define bitnset(bit, map)      ((map)[_BITWORD(bit)] & _BITBIT(bit))
                     67: 
                     68: /* set bit number N */
                     69: #define setbitn(bit, map)      (map)[_BITWORD(bit)] |= _BITBIT(bit)
                     70: 
                     71: /* clear bit number N */
                     72: #define clrbitn(bit, map)      (map)[_BITWORD(bit)] &= ~_BITBIT(bit)
                     73: 
                     74: /* clear an entire bit map */
                     75: #define clrbitmap(map)         bzero((char *) map, BITMAPBYTES)
                     76: /*
                     77: **  Address structure.
                     78: **     Addresses are stored internally in this structure.
                     79: */
                     80: 
                     81: struct address
                     82: {
                     83:        char            *q_paddr;       /* the printname for the address */
                     84:        char            *q_user;        /* user name */
                     85:        char            *q_host;        /* host name */
                     86:        struct mailer   *q_mailer;      /* mailer to use */
                     87:        u_short         q_flags;        /* status flags, see below */
                     88:        short           q_uid;          /* user-id of receiver (if known) */
                     89:        short           q_gid;          /* group-id of receiver (if known) */
                     90:        char            *q_home;        /* home dir (local mailer only) */
                     91:        char            *q_fullname;    /* full name if known */
                     92:        struct address  *q_next;        /* chain */
                     93:        struct address  *q_alias;       /* address this results from */
                     94:        struct address  *q_tchain;      /* temporary use chain */
                     95:        time_t          q_timeout;      /* timeout for this address */
                     96: };
                     97: 
                     98: typedef struct address ADDRESS;
                     99: 
                    100: # define QDONTSEND     000001  /* don't send to this address */
                    101: # define QBADADDR      000002  /* this address is verified bad */
                    102: # define QGOODUID      000004  /* the q_uid q_gid fields are good */
                    103: # define QPRIMARY      000010  /* set from argv */
                    104: # define QQUEUEUP      000020  /* queue for later transmission */
                    105: /*
                    106: **  Mailer definition structure.
                    107: **     Every mailer known to the system is declared in this
                    108: **     structure.  It defines the pathname of the mailer, some
                    109: **     flags associated with it, and the argument vector to
                    110: **     pass to it.  The flags are defined in conf.c
                    111: **
                    112: **     The argument vector is expanded before actual use.  All
                    113: **     words except the first are passed through the macro
                    114: **     processor.
                    115: */
                    116: 
                    117: struct mailer
                    118: {
                    119:        char    *m_name;        /* symbolic name of this mailer */
                    120:        char    *m_mailer;      /* pathname of the mailer to use */
                    121:        BITMAP  m_flags;        /* status flags, see below */
                    122:        short   m_mno;          /* mailer number internally */
                    123:        char    **m_argv;       /* template argument vector */
                    124:        short   m_s_rwset;      /* rewriting set for sender addresses */
                    125:        short   m_r_rwset;      /* rewriting set for recipient addresses */
                    126:        char    *m_eol;         /* end of line string */
                    127:        long    m_maxsize;      /* size limit on message to this mailer */
                    128: };
                    129: 
                    130: typedef struct mailer  MAILER;
                    131: 
                    132: /* bits for m_flags */
                    133: # define M_CANONICAL   'C'     /* make addresses canonical "u@dom" */
                    134: # define M_EXPENSIVE   'e'     /* it costs to use this mailer.... */
                    135: # define M_ESCFROM     'E'     /* escape From lines to >From */
                    136: # define M_FOPT                'f'     /* mailer takes picky -f flag */
                    137: # define M_HST_UPPER   'h'     /* preserve host case distinction */
                    138: # define M_INTERNAL    'I'     /* SMTP to another sendmail site */
                    139: # define M_LOCAL       'l'     /* delivery is to this host */
                    140: # define M_LIMITS      'L'     /* must enforce SMTP line limits */
                    141: # define M_MUSER       'm'     /* can handle multiple users at once */
                    142: # define M_NHDR                'n'     /* don't insert From line */
                    143: # define M_FROMPATH    'p'     /* use reverse-path in MAIL FROM: */
                    144: # define M_ROPT                'r'     /* mailer takes picky -r flag */
                    145: # define M_SECURE_PORT 'R'     /* try to send on a reserved TCP port */
                    146: # define M_STRIPQ      's'     /* strip quote chars from user/host */
                    147: # define M_RESTR       'S'     /* must be daemon to execute */
                    148: # define M_USR_UPPER   'u'     /* preserve user case distinction */
                    149: # define M_UGLYUUCP    'U'     /* this wants an ugly UUCP from line */
                    150: # define M_XDOT                'X'     /* use hidden-dot algorithm */
                    151: 
                    152: EXTERN MAILER  *Mailer[MAXMAILERS+1];
                    153: 
                    154: EXTERN MAILER  *LocalMailer;           /* ptr to local mailer */
                    155: EXTERN MAILER  *ProgMailer;            /* ptr to program mailer */
                    156: /*
                    157: **  Header structure.
                    158: **     This structure is used internally to store header items.
                    159: */
                    160: 
                    161: struct header
                    162: {
                    163:        char            *h_field;       /* the name of the field */
                    164:        char            *h_value;       /* the value of that field */
                    165:        struct header   *h_link;        /* the next header */
                    166:        u_short         h_flags;        /* status bits, see below */
                    167:        BITMAP          h_mflags;       /* m_flags bits needed */
                    168: };
                    169: 
                    170: typedef struct header  HDR;
                    171: 
                    172: /*
                    173: **  Header information structure.
                    174: **     Defined in conf.c, this struct declares the header fields
                    175: **     that have some magic meaning.
                    176: */
                    177: 
                    178: struct hdrinfo
                    179: {
                    180:        char    *hi_field;      /* the name of the field */
                    181:        u_short hi_flags;       /* status bits, see below */
                    182: };
                    183: 
                    184: extern struct hdrinfo  HdrInfo[];
                    185: 
                    186: /* bits for h_flags and hi_flags */
                    187: # define H_EOH         00001   /* this field terminates header */
                    188: # define H_RCPT                00002   /* contains recipient addresses */
                    189: # define H_DEFAULT     00004   /* if another value is found, drop this */
                    190: # define H_RESENT      00010   /* this address is a "Resent-..." address */
                    191: # define H_CHECK       00020   /* check h_mflags against m_flags */
                    192: # define H_ACHECK      00040   /* ditto, but always (not just default) */
                    193: # define H_FORCE       00100   /* force this field, even if default */
                    194: # define H_TRACE       00200   /* this field contains trace information */
                    195: # define H_FROM                00400   /* this is a from-type field */
                    196: # define H_VALID       01000   /* this field has a validated value */
                    197: /*
                    198: **  Envelope structure.
                    199: **     This structure defines the message itself.  There is usually
                    200: **     only one of these -- for the message that we originally read
                    201: **     and which is our primary interest -- but other envelopes can
                    202: **     be generated during processing.  For example, error messages
                    203: **     will have their own envelope.
                    204: */
                    205: 
                    206: struct envelope
                    207: {
                    208:        HDR             *e_header;      /* head of header list */
                    209:        long            e_msgpriority;  /* adjusted priority of this message */
                    210:        time_t          e_ctime;        /* time message appeared in the queue */
                    211:        char            *e_to;          /* the target person */
                    212:        char            *e_receiptto;   /* return receipt address */
                    213:        ADDRESS         e_from;         /* the person it is from */
                    214:        char            **e_fromdomain; /* the domain part of the sender */
                    215:        ADDRESS         *e_sendqueue;   /* list of message recipients */
                    216:        ADDRESS         *e_errorqueue;  /* the queue for error responses */
                    217:        long            e_msgsize;      /* size of the message in bytes */
                    218:        int             e_nrcpts;       /* number of recipients */
                    219:        short           e_class;        /* msg class (priority, junk, etc.) */
                    220:        short           e_flags;        /* flags, see below */
                    221:        short           e_hopcount;     /* number of times processed */
                    222:        int             (*e_puthdr)();  /* function to put header of message */
                    223:        int             (*e_putbody)(); /* function to put body of message */
                    224:        struct envelope *e_parent;      /* the message this one encloses */
                    225:        struct envelope *e_sibling;     /* the next envelope of interest */
                    226:        char            *e_df;          /* location of temp file */
                    227:        FILE            *e_dfp;         /* temporary file */
                    228:        char            *e_id;          /* code for this entry in queue */
                    229:        FILE            *e_xfp;         /* transcript file */
                    230:        char            *e_message;     /* error message */
                    231:        char            *e_macro[128];  /* macro definitions */
                    232: };
                    233: 
                    234: typedef struct envelope        ENVELOPE;
                    235: 
                    236: /* values for e_flags */
                    237: #define EF_OLDSTYLE    000001          /* use spaces (not commas) in hdrs */
                    238: #define EF_INQUEUE     000002          /* this message is fully queued */
                    239: #define EF_TIMEOUT     000004          /* this message is too old */
                    240: #define EF_CLRQUEUE    000010          /* disk copy is no longer needed */
                    241: #define EF_SENDRECEIPT 000020          /* send a return receipt */
                    242: #define EF_FATALERRS   000040          /* fatal errors occured */
                    243: #define EF_KEEPQUEUE   000100          /* keep queue files always */
                    244: #define EF_RESPONSE    000200          /* this is an error or return receipt */
                    245: #define EF_RESENT      000400          /* this message is being forwarded */
                    246: 
                    247: EXTERN ENVELOPE        *CurEnv;        /* envelope currently being processed */
                    248: /*
                    249: **  Message priority classes.
                    250: **
                    251: **     The message class is read directly from the Priority: header
                    252: **     field in the message.
                    253: **
                    254: **     CurEnv->e_msgpriority is the number of bytes in the message plus
                    255: **     the creation time (so that jobs ``tend'' to be ordered correctly),
                    256: **     adjusted by the message class, the number of recipients, and the
                    257: **     amount of time the message has been sitting around.  This number
                    258: **     is used to order the queue.  Higher values mean LOWER priority.
                    259: **
                    260: **     Each priority class point is worth WkClassFact priority points;
                    261: **     each recipient is worth WkRecipFact priority points.  Each time
                    262: **     we reprocess a message the priority is adjusted by WkTimeFact.
                    263: **     WkTimeFact should normally decrease the priority so that jobs
                    264: **     that have historically failed will be run later; thanks go to
                    265: **     Jay Lepreau at Utah for pointing out the error in my thinking.
                    266: **
                    267: **     The "class" is this number, unadjusted by the age or size of
                    268: **     this message.  Classes with negative representations will have
                    269: **     error messages thrown away if they are not local.
                    270: */
                    271: 
                    272: struct priority
                    273: {
                    274:        char    *pri_name;      /* external name of priority */
                    275:        int     pri_val;        /* internal value for same */
                    276: };
                    277: 
                    278: EXTERN struct priority Priorities[MAXPRIORITIES];
                    279: EXTERN int             NumPriorities;  /* pointer into Priorities */
                    280: /*
                    281: **  Rewrite rules.
                    282: */
                    283: 
                    284: struct rewrite
                    285: {
                    286:        char    **r_lhs;        /* pattern match */
                    287:        char    **r_rhs;        /* substitution value */
                    288:        struct rewrite  *r_next;/* next in chain */
                    289: };
                    290: 
                    291: EXTERN struct rewrite  *RewriteRules[MAXRWSETS];
                    292: 
                    293: /*
                    294: **  Special characters in rewriting rules.
                    295: **     These are used internally only.
                    296: **     The COND* rules are actually used in macros rather than in
                    297: **             rewriting rules, but are given here because they
                    298: **             cannot conflict.
                    299: */
                    300: 
                    301: /* left hand side items */
                    302: # define MATCHZANY     '\020'  /* match zero or more tokens */
                    303: # define MATCHANY      '\021'  /* match one or more tokens */
                    304: # define MATCHONE      '\022'  /* match exactly one token */
                    305: # define MATCHCLASS    '\023'  /* match one token in a class */
                    306: # define MATCHNCLASS   '\024'  /* match anything not in class */
                    307: # define MATCHREPL     '\025'  /* replacement on RHS for above */
                    308: 
                    309: /* right hand side items */
                    310: # define CANONNET      '\026'  /* canonical net, next token */
                    311: # define CANONHOST     '\027'  /* canonical host, next token */
                    312: # define CANONUSER     '\030'  /* canonical user, next N tokens */
                    313: # define CALLSUBR      '\031'  /* call another rewriting set */
                    314: 
                    315: /* conditionals in macros */
                    316: # define CONDIF                '\032'  /* conditional if-then */
                    317: # define CONDELSE      '\033'  /* conditional else */
                    318: # define CONDFI                '\034'  /* conditional fi */
                    319: 
                    320: /* bracket characters for host name lookup */
                    321: # define HOSTBEGIN     '\035'  /* hostname lookup begin */
                    322: # define HOSTEND       '\036'  /* hostname lookup end */
                    323: 
                    324: /* \001 is also reserved as the macro expansion character */
                    325: /*
                    326: **  Information about hosts that we have looked up recently.
                    327: **
                    328: **     This stuff is 4.2/3bsd specific.
                    329: */
                    330: 
                    331: # ifdef DAEMON
                    332: # ifdef VMUNIX
                    333: 
                    334: # define HOSTINFO      struct hostinfo
                    335: 
                    336: HOSTINFO
                    337: {
                    338:        char            *ho_name;       /* name of this host */
                    339:        struct in_addr  ho_inaddr;      /* internet address */
                    340:        short           ho_flags;       /* flag bits, see below */
                    341:        short           ho_errno;       /* error number on last connection */
                    342:        short           ho_exitstat;    /* exit status from last connection */
                    343: };
                    344: 
                    345: 
                    346: /* flag bits */
                    347: #define HOF_VALID      00001           /* this entry is valid */
                    348: 
                    349: # endif VMUNIX
                    350: # endif DAEMON
                    351: /*
                    352: **  Symbol table definitions
                    353: */
                    354: 
                    355: struct symtab
                    356: {
                    357:        char            *s_name;        /* name to be entered */
                    358:        char            s_type;         /* general type (see below) */
                    359:        struct symtab   *s_next;        /* pointer to next in chain */
                    360:        union
                    361:        {
                    362:                BITMAP          sv_class;       /* bit-map of word classes */
                    363:                ADDRESS         *sv_addr;       /* pointer to address header */
                    364:                MAILER          *sv_mailer;     /* pointer to mailer */
                    365:                char            *sv_alias;      /* alias */
                    366: # ifdef HOSTINFO
                    367:                HOSTINFO        sv_host;        /* host information */
                    368: # endif HOSTINFO
                    369:        }       s_value;
                    370: };
                    371: 
                    372: typedef struct symtab  STAB;
                    373: 
                    374: /* symbol types */
                    375: # define ST_UNDEF      0       /* undefined type */
                    376: # define ST_CLASS      1       /* class map */
                    377: # define ST_ADDRESS    2       /* an address in parsed format */
                    378: # define ST_MAILER     3       /* a mailer header */
                    379: # define ST_ALIAS      4       /* an alias */
                    380: # define ST_HOST       5       /* host information */
                    381: 
                    382: # define s_class       s_value.sv_class
                    383: # define s_address     s_value.sv_addr
                    384: # define s_mailer      s_value.sv_mailer
                    385: # define s_alias       s_value.sv_alias
                    386: # define s_host                s_value.sv_host
                    387: 
                    388: extern STAB    *stab();
                    389: 
                    390: /* opcodes to stab */
                    391: # define ST_FIND       0       /* find entry */
                    392: # define ST_ENTER      1       /* enter if not there */
                    393: /*
                    394: **  STRUCT EVENT -- event queue.
                    395: **
                    396: **     Maintained in sorted order.
                    397: **
                    398: **     We store the pid of the process that set this event to insure
                    399: **     that when we fork we will not take events intended for the parent.
                    400: */
                    401: 
                    402: struct event
                    403: {
                    404:        time_t          ev_time;        /* time of the function call */
                    405:        int             (*ev_func)();   /* function to call */
                    406:        int             ev_arg;         /* argument to ev_func */
                    407:        int             ev_pid;         /* pid that set this event */
                    408:        struct event    *ev_link;       /* link to next item */
                    409: };
                    410: 
                    411: typedef struct event   EVENT;
                    412: 
                    413: EXTERN EVENT   *EventQueue;            /* head of event queue */
                    414: /*
                    415: **  Operation, send, and error modes
                    416: **
                    417: **     The operation mode describes the basic operation of sendmail.
                    418: **     This can be set from the command line, and is "send mail" by
                    419: **     default.
                    420: **
                    421: **     The send mode tells how to send mail.  It can be set in the
                    422: **     configuration file.  It's setting determines how quickly the
                    423: **     mail will be delivered versus the load on your system.  If the
                    424: **     -v (verbose) flag is given, it will be forced to SM_DELIVER
                    425: **     mode.
                    426: **
                    427: **     The error mode tells how to return errors.
                    428: */
                    429: 
                    430: EXTERN char    OpMode;         /* operation mode, see below */
                    431: 
                    432: #define MD_DELIVER     'm'             /* be a mail sender */
                    433: #define MD_ARPAFTP     'a'             /* old-style arpanet protocols */
                    434: #define MD_SMTP                's'             /* run SMTP on standard input */
                    435: #define MD_DAEMON      'd'             /* run as a daemon */
                    436: #define MD_VERIFY      'v'             /* verify: don't collect or deliver */
                    437: #define MD_TEST                't'             /* test mode: resolve addrs only */
                    438: #define MD_INITALIAS   'i'             /* initialize alias database */
                    439: #define MD_PRINT       'p'             /* print the queue */
                    440: #define MD_FREEZE      'z'             /* freeze the configuration file */
                    441: 
                    442: 
                    443: EXTERN char    SendMode;       /* send mode, see below */
                    444: 
                    445: #define SM_DELIVER     'i'             /* interactive delivery */
                    446: #define SM_QUICKD      'j'             /* deliver w/o queueing */
                    447: #define SM_FORK                'b'             /* deliver in background */
                    448: #define SM_QUEUE       'q'             /* queue, don't deliver */
                    449: #define SM_VERIFY      'v'             /* verify only (used internally) */
                    450: 
                    451: /* used only as a parameter to sendall */
                    452: #define SM_DEFAULT     '\0'            /* unspecified, use SendMode */
                    453: 
                    454: 
                    455: EXTERN char    ErrorMode;      /* error mode, see below */
                    456: 
                    457: #define EM_PRINT       'p'             /* print errors */
                    458: #define EM_MAIL                'm'             /* mail back errors */
                    459: #define EM_WRITE       'w'             /* write back errors */
                    460: #define EM_BERKNET     'e'             /* special berknet processing */
                    461: #define EM_QUIET       'q'             /* don't print messages (stat only) */
                    462: 
                    463: /* offset used to issure that the error messages for name server error
                    464:  * codes are unique.
                    465:  */
                    466: #define        MAX_ERRNO       100
                    467: /*
                    468: **  Global variables.
                    469: */
                    470: 
                    471: EXTERN bool    FromFlag;       /* if set, "From" person is explicit */
                    472: EXTERN bool    NoAlias;        /* if set, don't do any aliasing */
                    473: EXTERN bool    ForceMail;      /* if set, mail even if already got a copy */
                    474: EXTERN bool    MeToo;          /* send to the sender also */
                    475: EXTERN bool    IgnrDot;        /* don't let dot end messages */
                    476: EXTERN bool    SaveFrom;       /* save leading "From" lines */
                    477: EXTERN bool    Verbose;        /* set if blow-by-blow desired */
                    478: EXTERN bool    GrabTo;         /* if set, get recipients from msg */
                    479: EXTERN bool    NoReturn;       /* don't return letter to sender */
                    480: EXTERN bool    SuprErrs;       /* set if we are suppressing errors */
                    481: EXTERN bool    QueueRun;       /* currently running message from the queue */
                    482: EXTERN bool    HoldErrs;       /* only output errors to transcript */
                    483: EXTERN bool    NoConnect;      /* don't connect to non-local mailers */
                    484: EXTERN bool    SuperSafe;      /* be extra careful, even if expensive */
                    485: EXTERN bool    ForkQueueRuns;  /* fork for each job when running the queue */
                    486: EXTERN bool    AutoRebuild;    /* auto-rebuild the alias database as needed */
                    487: EXTERN bool    CheckAliases;   /* parse addresses during newaliases */
                    488: EXTERN int     SafeAlias;      /* minutes to wait until @:@ in alias file */
                    489: EXTERN time_t  TimeOut;        /* time until timeout */
                    490: EXTERN FILE    *InChannel;     /* input connection */
                    491: EXTERN FILE    *OutChannel;    /* output connection */
                    492: EXTERN int     RealUid;        /* when Daemon, real uid of caller */
                    493: EXTERN int     RealGid;        /* when Daemon, real gid of caller */
                    494: EXTERN int     DefUid;         /* default uid to run as */
                    495: EXTERN int     DefGid;         /* default gid to run as */
                    496: EXTERN int     OldUmask;       /* umask when sendmail starts up */
                    497: EXTERN int     Errors;         /* set if errors (local to single pass) */
                    498: EXTERN int     ExitStat;       /* exit status code */
                    499: EXTERN int     AliasLevel;     /* depth of aliasing */
                    500: EXTERN int     MotherPid;      /* proc id of parent process */
                    501: EXTERN int     LineNumber;     /* line number in current input */
                    502: EXTERN time_t  ReadTimeout;    /* timeout on reads */
                    503: EXTERN int     LogLevel;       /* level of logging to perform */
                    504: EXTERN int     FileMode;       /* mode on files */
                    505: EXTERN int     QueueLA;        /* load average starting forced queueing */
                    506: EXTERN int     RefuseLA;       /* load average refusing connections are */
                    507: EXTERN int     QueueFactor;    /* slope of queue function */
                    508: EXTERN time_t  QueueIntvl;     /* intervals between running the queue */
                    509: EXTERN char    *AliasFile;     /* location of alias file */
                    510: EXTERN char    *HelpFile;      /* location of SMTP help file */
                    511: EXTERN char    *StatFile;      /* location of statistics summary */
                    512: EXTERN char    *QueueDir;      /* location of queue directory */
                    513: EXTERN char    *FileName;      /* name to print on error messages */
                    514: EXTERN char    *SmtpPhase;     /* current phase in SMTP processing */
                    515: EXTERN char    *MyHostName;    /* name of this host for SMTP messages */
                    516: EXTERN char    *RealHostName;  /* name of host we are talking to */
                    517: EXTERN char    *CurHostName;   /* current host we are dealing with */
                    518: EXTERN jmp_buf TopFrame;       /* branch-to-top-of-loop-on-error frame */
                    519: EXTERN bool    QuickAbort;     /*  .... but only if we want a quick abort */
                    520: extern char    *ConfFile;      /* location of configuration file [conf.c] */
                    521: extern char    *FreezeFile;    /* location of frozen memory image [conf.c] */
                    522: extern char    Arpa_Info[];    /* the reply code for Arpanet info [conf.c] */
                    523: extern ADDRESS NullAddress;    /* a null (template) address [main.c] */
                    524: EXTERN char    SpaceSub;       /* substitution for <lwsp> */
                    525: EXTERN int     WkClassFact;    /* multiplier for message class -> priority */
                    526: EXTERN int     WkRecipFact;    /* multiplier for # of recipients -> priority */
                    527: EXTERN int     WkTimeFact;     /* priority offset each time this job is run */
                    528: EXTERN int     CheckPointLimit;        /* deliveries before checkpointing */
                    529: EXTERN char    *PostMasterCopy;        /* address to get errs cc's */
                    530: EXTERN char    *TrustedUsers[MAXTRUST+1];      /* list of trusted users */
                    531: EXTERN char    *UserEnviron[MAXUSERENVIRON+1]; /* saved user environment */
                    532: /*
                    533: **  Trace information
                    534: */
                    535: 
                    536: /* trace vector and macros for debugging flags */
                    537: EXTERN u_char  tTdvect[100];
                    538: # define tTd(flag, level)      (tTdvect[flag] >= level)
                    539: # define tTdlevel(flag)                (tTdvect[flag])
                    540: /*
                    541: **  Miscellaneous information.
                    542: */
                    543: 
                    544: # include      <sysexits.h>
                    545: 
                    546: 
                    547: /*
                    548: **  Some in-line functions
                    549: */
                    550: 
                    551: /* set exit status */
                    552: #define setstat(s)     { \
                    553:                                if (ExitStat == EX_OK || ExitStat == EX_TEMPFAIL) \
                    554:                                        ExitStat = s; \
                    555:                        }
                    556: 
                    557: /* make a copy of a string */
                    558: #define newstr(s)      strcpy(xalloc(strlen(s) + 1), s)
                    559: 
                    560: #define STRUCTCOPY(s, d)       d = s
                    561: 
                    562: 
                    563: /*
                    564: **  Declarations of useful functions
                    565: */
                    566: 
                    567: extern ADDRESS *parseaddr();
                    568: extern char    *xalloc();
                    569: extern bool    sameaddr();
                    570: extern FILE    *dfopen();
                    571: extern EVENT   *setevent();
                    572: extern char    *sfgets();
                    573: extern char    *queuename();
                    574: extern time_t  curtime();

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.