module System.Posix.PAM.Internals where
import Control.Applicative
import Foreign.C
import Foreign.Ptr
import Foreign.Storable
data CPamMessage = CPamMessage { msg_style :: CInt
, msg :: CString
}
deriving (Show,Eq)
instance Storable CPamMessage where
alignment _ = alignment (undefined :: CDouble)
sizeOf _ = sizeOf (undefined :: CInt) + sizeOf (undefined :: CString)
peek p = CPamMessage <$> ((\ptr -> do {peekByteOff ptr 0 ::IO CInt}) p)
<*> ((\ptr -> do {peekByteOff ptr 4 ::IO (Ptr CChar)}) p)
poke p (CPamMessage ms m) = do
(\ptr val -> do {pokeByteOff ptr 0 (val::CInt)}) p ms
(\ptr val -> do {pokeByteOff ptr 4 (val::(Ptr CChar))}) p m
data CPamResponse = CPamResponse { resp :: CString
, resp_retcode :: CInt
}
deriving (Show,Eq)
instance Storable CPamResponse where
alignment _ = alignment (undefined :: CDouble)
sizeOf _ = sizeOf (undefined :: CString) + sizeOf (undefined :: CInt)
peek p = CPamResponse <$> ((\ptr -> do {peekByteOff ptr 0 ::IO (Ptr CChar)}) p)
<*> ((\ptr -> do {peekByteOff ptr 4 ::IO CInt}) p)
poke p (CPamResponse r rc) = do
(\ptr val -> do {pokeByteOff ptr 0 (val::(Ptr CChar))}) p r
(\ptr val -> do {pokeByteOff ptr 4 (val::CInt)}) p rc
data CPamConv = CPamConv { conv :: FunPtr (CInt -> Ptr (Ptr ()) -> Ptr (Ptr ()) -> Ptr () -> IO CInt)
, appdata_ptr :: Ptr ()
}
deriving (Show, Eq)
type ConvFunc = CInt -> Ptr (Ptr ()) -> Ptr (Ptr ()) -> Ptr () -> IO CInt
foreign import ccall "wrapper" mkconvFunc :: ConvFunc -> IO (FunPtr ConvFunc)
instance Storable CPamConv where
alignment _ = alignment (undefined :: CDouble)
sizeOf _ = sizeOf (undefined :: FunPtr ()) + sizeOf (undefined :: Ptr ())
peek p = CPamConv <$> ((\ptr -> do {peekByteOff ptr 0 ::IO (FunPtr (CInt -> ((Ptr (Ptr ())) -> ((Ptr (Ptr ())) -> ((Ptr ()) -> (IO CInt))))))}) p)
<*> ((\ptr -> do {peekByteOff ptr 4 ::IO (Ptr ())}) p)
poke p (CPamConv c ap) = do
(\ptr val -> do {pokeByteOff ptr 0 (val::(FunPtr (CInt -> ((Ptr (Ptr ())) -> ((Ptr (Ptr ())) -> ((Ptr ()) -> (IO CInt)))))))}) p c
(\ptr val -> do {pokeByteOff ptr 4 (val::(Ptr ()))}) p ap
type CPamHandleT = ()
foreign import ccall "security/pam_appl.h pam_start" c_pam_start :: CString -> CString -> Ptr CPamConv -> Ptr (Ptr CPamHandleT) -> IO CInt
foreign import ccall "security/pam_appl.h pam_end" c_pam_end :: Ptr CPamHandleT -> CInt -> IO CInt
foreign import ccall "security/pam_appl.h pam_authenticate" c_pam_authenticate :: Ptr CPamHandleT -> CInt -> IO CInt
foreign import ccall "security/pam_appl.h pam_acct_mgmt" c_pam_acct_mgmt :: Ptr CPamHandleT -> CInt -> IO CInt