From 25a0d57478500aed9669e0492583523665afd49d Mon Sep 17 00:00:00 2001 From: Benjamin Riefenstahl Date: Fri, 10 Jun 2022 20:39:28 +0000 Subject: [PATCH] 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. --- sys/src/ape/lib/bsd/_sock_ingetaddr.c | 44 +++++++++++++++++++++++++++ sys/src/ape/lib/bsd/bind.c | 14 ++++++--- sys/src/ape/lib/bsd/listen.c | 3 +- sys/src/ape/lib/bsd/priv.h | 2 ++ 4 files changed, 58 insertions(+), 5 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 @@ -39,6 +39,30 @@ _sock_inport(struct sockaddr *a) return 0; } +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) { @@ -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; +} diff --git a/sys/src/ape/lib/bsd/bind.c b/sys/src/ape/lib/bsd/bind.c index db89cce96..f48ecf69f 100644 --- a/sys/src/ape/lib/bsd/bind.c +++ b/sys/src/ape/lib/bsd/bind.c @@ -24,7 +24,7 @@ int bind(int fd, void *a, int alen) { - int n, len, cfd, port; + int n, len, cfd; struct sockaddr *sa; Rock *r; char msg[128]; @@ -55,17 +55,23 @@ bind(int fd, void *a, int alen) errno = EBADF; return -1; } - port = _sock_inport(&r->addr); - snprintf(msg, sizeof msg, "bind %d", port); + + strcpy(msg, "bind "); + _sock_inaddr2string(r, msg + 5, sizeof msg - 5); + n = write(cfd, msg, strlen(msg)); if(n < 0){ errno = EOPNOTSUPP; /* Improve error reporting!!! */ close(cfd); return -1; } + close(cfd); - if(port <= 0) + + if(_sock_inport(&r->addr) <= 0) _sock_ingetaddr(r, &r->addr, 0, "local"); return 0; } + + diff --git a/sys/src/ape/lib/bsd/listen.c b/sys/src/ape/lib/bsd/listen.c index 2ab995101..e1ba4ccc8 100644 --- a/sys/src/ape/lib/bsd/listen.c +++ b/sys/src/ape/lib/bsd/listen.c @@ -145,7 +145,8 @@ listen(fd, backlog) close(cfd); return -1; } - snprintf(msg, sizeof msg, "announce %d", _sock_inport(&r->addr)); + strcpy(msg, "announce "); + _sock_inaddr2string(r, msg + 9, sizeof msg - 9); n = write(cfd, msg, strlen(msg)); if(n < 0){ errno = EOPNOTSUPP; /* Improve error reporting!!! */ diff --git a/sys/src/ape/lib/bsd/priv.h b/sys/src/ape/lib/bsd/priv.h index 7004f3cc6..c18a843b2 100644 --- a/sys/src/ape/lib/bsd/priv.h +++ b/sys/src/ape/lib/bsd/priv.h @@ -43,5 +43,7 @@ extern int _sock_data(int, char*, int, int, int, Rock**); extern int _sock_ipattr(char*); extern void* _sock_inip(struct sockaddr*); extern int _sock_inport(struct sockaddr*); +extern int _sock_inisany(int af, void *addr); extern int _sock_inaddr(int, char*, char*, void*, int*); extern void _sock_ingetaddr(Rock*, void*, int*, char*); +extern char* _sock_inaddr2string(Rock *r, char *dest, int dlen);