#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():
herror(), hstrerror():
h_errno:
The gethostbyname() function returns a structure of type hostent for the given host name. Here name is either a hostname or an IPv4 address in standard dot notation (as for inet_addr(3)). If name is an IPv4 address, no lookup is performed and gethostbyname() simply copies name into the h_name field and its struct in_addr equivalent into the h_addr_list[0] field of the returned hostent structure. If name doesn't end in a dot and the environment variable HOSTALIASES is set, the alias file pointed to by HOSTALIASES will first be searched for name (see hostname(7) for the file format). The current domain and its parents are searched unless name ends in a dot.
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) を引数に取り、 対応するエラーメッセージ文字列を返す。
The domain name queries carried out by gethostbyname() and gethostbyaddr() rely on the Name Service Switch (nsswitch.conf(5)) configured sources or a local name server (named(8)). The default action is to query the Name Service Switch (nsswitch.conf(5)) configured sources, failing that, a local name server (named(8)).
In glibc 2.4 and earlier, the order keyword was used to control the order of host lookups as defined in /etc/host.conf (host.conf(5)).
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 構造体のメンバは以下の通り。
Interface | Attribute | Value |
gethostbyname() | Thread safety |
MT-Unsafe race:hostbyname env
locale |
gethostbyaddr() | Thread safety |
MT-Unsafe race:hostbyaddr env
locale |
sethostent(),
endhostent(), gethostent_r() | Thread safety |
MT-Unsafe race:hostent env
locale |
herror(),
hstrerror() | Thread safety | MT-Safe |
gethostent() | Thread safety |
MT-Unsafe race:hostent
race:hostentbuf env locale |
gethostbyname2() | Thread safety |
MT-Unsafe race:hostbyname2
env locale |
gethostbyaddr_r(), gethostbyname_r(), gethostbyname2_r() | Thread safety | MT-Safe env locale |
In the above table, hostent in race:hostent signifies that if any of the functions sethostent(), gethostent(), gethostent_r(), or endhostent() are used in parallel in different threads of a program, then data races could occur.
オリジナルの 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 に渡される。