/* getaddrinfo.c - a simple protocol independent resolver example.
 *
 * Resolves a hostname and loops through all the results listing them.
 * (Written to test behaviour on looking up localhost/ip6-localhost on
 * different versions of glibc, which used to inject results.)
 *
 * Copyright (c) 2008, Andreas Henriksson <andreas@fatal.se>
 * License: WTFPLv2.
 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>

static void usage(char *p)
{
	fprintf(stderr, "Usage: %s <host> [service]\n", p);
	exit(99);
}

int main (int argc, char **argv)
{
	int err;
	struct addrinfo hints, *res, *cur;
	char *host=NULL, *serv=NULL;

	if (argc < 2 || argc > 3)
		usage(argv[0]);

	if (argc > 1)
		host = argv[1];
	if (argc > 2)
		serv = argv[2];

	memset(&hints, '\0', sizeof(hints));
	hints.ai_family = AF_UNSPEC;
	hints.ai_flags = AI_PASSIVE;
	hints.ai_socktype = SOCK_DGRAM;
	hints.ai_protocol = 0;

	err = getaddrinfo(host, serv, &hints, &res);
	if (err) {
		fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(err));
		exit(err);
	}

	for (cur = res; cur != NULL; cur = cur->ai_next) {
		char hbuf[NI_MAXHOST], sbuf[NI_MAXSERV];

		err = getnameinfo(cur->ai_addr, cur->ai_addrlen,
				hbuf, sizeof(hbuf), sbuf, sizeof(sbuf),
				NI_NUMERICHOST | NI_NUMERICSERV);

		if (err) {
			fprintf(stderr, "getnameinfo: %s\n", gai_strerror(err));
			continue;
		}

		if (serv) {
			printf("host: %s, serv: %s\n", hbuf, sbuf);
		} else {
			printf("host: %s\n", hbuf);
		}
	}

	freeaddrinfo(res);

	return 0;
}

