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