]> source.dussan.org Git - rspamd.git/commitdiff
* Fix multiply accept issues
authorVsevolod Stakhov <vsevolod@rambler-co.ru>
Tue, 24 Mar 2009 17:19:22 +0000 (20:19 +0300)
committerVsevolod Stakhov <vsevolod@rambler-co.ru>
Tue, 24 Mar 2009 17:19:22 +0000 (20:19 +0300)
src/util.c
src/worker.c

index c4e85294aff8654394f73dbe953782b305b28277..1fdd2758ad12d819dd68a1d329b4c9abe1135842 100644 (file)
@@ -43,7 +43,7 @@ make_socket_nonblocking (int fd)
 int
 make_tcp_socket (struct in_addr *addr, u_short port, gboolean is_server)
 {
-       int fd, r, optlen, s_error;
+       int fd, r, optlen, on = 1, s_error;
        int serrno;
        struct sockaddr_in sin;
        
@@ -70,6 +70,7 @@ make_tcp_socket (struct in_addr *addr, u_short port, gboolean is_server)
        sin.sin_addr.s_addr = addr->s_addr;
        
        if (is_server) {
+               setsockopt (fd, SOL_SOCKET, SO_REUSEADDR, (const void *) &on, sizeof(int));
                r = bind (fd, (struct sockaddr *)&sin, sizeof (struct sockaddr_in));
        }
        else {
@@ -109,6 +110,9 @@ accept_from_socket (int listen_sock, struct sockaddr *addr, socklen_t *len)
        int serrno;
 
        if ((nfd = accept (listen_sock, addr, len)) == -1) {
+               if (errno == EAGAIN) {
+                       return 0;       
+               }
                msg_warn ("accept_from_socket: accept failed: %d, '%s'", errno, strerror (errno));
                return -1;
        }
@@ -122,6 +126,8 @@ accept_from_socket (int listen_sock, struct sockaddr *addr, socklen_t *len)
                goto out;
        }
 
+
+
        return (nfd);
 
  out:
@@ -136,7 +142,7 @@ int
 make_unix_socket (const char *path, struct sockaddr_un *addr, gboolean is_server)
 {
        size_t len = strlen (path);
-       int fd, s_error, r, optlen, serrno;
+       int fd, s_error, r, optlen, serrno, on = 1;
 
        if (len > sizeof (addr->sun_path) - 1) return -1;
        
@@ -165,6 +171,7 @@ make_unix_socket (const char *path, struct sockaddr_un *addr, gboolean is_server
                goto out;
        }
        if (is_server) {
+               setsockopt (fd, SOL_SOCKET, SO_REUSEADDR, (const void *) &on, sizeof(int));
                r = bind (fd, (struct sockaddr *)&sin, sizeof (struct sockaddr_in));
        }
        else {
index 4d6c2bacc0c9b79ede0ab9eb594bd585e5637c40..bf5dfa1591657cea75d466afc9f3b4b5104e4e39 100644 (file)
@@ -232,6 +232,11 @@ accept_socket (int fd, short what, void *arg)
                msg_warn ("accept_socket: accept failed: %s", strerror (errno));
                return;
        }
+       /* Check for EAGAIN */
+       if (nfd == 0) {
+               msg_debug ("accept_socket: cannot accept socket as it was already accepted by other worker");
+               return;
+       }
 
     if (ss.ss_family == AF_UNIX) {
         msg_info ("accept_socket: accepted connection from unix socket");