summaryrefslogtreecommitdiffstats
path: root/contrib/sendmail/libmilter/listener.c
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/sendmail/libmilter/listener.c')
-rw-r--r--contrib/sendmail/libmilter/listener.c59
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)
OpenPOWER on IntegriCloud