old_win_sdk_compat.hpp 4.4 KB

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