|  | /* 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"); | 
|  | } |