tlib9/getnetconn: add support for IPv6 - plan9port - [fork] Plan 9 from user space
 (HTM) git clone git://src.adamsgaard.dk/plan9port
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit d24b8141673530ad65407434918136543c228df1
 (DIR) parent 3a616eaa80070a1b89b907baacc8b603b02c670e
 (HTM) Author: David du Colombier <0intro@gmail.com>
       Date:   Fri,  3 Aug 2012 21:25:31 +0200
       
       lib9/getnetconn: add support for IPv6
       
       R=rsc
       http://codereview.appspot.com/6457077
       
       Diffstat:
         M src/lib9/getnetconn.c               |      27 +++++++++++++++++++++++++++
       
       1 file changed, 27 insertions(+), 0 deletions(-)
       ---
 (DIR) diff --git a/src/lib9/getnetconn.c b/src/lib9/getnetconn.c
       t@@ -5,6 +5,7 @@
        #include <sys/socket.h>
        #include <netinet/in.h>
        #include <netinet/tcp.h>
       +#include <arpa/inet.h>
        #include <sys/un.h>
        #include <errno.h>
        
       t@@ -20,6 +21,7 @@ convert(int s, struct sockaddr *sa, char **lsys, char **lserv, char **laddr)
        {
                struct sockaddr_un *sun;
                struct sockaddr_in *sin;
       +        struct sockaddr_in6 *sin6;
                uchar *ip;
                u32int ipl;
                socklen_t sn;
       t@@ -51,6 +53,30 @@ convert(int s, struct sockaddr *sa, char **lsys, char **lserv, char **laddr)
                        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;
       t@@ -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;