fix
[oweals/gnunet.git] / src / util / network.c
index d889fa94bde1cb022464cd8ef9a1ad3a986d409f..8ec365269dd5b003ffce0a9407b19edaf4a20c8d 100644 (file)
 
 struct GNUNET_NETWORK_Handle
 {
+#ifndef MINGW
   int fd;
+#else
+  SOCKET fd;
+#endif
 };
 
 
@@ -57,7 +61,7 @@ struct GNUNET_NETWORK_FDSet
 
 #ifdef WINDOWS
   /**
-   * Linked list of handles 
+   * Linked list of handles
    */
   struct GNUNET_CONTAINER_SList *handles;
 #endif
@@ -222,7 +226,10 @@ GNUNET_NETWORK_socket_accept (const struct GNUNET_NETWORK_Handle *desc,
 #ifdef DARWIN
   socket_set_nosigpipe (ret);
 #endif
-  socket_set_nodelay (ret);
+#ifdef AF_UNIX
+  if (address->sa_family != AF_UNIX)
+#endif
+    socket_set_nodelay (ret);
   return ret;
 }
 
@@ -354,6 +361,64 @@ GNUNET_NETWORK_socket_listen (const struct GNUNET_NETWORK_Handle *desc,
 }
 
 
+/**
+ * How much data is available to be read on this descriptor?
+ *
+ * Returns GNUNET_NO if no data is available, or on error!
+ * @param desc socket
+ */
+ssize_t
+GNUNET_NETWORK_socket_recvfrom_amount (const struct GNUNET_NETWORK_Handle
+                                       *desc)
+{
+  int error;
+  int pending;
+
+  /* How much is there to be read? */
+#ifndef WINDOWS
+  error = ioctl (desc->fd, FIONREAD, &pending);
+  if (error == 0)
+#else
+  error = ioctlsocket (desc->fd, FIONREAD, &pending);
+  if (error != SOCKET_ERROR)
+#endif
+    return pending;
+  else
+    return GNUNET_NO;
+}
+
+/**
+ * Read data from a connected socket (always non-blocking).
+ * @param desc socket
+ * @param buffer buffer
+ * @param length length of buffer
+ * @param src_addr either the source to recv from, or all zeroes
+ *        to be filled in by recvfrom
+ * @param addrlen length of the addr
+ */
+ssize_t
+GNUNET_NETWORK_socket_recvfrom (const struct GNUNET_NETWORK_Handle * desc,
+                                void *buffer, size_t length,
+                                struct sockaddr * src_addr,
+                                socklen_t * addrlen)
+{
+  int ret;
+  int flags;
+  flags = 0;
+
+#ifdef MSG_DONTWAIT
+  flags |= MSG_DONTWAIT;
+
+#endif
+  ret = recvfrom (desc->fd, buffer, length, flags, src_addr, addrlen);
+#ifdef MINGW
+  if (SOCKET_ERROR == ret)
+    SetErrnoFromWinsockError (WSAGetLastError ());
+#endif 
+  return ret;
+}
+
+
 /**
  * Read data from a connected socket (always non-blocking).
  * @param desc socket
@@ -370,15 +435,12 @@ GNUNET_NETWORK_socket_recv (const struct GNUNET_NETWORK_Handle * desc,
 
 #ifdef MSG_DONTWAIT
   flags |= MSG_DONTWAIT;
-
-#endif /*  */
+#endif
   ret = recv (desc->fd, buffer, length, flags);
-
 #ifdef MINGW
   if (SOCKET_ERROR == ret)
     SetErrnoFromWinsockError (WSAGetLastError ());
-
-#endif /*  */
+#endif
   return ret;
 }
 
@@ -531,7 +593,11 @@ GNUNET_NETWORK_socket_create (int domain, int type, int protocol)
 #ifdef DARWIN
   socket_set_nosigpipe (ret);
 #endif
-  if (type == SOCK_STREAM)
+  if ( (type == SOCK_STREAM) 
+#ifdef AF_UNIX
+       && (domain != AF_UNIX) 
+#endif
+       )
     socket_set_nodelay (ret);
   return ret;
 }
@@ -643,6 +709,12 @@ GNUNET_NETWORK_fdset_copy (struct GNUNET_NETWORK_FDSet *to,
 #endif
 }
 
+int
+GNUNET_NETWORK_get_fd (struct GNUNET_NETWORK_Handle *desc)
+{
+  return desc->fd;
+}
+
 /**
  * Copy a native fd set
  *
@@ -658,6 +730,21 @@ GNUNET_NETWORK_fdset_copy_native (struct GNUNET_NETWORK_FDSet *to,
   to->nsds = nfds;
 }
 
+
+/**
+ * Set a native fd in a set
+ *
+ * @param to destination
+ * @param nfd native FD to set
+ */
+void GNUNET_NETWORK_fdset_set_native (struct GNUNET_NETWORK_FDSet *to,
+                                     int nfd)
+{
+  FD_SET (nfd, &to->sds);
+  to->nsds = GNUNET_MAX (nfd + 1, to->nsds);
+}
+
+
 /**
  * Add a file handle to the fd set
  * @param fds fd set
@@ -671,7 +758,9 @@ GNUNET_NETWORK_fdset_handle_set (struct GNUNET_NETWORK_FDSet *fds,
 #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));
+  GNUNET_CONTAINER_slist_add (fds->handles,
+                              GNUNET_CONTAINER_SLIST_DISPOSITION_TRANSIENT,
+                              &hw, sizeof (HANDLE));
 
 #else
   int fd;
@@ -723,20 +812,23 @@ GNUNET_NETWORK_fdset_overlap (const struct GNUNET_NETWORK_FDSet *fds1,
       return GNUNET_YES;
 #ifdef MINGW
   {
-      struct GNUNET_CONTAINER_SList_Iterator *it;
-
-      for(it = GNUNET_CONTAINER_slist_begin (fds1->handles); GNUNET_CONTAINER_slist_end (it) != GNUNET_YES; GNUNET_CONTAINER_slist_next (it))
-        {
-          HANDLE *h;
+    struct GNUNET_CONTAINER_SList_Iterator *it;
 
-          h = 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_iter_destroy (it);
+    for (it = GNUNET_CONTAINER_slist_begin (fds1->handles);
+         GNUNET_CONTAINER_slist_end (it) != GNUNET_YES;
+         GNUNET_CONTAINER_slist_next (it))
+      {
+        HANDLE *h;
+
+        h = 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_iter_destroy (it);
   }
 #endif
   return GNUNET_NO;
@@ -845,7 +937,8 @@ GNUNET_NETWORK_socket_select (struct GNUNET_NETWORK_FDSet *rfds,
   DWORD limit;
   fd_set sock_read, sock_write, sock_except;
   fd_set aread, awrite, aexcept;
-  struct GNUNET_CONTAINER_SList *handles_read, *handles_write, *handles_except;
+  struct GNUNET_CONTAINER_SList *handles_read, *handles_write,
+    *handles_except;
 
   int i;
   struct timeval tvslice;
@@ -952,8 +1045,8 @@ GNUNET_NETWORK_socket_select (struct GNUNET_NETWORK_FDSet *rfds,
 
                 {
                   GNUNET_CONTAINER_slist_add (handles_read,
-                      GNUNET_CONTAINER_SLIST_DISPOSITION_TRANSIENT, &h,
-                      sizeof (HANDLE));
+                                              GNUNET_CONTAINER_SLIST_DISPOSITION_TRANSIENT,
+                                              &h, sizeof (HANDLE));
                   retcode++;
                 }
             }
@@ -977,8 +1070,8 @@ GNUNET_NETWORK_socket_select (struct GNUNET_NETWORK_FDSet *rfds,
 
                 {
                   GNUNET_CONTAINER_slist_add (handles_except,
-                      GNUNET_CONTAINER_SLIST_DISPOSITION_TRANSIENT, &h,
-                      sizeof (HANDLE));
+                                              GNUNET_CONTAINER_SLIST_DISPOSITION_TRANSIENT,
+                                              &h, sizeof (HANDLE));
                   retcode++;
                 }
             }