20#include <winpr/config.h>
22#include <winpr/assert.h>
24#include <winpr/synch.h>
26#include <winpr/winsock.h>
28#ifdef WINPR_HAVE_UNISTD_H
31#ifdef WINPR_HAVE_SYS_FILIO_H
34#ifdef WINPR_HAVE_SYS_SOCKIO_H
35#include <sys/sockio.h>
43#define WSAIOCTL_IFADDRS
234#if (_WIN32_WINNT < 0x0600)
236PCSTR winpr_inet_ntop(INT Family, PVOID pAddr, PSTR pStringBuf,
size_t StringBufSize)
238 if (Family == AF_INET)
240 struct sockaddr_in in = { 0 };
242 in.sin_family = AF_INET;
243 memcpy(&in.sin_addr, pAddr,
sizeof(
struct in_addr));
244 getnameinfo((
struct sockaddr*)&in,
sizeof(
struct sockaddr_in), pStringBuf, StringBufSize,
245 NULL, 0, NI_NUMERICHOST);
248 else if (Family == AF_INET6)
250 struct sockaddr_in6 in = { 0 };
252 in.sin6_family = AF_INET6;
253 memcpy(&in.sin6_addr, pAddr,
sizeof(
struct in_addr6));
254 getnameinfo((
struct sockaddr*)&in,
sizeof(
struct sockaddr_in6), pStringBuf, StringBufSize,
255 NULL, 0, NI_NUMERICHOST);
262INT winpr_inet_pton(INT Family, PCSTR pszAddrString, PVOID pAddrBuf)
264 SOCKADDR_STORAGE addr;
265 int addr_len =
sizeof(addr);
267 if ((Family != AF_INET) && (Family != AF_INET6))
270 if (WSAStringToAddressA((
char*)pszAddrString, Family, NULL, (
struct sockaddr*)&addr,
274 if (Family == AF_INET)
276 memcpy(pAddrBuf, &((
struct sockaddr_in*)&addr)->sin_addr,
sizeof(
struct in_addr));
278 else if (Family == AF_INET6)
280 memcpy(pAddrBuf, &((
struct sockaddr_in6*)&addr)->sin6_addr,
sizeof(
struct in6_addr));
292#include <sys/ioctl.h>
293#include <sys/socket.h>
294#include <netinet/in.h>
295#include <netinet/tcp.h>
299#define MSG_NOSIGNAL 0
302int WSAStartup(WORD wVersionRequired, LPWSADATA lpWSAData)
304 WINPR_ASSERT(lpWSAData);
306 ZeroMemory(lpWSAData,
sizeof(
WSADATA));
307 lpWSAData->wVersion = wVersionRequired;
308 lpWSAData->wHighVersion = MAKEWORD(2, 2);
317void WSASetLastError(
int iError)
364 case WSAEDESTADDRREQ:
365 errno = EDESTADDRREQ;
380 case WSAEPROTONOSUPPORT:
381 errno = EPROTONOSUPPORT;
384 case WSAESOCKTNOSUPPORT:
385 errno = ESOCKTNOSUPPORT;
392 case WSAEPFNOSUPPORT:
393 errno = EPFNOSUPPORT;
396 case WSAEAFNOSUPPORT:
397 errno = EAFNOSUPPORT;
404 case WSAEADDRNOTAVAIL:
405 errno = EADDRNOTAVAIL;
420 case WSAECONNABORTED:
421 errno = ECONNABORTED;
444 case WSAETOOMANYREFS:
445 errno = ETOOMANYREFS;
452 case WSAECONNREFUSED:
453 errno = ECONNREFUSED;
460 case WSAENAMETOOLONG:
461 errno = ENAMETOOLONG;
468 case WSAEHOSTUNREACH:
469 errno = EHOSTUNREACH;
502int WSAGetLastError(
void)
536 iError = WSAEWOULDBLOCK;
540 iError = WSAEINPROGRESS;
544 iError = WSAEALREADY;
548 iError = WSAENOTSOCK;
552 iError = WSAEDESTADDRREQ;
556 iError = WSAEMSGSIZE;
560 iError = WSAEPROTOTYPE;
564 iError = WSAENOPROTOOPT;
567 case EPROTONOSUPPORT:
568 iError = WSAEPROTONOSUPPORT;
571 case ESOCKTNOSUPPORT:
572 iError = WSAESOCKTNOSUPPORT;
576 iError = WSAEOPNOTSUPP;
580 iError = WSAEPFNOSUPPORT;
584 iError = WSAEAFNOSUPPORT;
588 iError = WSAEADDRINUSE;
592 iError = WSAEADDRNOTAVAIL;
596 iError = WSAENETDOWN;
600 iError = WSAENETUNREACH;
604 iError = WSAENETRESET;
608 iError = WSAECONNABORTED;
612 iError = WSAECONNRESET;
624 iError = WSAENOTCONN;
628 iError = WSAESHUTDOWN;
632 iError = WSAETOOMANYREFS;
636 iError = WSAETIMEDOUT;
640 iError = WSAECONNREFUSED;
648 iError = WSAENAMETOOLONG;
652 iError = WSAEHOSTDOWN;
656 iError = WSAEHOSTUNREACH;
660 iError = WSAENOTEMPTY;
665 iError = WSAEPROCLIM;
685#if (EAGAIN != EWOULDBLOCK)
688 iError = WSAEWOULDBLOCK;
694 iError = WSAECONNRESET;
723HANDLE WSACreateEvent(
void)
725 return CreateEvent(NULL, TRUE, FALSE, NULL);
728BOOL WSASetEvent(HANDLE hEvent)
730 return SetEvent(hEvent);
733BOOL WSAResetEvent(WINPR_ATTR_UNUSED HANDLE hEvent)
740BOOL WSACloseEvent(HANDLE hEvent)
742 BOOL status = CloseHandle(hEvent);
750int WSAEventSelect(SOCKET s, WSAEVENT hEventObject, LONG lNetworkEvents)
755 if (_ioctlsocket(s, FIONBIO, &arg) != 0)
761 if (lNetworkEvents & FD_READ)
762 mode |= WINPR_FD_READ;
764 if (lNetworkEvents & FD_WRITE)
765 mode |= WINPR_FD_WRITE;
767 if (SetEventFileDescriptor(hEventObject, (
int)s, mode) < 0)
773DWORD WSAWaitForMultipleEvents(DWORD cEvents,
const HANDLE* lphEvents, BOOL fWaitAll,
774 DWORD dwTimeout, BOOL fAlertable)
776 return WaitForMultipleObjectsEx(cEvents, lphEvents, fWaitAll, dwTimeout, fAlertable);
779SOCKET WSASocketA(
int af,
int type,
int protocol,
781 WINPR_ATTR_UNUSED DWORD dwFlags)
784 s = _socket(af, type, protocol);
788SOCKET WSASocketW(
int af,
int type,
int protocol,
LPWSAPROTOCOL_INFOW lpProtocolInfo, GROUP g,
794int WSAIoctl(SOCKET s, DWORD dwIoControlCode, WINPR_ATTR_UNUSED LPVOID lpvInBuffer,
795 WINPR_ATTR_UNUSED DWORD cbInBuffer, LPVOID lpvOutBuffer, DWORD cbOutBuffer,
796 LPDWORD lpcbBytesReturned, WINPR_ATTR_UNUSED
LPWSAOVERLAPPED lpOverlapped,
797 WINPR_ATTR_UNUSED LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine)
803 size_t ifreq_len = 0;
804 struct ifreq* ifreq = NULL;
805 struct ifconf ifconf = { 0 };
806 char address[128] = { 0 };
807 char broadcast[128] = { 0 };
808 char netmask[128] = { 0 };
809 char buffer[4096] = { 0 };
810 size_t numInterfaces = 0;
811 size_t maxNumInterfaces = 0;
814 struct sockaddr_in* pAddress = NULL;
815 struct sockaddr_in* pBroadcast = NULL;
816 struct sockaddr_in* pNetmask = NULL;
818 if ((dwIoControlCode != SIO_GET_INTERFACE_LIST) ||
819 (!lpvOutBuffer || !cbOutBuffer || !lpcbBytesReturned))
821 WSASetLastError(WSAEINVAL);
828#ifdef WSAIOCTL_IFADDRS
830 struct ifaddrs* ifap = NULL;
832 if (getifaddrs(&ifap) != 0)
834 WSASetLastError(WSAENETDOWN);
841 for (
struct ifaddrs* ifa = ifap; ifa; ifa = ifa->ifa_next)
843 pInterface = &pInterfaces[index];
844 pAddress = (
struct sockaddr_in*)&pInterface->iiAddress;
845 pBroadcast = (
struct sockaddr_in*)&pInterface->iiBroadcastAddress;
846 pNetmask = (
struct sockaddr_in*)&pInterface->iiNetmask;
849 if (ifa->ifa_flags & IFF_UP)
852 if (ifa->ifa_flags & IFF_BROADCAST)
853 nFlags |= _IFF_BROADCAST;
855 if (ifa->ifa_flags & IFF_LOOPBACK)
856 nFlags |= _IFF_LOOPBACK;
858 if (ifa->ifa_flags & IFF_POINTOPOINT)
859 nFlags |= _IFF_POINTTOPOINT;
861 if (ifa->ifa_flags & IFF_MULTICAST)
862 nFlags |= _IFF_MULTICAST;
864 pInterface->iiFlags = nFlags;
868 if ((ifa->ifa_addr->sa_family != AF_INET) && (ifa->ifa_addr->sa_family != AF_INET6))
871 getnameinfo(ifa->ifa_addr,
sizeof(
struct sockaddr), address,
sizeof(address), 0, 0,
873 inet_pton(ifa->ifa_addr->sa_family, address, (
void*)&pAddress->sin_addr);
877 ZeroMemory(pAddress,
sizeof(
struct sockaddr_in));
880 if (ifa->ifa_dstaddr)
882 if ((ifa->ifa_dstaddr->sa_family != AF_INET) &&
883 (ifa->ifa_dstaddr->sa_family != AF_INET6))
886 getnameinfo(ifa->ifa_dstaddr,
sizeof(
struct sockaddr), broadcast,
sizeof(broadcast),
887 0, 0, NI_NUMERICHOST);
888 inet_pton(ifa->ifa_dstaddr->sa_family, broadcast, (
void*)&pBroadcast->sin_addr);
892 ZeroMemory(pBroadcast,
sizeof(
struct sockaddr_in));
895 if (ifa->ifa_netmask)
897 if ((ifa->ifa_netmask->sa_family != AF_INET) &&
898 (ifa->ifa_netmask->sa_family != AF_INET6))
901 getnameinfo(ifa->ifa_netmask,
sizeof(
struct sockaddr), netmask,
sizeof(netmask), 0,
903 inet_pton(ifa->ifa_netmask->sa_family, netmask, (
void*)&pNetmask->sin_addr);
907 ZeroMemory(pNetmask,
sizeof(
struct sockaddr_in));
914 *lpcbBytesReturned = (DWORD)(numInterfaces *
sizeof(
INTERFACE_INFO));
919 ifconf.ifc_len =
sizeof(buffer);
920 ifconf.ifc_buf = buffer;
922 if (ioctl(fd, SIOCGIFCONF, &ifconf) != 0)
924 WSASetLastError(WSAENETDOWN);
931 ifreq = ifconf.ifc_req;
933 while ((ifconf.ifc_len >= 0) && (offset < (
size_t)ifconf.ifc_len) &&
934 (numInterfaces < maxNumInterfaces))
936 pInterface = &pInterfaces[index];
937 pAddress = (
struct sockaddr_in*)&pInterface->iiAddress;
938 pBroadcast = (
struct sockaddr_in*)&pInterface->iiBroadcastAddress;
939 pNetmask = (
struct sockaddr_in*)&pInterface->iiNetmask;
941 if (ioctl(fd, SIOCGIFFLAGS, ifreq) != 0)
946 if (ifreq->ifr_flags & IFF_UP)
949 if (ifreq->ifr_flags & IFF_BROADCAST)
950 nFlags |= _IFF_BROADCAST;
952 if (ifreq->ifr_flags & IFF_LOOPBACK)
953 nFlags |= _IFF_LOOPBACK;
955 if (ifreq->ifr_flags & IFF_POINTOPOINT)
956 nFlags |= _IFF_POINTTOPOINT;
958 if (ifreq->ifr_flags & IFF_MULTICAST)
959 nFlags |= _IFF_MULTICAST;
961 pInterface->iiFlags = nFlags;
963 if (ioctl(fd, SIOCGIFADDR, ifreq) != 0)
966 if ((ifreq->ifr_addr.sa_family != AF_INET) && (ifreq->ifr_addr.sa_family != AF_INET6))
969 getnameinfo(&ifreq->ifr_addr,
sizeof(ifreq->ifr_addr), address,
sizeof(address), 0, 0,
971 inet_pton(ifreq->ifr_addr.sa_family, address, (
void*)&pAddress->sin_addr);
973 if (ioctl(fd, SIOCGIFBRDADDR, ifreq) != 0)
976 if ((ifreq->ifr_addr.sa_family != AF_INET) && (ifreq->ifr_addr.sa_family != AF_INET6))
979 getnameinfo(&ifreq->ifr_addr,
sizeof(ifreq->ifr_addr), broadcast,
sizeof(broadcast), 0, 0,
981 inet_pton(ifreq->ifr_addr.sa_family, broadcast, (
void*)&pBroadcast->sin_addr);
983 if (ioctl(fd, SIOCGIFNETMASK, ifreq) != 0)
986 if ((ifreq->ifr_addr.sa_family != AF_INET) && (ifreq->ifr_addr.sa_family != AF_INET6))
989 getnameinfo(&ifreq->ifr_addr,
sizeof(ifreq->ifr_addr), netmask,
sizeof(netmask), 0, 0,
991 inet_pton(ifreq->ifr_addr.sa_family, netmask, (
void*)&pNetmask->sin_addr);
994#if !defined(__linux__) && !defined(__sun__) && !defined(__CYGWIN__) && !defined(EMSCRIPTEN)
995 ifreq_len = IFNAMSIZ + ifreq->ifr_addr.sa_len;
997 ifreq_len =
sizeof(*ifreq);
999 ifreq = (
struct ifreq*)&((BYTE*)ifreq)[ifreq_len];
1000 offset += ifreq_len;
1004 *lpcbBytesReturned = (DWORD)(numInterfaces *
sizeof(
INTERFACE_INFO));
1008SOCKET _accept(SOCKET s,
struct sockaddr* addr,
int* addrlen)
1010 int fd = WINPR_ASSERTING_INT_CAST(
int, s);
1011 socklen_t s_addrlen = (socklen_t)*addrlen;
1012 const int status = accept(fd, addr, &s_addrlen);
1013 *addrlen = (int)s_addrlen;
1014 return (SOCKET)status;
1017int _bind(SOCKET s,
const struct sockaddr* addr,
int namelen)
1021 status = bind(fd, addr, (socklen_t)namelen);
1024 return SOCKET_ERROR;
1029int closesocket(SOCKET s)
1037int _connect(SOCKET s,
const struct sockaddr* name,
int namelen)
1041 status = connect(fd, name, (socklen_t)namelen);
1044 return SOCKET_ERROR;
1050int _ioctlsocket(SOCKET s,
long cmd, u_long* argp)
1059 return SOCKET_ERROR;
1061 flags = fcntl(fd, F_GETFL);
1064 return SOCKET_ERROR;
1067 (void)fcntl(fd, F_SETFL, flags | O_NONBLOCK);
1069 (
void)fcntl(fd, F_SETFL, flags & ~(O_NONBLOCK));
1075int _getpeername(SOCKET s,
struct sockaddr* name,
int* namelen)
1079 socklen_t s_namelen = (socklen_t)*namelen;
1080 status = getpeername(fd, name, &s_namelen);
1081 *namelen = (int)s_namelen;
1085int _getsockname(SOCKET s,
struct sockaddr* name,
int* namelen)
1089 socklen_t s_namelen = (socklen_t)*namelen;
1090 status = getsockname(fd, name, &s_namelen);
1091 *namelen = (int)s_namelen;
1095int _getsockopt(SOCKET s,
int level,
int optname,
char* optval,
int* optlen)
1099 socklen_t s_optlen = (socklen_t)*optlen;
1100 status = getsockopt(fd, level, optname, (
void*)optval, &s_optlen);
1101 *optlen = (int)s_optlen;
1105u_long _htonl(u_long hostlong)
1107 WINPR_ASSERT(hostlong <= UINT32_MAX);
1108 return htonl((UINT32)hostlong);
1111u_short _htons(u_short hostshort)
1113 return htons(hostshort);
1116unsigned long _inet_addr(
const char* cp)
1118 return WINPR_ASSERTING_INT_CAST(
unsigned long, inet_addr(cp));
1121char* _inet_ntoa(
struct in_addr in)
1124 return inet_ntoa(in);
1127int _listen(SOCKET s,
int backlog)
1131 status = listen(fd, backlog);
1135u_long _ntohl(u_long netlong)
1137 WINPR_ASSERT((netlong & 0xFFFFFFFF00000000ULL) == 0);
1138 return ntohl((UINT32)netlong);
1141u_short _ntohs(u_short netshort)
1143 return ntohs(netshort);
1146int _recv(SOCKET s,
char* buf,
int len,
int flags)
1150 status = (int)recv(fd, (
void*)buf, (size_t)len, flags);
1154int _recvfrom(SOCKET s,
char* buf,
int len,
int flags,
struct sockaddr* from,
int* fromlen)
1158 socklen_t s_fromlen = (socklen_t)*fromlen;
1159 status = (int)recvfrom(fd, (
void*)buf, (size_t)len, flags, from, &s_fromlen);
1160 *fromlen = (int)s_fromlen;
1164int _select(
int nfds, fd_set* readfds, fd_set* writefds, fd_set* exceptfds,
1165 const struct timeval* timeout)
1170 const struct timeval* cpv;
1176 status = select(nfds, readfds, writefds, exceptfds, cnv.pv);
1177 }
while ((status < 0) && (errno == EINTR));
1182int _send(SOCKET s,
const char* buf,
int len,
int flags)
1186 flags |= MSG_NOSIGNAL;
1187 status = (int)send(fd, (
const void*)buf, (size_t)len, flags);
1191int _sendto(SOCKET s,
const char* buf,
int len,
int flags,
const struct sockaddr* to,
int tolen)
1195 status = (int)sendto(fd, (
const void*)buf, (size_t)len, flags, to, (socklen_t)tolen);
1199int _setsockopt(SOCKET s,
int level,
int optname,
const char* optval,
int optlen)
1203 status = setsockopt(fd, level, optname, (
const void*)optval, (socklen_t)optlen);
1207int _shutdown(SOCKET s,
int how)
1231 return SOCKET_ERROR;
1233 status = shutdown(fd, s_how);
1237SOCKET _socket(
int af,
int type,
int protocol)
1241 fd = socket(af, type, protocol);
1244 return INVALID_SOCKET;
1250struct hostent* _gethostbyaddr(
const char* addr,
int len,
int type)
1252 struct hostent* host = NULL;
1254 host = gethostbyaddr((
const void*)addr, (socklen_t)len, type);
1258struct hostent* _gethostbyname(
const char* name)
1261 struct hostent* host = gethostbyname(name);
1265int _gethostname(
char* name,
int namelen)
1268 status = gethostname(name, (
size_t)namelen);
1272struct servent* _getservbyport(
int port,
const char* proto)
1275 return getservbyport(port, proto);
1279_getservbyname(
const char* name,
const char* proto)
1283 return getservbyname(name, proto);
1286struct protoent* _getprotobynumber(
int number)
1289 return getprotobynumber(number);
1292struct protoent* _getprotobyname(
const char* name)
1295 return getprotobyname(name);