155682Smarkm/*
2233294Sstas * Copyright (c) 1999 - 2000 Kungliga Tekniska H��gskolan
355682Smarkm * (Royal Institute of Technology, Stockholm, Sweden).
455682Smarkm * All rights reserved.
5233294Sstas *
655682Smarkm * Redistribution and use in source and binary forms, with or without
755682Smarkm * modification, are permitted provided that the following conditions
855682Smarkm * are met:
9233294Sstas *
1055682Smarkm * 1. Redistributions of source code must retain the above copyright
1155682Smarkm *    notice, this list of conditions and the following disclaimer.
12233294Sstas *
1355682Smarkm * 2. Redistributions in binary form must reproduce the above copyright
1455682Smarkm *    notice, this list of conditions and the following disclaimer in the
1555682Smarkm *    documentation and/or other materials provided with the distribution.
16233294Sstas *
1755682Smarkm * 3. Neither the name of the Institute nor the names of its contributors
1855682Smarkm *    may be used to endorse or promote products derived from this software
1955682Smarkm *    without specific prior written permission.
20233294Sstas *
2155682Smarkm * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
2255682Smarkm * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2355682Smarkm * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2455682Smarkm * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
2555682Smarkm * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2655682Smarkm * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2755682Smarkm * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2855682Smarkm * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2955682Smarkm * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
3055682Smarkm * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
3155682Smarkm * SUCH DAMAGE.
3255682Smarkm */
3355682Smarkm
3455682Smarkm#include <config.h>
3555682Smarkm
3655682Smarkm#include "roken.h"
3755682Smarkm#include "getarg.h"
3855682Smarkm
3955682Smarkmstatic int flags;
4055682Smarkmstatic int family;
4155682Smarkmstatic int socktype;
4255682Smarkm
43233294Sstasstatic int verbose_counter;
4455682Smarkmstatic int version_flag;
4555682Smarkmstatic int help_flag;
4655682Smarkm
4755682Smarkmstatic struct getargs args[] = {
48233294Sstas    {"verbose",	0,	arg_counter,	&verbose_counter,"verbose",	NULL},
4955682Smarkm    {"flags",	0,	arg_integer,	&flags,		"flags",	NULL},
5055682Smarkm    {"family",	0,	arg_integer,	&family,	"family",	NULL},
5155682Smarkm    {"socktype",0,	arg_integer,	&socktype,	"socktype",	NULL},
5255682Smarkm    {"version",	0,	arg_flag,	&version_flag,	"print version",NULL},
5355682Smarkm    {"help",	0,	arg_flag,	&help_flag,	NULL,		NULL}
5455682Smarkm};
5555682Smarkm
5655682Smarkmstatic void
5755682Smarkmusage(int ret)
5855682Smarkm{
5955682Smarkm    arg_printusage (args,
6055682Smarkm		    sizeof(args) / sizeof(args[0]),
6155682Smarkm		    NULL,
6255682Smarkm		    "[nodename servname...]");
6355682Smarkm    exit (ret);
6455682Smarkm}
6555682Smarkm
6655682Smarkmstatic void
6755682Smarkmdoit (const char *nodename, const char *servname)
6855682Smarkm{
6955682Smarkm    struct addrinfo hints;
7055682Smarkm    struct addrinfo *res, *r;
7155682Smarkm    int ret;
7255682Smarkm
73233294Sstas    if (verbose_counter)
74233294Sstas	printf ("(%s,%s)... ", nodename ? nodename : "null", servname);
7555682Smarkm
7655682Smarkm    memset (&hints, 0, sizeof(hints));
7755682Smarkm    hints.ai_flags    = flags;
7855682Smarkm    hints.ai_family   = family;
7955682Smarkm    hints.ai_socktype = socktype;
8055682Smarkm
8155682Smarkm    ret = getaddrinfo (nodename, servname, &hints, &res);
82233294Sstas    if (ret)
83233294Sstas	errx(1, "error: %s\n", gai_strerror(ret));
8455682Smarkm
85233294Sstas    if (verbose_counter)
86233294Sstas	printf ("\n");
87233294Sstas
8855682Smarkm    for (r = res; r != NULL; r = r->ai_next) {
8955682Smarkm	char addrstr[256];
9055682Smarkm
91233294Sstas	if (inet_ntop (r->ai_family,
9255682Smarkm		       socket_get_address (r->ai_addr),
9355682Smarkm		       addrstr, sizeof(addrstr)) == NULL) {
94233294Sstas	    if (verbose_counter)
95233294Sstas		printf ("\tbad address?\n");
9655682Smarkm	    continue;
97233294Sstas	}
98233294Sstas	if (verbose_counter) {
99233294Sstas	    printf ("\tfamily = %d, socktype = %d, protocol = %d, "
100233294Sstas		    "address = \"%s\", port = %d",
101233294Sstas		    r->ai_family, r->ai_socktype, r->ai_protocol,
102233294Sstas		    addrstr,
103233294Sstas		    ntohs(socket_get_port (r->ai_addr)));
104233294Sstas	    if (r->ai_canonname)
105233294Sstas		printf (", canonname = \"%s\"", r->ai_canonname);
106233294Sstas	    printf ("\n");
107233294Sstas	}
10855682Smarkm    }
10955682Smarkm    freeaddrinfo (res);
11055682Smarkm}
11155682Smarkm
11255682Smarkmint
11355682Smarkmmain(int argc, char **argv)
11455682Smarkm{
115178825Sdfr    int optidx = 0;
11655682Smarkm    int i;
11755682Smarkm
11878527Sassar    setprogname (argv[0]);
11955682Smarkm
12055682Smarkm    if (getarg (args, sizeof(args) / sizeof(args[0]), argc, argv,
121178825Sdfr		&optidx))
12255682Smarkm	usage (1);
12355682Smarkm
12455682Smarkm    if (help_flag)
12555682Smarkm	usage (0);
12655682Smarkm
12755682Smarkm    if (version_flag) {
128233294Sstas	fprintf (stderr, "%s from %s-%s\n", getprogname(), PACKAGE, VERSION);
12955682Smarkm	return 0;
13055682Smarkm    }
13155682Smarkm
132178825Sdfr    argc -= optidx;
133178825Sdfr    argv += optidx;
13455682Smarkm
13555682Smarkm    if (argc % 2 != 0)
13655682Smarkm	usage (1);
13755682Smarkm
13855682Smarkm    for (i = 0; i < argc; i += 2) {
13955682Smarkm	const char *nodename = argv[i];
14055682Smarkm
14155682Smarkm	if (strcmp (nodename, "null") == 0)
14255682Smarkm	    nodename = NULL;
14355682Smarkm
14455682Smarkm	doit (nodename, argv[i+1]);
14555682Smarkm    }
14655682Smarkm    return 0;
14755682Smarkm}
148