mirror of
https://github.com/NLnetLabs/unbound.git
synced 2026-05-28 04:02:33 -04:00
addr_is_any
git-svn-id: file:///svn/unbound/trunk@2279 be551aaa-1e26-0410-a405-d3ace91eadb9
This commit is contained in:
parent
b3254d663b
commit
bc54fa3e58
4 changed files with 55 additions and 0 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
Loading…
Reference in a new issue