抽象名前空間 - 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。。。