VirtualBox

source: vbox/trunk/src/VBox/NetworkServices/NAT/winutils.h@ 99196

Last change on this file since 99196 was 98103, checked in by vboxsync, 23 months ago

Copyright year updates by scm.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id Revision
File size: 6.3 KB
Line 
1/* $Id: winutils.h 98103 2023-01-17 14:15:46Z vboxsync $ */
2/** @file
3 * NAT Network - winsock compatibility shim.
4 */
5
6/*
7 * Copyright (C) 2013-2023 Oracle and/or its affiliates.
8 *
9 * This file is part of VirtualBox base platform packages, as
10 * available from https://www.virtualbox.org.
11 *
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation, in version 3 of the
15 * License.
16 *
17 * This program is distributed in the hope that it will be useful, but
18 * WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
20 * General Public License for more details.
21 *
22 * You should have received a copy of the GNU General Public License
23 * along with this program; if not, see <https://www.gnu.org/licenses>.
24 *
25 * SPDX-License-Identifier: GPL-3.0-only
26 */
27
28#ifndef VBOX_INCLUDED_SRC_NAT_winutils_h
29#define VBOX_INCLUDED_SRC_NAT_winutils_h
30#ifndef RT_WITHOUT_PRAGMA_ONCE
31# pragma once
32#endif
33
34# include <iprt/cdefs.h>
35
36# ifdef RT_OS_WINDOWS
37# include <iprt/win/winsock2.h>
38# include <iprt/win/ws2tcpip.h>
39# include <mswsock.h>
40# include <iprt/win/windows.h>
41# include <iprt/err.h>
42# include <iprt/net.h>
43# include <iprt/log.h>
44/**
45 * Inclusion of lwip/def.h was added here to avoid conflict of definitions
46 * of hton-family functions in LWIP and windock's headers.
47 */
48# include <lwip/def.h>
49
50# ifndef PF_LOCAL
51# define PF_LOCAL AF_INET
52# endif
53
54# ifdef DEBUG
55# define err(code,...) do { \
56 AssertMsgFailed((__VA_ARGS__)); \
57 }while(0)
58#else
59# define err(code,...) do { \
60 DPRINTF0((__VA_ARGS__)); \
61 ExitProcess(code); \
62 }while(0)
63#endif
64# define errx err
65# define __func__ __FUNCTION__
66# define __attribute__(x) /* IGNORE */
67
68# define SOCKERRNO() (WSAGetLastError())
69# define SET_SOCKERRNO(error) do { WSASetLastError(error); } while (0)
70
71/**
72 * "Windows Sockets Error Codes" obtained with WSAGetLastError().
73 * http://msdn.microsoft.com/en-us/library/windows/desktop/ms740668(v=vs.85).aspx
74 *
75 * This block of error codes from <winsock2.h> conflicts with "POSIX
76 * supplement" error codes from <errno.h>, but we don't expect to ever
77 * encounter the latter in the proxy code, so redefine them to their
78 * unixy names.
79 */
80# undef EWOULDBLOCK
81# define EWOULDBLOCK WSAEWOULDBLOCK
82# undef EINPROGRESS
83# define EINPROGRESS WSAEINPROGRESS
84# undef EALREADY
85# define EALREADY WSAEALREADY
86# undef ENOTSOCK
87# define ENOTSOCK WSAENOTSOCK
88# undef EDESTADDRREQ
89# define EDESTADDRREQ WSAEDESTADDRREQ
90# undef EMSGSIZE
91# define EMSGSIZE WSAEMSGSIZE
92# undef EPROTOTYPE
93# define EPROTOTYPE WSAEPROTOTYPE
94# undef ENOPROTOOPT
95# define ENOPROTOOPT WSAENOPROTOOPT
96# undef EPROTONOSUPPORT
97# define EPROTONOSUPPORT WSAEPROTONOSUPPORT
98# undef ESOCKTNOSUPPORT
99# define ESOCKTNOSUPPORT WSAESOCKTNOSUPPORT
100# undef EOPNOTSUPP
101# define EOPNOTSUPP WSAEOPNOTSUPP
102# undef EPFNOSUPPORT
103# define EPFNOSUPPORT WSAEPFNOSUPPORT
104# undef EAFNOSUPPORT
105# define EAFNOSUPPORT WSAEAFNOSUPPORT
106# undef EADDRINUSE
107# define EADDRINUSE WSAEADDRINUSE
108# undef EADDRNOTAVAIL
109# define EADDRNOTAVAIL WSAEADDRNOTAVAIL
110# undef ENETDOWN
111# define ENETDOWN WSAENETDOWN
112# undef ENETUNREACH
113# define ENETUNREACH WSAENETUNREACH
114# undef ENETRESET
115# define ENETRESET WSAENETRESET
116# undef ECONNABORTED
117# define ECONNABORTED WSAECONNABORTED
118# undef ECONNRESET
119# define ECONNRESET WSAECONNRESET
120# undef ENOBUFS
121# define ENOBUFS WSAENOBUFS
122# undef EISCONN
123# define EISCONN WSAEISCONN
124# undef ENOTCONN
125# define ENOTCONN WSAENOTCONN
126# undef ESHUTDOWN
127# define ESHUTDOWN WSAESHUTDOWN
128# undef ETOOMANYREFS
129# define ETOOMANYREFS WSAETOOMANYREFS
130# undef ETIMEDOUT
131# define ETIMEDOUT WSAETIMEDOUT
132# undef ECONNREFUSED
133# define ECONNREFUSED WSAECONNREFUSED
134# undef ELOOP
135# define ELOOP WSAELOOP
136# undef ENAMETOOLONG
137# define ENAMETOOLONG WSAENAMETOOLONG
138# undef EHOSTDOWN
139# define EHOSTDOWN WSAEHOSTDOWN
140# undef EHOSTUNREACH
141# define EHOSTUNREACH WSAEHOSTUNREACH
142
143/**
144 * parameters to shutdown (2) with Winsock2
145 * http://msdn.microsoft.com/en-us/library/windows/desktop/ms740481(v=vs.85).aspx
146 */
147# define SHUT_RD SD_RECEIVE
148# define SHUT_WR SD_SEND
149# define SHUT_RDWR SD_BOTH
150
151typedef ULONG nfds_t;
152
153typedef WSABUF IOVEC;
154
155# define IOVEC_GET_BASE(iov) ((iov).buf)
156# define IOVEC_SET_BASE(iov, b) ((iov).buf = (b))
157
158# define IOVEC_GET_LEN(iov) ((iov).len)
159# define IOVEC_SET_LEN(iov, l) ((iov).len = (ULONG)(l))
160
161#if _WIN32_WINNT < 0x0600
162/* otherwise defined the other way around in ws2def.h */
163#define cmsghdr _WSACMSGHDR
164
165#undef CMSG_DATA /* wincrypt.h can byte my shiny metal #undef */
166#define CMSG_DATA WSA_CMSG_DATA
167#define CMSG_LEN WSA_CMSG_LEN
168#define CMSG_SPACE WSA_CMSG_SPACE
169
170#define CMSG_FIRSTHDR WSA_CMSG_FIRSTHDR
171#define CMSG_NXTHDR WSA_CMSG_NXTHDR
172#endif /* _WIN32_WINNT < 0x0600 - provide unglified CMSG names */
173
174RT_C_DECLS_BEGIN
175int RTWinSocketPair(int domain, int type, int protocol, SOCKET socket_vector[2]);
176RT_C_DECLS_END
177
178# else /* !RT_OS_WINDOWS */
179
180# include <errno.h>
181# include <unistd.h>
182
183# define SOCKET int
184# define INVALID_SOCKET (-1)
185# define SOCKET_ERROR (-1)
186
187# define SOCKERRNO() (errno)
188# define SET_SOCKERRNO(error) do { errno = (error); } while (0)
189
190# define closesocket(s) close(s)
191# define ioctlsocket(s, req, arg) ioctl((s), (req), (arg))
192
193typedef struct iovec IOVEC;
194
195# define IOVEC_GET_BASE(iov) ((iov).iov_base)
196# define IOVEC_SET_BASE(iov, b) ((iov).iov_base = (b))
197
198# define IOVEC_GET_LEN(iov) ((iov).iov_len)
199# define IOVEC_SET_LEN(iov, l) ((iov).iov_len = (l))
200# endif
201
202DECLINLINE(int)
203proxy_error_is_transient(int error)
204{
205# if !defined(RT_OS_WINDOWS)
206 return error == EWOULDBLOCK
207# if EAGAIN != EWOULDBLOCK
208 || error == EAGAIN
209# endif
210 || error == EINTR
211 || error == ENOBUFS
212 || error == ENOMEM;
213# else
214 return error == WSAEWOULDBLOCK
215 || error == WSAEINTR /* NB: we don't redefine EINTR above */
216 || error == WSAENOBUFS;
217# endif
218}
219
220#endif /* !VBOX_INCLUDED_SRC_NAT_winutils_h */
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette