From ededb764b496669013198419a56f2ee513d52587 Mon Sep 17 00:00:00 2001
From: Jose Antonio Ortega Ruiz <jao@gnu.org>
Date: Sat, 28 Jul 2012 21:21:35 +0200
Subject: Fixes for DiskU, which was exploding on recent Linux

We're using now the recommended statvfs interface, instead of the
obsolete statfs64.  Moreover, we compute correctly the used space.
---
 src/Plugins/Monitors/Disk.hs | 19 ++++++++++---------
 src/StatFS.hsc               |  6 +++---
 2 files changed, 13 insertions(+), 12 deletions(-)

(limited to 'src')

diff --git a/src/Plugins/Monitors/Disk.hs b/src/Plugins/Monitors/Disk.hs
index 725fe29..554be05 100644
--- a/src/Plugins/Monitors/Disk.hs
+++ b/src/Plugins/Monitors/Disk.hs
@@ -77,15 +77,6 @@ parseDev dat dev =
           dat' = if length xs > 6 then [sp, rSp, wSp] else [0, 0, 0]
       in (dev, dat')
 
-fsStats :: String -> IO [Integer]
-fsStats path = do
-  stats <- getFileSystemStats path
-  case stats of
-    Nothing -> return [0, 0, 0]
-    Just f -> let tot = fsStatByteCount f
-                  free = fsStatBytesAvailable f
-              in return [tot, free, tot - free]
-
 speedToStr :: Float -> String
 speedToStr = showWithUnits 2 1
 
@@ -131,6 +122,16 @@ startDiskIO disks args rate cb = do
   _ <- mountedData dref (map fst mounted)
   runM args diskIOConfig (runDiskIO dref disks) rate cb
 
+fsStats :: String -> IO [Integer]
+fsStats path = do
+  stats <- getFileSystemStats path
+  case stats of
+    Nothing -> return [0, 0, 0]
+    Just f -> let tot = fsStatByteCount f
+                  free = fsStatBytesAvailable f
+                  used = fsStatBytesUsed f
+              in return [tot, free, used]
+
 runDiskU' :: String -> String -> Monitor String
 runDiskU' tmp path = do
   setConfigValue tmp template
diff --git a/src/StatFS.hsc b/src/StatFS.hsc
index e1cb89c..050c19b 100644
--- a/src/StatFS.hsc
+++ b/src/StatFS.hsc
@@ -54,7 +54,7 @@ data CStatfs
 #ifdef IS_BSD_SYSTEM
 foreign import ccall unsafe "sys/mount.h statfs"
 #else
-foreign import ccall unsafe "sys/vfs.h statfs64"
+foreign import ccall unsafe "sys/statvfs.h statvfs"
 #endif
   c_statfs :: CString -> Ptr CStatfs -> IO CInt
 
@@ -66,7 +66,7 @@ getFileSystemStats path =
   allocaBytes (#size struct statfs) $ \vfs ->
   useAsCString (pack path) $ \cpath -> do
     res <- c_statfs cpath vfs
-    if res == -1 then return Nothing
+    if res /= 0 then return Nothing
       else do
         bsize <- (#peek struct statfs, f_bsize) vfs
         bcount <- (#peek struct statfs, f_blocks) vfs
@@ -79,5 +79,5 @@ getFileSystemStats path =
                        , fsStatByteCount = toI bcount * bpb
                        , fsStatBytesFree = toI bfree * bpb
                        , fsStatBytesAvailable = toI bavail * bpb
-                       , fsStatBytesUsed = toI (max 0 (bcount - bavail)) * bpb
+                       , fsStatBytesUsed = toI (bcount - bfree) * bpb
                        }
-- 
cgit v1.2.3