#include <stdio.h>
#include <netdb.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <pthread.h>

void *dnslookup(void *h);
void wait();

int state;
struct in_addr ip;

int main(int argc, char *argv[])
{
	pthread_t t;

	if (argc != 2)
	{
		printf("Usage: %s <host>\n", argv[0]);
		exit(1);
	}

	state = 0;
	
	if (pthread_create(&t, NULL, dnslookup, (void *)argv[1]) != 0)
	{
		printf("Cannot create thread!\n");
		exit(1);
	}

	printf("Looking up %s... ", argv[1]);
	fflush(stdout);

	while (state == 0)
	{
		wait();
		usleep(50000);
	}

	if (state == -1)
		printf("\bERR: Unable to resolve.\n");
	else
		printf("\bOK: %s\n", inet_ntoa(ip));
	
	return 0;
}


void *dnslookup(void *h)
{
	struct hostent *addr;
	struct sockaddr_in in;

	addr = gethostbyname((char *)h);

	if (!addr)
	{
		state = -1;
		pthread_exit((void *) 0);
	}

	in.sin_addr = *(struct in_addr*)addr->h_addr;
	in.sin_family = AF_INET;
	ip = in.sin_addr;
	state = 1;
	pthread_exit((void *) 0);

	/* never reached */
	return (void *)NULL;
}


void wait()
{
	static unsigned char cur='/';
	switch(cur)
	{
		case '-':
			cur = '\\';
			break;
		case '\\':
			cur = '|';
			break;
		case '|':
			cur = '/';
			break;
		case '/':
			cur = '-';
			break;
	}
	printf("\b%c", cur);
	fflush(stdout);
}

