C++程序  |  106行  |  2.14 KB

/* 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(int argc, char **argv)
{
	unsigned 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);
}