/* gcc -o getaddrinfo getaddrinfo.c */

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <string.h>
#include <stdlib.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stddef.h>

#define ADDROFFSET(x) \
(x) ? \
	((((struct sockaddr *)(x))->sa_family == AF_INET) ?  \
		((void *)(x) + offsetof(struct sockaddr_in, sin_addr)) :  \
		(((struct sockaddr *)(x))->sa_family == AF_INET6) ? \
			((void *)(x) + offsetof(struct sockaddr_in6, sin6_addr)) : \
			NULL) : \
	NULL


int main(int argc, char *argv[])
{
	int i=0;
	const char *port = NULL;

	for(i=1;i<argc;i++)
	{
		const char *hostname = argv[i];
		struct addrinfo hints;
		memset(&hints, 0, sizeof(hints));
		hints.ai_family = AF_UNSPEC;
		hints.ai_socktype = SOCK_STREAM;
		hints.ai_flags = AI_NUMERICHOST;

		const struct addrinfo *ainext;
		const struct addrinfo *ai;
		struct addrinfo *aihead;
		int error;

		printf("resolving %s\n",hostname);
		error = getaddrinfo(hostname, NULL, &hints, &aihead);
		if(error) {
			printf("getaddrinfo(3) failed for %s:%s\n", hostname, port);
			continue;
		}
			
		for(ai = aihead; ai != NULL; ai = ainext) 
		{
			char host[128];
			if ( inet_ntop(ai->ai_addr->sa_family, ADDROFFSET(ai->ai_addr) , host, 127) )
				printf("\t %i %s\n", ai->ai_family, host);
		}

		freeaddrinfo(aihead);
	}
	return 0;	
}

