From ca912893b4e0f16e958e36418347959a0ae09777 Mon Sep 17 00:00:00 2001 From: gshapiro Date: Sun, 1 Aug 2004 01:16:16 +0000 Subject: Resolve conflicts from sendmail 8.13.1 import --- contrib/sendmail/cf/feature/nodns.m4 | 22 --- contrib/sendmail/cf/m4/cfhead.m4 | 5 +- contrib/sendmail/contrib/oldbind.compat.c | 79 --------- contrib/sendmail/libsm/vsprintf.c | 66 ------- contrib/sendmail/mail.local/mail.local.8 | 29 +++- contrib/sendmail/mail.local/mail.local.c | 185 +++++++++++++++++++- contrib/sendmail/mailstats/mailstats.c | 20 +-- contrib/sendmail/makemap/makemap.c | 20 +-- contrib/sendmail/smrsh/smrsh.8 | 6 +- contrib/sendmail/smrsh/smrsh.c | 2 +- contrib/sendmail/src/aliases.5 | 15 +- contrib/sendmail/src/conf.c | 276 ++++++++++++++++-------------- contrib/sendmail/src/conf.h | 12 +- contrib/sendmail/src/err.c | 6 +- contrib/sendmail/src/headers.c | 206 +++++++++++++++++----- contrib/sendmail/src/mailq.1 | 18 +- contrib/sendmail/src/mci.c | 16 +- contrib/sendmail/src/savemail.c | 15 +- contrib/sendmail/src/sendmail.8 | 22 ++- contrib/sendmail/vacation/vacation.1 | 21 ++- 20 files changed, 641 insertions(+), 400 deletions(-) delete mode 100644 contrib/sendmail/cf/feature/nodns.m4 delete mode 100644 contrib/sendmail/contrib/oldbind.compat.c delete mode 100644 contrib/sendmail/libsm/vsprintf.c (limited to 'contrib') diff --git a/contrib/sendmail/cf/feature/nodns.m4 b/contrib/sendmail/cf/feature/nodns.m4 deleted file mode 100644 index c5acadf..0000000 --- a/contrib/sendmail/cf/feature/nodns.m4 +++ /dev/null @@ -1,22 +0,0 @@ -divert(-1) -# -# Copyright (c) 1998, 1999 Sendmail, Inc. and its suppliers. -# All rights reserved. -# Copyright (c) 1983 Eric P. Allman. All rights reserved. -# Copyright (c) 1988, 1993 -# The Regents of the University of California. All rights reserved. -# -# By using this file, you agree to the terms and conditions set -# forth in the LICENSE file which can be found at the top level of -# the sendmail distribution. -# -# - -divert(0) -VERSIONID(`$Id: nodns.m4,v 8.14 1999/07/22 17:55:35 gshapiro Exp $') -divert(-1) - -undefine(`confBIND_OPTS')dnl -errprint(`FEATURE(nodns) is no-op. -Use ServiceSwitchFile ('ifdef(`confSERVICE_SWITCH_FILE',confSERVICE_SWITCH_FILE,MAIL_SETTINGS_DIR`service.switch')`) if your OS does not provide its own instead. -') diff --git a/contrib/sendmail/cf/m4/cfhead.m4 b/contrib/sendmail/cf/m4/cfhead.m4 index 8828da9..dc1d8ba 100644 --- a/contrib/sendmail/cf/m4/cfhead.m4 +++ b/contrib/sendmail/cf/m4/cfhead.m4 @@ -1,5 +1,5 @@ # -# Copyright (c) 1998-2003 Sendmail, Inc. and its suppliers. +# Copyright (c) 1998-2004 Sendmail, Inc. and its suppliers. # All rights reserved. # Copyright (c) 1983, 1995 Eric P. Allman. All rights reserved. # Copyright (c) 1988, 1993 @@ -304,7 +304,8 @@ define(`confMILTER_MACROS_CONNECT', ``j, _, {daemon_name}, {if_name}, {if_addr}' define(`confMILTER_MACROS_HELO', ``{tls_version}, {cipher}, {cipher_bits}, {cert_subject}, {cert_issuer}'') define(`confMILTER_MACROS_ENVFROM', ``i, {auth_type}, {auth_authen}, {auth_ssf}, {auth_author}, {mail_mailer}, {mail_host}, {mail_addr}'') define(`confMILTER_MACROS_ENVRCPT', ``{rcpt_mailer}, {rcpt_host}, {rcpt_addr}'') +define(`confMILTER_MACROS_EOM', `{msg_id}') divert(0)dnl -VERSIONID(`$Id: cfhead.m4,v 8.108.2.6 2003/12/05 02:26:47 ca Exp $') +VERSIONID(`$Id: cfhead.m4,v 8.116 2004/01/28 22:02:22 ca Exp $') diff --git a/contrib/sendmail/contrib/oldbind.compat.c b/contrib/sendmail/contrib/oldbind.compat.c deleted file mode 100644 index 1621a7b..0000000 --- a/contrib/sendmail/contrib/oldbind.compat.c +++ /dev/null @@ -1,79 +0,0 @@ -/* -** OLDBIND.COMPAT.C -** -** Very old systems do not have res_query(), res_querydomain() or -** res_search(), so emulate them here. -** -** You really ought to be upgrading to a newer version of BIND -** (4.8.2 or later) rather than be using this. -** -** J.R. Oldroyd -*/ - -#include -#include -#include -#include - -typedef union -{ - HEADER qb1; - char qb2[PACKETSZ]; -} querybuf; - -res_query(dname, class, type, data, datalen) - char * dname; - int class; - int type; - char * data; - int datalen; -{ - int n; - querybuf buf; - - n = res_mkquery(QUERY, dname, class, type, (char *) NULL, 0, - NULL, (char *) &buf, sizeof buf); - n = res_send((char *)&buf, n, data, datalen); - - return n; -} - -res_querydomain(host, dname, class, type, data, datalen) - char * host; - char * dname; - int class; - int type; - char * data; - int datalen; -{ - int n; - querybuf buf; - char dbuf[256]; - - strcpy(dbuf, host); - if (dbuf[strlen(dbuf)-1] != '.') - strcat(dbuf, "."); - strcat(dbuf, dname); - n = res_mkquery(QUERY, dbuf, class, type, (char *) NULL, 0, - NULL, (char *)&buf, sizeof buf); - n = res_send((char *) &buf, n, data, datalen); - - return n; -} - -res_search(dname, class, type, data, datalen) - char * dname; - int class; - int type; - char * data; - int datalen; -{ - int n; - querybuf buf; - - n = res_mkquery(QUERY, dname, class, type, (char *)NULL, 0, - NULL, (char *) &buf, sizeof buf); - n = res_send((char *) &buf, n, data, datalen); - - return n; -} diff --git a/contrib/sendmail/libsm/vsprintf.c b/contrib/sendmail/libsm/vsprintf.c deleted file mode 100644 index 827fcec..0000000 --- a/contrib/sendmail/libsm/vsprintf.c +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright (c) 2000-2001 Sendmail, Inc. and its suppliers. - * All rights reserved. - * Copyright (c) 1990, 1993 - * The Regents of the University of California. All rights reserved. - * - * This code is derived from software contributed to Berkeley by - * Chris Torek. - * - * By using this file, you agree to the terms and conditions set - * forth in the LICENSE file which can be found at the top level of - * the sendmail distribution. - */ - -#include -SM_RCSID("@(#)$Id: vsprintf.c,v 1.21 2001/09/11 04:04:49 gshapiro Exp $") -#include -#include -#include "local.h" - -/* -** SM_VSPRINTF -- format data for "output" into a string -** -** Assigned 'str' to a "fake" file pointer. This allows common -** o/p formatting function sm_vprintf() to be used. -** -** Parameters: -** str -- location for output -** fmt -- format directives -** ap -- data unit vectors for use by 'fmt' -** -** Results: -** result from sm_io_vfprintf() -** -** Side Effects: -** Quietly limits the size to INT_MAX though this may -** not prevent SEGV's. -*/ - -int -sm_vsprintf(str, fmt, ap) - char *str; - const char *fmt; - SM_VA_LOCAL_DECL -{ - int ret; - SM_FILE_T fake; - - fake.sm_magic = SmFileMagic; - fake.f_file = -1; - fake.f_flags = SMWR | SMSTR; - fake.f_bf.smb_base = fake.f_p = (unsigned char *)str; - fake.f_bf.smb_size = fake.f_w = INT_MAX; - fake.f_timeout = SM_TIME_FOREVER; - fake.f_timeoutstate = SM_TIME_BLOCK; - fake.f_close = NULL; - fake.f_open = NULL; - fake.f_read = NULL; - fake.f_write = NULL; - fake.f_seek = NULL; - fake.f_setinfo = fake.f_getinfo = NULL; - fake.f_type = "sm_vsprintf:fake"; - ret = sm_io_vfprintf(&fake, SM_TIME_FOREVER, fmt, ap); - *fake.f_p = '\0'; - return ret; -} diff --git a/contrib/sendmail/mail.local/mail.local.8 b/contrib/sendmail/mail.local/mail.local.8 index 5ded558..7811451 100644 --- a/contrib/sendmail/mail.local/mail.local.8 +++ b/contrib/sendmail/mail.local/mail.local.8 @@ -1,4 +1,4 @@ -.\" Copyright (c) 1998-2001 Sendmail, Inc. and its suppliers. +.\" Copyright (c) 1998-2001, 2003 Sendmail, Inc. and its suppliers. .\" All rights reserved. .\" Copyright (c) 1990, 1993 .\" The Regents of the University of California. All rights reserved. @@ -8,9 +8,9 @@ .\" the sendmail distribution. .\" .\" -.\" $Id: mail.local.8,v 8.23 2001/04/05 23:27:35 gshapiro Exp $ +.\" $Id: mail.local.8,v 8.25 2003/10/20 20:26:51 ca Exp $ .\" -.TH MAIL.LOCAL 8 "$Date: 2001/04/05 23:27:35 $" +.TH MAIL.LOCAL 8 "$Date: 2003/10/20 20:26:51 $" .SH NAME mail.local \- store mail in a mailbox @@ -77,6 +77,29 @@ Same as \-f. Store incoming mail in \fIfilename\fR in the user's home directory instead of a system mail spool directory. .PP +The next options are only available if +.B mail.local +has been compiled with -DHASHSPOOL. +.TP +.BI \-H " hashtypehashdepth" +Select hashed mail directories. +Valid hash types are +.B u +for user name and +.B m +for MD5 (requires compilation with -DHASHSPOOLMD5). +Example: +.BI \-H " u2" +selects user name hashing with a hash depth of 2. +Note: there must be no space between the hash type and the depth. +.TP +.BI \-p " path" +Specify an alternate mail spool path. +.TP +.BI \-n +Specify that the domain part of recipient addresses in LMTP mode +should not be stripped. +.PP Individual mail messages in the mailbox are delimited by an empty line followed by a line beginning with the string ``From ''. A line containing the string ``From '', the sender's name and a time stamp diff --git a/contrib/sendmail/mail.local/mail.local.c b/contrib/sendmail/mail.local/mail.local.c index 3b91ee43..d623ac9 100644 --- a/contrib/sendmail/mail.local/mail.local.c +++ b/contrib/sendmail/mail.local/mail.local.c @@ -20,7 +20,7 @@ SM_IDSTR(copyright, Copyright (c) 1990, 1993, 1994\n\ The Regents of the University of California. All rights reserved.\n") -SM_IDSTR(id, "@(#)$Id: mail.local.c,v 8.239.2.11 2003/09/01 01:49:46 gshapiro Exp $") +SM_IDSTR(id, "@(#)$Id: mail.local.c,v 8.251 2003/11/03 18:38:29 ca Exp $") #include #include @@ -34,6 +34,13 @@ SM_IDSTR(id, "@(#)$Id: mail.local.c,v 8.239.2.11 2003/09/01 01:49:46 gshapiro Ex #include #include +#ifndef HASHSPOOL +# define HASHSPOOL 0 +#endif /* ! HASHSPOOL */ +#ifndef HASHSPOOLMD5 +# define HASHSPOOLMD5 0 +#endif /* ! HASHSPOOLMD5 */ + /* ** This is not intended to work on System V derived systems ** such as Solaris or HP-UX, since they use a totally different @@ -65,6 +72,15 @@ SM_IDSTR(id, "@(#)$Id: mail.local.c,v 8.239.2.11 2003/09/01 01:49:46 gshapiro Ex #include #include +#if HASHSPOOL +# define HASH_NONE 0 +# define HASH_USER 1 +# if HASHSPOOLMD5 +# define HASH_MD5 2 +# include +# endif /* HASHSPOOLMD5 */ +#endif /* HASHSPOOL */ + #ifndef LOCKTO_RM # define LOCKTO_RM 300 /* timeout for stale lockfile removal */ @@ -134,6 +150,15 @@ bool LMTPMode = false; bool BounceQuota = false; /* permanent error when over quota */ char *HomeMailFile = NULL; /* store mail in homedir */ +#if HASHSPOOL +int HashType = HASH_NONE; +int HashDepth = 0; +bool StripRcptDomain = true; +#else /* HASHSPOOL */ +# define StripRcptDomain true +#endif /* HASHSPOOL */ +char SpoolPath[MAXPATHLEN]; + void deliver __P((int, char *)); int e_to_sys __P((int)); void notifybiff __P((char *)); @@ -143,6 +168,9 @@ int lockmbox __P((char *)); void unlockmbox __P((void)); void mailerr __P((const char *, const char *, ...)); void flush_error __P((void)); +#if HASHSPOOL +const char *hashname __P((char *)); +#endif /* HASHSPOOL */ int @@ -174,7 +202,17 @@ main(argc, argv) # endif /* LOG_MAIL */ from = NULL; + if (sm_strlcpy(SpoolPath, _PATH_MAILDIR, sizeof(SpoolPath)) >= + sizeof(SpoolPath)) + { + mailerr("421", "Configuration error: _PATH_MAILDIR too large"); + exit(EX_CONFIG); + } +#if HASHSPOOL + while ((ch = getopt(argc, argv, "7BbdD:f:h:r:lH:p:ns")) != -1) +#else /* HASHSPOOL */ while ((ch = getopt(argc, argv, "7BbdD:f:h:r:ls")) != -1) +#endif /* HASHSPOOL */ { switch(ch) { @@ -225,6 +263,61 @@ main(argc, argv) nofsync++; break; +#if HASHSPOOL + case 'H': + if (optarg == NULL || *optarg == '\0') + { + mailerr(NULL, "-H: missing hashinfo"); + usage(); + } + switch(optarg[0]) + { + case 'u': + HashType = HASH_USER; + break; + +# if HASHSPOOLMD5 + case 'm': + HashType = HASH_MD5; + break; +# endif /* HASHSPOOLMD5 */ + + default: + mailerr(NULL, "-H: unknown hash type"); + usage(); + } + if (optarg[1] == '\0') + { + mailerr(NULL, "-H: invalid hash depth"); + usage(); + } + HashDepth = atoi(&optarg[1]); + if ((HashDepth <= 0) || ((HashDepth * 2) >= MAXPATHLEN)) + { + mailerr(NULL, "-H: invalid hash depth"); + usage(); + } + break; + + case 'p': + if (optarg == NULL || *optarg == '\0') + { + mailerr(NULL, "-p: missing spool path"); + usage(); + } + if (sm_strlcpy(SpoolPath, optarg, sizeof(SpoolPath)) >= + sizeof(SpoolPath)) + { + mailerr(NULL, "-p: invalid spool path"); + usage(); + } + break; + + case 'n': + StripRcptDomain = false; + break; +#endif /* HASHSPOOL */ + case '?': default: usage(); @@ -593,7 +686,7 @@ dolmtp() } if (sm_strncasecmp(buf + 5, "to:", 3) != 0 || ((rcpt_addr[rcpt_num] = parseaddr(buf + 8, - true)) == NULL)) + StripRcptDomain)) == NULL)) { mailerr("501 5.5.4", "Syntax error in parameters"); @@ -916,6 +1009,7 @@ deliver(fd, name) ** Also, clear out any bogus characters. */ +#if !HASHSPOOL if (strlen(name) > 40) name[40] = '\0'; for (p = name; *p != '\0'; p++) @@ -925,12 +1019,22 @@ deliver(fd, name) else if (!isprint(*p)) *p = '.'; } +#endif /* !HASHSPOOL */ if (HomeMailFile == NULL) { - if (sm_snprintf(path, sizeof(path), "%s/%s", - _PATH_MAILDIR, name) >= sizeof(path)) + if (sm_strlcpyn(path, sizeof(path), +#if HASHSPOOL + 4, +#else /* HASHSPOOL */ + 3, +#endif /* HASHSPOOL */ + SpoolPath, "/", +#if HASHSPOOL + hashname(name), +#endif /* HASHSPOOL */ + name) >= sizeof(path)) { exitval = EX_UNAVAILABLE; mailerr("550 5.1.1", "%s: Invalid mailbox path", name); @@ -1510,6 +1614,79 @@ flush_error() } } +#if HASHSPOOL +const char * +hashname(name) + char *name; +{ + static char p[MAXPATHLEN]; + int i; + int len; + char *str; +# if HASHSPOOLMD5 + char Base64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+_"; + MD5_CTX ctx; + unsigned char md5[18]; +# if MAXPATHLEN <= 24 + ERROR _MAXPATHLEN <= 24 +# endif /* MAXPATHLEN <= 24 */ + char b64[24]; + MD5_LONG bits; + int j; +# endif /* HASHSPOOLMD5 */ + + if (HashType == HASH_NONE || HashDepth * 2 >= MAXPATHLEN) + { + p[0] = '\0'; + return p; + } + + switch(HashType) + { + case HASH_USER: + str = name; + break; + +# if HASHSPOOLMD5 + case HASH_MD5: + MD5_Init(&ctx); + MD5_Update(&ctx, name, strlen(name)); + MD5_Final(md5, &ctx); + md5[16] = 0; + md5[17] = 0; + + for (i = 0; i < 6; i++) + { + bits = (unsigned) md5[(3 * i)] << 16; + bits |= (unsigned) md5[(3 * i) + 1] << 8; + bits |= (unsigned) md5[(3 * i) + 2]; + + for (j = 3; j >= 0; j--) + { + b64[(4 * i) + j] = Base64[(bits & 0x3f)]; + bits >>= 6; + } + } + b64[22] = '\0'; + str = b64; + break; +# endif /* HASHSPOOLMD5 */ + } + + len = strlen(str); + for (i = 0; i < HashDepth; i++) + { + if (i < len) + p[i * 2] = str[i]; + else + p[i * 2] = '_'; + p[(i * 2) + 1] = '/'; + } + p[HashDepth * 2] = '\0'; + return p; +} +#endif /* HASHSPOOL */ + /* * e_to_sys -- * Guess which errno's are temporary. Gag me. diff --git a/contrib/sendmail/mailstats/mailstats.c b/contrib/sendmail/mailstats/mailstats.c index ec56e3a..f8b57b3 100644 --- a/contrib/sendmail/mailstats/mailstats.c +++ b/contrib/sendmail/mailstats/mailstats.c @@ -15,12 +15,12 @@ #include SM_IDSTR(copyright, -"@(#) Copyright (c) 1998-2001 Sendmail, Inc. and its suppliers.\n\ +"@(#) Copyright (c) 1998-2002 Sendmail, Inc. and its suppliers.\n\ All rights reserved.\n\ Copyright (c) 1988, 1993\n\ The Regents of the University of California. All rights reserved.\n") -SM_IDSTR(id, "@(#)$Id: mailstats.c,v 8.98 2002/05/24 23:10:15 gshapiro Exp $") +SM_IDSTR(id, "@(#)$Id: mailstats.c,v 8.100 2002/06/27 23:24:06 gshapiro Exp $") #include #include @@ -59,9 +59,7 @@ main(argc, argv) bool trunc; long frmsgs = 0, frbytes = 0, tomsgs = 0, tobytes = 0, rejmsgs = 0; long dismsgs = 0; -#if _FFR_QUARANTINE long quarmsgs = 0; -#endif /* _FFR_QUARANTINE */ time_t now; char mtable[MAXMAILERS][MNAMELEN + 1]; char sfilebuf[MAXPATHLEN]; @@ -285,18 +283,14 @@ main(argc, argv) ctime(&stats.stat_itime)); (void) sm_io_fprintf(smioout, SM_TIME_DEFAULT, " M msgsfr bytes_from msgsto bytes_to msgsrej msgsdis"); -#if _FFR_QUARANTINE (void) sm_io_fprintf(smioout, SM_TIME_DEFAULT, " msgsqur"); -#endif /* _FFR_QUARANTINE */ (void) sm_io_fprintf(smioout, SM_TIME_DEFAULT, "%s\n", mnames ? " Mailer" : ""); } for (i = 0; i < MAXMAILERS; i++) { if (stats.stat_nf[i] || stats.stat_nt[i] || -#if _FFR_QUARANTINE stats.stat_nq[i] || -#endif /* _FFR_QUARANTINE */ stats.stat_nr[i] || stats.stat_nd[i]) { char *format; @@ -313,10 +307,8 @@ main(argc, argv) stats.stat_bt[i], stats.stat_nr[i], stats.stat_nd[i]); -#if _FFR_QUARANTINE (void) sm_io_fprintf(smioout, SM_TIME_DEFAULT, " %6ld", stats.stat_nq[i]); -#endif /* _FFR_QUARANTINE */ if (mnames) (void) sm_io_fprintf(smioout, SM_TIME_DEFAULT, " %s", @@ -328,9 +320,7 @@ main(argc, argv) tobytes += stats.stat_bt[i]; rejmsgs += stats.stat_nr[i]; dismsgs += stats.stat_nd[i]; -#if _FFR_QUARANTINE quarmsgs += stats.stat_nq[i]; -#endif /* _FFR_QUARANTINE */ } } if (progmode) @@ -339,10 +329,8 @@ main(argc, argv) " T %8ld %10ld %8ld %10ld %6ld %6ld", frmsgs, frbytes, tomsgs, tobytes, rejmsgs, dismsgs); -#if _FFR_QUARANTINE (void) sm_io_fprintf(smioout, SM_TIME_DEFAULT, " %6ld", quarmsgs); -#endif /* _FFR_QUARANTINE */ (void) sm_io_fprintf(smioout, SM_TIME_DEFAULT, "\n"); (void) sm_io_fprintf(smioout, SM_TIME_DEFAULT, " C %8ld %8ld %6ld\n", @@ -360,18 +348,14 @@ main(argc, argv) { (void) sm_io_fprintf(smioout, SM_TIME_DEFAULT, "============================================================="); -#if _FFR_QUARANTINE (void) sm_io_fprintf(smioout, SM_TIME_DEFAULT, "========"); -#endif /* _FFR_QUARANTINE */ (void) sm_io_fprintf(smioout, SM_TIME_DEFAULT, "\n"); (void) sm_io_fprintf(smioout, SM_TIME_DEFAULT, " T %8ld %10ldK %8ld %10ldK %6ld %6ld", frmsgs, frbytes, tomsgs, tobytes, rejmsgs, dismsgs); -#if _FFR_QUARANTINE (void) sm_io_fprintf(smioout, SM_TIME_DEFAULT, " %6ld", quarmsgs); -#endif /* _FFR_QUARANTINE */ (void) sm_io_fprintf(smioout, SM_TIME_DEFAULT, "\n"); (void) sm_io_fprintf(smioout, SM_TIME_DEFAULT, " C %8ld %10s %8ld %10s %6ld\n", diff --git a/contrib/sendmail/makemap/makemap.c b/contrib/sendmail/makemap/makemap.c index 59c28f6..bf3d282 100644 --- a/contrib/sendmail/makemap/makemap.c +++ b/contrib/sendmail/makemap/makemap.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998-2001 Sendmail, Inc. and its suppliers. + * Copyright (c) 1998-2002 Sendmail, Inc. and its suppliers. * All rights reserved. * Copyright (c) 1992 Eric P. Allman. All rights reserved. * Copyright (c) 1992, 1993 @@ -20,7 +20,7 @@ SM_IDSTR(copyright, Copyright (c) 1992, 1993\n\ The Regents of the University of California. All rights reserved.\n") -SM_IDSTR(id, "@(#)$Id: makemap.c,v 8.175 2001/12/28 22:44:01 ca Exp $") +SM_IDSTR(id, "@(#)$Id: makemap.c,v 8.176 2002/06/27 23:41:04 gshapiro Exp $") #include @@ -56,13 +56,15 @@ static void usage(progname) char *progname; { - /* XXX break the usage output into multiple lines? it's too long */ sm_io_fprintf(smioerr, SM_TIME_DEFAULT, - "Usage: %s [-C cffile] [-N] [-c cachesize] [-d] [-e] [-f] [-l] [-o] [-r] [-s] [-t delimiter] [-u] [-v] type mapname\n", - progname); -#if _FFR_COMMENT_CHAR - /* add -D comment-char */ -#endif /* _FFR_COMMENT_CHAR */ + "Usage: %s [-C cffile] [-N] [-c cachesize] [-D commentchar]\n", + progname); + sm_io_fprintf(smioerr, SM_TIME_DEFAULT, + " %*s [-d] [-e] [-f] [-l] [-o] [-r] [-s] [-t delimiter]\n", + (int) strlen(progname), ""); + sm_io_fprintf(smioerr, SM_TIME_DEFAULT, + " %*s [-u] [-v] type mapname\n", + (int) strlen(progname), ""); exit(EX_USAGE); } @@ -161,11 +163,9 @@ main(argc, argv) foldcase = false; break; -#if _FFR_COMMENT_CHAR case 'D': comment = *optarg; break; -#endif /* _FFR_COMMENT_CHAR */ case 'l': smdb_print_available_types(); diff --git a/contrib/sendmail/smrsh/smrsh.8 b/contrib/sendmail/smrsh/smrsh.8 index 0dd8926..040aa31 100644 --- a/contrib/sendmail/smrsh/smrsh.8 +++ b/contrib/sendmail/smrsh/smrsh.8 @@ -1,4 +1,4 @@ -.\" Copyright (c) 1998-2001 Sendmail, Inc. and its suppliers. +.\" Copyright (c) 1998-2003 Sendmail, Inc. and its suppliers. .\" All rights reserved. .\" Copyright (c) 1993 Eric P. Allman. All rights reserved. .\" Copyright (c) 1993 @@ -9,9 +9,9 @@ .\" the sendmail distribution. .\" .\" -.\" $Id: smrsh.8,v 8.16.2.2 2003/10/07 18:05:37 ca Exp $ +.\" $Id: smrsh.8,v 8.20 2003/10/07 18:05:12 ca Exp $ .\" -.TH SMRSH 8 "$Date: 2003/10/07 18:05:37 $" +.TH SMRSH 8 "$Date: 2003/10/07 18:05:12 $" .SH NAME smrsh \- restricted shell for sendmail .SH SYNOPSIS diff --git a/contrib/sendmail/smrsh/smrsh.c b/contrib/sendmail/smrsh/smrsh.c index 409b13f..67f6bff 100644 --- a/contrib/sendmail/smrsh/smrsh.c +++ b/contrib/sendmail/smrsh/smrsh.c @@ -21,7 +21,7 @@ SM_IDSTR(copyright, Copyright (c) 1993\n\ The Regents of the University of California. All rights reserved.\n") -SM_IDSTR(id, "@(#)$Id: smrsh.c,v 8.58.2.5 2003/12/15 17:09:39 ca Exp $") +SM_IDSTR(id, "@(#)$Id: smrsh.c,v 8.63 2003/12/15 17:12:29 ca Exp $") /* ** SMRSH -- sendmail restricted shell diff --git a/contrib/sendmail/src/aliases.5 b/contrib/sendmail/src/aliases.5 index 62b5dfb..32fb50c 100644 --- a/contrib/sendmail/src/aliases.5 +++ b/contrib/sendmail/src/aliases.5 @@ -9,9 +9,9 @@ .\" the sendmail distribution. .\" .\" -.\" $Id: aliases.5,v 8.17 2000/12/14 23:09:46 gshapiro Exp $ +.\" $Id: aliases.5,v 8.19 2004/07/12 05:39:21 ca Exp $ .\" -.TH ALIASES 5 "$Date: 2000/12/14 23:09:46 $" +.TH ALIASES 5 "$Date: 2004/07/12 05:39:21 $" .SH NAME aliases \- aliases file for sendmail @@ -78,6 +78,17 @@ are comments. Aliasing occurs only on local names. Loops can not occur, since no message will be sent to any person more than once. .PP +If an alias is found for +.IR name , +sendmail then checks for an alias for +.IR owner-name . +If it is found and the result of the lookup expands to a single +address, the envelope sender address of the message is rewritten to +that address. +If it is found and the result expands to more than one address, the +envelope sender address is changed to +.IR owner-name . +.PP After aliasing has been done, local and valid recipients who have a ``.forward'' file in their home directory have messages forwarded to the diff --git a/contrib/sendmail/src/conf.c b/contrib/sendmail/src/conf.c index 71c2c7a..c8989a0 100644 --- a/contrib/sendmail/src/conf.c +++ b/contrib/sendmail/src/conf.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998-2003 Sendmail, Inc. and its suppliers. + * Copyright (c) 1998-2004 Sendmail, Inc. and its suppliers. * All rights reserved. * Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved. * Copyright (c) 1988, 1993 @@ -14,7 +14,7 @@ #include -SM_RCSID("@(#)$Id: conf.c,v 8.972.2.54 2004/01/08 21:54:55 ca Exp $") +SM_RCSID("@(#)$Id: conf.c,v 8.1047 2004/07/14 21:54:23 ca Exp $") #include #if NEWDB @@ -82,6 +82,7 @@ struct hdrinfo HdrInfo[] = { "errors-to", H_FROM|H_ERRORSTO, NULL }, { "full-name", H_ACHECK, NULL }, { "return-receipt-to", H_RECEIPTTO, NULL }, + { "delivery-receipt-to", H_RECEIPTTO, NULL }, { "disposition-notification-to", H_FROM, NULL }, /* destination fields */ @@ -260,9 +261,7 @@ setdefaults(e) WkClassFact = 1800L; /* option z */ WkTimeFact = 90000L; /* option Z */ QueueFactor = WkRecipFact * 20; /* option q */ -#if _FFR_QUARANTINE QueueMode = QM_NORMAL; /* what queue items to act upon */ -#endif /* _FFR_QUARANTINE */ FileMode = (RealUid != geteuid()) ? 0644 : 0600; /* option F */ QueueFileMode = (RealUid != geteuid()) ? 0644 : 0600; @@ -339,6 +338,7 @@ setdefaults(e) FastSplit = 1; #if SASL AuthMechanisms = newstr(AUTH_MECHANISMS); + AuthRealm = NULL; MaxSLBits = INT_MAX; #endif /* SASL */ #if STARTTLS @@ -369,12 +369,11 @@ setdefaults(e) #if MILTER InputFilters[0] = NULL; #endif /* MILTER */ -#if _FFR_REJECT_LOG RejectLogInterval = 3 HOURS; -#endif /* _FFR_REJECT_LOG */ -#if _FFR_REQ_DIR_FSYNC_OPT +#if REQUIRES_DIR_FSYNC RequiresDirfsync = true; -#endif /* _FFR_REQ_DIR_FSYNC_OPT */ +#endif /* REQUIRES_DIR_FSYNC */ + ConnectionRateWindowSize = 60; setupmaps(); setupqueues(); setupmailers(); @@ -641,6 +640,13 @@ setupmaps() dequote_init, null_map_open, null_map_close, arith_map_lookup, null_map_store); +#if SOCKETMAP + /* arbitrary daemons */ + MAPDEF("socket", NULL, MCF_ALIASOK, + map_parseargs, socket_map_open, socket_map_close, + socket_map_lookup, null_map_store); +#endif /* SOCKETMAP */ + if (tTd(38, 2)) { /* bogus map -- always return tempfail */ @@ -1493,7 +1499,6 @@ getla() double avenrun[3]; # endif /* LA_TYPE == LA_SHORT */ # endif /* LA_TYPE == LA_INT */ - extern int errno; extern off_t lseek(); if (kmem < 0) @@ -1601,7 +1606,6 @@ getla() int j; static int kmem = -1; long avenrun[3]; - extern int errno; struct mioc_rksym mirk; if (kmem < 0) @@ -1829,6 +1833,12 @@ getla() # include +# ifdef _UNICOSMP +# define CAST_SYSMP(x) (x) +# else /* _UNICOSMP */ +# define CAST_SYSMP(x) ((x) & 0x7fffffff) +# endif /* _UNICOSMP */ + int getla(void) { @@ -1858,7 +1868,8 @@ getla(void) } } - if (lseek(kmem, (sysmp(MP_KERNADDR, MPKA_AVENRUN) & 0x7fffffff), SEEK_SET) == -1 || + if (lseek(kmem, CAST_SYSMP(sysmp(MP_KERNADDR, MPKA_AVENRUN)), SEEK_SET) + == -1 || read(kmem, (char *) avenrun, sizeof(avenrun)) < sizeof(avenrun)) { if (tTd(3, 1)) @@ -2194,16 +2205,16 @@ refuseconnections(name, e, d, active) { static time_t lastconn[MAXDAEMONS]; static int conncnt[MAXDAEMONS]; -#if _FFR_REJECT_LOG static time_t firstrejtime[MAXDAEMONS]; static time_t nextlogtime[MAXDAEMONS]; -#endif /* _FFR_REJECT_LOG */ #if XLA if (!xla_smtp_ok()) return true; #endif /* XLA */ + SM_ASSERT(d >= 0); + SM_ASSERT(d < MAXDAEMONS); if (ConnRateThrottle > 0) { time_t now; @@ -2235,16 +2246,13 @@ refuseconnections(name, e, d, active) sm_getla(); if (RefuseLA > 0 && CurrentLA >= RefuseLA) { -# if _FFR_REJECT_LOG time_t now; -# define R2_MSG_LA "have been rejecting connections on daemon %s for %s" -# endif /* _FFR_REJECT_LOG */ # define R_MSG_LA "rejecting connections on daemon %s: load average: %d" +# define R2_MSG_LA "have been rejecting connections on daemon %s for %s" sm_setproctitle(true, e, R_MSG_LA, name, CurrentLA); if (LogLevel > 8) sm_syslog(LOG_NOTICE, NOQID, R_MSG_LA, name, CurrentLA); -# if _FFR_REJECT_LOG now = curtime(); if (firstrejtime[d] == 0) { @@ -2257,13 +2265,10 @@ refuseconnections(name, e, d, active) pintvl(now - firstrejtime[d], true)); nextlogtime[d] = now + RejectLogInterval; } -# endif /* _FFR_REJECT_LOG */ return true; } -# if _FFR_REJECT_LOG else firstrejtime[d] = 0; -# endif /* _FFR_REJECT_LOG */ if (DelayLA > 0 && CurrentLA >= DelayLA) { @@ -3969,6 +3974,7 @@ validate_connection(sap, hostname, e) sm_dprintf("validate_connection(%s, %s)\n", hostname, anynet_ntoa(sap)); + connection_rate_check(sap, e); if (rscheck("check_relay", hostname, anynet_ntoa(sap), e, RSF_RMCOMM|RSF_COUNT, 3, NULL, NOQID) != EX_OK) { @@ -5156,6 +5162,80 @@ get_num_procs_online() return nproc; } /* +** SM_CLOSEFROM -- close file descriptors +** +** Parameters: +** lowest -- first fd to close +** highest -- last fd + 1 to close +** +** Returns: +** none +*/ + +void +sm_closefrom(lowest, highest) + int lowest, highest; +{ +#if HASCLOSEFROM + closefrom(lowest); +#else /* HASCLOSEFROM */ + int i; + + for (i = lowest; i < highest; i++) + (void) close(i); +#endif /* HASCLOSEFROM */ +} +#if HASFDWALK +/* +** CLOSEFD_WALK -- walk fd's arranging to close them +** Callback for fdwalk() +** +** Parameters: +** lowest -- first fd to arrange to be closed +** fd -- fd to arrange to be closed +** +** Returns: +** zero +*/ + +static int +closefd_walk(lowest, fd) + void *lowest; + int fd; +{ + if (fd >= *(int *)lowest) + (void) fcntl(fd, F_SETFD, FD_CLOEXEC); + return 0; +} +#endif /* HASFDWALK */ +/* +** SM_CLOSE_ON_EXEC -- arrange for file descriptors to be closed +** +** Parameters: +** lowest -- first fd to arrange to be closed +** highest -- last fd + 1 to arrange to be closed +** +** Returns: +** none +*/ + +void +sm_close_on_exec(highest, lowest) + int highest, lowest; +{ +#if HASFDWALK + (void) fdwalk(closefd_walk, &lowest); +#else /* HASFDWALK */ + int i, j; + + for (i = lowest; i < highest; i++) + { + if ((j = fcntl(i, F_GETFD, 0)) != -1) + (void) fcntl(i, F_SETFD, j | FD_CLOEXEC); + } +#endif /* HASFDWALK */ +} +/* ** SEED_RANDOM -- seed the random number generator ** ** Parameters: @@ -5537,6 +5617,9 @@ link(source, target) char *CompileOptions[] = { +#if ALLOW_255 + "ALLOW_255", +#endif /* ALLOW_255 */ #if NAMED_BIND # if DNSMAP "DNSMAP", @@ -5639,6 +5722,9 @@ char *CompileOptions[] = #if SMTPDEBUG "SMTPDEBUG", #endif /* SMTPDEBUG */ +#if SOCKETMAP + "SOCKETMAP", +#endif /* SOCKETMAP */ #if STARTTLS "STARTTLS", #endif /* STARTTLS */ @@ -5660,6 +5746,9 @@ char *CompileOptions[] = #if USE_LDAP_INIT "USE_LDAP_INIT", #endif /* USE_LDAP_INIT */ +#if USE_TTYPATH + "USE_TTYPATH", +#endif /* USE_TTYPATH */ #if XDEBUG "XDEBUG", #endif /* XDEBUG */ @@ -5679,9 +5768,6 @@ char *OsCompileOptions[] = #if ADDRCONFIG_IS_BROKEN "ADDRCONFIG_IS_BROKEN", #endif /* ADDRCONFIG_IS_BROKEN */ -#if ALLOW_255 - "ALLOW_255", -#endif /* ALLOW_255 */ #ifdef AUTO_NETINFO_HOSTS "AUTO_NETINFO_HOSTS", #endif /* AUTO_NETINFO_HOSTS */ @@ -5703,12 +5789,18 @@ char *OsCompileOptions[] = #if FAST_PID_RECYCLE "FAST_PID_RECYCLE", #endif /* FAST_PID_RECYCLE */ +#if HASCLOSEFROM + "HASCLOSEFROM", +#endif /* HASCLOSEFROM */ #if HASFCHOWN "HASFCHOWN", #endif /* HASFCHOWN */ #if HASFCHMOD "HASFCHMOD", #endif /* HASFCHMOD */ +#if HASFDWALK + "HASFDWALK", +#endif /* HASFDWALK */ #if HASFLOCK "HASFLOCK", #endif /* HASFLOCK */ @@ -5886,20 +5978,11 @@ char *OsCompileOptions[] = char *FFRCompileOptions[] = { -#if _FFR_ADAPTIVE_EOL - /* tries to be smart about \r\n versus \n from broken clients */ - /* known to be broken, do not use */ - "_FFR_ADAPTIVE_EOL", -#endif /* _FFR_ADAPTIVE_EOL */ #if _FFR_ALLOW_SASLINFO /* DefaultAuthInfo can be specified by user. */ - /* DefaultAuthInfo doesn't really work in 8.12 anymore. */ + /* DefaultAuthInfo doesn't really work in 8.13 anymore. */ "_FFR_ALLOW_SASLINFO", #endif /* _FFR_ALLOW_SASLINFO */ -#if _FFR_ALLOW_S0_ERROR_4XX - /* Allow for tempfail from S0 (ruleset 0). */ - "_FFR_ALLOW_S0_ERROR_4XX", -#endif /* _FFR_ALLOW_S0_ERROR_4XX */ #if _FFR_BESTMX_BETTER_TRUNCATION /* Better truncation of list of MX records for dns map. */ "_FFR_BESTMX_BETTER_TRUNCATION", @@ -5912,19 +5995,10 @@ char *FFRCompileOptions[] = "_FFR_BLOCK_PROXIES", #endif /* _FFR_BLOCK_PROXIES */ -#if _FFR_CACHE_LPC - /* Cache connections to LCP based mailers */ -/* Christophe Wolfhugel of France Telecom Oleane */ - "_FFR_CACHE_LPC", -#endif /* _FFR_CACHE_LPC */ #if _FFR_CATCH_BROKEN_MTAS /* Deal with MTAs that send a reply during the DATA phase. */ "_FFR_CATCH_BROKEN_MTAS", #endif /* _FFR_CATCH_BROKEN_MTAS */ -#if _FFR_CATCH_LONG_STRINGS - /* Report long address strings instead of silently ignoring them. */ - "_FFR_CATCH_LONG_STRINGS", -#endif /* _FFR_CATCH_LONG_STRINGS */ #if _FFR_CHECK_EOM /* Enable check_eom ruleset */ "_FFR_CHECK_EOM", @@ -5941,6 +6015,10 @@ char *FFRCompileOptions[] = /* Extended daemon status. */ "_FFR_CONTROL_MSTAT", #endif /* _FFR_CONTROL_MSTAT */ +#if _FFR_CRLPATH + /* CRLPath; needs documentation; Al Smith */ + "_FFR_CRLPATH", +#endif /* _FFR_CRLPATH */ #if _FFR_DAEMON_NETUNIX /* Allow local (not just TCP) socket connection to server. */ "_FFR_DAEMON_NETUNIX", @@ -5979,11 +6057,6 @@ char *FFRCompileOptions[] = /* Enable DontLockFilesForRead option. */ "_FFR_DONTLOCKFILESFORREAD_OPTION", #endif /* _FFR_DONTLOCKFILESFORREAD_OPTION */ -#if _FFR_DONT_STOP_LOOKING - /* Continue with DNS lookups on ECONNREFUSED and TRY_AGAIN. */ -/* Noted by Neil Rickert of Northern Illinois University */ - "_FFR_DONT_STOP_LOOKING", -#endif /* _FFR_DONT_STOP_LOOKING */ #if _FFR_DOTTED_USERNAMES /* Allow usernames with '.' */ "_FFR_DOTTED_USERNAMES", @@ -6034,6 +6107,10 @@ char *FFRCompileOptions[] = /* Set 'h' in {addr_type} for headers. */ "_FFR_HDR_TYPE", #endif /* _FFR_HDR_TYPE */ +#if _FFR_HELONAME + /* option to set heloname; Nik Clayton of FreeBSD */ + "_FFR_HELONAME", +#endif /* _FFR_HELONAME */ #if _FFR_HPUX_NSSWITCH /* Use nsswitch on HP-UX */ "_FFR_HPUX_NSSWITCH", @@ -6046,19 +6123,16 @@ char *FFRCompileOptions[] = /* Ignore extensions offered in response to HELO */ "_FFR_IGNORE_EXT_ON_HELO", #endif /* _FFR_IGNORE_EXT_ON_HELO */ -#if _FFR_LDAP_RECURSION - /* Support LDAP recursion in LDAP responses */ -/* Andrew Baucom */ - "_FFR_LDAP_RECURSION", -#endif /* _FFR_LDAP_RECURSION */ -#if _FFR_LDAP_SETVERSION - /* New LDAP map option for setting LDAP protocol version */ - "_FFR_LDAP_SETVERSION", -#endif /* _FFR_LDAP_SETVERSION */ -#if _FFR_LDAP_URI - /* Support LDAP URI form of specifying host/port (and allows ldaps) */ - "_FFR_LDAP_URI", -#endif /* _FFR_LDAP_URI */ +#if _FFR_MAXDATASIZE + /* + ** It is possible that a header is larger than MILTER_CHUNK_SIZE, + ** hence this shouldn't be used as limit for milter communication. + ** see also libmilter/comm.c + ** Gurusamy Sarathy of ActiveState + */ + + "_FFR_MAXDATASIZE" +#endif /* _FFR_MAXDATASIZE */ #if _FFR_MAX_FORWARD_ENTRIES /* Try to limit number of .forward entries */ /* (doesn't work) */ @@ -6069,24 +6143,20 @@ char *FFRCompileOptions[] = /* Limit sleep(2) time in libsm/clock.c */ "_FFR_MAX_SLEEP_TIME", #endif /* _FFR_MAX_SLEEP_TIME */ -#if _FFR_MESSAGEID_MACRO - /* stick the message ID header's value in a macro */ - "_FFR_MESSAGEID_MACRO", -#endif /* _FFR_MESSAGEID_MACRO */ -#if MILTER -# if _FFR_MILTER_421 - /* If a filter returns 421, close the SMTP connection */ - "_FFR_MILTER_421", -# endif /* _FFR_MILTER_421 */ -# if _FFR_MILTER_MACROS_EOM - /* Add an EOM macro set for milter */ - "_FFR_MILTER_MACROS_EOM", -# endif /* _FFR_MILTER_MACROS_EOM */ -# if _FFR_MILTER_PERDAEMON - /* Per DaemonPortOptions InputMailFilter lists */ - "_FFR_MILTER_PERDAEMON", -# endif /* _FFR_MILTER_PERDAEMON */ -#endif /* MILTER */ +#if _FFR_MILTER_NAGLE + /* milter: turn off Nagle ("cork" on Linux) */ + /* John Gardiner Myers of Proofpoint */ + "_FFR_MILTER_NAGLE ", +#endif /* _FFR_MILTER_NAGLE */ +#if _FFR_MILTER_NOHDR_RESP + /* milter: no response expected when sending headers */ + /* John Gardiner Myers of Proofpoint */ + "_FFR_MILTER_NOHDR_RESP", +#endif /* _FFR_MILTER_NOHDR_RESP */ +#if _FFR_MIME7TO8_OLD + /* Old mime7to8 code, the new is broken for at least one example. */ + "_FFR_MIME7TO8_OLD", +#endif /* _FFR_MAX_SLEEP_TIME */ #if _FFR_NODELAYDSN_ON_HOLD /* Do not issue a DELAY DSN for mailers that use the hold flag. */ /* Steven Pitzl */ @@ -6096,10 +6166,6 @@ char *FFRCompileOptions[] = /* Disable PIPELINING, delay client if used. */ "_FFR_NO_PIPE", #endif /* _FFR_NO_PIPE */ -#if _FFR_QUARANTINE - /* Quarantine items in the queue */ - "_FFR_QUARANTINE", -#endif /* _FFR_QUARANTINE */ #if _FFR_QUEUEDELAY /* Exponential queue delay; disabled in 8.13 since it isn't used. */ "_FFR_QUEUEDELAY", @@ -6113,16 +6179,6 @@ char *FFRCompileOptions[] = /* Define {queue} macro. */ "_FFR_QUEUE_MACRO", #endif /* _FFR_QUEUE_MACRO */ -#if _FFR_QUEUERETURN_DSN - /* - ** Provide an option for different Timeout.queue{warn,return} for - ** DSN messages. These days, queues are filled with bounces for - ** spam that will never make it to the sender and therefore slow - ** down queue runs until they timeout. - */ - - "_FFR_QUEUERETURN_DSN", -#endif /* _FFR_QUEUERETURN_DSN */ #if _FFR_QUEUE_RUN_PARANOIA /* Additional checks when doing queue runs. */ "_FFR_QUEUE_RUN_PARANOIA", @@ -6140,30 +6196,14 @@ char *FFRCompileOptions[] = "_FFR_REDIRECTEMPTY", #endif /* _FFR_REDIRECTEMPTY */ -#if _FFR_REJECT_LOG - /* Log when we start/stop rejecting connections due to load, etc */ - "_FFR_REJECT_LOG", -#endif /* _FFR_REJECT_LOG */ -#if _FFR_REQ_DIR_FSYNC_OPT - /* Add cf option to fsync() directories */ - "_FFR_REQ_DIR_FSYNC_OPT", -#endif /* _FFR_REQ_DIR_FSYNC_OPT */ #if _FFR_RESET_MACRO_GLOBALS /* Allow macro 'j' to be set dynamically via rulesets. */ "_FFR_RESET_MACRO_GLOBALS", #endif /* _FFR_RESET_MACRO_GLOBALS */ -#if _FFR_RESPOND_ALL - /* in vacation: respond to every message, not just once per interval */ - "_FFR_RESPOND_ALL", -#endif /* _FFR_RESPOND_ALL */ #if _FFR_RHS /* Random shuffle for queue sorting. */ "_FFR_RHS", #endif /* _FFR_RHS */ -#if _FFR_SASL_OPT_M - /* Support SASL's SASL_SEC_MUTUAL_AUTH option */ - "_FFR_SASL_OPT_M", -#endif /* _FFR_SASL_OPT_M */ #if _FFR_SELECT_SHM /* Auto-select of shared memory key */ "_FFR_SELECT_SHM", @@ -6172,18 +6212,14 @@ char *FFRCompileOptions[] = /* Donated code (unused). */ "_FFR_SHM_STATUS", #endif /* _FFR_SHM_STATUS */ +#if _FFR_SKIP_DOMAINS + /* process every N'th domain instead of every N'th message */ + "_FFR_SKIP_DOMAINS" +#endif /* _FFR_SKIP_DOMAINS */ #if _FFR_SLEEP_USE_SELECT /* Use select(2) in libsm/clock.c to emulate sleep(2) */ "_FFR_SLEEP_USE_SELECT ", #endif /* _FFR_SLEEP_USE_SELECT */ -#if _FFR_SMFI_OPENSOCKET - /* libmilter: smfi_opensocket() to force the socket open early */ - "_FFR_SMFI_OPENSOCKET", -#endif /* _FFR_SMFI_OPENSOCKET */ -#if _FFR_SMTP_SSL - /* Support for smtps (SMTP over SSL) */ - "_FFR_SMTP_SSL", -#endif /* _FFR_SMTP_SSL */ #if _FFR_SOFT_BOUNCE /* Turn all errors into temporary errors. */ "_FFR_SOFT_BOUNCE", @@ -6200,14 +6236,6 @@ char *FFRCompileOptions[] = /* Chris Adams of HiWAAY Informations Services */ "_FFR_SPT_ALIGN", #endif /* _FFR_SPT_ALIGN */ -#if _FFR_STRIPBACKSL - /* - ** Strip backslash from addresses (so sender doesn't - ** decide to ignore forward) - */ - - "_FFR_STRIPBACKSL", -#endif /* _FFR_STRIPBACKSL */ #if _FFR_TIMERS /* Donated code (unused). */ "_FFR_TIMERS", diff --git a/contrib/sendmail/src/conf.h b/contrib/sendmail/src/conf.h index 0675c2d..77577c4 100644 --- a/contrib/sendmail/src/conf.h +++ b/contrib/sendmail/src/conf.h @@ -10,7 +10,7 @@ * the sendmail distribution. * * - * $Id: conf.h,v 8.563.2.3 2002/10/31 03:28:36 ca Exp $ + * $Id: conf.h,v 8.567 2004/07/23 20:45:01 gshapiro Exp $ */ /* @@ -145,6 +145,16 @@ struct rusage; /* forward declaration to get gcc to shut up in wait.h */ # define DBMMODE 0640 #endif /* ! DBMMODE */ +/* +** Value which means a uid or gid value should not change +*/ + +#ifndef NO_UID +# define NO_UID -1 +#endif /* ! NO_UID */ +#ifndef NO_GID +# define NO_GID -1 +#endif /* ! NO_GID */ /********************************************************************** ** Compilation options. diff --git a/contrib/sendmail/src/err.c b/contrib/sendmail/src/err.c index 484af9e..5a0b5b1 100644 --- a/contrib/sendmail/src/err.c +++ b/contrib/sendmail/src/err.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998-2002 Sendmail, Inc. and its suppliers. + * Copyright (c) 1998-2003 Sendmail, Inc. and its suppliers. * All rights reserved. * Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved. * Copyright (c) 1988, 1993 @@ -13,7 +13,7 @@ #include -SM_RCSID("@(#)$Id: err.c,v 8.189 2002/01/09 18:52:30 ca Exp $") +SM_RCSID("@(#)$Id: err.c,v 8.191 2003/01/10 02:16:46 ca Exp $") #if LDAPMAP # include @@ -238,7 +238,7 @@ syserr(fmt, va_alist) case ESTALE: #endif /* ESTALE */ printopenfds(true); - mci_dump_all(true); + mci_dump_all(smioout, true); break; } if (panic) diff --git a/contrib/sendmail/src/headers.c b/contrib/sendmail/src/headers.c index b7c5ef9..59bbf56 100644 --- a/contrib/sendmail/src/headers.c +++ b/contrib/sendmail/src/headers.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998-2003 Sendmail, Inc. and its suppliers. + * Copyright (c) 1998-2004 Sendmail, Inc. and its suppliers. * All rights reserved. * Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved. * Copyright (c) 1988, 1993 @@ -14,8 +14,9 @@ #include -SM_RCSID("@(#)$Id: headers.c,v 8.266.4.9 2003/10/30 00:17:22 gshapiro Exp $") +SM_RCSID("@(#)$Id: headers.c,v 8.286 2004/07/08 17:57:32 ca Exp $") +static HDR *allocheader __P((char *, char *, int, SM_RPOOL_T *)); static size_t fix_mime_header __P((HDR *, ENVELOPE *)); static int priencode __P((char *)); static void put_vanilla_header __P((HDR *, char *, MCI *)); @@ -88,7 +89,7 @@ chompheader(line, pflag, hdrp, e) if (tTd(31, 6)) { sm_dprintf("chompheader: "); - xputs(line); + xputs(sm_debug_file(), line); sm_dprintf("\n"); } @@ -292,11 +293,12 @@ hse: int rscheckflags; char *rs; - /* no ruleset? look for default */ - rs = hi->hi_ruleset; rscheckflags = RSF_COUNT; if (!bitset(hi->hi_flags, H_FROM|H_RCPT)) rscheckflags |= RSF_UNSTRUCTURED; + + /* no ruleset? look for default */ + rs = hi->hi_ruleset; if (rs == NULL) { s = stab("*", ST_HEADER, ST_FIND); @@ -358,17 +360,10 @@ hse: (void) sm_snprintf(qval, sizeof qval, "%d", k); macdefine(&e->e_macro, A_TEMP, macid("{hdrlen}"), qval); #if _FFR_HDR_TYPE - /* - ** XXX: h isn't set yet - ** If we really want to be precise then we have - ** to lookup the header (see below). - ** It's probably not worth the effort. - */ - - if (bitset(H_FROM, h->h_flags)) + if (bitset(H_FROM, hi->hi_flags)) macdefine(&e->e_macro, A_PERM, macid("{addr_type}"), "h s"); - else if (bitset(H_RCPT, h->h_flags)) + else if (bitset(H_RCPT, hi->hi_flags)) macdefine(&e->e_macro, A_PERM, macid("{addr_type}"), "h r"); else @@ -467,6 +462,44 @@ hse: return h->h_flags; } /* +** ALLOCHEADER -- allocate a header entry +** +** Parameters: +** field -- the name of the header field. +** value -- the value of the field. +** flags -- flags to add to h_flags. +** rp -- resource pool for allocations +** +** Returns: +** Pointer to a newly allocated and populated HDR. +*/ + +static HDR * +allocheader(field, value, flags, rp) + char *field; + char *value; + int flags; + SM_RPOOL_T *rp; +{ + HDR *h; + STAB *s; + + /* find info struct */ + s = stab(field, ST_HEADER, ST_FIND); + + /* allocate space for new header */ + h = (HDR *) sm_rpool_malloc_x(rp, sizeof *h); + h->h_field = field; + h->h_value = sm_rpool_strdup_x(rp, value); + h->h_flags = flags; + if (s != NULL) + h->h_flags |= s->s_header.hi_flags; + clrbitmap(h->h_mflags); + h->h_macro = '\0'; + + return h; +} +/* ** ADDHEADER -- add a header entry to the end of the queue. ** ** This bypasses the special checking of chompheader. @@ -492,13 +525,9 @@ addheader(field, value, flags, e) ENVELOPE *e; { register HDR *h; - STAB *s; HDR **hp; HDR **hdrlist = &e->e_header; - /* find info struct */ - s = stab(field, ST_HEADER, ST_FIND); - /* find current place in list -- keep back pointer? */ for (hp = hdrlist; (h = *hp) != NULL; hp = &h->h_link) { @@ -507,18 +536,65 @@ addheader(field, value, flags, e) } /* allocate space for new header */ - h = (HDR *) sm_rpool_malloc_x(e->e_rpool, sizeof *h); - h->h_field = field; - h->h_value = sm_rpool_strdup_x(e->e_rpool, value); + h = allocheader(field, value, flags, e->e_rpool); h->h_link = *hp; - h->h_flags = flags; - if (s != NULL) - h->h_flags |= s->s_header.hi_flags; - clrbitmap(h->h_mflags); - h->h_macro = '\0'; *hp = h; } /* +** INSHEADER -- insert a header entry at the specified index +** +** This bypasses the special checking of chompheader. +** +** Parameters: +** idx -- index into the header list at which to insert +** field -- the name of the header field. +** value -- the value of the field. +** flags -- flags to add to h_flags. +** e -- envelope. +** +** Returns: +** none. +** +** Side Effects: +** inserts the field on the list of headers for this envelope. +*/ + +void +insheader(idx, field, value, flags, e) + int idx; + char *field; + char *value; + int flags; + ENVELOPE *e; +{ + HDR *h, *srch, *last = NULL; + + /* allocate space for new header */ + h = allocheader(field, value, flags, e->e_rpool); + + /* find insertion position */ + for (srch = e->e_header; srch != NULL && idx > 0; + srch = srch->h_link, idx--) + last = srch; + + if (e->e_header == NULL) + { + e->e_header = h; + h->h_link = NULL; + } + else if (srch == NULL) + { + SM_ASSERT(last != NULL); + last->h_link = h; + h->h_link = NULL; + } + else + { + h->h_link = srch->h_link; + srch->h_link = h; + } +} +/* ** HVALUE -- return value of a header. ** ** Only "real" fields (i.e., ones that have not been supplied @@ -674,7 +750,7 @@ eatheader(e, full, log) if (tTd(32, 1)) { sm_dprintf("("); - xputs(h->h_value); + xputs(sm_debug_file(), h->h_value); sm_dprintf(") "); } expand(h->h_value, buf, sizeof buf, e); @@ -689,7 +765,7 @@ eatheader(e, full, log) } if (tTd(32, 1)) { - xputs(h->h_value); + xputs(sm_debug_file(), h->h_value); sm_dprintf("\n"); } @@ -731,10 +807,8 @@ eatheader(e, full, log) e->e_msgid = h->h_value; while (isascii(*e->e_msgid) && isspace(*e->e_msgid)) e->e_msgid++; -#if _FFR_MESSAGEID_MACRO macdefine(&e->e_macro, A_PERM, macid("{msg_id}"), - e->e_msgid); -#endif /* _FFR_MESSAGEID_MACRO */ + e->e_msgid); } } if (tTd(32, 1)) @@ -767,6 +841,60 @@ eatheader(e, full, log) + e->e_nrcpts * WkRecipFact; } + /* check for DSN to properly set e_timeoutclass */ + p = hvalue("content-type", e->e_header); + if (p != NULL) + { + bool oldsupr; + char **pvp; + char pvpbuf[MAXLINE]; + extern unsigned char MimeTokenTab[256]; + + /* tokenize header */ + oldsupr = SuprErrs; + SuprErrs = true; + pvp = prescan(p, '\0', pvpbuf, sizeof pvpbuf, NULL, + MimeTokenTab, false); + SuprErrs = oldsupr; + + /* Check if multipart/report */ + if (pvp != NULL && pvp[0] != NULL && + pvp[1] != NULL && pvp[2] != NULL && + sm_strcasecmp(*pvp++, "multipart") == 0 && + strcmp(*pvp++, "/") == 0 && + sm_strcasecmp(*pvp++, "report") == 0) + { + /* Look for report-type=delivery-status */ + while (*pvp != NULL) + { + /* skip to semicolon separator */ + while (*pvp != NULL && strcmp(*pvp, ";") != 0) + pvp++; + + /* skip semicolon */ + if (*pvp++ == NULL || *pvp == NULL) + break; + + /* look for report-type */ + if (sm_strcasecmp(*pvp++, "report-type") != 0) + continue; + + /* skip equal */ + if (*pvp == NULL || strcmp(*pvp, "=") != 0) + continue; + + /* check value */ + if (*++pvp != NULL && + sm_strcasecmp(*pvp, + "delivery-status") == 0) + e->e_timeoutclass = TOC_DSN; + + /* found report-type, no need to continue */ + break; + } + } + } + /* message timeout priority */ p = hvalue("priority", e->e_header); if (p != NULL) @@ -778,15 +906,11 @@ eatheader(e, full, log) e->e_timeoutclass = TOC_NORMAL; else if (sm_strcasecmp(p, "non-urgent") == 0) e->e_timeoutclass = TOC_NONURGENT; -#if _FFR_QUEUERETURN_DSN else if (bitset(EF_RESPONSE, e->e_flags)) e->e_timeoutclass = TOC_DSN; -#endif /* _FFR_QUEUERETURN_DSN */ } -#if _FFR_QUEUERETURN_DSN else if (bitset(EF_RESPONSE, e->e_flags)) e->e_timeoutclass = TOC_DSN; -#endif /* _FFR_QUEUERETURN_DSN */ /* date message originated */ p = hvalue("posted-date", e->e_header); @@ -1240,12 +1364,8 @@ crackaddr(addr, e) { c = *q++; if (quoteit && c == '"') - { SM_APPEND_CHAR('\\'); - SM_APPEND_CHAR(c); - } - else - SM_APPEND_CHAR(c); + SM_APPEND_CHAR(c); } if (quoteit) { @@ -1407,7 +1527,7 @@ crackaddr(addr, e) if (tTd(33, 1)) { sm_dprintf("crackaddr=>`"); - xputs(buf); + xputs(sm_debug_file(), buf); sm_dprintf("'\n"); } return buf; @@ -1460,7 +1580,7 @@ putheader(mci, hdr, e, flags) if (tTd(34, 11)) { sm_dprintf(" %s: ", h->h_field); - xputs(p); + xputs(sm_debug_file(), p); } /* Skip empty headers */ @@ -1814,7 +1934,7 @@ commaize(h, p, oldstyle, mci, e) char pvpbuf[PSBUFSIZE]; res = prescan(p, oldstyle ? ' ' : ',', pvpbuf, - sizeof pvpbuf, &oldp, NULL); + sizeof pvpbuf, &oldp, NULL, false); p = oldp; #if _FFR_IGNORE_BOGUS_ADDR /* ignore addresses that can't be parsed */ diff --git a/contrib/sendmail/src/mailq.1 b/contrib/sendmail/src/mailq.1 index 1eb234e..f67a9dd 100644 --- a/contrib/sendmail/src/mailq.1 +++ b/contrib/sendmail/src/mailq.1 @@ -9,9 +9,9 @@ .\" the sendmail distribution. .\" .\" -.\" $Id: mailq.1,v 8.19.2.1 2002/09/26 23:03:39 gshapiro Exp $ +.\" $Id: mailq.1,v 8.20 2002/06/27 22:47:34 gshapiro Exp $ .\" -.TH MAILQ 1 "$Date: 2002/09/26 23:03:39 $" +.TH MAILQ 1 "$Date: 2002/06/27 22:47:34 $" .SH NAME mailq \- print the mail queue @@ -55,6 +55,13 @@ Show the mail submission queue specified in instead of the MTA queue specified in .IR /etc/mail/sendmail.cf . .TP +.B \-qL +Show the "lost" items in the mail queue instead of the normal queue items. +.TP +.B \-qQ +Show the quarantined items in the mail queue instead of the normal queue +items. +.TP \fB\-q\fR[\fI!\fR]I substr Limit processed jobs to those containing .I substr @@ -62,6 +69,13 @@ as a substring of the queue id or not when .I ! is specified. .TP +\fB\-q\fR[\fI!\fR]Q substr +Limit processed jobs to quarantined jobs containing +.I substr +as a substring of the quarantine reason or not when +.I ! +is specified. +.TP \fB\-q\fR[\fI!\fR]R substr Limit processed jobs to those containing .I substr diff --git a/contrib/sendmail/src/mci.c b/contrib/sendmail/src/mci.c index a6b558e..8cdd12f 100644 --- a/contrib/sendmail/src/mci.c +++ b/contrib/sendmail/src/mci.c @@ -14,7 +14,7 @@ #include -SM_RCSID("@(#)$Id: mci.c,v 8.205.2.4 2003/03/31 17:35:27 ca Exp $") +SM_RCSID("@(#)$Id: mci.c,v 8.211 2003/03/31 17:35:50 ca Exp $") #if NETINET || NETINET6 # include @@ -488,6 +488,7 @@ mci_setstat(mci, xstat, dstat, rstat) ** MCI_DUMP -- dump the contents of an MCI structure. ** ** Parameters: +** fp -- output file pointer ** mci -- the MCI structure to dump. ** ** Returns: @@ -530,7 +531,8 @@ static struct mcifbits MciFlags[] = }; void -mci_dump(mci, logit) +mci_dump(fp, mci, logit) + SM_FILE_T *fp; register MCI *mci; bool logit; { @@ -598,12 +600,13 @@ printit: if (logit) sm_syslog(LOG_DEBUG, CurEnv->e_id, "%.1000s", buf); else - (void) sm_io_fprintf(smioout, SM_TIME_DEFAULT, "%s\n", buf); + (void) sm_io_fprintf(fp, SM_TIME_DEFAULT, "%s\n", buf); } /* ** MCI_DUMP_ALL -- print the entire MCI cache ** ** Parameters: +** fp -- output file pointer ** logit -- if set, log the result instead of printing ** to stdout. ** @@ -612,7 +615,8 @@ printit: */ void -mci_dump_all(logit) +mci_dump_all(fp, logit) + SM_FILE_T *fp; bool logit; { register int i; @@ -621,7 +625,7 @@ mci_dump_all(logit) return; for (i = 0; i < MaxMciCache; i++) - mci_dump(MciCache[i], logit); + mci_dump(fp, MciCache[i], logit); } /* ** MCI_LOCK_HOST -- Lock host while sending. @@ -926,7 +930,7 @@ mci_read_persistent(fp, mci) case '.': /* end of file */ if (tTd(56, 93)) - mci_dump(mci, false); + mci_dump(sm_debug_file(), mci, false); return 0; default: diff --git a/contrib/sendmail/src/savemail.c b/contrib/sendmail/src/savemail.c index 073c31f..231382a 100644 --- a/contrib/sendmail/src/savemail.c +++ b/contrib/sendmail/src/savemail.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998-2002 Sendmail, Inc. and its suppliers. + * Copyright (c) 1998-2003 Sendmail, Inc. and its suppliers. * All rights reserved. * Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved. * Copyright (c) 1988, 1993 @@ -13,7 +13,7 @@ #include -SM_RCSID("@(#)$Id: savemail.c,v 8.299.2.1 2002/10/23 15:08:47 ca Exp $") +SM_RCSID("@(#)$Id: savemail.c,v 8.303 2004/01/14 02:56:51 ca Exp $") static void errbody __P((MCI *, ENVELOPE *, char *)); static bool pruneroute __P((char *)); @@ -74,7 +74,7 @@ savemail(e, sendbody) sm_dprintf("\nsavemail, errormode = %c, id = %s, ExitStat = %d\n e_from=", e->e_errormode, e->e_id == NULL ? "NONE" : e->e_id, ExitStat); - printaddr(&e->e_from, false); + printaddr(sm_debug_file(), &e->e_from, false); } if (e->e_id == NULL) @@ -178,7 +178,12 @@ savemail(e, sendbody) ** then write the error messages back to hir (sic). */ +#if USE_TTYPATH p = ttypath(); +#else /* USE_TTYPATH */ + p = NULL; +#endif /* USE_TTYPATH */ + if (p == NULL || sm_io_reopen(SmFtStdio, SM_TIME_DEFAULT, p, SM_IO_WRONLY, NULL, @@ -518,11 +523,11 @@ returntosender(msg, returnq, flags, e) { sm_dprintf("\n*** Return To Sender: msg=\"%s\", depth=%d, e=%p, returnq=", msg, returndepth, e); - printaddr(returnq, true); + printaddr(sm_debug_file(), returnq, true); if (tTd(6, 20)) { sm_dprintf("Sendq="); - printaddr(e->e_sendqueue, true); + printaddr(sm_debug_file(), e->e_sendqueue, true); } } diff --git a/contrib/sendmail/src/sendmail.8 b/contrib/sendmail/src/sendmail.8 index a229aed..65d37b0 100644 --- a/contrib/sendmail/src/sendmail.8 +++ b/contrib/sendmail/src/sendmail.8 @@ -1,4 +1,4 @@ -.\" Copyright (c) 1998-2002 Sendmail, Inc. and its suppliers. +.\" Copyright (c) 1998-2003 Sendmail, Inc. and its suppliers. .\" All rights reserved. .\" Copyright (c) 1983, 1997 Eric P. Allman. All rights reserved. .\" Copyright (c) 1988, 1991, 1993 @@ -9,9 +9,9 @@ .\" the sendmail distribution. .\" .\" -.\" $Id: sendmail.8,v 8.51.2.3 2003/12/01 17:02:00 ca Exp $ +.\" $Id: sendmail.8,v 8.57 2003/12/01 17:02:41 ca Exp $ .\" -.TH SENDMAIL 8 "$Date: 2003/12/01 17:02:00 $" +.TH SENDMAIL 8 "$Date: 2003/12/01 17:02:41 $" .SH NAME sendmail \- an electronic mail transport agent @@ -153,6 +153,9 @@ Use alternate configuration file. gives up any enhanced (set-user-ID or set-group-ID) privileges if an alternate configuration file is specified. .TP +.BI "\-D " logfile +Send debugging output to the indicated log file instead of stdout. +.TP .BI \-d category . level... Set the debugging flag for .I category @@ -323,6 +326,13 @@ as a substring of the queue id or not when .I ! is specified. .TP +\fB\-q\fR[\fI!\fR]Q\fIsubstr\fR +Limit processed jobs to quarantined jobs containing +.I substr +as a substring of the quarantine reason or not when +.I ! +is specified. +.TP \fB\-q\fR[\fI!\fR]R\fIsubstr\fR Limit processed jobs to those containing .I substr @@ -337,6 +347,12 @@ as a substring of the sender or not when .I ! is specified. .TP +\fB\-Q\fR[reason] +Quarantine a normal queue items with the given reason or +unquarantine quarantined queue items if no reason is given. +This should only be used with some sort of item matching using +as described above. +.TP .BI "\-R " return Set the amount of the message to be returned if the message bounces. diff --git a/contrib/sendmail/vacation/vacation.1 b/contrib/sendmail/vacation/vacation.1 index 055fb7a..6c1418a 100644 --- a/contrib/sendmail/vacation/vacation.1 +++ b/contrib/sendmail/vacation/vacation.1 @@ -1,4 +1,4 @@ -.\" Copyright (c) 1999-2001 Sendmail, Inc. and its suppliers. +.\" Copyright (c) 1999-2002 Sendmail, Inc. and its suppliers. .\" All rights reserved. .\" Copyright (c) 1985, 1987, 1990, 1991, 1993 .\" The Regents of the University of California. All rights reserved. @@ -9,9 +9,9 @@ .\" the sendmail distribution. .\" .\" -.\" $Id: vacation.1,v 8.29.2.1 2002/06/21 21:28:06 ca Exp $ +.\" $Id: vacation.1,v 8.34 2002/06/27 23:51:52 ca Exp $ .\" -.TH VACATION 1 "$Date: 2002/06/21 21:28:06 $" +.TH VACATION 1 "$Date: 2002/06/27 23:51:52 $" .SH NAME vacation \- E-mail auto-responder @@ -26,9 +26,12 @@ vacation .IR database ] .RB [ \-i ] .RB [ \-I ] +.RB [ \-j ] .RB [ \-l ] .RB [ \-m .IR message ] +.RB [ \-R +.IR returnaddr ] .RB [ \-r .IR interval ] .RB [ \-s @@ -118,6 +121,15 @@ This should only be used on the command line, not in your .I .forward file. .TP +.B \-j +Respond to the message regardless of whether the login is listed as +a recipient for the message. +Do not use this flag unless you are sure of the consequences. +For example, this will cause +.i vacation +to reply to mailing list messages which may result in removing +you from the list. +.TP .B \-l List the content of the vacation database file including the address and the associated time of the last auto-response to that address. @@ -134,6 +146,9 @@ Unless the .I filename starts with / it is relative to ~. .TP +.BI \-R " returnaddr" +Set the reply envelope sender address +.TP .BI \-r " interval" Set the reply interval to .I interval -- cgit v1.1