/dep/acelite/ace/Multihomed_INET_Addr.cpp

https://github.com/origins/SkyFireEMU_420 · C++ · 287 lines · 219 code · 46 blank · 22 comment · 25 complexity · 58101fed2f8dafb4f7195e43bf177ef0 MD5 · raw file

  1. // $Id: Multihomed_INET_Addr.cpp 91368 2010-08-16 13:03:34Z mhengstmengel $
  2. // Extends ACE_INET_Addr with support for multi-homed addresses.
  3. #include "ace/Multihomed_INET_Addr.h"
  4. #include "ace/Log_Msg.h"
  5. #if !defined (__ACE_INLINE__)
  6. # include "ace/Multihomed_INET_Addr.inl"
  7. #endif /* __ACE_INLINE__ */
  8. ACE_BEGIN_VERSIONED_NAMESPACE_DECL
  9. ACE_ALLOC_HOOK_DEFINE(ACE_Multihomed_INET_Addr)
  10. // Default constructor
  11. ACE_Multihomed_INET_Addr::ACE_Multihomed_INET_Addr (void)
  12. : secondaries_ (0)
  13. {
  14. ACE_TRACE ("ACE_Multihomed_INET_Addr::ACE_Multihomed_INET_Addr");
  15. }
  16. ACE_Multihomed_INET_Addr::ACE_Multihomed_INET_Addr (const char address[])
  17. : ACE_INET_Addr (address),
  18. secondaries_ (0)
  19. {
  20. }
  21. ACE_Multihomed_INET_Addr::ACE_Multihomed_INET_Addr(u_short port_number,
  22. const char host_name[],
  23. int encode,
  24. int address_family,
  25. const char *(secondary_host_names[]),
  26. size_t size){
  27. // Initialize the primary INET addr
  28. ACE_INET_Addr::set(port_number, host_name, encode, address_family);
  29. // check for secondary INET addrs
  30. if (secondary_host_names && size){
  31. // we have a non-zero pointer and size
  32. this->secondaries_.size(size); // size the array
  33. size_t next_empty_slot = 0;
  34. for (size_t i = 0; i < size; ++i) {
  35. int ret = this->secondaries_[next_empty_slot].set(port_number,
  36. secondary_host_names[i],
  37. encode,
  38. address_family);
  39. if (ret) {
  40. ACE_DEBUG ((LM_DEBUG,
  41. ACE_TEXT ("Invalid INET addr (%C:%u) will be ignored\n"),
  42. secondary_host_names[i], port_number));
  43. this->secondaries_.size(this->secondaries_.size() - 1);
  44. }
  45. else
  46. ++next_empty_slot;
  47. }
  48. }
  49. return;
  50. }
  51. #if defined (ACE_HAS_WCHAR)
  52. ACE_Multihomed_INET_Addr::ACE_Multihomed_INET_Addr(u_short port_number,
  53. const wchar_t host_name[],
  54. int encode,
  55. int address_family,
  56. const wchar_t *(secondary_host_names[]),
  57. size_t size){
  58. // Initialize the primary INET addr
  59. ACE_INET_Addr::set(port_number, host_name, encode, address_family);
  60. // check for secondary INET addrs
  61. if (secondary_host_names && size){
  62. // we have a non-zero pointer and size
  63. this->secondaries_.size(size); // size the array
  64. size_t next_empty_slot = 0;
  65. for (size_t i = 0; i < size; ++i) {
  66. int ret = this->secondaries_[next_empty_slot].set(port_number,
  67. secondary_host_names[i],
  68. encode,
  69. address_family);
  70. if (ret) {
  71. ACE_DEBUG ((LM_DEBUG,
  72. ACE_TEXT ("Invalid INET addr (%s:%u) will be ignored\n"),
  73. ACE_TEXT_WCHAR_TO_TCHAR (secondary_host_names[i]), port_number));
  74. this->secondaries_.size(this->secondaries_.size() - 1);
  75. }
  76. else
  77. ++next_empty_slot;
  78. }
  79. }
  80. return;
  81. }
  82. #endif /* ACE_HAS_WCHAR */
  83. ACE_Multihomed_INET_Addr::ACE_Multihomed_INET_Addr(u_short port_number,
  84. ACE_UINT32 primary_ip_addr,
  85. int encode,
  86. const ACE_UINT32 *secondary_ip_addrs,
  87. size_t size){
  88. // Initialize the primary INET addr
  89. ACE_INET_Addr::set(port_number, primary_ip_addr, encode);
  90. // check for secondary INET addrs
  91. if (secondary_ip_addrs && size){
  92. // we have a non-zero pointer and size
  93. this->secondaries_.size(size); // size the array
  94. size_t next_empty_slot = 0;
  95. for (size_t i = 0; i < size; ++i) {
  96. int const ret = this->secondaries_[next_empty_slot].set(port_number,
  97. secondary_ip_addrs[i],
  98. encode);
  99. if (ret) {
  100. ACE_DEBUG ((LM_DEBUG,
  101. "Invalid INET addr (%u:%u) will be ignored\n",
  102. secondary_ip_addrs[i], port_number));
  103. this->secondaries_.size(this->secondaries_.size() - 1);
  104. }
  105. else
  106. ++next_empty_slot;
  107. }
  108. }
  109. return;
  110. }
  111. // Set implementations (NEED BETTER COMMENT HERE)
  112. int
  113. ACE_Multihomed_INET_Addr::set (u_short port_number,
  114. const char host_name[],
  115. int encode,
  116. int address_family,
  117. const char *(secondary_host_names[]),
  118. size_t size)
  119. {
  120. this->secondaries_.size(size);
  121. for (size_t i = 0; i < size; ++i) {
  122. int const ret = this->secondaries_[i].set(port_number,
  123. secondary_host_names[i],
  124. encode,
  125. address_family);
  126. if (ret) {
  127. return ret;
  128. }
  129. }
  130. return ACE_INET_Addr::set(port_number, host_name, encode, address_family);
  131. }
  132. #if defined (ACE_HAS_WCHAR)
  133. //
  134. // WCHAR version of ::set
  135. //
  136. int
  137. ACE_Multihomed_INET_Addr::set (u_short port_number,
  138. const wchar_t host_name[],
  139. int encode,
  140. int address_family,
  141. const wchar_t *(secondary_host_names[]),
  142. size_t size)
  143. {
  144. this->secondaries_.size(size);
  145. for (size_t i = 0; i < size; ++i) {
  146. int ret = this->secondaries_[i].set(port_number,
  147. secondary_host_names[i],
  148. encode,
  149. address_family);
  150. if (ret) {
  151. return ret;
  152. }
  153. }
  154. return ACE_INET_Addr::set(port_number, host_name, encode, address_family);
  155. }
  156. #endif /* ACE_HAS_WCHAR */
  157. int
  158. ACE_Multihomed_INET_Addr::set (u_short port_number,
  159. ACE_UINT32 primary_ip_addr,
  160. int encode,
  161. const ACE_UINT32 *secondary_ip_addrs,
  162. size_t size)
  163. {
  164. this->secondaries_.size(size);
  165. for (size_t i = 0; i < size; ++i) {
  166. int ret = this->secondaries_[i].set(port_number,
  167. secondary_ip_addrs[i],
  168. encode);
  169. if (ret) {
  170. return ret;
  171. }
  172. }
  173. return ACE_INET_Addr::set(port_number, primary_ip_addr, encode);
  174. }
  175. void
  176. ACE_Multihomed_INET_Addr::set_port_number (u_short port_number, int encode)
  177. {
  178. size_t i = 0;
  179. while (i < secondaries_.size())
  180. secondaries_[i++].set_port_number(port_number, encode);
  181. this->ACE_INET_Addr::set_port_number(port_number, encode);
  182. }
  183. int
  184. ACE_Multihomed_INET_Addr::get_secondary_addresses(ACE_INET_Addr *secondary_addrs,
  185. size_t size) const
  186. {
  187. size_t top =
  188. size < this->secondaries_.size() ?
  189. size : this->secondaries_.size();
  190. for (size_t i = 0; i < top; ++i)
  191. {
  192. int ret =
  193. secondary_addrs[i].set (this->secondaries_[i]);
  194. if (ret)
  195. return ret;
  196. }
  197. return 0;
  198. }
  199. void
  200. ACE_Multihomed_INET_Addr::get_addresses(sockaddr_in *addrs,
  201. size_t size) const
  202. {
  203. // Copy primary address to the first slot of the user-supplied array
  204. if (size > 0) {
  205. addrs[0] = *reinterpret_cast<sockaddr_in*> (this->get_addr ());
  206. }
  207. // Copy secondary addresses to remaining slots of the user-supplied
  208. // array. Secondary address [i] is copied to slot [i+1]
  209. size_t top = size - 1 < this->secondaries_.size() ?
  210. size - 1 : this->secondaries_.size();
  211. for (size_t i = 0; i < top; ++i) {
  212. addrs[i+1] =
  213. *reinterpret_cast<sockaddr_in*> (this->secondaries_[i].get_addr());
  214. }
  215. }
  216. #if defined (ACE_HAS_IPV6)
  217. void
  218. ACE_Multihomed_INET_Addr::get_addresses(sockaddr_in6 *addrs,
  219. size_t size) const
  220. {
  221. // Copy primary address to the first slot of the user-supplied array
  222. if (size > 0)
  223. {
  224. addrs[0] = *reinterpret_cast<sockaddr_in6*> (this->get_addr ());
  225. }
  226. // Copy secondary addresses to remaining slots of the user-supplied
  227. // array. Secondary address [i] is copied to slot [i+1]
  228. size_t top =
  229. size - 1 < this->secondaries_.size() ?
  230. size - 1 : this->secondaries_.size();
  231. for (size_t i = 0; i < top; ++i)
  232. {
  233. addrs[i+1] =
  234. *reinterpret_cast<sockaddr_in6*> (this->secondaries_[i].get_addr());
  235. }
  236. }
  237. #endif /* ACE_HAS_IPV6 */
  238. ACE_Multihomed_INET_Addr::~ACE_Multihomed_INET_Addr (void)
  239. {
  240. }
  241. ACE_END_VERSIONED_NAMESPACE_DECL