res_init, res_query, res_search, res_querydomain, res_mkquery, res_send,
dn_comp, dn_expand -
レゾルバルーチン
#include <netinet/in.h>
#include <arpa/nameser.h>
#include <resolv.h>
extern struct __res_state _res;
int res_init(void);
int res_query(const char *dname, int class, int type,
unsigned char *answer, int anslen);
int res_search(const char *dname, int class, int type,
unsigned char *answer, int anslen);
int res_querydomain(const char *name, const char *domain,
int class, int type, unsigned char *answer,
int anslen);
int res_mkquery(int op, const char *dname, int class,
int type, const unsigned char *data, int datalen,
const unsigned char *newrr, unsigned char *buf, int buflen);
int res_send(const unsigned char *msg, int msglen,
unsigned char *answer, int anslen);
int dn_comp(const char *exp_dn, unsigned char *comp_dn,
int length, unsigned char **dnptrs, unsigned char **lastdnptr);
int dn_expand(const unsigned char *msg, const unsigned char *eomorig,
const unsigned char *comp_dn, char *exp_dn,
int length);
-lresolv でリンクする。
これらの関数はインターネットのドメインネームサーバーに問い合わせ、
その応答を解釈する。
res_init()
関数は、デフォルトのドメイン名、検索順、ネームサーバー
アドレスを得るために設定ファイル
(
resolv.conf(5) 参照) を読む。
もしサーバーが示されていなければローカルホストを試す。
ドメインが示されていなければローカルホストに付けられたドメインを用いる。
環境変数
LOCALDOMAIN
でオーバーライドできる。
res_init()
は、後述する関数のどれかが最初に呼び出された時、その関数
から実行される。
res_query()
関数は、指定された
type と
class の
完全修飾ドメイン名
(FQDN)
name
を、ネームサーバーへ問い合わせる。
応答は、呼び出した側によって用意される長さ
anslen の
answer
バッファーに残される。
res_search()
関数は、問い合わせを行い
res_query() 同様その応答を
待つが、さらにデフォルトを実装しており
RES_DEFNAMES と
RES_DNSRCH
によって規定される検索ルールを適用する。
(下記
_res
オプションの説明を参照)
res_querydomain() 関数は
name と
domain の結合に
res_query()
を用いて問い合わせを行う。
次の関数は、
res_query()
で使われる下位ルーチンである。
res_mkquery()
関数は、ドメイン名
dname の為に、長さ
buflen
の
buf
に問い合わせるメッセージを作成する。
問い合わせの型
op
は通常
QUERY だが、
<arpa/nameser.h>
で定義された型のどれでも良い。
newrr
は現在使用されていない。
res_send() 関数は、長さ
msglen
の
msg
に決められた書式
で問い合わせ、
answer
に長さ
anslen
の回答を返す。
まだ呼び出されていなければ
res_init() を呼び出す。
dn_comp()
関数はドメイン名
exp_dn
を圧縮して、長さ
length
のバッファー
comp_dn
に保存する。
圧縮にはポインター配列
dnptrs を用いる。
これらのポインターは、現在のメッセージの中にある以前に圧縮された名前を指す。
最初のポインターはメッセージの冒頭を指し、そのリストは
NULL で終わる。
配列の範囲は
lastdnptr
で決められる。
dnptr が
NULL
ならばドメイン名は圧縮されない。
lastdnptr が NULL
ならば、そのラベルのリストはアップデートされない。
dn_expand()
関数は、圧縮されたドメイン名
comp_dn からサイズ が
length
の
exp_dn
バッファーに正式なドメイン名を展開する。
その圧縮された名前は、問い合わせ、または応答メッセージに含まれていて、
msg
がメッセージの冒頭を指す。
レゾルバルーチンは、
<resolv.h> に定義された
_res 構造体に
含まれている全体的な設定と状態の情報を使用する。
通常ユーザーに操作できる項目は
_res.options だけである。
この項目は以下のオプションのビット単位の論理和にできる。
- RES_INIT
-
res_init()
が呼び出されていれば真。
- RES_DEBUG
- デバッグ情報を表示する。このオプションは、
glibc
がデバッグを有効にしてコンパイルされている場合にのみ利用できる。
デフォルトでは glibc
のデバッグは有効になっていない。
- RES_AAONLY
- 権威付けされた
(authoritative)
回答のみ受け入れる。
res_send()
は、最終的に権威付けされた回答を得られるか、エラーが返される
まで続行する。
[現在実装されていない]
- RES_USEVC
- 問い合わせに UDP
データグラムではなく
TCP 接続を用いる。
- RES_PRIMARY
- プライマリドメインネームサーバーのみ問い合わせる。
- RES_IGNTC
- 切り詰めエラー
(truncation error) を無視する。TCP
でリトライしない。
[現在実装されていない]
- RES_RECURSE
- 再帰要求 (recursion desired)
ビットを問い合わせに設定する。
再帰は res_send()
ではなくドメインネームサーバーによって行われる。
[デフォルトで有効]
- RES_DEFNAMES
- 設定されていれば、
res_search()
はデフォルトのドメイン名を一部分
のみからなる名前、すなわちドットを含まない名前に付け加える。
[デフォルトで有効]
- RES_STAYOPEN
- 問い合わせ中に
TCP 接続を保つため
RES_USEVC
と共に用いられる。
- RES_DNSRCH
- 設定されていれば、
res_search()
は現在のドメインおよび親ドメインの
ホスト名を探す。このオプションは
gethostbyname(3)
で用いられる。
[デフォルトで有効]
このリストは完全なものではない。
resolv.conf(5)
には他にいくつかのフラグが記載されている。
res_init()
関数は成功すれば 0
を、エラーが発生すれば
-1 を返す。
res_query(),
res_search(),
res_querydomain(),
res_mkquery(),
res_send()
関数は応答の長さを返す。
また、エラーが発生すれば
-1 を返す。
dn_comp() と
dn_expand()
関数は圧縮されたドメイン名の長さを返す。
また、エラーが発生すれば
-1 を返す。
/etc/resolv.conf レゾルバ設定ファイル
/etc/host.conf レゾルバ設定ファイル
4.3BSD.
gethostbyname(3),
resolv.conf(5),
resolver(5),
hostname(7),
named(8)
この man ページは Linux
man-pages
プロジェクトのリリース
3.79 の一部
である。プロジェクトの説明とバグ報告に関する情報は
http://www.kernel.org/doc/man-pages/
に書かれている。