Add IS_ERR_OR_NULL helper
[akaros.git] / tests / gai.c
1 /* Copyright (c) 2015 Google, Inc.
2  * Barret Rhoden <brho@cs.berkeley.edu>
3  * See LICENSE for details. */
4
5 #include <stdlib.h>
6 #include <stdio.h>
7 #include <parlib/parlib.h>
8 #include <unistd.h>
9 #include <signal.h>
10
11 #include <sys/socket.h>
12 #include <netdb.h>
13 #include <sys/types.h>
14 #include <arpa/inet.h>
15
16 static void print_gai(struct addrinfo *ai, const char *info)
17 {
18         struct sockaddr_in *ipv4sa;
19         printf("%s: fam %d, sock %d, prot %d ", info, ai->ai_family,
20                ai->ai_socktype, ai->ai_protocol);
21         char buf[128];
22         ipv4sa = (struct sockaddr_in*)ai->ai_addr;
23         const char *ipv4n = inet_ntop(AF_INET, &ipv4sa->sin_addr, buf, 128);
24         assert(buf == ipv4n);
25         printf("addr %s, port %d\n", buf, ntohs(ipv4sa->sin_port));
26 }
27
28 static void test_gai(const char *node, const char *serv, struct addrinfo *hints,
29                      const char *info)
30 {
31         struct addrinfo *_ai_res;
32         int ret = getaddrinfo(node, serv, hints, &_ai_res);
33         if (ret) {
34                 printf("%s: GAI failed, %d, %d %s\n", info, ret, errno, errstr());
35         } else {
36                 print_gai(_ai_res, info);
37                 freeaddrinfo(_ai_res);
38         }
39 }
40
41 int main(int argc, char **argv)
42 {
43         char name[100];
44         char serv[100];
45
46         struct addrinfo hints = {0};
47
48         test_gai("10.0.2.1", "80", 0, "IP and 80");
49
50         test_gai("10.0.2.1.dicks", "80", 0, "Non-number name");
51
52         test_gai("10.0.2.2", "http", 0, "http serv");
53
54         hints.ai_family = AF_UNSPEC;
55         hints.ai_socktype = SOCK_DGRAM;
56         hints.ai_protocol = 0;
57         test_gai("10.0.2.3", "12345", &hints, "SOCK_DGRAM");
58
59         hints.ai_family = AF_UNSPEC;
60         hints.ai_socktype = SOCK_RAW;
61         hints.ai_protocol = 0;
62         test_gai("10.0.2.3", "12345", &hints, "SOCK_RAW");
63
64         hints.ai_family = AF_UNSPEC;
65         hints.ai_socktype = 0;
66         hints.ai_protocol = IPPROTO_ICMP;
67         test_gai("10.0.2.3", "12345", &hints, "ICMP");
68
69         hints.ai_family = AF_UNSPEC;
70         hints.ai_socktype = SOCK_DGRAM;
71         hints.ai_protocol = IPPROTO_TCP;
72         test_gai("10.0.2.3", "12345", &hints, "Impossible hint");
73 }