名 前
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 型 ) へ の ポ イ ン タ ー で あ る 。 salen は sa の サ イ ズ で あ る 。 host と serv 引 き 数 は 、 (そ れ ぞ れ サ イ ズ が hostlen と servlen の ) 呼 び 出 し 側 で 確 保 さ れ た バ ッ フ ァ ー へ の ポ イ ン タ ー で あ り 、 ホ ス ト 名 と サ ー ビ ス 名 を 含 む ヌ ル 終 端 さ れ た 文 字 列 が そ れ ぞ れ の バ ッ フ ァ ー に 格 納 さ れ る 。 ホ ス ト 名 が 不 要 で あ る こ と を こ の 関 数 に 伝 え る に は 、 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/ に 書 か れ て い る 。