/* host - print information about a host
 * originally written by Paul Vixie @DEC WRL, January 1989
 */

/* DECWRL Header: host.c,v 1.1 89/04/05 15:41:12 vixie Locked $ */

#include <sys/param.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <arpa/nameser.h>

#include <stdio.h>
#include <resolv.h>
#include <netdb.h>
#include <syslog.h>
#include <string.h>
#include <stdlib.h>

#ifndef LOG_PERROR
#define LOG_PERROR 0
#endif

int
main(argc, argv)
	int argc;
	char **argv;
{
	u_char b_addr[IN6ADDRSZ];
	struct hostent *host;
	char **ap, **cp, *arg;
	const char *prog = "amnesia";
	int af = AF_INET;
	int size = INADDRSZ;
	int force = 0;

	if (argc < 1) {
 usage:
		printf("usage:  %s [-d] [-6] [-f] (hostname|ipaddr)\n", prog);
		exit(1);
	}
	prog = *argv++; argc--;
#ifdef LOG_USER
	openlog(prog, LOG_PERROR, LOG_USER);
#else
	openlog(prog, LOG_PERROR);
#endif
	res_init();

	if (argc >= 1 && !strcmp(*argv, "-d")) {
		_res.options |= RES_DEBUG;
		argv++, argc--;
	}
	if (argc >= 1 && !strcmp(*argv, "-6")) {
		af = AF_INET6, size = IN6ADDRSZ;
		_res.options |= RES_USE_INET6;
		argv++, argc--;
	}
	if (argc >= 1 && !strcmp(*argv, "-f")) {
		force++;
		argv++, argc--;
	}

	if (argc < 1)
		goto usage;
	arg = *argv++; argc--;

	if (inet_pton(af, arg, b_addr)) {
		char p[sizeof "ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255"];

		printf("[%s]\n", inet_ntop(af, b_addr, p, sizeof p));
		if (!(host = gethostbyaddr((char*)b_addr, size, af))) {
			herror("gethostbyaddr");
			exit(1);
		}
	} else {
		printf("{%s}\n", arg);
		if (force)
			host = gethostbyname2(arg, af);
		else
			host = gethostbyname(arg);
		if (!host) {
			herror("gethostbyname*");
			exit(1);
		}
	}
	printf("name: %s\n", host->h_name);
	if (host->h_aliases && *host->h_aliases) {
		printf("aliases:");
		for (cp = (char **) host->h_aliases; *cp; cp++)
			printf(" %s", *cp);
		printf("\n");
	}
	if (host->h_addr_list && *host->h_addr_list) {
		printf("addresses:");
		for (ap = host->h_addr_list; *ap; ap++) {
			char p[sizeof
			       "ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255"
			      ];

			printf(" %s", inet_ntop(host->h_addrtype,
						*ap, p, sizeof p));
		}
		printf("\n");
	}
exit(0);
}