GNUNET_DISK_OPEN_READ
[oweals/gnunet.git] / src / util / network.c
index 0bd46b2ecb0fcb93e7feb4b573c5f7e9533379d4..021f5afaf83349fb51eff87bc927c53901293609 100644 (file)
@@ -40,7 +40,7 @@
 #include "gnunet_network_lib.h"
 #include "gnunet_scheduler_lib.h"
 
-#define DEBUG_NETWORK GNUNET_YES
+#define DEBUG_NETWORK GNUNET_NO
 
 struct GNUNET_NETWORK_TransmitHandle
 {
@@ -249,9 +249,12 @@ GNUNET_NETWORK_socket_create_from_accept (struct GNUNET_SCHEDULER_Handle
       GNUNET_log_strerror (GNUNET_ERROR_TYPE_WARNING, "accept");
       return NULL;
     }
+#ifndef MINGW
+  // FIXME NILS
   if (0 != fcntl (fd, F_SETFD, fcntl (fd, F_GETFD) | FD_CLOEXEC))
     GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR | GNUNET_ERROR_TYPE_BULK,
                          "fcntl");
+#endif
   if (addrlen > sizeof (addr))
     {
       GNUNET_break (0);
@@ -287,15 +290,17 @@ GNUNET_NETWORK_socket_create_from_accept (struct GNUNET_SCHEDULER_Handle
       if (aret == GNUNET_NO)
        GNUNET_log (GNUNET_ERROR_TYPE_INFO,
                    _("Access denied to `%s'\n"),
-                   GNUNET_a2s(uaddr, addrlen));        
+                   GNUNET_a2s(uaddr, addrlen));
       GNUNET_break (0 == SHUTDOWN (fd, SHUT_RDWR));
       GNUNET_break (0 == CLOSE (fd));
       GNUNET_free (uaddr);
       return NULL;
     }
+#if DEBUG_NETWORK
   GNUNET_log (GNUNET_ERROR_TYPE_INFO,
              _("Accepting connection from `%s'\n"),
              GNUNET_a2s(uaddr, addrlen));
+#endif
   ret = GNUNET_malloc (sizeof (struct GNUNET_NETWORK_SocketHandle) + maxbuf);
   ret->write_buffer = (char *) &ret[1];
   ret->write_buffer_size = maxbuf;
@@ -430,19 +435,24 @@ try_connect (struct GNUNET_NETWORK_SocketHandle *sock)
           sock->ai_pos = sock->ai_pos->ai_next;
           continue;
         }
+#ifndef MINGW
+      // FIXME NILS
       if (0 != fcntl (s, F_SETFD, fcntl (s, F_GETFD) | FD_CLOEXEC))
         GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR | GNUNET_ERROR_TYPE_BULK,
                              "fcntl");
+#endif
       if (GNUNET_SYSERR == socket_set_blocking (s, GNUNET_NO))
         {
           /* we'll treat this one as fatal */
           GNUNET_break (0 == CLOSE (s));
           return GNUNET_SYSERR;
         }
+#if DEBUG_NETWORK
       GNUNET_log (GNUNET_ERROR_TYPE_INFO,
                  _("Trying to connect to `%s'\n"),
                  GNUNET_a2s(sock->ai_pos->ai_addr,
                             sock->ai_pos->ai_addrlen));
+#endif
       if ((0 != CONNECT (s,
                          sock->ai_pos->ai_addr,
                          sock->ai_pos->ai_addrlen)) && (errno != EINPROGRESS))
@@ -450,6 +460,7 @@ try_connect (struct GNUNET_NETWORK_SocketHandle *sock)
           /* maybe refused / unsupported address, try next */
           GNUNET_log_strerror (GNUNET_ERROR_TYPE_INFO, "connect");
           GNUNET_break (0 == CLOSE (s));
+          sock->ai_pos = sock->ai_pos->ai_next;
           continue;
         }
       break;
@@ -520,7 +531,7 @@ connect_continuation (void *cls,
     }
   /* connect succeeded! clean up "ai" */
 #if DEBUG_NETWORK
-  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG, 
+  GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
              "Connection to `%s' succeeded!\n",
              GNUNET_a2s(sock->addr, sock->addrlen));
 #endif
@@ -606,6 +617,7 @@ GNUNET_NETWORK_socket_create_from_sockaddr (struct GNUNET_SCHEDULER_Handle
                                             socklen_t addrlen, size_t maxbuf)
 {
   int s;
+  struct GNUNET_NETWORK_SocketHandle *ret;
 
   s = SOCKET (af_family, SOCK_STREAM, 0);
   if (s == -1)
@@ -614,18 +626,22 @@ GNUNET_NETWORK_socket_create_from_sockaddr (struct GNUNET_SCHEDULER_Handle
                            GNUNET_ERROR_TYPE_BULK, "socket");
       return NULL;
     }
+#ifndef MINGW
   if (0 != fcntl (s, F_SETFD, fcntl (s, F_GETFD) | FD_CLOEXEC))
     GNUNET_log_strerror (GNUNET_ERROR_TYPE_ERROR | GNUNET_ERROR_TYPE_BULK,
                          "fcntl");
+#endif
   if (GNUNET_SYSERR == socket_set_blocking (s, GNUNET_NO))
     {
       /* we'll treat this one as fatal */
       GNUNET_break (0 == CLOSE (s));
       return NULL;
     }
+#if DEBUG_NETWORK
   GNUNET_log (GNUNET_ERROR_TYPE_INFO,
              _("Trying to connect to `%s'\n"),
              GNUNET_a2s(serv_addr, addrlen));
+#endif
   if ((0 != CONNECT (s, serv_addr, addrlen)) && (errno != EINPROGRESS))
     {
       /* maybe refused / unsupported address, try next */
@@ -633,7 +649,11 @@ GNUNET_NETWORK_socket_create_from_sockaddr (struct GNUNET_SCHEDULER_Handle
       GNUNET_break (0 == CLOSE (s));
       return NULL;
     }
-  return GNUNET_NETWORK_socket_create_from_existing (sched, s, maxbuf);
+  ret = GNUNET_NETWORK_socket_create_from_existing (sched, s, maxbuf);
+  ret->addr = GNUNET_malloc (addrlen);
+  memcpy (ret->addr, serv_addr, addrlen);
+  ret->addrlen = addrlen;
+  return ret;
 }
 
 
@@ -701,7 +721,7 @@ destroy_continuation (void *cls,
         }
     }
   if (sock->sock != -1)
-    GNUNET_break (0 == CLOSE (sock->sock));    
+    GNUNET_break (0 == CLOSE (sock->sock));
   GNUNET_free_non_null (sock->addr);
   if (sock->ai != NULL)
     freeaddrinfo (sock->ai);
@@ -799,7 +819,14 @@ receive_ready (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
     }
   GNUNET_assert (FD_ISSET (sh->sock, tc->read_ready));
 RETRY:
-  ret = RECV (sh->sock, buffer, sh->max, MSG_DONTWAIT);
+  ret = RECV (sh->sock, buffer, sh->max,
+#ifndef MINGW
+      // FIXME MINGW
+      MSG_DONTWAIT
+#else
+      0
+#endif
+      );
   if (ret == -1)
     {
       if (errno == EINTR)
@@ -814,7 +841,7 @@ RETRY:
 #if DEBUG_NETWORK
   GNUNET_log (GNUNET_ERROR_TYPE_DEBUG,
               "receive_ready read %u/%u bytes from `%s'!\n",
-             (unsigned int) ret, 
+             (unsigned int) ret,
              sh->max,
              GNUNET_a2s(sh->addr, sh->addrlen));
 #endif
@@ -878,7 +905,7 @@ receive_again (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
                                             GNUNET_TIME_absolute_get_remaining
                                             (sh->receive_timeout),
                                             sh->sock, &receive_ready,
-                                            sh);   
+                                            sh);
 }
 
 
@@ -1052,8 +1079,10 @@ transmit_ready (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
     }
   if (sock->sock == -1)
     {
+#if DEBUG_NETWORK
       GNUNET_log (GNUNET_ERROR_TYPE_INFO,
                   _("Could not satisfy pending transmission request, socket closed or connect failed.\n"));
+#endif
       transmit_error (sock);
       return;                   /* connect failed for good, we're finished */
     }
@@ -1073,7 +1102,14 @@ transmit_ready (void *cls, const struct GNUNET_SCHEDULER_TaskContext *tc)
 RETRY:
   ret = SEND (sock->sock,
               &sock->write_buffer[sock->write_buffer_pos],
-              have, MSG_DONTWAIT | MSG_NOSIGNAL);
+              have,
+#ifndef MINGW
+              // FIXME NILS
+              MSG_DONTWAIT | MSG_NOSIGNAL
+#else
+              0
+#endif
+  );
   if (ret == -1)
     {
       if (errno == EINTR)