// | |
// detail/old_win_sdk_compat.hpp | |
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | |
// | |
// Copyright (c) 2003-2011 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 |