]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
Added net_connect_unix_with_retries().
authorTimo Sirainen <tss@iki.fi>
Fri, 23 Oct 2009 02:25:08 +0000 (22:25 -0400)
committerTimo Sirainen <tss@iki.fi>
Fri, 23 Oct 2009 02:25:08 +0000 (22:25 -0400)
--HG--
branch : HEAD

src/lib/network.c
src/lib/network.h

index cb31049de0a69290278ee39acda4727736a52128..15d3ec058124d65e112f6218e339080f82ab9cca 100644 (file)
@@ -3,6 +3,7 @@
 #include "lib.h"
 #include "close-keep-errno.h"
 #include "fd-set-nonblock.h"
+#include "time-util.h"
 #include "network.h"
 
 #include <stdlib.h>
@@ -249,6 +250,27 @@ int net_connect_unix(const char *path)
        return fd;
 }
 
+int net_connect_unix_with_retries(const char *path, unsigned int msecs)
+{
+       struct timeval start, now;
+       int fd;
+
+       if (gettimeofday(&start, NULL) < 0)
+               i_panic("gettimeofday() failed: %m");
+
+       do {
+               fd = net_connect_unix(path);
+               if (fd != -1 || (errno != EAGAIN && errno != ECONNREFUSED))
+                       break;
+
+               /* busy. wait for a while. */
+               usleep(((rand() % 10) + 1) * 10000);
+               if (gettimeofday(&now, NULL) < 0)
+                       i_panic("gettimeofday() failed: %m");
+       } while (timeval_diff_msecs(&now, &start) < (int)msecs);
+       return fd;
+}
+
 void net_disconnect(int fd)
 {
        if (close(fd) < 0)
index 916f49c569e75deff49ea1f192c130389dd21374..4cb6abdecdf51bb4b2884a0300197a3bc831ab32 100644 (file)
@@ -49,6 +49,9 @@ int net_connect_ip(const struct ip_addr *ip, unsigned int port,
                   const struct ip_addr *my_ip);
 /* Connect to named UNIX socket */
 int net_connect_unix(const char *path);
+/* Try to connect to UNIX socket for give number of seconds when connect()
+   returns EAGAIN or ECONNREFUSED. */
+int net_connect_unix_with_retries(const char *path, unsigned int msecs);
 /* Disconnect socket */
 void net_disconnect(int fd);