| // |
| // detail/old_win_sdk_compat.hpp |
| // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ |
| // |
| // Copyright (c) 2003-2010 Christopher M. Kohlhoff (chris at kohlhoff dot com) |
| // |
| // Distributed under the Boost Software License, Version 1.0. (See accompanying |
| // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) |
| // |
| |
| #ifndef BOOST_ASIO_DETAIL_OLD_WIN_SDK_COMPAT_HPP |
| #define BOOST_ASIO_DETAIL_OLD_WIN_SDK_COMPAT_HPP |
| |
| #if defined(_MSC_VER) && (_MSC_VER >= 1200) |
| # pragma once |
| #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) |
| |
| #include <boost/asio/detail/config.hpp> |
| |
| #if defined(BOOST_WINDOWS) || defined(__CYGWIN__) |
| |
| // Guess whether we are building against on old Platform SDK. |
| #if !defined(IN6ADDR_ANY_INIT) |
| #define BOOST_ASIO_HAS_OLD_WIN_SDK 1 |
| #endif // !defined(IN6ADDR_ANY_INIT) |
| |
| #if defined(BOOST_ASIO_HAS_OLD_WIN_SDK) |
| |
| // Emulation of types that are missing from old Platform SDKs. |
| // |
| // N.B. this emulation is also used if building for a Windows 2000 target with |
| // a recent (i.e. Vista or later) SDK, as the SDK does not provide IPv6 support |
| // in that case. |
| |
| #include <boost/asio/detail/push_options.hpp> |
| |
| namespace boost { |
| namespace asio { |
| namespace detail { |
| |
| enum |
| { |
| sockaddr_storage_maxsize = 128, // Maximum size. |
| sockaddr_storage_alignsize = (sizeof(__int64)), // Desired alignment. |
| sockaddr_storage_pad1size = (sockaddr_storage_alignsize - sizeof(short)), |
| sockaddr_storage_pad2size = (sockaddr_storage_maxsize - |
| (sizeof(short) + sockaddr_storage_pad1size + sockaddr_storage_alignsize)) |
| }; |
| |
| struct sockaddr_storage_emulation |
| { |
| short ss_family; |
| char __ss_pad1[sockaddr_storage_pad1size]; |
| __int64 __ss_align; |
| char __ss_pad2[sockaddr_storage_pad2size]; |
| }; |
| |
| struct in6_addr_emulation |
| { |
| union |
| { |
| u_char Byte[16]; |
| u_short Word[8]; |
| } u; |
| }; |
| |
| #if !defined(s6_addr) |
| # define _S6_un u |
| # define _S6_u8 Byte |
| # define s6_addr _S6_un._S6_u8 |
| #endif // !defined(s6_addr) |
| |
| struct sockaddr_in6_emulation |
| { |
| short sin6_family; |
| u_short sin6_port; |
| u_long sin6_flowinfo; |
| in6_addr_emulation sin6_addr; |
| u_long sin6_scope_id; |
| }; |
| |
| struct ipv6_mreq_emulation |
| { |
| in6_addr_emulation ipv6mr_multiaddr; |
| unsigned int ipv6mr_interface; |
| }; |
| |
| #if !defined(IN6ADDR_ANY_INIT) |
| # define IN6ADDR_ANY_INIT { 0 } |
| #endif |
| |
| #if !defined(IN6ADDR_LOOPBACK_INIT) |
| # define IN6ADDR_LOOPBACK_INIT { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 } |
| #endif |
| |
| struct addrinfo_emulation |
| { |
| int ai_flags; |
| int ai_family; |
| int ai_socktype; |
| int ai_protocol; |
| size_t ai_addrlen; |
| char* ai_canonname; |
| sockaddr* ai_addr; |
| addrinfo_emulation* ai_next; |
| }; |
| |
| #if !defined(AI_PASSIVE) |
| # define AI_PASSIVE 0x1 |
| #endif |
| |
| #if !defined(AI_CANONNAME) |
| # define AI_CANONNAME 0x2 |
| #endif |
| |
| #if !defined(AI_NUMERICHOST) |
| # define AI_NUMERICHOST 0x4 |
| #endif |
| |
| #if !defined(EAI_AGAIN) |
| # define EAI_AGAIN WSATRY_AGAIN |
| #endif |
| |
| #if !defined(EAI_BADFLAGS) |
| # define EAI_BADFLAGS WSAEINVAL |
| #endif |
| |
| #if !defined(EAI_FAIL) |
| # define EAI_FAIL WSANO_RECOVERY |
| #endif |
| |
| #if !defined(EAI_FAMILY) |
| # define EAI_FAMILY WSAEAFNOSUPPORT |
| #endif |
| |
| #if !defined(EAI_MEMORY) |
| # define EAI_MEMORY WSA_NOT_ENOUGH_MEMORY |
| #endif |
| |
| #if !defined(EAI_NODATA) |
| # define EAI_NODATA WSANO_DATA |
| #endif |
| |
| #if !defined(EAI_NONAME) |
| # define EAI_NONAME WSAHOST_NOT_FOUND |
| #endif |
| |
| #if !defined(EAI_SERVICE) |
| # define EAI_SERVICE WSATYPE_NOT_FOUND |
| #endif |
| |
| #if !defined(EAI_SOCKTYPE) |
| # define EAI_SOCKTYPE WSAESOCKTNOSUPPORT |
| #endif |
| |
| #if !defined(NI_NOFQDN) |
| # define NI_NOFQDN 0x01 |
| #endif |
| |
| #if !defined(NI_NUMERICHOST) |
| # define NI_NUMERICHOST 0x02 |
| #endif |
| |
| #if !defined(NI_NAMEREQD) |
| # define NI_NAMEREQD 0x04 |
| #endif |
| |
| #if !defined(NI_NUMERICSERV) |
| # define NI_NUMERICSERV 0x08 |
| #endif |
| |
| #if !defined(NI_DGRAM) |
| # define NI_DGRAM 0x10 |
| #endif |
| |
| #if !defined(IPPROTO_IPV6) |
| # define IPPROTO_IPV6 41 |
| #endif |
| |
| #if !defined(IPV6_UNICAST_HOPS) |
| # define IPV6_UNICAST_HOPS 4 |
| #endif |
| |
| #if !defined(IPV6_MULTICAST_IF) |
| # define IPV6_MULTICAST_IF 9 |
| #endif |
| |
| #if !defined(IPV6_MULTICAST_HOPS) |
| # define IPV6_MULTICAST_HOPS 10 |
| #endif |
| |
| #if !defined(IPV6_MULTICAST_LOOP) |
| # define IPV6_MULTICAST_LOOP 11 |
| #endif |
| |
| #if !defined(IPV6_JOIN_GROUP) |
| # define IPV6_JOIN_GROUP 12 |
| #endif |
| |
| #if !defined(IPV6_LEAVE_GROUP) |
| # define IPV6_LEAVE_GROUP 13 |
| #endif |
| |
| inline int IN6_IS_ADDR_UNSPECIFIED(const in6_addr_emulation* a) |
| { |
| return ((a->s6_addr[0] == 0) |
| && (a->s6_addr[1] == 0) |
| && (a->s6_addr[2] == 0) |
| && (a->s6_addr[3] == 0) |
| && (a->s6_addr[4] == 0) |
| && (a->s6_addr[5] == 0) |
| && (a->s6_addr[6] == 0) |
| && (a->s6_addr[7] == 0) |
| && (a->s6_addr[8] == 0) |
| && (a->s6_addr[9] == 0) |
| && (a->s6_addr[10] == 0) |
| && (a->s6_addr[11] == 0) |
| && (a->s6_addr[12] == 0) |
| && (a->s6_addr[13] == 0) |
| && (a->s6_addr[14] == 0) |
| && (a->s6_addr[15] == 0)); |
| } |
| |
| inline int IN6_IS_ADDR_LOOPBACK(const in6_addr_emulation* a) |
| { |
| return ((a->s6_addr[0] == 0) |
| && (a->s6_addr[1] == 0) |
| && (a->s6_addr[2] == 0) |
| && (a->s6_addr[3] == 0) |
| && (a->s6_addr[4] == 0) |
| && (a->s6_addr[5] == 0) |
| && (a->s6_addr[6] == 0) |
| && (a->s6_addr[7] == 0) |
| && (a->s6_addr[8] == 0) |
| && (a->s6_addr[9] == 0) |
| && (a->s6_addr[10] == 0) |
| && (a->s6_addr[11] == 0) |
| && (a->s6_addr[12] == 0) |
| && (a->s6_addr[13] == 0) |
| && (a->s6_addr[14] == 0) |
| && (a->s6_addr[15] == 1)); |
| } |
| |
| inline int IN6_IS_ADDR_MULTICAST(const in6_addr_emulation* a) |
| { |
| return (a->s6_addr[0] == 0xff); |
| } |
| |
| inline int IN6_IS_ADDR_LINKLOCAL(const in6_addr_emulation* a) |
| { |
| return ((a->s6_addr[0] == 0xfe) && ((a->s6_addr[1] & 0xc0) == 0x80)); |
| } |
| |
| inline int IN6_IS_ADDR_SITELOCAL(const in6_addr_emulation* a) |
| { |
| return ((a->s6_addr[0] == 0xfe) && ((a->s6_addr[1] & 0xc0) == 0xc0)); |
| } |
| |
| inline int IN6_IS_ADDR_V4MAPPED(const in6_addr_emulation* a) |
| { |
| return ((a->s6_addr[0] == 0) |
| && (a->s6_addr[1] == 0) |
| && (a->s6_addr[2] == 0) |
| && (a->s6_addr[3] == 0) |
| && (a->s6_addr[4] == 0) |
| && (a->s6_addr[5] == 0) |
| && (a->s6_addr[6] == 0) |
| && (a->s6_addr[7] == 0) |
| && (a->s6_addr[8] == 0) |
| && (a->s6_addr[9] == 0) |
| && (a->s6_addr[10] == 0xff) |
| && (a->s6_addr[11] == 0xff)); |
| } |
| |
| inline int IN6_IS_ADDR_V4COMPAT(const in6_addr_emulation* a) |
| { |
| return ((a->s6_addr[0] == 0) |
| && (a->s6_addr[1] == 0) |
| && (a->s6_addr[2] == 0) |
| && (a->s6_addr[3] == 0) |
| && (a->s6_addr[4] == 0) |
| && (a->s6_addr[5] == 0) |
| && (a->s6_addr[6] == 0) |
| && (a->s6_addr[7] == 0) |
| && (a->s6_addr[8] == 0) |
| && (a->s6_addr[9] == 0) |
| && (a->s6_addr[10] == 0xff) |
| && (a->s6_addr[11] == 0xff) |
| && !((a->s6_addr[12] == 0) |
| && (a->s6_addr[13] == 0) |
| && (a->s6_addr[14] == 0) |
| && ((a->s6_addr[15] == 0) || (a->s6_addr[15] == 1)))); |
| } |
| |
| inline int IN6_IS_ADDR_MC_NODELOCAL(const in6_addr_emulation* a) |
| { |
| return IN6_IS_ADDR_MULTICAST(a) && ((a->s6_addr[1] & 0xf) == 1); |
| } |
| |
| inline int IN6_IS_ADDR_MC_LINKLOCAL(const in6_addr_emulation* a) |
| { |
| return IN6_IS_ADDR_MULTICAST(a) && ((a->s6_addr[1] & 0xf) == 2); |
| } |
| |
| inline int IN6_IS_ADDR_MC_SITELOCAL(const in6_addr_emulation* a) |
| { |
| return IN6_IS_ADDR_MULTICAST(a) && ((a->s6_addr[1] & 0xf) == 5); |
| } |
| |
| inline int IN6_IS_ADDR_MC_ORGLOCAL(const in6_addr_emulation* a) |
| { |
| return IN6_IS_ADDR_MULTICAST(a) && ((a->s6_addr[1] & 0xf) == 8); |
| } |
| |
| inline int IN6_IS_ADDR_MC_GLOBAL(const in6_addr_emulation* a) |
| { |
| return IN6_IS_ADDR_MULTICAST(a) && ((a->s6_addr[1] & 0xf) == 0xe); |
| } |
| |
| } // namespace detail |
| } // namespace asio |
| } // namespace boost |
| |
| #include <boost/asio/detail/pop_options.hpp> |
| |
| #endif // defined(BOOST_ASIO_HAS_OLD_WIN_SDK) |
| |
| // Even newer Platform SDKs that support IPv6 may not define IPV6_V6ONLY. |
| #if !defined(IPV6_V6ONLY) |
| # define IPV6_V6ONLY 27 |
| #endif |
| |
| // Some SDKs (e.g. Windows CE) don't define IPPROTO_ICMPV6. |
| #if !defined(IPPROTO_ICMPV6) |
| # define IPPROTO_ICMPV6 58 |
| #endif |
| |
| #endif // defined(BOOST_WINDOWS) || defined(__CYGWIN__) |
| |
| #endif // BOOST_ASIO_DETAIL_OLD_WIN_SDK_COMPAT_HPP |