{-# LINE 1 "System/DiskSpace.hsc" #-}
{-# LANGUAGE CPP #-}
module System.DiskSpace
( DiskUsage(..)
, getDiskUsage
, getAvailSpace
) where
{-# LINE 17 "System/DiskSpace.hsc" #-}
import Foreign
import Foreign.C
foreign import ccall safe statvfs :: CString -> Ptr a -> IO CInt
type FsBlkCnt = Word32
{-# LINE 26 "System/DiskSpace.hsc" #-}
getDiskUsage path =
withCString path $ \cPath ->
allocaBytes ((72)) $ \stat -> do
{-# LINE 30 "System/DiskSpace.hsc" #-}
throwErrnoPathIfMinus1_ "getDiskUsage" path $ statvfs cPath stat
bsize <- ((\hsc_ptr -> peekByteOff hsc_ptr 0)) stat :: IO CULong
{-# LINE 32 "System/DiskSpace.hsc" #-}
frsize <- ((\hsc_ptr -> peekByteOff hsc_ptr 4)) stat :: IO CULong
{-# LINE 33 "System/DiskSpace.hsc" #-}
blocks <- ((\hsc_ptr -> peekByteOff hsc_ptr 8)) stat :: IO FsBlkCnt
{-# LINE 34 "System/DiskSpace.hsc" #-}
bfree <- ((\hsc_ptr -> peekByteOff hsc_ptr 12)) stat :: IO FsBlkCnt
{-# LINE 35 "System/DiskSpace.hsc" #-}
bavail <- ((\hsc_ptr -> peekByteOff hsc_ptr 16)) stat :: IO FsBlkCnt
{-# LINE 36 "System/DiskSpace.hsc" #-}
let frsize' = fromIntegral frsize
return DiskUsage
{ diskTotal = frsize' * fromIntegral blocks
, diskFree = frsize' * fromIntegral bfree
, diskAvail = frsize' * fromIntegral bavail
, blockSize = fromIntegral bsize
}
{-# LINE 61 "System/DiskSpace.hsc" #-}
data DiskUsage = DiskUsage
{ diskTotal :: Integer
, diskFree :: Integer
, diskAvail :: Integer
, blockSize :: Int
}
deriving (Show, Eq)
getDiskUsage :: FilePath -> IO DiskUsage
getAvailSpace :: FilePath -> IO Integer
getAvailSpace = fmap diskAvail . getDiskUsage