diff options
author | Benjamin Riefenstahl <b.riefenstahl@turtle-trading.net> | 2022-06-10 20:39:28 +0000 |
---|---|---|
committer | Ori Bernstein <ori@eigenstate.org> | 2022-06-10 20:39:28 +0000 |
commit | 25a0d57478500aed9669e0492583523665afd49d (patch) | |
tree | bc25b6916b05ea32d206df1b7d3ab210d48cda9c /sys/src/ape/lib/bsd/_sock_ingetaddr.c | |
parent | d618223086e32bc26d64eb20bfcb3de31536782f (diff) |
ape/bsd/bind.c, ape/bsd/listen.c: Set local IP.
Despite what the man pages say, local addresses can actually be set so
do that.
Diffstat (limited to 'sys/src/ape/lib/bsd/_sock_ingetaddr.c')
-rw-r--r-- | sys/src/ape/lib/bsd/_sock_ingetaddr.c | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/sys/src/ape/lib/bsd/_sock_ingetaddr.c b/sys/src/ape/lib/bsd/_sock_ingetaddr.c index c8304f0cf..f8fc2141e 100644 --- a/sys/src/ape/lib/bsd/_sock_ingetaddr.c +++ b/sys/src/ape/lib/bsd/_sock_ingetaddr.c @@ -40,6 +40,30 @@ _sock_inport(struct sockaddr *a) } int +_sock_inisany(int af, void *addr) +{ + int alen; + void *any; + /* an IPv4 address that is auto-initialized to all zeros */ + static struct in_addr inaddr_any; + + switch(af){ + case AF_INET: + alen = sizeof inaddr_any.s_addr; + any = &inaddr_any; + break; + case AF_INET6: + alen = sizeof in6addr_any; + any = &in6addr_any; + break; + default: + return 0; + } + + return 0 == memcmp(addr, any, alen); +} + +int _sock_inaddr(int af, char *ip, char *port, void *a, int *alen) { int len; @@ -97,3 +121,23 @@ _sock_ingetaddr(Rock *r, void *a, int *alen, char *file) close(fd); } } + +char * +_sock_inaddr2string(Rock *r, char *dest, int dlen) +{ + int af = r->domain; + void *addr = _sock_inip(&r->addr); + int port = _sock_inport(&r->addr); + char *d = dest; + char *dend = dest+dlen; + + if(!_sock_inisany(af, addr)){ + inet_ntop(af, addr, d, dlen-1); + d = memchr(d, 0, dlen-1); + *(d++) = '!'; + } + + snprintf(d, dend-d, "%d", port); + + return dest; +} |