Blame winpr/libwinpr/winsock/winsock.c

Packit 1fb8d4
/**
Packit 1fb8d4
 * WinPR: Windows Portable Runtime
Packit 1fb8d4
 * Windows Sockets (Winsock)
Packit 1fb8d4
 *
Packit 1fb8d4
 * Copyright 2012 Marc-Andre Moreau <marcandre.moreau@gmail.com>
Packit 1fb8d4
 *
Packit 1fb8d4
 * Licensed under the Apache License, Version 2.0 (the "License");
Packit 1fb8d4
 * you may not use this file except in compliance with the License.
Packit 1fb8d4
 * You may obtain a copy of the License at
Packit 1fb8d4
 *
Packit 1fb8d4
 *     http://www.apache.org/licenses/LICENSE-2.0
Packit 1fb8d4
 *
Packit 1fb8d4
 * Unless required by applicable law or agreed to in writing, software
Packit 1fb8d4
 * distributed under the License is distributed on an "AS IS" BASIS,
Packit 1fb8d4
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Packit 1fb8d4
 * See the License for the specific language governing permissions and
Packit 1fb8d4
 * limitations under the License.
Packit 1fb8d4
 */
Packit 1fb8d4
Packit 1fb8d4
#ifdef HAVE_CONFIG_H
Packit 1fb8d4
#include "config.h"
Packit 1fb8d4
#endif
Packit 1fb8d4
Packit 1fb8d4
#include <winpr/crt.h>
Packit 1fb8d4
#include <winpr/synch.h>
Packit 1fb8d4
Packit 1fb8d4
#include <winpr/winsock.h>
Packit 1fb8d4
Packit 1fb8d4
#ifdef HAVE_UNISTD_H
Packit 1fb8d4
#include <unistd.h>
Packit 1fb8d4
#endif
Packit 1fb8d4
#ifdef HAVE_SYS_FILIO_H
Packit 1fb8d4
#include <sys/filio.h>
Packit 1fb8d4
#endif
Packit 1fb8d4
#ifdef HAVE_SYS_SOCKIO_H
Packit 1fb8d4
#include <sys/sockio.h>
Packit 1fb8d4
#endif
Packit 1fb8d4
Packit 1fb8d4
#ifndef _WIN32
Packit 1fb8d4
#include <fcntl.h>
Packit 1fb8d4
#endif
Packit 1fb8d4
Packit 1fb8d4
#ifdef __APPLE__
Packit 1fb8d4
#define WSAIOCTL_IFADDRS
Packit 1fb8d4
#include <ifaddrs.h>
Packit 1fb8d4
#endif
Packit 1fb8d4
Packit 1fb8d4
/**
Packit 1fb8d4
 * ws2_32.dll:
Packit 1fb8d4
 *
Packit 1fb8d4
 * __WSAFDIsSet
Packit 1fb8d4
 * accept
Packit 1fb8d4
 * bind
Packit 1fb8d4
 * closesocket
Packit 1fb8d4
 * connect
Packit 1fb8d4
 * freeaddrinfo
Packit 1fb8d4
 * FreeAddrInfoEx
Packit 1fb8d4
 * FreeAddrInfoExW
Packit 1fb8d4
 * FreeAddrInfoW
Packit 1fb8d4
 * getaddrinfo
Packit 1fb8d4
 * GetAddrInfoExA
Packit 1fb8d4
 * GetAddrInfoExCancel
Packit 1fb8d4
 * GetAddrInfoExOverlappedResult
Packit 1fb8d4
 * GetAddrInfoExW
Packit 1fb8d4
 * GetAddrInfoW
Packit 1fb8d4
 * gethostbyaddr
Packit 1fb8d4
 * gethostbyname
Packit 1fb8d4
 * gethostname
Packit 1fb8d4
 * GetHostNameW
Packit 1fb8d4
 * getnameinfo
Packit 1fb8d4
 * GetNameInfoW
Packit 1fb8d4
 * getpeername
Packit 1fb8d4
 * getprotobyname
Packit 1fb8d4
 * getprotobynumber
Packit 1fb8d4
 * getservbyname
Packit 1fb8d4
 * getservbyport
Packit 1fb8d4
 * getsockname
Packit 1fb8d4
 * getsockopt
Packit 1fb8d4
 * htonl
Packit 1fb8d4
 * htons
Packit 1fb8d4
 * inet_addr
Packit 1fb8d4
 * inet_ntoa
Packit 1fb8d4
 * inet_ntop
Packit 1fb8d4
 * inet_pton
Packit 1fb8d4
 * InetNtopW
Packit 1fb8d4
 * InetPtonW
Packit 1fb8d4
 * ioctlsocket
Packit 1fb8d4
 * listen
Packit 1fb8d4
 * ntohl
Packit 1fb8d4
 * ntohs
Packit 1fb8d4
 * recv
Packit 1fb8d4
 * recvfrom
Packit 1fb8d4
 * select
Packit 1fb8d4
 * send
Packit 1fb8d4
 * sendto
Packit 1fb8d4
 * SetAddrInfoExA
Packit 1fb8d4
 * SetAddrInfoExW
Packit 1fb8d4
 * setsockopt
Packit 1fb8d4
 * shutdown
Packit 1fb8d4
 * socket
Packit 1fb8d4
 * WahCloseApcHelper
Packit 1fb8d4
 * WahCloseHandleHelper
Packit 1fb8d4
 * WahCloseNotificationHandleHelper
Packit 1fb8d4
 * WahCloseSocketHandle
Packit 1fb8d4
 * WahCloseThread
Packit 1fb8d4
 * WahCompleteRequest
Packit 1fb8d4
 * WahCreateHandleContextTable
Packit 1fb8d4
 * WahCreateNotificationHandle
Packit 1fb8d4
 * WahCreateSocketHandle
Packit 1fb8d4
 * WahDestroyHandleContextTable
Packit 1fb8d4
 * WahDisableNonIFSHandleSupport
Packit 1fb8d4
 * WahEnableNonIFSHandleSupport
Packit 1fb8d4
 * WahEnumerateHandleContexts
Packit 1fb8d4
 * WahInsertHandleContext
Packit 1fb8d4
 * WahNotifyAllProcesses
Packit 1fb8d4
 * WahOpenApcHelper
Packit 1fb8d4
 * WahOpenCurrentThread
Packit 1fb8d4
 * WahOpenHandleHelper
Packit 1fb8d4
 * WahOpenNotificationHandleHelper
Packit 1fb8d4
 * WahQueueUserApc
Packit 1fb8d4
 * WahReferenceContextByHandle
Packit 1fb8d4
 * WahRemoveHandleContext
Packit 1fb8d4
 * WahWaitForNotification
Packit 1fb8d4
 * WahWriteLSPEvent
Packit 1fb8d4
 * WEP
Packit 1fb8d4
 * WPUCompleteOverlappedRequest
Packit 1fb8d4
 * WPUGetProviderPathEx
Packit 1fb8d4
 * WSAAccept
Packit 1fb8d4
 * WSAAddressToStringA
Packit 1fb8d4
 * WSAAddressToStringW
Packit 1fb8d4
 * WSAAdvertiseProvider
Packit 1fb8d4
 * WSAAsyncGetHostByAddr
Packit 1fb8d4
 * WSAAsyncGetHostByName
Packit 1fb8d4
 * WSAAsyncGetProtoByName
Packit 1fb8d4
 * WSAAsyncGetProtoByNumber
Packit 1fb8d4
 * WSAAsyncGetServByName
Packit 1fb8d4
 * WSAAsyncGetServByPort
Packit 1fb8d4
 * WSAAsyncSelect
Packit 1fb8d4
 * WSACancelAsyncRequest
Packit 1fb8d4
 * WSACancelBlockingCall
Packit 1fb8d4
 * WSACleanup
Packit 1fb8d4
 * WSACloseEvent
Packit 1fb8d4
 * WSAConnect
Packit 1fb8d4
 * WSAConnectByList
Packit 1fb8d4
 * WSAConnectByNameA
Packit 1fb8d4
 * WSAConnectByNameW
Packit 1fb8d4
 * WSACreateEvent
Packit 1fb8d4
 * WSADuplicateSocketA
Packit 1fb8d4
 * WSADuplicateSocketW
Packit 1fb8d4
 * WSAEnumNameSpaceProvidersA
Packit 1fb8d4
 * WSAEnumNameSpaceProvidersExA
Packit 1fb8d4
 * WSAEnumNameSpaceProvidersExW
Packit 1fb8d4
 * WSAEnumNameSpaceProvidersW
Packit 1fb8d4
 * WSAEnumNetworkEvents
Packit 1fb8d4
 * WSAEnumProtocolsA
Packit 1fb8d4
 * WSAEnumProtocolsW
Packit 1fb8d4
 * WSAEventSelect
Packit 1fb8d4
 * WSAGetLastError
Packit 1fb8d4
 * WSAGetOverlappedResult
Packit 1fb8d4
 * WSAGetQOSByName
Packit 1fb8d4
 * WSAGetServiceClassInfoA
Packit 1fb8d4
 * WSAGetServiceClassInfoW
Packit 1fb8d4
 * WSAGetServiceClassNameByClassIdA
Packit 1fb8d4
 * WSAGetServiceClassNameByClassIdW
Packit 1fb8d4
 * WSAHtonl
Packit 1fb8d4
 * WSAHtons
Packit 1fb8d4
 * WSAInstallServiceClassA
Packit 1fb8d4
 * WSAInstallServiceClassW
Packit 1fb8d4
 * WSAIoctl
Packit 1fb8d4
 * WSAIsBlocking
Packit 1fb8d4
 * WSAJoinLeaf
Packit 1fb8d4
 * WSALookupServiceBeginA
Packit 1fb8d4
 * WSALookupServiceBeginW
Packit 1fb8d4
 * WSALookupServiceEnd
Packit 1fb8d4
 * WSALookupServiceNextA
Packit 1fb8d4
 * WSALookupServiceNextW
Packit 1fb8d4
 * WSANSPIoctl
Packit 1fb8d4
 * WSANtohl
Packit 1fb8d4
 * WSANtohs
Packit 1fb8d4
 * WSAPoll
Packit 1fb8d4
 * WSAProviderCompleteAsyncCall
Packit 1fb8d4
 * WSAProviderConfigChange
Packit 1fb8d4
 * WSApSetPostRoutine
Packit 1fb8d4
 * WSARecv
Packit 1fb8d4
 * WSARecvDisconnect
Packit 1fb8d4
 * WSARecvFrom
Packit 1fb8d4
 * WSARemoveServiceClass
Packit 1fb8d4
 * WSAResetEvent
Packit 1fb8d4
 * WSASend
Packit 1fb8d4
 * WSASendDisconnect
Packit 1fb8d4
 * WSASendMsg
Packit 1fb8d4
 * WSASendTo
Packit 1fb8d4
 * WSASetBlockingHook
Packit 1fb8d4
 * WSASetEvent
Packit 1fb8d4
 * WSASetLastError
Packit 1fb8d4
 * WSASetServiceA
Packit 1fb8d4
 * WSASetServiceW
Packit 1fb8d4
 * WSASocketA
Packit 1fb8d4
 * WSASocketW
Packit 1fb8d4
 * WSAStartup
Packit 1fb8d4
 * WSAStringToAddressA
Packit 1fb8d4
 * WSAStringToAddressW
Packit 1fb8d4
 * WSAUnadvertiseProvider
Packit 1fb8d4
 * WSAUnhookBlockingHook
Packit 1fb8d4
 * WSAWaitForMultipleEvents
Packit 1fb8d4
 * WSCDeinstallProvider
Packit 1fb8d4
 * WSCDeinstallProviderEx
Packit 1fb8d4
 * WSCEnableNSProvider
Packit 1fb8d4
 * WSCEnumProtocols
Packit 1fb8d4
 * WSCEnumProtocolsEx
Packit 1fb8d4
 * WSCGetApplicationCategory
Packit 1fb8d4
 * WSCGetApplicationCategoryEx
Packit 1fb8d4
 * WSCGetProviderInfo
Packit 1fb8d4
 * WSCGetProviderPath
Packit 1fb8d4
 * WSCInstallNameSpace
Packit 1fb8d4
 * WSCInstallNameSpaceEx
Packit 1fb8d4
 * WSCInstallNameSpaceEx2
Packit 1fb8d4
 * WSCInstallProvider
Packit 1fb8d4
 * WSCInstallProviderAndChains
Packit 1fb8d4
 * WSCInstallProviderEx
Packit 1fb8d4
 * WSCSetApplicationCategory
Packit 1fb8d4
 * WSCSetApplicationCategoryEx
Packit 1fb8d4
 * WSCSetProviderInfo
Packit 1fb8d4
 * WSCUnInstallNameSpace
Packit 1fb8d4
 * WSCUnInstallNameSpaceEx2
Packit 1fb8d4
 * WSCUpdateProvider
Packit 1fb8d4
 * WSCUpdateProviderEx
Packit 1fb8d4
 * WSCWriteNameSpaceOrder
Packit 1fb8d4
 * WSCWriteProviderOrder
Packit 1fb8d4
 * WSCWriteProviderOrderEx
Packit 1fb8d4
 */
Packit 1fb8d4
Packit 1fb8d4
#ifdef _WIN32
Packit 1fb8d4
Packit 1fb8d4
#if (_WIN32_WINNT < 0x0600)
Packit 1fb8d4
Packit 1fb8d4
PCSTR winpr_inet_ntop(INT Family, PVOID pAddr, PSTR pStringBuf, size_t StringBufSize)
Packit 1fb8d4
{
Packit 1fb8d4
	if (Family == AF_INET)
Packit 1fb8d4
	{
Packit 1fb8d4
		struct sockaddr_in in;
Packit 1fb8d4
		memset(&in, 0, sizeof(in));
Packit 1fb8d4
		in.sin_family = AF_INET;
Packit 1fb8d4
		memcpy(&in.sin_addr, pAddr, sizeof(struct in_addr));
Packit Service 5a9772
		getnameinfo((struct sockaddr*)&in, sizeof(struct sockaddr_in), pStringBuf, StringBufSize,
Packit Service 5a9772
		            NULL, 0, NI_NUMERICHOST);
Packit 1fb8d4
		return pStringBuf;
Packit 1fb8d4
	}
Packit 1fb8d4
	else if (Family == AF_INET6)
Packit 1fb8d4
	{
Packit 1fb8d4
		struct sockaddr_in6 in;
Packit 1fb8d4
		memset(&in, 0, sizeof(in));
Packit 1fb8d4
		in.sin6_family = AF_INET6;
Packit 1fb8d4
		memcpy(&in.sin6_addr, pAddr, sizeof(struct in_addr6));
Packit Service 5a9772
		getnameinfo((struct sockaddr*)&in, sizeof(struct sockaddr_in6), pStringBuf, StringBufSize,
Packit Service 5a9772
		            NULL, 0, NI_NUMERICHOST);
Packit 1fb8d4
		return pStringBuf;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	return NULL;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
INT winpr_inet_pton(INT Family, PCSTR pszAddrString, PVOID pAddrBuf)
Packit 1fb8d4
{
Packit 1fb8d4
	SOCKADDR_STORAGE addr;
Packit 1fb8d4
	int addr_len = sizeof(addr);
Packit 1fb8d4
Packit 1fb8d4
	if ((Family != AF_INET) && (Family != AF_INET6))
Packit 1fb8d4
		return -1;
Packit 1fb8d4
Packit Service 5a9772
	if (WSAStringToAddressA((char*)pszAddrString, Family, NULL, (struct sockaddr*)&addr,
Packit 1fb8d4
	                        &addr_len) != 0)
Packit 1fb8d4
		return 0;
Packit 1fb8d4
Packit 1fb8d4
	if (Family == AF_INET)
Packit 1fb8d4
	{
Packit Service 5a9772
		memcpy(pAddrBuf, &((struct sockaddr_in*)&addr)->sin_addr, sizeof(struct in_addr));
Packit 1fb8d4
	}
Packit 1fb8d4
	else if (Family == AF_INET6)
Packit 1fb8d4
	{
Packit Service 5a9772
		memcpy(pAddrBuf, &((struct sockaddr_in6*)&addr)->sin6_addr, sizeof(struct in6_addr));
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	return 1;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
#endif /* (_WIN32_WINNT < 0x0600) */
Packit 1fb8d4
Packit 1fb8d4
#else /* _WIN32 */
Packit 1fb8d4
Packit 1fb8d4
#include <netdb.h>
Packit 1fb8d4
#include <errno.h>
Packit 1fb8d4
#include <unistd.h>
Packit 1fb8d4
#include <sys/ioctl.h>
Packit 1fb8d4
#include <sys/socket.h>
Packit 1fb8d4
#include <netinet/in.h>
Packit 1fb8d4
#include <netinet/tcp.h>
Packit 1fb8d4
#include <net/if.h>
Packit 1fb8d4
Packit 1fb8d4
#ifndef MSG_NOSIGNAL
Packit 1fb8d4
#define MSG_NOSIGNAL 0
Packit 1fb8d4
#endif
Packit 1fb8d4
Packit 1fb8d4
int WSAStartup(WORD wVersionRequired, LPWSADATA lpWSAData)
Packit 1fb8d4
{
Packit 1fb8d4
	ZeroMemory(lpWSAData, sizeof(WSADATA));
Packit 1fb8d4
	lpWSAData->wVersion = wVersionRequired;
Packit 1fb8d4
	lpWSAData->wHighVersion = MAKEWORD(2, 2);
Packit 1fb8d4
	return 0; /* success */
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
int WSACleanup(void)
Packit 1fb8d4
{
Packit 1fb8d4
	return 0; /* success */
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
void WSASetLastError(int iError)
Packit 1fb8d4
{
Packit 1fb8d4
	switch (iError)
Packit 1fb8d4
	{
Packit 1fb8d4
		/* Base error codes */
Packit 1fb8d4
		case WSAEINTR:
Packit 1fb8d4
			errno = EINTR;
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case WSAEBADF:
Packit 1fb8d4
			errno = EBADF;
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case WSAEACCES:
Packit 1fb8d4
			errno = EACCES;
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case WSAEFAULT:
Packit 1fb8d4
			errno = EFAULT;
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case WSAEINVAL:
Packit 1fb8d4
			errno = EINVAL;
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case WSAEMFILE:
Packit 1fb8d4
			errno = EMFILE;
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit Service 5a9772
			/* BSD sockets error codes */
Packit 1fb8d4
Packit 1fb8d4
		case WSAEWOULDBLOCK:
Packit 1fb8d4
			errno = EWOULDBLOCK;
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case WSAEINPROGRESS:
Packit 1fb8d4
			errno = EINPROGRESS;
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case WSAEALREADY:
Packit 1fb8d4
			errno = EALREADY;
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case WSAENOTSOCK:
Packit 1fb8d4
			errno = ENOTSOCK;
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case WSAEDESTADDRREQ:
Packit 1fb8d4
			errno = EDESTADDRREQ;
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case WSAEMSGSIZE:
Packit 1fb8d4
			errno = EMSGSIZE;
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case WSAEPROTOTYPE:
Packit 1fb8d4
			errno = EPROTOTYPE;
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case WSAENOPROTOOPT:
Packit 1fb8d4
			errno = ENOPROTOOPT;
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case WSAEPROTONOSUPPORT:
Packit 1fb8d4
			errno = EPROTONOSUPPORT;
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case WSAESOCKTNOSUPPORT:
Packit 1fb8d4
			errno = ESOCKTNOSUPPORT;
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case WSAEOPNOTSUPP:
Packit 1fb8d4
			errno = EOPNOTSUPP;
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case WSAEPFNOSUPPORT:
Packit 1fb8d4
			errno = EPFNOSUPPORT;
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case WSAEAFNOSUPPORT:
Packit 1fb8d4
			errno = EAFNOSUPPORT;
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case WSAEADDRINUSE:
Packit 1fb8d4
			errno = EADDRINUSE;
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case WSAEADDRNOTAVAIL:
Packit 1fb8d4
			errno = EADDRNOTAVAIL;
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case WSAENETDOWN:
Packit 1fb8d4
			errno = ENETDOWN;
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case WSAENETUNREACH:
Packit 1fb8d4
			errno = ENETUNREACH;
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case WSAENETRESET:
Packit 1fb8d4
			errno = ENETRESET;
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case WSAECONNABORTED:
Packit 1fb8d4
			errno = ECONNABORTED;
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case WSAECONNRESET:
Packit 1fb8d4
			errno = ECONNRESET;
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case WSAENOBUFS:
Packit 1fb8d4
			errno = ENOBUFS;
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case WSAEISCONN:
Packit 1fb8d4
			errno = EISCONN;
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case WSAENOTCONN:
Packit 1fb8d4
			errno = ENOTCONN;
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case WSAESHUTDOWN:
Packit 1fb8d4
			errno = ESHUTDOWN;
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case WSAETOOMANYREFS:
Packit 1fb8d4
			errno = ETOOMANYREFS;
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case WSAETIMEDOUT:
Packit 1fb8d4
			errno = ETIMEDOUT;
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case WSAECONNREFUSED:
Packit 1fb8d4
			errno = ECONNREFUSED;
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case WSAELOOP:
Packit 1fb8d4
			errno = ELOOP;
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case WSAENAMETOOLONG:
Packit 1fb8d4
			errno = ENAMETOOLONG;
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case WSAEHOSTDOWN:
Packit 1fb8d4
			errno = EHOSTDOWN;
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case WSAEHOSTUNREACH:
Packit 1fb8d4
			errno = EHOSTUNREACH;
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case WSAENOTEMPTY:
Packit 1fb8d4
			errno = ENOTEMPTY;
Packit 1fb8d4
			break;
Packit 1fb8d4
#ifdef EPROCLIM
Packit 1fb8d4
Packit 1fb8d4
		case WSAEPROCLIM:
Packit 1fb8d4
			errno = EPROCLIM;
Packit 1fb8d4
			break;
Packit 1fb8d4
#endif
Packit 1fb8d4
Packit 1fb8d4
		case WSAEUSERS:
Packit 1fb8d4
			errno = EUSERS;
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case WSAEDQUOT:
Packit 1fb8d4
			errno = EDQUOT;
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case WSAESTALE:
Packit 1fb8d4
			errno = ESTALE;
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case WSAEREMOTE:
Packit 1fb8d4
			errno = EREMOTE;
Packit 1fb8d4
			break;
Packit 1fb8d4
	}
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
int WSAGetLastError(void)
Packit 1fb8d4
{
Packit 1fb8d4
	int iError = 0;
Packit 1fb8d4
Packit 1fb8d4
	switch (errno)
Packit 1fb8d4
	{
Packit 1fb8d4
		/* Base error codes */
Packit 1fb8d4
		case EINTR:
Packit 1fb8d4
			iError = WSAEINTR;
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case EBADF:
Packit 1fb8d4
			iError = WSAEBADF;
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case EACCES:
Packit 1fb8d4
			iError = WSAEACCES;
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case EFAULT:
Packit 1fb8d4
			iError = WSAEFAULT;
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case EINVAL:
Packit 1fb8d4
			iError = WSAEINVAL;
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case EMFILE:
Packit 1fb8d4
			iError = WSAEMFILE;
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit Service 5a9772
			/* BSD sockets error codes */
Packit 1fb8d4
Packit 1fb8d4
		case EWOULDBLOCK:
Packit 1fb8d4
			iError = WSAEWOULDBLOCK;
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case EINPROGRESS:
Packit 1fb8d4
			iError = WSAEINPROGRESS;
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case EALREADY:
Packit 1fb8d4
			iError = WSAEALREADY;
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case ENOTSOCK:
Packit 1fb8d4
			iError = WSAENOTSOCK;
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case EDESTADDRREQ:
Packit 1fb8d4
			iError = WSAEDESTADDRREQ;
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case EMSGSIZE:
Packit 1fb8d4
			iError = WSAEMSGSIZE;
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case EPROTOTYPE:
Packit 1fb8d4
			iError = WSAEPROTOTYPE;
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case ENOPROTOOPT:
Packit 1fb8d4
			iError = WSAENOPROTOOPT;
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case EPROTONOSUPPORT:
Packit 1fb8d4
			iError = WSAEPROTONOSUPPORT;
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case ESOCKTNOSUPPORT:
Packit 1fb8d4
			iError = WSAESOCKTNOSUPPORT;
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case EOPNOTSUPP:
Packit 1fb8d4
			iError = WSAEOPNOTSUPP;
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case EPFNOSUPPORT:
Packit 1fb8d4
			iError = WSAEPFNOSUPPORT;
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case EAFNOSUPPORT:
Packit 1fb8d4
			iError = WSAEAFNOSUPPORT;
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case EADDRINUSE:
Packit 1fb8d4
			iError = WSAEADDRINUSE;
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case EADDRNOTAVAIL:
Packit 1fb8d4
			iError = WSAEADDRNOTAVAIL;
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case ENETDOWN:
Packit 1fb8d4
			iError = WSAENETDOWN;
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case ENETUNREACH:
Packit 1fb8d4
			iError = WSAENETUNREACH;
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case ENETRESET:
Packit 1fb8d4
			iError = WSAENETRESET;
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case ECONNABORTED:
Packit 1fb8d4
			iError = WSAECONNABORTED;
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case ECONNRESET:
Packit 1fb8d4
			iError = WSAECONNRESET;
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case ENOBUFS:
Packit 1fb8d4
			iError = WSAENOBUFS;
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case EISCONN:
Packit 1fb8d4
			iError = WSAEISCONN;
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case ENOTCONN:
Packit 1fb8d4
			iError = WSAENOTCONN;
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case ESHUTDOWN:
Packit 1fb8d4
			iError = WSAESHUTDOWN;
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case ETOOMANYREFS:
Packit 1fb8d4
			iError = WSAETOOMANYREFS;
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case ETIMEDOUT:
Packit 1fb8d4
			iError = WSAETIMEDOUT;
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case ECONNREFUSED:
Packit 1fb8d4
			iError = WSAECONNREFUSED;
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case ELOOP:
Packit 1fb8d4
			iError = WSAELOOP;
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case ENAMETOOLONG:
Packit 1fb8d4
			iError = WSAENAMETOOLONG;
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case EHOSTDOWN:
Packit 1fb8d4
			iError = WSAEHOSTDOWN;
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case EHOSTUNREACH:
Packit 1fb8d4
			iError = WSAEHOSTUNREACH;
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case ENOTEMPTY:
Packit 1fb8d4
			iError = WSAENOTEMPTY;
Packit 1fb8d4
			break;
Packit 1fb8d4
#ifdef EPROCLIM
Packit 1fb8d4
Packit 1fb8d4
		case EPROCLIM:
Packit 1fb8d4
			iError = WSAEPROCLIM;
Packit 1fb8d4
			break;
Packit 1fb8d4
#endif
Packit 1fb8d4
Packit 1fb8d4
		case EUSERS:
Packit 1fb8d4
			iError = WSAEUSERS;
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case EDQUOT:
Packit 1fb8d4
			iError = WSAEDQUOT;
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case ESTALE:
Packit 1fb8d4
			iError = WSAESTALE;
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case EREMOTE:
Packit 1fb8d4
			iError = WSAEREMOTE;
Packit 1fb8d4
			break;
Packit 1fb8d4
			/* Special cases */
Packit 1fb8d4
#if (EAGAIN != EWOULDBLOCK)
Packit 1fb8d4
Packit 1fb8d4
		case EAGAIN:
Packit 1fb8d4
			iError = WSAEWOULDBLOCK;
Packit 1fb8d4
			break;
Packit 1fb8d4
#endif
Packit 1fb8d4
#if defined(EPROTO)
Packit 1fb8d4
Packit 1fb8d4
		case EPROTO:
Packit 1fb8d4
			iError = WSAECONNRESET;
Packit 1fb8d4
			break;
Packit 1fb8d4
#endif
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	/**
Packit 1fb8d4
	 * Windows Sockets Extended Error Codes:
Packit 1fb8d4
	 *
Packit 1fb8d4
	 * WSASYSNOTREADY
Packit 1fb8d4
	 * WSAVERNOTSUPPORTED
Packit 1fb8d4
	 * WSANOTINITIALISED
Packit 1fb8d4
	 * WSAEDISCON
Packit 1fb8d4
	 * WSAENOMORE
Packit 1fb8d4
	 * WSAECANCELLED
Packit 1fb8d4
	 * WSAEINVALIDPROCTABLE
Packit 1fb8d4
	 * WSAEINVALIDPROVIDER
Packit 1fb8d4
	 * WSAEPROVIDERFAILEDINIT
Packit 1fb8d4
	 * WSASYSCALLFAILURE
Packit 1fb8d4
	 * WSASERVICE_NOT_FOUND
Packit 1fb8d4
	 * WSATYPE_NOT_FOUND
Packit 1fb8d4
	 * WSA_E_NO_MORE
Packit 1fb8d4
	 * WSA_E_CANCELLED
Packit 1fb8d4
	 * WSAEREFUSED
Packit 1fb8d4
	 */
Packit 1fb8d4
	return iError;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
HANDLE WSACreateEvent(void)
Packit 1fb8d4
{
Packit 1fb8d4
	return CreateEvent(NULL, TRUE, FALSE, NULL);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
BOOL WSASetEvent(HANDLE hEvent)
Packit 1fb8d4
{
Packit 1fb8d4
	return SetEvent(hEvent);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
BOOL WSAResetEvent(HANDLE hEvent)
Packit 1fb8d4
{
Packit 1fb8d4
	/* POSIX systems auto reset the socket,
Packit 1fb8d4
	 * if no more data is available. */
Packit 1fb8d4
	return TRUE;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
BOOL WSACloseEvent(HANDLE hEvent)
Packit 1fb8d4
{
Packit 1fb8d4
	BOOL status;
Packit 1fb8d4
	status = CloseHandle(hEvent);
Packit 1fb8d4
Packit 1fb8d4
	if (!status)
Packit 1fb8d4
		SetLastError(6);
Packit 1fb8d4
Packit 1fb8d4
	return status;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
int WSAEventSelect(SOCKET s, WSAEVENT hEventObject, LONG lNetworkEvents)
Packit 1fb8d4
{
Packit 1fb8d4
	u_long arg = 1;
Packit 1fb8d4
	ULONG mode = 0;
Packit 1fb8d4
Packit 1fb8d4
	if (_ioctlsocket(s, FIONBIO, &arg) != 0)
Packit 1fb8d4
		return SOCKET_ERROR;
Packit 1fb8d4
Packit 1fb8d4
	if (arg == 0)
Packit 1fb8d4
		return 0;
Packit 1fb8d4
Packit 1fb8d4
	if (lNetworkEvents & FD_READ)
Packit 1fb8d4
		mode |= WINPR_FD_READ;
Packit 1fb8d4
Packit 1fb8d4
	if (lNetworkEvents & FD_WRITE)
Packit 1fb8d4
		mode |= WINPR_FD_WRITE;
Packit 1fb8d4
Packit 1fb8d4
	if (SetEventFileDescriptor(hEventObject, s, mode) < 0)
Packit 1fb8d4
		return SOCKET_ERROR;
Packit 1fb8d4
Packit 1fb8d4
	return 0;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
DWORD WSAWaitForMultipleEvents(DWORD cEvents, const HANDLE* lphEvents, BOOL fWaitAll,
Packit 1fb8d4
                               DWORD dwTimeout, BOOL fAlertable)
Packit 1fb8d4
{
Packit 1fb8d4
	return WaitForMultipleObjectsEx(cEvents, lphEvents, fWaitAll, dwTimeout, fAlertable);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
SOCKET WSASocketA(int af, int type, int protocol, LPWSAPROTOCOL_INFOA lpProtocolInfo, GROUP g,
Packit 1fb8d4
                  DWORD dwFlags)
Packit 1fb8d4
{
Packit 1fb8d4
	SOCKET s;
Packit 1fb8d4
	s = _socket(af, type, protocol);
Packit 1fb8d4
	return s;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
SOCKET WSASocketW(int af, int type, int protocol, LPWSAPROTOCOL_INFOW lpProtocolInfo, GROUP g,
Packit 1fb8d4
                  DWORD dwFlags)
Packit 1fb8d4
{
Packit Service 5a9772
	return WSASocketA(af, type, protocol, (LPWSAPROTOCOL_INFOA)lpProtocolInfo, g, dwFlags);
Packit 1fb8d4
}
Packit 1fb8d4
Packit Service 5a9772
int WSAIoctl(SOCKET s, DWORD dwIoControlCode, LPVOID lpvInBuffer, DWORD cbInBuffer,
Packit Service 5a9772
             LPVOID lpvOutBuffer, DWORD cbOutBuffer, LPDWORD lpcbBytesReturned,
Packit Service 5a9772
             LPWSAOVERLAPPED lpOverlapped, LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine)
Packit 1fb8d4
{
Packit 1fb8d4
	int fd;
Packit 1fb8d4
	int index;
Packit 1fb8d4
	ULONG nFlags;
Packit 1fb8d4
	size_t offset;
Packit 1fb8d4
	size_t ifreq_len;
Packit 1fb8d4
	struct ifreq* ifreq;
Packit 1fb8d4
	struct ifconf ifconf;
Packit 1fb8d4
	char address[128];
Packit 1fb8d4
	char broadcast[128];
Packit 1fb8d4
	char netmask[128];
Packit 1fb8d4
	char buffer[4096];
Packit 1fb8d4
	int numInterfaces;
Packit 1fb8d4
	int maxNumInterfaces;
Packit 1fb8d4
	INTERFACE_INFO* pInterface;
Packit 1fb8d4
	INTERFACE_INFO* pInterfaces;
Packit 1fb8d4
	struct sockaddr_in* pAddress;
Packit 1fb8d4
	struct sockaddr_in* pBroadcast;
Packit 1fb8d4
	struct sockaddr_in* pNetmask;
Packit 1fb8d4
Packit 1fb8d4
	if ((dwIoControlCode != SIO_GET_INTERFACE_LIST) ||
Packit 1fb8d4
	    (!lpvOutBuffer || !cbOutBuffer || !lpcbBytesReturned))
Packit 1fb8d4
	{
Packit 1fb8d4
		WSASetLastError(WSAEINVAL);
Packit 1fb8d4
		return SOCKET_ERROR;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit Service 5a9772
	fd = (int)s;
Packit Service 5a9772
	pInterfaces = (INTERFACE_INFO*)lpvOutBuffer;
Packit 1fb8d4
	maxNumInterfaces = cbOutBuffer / sizeof(INTERFACE_INFO);
Packit 1fb8d4
#ifdef WSAIOCTL_IFADDRS
Packit 1fb8d4
	{
Packit 1fb8d4
		struct ifaddrs* ifa = NULL;
Packit 1fb8d4
		struct ifaddrs* ifap = NULL;
Packit 1fb8d4
Packit 1fb8d4
		if (getifaddrs(&ifap) != 0)
Packit 1fb8d4
		{
Packit 1fb8d4
			WSASetLastError(WSAENETDOWN);
Packit 1fb8d4
			return SOCKET_ERROR;
Packit 1fb8d4
		}
Packit 1fb8d4
Packit 1fb8d4
		index = 0;
Packit 1fb8d4
		numInterfaces = 0;
Packit 1fb8d4
Packit 1fb8d4
		for (ifa = ifap; ifa; ifa = ifa->ifa_next)
Packit 1fb8d4
		{
Packit 1fb8d4
			pInterface = &pInterfaces[index];
Packit Service 5a9772
			pAddress = (struct sockaddr_in*)&pInterface->iiAddress;
Packit Service 5a9772
			pBroadcast = (struct sockaddr_in*)&pInterface->iiBroadcastAddress;
Packit Service 5a9772
			pNetmask = (struct sockaddr_in*)&pInterface->iiNetmask;
Packit 1fb8d4
			nFlags = 0;
Packit 1fb8d4
Packit 1fb8d4
			if (ifa->ifa_flags & IFF_UP)
Packit 1fb8d4
				nFlags |= _IFF_UP;
Packit 1fb8d4
Packit 1fb8d4
			if (ifa->ifa_flags & IFF_BROADCAST)
Packit 1fb8d4
				nFlags |= _IFF_BROADCAST;
Packit 1fb8d4
Packit 1fb8d4
			if (ifa->ifa_flags & IFF_LOOPBACK)
Packit 1fb8d4
				nFlags |= _IFF_LOOPBACK;
Packit 1fb8d4
Packit 1fb8d4
			if (ifa->ifa_flags & IFF_POINTOPOINT)
Packit 1fb8d4
				nFlags |= _IFF_POINTTOPOINT;
Packit 1fb8d4
Packit 1fb8d4
			if (ifa->ifa_flags & IFF_MULTICAST)
Packit 1fb8d4
				nFlags |= _IFF_MULTICAST;
Packit 1fb8d4
Packit 1fb8d4
			pInterface->iiFlags = nFlags;
Packit 1fb8d4
Packit 1fb8d4
			if (ifa->ifa_addr)
Packit 1fb8d4
			{
Packit 1fb8d4
				if ((ifa->ifa_addr->sa_family != AF_INET) && (ifa->ifa_addr->sa_family != AF_INET6))
Packit 1fb8d4
					continue;
Packit 1fb8d4
Packit Service 5a9772
				getnameinfo(ifa->ifa_addr, sizeof(struct sockaddr), address, sizeof(address), 0, 0,
Packit Service 5a9772
				            NI_NUMERICHOST);
Packit Service 5a9772
				inet_pton(ifa->ifa_addr->sa_family, address, (void*)&pAddress->sin_addr);
Packit 1fb8d4
			}
Packit 1fb8d4
			else
Packit 1fb8d4
			{
Packit 1fb8d4
				ZeroMemory(pAddress, sizeof(struct sockaddr_in));
Packit 1fb8d4
			}
Packit 1fb8d4
Packit 1fb8d4
			if (ifa->ifa_dstaddr)
Packit 1fb8d4
			{
Packit Service 5a9772
				if ((ifa->ifa_dstaddr->sa_family != AF_INET) &&
Packit Service 5a9772
				    (ifa->ifa_dstaddr->sa_family != AF_INET6))
Packit 1fb8d4
					continue;
Packit 1fb8d4
Packit Service 5a9772
				getnameinfo(ifa->ifa_dstaddr, sizeof(struct sockaddr), broadcast, sizeof(broadcast),
Packit Service 5a9772
				            0, 0, NI_NUMERICHOST);
Packit Service 5a9772
				inet_pton(ifa->ifa_dstaddr->sa_family, broadcast, (void*)&pBroadcast->sin_addr);
Packit 1fb8d4
			}
Packit 1fb8d4
			else
Packit 1fb8d4
			{
Packit 1fb8d4
				ZeroMemory(pBroadcast, sizeof(struct sockaddr_in));
Packit 1fb8d4
			}
Packit 1fb8d4
Packit 1fb8d4
			if (ifa->ifa_netmask)
Packit 1fb8d4
			{
Packit Service 5a9772
				if ((ifa->ifa_netmask->sa_family != AF_INET) &&
Packit Service 5a9772
				    (ifa->ifa_netmask->sa_family != AF_INET6))
Packit 1fb8d4
					continue;
Packit 1fb8d4
Packit Service 5a9772
				getnameinfo(ifa->ifa_netmask, sizeof(struct sockaddr), netmask, sizeof(netmask), 0,
Packit Service 5a9772
				            0, NI_NUMERICHOST);
Packit Service 5a9772
				inet_pton(ifa->ifa_netmask->sa_family, netmask, (void*)&pNetmask->sin_addr);
Packit 1fb8d4
			}
Packit 1fb8d4
			else
Packit 1fb8d4
			{
Packit 1fb8d4
				ZeroMemory(pNetmask, sizeof(struct sockaddr_in));
Packit 1fb8d4
			}
Packit 1fb8d4
Packit 1fb8d4
			numInterfaces++;
Packit 1fb8d4
			index++;
Packit 1fb8d4
		}
Packit 1fb8d4
Packit 1fb8d4
		*lpcbBytesReturned = (DWORD)(numInterfaces * sizeof(INTERFACE_INFO));
Packit 1fb8d4
		freeifaddrs(ifap);
Packit 1fb8d4
		return 0;
Packit 1fb8d4
	}
Packit 1fb8d4
#endif
Packit 1fb8d4
	ifconf.ifc_len = sizeof(buffer);
Packit 1fb8d4
	ifconf.ifc_buf = buffer;
Packit 1fb8d4
Packit 1fb8d4
	if (ioctl(fd, SIOCGIFCONF, &ifconf) != 0)
Packit 1fb8d4
	{
Packit 1fb8d4
		WSASetLastError(WSAENETDOWN);
Packit 1fb8d4
		return SOCKET_ERROR;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	index = 0;
Packit 1fb8d4
	offset = 0;
Packit 1fb8d4
	numInterfaces = 0;
Packit 1fb8d4
	ifreq = ifconf.ifc_req;
Packit 1fb8d4
Packit Service 5a9772
	while ((ifconf.ifc_len >= 0) && (offset < (size_t)ifconf.ifc_len) &&
Packit Service 5a9772
	       (numInterfaces < maxNumInterfaces))
Packit 1fb8d4
	{
Packit 1fb8d4
		pInterface = &pInterfaces[index];
Packit Service 5a9772
		pAddress = (struct sockaddr_in*)&pInterface->iiAddress;
Packit Service 5a9772
		pBroadcast = (struct sockaddr_in*)&pInterface->iiBroadcastAddress;
Packit Service 5a9772
		pNetmask = (struct sockaddr_in*)&pInterface->iiNetmask;
Packit 1fb8d4
Packit 1fb8d4
		if (ioctl(fd, SIOCGIFFLAGS, ifreq) != 0)
Packit 1fb8d4
			goto next_ifreq;
Packit 1fb8d4
Packit 1fb8d4
		nFlags = 0;
Packit 1fb8d4
Packit 1fb8d4
		if (ifreq->ifr_flags & IFF_UP)
Packit 1fb8d4
			nFlags |= _IFF_UP;
Packit 1fb8d4
Packit 1fb8d4
		if (ifreq->ifr_flags & IFF_BROADCAST)
Packit 1fb8d4
			nFlags |= _IFF_BROADCAST;
Packit 1fb8d4
Packit 1fb8d4
		if (ifreq->ifr_flags & IFF_LOOPBACK)
Packit 1fb8d4
			nFlags |= _IFF_LOOPBACK;
Packit 1fb8d4
Packit 1fb8d4
		if (ifreq->ifr_flags & IFF_POINTOPOINT)
Packit 1fb8d4
			nFlags |= _IFF_POINTTOPOINT;
Packit 1fb8d4
Packit 1fb8d4
		if (ifreq->ifr_flags & IFF_MULTICAST)
Packit 1fb8d4
			nFlags |= _IFF_MULTICAST;
Packit 1fb8d4
Packit 1fb8d4
		pInterface->iiFlags = nFlags;
Packit 1fb8d4
Packit 1fb8d4
		if (ioctl(fd, SIOCGIFADDR, ifreq) != 0)
Packit 1fb8d4
			goto next_ifreq;
Packit 1fb8d4
Packit 1fb8d4
		if ((ifreq->ifr_addr.sa_family != AF_INET) && (ifreq->ifr_addr.sa_family != AF_INET6))
Packit 1fb8d4
			goto next_ifreq;
Packit 1fb8d4
Packit Service 5a9772
		getnameinfo(&ifreq->ifr_addr, sizeof(ifreq->ifr_addr), address, sizeof(address), 0, 0,
Packit Service 5a9772
		            NI_NUMERICHOST);
Packit Service 5a9772
		inet_pton(ifreq->ifr_addr.sa_family, address, (void*)&pAddress->sin_addr);
Packit 1fb8d4
Packit 1fb8d4
		if (ioctl(fd, SIOCGIFBRDADDR, ifreq) != 0)
Packit 1fb8d4
			goto next_ifreq;
Packit 1fb8d4
Packit 1fb8d4
		if ((ifreq->ifr_addr.sa_family != AF_INET) && (ifreq->ifr_addr.sa_family != AF_INET6))
Packit 1fb8d4
			goto next_ifreq;
Packit 1fb8d4
Packit Service 5a9772
		getnameinfo(&ifreq->ifr_addr, sizeof(ifreq->ifr_addr), broadcast, sizeof(broadcast), 0, 0,
Packit Service 5a9772
		            NI_NUMERICHOST);
Packit Service 5a9772
		inet_pton(ifreq->ifr_addr.sa_family, broadcast, (void*)&pBroadcast->sin_addr);
Packit 1fb8d4
Packit 1fb8d4
		if (ioctl(fd, SIOCGIFNETMASK, ifreq) != 0)
Packit 1fb8d4
			goto next_ifreq;
Packit 1fb8d4
Packit 1fb8d4
		if ((ifreq->ifr_addr.sa_family != AF_INET) && (ifreq->ifr_addr.sa_family != AF_INET6))
Packit 1fb8d4
			goto next_ifreq;
Packit 1fb8d4
Packit Service 5a9772
		getnameinfo(&ifreq->ifr_addr, sizeof(ifreq->ifr_addr), netmask, sizeof(netmask), 0, 0,
Packit Service 5a9772
		            NI_NUMERICHOST);
Packit Service 5a9772
		inet_pton(ifreq->ifr_addr.sa_family, netmask, (void*)&pNetmask->sin_addr);
Packit 1fb8d4
		numInterfaces++;
Packit 1fb8d4
	next_ifreq:
Packit 1fb8d4
#if !defined(__linux__) && !defined(__sun__) && !defined(__CYGWIN__)
Packit 1fb8d4
		ifreq_len = IFNAMSIZ + ifreq->ifr_addr.sa_len;
Packit 1fb8d4
#else
Packit 1fb8d4
		ifreq_len = sizeof(*ifreq);
Packit 1fb8d4
#endif
Packit Service 5a9772
		ifreq = (struct ifreq*)&((BYTE*)ifreq)[ifreq_len];
Packit 1fb8d4
		offset += ifreq_len;
Packit 1fb8d4
		index++;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	*lpcbBytesReturned = (DWORD)(numInterfaces * sizeof(INTERFACE_INFO));
Packit 1fb8d4
	return 0;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
SOCKET _accept(SOCKET s, struct sockaddr* addr, int* addrlen)
Packit 1fb8d4
{
Packit 1fb8d4
	int status;
Packit Service 5a9772
	int fd = (int)s;
Packit Service 5a9772
	socklen_t s_addrlen = (socklen_t)*addrlen;
Packit 1fb8d4
	status = accept(fd, addr, &s_addrlen);
Packit Service 5a9772
	*addrlen = (socklen_t)s_addrlen;
Packit 1fb8d4
	return status;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
int _bind(SOCKET s, const struct sockaddr* addr, int namelen)
Packit 1fb8d4
{
Packit 1fb8d4
	int status;
Packit Service 5a9772
	int fd = (int)s;
Packit Service 5a9772
	status = bind(fd, addr, (socklen_t)namelen);
Packit 1fb8d4
Packit 1fb8d4
	if (status < 0)
Packit 1fb8d4
		return SOCKET_ERROR;
Packit 1fb8d4
Packit 1fb8d4
	return status;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
int closesocket(SOCKET s)
Packit 1fb8d4
{
Packit 1fb8d4
	int status;
Packit Service 5a9772
	int fd = (int)s;
Packit 1fb8d4
	status = close(fd);
Packit 1fb8d4
	return status;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
int _connect(SOCKET s, const struct sockaddr* name, int namelen)
Packit 1fb8d4
{
Packit 1fb8d4
	int status;
Packit Service 5a9772
	int fd = (int)s;
Packit Service 5a9772
	status = connect(fd, name, (socklen_t)namelen);
Packit 1fb8d4
Packit 1fb8d4
	if (status < 0)
Packit 1fb8d4
		return SOCKET_ERROR;
Packit 1fb8d4
Packit 1fb8d4
	return status;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
int _ioctlsocket(SOCKET s, long cmd, u_long* argp)
Packit 1fb8d4
{
Packit Service 5a9772
	int fd = (int)s;
Packit 1fb8d4
Packit 1fb8d4
	if (cmd == FIONBIO)
Packit 1fb8d4
	{
Packit 1fb8d4
		int flags;
Packit 1fb8d4
Packit 1fb8d4
		if (!argp)
Packit 1fb8d4
			return SOCKET_ERROR;
Packit 1fb8d4
Packit 1fb8d4
		flags = fcntl(fd, F_GETFL);
Packit 1fb8d4
Packit 1fb8d4
		if (flags == -1)
Packit 1fb8d4
			return SOCKET_ERROR;
Packit 1fb8d4
Packit 1fb8d4
		if (*argp)
Packit 1fb8d4
			fcntl(fd, F_SETFL, flags | O_NONBLOCK);
Packit 1fb8d4
		else
Packit 1fb8d4
			fcntl(fd, F_SETFL, flags & ~(O_NONBLOCK));
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	return 0;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
int _getpeername(SOCKET s, struct sockaddr* name, int* namelen)
Packit 1fb8d4
{
Packit 1fb8d4
	int status;
Packit Service 5a9772
	int fd = (int)s;
Packit Service 5a9772
	socklen_t s_namelen = (socklen_t)*namelen;
Packit 1fb8d4
	status = getpeername(fd, name, &s_namelen);
Packit Service 5a9772
	*namelen = (int)s_namelen;
Packit 1fb8d4
	return status;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
int _getsockname(SOCKET s, struct sockaddr* name, int* namelen)
Packit 1fb8d4
{
Packit 1fb8d4
	int status;
Packit Service 5a9772
	int fd = (int)s;
Packit Service 5a9772
	socklen_t s_namelen = (socklen_t)*namelen;
Packit 1fb8d4
	status = getsockname(fd, name, &s_namelen);
Packit Service 5a9772
	*namelen = (int)s_namelen;
Packit 1fb8d4
	return status;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
int _getsockopt(SOCKET s, int level, int optname, char* optval, int* optlen)
Packit 1fb8d4
{
Packit 1fb8d4
	int status;
Packit Service 5a9772
	int fd = (int)s;
Packit Service 5a9772
	socklen_t s_optlen = (socklen_t)*optlen;
Packit Service 5a9772
	status = getsockopt(fd, level, optname, (void*)optval, &s_optlen);
Packit Service 5a9772
	*optlen = (socklen_t)s_optlen;
Packit 1fb8d4
	return status;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
u_long _htonl(u_long hostlong)
Packit 1fb8d4
{
Packit 1fb8d4
	return htonl(hostlong);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
u_short _htons(u_short hostshort)
Packit 1fb8d4
{
Packit 1fb8d4
	return htons(hostshort);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
unsigned long _inet_addr(const char* cp)
Packit 1fb8d4
{
Packit Service 5a9772
	return (long)inet_addr(cp);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
char* _inet_ntoa(struct in_addr in)
Packit 1fb8d4
{
Packit 1fb8d4
	return inet_ntoa(in);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
int _listen(SOCKET s, int backlog)
Packit 1fb8d4
{
Packit 1fb8d4
	int status;
Packit Service 5a9772
	int fd = (int)s;
Packit 1fb8d4
	status = listen(fd, backlog);
Packit 1fb8d4
	return status;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
u_long _ntohl(u_long netlong)
Packit 1fb8d4
{
Packit 1fb8d4
	return ntohl(netlong);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
u_short _ntohs(u_short netshort)
Packit 1fb8d4
{
Packit 1fb8d4
	return ntohs(netshort);
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
int _recv(SOCKET s, char* buf, int len, int flags)
Packit 1fb8d4
{
Packit 1fb8d4
	int status;
Packit Service 5a9772
	int fd = (int)s;
Packit Service 5a9772
	status = (int)recv(fd, (void*)buf, (size_t)len, flags);
Packit 1fb8d4
	return status;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
int _recvfrom(SOCKET s, char* buf, int len, int flags, struct sockaddr* from, int* fromlen)
Packit 1fb8d4
{
Packit 1fb8d4
	int status;
Packit Service 5a9772
	int fd = (int)s;
Packit Service 5a9772
	socklen_t s_fromlen = (socklen_t)*fromlen;
Packit Service 5a9772
	status = (int)recvfrom(fd, (void*)buf, (size_t)len, flags, from, &s_fromlen);
Packit Service 5a9772
	*fromlen = (int)s_fromlen;
Packit 1fb8d4
	return status;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
int _select(int nfds, fd_set* readfds, fd_set* writefds, fd_set* exceptfds,
Packit 1fb8d4
            const struct timeval* timeout)
Packit 1fb8d4
{
Packit 1fb8d4
	int status;
Packit 1fb8d4
Packit 1fb8d4
	do
Packit 1fb8d4
	{
Packit Service 5a9772
		status = select(nfds, readfds, writefds, exceptfds, (struct timeval*)timeout);
Packit Service 5a9772
	} while ((status < 0) && (errno == EINTR));
Packit 1fb8d4
Packit 1fb8d4
	return status;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
int _send(SOCKET s, const char* buf, int len, int flags)
Packit 1fb8d4
{
Packit 1fb8d4
	int status;
Packit Service 5a9772
	int fd = (int)s;
Packit 1fb8d4
	flags |= MSG_NOSIGNAL;
Packit Service 5a9772
	status = (int)send(fd, (void*)buf, (size_t)len, flags);
Packit 1fb8d4
	return status;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
int _sendto(SOCKET s, const char* buf, int len, int flags, const struct sockaddr* to, int tolen)
Packit 1fb8d4
{
Packit 1fb8d4
	int status;
Packit Service 5a9772
	int fd = (int)s;
Packit Service 5a9772
	status = (int)sendto(fd, (void*)buf, (size_t)len, flags, to, (socklen_t)tolen);
Packit 1fb8d4
	return status;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
int _setsockopt(SOCKET s, int level, int optname, const char* optval, int optlen)
Packit 1fb8d4
{
Packit 1fb8d4
	int status;
Packit Service 5a9772
	int fd = (int)s;
Packit Service 5a9772
	status = setsockopt(fd, level, optname, (void*)optval, (socklen_t)optlen);
Packit 1fb8d4
	return status;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
int _shutdown(SOCKET s, int how)
Packit 1fb8d4
{
Packit 1fb8d4
	int status;
Packit Service 5a9772
	int fd = (int)s;
Packit 1fb8d4
	int s_how = -1;
Packit 1fb8d4
Packit 1fb8d4
	switch (how)
Packit 1fb8d4
	{
Packit 1fb8d4
		case SD_RECEIVE:
Packit 1fb8d4
			s_how = SHUT_RD;
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case SD_SEND:
Packit 1fb8d4
			s_how = SHUT_WR;
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case SD_BOTH:
Packit 1fb8d4
			s_how = SHUT_RDWR;
Packit 1fb8d4
			break;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	if (s_how < 0)
Packit 1fb8d4
		return SOCKET_ERROR;
Packit 1fb8d4
Packit 1fb8d4
	status = shutdown(fd, s_how);
Packit 1fb8d4
	return status;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
SOCKET _socket(int af, int type, int protocol)
Packit 1fb8d4
{
Packit 1fb8d4
	int fd;
Packit 1fb8d4
	SOCKET s;
Packit 1fb8d4
	fd = socket(af, type, protocol);
Packit 1fb8d4
Packit 1fb8d4
	if (fd < 0)
Packit 1fb8d4
		return INVALID_SOCKET;
Packit 1fb8d4
Packit Service 5a9772
	s = (SOCKET)fd;
Packit 1fb8d4
	return s;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
struct hostent* _gethostbyaddr(const char* addr, int len, int type)
Packit 1fb8d4
{
Packit 1fb8d4
	struct hostent* host;
Packit Service 5a9772
	host = gethostbyaddr((void*)addr, (socklen_t)len, type);
Packit 1fb8d4
	return host;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
struct hostent* _gethostbyname(const char* name)
Packit 1fb8d4
{
Packit 1fb8d4
	struct hostent* host;
Packit 1fb8d4
	host = gethostbyname(name);
Packit 1fb8d4
	return host;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
int _gethostname(char* name, int namelen)
Packit 1fb8d4
{
Packit 1fb8d4
	int status;
Packit Service 5a9772
	status = gethostname(name, (size_t)namelen);
Packit 1fb8d4
	return status;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
struct servent* _getservbyport(int port, const char* proto)
Packit 1fb8d4
{
Packit 1fb8d4
	struct servent* serv;
Packit 1fb8d4
	serv = getservbyport(port, proto);
Packit 1fb8d4
	return serv;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
struct servent* _getservbyname(const char* name, const char* proto)
Packit 1fb8d4
{
Packit 1fb8d4
	struct servent* serv;
Packit 1fb8d4
	serv = getservbyname(name, proto);
Packit 1fb8d4
	return serv;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
struct protoent* _getprotobynumber(int number)
Packit 1fb8d4
{
Packit 1fb8d4
	struct protoent* proto;
Packit 1fb8d4
	proto = getprotobynumber(number);
Packit 1fb8d4
	return proto;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
struct protoent* _getprotobyname(const char* name)
Packit 1fb8d4
{
Packit 1fb8d4
	struct protoent* proto;
Packit 1fb8d4
	proto = getprotobyname(name);
Packit 1fb8d4
	return proto;
Packit 1fb8d4
}
Packit 1fb8d4
Packit Service 5a9772
#endif /* _WIN32 */