/* Copyright (c) 2015 Google, Inc.
 * Barret Rhoden <brho@cs.berkeley.edu>
 * See LICENSE for details. */

#include <stdlib.h>
#include <stdio.h>
#include <parlib/parlib.h>
#include <unistd.h>
#include <signal.h>

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

static void print_gai(struct addrinfo *ai, const char *info)
{
	struct sockaddr_in *ipv4sa;
	printf("%s: fam %d, sock %d, prot %d ", info, ai->ai_family,
	       ai->ai_socktype, ai->ai_protocol);
	char buf[128];
	ipv4sa = (struct sockaddr_in*)ai->ai_addr;
	const char *ipv4n = inet_ntop(AF_INET, &ipv4sa->sin_addr, buf, 128);
	assert(buf == ipv4n);
	printf("addr %s, port %d\n", buf, ntohs(ipv4sa->sin_port));
}

static void test_gai(const char *node, const char *serv, struct addrinfo *hints,
                     const char *info)
{
	struct addrinfo *_ai_res;
	int ret = getaddrinfo(node, serv, hints, &_ai_res);
	if (ret) {
		printf("%s: GAI failed, %d, %d %s\n", info, ret, errno, errstr());
	} else {
		print_gai(_ai_res, info);
		freeaddrinfo(_ai_res);
	}
}

int main(int argc, char **argv)
{
	char name[100];
	char serv[100];

	struct addrinfo hints = {0};

	test_gai("10.0.2.1", "80", 0, "IP and 80");

	test_gai("10.0.2.1.dicks", "80", 0, "Non-number name");

	test_gai("10.0.2.2", "http", 0, "http serv");

	hints.ai_family = AF_UNSPEC;
	hints.ai_socktype = SOCK_DGRAM;
	hints.ai_protocol = 0;
	test_gai("10.0.2.3", "12345", &hints, "SOCK_DGRAM");

	hints.ai_family = AF_UNSPEC;
	hints.ai_socktype = SOCK_RAW;
	hints.ai_protocol = 0;
	test_gai("10.0.2.3", "12345", &hints, "SOCK_RAW");

	hints.ai_family = AF_UNSPEC;
	hints.ai_socktype = 0;
	hints.ai_protocol = IPPROTO_ICMP;
	test_gai("10.0.2.3", "12345", &hints, "ICMP");

	hints.ai_family = AF_UNSPEC;
	hints.ai_socktype = SOCK_DGRAM;
	hints.ai_protocol = IPPROTO_TCP;
	test_gai("10.0.2.3", "12345", &hints, "Impossible hint");
}
