diff options
author | cinap_lenrek <cinap_lenrek@gmx.de> | 2013-03-31 18:52:45 +0200 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@gmx.de> | 2013-03-31 18:52:45 +0200 |
commit | b6dc4ba5a44a2ed2a68266598ceb28b7a7d51af2 (patch) | |
tree | b2af773db48a3606bd078055db925dbba6d4ffaa /sys/src/ape/lib/bsd/_sock_ingetaddr.c | |
parent | 9c7e1db701e0e80b42bb5990e2f6839d712bb984 (diff) |
ape: initial IPv6 support, inet_pton()/inet_ntop(), getaddrinfo()/getnameinfo()
Diffstat (limited to 'sys/src/ape/lib/bsd/_sock_ingetaddr.c')
-rw-r--r-- | sys/src/ape/lib/bsd/_sock_ingetaddr.c | 72 |
1 files changed, 62 insertions, 10 deletions
diff --git a/sys/src/ape/lib/bsd/_sock_ingetaddr.c b/sys/src/ape/lib/bsd/_sock_ingetaddr.c index 603eb9c78..c8304f0cf 100644 --- a/sys/src/ape/lib/bsd/_sock_ingetaddr.c +++ b/sys/src/ape/lib/bsd/_sock_ingetaddr.c @@ -15,17 +15,74 @@ #include "priv.h" +void* +_sock_inip(struct sockaddr *a) +{ + switch(a->sa_family){ + case AF_INET: + return &((struct sockaddr_in*)a)->sin_addr; + case AF_INET6: + return &((struct sockaddr_in6*)a)->sin6_addr; + } + return 0; +} + +int +_sock_inport(struct sockaddr *a) +{ + switch(a->sa_family){ + case AF_INET: + return ntohs(((struct sockaddr_in*)a)->sin_port); + case AF_INET6: + return ntohs(((struct sockaddr_in6*)a)->sin6_port); + } + return 0; +} + +int +_sock_inaddr(int af, char *ip, char *port, void *a, int *alen) +{ + int len; + + len = 0; + if(af == AF_INET){ + struct sockaddr_in *in = a; + + len = sizeof(*in); + memset(in, 0, len); + in->sin_family = af; + if(port != 0 && *port != 0) + in->sin_port = htons(atoi(port)); + if(ip != 0 && *ip != 0) + inet_pton(af, ip, &in->sin_addr); + } else if(af == AF_INET6){ + struct sockaddr_in6 *in = a; + + len = sizeof(*in); + memset(in, 0, len); + in->sin6_family = af; + if(port != 0 && *port != 0) + in->sin6_port = htons(atoi(port)); + if(ip != 0 && *ip != 0) + inet_pton(af, ip, &in->sin6_addr); + } + if(alen != 0) + *alen = len; + return len; +} + void -_sock_ingetaddr(Rock *r, struct sockaddr_in *ip, int *alen, char *a) +_sock_ingetaddr(Rock *r, void *a, int *alen, char *file) { + char name[Ctlsize], *p; int n, fd; - char *p; - char name[Ctlsize]; + if(r->domain != PF_INET && r->domain != PF_INET6) + return; /* get remote address */ strcpy(name, r->ctl); p = strrchr(name, '/'); - strcpy(p+1, a); + strcpy(p+1, file); fd = open(name, O_RDONLY); if(fd >= 0){ n = read(fd, name, sizeof(name)-1); @@ -34,14 +91,9 @@ _sock_ingetaddr(Rock *r, struct sockaddr_in *ip, int *alen, char *a) p = strchr(name, '!'); if(p){ *p++ = 0; - ip->sin_family = AF_INET; - ip->sin_port = htons(atoi(p)); - ip->sin_addr.s_addr = inet_addr(name); - if(alen) - *alen = sizeof(struct sockaddr_in); + _sock_inaddr(r->domain, name, p, a, alen); } } close(fd); } - } |