commit d24b8141673530ad65407434918136543c228df1 from: David du Colombier <0intro@gmail.com> date: Fri Aug 03 19:25:31 2012 UTC lib9/getnetconn: add support for IPv6 R=rsc http://codereview.appspot.com/6457077 commit - 3a616eaa80070a1b89b907baacc8b603b02c670e commit + d24b8141673530ad65407434918136543c228df1 blob - 52303d0739ee05dc81ed53babb1d61b6c3ad8b02 blob + 9fa8a9e0d3ad9cc15c20be0cf7093db74e5d63f1 --- src/lib9/getnetconn.c +++ src/lib9/getnetconn.c @@ -5,6 +5,7 @@ #include #include #include +#include #include #include @@ -20,6 +21,7 @@ convert(int s, struct sockaddr *sa, char **lsys, char { struct sockaddr_un *sun; struct sockaddr_in *sin; + struct sockaddr_in6 *sin6; uchar *ip; u32int ipl; socklen_t sn; @@ -51,6 +53,30 @@ convert(int s, struct sockaddr *sa, char **lsys, char if(*lsys == nil || *lserv == nil || *laddr == nil) return -1; return 0; + case AF_INET6: + sin6 = (void*)sa; + if (memcmp(&sin6->sin6_addr, &in6addr_any, sizeof(in6addr_any)) == 0) + *lsys = strdup("*"); + else{ + *lsys = malloc(INET6_ADDRSTRLEN); + inet_ntop(AF_INET6, &sin6->sin6_addr, *lsys, INET6_ADDRSTRLEN); + } + *lserv = smprint("%d", ntohs(sin6->sin6_port)); + sn = sizeof n; + if(getsockopt(s, SOL_SOCKET, SO_TYPE, (void*)&n, &sn) < 0) + return -1; + if(n == SOCK_STREAM) + net = "tcp"; + else if(n == SOCK_DGRAM) + net = "udp"; + else{ + werrstr("unknown network type"); + return -1; + } + *laddr = smprint("%s!%s!%s", net, *lsys, *lserv); + if(*lsys == nil || *lserv == nil || *laddr == nil) + return -1; + return 0; case AF_UNIX: sun = (void*)sa; *lsys = unknown; @@ -72,6 +98,7 @@ getnetconninfo(char *dir, int fd) union { struct sockaddr sa; struct sockaddr_in sin; + struct sockaddr_in6 sin6; struct sockaddr_un sun; } u; NetConnInfo *nci;