summaryrefslogtreecommitdiffstats
path: root/contrib/sendmail
diff options
context:
space:
mode:
authorgshapiro <gshapiro@FreeBSD.org>2007-04-09 01:44:16 +0000
committergshapiro <gshapiro@FreeBSD.org>2007-04-09 01:44:16 +0000
commit84a4aaabc654a5912f1d321b0ef7a20746f4c371 (patch)
treeee9c26407a2442d1c45fb8592df563df0e5a520d /contrib/sendmail
parent97853bac963c5d3bed1b2cc8456b52dc100a3a16 (diff)
downloadFreeBSD-src-84a4aaabc654a5912f1d321b0ef7a20746f4c371.zip
FreeBSD-src-84a4aaabc654a5912f1d321b0ef7a20746f4c371.tar.gz
Resolve conflicts from sendmail 8.14.1 import
Diffstat (limited to 'contrib/sendmail')
-rw-r--r--contrib/sendmail/mail.local/mail.local.c4
-rw-r--r--contrib/sendmail/src/conf.c555
-rw-r--r--contrib/sendmail/src/conf.h13
-rw-r--r--contrib/sendmail/src/err.c48
-rw-r--r--contrib/sendmail/src/headers.c288
-rw-r--r--contrib/sendmail/src/mailq.126
-rw-r--r--contrib/sendmail/src/mci.c34
-rw-r--r--contrib/sendmail/src/savemail.c140
8 files changed, 613 insertions, 495 deletions
diff --git a/contrib/sendmail/mail.local/mail.local.c b/contrib/sendmail/mail.local/mail.local.c
index b5ccd5b..cba40a7 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.253 2004/11/01 20:42:42 ca Exp $")
+SM_IDSTR(id, "@(#)$Id: mail.local.c,v 8.254 2006/10/12 22:23:45 ca Exp $")
#include <stdlib.h>
#include <sm/errstring.h>
@@ -177,6 +177,8 @@ const char *hashname __P((char *));
#endif /* HASHSPOOL */
+static void sm_exit __P((int));
+
static void
sm_exit(status)
int status;
diff --git a/contrib/sendmail/src/conf.c b/contrib/sendmail/src/conf.c
index f299d5c..64b8d02 100644
--- a/contrib/sendmail/src/conf.c
+++ b/contrib/sendmail/src/conf.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1998-2006 Sendmail, Inc. and its suppliers.
+ * Copyright (c) 1998-2007 Sendmail, Inc. and its suppliers.
* All rights reserved.
* Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved.
* Copyright (c) 1988, 1993
@@ -14,13 +14,17 @@
#include <sendmail.h>
-SM_RCSID("@(#)$Id: conf.c,v 8.1082 2006/03/22 22:49:33 ca Exp $")
+SM_RCSID("@(#)$Id: conf.c,v 8.1128 2007/04/03 21:32:29 ca Exp $")
+#include <sm/sendmail.h>
#include <sendmail/pathnames.h>
#if NEWDB
# include "sm/bdb.h"
#endif /* NEWDB */
+#include <daemon.h>
+#include "map.h"
+
#ifdef DEC
# if NETINET6
/* for the IPv6 device lookup */
@@ -159,9 +163,7 @@ struct prival PrivacyValues[] =
{ "noreceipts", PRIV_NORECEIPTS },
{ "nobodyreturn", PRIV_NOBODYRETN },
{ "goaway", PRIV_GOAWAY },
-#if _FFR_PRIV_NOACTUALRECIPIENT
{ "noactualrecipient", PRIV_NOACTUALRECIPIENT },
-#endif /* _FFR_PRIV_NOACTUALRECIPIENT */
{ NULL, 0 }
};
@@ -379,7 +381,7 @@ setdefaults(e)
InetMode = AF_INET;
#endif /* NETINET6 */
ControlSocketName = NULL;
- memset(&ConnectOnlyTo, '\0', sizeof ConnectOnlyTo);
+ memset(&ConnectOnlyTo, '\0', sizeof(ConnectOnlyTo));
DataFileBufferSize = 4096;
XscriptFileBufferSize = 4096;
for (i = 0; i < MAXRWSETS; i++)
@@ -414,7 +416,7 @@ setdefuser()
(void) sm_strlcpy(defuserbuf,
(defpwent == NULL || defpwent->pw_name == NULL)
? "nobody" : defpwent->pw_name,
- sizeof defuserbuf);
+ sizeof(defuserbuf));
if (tTd(37, 4))
sm_dprintf("setdefuser: DefUid=%d, DefUser=%s\n",
(int) DefUid, DefUser);
@@ -433,7 +435,7 @@ setupqueues()
char buf[100];
MaxRunnersPerQueue = 1;
- (void) sm_strlcpy(buf, "mqueue, P=/var/spool/mqueue", sizeof buf);
+ (void) sm_strlcpy(buf, "mqueue, P=/var/spool/mqueue", sizeof(buf));
makequeue(buf, false);
}
/*
@@ -446,15 +448,15 @@ setupmailers()
char buf[100];
(void) sm_strlcpy(buf, "prog, P=/bin/sh, F=lsouDq9, T=X-Unix/X-Unix/X-Unix, A=sh -c \201u",
- sizeof buf);
+ sizeof(buf));
makemailer(buf);
(void) sm_strlcpy(buf, "*file*, P=[FILE], F=lsDFMPEouq9, T=X-Unix/X-Unix/X-Unix, A=FILE \201u",
- sizeof buf);
+ sizeof(buf));
makemailer(buf);
(void) sm_strlcpy(buf, "*include*, P=/dev/null, F=su, A=INCLUDE \201u",
- sizeof buf);
+ sizeof(buf));
makemailer(buf);
initerrmailers();
}
@@ -665,6 +667,13 @@ setupmaps()
socket_map_lookup, null_map_store);
#endif /* SOCKETMAP */
+#if _FFR_DPRINTF_MAP
+ /* dprintf map -- logs information to syslog */
+ MAPDEF("dprintf", NULL, 0,
+ dprintf_map_parseargs, null_map_open, null_map_close,
+ dprintf_map_lookup, null_map_store);
+#endif /* _FFR_DPRINTF_MAP */
+
if (tTd(38, 2))
{
/* bogus map -- always return tempfail */
@@ -705,69 +714,16 @@ inithostmaps()
char buf[MAXLINE];
/*
- ** Set up default hosts maps.
- */
-
-#if 0
- nmaps = switch_map_find("hosts", maptype, mapreturn);
- for (i = 0; i < nmaps; i++)
- {
- if (strcmp(maptype[i], "files") == 0 &&
- stab("hosts.files", ST_MAP, ST_FIND) == NULL)
- {
- (void) sm_strlcpy(buf, "hosts.files text -k 0 -v 1 /etc/hosts",
- sizeof buf);
- (void) makemapentry(buf);
- }
-# if NAMED_BIND
- else if (strcmp(maptype[i], "dns") == 0 &&
- stab("hosts.dns", ST_MAP, ST_FIND) == NULL)
- {
- (void) sm_strlcpy(buf, "hosts.dns dns A", sizeof buf);
- (void) makemapentry(buf);
- }
-# endif /* NAMED_BIND */
-# if NISPLUS
- else if (strcmp(maptype[i], "nisplus") == 0 &&
- stab("hosts.nisplus", ST_MAP, ST_FIND) == NULL)
- {
- (void) sm_strlcpy(buf, "hosts.nisplus nisplus -k name -v address hosts.org_dir",
- sizeof buf);
- (void) makemapentry(buf);
- }
-# endif /* NISPLUS */
-# if NIS
- else if (strcmp(maptype[i], "nis") == 0 &&
- stab("hosts.nis", ST_MAP, ST_FIND) == NULL)
- {
- (void) sm_strlcpy(buf, "hosts.nis nis -k 0 -v 1 hosts.byname",
- sizeof buf);
- (void) makemapentry(buf);
- }
-# endif /* NIS */
-# if NETINFO
- else if (strcmp(maptype[i], "netinfo") == 0 &&
- stab("hosts.netinfo", ST_MAP, ST_FIND) == NULL)
- {
- (void) sm_strlcpy(buf, "hosts.netinfo netinfo -v name /machines",
- sizeof buf);
- (void) makemapentry(buf);
- }
-# endif /* NETINFO */
- }
-#endif /* 0 */
-
- /*
** Make sure we have a host map.
*/
if (stab("host", ST_MAP, ST_FIND) == NULL)
{
/* user didn't initialize: set up host map */
- (void) sm_strlcpy(buf, "host host", sizeof buf);
+ (void) sm_strlcpy(buf, "host host", sizeof(buf));
#if NAMED_BIND
if (ConfigLevel >= 2)
- (void) sm_strlcat(buf, " -a. -D", sizeof buf);
+ (void) sm_strlcat(buf, " -a. -D", sizeof(buf));
#endif /* NAMED_BIND */
(void) makemapentry(buf);
}
@@ -783,7 +739,7 @@ inithostmaps()
stab("aliases.files", ST_MAP, ST_FIND) == NULL)
{
(void) sm_strlcpy(buf, "aliases.files null",
- sizeof buf);
+ sizeof(buf));
(void) makemapentry(buf);
}
#if NISPLUS
@@ -791,7 +747,7 @@ inithostmaps()
stab("aliases.nisplus", ST_MAP, ST_FIND) == NULL)
{
(void) sm_strlcpy(buf, "aliases.nisplus nisplus -kalias -vexpansion mail_aliases.org_dir",
- sizeof buf);
+ sizeof(buf));
(void) makemapentry(buf);
}
#endif /* NISPLUS */
@@ -800,7 +756,7 @@ inithostmaps()
stab("aliases.nis", ST_MAP, ST_FIND) == NULL)
{
(void) sm_strlcpy(buf, "aliases.nis nis mail.aliases",
- sizeof buf);
+ sizeof(buf));
(void) makemapentry(buf);
}
#endif /* NIS */
@@ -809,7 +765,7 @@ inithostmaps()
stab("aliases.netinfo", ST_MAP, ST_FIND) == NULL)
{
(void) sm_strlcpy(buf, "aliases.netinfo netinfo -z, /aliases",
- sizeof buf);
+ sizeof(buf));
(void) makemapentry(buf);
}
#endif /* NETINFO */
@@ -818,66 +774,28 @@ inithostmaps()
stab("aliases.hesiod", ST_MAP, ST_FIND) == NULL)
{
(void) sm_strlcpy(buf, "aliases.hesiod hesiod aliases",
- sizeof buf);
+ sizeof(buf));
(void) makemapentry(buf);
}
#endif /* HESIOD */
- }
- if (stab("aliases", ST_MAP, ST_FIND) == NULL)
- {
- (void) sm_strlcpy(buf, "aliases switch aliases", sizeof buf);
- (void) makemapentry(buf);
- }
-
-#if 0 /* "user" map class is a better choice */
- /*
- ** Set up default users maps.
- */
-
- nmaps = switch_map_find("passwd", maptype, mapreturn);
- for (i = 0; i < nmaps; i++)
- {
- if (strcmp(maptype[i], "files") == 0 &&
- stab("users.files", ST_MAP, ST_FIND) == NULL)
+#if LDAPMAP && defined(SUN_EXTENSIONS) && \
+ defined(SUN_SIMPLIFIED_LDAP) && HASLDAPGETALIASBYNAME
+ else if (strcmp(maptype[i], "ldap") == 0 &&
+ stab("aliases.ldap", ST_MAP, ST_FIND) == NULL)
{
- (void) sm_strlcpy(buf, "users.files text -m -z: -k0 -v6 /etc/passwd",
+ (void) strlcpy(buf, "aliases.ldap ldap -b . -h localhost -k mail=%0 -v mailgroup",
sizeof buf);
(void) makemapentry(buf);
}
-# if NISPLUS
- else if (strcmp(maptype[i], "nisplus") == 0 &&
- stab("users.nisplus", ST_MAP, ST_FIND) == NULL)
- {
- (void) sm_strlcpy(buf, "users.nisplus nisplus -m -kname -vhome passwd.org_dir",
- sizeof buf);
- (void) makemapentry(buf);
- }
-# endif /* NISPLUS */
-# if NIS
- else if (strcmp(maptype[i], "nis") == 0 &&
- stab("users.nis", ST_MAP, ST_FIND) == NULL)
- {
- (void) sm_strlcpy(buf, "users.nis nis -m passwd.byname",
- sizeof buf);
- (void) makemapentry(buf);
- }
-# endif /* NIS */
-# if HESIOD
- else if (strcmp(maptype[i], "hesiod") == 0 &&
- stab("users.hesiod", ST_MAP, ST_FIND) == NULL)
- {
- (void) sm_strlcpy(buf, "users.hesiod hesiod", sizeof buf);
- (void) makemapentry(buf);
- }
-# endif /* HESIOD */
+#endif /* LDAPMAP && defined(SUN_EXTENSIONS) && ... */
}
- if (stab("users", ST_MAP, ST_FIND) == NULL)
+ if (stab("aliases", ST_MAP, ST_FIND) == NULL)
{
- (void) sm_strlcpy(buf, "users switch -m passwd", sizeof buf);
+ (void) sm_strlcpy(buf, "aliases switch aliases", sizeof(buf));
(void) makemapentry(buf);
}
-#endif /* 0 */
}
+
/*
** SWITCH_MAP_FIND -- find the list of types associated with a map
**
@@ -1044,7 +962,7 @@ switch_map_find(service, maptype, mapreturn)
char buf[MAXLINE];
while (sm_io_fgets(fp, SM_TIME_DEFAULT, buf,
- sizeof buf) != NULL)
+ sizeof(buf)) != NULL)
{
register char *p;
@@ -1327,6 +1245,25 @@ checkcompat(to, e)
#endif /* EXAMPLE_CODE */
return EX_OK;
}
+
+#ifdef SUN_EXTENSIONS
+static void
+init_md_sun()
+{
+ struct stat sbuf;
+
+ /* Check for large file descriptor */
+ if (fstat(fileno(stdin), &sbuf) < 0)
+ {
+ if (errno == EOVERFLOW)
+ {
+ perror("stdin");
+ exit(EX_NOINPUT);
+ }
+ }
+}
+#endif /* SUN_EXTENSIONS */
+
/*
** INIT_MD -- do machine dependent initializations
**
@@ -1359,7 +1296,7 @@ init_md(argc, argv)
/* keep gethostby*() from stripping the local domain name */
set_domain_trim_off();
#endif /* _CONVEX_SOURCE */
-#ifdef __QNX__
+#if defined(__QNX__) && !defined(__QNXNTO__)
/*
** Due to QNX's network distributed nature, you can target a tcpip
** stack on a different node in the qnx network; this patch lets
@@ -1528,12 +1465,12 @@ getla()
{
# ifdef _AUX_SOURCE
(void) sm_strlcpy(Nl[X_AVENRUN].n_name, LA_AVENRUN,
- sizeof Nl[X_AVENRUN].n_name);
+ sizeof(Nl[X_AVENRUN].n_name));
Nl[1].n_name[0] = '\0';
# endif /* _AUX_SOURCE */
# if defined(_AIX3) || defined(_AIX4)
- if (knlist(Nl, 1, sizeof Nl[0]) < 0)
+ if (knlist(Nl, 1, sizeof(Nl[0])) < 0)
# else /* defined(_AIX3) || defined(_AIX4) */
if (nlist(_PATH_UNIX, Nl) < 0)
# endif /* defined(_AIX3) || defined(_AIX4) */
@@ -2006,7 +1943,7 @@ getla()
}
}
- r = read(afd, &avenrun, sizeof avenrun);
+ r = read(afd, &avenrun, sizeof(avenrun));
if (tTd(3, 5))
sm_dprintf("getla: avenrun = %d\n", avenrun);
@@ -2153,7 +2090,7 @@ sm_getla()
char labuf[8];
CurrentLA = getla();
- (void) sm_snprintf(labuf, sizeof labuf, "%d", CurrentLA);
+ (void) sm_snprintf(labuf, sizeof(labuf), "%d", CurrentLA);
macdefine(&GlobalMacros, A_TEMP, macid("{load_avg}"), labuf);
}
/*
@@ -2209,26 +2146,18 @@ shouldqueue(pri, ct)
sm_dprintf("false (CurrentLA < QueueLA)\n");
return false;
}
-# if 0 /* this code is reported to cause oscillation around RefuseLA */
- if (CurrentLA >= RefuseLA && QueueLA < RefuseLA)
- {
- if (tTd(3, 30))
- sm_dprintf("TRUE (CurrentLA >= RefuseLA)\n");
- return true;
- }
-# endif /* 0 */
rval = pri > (QueueFactor / (CurrentLA - QueueLA + 1));
if (tTd(3, 30))
sm_dprintf("%s (by calculation)\n", rval ? "true" : "false");
return rval;
}
+
/*
** REFUSECONNECTIONS -- decide if connections should be refused
**
** Parameters:
-** name -- daemon name (for error messages only)
** e -- the current envelope.
-** d -- number of daemon
+** dn -- number of daemon.
** active -- was this daemon actually active?
**
** Returns:
@@ -2241,16 +2170,16 @@ shouldqueue(pri, ct)
*/
bool
-refuseconnections(name, e, d, active)
- char *name;
+refuseconnections(e, dn, active)
ENVELOPE *e;
- int d;
+ int dn;
bool active;
{
static time_t lastconn[MAXDAEMONS];
static int conncnt[MAXDAEMONS];
static time_t firstrejtime[MAXDAEMONS];
static time_t nextlogtime[MAXDAEMONS];
+ int limit;
#if _FFR_MEMSTAT
long memfree;
#endif /* _FFR_MEMSTAT */
@@ -2260,8 +2189,8 @@ refuseconnections(name, e, d, active)
return true;
#endif /* XLA */
- SM_ASSERT(d >= 0);
- SM_ASSERT(d < MAXDAEMONS);
+ SM_ASSERT(dn >= 0);
+ SM_ASSERT(dn < MAXDAEMONS);
if (ConnRateThrottle > 0)
{
time_t now;
@@ -2269,25 +2198,27 @@ refuseconnections(name, e, d, active)
now = curtime();
if (active)
{
- if (now != lastconn[d])
+ if (now != lastconn[dn])
{
- lastconn[d] = now;
- conncnt[d] = 1;
+ lastconn[dn] = now;
+ conncnt[dn] = 1;
}
- else if (conncnt[d]++ > ConnRateThrottle)
+ else if (conncnt[dn]++ > ConnRateThrottle)
{
#define D_MSG_CRT "deferring connections on daemon %s: %d per second"
/* sleep to flatten out connection load */
sm_setproctitle(true, e, D_MSG_CRT,
- name, ConnRateThrottle);
+ Daemons[dn].d_name,
+ ConnRateThrottle);
if (LogLevel > 8)
sm_syslog(LOG_INFO, NOQID, D_MSG_CRT,
- name, ConnRateThrottle);
+ Daemons[dn].d_name,
+ ConnRateThrottle);
(void) sleep(1);
}
}
- else if (now != lastconn[d])
- conncnt[d] = 0;
+ else if (now != lastconn[dn])
+ conncnt[dn] = 0;
}
@@ -2297,40 +2228,47 @@ refuseconnections(name, e, d, active)
memfree < RefuseLowMem)
{
# define R_MSG_LM "rejecting connections on daemon %s: free memory: %ld"
- sm_setproctitle(true, e, R_MSG_LM, name, memfree);
+ sm_setproctitle(true, e, R_MSG_LM, Daemons[dn].d_name, memfree);
if (LogLevel > 8)
- sm_syslog(LOG_NOTICE, NOQID, R_MSG_LM, name, memfree);
+ sm_syslog(LOG_NOTICE, NOQID, R_MSG_LM,
+ Daemons[dn].d_name, memfree);
return true;
}
#endif /* _FFR_MEMSTAT */
sm_getla();
- if (RefuseLA > 0 && CurrentLA >= RefuseLA)
+ limit = (Daemons[dn].d_refuseLA != DPO_NOTSET) ?
+ Daemons[dn].d_refuseLA : RefuseLA;
+ if (limit > 0 && CurrentLA >= limit)
{
time_t now;
# 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);
+ sm_setproctitle(true, e, R_MSG_LA, Daemons[dn].d_name,
+ CurrentLA);
if (LogLevel > 8)
- sm_syslog(LOG_NOTICE, NOQID, R_MSG_LA, name, CurrentLA);
+ sm_syslog(LOG_NOTICE, NOQID, R_MSG_LA,
+ Daemons[dn].d_name, CurrentLA);
now = curtime();
- if (firstrejtime[d] == 0)
+ if (firstrejtime[dn] == 0)
{
- firstrejtime[d] = now;
- nextlogtime[d] = now + RejectLogInterval;
+ firstrejtime[dn] = now;
+ nextlogtime[dn] = now + RejectLogInterval;
}
- else if (nextlogtime[d] < now)
+ else if (nextlogtime[dn] < now)
{
- sm_syslog(LOG_ERR, NOQID, R2_MSG_LA, name,
- pintvl(now - firstrejtime[d], true));
- nextlogtime[d] = now + RejectLogInterval;
+ sm_syslog(LOG_ERR, NOQID, R2_MSG_LA, Daemons[dn].d_name,
+ pintvl(now - firstrejtime[dn], true));
+ nextlogtime[dn] = now + RejectLogInterval;
}
return true;
}
else
- firstrejtime[d] = 0;
+ firstrejtime[dn] = 0;
- if (DelayLA > 0 && CurrentLA >= DelayLA)
+ limit = (Daemons[dn].d_delayLA != DPO_NOTSET) ?
+ Daemons[dn].d_delayLA : DelayLA;
+ if (limit > 0 && CurrentLA >= limit)
{
time_t now;
static time_t log_delay = (time_t) 0;
@@ -2338,32 +2276,37 @@ refuseconnections(name, e, d, active)
# define MIN_DELAY_LOG 90 /* wait before logging this again */
# define D_MSG_LA "delaying connections on daemon %s: load average=%d >= %d"
/* sleep to flatten out connection load */
- sm_setproctitle(true, e, D_MSG_LA, name, DelayLA);
+ sm_setproctitle(true, e, D_MSG_LA, Daemons[dn].d_name, limit);
if (LogLevel > 8 && (now = curtime()) > log_delay)
{
sm_syslog(LOG_INFO, NOQID, D_MSG_LA,
- name, CurrentLA, DelayLA);
+ Daemons[dn].d_name, CurrentLA, limit);
log_delay = now + MIN_DELAY_LOG;
}
(void) sleep(1);
}
- if (MaxChildren > 0 && CurChildren >= MaxChildren)
+ limit = (Daemons[dn].d_maxchildren != DPO_NOTSET) ?
+ Daemons[dn].d_maxchildren : MaxChildren;
+ if (limit > 0 && CurChildren >= limit)
{
proc_list_probe();
- if (CurChildren >= MaxChildren)
+ if (CurChildren >= limit)
{
#define R_MSG_CHILD "rejecting connections on daemon %s: %d children, max %d"
sm_setproctitle(true, e, R_MSG_CHILD,
- name, CurChildren, MaxChildren);
+ Daemons[dn].d_name, CurChildren,
+ limit);
if (LogLevel > 8)
sm_syslog(LOG_INFO, NOQID, R_MSG_CHILD,
- name, CurChildren, MaxChildren);
+ Daemons[dn].d_name, CurChildren,
+ limit);
return true;
}
}
return false;
}
+
/*
** SETPROCTITLE -- set process title for ps
**
@@ -2492,7 +2435,7 @@ initsetproctitle(argc, argv, envp)
{
for (i = 0; envp[i] != NULL; i++)
continue;
- environ = (char **) xalloc(sizeof (char *) * (i + 1));
+ environ = (char **) xalloc(sizeof(char *) * (i + 1));
for (i = 0; envp[i] != NULL; i++)
environ[i] = newstr(envp[i]);
environ[i] = NULL;
@@ -2661,7 +2604,7 @@ sm_setproctitle(status, e, fmt, va_alist)
/* print the argument string */
SM_VA_START(ap, fmt);
- (void) sm_vsnprintf(buf, sizeof buf, fmt, ap);
+ (void) sm_vsnprintf(buf, sizeof(buf), fmt, ap);
SM_VA_END(ap);
if (status)
@@ -2671,7 +2614,7 @@ sm_setproctitle(status, e, fmt, va_alist)
{
char prefix[SPT_BUFSIZE];
- expand(ProcTitlePrefix, prefix, sizeof prefix, e);
+ expand(ProcTitlePrefix, prefix, sizeof(prefix), e);
setproctitle("%s: %s", prefix, buf);
}
else
@@ -2889,7 +2832,7 @@ uname(name)
char buf[MAXLINE];
while (sm_io_fgets(file, SM_TIME_DEFAULT,
- buf, sizeof buf) != NULL)
+ buf, sizeof(buf)) != NULL)
{
if (sm_io_sscanf(buf, "#define sysname \"%*[^\"]\"",
NODE_LENGTH, name->nodename) > 0)
@@ -3263,7 +3206,7 @@ usershellok(user, shell)
return false;
}
- while (sm_io_fgets(shellf, SM_TIME_DEFAULT, buf, sizeof buf) != NULL)
+ while (sm_io_fgets(shellf, SM_TIME_DEFAULT, buf, sizeof(buf)) != NULL)
{
register char *p, *q;
@@ -3335,7 +3278,7 @@ usershellok(user, shell)
long
freediskspace(dir, bsize)
- char *dir;
+ const char *dir;
long *bsize;
{
# if SFS_TYPE == SFS_NONE
@@ -3373,7 +3316,7 @@ freediskspace(dir, bsize)
if (stat(dir, &statbuf) == 0 && ustat(statbuf.st_dev, &fs) == 0)
# else /* SFS_TYPE == SFS_USTAT */
# if SFS_TYPE == SFS_4ARGS
- if (statfs(dir, &fs, sizeof fs, 0) == 0)
+ if (statfs(dir, &fs, sizeof(fs), 0) == 0)
# else /* SFS_TYPE == SFS_4ARGS */
# if SFS_TYPE == SFS_STATVFS
if (statvfs(dir, &fs) == 0)
@@ -3578,7 +3521,7 @@ lockfile(fd, filename, ext, type)
if (ext == NULL)
ext = "";
- memset(&lfd, '\0', sizeof lfd);
+ memset(&lfd, '\0', sizeof(lfd));
if (bitset(LOCK_UN, type))
lfd.l_type = F_UNLCK;
else if (bitset(LOCK_EX, type))
@@ -3943,11 +3886,8 @@ vendor_post_defaults(e)
ENVELOPE *e;
{
#ifdef __QNX__
- char *p;
-
/* Makes sure the SOCK environment variable remains */
- if (p = getextenv("SOCK"))
- sm_setuserenv("SOCK", p);
+ sm_setuserenv("SOCK", NULL);
#endif /* __QNX__ */
#if defined(SUN_EXTENSIONS) && defined(SUN_DEFAULT_VALUES)
sun_post_defaults(e);
@@ -4043,7 +3983,7 @@ validate_connection(sap, hostname, e)
connection_rate_check(sap, e);
if (rscheck("check_relay", hostname, anynet_ntoa(sap),
- e, RSF_RMCOMM|RSF_COUNT, 3, NULL, NOQID) != EX_OK)
+ e, RSF_RMCOMM|RSF_COUNT, 3, NULL, NOQID, NULL) != EX_OK)
{
static char reject[BUFSIZ*2];
extern char MsgBuf[];
@@ -4052,9 +3992,9 @@ validate_connection(sap, hostname, e)
sm_dprintf(" ... validate_connection: BAD (rscheck)\n");
if (strlen(MsgBuf) >= 3)
- (void) sm_strlcpy(reject, MsgBuf, sizeof reject);
+ (void) sm_strlcpy(reject, MsgBuf, sizeof(reject));
else
- (void) sm_strlcpy(reject, "Access denied", sizeof reject);
+ (void) sm_strlcpy(reject, "Access denied", sizeof(reject));
return reject;
}
@@ -4371,12 +4311,12 @@ sm_gethostbyname(name, family)
if (nmaps >= 0)
{
/* try short name */
- if (strlen(name) > sizeof hbuf - 1)
+ if (strlen(name) > sizeof(hbuf) - 1)
{
errno = save_errno;
return NULL;
}
- (void) sm_strlcpy(hbuf, name, sizeof hbuf);
+ (void) sm_strlcpy(hbuf, name, sizeof(hbuf));
(void) shorten_hostname(hbuf);
/* if it hasn't been shortened, there's no point */
@@ -4428,7 +4368,7 @@ sm_gethostbyname(name, family)
memmove(&ia6, h->h_addr_list[i],
IN6ADDRSZ);
addr = anynet_ntop(&ia6,
- buf6, sizeof buf6);
+ buf6, sizeof(buf6));
#else /* NETINET6 */
memmove(&ia, h->h_addr_list[i],
INADDRSZ);
@@ -4667,7 +4607,8 @@ add_hostnames(sa)
if (tTd(0, 4))
sm_dprintf("\ta.k.a.: %s\n", hp->h_name);
- if (sm_snprintf(hnb, sizeof hnb, "[%s]", hp->h_name) < sizeof hnb
+ if (sm_snprintf(hnb, sizeof(hnb), "[%s]", hp->h_name) <
+ sizeof(hnb)
&& !wordinclass((char *) hnb, 'w'))
setclass('w', hnb);
}
@@ -4685,8 +4626,8 @@ add_hostnames(sa)
setclass('w', *ha);
if (tTd(0, 4))
sm_dprintf("\ta.k.a.: %s\n", *ha);
- if (sm_snprintf(hnb, sizeof hnb,
- "[%s]", *ha) < sizeof hnb &&
+ if (sm_snprintf(hnb, sizeof(hnb),
+ "[%s]", *ha) < sizeof(hnb) &&
!wordinclass((char *) hnb, 'w'))
setclass('w', hnb);
}
@@ -4799,7 +4740,7 @@ load_if_names()
return;
}
- len = lifc.lifc_len = numifs * sizeof (struct lifreq);
+ len = lifc.lifc_len = numifs * sizeof(struct lifreq);
buf = lifc.lifc_buf = xalloc(lifc.lifc_len);
# ifndef __hpux
lifc.lifc_family = AF_UNSPEC;
@@ -4856,20 +4797,20 @@ load_if_names()
** don't try to use it.
*/
- if ((len - i) < sizeof *ifr)
+ if ((len - i) < sizeof(*ifr))
break;
# ifdef BSD4_4_SOCKADDR
- if (sa->sa.sa_len > sizeof ifr->lifr_addr)
- i += sizeof ifr->lifr_name + sa->sa.sa_len;
+ if (sa->sa.sa_len > sizeof(ifr->lifr_addr))
+ i += sizeof(ifr->lifr_name) + sa->sa.sa_len;
else
# endif /* BSD4_4_SOCKADDR */
# ifdef DEC
/* fix for IPv6 size differences */
- i += sizeof ifr->ifr_name +
+ i += sizeof(ifr->ifr_name) +
max(sizeof(ifr->ifr_addr), ifr->ifr_addr.sa_len);
# else /* DEC */
- i += sizeof *ifr;
+ i += sizeof(*ifr);
# endif /* DEC */
if (tTd(0, 20))
@@ -4923,18 +4864,18 @@ load_if_names()
ia6 = sa->sin6.sin6_addr;
if (IN6_IS_ADDR_UNSPECIFIED(&ia6))
{
- addr = anynet_ntop(&ia6, buf6, sizeof buf6);
+ addr = anynet_ntop(&ia6, buf6, sizeof(buf6));
message("WARNING: interface %s is UP with %s address",
name, addr == NULL ? "(NULL)" : addr);
continue;
}
/* save IP address in text from */
- addr = anynet_ntop(&ia6, buf6, sizeof buf6);
+ addr = anynet_ntop(&ia6, buf6, sizeof(buf6));
if (addr != NULL)
- (void) sm_snprintf(ip_addr, sizeof ip_addr,
+ (void) sm_snprintf(ip_addr, sizeof(ip_addr),
"[%.*s]",
- (int) sizeof ip_addr - 3,
+ (int) sizeof(ip_addr) - 3,
addr);
break;
@@ -4949,8 +4890,8 @@ load_if_names()
}
/* save IP address in text from */
- (void) sm_snprintf(ip_addr, sizeof ip_addr, "[%.*s]",
- (int) sizeof ip_addr - 3, inet_ntoa(ia));
+ (void) sm_snprintf(ip_addr, sizeof(ip_addr), "[%.*s]",
+ (int) sizeof(ip_addr) - 3, inet_ntoa(ia));
break;
}
@@ -5006,7 +4947,7 @@ load_if_names()
(void) close(s);
return;
}
- ifc.ifc_len = numifs * sizeof (struct ifreq);
+ ifc.ifc_len = numifs * sizeof(struct ifreq);
ifc.ifc_buf = xalloc(ifc.ifc_len);
if (ioctl(s, SIOCGIFCONF, (char *)&ifc) < 0)
{
@@ -5045,15 +4986,15 @@ load_if_names()
** don't try to use it.
*/
- if ((ifc.ifc_len - i) < sizeof *ifr)
+ if ((ifc.ifc_len - i) < sizeof(*ifr))
break;
# ifdef BSD4_4_SOCKADDR
- if (sa->sa.sa_len > sizeof ifr->ifr_addr)
- i += sizeof ifr->ifr_name + sa->sa.sa_len;
+ if (sa->sa.sa_len > sizeof(ifr->ifr_addr))
+ i += sizeof(ifr->ifr_name) + sa->sa.sa_len;
else
# endif /* BSD4_4_SOCKADDR */
- i += sizeof *ifr;
+ i += sizeof(*ifr);
if (tTd(0, 20))
sm_dprintf("%s\n", anynet_ntoa(sa));
@@ -5098,8 +5039,8 @@ load_if_names()
}
/* save IP address in text from */
- (void) sm_snprintf(ip_addr, sizeof ip_addr, "[%.*s]",
- (int) sizeof ip_addr - 3,
+ (void) sm_snprintf(ip_addr, sizeof(ip_addr), "[%.*s]",
+ (int) sizeof(ip_addr) - 3,
inet_ntoa(ia));
break;
@@ -5122,7 +5063,7 @@ load_if_names()
ia6 = sa->sin6.sin6_addr;
if (IN6_IS_ADDR_UNSPECIFIED(&ia6))
{
- addr = anynet_ntop(&ia6, buf6, sizeof buf6);
+ addr = anynet_ntop(&ia6, buf6, sizeof(buf6));
message("WARNING: interface %s is UP with %s address",
ifr->ifr_name,
addr == NULL ? "(NULL)" : addr);
@@ -5130,11 +5071,11 @@ load_if_names()
}
/* save IP address in text from */
- addr = anynet_ntop(&ia6, buf6, sizeof buf6);
+ addr = anynet_ntop(&ia6, buf6, sizeof(buf6));
if (addr != NULL)
- (void) sm_snprintf(ip_addr, sizeof ip_addr,
+ (void) sm_snprintf(ip_addr, sizeof(ip_addr),
"[%.*s]",
- (int) sizeof ip_addr - 3,
+ (int) sizeof(ip_addr) - 3,
addr);
break;
@@ -5213,7 +5154,7 @@ get_num_procs_online()
mib[0] = CTL_HW;
mib[1] = HW_NCPU;
- sz = (size_t) sizeof nproc;
+ sz = (size_t) sizeof(nproc);
(void) sysctl(mib, 2, &nproc, &sz, NULL, 0);
# endif /* defined(CTL_HW) && defined(HW_NCPU) */
#else /* USESYSCTL */
@@ -5389,7 +5330,7 @@ sm_syslog(level, id, fmt, va_alist)
idlen = strlen(id) + SyslogPrefixLen;
buf = buf0;
- bufsize = sizeof buf0;
+ bufsize = sizeof(buf0);
for (;;)
{
@@ -5419,9 +5360,19 @@ sm_syslog(level, id, fmt, va_alist)
{
#if LOG
if (*id == '\0')
- syslog(level, "%s", newstring);
+ {
+ if (tTd(89, 8))
+ sm_dprintf("%s\n", newstring);
+ else
+ syslog(level, "%s", newstring);
+ }
else
- syslog(level, "%s: %s", id, newstring);
+ {
+ if (tTd(89, 8))
+ sm_dprintf("%s: %s\n", id, newstring);
+ else
+ syslog(level, "%s: %s", id, newstring);
+ }
#else /* LOG */
/*XXX should do something more sensible */
if (*id == '\0')
@@ -5473,7 +5424,10 @@ sm_syslog(level, id, fmt, va_alist)
save = *end;
*end = 0;
#if LOG
- syslog(level, "%s[%d]: %s ...", id, seq++, begin);
+ if (tTd(89, 8))
+ sm_dprintf("%s[%d]: %s ...\n", id, seq++, begin);
+ else
+ syslog(level, "%s[%d]: %s ...", id, seq++, begin);
#else /* LOG */
(void) sm_io_fprintf(smioerr, SM_TIME_DEFAULT,
"%s[%d]: %s ...\n", id, seq++, begin);
@@ -5482,20 +5436,31 @@ sm_syslog(level, id, fmt, va_alist)
begin = end;
}
if (seq >= 999)
+ {
#if LOG
- syslog(level, "%s[%d]: log terminated, too many parts",
- id, seq);
+ if (tTd(89, 8))
+ sm_dprintf("%s[%d]: log terminated, too many parts\n",
+ id, seq);
+ else
+ syslog(level, "%s[%d]: log terminated, too many parts",
+ id, seq);
#else /* LOG */
(void) sm_io_fprintf(smioerr, SM_TIME_DEFAULT,
"%s[%d]: log terminated, too many parts\n", id, seq);
#endif /* LOG */
+ }
else if (*begin != '\0')
+ {
#if LOG
- syslog(level, "%s[%d]: %s", id, seq, begin);
+ if (tTd(89, 8))
+ sm_dprintf("%s[%d]: %s\n", id, seq, begin);
+ else
+ syslog(level, "%s[%d]: %s", id, seq, begin);
#else /* LOG */
(void) sm_io_fprintf(smioerr, SM_TIME_DEFAULT,
"%s[%d]: %s\n", id, seq, begin);
#endif /* LOG */
+ }
if (buf != buf0)
sm_free(buf);
errno = save_errno;
@@ -5534,7 +5499,7 @@ hard_syslog(pri, msg, va_alist)
SM_VA_LOCAL_DECL
SM_VA_START(ap, msg);
- (void) sm_vsnprintf(buf, sizeof buf, msg, ap);
+ (void) sm_vsnprintf(buf, sizeof(buf), msg, ap);
SM_VA_END(ap);
for (i = MAXSYSLOGTRIES; --i >= 0 && syslog(pri, CAST "%s", buf) < 0; )
@@ -5792,6 +5757,9 @@ char *CompileOptions[] =
#if SCANF
"SCANF",
#endif /* SCANF */
+#if SM_LDAP_ERROR_ON_MISSING_ARGS
+ "SM_LDAP_ERROR_ON_MISSING_ARGS",
+#endif /* SM_LDAP_ERROR_ON_MISSING_ARGS */
#if SMTPDEBUG
"SMTPDEBUG",
#endif /* SMTPDEBUG */
@@ -5886,6 +5854,9 @@ char *OsCompileOptions[] =
#if HASINITGROUPS
"HASINITGROUPS",
#endif /* HASINITGROUPS */
+#if HASLDAPGETALIASBYNAME
+ "HASLDAPGETALIASBYNAME",
+#endif /* HASLDAPGETALIASBYNAME */
#if HASLSTAT
"HASLSTAT",
#endif /* HASLSTAT */
@@ -5958,6 +5929,9 @@ char *OsCompileOptions[] =
#if O_EXLOCK && HASFLOCK && !BOGUS_O_EXCL
"LOCK_ON_OPEN",
#endif /* O_EXLOCK && HASFLOCK && !BOGUS_O_EXCL */
+#if MILTER_NO_NAGLE
+ "MILTER_NO_NAGLE ",
+#endif /* MILTER_NO_NAGLE */
#if NEEDFSYNC
"NEEDFSYNC",
#endif /* NEEDFSYNC */
@@ -6060,22 +6034,10 @@ char *FFRCompileOptions[] =
/* Better truncation of list of MX records for dns map. */
"_FFR_BESTMX_BETTER_TRUNCATION",
#endif /* _FFR_BESTMX_BETTER_TRUNCATION */
-#if _FFR_BLOCK_PROXIES
- /*
- ** Try to deal with open HTTP proxies that are used to send spam
- ** by recognizing some commands from them.
- */
-
- "_FFR_BLOCK_PROXIES",
-#endif /* _FFR_BLOCK_PROXIES */
#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_CHECK_EOM
- /* Enable check_eom ruleset */
- "_FFR_CHECK_EOM",
-#endif /* _FFR_CHECK_EOM */
#if _FFR_CHK_QUEUE
/* Stricter checks about queue directory permissions. */
"_FFR_CHK_QUEUE",
@@ -6084,10 +6046,6 @@ char *FFRCompileOptions[] =
/* Don't try to send mail if its size exceeds SIZE= of server. */
"_FFR_CLIENT_SIZE",
#endif /* _FFR_CLIENT_SIZE */
-#if _FFR_CONTROL_MSTAT
- /* Extended daemon status. */
- "_FFR_CONTROL_MSTAT",
-#endif /* _FFR_CONTROL_MSTAT */
#if _FFR_CRLPATH
/* CRLPath; needs documentation; Al Smith */
"_FFR_CRLPATH",
@@ -6109,27 +6067,11 @@ char *FFRCompileOptions[] =
/* Problem noted by Anne Bennett of Concordia University */
"_FFR_DIGUNIX_SAFECHOWN",
#endif /* _FFR_DIGUNIX_SAFECHOWN */
-#if _FFR_DM_PER_DAEMON
- /* DeliveryMode per DaemonPortOptions: 'D' */
- "_FFR_DM_PER_DAEMON",
-#endif /* _FFR_DM_PER_DAEMON */
#if _FFR_DNSMAP_ALIASABLE
/* Allow dns map type to be used for aliases. */
/* Don Lewis of TDK */
"_FFR_DNSMAP_ALIASABLE",
#endif /* _FFR_DNSMAP_ALIASABLE */
-#if _FFR_DNSMAP_BASE
- /* Specify a "base" domain for DNS lookups. */
- "_FFR_DNSMAP_BASE",
-#endif /* _FFR_DNSMAP_BASE */
-#if _FFR_DNSMAP_MULTI
- /* Allow multiple return values for DNS map. */
- "_FFR_DNSMAP_MULTI",
-# if _FFR_DNSMAP_MULTILIMIT
- /* Limit number of return values for DNS map. */
- "_FFR_DNSMAP_MULTILIMIT",
-# endif /* _FFR_DNSMAP_MULTILIMIT */
-#endif /* _FFR_DNSMAP_MULTI */
#if _FFR_DONTLOCKFILESFORREAD_OPTION
/* Enable DontLockFilesForRead option. */
"_FFR_DONTLOCKFILESFORREAD_OPTION",
@@ -6138,6 +6080,21 @@ char *FFRCompileOptions[] =
/* Allow usernames with '.' */
"_FFR_DOTTED_USERNAMES",
#endif /* _FFR_DOTTED_USERNAMES */
+#if _FFR_DPO_CS
+ /*
+ ** Make DaemonPortOptions case sensitive.
+ ** For some unknown reasons the code converted every option
+ ** to uppercase (first letter only, as that's the only one that
+ ** is actually checked). This prevented all new lower case options
+ ** from working...
+ ** The documentation doesn't say anything about case (in)sensitivity,
+ ** which means it should be case sensitive by default,
+ ** but it's not a good idea to change this within a patch release,
+ ** so let's delay this to 8.15.
+ */
+
+ "_FFR_DPO_CS",
+#endif /* _FFR_DPO_CS */
#if _FFR_DROP_TRUSTUSER_WARNING
/*
** Don't issue this warning:
@@ -6147,10 +6104,27 @@ char *FFRCompileOptions[] =
"_FFR_DROP_TRUSTUSER_WARNING",
#endif /* _FFR_DROP_TRUSTUSER_WARNING */
+#if _FFR_EIGHT_BIT_ADDR_OK
+ /* EightBitAddrOK: allow 8-bit e-mail addresses */
+ "_FFR_EIGHT_BIT_ADDR_OK",
+#endif /* _FFR_EIGHT_BIT_ADDR_OK */
#if _FFR_EXTRA_MAP_CHECK
/* perform extra checks on $( $) in R lines */
"_FFR_EXTRA_MAP_CHECK",
#endif /* _FFR_EXTRA_MAP_CHECK */
+#if _FFR_GETHBN_ExFILE
+ /*
+ ** According to Motonori Nakamura some gethostbyname()
+ ** implementations (TurboLinux?) may (temporarily) fail
+ ** due to a lack of file discriptors. Enabling this FFR
+ ** will check errno for EMFILE and ENFILE and in case of a match
+ ** cause a temporary error instead of a permanent error.
+ ** The right solution is of course to file a bug against those
+ ** systems such that they actually set h_errno = TRY_AGAIN.
+ */
+
+ "_FFR_GETHBN_ExFILE",
+#endif /* _FFR_GETHBN_ExFILE */
#if _FFR_FIX_DASHT
/*
** If using -t, force not sending to argv recipients, even
@@ -6167,10 +6141,6 @@ char *FFRCompileOptions[] =
/* Generate a ORCPT DSN arg if not already provided */
"_FFR_GEN_ORCPT",
#endif /* _FFR_GEN_ORCPT */
-#if _FFR_LOG_GREET_PAUSE
- /* log time for greet_pause delay; from Nik Clayton */
- "_FFR_LOG_GREET_PAUSE",
-#endif /* _FFR_LOG_GREET_PAUSE */
#if _FFR_GROUPREADABLEAUTHINFOFILE
/* Allow group readable DefaultAuthInfo file. */
"_FFR_GROUPREADABLEAUTHINFOFILE",
@@ -6184,14 +6154,6 @@ char *FFRCompileOptions[] =
/* Peter Eriksson of Linkopings universitet */
"_FFR_HANDLE_ISO8859_GECOS",
#endif /* _FFR_HANDLE_ISO8859_GECOS */
-#if _FFR_HDR_TYPE
- /* 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",
@@ -6220,14 +6182,6 @@ char *FFRCompileOptions[] =
/* Randall S. Winchester of the University of Maryland */
"_FFR_MAX_FORWARD_ENTRIES",
#endif /* _FFR_MAX_FORWARD_ENTRIES */
-#if _FFR_MAXKEY
- /* increase key size for LDAP lookups, see conf.h */
- "_FFR_MAXKEY",
-#endif /* _FFR_MAXKEY */
-#if _FFR_MAXNOOPCOMMANDS
- /* runtime option for "MaxNOOPCommands" */
- "_FFR_MAXNOOPCOMMANDS",
-#endif /* _FFR_MAXNOOPCOMMANDS */
#if _FFR_MAX_SLEEP_TIME
/* Limit sleep(2) time in libsm/clock.c */
"_FFR_MAX_SLEEP_TIME",
@@ -6236,16 +6190,35 @@ char *FFRCompileOptions[] =
/* Check free memory */
"_FFR_MEMSTAT",
#endif /* _FFR_MEMSTAT */
-#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_MILTER_CHECK
+ "_FFR_MILTER_CHECK",
+#endif /* _FFR_MILTER_CHECK */
+#if _FFR_MILTER_CONVERT_ALL_LF_TO_CRLF
+ /*
+ ** milter_body() uses the same conversion algorithm as putbody()
+ ** to translate the "local" df format (\n) to SMTP format (\r\n).
+ ** However, putbody() and mime8to7() use different conversion
+ ** algorithms.
+ ** If the input date does not follow the SMTP standard
+ ** (e.g., if it has "naked \r"s), then the output from putbody()
+ ** and mime8to7() will most likely be different.
+ ** By turning on this FFR milter_body() will try to "imitate"
+ ** mime8to7().
+ ** Note: there is no (simple) way to deal with both conversions
+ ** in a consistent manner. Moreover, as the "GiGo" principle applies,
+ ** it's not really worth to fix it.
+ */
+
+ "_FFR_MILTER_CONVERT_ALL_LF_TO_CRLF",
+#endif /* _FFR_MILTER_CONVERT_ALL_LF_TO_CRLF */
+#if _FFR_MILTER_CHECK_REJECTIONS_TOO
+ /*
+ ** Also send RCPTs that are rejected by check_rcpt to a milter
+ ** (if requested during option negotiation).
+ */
+
+ "_FFR_MILTER_CHECK_REJECTIONS_TOO",
+#endif /* _FFR_MILTER_CHECK_REJECTIONS_TOO */
#if _FFR_MIME7TO8_OLD
/* Old mime7to8 code, the new is broken for at least one example. */
"_FFR_MIME7TO8_OLD",
@@ -6267,15 +6240,9 @@ char *FFRCompileOptions[] =
/* log ntries=, from Nik Clayton of FreeBSD */
"_FFR_LOG_NTRIES",
#endif /* _FFR_LOG_NTRIES */
-#if _FFR_PRIV_NOACTUALRECIPIENT
- /*
- ** PrivacyOptions=noactualrecipient stops sendmail from putting
- ** X-Actual-Recipient lines in DSNs revealing the actual
- ** account that addresses map to. Patch from Dan Harkless.
- */
-
- "_FFR_PRIV_NOACTUALRECIPIENT",
-#endif /* _FFR_PRIV_NOACTUALRECIPIENT */
+#if _FFR_QF_PARANOIA
+ "_FFR_QF_PARANOIA",
+#endif /* _FFR_QF_PARANOIA */
#if _FFR_QUEUEDELAY
/* Exponential queue delay; disabled in 8.13 since it isn't used. */
"_FFR_QUEUEDELAY",
@@ -6314,10 +6281,6 @@ char *FFRCompileOptions[] =
/* Random shuffle for queue sorting. */
"_FFR_RHS",
#endif /* _FFR_RHS */
-#if _FFR_SELECT_SHM
- /* Auto-select of shared memory key */
- "_FFR_SELECT_SHM",
-#endif /* _FFR_SELECT_SHM */
#if _FFR_SHM_STATUS
/* Donated code (unused). */
"_FFR_SHM_STATUS",
@@ -6349,10 +6312,6 @@ char *FFRCompileOptions[] =
/* Use select(2) in libsm/clock.c to emulate sleep(2) */
"_FFR_SLEEP_USE_SELECT ",
#endif /* _FFR_SLEEP_USE_SELECT */
-#if _FFR_SOFT_BOUNCE
- /* Turn all errors into temporary errors. */
- "_FFR_SOFT_BOUNCE",
-#endif /* _FFR_SOFT_BOUNCE */
#if _FFR_SPT_ALIGN
/*
** It looks like the Compaq Tru64 5.1A now aligns argv and envp to 64
diff --git a/contrib/sendmail/src/conf.h b/contrib/sendmail/src/conf.h
index ab23bca..99ed47d 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.570 2005/12/09 18:37:27 ca Exp $
+ * $Id: conf.h,v 8.574 2006/11/29 00:36:06 ca Exp $
*
* $FreeBSD$
*
@@ -63,6 +63,11 @@ struct rusage; /* forward declaration to get gcc to shut up in wait.h */
**********************************************************************/
#define MAXLINE 2048 /* max line length */
+#if SASL
+# define MAXINPLINE 12288 /* max input line length (for AUTH) */
+#else /* SASL */
+# define MAXINPLINE MAXLINE /* max input line length */
+#endif /* SASL */
#define MAXNAME 256 /* max length of a name */
#ifndef MAXAUTHINFO
# define MAXAUTHINFO 100 /* max length of authinfo token */
@@ -74,11 +79,7 @@ struct rusage; /* forward declaration to get gcc to shut up in wait.h */
#define MAXMXHOSTS 100 /* max # of MX records for one host */
#define SMTPLINELIM 990 /* max SMTP line length */
#define MAXUDBKEY 128 /* max size of a database key (udb only) */
-#if _FFR_MAXKEY
-# define MAXKEY 1024 /* max size of a database key */
-#else /* _FFR_MAXKEY */
-# define MAXKEY (MAXNAME + 1) /* max size of a database key */
-#endif /* _FFR_MAXKEY */
+#define MAXKEY 1024 /* max size of a database key */
#define MEMCHUNKSIZE 1024 /* chunk size for memory allocation */
#define MAXUSERENVIRON 100 /* max envars saved, must be >= 3 */
#define MAXMAPSTACK 12 /* max # of stacked or sequenced maps */
diff --git a/contrib/sendmail/src/err.c b/contrib/sendmail/src/err.c
index 5a0b5b1..89b0736 100644
--- a/contrib/sendmail/src/err.c
+++ b/contrib/sendmail/src/err.c
@@ -9,11 +9,12 @@
* forth in the LICENSE file which can be found at the top level of
* the sendmail distribution.
*
+ * $FreeBSD$
*/
#include <sendmail.h>
-SM_RCSID("@(#)$Id: err.c,v 8.191 2003/01/10 02:16:46 ca Exp $")
+SM_RCSID("@(#)$Id: err.c,v 8.196 2006/11/10 23:14:08 ca Exp $")
#if LDAPMAP
# include <lber.h>
@@ -109,7 +110,7 @@ fatal_error(exc)
*/
char MsgBuf[BUFSIZ*2]; /* text of most recent message */
-static char HeldMessageBuf[sizeof MsgBuf]; /* for held messages */
+static char HeldMessageBuf[sizeof(MsgBuf)]; /* for held messages */
#if NAMED_BIND && !defined(NO_DATA)
# define NO_DATA NO_ADDRESS
@@ -208,7 +209,7 @@ syserr(fmt, va_alist)
else
{
user = ubuf;
- (void) sm_snprintf(ubuf, sizeof ubuf, "UID%d", (int) RealUid);
+ (void) sm_snprintf(ubuf, sizeof(ubuf), "UID%d", (int) RealUid);
}
if (LogLevel > 0)
@@ -320,9 +321,9 @@ usrerr(fmt, va_alist)
{
char buf[MAXLINE];
- (void) sm_snprintf(buf, sizeof buf,
+ (void) sm_snprintf(buf, sizeof(buf),
"Postmaster warning: %.*s",
- (int) sizeof buf - 22, errtxt);
+ (int) sizeof(buf) - 22, errtxt);
CurEnv->e_message =
sm_rpool_strdup_x(CurEnv->e_rpool, buf);
}
@@ -407,9 +408,9 @@ usrerrenh(enhsc, fmt, va_alist)
{
char buf[MAXLINE];
- (void) sm_snprintf(buf, sizeof buf,
+ (void) sm_snprintf(buf, sizeof(buf),
"Postmaster warning: %.*s",
- (int) sizeof buf - 22, errtxt);
+ (int) sizeof(buf) - 22, errtxt);
CurEnv->e_message =
sm_rpool_strdup_x(CurEnv->e_rpool, buf);
}
@@ -528,8 +529,7 @@ nmessage(msg, va_alist)
case '5':
if (CurEnv->e_rpool == NULL && CurEnv->e_message != NULL)
sm_free(CurEnv->e_message);
- CurEnv->e_message =
- sm_rpool_strdup_x(CurEnv->e_rpool, errtxt);
+ CurEnv->e_message = sm_rpool_strdup_x(CurEnv->e_rpool, errtxt);
break;
}
}
@@ -558,8 +558,9 @@ putoutmsg(msg, holdmsg, heldmsg)
bool holdmsg;
bool heldmsg;
{
- char *errtxt = msg;
char msgcode = msg[0];
+ char *errtxt = msg;
+ char *id;
/* display for debugging */
if (tTd(54, 8))
@@ -571,6 +572,7 @@ putoutmsg(msg, holdmsg, heldmsg)
msg[0] = '5';
else if (msgcode == '8')
msg[0] = '4';
+ id = (CurEnv != NULL) ? CurEnv->e_id : NULL;
/* output to transcript if serious */
if (!heldmsg && CurEnv != NULL && CurEnv->e_xfp != NULL &&
@@ -579,7 +581,7 @@ putoutmsg(msg, holdmsg, heldmsg)
msg);
if (LogLevel > 14 && (OpMode == MD_SMTP || OpMode == MD_DAEMON))
- sm_syslog(LOG_INFO, CurEnv->e_id,
+ sm_syslog(LOG_INFO, id,
"--- %s%s%s", msg, holdmsg ? " (hold)" : "",
heldmsg ? " (held)" : "");
@@ -595,7 +597,7 @@ putoutmsg(msg, holdmsg, heldmsg)
msg[0] = msgcode;
if (HeldMessageBuf[0] == '5' && msgcode == '4')
return;
- (void) sm_strlcpy(HeldMessageBuf, msg, sizeof HeldMessageBuf);
+ (void) sm_strlcpy(HeldMessageBuf, msg, sizeof(HeldMessageBuf));
return;
}
@@ -650,7 +652,7 @@ putoutmsg(msg, holdmsg, heldmsg)
/* can't call syserr, 'cause we are using MsgBuf */
HoldErrs = true;
if (LogLevel > 0)
- sm_syslog(LOG_CRIT, CurEnv->e_id,
+ sm_syslog(LOG_CRIT, id,
"SYSERR: putoutmsg (%s): error on output channel sending \"%s\": %s",
CURHOSTNAME,
shortenstring(msg, MAXSHORTSTR), sm_errstring(errno));
@@ -823,7 +825,7 @@ fmtmsg(eb, to, num, enhsc, eno, fmt, ap)
{
char del;
int l;
- int spaceleft = sizeof MsgBuf;
+ int spaceleft = sizeof(MsgBuf);
char *errtxt;
/* output the reply code */
@@ -836,15 +838,13 @@ fmtmsg(eb, to, num, enhsc, eno, fmt, ap)
del = '-';
else
del = ' ';
-#if _FFR_SOFT_BOUNCE
if (SoftBounce && num[0] == '5')
{
/* replace 5 by 4 */
(void) sm_snprintf(eb, spaceleft, "4%2.2s%c", num + 1, del);
}
else
-#endif /* _FFR_SOFT_BOUNCE */
- (void) sm_snprintf(eb, spaceleft, "%3.3s%c", num, del);
+ (void) sm_snprintf(eb, spaceleft, "%3.3s%c", num, del);
eb += 4;
spaceleft -= 4;
@@ -866,13 +866,11 @@ fmtmsg(eb, to, num, enhsc, eno, fmt, ap)
eb += l;
spaceleft -= l;
}
-#if _FFR_SOFT_BOUNCE
if (SoftBounce && eb[-l] == '5')
{
/* replace 5 by 4 */
eb[-l] = '4';
}
-#endif /* _FFR_SOFT_BOUNCE */
errtxt = eb;
/* output the file name and line number */
@@ -1006,7 +1004,7 @@ sm_errstring(errnum)
err = strerror(errnum);
if (err == NULL)
{
- (void) sm_snprintf(errbuf, sizeof errbuf,
+ (void) sm_snprintf(errbuf, sizeof(errbuf),
"Error %d", errnum);
err = errbuf;
}
@@ -1050,14 +1048,14 @@ sm_errstring(errnum)
case EHOSTDOWN:
if (CurHostName == NULL)
break;
- (void) sm_snprintf(buf, sizeof buf, "Host %s is down",
+ (void) sm_snprintf(buf, sizeof(buf), "Host %s is down",
shortenstring(CurHostName, MAXSHORTSTR));
return buf;
case ECONNREFUSED:
if (CurHostName == NULL)
break;
- (void) sm_strlcpyn(buf, sizeof buf, 2, "Connection refused by ",
+ (void) sm_strlcpyn(buf, sizeof(buf), 2, "Connection refused by ",
shortenstring(CurHostName, MAXSHORTSTR));
return buf;
@@ -1127,7 +1125,7 @@ sm_errstring(errnum)
if (dnsmsg != NULL)
{
bp = buf;
- bp += sm_strlcpy(bp, "Name server: ", sizeof buf);
+ bp += sm_strlcpy(bp, "Name server: ", sizeof(buf));
if (CurHostName != NULL)
{
(void) sm_strlcpyn(bp, SPACELEFT(buf, bp), 2,
@@ -1147,7 +1145,7 @@ sm_errstring(errnum)
err = strerror(errnum);
if (err == NULL)
{
- (void) sm_snprintf(buf, sizeof buf, "Error %d", errnum);
+ (void) sm_snprintf(buf, sizeof(buf), "Error %d", errnum);
return buf;
}
return err;
@@ -1155,7 +1153,7 @@ sm_errstring(errnum)
if (errnum > 0 && errnum < sys_nerr)
return sys_errlist[errnum];
- (void) sm_snprintf(buf, sizeof buf, "Error %d", errnum);
+ (void) sm_snprintf(buf, sizeof(buf), "Error %d", errnum);
return buf;
#endif /* HASSTRERROR */
}
diff --git a/contrib/sendmail/src/headers.c b/contrib/sendmail/src/headers.c
index 383a053..7fc7873 100644
--- a/contrib/sendmail/src/headers.c
+++ b/contrib/sendmail/src/headers.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1998-2004, 2006 Sendmail, Inc. and its suppliers.
+ * Copyright (c) 1998-2004, 2006, 2007 Sendmail, Inc. and its suppliers.
* All rights reserved.
* Copyright (c) 1983, 1995-1997 Eric P. Allman. All rights reserved.
* Copyright (c) 1988, 1993
@@ -13,10 +13,11 @@
*/
#include <sendmail.h>
+#include <sm/sendmail.h>
-SM_RCSID("@(#)$Id: headers.c,v 8.291 2006/03/24 01:01:56 ca Exp $")
+SM_RCSID("@(#)$Id: headers.c,v 8.310 2007/02/07 22:44:35 ca Exp $")
-static HDR *allocheader __P((char *, char *, int, SM_RPOOL_T *));
+static HDR *allocheader __P((char *, char *, int, SM_RPOOL_T *, bool));
static size_t fix_mime_header __P((HDR *, ENVELOPE *));
static int priencode __P((char *));
static bool put_vanilla_header __P((HDR *, char *, MCI *));
@@ -44,10 +45,11 @@ setupheaders()
s->s_header.hi_ruleset = NULL;
}
}
+
/*
-** CHOMPHEADER -- process and save a header line.
+** DOCHOMPHEADER -- process and save a header line.
**
-** Called by collect, readcf, and readqf to deal with header lines.
+** Called by chompheader.
**
** Parameters:
** line -- header as a text line.
@@ -64,13 +66,14 @@ setupheaders()
*/
static struct hdrinfo NormalHeader = { NULL, 0, NULL };
+static unsigned long dochompheader __P((char *, int, HDR **, ENVELOPE *));
-unsigned long
-chompheader(line, pflag, hdrp, e)
+static unsigned long
+dochompheader(line, pflag, hdrp, e)
char *line;
int pflag;
HDR **hdrp;
- register ENVELOPE *e;
+ ENVELOPE *e;
{
unsigned char mid = '\0';
register char *p;
@@ -86,13 +89,6 @@ chompheader(line, pflag, hdrp, e)
bool nullheader = false;
BITMAP256 mopts;
- if (tTd(31, 6))
- {
- sm_dprintf("chompheader: ");
- xputs(sm_debug_file(), line);
- sm_dprintf("\n");
- }
-
headeronly = hdrp != NULL;
if (!headeronly)
hdrp = &e->e_header;
@@ -188,10 +184,6 @@ hse:
return 0;
}
*fvalue = '\0';
-
- /* strip field value on front */
- if (*p == ' ')
- p++;
fvalue = p;
/* if the field is null, go ahead and use the default */
@@ -209,7 +201,7 @@ hse:
{
char hbuf[50];
- (void) expand(fvalue, hbuf, sizeof hbuf, e);
+ (void) expand(fvalue, hbuf, sizeof(hbuf), e);
for (p = hbuf; isascii(*p) && isspace(*p); )
p++;
if ((*p++ & 0377) == CALLSUBR)
@@ -357,9 +349,8 @@ hse:
macdefine(&e->e_macro, A_TEMP,
macid("{hdr_name}"), fname);
- (void) sm_snprintf(qval, sizeof qval, "%d", k);
+ (void) sm_snprintf(qval, sizeof(qval), "%d", k);
macdefine(&e->e_macro, A_TEMP, macid("{hdrlen}"), qval);
-#if _FFR_HDR_TYPE
if (bitset(H_FROM, hi->hi_flags))
macdefine(&e->e_macro, A_PERM,
macid("{addr_type}"), "h s");
@@ -367,11 +358,10 @@ hse:
macdefine(&e->e_macro, A_PERM,
macid("{addr_type}"), "h r");
else
-#endif /* _FFR_HDR_TYPE */
macdefine(&e->e_macro, A_PERM,
macid("{addr_type}"), "h");
(void) rscheck(rs, fvalue, NULL, e, rscheckflags, 3,
- NULL, e->e_id);
+ NULL, e->e_id, NULL);
}
}
@@ -424,18 +414,18 @@ hse:
{
/* copy conditions from default case */
memmove((char *) mopts, (char *) h->h_mflags,
- sizeof mopts);
+ sizeof(mopts));
}
h->h_macro = mid;
}
}
/* create a new node */
- h = (HDR *) sm_rpool_malloc_x(e->e_rpool, sizeof *h);
+ h = (HDR *) sm_rpool_malloc_x(e->e_rpool, sizeof(*h));
h->h_field = sm_rpool_strdup_x(e->e_rpool, fname);
h->h_value = sm_rpool_strdup_x(e->e_rpool, fvalue);
h->h_link = NULL;
- memmove((char *) h->h_mflags, (char *) mopts, sizeof mopts);
+ memmove((char *) h->h_mflags, (char *) mopts, sizeof(mopts));
h->h_macro = mid;
*hp = h;
h->h_flags = hi->hi_flags;
@@ -461,25 +451,97 @@ hse:
return h->h_flags;
}
+
+/*
+** CHOMPHEADER -- process and save a header line.
+**
+** Called by collect, readcf, and readqf to deal with header lines.
+** This is just a wrapper for dochompheader().
+**
+** Parameters:
+** line -- header as a text line.
+** pflag -- flags for chompheader() (from sendmail.h)
+** hdrp -- a pointer to the place to save the header.
+** e -- the envelope including this header.
+**
+** Returns:
+** flags for this header.
+**
+** Side Effects:
+** The header is saved on the header list.
+** Contents of 'line' are destroyed.
+*/
+
+
+unsigned long
+chompheader(line, pflag, hdrp, e)
+ char *line;
+ int pflag;
+ HDR **hdrp;
+ register ENVELOPE *e;
+{
+ unsigned long rval;
+
+ if (tTd(31, 6))
+ {
+ sm_dprintf("chompheader: ");
+ xputs(sm_debug_file(), line);
+ sm_dprintf("\n");
+ }
+
+ /* quote this if user (not config file) input */
+ if (bitset(pflag, CHHDR_USER))
+ {
+ char xbuf[MAXLINE];
+ char *xbp = NULL;
+ int xbufs;
+
+ xbufs = sizeof(xbuf);
+ xbp = quote_internal_chars(line, xbuf, &xbufs);
+ if (tTd(31, 7))
+ {
+ sm_dprintf("chompheader: quoted: ");
+ xputs(sm_debug_file(), xbp);
+ sm_dprintf("\n");
+ }
+ rval = dochompheader(xbp, pflag, hdrp, e);
+ if (xbp != xbuf)
+ sm_free(xbp);
+ }
+ else
+ rval = dochompheader(line, pflag, hdrp, e);
+
+ return rval;
+}
+
/*
** ALLOCHEADER -- allocate a header entry
**
** Parameters:
-** field -- the name of the header field.
-** value -- the value of the field.
+** field -- the name of the header field (will not be copied).
+** value -- the value of the field (will be copied).
** flags -- flags to add to h_flags.
** rp -- resource pool for allocations
+** space -- add leading space?
**
** Returns:
** Pointer to a newly allocated and populated HDR.
+**
+** Notes:
+** o field and value must be in internal format, i.e.,
+** metacharacters must be "quoted", see quote_internal_chars().
+** o maybe add more flags to decide:
+** - what to copy (field/value)
+** - whether to convert value to an internal format
*/
static HDR *
-allocheader(field, value, flags, rp)
+allocheader(field, value, flags, rp, space)
char *field;
char *value;
int flags;
SM_RPOOL_T *rp;
+ bool space;
{
HDR *h;
STAB *s;
@@ -488,9 +550,23 @@ allocheader(field, value, flags, rp)
s = stab(field, ST_HEADER, ST_FIND);
/* allocate space for new header */
- h = (HDR *) sm_rpool_malloc_x(rp, sizeof *h);
+ h = (HDR *) sm_rpool_malloc_x(rp, sizeof(*h));
h->h_field = field;
- h->h_value = sm_rpool_strdup_x(rp, value);
+ if (space)
+ {
+ size_t l;
+ char *n;
+
+ l = strlen(value);
+ SM_ASSERT(l + 2 > l);
+ n = sm_rpool_malloc_x(rp, l + 2);
+ n[0] = ' ';
+ n[1] = '\0';
+ sm_strlcpy(n + 1, value, l + 1);
+ h->h_value = n;
+ }
+ else
+ h->h_value = sm_rpool_strdup_x(rp, value);
h->h_flags = flags;
if (s != NULL)
h->h_flags |= s->s_header.hi_flags;
@@ -499,30 +575,36 @@ allocheader(field, value, flags, rp)
return h;
}
+
/*
** ADDHEADER -- add a header entry to the end of the queue.
**
** This bypasses the special checking of chompheader.
**
** Parameters:
-** field -- the name of the header field.
-** value -- the value of the field.
+** field -- the name of the header field (will not be copied).
+** value -- the value of the field (will be copied).
** flags -- flags to add to h_flags.
** e -- envelope.
+** space -- add leading space?
**
** Returns:
** none.
**
** Side Effects:
** adds the field on the list of headers for this envelope.
+**
+** Notes: field and value must be in internal format, i.e.,
+** metacharacters must be "quoted", see quote_internal_chars().
*/
void
-addheader(field, value, flags, e)
+addheader(field, value, flags, e, space)
char *field;
char *value;
int flags;
ENVELOPE *e;
+ bool space;
{
register HDR *h;
HDR **hp;
@@ -536,41 +618,51 @@ addheader(field, value, flags, e)
}
/* allocate space for new header */
- h = allocheader(field, value, flags, e->e_rpool);
+ h = allocheader(field, value, flags, e->e_rpool, space);
h->h_link = *hp;
*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.
+** field -- the name of the header field (will be copied).
+** value -- the value of the field (will be copied).
** flags -- flags to add to h_flags.
** e -- envelope.
+** space -- add leading space?
**
** Returns:
** none.
**
** Side Effects:
** inserts the field on the list of headers for this envelope.
+**
+** Notes:
+** - field and value must be in internal format, i.e.,
+** metacharacters must be "quoted", see quote_internal_chars().
+** - the header list contains headers that might not be
+** sent "out" (see putheader(): "skip"), hence there is no
+** reliable way to insert a header at an exact position
+** (except at the front or end).
*/
void
-insheader(idx, field, value, flags, e)
+insheader(idx, field, value, flags, e, space)
int idx;
char *field;
char *value;
int flags;
ENVELOPE *e;
+ bool space;
{
HDR *h, *srch, *last = NULL;
/* allocate space for new header */
- h = allocheader(field, value, flags, e->e_rpool);
+ h = allocheader(field, value, flags, e->e_rpool, space);
/* find insertion position */
for (srch = e->e_header; srch != NULL && idx > 0;
@@ -594,6 +686,7 @@ insheader(idx, field, value, flags, e)
srch->h_link = h;
}
}
+
/*
** HVALUE -- return value of a header.
**
@@ -605,7 +698,7 @@ insheader(idx, field, value, flags, e)
** header -- the header list.
**
** Returns:
-** pointer to the value part.
+** pointer to the value part (internal format).
** NULL if not found.
**
** Side Effects:
@@ -627,6 +720,7 @@ hvalue(field, header)
}
return NULL;
}
+
/*
** ISHEADER -- predicate telling if argument is a header.
**
@@ -654,8 +748,9 @@ bool
isheader(h)
char *h;
{
- register char *s = h;
+ char *s;
+ s = h;
if (s[0] == '-' && s[1] == '-')
return false;
@@ -671,6 +766,7 @@ isheader(h)
return (*s == ':');
}
+
/*
** EATHEADER -- run through the stored header and extract info.
**
@@ -735,7 +831,7 @@ eatheader(e, full, log)
for (h = e->e_header; h != NULL; h = h->h_link)
{
if (tTd(32, 1))
- sm_dprintf("%s: ", h->h_field);
+ sm_dprintf("%s:", h->h_field);
if (h->h_value == NULL)
{
if (tTd(32, 1))
@@ -753,12 +849,13 @@ eatheader(e, full, log)
xputs(sm_debug_file(), h->h_value);
sm_dprintf(") ");
}
- expand(h->h_value, buf, sizeof buf, e);
- if (buf[0] != '\0')
+ expand(h->h_value, buf, sizeof(buf), e);
+ if (buf[0] != '\0' &&
+ (buf[0] != ' ' || buf[1] != '\0'))
{
if (bitset(H_FROM, h->h_flags))
expand(crackaddr(buf, e),
- buf, sizeof buf, e);
+ buf, sizeof(buf), e);
h->h_value = sm_rpool_strdup_x(e->e_rpool, buf);
h->h_flags &= ~H_DEFAULT;
}
@@ -822,7 +919,7 @@ eatheader(e, full, log)
if (hopcnt > e->e_hopcount)
{
e->e_hopcount = hopcnt;
- (void) sm_snprintf(buf, sizeof buf, "%d", e->e_hopcount);
+ (void) sm_snprintf(buf, sizeof(buf), "%d", e->e_hopcount);
macdefine(&e->e_macro, A_TEMP, 'c', buf);
}
@@ -853,7 +950,7 @@ eatheader(e, full, log)
/* tokenize header */
oldsupr = SuprErrs;
SuprErrs = true;
- pvp = prescan(p, '\0', pvpbuf, sizeof pvpbuf, NULL,
+ pvp = prescan(p, '\0', pvpbuf, sizeof(pvpbuf), NULL,
MimeTokenTab, false);
SuprErrs = oldsupr;
@@ -975,6 +1072,7 @@ eatheader(e, full, log)
e->e_flags &= ~EF_LOGSENDER;
}
}
+
/*
** LOGSENDER -- log sender information
**
@@ -1005,8 +1103,8 @@ logsender(e, msgid)
size_t l;
l = strlen(msgid);
- if (l > sizeof mbuf - 1)
- l = sizeof mbuf - 1;
+ if (l > sizeof(mbuf) - 1)
+ l = sizeof(mbuf) - 1;
memmove(mbuf, msgid, l);
mbuf[l] = '\0';
p = mbuf;
@@ -1026,7 +1124,7 @@ logsender(e, msgid)
else
{
name = hbuf;
- (void) sm_snprintf(hbuf, sizeof hbuf, "%.80s", RealHostName);
+ (void) sm_snprintf(hbuf, sizeof(hbuf), "%.80s", RealHostName);
if (RealHostAddr.sa.sa_family != 0)
{
p = &hbuf[strlen(hbuf)];
@@ -1105,6 +1203,7 @@ logsender(e, msgid)
"%.400srelay=%s", sbuf, name);
#endif /* (SYSLOG_BUFSIZE) >= 256 */
}
+
/*
** PRIENCODE -- encode external priority names into internal values.
**
@@ -1133,6 +1232,7 @@ priencode(p)
/* unknown priority */
return 0;
}
+
/*
** CRACKADDR -- parse an address and turn it into a macro
**
@@ -1215,17 +1315,22 @@ crackaddr(addr, e)
if (tTd(33, 1))
sm_dprintf("crackaddr(%s)\n", addr);
- /* strip leading spaces */
+ buflim = bufend = &buf[sizeof(buf) - 1];
+ bp = bufhead = buf;
+
+ /* skip over leading spaces but preserve them */
while (*addr != '\0' && isascii(*addr) && isspace(*addr))
+ {
+ SM_APPEND_CHAR(*addr);
addr++;
+ }
+ bufhead = bp;
/*
** Start by assuming we have no angle brackets. This will be
** adjusted later if we find them.
*/
- buflim = bufend = &buf[sizeof(buf) - 1];
- bp = bufhead = buf;
p = addrhead = addr;
copylev = anglelev = cmtlev = realcmtlev = 0;
bracklev = 0;
@@ -1533,6 +1638,7 @@ crackaddr(addr, e)
}
return buf;
}
+
/*
** PUTHEADER -- put the header part of a message from the in-core copy
**
@@ -1580,7 +1686,7 @@ putheader(mci, hdr, e, flags)
if (tTd(34, 11))
{
- sm_dprintf(" %s: ", h->h_field);
+ sm_dprintf(" %s:", h->h_field);
xputs(sm_debug_file(), p);
}
@@ -1721,7 +1827,7 @@ putheader(mci, hdr, e, flags)
if (bitset(H_DEFAULT, h->h_flags) ||
bitset(H_BINDLATE, h->h_flags))
{
- expand(p, buf, sizeof buf, e);
+ expand(p, buf, sizeof(buf), e);
p = buf;
if (*p == '\0')
{
@@ -1742,7 +1848,7 @@ putheader(mci, hdr, e, flags)
else
{
/* no other recipient headers: truncate value */
- (void) sm_strlcpyn(obuf, sizeof obuf, 2,
+ (void) sm_strlcpyn(obuf, sizeof(obuf), 2,
h->h_field, ":");
if (!putline(obuf, mci))
goto writeerr;
@@ -1786,7 +1892,7 @@ putheader(mci, hdr, e, flags)
goto writeerr;
if (hvalue("Content-Type", e->e_header) == NULL)
{
- (void) sm_snprintf(obuf, sizeof obuf,
+ (void) sm_snprintf(obuf, sizeof(obuf),
"Content-Type: text/plain; charset=%s",
defcharset(e));
if (!putline(obuf, mci))
@@ -1802,6 +1908,7 @@ putheader(mci, hdr, e, flags)
writeerr:
return false;
}
+
/*
** PUT_VANILLA_HEADER -- output a fairly ordinary header
**
@@ -1825,10 +1932,10 @@ put_vanilla_header(h, v, mci)
int putflags;
char obuf[MAXLINE + 256]; /* additional length for h_field */
- putflags = PXLF_HEADER;
+ putflags = PXLF_HEADER | PXLF_STRIPMQUOTE;
if (bitnset(M_7BITHDRS, mci->mci_mailer->m_flags))
putflags |= PXLF_STRIP8BIT;
- (void) sm_snprintf(obuf, sizeof obuf, "%.200s: ", h->h_field);
+ (void) sm_snprintf(obuf, sizeof(obuf), "%.200s:", h->h_field);
obp = obuf + strlen(obuf);
while ((nlp = strchr(v, '\n')) != NULL)
{
@@ -1861,6 +1968,7 @@ put_vanilla_header(h, v, mci)
writeerr:
return false;
}
+
/*
** COMMAIZE -- output a header field, making a comma-translated list.
**
@@ -1875,7 +1983,7 @@ put_vanilla_header(h, v, mci)
** true iff header field was written successfully
**
** Side Effects:
-** outputs "p" to file "fp".
+** outputs "p" to "mci".
*/
bool
@@ -1887,10 +1995,9 @@ commaize(h, p, oldstyle, mci, e)
register ENVELOPE *e;
{
register char *obp;
- int opos;
- int omax;
+ int opos, omax, spaces;
bool firstone = true;
- int putflags = PXLF_HEADER;
+ int putflags = PXLF_HEADER | PXLF_STRIPMQUOTE;
char **res;
char obuf[MAXLINE + 3];
@@ -1900,20 +2007,44 @@ commaize(h, p, oldstyle, mci, e)
*/
if (tTd(14, 2))
- sm_dprintf("commaize(%s: %s)\n", h->h_field, p);
+ sm_dprintf("commaize(%s:%s)\n", h->h_field, p);
if (bitnset(M_7BITHDRS, mci->mci_mailer->m_flags))
putflags |= PXLF_STRIP8BIT;
obp = obuf;
- (void) sm_snprintf(obp, SPACELEFT(obuf, obp), "%.200s: ",
- h->h_field);
-
- /* opos = strlen(obp); */
- opos = strlen(h->h_field) + 2;
- if (opos > 202)
- opos = 202;
+ (void) sm_snprintf(obp, SPACELEFT(obuf, obp), "%.200s:", h->h_field);
+ /* opos = strlen(obp); instead of the next 3 lines? */
+ opos = strlen(h->h_field) + 1;
+ if (opos > 201)
+ opos = 201;
obp += opos;
+
+ spaces = 0;
+ while (*p != '\0' && isascii(*p) && isspace(*p))
+ {
+ ++spaces;
+ ++p;
+ }
+ if (spaces > 0)
+ {
+ SM_ASSERT(sizeof(obuf) > opos * 2);
+
+ /*
+ ** Restrict number of spaces to half the length of buffer
+ ** so the header field body can be put in here too.
+ ** Note: this is a hack...
+ */
+
+ if (spaces > sizeof(obuf) / 2)
+ spaces = sizeof(obuf) / 2;
+ (void) sm_snprintf(obp, SPACELEFT(obuf, obp), "%*s", spaces,
+ "");
+ opos += spaces;
+ obp += spaces;
+ SM_ASSERT(obp < &obuf[MAXLINE]);
+ }
+
omax = mci->mci_mailer->m_linelimit - 2;
if (omax < 0 || omax > 78)
omax = 78;
@@ -1949,7 +2080,7 @@ commaize(h, p, oldstyle, mci, e)
char pvpbuf[PSBUFSIZE];
res = prescan(p, oldstyle ? ' ' : ',', pvpbuf,
- sizeof pvpbuf, &oldp, NULL, false);
+ sizeof(pvpbuf), &oldp, ExtTokenTab, false);
p = oldp;
#if _FFR_IGNORE_BOGUS_ADDR
/* ignore addresses that can't be parsed */
@@ -2027,7 +2158,7 @@ commaize(h, p, oldstyle, mci, e)
if (!putxline(obuf, strlen(obuf), mci, putflags))
goto writeerr;
obp = obuf;
- (void) sm_strlcpy(obp, " ", sizeof obuf);
+ (void) sm_strlcpy(obp, " ", sizeof(obuf));
opos = strlen(obp);
obp += opos;
opos += strlen(name);
@@ -2043,10 +2174,10 @@ commaize(h, p, oldstyle, mci, e)
firstone = false;
*p = savechar;
}
- if (obp < &obuf[sizeof obuf])
+ if (obp < &obuf[sizeof(obuf)])
*obp = '\0';
else
- obuf[sizeof obuf - 1] = '\0';
+ obuf[sizeof(obuf) - 1] = '\0';
return putxline(obuf, strlen(obuf), mci, putflags);
writeerr:
@@ -2080,7 +2211,7 @@ copyheader(header, rpool)
while (header != NULL)
{
- newhdr = (HDR *) sm_rpool_malloc_x(rpool, sizeof *newhdr);
+ newhdr = (HDR *) sm_rpool_malloc_x(rpool, sizeof(*newhdr));
STRUCTCOPY(*header, *newhdr);
*tail = newhdr;
tail = &newhdr->h_link;
@@ -2090,6 +2221,7 @@ copyheader(header, rpool)
return ret;
}
+
/*
** FIX_MIME_HEADER -- possibly truncate/rebalance parameters in a MIME header
**
diff --git a/contrib/sendmail/src/mailq.1 b/contrib/sendmail/src/mailq.1
index f67a9dd..6b2136f 100644
--- a/contrib/sendmail/src/mailq.1
+++ b/contrib/sendmail/src/mailq.1
@@ -1,4 +1,4 @@
-.\" Copyright (c) 1998-2000, 2002 Sendmail, Inc. and its suppliers.
+.\" Copyright (c) 1998-2000, 2002, 2007 Sendmail, Inc. and its suppliers.
.\" All rights reserved.
.\" Copyright (c) 1983, 1997 Eric P. Allman. All rights reserved.
.\" Copyright (c) 1985, 1990, 1993
@@ -9,9 +9,9 @@
.\" the sendmail distribution.
.\"
.\"
-.\" $Id: mailq.1,v 8.20 2002/06/27 22:47:34 gshapiro Exp $
+.\" $Id: mailq.1,v 8.21 2007/03/22 18:21:27 ca Exp $
.\"
-.TH MAILQ 1 "$Date: 2002/06/27 22:47:34 $"
+.TH MAILQ 1 "$Date: 2007/03/22 18:21:27 $"
.SH NAME
mailq
\- print the mail queue
@@ -104,6 +104,25 @@ and the name of the alias this command expanded from, if any.
Moreover, status messages for each recipient are printed
if available.
.PP
+Several sendmail.cf options influence the behavior of the
+.B mailq
+utility:
+The number of items printed per queue group is restricted by
+.B MaxQueueRunSize
+if that value is set.
+The status character
+.B *
+is not printed for some values of
+.B QueueSortOrder,
+e.g.,
+filename,
+random,
+modification, and
+none,
+unless a
+.B -q
+option is used to limit the processed jobs.
+.PP
The
.B mailq
utility exits 0 on success, and >0 if an error occurs.
@@ -114,3 +133,4 @@ The
.B mailq
command appeared in
4.0BSD.
+.\" $FreeBSD$
diff --git a/contrib/sendmail/src/mci.c b/contrib/sendmail/src/mci.c
index 1726379..ef977440 100644
--- a/contrib/sendmail/src/mci.c
+++ b/contrib/sendmail/src/mci.c
@@ -14,7 +14,7 @@
#include <sendmail.h>
-SM_RCSID("@(#)$Id: mci.c,v 8.217 2006/04/18 01:27:36 ca Exp $")
+SM_RCSID("@(#)$Id: mci.c,v 8.218 2006/08/15 23:24:57 ca Exp $")
#if NETINET || NETINET6
# include <arpa/inet.h>
@@ -141,8 +141,8 @@ mci_scan(savemci)
if (MciCache == NULL)
{
/* first call */
- MciCache = (MCI **) sm_pmalloc_x(MaxMciCache * sizeof *MciCache);
- memset((char *) MciCache, '\0', MaxMciCache * sizeof *MciCache);
+ MciCache = (MCI **) sm_pmalloc_x(MaxMciCache * sizeof(*MciCache));
+ memset((char *) MciCache, '\0', MaxMciCache * sizeof(*MciCache));
return &MciCache[0];
}
@@ -310,7 +310,7 @@ mci_get(host, m)
extern SOCKADDR CurHostAddr;
/* clear CurHostAddr so we don't get a bogus address with this name */
- memset(&CurHostAddr, '\0', sizeof CurHostAddr);
+ memset(&CurHostAddr, '\0', sizeof(CurHostAddr));
/* clear out any expired connections */
(void) mci_scan(NULL);
@@ -375,7 +375,7 @@ mci_get(host, m)
{
/* get peer host address */
/* (this should really be in the mci struct) */
- SOCKADDR_LEN_T socklen = sizeof CurHostAddr;
+ SOCKADDR_LEN_T socklen = sizeof(CurHostAddr);
(void) getpeername(sm_io_getinfo(mci->mci_in,
SM_IO_WHAT_FD, NULL),
@@ -465,10 +465,10 @@ mci_new(rpool)
register MCI *mci;
if (rpool == NULL)
- mci = (MCI *) sm_malloc_x(sizeof *mci);
+ mci = (MCI *) sm_malloc_x(sizeof(*mci));
else
- mci = (MCI *) sm_rpool_malloc_x(rpool, sizeof *mci);
- memset((char *) mci, '\0', sizeof *mci);
+ mci = (MCI *) sm_rpool_malloc_x(rpool, sizeof(*mci));
+ memset((char *) mci, '\0', sizeof(*mci));
mci->mci_rpool = sm_rpool_new_x(NULL);
mci->mci_macro.mac_rpool = mci->mci_rpool;
return mci;
@@ -727,7 +727,7 @@ mci_lock_host_statfile(mci)
sm_dprintf("mci_lock_host: attempting to lock %s\n",
mci->mci_host);
- if (mci_generate_persistent_path(mci->mci_host, fname, sizeof fname,
+ if (mci_generate_persistent_path(mci->mci_host, fname, sizeof(fname),
true) < 0)
{
/* of course this should never happen */
@@ -857,7 +857,7 @@ mci_load_persistent(mci)
sm_dprintf("mci_load_persistent: Attempting to load persistent information for %s\n",
mci->mci_host);
- if (mci_generate_persistent_path(mci->mci_host, fname, sizeof fname,
+ if (mci_generate_persistent_path(mci->mci_host, fname, sizeof(fname),
false) < 0)
{
/* Not much we can do if the file isn't there... */
@@ -946,7 +946,7 @@ mci_read_persistent(fp, mci)
sm_io_rewind(fp, SM_TIME_DEFAULT);
ver = -1;
LineNumber = 0;
- while (sm_io_fgets(fp, SM_TIME_DEFAULT, buf, sizeof buf) != NULL)
+ while (sm_io_fgets(fp, SM_TIME_DEFAULT, buf, sizeof(buf)) != NULL)
{
LineNumber++;
p = strchr(buf, '\n');
@@ -1171,7 +1171,7 @@ mci_traverse_persistent(action, pathname)
continue;
(void) sm_strlcpy(newptr, e->d_name,
- sizeof newpath -
+ sizeof(newpath) -
(newptr - newpath));
if (StopRequest)
@@ -1301,7 +1301,7 @@ mci_print_persistent(pathname, hostname)
}
FileName = pathname;
- memset(&mcib, '\0', sizeof mcib);
+ memset(&mcib, '\0', sizeof(mcib));
if (mci_read_persistent(fp, &mcib) < 0)
{
syserr("%s: could not read status file", pathname);
@@ -1333,7 +1333,7 @@ mci_print_persistent(pathname, hostname)
{
char buf[80];
- (void) sm_snprintf(buf, sizeof buf,
+ (void) sm_snprintf(buf, sizeof(buf),
"Unknown mailer error %d",
mcib.mci_exitstat);
(void) sm_io_fprintf(smioout, SM_TIME_DEFAULT, "%.*s\n",
@@ -1480,12 +1480,12 @@ mci_generate_persistent_path(host, path, pathlen, createflag)
return -1;
/* make certain this is not a bracketed host number */
- if (strlen(host) > sizeof t_host - 1)
+ if (strlen(host) > sizeof(t_host) - 1)
return -1;
if (host[0] == '[')
- (void) sm_strlcpy(t_host, host + 1, sizeof t_host);
+ (void) sm_strlcpy(t_host, host + 1, sizeof(t_host));
else
- (void) sm_strlcpy(t_host, host, sizeof t_host);
+ (void) sm_strlcpy(t_host, host, sizeof(t_host));
/*
** Delete any trailing dots from the hostname.
diff --git a/contrib/sendmail/src/savemail.c b/contrib/sendmail/src/savemail.c
index 8010b31..7c7f288 100644
--- a/contrib/sendmail/src/savemail.c
+++ b/contrib/sendmail/src/savemail.c
@@ -15,7 +15,7 @@
#include <sendmail.h>
-SM_RCSID("@(#)$Id: savemail.c,v 8.308 2006/04/18 01:31:33 ca Exp $")
+SM_RCSID("@(#)$Id: savemail.c,v 8.313 2006/11/29 00:20:41 ca Exp $")
static bool errbody __P((MCI *, ENVELOPE *, char *));
static bool pruneroute __P((char *));
@@ -195,7 +195,7 @@ savemail(e, sendbody)
break;
}
- expand("\201n", buf, sizeof buf, e);
+ expand("\201n", buf, sizeof(buf), e);
(void) sm_io_fprintf(smioout, SM_TIME_DEFAULT,
"\r\nMessage from %s...\r\n", buf);
(void) sm_io_fprintf(smioout, SM_TIME_DEFAULT,
@@ -206,7 +206,7 @@ savemail(e, sendbody)
(void) sm_io_fprintf(smioout, SM_TIME_DEFAULT,
"Transcript follows:\r\n");
while (sm_io_fgets(e->e_xfp, SM_TIME_DEFAULT,
- buf, sizeof buf) != NULL &&
+ buf, sizeof(buf)) != NULL &&
!sm_io_error(smioout))
(void) sm_io_fputs(smioout,
SM_TIME_DEFAULT,
@@ -253,7 +253,7 @@ savemail(e, sendbody)
char from[TOBUFSIZE];
if (sm_strlcpy(from, e->e_from.q_paddr,
- sizeof from) >= sizeof from)
+ sizeof(from)) >= sizeof(from))
{
state = ESM_POSTMASTER;
break;
@@ -307,7 +307,7 @@ savemail(e, sendbody)
*/
q = NULL;
- expand(DoubleBounceAddr, buf, sizeof buf, e);
+ expand(DoubleBounceAddr, buf, sizeof(buf), e);
/*
** Just drop it on the floor if DoubleBounceAddr
@@ -373,7 +373,7 @@ savemail(e, sendbody)
p = macvalue('g', e);
macdefine(&e->e_macro, A_PERM, 'g', e->e_sender);
- expand("\201z/dead.letter", dlbuf, sizeof dlbuf, e);
+ expand("\201z/dead.letter", dlbuf, sizeof(dlbuf), e);
sff = SFF_CREAT|SFF_REGONLY|SFF_RUNASREALUID;
if (RealUid == 0)
sff |= SFF_ROOTOK;
@@ -424,7 +424,7 @@ savemail(e, sendbody)
break;
}
- memset(&mcibuf, '\0', sizeof mcibuf);
+ memset(&mcibuf, '\0', sizeof(mcibuf));
mcibuf.mci_out = fp;
mcibuf.mci_mailer = FileMailer;
if (bitnset(M_7BITS, FileMailer->m_flags))
@@ -608,7 +608,7 @@ returntosender(msg, returnq, flags, e)
ee->e_nrcpts++;
if (q->q_alias == NULL)
- addheader("To", q->q_paddr, 0, ee);
+ addheader("To", q->q_paddr, 0, ee, true);
}
if (LogLevel > 5)
@@ -627,18 +627,18 @@ returntosender(msg, returnq, flags, e)
if (SendMIMEErrors)
{
- addheader("MIME-Version", "1.0", 0, ee);
- (void) sm_snprintf(buf, sizeof buf, "%s.%ld/%.100s",
+ addheader("MIME-Version", "1.0", 0, ee, true);
+ (void) sm_snprintf(buf, sizeof(buf), "%s.%ld/%.100s",
ee->e_id, (long)curtime(), MyHostName);
ee->e_msgboundary = sm_rpool_strdup_x(ee->e_rpool, buf);
- (void) sm_snprintf(buf, sizeof buf,
+ (void) sm_snprintf(buf, sizeof(buf),
#if DSN
"multipart/report; report-type=delivery-status;\n\tboundary=\"%s\"",
#else /* DSN */
"multipart/mixed; boundary=\"%s\"",
#endif /* DSN */
ee->e_msgboundary);
- addheader("Content-Type", buf, 0, ee);
+ addheader("Content-Type", buf, 0, ee, true);
p = hvalue("Content-Transfer-Encoding", e->e_header);
if (p != NULL && sm_strcasecmp(p, "binary") != 0)
@@ -646,42 +646,42 @@ returntosender(msg, returnq, flags, e)
if (p == NULL && bitset(EF_HAS8BIT, e->e_flags))
p = "8bit";
if (p != NULL)
- addheader("Content-Transfer-Encoding", p, 0, ee);
+ addheader("Content-Transfer-Encoding", p, 0, ee, true);
}
if (strncmp(msg, "Warning:", 8) == 0)
{
- addheader("Subject", msg, 0, ee);
+ addheader("Subject", msg, 0, ee, true);
p = "warning-timeout";
}
else if (strncmp(msg, "Postmaster warning:", 19) == 0)
{
- addheader("Subject", msg, 0, ee);
+ addheader("Subject", msg, 0, ee, true);
p = "postmaster-warning";
}
else if (strcmp(msg, "Return receipt") == 0)
{
- addheader("Subject", msg, 0, ee);
+ addheader("Subject", msg, 0, ee, true);
p = "return-receipt";
}
else if (bitset(RTSF_PM_BOUNCE, flags))
{
- (void) sm_snprintf(buf, sizeof buf,
+ (void) sm_snprintf(buf, sizeof(buf),
"Postmaster notify: see transcript for details");
- addheader("Subject", buf, 0, ee);
+ addheader("Subject", buf, 0, ee, true);
p = "postmaster-notification";
}
else
{
- (void) sm_snprintf(buf, sizeof buf,
+ (void) sm_snprintf(buf, sizeof(buf),
"Returned mail: see transcript for details");
- addheader("Subject", buf, 0, ee);
+ addheader("Subject", buf, 0, ee, true);
p = "failure";
}
- (void) sm_snprintf(buf, sizeof buf, "auto-generated (%s)", p);
- addheader("Auto-Submitted", buf, 0, ee);
+ (void) sm_snprintf(buf, sizeof(buf), "auto-generated (%s)", p);
+ addheader("Auto-Submitted", buf, 0, ee, true);
/* fake up an address header for the from person */
- expand("\201n", buf, sizeof buf, e);
+ expand("\201n", buf, sizeof(buf), e);
if (parseaddr(buf, &ee->e_from,
RF_COPYALL|RF_SENDERADDR, '\0', NULL, e, false) == NULL)
{
@@ -778,7 +778,7 @@ errbody(mci, e, separator)
if (e->e_msgboundary != NULL)
{
- (void) sm_strlcpyn(buf, sizeof buf, 2, "--", e->e_msgboundary);
+ (void) sm_strlcpyn(buf, sizeof(buf), 2, "--", e->e_msgboundary);
if (!putline("This is a MIME-encapsulated message", mci) ||
!putline("", mci) ||
!putline(buf, mci) ||
@@ -816,19 +816,19 @@ errbody(mci, e, separator)
!putline("", mci))
goto writeerr;
}
- (void) sm_snprintf(buf, sizeof buf,
+ (void) sm_snprintf(buf, sizeof(buf),
"The original message was received at %s",
arpadate(ctime(&e->e_parent->e_ctime)));
if (!putline(buf, mci))
goto writeerr;
- expand("from \201_", buf, sizeof buf, e->e_parent);
+ expand("from \201_", buf, sizeof(buf), e->e_parent);
if (!putline(buf, mci))
goto writeerr;
/* include id in postmaster copies */
if (pm_notify && e->e_parent->e_id != NULL)
{
- (void) sm_strlcpyn(buf, sizeof buf, 2, "with id ",
+ (void) sm_strlcpyn(buf, sizeof(buf), 2, "with id ",
e->e_parent->e_id);
if (!putline(buf, mci))
goto writeerr;
@@ -856,11 +856,19 @@ errbody(mci, e, separator)
if (xfile != NULL)
{
while (sm_io_fgets(xfile, SM_TIME_DEFAULT, buf,
- sizeof buf) != NULL)
+ sizeof(buf)) != NULL)
{
- translate_dollars(buf);
- expand(buf, buf, sizeof buf, e);
- if (!putline(buf, mci))
+ int lbs;
+ bool putok;
+ char *lbp;
+
+ lbs = sizeof(buf);
+ lbp = translate_dollars(buf, buf, &lbs);
+ expand(lbp, lbp, lbs, e);
+ putok = putline(lbp, mci);
+ if (lbp != buf)
+ sm_free(lbp);
+ if (!putok)
goto writeerr;
}
(void) sm_io_close(xfile, SM_TIME_DEFAULT);
@@ -870,7 +878,7 @@ errbody(mci, e, separator)
}
else
{
- expand(ErrMsgFile, buf, sizeof buf, e);
+ expand(ErrMsgFile, buf, sizeof(buf), e);
if (!putline(buf, mci) || !putline("", mci))
goto writeerr;
}
@@ -897,12 +905,12 @@ errbody(mci, e, separator)
}
(void) sm_strlcpy(buf, shortenstring(q->q_paddr, MAXSHORTSTR),
- sizeof buf);
+ sizeof(buf));
if (!putline(buf, mci))
goto writeerr;
if (q->q_rstatus != NULL)
{
- (void) sm_snprintf(buf, sizeof buf,
+ (void) sm_snprintf(buf, sizeof(buf),
" (reason: %s)",
shortenstring(exitstat(q->q_rstatus),
MAXSHORTSTR));
@@ -911,7 +919,7 @@ errbody(mci, e, separator)
}
if (q->q_alias != NULL)
{
- (void) sm_snprintf(buf, sizeof buf,
+ (void) sm_snprintf(buf, sizeof(buf),
" (expanded from: %s)",
shortenstring(q->q_alias->q_paddr,
MAXSHORTSTR));
@@ -941,12 +949,12 @@ errbody(mci, e, separator)
}
(void) sm_strlcpy(buf, shortenstring(q->q_paddr, MAXSHORTSTR),
- sizeof buf);
+ sizeof(buf));
if (!putline(buf, mci))
goto writeerr;
if (q->q_alias != NULL)
{
- (void) sm_snprintf(buf, sizeof buf,
+ (void) sm_snprintf(buf, sizeof(buf),
" (expanded from: %s)",
shortenstring(q->q_alias->q_paddr,
MAXSHORTSTR));
@@ -994,13 +1002,13 @@ errbody(mci, e, separator)
printheader = false;
}
- (void) sm_snprintf(buf, sizeof buf, "%s (%s)",
+ (void) sm_snprintf(buf, sizeof(buf), "%s (%s)",
shortenstring(q->q_paddr, MAXSHORTSTR), p);
if (!putline(buf, mci))
goto writeerr;
if (q->q_alias != NULL)
{
- (void) sm_snprintf(buf, sizeof buf,
+ (void) sm_snprintf(buf, sizeof(buf),
" (expanded from: %s)",
shortenstring(q->q_alias->q_paddr,
MAXSHORTSTR));
@@ -1029,7 +1037,7 @@ errbody(mci, e, separator)
if (e->e_xfp != NULL)
(void) sm_io_flush(e->e_xfp, SM_TIME_DEFAULT);
while (sm_io_fgets(e->e_parent->e_xfp, SM_TIME_DEFAULT, buf,
- sizeof buf) != NULL)
+ sizeof(buf)) != NULL)
{
if (printheader && !putline(" ----- Transcript of session follows -----\n",
mci))
@@ -1048,7 +1056,7 @@ errbody(mci, e, separator)
if (e->e_msgboundary != NULL)
{
- (void) sm_strlcpyn(buf, sizeof buf, 2, "--", e->e_msgboundary);
+ (void) sm_strlcpyn(buf, sizeof(buf), 2, "--", e->e_msgboundary);
if (!putline("", mci) ||
!putline(buf, mci) ||
!putline("Content-Type: message/delivery-status", mci) ||
@@ -1062,7 +1070,7 @@ errbody(mci, e, separator)
/* original envelope id from MAIL FROM: line */
if (e->e_parent->e_envid != NULL)
{
- (void) sm_snprintf(buf, sizeof buf,
+ (void) sm_snprintf(buf, sizeof(buf),
"Original-Envelope-Id: %.800s",
xuntextify(e->e_parent->e_envid));
if (!putline(buf, mci))
@@ -1070,7 +1078,7 @@ errbody(mci, e, separator)
}
/* Reporting-MTA: is us (required) */
- (void) sm_snprintf(buf, sizeof buf,
+ (void) sm_snprintf(buf, sizeof(buf),
"Reporting-MTA: dns; %.800s", MyHostName);
if (!putline(buf, mci))
goto writeerr;
@@ -1084,7 +1092,7 @@ errbody(mci, e, separator)
if (e->e_parent->e_from.q_mailer == NULL ||
(p = e->e_parent->e_from.q_mailer->m_mtatype) == NULL)
p = "dns";
- (void) sm_snprintf(buf, sizeof buf,
+ (void) sm_snprintf(buf, sizeof(buf),
"Received-From-MTA: %s; %.800s",
p, RealHostName);
if (!putline(buf, mci))
@@ -1092,7 +1100,7 @@ errbody(mci, e, separator)
}
/* Arrival-Date: -- when it arrived here */
- (void) sm_strlcpyn(buf, sizeof buf, 2, "Arrival-Date: ",
+ (void) sm_strlcpyn(buf, sizeof(buf), 2, "Arrival-Date: ",
arpadate(ctime(&e->e_parent->e_ctime)));
if (!putline(buf, mci))
goto writeerr;
@@ -1103,7 +1111,7 @@ errbody(mci, e, separator)
time_t dbyd;
dbyd = e->e_parent->e_ctime + e->e_parent->e_deliver_by;
- (void) sm_strlcpyn(buf, sizeof buf, 2,
+ (void) sm_strlcpyn(buf, sizeof(buf), 2,
"Deliver-By-Date: ",
arpadate(ctime(&dbyd)));
if (!putline(buf, mci))
@@ -1156,7 +1164,7 @@ errbody(mci, e, separator)
/* Original-Recipient: -- passed from on high */
if (q->q_orcpt != NULL)
{
- (void) sm_snprintf(buf, sizeof buf,
+ (void) sm_snprintf(buf, sizeof(buf),
"Original-Recipient: %.800s",
q->q_orcpt);
if (!putline(buf, mci))
@@ -1177,7 +1185,7 @@ errbody(mci, e, separator)
strchr(q->q_user, '@') == NULL)
{
(void) sm_snprintf(actual,
- sizeof actual,
+ sizeof(actual),
"%s; %.700s@%.100s",
p, q->q_user,
MyHostName);
@@ -1185,7 +1193,7 @@ errbody(mci, e, separator)
else
{
(void) sm_snprintf(actual,
- sizeof actual,
+ sizeof(actual),
"%s; %.800s",
p, q->q_user);
}
@@ -1206,7 +1214,7 @@ errbody(mci, e, separator)
if (q->q_finalrcpt != NULL)
{
- (void) sm_snprintf(buf, sizeof buf,
+ (void) sm_snprintf(buf, sizeof(buf),
"Final-Recipient: %s",
q->q_finalrcpt);
if (!putline(buf, mci))
@@ -1216,12 +1224,10 @@ errbody(mci, e, separator)
/* X-Actual-Recipient: -- the real problem address */
if (actual[0] != '\0' &&
q->q_finalrcpt != NULL &&
-#if _FFR_PRIV_NOACTUALRECIPIENT
!bitset(PRIV_NOACTUALRECIPIENT, PrivacyFlags) &&
-#endif /* _FFR_PRIV_NOACTUALRECIPIENT */
strcmp(actual, q->q_finalrcpt) != 0)
{
- (void) sm_snprintf(buf, sizeof buf,
+ (void) sm_snprintf(buf, sizeof(buf),
"X-Actual-Recipient: %s",
actual);
if (!putline(buf, mci))
@@ -1229,7 +1235,7 @@ errbody(mci, e, separator)
}
/* Action: -- what happened? */
- (void) sm_strlcpyn(buf, sizeof buf, 2, "Action: ",
+ (void) sm_strlcpyn(buf, sizeof(buf), 2, "Action: ",
action);
if (!putline(buf, mci))
goto writeerr;
@@ -1243,7 +1249,7 @@ errbody(mci, e, separator)
p = "4.0.0";
else
p = "2.0.0";
- (void) sm_strlcpyn(buf, sizeof buf, 2, "Status: ", p);
+ (void) sm_strlcpyn(buf, sizeof(buf), 2, "Status: ", p);
if (!putline(buf, mci))
goto writeerr;
@@ -1253,7 +1259,7 @@ errbody(mci, e, separator)
if (q->q_mailer == NULL ||
(p = q->q_mailer->m_mtatype) == NULL)
p = "dns";
- (void) sm_snprintf(buf, sizeof buf,
+ (void) sm_snprintf(buf, sizeof(buf),
"Remote-MTA: %s; %.800s",
p, q->q_statmta);
p = &buf[strlen(buf) - 1];
@@ -1269,7 +1275,7 @@ errbody(mci, e, separator)
if (q->q_mailer == NULL ||
(p = q->q_mailer->m_diagtype) == NULL)
p = "smtp";
- (void) sm_snprintf(buf, sizeof buf,
+ (void) sm_snprintf(buf, sizeof(buf),
"Diagnostic-Code: %s; %.800s",
p, q->q_rstatus);
if (!putline(buf, mci))
@@ -1279,7 +1285,7 @@ errbody(mci, e, separator)
/* Last-Attempt-Date: -- fine granularity */
if (q->q_statdate == (time_t) 0L)
q->q_statdate = curtime();
- (void) sm_strlcpyn(buf, sizeof buf, 2,
+ (void) sm_strlcpyn(buf, sizeof(buf), 2,
"Last-Attempt-Date: ",
arpadate(ctime(&q->q_statdate)));
if (!putline(buf, mci))
@@ -1292,7 +1298,7 @@ errbody(mci, e, separator)
xdate = e->e_parent->e_ctime +
TimeOuts.to_q_return[e->e_parent->e_timeoutclass];
- (void) sm_strlcpyn(buf, sizeof buf, 2,
+ (void) sm_strlcpyn(buf, sizeof(buf), 2,
"Will-Retry-Until: ",
arpadate(ctime(&xdate)));
if (!putline(buf, mci))
@@ -1326,12 +1332,12 @@ errbody(mci, e, separator)
}
else
{
- (void) sm_strlcpyn(buf, sizeof buf, 2, "--",
+ (void) sm_strlcpyn(buf, sizeof(buf), 2, "--",
e->e_msgboundary);
if (!putline(buf, mci))
goto writeerr;
- (void) sm_strlcpyn(buf, sizeof buf, 2, "Content-Type: ",
+ (void) sm_strlcpyn(buf, sizeof(buf), 2, "Content-Type: ",
sendbody ? "message/rfc822"
: "text/rfc822-headers");
if (!putline(buf, mci))
@@ -1346,7 +1352,7 @@ errbody(mci, e, separator)
p = "8bit";
if (p != NULL)
{
- (void) sm_snprintf(buf, sizeof buf,
+ (void) sm_snprintf(buf, sizeof(buf),
"Content-Transfer-Encoding: %s",
p);
if (!putline(buf, mci))
@@ -1383,7 +1389,7 @@ errbody(mci, e, separator)
if (e->e_msgboundary != NULL)
{
- (void) sm_strlcpyn(buf, sizeof buf, 3, "--", e->e_msgboundary,
+ (void) sm_strlcpyn(buf, sizeof(buf), 3, "--", e->e_msgboundary,
"--");
if (!putline("", mci) || !putline(buf, mci))
goto writeerr;
@@ -1727,9 +1733,9 @@ pruneroute(addr)
/* slice off the angle brackets */
i = strlen(at + 1);
- if (i >= sizeof hostbuf)
+ if (i >= sizeof(hostbuf))
return false;
- (void) sm_strlcpy(hostbuf, at + 1, sizeof hostbuf);
+ (void) sm_strlcpy(hostbuf, at + 1, sizeof(hostbuf));
hostbuf[i - 1] = '\0';
while (start != NULL)
@@ -1745,8 +1751,8 @@ pruneroute(addr)
*start = '\0';
comma = strrchr(addr, ',');
if (comma != NULL && comma[1] == '@' &&
- strlen(comma + 2) < sizeof hostbuf)
- (void) sm_strlcpy(hostbuf, comma + 2, sizeof hostbuf);
+ strlen(comma + 2) < sizeof(hostbuf))
+ (void) sm_strlcpy(hostbuf, comma + 2, sizeof(hostbuf));
else
comma = NULL;
*start = c;
OpenPOWER on IntegriCloud