WiP
[oweals/gnunet.git] / src / util / network.c
index 58d67ed19fd36ba8933e4f666d30e91e47e5d419..d23f1a23d7726da871c06360a69aa485f23272d7 100644 (file)
@@ -270,10 +270,12 @@ GNUNET_NETWORK_socket_bind (struct GNUNET_NETWORK_Handle *desc,
 #ifdef IPPROTO_IPV6
   const int on = 1;
   if (desc->af == AF_INET6)
-    setsockopt (desc->fd, IPPROTO_IPV6, IPV6_V6ONLY, &on, sizeof (on));
+    if (0 != setsockopt (desc->fd, IPPROTO_IPV6, IPV6_V6ONLY, &on, sizeof (on)))
+      GNUNET_log_strerror (GNUNET_ERROR_TYPE_DEBUG, "setsockopt");
 #if 0
   /* is this needed or desired? or done elsewhere? */
-  setsockopt (desc->fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof (on));
+  if (0 != setsockopt (desc->fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof (on)))
+    GNUNET_log_strerror (GNUNET_ERROR_TYPE_DEBUG, "setsockopt");
 #endif
 #endif
 #endif
@@ -449,6 +451,7 @@ GNUNET_NETWORK_socket_recvfrom_amount (const struct GNUNET_NETWORK_Handle
     return GNUNET_NO;
 }
 
+
 /**
  * Read data from a connected socket (always non-blocking).
  * @param desc socket
@@ -772,12 +775,20 @@ GNUNET_NETWORK_fdset_copy (struct GNUNET_NETWORK_FDSet *to,
 #endif
 }
 
+
+/**
+ * Return file descriptor for this network handle
+ *
+ * @param desc wrapper to process
+ * @return POSIX file descriptor
+ */
 int
 GNUNET_NETWORK_get_fd (struct GNUNET_NETWORK_Handle *desc)
 {
   return desc->fd;
 }
 
+
 /**
  * Copy a native fd set
  *
@@ -803,6 +814,7 @@ GNUNET_NETWORK_fdset_copy_native (struct GNUNET_NETWORK_FDSet *to,
 void GNUNET_NETWORK_fdset_set_native (struct GNUNET_NETWORK_FDSet *to,
                                      int nfd)
 {
+  GNUNET_assert(nfd >= 0);
   FD_SET (nfd, &to->sds);
   to->nsds = GNUNET_MAX (nfd + 1, to->nsds);
 }
@@ -835,11 +847,9 @@ GNUNET_NETWORK_fdset_handle_set (struct GNUNET_NETWORK_FDSet *fds,
                                  const struct GNUNET_DISK_FileHandle *h)
 {
 #ifdef MINGW
-  HANDLE hw;
-  GNUNET_DISK_internal_file_handle_ (h, &hw, sizeof (HANDLE));
   GNUNET_CONTAINER_slist_add (fds->handles,
                               GNUNET_CONTAINER_SLIST_DISPOSITION_TRANSIENT,
-                              &hw, sizeof (HANDLE));
+                              h, sizeof (struct GNUNET_DISK_FileHandle));
 
 #else
   int fd;
@@ -852,23 +862,6 @@ GNUNET_NETWORK_fdset_handle_set (struct GNUNET_NETWORK_FDSet *fds,
 }
 
 
-#if MINGW
-/**
- * Add a W32 file handle to the fd set
- * @param fds fd set
- * @param h the file handle to add
- */
-void
-GNUNET_NETWORK_fdset_handle_set_native_w32_handle (struct GNUNET_NETWORK_FDSet *fds,
-                                                  HANDLE h)
-{
-  GNUNET_CONTAINER_slist_add (fds->handles,
-                              GNUNET_CONTAINER_SLIST_DISPOSITION_TRANSIENT,
-                              &h, sizeof (HANDLE));
-}
-#endif
-
-
 /**
  * Check if a file handle is part of an fd set
  * @param fds fd set
@@ -881,8 +874,8 @@ GNUNET_NETWORK_fdset_handle_isset (const struct GNUNET_NETWORK_FDSet *fds,
 {
 
 #ifdef MINGW
-  return GNUNET_CONTAINER_slist_contains (fds->handles, &h->h,
-                                          sizeof (HANDLE));
+  return GNUNET_CONTAINER_slist_contains (fds->handles, h,
+                                          sizeof (struct GNUNET_DISK_FileHandle));
 #else
   return FD_ISSET (h->fd, &fds->sds);
 #endif
@@ -913,7 +906,7 @@ GNUNET_NETWORK_fdset_overlap (const struct GNUNET_NETWORK_FDSet *fds1,
     }
 #else
   struct GNUNET_CONTAINER_SList_Iterator *it;
-  HANDLE *h;
+  struct GNUNET_DISK_FileHandle *h;
   int i;
   int j;
 
@@ -931,9 +924,9 @@ GNUNET_NETWORK_fdset_overlap (const struct GNUNET_NETWORK_FDSet *fds1,
   it = GNUNET_CONTAINER_slist_begin (fds1->handles);
   while (GNUNET_CONTAINER_slist_end (it) != GNUNET_YES)
     {
-      h = (HANDLE *) GNUNET_CONTAINER_slist_get (it, NULL);
+      h = (struct GNUNET_DISK_FileHandle *) GNUNET_CONTAINER_slist_get (it, NULL);
       if (GNUNET_CONTAINER_slist_contains
-          (fds2->handles, h, sizeof (HANDLE)))
+          (fds2->handles, h, sizeof (struct GNUNET_DISK_FileHandle)))
         {
           GNUNET_CONTAINER_slist_iter_destroy (it);
           return GNUNET_YES;
@@ -1137,28 +1130,49 @@ GNUNET_NETWORK_socket_select (struct GNUNET_NETWORK_FDSet *rfds,
                GNUNET_CONTAINER_slist_next (i))
 
             {
-              HANDLE h;
+              struct GNUNET_DISK_FileHandle *fh;
               DWORD dwBytes;
-              h = *(HANDLE *) GNUNET_CONTAINER_slist_get (i, NULL);
-              if (!PeekNamedPipe (h, NULL, 0, NULL, &dwBytes, NULL))
+              fh = (struct GNUNET_DISK_FileHandle *) GNUNET_CONTAINER_slist_get (i, NULL);
+              if (fh->type == GNUNET_PIPE)
                 {
-                  retcode = -1;
-                  SetErrnoFromWinError (GetLastError ());
-
-#if DEBUG_NETWORK
-                  GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR,
-                                       "PeekNamedPipe");
+                  if (!PeekNamedPipe (fh->h, NULL, 0, NULL, &dwBytes, NULL))
+                    {
+                      DWORD error_code = GetLastError ();
+                      switch (error_code)
+                      {
+                      case ERROR_BROKEN_PIPE:
+                        GNUNET_CONTAINER_slist_add (handles_read,
+                                                  GNUNET_CONTAINER_SLIST_DISPOSITION_TRANSIENT,
+                                                  fh, sizeof (struct GNUNET_DISK_FileHandle));
+                        retcode++;
+                        break;
+                      default:
+                        retcode = -1;
+                        SetErrnoFromWinError (error_code);
+
+    #if DEBUG_NETWORK
+                        GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR,
+                                             "PeekNamedPipe");
+
+    #endif
+                        goto select_loop_end;
+                      }
+                    }
+                  else if (dwBytes)
 
-#endif
-                  goto select_loop_end;
+                    {
+                      GNUNET_CONTAINER_slist_add (handles_read,
+                                                  GNUNET_CONTAINER_SLIST_DISPOSITION_TRANSIENT,
+                                                  fh, sizeof (struct GNUNET_DISK_FileHandle));
+                      retcode++;
+                    }
                 }
-              else if (dwBytes)
-
+              else
                 {
+                  /* Should we wait for more bytes to read here (in case of previous EOF)? */
                   GNUNET_CONTAINER_slist_add (handles_read,
                                               GNUNET_CONTAINER_SLIST_DISPOSITION_TRANSIENT,
-                                              &h, sizeof (HANDLE));
-                  retcode++;
+                                              fh, sizeof (struct GNUNET_DISK_FileHandle));
                 }
             }
           GNUNET_CONTAINER_slist_iter_destroy (i);
@@ -1174,16 +1188,20 @@ GNUNET_NETWORK_socket_select (struct GNUNET_NETWORK_FDSet *rfds,
                GNUNET_CONTAINER_slist_next (i))
 
             {
-              HANDLE h;
+              struct GNUNET_DISK_FileHandle *fh;
               DWORD dwBytes;
-              h = *(HANDLE *) GNUNET_CONTAINER_slist_get (i, NULL);
-              if (!PeekNamedPipe (h, NULL, 0, NULL, &dwBytes, NULL))
 
+              fh = (struct GNUNET_DISK_FileHandle *) GNUNET_CONTAINER_slist_get (i, NULL);
+              if (fh->type == GNUNET_PIPE)
                 {
-                  GNUNET_CONTAINER_slist_add (handles_except,
-                                              GNUNET_CONTAINER_SLIST_DISPOSITION_TRANSIENT,
-                                              &h, sizeof (HANDLE));
-                  retcode++;
+                  if (!PeekNamedPipe (fh->h, NULL, 0, NULL, &dwBytes, NULL))
+
+                    {
+                      GNUNET_CONTAINER_slist_add (handles_except,
+                                                  GNUNET_CONTAINER_SLIST_DISPOSITION_TRANSIENT,
+                                                  fh, sizeof (struct GNUNET_DISK_FileHandle));
+                      retcode++;
+                    }
                 }
             }
           GNUNET_CONTAINER_slist_iter_destroy (i);