<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

Reply via email to