From 6c4970ea293796a832ecd1b292ec99a9695bf276 Mon Sep 17 00:00:00 2001 From: Jose A Ortega Ruiz Date: Thu, 4 Feb 2010 02:54:55 +0100 Subject: New DiskU and DiskIO monitors Ignore-this: b72a9ad54c9ae478f2c3fbdcda4d26c8 New monitors for disk usage and throughput, replacing Disk. darcs-hash:20100204015455-748be-41e03ee9dff0e3e9e3725aae8a3e07c6facb70dc.gz --- Plugins/Monitors/StatFS.hsc | 72 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 Plugins/Monitors/StatFS.hsc (limited to 'Plugins/Monitors/StatFS.hsc') diff --git a/Plugins/Monitors/StatFS.hsc b/Plugins/Monitors/StatFS.hsc new file mode 100644 index 0000000..ad3b659 --- /dev/null +++ b/Plugins/Monitors/StatFS.hsc @@ -0,0 +1,72 @@ +----------------------------------------------------------------------------- +-- | +-- Module : Plugins.Monitors.StatFS +-- Copyright : (c) Jose A Ortega Ruiz +-- License : BSD-style (see LICENSE) +-- +-- Maintainer : Jose A Ortega Ruiz +-- Stability : unstable +-- Portability : unportable +-- +-- A binding to C's statvfs(2) +-- +----------------------------------------------------------------------------- + +{-# LANGUAGE CPP, ForeignFunctionInterface, EmptyDataDecls #-} + + +module Plugins.Monitors.StatFS (FileSystemStats(..), getFileSystemStats) where + +import Foreign +import Foreign.C.Types +import Foreign.C.String +import Foreign.Storable +import Data.ByteString (useAsCString) +import Data.ByteString.Char8 (pack) + +#include + +data FileSystemStats = FileSystemStats { + fsStatBlockSize :: Integer + -- ^ Optimal transfer block size. + , fsStatBlockCount :: Integer + -- ^ Total data blocks in file system. + , fsStatByteCount :: Integer + -- ^ Total bytes in file system. + , fsStatBytesFree :: Integer + -- ^ Free bytes in file system. + , fsStatBytesAvailable :: Integer + -- ^ Free bytes available to non-superusers. + , fsStatBytesUsed :: Integer + -- ^ Bytes used. + } deriving (Show, Eq) + +data CStatfs + +foreign import ccall unsafe "sys/vfs.h statfs64" + c_statfs :: CString -> Ptr CStatfs -> IO CInt + +toI :: CLong -> Integer +toI = toInteger + +getFileSystemStats :: String -> IO (Maybe FileSystemStats) +getFileSystemStats path = + allocaBytes (#size struct statfs) $ \vfs -> + useAsCString (pack path) $ \cpath -> do + res <- c_statfs cpath vfs + case res of + -1 -> return Nothing + _ -> do + bsize <- (#peek struct statfs, f_bsize) vfs + bcount <- (#peek struct statfs, f_blocks) vfs + bfree <- (#peek struct statfs, f_bfree) vfs + bavail <- (#peek struct statfs, f_bavail) vfs + let bpb = toI bsize + return $ Just FileSystemStats + { fsStatBlockSize = bpb + , fsStatBlockCount = toI bcount + , fsStatByteCount = toI bcount * bpb + , fsStatBytesFree = toI bfree * bpb + , fsStatBytesAvailable = toI bavail * bpb + , fsStatBytesUsed = toI (bcount - bfree) * bpb + } -- cgit v1.2.3