{-# LINE 1 "System/Linux/Capabilities.hsc" #-}
module System.Linux.Capabilities
    ( hasSysAdminCap
    ) where

import Foreign
import Foreign.C
import System.Posix (getProcessID)



-- It's probably a bad idea to use the capget syscall instead of the
-- functions from libcap, but this way we avoid the dependecy on libcap.

hasSysAdminCap :: IO Bool
hasSysAdminCap =
    flip testBit (21) <$> getCapabilities
{-# LINE 17 "System/Linux/Capabilities.hsc" #-}

getCapabilities :: IO Word64
getCapabilities =
    allocaBytes ((8)) $ \hdrp ->
{-# LINE 21 "System/Linux/Capabilities.hsc" #-}
    allocaBytes (2 * ((12))) $ \datap -> do
{-# LINE 22 "System/Linux/Capabilities.hsc" #-}
        pid <- getProcessID
        ((\hsc_ptr -> pokeByteOff hsc_ptr 0)) hdrp ((537333798) :: Word32)
{-# LINE 24 "System/Linux/Capabilities.hsc" #-}
        ((\hsc_ptr -> pokeByteOff hsc_ptr 4)) hdrp (fromIntegral pid :: Word32)
{-# LINE 25 "System/Linux/Capabilities.hsc" #-}
        throwErrnoIfMinus1_ "capget" $ c_capget hdrp datap
        effective0 <- ((\hsc_ptr -> peekByteOff hsc_ptr 0)) datap :: IO Word32
{-# LINE 27 "System/Linux/Capabilities.hsc" #-}
        let datap1 = datap `plusPtr` ((12))
{-# LINE 28 "System/Linux/Capabilities.hsc" #-}
        effective1 <- ((\hsc_ptr -> peekByteOff hsc_ptr 0)) datap1 :: IO Word32
{-# LINE 29 "System/Linux/Capabilities.hsc" #-}
        return (fromIntegral effective1 `unsafeShiftL` 32 .|. fromIntegral effective0)

data CapUserHeader
data CapUserData

foreign import ccall unsafe "sys/capability.h capget"
    c_capget :: Ptr CapUserHeader -> Ptr CapUserData -> IO CInt