--- sendmail/daemon.c 2008-11-13 16:32:52.000000000 +0100 +++ sendmail/daemon.c 2008-11-13 16:29:48.000000000 +0100 @@ -102,6 +102,10 @@ static int NDaemons = 0; /* actual number of daemons */ +#ifdef ACCEPTFILTER +int HaveAcceptFilter = 0; /* have accept filter */ +#endif /* ACCEPTFILTER */ + static time_t NextDiskSpaceCheck = 0; /* @@ -1046,6 +1050,9 @@ { int on = 1; int fdflags; +#ifdef ACCEPTFILTER + struct accept_filter_arg afa; +#endif /* ACCEPTFILTER */ SOCKADDR_LEN_T socksize = 0; int ntries = 0; int save_errno; @@ -1216,6 +1223,21 @@ (void) close(d->d_socket); goto severe; } +#ifdef ACCEPTFILTER + if (!firsttime) { + errno = 0; + bzero(&afa, sizeof(afa)); + strcpy(afa.af_name, "smtp prefilter"); + strcpy(afa.af_arg, ""); + if (setsockopt(d->d_socket, SOL_SOCKET, SO_ACCEPTFILTER, &afa, sizeof(afa)) < 0) + sm_syslog(LOG_ALERT, NOQID, "daemon %s: failed to set accept filter, error %s", + d->d_name, strerror(errno)); + else { + HaveAcceptFilter = 1; + sm_syslog(LOG_ALERT, NOQID, "daemon %s: accept filter %s ready", d->d_name, afa.af_name); + } + } +#endif /* ACCEPTFILTER */ return socksize; } while (ntries++ < MAXOPENTRIES && transienterror(save_errno)); syserr("!opendaemonsocket: daemon %s: server SMTP socket wedged: exiting", --- sendmail/srvrsmtp.c 2008-11-13 16:32:52.000000000 +0100 +++ sendmail/srvrsmtp.c 2008-11-13 16:28:40.000000000 +0100 @@ -108,6 +108,10 @@ extern ENVELOPE BlankEnvelope; +#ifdef ACCEPTFILTER +extern int HaveAcceptFilter; +#endif /* ACCEPTFILTER */ + #define NBADRCPTS \ do \ { \ @@ -1115,30 +1119,36 @@ id = strchr(inp, ' '); if (id == NULL) id = &inp[strlen(inp)]; - if (p == NULL) - (void) sm_snprintf(cmdbuf, sizeof(cmdbuf), - "%s %%.*s ESMTP%%s", greetcode); - else - (void) sm_snprintf(cmdbuf, sizeof(cmdbuf), - "%s-%%.*s ESMTP%%s", greetcode); - message(cmdbuf, (int) (id - inp), inp, id); +#ifdef ACCEPTFILTER + if (! HaveAcceptFilter) { +#endif /* ACCEPTFILTER */ + if (p == NULL) + (void) sm_snprintf(cmdbuf, sizeof(cmdbuf), + "%s %%.*s ESMTP%%s", greetcode); + else + (void) sm_snprintf(cmdbuf, sizeof(cmdbuf), + "%s-%%.*s ESMTP%%s", greetcode); + message(cmdbuf, (int) (id - inp), inp, id); - /* output remaining lines */ - while ((id = p) != NULL && (p = strchr(id, '\n')) != NULL) - { - *p++ = '\0'; - if (isascii(*id) && isspace(*id)) - id++; - (void) sm_strlcpyn(cmdbuf, sizeof(cmdbuf), 2, greetcode, "-%s"); - message(cmdbuf, id); - } - if (id != NULL) - { - if (isascii(*id) && isspace(*id)) - id++; - (void) sm_strlcpyn(cmdbuf, sizeof(cmdbuf), 2, greetcode, " %s"); - message(cmdbuf, id); + /* output remaining lines */ + while ((id = p) != NULL && (p = strchr(id, '\n')) != NULL) + { + *p++ = '\0'; + if (isascii(*id) && isspace(*id)) + id++; + (void) sm_strlcpyn(cmdbuf, sizeof(cmdbuf), 2, greetcode, "-%s"); + message(cmdbuf, id); + } + if (id != NULL) + { + if (isascii(*id) && isspace(*id)) + id++; + (void) sm_strlcpyn(cmdbuf, sizeof(cmdbuf), 2, greetcode, " %s"); + message(cmdbuf, id); + } +#ifdef ACCEPTFILTER } +#endif /* ACCEPTFILTER */ protocol = NULL; sendinghost = macvalue('s', e);