Manpages

名 前

getnameinfo − ア ド レ ス か ら 名 前 へ の 変 換 を プ ロ ト コ ル に 依 存 し な い か た ち で 行 う

書 式

#include <sys/socket.h>
#include <netdb.h>

int getnameinfo(const struct sockaddr *sa, socklen_t salen,
char *
host, socklen_t hostlen,
char *
serv, socklen_t servlen, int flags);

glibc 向 け の 機 能 検 査 マ ク ロ の 要 件 (feature_test_macros(7) 参 照 ):

getnameinfo(): _POSIX_C_SOURCE >= 1 || _XOPEN_SOURCE || _POSIX_SOURCE

説 明

getnameinfo() 関 数 は 、 getaddrinfo(3) の 逆 の 動 作 を 行 う 。 つ ま り 、 プ ロ ト コ ル に 依 存 し な い か た ち で ソ ケ ッ ト ア ド レ ス か ら 対 応 す る ホ ス ト 名 と サ ー ビ ス へ の 変 換 を 行 う 。 こ の 関 数 は gethostbyaddr(3)getservbyport(3) の 機 能 を 一 つ に し た も の だ が 、 こ れ ら の 関 数 と 違 い 、 getnameinfo(3) は リ エ ン ト ラ ン ト で あ り 、 IPv4 と IPv6 の 差 分 に 依 存 し な い か た ち で プ ロ グ ラ ム を 書 く こ と が で き る 。

sa 引 き 数 は 、 IP ア ド レ ス と ポ ー ト 番 号 の 情 報 を 保 持 し て い る 汎 用 的 な ソ ケ ッ ト ア ド レ ス 構 造 体 (sockaddr_in 型 ま た は sockaddr_in6 型 ) へ の ポ イ ン タ ー で あ る 。 salensa の サ イ ズ で あ る 。 hostserv 引 き 数 は 、 (そ れ ぞ れ サ イ ズ が hostlenservlen の ) 呼 び 出 し 側 で 確 保 さ れ た バ ッ フ ァ ー へ の ポ イ ン タ ー で あ り 、 ホ ス ト 名 と サ ー ビ ス 名 を 含 む ヌ ル 終 端 さ れ た 文 字 列 が そ れ ぞ れ の バ ッ フ ァ ー に 格 納 さ れ る 。 ホ ス ト 名 が 不 要 で あ る こ と を こ の 関 数 に 伝 え る に は 、 host に NULL を 指 定 す る か 、 hostlen に 0 を 指 定 す る 。 同 様 に 、 サ ー ビ ス 名 が 不 要 な 場 合 は 、 serv に NULL を 指 定 す る か 、 servlen に 0 を 指 定 す る 。 し か し 、 ホ ス ト 名 と サ ー ビ ス 名 の 両 方 を 不 要 だ と 指 定 す る こ と は で き な い (い ず れ か 一 方 は 要 求 す る こ と )。

flags 引 き 数 で getnameinfo() の 動 作 を 変 え る こ と が で き る 。 指 定 で き る 値 は 以 下 の 通 り :
NI_NAMEREQD
指 定 す る と 、 ホ ス ト 名 が 決 定 で き な か っ た 場 合 に エ ラ ー を 返 す 。
NI_DGRAM
指 定 す る と 、 ス ト リ ー ム ベ ー ス (TCP) で な く デ ー タ グ ラ ム ベ ー ス (UDP) の サ ー ビ ス を 対 象 に す る 。 数 は 少 な い が 、 UDP と TCP で 違 う サ ー ビ ス を 提 供 し て い る ポ ー ト (512−514) に 対 し て 必 要 と な る 。
NI_NOFQDN
指 定 す る と 、 ロ ー カ ル な ホ ス ト に は fully qualified domain name (FQDN) の ホ ス ト 名 の 部 分 の み を 返 す 。
NI_NUMERICHOST
指 定 す る と 、 数 値 形 式 の ホ ス ト 名 が 返 さ れ る 。 (指 定 し な く て も 、 ノ ー ド の 名 前 が 決 定 で き な い 場 合 は 数 値 形 式 が 返 る こ と が あ る )。
NI_NUMERICSERV
指 定 す る と 、 数 値 形 式 の サ ー ビ ス 名 (例 え ば ポ ー ト 番 号 ) が 返 さ れ る (指 定 し な く て も 、 サ ー ビ ス 名 が 決 定 で き な い 場 合 は 数 値 形 式 が 返 る こ と が あ る )。 国 際 化 ド メ イ ン 名 の た め の getnameinfo() の 拡 張
glibc 2.3.4 か ら 、 getnameinfo() に 拡 張 が 行 わ れ 、 ホ ス ト 名 と 国 際 化 ド メ イ ン 名 (Internationalized Domain Name; IDN) 形 式 と の 間 で 透 過 的 な 変 換 が で き る よ う に な っ て い る (IDN 形 式 に つ い て は RFC 3490 の Internationalizing Domain Names in Applications (IDNA) を 参 照 )。 3つ の フ ラ グ が 新 た に 定 義 さ れ て い る :

NI_IDN こ の フ ラ グ を 指 定 す る と 、 必 要 で あ れ ば 、 検 索 処 理 で 見 つ か っ た 名 前 は

IDN 形 式 か ら ロ ケ ー ル に 応 じ た 符 号 化 形 式 に 変 換 さ れ る 。 ASCII 文 字 だ け の 名 前 は こ の 変 換 で は 影 響 を 受 け な い 。 こ の た め 、 既 存 の プ ロ グ ラ ム や 環 境 で こ の フ ラ グ を 使 う こ と が で き る 。
NI_IDN_ALLOW_UNASSIGNED
, NI_IDN_USE_STD3_ASCII_RULES こ れ ら の フ ラ グ を セ ッ ト す る と 、 IDNA 処 理 で 使 用 さ れ る フ ラ グ IDNA_ALLOW_UNASSIGNED (未 割 り 当 て の Unicode の コ ー ド ポ イ ン ト を 許 容 ) と IDNA_USE_STD3_ASCII_RULES (出 力 が STD3 準 拠 の ホ ス ト 名 か を チ ェ ッ ク す る ) が そ れ ぞ れ 有 効 に な る 。

返 り 値

成 功 す る と 0 が 返 り 、 (要 求 さ れ て い れ ば ) ノ ー ド と サ ー ビ ス の 名 前 が ヌ ル 終 端 さ れ た 文 字 列 の 形 式 で そ れ ぞ れ の 指 定 バ ッ フ ァ ー に 返 さ れ る (バ ッ フ ァ ー の 長 さ に あ う よ う に 縮 め ら れ る か も し れ な い )。 エ ラ ー の 場 合 は 、 以 下 の 0 以 外 の エ ラ ー コ ー ド が 返 さ れ る :

EAI_AGAIN 指 定 さ れ た 名 前 が 現 時 点 で は 解 決 で き な か っ た 。 後 で 再 試 行 し て み る こ と 。
EAI_BADFLAGS

flags 引 き 数 に 不 正 な 値 が 与 え ら れ た 。

EAI_FAIL 回 復 で き な い エ ラ ー が 発 生 し た 。
EAI_FAMILY
指 定 し た ア ド レ ス フ ァ ミ リ ー が 認 識 で き な か っ た 。 あ る い は ア ド レ ス の 長 さ が 指 定 さ れ た フ ァ ミ リ ー に 合 う も の で な か っ た 。
EAI_MEMORY
メ モ リ ー が 足 り な い 。
EAI_NONAME
与 え ら れ た パ ラ メ ー タ ー で は 名 前 が 解 決 で き な い 。 NI_NAMEREQD が 設 定 さ れ て い た が ホ ス ト 名 が 決 定 で き な か っ た か 、 ホ ス ト 名 も サ ー ビ ス 名 も 要 求 さ れ な か っ た 。
EAI_OVERFLOW

host ま た は serv が 指 し て い る バ ッ フ ァ ー が 小 さ す ぎ た 。

EAI_SYSTEM シ ス テ ム エ ラ ー が 起 っ た 。 エ ラ ー コ ー ド は errno に 設 定 さ れ る 。

gai_strerror(3) 関 数 を 使 う と 、 こ れ ら の エ ラ ー コ ー ド を 、 エ ラ ー レ ポ ー ト に 適 し た 人 間 が 読 み や す い 文 字 列 に 翻 訳 し て く れ る 。

フ ァ イ ル

/etc/hosts
/etc/nsswitch.conf
/etc/resolv.conf

バ ー ジ ョ ン

getnameinfo() は 、 glibc バ ー ジ ョ ン 2.1 以 降 で 提 供 さ れ て い る 。

準 拠

RFC 2553, POSIX.1−2001.

注 意

適 切 な バ ッ フ ァ ー サ イ ズ を 選 択 で き る よ う に 、 <netdb.h> に 以 下 の 定 数 が 定 義 さ れ て い る 。

#define NI_MAXHOST 1025
#define NI_MAXSERV 32

glibc 2.8 以 降 で は 、 機 能 検 査 マ ク ロ _BSD_SOURCE, _SVID_SOURCE, _GNU_SOURCE の い ず れ か が 定 義 さ れ た 場 合 に の み 、 こ れ ら の 定 義 が 公 開 さ れ る 。 前 者 は 、 最 近 の バ ー ジ ョ ン の BIND の ヘ ッ ダ ー フ ァ イ ル <arpa/nameser.h> 中 の 定 数 MAXDNAME と 同 じ 値 で あ る 。 後 者 は 、 割 り 当 て 済 の 数 値 に つ い て 記 し た 現 在 の RFC に 列 挙 さ れ て サ ー ビ ス か ら 推 量 し た 値 で あ る 。

glibc バ ー ジ ョ ン 2.2 よ り 前 で は 、 引 き 数 hostlen, servlen の 型 は size_t で あ っ た 。

以 下 の コ ー ド は 、 指 定 さ れ た ソ ケ ッ ト ア ド レ ス に 対 す る ホ ス ト と サ ー ビ ス の 数 値 表 式 を 取 得 し よ う と 試 み る 。 特 定 の ア ド レ ス フ ァ ミ リ ー に 対 す る 参 照 情 報 は 一 切 ハ ー ド コ ー ド さ れ て い な い こ と に 着 目 し て ほ し い 。

struct sockaddr *sa; /* input */
socklen_t len; /* input */
char hbuf[NI_MAXHOST], sbuf[NI_MAXSERV];

if (getnameinfo(sa, len, hbuf, sizeof(hbuf), sbuf,
sizeof(sbuf), NI_NUMERICHOST | NI_NUMERICSERV) == 0)
printf("host=%s, serv=%s\n", hbuf, sbuf); 以 下 で は ソ ケ ッ ト ア ド レ ス に 逆 向 き の ア ド レ ス マ ッ ピ ン グ が 存 在 す る か を チ ェ ッ ク し て い る 。

struct sockaddr *sa; /* input */
socklen_t len; /* input */
char hbuf[NI_MAXHOST];

if (getnameinfo(sa, len, hbuf, sizeof(hbuf),
NULL, 0, NI_NAMEREQD))
printf("could not resolve hostname");
else
printf("host=%s\n", hbuf);

getnameinfo() を 使 っ た プ ロ グ ラ ム 例 が getaddrinfo(3) に 記 載 さ れ て い る 。

関 連 項 目

accept(2), getpeername(2), getsockname(2), recvfrom(2), socket(2), getaddrinfo(3), gethostbyaddr(3), getservbyname(3), getservbyport(3), inet_ntop(3), hosts(5), services(5), hostname(7), named(8)

R. Gilligan, S. Thomson, J. Bound and W. Stevens, Basic Socket Interface Extensions for IPv6, RFC 2553, March 1999.

Tatsuya Jinmei and Atsushi Onoe, An Extension of Format for IPv6 Scoped Addresses, internet draft, work in progress ftp://ftp.ietf.org/internet-drafts/draft-ietf-ipngwg-scopedaddr-format-02.txt">ftp://ftp.ietf.org/internet-drafts/draft-ietf-ipngwg-scopedaddr-format-02.txt.

Craig Metz, Protocol Independence Using the Sockets API, Proceedings of the freenix track: 2000 USENIX annual technical conference, June 2000 http://www.usenix.org/publications/library/proceedings/usenix2000/freenix/metzprotocol.html">http://www.usenix.org/publications/library/proceedings/usenix2000/freenix/metzprotocol.html.

こ の 文 書 に つ い て

こ の man ペ ー ジ は Linux man−pages プ ロ ジ ェ ク ト の リ リ ー ス 3.79 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は http://www.kernel.org/doc/man−pages/ に 書 か れ て い る 。