/*
	streamlined dns resolver using gethostbyaddr or getthostbyname
		by nad@somethinginteresting.org
*/


/* includes */
#include <stdio.h>
#include <netdb.h>
#include <netinet/in.h>


/* prototypes */
void usage(void);
int is_ip(char *);
void resolv_addr(char *);
void resolv_host(char *);


/* i like main() on top, sue me */
int main(int argc, char **argv) {

        if (argc < 2)
                usage();

	if (is_ip(argv[1]))
		resolv_addr(argv[1]);
	else
		resolv_host(argv[1]);

        return 0;

}


/* simple distinction of ip from hostname */
int is_ip(char *s) {

	while (*s) 
		if (isalpha((int)*s))
			return 0;
		else
			s++;

	return 1;

}


/* ip to hostname */
void resolv_addr(char *ip) {

	struct hostent *h;
	struct in_addr addr;

	inet_aton(ip, &addr);
	if ((h = gethostbyaddr((char *)&addr, 4, AF_INET)) == NULL)
		printf("%s\n", ip);
	else
		printf("%s\t\t%s\n", ip, h->h_name);

}


/* hostname to ip */
void resolv_host(char *host) {

	struct hostent *h;

	if ((h = gethostbyname(host)) == NULL)
		printf("%s\n", host);
	else
		printf("%s\t\t%s\n", host, inet_ntoa(*((struct in_addr *)h->h_addr))); 

}


/* duh */
void usage() {

        printf("resolv <host/ip>\n");
        exit(0);

}

