INN commit: trunk (7 files)

INN Commit rra at isc.org
Wed Apr 13 20:00:05 UTC 2016


    Date: Wednesday, April 13, 2016 @ 13:00:04
  Author: iulius
Revision: 10005

Update to latest rra-c-util upstream version

As network_set_freebind, network_set_reuseaddr, and network_set_v6only
are now public functions, they can be removed from our local network-innbind.c
file.

Modified:
  trunk/include/inn/network.h
  trunk/lib/network-innbind.c
  trunk/lib/network.c
  trunk/lib/vector.c
  trunk/support/getrra-c-util
  trunk/tests/lib/network/addr-ipv4-t.c
  trunk/tests/lib/network/addr-ipv6-t.c

---------------------------------+
 include/inn/network.h           |   18 ++++++++++
 lib/network-innbind.c           |   64 --------------------------------------
 lib/network.c                   |   39 +++++++----------------
 lib/vector.c                    |   12 +------
 support/getrra-c-util           |   10 ++---
 tests/lib/network/addr-ipv4-t.c |   24 ++++++++++++--
 tests/lib/network/addr-ipv6-t.c |   45 ++++++++++++++++++++++++--
 7 files changed, 100 insertions(+), 112 deletions(-)

Modified: include/inn/network.h
===================================================================
--- include/inn/network.h	2016-04-13 19:57:22 UTC (rev 10004)
+++ include/inn/network.h	2016-04-13 20:00:04 UTC (rev 10005)
@@ -6,7 +6,7 @@
  * which can be found at <http://www.eyrie.org/~eagle/software/rra-c-util/>.
  *
  * Written by Russ Allbery <eagle at eyrie.org>
- * Copyright 2014 Russ Allbery <eagle at eyrie.org>
+ * Copyright 2014, 2016 Russ Allbery <eagle at eyrie.org>
  * Copyright 2009, 2010, 2011, 2012, 2013
  *     The Board of Trustees of the Leland Stanford Junior University
  * Copyright (c) 2004, 2005, 2006, 2007, 2008, 2010
@@ -125,6 +125,22 @@
 socket_type network_client_create(int domain, int type, const char *source);
 
 /*
+ * Set various socket flags if possible, but do nothing, silently, if that
+ * option is not supported.  If the option is supported but setting the flag
+ * fails, log a warning with syswarn.
+ *
+ * network_set_freebind sets IP_FREEBIND, which allows binding IPv6 addresses
+ * that may not have been set up yet.  network_set_reuseaddr sets SO_REUSEADDR
+ * so that something new can listen on the same port immediately if the daemon
+ * dies unexpectedly.  network_set_v6only sets IP_V6ONLY, which avoids binding
+ * to the backward-compatibility IPv4 address when binding an IPv6 socket
+ * (generally preferred since the behavior is more predictable).
+ */
+void network_set_freebind(socket_type fd);
+void network_set_reuseaddr(socket_type fd);
+void network_set_v6only(socket_type fd);
+
+/*
  * Read or write the specified number of bytes to the network, enforcing a
  * timeout.  Both return true on success and false on failure; on failure, the
  * socket errno is set.

Modified: lib/network-innbind.c
===================================================================
--- lib/network-innbind.c	2016-04-13 19:57:22 UTC (rev 10004)
+++ lib/network-innbind.c	2016-04-13 20:00:04 UTC (rev 10005)
@@ -32,72 +32,8 @@
 #include "inn/network-innbind.h"
 #include "inn/xmalloc.h"
 
-/* If SO_REUSEADDR isn't available, make calls to set_reuseaddr go away. */
-#ifndef SO_REUSEADDR
-# define network_set_reuseaddr(fd)      /* empty */
-#endif
 
-/* If IPV6_V6ONLY isn't available, make calls to set_v6only go away. */
-#ifndef IPV6_V6ONLY
-# define network_set_v6only(fd)         /* empty */
-#endif
-
-/* If IP_FREEBIND isn't available, make calls to set_freebind go away. */
-#ifndef IP_FREEBIND
-# define network_set_freebind(fd)       /* empty */
-#endif
-
-
 /*
- * Set SO_REUSEADDR on a socket if possible (so that something new can listen
- * on the same port immediately if the daemon dies unexpectedly).
- */
-#ifdef SO_REUSEADDR
-static void
-network_set_reuseaddr(socket_type fd)
-{
-    int flag = 1;
-    const void *flagaddr = &flag;
-
-    if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, flagaddr, sizeof(flag)) < 0)
-        syswarn("cannot mark bind address reusable");
-}
-#endif
-
-
-/*
- * Set IPV6_V6ONLY on a socket if possible, since the IPv6 behavior is more
- * consistent and easier to understand.
- */
-#ifdef IPV6_V6ONLY
-static void
-network_set_v6only(socket_type fd)
-{
-    int flag = 1;
-
-    if (setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, &flag, sizeof(flag)) < 0)
-        syswarn("cannot set IPv6 socket to v6only");
-}
-#endif
-
-
-/*
- * Set IP_FREEBIND on a socket if possible, which allows binding servers to
- * IPv6 addresses that may not have been set up yet.
- */
-#ifdef IP_FREEBIND
-static void
-network_set_freebind(socket_type fd)
-{
-    int flag = 1;
-
-    if (setsockopt(fd, IPPROTO_IP, IP_FREEBIND, &flag, sizeof(flag)) < 0)
-        syswarn("cannot set IPv6 socket to free binding");
-}
-#endif
-
-
-/*
  * Function used as a die handler in child processes to prevent any atexit
  * functions from being run and any buffers from being flushed twice.
  */

Modified: lib/network.c
===================================================================
--- lib/network.c	2016-04-13 19:57:22 UTC (rev 10004)
+++ lib/network.c	2016-04-13 20:00:04 UTC (rev 10005)
@@ -21,7 +21,7 @@
  * which can be found at <http://www.eyrie.org/~eagle/software/rra-c-util/>.
  *
  * Written by Russ Allbery <eagle at eyrie.org>
- * Copyright 2014, 2015 Russ Allbery <eagle at eyrie.org>
+ * Copyright 2014, 2015, 2016 Russ Allbery <eagle at eyrie.org>
  * Copyright 2009, 2011, 2012, 2013, 2014
  *     The Board of Trustees of the Leland Stanford Junior University
  * Copyright (c) 2004, 2005, 2006, 2007, 2008
@@ -75,21 +75,6 @@
 # define sin6_set_length(s)     /* empty */
 #endif
 
-/* If SO_REUSEADDR isn't available, make calls to set_reuseaddr go away. */
-#ifndef SO_REUSEADDR
-# define network_set_reuseaddr(fd)      /* empty */
-#endif
-
-/* If IPV6_V6ONLY isn't available, make calls to set_v6only go away. */
-#ifndef IPV6_V6ONLY
-# define network_set_v6only(fd)         /* empty */
-#endif
-
-/* If IP_FREEBIND isn't available, make calls to set_freebind go away. */
-#ifndef IP_FREEBIND
-# define network_set_freebind(fd)       /* empty */
-#endif
-
 /*
  * Windows requires a different function when sending to sockets, but can't
  * return short writes on blocking sockets.
@@ -100,21 +85,21 @@
 # define socket_xwrite(fd, b, s)        xwrite((fd), (b), (s))
 #endif
 
+
 /*
  * Set SO_REUSEADDR on a socket if possible (so that something new can listen
  * on the same port immediately if the daemon dies unexpectedly).
  */
-#ifdef SO_REUSEADDR
-static void
+void
 network_set_reuseaddr(socket_type fd)
 {
+#ifdef SO_REUSEADDR
     int flag = 1;
-    const void *flagaddr = &flag;
 
-    if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, flagaddr, sizeof(flag)) < 0)
+    if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &flag, sizeof(flag)) < 0)
         syswarn("cannot mark bind address reusable");
+#endif
 }
-#endif
 
 
 /*
@@ -121,16 +106,16 @@
  * Set IPV6_V6ONLY on a socket if possible, since the IPv6 behavior is more
  * consistent and easier to understand.
  */
-#ifdef IPV6_V6ONLY
-static void
+void
 network_set_v6only(socket_type fd)
 {
+#ifdef IPV6_V6ONLY
     int flag = 1;
 
     if (setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, &flag, sizeof(flag)) < 0)
         syswarn("cannot set IPv6 socket to v6only");
+#endif
 }
-#endif
 
 
 /*
@@ -137,16 +122,16 @@
  * Set IP_FREEBIND on a socket if possible, which allows binding servers to
  * IPv6 addresses that may not have been set up yet.
  */
-#ifdef IP_FREEBIND
-static void
+void
 network_set_freebind(socket_type fd)
 {
+#ifdef IP_FREEBIND
     int flag = 1;
 
     if (setsockopt(fd, IPPROTO_IP, IP_FREEBIND, &flag, sizeof(flag)) < 0)
         syswarn("cannot set IPv6 socket to free binding");
+#endif
 }
-#endif
 
 
 /*

Modified: lib/vector.c
===================================================================
--- lib/vector.c	2016-04-13 19:57:22 UTC (rev 10004)
+++ lib/vector.c	2016-04-13 20:00:04 UTC (rev 10005)
@@ -114,12 +114,10 @@
 void
 vector_add(struct vector *vector, const char *string)
 {
-    size_t next = vector->count;
-
     assert(vector != NULL);
     if (vector->count == vector->allocated)
         vector_resize(vector, vector->allocated + 1);
-    vector->strings[next] = xstrdup(string);
+    vector->strings[vector->count] = xstrdup(string);
     vector->count++;
 }
 
@@ -126,12 +124,10 @@
 void
 cvector_add(struct cvector *vector, const char *string)
 {
-    size_t next = vector->count;
-
     assert(vector != NULL);
     if (vector->count == vector->allocated)
         cvector_resize(vector, vector->allocated + 1);
-    vector->strings[next] = string;
+    vector->strings[vector->count] = string;
     vector->count++;
 }
 
@@ -145,12 +141,10 @@
 void
 vector_addn(struct vector *vector, const char *string, size_t length)
 {
-    size_t next = vector->count;
-
     assert(vector != NULL);
     if (vector->count == vector->allocated)
         vector_resize(vector, vector->allocated + 1);
-    vector->strings[next] = xstrndup(string, length);
+    vector->strings[vector->count] = xstrndup(string, length);
     vector->count++;
 }
 

Modified: support/getrra-c-util
===================================================================
--- support/getrra-c-util	2016-04-13 19:57:22 UTC (rev 10004)
+++ support/getrra-c-util	2016-04-13 20:00:04 UTC (rev 10005)
@@ -63,7 +63,7 @@
         sed -i -e "3 i \\
 # \$Id\$\\
 #" \
-               -e 's/\$BUILD\/util/\$BUILD\/lib/g' \
+               -e 's/\$C_TAP_BUILD\/util/\$C_TAP_BUILD\/lib/g' \
                ${TEMP}
         chmod 755 ${TEMP}
       else
@@ -73,9 +73,9 @@
           # and sourceaddress6 work.
           sed -i -e "61 i \\
 #include \"inn/innconf.h\"" \
-                 -e '470 s/)$/ \&\& innconf == NULL)/' \
-                 -e '471,472d' \
-                 -e "477 i \\
+                 -e '455 s/)$/ \&\& innconf == NULL)/' \
+                 -e '456,457d' \
+                 -e "462 i \\
         if (source == NULL && innconf != NULL)\\
             source = innconf->sourceaddress;\\
         if (source == NULL ||\\
@@ -82,7 +82,7 @@
             strcmp(source, \"all\") == 0 || strcmp(source, \"any\") == 0)\\
               return true;\\
 " \
-                 -e "490 i \\
+                 -e "475 i \\
         if (source == NULL && innconf != NULL)\\
             source = innconf->sourceaddress6;\\
         if (source == NULL ||\\

Modified: tests/lib/network/addr-ipv4-t.c
===================================================================
--- tests/lib/network/addr-ipv4-t.c	2016-04-13 19:57:22 UTC (rev 10004)
+++ tests/lib/network/addr-ipv4-t.c	2016-04-13 20:00:04 UTC (rev 10005)
@@ -6,7 +6,7 @@
  * which can be found at <http://www.eyrie.org/~eagle/software/rra-c-util/>.
  *
  * Written by Russ Allbery <eagle at eyrie.org>
- * Copyright 2005, 2013 Russ Allbery <eagle at eyrie.org>
+ * Copyright 2005, 2013, 2016 Russ Allbery <eagle at eyrie.org>
  * Copyright 2009, 2010, 2011, 2012, 2013
  *     The Board of Trustees of the Leland Stanford Junior University
  *
@@ -58,14 +58,16 @@
 int
 main(void)
 {
-    int status;
+    int flag, status;
+    socklen_t flaglen;
     struct addrinfo *ai, *ai2;
     struct addrinfo hints;
     char addr[INET6_ADDRSTRLEN];
+    socket_type fd;
     static const char *port = "119";
 
     /* Set up the plan. */
-    plan(29);
+    plan(31);
 
     /* Get a sockaddr to use for subsequent tests. */
     memset(&hints, 0, sizeof(hints));
@@ -126,5 +128,21 @@
     is_addr_compare(0, "127.0.0.1", "127.0.0.1",   "1p");
     is_addr_compare(0, "127.0.0.1", "127.0.0.1",   "-1");
     is_addr_compare(0, "127.0.0.1", "127.0.0.1",   "33");
+
+    /* Test setting various socket options. */
+    fd = socket(PF_INET6, SOCK_STREAM, IPPROTO_IP);
+    if (fd == INVALID_SOCKET)
+        sysbail("cannot create socket");
+    network_set_reuseaddr(fd);
+#ifdef SO_REUSEADDR
+    flag = 0;
+    flaglen = sizeof(flag);
+    is_int(0, getsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &flag, &flaglen),
+           "Getting SO_REUSEADDR works");
+    is_int(1, flag, "...and it is set");
+#else
+    skip_block(2, "SO_REUSEADDR not supported");
+#endif
+    close(fd);
     return 0;
 }

Modified: tests/lib/network/addr-ipv6-t.c
===================================================================
--- tests/lib/network/addr-ipv6-t.c	2016-04-13 19:57:22 UTC (rev 10004)
+++ tests/lib/network/addr-ipv6-t.c	2016-04-13 20:00:04 UTC (rev 10005)
@@ -6,7 +6,7 @@
  * which can be found at <http://www.eyrie.org/~eagle/software/rra-c-util/>.
  *
  * Written by Russ Allbery <eagle at eyrie.org>
- * Copyright 2005, 2013 Russ Allbery <eagle at eyrie.org>
+ * Copyright 2005, 2013, 2016 Russ Allbery <eagle at eyrie.org>
  * Copyright 2009, 2010, 2011, 2012, 2013
  *     The Board of Trustees of the Leland Stanford Junior University
  *
@@ -60,11 +60,13 @@
 int
 main(void)
 {
-    int status;
+    int flag, status;
+    socklen_t flaglen;
     struct addrinfo *ai4, *ai6;
     struct addrinfo hints;
     char addr[INET6_ADDRSTRLEN];
     char *p;
+    socket_type fd;
     static const char *port = "119";
     static const char *ipv6_addr = "FEDC:BA98:7654:3210:FEDC:BA98:7654:3210";
 
@@ -73,7 +75,7 @@
 #endif
 
     /* Set up the plan. */
-    plan(28);
+    plan(34);
 
     /* Get IPv4 and IPv6 sockaddrs to use for subsequent tests. */
     memset(&hints, 0, sizeof(hints));
@@ -145,5 +147,42 @@
     is_addr_compare(0, "ffff::1",   "7fff::1",     "-1");
     is_addr_compare(0, "ffff::1",   "ffff::1",     "-1");
     is_addr_compare(0, "ffff::1",   "ffff::1",     "129");
+
+    /* Test setting various socket options. */
+    fd = socket(PF_INET6, SOCK_STREAM, IPPROTO_IP);
+    if (fd == INVALID_SOCKET)
+        sysbail("cannot create socket");
+    network_set_reuseaddr(fd);
+#ifdef SO_REUSEADDR
+    flag = 0;
+    flaglen = sizeof(flag);
+    is_int(0, getsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &flag, &flaglen),
+           "Getting SO_REUSEADDR works");
+    is_int(1, flag, "...and it is set");
+#else
+    skip_block(2, "SO_REUSEADDR not supported");
+#endif
+    network_set_v6only(fd);
+#ifdef IPV6_V6ONLY
+    flag = 0;
+    flaglen = sizeof(flag);
+    is_int(0, getsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, &flag, &flaglen),
+           "Getting IPV6_V6ONLY works");
+    is_int(1, flag, "...and it is set");
+#else
+    skip_block(2, "IPV6_V6ONLY not supported");
+#endif
+    network_set_freebind(fd);
+#ifdef IP_FREEBIND
+    flag = 0;
+    flaglen = sizeof(flag);
+    is_int(0, getsockopt(fd, IPPROTO_IP, IP_FREEBIND, &flag, &flaglen),
+           "Getting IP_FREEBIND works");
+    is_int(1, flag, "...and it is set");
+#else
+    skip_block(2, "IP_FREEBIND not supported");
+#endif
+    close(fd);
+
     return 0;
 }



More information about the inn-committers mailing list