|
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 */
|