sendmail.h
上传用户:xu_441
上传日期:2007-01-04
资源大小:1640k
文件大小:70k
源码类别:

Email客户端

开发平台:

Unix_Linux

  1. /*
  2.  * Copyright (c) 1998, 1999 Sendmail, Inc. and its suppliers.
  3.  * All rights reserved.
  4.  * Copyright (c) 1983, 1995-1997 Eric P. Allman.  All rights reserved.
  5.  * Copyright (c) 1988, 1993
  6.  * The Regents of the University of California.  All rights reserved.
  7.  *
  8.  * By using this file, you agree to the terms and conditions set
  9.  * forth in the LICENSE file which can be found at the top level of
  10.  * the sendmail distribution.
  11.  */
  12. /*
  13. **  SENDMAIL.H -- MTA-specific definitions for sendmail.
  14. */
  15. #ifndef _SENDMAIL_H
  16. #define _SENDMAIL_H 1
  17. #ifdef _DEFINE
  18. # define EXTERN
  19. # ifndef lint
  20. static char SmailId[] = "@(#)$Id: sendmail.h,v 8.485 1999/12/06 22:10:05 gshapiro Exp $";
  21. # endif /* ! lint */
  22. #else /* _DEFINE */
  23. # define EXTERN extern
  24. #endif /* _DEFINE */
  25. #include <unistd.h>
  26. #include <stddef.h>
  27. #include <stdlib.h>
  28. # include <stdio.h>
  29. #include <ctype.h>
  30. #include <setjmp.h>
  31. #include <string.h>
  32. #include <time.h>
  33. #ifdef EX_OK
  34. # undef EX_OK /* for SVr4.2 SMP */
  35. #endif /* EX_OK */
  36. #include <sysexits.h>
  37. #include "sendmail/sendmail.h"
  38. #include "bf.h"
  39. #include "timers.h"
  40. #ifdef LOG
  41. # include <syslog.h>
  42. #endif /* LOG */
  43. #if NETINET || NETINET6 || NETUNIX || NETISO || NETNS || NETX25
  44. # include <sys/socket.h>
  45. #endif /* NETINET || NETINET6 || NETUNIX || NETISO || NETNS || NETX25 */
  46. #if NETUNIX
  47. # include <sys/un.h>
  48. #endif /* NETUNIX */
  49. #if NETINET || NETINET6
  50. # include <netinet/in.h>
  51. #endif /* NETINET || NETINET6 */
  52. #if NETINET6
  53. /*
  54. **  There is no standard yet for IPv6 includes.
  55. **  Specify OS specific implementation in conf.h
  56. */
  57. #endif /* NETINET6 */
  58. #if NETISO
  59. # include <netiso/iso.h>
  60. #endif /* NETISO */
  61. #if NETNS
  62. # include <netns/ns.h>
  63. #endif /* NETNS */
  64. #if NETX25
  65. # include <netccitt/x25.h>
  66. #endif /* NETX25 */
  67. #if NAMED_BIND
  68. # include <arpa/nameser.h>
  69. # ifdef NOERROR
  70. #  undef NOERROR /* avoid <sys/streams.h> conflict */
  71. # endif /* NOERROR */
  72. # include <resolv.h>
  73. #endif /* NAMED_BIND */
  74. #ifdef HESIOD
  75. # include <hesiod.h>
  76. # if !defined(HES_ER_OK) || defined(HESIOD_INTERFACES)
  77. #  define HESIOD_INIT /* support for the new interface */
  78. # endif /* !defined(HES_ER_OK) || defined(HESIOD_INTERFACES) */
  79. #endif /* HESIOD */
  80. #if SASL  /* include the sasl include files if we have them */
  81. # include <sasl.h>
  82. # if defined(SASL_VERSION_MAJOR) && defined(SASL_VERSION_MINOR) && defined(SASL_VERSION_STEP)
  83. #  define SASL_VERSION (SASL_VERSION_MAJOR * 10000)  + (SASL_VERSION_MINOR * 100) + SASL_VERSION_STEP
  84. #  if SASL == 1
  85. #   undef SASL
  86. #   define SASL SASL_VERSION
  87. #  else /* SASL == 1 */
  88. #   if SASL != SASL_VERSION
  89.   ERROR README: -DSASL (SASL) does not agree with the version of the CYRUS_SASL library (SASL_VERSION)
  90.   ERROR README: see README!
  91. #   endif /* SASL != SASL_VERSION */
  92. #  endif /* SASL == 1 */
  93. # else /* defined(SASL_VERSION_MAJOR) && defined(SASL_VERSION_MINOR) && defined(SASL_VERSION_STEP) */
  94. #  if SASL == 1
  95.   ERROR README: please set -DSASL to the version of the CYRUS_SASL library
  96.   ERROR README: see README!
  97. #  endif /* SASL == 1 */
  98. # endif /* defined(SASL_VERSION_MAJOR) && defined(SASL_VERSION_MINOR) && defined(SASL_VERSION_STEP) */
  99. #endif /* SASL */
  100. /*
  101. **  Following are "sort of" configuration constants, but they should
  102. **  be pretty solid on most architectures today.  They have to be
  103. **  defined after <arpa/nameser.h> because some versions of that
  104. **  file also define them.  In all cases, we can't use sizeof because
  105. **  some systems (e.g., Crays) always treat everything as being at
  106. **  least 64 bits.
  107. */
  108. #ifndef INADDRSZ
  109. # define INADDRSZ 4 /* size of an IPv4 address in bytes */
  110. #endif /* ! INADDRSZ */
  111. #ifndef IN6ADDRSZ
  112. # define IN6ADDRSZ 16 /* size of an IPv6 address in bytes */
  113. #endif /* ! IN6ADDRSZ */
  114. #ifndef INT16SZ
  115. # define INT16SZ 2 /* size of a 16 bit integer in bytes */
  116. #endif /* ! INT16SZ */
  117. #ifndef INT32SZ
  118. # define INT32SZ 4 /* size of a 32 bit integer in bytes */
  119. #endif /* ! INT32SZ */
  120. /*
  121. **  Error return from inet_addr(3), in case not defined in /usr/include.
  122. */
  123. #ifndef INADDR_NONE
  124. # define INADDR_NONE 0xffffffff
  125. #endif /* ! INADDR_NONE */
  126. /* forward references for prototypes */
  127. typedef struct envelope ENVELOPE;
  128. typedef struct mailer MAILER;
  129. /*
  130. **  Address structure.
  131. ** Addresses are stored internally in this structure.
  132. */
  133. struct address
  134. {
  135. char *q_paddr; /* the printname for the address */
  136. char *q_user; /* user name */
  137. char *q_ruser; /* real user name, or NULL if q_user */
  138. char *q_host; /* host name */
  139. struct mailer *q_mailer; /* mailer to use */
  140. u_long q_flags; /* status flags, see below */
  141. uid_t q_uid; /* user-id of receiver (if known) */
  142. gid_t q_gid; /* group-id of receiver (if known) */
  143. char *q_home; /* home dir (local mailer only) */
  144. char *q_fullname; /* full name if known */
  145. struct address *q_next; /* chain */
  146. struct address *q_alias; /* address this results from */
  147. char *q_owner; /* owner of q_alias */
  148. struct address *q_tchain; /* temporary use chain */
  149. char *q_orcpt; /* ORCPT parameter from RCPT TO: line */
  150. char *q_status; /* status code for DSNs */
  151. char *q_rstatus; /* remote status message for DSNs */
  152. time_t q_statdate; /* date of status messages */
  153. char *q_statmta; /* MTA generating q_rstatus */
  154. short q_state; /* address state, see below */
  155. short q_specificity; /* how "specific" this address is */
  156. };
  157. typedef struct address ADDRESS;
  158. /* bit values for q_flags */
  159. #define QGOODUID 0x00000001 /* the q_uid q_gid fields are good */
  160. #define QPRIMARY 0x00000002 /* set from RCPT or argv */
  161. #define QNOTREMOTE 0x00000004 /* address not for remote forwarding */
  162. #define QSELFREF 0x00000008 /* this address references itself */
  163. #define QBOGUSSHELL 0x00000010 /* user has no valid shell listed */
  164. #define QUNSAFEADDR 0x00000020 /* address acquired via unsafe path */
  165. #define QPINGONSUCCESS 0x00000040 /* give return on successful delivery */
  166. #define QPINGONFAILURE 0x00000080 /* give return on failure */
  167. #define QPINGONDELAY 0x00000100 /* give return on message delay */
  168. #define QHASNOTIFY 0x00000200 /* propogate notify parameter */
  169. #define QRELAYED 0x00000400 /* DSN: relayed to non-DSN aware sys */
  170. #define QEXPANDED 0x00000800 /* DSN: undergone list expansion */
  171. #define QDELIVERED 0x00001000 /* DSN: successful final delivery */
  172. #define QDELAYED 0x00002000 /* DSN: message delayed */
  173. #define QTHISPASS 0x40000000 /* temp: address set this pass */
  174. #define QRCPTOK 0x80000000 /* recipient() processed address */
  175. #define Q_PINGFLAGS (QPINGONSUCCESS|QPINGONFAILURE|QPINGONDELAY)
  176. /* values for q_state */
  177. #define QS_OK 0 /* address ok (for now)/not yet tried */
  178. #define QS_SENT 1 /* good address, delivery complete */
  179. #define QS_BADADDR 2 /* illegal address */
  180. #define QS_QUEUEUP 3 /* save address in queue */
  181. #define QS_VERIFIED 4 /* verified, but not expanded */
  182. #define QS_DONTSEND 5 /* don't send to this address */
  183. #define QS_EXPANDED 6 /* expanded */
  184. #define QS_SENDER 7 /* message sender (MeToo) */
  185. #define QS_CLONED 8 /* addr cloned to a split envelope */
  186. #define QS_DISCARDED 9 /* recipient discarded (EF_DISCARD) */
  187. #define QS_REPLACED 10 /* maplocaluser()/UserDB replaced */
  188. #define QS_REMOVED 11 /* removed (removefromlist()) */
  189. #define QS_DUPLICATE 12 /* duplicate suppressed */
  190. #define QS_INCLUDED 13 /* :include: delivery */
  191. /* address state testing primitives */
  192. #define QS_IS_OK(s) ((s) == QS_OK)
  193. #define QS_IS_SENT(s) ((s) == QS_SENT)
  194. #define QS_IS_BADADDR(s) ((s) == QS_BADADDR)
  195. #define QS_IS_QUEUEUP(s) ((s) == QS_QUEUEUP)
  196. #define QS_IS_VERIFIED(s) ((s) == QS_VERIFIED)
  197. #define QS_IS_EXPANDED(s) ((s) == QS_EXPANDED)
  198. #define QS_IS_UNDELIVERED(s) ((s) == QS_OK || 
  199.  (s) == QS_QUEUEUP || 
  200.  (s) == QS_VERIFIED)
  201. #define QS_IS_SENDABLE(s) ((s) == QS_OK || 
  202.  (s) == QS_QUEUEUP)
  203. #define QS_IS_ATTEMPTED(s) ((s) == QS_QUEUEUP || 
  204.  (s) == QS_SENT)
  205. #define QS_IS_DEAD(s) ((s) == QS_DONTSEND || 
  206.  (s) == QS_CLONED || 
  207.  (s) == QS_SENDER || 
  208.  (s) == QS_DISCARDED || 
  209.  (s) == QS_REPLACED || 
  210.  (s) == QS_REMOVED || 
  211.  (s) == QS_DUPLICATE || 
  212.  (s) == QS_INCLUDED || 
  213.  (s) == QS_EXPANDED)
  214. #define NULLADDR ((ADDRESS *) NULL)
  215. extern ADDRESS NullAddress; /* a null (template) address [main.c] */
  216. /* functions */
  217. extern void cataddr __P((char **, char **, char *, int, int));
  218. extern char *crackaddr __P((char *));
  219. extern bool emptyaddr __P((ADDRESS *));
  220. extern ADDRESS *getctladdr __P((ADDRESS *));
  221. extern int include __P((char *, bool, ADDRESS *, ADDRESS **, int, ENVELOPE *));
  222. extern bool invalidaddr __P((char *, char *));
  223. extern ADDRESS *parseaddr __P((char *, ADDRESS *, int, int, char **, ENVELOPE *));
  224. extern char **prescan __P((char *, int, char[], int, char **, u_char *));
  225. extern void printaddr __P((ADDRESS *, bool));
  226. extern ADDRESS *recipient __P((ADDRESS *, ADDRESS **, int, ENVELOPE *));
  227. extern char *remotename __P((char *, MAILER *, int, int *, ENVELOPE *));
  228. extern int rewrite __P((char **, int, int, ENVELOPE *));
  229. extern bool sameaddr __P((ADDRESS *, ADDRESS *));
  230. extern int sendtolist __P((char *, ADDRESS *, ADDRESS **, int, ENVELOPE *));
  231. extern int removefromlist __P((char *, ADDRESS **, ENVELOPE *));
  232. extern void setsender __P((char *, ENVELOPE *, char **, int, bool));
  233. /*
  234. **  Mailer definition structure.
  235. ** Every mailer known to the system is declared in this
  236. ** structure.  It defines the pathname of the mailer, some
  237. ** flags associated with it, and the argument vector to
  238. ** pass to it.  The flags are defined in conf.c
  239. **
  240. ** The argument vector is expanded before actual use.  All
  241. ** words except the first are passed through the macro
  242. ** processor.
  243. */
  244. struct mailer
  245. {
  246. char *m_name; /* symbolic name of this mailer */
  247. char *m_mailer; /* pathname of the mailer to use */
  248. char *m_mtatype; /* type of this MTA */
  249. char *m_addrtype; /* type for addresses */
  250. char *m_diagtype; /* type for diagnostics */
  251. BITMAP256 m_flags; /* status flags, see below */
  252. short m_mno; /* mailer number internally */
  253. short m_nice; /* niceness to run at (mostly for prog) */
  254. char **m_argv; /* template argument vector */
  255. short m_sh_rwset; /* rewrite set: sender header addresses */
  256. short m_se_rwset; /* rewrite set: sender envelope addresses */
  257. short m_rh_rwset; /* rewrite set: recipient header addresses */
  258. short m_re_rwset; /* rewrite set: recipient envelope addresses */
  259. char *m_eol; /* end of line string */
  260. long m_maxsize; /* size limit on message to this mailer */
  261. int m_linelimit; /* max # characters per line */
  262. int m_maxdeliveries; /* max deliveries per mailer connection */
  263. char *m_execdir; /* directory to chdir to before execv */
  264. char *m_rootdir; /* directory to chroot to before execv */
  265. uid_t m_uid; /* UID to run as */
  266. gid_t m_gid; /* GID to run as */
  267. char *m_defcharset; /* default character set */
  268. time_t m_wait; /* timeout to wait for end */
  269. };
  270. /* bits for m_flags */
  271. #define M_ESMTP 'a' /* run Extended SMTP protocol */
  272. #define M_ALIASABLE 'A' /* user can be LHS of an alias */
  273. #define M_BLANKEND 'b' /* ensure blank line at end of message */
  274. #define M_NOCOMMENT 'c' /* don't include comment part of address */
  275. #define M_CANONICAL 'C' /* make addresses canonical "u@dom" */
  276. #define M_NOBRACKET 'd' /* never angle bracket envelope route-addrs */
  277. /* 'D'    CF: include Date: */
  278. #define M_EXPENSIVE 'e' /* it costs to use this mailer.... */
  279. #define M_ESCFROM 'E' /* escape From lines to >From */
  280. #define M_FOPT 'f' /* mailer takes picky -f flag */
  281. /* 'F'    CF: include From: or Resent-From: */
  282. #define M_NO_NULL_FROM 'g' /* sender of errors should be $g */
  283. #define M_HST_UPPER 'h' /* preserve host case distinction */
  284. #define M_PREHEAD 'H' /* MAIL11V3: preview headers */
  285. #define M_UDBENVELOPE 'i' /* do udbsender rewriting on envelope */
  286. #define M_INTERNAL 'I' /* SMTP to another sendmail site */
  287. #define M_UDBRECIPIENT 'j' /* do udbsender rewriting on recipient lines */
  288. #define M_NOLOOPCHECK 'k' /* don't check for loops in HELO command */
  289. #define M_CHUNKING 'K' /* CHUNKING: reserved for future use */
  290. #define M_LOCALMAILER 'l' /* delivery is to this host */
  291. #define M_LIMITS 'L' /* must enforce SMTP line limits */
  292. #define M_MUSER 'm' /* can handle multiple users at once */
  293. /* 'M'    CF: include Message-Id: */
  294. #define M_NHDR 'n' /* don't insert From line */
  295. #define M_MANYSTATUS 'N' /* MAIL11V3: DATA returns multi-status */
  296. #define M_RUNASRCPT 'o' /* always run mailer as recipient */
  297. #define M_FROMPATH 'p' /* use reverse-path in MAIL FROM: */
  298. /* 'P'    CF: include Return-Path: */
  299. #define M_VRFY250 'q' /* VRFY command returns 250 instead of 252 */
  300. #define M_ROPT 'r' /* mailer takes picky -r flag */
  301. #define M_SECURE_PORT 'R' /* try to send on a reserved TCP port */
  302. #define M_STRIPQ 's' /* strip quote chars from user/host */
  303. #define M_SPECIFIC_UID 'S' /* run as specific uid/gid */
  304. #define M_USR_UPPER 'u' /* preserve user case distinction */
  305. #define M_UGLYUUCP 'U' /* this wants an ugly UUCP from line */
  306. #define M_CONTENT_LEN 'v' /* add Content-Length: header (SVr4) */
  307. /* 'V'    UIUC: !-relativize all addresses */
  308. #define M_HASPWENT 'w' /* check for /etc/passwd entry */
  309. /* 'x'    CF: include Full-Name: */
  310. #define M_XDOT 'X' /* use hidden-dot algorithm */
  311. #define M_LMTP 'z' /* run Local Mail Transport Protocol */
  312. #define M_NOMX '0' /* turn off MX lookups */
  313. #define M_NONULLS '1' /* don't send null bytes */
  314. #define M_EBCDIC '3' /* extend Q-P encoding for EBCDIC */
  315. #define M_TRYRULESET5 '5' /* use ruleset 5 after local aliasing */
  316. #define M_7BITHDRS '6' /* strip headers to 7 bits even in 8 bit path */
  317. #define M_7BITS '7' /* use 7-bit path */
  318. #define M_8BITS '8' /* force "just send 8" behaviour */
  319. #define M_MAKE8BIT '9' /* convert 7 -> 8 bit if appropriate */
  320. #define M_CHECKINCLUDE ':' /* check for :include: files */
  321. #define M_CHECKPROG '|' /* check for |program addresses */
  322. #define M_CHECKFILE '/' /* check for /file addresses */
  323. #define M_CHECKUDB '@' /* user can be user database key */
  324. #define M_CHECKHDIR '~' /* SGI: check for valid home directory */
  325. #define M_HOLD '%' /* Hold delivery until ETRN/-qI/-qR/-qS */
  326. #define M_PLUS '+' /* Reserved: Used in mc for adding new flags */
  327. #define M_MINUS '-' /* Reserved: Used in mc for removing flags */
  328. /* functions */
  329. extern void initerrmailers __P((void));
  330. extern void makemailer __P((char *));
  331. /*
  332. **  Information about currently open connections to mailers, or to
  333. **  hosts that we have looked up recently.
  334. */
  335. #define MCI struct mailer_con_info
  336. MCI
  337. {
  338. u_long mci_flags; /* flag bits, see below */
  339. short mci_errno; /* error number on last connection */
  340. short mci_herrno; /* h_errno from last DNS lookup */
  341. short mci_exitstat; /* exit status from last connection */
  342. short mci_state; /* SMTP state */
  343. int mci_deliveries; /* delivery attempts for connection */
  344. long mci_maxsize; /* max size this server will accept */
  345. FILE *mci_in; /* input side of connection */
  346. FILE *mci_out; /* output side of connection */
  347. pid_t mci_pid; /* process id of subordinate proc */
  348. char *mci_phase; /* SMTP phase string */
  349. struct mailer *mci_mailer; /* ptr to the mailer for this conn */
  350. char *mci_host; /* host name */
  351. char *mci_status; /* DSN status to be copied to addrs */
  352. char *mci_rstatus; /* SMTP status to be copied to addrs */
  353. time_t mci_lastuse; /* last usage time */
  354. FILE *mci_statfile; /* long term status file */
  355. char *mci_heloname; /* name to use as HELO arg */
  356. #if SASL
  357. bool mci_sasl_auth; /* authenticated? */
  358. int mci_sasl_string_len;
  359. char *mci_sasl_string; /* sasl reply string */
  360. char *mci_saslcap; /* SASL list of mechanisms */
  361. sasl_conn_t *mci_conn; /* SASL connection */
  362. #endif /* SASL */
  363. };
  364. /* flag bits */
  365. #define MCIF_VALID 0x00000001 /* this entry is valid */
  366. #define MCIF_TEMP 0x00000002 /* don't cache this connection */
  367. #define MCIF_CACHED 0x00000004 /* currently in open cache */
  368. #define MCIF_ESMTP 0x00000008 /* this host speaks ESMTP */
  369. #define MCIF_EXPN 0x00000010 /* EXPN command supported */
  370. #define MCIF_SIZE 0x00000020 /* SIZE option supported */
  371. #define MCIF_8BITMIME 0x00000040 /* BODY=8BITMIME supported */
  372. #define MCIF_7BIT 0x00000080 /* strip this message to 7 bits */
  373. #define MCIF_MULTSTAT 0x00000100 /* MAIL11V3: handles MULT status */
  374. #define MCIF_INHEADER 0x00000200 /* currently outputing header */
  375. #define MCIF_CVT8TO7 0x00000400 /* convert from 8 to 7 bits */
  376. #define MCIF_DSN 0x00000800 /* DSN extension supported */
  377. #define MCIF_8BITOK 0x00001000 /* OK to send 8 bit characters */
  378. #define MCIF_CVT7TO8 0x00002000 /* convert from 7 to 8 bits */
  379. #define MCIF_INMIME 0x00004000 /* currently reading MIME header */
  380. #define MCIF_AUTH 0x00008000 /* AUTH= supported */
  381. #define MCIF_ENHSTAT 0x00010000 /* ENHANCEDSTATUSCODES supported */
  382. #define MCIF_EXTENS (MCIF_EXPN | MCIF_SIZE | MCIF_8BITMIME | MCIF_DSN | MCIF_8BITOK | MCIF_AUTH | MCIF_ENHSTAT)
  383. /* states */
  384. #define MCIS_CLOSED 0 /* no traffic on this connection */
  385. #define MCIS_OPENING 1 /* sending initial protocol */
  386. #define MCIS_OPEN 2 /* open, initial protocol sent */
  387. #define MCIS_ACTIVE 3 /* message being sent */
  388. #define MCIS_QUITING 4 /* running quit protocol */
  389. #define MCIS_SSD 5 /* service shutting down */
  390. #define MCIS_ERROR 6 /* I/O error on connection */
  391. /* functions */
  392. extern void mci_cache __P((MCI *));
  393. extern void mci_dump __P((MCI *, bool));
  394. extern void mci_dump_all __P((bool));
  395. extern void mci_flush __P((bool, MCI *));
  396. extern MCI *mci_get __P((char *, MAILER *));
  397. extern int mci_lock_host __P((MCI *));
  398. extern bool mci_match __P((char *, MAILER *));
  399. extern int mci_print_persistent __P((char *, char *));
  400. extern int mci_purge_persistent __P((char *, char *));
  401. extern MCI **mci_scan __P((MCI *));
  402. extern void mci_setstat __P((MCI *, int, char *, char *));
  403. extern void mci_store_persistent __P((MCI *));
  404. extern int mci_traverse_persistent __P((int (*)(), char *));
  405. extern void mci_unlock_host __P((MCI *));
  406. /*
  407. **  Header structure.
  408. ** This structure is used internally to store header items.
  409. */
  410. struct header
  411. {
  412. char *h_field; /* the name of the field */
  413. char *h_value; /* the value of that field */
  414. struct header *h_link; /* the next header */
  415. u_char h_macro; /* include header if macro defined */
  416. u_long h_flags; /* status bits, see below */
  417. BITMAP256 h_mflags; /* m_flags bits needed */
  418. };
  419. typedef struct header HDR;
  420. /*
  421. **  Header information structure.
  422. ** Defined in conf.c, this struct declares the header fields
  423. ** that have some magic meaning.
  424. */
  425. struct hdrinfo
  426. {
  427. char *hi_field; /* the name of the field */
  428. u_long hi_flags; /* status bits, see below */
  429. char *hi_ruleset; /* validity check ruleset */
  430. };
  431. extern struct hdrinfo HdrInfo[];
  432. /* bits for h_flags and hi_flags */
  433. #define H_EOH 0x00000001 /* field terminates header */
  434. #define H_RCPT 0x00000002 /* contains recipient addresses */
  435. #define H_DEFAULT 0x00000004 /* if another value is found, drop this */
  436. #define H_RESENT 0x00000008 /* this address is a "Resent-..." address */
  437. #define H_CHECK 0x00000010 /* check h_mflags against m_flags */
  438. #define H_ACHECK 0x00000020 /* ditto, but always (not just default) */
  439. #define H_FORCE 0x00000040 /* force this field, even if default */
  440. #define H_TRACE 0x00000080 /* this field contains trace information */
  441. #define H_FROM 0x00000100 /* this is a from-type field */
  442. #define H_VALID 0x00000200 /* this field has a validated value */
  443. #define H_RECEIPTTO 0x00000400 /* field has return receipt info */
  444. #define H_ERRORSTO 0x00000800 /* field has error address info */
  445. #define H_CTE 0x00001000 /* field is a content-transfer-encoding */
  446. #define H_CTYPE 0x00002000 /* this is a content-type field */
  447. #define H_BCC 0x00004000 /* Bcc: header: strip value or delete */
  448. #define H_ENCODABLE 0x00008000 /* field can be RFC 1522 encoded */
  449. #define H_STRIPCOMM 0x00010000 /* header check: strip comments */
  450. #define H_BINDLATE 0x00020000 /* only expand macros at deliver */
  451. /* bits for chompheader() */
  452. #define CHHDR_DEF 0x0001 /* default header */
  453. #define CHHDR_CHECK 0x0002 /* call ruleset for header */
  454. /* functions */
  455. extern void addheader __P((char *, char *, HDR **));
  456. extern u_long chompheader __P((char *, int *, HDR **, ENVELOPE *));
  457. extern void commaize __P((HDR *, char *, bool, MCI *, ENVELOPE *));
  458. extern HDR *copyheader __P((HDR *));
  459. extern void eatheader __P((ENVELOPE *, bool));
  460. extern char *hvalue __P((char *, HDR *));
  461. extern bool isheader __P((char *));
  462. extern void putfromline __P((MCI *, ENVELOPE *));
  463. extern void setupheaders __P((void));
  464. /*
  465. **  Performance monitoring
  466. */
  467. #define TIMERS struct sm_timers
  468. TIMERS
  469. {
  470. TIMER ti_overall; /* the whole process */
  471. };
  472. #define PUSHTIMER(l, t) { if (tTd(98, l)) pushtimer(&t); }
  473. #define POPTIMER(l, t) { if (tTd(98, l)) poptimer(&t); }
  474. /*
  475. **  Envelope structure.
  476. ** This structure defines the message itself.  There is usually
  477. ** only one of these -- for the message that we originally read
  478. ** and which is our primary interest -- but other envelopes can
  479. ** be generated during processing.  For example, error messages
  480. ** will have their own envelope.
  481. */
  482. struct envelope
  483. {
  484. HDR *e_header; /* head of header list */
  485. long e_msgpriority; /* adjusted priority of this message */
  486. time_t e_ctime; /* time message appeared in the queue */
  487. char *e_to; /* the target person */
  488. ADDRESS e_from; /* the person it is from */
  489. char *e_sender; /* e_from.q_paddr w comments stripped */
  490. char **e_fromdomain; /* the domain part of the sender */
  491. ADDRESS *e_sendqueue; /* list of message recipients */
  492. ADDRESS *e_errorqueue; /* the queue for error responses */
  493. long e_msgsize; /* size of the message in bytes */
  494. long e_flags; /* flags, see below */
  495. int e_nrcpts; /* number of recipients */
  496. short e_class; /* msg class (priority, junk, etc.) */
  497. short e_hopcount; /* number of times processed */
  498. short e_nsent; /* number of sends since checkpoint */
  499. short e_sendmode; /* message send mode */
  500. short e_errormode; /* error return mode */
  501. short e_timeoutclass; /* message timeout class */
  502. void (*e_puthdr)__P((MCI *, HDR *, ENVELOPE *, int));
  503. /* function to put header of message */
  504. void (*e_putbody)__P((MCI *, ENVELOPE *, char *));
  505. /* function to put body of message */
  506. ENVELOPE *e_parent; /* the message this one encloses */
  507. ENVELOPE *e_sibling; /* the next envelope of interest */
  508. char *e_bodytype; /* type of message body */
  509. FILE *e_dfp; /* data file */
  510. char *e_id; /* code for this entry in queue */
  511. int e_queuedir; /* index into queue directories */
  512. FILE *e_xfp; /* transcript file */
  513. FILE *e_lockfp; /* the lock file for this message */
  514. char *e_message; /* error message */
  515. char *e_statmsg; /* stat msg (changes per delivery) */
  516. char *e_msgboundary; /* MIME-style message part boundary */
  517. char *e_origrcpt; /* original recipient (one only) */
  518. char *e_envid; /* envelope id from MAIL FROM: line */
  519. char *e_status; /* DSN status for this message */
  520. time_t e_dtime; /* time of last delivery attempt */
  521. int e_ntries; /* number of delivery attempts */
  522. dev_t e_dfdev; /* df file's device, for crash recov */
  523. ino_t e_dfino; /* df file's ino, for crash recovery */
  524. char *e_macro[256]; /* macro definitions */
  525. char *e_auth_param;
  526. TIMERS e_timers; /* per job timers */
  527. #if _FFR_QUEUEDELAY
  528. int e_queuealg; /* algorithm for queue delay */
  529. time_t e_queuedelay; /* current delay */
  530. #endif /* _FFR_QUEUEDELAY */
  531. };
  532. /* values for e_flags */
  533. #define EF_OLDSTYLE 0x0000001L /* use spaces (not commas) in hdrs */
  534. #define EF_INQUEUE 0x0000002L /* this message is fully queued */
  535. #define EF_NO_BODY_RETN 0x0000004L /* omit message body on error */
  536. #define EF_CLRQUEUE 0x0000008L /* disk copy is no longer needed */
  537. #define EF_SENDRECEIPT 0x0000010L /* send a return receipt */
  538. #define EF_FATALERRS 0x0000020L /* fatal errors occurred */
  539. #define EF_DELETE_BCC 0x0000040L /* delete Bcc: headers entirely */
  540. #define EF_RESPONSE 0x0000080L /* this is an error or return receipt */
  541. #define EF_RESENT 0x0000100L /* this message is being forwarded */
  542. #define EF_VRFYONLY 0x0000200L /* verify only (don't expand aliases) */
  543. #define EF_WARNING 0x0000400L /* warning message has been sent */
  544. #define EF_QUEUERUN 0x0000800L /* this envelope is from queue */
  545. #define EF_GLOBALERRS 0x0001000L /* treat errors as global */
  546. #define EF_PM_NOTIFY 0x0002000L /* send return mail to postmaster */
  547. #define EF_METOO 0x0004000L /* send to me too */
  548. #define EF_LOGSENDER 0x0008000L /* need to log the sender */
  549. #define EF_NORECEIPT 0x0010000L /* suppress all return-receipts */
  550. #define EF_HAS8BIT 0x0020000L /* at least one 8-bit char in body */
  551. #define EF_NL_NOT_EOL 0x0040000L /* don't accept raw NL as EOLine */
  552. #define EF_CRLF_NOT_EOL 0x0080000L /* don't accept CR-LF as EOLine */
  553. #define EF_RET_PARAM 0x0100000L /* RCPT command had RET argument */
  554. #define EF_HAS_DF 0x0200000L /* set when df file is instantiated */
  555. #define EF_IS_MIME 0x0400000L /* really is a MIME message */
  556. #define EF_DONT_MIME 0x0800000L /* never MIME this message */
  557. #define EF_DISCARD 0x1000000L /* discard the message */
  558. /* functions */
  559. extern void clearenvelope __P((ENVELOPE *, bool));
  560. extern void dropenvelope __P((ENVELOPE *, bool));
  561. extern ENVELOPE *newenvelope __P((ENVELOPE *, ENVELOPE *));
  562. extern void printenvflags __P((ENVELOPE *));
  563. extern void putbody __P((MCI *, ENVELOPE *, char *));
  564. extern void putheader __P((MCI *, HDR *, ENVELOPE *, int));
  565. /*
  566. **  Message priority classes.
  567. **
  568. ** The message class is read directly from the Priority: header
  569. ** field in the message.
  570. **
  571. ** CurEnv->e_msgpriority is the number of bytes in the message plus
  572. ** the creation time (so that jobs ``tend'' to be ordered correctly),
  573. ** adjusted by the message class, the number of recipients, and the
  574. ** amount of time the message has been sitting around.  This number
  575. ** is used to order the queue.  Higher values mean LOWER priority.
  576. **
  577. ** Each priority class point is worth WkClassFact priority points;
  578. ** each recipient is worth WkRecipFact priority points.  Each time
  579. ** we reprocess a message the priority is adjusted by WkTimeFact.
  580. ** WkTimeFact should normally decrease the priority so that jobs
  581. ** that have historically failed will be run later; thanks go to
  582. ** Jay Lepreau at Utah for pointing out the error in my thinking.
  583. **
  584. ** The "class" is this number, unadjusted by the age or size of
  585. ** this message.  Classes with negative representations will have
  586. ** error messages thrown away if they are not local.
  587. */
  588. struct priority
  589. {
  590. char *pri_name; /* external name of priority */
  591. int pri_val; /* internal value for same */
  592. };
  593. /*
  594. **  Rewrite rules.
  595. */
  596. struct rewrite
  597. {
  598. char **r_lhs; /* pattern match */
  599. char **r_rhs; /* substitution value */
  600. struct rewrite *r_next;/* next in chain */
  601. int r_line; /* rule line in sendmail.cf */
  602. };
  603. /*
  604. **  Special characters in rewriting rules.
  605. ** These are used internally only.
  606. ** The COND* rules are actually used in macros rather than in
  607. ** rewriting rules, but are given here because they
  608. ** cannot conflict.
  609. */
  610. /* left hand side items */
  611. #define MATCHZANY ((u_char)0220) /* match zero or more tokens */
  612. #define MATCHANY ((u_char)0221) /* match one or more tokens */
  613. #define MATCHONE ((u_char)0222) /* match exactly one token */
  614. #define MATCHCLASS ((u_char)0223) /* match one token in a class */
  615. #define MATCHNCLASS ((u_char)0224) /* match anything not in class */
  616. #define MATCHREPL ((u_char)0225) /* replacement on RHS for above */
  617. /* right hand side items */
  618. #define CANONNET ((u_char)0226) /* canonical net, next token */
  619. #define CANONHOST ((u_char)0227) /* canonical host, next token */
  620. #define CANONUSER ((u_char)0230) /* canonical user, next N tokens */
  621. #define CALLSUBR ((u_char)0231) /* call another rewriting set */
  622. /* conditionals in macros */
  623. #define CONDIF ((u_char)0232) /* conditional if-then */
  624. #define CONDELSE ((u_char)0233) /* conditional else */
  625. #define CONDFI ((u_char)0234) /* conditional fi */
  626. /* bracket characters for host name lookup */
  627. #define HOSTBEGIN ((u_char)0235) /* hostname lookup begin */
  628. #define HOSTEND ((u_char)0236) /* hostname lookup end */
  629. /* bracket characters for generalized lookup */
  630. #define LOOKUPBEGIN ((u_char)0205) /* generalized lookup begin */
  631. #define LOOKUPEND ((u_char)0206) /* generalized lookup end */
  632. /* macro substitution character */
  633. #define MACROEXPAND ((u_char)0201) /* macro expansion */
  634. #define MACRODEXPAND ((u_char)0202) /* deferred macro expansion */
  635. /* to make the code clearer */
  636. #define MATCHZERO CANONHOST
  637. /* external <==> internal mapping table */
  638. struct metamac
  639. {
  640. char metaname; /* external code (after $) */
  641. u_char metaval; /* internal code (as above) */
  642. };
  643. /* values for macros with external names only */
  644. #define MID_OPMODE 0202 /* operation mode */
  645. /* functions */
  646. extern void define __P((int, char *, ENVELOPE *));
  647. extern void expand __P((char *, char *, size_t, ENVELOPE *));
  648. extern int macid __P((char *, char **));
  649. extern char *macname __P((int));
  650. extern char *macvalue __P((int, ENVELOPE *));
  651. extern int rscheck __P((char *, char *, char *, ENVELOPE *e, bool, bool));
  652. extern void setclass __P((int, char *));
  653. extern int strtorwset __P((char *, char **, int));
  654. extern void translate_dollars __P((char *));
  655. extern bool wordinclass __P((char *, int));
  656. /*
  657. **  Name canonification short circuit.
  658. **
  659. ** If the name server for a host is down, the process of trying to
  660. ** canonify the name can hang.  This is similar to (but alas, not
  661. ** identical to) looking up the name for delivery.  This stab type
  662. ** caches the result of the name server lookup so we don't hang
  663. ** multiple times.
  664. */
  665. #define NAMECANON struct _namecanon
  666. NAMECANON
  667. {
  668. short nc_errno; /* cached errno */
  669. short nc_herrno; /* cached h_errno */
  670. short nc_stat; /* cached exit status code */
  671. short nc_flags; /* flag bits */
  672. char *nc_cname; /* the canonical name */
  673. };
  674. /* values for nc_flags */
  675. #define NCF_VALID 0x0001 /* entry valid */
  676. /* functions */
  677. extern bool getcanonname __P((char *, int, bool));
  678. extern int getmxrr __P((char *, char **, u_short *, bool, int *));
  679. /*
  680. **  Mapping functions
  681. **
  682. ** These allow arbitrary mappings in the config file.  The idea
  683. ** (albeit not the implementation) comes from IDA sendmail.
  684. */
  685. #define MAPCLASS struct _mapclass
  686. #define MAP struct _map
  687. #define MAXMAPACTIONS 5 /* size of map_actions array */
  688. /*
  689. **  An actual map.
  690. */
  691. MAP
  692. {
  693. MAPCLASS *map_class; /* the class of this map */
  694. char *map_mname; /* name of this map */
  695. long map_mflags; /* flags, see below */
  696. char *map_file; /* the (nominal) filename */
  697. ARBPTR_T map_db1; /* the open database ptr */
  698. ARBPTR_T map_db2; /* an "extra" database pointer */
  699. char *map_keycolnm; /* key column name */
  700. char *map_valcolnm; /* value column name */
  701. u_char map_keycolno; /* key column number */
  702. u_char map_valcolno; /* value column number */
  703. char map_coldelim; /* column delimiter */
  704. char map_spacesub; /* spacesub */
  705. char *map_app; /* to append to successful matches */
  706. char *map_tapp; /* to append to "tempfail" matches */
  707. char *map_domain; /* the (nominal) NIS domain */
  708. char *map_rebuild; /* program to run to do auto-rebuild */
  709. time_t map_mtime; /* last database modification time */
  710. pid_t map_pid; /* PID of process which opened map */
  711. int map_lockfd; /* auxiliary lock file descriptor */
  712. short map_specificity; /* specificity of aliases */
  713. MAP *map_stack[MAXMAPSTACK];   /* list for stacked maps */
  714. short map_return[MAXMAPACTIONS]; /* return bitmaps for stacked maps */
  715. };
  716. /* bit values for map_mflags */
  717. #define MF_VALID 0x00000001 /* this entry is valid */
  718. #define MF_INCLNULL 0x00000002 /* include null byte in key */
  719. #define MF_OPTIONAL 0x00000004 /* don't complain if map not found */
  720. #define MF_NOFOLDCASE 0x00000008 /* don't fold case in keys */
  721. #define MF_MATCHONLY 0x00000010 /* don't use the map value */
  722. #define MF_OPEN 0x00000020 /* this entry is open */
  723. #define MF_WRITABLE 0x00000040 /* open for writing */
  724. #define MF_ALIAS 0x00000080 /* this is an alias file */
  725. #define MF_TRY0NULL 0x00000100 /* try with no null byte */
  726. #define MF_TRY1NULL 0x00000200 /* try with the null byte */
  727. #define MF_LOCKED 0x00000400 /* this map is currently locked */
  728. #define MF_ALIASWAIT 0x00000800 /* alias map in aliaswait state */
  729. #define MF_IMPL_HASH 0x00001000 /* implicit: underlying hash database */
  730. #define MF_IMPL_NDBM 0x00002000 /* implicit: underlying NDBM database */
  731. #define MF_UNSAFEDB 0x00004000 /* this map is world writable */
  732. #define MF_APPEND 0x00008000 /* append new entry on rebuild */
  733. #define MF_KEEPQUOTES 0x00010000 /* don't dequote key before lookup */
  734. #define MF_NODEFER 0x00020000 /* don't defer if map lookup fails */
  735. #define MF_REGEX_NOT 0x00040000 /* regular expression negation */
  736. #define MF_DEFER 0x00080000 /* don't lookup map in defer mode */
  737. #define MF_SINGLEMATCH 0x00100000 /* successful only if match one key */
  738. #define MF_NOREWRITE 0x00200000 /* don't rewrite result, return as-is */
  739. #define DYNOPENMAP(map) if (!bitset(MF_OPEN, (map)->map_mflags)) 
  740. {
  741. if (!openmap(map))
  742. return NULL;
  743. }
  744. /* indices for map_actions */
  745. #define MA_NOTFOUND 0 /* member map returned "not found" */
  746. #define MA_UNAVAIL 1 /* member map is not available */
  747. #define MA_TRYAGAIN 2 /* member map returns temp failure */
  748. /*
  749. **  The class of a map -- essentially the functions to call
  750. */
  751. MAPCLASS
  752. {
  753. char *map_cname; /* name of this map class */
  754. char *map_ext; /* extension for database file */
  755. short map_cflags; /* flag bits, see below */
  756. bool (*map_parse)__P((MAP *, char *));
  757. /* argument parsing function */
  758. char *(*map_lookup)__P((MAP *, char *, char **, int *));
  759. /* lookup function */
  760. void (*map_store)__P((MAP *, char *, char *));
  761. /* store function */
  762. bool (*map_open)__P((MAP *, int));
  763. /* open function */
  764. void (*map_close)__P((MAP *));
  765. /* close function */
  766. };
  767. /* bit values for map_cflags */
  768. #define MCF_ALIASOK 0x0001 /* can be used for aliases */
  769. #define MCF_ALIASONLY 0x0002 /* usable only for aliases */
  770. #define MCF_REBUILDABLE 0x0004 /* can rebuild alias files */
  771. #define MCF_OPTFILE 0x0008 /* file name is optional */
  772. /* functions */
  773. extern void closemaps __P((void));
  774. extern bool impl_map_open __P((MAP *, int));
  775. extern void initmaps __P((void));
  776. extern MAP *makemapentry __P((char *));
  777. extern void maplocaluser __P((ADDRESS *, ADDRESS **, int, ENVELOPE *));
  778. extern char *map_rewrite __P((MAP *, const char *, size_t, char **));
  779. #if NETINFO
  780. extern char *ni_propval __P((char *, char *, char *, char *, int));
  781. #endif /* NETINFO */
  782. extern bool openmap __P((MAP *));
  783. #if USERDB
  784. extern void _udbx_close __P((void));
  785. extern int udbexpand __P((ADDRESS *, ADDRESS **, int, ENVELOPE *));
  786. extern char *udbsender __P((char *));
  787. #endif /* USERDB */
  788. /*
  789. **  LDAP related items
  790. */
  791. #ifdef LDAPMAP
  792. struct ldapmap_struct
  793. {
  794. /* needed for ldap_open or ldap_init */
  795. char *ldap_host;
  796. int ldap_port;
  797. /* options set in ld struct before ldap_bind_s */
  798. int ldap_deref;
  799. time_t ldap_timelimit;
  800. int ldap_sizelimit;
  801. int ldap_options;
  802. /* args for ldap_bind_s */
  803. LDAP *ldap_ld;
  804. char *ldap_binddn;
  805. char *ldap_secret;
  806. int ldap_method;
  807. /* args for ldap_search */
  808. char *ldap_base;
  809. int ldap_scope;
  810. char *ldap_filter;
  811. char *ldap_attr[LDAPMAP_MAX_ATTR + 1];
  812. bool ldap_attrsonly;
  813. /* args for ldap_result */
  814. struct timeval ldap_timeout;
  815. LDAPMessage *ldap_res;
  816. };
  817. typedef struct ldapmap_struct LDAPMAP_STRUCT;
  818. /* struct defining LDAP Auth Methods */
  819. struct lamvalues
  820. {
  821. char *lam_name; /* name of LDAP auth method */
  822. int lam_code; /* numeric code */
  823. };
  824. /* struct defining LDAP Alias Dereferencing */
  825. struct ladvalues
  826. {
  827. char *lad_name; /* name of LDAP alias dereferencing method */
  828. int lad_code; /* numeric code */
  829. };
  830. /* struct defining LDAP Search Scope */
  831. struct lssvalues
  832. {
  833. char *lss_name; /* name of LDAP search scope */
  834. int lss_code; /* numeric code */
  835. };
  836. /* functions */
  837. extern bool ldapmap_parseargs __P((MAP *, char *));
  838. extern void ldapmap_set_defaults __P((char *));
  839. #endif /* LDAPMAP */
  840. /*
  841. **  PH related items
  842. */
  843. #ifdef PH_MAP
  844. struct ph_map_struct
  845. {
  846. char *ph_servers; /* list of ph servers */
  847. char *ph_field_list; /* list of fields to search for match */
  848. FILE *ph_to_server;
  849. FILE *ph_from_server;
  850. int ph_sockfd;
  851. time_t ph_timeout;
  852. };
  853. typedef struct ph_map_struct PH_MAP_STRUCT;
  854. # define DEFAULT_PH_MAP_FIELDS "alias callsign name spacedname"
  855. #endif /* PH_MAP */
  856. /*
  857. **  Process List (proclist)
  858. */
  859. struct procs
  860. {
  861. pid_t proc_pid;
  862. char *proc_task;
  863. int proc_type;
  864. };
  865. #define NO_PID ((pid_t) 0)
  866. #ifndef PROC_LIST_SEG
  867. # define PROC_LIST_SEG 32 /* number of pids to alloc at a time */
  868. #endif /* ! PROC_LIST_SEG */
  869. /* process types */
  870. #define PROC_NONE 0
  871. #define PROC_DAEMON 1
  872. #define PROC_DAEMON_CHILD 2
  873. #define PROC_QUEUE 3
  874. #define PROC_QUEUE_CHILD 3
  875. #define PROC_CONTROL 4
  876. #define PROC_CONTROL_CHILD 5
  877. /* functions */
  878. extern void proc_list_add __P((pid_t, char *, int));
  879. extern void proc_list_clear __P((void));
  880. extern void proc_list_display __P((FILE *));
  881. extern int proc_list_drop __P((pid_t));
  882. extern void proc_list_probe __P((void));
  883. extern void proc_list_set __P((pid_t, char *));
  884. /*
  885. **  Symbol table definitions
  886. */
  887. struct symtab
  888. {
  889. char *s_name; /* name to be entered */
  890. short s_type; /* general type (see below) */
  891. short s_len; /* length of this entry */
  892. struct symtab *s_next; /* pointer to next in chain */
  893. union
  894. {
  895. BITMAP256 sv_class; /* bit-map of word classes */
  896. ADDRESS *sv_addr; /* pointer to address header */
  897. MAILER *sv_mailer; /* pointer to mailer */
  898. char *sv_alias; /* alias */
  899. MAPCLASS sv_mapclass; /* mapping function class */
  900. MAP sv_map; /* mapping function */
  901. char *sv_hostsig; /* host signature */
  902. MCI sv_mci; /* mailer connection info */
  903. NAMECANON sv_namecanon; /* canonical name cache */
  904. int sv_macro; /* macro name => id mapping */
  905. int sv_ruleset; /* ruleset index */
  906. struct hdrinfo sv_header; /* header metainfo */
  907. char *sv_service[MAXMAPSTACK]; /* service switch */
  908. #ifdef LDAPMAP
  909. LDAP *sv_ldap; /* LDAP connection */
  910. #endif /* LDAPMAP */
  911. } s_value;
  912. };
  913. typedef struct symtab STAB;
  914. /* symbol types */
  915. #define ST_UNDEF 0 /* undefined type */
  916. #define ST_CLASS 1 /* class map */
  917. #define ST_ADDRESS 2 /* an address in parsed format */
  918. #define ST_MAILER 3 /* a mailer header */
  919. #define ST_ALIAS 4 /* an alias */
  920. #define ST_MAPCLASS 5 /* mapping function class */
  921. #define ST_MAP 6 /* mapping function */
  922. #define ST_HOSTSIG 7 /* host signature */
  923. #define ST_NAMECANON 8 /* cached canonical name */
  924. #define ST_MACRO 9 /* macro name to id mapping */
  925. #define ST_RULESET 10 /* ruleset index */
  926. #define ST_SERVICE 11 /* service switch entry */
  927. #define ST_HEADER 12 /* special header flags */
  928. #ifdef LDAPMAP
  929. # define ST_LDAP 13 /* LDAP connection */
  930. #endif /* LDAPMAP */
  931. #define ST_MCI 16 /* mailer connection info (offset) */
  932. #define s_class s_value.sv_class
  933. #define s_address s_value.sv_addr
  934. #define s_mailer s_value.sv_mailer
  935. #define s_alias s_value.sv_alias
  936. #define s_mci s_value.sv_mci
  937. #define s_mapclass s_value.sv_mapclass
  938. #define s_hostsig s_value.sv_hostsig
  939. #define s_map s_value.sv_map
  940. #define s_namecanon s_value.sv_namecanon
  941. #define s_macro s_value.sv_macro
  942. #define s_ruleset s_value.sv_ruleset
  943. #define s_service s_value.sv_service
  944. #define s_header s_value.sv_header
  945. #ifdef LDAPMAP
  946. # define s_ldap s_value.sv_ldap
  947. #endif /* LDAPMAP */
  948. /* opcodes to stab */
  949. #define ST_FIND 0 /* find entry */
  950. #define ST_ENTER 1 /* enter if not there */
  951. /* functions */
  952. extern STAB *stab __P((char *, int, int));
  953. extern void stabapply __P((void (*)(STAB *, int), int));
  954. /*
  955. **  STRUCT EVENT -- event queue.
  956. **
  957. ** Maintained in sorted order.
  958. **
  959. ** We store the pid of the process that set this event to insure
  960. ** that when we fork we will not take events intended for the parent.
  961. */
  962. struct event
  963. {
  964. time_t ev_time; /* time of the function call */
  965. void (*ev_func)__P((int));
  966. /* function to call */
  967. int ev_arg; /* argument to ev_func */
  968. int ev_pid; /* pid that set this event */
  969. struct event *ev_link; /* link to next item */
  970. };
  971. typedef struct event EVENT;
  972. /* functions */
  973. extern void clrevent __P((EVENT *));
  974. extern void clear_events __P((void));
  975. extern EVENT *setevent __P((time_t, void(*)(), int));
  976. /*
  977. **  Operation, send, error, and MIME modes
  978. **
  979. ** The operation mode describes the basic operation of sendmail.
  980. ** This can be set from the command line, and is "send mail" by
  981. ** default.
  982. **
  983. ** The send mode tells how to send mail.  It can be set in the
  984. ** configuration file.  It's setting determines how quickly the
  985. ** mail will be delivered versus the load on your system.  If the
  986. ** -v (verbose) flag is given, it will be forced to SM_DELIVER
  987. ** mode.
  988. **
  989. ** The error mode tells how to return errors.
  990. */
  991. #define MD_DELIVER 'm' /* be a mail sender */
  992. #define MD_SMTP 's' /* run SMTP on standard input */
  993. #define MD_ARPAFTP 'a' /* obsolete ARPANET mode (Grey Book) */
  994. #define MD_DAEMON 'd' /* run as a daemon */
  995. #define MD_FGDAEMON 'D' /* run daemon in foreground */
  996. #define MD_VERIFY 'v' /* verify: don't collect or deliver */
  997. #define MD_TEST 't' /* test mode: resolve addrs only */
  998. #define MD_INITALIAS 'i' /* initialize alias database */
  999. #define MD_PRINT 'p' /* print the queue */
  1000. #define MD_FREEZE 'z' /* freeze the configuration file */
  1001. #define MD_HOSTSTAT 'h' /* print persistent host stat info */
  1002. #define MD_PURGESTAT 'H' /* purge persistent host stat info */
  1003. #define MD_QUEUERUN 'q' /* queue run */
  1004. /* values for e_sendmode -- send modes */
  1005. #define SM_DELIVER 'i' /* interactive delivery */
  1006. #define SM_FORK 'b' /* deliver in background */
  1007. #define SM_QUEUE 'q' /* queue, don't deliver */
  1008. #define SM_DEFER 'd' /* defer map lookups as well as queue */
  1009. #define SM_VERIFY 'v' /* verify only (used internally) */
  1010. /* used only as a parameter to sendall */
  1011. #define SM_DEFAULT '' /* unspecified, use SendMode */
  1012. /* functions */
  1013. extern void set_delivery_mode __P((int, ENVELOPE *));
  1014. /* values for e_errormode -- error handling modes */
  1015. #define EM_PRINT 'p' /* print errors */
  1016. #define EM_MAIL 'm' /* mail back errors */
  1017. #define EM_WRITE 'w' /* write back errors */
  1018. #define EM_BERKNET 'e' /* special berknet processing */
  1019. #define EM_QUIET 'q' /* don't print messages (stat only) */
  1020. /* bit values for MimeMode */
  1021. #define MM_CVTMIME 0x0001 /* convert 8 to 7 bit MIME */
  1022. #define MM_PASS8BIT 0x0002 /* just send 8 bit data blind */
  1023. #define MM_MIME8BIT 0x0004 /* convert 8-bit data to MIME */
  1024. /* how to handle messages without any recipient addresses */
  1025. #define NRA_NO_ACTION 0 /* just leave it as is */
  1026. #define NRA_ADD_TO 1 /* add To: header */
  1027. #define NRA_ADD_APPARENTLY_TO 2 /* add Apparently-To: header */
  1028. #define NRA_ADD_BCC 3 /* add empty Bcc: header */
  1029. #define NRA_ADD_TO_UNDISCLOSED 4 /* add To: undisclosed:; header */
  1030. /* flags to putxline */
  1031. #define PXLF_NOTHINGSPECIAL 0 /* no special mapping */
  1032. #define PXLF_MAPFROM 0x0001 /* map From_ to >From_ */
  1033. #define PXLF_STRIP8BIT 0x0002 /* strip 8th bit */
  1034. #define PXLF_HEADER 0x0004 /* map newlines in headers */
  1035. /*
  1036. **  Privacy flags
  1037. ** These are bit values for the PrivacyFlags word.
  1038. */
  1039. #define PRIV_PUBLIC 0 /* what have I got to hide? */
  1040. #define PRIV_NEEDMAILHELO 0x0001 /* insist on HELO for MAIL, at least */
  1041. #define PRIV_NEEDEXPNHELO 0x0002 /* insist on HELO for EXPN */
  1042. #define PRIV_NEEDVRFYHELO 0x0004 /* insist on HELO for VRFY */
  1043. #define PRIV_NOEXPN 0x0008 /* disallow EXPN command entirely */
  1044. #define PRIV_NOVRFY 0x0010 /* disallow VRFY command entirely */
  1045. #define PRIV_AUTHWARNINGS 0x0020 /* flag possible authorization probs */
  1046. #define PRIV_NORECEIPTS 0x0040 /* disallow return receipts */
  1047. #define PRIV_NOVERB 0x0100 /* disallow VERB command entirely */
  1048. #define PRIV_RESTRICTMAILQ 0x1000 /* restrict mailq command */
  1049. #define PRIV_RESTRICTQRUN 0x2000 /* restrict queue run */
  1050. #define PRIV_NOETRN 0x4000 /* disallow ETRN command entirely */
  1051. #define PRIV_NOBODYRETN 0x8000 /* do not return bodies on bounces */
  1052. /* don't give no info, anyway, anyhow */
  1053. #define PRIV_GOAWAY (0x0fff & ~PRIV_NORECEIPTS)
  1054. /* struct defining such things */
  1055. struct prival
  1056. {
  1057. char *pv_name; /* name of privacy flag */
  1058. u_short pv_flag; /* numeric level */
  1059. };
  1060. /*
  1061. **  Flags passed to remotename, parseaddr, allocaddr, and buildaddr.
  1062. */
  1063. #define RF_SENDERADDR 0x001 /* this is a sender address */
  1064. #define RF_HEADERADDR 0x002 /* this is a header address */
  1065. #define RF_CANONICAL 0x004 /* strip comment information */
  1066. #define RF_ADDDOMAIN 0x008 /* OK to do domain extension */
  1067. #define RF_COPYPARSE 0x010 /* copy parsed user & host */
  1068. #define RF_COPYPADDR 0x020 /* copy print address */
  1069. #define RF_COPYALL (RF_COPYPARSE|RF_COPYPADDR)
  1070. #define RF_COPYNONE 0
  1071. /*
  1072. **  Flags passed to mime8to7 and putheader.
  1073. */
  1074. #define M87F_OUTER 0 /* outer context */
  1075. #define M87F_NO8BIT 0x0001 /* can't have 8-bit in this section */
  1076. #define M87F_DIGEST 0x0002 /* processing multipart/digest */
  1077. #define M87F_NO8TO7 0x0004 /* don't do 8->7 bit conversions */
  1078. /* functions */
  1079. extern void mime7to8 __P((MCI *, HDR *, ENVELOPE *));
  1080. extern int mime8to7 __P((MCI *, HDR *, ENVELOPE *, char **, int));
  1081. /*
  1082. **  Flags passed to returntosender.
  1083. */
  1084. #define RTSF_NO_BODY 0 /* send headers only */
  1085. #define RTSF_SEND_BODY 0x0001 /* include body of message in return */
  1086. #define RTSF_PM_BOUNCE 0x0002 /* this is a postmaster bounce */
  1087. /* functions */
  1088. extern int returntosender __P((char *, ADDRESS *, int, ENVELOPE *));
  1089. /*
  1090. **  Regular UNIX sockaddrs are too small to handle ISO addresses, so
  1091. **  we are forced to declare a supertype here.
  1092. */
  1093. #if NETINET || NETINET6 || NETUNIX || NETISO || NETNS || NETX25
  1094. union bigsockaddr
  1095. {
  1096. struct sockaddr sa; /* general version */
  1097. # if NETUNIX
  1098. struct sockaddr_un sunix; /* UNIX family */
  1099. # endif /* NETUNIX */
  1100. # if NETINET
  1101. struct sockaddr_in sin; /* INET family */
  1102. # endif /* NETINET */
  1103. # if NETINET6
  1104. struct sockaddr_in6 sin6; /* INET/IPv6 */
  1105. # endif /* NETINET6 */
  1106. # if NETISO
  1107. struct sockaddr_iso siso; /* ISO family */
  1108. # endif /* NETISO */
  1109. # if NETNS
  1110. struct sockaddr_ns sns; /* XNS family */
  1111. # endif /* NETNS */
  1112. # if NETX25
  1113. struct sockaddr_x25 sx25; /* X.25 family */
  1114. # endif /* NETX25 */
  1115. };
  1116. # define SOCKADDR union bigsockaddr
  1117. /* functions */
  1118. extern char *anynet_ntoa __P((SOCKADDR *));
  1119. # if NETINET6
  1120. extern char *anynet_ntop __P((struct in6_addr *, char *, size_t));
  1121. # endif /* NETINET6 */
  1122. extern char *hostnamebyanyaddr __P((SOCKADDR *));
  1123. # if DAEMON
  1124. extern char *validate_connection __P((SOCKADDR *, char *, ENVELOPE *));
  1125. # endif /* DAEMON */
  1126. #endif /* NETINET || NETINET6 || NETUNIX || NETISO || NETNS || NETX25 */
  1127. /*
  1128. **  Vendor codes
  1129. **
  1130. ** Vendors can customize sendmail to add special behaviour,
  1131. ** generally for back compatibility.  Ideally, this should
  1132. ** be set up in the .cf file using the "V" command.  However,
  1133. ** it's quite reasonable for some vendors to want the default
  1134. ** be their old version; this can be set using
  1135. ** -DVENDOR_DEFAULT=VENDOR_xxx
  1136. ** in the Makefile.
  1137. **
  1138. ** Vendors should apply to sendmail@sendmail.org for
  1139. ** unique vendor codes.
  1140. */
  1141. #define VENDOR_BERKELEY 1 /* Berkeley-native configuration file */
  1142. #define VENDOR_SUN 2 /* Sun-native configuration file */
  1143. #define VENDOR_HP 3 /* Hewlett-Packard specific config syntax */
  1144. #define VENDOR_IBM 4 /* IBM specific config syntax */
  1145. #define VENDOR_SENDMAIL 5 /* Sendmail, Inc. specific config syntax */
  1146. /* prototypes for vendor-specific hook routines */
  1147. extern void vendor_daemon_setup __P((ENVELOPE *));
  1148. extern void vendor_set_uid __P((UID_T));
  1149. /*
  1150. **  Terminal escape codes.
  1151. **
  1152. ** To make debugging output clearer.
  1153. */
  1154. struct termescape
  1155. {
  1156. char *te_rv_on; /* turn reverse-video on */
  1157. char *te_rv_off; /* turn reverse-video off */
  1158. };
  1159. /*
  1160. **  Additional definitions
  1161. */
  1162. /* d_flags, see daemon.c */
  1163. /* generic rule: lower case: required, upper case: No */
  1164. #define D_AUTHREQ 'a' /* authentication required */
  1165. #define D_BINDIF 'b' /* use if_addr for outgoing connection */
  1166. #define D_CANONREQ 'c' /* canonification required (cf) */
  1167. #define D_IFNHELO 'h' /* use if name for HELO */
  1168. #define D_FQMAIL 'f' /* fq sender address required (cf) */
  1169. #define D_FQRCPT 'r' /* fq recipient address required (cf) */
  1170. #define D_UNQUALOK 'u' /* unqualified address is ok (cf) */
  1171. #define D_NOCANON 'C' /* no canonification (cf) */
  1172. #define D_NOETRN 'E' /* no ETRN (MSA) */
  1173. #define D_ETRNONLY ((char)0x01) /* allow only ETRN (disk low) */
  1174. #if SASL
  1175. /*
  1176. **  SASL
  1177. */
  1178. /* authenticated? */
  1179. # define SASL_NOT_AUTH 0 /* not authenticated */
  1180. # define SASL_PROC_AUTH 1 /* in process of authenticating */
  1181. # define SASL_IS_AUTH 2 /* authenticated */
  1182. #endif /* SASL */
  1183. /* use AUTH= ? */
  1184. # define SASL_TRY_AUTH 0 /* try auth= if advertised */
  1185. # define SASL_AUTH_AUTH 1 /* use auth= only if authenticated */
  1186. /*
  1187. **  Queue related items
  1188. */
  1189. /* queue sort order */
  1190. #define QSO_BYPRIORITY 0 /* sort by message priority */
  1191. #define QSO_BYHOST 1 /* sort by first host name */
  1192. #define QSO_BYTIME 2 /* sort by submission time */
  1193. #define QSO_BYFILENAME 3 /* sort by file name only */
  1194. #if _FFR_QUEUEDELAY
  1195. #define QD_LINEAR 0 /* linear (old) delay alg */
  1196. #define QD_EXP 1 /* exponential delay alg */
  1197. #endif /* _FFR_QUEUEDELAY */
  1198. #define NOQDIR (-1) /* no queue directory (yet) */
  1199. #define NOW ((time_t) (-1)) /* queue return: now */
  1200. /* Queue Run Limitations */
  1201. struct queue_char
  1202. {
  1203. char *queue_match; /* string to match */
  1204. struct queue_char *queue_next;
  1205. };
  1206. typedef struct queue_char QUEUE_CHAR;
  1207. /* functions */
  1208. extern void assign_queueid __P((ENVELOPE *));
  1209. extern ADDRESS *copyqueue __P((ADDRESS *));
  1210. extern void initsys __P((ENVELOPE *));
  1211. extern void loseqfile __P((ENVELOPE *, char *));
  1212. extern void multiqueue_cache __P((void));
  1213. extern char *qid_printname __P((ENVELOPE *));
  1214. extern char *qid_printqueue __P((int));
  1215. extern char *queuename __P((ENVELOPE *, int));
  1216. extern void queueup __P((ENVELOPE *, bool));
  1217. extern bool runqueue __P((bool, bool));
  1218. extern void setnewqueue __P((ENVELOPE *));
  1219. extern bool shouldqueue __P((long, time_t));
  1220. extern void sync_queue_time __P((void));
  1221. /*
  1222. **  Timeouts
  1223. **
  1224. ** Indicated values are the MINIMUM per RFC 1123 section 5.3.2.
  1225. */
  1226. EXTERN struct
  1227. {
  1228. /* RFC 1123-specified timeouts [minimum value] */
  1229. time_t to_initial; /* initial greeting timeout [5m] */
  1230. time_t to_mail; /* MAIL command [5m] */
  1231. time_t to_rcpt; /* RCPT command [5m] */
  1232. time_t to_datainit; /* DATA initiation [2m] */
  1233. time_t to_datablock; /* DATA block [3m] */
  1234. time_t to_datafinal; /* DATA completion [10m] */
  1235. time_t to_nextcommand; /* next command [5m] */
  1236. /* following timeouts are not mentioned in RFC 1123 */
  1237. time_t to_iconnect; /* initial connection timeout (first try) */
  1238. time_t to_connect; /* initial connection timeout (later tries) */
  1239. time_t to_rset; /* RSET command */
  1240. time_t to_helo; /* HELO command */
  1241. time_t to_quit; /* QUIT command */
  1242. time_t to_miscshort; /* misc short commands (NOOP, VERB, etc) */
  1243. time_t to_ident; /* IDENT protocol requests */
  1244. time_t to_fileopen; /* opening :include: and .forward files */
  1245. time_t to_control; /* process a control socket command */
  1246. /* following are per message */
  1247. time_t to_q_return[MAXTOCLASS]; /* queue return timeouts */
  1248. time_t to_q_warning[MAXTOCLASS]; /* queue warning timeouts */
  1249. time_t res_retrans[MAXRESTOTYPES]; /* resolver retransmit */
  1250. int res_retry[MAXRESTOTYPES]; /* resolver retry */
  1251. } TimeOuts;
  1252. /* timeout classes for return and warning timeouts */
  1253. #define TOC_NORMAL 0 /* normal delivery */
  1254. #define TOC_URGENT 1 /* urgent delivery */
  1255. #define TOC_NONURGENT 2 /* non-urgent delivery */
  1256. /* resolver timeout specifiers */
  1257. #define RES_TO_FIRST 0 /* first attempt */
  1258. #define RES_TO_NORMAL 1 /* subsequent attempts */
  1259. #define RES_TO_DEFAULT 2 /* default value */
  1260. /* functions */
  1261. extern void inittimeouts __P((char *, bool));
  1262. /*
  1263. **  Trace information
  1264. */
  1265. /* macros for debugging flags */
  1266. #define tTd(flag, level) (tTdvect[flag] >= (u_char)level)
  1267. #define tTdlevel(flag) (tTdvect[flag])
  1268. /* variables */
  1269. extern u_char tTdvect[100]; /* trace vector */
  1270. /*
  1271. **  Miscellaneous information.
  1272. */
  1273. /*
  1274. **  The "no queue id" queue id for sm_syslog
  1275. */
  1276. #define NOQID "*~*"
  1277. /*
  1278. **  Some in-line functions
  1279. */
  1280. /* set exit status */
  1281. #define setstat(s) { 
  1282. if (ExitStat == EX_OK || ExitStat == EX_TEMPFAIL) 
  1283. ExitStat = s; 
  1284. }
  1285. /* make a copy of a string */
  1286. #define newstr(s) strcpy(xalloc(strlen(s) + 1), s)
  1287. #define STRUCTCOPY(s, d) d = s
  1288. /*
  1289. **  Global variables.
  1290. */
  1291. EXTERN bool AllowBogusHELO; /* allow syntax errors on HELO command */
  1292. #if !_FFR_REMOVE_AUTOREBUILD
  1293. EXTERN bool AutoRebuild; /* auto-rebuild the alias database as needed */
  1294. #endif /* !_FFR_REMOVE_AUTOREBUILD */
  1295. EXTERN bool CheckAliases; /* parse addresses during newaliases */
  1296. EXTERN bool ChownAlwaysSafe; /* treat chown(2) as safe */
  1297. EXTERN bool ColonOkInAddr; /* single colon legal in address */
  1298. EXTERN bool ConfigFileRead; /* configuration file has been read */
  1299. EXTERN bool DataProgress; /* have we sent anything since last check */
  1300. EXTERN bool DisConnected; /* running with OutChannel redirected to xf */
  1301. EXTERN bool DoQueueRun; /* non-interrupt time queue run needed */
  1302. EXTERN bool DontExpandCnames; /* do not $[...$] expand CNAMEs */
  1303. EXTERN bool DontInitGroups; /* avoid initgroups() because of NIS cost */
  1304. EXTERN bool DontLockReadFiles; /* don't read lock support files */
  1305. EXTERN bool DontProbeInterfaces; /* don't probe interfaces for names */
  1306. EXTERN bool DontPruneRoutes; /* don't prune source routes */
  1307. EXTERN bool ForkQueueRuns; /* fork for each job when running the queue */
  1308. EXTERN bool FromFlag; /* if set, "From" person is explicit */
  1309. EXTERN bool GrabTo; /* if set, get recipients from msg */
  1310. EXTERN bool HasEightBits; /* has at least one eight bit input byte */
  1311. EXTERN bool HasWildcardMX; /* don't use MX records when canonifying */
  1312. EXTERN bool HoldErrs; /* only output errors to transcript */
  1313. EXTERN bool IgnoreHostStatus; /* ignore long term host status files */
  1314. EXTERN bool IgnrDot; /* don't let dot end messages */
  1315. EXTERN bool InChild; /* true if running in an SMTP subprocess */
  1316. EXTERN bool LogUsrErrs; /* syslog user errors (e.g., SMTP RCPT cmd) */
  1317. EXTERN bool MatchGecos; /* look for user names in gecos field */
  1318. EXTERN bool MeToo; /* send to the sender also */
  1319. EXTERN bool NoAlias; /* suppress aliasing */
  1320. EXTERN bool NoConnect; /* don't connect to non-local mailers */
  1321. EXTERN bool OnlyOneError; /*  .... or only want to give one SMTP reply */
  1322. EXTERN bool QuickAbort; /*  .... but only if we want a quick abort */
  1323. EXTERN bool RrtImpliesDsn; /* turn Return-Receipt-To: into DSN */
  1324. EXTERN bool SaveFrom; /* save leading "From" lines */
  1325. EXTERN bool SendMIMEErrors; /* send error messages in MIME format */
  1326. EXTERN bool SevenBitInput; /* force 7-bit data on input */
  1327. EXTERN bool SingleLineFromHeader; /* force From: header to be one line */
  1328. EXTERN bool SingleThreadDelivery; /* single thread hosts on delivery */
  1329. EXTERN bool SuperSafe; /* be extra careful, even if expensive */
  1330. EXTERN bool SuprErrs; /* set if we are suppressing errors */
  1331. EXTERN bool TryNullMXList; /* if we are the best MX, try host directly */
  1332. EXTERN bool UseErrorsTo; /* use Errors-To: header (back compat) */
  1333. EXTERN bool UseHesiod; /* using Hesiod -- interpret Hesiod errors */
  1334. EXTERN bool UseNameServer; /* using DNS -- interpret h_errno & MX RRs */
  1335. EXTERN char InetMode; /* default network for daemon mode */
  1336. EXTERN char OpMode; /* operation mode, see below */
  1337. EXTERN char SpaceSub; /* substitution for <lwsp> */
  1338. EXTERN int CheckpointInterval; /* queue file checkpoint interval */
  1339. EXTERN int ConfigLevel; /* config file level */
  1340. EXTERN int ConnRateThrottle; /* throttle for SMTP connection rate */
  1341. EXTERN int CurChildren; /* current number of daemonic children */
  1342. EXTERN int CurrentLA; /* current load average */
  1343. EXTERN int DefaultNotify; /* default DSN notification flags */
  1344. EXTERN int Errors; /* set if errors (local to single pass) */
  1345. EXTERN int ExitStat; /* exit status code */
  1346. EXTERN int FileMode; /* mode on files */
  1347. EXTERN int LineNumber; /* line number in current input */
  1348. EXTERN int LogLevel; /* level of logging to perform */
  1349. EXTERN int MaxAliasRecursion; /* maximum depth of alias recursion */
  1350. EXTERN int MaxChildren; /* maximum number of daemonic children */
  1351. EXTERN int MaxForwardEntries; /* maximum number of forward entries */
  1352. EXTERN int MaxHeadersLength; /* max length of headers */
  1353. EXTERN int MaxHopCount; /* max # of hops until bounce */
  1354. EXTERN int MaxMacroRecursion; /* maximum depth of macro recursion */
  1355. EXTERN int MaxMciCache; /* maximum entries in MCI cache */
  1356. EXTERN int MaxMimeFieldLength; /* maximum MIME field length */
  1357. EXTERN int MaxMimeHeaderLength; /* maximum MIME header length */
  1358. EXTERN int MaxQueueRun; /* maximum number of jobs in one queue run */
  1359. EXTERN int MaxRcptPerMsg; /* max recipients per SMTP message */
  1360. EXTERN int MaxRuleRecursion; /* maximum depth of ruleset recursion */
  1361. EXTERN int MimeMode; /* MIME processing mode */
  1362. EXTERN int NoRecipientAction;
  1363. EXTERN int NumPriorities; /* pointer into Priorities */
  1364. EXTERN u_short PrivacyFlags; /* privacy flags */
  1365. EXTERN int QueueLA; /* load average starting forced queueing */
  1366. EXTERN int QueueSortOrder; /* queue sorting order algorithm */
  1367. EXTERN int RefuseLA; /* load average refusing connections are */
  1368. EXTERN int VendorCode; /* vendor-specific operation enhancements */
  1369. EXTERN int Verbose; /* set if blow-by-blow desired */
  1370. EXTERN gid_t DefGid; /* default gid to run as */
  1371. EXTERN gid_t RealGid; /* real gid of caller */
  1372. EXTERN gid_t RunAsGid; /* GID to become for bulk of run */
  1373. EXTERN uid_t DefUid; /* default uid to run as */
  1374. EXTERN uid_t RealUid; /* real uid of caller */
  1375. EXTERN uid_t RunAsUid; /* UID to become for bulk of run */
  1376. EXTERN uid_t TrustedUid; /* uid of trusted user for files and startup */
  1377. EXTERN size_t DataFileBufferSize; /* size of buffer for in-core df */
  1378. EXTERN size_t XscriptFileBufferSize; /* size of buffer for in-core xf */
  1379. EXTERN time_t DialDelay; /* delay between dial-on-demand tries */
  1380. EXTERN time_t MciCacheTimeout; /* maximum idle time on connections */
  1381. EXTERN time_t MciInfoTimeout; /* how long 'til we retry down hosts */
  1382. EXTERN time_t MinQueueAge; /* min delivery interval */
  1383. EXTERN time_t QueueIntvl; /* intervals between running the queue */
  1384. EXTERN time_t SafeAlias; /* interval to wait until @:@ in alias file */
  1385. EXTERN time_t ServiceCacheMaxAge; /* refresh interval for cache */
  1386. EXTERN time_t ServiceCacheTime; /* time service switch was cached */
  1387. EXTERN MODE_T OldUmask; /* umask when sendmail starts up */
  1388. EXTERN long MaxMessageSize; /* advertised max size we will accept */
  1389. EXTERN long MinBlocksFree; /* min # of blocks free on queue fs */
  1390. EXTERN long QueueFactor; /* slope of queue function */
  1391. EXTERN long WkClassFact; /* multiplier for message class -> priority */
  1392. EXTERN long WkRecipFact; /* multiplier for # of recipients -> priority */
  1393. EXTERN long WkTimeFact; /* priority offset each time this job is run */
  1394. #if SASL
  1395. EXTERN char *AuthMechanisms; /* AUTH mechanisms */
  1396. EXTERN char *SASLInfo; /* file with AUTH info */
  1397. #endif /* SASL */
  1398. EXTERN int SASLTryAuth; /* use AUTH= ? */
  1399. EXTERN char *ConfFile; /* location of configuration file [conf.c] */
  1400. EXTERN char *ControlSocketName; /* control socket filename [control.c] */
  1401. EXTERN char *CurHostName; /* current host we are dealing with */
  1402. EXTERN char *DeadLetterDrop; /* path to dead letter office */
  1403. EXTERN char *DefUser; /* default user to run as (from DefUid) */
  1404. EXTERN char *DefaultCharSet; /* default character set for MIME */
  1405. EXTERN char *DoubleBounceAddr; /* where to send double bounces */
  1406. EXTERN char *ErrMsgFile; /* file to prepend to all error messages */
  1407. EXTERN char *FallBackMX; /* fall back MX host */
  1408. EXTERN char *FileName; /* name to print on error messages */
  1409. EXTERN char *ForwardPath; /* path to search for .forward files */
  1410. EXTERN char *HelpFile; /* location of SMTP help file */
  1411. EXTERN char *HostStatDir; /* location of host status information */
  1412. EXTERN char *HostsFile; /* path to /etc/hosts file */
  1413. EXTERN char *MustQuoteChars; /* quote these characters in phrases */
  1414. EXTERN char *MyHostName; /* name of this host for SMTP messages */
  1415. EXTERN char *OperatorChars; /* operators (old $o macro) */
  1416. EXTERN char *PidFile; /* location of proc id file [conf.c] */
  1417. EXTERN char *PostMasterCopy; /* address to get errs cc's */
  1418. EXTERN char *ProcTitlePrefix; /* process title prefix */
  1419. EXTERN char *QueueDir; /* location of queue directory */
  1420. #if _FFR_QUEUEDELAY
  1421. EXTERN int QueueAlg; /* algorithm for queue delays */
  1422. EXTERN time_t QueueInitDelay; /* initial queue delay */
  1423. EXTERN time_t QueueMaxDelay; /* maximum queue delay */
  1424. #endif /* _FFR_QUEUEDELAY */
  1425. EXTERN char *RealHostName; /* name of host we are talking to */
  1426. EXTERN char *RealUserName; /* real user name of caller */
  1427. EXTERN char *RunAsUserName; /* user to become for bulk of run */
  1428. EXTERN char *SafeFileEnv; /* chroot location for file delivery */
  1429. EXTERN char *ServiceSwitchFile; /* backup service switch */
  1430. EXTERN char *SmtpGreeting; /* SMTP greeting message (old $e macro) */
  1431. EXTERN char *SmtpPhase; /* current phase in SMTP processing */
  1432. EXTERN char *StatFile; /* location of statistics summary */
  1433. EXTERN char *TimeZoneSpec; /* override time zone specification */
  1434. EXTERN char *UdbSpec; /* user database source spec */
  1435. EXTERN char *UnixFromLine; /* UNIX From_ line (old $l macro) */
  1436. EXTERN char **ExternalEnviron; /* input environment */
  1437. /* saved user environment */
  1438. EXTERN BITMAP256 DontBlameSendmail; /* DontBlameSendmail bits */
  1439. EXTERN FILE *InChannel; /* input connection */
  1440. EXTERN FILE *OutChannel; /* output connection */
  1441. EXTERN FILE *TrafficLogFile; /* file in which to log all traffic */
  1442. #ifdef HESIOD
  1443. EXTERN void *HesiodContext;
  1444. #endif /* HESIOD */
  1445. EXTERN ENVELOPE *CurEnv; /* envelope currently being processed */
  1446. EXTERN EVENT *EventQueue; /* head of event queue */
  1447. EXTERN MAILER *LocalMailer; /* ptr to local mailer */
  1448. EXTERN MAILER *ProgMailer; /* ptr to program mailer */
  1449. EXTERN MAILER *FileMailer; /* ptr to *file* mailer */
  1450. EXTERN MAILER *InclMailer; /* ptr to *include* mailer */
  1451. EXTERN QUEUE_CHAR *QueueLimitRecipient; /* limit queue run to rcpt */
  1452. EXTERN QUEUE_CHAR *QueueLimitSender; /* limit queue run to sender */
  1453. EXTERN QUEUE_CHAR *QueueLimitId; /* limit queue run to id */
  1454. EXTERN MAILER *Mailer[MAXMAILERS + 1];
  1455. EXTERN struct rewrite *RewriteRules[MAXRWSETS];
  1456. EXTERN char *RuleSetNames[MAXRWSETS]; /* ruleset number to name */
  1457. EXTERN char *UserEnviron[MAXUSERENVIRON + 1];
  1458. EXTERN struct priority Priorities[MAXPRIORITIES];
  1459. EXTERN struct termescape TermEscape; /* terminal escape codes */
  1460. EXTERN SOCKADDR ConnectOnlyTo; /* override connection address (for testing) */
  1461. EXTERN SOCKADDR RealHostAddr; /* address of host we are talking to */
  1462. EXTERN jmp_buf TopFrame; /* branch-to-top-of-loop-on-error frame */
  1463. EXTERN TIMERS Timers;
  1464. /*
  1465. **  Declarations of useful functions
  1466. */
  1467. #if SASL
  1468. extern char *intersect __P((char *, char *));
  1469. extern char *iteminlist __P((char *, char *, char *));
  1470. extern int proxy_policy __P((void *, const char *, const char *, const char **, const char **));
  1471. extern int safesaslfile __P((void *, char *));
  1472. extern int sasl_decode64 __P((const char *, unsigned, char *, unsigned *));
  1473. extern int sasl_encode64 __P((const char *, unsigned, char *, unsigned, unsigned *));
  1474. #endif /* SASL */
  1475. /* Transcript file */
  1476. extern void closexscript __P((ENVELOPE *));
  1477. extern void openxscript __P((ENVELOPE *));
  1478. /* error related */
  1479. extern void buffer_errors __P((void));
  1480. extern void flush_errors __P((bool));
  1481. extern void message __P((const char *, ...));
  1482. extern void nmessage __P((const char *, ...));
  1483. extern void syserr __P((const char *, ...));
  1484. extern void usrerrenh __P((char *, const char *, ...));
  1485. extern void usrerr __P((const char *, ...));
  1486. extern int isenhsc __P((const char *, int));
  1487. extern int extenhsc __P((const char *, int, char *));
  1488. /* alias file */
  1489. extern void alias __P((ADDRESS *, ADDRESS **, int, ENVELOPE *));
  1490. extern bool aliaswait __P((MAP *, char *, bool));
  1491. extern void forward __P((ADDRESS *, ADDRESS **, int, ENVELOPE *));
  1492. extern void readaliases __P((MAP *, FILE *, bool, bool));
  1493. extern bool rebuildaliases __P((MAP *, bool));
  1494. extern void setalias __P((char *));
  1495. /* logging */
  1496. extern void logdelivery __P((MAILER *, MCI *, const char *, ADDRESS *, time_t, ENVELOPE *));
  1497. extern void logsender __P((ENVELOPE *, char *));
  1498. extern void sm_syslog __P((int, const char *, const char *, ...));
  1499. /* SMTP */
  1500. extern void giveresponse __P((int, MAILER *, MCI *, ADDRESS *, time_t, ENVELOPE *));
  1501. extern int reply __P((MAILER *, MCI *, ENVELOPE *, time_t, void (*)(), char **));
  1502. extern void smtp __P((char *, BITMAP256, ENVELOPE *volatile));
  1503. #if SASL
  1504. extern int smtpauth __P((MAILER *, MCI *, ENVELOPE *));
  1505. #endif /* SASL */
  1506. extern int smtpdata __P((MAILER *, MCI *, ENVELOPE *));
  1507. extern int smtpgetstat __P((MAILER *, MCI *, ENVELOPE *));
  1508. extern int smtpmailfrom __P((MAILER *, MCI *, ENVELOPE *));
  1509. extern void smtpmessage __P((char *f, MAILER *m, MCI *mci, ...));
  1510. extern void smtpinit __P((MAILER *, MCI *, ENVELOPE *, bool));
  1511. extern char *smtptodsn __P((int));
  1512. extern int smtpprobe __P((MCI *));
  1513. extern void smtpquit __P((MAILER *, MCI *, ENVELOPE *));
  1514. extern int smtprcpt __P((ADDRESS *, MAILER *, MCI *, ENVELOPE *));
  1515. extern void smtprset __P((MAILER *, MCI *, ENVELOPE *));
  1516. #define ISSMTPCODE(c) (isascii(c[0]) && isdigit(c[0]) && 
  1517.     isascii(c[1]) && isdigit(c[1]) && 
  1518.     isascii(c[2]) && isdigit(c[2]))
  1519. #define ISSMTPREPLY(c) (ISSMTPCODE(c) && 
  1520.     (c[3] == ' ' || c[3] == '-' || c[3] == ''))
  1521. /* delivery */
  1522. extern pid_t dowork __P((int, char *, bool, bool, ENVELOPE *));
  1523. extern int endmailer __P((MCI *, ENVELOPE *, char **));
  1524. extern int mailfile __P((char *volatile, MAILER *volatile, ADDRESS *, volatile long, ENVELOPE *));
  1525. extern void sendall __P((ENVELOPE *, int));
  1526. /* stats */
  1527. extern void markstats __P((ENVELOPE *, ADDRESS *, bool));
  1528. extern void clearstats __P((void));
  1529. extern void poststats __P((char *));
  1530. /* control socket */
  1531. extern void closecontrolsocket  __P((bool));
  1532. extern void clrcontrol  __P((void));
  1533. extern void control_command __P((int, ENVELOPE *));
  1534. extern int opencontrolsocket __P((void));
  1535. extern char *addquotes __P((char *));
  1536. extern char *arpadate __P((char *));
  1537. extern bool atobool __P((char *));
  1538. extern int atooct __P((char *));
  1539. extern void auth_warning __P((ENVELOPE *, const char *, ...));
  1540. extern int blocksignal __P((int));
  1541. extern bool bitintersect __P((BITMAP256, BITMAP256));
  1542. extern bool bitzerop __P((BITMAP256));
  1543. extern void buildfname __P((char *, char *, char *, int));
  1544. extern int checkcompat __P((ADDRESS *, ENVELOPE *));
  1545. #ifdef XDEBUG
  1546. extern void checkfd012 __P((char *));
  1547. extern void checkfdopen __P((int, char *));
  1548. #endif /* XDEBUG */
  1549. extern void checkfds __P((char *));
  1550. extern bool chownsafe __P((int, bool));
  1551. extern void cleanstrcpy __P((char *, char *, int));
  1552. extern void clrdaemon __P((void));
  1553. extern void collect __P((FILE *, bool, HDR **, ENVELOPE *));
  1554. extern time_t convtime __P((char *, int));
  1555. extern char **copyplist __P((char **, bool));
  1556. extern void copy_class __P((int, int));
  1557. extern time_t curtime __P((void));
  1558. extern char *defcharset __P((ENVELOPE *));
  1559. extern char *denlstring __P((char *, bool, bool));
  1560. extern void disconnect __P((int, ENVELOPE *));
  1561. extern bool dns_getcanonname __P((char *, int, bool, int *));
  1562. extern int dofork __P((void));
  1563. extern int drop_privileges __P((bool));
  1564. extern int dsntoexitstat __P((char *));
  1565. extern void dumpfd __P((int, bool, bool));
  1566. extern void dumpstate __P((char *));
  1567. extern bool enoughdiskspace __P((long, bool));
  1568. extern char *exitstat __P((char *));
  1569. extern char *fgetfolded __P((char *, int, FILE *));
  1570. extern void fill_fd __P((int, char *));
  1571. extern char *find_character __P((char *, int));
  1572. extern struct passwd *finduser __P((char *, bool *));
  1573. extern void finis __P((bool, volatile int));
  1574. extern void fixcrlf __P((char *, bool));
  1575. extern long freediskspace __P((char *, long *));
  1576. extern char *get_column __P((char *, int, int, char *, int));
  1577. extern char *getauthinfo __P((int, bool *));
  1578. extern char *getcfname __P((void));
  1579. extern char *getextenv __P((const char *));
  1580. extern int getdtsize __P((void));
  1581. extern BITMAP256 *getrequests __P((ENVELOPE *));
  1582. extern char *getvendor __P((int));
  1583. extern void help __P((char *, ENVELOPE *e));
  1584. extern void init_md __P((int, char **));
  1585. extern void initdaemon __P((void));
  1586. extern void inithostmaps __P((void));
  1587. extern void initmacros __P((ENVELOPE *));
  1588. extern void initsetproctitle __P((int, char **, char **));
  1589. extern void init_vendor_macros __P((ENVELOPE *));
  1590. extern SIGFUNC_DECL intindebug __P((int));
  1591. extern SIGFUNC_DECL intsig __P((int));
  1592. extern bool isloopback __P((SOCKADDR sa));
  1593. extern void load_if_names __P((void));
  1594. extern bool lockfile __P((int, char *, char *, int));
  1595. extern void log_sendmail_pid __P((ENVELOPE *));
  1596. extern char lower __P((int));
  1597. extern void makelower __P((char *));
  1598. extern int makeconnection_ds __P((char *, MCI *));
  1599. extern int makeconnection __P((char *, volatile u_int, MCI *, ENVELOPE *));
  1600. extern struct hostent *myhostname __P((char *, int));
  1601. extern char *nisplus_default_domain __P((void)); /* extern for Sun */
  1602. extern bool path_is_dir __P((char *, bool));
  1603. extern char *pintvl __P((time_t, bool));
  1604. extern void printav __P((char **));
  1605. extern void printmailer __P((MAILER *));
  1606. extern void printopenfds __P((bool));
  1607. extern void printqueue __P((void));
  1608. extern void printrules __P((void));
  1609. extern int prog_open __P((char **, int *, ENVELOPE *));
  1610. extern void putline __P((char *, MCI *));
  1611. extern void putxline __P((char *, size_t, MCI *, int));
  1612. extern void queueup_macros __P((int, FILE *, ENVELOPE *));
  1613. extern SIGFUNC_DECL quiesce __P((int));
  1614. extern void readcf __P((char *, bool, ENVELOPE *));
  1615. extern SIGFUNC_DECL reapchild __P((int));
  1616. extern bool refuseconnections __P((char *, ENVELOPE *, int));
  1617. extern int releasesignal __P((int));
  1618. extern void resetlimits __P((void));
  1619. extern bool rfc822_string __P((char *));
  1620. extern void savemail __P((ENVELOPE *, bool));
  1621. extern void seed_random __P((void));
  1622. extern void sendtoargv __P((char **, ENVELOPE *));
  1623. extern void setclientoptions __P((char *));
  1624. extern bool setdaemonoptions __P((char *));
  1625. extern void setdefaults __P((ENVELOPE *));
  1626. extern void setdefuser __P((void));
  1627. extern bool setvendor __P((char *));
  1628. extern void setoption __P((int, char *, bool, bool, ENVELOPE *));
  1629. extern sigfunc_t setsignal __P((int, sigfunc_t));
  1630. extern void setuserenv __P((const char *, const char *));
  1631. extern void settime __P((ENVELOPE *));
  1632. extern char *sfgets __P((char *, int, FILE *, time_t, char *));
  1633. extern char *shortenstring __P((const char *, int));
  1634. extern void shorten_hostname __P((char []));
  1635. extern bool shorten_rfc822_string __P((char *, size_t));
  1636. extern SIGFUNC_DECL sigusr1 __P((int));
  1637. extern SIGFUNC_DECL sighup __P((int));
  1638. extern void sm_dopr __P((char *, const char *, va_list));
  1639. extern struct hostent *sm_gethostbyname __P((char *, int));
  1640. extern struct hostent *sm_gethostbyaddr __P((char *, int, int));
  1641. extern int sm_getla __P((ENVELOPE *));
  1642. extern struct passwd *sm_getpwnam __P((char *));
  1643. extern struct passwd *sm_getpwuid __P((UID_T));
  1644. extern void sm_setproctitle __P((bool, ENVELOPE *, const char *, ...));
  1645. extern int sm_strcasecmp __P((const char *, const char *));
  1646. extern bool strcontainedin __P((char *, char *));
  1647. extern void stripquotes __P((char *));
  1648. extern int switch_map_find __P((char *, char *[], short []));
  1649. extern bool transienterror __P((int));
  1650. extern void tTflag __P((char *));
  1651. extern void tTsetup __P((u_char *, int, char *));
  1652. extern SIGFUNC_DECL tick __P((int));
  1653. extern char *ttypath __P((void));
  1654. extern void unlockqueue __P((ENVELOPE *));
  1655. #if !HASUNSETENV
  1656. extern void unsetenv __P((char *));
  1657. #endif /* !HASUNSETENV */
  1658. extern char *username __P((void));
  1659. extern bool usershellok __P((char *, char *));
  1660. extern void vendor_post_defaults __P((ENVELOPE *));
  1661. extern void vendor_pre_defaults __P((ENVELOPE *));
  1662. extern int waitfor __P((pid_t));
  1663. extern bool writable __P((char *, ADDRESS *, long));
  1664. extern char *xalloc __P((int));
  1665. extern void xputs __P((const char *));
  1666. extern char *xtextify __P((char *, char *));
  1667. extern bool xtextok __P((char *));
  1668. extern void xunlink __P((char *));
  1669. extern char *xuntextify __P((char *));
  1670. #endif /* _SENDMAIL_H */