lib9: fix announce on OS X

R=rsc
http://codereview.appspot.com/6495109
diff --git a/src/lib9/_p9dialparse.c b/src/lib9/_p9dialparse.c
index cc91408..da23a41 100644
--- a/src/lib9/_p9dialparse.c
+++ b/src/lib9/_p9dialparse.c
@@ -60,7 +60,7 @@
 
 	ss = phost;
 
-	memset(ss, 0, sizeof(ss));
+	memset(ss, 0, sizeof *ss);
 
 	*punix = nil;
 	net = addr;
@@ -108,14 +108,17 @@
 	/* 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:
@@ -123,13 +126,12 @@
 			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);