dovecot-2.2: lib: Added support for connecting UDP sockets.

dovecot at dovecot.org dovecot at dovecot.org
Sat Oct 4 14:48:32 UTC 2014


details:   http://hg.dovecot.org/dovecot-2.2/rev/95ac50948e39
changeset: 17883:95ac50948e39
user:      Stephan Bosch <stephan at rename-it.nl>
date:      Sat Oct 04 17:48:03 2014 +0300
description:
lib: Added support for connecting UDP sockets.

diffstat:

 src/lib/net.c |  17 ++++++++++++-----
 src/lib/net.h |   5 ++++-
 2 files changed, 16 insertions(+), 6 deletions(-)

diffs (74 lines):

diff -r 77c4b78a4fa2 -r 95ac50948e39 src/lib/net.c
--- a/src/lib/net.c	Sat Oct 04 17:32:48 2014 +0300
+++ b/src/lib/net.c	Sat Oct 04 17:48:03 2014 +0300
@@ -182,7 +182,7 @@
 #endif
 
 static int net_connect_ip_full(const struct ip_addr *ip, unsigned int port,
-			       const struct ip_addr *my_ip, bool blocking)
+			       const struct ip_addr *my_ip, int sock_type, bool blocking)
 {
 	union sockaddr_union so;
 	int fd, ret, opt = 1;
@@ -195,7 +195,7 @@
 	/* create the socket */
 	memset(&so, 0, sizeof(so));
         so.sin.sin_family = ip->family;
-	fd = socket(ip->family, SOCK_STREAM, 0);
+	fd = socket(ip->family, sock_type, 0);
 
 	if (fd == -1) {
 		i_error("socket() failed: %m");
@@ -204,7 +204,8 @@
 
 	/* set socket options */
 	(void)setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
-	(void)setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, &opt, sizeof(opt));
+	if (sock_type == SOCK_STREAM)
+		(void)setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, &opt, sizeof(opt));
 	if (!blocking)
 		net_set_nonblock(fd, TRUE);
 
@@ -242,13 +243,19 @@
 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);
+	return net_connect_ip_full(ip, port, my_ip, SOCK_STREAM, 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);
+	return net_connect_ip_full(ip, port, my_ip, SOCK_STREAM, TRUE);
+}
+
+int net_connect_udp(const struct ip_addr *ip, unsigned int port,
+			       const struct ip_addr *my_ip)
+{
+	return net_connect_ip_full(ip, port, my_ip, SOCK_DGRAM, FALSE);
 }
 
 int net_try_bind(const struct ip_addr *ip)
diff -r 77c4b78a4fa2 -r 95ac50948e39 src/lib/net.h
--- a/src/lib/net.h	Sat Oct 04 17:32:48 2014 +0300
+++ b/src/lib/net.h	Sat Oct 04 17:48:03 2014 +0300
@@ -67,13 +67,16 @@
 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. The socket and connect() is
+/* Connect to TCP 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) ATTR_NULL(3);
 /* 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) ATTR_NULL(3);
+/* Like net_connect_ip(), but open a UDP socket. */ 
+int net_connect_udp(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 */


More information about the dovecot-cvs mailing list