summaryrefslogtreecommitdiffhomepage
path: root/src/Xmobar
diff options
context:
space:
mode:
Diffstat (limited to 'src/Xmobar')
-rw-r--r--src/Xmobar/Plugins/Monitors/Uptime.hs14
-rw-r--r--src/Xmobar/Plugins/Monitors/Uptime/FreeBSD.hsc52
-rw-r--r--src/Xmobar/Plugins/Monitors/Uptime/Linux.hs24
3 files changed, 84 insertions, 6 deletions
diff --git a/src/Xmobar/Plugins/Monitors/Uptime.hs b/src/Xmobar/Plugins/Monitors/Uptime.hs
index 235fc85..646edc8 100644
--- a/src/Xmobar/Plugins/Monitors/Uptime.hs
+++ b/src/Xmobar/Plugins/Monitors/Uptime.hs
@@ -1,3 +1,5 @@
+{-#LANGUAGE CPP #-}
+
------------------------------------------------------------------------------
-- |
-- Module : Plugins.Monitors.Uptime
@@ -19,22 +21,22 @@ module Xmobar.Plugins.Monitors.Uptime (uptimeConfig, runUptime) where
import Xmobar.Plugins.Monitors.Common
-import qualified Data.ByteString.Lazy.Char8 as B
+#if defined(freebsd_HOST_OS)
+import qualified Xmobar.Plugins.Monitors.Uptime.FreeBSD as MU
+#else
+import qualified Xmobar.Plugins.Monitors.Uptime.Linux as MU
+#endif
uptimeConfig :: IO MConfig
uptimeConfig = mkMConfig "Up <days>d <hours>h <minutes>m"
["days", "hours", "minutes", "seconds"]
-readUptime :: IO Float
-readUptime =
- fmap (read . B.unpack . head . B.words) (B.readFile "/proc/uptime")
-
secsPerDay :: Integer
secsPerDay = 24 * 3600
uptime :: Monitor [String]
uptime = do
- t <- io readUptime
+ t <- io MU.readUptime
u <- getConfigValue useSuffix
let tsecs = floor t
secs = tsecs `mod` secsPerDay
diff --git a/src/Xmobar/Plugins/Monitors/Uptime/FreeBSD.hsc b/src/Xmobar/Plugins/Monitors/Uptime/FreeBSD.hsc
new file mode 100644
index 0000000..e6323e1
--- /dev/null
+++ b/src/Xmobar/Plugins/Monitors/Uptime/FreeBSD.hsc
@@ -0,0 +1,52 @@
+------------------------------------------------------------------------------
+-- |
+-- Module : Plugins.Monitors.Uptime.FreeBSD
+-- Copyright : (c) 2010 Jose Antonio Ortega Ruiz
+-- License : BSD3-style (see LICENSE)
+--
+-- Maintainer : jao@gnu.org
+-- Stability : unstable
+-- Portability : unportable
+-- Created: Sun Dec 12, 2010 20:26
+--
+--
+-- Uptime
+--
+------------------------------------------------------------------------------
+
+
+module Xmobar.Plugins.Monitors.Uptime.FreeBSD (readUptime) where
+
+import Data.Time.Clock.POSIX (getPOSIXTime)
+import System.BSD.Sysctl
+import Data.Int
+import Foreign.C
+import Foreign.Storable
+
+#include <sys/types.h>
+#include <sys/user.h>
+#include <sys/time.h>
+#include <sys/sysctl.h>
+
+data TimeVal = TimeVal {sec:: CTime}
+
+instance Storable TimeVal where
+ sizeOf _ = #{size struct timeval}
+ alignment _ = alignment (undefined::CTime)
+ peek ptr = do cSec <- #{peek struct timeval, tv_sec} ptr
+ return (TimeVal cSec)
+ poke _ _ = pure ()
+
+now :: IO Int64
+now = do
+ posix <- getPOSIXTime
+ return $ round posix
+
+readUptime :: IO Float
+readUptime = do
+ tv <- sysctlPeek "kern.boottime" :: IO TimeVal
+ nowSec <- now
+ return $ fromInteger $ toInteger $ (nowSec - (secInt $ sec tv))
+ where
+ secInt :: CTime -> Int64
+ secInt (CTime cSec) = cSec
diff --git a/src/Xmobar/Plugins/Monitors/Uptime/Linux.hs b/src/Xmobar/Plugins/Monitors/Uptime/Linux.hs
new file mode 100644
index 0000000..46ba1a1
--- /dev/null
+++ b/src/Xmobar/Plugins/Monitors/Uptime/Linux.hs
@@ -0,0 +1,24 @@
+------------------------------------------------------------------------------
+-- |
+-- Module : Plugins.Monitors.Uptime.Linux
+-- Copyright : (c) 2010 Jose Antonio Ortega Ruiz
+-- License : BSD3-style (see LICENSE)
+--
+-- Maintainer : jao@gnu.org
+-- Stability : unstable
+-- Portability : unportable
+-- Created: Sun Dec 12, 2010 20:26
+--
+--
+-- Uptime
+--
+------------------------------------------------------------------------------
+
+
+module Xmobar.Plugins.Monitors.Uptime.Linux (readUptime) where
+
+import qualified Data.ByteString.Lazy.Char8 as B
+
+readUptime :: IO Float
+readUptime =
+ fmap (read . B.unpack . head . B.words) (B.readFile "/proc/uptime")