summaryrefslogtreecommitdiff
path: root/sys/src/ape/lib/bsd/_sock_ingetaddr.c
diff options
context:
space:
mode:
authorBenjamin Riefenstahl <b.riefenstahl@turtle-trading.net>2022-06-10 20:39:28 +0000
committerOri Bernstein <ori@eigenstate.org>2022-06-10 20:39:28 +0000
commit25a0d57478500aed9669e0492583523665afd49d (patch)
treebc25b6916b05ea32d206df1b7d3ab210d48cda9c /sys/src/ape/lib/bsd/_sock_ingetaddr.c
parentd618223086e32bc26d64eb20bfcb3de31536782f (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.c44
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;
+}