diff --git a/src/lib/global/constants.c b/src/lib/global/constants.c index c7cbb431..bcc2ae6a 100644 --- a/src/lib/global/constants.c +++ b/src/lib/global/constants.c @@ -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 = ""; diff --git a/src/lib/player/accept.c b/src/lib/player/accept.c index 11710046..ca060654 100644 --- a/src/lib/player/accept.c +++ b/src/lib/player/accept.c @@ -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; diff --git a/src/lib/w32/sys/socket.h b/src/lib/w32/sys/socket.h index a97e060b..6e31ce9d 100644 --- a/src/lib/w32/sys/socket.h +++ b/src/lib/w32/sys/socket.h @@ -36,6 +36,7 @@ #include #undef NS_ALL +typedef unsigned short sa_family_t; typedef int socklen_t; #define accept(fd, addr, addrlen) \