5 #include <sys/socket.h>
6 #include <netinet/in.h>
8 #define satosin(x) ((struct sockaddr_in *) &(x))
9 #define SOCKADDR(x) (satosin(x)->sin_addr.s_addr)
10 #define SOCKADDR_2(x) (satosin(x)->sin_addr)
11 #define SOCKPORT(x) (satosin(x)->sin_port)
12 #define SOCKFAMILY(x) (satosin(x)->sin_family)
14 #define ASSERT(X) { if(!(X)) printf("ASSERTION FAILED: %s @%s:%d\n", # X, __FILE__, __LINE__); }
15 #define CLR() { hbuf[0] = 0; sbuf[0] = 0; }
18 struct sockaddr_in a
= {0}, *sa
= &a
;
19 char hbuf
[NI_MAXHOST
], sbuf
[NI_MAXSERV
];
20 a
.sin_port
= htons(80);
21 memcpy( &a
.sin_addr
, (char[]) {127,0,0,1}, 4);
25 if ((ret
= getnameinfo((void*)sa
, 0, hbuf
, sizeof(hbuf
), sbuf
,
26 sizeof(sbuf
), NI_NUMERICHOST
| NI_NUMERICSERV
)) == 0)
27 printf("host=%s, serv=%s\n", hbuf
, sbuf
);
29 printf("%s\n", gai_strerror(ret
));
31 ASSERT(ret
== EAI_FAMILY
);
34 if ((ret
= getnameinfo((void*)sa
, sizeof a
, hbuf
, sizeof(hbuf
), sbuf
,
35 sizeof(sbuf
), NI_NUMERICHOST
| NI_NUMERICSERV
)) == 0)
36 printf("host=%s, serv=%s\n", hbuf
, sbuf
);
38 printf("%s\n", gai_strerror(ret
));
40 ASSERT(ret
== EAI_FAMILY
);
43 SOCKFAMILY(a
) = AF_INET
;
45 if ((ret
= getnameinfo((void*)sa
, sizeof a
, hbuf
, 1, sbuf
,
46 sizeof(sbuf
), NI_NUMERICHOST
| NI_NUMERICSERV
)) == 0)
47 printf("host=%s, serv=%s\n", hbuf
, sbuf
);
49 printf("%s\n", gai_strerror(ret
));
51 ASSERT(ret
== EAI_OVERFLOW
);
54 if ((ret
= getnameinfo((void*)sa
, sizeof a
, hbuf
, 0, sbuf
,
55 1, NI_NUMERICHOST
| NI_NUMERICSERV
)) == 0)
56 printf("host=%s, serv=%s\n", hbuf
, sbuf
);
58 printf("%s\n", gai_strerror(ret
));
60 ASSERT(ret
== EAI_OVERFLOW
);
63 if ((ret
= getnameinfo((void*)sa
, sizeof(a
) - 1, hbuf
, 0, sbuf
,
64 sizeof(sbuf
), NI_NUMERICHOST
| NI_NUMERICSERV
)) == 0)
65 printf("host=%s, serv=%s\n", hbuf
, sbuf
);
67 printf("%s\n", gai_strerror(ret
));
69 ASSERT(ret
== EAI_FAMILY
);
72 if ((ret
= getnameinfo((void*)sa
, sizeof a
, hbuf
, 0, sbuf
,
73 sizeof(sbuf
), NI_NUMERICHOST
| NI_NUMERICSERV
)) == 0)
74 printf("host=%s, serv=%s\n", hbuf
, sbuf
);
76 printf("%s\n", gai_strerror(ret
));
78 ASSERT(ret
== 0 && !strcmp("80", sbuf
));
81 if ((ret
= getnameinfo((void*)sa
, sizeof a
, hbuf
, sizeof hbuf
, sbuf
,
82 0, NI_NUMERICHOST
| NI_NUMERICSERV
)) == 0)
83 printf("host=%s, serv=%s\n", hbuf
, sbuf
);
85 printf("%s\n", gai_strerror(ret
));
87 ASSERT(ret
== 0 && !strcmp("127.0.0.1",hbuf
));
91 if ((ret
= getnameinfo((void*)sa
, sizeof a
, hbuf
, sizeof(hbuf
), sbuf
,
92 sizeof(sbuf
), NI_NUMERICHOST
| NI_NUMERICSERV
)) == 0)
93 printf("host=%s, serv=%s\n", hbuf
, sbuf
);
95 printf("%s\n", gai_strerror(ret
));
97 ASSERT(ret
== 0 && !strcmp("127.0.0.1",hbuf
) && !strcmp("80", sbuf
));
100 struct sockaddr_in6 b
= {0}, *sb
= &b
;
101 b
.sin6_port
= htons(8080);
102 b
.sin6_family
= AF_INET6
;
104 memcpy(&b
.sin6_addr
,"\0\0\0\0\0\0\0\0\0\0\xff\xff\xc0\xa8\1\2", 16);
106 if ((ret
= getnameinfo((void*)sb
, sizeof b
, hbuf
, sizeof(hbuf
), sbuf
,
107 sizeof(sbuf
), NI_NUMERICHOST
| NI_NUMERICSERV
)) == 0)
108 printf("host=%s, serv=%s\n", hbuf
, sbuf
);
110 printf("%s\n", gai_strerror(ret
));
112 ASSERT(ret
== 0 && !strcmp("192.168.1.2",hbuf
) && !strcmp("8080", sbuf
));
116 memcpy(&b
.sin6_addr
,"\0\0\xaa\0\0\0\0\0\0\0\0\xff\xc0\xa8\1\2", 16);
118 if ((ret
= getnameinfo((void*)sb
, sizeof b
, hbuf
, sizeof(hbuf
), sbuf
,
119 sizeof(sbuf
), NI_NUMERICHOST
| NI_NUMERICSERV
| NI_NUMERICSCOPE
)) == 0)
120 printf("host=%s, serv=%s\n", hbuf
, sbuf
);
122 printf("%s\n", gai_strerror(ret
));
128 memcpy(&b
.sin6_addr
,"\0\0\0\0" "\0\0\0\0" "\0\0\0\0" "\0\0\0\1", 16);
130 if ((ret
= getnameinfo((void*)sb
, sizeof b
, hbuf
, sizeof(hbuf
), NULL
,
131 0, NI_NUMERICHOST
)) == 0)
132 printf("host=%s\n", hbuf
);
134 printf("%s\n", gai_strerror(ret
));