抽象名前空間 - Rubyの場合
前回の続き。Rubyではどうやって抽象名前空間に接続するかという話。
RubyにはD-Busモジュールがあるので、てっきり普通に抽象名前空間で接続可能かとおもったら、
irb(main):002:0> require 'socket' => true irb(main):003:0> socket = Socket.new(Socket::Constants::PF_UNIX, Socket::Constants::SOCK_STREAM, 0) => #<Socket:0xb7c8d3d8> irb(main):004:0> socket.connect(Socket.pack_sockaddr_un("\0/tmp/dbus-WIZUTq6875")) ArgumentError: string contains null byte from (irb):4:in `pack_sockaddr_un' from (irb):4 from /usr/bin/irb1.9:12:in `<main>'
見事に失敗。(前回とパス名が違うのはPC再起動したから)
じゃあD-Busモジュールはどうやって接続してるのかとソースを眺めてみたら、なんとsockaddr_unに対応する文字列を直に作成してconnectに渡していた。
つまりこういうこと。
irb(main):005:0> socket.connect("\x1\0\0/tmp/dbus-WIZUTq6875") => 0 #接続成功
先頭の"\x1\0"は(リトルエンディアンでの)AF_UNIXに対応している。
なるほど、そもそもpack_sockaddr_unも文字列を返すメソッドなのね。RubyすごいよRuby。。。