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/connect.c | |
parent | 9c7e1db701e0e80b42bb5990e2f6839d712bb984 (diff) |
ape: initial IPv6 support, inet_pton()/inet_ntop(), getaddrinfo()/getnameinfo()
Diffstat (limited to 'sys/src/ape/lib/bsd/connect.c')
-rw-r--r-- | sys/src/ape/lib/bsd/connect.c | 36 |
1 files changed, 17 insertions, 19 deletions
diff --git a/sys/src/ape/lib/bsd/connect.c b/sys/src/ape/lib/bsd/connect.c index 3f7dcd6b4..ebc63182a 100644 --- a/sys/src/ape/lib/bsd/connect.c +++ b/sys/src/ape/lib/bsd/connect.c @@ -21,7 +21,7 @@ connect(int fd, void *a, int alen) Rock *r; int n, cfd, nfd; char msg[8+256+1], file[8+256+1]; - struct sockaddr_in *lip, *rip; + struct sockaddr *sa; struct sockaddr_un *runix; static int vers; @@ -34,35 +34,35 @@ connect(int fd, void *a, int alen) errno = ENAMETOOLONG; return -1; } + sa = (struct sockaddr*)a; + if(sa->sa_family != r->domain){ + errno = EAFNOSUPPORT; + return -1; + } memmove(&r->raddr, a, alen); switch(r->domain){ case PF_INET: + case PF_INET6: /* set up a tcp or udp connection */ cfd = open(r->ctl, O_RDWR); - if(cfd < 0){ - _syserrno(); + if(cfd < 0) return -1; - } - rip = a; - lip = (struct sockaddr_in*)&r->addr; - if(lip->sin_port) + if(_sock_inport(&r->addr) > 0) { snprintf(msg, sizeof msg, "connect %s!%d%s %d", - inet_ntoa(rip->sin_addr), ntohs(rip->sin_port), + inet_ntop(sa->sa_family, _sock_inip(sa), file, sizeof(file)), + _sock_inport(sa), r->reserved ? "!r" : "", - ntohs(lip->sin_port)); - else + _sock_inport(&r->addr)); + } else { snprintf(msg, sizeof msg, "connect %s!%d%s", - inet_ntoa(rip->sin_addr), ntohs(rip->sin_port), + inet_ntop(sa->sa_family, _sock_inip(sa), file, sizeof(file)), + _sock_inport(sa), r->reserved ? "!r" : ""); - n = write(cfd, msg, strlen(msg)); - if(n < 0){ - _syserrno(); - close(cfd); - return -1; } + n = write(cfd, msg, strlen(msg)); close(cfd); - return 0; + return (n < 0) ? -1 : 0; case PF_UNIX: /* null terminate the address */ if(alen == sizeof(r->raddr)) @@ -87,12 +87,10 @@ connect(int fd, void *a, int alen) _sock_srvname(file, runix->sun_path); nfd = open(file, O_RDWR); if(nfd < 0){ - _syserrno(); unlink(msg); return -1; } if(write(nfd, msg, strlen(msg)) < 0){ - _syserrno(); close(nfd); unlink(msg); return -1; |