old_win_sdk_compat.hpp 4.3 KB

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