-
-
-/*****************************************************************************
- * 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
-# 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;
-#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 */
-ssize_t vlc_sendmsg (int s, struct msghdr *hdr, int flags)
-{
- return sendmsg (s, hdr, flags);
-}
-
-ssize_t vlc_recvmsg (int s, struct msghdr *hdr, int flags)
-{
- return recvmsg (s, hdr, flags);
-}
-#endif /* WIN32 */
-