RubyのSocket#gethostbyaddr()がおかしいようです。
Cでのgethostbyaddr()の使われ方を『プログラミングLinux』(M.K.Johnson他、
アスキー)から抜粋すると:
int main(int argc, char *argv[])
{
struct hostent *answer;
struct in_addr address;
if (inet_aton(argv[1], &address)) {
answer = gethostbyaddr((char*)&address, sizeof(address), AF_INET);
} else {
...
となっています。この本によると、Cのgethostbyaddr()への第1引数は、
(char *)になってますが、実際には(in_addrの先頭に収められている)
アドレスのバイナリ表現なんだそうです。
もう1つ。
#!/usr/local/bin/ruby
require "socket"
print IPsocket.getaddress(ARGV[0]), "\n"
このコードを`socket.rb'(笑)に保存して実行すると、スタック_オーバー
フローを起こしました。いわれてみれば当り前なんですけど、ちょっと腑に
落ちません。
$RUBYLIBは設定していないのですが、$:を見ると、次のようになってます:
/usr/local/lib/ruby
/usr/local/lib/ruby/site-ruby
/usr/local/lib/ruby/site_ruby/i486-linux
/usr/local/lib/ruby/site_ruby
/usr/local/lib/ruby/i486-linux
/usr/local/lib/ruby
.
で、socketライブラリの実体であるsocket.soは:
/usr/local/lib/ruby/i486-linux
にあります。ということは、requireでの検索順序は、最後の要素であるカレ
ント_ディレクトリから始まっているんでしょうか?
越水 (greentea / fa2.so-net.ne.jp)