X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=src%2Futil%2Fnetwork.c;h=8ec365269dd5b003ffce0a9407b19edaf4a20c8d;hb=d47f834c1f2de41c9fba74a4b6928e7c8e0679e0;hp=398f2b51a8cf14d8bf9a7a3c8fbdb9d51aa8feee;hpb=71c69f178dd8ad00e917c8724c4f2417f8d9648f;p=oweals%2Fgnunet.git diff --git a/src/util/network.c b/src/util/network.c index 398f2b51a..8ec365269 100644 --- a/src/util/network.c +++ b/src/util/network.c @@ -38,7 +38,11 @@ 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; } @@ -360,18 +367,21 @@ GNUNET_NETWORK_socket_listen (const struct GNUNET_NETWORK_Handle *desc, * Returns GNUNET_NO if no data is available, or on error! * @param desc socket */ -unsigned int -GNUNET_NETWORK_socket_recvfrom_amount (const struct GNUNET_NETWORK_Handle * desc) +ssize_t +GNUNET_NETWORK_socket_recvfrom_amount (const struct GNUNET_NETWORK_Handle + *desc) { int error; - unsigned int pending; + int pending; /* How much is there to be read? */ - error = ioctl(desc->fd, FIONREAD, &pending); - GNUNET_log_from(GNUNET_ERROR_TYPE_INFO, "udp", _ - ("pending is %u bytes, error is %d\n"), pending, error); - +#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; @@ -389,7 +399,8 @@ GNUNET_NETWORK_socket_recvfrom_amount (const struct GNUNET_NETWORK_Handle * desc ssize_t GNUNET_NETWORK_socket_recvfrom (const struct GNUNET_NETWORK_Handle * desc, void *buffer, size_t length, - struct sockaddr *src_addr, socklen_t *addrlen) + struct sockaddr * src_addr, + socklen_t * addrlen) { int ret; int flags; @@ -398,14 +409,12 @@ GNUNET_NETWORK_socket_recvfrom (const struct GNUNET_NETWORK_Handle * desc, #ifdef MSG_DONTWAIT flags |= MSG_DONTWAIT; -#endif /* */ +#endif ret = recvfrom (desc->fd, buffer, length, flags, src_addr, addrlen); - #ifdef MINGW if (SOCKET_ERROR == ret) SetErrnoFromWinsockError (WSAGetLastError ()); - -#endif /* */ +#endif return ret; } @@ -426,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; } @@ -587,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; } @@ -720,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 @@ -733,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; @@ -785,20 +812,23 @@ GNUNET_NETWORK_fdset_overlap (const struct GNUNET_NETWORK_FDSet *fds1, return GNUNET_YES; #ifdef MINGW { - struct GNUNET_CONTAINER_SList_Iterator *it; + 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; - - 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; @@ -907,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; @@ -1014,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++; } } @@ -1039,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++; } }