DNS

djbdns

#include <djbdns/dns.h>
void dns_random_init(const char seed[128]);
int dns_ip4(stralloc *out, const stralloc *fqdn);
int dns_name4(stralloc *out, const char ip[4]);
int dns_mx(stralloc *out, const stralloc *fqdn);

djbdnsに含まれているライブラリです。Debianならlibdjbdns1-devというパッケージになっています。
このライブラリでは、文字列の受け渡しにstrallocという構造体を使います。strallocの使い方については、strallocの項を御覧下さい。

void dns_random_init(const char seed[128]);

乱数生成機を初期化します。パケット盗聴から守るために必要です。

int dns_ip4(stralloc *out, const stralloc *fqdn);

fqdnに対応するIPアドレスをoutに格納します。各IPアドレスは4バイトのデータになっており、繋がった状態で格納されます。
成功すると0、失敗すると-1を返します。

int dns_name4(stralloc *out, const char ip[4]);

ipで渡されたIPアドレスに対応するホスト名をoutに格納します。
成功すると0、失敗すると-1を返します。

int dns_mx(stralloc *out, const stralloc *fqdn);

fqdnのMXレコードをoutに格納します。格納される形式は次のようになります。

優先度(2byte) + ホスト名 + \0 + 優先度(2byte) + ホスト名 + \0 + ...

成功すると0、失敗すると-1を返します。

使い方

gmail.com」のIPアドレスを得る

#include <djbdns/dns.h>
#include <stdio.h>

void print_ips(unsigned char *ips,unsigned int len);

int main() {
  char seed[128];
  stralloc domain={0},ips={0};

  dns_random_init(seed);
  stralloc_copys(&domain,"gmail.com");
  dns_ip4(&ips,&domain);
  print_ips((unsigned char*)ips.s,ips.len);
  return 0;
}

void print_ips(unsigned char *ips,unsigned int len) {
  int i;

  for (i=0;i<len;i+=4) {
    printf("%u.%u.%u.%u\n",ips[i],ips[i+1],ips[i+2],ips[i+3]);
  }
}
コンパイル

プログラムが書かれたファイル名をtest.cとします。

gcc -ldjbdns test.c
実行結果

gmail.com」のIPアドレス(IPアドレスは変わる可能性があります)

74.125.127.83
209.85.225.83
74.125.79.83


「209.191.93.53」のホスト名を得る

#include <djbdns/dns.h>
#include <stdio.h>

int main() {
  char ip[4]={209,191,93,53},seed[128];
  stralloc domain={0};

  dns_random_init(seed);
  dns_name4(&domain,ip);
  stralloc_append(&domain,"");
  printf("%s\n",domain.s);
  return 0;
}
コンパイル

プログラムが書かれたファイル名をtest.cとします。

gcc -ldjbdns test.c
実行結果

「209.191.93.53」のホスト名(ホスト名は変わる可能性があります)

b1.www.vip.mud.yahoo.com

gmail.com」のMXレコードを得る

#include <djbdns/dns.h>
#include <stdio.h>

int main() {
  char seed[128];
  int i;
  stralloc domain={0},mxs={0};

  dns_random_init(seed);
  stralloc_copys(&domain,"gmail.com");
  dns_mx(&mxs,&domain);
  for (i=0;i<mxs.len;i++) {
    unsigned int mx;

    mx=(unsigned char)mxs.s[i++];
    mx<<=8;
    mx+=(unsigned char)mxs.s[i++];
    printf("%u ",mx);
    for (;mxs.s[i]!='\0';i++) putchar(mxs.s[i]);
    putchar('\n');
  }
  return 0;
}
コンパイル

プログラムが書かれたファイル名をtest.cとします。

gcc -ldjbdns test.c
実行結果

gmail.com」のMXレコード(MXレコードは変わる可能性があります)

5 gmail-smtp-in.l.google.com
20 alt2.gmail-smtp-in.l.google.com
30 alt3.gmail-smtp-in.l.google.com
10 alt1.gmail-smtp-in.l.google.com
40 alt4.gmail-smtp-in.l.google.com