RESOLVER(3)

名称
res_query, res_search, res_mkquery, res_send, res_init, dn_comp, dn_expand - リゾルバルーチン

ライブラリ
libc

書式
#include <sys/types.h> #include <netinet/in.h> #include <arpa/nameser.h> #include <resolv.h> int res_query(const char *dname, int class, int type, u_char *answer, int anslen) int res_search(const char *dname, int class, int type, u_char *answer, int anslen) int res_mkquery(int op, const char *dname, int class, int type, const u_char *data, int datalen, const u_char *newrr_in, u_char *buf, int buflen) int res_send(const u_char *msg, int msglen, u_char *answer, int anslen) int res_init() dn_comp(const char *exp_dn, u_char *comp_dn, int length, u_char **dnptrs, u_char **lastdnptr) int dn_expand(const u_char *msg, const u_char *eomorig, const u_char *comp_dn, char *exp_dn, int length)

解説
これらのルーチンは、インターネットドメインネームサーバを使用し、 問い合わせと応答メッセージの作成、送信、解釈を行います。

リゾルバルーチンが使用するグローバルな設定と状態の情報は、構造体 _res に保存されます。 ほとんどの値は、適切なデフォルト値になっているので無視できます。 _res.options に保存されるオプションは、 resolv.h で以下のように定義されています。 オプションは、有効なオプションのビット論理和をとった、 単純なビットマスクとして保存されています。

RES_INIT
    初期ネームサーバアドレスとデフォルトドメイン名が初期化されている場合は 真です ( res_init() が呼び出された場合など)。

RES_DEBUG
    デバッグメッセージを出力します。

RES_AAONLY
    信頼できる応答のみを受け入れます。 このオプションを使用した場合、信頼できる応答かエラーが見つかるまで res_send() を続ける必要があります。 現在のところ、これは実装されていません。

RES_USEVC
    UDP データグラムの代わりに TCP 接続を問い合わせに使用します。

RES_STAYOPEN
    RES_USEVC とともに使用し、問い合わせと問い合わせの間も TCP 接続を開いたままに保ちます。 多くの問い合わせを定期的に行うプログラムのみで便利です。 通常の使用には UDP を使うべきです。

RES_IGNTC
    現在は使用されません (トランケーションエラーを無視します、すなわち、 TCP で再試行しません)。

RES_RECURSE
    問い合わせの反復要求ビットを設定します。 これがデフォルトです ( res_send() は反復問い合わせを行なわず、ネームサーバが反復を処理することを期待します)。

RES_DEFNAMES
    設定すると、 res_search() がシングルコンポーネント名 (ドットを含まない名前) に デフォルトのドメイン名を追加するようになります。 このオプションはデフォルトで有効になっています。

RES_DNSRCH
    このオプションを設定すると、 res_search() が、現在のドメインと親ドメインでホスト名を検索するようになります。 hostname(7) を参照してください。 これは、標準ホスト検索ルーチン gethostbyname(3) によって使用されます。 このオプションはデフォルトで有効になっています。

NOALIASES
    このオプションは、 “HOSTALIASES” 環境変数によって制御されるユーザレベルのエイリアシング機能を無効にします。 ネットワークデーモンでは、このオプションを設定する必要があります。

RES_USE_INET6
    IPv6 のみのアプリケーションのサポートを有効にします。 IPv4 アドレスは IPv4 射影アドレスとして返されるようになります。 たとえば、 10.1.1.1 は ::ffff:10.1.1.1 のように返されます。 このオプションは、特定のカーネルコンフィグレーションの場合にだけ意味が あります。

RES_USE_EDNS0
    EDNS0 拡張の OPT pseudo-RR のサポートを有効にします。 このオプションにより、リゾルバコードは DNS 問い合わせに OPT pseudo-RR を 加えて、こちらの受け取りバッファの大きさを通知します。 このオプションにより、DNS サーバはデフォルトでない大きさの受け取りバッファを 利用できるので、より大きな応答を送ることができるようになります。 EDNS0 拡張されたDNS 問い合わせパケットは非 EDNS0 DNS サーバとは 互換性がありません。

res_init() ルーチンは、設定ファイルを読み込み (設定ファイルが存在する場合。 resolver(5) 参照)、デフォルトドメイン名、検索リスト、ローカルネームサーバの インターネットアドレスを入手します。 サーバが設定されていない場合は、リゾルバを実行しているホストが試されます。 現在のドメイン名は、設定ファイルで指定されていない場合、 ホスト名で定義されますが、環境変数 LOCALDOMAIN で上書きすることもできます。 検索リストをプロセスごとに上書きする場合は、 ブランクで区切られた複数のトークンをこの環境変数に含めます。 これは、設定ファイルの search コマンドに似ています。 別の環境変数 “RES_OPTIONS” を設定すれば、特定の内部リゾルバオプションを上書きできます。 内部リゾルバオプションは、上書きされなければ、 _res 構造体のフィールドを変更することで設定されるか、設定ファイルの options コマンドから継承されます。 “RES_OPTIONS” 環境変数のシンタックスについては、 resolver(5) を参照してください。 通常の場合、初期化は以下のルーチンを初めて呼び出したときに実行されます。

res_query() 関数は、サーバ問い合わせメカニズムのインタフェースを提供するもので、 問い合わせの作成、作成された問い合わせのローカルサーバへの送信、応答の待機、 応答の予備チェックを行います。 問い合わせは、完全な形でのドメイン名 dname に対する、指定された type と class の情報を要求します。 応答メッセージは answer バッファに残され、呼び出し側が指定する anslen の長さになっています。

res_search() ルーチンは、 res_query() と同じように問い合わせの作成と応答の待機を行いますが、それに加えて RES_DEFNAMES と RES_DNSRCH オプションによって制御されるデフォルトと検索規則も実装しています。 このルーチンは最初に成功した応答を返します。

残りのルーチンは、 res_query() が使用する低レベルルーチンです。 res_mkquery() 関数は、標準問い合わせメッセージを作成して buf に配置し、問い合わせのサイズを返します。 問い合わせが buflen より長い場合は -1 を返します。 問い合わせタイプ op は、通常の場合 QUERY ですが、 <arpa/nameser.h> で定義されているどの問い合わせタイプにもできます。 問い合わせのドメイン名は dname で指定します。 newrr は現在使用されていませんが、更新メッセージを作成するためのものです。

res_send() ルーチンは、事前フォーマット済み問い合わせを送信し、応答を返します。 RES_INIT が設定されていない場合は res_init() を呼び出します。 ローカルネームサーバへの問い合わせの送信、およびタイムアウトと 再試行の処理も行います。 応答メッセージの長さを返しますが、エラーがあった場合は -1 を返します。

dn_comp() 関数は、ドメイン名 exp_dn を圧縮し、 comp_dn に保存します。 圧縮された名前のサイズを返しますが、エラーがあった場合は -1 を返します。 comp_dn が指す配列のサイズは length で指定します。 圧縮の際、現在のメッセージでそれまでに圧縮された名前を指すポインタ dnptrs の配列を使用します。 最初のポインタはメッセージの最初を指し、リストは NULL で終わります。配列の制限は lastdnptr で指定します。 dn_comp() の副作用は、名前が圧縮されたときにメッセージに挿入されるラベルのポインタの リストが更新されることです。 dnptr が NULL である場合、名前は圧縮されません。 lastdnptr が NULL である場合、ラベルのリストは更新されません。

dn_expand() エントリは、圧縮されたドメイン名 comp_dn を完全なドメイン名に展開します。 圧縮された名前は、問い合わせもしくは応答メッセージに含まれます。 msg は、メッセージの最初を指すポインタです。 展開された名前は、 exp_dn が示すサイズ length のバッファに配置されます。 圧縮された名前のサイズが返されますが、 エラーがあった場合は -1 が返されます。

関連ファイル

/etc/resolv.conf
    設定ファイル。 resolver(5) を参照のこと。

関連項目
gethostbyname(3), resolver(5), hostname(7), named(8)

Name Server Operations Guide for BIND.

歴史
res_query() 関数は 4.3BSD で登場しました。