X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fnetwork%2Ftcp.c;h=0347010b2eb7426352c99fd5293dc0f531fe2abf;hb=48e4674acd7f2ad37adef14340269f255f56c3a1;hp=b509b66b339057641f5f39aff1a19fcbb20439c0;hpb=72fa5a9d8e8f5a1bbe0d83ffd1f30b3265a531c7;p=vlc diff --git a/src/network/tcp.c b/src/network/tcp.c index b509b66b33..0347010b2e 100644 --- a/src/network/tcp.c +++ b/src/network/tcp.c @@ -153,8 +153,9 @@ int __net_Connect( vlc_object_t *p_this, const char *psz_host, int i_port, for( ptr = res; ptr != NULL; ptr = ptr->ai_next ) { - int fd = net_Socket( p_this, ptr->ai_family, type ?: ptr->ai_socktype, - proto ?: ptr->ai_protocol ); + int fd = net_Socket( p_this, ptr->ai_family, + type ? type : ptr->ai_socktype, + proto ? proto : ptr->ai_protocol ); if( fd == -1 ) { msg_Dbg( p_this, "socket error: %m" ); @@ -254,8 +255,15 @@ next_ai: /* failure */ int net_AcceptSingle (vlc_object_t *obj, int lfd) { int fd; + do + { +#ifdef HAVE_ACCEPT4 + fd = accept4 (lfd, NULL, NULL, SOCK_CLOEXEC); + if (fd == -1 && errno == ENOSYS) +#endif fd = accept (lfd, NULL, NULL); + } while (fd == -1 && errno == EINTR); if (fd == -1) @@ -271,49 +279,46 @@ int net_AcceptSingle (vlc_object_t *obj, int lfd) } -/***************************************************************************** - * __net_Accept: - ***************************************************************************** - * Accept a connection on a set of listening sockets and return it - *****************************************************************************/ -int __net_Accept( vlc_object_t *p_this, int *pi_fd, mtime_t i_wait ) +#undef net_Accept +/** + * Accepts an new connection on a set of listening sockets. + * If there are no pending connections, this function will wait. + * @note If the thread needs to handle events other than incoming connections, + * you need to use poll() and net_AcceptSingle() instead. + * + * @param p_this VLC object for logging and object kill signal + * @param pi_fd listening socket set + * @return -1 on error (may be transient error due to network issues), + * a new socket descriptor on success. + */ +int net_Accept (vlc_object_t *p_this, int *pi_fd) { - int timeout = (i_wait < 0) ? -1 : i_wait / 1000; int evfd = vlc_object_waitpipe (p_this); - assert( pi_fd != NULL ); + assert (pi_fd != NULL); - for (;;) - { - unsigned n = 0; - while (pi_fd[n] != -1) - n++; - struct pollfd ufd[n + 1]; + unsigned n = 0; + while (pi_fd[n] != -1) + n++; + struct pollfd ufd[n + 1]; - /* Initialize file descriptor set */ - for (unsigned i = 0; i <= n; i++) - { - ufd[i].fd = (i < n) ? pi_fd[i] : evfd; - ufd[i].events = POLLIN; - ufd[i].revents = 0; - } + /* Initialize file descriptor set */ + for (unsigned i = 0; i <= n; i++) + { + ufd[i].fd = (i < n) ? pi_fd[i] : evfd; + ufd[i].events = POLLIN; + } + ufd[n].revents = 0; - switch (poll (ufd, n + (evfd != -1), timeout)) + for (;;) + { + while (poll (ufd, n + (evfd != -1), -1) == -1) { - case -1: - if (net_errno == EINTR) - continue; + if (net_errno != EINTR) + { msg_Err (p_this, "poll error: %m"); return -1; - case 0: - errno = ETIMEDOUT; - return -1; - } - - if (ufd[n].revents) - { - errno = EINTR; - break; + } } for (unsigned i = 0; i < n; i++) @@ -334,6 +339,12 @@ int __net_Accept( vlc_object_t *p_this, int *pi_fd, mtime_t i_wait ) pi_fd[n - 1] = sfd; return fd; } + + if (ufd[n].revents) + { + errno = EINTR; + break; + } } return -1; } @@ -421,7 +432,7 @@ static int SocksNegotiate( vlc_object_t *p_obj, msg_Err( p_obj, "socks: unsupported authentication method %x", buffer[0] ); else - msg_Err( p_obj, "socks: authentification needed" ); + msg_Err( p_obj, "socks: authentication needed" ); return VLC_EGENERIC; }