«前の日記(2004年01月20日) 最新 次の日記(2004年01月22日)» 編集

Matzにっき


2004年01月21日 [長年日記]

_ [Ruby]getaddrinfo(その4)

「通常のホスト名からも数値的なホスト名からも、区別なくホスト情報(hostent)を得たい」というのはちょっと変ですか。 もともとIPv6 safeで通常のホスト名からも数値的なホスト名も区別しないgethostbyname(3)が欲しいだけなんですが、 それってそんなに変な要求なのでしょうか。

念のためですが、欲しいのはhostentであって、かならずしも逆引きして欲しいわけではないです。 よって、ゆうぞうさんのパッチは やりすぎのような気がします。

問題にしているのはman getaddrinfo(3)に

The nodename and servname arguments are pointers to null-terminated strings or NULL. One or both of these two arguments must be a non-NULL pointer.

とあり、

If the AI_CANONNAME bit is set in the ai_flags member of the hints struc- ture, then upon successful return the ai_canonname member of the first addrinfo structure in the linked list will point to a null-terminated string containing the canonical name of the specified nodename.

としか書いてないのにai_canonnameがNULLというのはどういうことか、使いにくいじゃないか、という点だけです。 しかもservnameを指定するとちゃんと逆引きしてai_canonnameを与えてくれるのに。 RFCを読めばちゃんと書いてあるのかしら。

_ [Ruby]getaddrinfo(その5)

servnameを指定するとちゃんと逆引きして」というのは勘違いでした。 RubyのSocket#getaddrinfoメソッドは確かにそうなんですけど、 内部でgetnameinfoを呼んで明示的に逆引きしてました。

で、結論としては

if the canonical name is not available, then ai_canonname shall refer to the nodename argument or a string with the same contents.

ということであれば、τ森さんや曽田さんのおっしゃる通り 「getaddrinfo(3) が成功して、かつ ai_canonname がNULLなら元の文字列(のコピー)を使う」 という線で行こうと思います。

情報提供してくださった皆さん、どうもありがとうございました。


«前の日記(2004年01月20日) 最新 次の日記(2004年01月22日)» 編集