# include "config.h"
#endif
-#include <vlc/vlc.h>
+#include <vlc_common.h>
#include <stdlib.h>
#include <stdio.h>
# 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);
{
net_Close (fd);
#if !defined(WIN32) && !defined(UNDER_CE)
- fd = rootwrap_bind (ptr->ai_family, ptr->ai_socktype,
+ fd = rootwrap_bind (ptr->ai_family, socktype,
protocol ?: ptr->ai_protocol, ptr->ai_addr,
ptr->ai_addrlen);
if (fd != -1)
"Increase the mtu size (--mtu option)");
n = i_buflen;
break;
-
- default:
- goto error;
}
#else
- /* spurious wake-up or TLS did not yield any actual data */
- if (errno == EAGAIN)
- continue;
- goto error;
+ switch (errno)
+ {
+ case EAGAIN: /* spurious wakeup or no TLS data */
+ case EINTR: /* asynchronous signal */
+ continue;
+ }
#endif
+ goto error;
}
if (n == 0)
if (poll (ufd, 1, -1) == -1)
{
- if (errno != EINTR)
- {
- msg_Err (p_this, "Write error: %m");
- goto error;
- }
- continue;
+ if (errno == EINTR)
+ continue;
+ msg_Err (p_this, "Polling error: %m");
+ return -1;
}
if (i_total > 0)
- {
- /* Errors will be dequeued separately, upon next call. */
- if (ufd[0].revents & (POLLERR|POLLNVAL|POLLHUP))
+ { /* If POLLHUP resp. POLLERR|POLLNVAL occurs while we have already
+ * read some data, it is important that we first return the number
+ * of bytes read, and then return 0 resp. -1 on the NEXT call. */
+ if (ufd[0].revents & (POLLHUP|POLLERR|POLLNVAL))
break;
- if (ufd[1].revents)
+ if (ufd[1].revents) /* VLC object signaled */
break;
}
else
if (val == -1)
{
+ if (errno == EINTR)
+ continue;
msg_Err (p_this, "Write error: %m");
break;
}
const char *psz_fmt, va_list args )
{
char *psz;
- int i_size, i_ret;
+ int i_ret;
- 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
? -1 : i_size;
free( psz );
return i_ret;
}
-
-/*****************************************************************************
- * inet_pton replacement for obsolete and/or crap operating systems
- *****************************************************************************/
-#ifndef HAVE_INET_PTON
-int inet_pton(int af, const char *src, void *dst)
+#ifdef WIN32
+ /* vlc_sendmsg, vlc_recvmsg Defined in winsock.c */
+#else /* !WIN32 */
+ssize_t vlc_sendmsg (int s, struct msghdr *hdr, int flags)
{
-# ifdef WIN32
- /* As we already know, Microsoft always go its own way, so even if they do
- * provide IPv6, they don't provide the API. */
- struct sockaddr_storage addr;
- int len = sizeof( addr );
-
- /* Damn it, they didn't even put LPCSTR for the firs parameter!!! */
-#ifdef UNICODE
- wchar_t *workaround_for_ill_designed_api =
- malloc( MAX_PATH * sizeof(wchar_t) );
- mbstowcs( workaround_for_ill_designed_api, src, MAX_PATH );
- workaround_for_ill_designed_api[MAX_PATH-1] = 0;
-#else
- char *workaround_for_ill_designed_api = strdup( src );
-#endif
-
- if( WSAStringToAddress( workaround_for_ill_designed_api, af, NULL,
- (LPSOCKADDR)&addr, &len ) )
- {
- free( workaround_for_ill_designed_api );
- return -1;
- }
- free( workaround_for_ill_designed_api );
-
- switch( af )
- {
- case AF_INET6:
- memcpy( dst, &((struct sockaddr_in6 *)&addr)->sin6_addr, 16 );
- break;
-
- case AF_INET:
- memcpy( dst, &((struct sockaddr_in *)&addr)->sin_addr, 4 );
- break;
-
- default:
- WSASetLastError( WSAEAFNOSUPPORT );
- return -1;
- }
-# else
- /* Assume IPv6 is not supported. */
- /* Would be safer and more simpler to use inet_aton() but it is most
- * likely not provided either. */
- uint32_t ipv4;
-
- if( af != AF_INET )
- {
- errno = EAFNOSUPPORT;
- return -1;
- }
-
- ipv4 = inet_addr( src );
- if( ipv4 == INADDR_NONE )
- return -1;
-
- memcpy( dst, &ipv4, 4 );
-# endif /* WIN32 */
- return 0;
+ return sendmsg (s, hdr, flags);
}
-#endif /* HAVE_INET_PTON */
-#ifndef HAVE_INET_NTOP
-#ifdef WIN32
-const char *inet_ntop(int af, const void * src,
- char * dst, socklen_t cnt)
+ssize_t vlc_recvmsg (int s, struct msghdr *hdr, int flags)
{
- 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;
+ return recvmsg (s, hdr, flags);
}
-#endif
-#endif
+#endif /* WIN32 */
+