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/accept.c | |
parent | 9c7e1db701e0e80b42bb5990e2f6839d712bb984 (diff) |
ape: initial IPv6 support, inet_pton()/inet_ntop(), getaddrinfo()/getnameinfo()
Diffstat (limited to 'sys/src/ape/lib/bsd/accept.c')
-rw-r--r-- | sys/src/ape/lib/bsd/accept.c | 30 |
1 files changed, 12 insertions, 18 deletions
diff --git a/sys/src/ape/lib/bsd/accept.c b/sys/src/ape/lib/bsd/accept.c index 483e4c6ed..4f6203652 100644 --- a/sys/src/ape/lib/bsd/accept.c +++ b/sys/src/ape/lib/bsd/accept.c @@ -20,7 +20,6 @@ accept(int fd, void *a, int *alen) { int n, nfd, cfd; Rock *r, *nr; - struct sockaddr_in *ip; char name[Ctlsize]; char file[8+Ctlsize+1]; char *p, *net; @@ -33,6 +32,7 @@ accept(int fd, void *a, int *alen) switch(r->domain){ case PF_INET: + case PF_INET6: switch(r->stype){ case SOCK_DGRAM: net = "udp"; @@ -40,41 +40,35 @@ accept(int fd, void *a, int *alen) case SOCK_STREAM: net = "tcp"; break; + case SOCK_RDM: + net = "il"; + break; } /* get control file name from listener process */ n = read(fd, name, sizeof(name)-1); - if(n <= 0){ - _syserrno(); + if(n <= 0) return -1; - } name[n] = 0; cfd = open(name, O_RDWR); - if(cfd < 0){ - _syserrno(); + if(cfd < 0) return -1; - } nfd = _sock_data(cfd, net, r->domain, r->stype, r->protocol, &nr); - if(nfd < 0){ - _syserrno(); + if(nfd < 0) return -1; - } if(write(fd, "OK", 2) < 0){ close(nfd); - _syserrno(); return -1; } - /* get remote address */ - ip = (struct sockaddr_in*)&nr->raddr; - _sock_ingetaddr(nr, ip, &n, "remote"); - if(a){ - memmove(a, ip, sizeof(struct sockaddr_in)); - *alen = sizeof(struct sockaddr_in); + _sock_ingetaddr(nr, &nr->raddr, &n, "remote"); + if(a != 0){ + if(n > 0) + memmove(a, &nr->raddr, n); + *alen = n; } - return nfd; case PF_UNIX: if(r->other >= 0){ |