X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fnetwork%2Fio.c;h=2defe3188b5e3193328b0bc36019c3d21ab88ebb;hb=3de7f18a4cc4f264a571384437373bc255da0632;hp=ab72ebae5dddf4edd52626a06ace90dd6e8efa37;hpb=5a5cbadd836de42cb1655e65e2353edfd9241db1;p=vlc diff --git a/src/network/io.c b/src/network/io.c index ab72ebae5d..2defe3188b 100644 --- a/src/network/io.c +++ b/src/network/io.c @@ -76,43 +76,15 @@ extern int rootwrap_bind (int family, int socktype, int protocol, const struct sockaddr *addr, size_t alen); -int net_SetupSocket (int fd) -{ -#if defined (WIN32) || defined (UNDER_CE) - ioctlsocket (fd, FIONBIO, &(unsigned long){ 1 }); -#else - fcntl (fd, F_SETFD, FD_CLOEXEC); - fcntl (fd, F_SETFL, fcntl (fd, F_GETFL, 0) | O_NONBLOCK); -#endif - - setsockopt (fd, SOL_SOCKET, SO_REUSEADDR, &(int){ 1 }, sizeof (int)); - return 0; -} - - int net_Socket (vlc_object_t *p_this, int family, int socktype, int protocol) { - int fd; - -#ifdef SOCK_CLOEXEC - fd = socket (family, socktype | SOCK_NONBLOCK | SOCK_CLOEXEC, protocol); - if (fd == -1 && errno == EINVAL) -#endif + int fd = vlc_socket (family, socktype, protocol, true); + if (fd == -1) { - fd = socket (family, socktype, protocol); - if (fd == -1) - { - if (net_errno != EAFNOSUPPORT) - msg_Err (p_this, "cannot create socket: %m"); - return -1; - } -#ifndef WIN32 - fcntl (fd, F_SETFD, FD_CLOEXEC); - fcntl (fd, F_SETFL, fcntl (fd, F_GETFL, 0) | O_NONBLOCK); -#else - ioctlsocket (fd, FIONBIO, &(unsigned long){ 1 }); -#endif + if (net_errno != EAFNOSUPPORT) + msg_Err (p_this, "cannot create socket: %m"); + return -1; } setsockopt (fd, SOL_SOCKET, SO_REUSEADDR, &(int){ 1 }, sizeof (int)); @@ -155,11 +127,12 @@ int net_Socket (vlc_object_t *p_this, int family, int socktype, int *net_Listen (vlc_object_t *p_this, const char *psz_host, - int i_port, int protocol) + int i_port, int type, int protocol) { struct addrinfo hints, *res; memset (&hints, 0, sizeof( hints )); + hints.ai_socktype = type; hints.ai_protocol = protocol; hints.ai_flags = AI_PASSIVE; @@ -169,7 +142,7 @@ int *net_Listen (vlc_object_t *p_this, const char *psz_host, if (i_val) { msg_Err (p_this, "Cannot resolve %s port %d : %s", psz_host, i_port, - vlc_gai_strerror (i_val)); + gai_strerror (i_val)); return NULL; } @@ -263,7 +236,7 @@ int *net_Listen (vlc_object_t *p_this, const char *psz_host, net_Close (fd); } - vlc_freeaddrinfo (res); + freeaddrinfo (res); if (sockv != NULL) sockv[sockc] = -1; @@ -356,6 +329,7 @@ net_Read (vlc_object_t *restrict p_this, int fd, const v_socket_t *vs, switch (WSAGetLastError ()) { case WSAEWOULDBLOCK: + case WSAEINTR: /* only happens with vs != NULL (TLS) - not really an error */ continue; @@ -428,8 +402,11 @@ ssize_t net_Write( vlc_object_t *p_this, int fd, const v_socket_t *p_vs, { .fd = vlc_object_waitpipe (p_this), .events = POLLIN }, }; - if (ufd[1].fd == -1) + if (unlikely(ufd[1].fd == -1)) + { + vlc_testcancel (); return -1; + } while( i_data > 0 ) { @@ -486,6 +463,9 @@ ssize_t net_Write( vlc_object_t *p_this, int fd, const v_socket_t *p_vs, i_total += val; } + if (unlikely(i_data == 0)) + vlc_testcancel (); /* corner case */ + if ((i_total > 0) || (i_data == 0)) return i_total;