Returns now GNUNET_SYSERR
[oweals/gnunet.git] / src / util / network.c
index e0b908e45f19255e36e59cfacba6890facc98df9..58d67ed19fd36ba8933e4f666d30e91e47e5d419 100644 (file)
@@ -899,6 +899,7 @@ int
 GNUNET_NETWORK_fdset_overlap (const struct GNUNET_NETWORK_FDSet *fds1,
                               const struct GNUNET_NETWORK_FDSet *fds2)
 {
+#ifndef MINGW
   int nfds;
 
   nfds = fds1->nsds;
@@ -910,26 +911,36 @@ GNUNET_NETWORK_fdset_overlap (const struct GNUNET_NETWORK_FDSet *fds1,
       if (FD_ISSET (nfds, &fds1->sds) && FD_ISSET (nfds, &fds2->sds))
        return GNUNET_YES;
     }
-#ifdef MINGW
-  {
-    struct GNUNET_CONTAINER_SList_Iterator *it;
+#else
+  struct GNUNET_CONTAINER_SList_Iterator *it;
+  HANDLE *h;
+  int i;
+  int j;
 
-    for (it = GNUNET_CONTAINER_slist_begin (fds1->handles);
-         GNUNET_CONTAINER_slist_end (it) != GNUNET_YES;
-         GNUNET_CONTAINER_slist_next (it))
-      {
-        HANDLE *h;
-
-        h = (HANDLE *) GNUNET_CONTAINER_slist_get ((const struct GNUNET_CONTAINER_SList_Iterator *)it, NULL);
-        if (GNUNET_CONTAINER_slist_contains
-            (fds2->handles, h, sizeof (HANDLE)))
-          {
-            GNUNET_CONTAINER_slist_iter_destroy (it);
-            return GNUNET_YES;
-          }
-      }
-    GNUNET_CONTAINER_slist_iter_destroy (it);
+  /*This code is somewhat hacky, we are not supposed to know what's
+    inside of fd_set; also the O(n^2) is really bad... */
+
+  for (i = 0; i < fds1->sds.fd_count; i++)
+  {
+    for (j = 0; j < fds2->sds.fd_count; j++)
+    {
+      if (fds1->sds.fd_array[i] == fds2->sds.fd_array[j])
+        return GNUNET_YES;
+    }
   }
+  it = GNUNET_CONTAINER_slist_begin (fds1->handles);
+  while (GNUNET_CONTAINER_slist_end (it) != GNUNET_YES)
+    {
+      h = (HANDLE *) GNUNET_CONTAINER_slist_get (it, NULL);
+      if (GNUNET_CONTAINER_slist_contains
+          (fds2->handles, h, sizeof (HANDLE)))
+        {
+          GNUNET_CONTAINER_slist_iter_destroy (it);
+          return GNUNET_YES;
+        }
+      GNUNET_CONTAINER_slist_next (it);
+    }
+  GNUNET_CONTAINER_slist_iter_destroy (it);
 #endif
   return GNUNET_NO;
 }
@@ -1048,11 +1059,11 @@ GNUNET_NETWORK_socket_select (struct GNUNET_NETWORK_FDSet *rfds,
 #define SAFE_FD_ISSET(fd, set)  (set != NULL && FD_ISSET(fd, set))
 
   /* calculate how long we need to wait in milliseconds */
-  if (timeout.abs_value == GNUNET_TIME_UNIT_FOREVER_REL.rel_value)
+  if (timeout.rel_value == GNUNET_TIME_UNIT_FOREVER_REL.rel_value)
     ms_total = INFINITE;
 
   else
-    ms_total = timeout.abs_value / GNUNET_TIME_UNIT_MILLISECONDS.abs_value;
+    ms_total = timeout.rel_value / GNUNET_TIME_UNIT_MILLISECONDS.rel_value;
 
   /* select() may be used as a portable way to sleep */
   if (!(rfds || wfds || efds))