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 #include <config.h> 35 36 #include "roken.h" 37 #include "getarg.h" 38 39 static int flags; 40 static int family; 41 static int socktype; 42 43 static int verbose_counter; 44 static int version_flag; 45 static int help_flag; 46 47 static struct getargs args[] = { 48 {"verbose", 0, arg_counter, &verbose_counter,"verbose", NULL}, 49 {"flags", 0, arg_integer, &flags, "flags", NULL}, 50 {"family", 0, arg_integer, &family, "family", NULL}, 51 {"socktype",0, arg_integer, &socktype, "socktype", NULL}, 52 {"version", 0, arg_flag, &version_flag, "print version",NULL}, 53 {"help", 0, arg_flag, &help_flag, NULL, NULL} 54 }; 55 56 static void 57 usage(int ret) 58 { 59 arg_printusage (args, 60 sizeof(args) / sizeof(args[0]), 61 NULL, 62 "[nodename servname...]"); 63 exit (ret); 64 } 65 66 static void 67 doit (const char *nodename, const char *servname) 68 { 69 struct addrinfo hints; 70 struct addrinfo *res, *r; 71 int ret; 72 73 if (verbose_counter) 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 errx(1, "error: %s\n", gai_strerror(ret)); 84 85 if (verbose_counter) 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 if (verbose_counter) 95 printf ("\tbad address?\n"); 96 continue; 97 } 98 if (verbose_counter) { 99 printf ("\tfamily = %d, socktype = %d, protocol = %d, " 100 "address = \"%s\", port = %d", 101 r->ai_family, r->ai_socktype, r->ai_protocol, 102 addrstr, 103 ntohs(socket_get_port (r->ai_addr))); 104 if (r->ai_canonname) 105 printf (", canonname = \"%s\"", r->ai_canonname); 106 printf ("\n"); 107 } 108 } 109 freeaddrinfo (res); 110 } 111 112 int 113 main(int argc, char **argv) 114 { 115 int optidx = 0; 116 int i; 117 118 setprogname (argv[0]); 119 120 if (getarg (args, sizeof(args) / sizeof(args[0]), argc, argv, 121 &optidx)) 122 usage (1); 123 124 if (help_flag) 125 usage (0); 126 127 if (version_flag) { 128 fprintf (stderr, "%s from %s-%s\n", getprogname(), PACKAGE, VERSION); 129 return 0; 130 } 131 132 argc -= optidx; 133 argv += optidx; 134 135 if (argc % 2 != 0) 136 usage (1); 137 138 for (i = 0; i < argc; i += 2) { 139 const char *nodename = argv[i]; 140 141 if (strcmp (nodename, "null") == 0) 142 nodename = NULL; 143 144 doit (nodename, argv[i+1]); 145 } 146 return 0; 147 } 148