]> git.ipfire.org Git - thirdparty/unbound.git/commitdiff
addr_is_any
authorWouter Wijngaards <wouter@nlnetlabs.nl>
Wed, 13 Oct 2010 07:59:55 +0000 (07:59 +0000)
committerWouter Wijngaards <wouter@nlnetlabs.nl>
Wed, 13 Oct 2010 07:59:55 +0000 (07:59 +0000)
git-svn-id: file:///svn/unbound/trunk@2279 be551aaa-1e26-0410-a405-d3ace91eadb9

services/outside_network.c
testcode/unitmain.c
util/net_help.c
util/net_help.h

index 91614024d2417cb95e1655aabcee2bc3966cc539..18ce9f3480bfaaf8f300e6bb90d9991e86c5d797 100644 (file)
@@ -156,6 +156,10 @@ outnet_tcp_take_into_use(struct waiting_tcp* w, uint8_t* pkt, size_t pkt_len)
                log_addr(0, "failed address", &w->addr, w->addrlen);
                return 0;
        }
+       /* pick random outgoing-interface of that family, and bind it.
+        * port set to 0 so OS picks a port number for us.
+        * if it is the ANY address, do not bind. */
+
        fd_set_nonblock(s);
        if(connect(s, (struct sockaddr*)&w->addr, w->addrlen) == -1) {
 #ifndef USE_WINSOCK
index e9e28c53c52f1e3518f7e7f40702371ca3b009d1..3adff443b477b1e4f34e93a21097ceedc113f5fd 100644 (file)
@@ -304,6 +304,34 @@ net_test(void)
                unit_assert(ipstrtoaddr("2::ffff:192.168.0.2", 53, &a, &l));
                unit_assert(!addr_is_ip4mapped(&a, l));
        }
+       /* test addr_is_any */
+       unit_show_func("util/net_help.c", "addr_is_any");
+       if(1) {
+               struct sockaddr_storage a;
+               socklen_t l = (socklen_t)sizeof(a);
+               unit_assert(ipstrtoaddr("0.0.0.0", 53, &a, &l));
+               unit_assert(addr_is_any(&a, l));
+               unit_assert(ipstrtoaddr("0.0.0.0", 10053, &a, &l));
+               unit_assert(addr_is_any(&a, l));
+               unit_assert(ipstrtoaddr("0.0.0.0", 0, &a, &l));
+               unit_assert(addr_is_any(&a, l));
+               unit_assert(ipstrtoaddr("::0", 0, &a, &l));
+               unit_assert(addr_is_any(&a, l));
+               unit_assert(ipstrtoaddr("::0", 53, &a, &l));
+               unit_assert(addr_is_any(&a, l));
+               unit_assert(ipstrtoaddr("::1", 53, &a, &l));
+               unit_assert(!addr_is_any(&a, l));
+               unit_assert(ipstrtoaddr("2001:1667::1", 0, &a, &l));
+               unit_assert(!addr_is_any(&a, l));
+               unit_assert(ipstrtoaddr("2001::0", 0, &a, &l));
+               unit_assert(!addr_is_any(&a, l));
+               unit_assert(ipstrtoaddr("10.0.0.0", 0, &a, &l));
+               unit_assert(!addr_is_any(&a, l));
+               unit_assert(ipstrtoaddr("0.0.0.10", 0, &a, &l));
+               unit_assert(!addr_is_any(&a, l));
+               unit_assert(ipstrtoaddr("192.0.2.1", 0, &a, &l));
+               unit_assert(!addr_is_any(&a, l));
+       }
 }
 
 #include "util/config_file.h"
index 537577658fa36f29c112f7a22b78c015300eee16..504a415efeec764c09ef785608f3d8bc713cbfb0 100644 (file)
@@ -478,6 +478,21 @@ int addr_is_broadcast(struct sockaddr_storage* addr, socklen_t addrlen)
                && memcmp(sinaddr, "\377\377\377\377", 4) == 0;
 }
 
+int addr_is_any(struct sockaddr_storage* addr, socklen_t addrlen)
+{
+       int af = (int)((struct sockaddr_in*)addr)->sin_family;
+       void* sinaddr = &((struct sockaddr_in*)addr)->sin_addr;
+       void* sin6addr = &((struct sockaddr_in6*)addr)->sin6_addr;
+       if(af == AF_INET && addrlen>=(socklen_t)sizeof(struct sockaddr_in)
+               && memcmp(sinaddr, "\000\000\000\000", 4) == 0)
+               return 1;
+       else if(af==AF_INET6 && addrlen>=(socklen_t)sizeof(struct sockaddr_in6)
+               && memcmp(sin6addr, "\000\000\000\000\000\000\000\000"
+               "\000\000\000\000\000\000\000\000", 16) == 0)
+               return 1;
+       return 0;
+}
+
 void sock_list_insert(struct sock_list** list, struct sockaddr_storage* addr,
        socklen_t len, struct regional* region)
 {
index 142c909d600a7efd9c063838ae1f93d8c8d0bf87..d09904747677e92b01f3bd728587c6ed34ba5842 100644 (file)
@@ -277,6 +277,14 @@ int addr_is_ip4mapped(struct sockaddr_storage* addr, socklen_t addrlen);
  */
 int addr_is_broadcast(struct sockaddr_storage* addr, socklen_t addrlen);
 
+/**
+ * See if sockaddr is 0.0.0.0 or ::0.
+ * @param addr: address
+ * @param addrlen: length of address
+ * @return true if so
+ */
+int addr_is_any(struct sockaddr_storage* addr, socklen_t addrlen);
+
 /**
  * Insert new socket list item. If fails logs error.
  * @param list: pointer to pointer to first item.