dovecot-2.2: lib: Added net_listen_full() with a flag to set SO_...
dovecot at dovecot.org
dovecot at dovecot.org
Mon Sep 23 09:45:23 EEST 2013
details: http://hg.dovecot.org/dovecot-2.2/rev/6a814345f16c
changeset: 16822:6a814345f16c
user: Timo Sirainen <tss at iki.fi>
date: Mon Sep 23 04:06:08 2013 +0300
description:
lib: Added net_listen_full() with a flag to set SO_REUSEPORT on the socket if available.
diffstat:
src/lib/net.c | 16 ++++++++++++++++
src/lib/net.h | 8 ++++++++
2 files changed, 24 insertions(+), 0 deletions(-)
diffs (58 lines):
diff -r 1a5d92b8d3d5 -r 6a814345f16c src/lib/net.c
--- a/src/lib/net.c Sun Sep 22 07:43:31 2013 +0300
+++ b/src/lib/net.c Mon Sep 23 04:06:08 2013 +0300
@@ -384,6 +384,14 @@
int net_listen(const struct ip_addr *my_ip, unsigned int *port, int backlog)
{
+ enum net_listen_flags flags = 0;
+
+ return net_listen_full(my_ip, port, &flags, backlog);
+}
+
+int net_listen_full(const struct ip_addr *my_ip, unsigned int *port,
+ enum net_listen_flags *flags, int backlog)
+{
union sockaddr_union so;
int ret, fd, opt = 1;
socklen_t len;
@@ -413,6 +421,14 @@
setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, &opt, sizeof(opt));
+ if ((*flags & NET_LISTEN_FLAG_REUSEPORT) != 0) {
+#ifdef SO_REUSEPORT
+ if (setsockopt(fd, SOL_SOCKET, SO_REUSEPORT,
+ &opt, sizeof(opt)) < 0)
+#endif
+ *flags &= ~NET_LISTEN_FLAG_REUSEPORT;
+ }
+
/* If using IPv6, bind only to IPv6 if possible. This avoids
ambiguities with IPv4-mapped IPv6 addresses. */
#ifdef IPV6_V6ONLY
diff -r 1a5d92b8d3d5 -r 6a814345f16c src/lib/net.h
--- a/src/lib/net.h Sun Sep 22 07:43:31 2013 +0300
+++ b/src/lib/net.h Mon Sep 23 04:06:08 2013 +0300
@@ -55,6 +55,12 @@
#define IPADDR_IS_V6(ip) ((ip)->family == AF_INET6)
#define IPADDR_BITS(ip) (IPADDR_IS_V4(ip) ? 32 : 128)
+enum net_listen_flags {
+ /* Try to use SO_REUSEPORT if available. If it's not, this flag is
+ cleared on return. */
+ NET_LISTEN_FLAG_REUSEPORT = 0x01
+};
+
/* Returns TRUE if IPs are the same */
bool net_ip_compare(const struct ip_addr *ip1, const struct ip_addr *ip2);
/* Returns 0 if IPs are the same, -1 or 1 otherwise. */
@@ -91,6 +97,8 @@
/* Listen for connections on a socket */
int net_listen(const struct ip_addr *my_ip, unsigned int *port, int backlog);
+int net_listen_full(const struct ip_addr *my_ip, unsigned int *port,
+ enum net_listen_flags *flags, int backlog);
/* Listen for connections on an UNIX socket */
int net_listen_unix(const char *path, int backlog);
/* Like net_listen_unix(), but if socket already exists, try to connect to it.
More information about the dovecot-cvs
mailing list