summaryrefslogtreecommitdiffstats
path: root/contrib/bind/tests/test_getaddr.c
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/bind/tests/test_getaddr.c')
-rw-r--r--contrib/bind/tests/test_getaddr.c160
1 files changed, 160 insertions, 0 deletions
diff --git a/contrib/bind/tests/test_getaddr.c b/contrib/bind/tests/test_getaddr.c
new file mode 100644
index 0000000..9ca2189
--- /dev/null
+++ b/contrib/bind/tests/test_getaddr.c
@@ -0,0 +1,160 @@
+#include <port_before.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <sys/socket.h>
+#include <netdb.h>
+#include <ctype.h>
+#include <port_after.h>
+
+char *flags[] = {
+ " AI_PASSIVE",
+ " AI_CANONNAME",
+ " AI_NUMERICHOST",
+ " 0x00000008",
+ " 0x00000010",
+ " 0x00000020",
+ " 0x00000040",
+ " 0x00000080",
+ " 0x00000100",
+ " 0x00000200",
+ " 0x00000400",
+ " 0x00000800",
+ " 0x00001000",
+ " 0x00002000",
+ " 0x00004000",
+ " 0x00008000",
+ " 0x00010000",
+ " 0x00020000",
+ " 0x00040000",
+ " 0x00080000",
+ " 0x00100000",
+ " 0x00200000",
+ " 0x00400000",
+ " 0x00800000",
+ " 0x01000000",
+ " 0x02000000",
+ " 0x04000000",
+ " 0x08000000",
+ " 0x10000000",
+ " 0x20000000",
+ " 0x40000000",
+ " 0x80000000"
+};
+
+void
+print_ai(struct addrinfo *answer, int hints) {
+ int i;
+
+ if (answer == NULL) {
+ fprintf(stdout, "No %s\n", hints ? "Hints" : "Answer");
+ return;
+ }
+
+ fprintf(stdout, "%s:\n", hints ? "Hints" : "Answer");
+
+ while (answer) {
+ fputs("flags:", stdout);
+ for (i = 0; i < 32 ; i++)
+ if (answer->ai_flags & (1 << i))
+ fputs(flags[i], stdout);
+ fputs("\n", stdout);
+ fprintf(stdout, "family: %d, socktype: %d, protocol: %d\n",
+ answer->ai_family, answer->ai_socktype, answer->ai_protocol);
+ if (hints)
+ return;
+
+ if (answer->ai_canonname != NULL)
+ fprintf(stdout, "canonname: \"%s\"\n",
+ answer->ai_canonname);
+ else
+ fputs("canonname: --none--\n", stdout);
+
+ fprintf(stdout, "addrlen: %d\n", answer->ai_addrlen);
+
+ for (i = 0; i < answer->ai_addrlen; i++)
+ fprintf(stdout, "%s%02x", (i == 0) ? "0x" : "",
+ ((unsigned char*)(answer->ai_addr))[i]);
+ fputs("\n", stdout);
+
+ for (i = 0; i < answer->ai_addrlen; i++)
+ fprintf(stdout, "%s%d", (i == 0) ? "" : ".",
+ ((unsigned char*)(answer->ai_addr))[i]);
+ fputs("\n", stdout);
+
+ for (i = 0; i < answer->ai_addrlen; i++) {
+ int c = ((unsigned char*)(answer->ai_addr))[i];
+ fprintf(stdout, "%c", (isascii(c) && isprint(c)) ?
+ c : '.');
+ }
+ fputs("\n", stdout);
+
+ answer = answer->ai_next;
+ }
+}
+
+void
+usage() {
+ fputs("usage:", stdout);
+ fputs("\t-h <hostname>\n", stdout);
+ fputs("\t-s <service>\n", stdout);
+ fputs("\t-p AI_PASSIVE\n", stdout);
+ fputs("\t-c AI_CANONNAME\n", stdout);
+ fputs("\t-n AI_NUMERICHOST\n", stdout);
+ fputs("\t-4 AF_INET4\n", stdout);
+ fputs("\t-6 AF_INET6\n", stdout);
+ fputs("\t-l AF_LOCAL\n", stdout);
+ fputs("\t-u IPPROTO_UDP\n", stdout);
+ fputs("\t-t IPPROTO_TCP\n", stdout);
+ fputs("\t-S SOCK_STREAM\n", stdout);
+ fputs("\t-D SOCK_DGRAM\n", stdout);
+ fputs("\t-R SOCK_RAW\n", stdout);
+ fputs("\t-M SOCK_RDM\n", stdout);
+ fputs("\t-P SOCK_SEQPACKET\n", stdout);
+ exit(1);
+}
+
+main(int argc, char **argv) {
+ int c;
+ char *hostname = NULL;
+ char *service = NULL;
+ struct addrinfo info;
+ int res;
+ struct addrinfo *answer;
+
+ memset(&info, 0, sizeof info);
+
+ while ((c = getopt(argc, argv, "h:s:pcn46ltuSDRMP")) != -1) {
+ switch (c) {
+ case 'h': hostname = optarg; break;
+ case 's': service = optarg; break;
+ case 'p': info.ai_flags |= AI_PASSIVE; break;
+ case 'c': info.ai_flags |= AI_CANONNAME; break;
+ case 'n': info.ai_flags |= AI_NUMERICHOST; break;
+ case '4': info.ai_family = AF_INET; break;
+ case '6': info.ai_family = AF_INET6; break;
+#ifdef AF_LOCAL
+ case 'l': info.ai_family = AF_LOCAL; break;
+#else
+ case 'l': fprintf(stdout, "AF_LOCAL not supported\n"); break;
+#endif
+ case 't': info.ai_protocol = IPPROTO_TCP; break;
+ case 'u': info.ai_protocol = IPPROTO_UDP; break;
+ case 'S': info.ai_socktype = SOCK_STREAM; break;
+ case 'D': info.ai_socktype = SOCK_DGRAM; break;
+ case 'R': info.ai_socktype = SOCK_RAW; break;
+ case 'M': info.ai_socktype = SOCK_RDM; break;
+ case 'P': info.ai_socktype = SOCK_SEQPACKET; break;
+ case '?': usage(); break;
+ }
+
+ }
+ res = getaddrinfo(hostname, service, &info, &answer);
+ if (res) {
+ fprintf(stdout, "%s\n", gai_strerror(res));
+ } else {
+ print_ai(&info, 1);
+ print_ai(answer, 0);
+ freeaddrinfo(answer);
+ }
+ exit (0);
+}
OpenPOWER on IntegriCloud