<URL: http://bugs.freeciv.org/Ticket/Display.html?id=40405 >
$subject - ML
diff -Nurd -X.diff_ignore freeciv/client/servers.c freeciv/client/servers.c --- freeciv/client/servers.c 2008-07-25 00:24:56.000000000 +0300 +++ freeciv/client/servers.c 2008-07-26 00:33:14.000000000 +0300 @@ -642,7 +642,6 @@ { socklen_t fromlen; union my_sockaddr fromend; - struct hostent *from; char msgbuf[128]; int type; struct data_in din; @@ -680,9 +679,40 @@ dio_get_string(&din, message, sizeof(message)); if (!mystrcasecmp("none", servername)) { + bool nameinfo = FALSE; +#ifdef IPV6_SUPPORT + char dst[INET6_ADDRSTRLEN]; + char host[NI_MAXHOST], service[NI_MAXSERV]; + + if (!getnameinfo(&fromend.saddr, fromlen, host, NI_MAXHOST, + service, NI_MAXSERV, NI_NUMERICSERV)) { + nameinfo = TRUE; + } + if (!nameinfo) { + if (fromend.saddr.sa_family == AF_INET6) { + inet_ntop(AF_INET6, &fromend.saddr_in6.sin6_addr, + dst, sizeof(dst)); + } else { + inet_ntop(AF_INET, &fromend.saddr_in4.sin_addr, dst, sizeof(dst));; + } + } +#else /* IPv6 support */ + const char *dst; + struct hostent *from; + char *host = NULL; + from = gethostbyaddr((char *) &fromend.saddr_in4.sin_addr, sizeof(fromend.saddr_in4.sin_addr), AF_INET); - sz_strlcpy(servername, inet_ntoa(fromend.saddr_in4.sin_addr)); + if (from) { + host = from->h_name; + nameinfo = TRUE; + } + if (!nameinfo) { + dst = inet_ntoa(fromend.saddr_in4.sin_addr); + } +#endif /* IPv6 support */ + + sz_strlcpy(servername, nameinfo ? host : dst); } /* UDP can send duplicate or delayed packets. */ diff -Nurd -X.diff_ignore freeciv/configure.ac freeciv/configure.ac --- freeciv/configure.ac 2008-07-18 19:24:53.000000000 +0300 +++ freeciv/configure.ac 2008-07-26 00:29:01.000000000 +0300 @@ -81,7 +81,8 @@ *) AC_MSG_ERROR(bad value ${enableval} for --enable-ipv6) ;; esac], [ipv6=no]) if test x$ipv6 != xno ; then - AC_CHECK_FUNCS([gethostbyname2 inet_pton inet_ntop], [ipv6_possible=true], [ + AC_CHECK_FUNCS([gethostbyname2 inet_pton inet_ntop getnameinfo], +[ipv6_possible=true], [ if test x$ipv6 = xyes || x$ipv6 = xsupport ; then AC_MSG_ERROR([Cannot enable IPv6 functionality]) fi ]) @@ -92,8 +93,6 @@ AC_DEFINE([IPV6_USED], [1], [IPv6 Used]) fi fi - dnl Non-critical functions - AC_CHECK_FUNCS([getnameinfo]) fi AC_ARG_WITH(readline, diff -Nurd -X.diff_ignore freeciv/server/sernet.c freeciv/server/sernet.c --- freeciv/server/sernet.c 2008-07-25 00:24:56.000000000 +0300 +++ freeciv/server/sernet.c 2008-07-26 00:29:59.000000000 +0300 @@ -821,7 +821,15 @@ int new_sock; union my_sockaddr fromend; + bool nameinfo = FALSE; +#ifdef IPV6_SUPPORT + char host[NI_MAXHOST], service[NI_MAXSERV]; + char dst[INET6_ADDRSTRLEN]; +#else /* IPv6 support */ struct hostent *from; + char *host = NULL; + const char *dst; +#endif /* IPv6 support */ fromlen = sizeof(fromend); @@ -830,14 +838,30 @@ return -1; } +#ifdef IPV6_SUPPORT + if (!getnameinfo(&fromend.saddr, fromlen, host, NI_MAXHOST, + service, NI_MAXSERV, NI_NUMERICSERV)) { + nameinfo = TRUE; + } + if (fromend.saddr.sa_family == AF_INET6) { + inet_ntop(AF_INET6, &fromend.saddr_in6.sin6_addr, + dst, sizeof(dst)); + } else { + inet_ntop(AF_INET, &fromend.saddr_in4.sin_addr, dst, sizeof(dst)); + } +#else /* IPv6 support */ from = - gethostbyaddr((char *) &fromend.saddr_in4.sin_addr, - sizeof(fromend.saddr_in4.sin_addr), AF_INET); + gethostbyaddr((char *) &fromend.saddr_in4.sin_addr, + sizeof(fromend.saddr_in4.sin_addr), AF_INET); + if (from) { + host = from->h_name; + nameinfo = TRUE; + } + dst = inet_ntoa(fromend.saddr_in4.sin_addr); +#endif /* IPv6 support */ return server_make_connection(new_sock, - (from ? from->h_name - : inet_ntoa(fromend.saddr_in4.sin_addr)), - inet_ntoa(fromend.saddr_in4.sin_addr)); + (nameinfo ? host : dst), dst); } /********************************************************************
_______________________________________________ Freeciv-dev mailing list Freeciv-dev@gna.org https://mail.gna.org/listinfo/freeciv-dev