diff options
author | gshapiro <gshapiro@FreeBSD.org> | 2004-08-01 01:04:57 +0000 |
---|---|---|
committer | gshapiro <gshapiro@FreeBSD.org> | 2004-08-01 01:04:57 +0000 |
commit | 1fc446a819a244515d9461fa50d34ee191414d6f (patch) | |
tree | f6477ae85b00ee6d58b086b0d1d597dd9a403391 /contrib/sendmail/libmilter/listener.c | |
parent | 238623a0204c90e8d61dbde7b3b499a5036f2e5d (diff) | |
download | FreeBSD-src-1fc446a819a244515d9461fa50d34ee191414d6f.zip FreeBSD-src-1fc446a819a244515d9461fa50d34ee191414d6f.tar.gz |
Import sendmail 8.13.1
Diffstat (limited to 'contrib/sendmail/libmilter/listener.c')
-rw-r--r-- | contrib/sendmail/libmilter/listener.c | 59 |
1 files changed, 48 insertions, 11 deletions
diff --git a/contrib/sendmail/libmilter/listener.c b/contrib/sendmail/libmilter/listener.c index bb7a297..ee88f23 100644 --- a/contrib/sendmail/libmilter/listener.c +++ b/contrib/sendmail/libmilter/listener.c @@ -9,7 +9,7 @@ */ #include <sm/gen.h> -SM_RCSID("@(#)$Id: listener.c,v 8.85.2.17 2003/10/21 17:22:57 ca Exp $") +SM_RCSID("@(#)$Id: listener.c,v 8.109 2004/02/04 22:55:59 ca Exp $") /* ** listener.c -- threaded network listener @@ -41,7 +41,7 @@ static socket_t mi_milteropen __P((char *, int, bool, char *)); ** backlog -- listen backlog ** dbg -- debug level ** rmsocket -- if true, try to unlink() the socket first -** (UNIX domain sockets only) +** (UNIX domain sockets only) ** smfi -- filter structure to use ** ** Return value: @@ -79,7 +79,7 @@ mi_opensocket(conn, backlog, dbg, rmsocket, smfi) (void) smutex_unlock(&L_Mutex); return MI_FAILURE; } -#if !_FFR_USE_POLL +#if !SM_CONF_POLL if (!SM_FD_OK_SELECT(listenfd)) { smi_log(SMI_LOG_ERR, "%s: fd %d is larger than FD_SETSIZE %d", @@ -87,7 +87,7 @@ mi_opensocket(conn, backlog, dbg, rmsocket, smfi) (void) smutex_unlock(&L_Mutex); return MI_FAILURE; } -#endif /* !_FFR_USE_POLL */ +#endif /* !SM_CONF_POLL */ return MI_SUCCESS; } @@ -585,9 +585,7 @@ mi_closener() struct stat fileinfo; removable = sockpath != NULL && -#if _FFR_MILTER_ROOT_UNSAFE geteuid() != 0 && -#endif /* _FFR_MILTER_ROOT_UNSAFE */ fstat(listenfd, &sockinfo) == 0 && (S_ISFIFO(sockinfo.st_mode) # ifdef S_ISSOCK @@ -635,8 +633,6 @@ mi_closener() ** Parameters: ** conn -- connection description ** dbg -- debug level -** rmsocket -- if true, try to unlink() the socket first -** (UNIX domain sockets only) ** smfi -- filter structure to use ** timeout -- timeout for reads/writes ** backlog -- listen queue backlog size @@ -704,6 +700,9 @@ mi_listener(conn, dbg, smfi, timeout, backlog) int backlog; { socket_t connfd = INVALID_SOCKET; +#if _FFR_DUP_FD + socket_t dupfd = INVALID_SOCKET; +#endif /* _FFR_DUP_FD */ int sockopt = 1; int r, mistop; int ret = MI_SUCCESS; @@ -802,7 +801,7 @@ mi_listener(conn, dbg, smfi, timeout, backlog) save_errno = EINVAL; } -#if !_FFR_USE_POLL +#if !SM_CONF_POLL /* check if acceptable for select() */ if (ValidSocket(connfd) && !SM_FD_OK_SELECT(connfd)) { @@ -810,11 +809,36 @@ mi_listener(conn, dbg, smfi, timeout, backlog) connfd = INVALID_SOCKET; save_errno = ERANGE; } -#endif /* !_FFR_USE_POLL */ +#endif /* !SM_CONF_POLL */ if (!ValidSocket(connfd)) { - if (save_errno == EINTR) + if (save_errno == EINTR +#ifdef EAGAIN + || save_errno == EAGAIN +#endif /* EAGAIN */ +#ifdef ECONNABORTED + || save_errno == ECONNABORTED +#endif /* ECONNABORTED */ +#ifdef EMFILE + || save_errno == EMFILE +#endif /* EMFILE */ +#ifdef ENFILE + || save_errno == ENFILE +#endif /* ENFILE */ +#ifdef ENOBUFS + || save_errno == ENOBUFS +#endif /* ENOBUFS */ +#ifdef ENOMEM + || save_errno == ENOMEM +#endif /* ENOMEM */ +#ifdef ENOSR + || save_errno == ENOSR +#endif /* ENOSR */ +#ifdef EWOULDBLOCK + || save_errno == EWOULDBLOCK +#endif /* EWOULDBLOCK */ + ) continue; acnt++; smi_log(SMI_LOG_ERR, @@ -830,6 +854,19 @@ mi_listener(conn, dbg, smfi, timeout, backlog) continue; } acnt = 0; /* reset error counter for accept() */ +#if _FFR_DUP_FD + dupfd = fcntl(connfd, F_DUPFD, 256); + if (ValidSocket(dupfd) +# if !SM_CONF_POLL + && SM_FD_OK_SELECT(dupfd) +# endif /* !SM_CONF_POLL */ + ) + { + close(connfd); + connfd = dupfd; + dupfd = INVALID_SOCKET; + } +#endif /* _FFR_DUP_FD */ if (setsockopt(connfd, SOL_SOCKET, SO_KEEPALIVE, (void *) &sockopt, sizeof sockopt) < 0) |