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_ATTR_NODISCARD
72WINPR_API PCSTR winpr_inet_ntop(INT Family, PVOID pAddr, PSTR pStringBuf, size_t StringBufSize);
73WINPR_ATTR_NODISCARD
74WINPR_API INT winpr_inet_pton(INT Family, PCSTR pszAddrString, PVOID pAddrBuf);
75
76#define inet_ntop winpr_inet_ntop
77#define inet_pton winpr_inet_pton
78
79#endif /* (_WIN32_WINNT < 0x0600) */
80
81#else /* _WIN32 */
82
83#include <netdb.h>
84#include <unistd.h>
85#include <sys/un.h>
86#include <sys/ioctl.h>
87#include <sys/socket.h>
88#include <arpa/inet.h>
89#include <netinet/in.h>
90#include <netinet/tcp.h>
91#include <net/if.h>
92
93#include <winpr/io.h>
94#include <winpr/error.h>
95
96#define WSAEVENT HANDLE
97#define LPWSAEVENT LPHANDLE
98#define WSAOVERLAPPED OVERLAPPED
100
101typedef UINT_PTR SOCKET;
102typedef struct sockaddr_storage SOCKADDR_STORAGE;
103
104#ifndef INVALID_SOCKET
105#define INVALID_SOCKET (SOCKET)(~0)
106#endif
107
108#define WSADESCRIPTION_LEN 256
109#define WSASYS_STATUS_LEN 128
110
111#define FD_READ_BIT 0
112#define FD_READ (1 << FD_READ_BIT)
113
114#define FD_WRITE_BIT 1
115#define FD_WRITE (1 << FD_WRITE_BIT)
116
117#define FD_OOB_BIT 2
118#define FD_OOB (1 << FD_OOB_BIT)
119
120#define FD_ACCEPT_BIT 3
121#define FD_ACCEPT (1 << FD_ACCEPT_BIT)
122
123#define FD_CONNECT_BIT 4
124#define FD_CONNECT (1 << FD_CONNECT_BIT)
125
126#define FD_CLOSE_BIT 5
127#define FD_CLOSE (1 << FD_CLOSE_BIT)
128
129#define FD_QOS_BIT 6
130#define FD_QOS (1 << FD_QOS_BIT)
131
132#define FD_GROUP_QOS_BIT 7
133#define FD_GROUP_QOS (1 << FD_GROUP_QOS_BIT)
134
135#define FD_ROUTING_INTERFACE_CHANGE_BIT 8
136#define FD_ROUTING_INTERFACE_CHANGE (1 << FD_ROUTING_INTERFACE_CHANGE_BIT)
137
138#define FD_ADDRESS_LIST_CHANGE_BIT 9
139#define FD_ADDRESS_LIST_CHANGE (1 << FD_ADDRESS_LIST_CHANGE_BIT)
140
141#define FD_MAX_EVENTS 10
142#define FD_ALL_EVENTS ((1 << FD_MAX_EVENTS) - 1)
143
144#define SD_RECEIVE 0
145#define SD_SEND 1
146#define SD_BOTH 2
147
148#define SOCKET_ERROR (-1)
149
150typedef struct WSAData
151{
152 WORD wVersion;
153 WORD wHighVersion;
154#ifdef _M_AMD64
155 unsigned short iMaxSockets;
156 unsigned short iMaxUdpDg;
157 char* lpVendorInfo;
158 char szDescription[WSADESCRIPTION_LEN + 1];
159 char szSystemStatus[WSASYS_STATUS_LEN + 1];
160#else
161 char szDescription[WSADESCRIPTION_LEN + 1];
162 char szSystemStatus[WSASYS_STATUS_LEN + 1];
163 unsigned short iMaxSockets;
164 unsigned short iMaxUdpDg;
165 char* lpVendorInfo;
166#endif
167} WSADATA, *LPWSADATA;
168
169#ifndef MAKEWORD
170#define MAKEWORD(a, b) \
171 ((WORD)(((BYTE)((DWORD_PTR)(a)&0xFF)) | (((WORD)((BYTE)((DWORD_PTR)(b)&0xFF))) << 8)))
172#endif
173
174typedef struct in6_addr IN6_ADDR;
175typedef struct in6_addr* PIN6_ADDR;
176typedef struct in6_addr* LPIN6_ADDR;
177
179{
180 SHORT sin6_family;
181 USHORT sin6_port;
182 ULONG sin6_flowinfo;
183 IN6_ADDR sin6_addr;
184};
185
186typedef union sockaddr_gen
187{
188 struct sockaddr Address;
189 struct sockaddr_in AddressIn; /* codespell:ignore addressin */
190 struct sockaddr_in6_old AddressIn6;
191
193
194WINPR_PRAGMA_DIAG_PUSH
195WINPR_PRAGMA_DIAG_IGNORED_RESERVED_ID_MACRO
196
197// NOLINTBEGIN(bugprone-reserved-identifier,cert-dcl37-c,cert-dcl51-cpp)
198#define _IFF_UP 0x00000001
199#define _IFF_BROADCAST 0x00000002
200#define _IFF_LOOPBACK 0x00000004
201#define _IFF_POINTTOPOINT 0x00000008
202#define _IFF_MULTICAST 0x00000010
203// NOLINTEND(bugprone-reserved-identifier,cert-dcl37-c,cert-dcl51-cpp)
204
205WINPR_PRAGMA_DIAG_POP
206
207typedef struct
208{
209 ULONG iiFlags;
210 sockaddr_gen iiAddress;
211 sockaddr_gen iiBroadcastAddress;
212 sockaddr_gen iiNetmask;
215
216#define MAX_PROTOCOL_CHAIN 7
217#define WSAPROTOCOL_LEN 255
218
219typedef struct
220{
221 int ChainLen;
222 DWORD ChainEntries[MAX_PROTOCOL_CHAIN];
224
225typedef struct
226{
227 DWORD dwServiceFlags1;
228 DWORD dwServiceFlags2;
229 DWORD dwServiceFlags3;
230 DWORD dwServiceFlags4;
231 DWORD dwProviderFlags;
232 GUID ProviderId;
233 DWORD dwCatalogEntryId;
234 WSAPROTOCOLCHAIN ProtocolChain;
235 int iVersion;
236 int iAddressFamily;
237 int iMaxSockAddr;
238 int iMinSockAddr;
239 int iSocketType;
240 int iProtocol;
241 int iProtocolMaxOffset;
242 int iNetworkByteOrder;
243 int iSecurityScheme;
244 DWORD dwMessageSize;
245 DWORD dwProviderReserved;
246 CHAR szProtocol[WSAPROTOCOL_LEN + 1];
248
249typedef struct
250{
251 DWORD dwServiceFlags1;
252 DWORD dwServiceFlags2;
253 DWORD dwServiceFlags3;
254 DWORD dwServiceFlags4;
255 DWORD dwProviderFlags;
256 GUID ProviderId;
257 DWORD dwCatalogEntryId;
258 WSAPROTOCOLCHAIN ProtocolChain;
259 int iVersion;
260 int iAddressFamily;
261 int iMaxSockAddr;
262 int iMinSockAddr;
263 int iSocketType;
264 int iProtocol;
265 int iProtocolMaxOffset;
266 int iNetworkByteOrder;
267 int iSecurityScheme;
268 DWORD dwMessageSize;
269 DWORD dwProviderReserved;
270 WCHAR szProtocol[WSAPROTOCOL_LEN + 1];
272
273typedef void(CALLBACK* LPWSAOVERLAPPED_COMPLETION_ROUTINE)(DWORD dwError, DWORD cbTransferred,
274 LPWSAOVERLAPPED lpOverlapped,
275 DWORD dwFlags);
276
277typedef UINT32 GROUP;
278#define SG_UNCONSTRAINED_GROUP 0x01
279#define SG_CONSTRAINED_GROUP 0x02
280
281#define SIO_GET_INTERFACE_LIST _IOR('t', 127, ULONG)
282#define SIO_GET_INTERFACE_LIST_EX _IOR('t', 126, ULONG)
283#define SIO_SET_MULTICAST_FILTER _IOW('t', 125, ULONG)
284#define SIO_GET_MULTICAST_FILTER _IOW('t', 124 | IOC_IN, ULONG)
285#define SIOCSIPMSFILTER SIO_SET_MULTICAST_FILTER
286#define SIOCGIPMSFILTER SIO_GET_MULTICAST_FILTER
287
288#ifdef UNICODE
289#define WSAPROTOCOL_INFO WSAPROTOCOL_INFOW
290#define LPWSAPROTOCOL_INFO LPWSAPROTOCOL_INFOW
291#else
292#define WSAPROTOCOL_INFO WSAPROTOCOL_INFOA
293#define LPWSAPROTOCOL_INFO LPWSAPROTOCOL_INFOA
294#endif
295
296#ifdef __cplusplus
297extern "C"
298{
299#endif
300
301 WINPR_ATTR_NODISCARD
302 WINPR_API int WSAStartup(WORD wVersionRequired, LPWSADATA lpWSAData);
303
304 WINPR_API int WSACleanup(void);
305
306 WINPR_API void WSASetLastError(int iError);
307
308 WINPR_ATTR_NODISCARD
309 WINPR_API int WSAGetLastError(void);
310
311 WINPR_ATTR_NODISCARD
312 WINPR_API BOOL WSACloseEvent(HANDLE hEvent);
313
314 WINPR_ATTR_MALLOC(WSACloseEvent, 1)
315 WINPR_API HANDLE WSACreateEvent(void);
316
317 WINPR_ATTR_NODISCARD
318 WINPR_API BOOL WSASetEvent(HANDLE hEvent);
319
320 WINPR_API BOOL WSAResetEvent(HANDLE hEvent);
321
322 WINPR_API int WSAEventSelect(SOCKET s, WSAEVENT hEventObject, LONG lNetworkEvents);
323
324 WINPR_ATTR_NODISCARD
325 WINPR_API DWORD WSAWaitForMultipleEvents(DWORD cEvents, const HANDLE* lphEvents, BOOL fWaitAll,
326 DWORD dwTimeout, BOOL fAlertable);
327
328 WINPR_ATTR_NODISCARD
329 WINPR_API SOCKET WSASocketA(int af, int type, int protocol, LPWSAPROTOCOL_INFOA lpProtocolInfo,
330 GROUP g, DWORD dwFlags);
331
332 WINPR_ATTR_NODISCARD
333 WINPR_API SOCKET WSASocketW(int af, int type, int protocol, LPWSAPROTOCOL_INFOW lpProtocolInfo,
334 GROUP g, DWORD dwFlags);
335
336 WINPR_ATTR_NODISCARD
337 WINPR_API int WSAIoctl(SOCKET s, DWORD dwIoControlCode, LPVOID lpvInBuffer, DWORD cbInBuffer,
338 LPVOID lpvOutBuffer, DWORD cbOutBuffer, LPDWORD lpcbBytesReturned,
339 LPWSAOVERLAPPED lpOverlapped,
340 LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine);
341
342 // NOLINTBEGIN(bugprone-reserved-identifier,cert-dcl37-c,cert-dcl51-cpp)
343 WINPR_ATTR_NODISCARD
344 WINPR_API SOCKET _accept(SOCKET s, struct sockaddr* addr, int* addrlen);
345
346 WINPR_ATTR_NODISCARD
347 WINPR_API int _bind(SOCKET s, const struct sockaddr* addr, int namelen);
348
349 WINPR_API int closesocket(SOCKET s);
350
351 WINPR_ATTR_NODISCARD
352 WINPR_API int _connect(SOCKET s, const struct sockaddr* name, int namelen);
353
354 WINPR_ATTR_NODISCARD
355 WINPR_API int _ioctlsocket(SOCKET s, long cmd, u_long* argp);
356
357 WINPR_ATTR_NODISCARD
358 WINPR_API int _getpeername(SOCKET s, struct sockaddr* name, int* namelen);
359
360 WINPR_ATTR_NODISCARD
361 WINPR_API int _getsockname(SOCKET s, struct sockaddr* name, int* namelen);
362
363 WINPR_ATTR_NODISCARD
364 WINPR_API int _getsockopt(SOCKET s, int level, int optname, char* optval, int* optlen);
365
366 WINPR_ATTR_NODISCARD
367 WINPR_API u_long _htonl(u_long hostlong);
368
369 WINPR_ATTR_NODISCARD
370 WINPR_API u_short _htons(u_short hostshort);
371
372 WINPR_ATTR_NODISCARD
373 WINPR_API unsigned long _inet_addr(const char* cp);
374
375 WINPR_ATTR_NODISCARD
376 WINPR_API char* _inet_ntoa(struct in_addr in);
377
378 WINPR_ATTR_NODISCARD
379 WINPR_API int _listen(SOCKET s, int backlog);
380
381 WINPR_ATTR_NODISCARD
382 WINPR_API u_long _ntohl(u_long netlong);
383
384 WINPR_ATTR_NODISCARD
385 WINPR_API u_short _ntohs(u_short netshort);
386
387 WINPR_ATTR_NODISCARD
388 WINPR_API int _recv(SOCKET s, char* buf, int len, int flags);
389
390 WINPR_ATTR_NODISCARD
391 WINPR_API int _recvfrom(SOCKET s, char* buf, int len, int flags, struct sockaddr* from,
392 int* fromlen);
393
394 WINPR_ATTR_NODISCARD
395 WINPR_API int _select(int nfds, fd_set* readfds, fd_set* writefds, fd_set* exceptfds,
396 const struct timeval* timeout);
397
398 WINPR_ATTR_NODISCARD
399 WINPR_API int _send(SOCKET s, const char* buf, int len, int flags);
400
401 WINPR_ATTR_NODISCARD
402 WINPR_API int _sendto(SOCKET s, const char* buf, int len, int flags, const struct sockaddr* to,
403 int tolen);
404
405 WINPR_ATTR_NODISCARD
406 WINPR_API int _setsockopt(SOCKET s, int level, int optname, const char* optval, int optlen);
407
408 WINPR_API int _shutdown(SOCKET s, int how);
409
410 WINPR_ATTR_NODISCARD
411 WINPR_API SOCKET _socket(int af, int type, int protocol);
412
413 WINPR_ATTR_NODISCARD
414 WINPR_API struct hostent* _gethostbyaddr(const char* addr, int len, int type);
415
416 WINPR_ATTR_NODISCARD
417 WINPR_API struct hostent* _gethostbyname(const char* name);
418
419 WINPR_ATTR_NODISCARD
420 WINPR_API int _gethostname(char* name, int namelen);
421
422 WINPR_ATTR_NODISCARD
423 WINPR_API struct servent* /* codespell:ignore servent */
424 _getservbyport(int port, const char* proto);
425
426 WINPR_ATTR_NODISCARD
427 WINPR_API struct servent* /* codespell:ignore servent */
428 _getservbyname(const char* name, const char* proto);
429
430 WINPR_ATTR_NODISCARD
431 WINPR_API struct protoent* _getprotobynumber(int number);
432
433 WINPR_ATTR_NODISCARD
434 WINPR_API struct protoent* _getprotobyname(const char* name);
435
436 // NOLINTEND(bugprone-reserved-identifier,cert-dcl37-c,cert-dcl51-cpp)
437
438#ifdef __cplusplus
439}
440#endif
441
442#ifdef UNICODE
443#define WSASocket WSASocketW
444#else
445#define WSASocket WSASocketA
446#endif
447
448#endif /* _WIN32 */
449
450WINPR_PRAGMA_DIAG_POP
451
452#endif /* WINPR_WINSOCK_H */