X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Fnetwork%2Fio.c;h=ed069b3d19666c7ea2957dafcf53a8392deec516;hb=4dcbda16b38498f4b48c4a746bdae27f8528faa1;hp=e1e8538affc7cb6e5f034fae946026aedcf4ed2d;hpb=8cec5b2101b79e6a2717397378db94e0f0fbdd20;p=vlc diff --git a/src/network/io.c b/src/network/io.c index e1e8538aff..ed069b3d19 100644 --- a/src/network/io.c +++ b/src/network/io.c @@ -32,7 +32,6 @@ # include "config.h" #endif -#define _WIN32_WINNT 0x0501 #include #include @@ -75,6 +74,8 @@ # define SOL_DCCP 269 #endif +#include "libvlc.h" /* vlc_object_waitpipe */ + extern int rootwrap_bind (int family, int socktype, int protocol, const struct sockaddr *addr, size_t alen); @@ -287,7 +288,7 @@ int *net_Listen (vlc_object_t *p_this, const char *psz_host, *****************************************************************************/ ssize_t __net_Read (vlc_object_t *restrict p_this, int fd, const v_socket_t *vs, - uint8_t *restrict p_buf, size_t i_buflen, bool waitall) + void *restrict p_buf, size_t i_buflen, bool waitall) { size_t i_total = 0; struct pollfd ufd[2] = { @@ -393,7 +394,7 @@ __net_Read (vlc_object_t *restrict p_this, int fd, const v_socket_t *vs, break; // EOF i_total += n; - p_buf += n; + p_buf = (char *)p_buf + n; i_buflen -= n; if (!waitall) @@ -411,7 +412,7 @@ silent: /* Write exact amount requested */ ssize_t __net_Write( vlc_object_t *p_this, int fd, const v_socket_t *p_vs, - const uint8_t *p_data, size_t i_data ) + const void *restrict p_data, size_t i_data ) { size_t i_total = 0; struct pollfd ufd[2] = { @@ -428,7 +429,7 @@ ssize_t __net_Write( vlc_object_t *p_this, int fd, const v_socket_t *p_vs, ufd[0].revents = ufd[1].revents = 0; - if (poll (ufd, 1, -1) == -1) + if (poll (ufd, sizeof (ufd) / sizeof (ufd[0]), -1) == -1) { if (errno == EINTR) continue; @@ -472,7 +473,7 @@ ssize_t __net_Write( vlc_object_t *p_this, int fd, const v_socket_t *p_vs, break; } - p_data += val; + p_data = (const char *)p_data + val; i_data -= val; i_total += val; } @@ -484,6 +485,13 @@ error: return -1; } +/** + * Reads a line from a file descriptor. + * This function is not thread-safe; the same file descriptor cI/O annot be read + * by another thread at the same time (although it can be written to). + * + * @return nul-terminated heap-allocated string, or NULL on I/O error. + */ char *__net_Gets( vlc_object_t *p_this, int fd, const v_socket_t *p_vs ) { char *psz_line = NULL, *ptr = NULL; @@ -499,7 +507,7 @@ char *__net_Gets( vlc_object_t *p_this, int fd, const v_socket_t *p_vs ) ptr = psz_line + i_line; } - if( net_Read( p_this, fd, p_vs, (uint8_t *)ptr, 1, true ) != 1 ) + if( net_Read( p_this, fd, p_vs, ptr, 1, true ) != 1 ) { if( i_line == 0 ) { @@ -542,116 +550,16 @@ ssize_t __net_vaPrintf( vlc_object_t *p_this, int fd, const v_socket_t *p_vs, char *psz; int i_ret; - size_t i_size = vasprintf( &psz, psz_fmt, args ); + int i_size = vasprintf( &psz, psz_fmt, args ); if( i_size == -1 ) return -1; - i_ret = __net_Write( p_this, fd, p_vs, (uint8_t *)psz, i_size ) < i_size + i_ret = __net_Write( p_this, fd, p_vs, psz, i_size ) < i_size ? -1 : i_size; free( psz ); return i_ret; } - -/***************************************************************************** - * inet_pton replacement for obsolete and/or crap operating systems - *****************************************************************************/ -int vlc_inet_pton(int af, const char *src, void *dst) -{ -#ifndef HAVE_INET_PTON - /* Windows Vista has inet_pton(), but not XP. */ - /* We have a pretty good example of abstraction inversion here... */ - struct addrinfo hints = { - .ai_family = af, - .ai_socktype = SOCK_DGRAM, /* make sure we have... */ - .ai_protocol = IPPROTO_UDP, /* ...only one response */ - .ai_flags = AI_NUMERICHOST, - }, *res; - - if (getaddrinfo (src, NULL, &hints, &res)) - return -1; - - const void *data; - size_t len; - - switch (af) - { - case AF_INET: - data = &((const struct sockaddr_in *)res->ai_addr)->sin_addr; - len = 4; - break; -#ifdef AF_INET6 - case AF_INET6: - data = &((const struct sockaddr_in6 *)res->ai_addr)->sin6_addr; - len = 16; - break; -#endif - default: - errno = EAFNOSUPPORT; - return -1; - } - memcpy (dst, data, len); - return 0; -#else /* HAVE_INET_PTON */ - return inet_pton( af, src, dst ); -#endif /* HAVE_INET_PTON */ -} - -const char *vlc_inet_ntop(int af, const void * src, - char * dst, socklen_t cnt) -{ -#ifndef HAVE_INET_NTOP -#ifdef WIN32 - switch( af ) - { -#ifdef AF_INET6 - case AF_INET6: - { - struct sockaddr_in6 addr; - memset(&addr, 0, sizeof(addr)); - addr.sin6_family = AF_INET6; - addr.sin6_addr = *((struct in6_addr*)src); - if( 0 == WSAAddressToStringA((LPSOCKADDR)&addr, - sizeof(struct sockaddr_in6), - NULL, dst, &cnt) ) - { - dst[cnt] = '\0'; - return dst; - } - errno = WSAGetLastError(); - return NULL; - - } - -#endif - case AF_INET: - { - struct sockaddr_in addr; - memset(&addr, 0, sizeof(addr)); - addr.sin_family = AF_INET; - addr.sin_addr = *((struct in_addr*)src); - if( 0 == WSAAddressToStringA((LPSOCKADDR)&addr, - sizeof(struct sockaddr_in), - NULL, dst, &cnt) ) - { - dst[cnt] = '\0'; - return dst; - } - errno = WSAGetLastError(); - return NULL; - - } - } - errno = EAFNOSUPPORT; - return NULL; -#else /* WIN32 */ - return NULL; -#endif /* WIN32 */ -#else /* HAVE_INET_NTOP */ - return inet_ntop( af, src, dst, cnt ); -#endif /* HAVE_INET_NTOP */ -} - #ifdef WIN32 /* vlc_sendmsg, vlc_recvmsg Defined in winsock.c */ #else /* !WIN32 */