-dead
[oweals/gnunet.git] / src / util / network.c
index ca8105fc7fc18276eeb18dbcb61f962bca6e3b8f..edb8e21d5c2616d37a6da6498f59f03f95423c4f 100644 (file)
@@ -1130,37 +1130,37 @@ GNUNET_NETWORK_fdset_destroy (struct GNUNET_NETWORK_FDSet *fds)
 }
 
 #if MINGW
-struct _select_params\r
-{\r
-  fd_set *r;\r
-  fd_set *w;\r
-  fd_set *e;\r
-  struct timeval *tv;\r
-  HANDLE wakeup;\r
-  HANDLE standby;\r
-  SOCKET wakeup_socket;\r
-  int status;\r
-};\r
-
-static DWORD WINAPI\r
-_selector (LPVOID p)\r
-{\r
-  struct _select_params *sp = p;\r
-  int i;\r
-  while (1)\r
-  {\r
-    WaitForSingleObject (sp->standby, INFINITE);\r
-    ResetEvent (sp->standby);\r
-    sp->status = select (1, sp->r, sp->w, sp->e, sp->tv);\r
-    if (FD_ISSET (sp->wakeup_socket, sp->r))\r
-    {\r
-      FD_CLR (sp->wakeup_socket, sp->r);\r
-      sp->status -= 1;\r
-    }\r
-    SetEvent (sp->wakeup);\r
-  }\r
-  return 0;\r
-}\r
+struct _select_params
+{
+  fd_set *r;
+  fd_set *w;
+  fd_set *e;
+  struct timeval *tv;
+  HANDLE wakeup;
+  HANDLE standby;
+  SOCKET wakeup_socket;
+  int status;
+};
+
+static DWORD WINAPI
+_selector (LPVOID p)
+{
+  struct _select_params *sp = p;
+  int i;
+  while (1)
+  {
+    WaitForSingleObject (sp->standby, INFINITE);
+    ResetEvent (sp->standby);
+    sp->status = select (1, sp->r, sp->w, sp->e, sp->tv);
+    if (FD_ISSET (sp->wakeup_socket, sp->r))
+    {
+      FD_CLR (sp->wakeup_socket, sp->r);
+      sp->status -= 1;
+    }
+    SetEvent (sp->wakeup);
+  }
+  return 0;
+}
 #endif
 
 /**
@@ -1193,14 +1193,14 @@ GNUNET_NETWORK_socket_select (struct GNUNET_NETWORK_FDSet *rfds,
   static HANDLE hEventPipeWrite = 0;
   static HANDLE hEventReadReady = 0;
 
-  static struct _select_params sp;\r
+  static struct _select_params sp;
   static HANDLE select_thread = NULL;
   static HANDLE select_finished_event = NULL;
   static HANDLE select_standby_event = NULL;
-  static SOCKET select_wakeup_socket = -1;\r
-  static SOCKET select_send_socket = -1;\r
+  static SOCKET select_wakeup_socket = -1;
+  static SOCKET select_send_socket = -1;
   static struct timeval select_timeout;
-\r
+
   int readPipes = 0;
   int writePipePos = 0;
 
@@ -1273,11 +1273,11 @@ GNUNET_NETWORK_socket_select (struct GNUNET_NETWORK_FDSet *rfds,
 #endif
       )
   {
+    GNUNET_break (0);
     LOG (GNUNET_ERROR_TYPE_ERROR,
          _
          ("Fatal internal logic error, process hangs in `%s' (abort with CTRL-C)!\n"),
          "select");
-    GNUNET_break (0);
   }
 #ifndef MINGW
   tv.tv_sec = timeout.rel_value / GNUNET_TIME_UNIT_SECONDS.rel_value;
@@ -1296,7 +1296,14 @@ GNUNET_NETWORK_socket_select (struct GNUNET_NETWORK_FDSet *rfds,
   if (timeout.rel_value == GNUNET_TIME_UNIT_FOREVER_REL.rel_value)
     ms_total = INFINITE;
   else
+  {
     ms_total = timeout.rel_value / GNUNET_TIME_UNIT_MILLISECONDS.rel_value;
+    if (timeout.rel_value / GNUNET_TIME_UNIT_MILLISECONDS.rel_value > 0xFFFFFFFFLL - 1)
+    {
+      GNUNET_break (0);
+      ms_total = 0xFFFFFFFF - 1;
+    }
+  }
   /* select() may be used as a portable way to sleep */
   if (!(rfds || wfds || efds))
   {
@@ -1306,46 +1313,46 @@ GNUNET_NETWORK_socket_select (struct GNUNET_NETWORK_FDSet *rfds,
 
   if (select_thread == NULL)
   {
-    SOCKET select_listening_socket = -1;\r
-    struct sockaddr_in s_in;\r
-    int alen;\r
-    int res;\r
-    unsigned long p;\r
-
-    select_standby_event = CreateEvent (NULL, TRUE, FALSE, NULL);\r
-    select_finished_event = CreateEvent (NULL, TRUE, FALSE, NULL);\r
-
-    select_wakeup_socket = WSASocket (AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, WSA_FLAG_OVERLAPPED);\r
-\r
-    select_listening_socket = WSASocket (AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, WSA_FLAG_OVERLAPPED);\r
-\r
-    p = 1;\r
-    res = ioctlsocket (select_wakeup_socket, FIONBIO, &p);\r
-\r
-    alen = sizeof (s_in);\r
-    s_in.sin_family = AF_INET;\r
-    s_in.sin_port = 0;\r
-    s_in.sin_addr.S_un.S_un_b.s_b1 = 127;\r
-    s_in.sin_addr.S_un.S_un_b.s_b2 = 0;\r
-    s_in.sin_addr.S_un.S_un_b.s_b3 = 0;\r
-    s_in.sin_addr.S_un.S_un_b.s_b4 = 1;\r
-    res = bind (select_listening_socket, (const struct sockaddr *) &s_in, sizeof (s_in));\r
-\r
-    res = getsockname (select_listening_socket, (struct sockaddr *) &s_in, &alen);\r
-\r
-    res = listen (select_listening_socket, SOMAXCONN);\r
-\r
-    res = connect (select_wakeup_socket, (const struct sockaddr *) &s_in, sizeof (s_in));\r
-\r
-    select_send_socket = accept (select_listening_socket, (struct sockaddr *) &s_in, &alen);\r
-\r
-    closesocket (select_listening_socket);\r
-\r
-    sp.wakeup = select_finished_event;\r
-    sp.standby = select_standby_event;\r
+    SOCKET select_listening_socket = -1;
+    struct sockaddr_in s_in;
+    int alen;
+    int res;
+    unsigned long p;
+
+    select_standby_event = CreateEvent (NULL, TRUE, FALSE, NULL);
+    select_finished_event = CreateEvent (NULL, TRUE, FALSE, NULL);
+
+    select_wakeup_socket = WSASocket (AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, WSA_FLAG_OVERLAPPED);
+
+    select_listening_socket = WSASocket (AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, WSA_FLAG_OVERLAPPED);
+
+    p = 1;
+    res = ioctlsocket (select_wakeup_socket, FIONBIO, &p);
+
+    alen = sizeof (s_in);
+    s_in.sin_family = AF_INET;
+    s_in.sin_port = 0;
+    s_in.sin_addr.S_un.S_un_b.s_b1 = 127;
+    s_in.sin_addr.S_un.S_un_b.s_b2 = 0;
+    s_in.sin_addr.S_un.S_un_b.s_b3 = 0;
+    s_in.sin_addr.S_un.S_un_b.s_b4 = 1;
+    res = bind (select_listening_socket, (const struct sockaddr *) &s_in, sizeof (s_in));
+
+    res = getsockname (select_listening_socket, (struct sockaddr *) &s_in, &alen);
+
+    res = listen (select_listening_socket, SOMAXCONN);
+
+    res = connect (select_wakeup_socket, (const struct sockaddr *) &s_in, sizeof (s_in));
+
+    select_send_socket = accept (select_listening_socket, (struct sockaddr *) &s_in, &alen);
+
+    closesocket (select_listening_socket);
+
+    sp.wakeup = select_finished_event;
+    sp.standby = select_standby_event;
     sp.wakeup_socket = select_wakeup_socket;
-\r
-    select_thread = CreateThread (NULL, 0, _selector, &sp, 0, NULL);\r
+
+    select_thread = CreateThread (NULL, 0, _selector, &sp, 0, NULL);
   }
 
   /* Events for pipes */
@@ -1402,7 +1409,7 @@ GNUNET_NETWORK_socket_select (struct GNUNET_NETWORK_FDSet *rfds,
 
       fh = (struct GNUNET_DISK_FileHandle *) GNUNET_CONTAINER_slist_get (&i,
                                                                          NULL);
-      if (fh->type == GNUNET_PIPE)
+      if (fh->type == GNUNET_DISK_HANLDE_TYPE_PIPE)
       {
         /* Read zero bytes to check the status of the pipe */
         LOG (GNUNET_ERROR_TYPE_DEBUG, "Reading 0 bytes from the pipe 0x%x\n",
@@ -1463,7 +1470,7 @@ GNUNET_NETWORK_socket_select (struct GNUNET_NETWORK_FDSet *rfds,
 
       fh = (struct GNUNET_DISK_FileHandle *) GNUNET_CONTAINER_slist_get (&i,
                                                                          NULL);
-      if (fh->type == GNUNET_PIPE)
+      if (fh->type == GNUNET_DISK_HANLDE_TYPE_PIPE)
       {
         if (!PeekNamedPipe (fh->h, NULL, 0, NULL, &dwBytes, NULL))
         {
@@ -1513,13 +1520,25 @@ GNUNET_NETWORK_socket_select (struct GNUNET_NETWORK_FDSet *rfds,
   }
 
   handle_array[nhandles] = NULL;
-  LOG (GNUNET_ERROR_TYPE_DEBUG, "nfds: %d, handles: %d, will wait: %d ms\n", 
-       nfds, nhandles, ms_total);
+  LOG (GNUNET_ERROR_TYPE_DEBUG, "nfds: %d, handles: %d, will wait: %llu ms\n", 
+       nfds, nhandles, (unsigned long long) ms_total);
   if (nhandles)
+  {
     returncode =
         WaitForMultipleObjects (nhandles, handle_array, FALSE, ms_total);
-  LOG (GNUNET_ERROR_TYPE_DEBUG, "WaitForMultipleObjects Returned : %d\n",
-       returncode);
+    LOG (GNUNET_ERROR_TYPE_DEBUG, "WaitForMultipleObjects Returned : %d\n",
+         returncode);
+  }
+  else if (nfds > 0)
+  {
+    i = (int) WaitForSingleObject (select_finished_event, INFINITE);
+    returncode = WAIT_TIMEOUT;
+  }
+  else
+  {
+    /* Shouldn't come this far. If it does - investigate. */
+    GNUNET_assert (0);
+  }
 
   if (nfds > 0)
   {
@@ -1527,14 +1546,14 @@ GNUNET_NETWORK_socket_select (struct GNUNET_NETWORK_FDSet *rfds,
      * and wake up by itself.
      */
     if (ms_total != 0)
-      i = send (select_send_socket, (const char *) &returnedpos, 1, 0);\r
-    i = (int) WaitForSingleObject (select_finished_event, INFINITE);\r
+      i = send (select_send_socket, (const char *) &returnedpos, 1, 0);
+    i = (int) WaitForSingleObject (select_finished_event, INFINITE);
     LOG (GNUNET_ERROR_TYPE_DEBUG, "Finished waiting for the select thread: %d %d\n", i, sp.status);
     if (ms_total != 0)
     {
       do
       {
-        i = recv (select_wakeup_socket, (char *) &returnedpos, 1, 0);\r
+        i = recv (select_wakeup_socket, (char *) &returnedpos, 1, 0);
       } while (i == 1);
     }
     /* Check aexcept, add its contents to awrite */
@@ -1580,7 +1599,11 @@ GNUNET_NETWORK_socket_select (struct GNUNET_NETWORK_FDSet *rfds,
              i, readArray[i]->h, bret, waitstatus, error);
         if (bret == 0)
         {
-          if (error != ERROR_BROKEN_PIPE)
+          /* TODO: either add more errors to this condition, or eliminate it
+           * entirely (failed to peek -> pipe is in serious trouble, should
+           * be selected as readable).
+           */
+          if (error != ERROR_BROKEN_PIPE && error != ERROR_INVALID_HANDLE)
             continue;
         }
         else if (waitstatus <= 0)
@@ -1609,7 +1632,7 @@ GNUNET_NETWORK_socket_select (struct GNUNET_NETWORK_FDSet *rfds,
 
       fh = (struct GNUNET_DISK_FileHandle *) GNUNET_CONTAINER_slist_get (&t,
                                                                          NULL);
-      if (fh->type == GNUNET_PIPE)
+      if (fh->type == GNUNET_DISK_HANLDE_TYPE_PIPE)
       {
         CancelIo (fh->h);
       }