EN JA
RESOLVER(3)
RESOLVER(3) FreeBSD Library Functions Manual RESOLVER(3)

名称

res_query, res_search, res_mkquery, res_send, res_init, dn_comp, dn_expand, dn_skipname, ns_get16, ns_get32, ns_put16, ns_put32リゾルバ (解決器) ルーチン

ライブラリ

Standard C Library (libc, -lc)

書式

#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( void);

int
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);

int
dn_skipname( const u_char *comp_dn, const u_char *eom);

u_int
ns_get16( const u_char *src);

u_long
ns_get32( const u_char *src);

void
ns_put16( u_int src, u_char *dst);

void
ns_put32( u_long src, u_char *dst);

解説

これらのルーチンは、クエリ (問い合わせ) の作成、送信、解釈を行い、インターネットドメインネームサーバを使ってメッセージを返答します。

リゾルバ (解決器) ルーチンで使用されるグローバルな設定と状態の情報は、構造体 _res で維持されます。ほとんどの値は、適切なデフォルトになっており、無視できます。 _res.options に格納されるオプションは、 < resolv.h> で定義され、次のようになっています。オプションは、有効なオプションのビット論理和 ``or'' を含んた単純なビットマスクとして格納されます。

RES_INIT
初期ネームサーバアドレスとデフォルトドメイン名が初期化 (すなわち、 res_init() が呼び出されました) される場合は真です。
RES_DEBUG
デバッグメッセージをプリントします。
RES_AAONLY
信頼できる応答のみを受け入れます。このオプションでは、信頼できる応答が見つかるかエラーが見つかるまで res_send() を続けなければなりません。現在、これは実装されていません。
RES_USEVC
UDP データグラムの代わりに TCP 接続をクエリ (問い合わせ) のために使用します。
RES_STAYOPEN
クエリ (問い合わせ) の間に TCP 接続をオープンしたままにするために、 RES_USEVC を使用します。これは多くのクエリ (問い合わせ) を定期的に行うプログラムのみで便利です。 UDP は通常モードを使用すべきです。
RES_IGNTC
現在は使用されません (切り捨てエラーを無視します、すなわち、 TCP で再試行しません)。
RES_RECURSE
クエリ (問い合わせ) に反復要望ビットを設定します。これはデフォルトです。 ( res_send() は反復クエリ (問い合わせ) を行なわず、ネームサーバが反復を取り扱うことを予期します)。
RES_DEFNAMES
設定されたなら、 res_search() は、(ドットを含まない) 単一コンポーネント名にデフォルトドメイン名を追加するでしょう。このオプションはデフォルトで有効になります。
RES_DNSRCH
このオプションを設定すると、 res_search() は、現在のドメインと親ドメインでホスト名を検索するでしょう。 hostname(7) を参照してください。これは、標準ホスト検索ルーチン gethostbyname(3) によって使用されます。このオプションはデフォルトで有効になります。
RES_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) で説明されます。通常、初期化は次のルーチンの 1 つをはじめて呼び出したときに生じます。

res_query() 関数は、サーバクエリ (問い合わせ) メカニズムのインタフェースを提供します。それは、クエリ (問い合わせ) を構築し、ローカルサーバへそれを送り、応答を待ち、応答の予備チェックを行います。クエリ (問い合わせ) は、指定された type と指定された完全な形でのドメイン名 dname のための class の情報を要求します。応答メッセージは、呼び出し側で供給された、長さ anslenanswer バッファに残されます。

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

残りのルーチンは、 res_query() で使用される低レベルルーチンです。 res_mkquery() 関数は、標準クエリ (問い合わせ) メッセージを構築し、 buf にそれを置きます。それはクエリ (問い合わせ) のサイズを返すか、クエリが buflen より大きい場合は -1 を返します。クエリ (問い合わせ) タイプ op は、通常 QUERY ですが、 < arpa/nameser.h> で定義されたクエリ (問い合わせ) タイプのいずれかでもありえます。クエリ (問い合わせ) のためのドメイン名は dname によって与えられます。 newrr_in 引数は現在使用されていませんが、更新メッセージを作成するためのものです。

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

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

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

dn_skipname() 関数は、 comp_dn よって指される位置で始まる、圧縮されたドメイン名をスキップします。圧縮された名前は問い合わせか返信メッセージに含まれています。 eom はメッセージの終わりへのポインタです。圧縮された名前のサイズが返されるか、またはエラーがあったなら-1 が返されます。

ns_get16() 関数は src によって指されたたバッファから 16 ビットの量を取得します。

ns_get32() 関数は src によって指されたバッファから 32 ビットの量を取得します。

ns_put16() 関数は dst によって指されたバッファへ 16 ビットの量の src を置きます。

ns_put32() 関数は dst によって指されたバッファへ 32 ビットの量の src を置きます。

実装に関する注

レゾルバ (解決器) のこの実現はスレッドセーフですが、プログラマが、そのマクロによって参照されたスレッド毎のバージョンを置き換える試みで、プログラマ自身で _res 構造体の宣言を試みると、それは適切に機能しません。

必要なときに、レゾルバルーチンのデフォルトの振る舞いを変更するために次のコンパイル時オプションを指定することができます。

RES_ENFORCE_RFC1034
このシンボルがコンパイル時に定義されているなら、 res_search() は、RFC 1034 チェックを実行します。すなわち、ホスト名に下線文字の使用を認めません。これは、 gethostbyname(3) のような標準のホスト検索ルーチンで使用されます。互換性の理由で、このオプションは、デフォルトで有効にされていません。

戻り値

res_init() 関数は成功すれば 0 を返し、スレッド毎の領域が割り付けられなかった場合、スレッドプログラムで-1 を返します。

res_mkquery(), res_search() と res_query() 関数は、成功すれば応答のサイズを返すか、またはエラーが発生するなら、-1 を返します。整数 h_errno は、エラーの理由を決定するためにチェックできます。詳細については、 gethostbyname(3) を参照してください。

関連ファイル

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

関連項目

gethostbyname(3), resolver(5), hostname(7), named(8)

RFC1032, RFC1033, RFC1034, RFC1035, RFC974 Name Server Operations Guide for BIND.

歴史

res_query 関数は、 4.3BSD で登場しました。
May 29, 2009 FreeBSD