From 372cdb136c2fc3f2dc7f07167f00fdf51a1bd037 Mon Sep 17 00:00:00 2001 From: Markus Armbruster Date: Mon, 8 Apr 2013 19:34:37 +0200 Subject: [PATCH] Use IPv4 format for IPv4-mapped addresses 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 | 2 +- src/lib/player/accept.c | 19 ++++++++++++++----- src/lib/w32/sys/socket.h | 1 + 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/src/lib/global/constants.c b/src/lib/global/constants.c index c7cbb431d..bcc2ae6ae 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 117100468..ca0606545 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 a97e060be..6e31ce9d7 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) \ -- 2.43.0