From: Timo Sirainen Date: Sun, 11 Jul 2010 23:32:30 +0000 (+0100) Subject: liblib: Added net_connect_ip_blocking(). X-Git-Tag: 2.0.rc3~82 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=f32c17d10a8cab77dedcae10b7332e56e733fb94;p=thirdparty%2Fdovecot%2Fcore.git liblib: Added net_connect_ip_blocking(). --- diff --git a/src/lib/network.c b/src/lib/network.c index af3da1e96f..abaa8c9bfc 100644 --- a/src/lib/network.c +++ b/src/lib/network.c @@ -163,8 +163,8 @@ int net_connect_ip(const struct ip_addr *ip, unsigned int port, static #endif -int net_connect_ip(const struct ip_addr *ip, unsigned int port, - const struct ip_addr *my_ip) +static int net_connect_ip_full(const struct ip_addr *ip, unsigned int port, + const struct ip_addr *my_ip, bool blocking) { union sockaddr_union so; int fd, ret, opt = 1; @@ -187,7 +187,8 @@ int net_connect_ip(const struct ip_addr *ip, unsigned int port, /* set socket options */ setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)); setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, &opt, sizeof(opt)); - net_set_nonblock(fd, TRUE); + if (!blocking) + net_set_nonblock(fd, TRUE); /* set our own address */ if (my_ip != NULL) { @@ -217,6 +218,18 @@ int net_connect_ip(const struct ip_addr *ip, unsigned int port, return fd; } +int net_connect_ip(const struct ip_addr *ip, unsigned int port, + const struct ip_addr *my_ip) +{ + return net_connect_ip_full(ip, port, my_ip, FALSE); +} + +int net_connect_ip_blocking(const struct ip_addr *ip, unsigned int port, + const struct ip_addr *my_ip) +{ + return net_connect_ip_full(ip, port, my_ip, TRUE); +} + int net_try_bind(const struct ip_addr *ip) { union sockaddr_union so; diff --git a/src/lib/network.h b/src/lib/network.h index 6ddd9fde86..b0f2ac01f6 100644 --- a/src/lib/network.h +++ b/src/lib/network.h @@ -47,9 +47,13 @@ bool net_ip_compare(const struct ip_addr *ip1, const struct ip_addr *ip2); int net_ip_cmp(const struct ip_addr *ip1, const struct ip_addr *ip2); unsigned int net_ip_hash(const struct ip_addr *ip); -/* Connect to socket with ip address */ +/* Connect to socket with ip address. The socket and connect() is + non-blocking. */ int net_connect_ip(const struct ip_addr *ip, unsigned int port, const struct ip_addr *my_ip); +/* Like net_connect_ip(), but do a blocking connect(). */ +int net_connect_ip_blocking(const struct ip_addr *ip, unsigned int port, + const struct ip_addr *my_ip); /* Returns 0 if we can bind() as given IP, -1 if not. */ int net_try_bind(const struct ip_addr *ip); /* Connect to named UNIX socket */