1 /* 2 * Copyright (c) 1999 - 2000 Kungliga Tekniska H�gskolan 3 * (Royal Institute of Technology, Stockholm, Sweden). 4 * All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: 9 * 10 * 1. Redistributions of source code must retain the above copyright 11 * notice, this list of conditions and the following disclaimer. 12 * 13 * 2. Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in the 15 * documentation and/or other materials provided with the distribution. 16 * 17 * 3. Neither the name of the Institute nor the names of its contributors 18 * may be used to endorse or promote products derived from this software 19 * without specific prior written permission. 20 * 21 * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND 22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 24 * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE 25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31 * SUCH DAMAGE. 32 */ 33 34 #ifdef HAVE_CONFIG_H 35 #include <config.h> 36 RCSID("$Id: getaddrinfo-test.c,v 1.4 2001/02/20 01:44:54 assar Exp $"); 37 #endif 38 39 #include "roken.h" 40 #include "getarg.h" 41 42 static int flags; 43 static int family; 44 static int socktype; 45 46 static int version_flag; 47 static int help_flag; 48 49 static struct getargs args[] = { 50 {"flags", 0, arg_integer, &flags, "flags", NULL}, 51 {"family", 0, arg_integer, &family, "family", NULL}, 52 {"socktype",0, arg_integer, &socktype, "socktype", NULL}, 53 {"version", 0, arg_flag, &version_flag, "print version",NULL}, 54 {"help", 0, arg_flag, &help_flag, NULL, NULL} 55 }; 56 57 static void 58 usage(int ret) 59 { 60 arg_printusage (args, 61 sizeof(args) / sizeof(args[0]), 62 NULL, 63 "[nodename servname...]"); 64 exit (ret); 65 } 66 67 static void 68 doit (const char *nodename, const char *servname) 69 { 70 struct addrinfo hints; 71 struct addrinfo *res, *r; 72 int ret; 73 74 printf ("(%s,%s)... ", nodename ? nodename : "null", servname); 75 76 memset (&hints, 0, sizeof(hints)); 77 hints.ai_flags = flags; 78 hints.ai_family = family; 79 hints.ai_socktype = socktype; 80 81 ret = getaddrinfo (nodename, servname, &hints, &res); 82 if (ret) { 83 printf ("error: %s\n", gai_strerror(ret)); 84 return; 85 } 86 printf ("\n"); 87 88 for (r = res; r != NULL; r = r->ai_next) { 89 char addrstr[256]; 90 91 if (inet_ntop (r->ai_family, 92 socket_get_address (r->ai_addr), 93 addrstr, sizeof(addrstr)) == NULL) { 94 printf ("\tbad address?\n"); 95 continue; 96 } 97 printf ("\t(family = %d, socktype = %d, protocol = %d, " 98 "address = \"%s\", port = %d", 99 r->ai_family, r->ai_socktype, r->ai_protocol, 100 addrstr, 101 ntohs(socket_get_port (r->ai_addr))); 102 if (r->ai_canonname) 103 printf (", canonname = \"%s\"", r->ai_canonname); 104 printf ("\n"); 105 } 106 freeaddrinfo (res); 107 } 108 109 int 110 main(int argc, char **argv) 111 { 112 int optind = 0; 113 int i; 114 115 setprogname (argv[0]); 116 117 if (getarg (args, sizeof(args) / sizeof(args[0]), argc, argv, 118 &optind)) 119 usage (1); 120 121 if (help_flag) 122 usage (0); 123 124 if (version_flag) { 125 fprintf (stderr, "%s from %s-%s)\n", getprogname(), PACKAGE, VERSION); 126 return 0; 127 } 128 129 argc -= optind; 130 argv += optind; 131 132 if (argc % 2 != 0) 133 usage (1); 134 135 for (i = 0; i < argc; i += 2) { 136 const char *nodename = argv[i]; 137 138 if (strcmp (nodename, "null") == 0) 139 nodename = NULL; 140 141 doit (nodename, argv[i+1]); 142 } 143 return 0; 144 } 145