Author: cazfi
Date: Fri Jan  1 12:24:35 2016
New Revision: 31283

URL: http://svn.gna.org/viewcvs/freeciv?rev=31283&view=rev
Log:
Improved server side bind() and friends error logging

See patch #6750

Modified:
    branches/S2_5/server/sernet.c
    branches/S2_5/utility/netintf.c
    branches/S2_5/utility/netintf.h

Modified: branches/S2_5/server/sernet.c
URL: 
http://svn.gna.org/viewcvs/freeciv/branches/S2_5/server/sernet.c?rev=31283&r1=31282&r2=31283&view=diff
==============================================================================
--- branches/S2_5/server/sernet.c       (original)
+++ branches/S2_5/server/sernet.c       Fri Jan  1 12:24:35 2016
@@ -1079,6 +1079,7 @@
   struct fc_sockaddr_list *list;
   int name_count;
   fc_errno eno = 0;
+  union fc_sockaddr *problematic = NULL;
 
 #ifdef IPV6_SUPPORT
   struct ipv6_mreq mreq6;
@@ -1100,7 +1101,7 @@
     exit(EXIT_FAILURE);
   }
 
-  cause = NULL;
+  cause = "internal"; /* If cause is not overwritten but gets printed... */
   on = 1;
 
   /* Loop to create sockets, bind, listen. */
@@ -1115,6 +1116,7 @@
        * Kernel might have disabled AF_INET6. */
       eno = fc_get_errno();
       cause = "socket";
+      problematic = paddr;
       continue;
     }
 
@@ -1124,7 +1126,7 @@
                    (char *)&on, sizeof(on)) == -1) {
       log_error("setsockopt SO_REUSEADDR failed: %s",
                 fc_strerror(fc_get_errno()));
-      sockaddr_debug(paddr);
+      sockaddr_debug(paddr, LOG_DEBUG);
     }
 #endif /* HAVE_WINSOCK */
 
@@ -1137,7 +1139,7 @@
                      (char *)&on, sizeof(on)) == -1) {
         log_error("setsockopt IPV6_V6ONLY failed: %s",
                   fc_strerror(fc_get_errno()));
-        sockaddr_debug(paddr);
+        sockaddr_debug(paddr, LOG_DEBUG);
       }
 #endif /* IPV6_V6ONLY */
     }
@@ -1146,6 +1148,7 @@
     if (bind(s, &paddr->saddr, sockaddr_size(paddr)) == -1) {
       eno = fc_get_errno();
       cause = "bind";
+      problematic = paddr;
 
       if (eno == EADDRNOTAVAIL) {
         /* Close only this socket. This address is not available.
@@ -1171,17 +1174,21 @@
     if (listen(s, MAX_NUM_CONNECTIONS) == -1) {
       eno = fc_get_errno();
       cause = "listen";
+      problematic = paddr;
       fc_closesocket(s);
       continue;
     }
-    listen_socks[listen_count] = s;
-    listen_count++;
+
+    listen_socks[listen_count++] = s;
   } fc_sockaddr_list_iterate_end;
 
   if (listen_count == 0) {
-    log_fatal("%s failed: %s", cause, fc_strerror(eno));
+    log_fatal("%s failure: %s (%d failed)", cause, fc_strerror(eno), 
name_count);
+    if (problematic != NULL) {
+      sockaddr_debug(problematic, LOG_NORMAL);
+    }
     fc_sockaddr_list_iterate(list, paddr) {
-      sockaddr_debug(paddr);
+      sockaddr_debug(paddr, LOG_DEBUG);
     } fc_sockaddr_list_iterate_end;
     exit(EXIT_FAILURE);
   }
@@ -1205,7 +1212,7 @@
 
   /* Create socket for server LAN announcements */
   if ((socklan = socket(lan_family, SOCK_DGRAM, 0)) < 0) {
-    log_error("socket failed: %s", fc_strerror(fc_get_errno()));
+    log_error("Announcement socket failed: %s", fc_strerror(fc_get_errno()));
     return 0; /* FIXME: Should this cause hard error as exit(EXIT_FAILURE).
                *        It's failure to do as commandline parameters requested 
after all */
   }
@@ -1241,7 +1248,7 @@
   }
 
   if (bind(socklan, &addr.saddr, sockaddr_size(&addr)) < 0) {
-    log_error("Lan bind failed: %s", fc_strerror(fc_get_errno()));
+    log_error("Announcement socket binding failed: %s", 
fc_strerror(fc_get_errno()));
   }
 
 #ifndef IPV6_SUPPORT
@@ -1479,8 +1486,8 @@
 #endif
 
   /* Create a socket to broadcast to client. */
-  if ((socksend = socket(AF_INET,SOCK_DGRAM, 0)) < 0) {
-    log_error("socket failed: %s", fc_strerror(fc_get_errno()));
+  if ((socksend = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
+    log_error("Lan response socket failed: %s", fc_strerror(fc_get_errno()));
     return;
   }
 
@@ -1505,7 +1512,7 @@
 
   if (setsockopt(socksend, SOL_SOCKET, SO_BROADCAST, 
                  (const char*)&setting, sizeof(setting))) {
-    log_error("setsockopt failed: %s", fc_strerror(fc_get_errno()));
+    log_error("Lan response setsockopt failed: %s", 
fc_strerror(fc_get_errno()));
     return;
   }
 

Modified: branches/S2_5/utility/netintf.c
URL: 
http://svn.gna.org/viewcvs/freeciv/branches/S2_5/utility/netintf.c?rev=31283&r1=31282&r2=31283&view=diff
==============================================================================
--- branches/S2_5/utility/netintf.c     (original)
+++ branches/S2_5/utility/netintf.c     Fri Jan  1 12:24:35 2016
@@ -257,20 +257,20 @@
 /***************************************************************************
   Write information about sockaddr to debug log.
 ***************************************************************************/
-void sockaddr_debug(union fc_sockaddr *addr)
+void sockaddr_debug(union fc_sockaddr *addr, enum log_level lvl)
 {
 #ifdef IPV6_SUPPORT
   char buf[INET6_ADDRSTRLEN] = "Unknown";
 
   if (addr->saddr.sa_family == AF_INET6) { 
     inet_ntop(AF_INET6, &addr->saddr_in6.sin6_addr, buf, INET6_ADDRSTRLEN);
-    log_debug("Host: %s, Port: %d (IPv6)",
-              buf, ntohs(addr->saddr_in6.sin6_port));
+    log_base(lvl, "Host: %s, Port: %d (IPv6)",
+             buf, ntohs(addr->saddr_in6.sin6_port));
     return;
   } else if (addr->saddr.sa_family == AF_INET) {
     inet_ntop(AF_INET, &addr->saddr_in4.sin_addr, buf, INET_ADDRSTRLEN);
-    log_debug("Host: %s, Port: %d (IPv4)",
-              buf, ntohs(addr->saddr_in4.sin_port));
+    log_base(lvl, "Host: %s, Port: %d (IPv4)",
+             buf, ntohs(addr->saddr_in4.sin_port));
     return;
   }
 #else  /* IPv6 support */
@@ -279,8 +279,8 @@
 
     buf = inet_ntoa(addr->saddr_in4.sin_addr);
 
-    log_debug("Host: %s, Port: %d",
-             buf, ntohs(addr->saddr_in4.sin_port));
+    log_base(lvl, "Host: %s, Port: %d",
+             buf, ntohs(addr->saddr_in4.sin_port));
 
     return;
   }

Modified: branches/S2_5/utility/netintf.h
URL: 
http://svn.gna.org/viewcvs/freeciv/branches/S2_5/utility/netintf.h?rev=31283&r1=31282&r2=31283&view=diff
==============================================================================
--- branches/S2_5/utility/netintf.h     (original)
+++ branches/S2_5/utility/netintf.h     Fri Jan  1 12:24:35 2016
@@ -131,7 +131,7 @@
                         enum fc_addr_family family,
                         char *net_interface, bool not_avail_ok);
 
-void sockaddr_debug(union fc_sockaddr *addr);
+void sockaddr_debug(union fc_sockaddr *addr, enum log_level lvl);
 int sockaddr_size(union fc_sockaddr *addr);
 bool sockaddr_ipv6(union fc_sockaddr *addr);
 


_______________________________________________
Freeciv-commits mailing list
Freeciv-commits@gna.org
https://mail.gna.org/listinfo/freeciv-commits

Reply via email to