#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <err.h>
#include <errno.h>
#include <getopt.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "common.h"
static void
usage(void)
{
extern const char * __progname;
fprintf(stderr, "usage: %s [-46e] <host...>\n", __progname);
exit(1);
}
int
main(int argc, char *argv[])
{
int i, ch, aflag, family = AF_INET;
struct hostent *h;
char *host;
char addr[16];
int addrlen;
aflag = 0;
while((ch = getopt(argc, argv, "46R:ae")) != -1) {
switch(ch) {
case '4':
family = AF_INET;
break;
case '6':
family = AF_INET6;
break;
case 'R':
parseresopt(optarg);
break;
case 'a':
aflag = 1;
break;
case 'e':
long_err += 1;
break;
default:
usage();
}
}
argc -= optind;
argv += optind;
for(i = 0; i < argc; i++) {
if (i)
printf("\n");
printf("===> \"%s\"\n", argv[i]);
host = gethostarg(argv[i]);
if (aflag && addr_from_str(addr, &family, &addrlen, host) == -1)
errx(1, "bad address");
errno = 0;
h_errno = 0;
gai_errno = 0;
rrset_errno = 0;
if (aflag == 0)
h = gethostbyname2(host, family);
else
h = gethostbyaddr(addr, addrlen, family);
if (h)
print_hostent(h);
print_errors();
}
return (0);
}
int
addr_from_str(char *addr, int *family, int *len, const char *src)
{
if (inet_pton(AF_INET6, src, addr) == 1) {
*family = AF_INET6;
*len = 16;
return (0);
}
if (inet_pton(AF_INET, src, addr) == 1) {
*family = AF_INET;
*len = 4;
return (0);
}
return (-1);
}