tst-getaddrinfo3.c 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. #include <mcheck.h>
  2. #include <netdb.h>
  3. #include <stdio.h>
  4. #include <string.h>
  5. #include <arpa/inet.h>
  6. #include <arpa/nameser.h>
  7. static int
  8. do_test (void)
  9. {
  10. mtrace ();
  11. int result = 0;
  12. struct addrinfo hints;
  13. struct addrinfo *ai_res;
  14. int s;
  15. #define T(no, fail, addr, fam, coraddr) \
  16. s = getaddrinfo (addr, NULL, &hints, &ai_res); \
  17. if (s != 0) \
  18. { \
  19. if (s != fail) \
  20. { \
  21. printf ("getaddrinfo test %d failed: %s\n", no, gai_strerror (s)); \
  22. result = 1; \
  23. } \
  24. ai_res = NULL; \
  25. } \
  26. else if (fail) \
  27. { \
  28. printf ("getaddrinfo test %d should have failed but did not\n", no); \
  29. result = 1; \
  30. } \
  31. else if (ai_res->ai_family != fam) \
  32. { \
  33. printf ("\
  34. getaddrinfo test %d return address of family %d, expected %d\n", \
  35. no, ai_res->ai_family, fam); \
  36. result = 1; \
  37. } \
  38. else if (fam == AF_INET) \
  39. { \
  40. if (ai_res->ai_addrlen != sizeof (struct sockaddr_in)) \
  41. { \
  42. printf ("getaddrinfo test %d: address size %zu, expected %zu\n", \
  43. no, (size_t) ai_res->ai_addrlen, \
  44. sizeof (struct sockaddr_in)); \
  45. result = 1; \
  46. } \
  47. else if (strcmp (coraddr, \
  48. inet_ntoa (((struct sockaddr_in *) ai_res->ai_addr)->sin_addr))\
  49. != 0) \
  50. { \
  51. printf ("getaddrinfo test %d: got value %s, expected %s\n", \
  52. no, \
  53. inet_ntoa (((struct sockaddr_in *) ai_res->ai_addr)->sin_addr), \
  54. coraddr); \
  55. result = 1; \
  56. } \
  57. } \
  58. else \
  59. { \
  60. char buf[100]; \
  61. \
  62. if (ai_res->ai_addrlen != sizeof (struct sockaddr_in6)) \
  63. { \
  64. printf ("getaddrinfo test %d: address size %zu, expected %zu\n", \
  65. no, (size_t) ai_res->ai_addrlen, \
  66. sizeof (struct sockaddr_in6)); \
  67. result = 1; \
  68. } \
  69. else if (strcmp (coraddr, \
  70. inet_ntop (AF_INET6, \
  71. &((struct sockaddr_in6 *) ai_res->ai_addr)->sin6_addr,\
  72. buf, sizeof (buf))) \
  73. != 0) \
  74. { \
  75. printf ("getaddrinfo test %d: got value %s, expected %s\n", \
  76. no, \
  77. inet_ntop (AF_INET6, \
  78. & ((struct sockaddr_in6 *) ai_res->ai_addr)->sin6_addr, \
  79. buf, sizeof (buf)), \
  80. coraddr); \
  81. result = 1; \
  82. } \
  83. } \
  84. if (ai_res != NULL && ai_res->ai_next != NULL) \
  85. { \
  86. puts ("expected only one result"); \
  87. result = 1; \
  88. } \
  89. freeaddrinfo (ai_res)
  90. memset (&hints, '\0', sizeof (hints));
  91. hints.ai_family = AF_UNSPEC;
  92. hints.ai_socktype = SOCK_STREAM;
  93. T (1, 0, "127.0.0.1", AF_INET, "127.0.0.1");
  94. memset (&hints, '\0', sizeof (hints));
  95. hints.ai_family = AF_INET;
  96. hints.ai_socktype = SOCK_STREAM;
  97. T (2, 0, "127.0.0.1", AF_INET, "127.0.0.1");
  98. memset (&hints, '\0', sizeof (hints));
  99. hints.ai_family = AF_INET6;
  100. hints.ai_socktype = SOCK_STREAM;
  101. hints.ai_flags = AI_V4MAPPED;
  102. T (3, 0, "127.0.0.1", AF_INET6, "::ffff:127.0.0.1");
  103. memset (&hints, '\0', sizeof (hints));
  104. hints.ai_family = AF_INET6;
  105. hints.ai_socktype = SOCK_STREAM;
  106. T (4, EAI_ADDRFAMILY, "127.0.0.1", AF_INET6, "");
  107. memset (&hints, '\0', sizeof (hints));
  108. hints.ai_family = AF_UNSPEC;
  109. hints.ai_socktype = SOCK_STREAM;
  110. T (5, 0, "::1", AF_INET6, "::1");
  111. memset (&hints, '\0', sizeof (hints));
  112. hints.ai_family = AF_INET;
  113. hints.ai_socktype = SOCK_STREAM;
  114. T (6, EAI_ADDRFAMILY, "::1", AF_INET6, "");
  115. memset (&hints, '\0', sizeof (hints));
  116. hints.ai_family = AF_INET6;
  117. hints.ai_socktype = SOCK_STREAM;
  118. T (7, 0, "::1", AF_INET6, "::1");
  119. memset (&hints, '\0', sizeof (hints));
  120. hints.ai_family = AF_UNSPEC;
  121. hints.ai_socktype = SOCK_STREAM;
  122. T (8, 0, "::ffff:127.0.0.1", AF_INET6, "::ffff:127.0.0.1");
  123. memset (&hints, '\0', sizeof (hints));
  124. hints.ai_family = AF_INET;
  125. hints.ai_socktype = SOCK_STREAM;
  126. T (9, 0, "::ffff:127.0.0.1", AF_INET, "127.0.0.1");
  127. memset (&hints, '\0', sizeof (hints));
  128. hints.ai_family = AF_INET6;
  129. hints.ai_socktype = SOCK_STREAM;
  130. T (10, 0, "::ffff:127.0.0.1", AF_INET6, "::ffff:127.0.0.1");
  131. #ifdef IPPROTO_MPTCP
  132. memset (&hints, '\0', sizeof (hints));
  133. hints.ai_family = AF_UNSPEC;
  134. hints.ai_socktype = SOCK_STREAM;
  135. hints.ai_protocol = IPPROTO_MPTCP;
  136. T (11, 0, "127.0.0.1", AF_INET, "127.0.0.1");
  137. memset (&hints, '\0', sizeof (hints));
  138. hints.ai_family = AF_INET;
  139. hints.ai_socktype = SOCK_STREAM;
  140. hints.ai_protocol = IPPROTO_MPTCP;
  141. T (12, 0, "127.0.0.1", AF_INET, "127.0.0.1");
  142. memset (&hints, '\0', sizeof (hints));
  143. hints.ai_family = AF_INET6;
  144. hints.ai_socktype = SOCK_STREAM;
  145. hints.ai_protocol = IPPROTO_MPTCP;
  146. T (13, 0, "::ffff:127.0.0.1", AF_INET6, "::ffff:127.0.0.1");
  147. memset (&hints, '\0', sizeof (hints));
  148. hints.ai_family = AF_INET6;
  149. hints.ai_socktype = SOCK_STREAM;
  150. hints.ai_protocol = IPPROTO_MPTCP;
  151. T (14, 0, "::ffff:127.0.0.1", AF_INET6, "::ffff:127.0.0.1");
  152. #endif
  153. return result;
  154. }
  155. #define TEST_FUNCTION do_test ()
  156. #include "../test-skeleton.c"