/*
	modified dns resolver, with ncurses support
		by nad@somethinginteresting.org
*/


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

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

int current=0;		/* current line */

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

	char s[128];

	initscr();

	while(1) {

		mvprintw(LINES-1, 0, "> ");
		mvgetnstr(LINES-1, 2, s, 128);

		if (strncmp(s, "quit", 4) == 0)
			break;

		if (is_ip(s))
			resolv_addr(s);
		else
			resolv_host(s);

		move(LINES-1, 1);
		clrtoeol();

		if (current == LINES) { /* just reset if we get too far */
			erase();
			current =0;
		}

	}

	endwin();

        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)
		mvprintw(current++, 0, "%s\n", ip);
	else
		mvprintw(current++, 0, "%s\t\t\t%s\n", ip, h->h_name);

}


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

	struct hostent *h;

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

}


/* duh */
void usage() {

        printf("resolv2 (kinda hard to mess this one up)\n");
        exit(0);

}

