]>
Commit | Line | Data |
---|---|---|
7c673cae FG |
1 | // |
2 | // detail/old_win_sdk_compat.hpp | |
3 | // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | |
4 | // | |
1e59de90 | 5 | // Copyright (c) 2003-2022 Christopher M. Kohlhoff (chris at kohlhoff dot com) |
7c673cae FG |
6 | // |
7 | // Distributed under the Boost Software License, Version 1.0. (See accompanying | |
8 | // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) | |
9 | // | |
10 | ||
11 | #ifndef BOOST_ASIO_DETAIL_OLD_WIN_SDK_COMPAT_HPP | |
12 | #define BOOST_ASIO_DETAIL_OLD_WIN_SDK_COMPAT_HPP | |
13 | ||
14 | #if defined(_MSC_VER) && (_MSC_VER >= 1200) | |
15 | # pragma once | |
16 | #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) | |
17 | ||
18 | #include <boost/asio/detail/config.hpp> | |
19 | ||
20 | #if defined(BOOST_ASIO_WINDOWS) || defined(__CYGWIN__) | |
21 | ||
22 | // Guess whether we are building against on old Platform SDK. | |
23 | #if !defined(IN6ADDR_ANY_INIT) | |
24 | #define BOOST_ASIO_HAS_OLD_WIN_SDK 1 | |
25 | #endif // !defined(IN6ADDR_ANY_INIT) | |
26 | ||
27 | #if defined(BOOST_ASIO_HAS_OLD_WIN_SDK) | |
28 | ||
29 | // Emulation of types that are missing from old Platform SDKs. | |
30 | // | |
31 | // N.B. this emulation is also used if building for a Windows 2000 target with | |
32 | // a recent (i.e. Vista or later) SDK, as the SDK does not provide IPv6 support | |
33 | // in that case. | |
34 | ||
35 | #include <boost/asio/detail/push_options.hpp> | |
36 | ||
37 | namespace boost { | |
38 | namespace asio { | |
39 | namespace detail { | |
40 | ||
41 | enum | |
42 | { | |
43 | sockaddr_storage_maxsize = 128, // Maximum size. | |
44 | sockaddr_storage_alignsize = (sizeof(__int64)), // Desired alignment. | |
45 | sockaddr_storage_pad1size = (sockaddr_storage_alignsize - sizeof(short)), | |
46 | sockaddr_storage_pad2size = (sockaddr_storage_maxsize - | |
47 | (sizeof(short) + sockaddr_storage_pad1size + sockaddr_storage_alignsize)) | |
48 | }; | |
49 | ||
50 | struct sockaddr_storage_emulation | |
51 | { | |
52 | short ss_family; | |
53 | char __ss_pad1[sockaddr_storage_pad1size]; | |
54 | __int64 __ss_align; | |
55 | char __ss_pad2[sockaddr_storage_pad2size]; | |
56 | }; | |
57 | ||
58 | struct in6_addr_emulation | |
59 | { | |
60 | union | |
61 | { | |
62 | u_char Byte[16]; | |
63 | u_short Word[8]; | |
64 | } u; | |
65 | }; | |
66 | ||
67 | #if !defined(s6_addr) | |
68 | # define _S6_un u | |
69 | # define _S6_u8 Byte | |
70 | # define s6_addr _S6_un._S6_u8 | |
71 | #endif // !defined(s6_addr) | |
72 | ||
73 | struct sockaddr_in6_emulation | |
74 | { | |
75 | short sin6_family; | |
76 | u_short sin6_port; | |
77 | u_long sin6_flowinfo; | |
78 | in6_addr_emulation sin6_addr; | |
79 | u_long sin6_scope_id; | |
80 | }; | |
81 | ||
82 | struct ipv6_mreq_emulation | |
83 | { | |
84 | in6_addr_emulation ipv6mr_multiaddr; | |
85 | unsigned int ipv6mr_interface; | |
86 | }; | |
87 | ||
88 | struct addrinfo_emulation | |
89 | { | |
90 | int ai_flags; | |
91 | int ai_family; | |
92 | int ai_socktype; | |
93 | int ai_protocol; | |
94 | size_t ai_addrlen; | |
95 | char* ai_canonname; | |
96 | sockaddr* ai_addr; | |
97 | addrinfo_emulation* ai_next; | |
98 | }; | |
99 | ||
100 | #if !defined(AI_PASSIVE) | |
101 | # define AI_PASSIVE 0x1 | |
102 | #endif | |
103 | ||
104 | #if !defined(AI_CANONNAME) | |
105 | # define AI_CANONNAME 0x2 | |
106 | #endif | |
107 | ||
108 | #if !defined(AI_NUMERICHOST) | |
109 | # define AI_NUMERICHOST 0x4 | |
110 | #endif | |
111 | ||
112 | #if !defined(EAI_AGAIN) | |
113 | # define EAI_AGAIN WSATRY_AGAIN | |
114 | #endif | |
115 | ||
116 | #if !defined(EAI_BADFLAGS) | |
117 | # define EAI_BADFLAGS WSAEINVAL | |
118 | #endif | |
119 | ||
120 | #if !defined(EAI_FAIL) | |
121 | # define EAI_FAIL WSANO_RECOVERY | |
122 | #endif | |
123 | ||
124 | #if !defined(EAI_FAMILY) | |
125 | # define EAI_FAMILY WSAEAFNOSUPPORT | |
126 | #endif | |
127 | ||
128 | #if !defined(EAI_MEMORY) | |
129 | # define EAI_MEMORY WSA_NOT_ENOUGH_MEMORY | |
130 | #endif | |
131 | ||
132 | #if !defined(EAI_NODATA) | |
133 | # define EAI_NODATA WSANO_DATA | |
134 | #endif | |
135 | ||
136 | #if !defined(EAI_NONAME) | |
137 | # define EAI_NONAME WSAHOST_NOT_FOUND | |
138 | #endif | |
139 | ||
140 | #if !defined(EAI_SERVICE) | |
141 | # define EAI_SERVICE WSATYPE_NOT_FOUND | |
142 | #endif | |
143 | ||
144 | #if !defined(EAI_SOCKTYPE) | |
145 | # define EAI_SOCKTYPE WSAESOCKTNOSUPPORT | |
146 | #endif | |
147 | ||
148 | #if !defined(NI_NOFQDN) | |
149 | # define NI_NOFQDN 0x01 | |
150 | #endif | |
151 | ||
152 | #if !defined(NI_NUMERICHOST) | |
153 | # define NI_NUMERICHOST 0x02 | |
154 | #endif | |
155 | ||
156 | #if !defined(NI_NAMEREQD) | |
157 | # define NI_NAMEREQD 0x04 | |
158 | #endif | |
159 | ||
160 | #if !defined(NI_NUMERICSERV) | |
161 | # define NI_NUMERICSERV 0x08 | |
162 | #endif | |
163 | ||
164 | #if !defined(NI_DGRAM) | |
165 | # define NI_DGRAM 0x10 | |
166 | #endif | |
167 | ||
168 | #if !defined(IPPROTO_IPV6) | |
169 | # define IPPROTO_IPV6 41 | |
170 | #endif | |
171 | ||
172 | #if !defined(IPV6_UNICAST_HOPS) | |
173 | # define IPV6_UNICAST_HOPS 4 | |
174 | #endif | |
175 | ||
176 | #if !defined(IPV6_MULTICAST_IF) | |
177 | # define IPV6_MULTICAST_IF 9 | |
178 | #endif | |
179 | ||
180 | #if !defined(IPV6_MULTICAST_HOPS) | |
181 | # define IPV6_MULTICAST_HOPS 10 | |
182 | #endif | |
183 | ||
184 | #if !defined(IPV6_MULTICAST_LOOP) | |
185 | # define IPV6_MULTICAST_LOOP 11 | |
186 | #endif | |
187 | ||
188 | #if !defined(IPV6_JOIN_GROUP) | |
189 | # define IPV6_JOIN_GROUP 12 | |
190 | #endif | |
191 | ||
192 | #if !defined(IPV6_LEAVE_GROUP) | |
193 | # define IPV6_LEAVE_GROUP 13 | |
194 | #endif | |
195 | ||
196 | } // namespace detail | |
197 | } // namespace asio | |
198 | } // namespace boost | |
199 | ||
200 | #include <boost/asio/detail/pop_options.hpp> | |
201 | ||
202 | #endif // defined(BOOST_ASIO_HAS_OLD_WIN_SDK) | |
203 | ||
204 | // Even newer Platform SDKs that support IPv6 may not define IPV6_V6ONLY. | |
205 | #if !defined(IPV6_V6ONLY) | |
206 | # define IPV6_V6ONLY 27 | |
207 | #endif | |
208 | ||
209 | // Some SDKs (e.g. Windows CE) don't define IPPROTO_ICMPV6. | |
210 | #if !defined(IPPROTO_ICMPV6) | |
211 | # define IPPROTO_ICMPV6 58 | |
212 | #endif | |
213 | ||
214 | #endif // defined(BOOST_ASIO_WINDOWS) || defined(__CYGWIN__) | |
215 | ||
216 | #endif // BOOST_ASIO_DETAIL_OLD_WIN_SDK_COMPAT_HPP |