tlib9: fix announce on OS X - 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 1c996338485a3515b8557562f68b0455b1c5a507
 (DIR) parent 3dade5fe59d80e9d23916d15db93ea39407f694e
 (HTM) Author: Russ Cox <rsc@swtch.com>
       Date:   Sat,  8 Sep 2012 12:49:03 -0400
       
       lib9: fix announce on OS X
       
       R=rsc
       http://codereview.appspot.com/6495109
       
       Diffstat:
         M src/lib9/_p9dialparse.c             |      12 +++++++-----
       
       1 file changed, 7 insertions(+), 5 deletions(-)
       ---
 (DIR) diff --git a/src/lib9/_p9dialparse.c b/src/lib9/_p9dialparse.c
       t@@ -60,7 +60,7 @@ p9dialparse(char *addr, char **pnet, char **punix, void *phost, int *pport)
        
                ss = phost;
        
       -        memset(ss, 0, sizeof(ss));
       +        memset(ss, 0, sizeof *ss);
        
                *punix = nil;
                net = addr;
       t@@ -108,14 +108,17 @@ p9dialparse(char *addr, char **pnet, char **punix, void *phost, int *pport)
                /* translate host */
                if(strcmp(host, "*") == 0){
                        ss->ss_family = AF_INET6;
       +                ss->ss_len = sizeof(struct sockaddr_in6);
                        ((struct sockaddr_in6*)ss)->sin6_addr = in6addr_any;
                }else if((he = gethostbyname(host)) != nil){
                        ss->ss_family = he->h_addrtype;
                        switch(ss->ss_family){
                        case AF_INET:
       +                        ss->ss_len = sizeof(struct sockaddr_in);
                                ((struct sockaddr_in*)ss)->sin_addr = *(struct in_addr*) *(he->h_addr_list);
                                break;
                        case AF_INET6:
       +                        ss->ss_len = sizeof(struct sockaddr_in6);
                                ((struct sockaddr_in6*)ss)->sin6_addr = *(struct in6_addr*) *(he->h_addr_list);
                                break;
                        default:
       t@@ -123,13 +126,12 @@ p9dialparse(char *addr, char **pnet, char **punix, void *phost, int *pport)
                                return -1;
                        }
                }else if(getaddrinfo(host, NULL, NULL, &result) == 0) {
       -                ss->ss_family = result->ai_family;
       -                switch (ss->ss_family) {
       +                switch (result->ai_family) {
                        case AF_INET:
       -                        memcpy((struct sockaddr_in*)ss, result->ai_addr, result->ai_addrlen);
       +                        memmove((struct sockaddr_in*)ss, result->ai_addr, result->ai_addrlen);
                                break;
                        case AF_INET6:
       -                        memcpy((struct sockaddr_in6*)ss, result->ai_addr, result->ai_addrlen);
       +                        memmove((struct sockaddr_in6*)ss, result->ai_addr, result->ai_addrlen);
                                break;
                        default:
                                errstr("unknown protocol family %d", ss->ss_family);