すみません、またアドバイスをお願いします。 m(_ _)m
FreeBSD上で動作するHaskellアプリでD-Busにアクセスしたいのですが、
認証すら通らずに接続が切られてしまいます。
システムバスへ接続しようとしているのですが、Haskellアプリ側からnullとAUTHコマンドを送信した後、エラーも戻らずに切断されます。
D-FeetというD-Busのデバッグツールを使用すると、接続できるので、socatで通信内容を確認してみようとしたところ、socat経由ではD-Feetも接続できなくなりました。
ただし、認証時に送信されるデータは、Haskellアプリのものと全く一緒でした。
D-Busにはdbusパッケージを使ってアクセスしようとしていましたが、とりあえず原因究明の為に接続・認証部分のみ切り出して新しくプログラムを作り、いろいろと試行錯誤したのですが、原因がさっぱりわかりません。
どなたか、このような現象に心当たりはないでしょうか。
何かアドバイスをいただけますと助かります・・・。 m(_ _)m
参考までに、このようなプログラムで接続を確認していました。
import Network.Socket hiding (recv,send)
import Network.Socket.ByteString (send,sendAll, recv)
import qualified Data.ByteString.Char8 as Char8
import qualified Data.ByteString as C
import System.IO hiding (hGetLine)
main = do
-sock < socket AF_UNIX Stream defaultProtocol
sock <- socket AF_UNIX Stream 0
connect sock (SockAddrUnix "/var/run/dbus/system_bus_socket")
{- socketを使った送受信
sndsize <- send sock $ Char8.pack "\0"
putStrLn $ show sndsize
-msg < recv sock 32
--sendAll sock $ Char8.pack "\0AUTH EXTERNAL 31303031\r\n"
sndsize2 <- send sock $ Char8.pack "AUTH EXTERNAL 31303031\r\n"
putStrLn $ show sndsize2
sndsize3 <- send sock $ Char8.pack "BEGIN\r\n"
putStrLn $ show sndsize3
--sendAll sock $ Char8.pack "AAAAA"
msg <- recv sock 256
putStrLn $ "len =" ++ (show $ C.length msg) ++ (Char8.unpack msg)
sClose sock
-}
h <- socketToHandle sock ReadWriteMode
hSetBuffering h NoBuffering
hPutChar h '\0'
hFlush h
-- msg < Char8.hGet h 128
C.hPut h $ Char8.pack "AUTH EXTERNAL 31303031\r\n" -- uid=1001
-- Char8.hPut h $ Char8.pack "AUTH\r\n"
msg <- recvloop h []
Char8.hPut h $ Char8.pack "BEGIN\r\n"
putStrLn $ show msg
hClose h
where
recvloop :: Handle -> String -> IO String
recvloop hdl msg = do
ch <- hGetChar hdl
case ch of
'\n' -> return msg
c -> recvloop hdl $ msg ++ [c]