Mercurial > dovecot > core-2.2
changeset 10158:1bc88aa1373f HEAD
Added net_connect_unix_with_retries().
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Thu, 22 Oct 2009 22:25:08 -0400 |
parents | faf2339212b8 |
children | e027503ddb6b |
files | src/lib/network.c src/lib/network.h |
diffstat | 2 files changed, 25 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib/network.c Thu Oct 22 22:12:56 2009 -0400 +++ b/src/lib/network.c Thu Oct 22 22:25:08 2009 -0400 @@ -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 @@ 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)
--- a/src/lib/network.h Thu Oct 22 22:12:56 2009 -0400 +++ b/src/lib/network.h Thu Oct 22 22:25:08 2009 -0400 @@ -49,6 +49,9 @@ 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);