X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Futil%2Fnetwork.c;h=5fe25da3bc747f472dd0771c5933fa13750ff02f;hb=72c8645af31896829b674b575c5375706f362a30;hp=125eaca8bcce741686bc220180553cb6896476b6;hpb=4df851487dba3f31f2bfd1e5fc1c78d2c26ca66c;p=oweals%2Fgnunet.git diff --git a/src/util/network.c b/src/util/network.c index 125eaca8b..5fe25da3b 100644 --- a/src/util/network.c +++ b/src/util/network.c @@ -144,12 +144,13 @@ GNUNET_NETWORK_shorten_unixpath (char *unixpath) /** * Set if a socket should use blocking or non-blocking IO. + * * @param fd socket * @param doBlock blocking mode * @return GNUNET_OK on success, GNUNET_SYSERR on error */ -static int -socket_set_blocking (struct GNUNET_NETWORK_Handle *fd, int doBlock) +int +GNUNET_NETWORK_socket_set_blocking (struct GNUNET_NETWORK_Handle *fd, int doBlock) { #if MINGW @@ -214,7 +215,7 @@ socket_set_inheritable (const struct GNUNET_NETWORK_Handle *h) #else BOOL b; SetLastError (0); - b = SetHandleInformation (h->fd, HANDLE_FLAG_INHERIT, 0); + b = SetHandleInformation ((HANDLE) h->fd, HANDLE_FLAG_INHERIT, 0); if (!b) { SetErrnoFromWinsockError (WSAGetLastError ()); @@ -307,7 +308,7 @@ initialize_network_handle (struct GNUNET_NETWORK_Handle *h, LOG_STRERROR (GNUNET_ERROR_TYPE_ERROR | GNUNET_ERROR_TYPE_BULK, "socket_set_inheritable"); - if (GNUNET_SYSERR == socket_set_blocking (h, GNUNET_NO)) + if (GNUNET_SYSERR == GNUNET_NETWORK_socket_set_blocking (h, GNUNET_NO)) { GNUNET_break (0); GNUNET_break (GNUNET_OK == GNUNET_NETWORK_socket_close (h)); @@ -363,35 +364,44 @@ GNUNET_NETWORK_socket_accept (const struct GNUNET_NETWORK_Handle *desc, /** * Bind to a connected socket - * @param desc socket + * + * @param desc socket to bind * @param address address to be bound * @param address_len length of address + * @param flags flags affecting bind behaviour * @return GNUNET_OK on success, GNUNET_SYSERR otherwise */ int GNUNET_NETWORK_socket_bind (struct GNUNET_NETWORK_Handle *desc, const struct sockaddr *address, - socklen_t address_len) + socklen_t address_len, + int flags) { int ret; #ifdef IPV6_V6ONLY #ifdef IPPROTO_IPV6 - const int on = 1; + { + const int on = 1; - if (desc->af == AF_INET6) - if (0 != setsockopt (desc->fd, IPPROTO_IPV6, IPV6_V6ONLY, &on, sizeof (on))) - LOG_STRERROR (GNUNET_ERROR_TYPE_DEBUG, "setsockopt"); + if (desc->af == AF_INET6) + if (setsockopt (desc->fd, IPPROTO_IPV6, IPV6_V6ONLY, &on, sizeof (on))) + LOG_STRERROR (GNUNET_ERROR_TYPE_DEBUG, "setsockopt"); + } #endif #endif #ifndef WINDOWS - /* This is required, and required here, but only on UNIX */ - if (0 != setsockopt (desc->fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof (on))) - LOG_STRERROR (GNUNET_ERROR_TYPE_DEBUG, "setsockopt"); + { + const int on = 1; + + /* This is required, and required here, but only on UNIX */ + if (0 != setsockopt (desc->fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof (on))) + LOG_STRERROR (GNUNET_ERROR_TYPE_DEBUG, "setsockopt"); + } #endif #ifndef LINUX #ifndef MINGW - if (address->sa_family == AF_UNIX) + if (address->sa_family == AF_UNIX && (flags & GNUNET_BIND_EXCLUSIVE) == 0) { const struct sockaddr_un *un = (const struct sockaddr_un *) address; @@ -1195,7 +1205,7 @@ static DWORD WINAPI _selector (LPVOID p) { struct _select_params *sp = p; - int i; + while (1) { WaitForSingleObject (sp->standby, INFINITE); @@ -1379,6 +1389,7 @@ GNUNET_NETWORK_socket_select (struct GNUNET_NETWORK_FDSet *rfds, p = 1; res = ioctlsocket (select_wakeup_socket, FIONBIO, &p); + LOG (GNUNET_ERROR_TYPE_DEBUG, "Select thread initialization: ioctlsocket() returns %d\n", res); alen = sizeof (s_in); s_in.sin_family = AF_INET; @@ -1388,12 +1399,16 @@ GNUNET_NETWORK_socket_select (struct GNUNET_NETWORK_FDSet *rfds, 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)); + LOG (GNUNET_ERROR_TYPE_DEBUG, "Select thread initialization: bind() returns %d\n", res); res = getsockname (select_listening_socket, (struct sockaddr *) &s_in, &alen); + LOG (GNUNET_ERROR_TYPE_DEBUG, "Select thread initialization: getsockname() returns %d\n", res); res = listen (select_listening_socket, SOMAXCONN); + LOG (GNUNET_ERROR_TYPE_DEBUG, "Select thread initialization: listen() returns %d\n", res); res = connect (select_wakeup_socket, (const struct sockaddr *) &s_in, sizeof (s_in)); + LOG (GNUNET_ERROR_TYPE_DEBUG, "Select thread initialization: connect() returns %d\n", res); select_send_socket = accept (select_listening_socket, (struct sockaddr *) &s_in, &alen); @@ -1450,10 +1465,7 @@ GNUNET_NETWORK_socket_select (struct GNUNET_NETWORK_FDSet *rfds, /* Copy all the writes to the except, so we can detect connect() errors */ for (i = 0; i < awrite.fd_count; i++) - { - if (awrite.fd_array[i] != 0 && awrite.fd_array[i] != -1) - FD_SET (awrite.fd_array[i], &aexcept); - } + FD_SET (awrite.fd_array[i], &aexcept); if (aread.fd_count > 0 || awrite.fd_count > 0 || aexcept.fd_count > 0) selectret = select (1, (rfds != NULL) ? &aread : NULL, (wfds != NULL) ? &awrite : NULL, &aexcept, &select_timeout); @@ -1472,10 +1484,7 @@ GNUNET_NETWORK_socket_select (struct GNUNET_NETWORK_FDSet *rfds, have checked that descriptors were in awrite originally before re-adding them from aexcept. Luckily, GNUnet never uses aexcept for anything, so this does not become a problem (yet). */ for (i = 0; i < aexcept.fd_count; i++) - { - if (aexcept.fd_array[i] != 0 && aexcept.fd_array[i] != -1) - FD_SET (aexcept.fd_array[i], &awrite); - } + FD_SET (aexcept.fd_array[i], &awrite); /* If our select returned something or is a 0-timed request, then also check the pipes and get out of here! */ /* Sadly, it means code duplication :( */ @@ -1485,10 +1494,11 @@ GNUNET_NETWORK_socket_select (struct GNUNET_NETWORK_FDSet *rfds, if (rfds && read_handles) { struct GNUNET_CONTAINER_SList_Iterator i; + int c; - for (i = GNUNET_CONTAINER_slist_begin (rfds->handles); + for (c = 0, i = GNUNET_CONTAINER_slist_begin (rfds->handles); GNUNET_CONTAINER_slist_end (&i) != GNUNET_YES; - GNUNET_CONTAINER_slist_next (&i)) + GNUNET_CONTAINER_slist_next (&i), c++) { struct GNUNET_DISK_FileHandle *fh; @@ -1503,7 +1513,7 @@ GNUNET_NETWORK_socket_select (struct GNUNET_NETWORK_FDSet *rfds, bret = PeekNamedPipe (fh->h, NULL, 0, NULL, &waitstatus, NULL); error = GetLastError (); LOG (GNUNET_ERROR_TYPE_DEBUG, "Peek at read pipe %d (0x%x) returned %d (%d bytes available) GLE %u\n", - i, fh->h, bret, waitstatus, error); + c, fh->h, bret, waitstatus, error); if (bret == 0) { /* TODO: either add more errors to this condition, or eliminate it @@ -1751,10 +1761,7 @@ GNUNET_NETWORK_socket_select (struct GNUNET_NETWORK_FDSet *rfds, * but we don't use OOB data. */ for (i = 0; i < awrite.fd_count; i++) - { - if (awrite.fd_array[i] != 0 && awrite.fd_array[i] != -1) - FD_SET (awrite.fd_array[i], &aexcept); - } + FD_SET (awrite.fd_array[i], &aexcept); ResetEvent (select_finished_event); SetEvent (select_standby_event); } @@ -1798,10 +1805,7 @@ GNUNET_NETWORK_socket_select (struct GNUNET_NETWORK_FDSet *rfds, } /* Check aexcept, add its contents to awrite */ for (i = 0; i < aexcept.fd_count; i++) - { - if (aexcept.fd_array[i] != 0 && aexcept.fd_array[i] != -1) - FD_SET (aexcept.fd_array[i], &awrite); - } + FD_SET (aexcept.fd_array[i], &awrite); } returnedpos = returncode - WAIT_OBJECT_0;