module System.SysInfo
(
sysInfo
, SysInfo(..)
, Loads(..)
) where
import Foreign.C
import Foreign.Ptr
import Foreign.C.Error
import Foreign.Storable
import Foreign.Marshal.Alloc
data SysInfo = SysInfo
{ uptime :: CLong
, loads :: Loads
, totalram :: CULong
, freeram :: CULong
, sharedram :: CULong
, bufferram :: CULong
, totalswap :: CULong
, freeswap :: CULong
, procs :: CUShort
, totalhigh :: CULong
, freehigh :: CULong
, memUnit :: CUInt
} deriving (Show, Eq, Ord)
newtype Loads = Loads
{ sloads :: [CULong]
} deriving (Show, Eq, Ord)
instance Storable Loads where
sizeOf _ = (sizeOf (undefined :: CULong)) * 3
alignment _ = alignment (undefined :: CULong)
peek ptr = do
(vals :: [CULong]) <- mapM (peekElemOff ptr') index
return $ Loads vals
where
ptr' = castPtr ptr
index = [0, 1, 2]
poke ptr (Loads val) = mapM_ (\(v, i) -> pokeElemOff ptr' i v) (zip val index)
where
(ptr' :: Ptr CULong) = castPtr ptr
index = [0, 1, 2]
instance Storable SysInfo where
sizeOf _ = ((112))
alignment _ = ((8))
peek ptr = do
uptime <- ((\hsc_ptr -> peekByteOff hsc_ptr 0)) ptr
loads <- ((\hsc_ptr -> peekByteOff hsc_ptr 8)) ptr
totalram <- ((\hsc_ptr -> peekByteOff hsc_ptr 32)) ptr
freeram <- ((\hsc_ptr -> peekByteOff hsc_ptr 40)) ptr
sharedram <- ((\hsc_ptr -> peekByteOff hsc_ptr 48)) ptr
bufferram <- ((\hsc_ptr -> peekByteOff hsc_ptr 56)) ptr
totalswap <- ((\hsc_ptr -> peekByteOff hsc_ptr 64)) ptr
freeswap <- ((\hsc_ptr -> peekByteOff hsc_ptr 72)) ptr
procs <- ((\hsc_ptr -> peekByteOff hsc_ptr 80)) ptr
totalhigh <- ((\hsc_ptr -> peekByteOff hsc_ptr 88)) ptr
freehigh <- ((\hsc_ptr -> peekByteOff hsc_ptr 96)) ptr
memUnit <- ((\hsc_ptr -> peekByteOff hsc_ptr 104)) ptr
return $
SysInfo
{ ..
}
poke ptr (SysInfo {..}) = do
((\hsc_ptr -> pokeByteOff hsc_ptr 0)) ptr uptime
((\hsc_ptr -> pokeByteOff hsc_ptr 8)) ptr loads
((\hsc_ptr -> pokeByteOff hsc_ptr 32)) ptr totalram
((\hsc_ptr -> pokeByteOff hsc_ptr 40)) ptr freeram
((\hsc_ptr -> pokeByteOff hsc_ptr 48)) ptr sharedram
((\hsc_ptr -> pokeByteOff hsc_ptr 56)) ptr bufferram
((\hsc_ptr -> pokeByteOff hsc_ptr 64)) ptr totalswap
((\hsc_ptr -> pokeByteOff hsc_ptr 72)) ptr freeswap
((\hsc_ptr -> pokeByteOff hsc_ptr 80)) ptr procs
((\hsc_ptr -> pokeByteOff hsc_ptr 88)) ptr totalhigh
((\hsc_ptr -> pokeByteOff hsc_ptr 96)) ptr freehigh
((\hsc_ptr -> pokeByteOff hsc_ptr 104)) ptr memUnit
foreign import ccall safe "sysinfo" c_sysinfo ::
Ptr SysInfo -> IO CInt
sysInfo :: IO (Either Errno SysInfo)
sysInfo = do
(sptr :: Ptr SysInfo) <- malloc
res <- c_sysinfo sptr
if (res == 0)
then do
val <- peek sptr
free sptr
return $ Right val
else do
free sptr
err <- getErrno
return $ Left err