diff options
Diffstat (limited to 'contrib/sendmail/src/daemon.c')
-rw-r--r-- | contrib/sendmail/src/daemon.c | 92 |
1 files changed, 78 insertions, 14 deletions
diff --git a/contrib/sendmail/src/daemon.c b/contrib/sendmail/src/daemon.c index 0077e92..69a5f61 100644 --- a/contrib/sendmail/src/daemon.c +++ b/contrib/sendmail/src/daemon.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1998-2004 Sendmail, Inc. and its suppliers. + * Copyright (c) 1998-2005 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 <sendmail.h> -SM_RCSID("@(#)$Id: daemon.c,v 8.653 2004/11/18 23:45:01 ca Exp $") +SM_RCSID("@(#)$Id: daemon.c,v 8.658 2005/02/02 18:19:28 ca Exp $") #if defined(SOCK_STREAM) || defined(__GNU_LIBRARY__) # define USE_SOCK_STREAM 1 @@ -77,10 +77,22 @@ struct daemon char *d_inputfilterlist; struct milter *d_inputfilters[MAXFILTERS]; #endif /* MILTER */ +#if _FFR_SS_PER_DAEMON + int d_supersafe; +#endif /* _FFR_SS_PER_DAEMON */ +#if _FFR_DM_PER_DAEMON + int d_dm; /* DeliveryMode */ +#endif /* _FFR_DM_PER_DAEMON */ }; typedef struct daemon DAEMON_T; +#define SAFE_NOTSET (-1) /* SuperSafe (per daemon) option not set */ +/* see also sendmail.h: SuperSafe values */ + +#define DM_NOTSET (-1) /* DeliveryMode (per daemon) option not set */ +/* see also sendmail.h: values for e_sendmode -- send modes */ + static void connecttimeout __P((int)); static int opendaemonsocket __P((DAEMON_T *, bool)); static unsigned short setupdaemon __P((SOCKADDR *)); @@ -742,6 +754,17 @@ getrequests(e) /* don't schedule queue runs if ETRN */ QueueIntvl = 0; +#if _FFR_SS_PER_DAEMON + if (Daemons[curdaemon].d_supersafe != + SAFE_NOTSET) + SuperSafe = Daemons[curdaemon].d_supersafe; +#endif /* _FFR_SS_PER_DAEMON */ +#if _FFR_DM_PER_DAEMON + if (Daemons[curdaemon].d_dm != DM_NOTSET) + set_delivery_mode( + Daemons[curdaemon].d_dm, e); +#endif /* _FFR_DM_PER_DAEMON */ + sm_setproctitle(true, e, "startup with %s", anynet_ntoa(&RealHostAddr)); @@ -1453,9 +1476,37 @@ setsockaddroptions(p, d) continue; if (isascii(*f) && islower(*f)) *f = toupper(*f); +#if _FFR_SS_PER_DAEMON + d->d_supersafe = SAFE_NOTSET; +#endif /* _FFR_SS_PER_DAEMON */ +#if _FFR_DM_PER_DAEMON + d->d_dm = DM_NOTSET; +#endif /* _FFR_DM_PER_DAEMON */ switch (*f) { + case 'A': /* address */ + addr = v; + break; + +#if _FFR_DM_PER_DAEMON + case 'D': /* DeliveryMode */ + switch (*v) + { + case SM_QUEUE: + case SM_DEFER: + case SM_DELIVER: + case SM_FORK: + d->d_dm = *v; + break; + default: + syserr("554 5.3.5 Unknown delivery mode %c", + *v); + break; + } + break; +#endif /* _FFR_DM_PER_DAEMON */ + case 'F': /* address family */ if (isascii(*v) && isdigit(*v)) d->d_addr.sa.sa_family = atoi(v); @@ -1491,20 +1542,12 @@ setsockaddroptions(p, d) v); break; - case 'A': /* address */ - addr = v; - break; - #if MILTER case 'I': d->d_inputfilterlist = v; break; #endif /* MILTER */ - case 'P': /* port */ - port = v; - break; - case 'L': /* listen queue size */ d->d_listenqueue = atoi(v); break; @@ -1513,17 +1556,38 @@ setsockaddroptions(p, d) d->d_mflags = getmodifiers(v, d->d_flags); break; - case 'S': /* send buffer size */ - d->d_tcpsndbufsize = atoi(v); + case 'N': /* name */ + d->d_name = v; + break; + + case 'P': /* port */ + port = v; break; case 'R': /* receive buffer size */ d->d_tcprcvbufsize = atoi(v); break; - case 'N': /* name */ - d->d_name = v; + case 'S': /* send buffer size */ + d->d_tcpsndbufsize = atoi(v); + break; + +#if _FFR_SS_PER_DAEMON + case 'T': /* SuperSafe */ + if (tolower(*v) == 'i') + d->d_supersafe = SAFE_INTERACTIVE; + else if (tolower(*v) == 'p') +# if MILTER + d->d_supersafe = SAFE_REALLY_POSTMILTER; +# else /* MILTER */ + (void) sm_io_fprintf(smioout, SM_TIME_DEFAULT, + "Warning: SuperSafe=PostMilter requires Milter support (-DMILTER)\n"); +# endif /* MILTER */ + else + d->d_supersafe = atobool(v) ? SAFE_REALLY + : SAFE_NO; break; +#endif /* _FFR_SS_PER_DAEMON */ default: syserr("554 5.3.5 PortOptions parameter \"%s\" unknown", |