FreeRDP
Loading...
Searching...
No Matches
winsock.h
1
20#ifndef WINPR_WINSOCK_H
21#define WINPR_WINSOCK_H
22
23#include <winpr/platform.h>
24#include <winpr/winpr.h>
25#include <winpr/wtypes.h>
26#include <winpr/windows.h>
27
28WINPR_PRAGMA_DIAG_PUSH
29WINPR_PRAGMA_DIAG_IGNORED_RESERVED_IDENTIFIER
30
31#ifdef _WIN32
32
33#define _accept accept
34#define _bind bind
35#define _connect connect
36#define _ioctlsocket ioctlsocket
37#define _getpeername getpeername
38#define _getsockname getsockname
39#define _getsockopt getsockopt
40#define _htonl htonl
41#define _htons htons
42#define _inet_addr inet_addr
43#define _inet_ntoa inet_ntoa
44#define _listen listen
45#define _ntohl ntohl
46#define _ntohs ntohs
47#define _recv recv
48#define _recvfrom recvfrom
49#define _select select
50#define _send send
51#define _sendto sendto
52#define _setsockopt setsockopt
53#define _shutdown shutdown
54#define _socket socket
55#define _gethostbyaddr gethostbyaddr
56#define _gethostbyname gethostbyname
57#define _gethostname gethostname
58#define _getservbyport getservbyport
59#define _getservbyname getservbyname
60#define _getprotobynumber getprotobynumber
61#define _getprotobyname getprotobyname
62
63#define _IFF_UP IFF_UP
64#define _IFF_BROADCAST IFF_BROADCAST
65#define _IFF_LOOPBACK IFF_LOOPBACK
66#define _IFF_POINTTOPOINT IFF_POINTTOPOINT
67#define _IFF_MULTICAST IFF_MULTICAST
68
69#if (_WIN32_WINNT < 0x0600)
70
71WINPR_API PCSTR winpr_inet_ntop(INT Family, PVOID pAddr, PSTR pStringBuf, size_t StringBufSize);
72WINPR_API INT winpr_inet_pton(INT Family, PCSTR pszAddrString, PVOID pAddrBuf);
73
74#define inet_ntop winpr_inet_ntop
75#define inet_pton winpr_inet_pton
76
77#endif /* (_WIN32_WINNT < 0x0600) */
78
79#else /* _WIN32 */
80
81#include <netdb.h>
82#include <unistd.h>
83#include <sys/un.h>
84#include <sys/ioctl.h>
85#include <sys/socket.h>
86#include <arpa/inet.h>
87#include <netinet/in.h>
88#include <netinet/tcp.h>
89#include <net/if.h>
90
91#include <winpr/io.h>
92#include <winpr/error.h>
93
94#define WSAEVENT HANDLE
95#define LPWSAEVENT LPHANDLE
96#define WSAOVERLAPPED OVERLAPPED
98
99typedef UINT_PTR SOCKET;
100typedef struct sockaddr_storage SOCKADDR_STORAGE;
101
102#ifndef INVALID_SOCKET
103#define INVALID_SOCKET (SOCKET)(~0)
104#endif
105
106#define WSADESCRIPTION_LEN 256
107#define WSASYS_STATUS_LEN 128
108
109#define FD_READ_BIT 0
110#define FD_READ (1 << FD_READ_BIT)
111
112#define FD_WRITE_BIT 1
113#define FD_WRITE (1 << FD_WRITE_BIT)
114
115#define FD_OOB_BIT 2
116#define FD_OOB (1 << FD_OOB_BIT)
117
118#define FD_ACCEPT_BIT 3
119#define FD_ACCEPT (1 << FD_ACCEPT_BIT)
120
121#define FD_CONNECT_BIT 4
122#define FD_CONNECT (1 << FD_CONNECT_BIT)
123
124#define FD_CLOSE_BIT 5
125#define FD_CLOSE (1 << FD_CLOSE_BIT)
126
127#define FD_QOS_BIT 6
128#define FD_QOS (1 << FD_QOS_BIT)
129
130#define FD_GROUP_QOS_BIT 7
131#define FD_GROUP_QOS (1 << FD_GROUP_QOS_BIT)
132
133#define FD_ROUTING_INTERFACE_CHANGE_BIT 8
134#define FD_ROUTING_INTERFACE_CHANGE (1 << FD_ROUTING_INTERFACE_CHANGE_BIT)
135
136#define FD_ADDRESS_LIST_CHANGE_BIT 9
137#define FD_ADDRESS_LIST_CHANGE (1 << FD_ADDRESS_LIST_CHANGE_BIT)
138
139#define FD_MAX_EVENTS 10
140#define FD_ALL_EVENTS ((1 << FD_MAX_EVENTS) - 1)
141
142#define SD_RECEIVE 0
143#define SD_SEND 1
144#define SD_BOTH 2
145
146#define SOCKET_ERROR (-1)
147
148typedef struct WSAData
149{
150 WORD wVersion;
151 WORD wHighVersion;
152#ifdef _M_AMD64
153 unsigned short iMaxSockets;
154 unsigned short iMaxUdpDg;
155 char* lpVendorInfo;
156 char szDescription[WSADESCRIPTION_LEN + 1];
157 char szSystemStatus[WSASYS_STATUS_LEN + 1];
158#else
159 char szDescription[WSADESCRIPTION_LEN + 1];
160 char szSystemStatus[WSASYS_STATUS_LEN + 1];
161 unsigned short iMaxSockets;
162 unsigned short iMaxUdpDg;
163 char* lpVendorInfo;
164#endif
165} WSADATA, *LPWSADATA;
166
167#ifndef MAKEWORD
168#define MAKEWORD(a, b) \
169 ((WORD)(((BYTE)((DWORD_PTR)(a)&0xFF)) | (((WORD)((BYTE)((DWORD_PTR)(b)&0xFF))) << 8)))
170#endif
171
172typedef struct in6_addr IN6_ADDR;
173typedef struct in6_addr* PIN6_ADDR;
174typedef struct in6_addr* LPIN6_ADDR;
175
177{
178 SHORT sin6_family;
179 USHORT sin6_port;
180 ULONG sin6_flowinfo;
181 IN6_ADDR sin6_addr;
182};
183
184typedef union sockaddr_gen
185{
186 struct sockaddr Address;
187 struct sockaddr_in AddressIn; /* codespell:ignore addressin */
188 struct sockaddr_in6_old AddressIn6;
189
191
192WINPR_PRAGMA_DIAG_PUSH
193WINPR_PRAGMA_DIAG_IGNORED_RESERVED_ID_MACRO
194
195// NOLINTBEGIN(bugprone-reserved-identifier,cert-dcl37-c,cert-dcl51-cpp)
196#define _IFF_UP 0x00000001
197#define _IFF_BROADCAST 0x00000002
198#define _IFF_LOOPBACK 0x00000004
199#define _IFF_POINTTOPOINT 0x00000008
200#define _IFF_MULTICAST 0x00000010
201// NOLINTEND(bugprone-reserved-identifier,cert-dcl37-c,cert-dcl51-cpp)
202
203WINPR_PRAGMA_DIAG_POP
204
205typedef struct
206{
207 ULONG iiFlags;
208 sockaddr_gen iiAddress;
209 sockaddr_gen iiBroadcastAddress;
210 sockaddr_gen iiNetmask;
213
214#define MAX_PROTOCOL_CHAIN 7
215#define WSAPROTOCOL_LEN 255
216
217typedef struct
218{
219 int ChainLen;
220 DWORD ChainEntries[MAX_PROTOCOL_CHAIN];
222
223typedef struct
224{
225 DWORD dwServiceFlags1;
226 DWORD dwServiceFlags2;
227 DWORD dwServiceFlags3;
228 DWORD dwServiceFlags4;
229 DWORD dwProviderFlags;
230 GUID ProviderId;
231 DWORD dwCatalogEntryId;
232 WSAPROTOCOLCHAIN ProtocolChain;
233 int iVersion;
234 int iAddressFamily;
235 int iMaxSockAddr;
236 int iMinSockAddr;
237 int iSocketType;
238 int iProtocol;
239 int iProtocolMaxOffset;
240 int iNetworkByteOrder;
241 int iSecurityScheme;
242 DWORD dwMessageSize;
243 DWORD dwProviderReserved;
244 CHAR szProtocol[WSAPROTOCOL_LEN + 1];
246
247typedef struct
248{
249 DWORD dwServiceFlags1;
250 DWORD dwServiceFlags2;
251 DWORD dwServiceFlags3;
252 DWORD dwServiceFlags4;
253 DWORD dwProviderFlags;
254 GUID ProviderId;
255 DWORD dwCatalogEntryId;
256 WSAPROTOCOLCHAIN ProtocolChain;
257 int iVersion;
258 int iAddressFamily;
259 int iMaxSockAddr;
260 int iMinSockAddr;
261 int iSocketType;
262 int iProtocol;
263 int iProtocolMaxOffset;
264 int iNetworkByteOrder;
265 int iSecurityScheme;
266 DWORD dwMessageSize;
267 DWORD dwProviderReserved;
268 WCHAR szProtocol[WSAPROTOCOL_LEN + 1];
270
271typedef void(CALLBACK* LPWSAOVERLAPPED_COMPLETION_ROUTINE)(DWORD dwError, DWORD cbTransferred,
272 LPWSAOVERLAPPED lpOverlapped,
273 DWORD dwFlags);
274
275typedef UINT32 GROUP;
276#define SG_UNCONSTRAINED_GROUP 0x01
277#define SG_CONSTRAINED_GROUP 0x02
278
279#define SIO_GET_INTERFACE_LIST _IOR('t', 127, ULONG)
280#define SIO_GET_INTERFACE_LIST_EX _IOR('t', 126, ULONG)
281#define SIO_SET_MULTICAST_FILTER _IOW('t', 125, ULONG)
282#define SIO_GET_MULTICAST_FILTER _IOW('t', 124 | IOC_IN, ULONG)
283#define SIOCSIPMSFILTER SIO_SET_MULTICAST_FILTER
284#define SIOCGIPMSFILTER SIO_GET_MULTICAST_FILTER
285
286#ifdef UNICODE
287#define WSAPROTOCOL_INFO WSAPROTOCOL_INFOW
288#define LPWSAPROTOCOL_INFO LPWSAPROTOCOL_INFOW
289#else
290#define WSAPROTOCOL_INFO WSAPROTOCOL_INFOA
291#define LPWSAPROTOCOL_INFO LPWSAPROTOCOL_INFOA
292#endif
293
294#ifdef __cplusplus
295extern "C"
296{
297#endif
298
299 WINPR_API int WSAStartup(WORD wVersionRequired, LPWSADATA lpWSAData);
300 WINPR_API int WSACleanup(void);
301
302 WINPR_API void WSASetLastError(int iError);
303 WINPR_API int WSAGetLastError(void);
304
305 WINPR_API BOOL WSACloseEvent(HANDLE hEvent);
306
307 WINPR_ATTR_MALLOC(WSACloseEvent, 1)
308 WINPR_API HANDLE WSACreateEvent(void);
309 WINPR_API BOOL WSASetEvent(HANDLE hEvent);
310 WINPR_API BOOL WSAResetEvent(HANDLE hEvent);
311
312 WINPR_API int WSAEventSelect(SOCKET s, WSAEVENT hEventObject, LONG lNetworkEvents);
313
314 WINPR_API DWORD WSAWaitForMultipleEvents(DWORD cEvents, const HANDLE* lphEvents, BOOL fWaitAll,
315 DWORD dwTimeout, BOOL fAlertable);
316
317 WINPR_API SOCKET WSASocketA(int af, int type, int protocol, LPWSAPROTOCOL_INFOA lpProtocolInfo,
318 GROUP g, DWORD dwFlags);
319 WINPR_API SOCKET WSASocketW(int af, int type, int protocol, LPWSAPROTOCOL_INFOW lpProtocolInfo,
320 GROUP g, DWORD dwFlags);
321
322 WINPR_API int WSAIoctl(SOCKET s, DWORD dwIoControlCode, LPVOID lpvInBuffer, DWORD cbInBuffer,
323 LPVOID lpvOutBuffer, DWORD cbOutBuffer, LPDWORD lpcbBytesReturned,
324 LPWSAOVERLAPPED lpOverlapped,
325 LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine);
326
327 // NOLINTBEGIN(bugprone-reserved-identifier,cert-dcl37-c,cert-dcl51-cpp)
328 WINPR_API SOCKET _accept(SOCKET s, struct sockaddr* addr, int* addrlen);
329 WINPR_API int _bind(SOCKET s, const struct sockaddr* addr, int namelen);
330 WINPR_API int closesocket(SOCKET s);
331 WINPR_API int _connect(SOCKET s, const struct sockaddr* name, int namelen);
332 WINPR_API int _ioctlsocket(SOCKET s, long cmd, u_long* argp);
333 WINPR_API int _getpeername(SOCKET s, struct sockaddr* name, int* namelen);
334 WINPR_API int _getsockname(SOCKET s, struct sockaddr* name, int* namelen);
335 WINPR_API int _getsockopt(SOCKET s, int level, int optname, char* optval, int* optlen);
336 WINPR_API u_long _htonl(u_long hostlong);
337 WINPR_API u_short _htons(u_short hostshort);
338 WINPR_API unsigned long _inet_addr(const char* cp);
339 WINPR_API char* _inet_ntoa(struct in_addr in);
340 WINPR_API int _listen(SOCKET s, int backlog);
341 WINPR_API u_long _ntohl(u_long netlong);
342 WINPR_API u_short _ntohs(u_short netshort);
343 WINPR_API int _recv(SOCKET s, char* buf, int len, int flags);
344 WINPR_API int _recvfrom(SOCKET s, char* buf, int len, int flags, struct sockaddr* from,
345 int* fromlen);
346 WINPR_API int _select(int nfds, fd_set* readfds, fd_set* writefds, fd_set* exceptfds,
347 const struct timeval* timeout);
348 WINPR_API int _send(SOCKET s, const char* buf, int len, int flags);
349 WINPR_API int _sendto(SOCKET s, const char* buf, int len, int flags, const struct sockaddr* to,
350 int tolen);
351 WINPR_API int _setsockopt(SOCKET s, int level, int optname, const char* optval, int optlen);
352 WINPR_API int _shutdown(SOCKET s, int how);
353 WINPR_API SOCKET _socket(int af, int type, int protocol);
354 WINPR_API struct hostent* _gethostbyaddr(const char* addr, int len, int type);
355 WINPR_API struct hostent* _gethostbyname(const char* name);
356 WINPR_API int _gethostname(char* name, int namelen);
357 WINPR_API struct servent* /* codespell:ignore servent */ _getservbyport(int port,
358 const char* proto);
359 WINPR_API struct servent* /* codespell:ignore servent */ _getservbyname(const char* name,
360 const char* proto);
361 WINPR_API struct protoent* _getprotobynumber(int number);
362 WINPR_API struct protoent* _getprotobyname(const char* name);
363
364 // NOLINTEND(bugprone-reserved-identifier,cert-dcl37-c,cert-dcl51-cpp)
365
366#ifdef __cplusplus
367}
368#endif
369
370#ifdef UNICODE
371#define WSASocket WSASocketW
372#else
373#define WSASocket WSASocketA
374#endif
375
376#endif /* _WIN32 */
377
378WINPR_PRAGMA_DIAG_POP
379
380#endif /* WINPR_WINSOCK_H */