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"
&& 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)
{