newline
[oweals/gnunet.git] / src / util / server.c
index 832f4ed583aacc5e7ac299645c26c639a8a21e3c..95b98e4b50ee968e788794adcb714289947affaf 100644 (file)
@@ -386,11 +386,20 @@ open_listen_socket (const struct sockaddr *serverAddr, socklen_t socklen)
       errno = 0;
       return NULL;
     }
-  if ((port != 0) &&
-      (GNUNET_NETWORK_socket_setsockopt
-       (sock, SOL_SOCKET, SO_REUSEADDR, &on, sizeof (on)) != GNUNET_OK))
-    GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR | GNUNET_ERROR_TYPE_BULK,
-                         "setsockopt");
+  if (port != 0) 
+    {
+      if (GNUNET_NETWORK_socket_setsockopt
+         (sock, SOL_SOCKET, SO_REUSEADDR, &on, sizeof (on)) != GNUNET_OK)
+       GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR | GNUNET_ERROR_TYPE_BULK,
+                            "setsockopt");
+#ifdef IPV6_V6ONLY
+      if ( (serverAddr->sa_family == AF_INET6) &&
+          (GNUNET_NETWORK_socket_setsockopt
+           (sock, IPPROTO_IPV6, IPV6_V6ONLY, &on, sizeof (on)) != GNUNET_OK) )
+       GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR | GNUNET_ERROR_TYPE_BULK,
+                            "setsockopt");
+#endif
+    }
   /* bind the socket */
   if (GNUNET_NETWORK_socket_bind (sock, serverAddr, socklen) != GNUNET_OK)
     {
@@ -750,7 +759,7 @@ process_incoming (void *cls,
       (client->shutdown_now == GNUNET_YES) ||
       (GNUNET_YES != client->check (client->client_closure)))
     {
-      /* other side closed connection, error connecting, etc. */      
+      /* other side closed connection, error connecting, etc. */
       GNUNET_SERVER_client_disconnect (client);
       return;
     }
@@ -1210,9 +1219,21 @@ GNUNET_SERVER_client_disconnect (struct GNUNET_SERVER_Client *client)
         }
     }
   if (rc > 0)
-    return;
+    {
+#if DEBUG_SERVER
+      GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                 "RC still positive, not destroying everything.\n");
+#endif
+      return;
+    }
   if (client->in_process_client_buffer == GNUNET_YES)
-    return;
+    {
+#if DEBUG_SERVER
+      GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
+                 "Still processing inputs, not destroying everything.\n");
+#endif
+      return;
+    }
   client->destroy (client->client_closure, client->persist);
   GNUNET_free (client);  
 }