diff --git a/dns/GNUmakefile b/dns/GNUmakefile index 536e95a..84b7159 100644 --- a/dns/GNUmakefile +++ b/dns/GNUmakefile @@ -1,9 +1,10 @@ include GNUmakevars -all: gethostbyname fqdn query +all: gethostbyaddr gethostbyname fqdn query check install: \ $(BINDIR)/axfr \ $(BINDIR)/fqdn \ + $(BINDIR)/gethostbyaddr \ $(BINDIR)/gethostbyname \ $(BINDIR)/minnet \ $(BINDIR)/query \ diff --git a/dns/gethostbyaddr.c b/dns/gethostbyaddr.c new file mode 100644 index 0000000..b646948 --- /dev/null +++ b/dns/gethostbyaddr.c @@ -0,0 +1,57 @@ +#include +#include +#include + +#include "hstrerror.h" + +char *cmnd; + +void usage(void) { + fprintf(stderr, "Usage: %s [hostname ...]\n", cmnd); + exit(1); +} + +int main(int argc, char **argv) { + int i; + int rc = 0; + + cmnd = argv[0]; + + if (argc < 2) { + usage(); + } + + for (i = 1; i < argc; i++) { + struct in_addr ia; + if (!inet_aton(argv[i], &ia)) { + fprintf(stderr, "%s: cannot parse %s\n", + argv[0], argv[i]); + continue; + } + struct hostent *he = gethostbyaddr(&ia, sizeof(ia), AF_INET); + char **a; + + if (!he) { + fprintf(stderr, "%s: cannot resolve %s: %s\n", + argv[0], argv[i], hstrerror(h_errno)); + rc++; + continue; + } + + printf("%s\n", argv[i]); + printf("\tCanonical: %s\n", he->h_name); + for (a = he->h_aliases; *a; a++) { + printf("\tAlias: %s\n", *a); + } + for (a = he->h_addr_list; *a; a++) { + int j; + printf("\tAddress: "); + for (j = 0; j < he->h_length; j++) { + printf("%s%d", j ? "." : "", (unsigned char)(*a)[j]); + } + printf("\n"); + } + printf("\n"); + } + return rc; +}