Allow multiple BindToAddress statements.
authorGuus Sliepen <guus@tinc-vpn.org>
Fri, 17 Feb 2012 15:25:00 +0000 (16:25 +0100)
committerGuus Sliepen <guus@tinc-vpn.org>
Fri, 17 Feb 2012 15:25:00 +0000 (16:25 +0100)
doc/tinc.conf.5.in
doc/tinc.texi
src/net_setup.c

index dd74acfaf04efb59f7050c5f679a5aab4bef65cb..6853bae4e9af54f9ed4d143c27221eb1576bbf42 100644 (file)
@@ -133,7 +133,10 @@ IPv6 listening sockets will be created.
 If your computer has more than one IPv4 or IPv6 address,
 .Nm tinc
 will by default listen on all of them for incoming connections.
 If your computer has more than one IPv4 or IPv6 address,
 .Nm tinc
 will by default listen on all of them for incoming connections.
-It is possible to bind only to a single address with this variable.
+Multiple
+.Va BindToAddress
+variables may be specified,
+in which case listening sockets for each specified address are made.
 
 .Pp
 This option may not work on all platforms.
 
 .Pp
 This option may not work on all platforms.
index b7d646d58e01941acf716ce04b74ee3bb215c926..817c2dedcb05872ea31be34a1ad2a397c65c37b4 100644 (file)
@@ -759,7 +759,8 @@ both IPv4 and IPv6 or just IPv6 listening sockets will be created.
 @item BindToAddress = <@var{address}> [experimental]
 If your computer has more than one IPv4 or IPv6 address, tinc
 will by default listen on all of them for incoming connections.
 @item BindToAddress = <@var{address}> [experimental]
 If your computer has more than one IPv4 or IPv6 address, tinc
 will by default listen on all of them for incoming connections.
-It is possible to bind only to a single address with this variable.
+Multiple BindToAddress variables may be specified,
+in which case listening sockets for each specified address are made.
 
 This option may not work on all platforms.
 
 
 This option may not work on all platforms.
 
index 9cf24bf8cb42f165499168b1d95c04fc7616ca26..279feaefd24a7b1c1f21e48cd69dfc0e70597e35 100644 (file)
@@ -582,47 +582,54 @@ static bool setup_myself(void) {
 
        /* Open sockets */
 
 
        /* Open sockets */
 
-       get_config_string(lookup_config(config_tree, "BindToAddress"), &address);
+       cfg = lookup_config(config_tree, "BindToAddress");
 
 
-       hint.ai_family = addressfamily;
-       hint.ai_socktype = SOCK_STREAM;
-       hint.ai_protocol = IPPROTO_TCP;
-       hint.ai_flags = AI_PASSIVE;
+       do {
+               get_config_string(cfg, &address);
+               if(cfg)
+                       cfg = lookup_config_next(config_tree, cfg);
 
 
-       err = getaddrinfo(address, myport, &hint, &ai);
+               hint.ai_family = addressfamily;
+               hint.ai_socktype = SOCK_STREAM;
+               hint.ai_protocol = IPPROTO_TCP;
+               hint.ai_flags = AI_PASSIVE;
 
 
-       if(err || !ai) {
-               logger(LOG_ERR, "System call `%s' failed: %s", "getaddrinfo",
-                          gai_strerror(err));
-               return false;
-       }
+               err = getaddrinfo(address, myport, &hint, &ai);
+               free(address);
 
 
-       listen_sockets = 0;
+               if(err || !ai) {
+                       logger(LOG_ERR, "System call `%s' failed: %s", "getaddrinfo",
+                                  gai_strerror(err));
+                       return false;
+               }
 
 
-       for(aip = ai; aip; aip = aip->ai_next) {
-               listen_socket[listen_sockets].tcp =
-                       setup_listen_socket((sockaddr_t *) aip->ai_addr);
+               listen_sockets = 0;
 
 
-               if(listen_socket[listen_sockets].tcp < 0)
-                       continue;
+               for(aip = ai; aip; aip = aip->ai_next) {
+                       listen_socket[listen_sockets].tcp =
+                               setup_listen_socket((sockaddr_t *) aip->ai_addr);
 
 
-               listen_socket[listen_sockets].udp =
-                       setup_vpn_in_socket((sockaddr_t *) aip->ai_addr);
+                       if(listen_socket[listen_sockets].tcp < 0)
+                               continue;
 
 
-               if(listen_socket[listen_sockets].udp < 0)
-                       continue;
+                       listen_socket[listen_sockets].udp =
+                               setup_vpn_in_socket((sockaddr_t *) aip->ai_addr);
 
 
-               ifdebug(CONNECTIONS) {
-                       hostname = sockaddr2hostname((sockaddr_t *) aip->ai_addr);
-                       logger(LOG_NOTICE, "Listening on %s", hostname);
-                       free(hostname);
-               }
+                       if(listen_socket[listen_sockets].udp < 0)
+                               continue;
 
 
-               memcpy(&listen_socket[listen_sockets].sa, aip->ai_addr, aip->ai_addrlen);
-               listen_sockets++;
-       }
+                       ifdebug(CONNECTIONS) {
+                               hostname = sockaddr2hostname((sockaddr_t *) aip->ai_addr);
+                               logger(LOG_NOTICE, "Listening on %s", hostname);
+                               free(hostname);
+                       }
+
+                       memcpy(&listen_socket[listen_sockets].sa, aip->ai_addr, aip->ai_addrlen);
+                       listen_sockets++;
+               }
 
 
-       freeaddrinfo(ai);
+               freeaddrinfo(ai);
+       } while(cfg);
 
        if(listen_sockets)
                logger(LOG_NOTICE, "Ready");
 
        if(listen_sockets)
                logger(LOG_NOTICE, "Ready");