--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/Makefile Thu Jun 21 23:12:08 2012 +0200
@@ -0,0 +1,6 @@
+CFLAGS = -O2 -Wall
+
+.PHONY: all clean
+
+all: gai
+clean: ; rm -f *.o gai
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/gai.c Thu Jun 21 23:12:08 2012 +0200
@@ -0,0 +1,59 @@
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netdb.h>
+#include <arpa/inet.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+int main(int argc, char **argv)
+{
+ const char *node, *service, *proto;
+ struct addrinfo *r, *results;
+ struct addrinfo hints = { 0 };
+ int e;
+
+ if (argc < 2) {
+ fprintf(stderr, "Usage: %s hostname [service [protocol]]\n", argv[0]);
+ exit(1);
+ }
+
+ node = argc > 1 ? argv[1] : NULL;
+ service = argc > 2 ? argv[2] : NULL;
+ proto = argc > 3 ? argv[3] : NULL;
+
+ hints.ai_socktype = proto == NULL ? 0
+ : strcmp(proto, "tcp") == 0 ? SOCK_STREAM
+ : strcmp(proto, "udp") == 0 ? SOCK_DGRAM
+ : 0;
+
+ e = getaddrinfo(node, service, &hints, &results);
+
+ if (e) {
+ fprintf(stderr, "%s: %s\n", argv[0], gai_strerror(e));
+ exit(3);
+ }
+
+
+ for (r = results; r != 0; r = r->ai_next) {
+ char host[1024];
+ char service[1024];
+ int e;
+ e = getnameinfo(r->ai_addr, r->ai_addrlen,
+ host, sizeof(host),
+ service, sizeof(service),
+ NI_NUMERICHOST | NI_NUMERICSERV);
+
+ if (e) {
+ fprintf(stderr, "getnameinfo: %s\n", gai_strerror(e));
+ continue;
+ }
+
+ printf("%s, %s %d/%d\n", host, service, r->ai_socktype, r->ai_protocol);
+ }
+
+
+ return 0;
+
+}