00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #ifndef ASIO_DETAIL_OLD_WIN_SDK_COMPAT_HPP
00012 #define ASIO_DETAIL_OLD_WIN_SDK_COMPAT_HPP
00013
00014 #if defined(_MSC_VER) && (_MSC_VER >= 1200)
00015 # pragma once
00016 #endif // defined(_MSC_VER) && (_MSC_VER >= 1200)
00017
00018 #include "asio/detail/push_options.hpp"
00019
00020 #include "asio/detail/push_options.hpp"
00021 #include <boost/config.hpp>
00022 #include "asio/detail/pop_options.hpp"
00023
00024 #if defined(BOOST_WINDOWS) || defined(__CYGWIN__)
00025
00026
00027 #if !defined(IN6ADDR_ANY_INIT)
00028 #define ASIO_HAS_OLD_WIN_SDK 1
00029 #endif // !defined(IN6ADDR_ANY_INIT)
00030
00031 #if defined(ASIO_HAS_OLD_WIN_SDK)
00032
00033
00034
00035 namespace asio {
00036 namespace detail {
00037
00038 enum
00039 {
00040 sockaddr_storage_maxsize = 128,
00041 sockaddr_storage_alignsize = (sizeof(__int64)),
00042 sockaddr_storage_pad1size = (sockaddr_storage_alignsize - sizeof(short)),
00043 sockaddr_storage_pad2size = (sockaddr_storage_maxsize -
00044 (sizeof(short) + sockaddr_storage_pad1size + sockaddr_storage_alignsize))
00045 };
00046
00047 struct sockaddr_storage_emulation
00048 {
00049 short ss_family;
00050 char __ss_pad1[sockaddr_storage_pad1size];
00051 __int64 __ss_align;
00052 char __ss_pad2[sockaddr_storage_pad2size];
00053 };
00054
00055 struct in6_addr_emulation
00056 {
00057 u_char s6_addr[16];
00058 };
00059
00060 struct sockaddr_in6_emulation
00061 {
00062 short sin6_family;
00063 u_short sin6_port;
00064 u_long sin6_flowinfo;
00065 in6_addr_emulation sin6_addr;
00066 u_long sin6_scope_id;
00067 };
00068
00069 struct ipv6_mreq_emulation
00070 {
00071 in6_addr_emulation ipv6mr_multiaddr;
00072 unsigned int ipv6mr_interface;
00073 };
00074
00075 #if !defined(IN6ADDR_ANY_INIT)
00076 # define IN6ADDR_ANY_INIT { 0 }
00077 #endif
00078
00079 #if !defined(IN6ADDR_LOOPBACK_INIT)
00080 # define IN6ADDR_LOOPBACK_INIT { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 }
00081 #endif
00082
00083 struct addrinfo_emulation
00084 {
00085 int ai_flags;
00086 int ai_family;
00087 int ai_socktype;
00088 int ai_protocol;
00089 size_t ai_addrlen;
00090 char* ai_canonname;
00091 sockaddr* ai_addr;
00092 addrinfo_emulation* ai_next;
00093 };
00094
00095 #if !defined(AI_PASSIVE)
00096 # define AI_PASSIVE 0x1
00097 #endif
00098
00099 #if !defined(AI_CANONNAME)
00100 # define AI_CANONNAME 0x2
00101 #endif
00102
00103 #if !defined(AI_NUMERICHOST)
00104 # define AI_NUMERICHOST 0x4
00105 #endif
00106
00107 #if !defined(EAI_AGAIN)
00108 # define EAI_AGAIN WSATRY_AGAIN
00109 #endif
00110
00111 #if !defined(EAI_BADFLAGS)
00112 # define EAI_BADFLAGS WSAEINVAL
00113 #endif
00114
00115 #if !defined(EAI_FAIL)
00116 # define EAI_FAIL WSANO_RECOVERY
00117 #endif
00118
00119 #if !defined(EAI_FAMILY)
00120 # define EAI_FAMILY WSAEAFNOSUPPORT
00121 #endif
00122
00123 #if !defined(EAI_MEMORY)
00124 # define EAI_MEMORY WSA_NOT_ENOUGH_MEMORY
00125 #endif
00126
00127 #if !defined(EAI_NODATA)
00128 # define EAI_NODATA WSANO_DATA
00129 #endif
00130
00131 #if !defined(EAI_NONAME)
00132 # define EAI_NONAME WSAHOST_NOT_FOUND
00133 #endif
00134
00135 #if !defined(EAI_SERVICE)
00136 # define EAI_SERVICE WSATYPE_NOT_FOUND
00137 #endif
00138
00139 #if !defined(EAI_SOCKTYPE)
00140 # define EAI_SOCKTYPE WSAESOCKTNOSUPPORT
00141 #endif
00142
00143 #if !defined(NI_NOFQDN)
00144 # define NI_NOFQDN 0x01
00145 #endif
00146
00147 #if !defined(NI_NUMERICHOST)
00148 # define NI_NUMERICHOST 0x02
00149 #endif
00150
00151 #if !defined(NI_NAMEREQD)
00152 # define NI_NAMEREQD 0x04
00153 #endif
00154
00155 #if !defined(NI_NUMERICSERV)
00156 # define NI_NUMERICSERV 0x08
00157 #endif
00158
00159 #if !defined(NI_DGRAM)
00160 # define NI_DGRAM 0x10
00161 #endif
00162
00163 #if !defined(IPPROTO_IPV6)
00164 # define IPPROTO_IPV6 41
00165 #endif
00166
00167 #if !defined(IPV6_MULTICAST_IF)
00168 # define IPV6_MULTICAST_IF 9
00169 #endif
00170
00171 #if !defined(IPV6_MULTICAST_HOPS)
00172 # define IPV6_MULTICAST_HOPS 10
00173 #endif
00174
00175 #if !defined(IPV6_MULTICAST_LOOP)
00176 # define IPV6_MULTICAST_LOOP 11
00177 #endif
00178
00179 #if !defined(IPV6_JOIN_GROUP)
00180 # define IPV6_JOIN_GROUP 12
00181 #endif
00182
00183 #if !defined(IPV6_LEAVE_GROUP)
00184 # define IPV6_LEAVE_GROUP 13
00185 #endif
00186
00187 inline int IN6_IS_ADDR_UNSPECIFIED(const in6_addr_emulation* a)
00188 {
00189 return ((a->s6_addr[0] == 0)
00190 && (a->s6_addr[1] == 0)
00191 && (a->s6_addr[2] == 0)
00192 && (a->s6_addr[3] == 0)
00193 && (a->s6_addr[4] == 0)
00194 && (a->s6_addr[5] == 0)
00195 && (a->s6_addr[6] == 0)
00196 && (a->s6_addr[7] == 0)
00197 && (a->s6_addr[8] == 0)
00198 && (a->s6_addr[9] == 0)
00199 && (a->s6_addr[10] == 0)
00200 && (a->s6_addr[11] == 0)
00201 && (a->s6_addr[12] == 0)
00202 && (a->s6_addr[13] == 0)
00203 && (a->s6_addr[14] == 0)
00204 && (a->s6_addr[15] == 0));
00205 }
00206
00207 inline int IN6_IS_ADDR_LOOPBACK(const in6_addr_emulation* a)
00208 {
00209 return ((a->s6_addr[0] == 0)
00210 && (a->s6_addr[1] == 0)
00211 && (a->s6_addr[2] == 0)
00212 && (a->s6_addr[3] == 0)
00213 && (a->s6_addr[4] == 0)
00214 && (a->s6_addr[5] == 0)
00215 && (a->s6_addr[6] == 0)
00216 && (a->s6_addr[7] == 0)
00217 && (a->s6_addr[8] == 0)
00218 && (a->s6_addr[9] == 0)
00219 && (a->s6_addr[10] == 0)
00220 && (a->s6_addr[11] == 0)
00221 && (a->s6_addr[12] == 0)
00222 && (a->s6_addr[13] == 0)
00223 && (a->s6_addr[14] == 0)
00224 && (a->s6_addr[15] == 1));
00225 }
00226
00227 inline int IN6_IS_ADDR_MULTICAST(const in6_addr_emulation* a)
00228 {
00229 return (a->s6_addr[0] == 0xff);
00230 }
00231
00232 inline int IN6_IS_ADDR_LINKLOCAL(const in6_addr_emulation* a)
00233 {
00234 return ((a->s6_addr[0] == 0xfe) && ((a->s6_addr[1] & 0xc0) == 0x80));
00235 }
00236
00237 inline int IN6_IS_ADDR_SITELOCAL(const in6_addr_emulation* a)
00238 {
00239 return ((a->s6_addr[0] == 0xfe) && ((a->s6_addr[1] & 0xc0) == 0xc0));
00240 }
00241
00242 inline int IN6_IS_ADDR_V4MAPPED(const in6_addr_emulation* a)
00243 {
00244 return ((a->s6_addr[0] == 0)
00245 && (a->s6_addr[1] == 0)
00246 && (a->s6_addr[2] == 0)
00247 && (a->s6_addr[3] == 0)
00248 && (a->s6_addr[4] == 0)
00249 && (a->s6_addr[5] == 0)
00250 && (a->s6_addr[6] == 0)
00251 && (a->s6_addr[7] == 0)
00252 && (a->s6_addr[8] == 0)
00253 && (a->s6_addr[9] == 0)
00254 && (a->s6_addr[10] == 0xff)
00255 && (a->s6_addr[11] == 0xff));
00256 }
00257
00258 inline int IN6_IS_ADDR_V4COMPAT(const in6_addr_emulation* a)
00259 {
00260 return ((a->s6_addr[0] == 0)
00261 && (a->s6_addr[1] == 0)
00262 && (a->s6_addr[2] == 0)
00263 && (a->s6_addr[3] == 0)
00264 && (a->s6_addr[4] == 0)
00265 && (a->s6_addr[5] == 0)
00266 && (a->s6_addr[6] == 0)
00267 && (a->s6_addr[7] == 0)
00268 && (a->s6_addr[8] == 0)
00269 && (a->s6_addr[9] == 0)
00270 && (a->s6_addr[10] == 0xff)
00271 && (a->s6_addr[11] == 0xff)
00272 && !((a->s6_addr[12] == 0)
00273 && (a->s6_addr[13] == 0)
00274 && (a->s6_addr[14] == 0)
00275 && ((a->s6_addr[15] == 0) || (a->s6_addr[15] == 1))));
00276 }
00277
00278 inline int IN6_IS_ADDR_MC_NODELOCAL(const in6_addr_emulation* a)
00279 {
00280 return IN6_IS_ADDR_MULTICAST(a) && ((a->s6_addr[1] & 0xf) == 1);
00281 }
00282
00283 inline int IN6_IS_ADDR_MC_LINKLOCAL(const in6_addr_emulation* a)
00284 {
00285 return IN6_IS_ADDR_MULTICAST(a) && ((a->s6_addr[1] & 0xf) == 2);
00286 }
00287
00288 inline int IN6_IS_ADDR_MC_SITELOCAL(const in6_addr_emulation* a)
00289 {
00290 return IN6_IS_ADDR_MULTICAST(a) && ((a->s6_addr[1] & 0xf) == 5);
00291 }
00292
00293 inline int IN6_IS_ADDR_MC_ORGLOCAL(const in6_addr_emulation* a)
00294 {
00295 return IN6_IS_ADDR_MULTICAST(a) && ((a->s6_addr[1] & 0xf) == 8);
00296 }
00297
00298 inline int IN6_IS_ADDR_MC_GLOBAL(const in6_addr_emulation* a)
00299 {
00300 return IN6_IS_ADDR_MULTICAST(a) && ((a->s6_addr[1] & 0xf) == 0xe);
00301 }
00302
00303 }
00304 }
00305
00306 #endif // defined(ASIO_HAS_OLD_WIN_SDK)
00307
00308
00309 #if !defined(IPV6_V6ONLY)
00310 # define IPV6_V6ONLY 27
00311 #endif
00312
00313 #endif // defined(BOOST_WINDOWS) || defined(__CYGWIN__)
00314
00315 #include "asio/detail/pop_options.hpp"
00316
00317 #endif // ASIO_DETAIL_OLD_WIN_SDK_COMPAT_HPP