- (djm) Bug #401: Work around Linux breakage with IPv6 mapped addresses.
   Based on fix from yoshfuji@linux-ipv6.org
diff --git a/canohost.c b/canohost.c
index 9aa942a..941db23 100644
--- a/canohost.c
+++ b/canohost.c
@@ -59,11 +59,14 @@
 			memset(&from, 0, sizeof(from));
 
 			from4->sin_family = AF_INET;
+			fromlen = sizeof(*from4);
 			memcpy(&from4->sin_addr, &addr, sizeof(addr));
 			from4->sin_port = port;
 		}
 	}
 #endif
+	if (from.ss_family == AF_INET6)
+		fromlen = sizeof(struct sockaddr_in6);
 
 	if (getnameinfo((struct sockaddr *)&from, fromlen, ntop, sizeof(ntop),
 	    NULL, 0, NI_NUMERICHOST) != 0)
@@ -225,6 +228,11 @@
 		    < 0)
 			return NULL;
 	}
+
+	/* Work around Linux IPv6 weirdness */
+	if (addr.ss_family == AF_INET6)
+		addrlen = sizeof(struct sockaddr_in6);
+
 	/* Get the address in ascii. */
 	if (getnameinfo((struct sockaddr *)&addr, addrlen, ntop, sizeof(ntop),
 	    NULL, 0, flags) != 0) {
@@ -319,6 +327,11 @@
 			fatal_cleanup();
 		}
 	}
+
+	/* Work around Linux IPv6 weirdness */
+	if (from.ss_family == AF_INET6)
+		fromlen = sizeof(struct sockaddr_in6);
+
 	/* Return port number. */
 	if (getnameinfo((struct sockaddr *)&from, fromlen, NULL, 0,
 	    strport, sizeof(strport), NI_NUMERICSERV) != 0)