ga_nsearch.c 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. #include "gai_hdr.h"
  2. /*
  3. * Set up the search[] array with the hostnames and address families
  4. * that we are to look up.
  5. */
  6. /* include ga_nsearch1 */
  7. int
  8. ga_nsearch(const char *hostname, const struct addrinfo *hintsp,
  9. struct search *search)
  10. {
  11. int nsearch = 0;
  12. if (hostname == NULL || hostname[0] == '\0') {
  13. if (hintsp->ai_flags & AI_PASSIVE) {
  14. /* 4no hostname and AI_PASSIVE: implies wildcard bind */
  15. switch (hintsp->ai_family) {
  16. #ifdef IPv4
  17. case AF_INET:
  18. search[nsearch].host = "0.0.0.0";
  19. search[nsearch].family = AF_INET;
  20. nsearch++;
  21. break;
  22. #endif
  23. #ifdef IPv6
  24. case AF_INET6:
  25. search[nsearch].host = "0::0";
  26. search[nsearch].family = AF_INET6;
  27. nsearch++;
  28. break;
  29. #endif
  30. case AF_UNSPEC:
  31. #ifdef IPv6
  32. search[nsearch].host = "0::0"; /* IPv6 first, then IPv4 */
  33. search[nsearch].family = AF_INET6;
  34. nsearch++;
  35. #endif
  36. #ifdef IPv4
  37. search[nsearch].host = "0.0.0.0";
  38. search[nsearch].family = AF_INET;
  39. nsearch++;
  40. #endif
  41. break;
  42. }
  43. /* end ga_nsearch1 */
  44. /* include ga_nsearch2 */
  45. } else {
  46. /* 4no host and not AI_PASSIVE: connect to local host */
  47. switch (hintsp->ai_family) {
  48. #ifdef IPv4
  49. case AF_INET:
  50. search[nsearch].host = "localhost"; /* 127.0.0.1 */
  51. search[nsearch].family = AF_INET;
  52. nsearch++;
  53. break;
  54. #endif
  55. #ifdef IPv6
  56. case AF_INET6:
  57. search[nsearch].host = "0::1";
  58. search[nsearch].family = AF_INET6;
  59. nsearch++;
  60. break;
  61. #endif
  62. case AF_UNSPEC:
  63. #ifdef IPv6
  64. search[nsearch].host = "0::1"; /* IPv6 first, then IPv4 */
  65. search[nsearch].family = AF_INET6;
  66. nsearch++;
  67. #endif
  68. #ifdef IPv4
  69. search[nsearch].host = "localhost";
  70. search[nsearch].family = AF_INET;
  71. nsearch++;
  72. #endif
  73. break;
  74. }
  75. }
  76. /* end ga_nsearch2 */
  77. /* include ga_nsearch3 */
  78. } else { /* host is specified */
  79. switch (hintsp->ai_family) {
  80. #ifdef IPv4
  81. case AF_INET:
  82. search[nsearch].host = hostname;
  83. search[nsearch].family = AF_INET;
  84. nsearch++;
  85. break;
  86. #endif
  87. #ifdef IPv6
  88. case AF_INET6:
  89. search[nsearch].host = hostname;
  90. search[nsearch].family = AF_INET6;
  91. nsearch++;
  92. break;
  93. #endif
  94. case AF_UNSPEC:
  95. #ifdef IPv6
  96. search[nsearch].host = hostname;
  97. search[nsearch].family = AF_INET6; /* IPv6 first */
  98. nsearch++;
  99. #endif
  100. #ifdef IPv4
  101. search[nsearch].host = hostname;
  102. search[nsearch].family = AF_INET; /* then IPv4 */
  103. nsearch++;
  104. #endif
  105. break;
  106. }
  107. }
  108. if (nsearch < 1 || nsearch > 2)
  109. err_quit("nsearch = %d", nsearch);
  110. return(nsearch);
  111. }
  112. /* end ga_nsearch3 */