initial
authorHeiko Schlittermann (JUMPER) <hs@schlittermann.de>
Thu, 21 Jun 2012 23:12:08 +0200
changeset 0 760168a444e2
child 1 43dd6dcf5860
initial
Makefile
gai.c
--- /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;
+
+}