module Graphics.X11.Xauth
(Xauth(..), familyLocal, familyWild, familyNetname,
familyKrb5Principal, familyLocalHost, getAuthByAddr) where
import Foreign
import Foreign.C
import Control.Monad (liftM2, zipWithM_)
data Xauth = Xauth { xauthName, xauthData :: [CChar] } deriving (Show, Read)
familyLocal, familyWild, familyNetname, familyKrb5Principal, familyLocalHost :: CUShort
familyLocal = 256
familyWild = 65535
familyNetname = 254
familyKrb5Principal = 253
familyLocalHost = 252
foreign import ccall "X11/Xauth.h XauGetAuthByAddr"
xauGetAuthByAddr :: CUShort -> CUShort -> Ptr CChar -> CUShort -> Ptr CChar
-> CInt -> Ptr CChar -> IO (Ptr Xauth)
foreign import ccall "X11/Xauth.h XauDisposeAuth"
xauDisposeAuth :: Ptr Xauth -> IO ()
getAuthByAddr :: CUShort -> [CChar] -> [CChar] -> [CChar] -> IO (Maybe Xauth)
getAuthByAddr family address number atype
= withArray address $ \addr_p -> withArray number $ \num_p ->
withArray atype $ \atype_p -> do
res <- xauGetAuthByAddr family (slength address) addr_p (slength number)
num_p (slength atype) atype_p
if res == nullPtr
then return Nothing
else do
name_p <- (\hsc_ptr -> peekByteOff hsc_ptr 20) res
name_len <- (\hsc_ptr -> peekByteOff hsc_ptr 16) res :: IO CUShort
data_p <- (\hsc_ptr -> peekByteOff hsc_ptr 28) res
data_len <- (\hsc_ptr -> peekByteOff hsc_ptr 24) res :: IO CUShort
x <- if or [nullPtr == name_p, nullPtr == data_p, data_len <= 0, name_len <= 0]
then return $ Nothing
else
liftM2 ((Just .) . Xauth)
(peekArray (fromIntegral name_len) name_p)
(peekArray (fromIntegral data_len) data_p)
xauDisposeAuth res
return x
where slength x = fromIntegral $ length x