Use IPv4 format for IPv4-mapped addresses
authorMarkus Armbruster <armbru@pond.sub.org>
Mon, 8 Apr 2013 17:34:37 +0000 (19:34 +0200)
committerMarkus Armbruster <armbru@pond.sub.org>
Wed, 8 May 2013 04:57:56 +0000 (06:57 +0200)
For instance, use "127.0.0.1" for IPv4 loopback instead of
"::ffff:127.0.0.1".

Simplifies use of econfig key privip: plain dotted decimal now just
works regardless of IPv6 use, no need to add the IPv4-mapped form.

Also affects how addresses are logged and shown to players, and nation
selector ip.  Nicer that way.

src/lib/global/constants.c
src/lib/player/accept.c
src/lib/w32/sys/socket.h

index c7cbb431dc8b0cf5c219c6098d5bfb05c882d959..bcc2ae6ae136529c9a160b2158b88df9937ad885 100644 (file)
@@ -41,7 +41,7 @@ char *privname = "Deity forgot to edit econfig";
 /* E-mail of the deity */
 char *privlog = "careless@invalid";
 /* Divine hosts and networks */
-char *privip = "127.0.0.1 ::1 ::ffff:127.0.0.1";
+char *privip = "127.0.0.1 ::1";
 
 char *post_crash_dump_hook = "";
 
index 117100468e406e9c454771c4187708ba0ae81f88..ca06065450a060f92d90f221970e006e7ae97966 100644 (file)
@@ -234,12 +234,21 @@ sockaddr_ntop(struct sockaddr *sap, char *buf, size_t bufsz)
 {
 #ifdef HAVE_GETADDRINFO
     /* Assumes that if you got getaddrinfo(), you got inet_ntop() too */
-    void *inaddr;
+    sa_family_t af = sap->sa_family;
+    void *addr;
+    struct sockaddr_in6 *sap6;
 
-    inaddr = sap->sa_family == AF_INET
-       ? (void *)&((struct sockaddr_in *)sap)->sin_addr
-       : (void *)&((struct sockaddr_in6 *)sap)->sin6_addr;
-    return inet_ntop(sap->sa_family, inaddr, buf, bufsz);
+    if (af == AF_INET)
+       addr = &((struct sockaddr_in *)sap)->sin_addr;
+    else {
+       sap6 = (struct sockaddr_in6 *)sap;
+       addr = &sap6->sin6_addr;
+       if (IN6_IS_ADDR_V4MAPPED(&sap6->sin6_addr)) {
+           af = AF_INET;
+           addr = sap6->sin6_addr.s6_addr + 12;
+       }
+    }
+    return inet_ntop(af, addr, buf, bufsz);
 #else
     const char *p;
 
index a97e060be8f6162365a5da07e8592f7cd6fe54a0..6e31ce9d7de8cbd65e4e9f119c0479a025e5fc7d 100644 (file)
@@ -36,6 +36,7 @@
 #include <winsock2.h>
 #undef NS_ALL
 
+typedef unsigned short sa_family_t;
 typedef int socklen_t;
 
 #define accept(fd, addr, addrlen) \