]> git.pond.sub.org Git - empserver/blobdiff - src/lib/player/accept.c
Use IPv4 format for IPv4-mapped addresses
[empserver] / src / lib / player / accept.c
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;