From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on inbox.vuxu.org X-Spam-Level: X-Spam-Status: No, score=0.0 required=5.0 tests=none autolearn=ham autolearn_force=no version=3.4.4 Received: (qmail 11052 invoked from network); 4 Jan 2022 21:46:59 -0000 Received: from 4ess.inri.net (216.126.196.42) by inbox.vuxu.org with ESMTPUTF8; 4 Jan 2022 21:46:59 -0000 Received: from odoacer.turtle-trading.net ([93.241.193.16]) by 4ess; Tue Jan 4 15:01:15 -0500 2022 Received: from zenobia.turtle-trading.net ([192.168.2.111]) by odoacer.turtle-trading.net with esmtp (Exim 4.80) (envelope-from ) id 1n4pzC-0003jq-Pp; Tue, 04 Jan 2022 21:00:46 +0100 Received: from benny by zenobia.turtle-trading.net with local (Exim 4.94.2) (envelope-from ) id 1n4pzC-000gGr-Hc; Tue, 04 Jan 2022 21:00:46 +0100 From: Benjamin Riefenstahl To: 9front@9front.org Date: Tue, 04 Jan 2022 21:00:46 +0100 Message-ID: <87pmp72rv5.fsf@turtle-trading.net> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/27.2 (gnu/linux) MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" List-ID: <9front.9front.org> List-Help: X-Glyph: ➈ X-Bullshit: open persistence GPU-oriented GPU lifecycle layer Subject: [9front] ape/bsd: Enable setting the local address with bind Reply-To: 9front@9front.org Precedence: bulk --=-=-= Content-Type: text/plain The current code ignores the address as passed to the BSD socket function bind(). It seems that that may not have been possible with earlier versions of the net API? I discovered by reading the code and experimentation that this seems to work fine in the current net API, so this implements it for BSD sockets. I removed some previous code that did not make sense to me, so you may want to check that I did not screw up. What I mean is "bind *" in bind() and about "bind 0" in listen(). The handling when ports < 0 are specified is not consistent yet. Either we should normalize the ports to be at least 0, or we should return an error condition for ports < 0. The documentation in the man page ip(3) for the control commands "bind" and "announce" does not mention the local address, should that be fixed, too? --=-=-= Content-Type: multipart/mixed; boundary="upas-bfxetgueevgusbwkojzosfhgmy" Content-Disposition: inline This is a multi-part message in MIME format. --upas-bfxetgueevgusbwkojzosfhgmy Content-Disposition: inline Content-Type: text/plain; charset="US-ASCII" Content-Transfer-Encoding: 7bit from postmaster@4ess: The following attachment had content that we can't prove to be harmless. To avoid possible automatic execution, we changed the content headers. The original header was: Content-Type: text/x-diff Content-Disposition: inline; filename=0004-ape-bsd-fix-listening-to-individual-addresses.patch --upas-bfxetgueevgusbwkojzosfhgmy Content-Type: application/octet-stream Content-Disposition: attachment; filename="0004-ape-bsd-fix-listening-to-individual-addresses.patch.suspect" From: Benjamin Riefenstahl Date: Sat, 25 Dec 2021 14:03:00 +0000 Subject: [PATCH] ape/bsd: fix listening to individual addresses The former code does not bind to an address, just to a port. The net interface actually supports binding to addresses, so implement that in the BSD socket code. Also: Do not issue "bind *", that does not mean what you think it means. --- diff f96fae96efebf3eb7917e2c0b55439db2b242f79 4648260a1e4915035b09b502fd81d6716b7f77c0 --- a/sys/src/ape/lib/bsd/_sock_ingetaddr.c Sat Dec 25 14:59:59 2021 +++ b/sys/src/ape/lib/bsd/_sock_ingetaddr.c Sat Dec 25 15:03:00 2021 @@ -40,6 +40,29 @@ } int +_sock_inisany(int af, void *addr) +{ + int alen; + void *any; + 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; @@ -96,4 +119,24 @@ } 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; } --- a/sys/src/ape/lib/bsd/bind.c Sat Dec 25 14:59:59 2021 +++ b/sys/src/ape/lib/bsd/bind.c Sat Dec 25 15:03:00 2021 @@ -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,20 +55,23 @@ errno = EBADF; return -1; } - port = _sock_inport(&r->addr); - if(port > 0) - snprintf(msg, sizeof msg, "bind %d", port); - else - strcpy(msg, "bind *"); + + 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; } + + --- a/sys/src/ape/lib/bsd/listen.c Sat Dec 25 14:59:59 2021 +++ b/sys/src/ape/lib/bsd/listen.c Sat Dec 25 15:03:00 2021 @@ -121,7 +121,7 @@ int backlog; { Rock *r; - int n, cfd, port; + int n, cfd; char msg[128]; struct sockaddr_un *lunix; @@ -139,17 +139,9 @@ errno = EBADF; return -1; } - port = _sock_inport(&r->addr); - if(port >= 0) { - if(write(cfd, "bind 0", 6) < 0) { - errno = EGREG; - close(cfd); - return -1; - } - snprintf(msg, sizeof msg, "announce %d", port); - } - else - strcpy(msg, "announce *"); + 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!!! */ --- a/sys/src/ape/lib/bsd/priv.h Sat Dec 25 14:59:59 2021 +++ b/sys/src/ape/lib/bsd/priv.h Sat Dec 25 15:03:00 2021 @@ -43,5 +43,7 @@ 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); -- 1.0 --upas-bfxetgueevgusbwkojzosfhgmy-- --=-=-=--