Shammer's Philosophy

My private adversaria

nslookup sample C version

Shammerismの内容をベースに
C 言語版の簡易 nslookup を書いてみた。

#include <arpa/inet.h>
#include <err.h>
#include <netdb.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>

int main(int argc, char *args[]){
    if( argc == 2 ){
	// Local values
	struct addrinfo hints, *res, *res0;
	int error;
	char addrstr[100];
	void *ptr;

	// Reset hint
	memset(&hints, 0, sizeof(hints));
	hints.ai_family = PF_UNSPEC;
	hints.ai_socktype = SOCK_STREAM;

	// Get addrinfor and error check
	error = getaddrinfo(args[1], NULL, &hints, &res0);
	if (error) {
	    errx(1, "%s", gai_strerror(error));
	}

	// Display addrinfo contents
	int i = 0;
	for (res = res0 ; res ; res = res->ai_next) {
	    printf("Hostname %s 's IP address is :", args[1]);
	    switch(res->ai_family){
	    case AF_INET:
		ptr = &(((struct sockaddr_in *)res->ai_addr)->sin_addr);
		inet_ntop(res->ai_family, ptr, addrstr, sizeof(addrstr));
		printf("%s. (IPv4)\n", addrstr);
		break;
	    case AF_INET6:
		ptr = &(((struct sockaddr_in6 *)res->ai_addr)->sin6_addr);
		inet_ntop(res->ai_family, ptr, addrstr, sizeof(addrstr));
		printf("%s. (IPv6)\n", addrstr);
		break;
	    }
	    i++;
	}
	freeaddrinfo(res0);
    }
    else {
	printf("Usage: %s $HOST_NAME(not IP address)\n", args[0]);
    }
    return 0;
}

基本的に動作するのは確認できたが、DNS 登録されていない自身のホスト名とかを
指定しても loopback しか取得できなかった。でも名前解決できるホストなら
IP を取得できた。この実装はHTTP Client ver 0.1 - Shammerismに組み込むためのものだが、
その用途としては十分だろう。