#include <netdb.h> extern int h_errno; struct hostent *gethostbyname(const char *name); #include <sys/socket.h> /* AF_INET を使う場合 */ struct hostent *gethostbyaddr(const void *addr, socklen_t len, int type); void sethostent(int stayopen); void endhostent(void); void herror(const char *s); const char *hstrerror(int err); /* System V/POSIX 拡張 */
struct hostent *gethostent(void); /* GNU 拡張 */
struct hostent *gethostbyname2(const char *name, int af); int gethostent_r( struct hostent *ret, char *buf, size_t buflen, struct hostent **result, int *h_errnop); int gethostbyaddr_r(const void *addr, socklen_t len, int type, struct hostent *ret, char *buf, size_t buflen, struct hostent **result, int *h_errnop); int gethostbyname_r(const char *name, struct hostent *ret, char *buf, size_t buflen, struct hostent **result, int *h_errnop); int gethostbyname2_r(const char *name, int af, struct hostent *ret, char *buf, size_t buflen, struct hostent **result, int *h_errnop);
glibc 向けの機能検査マクロの要件 (feature_test_macros(7) 参照):
gethostbyname2(), gethostent_r(), gethostbyaddr_r(), gethostbyname_r(), gethostbyname2_r(): _BSD_SOURCE || _SVID_SOURCE
herror(), hstrerror() (glibc 2.8 以降): _BSD_SOURCE || _SVID_SOURCE || _GNU_SOURCE
gethostbyname() 関数は与えられたホスト名 name に対応する構造体 hostent を返す。 name にはホスト名、ドット区切りの IPv4 アドレス (inet_addr(3) 参照)、コロン区切りの IPv6 アドレス (おそらくドット区切りでも大丈夫) のいずれかを指定する (IPv6 アドレスの記述方法については RFC 1884 を参考にしてほしい)。 name が IPv4 か IPv6 のアドレスだった場合、 名前解決 (lookup) は行われない。その場合には、 gethostbyname() は name をそのまま hostent 構造体の h_name フィールドにコピーし、 さらに name を struct in_addr 形式で表したデータを hostent 構造体の h_addr_list[0] フィールドに入れて、その hostent 構造体を返す。 name がドットで終了していて、かつ環境変数 HOSTALIASES が設定されている場合、まず HOSTALIASES で指定されているエイリアスファイルから name のエントリが検索される (ファイルのフォーマットについては hostname(7) を参照のこと)。 name がドットで終了していなければ、現在のドメインとその親ドメインが検索される。
gethostbyaddr() 関数は与えられたホストアドレス addr (長さ len、 タイプ type) に対応する構造体 hostent を返す。 用いることのできるタイプは AF_INET と AF_INET6 である。 ホストアドレス引き数はアドレスタイプに依存した 構造体へのポインタである。 例えば、アドレスタイプ AF_INET に対しては (inet_addr(3) の呼び出しで得られる) struct in_addr * である。
sethostent() 関数は、ネームサーバへの接続形態を指定する。 stayopen が真 (1) ならば、ネームサーバへの問い合わせには、 接続された TCP ソケットを用い、連続した問い合わせの間に接続を維持する。 偽ならばネームサーバへの問い合わせに UDP データグラムを用いる。
endhostent() 関数はネームサーバへの問い合わせに用いた TCP 接続の利用を終了する。
(廃止予定の) herror() 関数は現在の h_errno に対応するエラーメッセージを標準エラー stderr に出力する。
(廃止予定の) hstrerror() 関数はエラー番号 (通常は h_errno) を引き数に取り、 対応するエラーメッセージ文字列を返す。
gethostbyname() と gethostbyaddr() によって実行されるドメイン名の問い合わせでは、ネームサーバ named(8)、 /etc/hosts のデータ行、および Network Information Service (NIS または YP) が組み合わせて使用される。何が使用されるかは、 /etc/host.conf の order 行の内容により決まる。 デフォルトでは、まず named(8) に問い合わせを行い、次いで /etc/hosts を参照する。
hostent 構造体は <netdb.h> で以下のように定義されている:
struct hostent { char *h_name; /* official name of host */ char **h_aliases; /* alias list */ int h_addrtype; /* host address type */ int h_length; /* length of address */ char **h_addr_list; /* list of addresses */ } #define h_addr h_addr_list[0] /* 過去との互換性のため */
hostent 構造体のメンバは以下の通り。
オリジナルの BSD の実装では、 gethostbyname() の len 引き数は int であった。 SUSv2 標準はバグが多く、 gethostbyaddr() の len パラメータを size_t 型として宣言している。 (これは誤りで、 size_t 型ではなく int 型でなければならない。 POSIX.1-2001 ではこれを socklen_t としているが、これは OK。) accept(2) も参照。
gethostbyaddr() の BSD のプロトタイプは、最初の引き数として const char * を使う。
glibc2 にはリエントラントな gethostent_r(), gethostbyaddr_r(), gethostbyname_r() と gethostbyname2_r() もある。 呼び出し側は、成功時に結果が格納される hostent 構造体 ret と、大きさ buflen の一時的な作業バッファ buf を提供する。 コール終了後、成功した場合 result は結果を指している。 エラーの場合、またはエントリが見つからなかった場合、 result は NULL になる。 これらの関数は、成功した場合 0 を返し、失敗の場合は 0 以外のエラー番号を返す。 これらの関数のリエントラントでないバージョンが返すエラーに加えて、 これらの関数は、 buf が小さすぎた場合に ERANGE を返す。この場合はもっと大きなバッファを用意して 関数呼び出しを再度行うべきである。 大域変数 h_errno は変更されないが、エラー番号を格納する変数のアドレスが h_errnop に渡される。