Blame winpr/libwinpr/winsock/winsock.c

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