module Z.IO.Environment
(
getArgs
, getAllEnv
, getEnv, getEnv'
, setEnv, unsetEnv
, getCWD, chDir, getHomeDir, getTempDir
, getRandom, getRandomT
, getResUsage, ResUsage(..), TimeVal(..)
, getResidentSetMemory
, getUpTime
, getHighResolutionTime
, PID(..)
, getPID, getPPID
, getHostname
, getOSName, OSName(..)
, getPassWD, PassWD(..), UID, GID
, getCPUInfo, CPUInfo(..)
, getLoadAvg
, getFreeMem, getTotalMem, getConstrainedMem
) where
import Control.Monad
import Data.Word
import qualified Z.Data.Vector.Base as V
import Z.Data.CBytes
import Z.Foreign
import Z.IO.Exception
import Z.IO.UV.Manager
import Foreign.Storable
import Z.IO.UV.FFI
import Z.IO.UV.FFI_Env
getArgs :: IO [CBytes]
{-# INLINABLE getArgs #-}
getArgs :: IO [CBytes]
getArgs = do
(CInt
argc :: CInt, (Ptr CString
p_argv :: Ptr CString, ()
_)) <- forall a b. Prim a => (MBA# a -> IO b) -> IO (a, b)
allocPrimUnsafe forall a b. (a -> b) -> a -> b
$ \ MBA# a
p_argc -> do
forall a b. Prim a => (MBA# a -> IO b) -> IO (a, b)
allocPrimUnsafe forall a b. (a -> b) -> a -> b
$ \ MBA# a
p_p_argv -> do
MBA# a -> MBA# a -> IO ()
getProgArgv MBA# a
p_argc MBA# a
p_p_argv
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
t a -> (a -> m b) -> m (t b)
forM [Int
0..forall a b. (Integral a, Num b) => a -> b
fromIntegral (CInt
argcforall a. Num a => a -> a -> a
-CInt
1)] forall a b. (a -> b) -> a -> b
$ \ Int
i -> do
CString -> IO CBytes
fromCString forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< forall a. Storable a => Ptr a -> Int -> IO a
peekElemOff Ptr CString
p_argv Int
i
getAllEnv :: HasCallStack => IO [(CBytes, CBytes)]
{-# INLINABLE getAllEnv #-}
getAllEnv :: HasCallStack => IO [(CBytes, CBytes)]
getAllEnv = forall a b c. IO a -> (a -> IO b) -> (a -> IO c) -> IO c
bracket
(do (Ptr CString
p_env :: Ptr CString, (CInt
envc :: CInt, ()
_)) <- forall a b. Prim a => (MBA# a -> IO b) -> IO (a, b)
allocPrimUnsafe forall a b. (a -> b) -> a -> b
$ \ MBA# a
p_p_env -> do
forall a b. Prim a => (MBA# a -> IO b) -> IO (a, b)
allocPrimUnsafe forall a b. (a -> b) -> a -> b
$ \ MBA# a
p_envc ->
forall a. (HasCallStack, Integral a) => IO a -> IO ()
throwUVIfMinus_ (forall a. MBA# a -> MBA# a -> IO CInt
uv_os_environ MBA# a
p_p_env MBA# a
p_envc)
forall (m :: * -> *) a. Monad m => a -> m a
return (Ptr CString
p_env, CInt
envc))
(\ (Ptr CString
p_env, CInt
envc) -> forall a. Ptr a -> CInt -> IO ()
uv_os_free_environ Ptr CString
p_env CInt
envc)
(\ (Ptr CString
p_env, CInt
envc) -> do
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
t a -> (a -> m b) -> m (t b)
forM [Int
0..forall a b. (Integral a, Num b) => a -> b
fromIntegral (CInt
envcforall a. Num a => a -> a -> a
-CInt
1)] forall a b. (a -> b) -> a -> b
$ \ Int
i -> do
CBytes
k <- CString -> IO CBytes
fromCString forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< forall a. Storable a => Ptr a -> Int -> IO a
peekElemOff Ptr CString
p_env (Int
iforall a. Num a => a -> a -> a
*Int
2)
CBytes
v <- CString -> IO CBytes
fromCString forall (m :: * -> *) a b. Monad m => (a -> m b) -> m a -> m b
=<< forall a. Storable a => Ptr a -> Int -> IO a
peekElemOff Ptr CString
p_env (Int
iforall a. Num a => a -> a -> a
*Int
2forall a. Num a => a -> a -> a
+Int
1)
forall (m :: * -> *) a. Monad m => a -> m a
return (CBytes
k, CBytes
v))
getEnv :: HasCallStack => CBytes -> IO (Maybe CBytes)
{-# INLINABLE getEnv #-}
getEnv :: HasCallStack => CBytes -> IO (Maybe CBytes)
getEnv CBytes
k = Int -> IO (Maybe CBytes)
go Int
512
where
go :: Int -> IO (Maybe CBytes)
go Int
siz = do
(Int
siz', (CBytes
v, CInt
r))<- forall a b. Prim a => a -> (MBA# a -> IO b) -> IO (a, b)
withPrimUnsafe Int
siz forall a b. (a -> b) -> a -> b
$ \ MBA# a
p_siz ->
forall a. CBytes -> (BA# Word8 -> IO a) -> IO a
withCBytesUnsafe CBytes
k forall a b. (a -> b) -> a -> b
$ \ BA# Word8
p_k ->
forall a. HasCallStack => Int -> (MBA# a -> IO a) -> IO (CBytes, a)
allocCBytesUnsafe Int
siz forall a b. (a -> b) -> a -> b
$ \ MBA# a
p_v ->
BA# Word8 -> MBA# a -> MBA# a -> IO CInt
uv_os_getenv BA# Word8
p_k MBA# a
p_v MBA# a
p_siz
case CInt
r of
CInt
UV_ENOBUFS -> Int -> IO (Maybe CBytes)
go Int
siz'
CInt
UV_ENOENT -> forall (m :: * -> *) a. Monad m => a -> m a
return forall a. Maybe a
Nothing
CInt
_ -> do
forall a. (HasCallStack, Integral a) => IO a -> IO ()
throwUVIfMinus_ (forall (m :: * -> *) a. Monad m => a -> m a
return CInt
r)
forall (m :: * -> *) a. Monad m => a -> m a
return (forall a. a -> Maybe a
Just CBytes
v)
getEnv' :: HasCallStack => CBytes -> IO CBytes
{-# INLINABLE getEnv' #-}
getEnv' :: HasCallStack => CBytes -> IO CBytes
getEnv' CBytes
k = HasCallStack => CBytes -> IO (Maybe CBytes)
getEnv CBytes
k forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= \ Maybe CBytes
mv -> case Maybe CBytes
mv of
Just CBytes
v -> forall (m :: * -> *) a. Monad m => a -> m a
return CBytes
v
Maybe CBytes
_ -> forall a. CInt -> IOEInfo -> IO a
throwUVError CInt
UV_ENOENT (Text -> Text -> CallStack -> IOEInfo
IOEInfo Text
"ENOENT" Text
"no such environment variable" HasCallStack => CallStack
callStack)
setEnv :: HasCallStack => CBytes -> CBytes -> IO ()
{-# INLINABLE setEnv #-}
setEnv :: HasCallStack => CBytes -> CBytes -> IO ()
setEnv CBytes
k CBytes
v = forall a. CBytes -> (BA# Word8 -> IO a) -> IO a
withCBytesUnsafe CBytes
k forall a b. (a -> b) -> a -> b
$ \ BA# Word8
p_k ->
forall a. CBytes -> (BA# Word8 -> IO a) -> IO a
withCBytesUnsafe CBytes
v forall a b. (a -> b) -> a -> b
$ \ BA# Word8
p_v ->
forall a. (HasCallStack, Integral a) => IO a -> IO ()
throwUVIfMinus_ (BA# Word8 -> BA# Word8 -> IO CInt
uv_os_setenv BA# Word8
p_k BA# Word8
p_v)
unsetEnv :: HasCallStack => CBytes -> IO ()
{-# INLINABLE unsetEnv #-}
unsetEnv :: HasCallStack => CBytes -> IO ()
unsetEnv CBytes
k = forall (f :: * -> *) a. Functor f => f a -> f ()
void forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a. CBytes -> (BA# Word8 -> IO a) -> IO a
withCBytesUnsafe CBytes
k forall a b. (a -> b) -> a -> b
$ \ BA# Word8
p -> forall a. (HasCallStack, Integral a) => IO a -> IO ()
throwUVIfMinus_ (BA# Word8 -> IO CInt
uv_os_unsetenv BA# Word8
p)
getResidentSetMemory :: HasCallStack => IO CSize
{-# INLINABLE getResidentSetMemory #-}
getResidentSetMemory :: HasCallStack => IO CSize
getResidentSetMemory = do
(CSize
size, CInt
r) <- forall a b. Prim a => (MBA# a -> IO b) -> IO (a, b)
allocPrimUnsafe MBA# a -> IO CInt
uv_resident_set_memory
forall a. (HasCallStack, Integral a) => IO a -> IO ()
throwUVIfMinus_ (forall (m :: * -> *) a. Monad m => a -> m a
return CInt
r)
forall (m :: * -> *) a. Monad m => a -> m a
return CSize
size
getUpTime :: HasCallStack => IO Double
{-# INLINABLE getUpTime #-}
getUpTime :: HasCallStack => IO Double
getUpTime = do
(Double
size, CInt
r) <- forall a b. Prim a => (MBA# a -> IO b) -> IO (a, b)
allocPrimUnsafe MBA# a -> IO CInt
uv_uptime
forall a. (HasCallStack, Integral a) => IO a -> IO ()
throwUVIfMinus_ (forall (m :: * -> *) a. Monad m => a -> m a
return CInt
r)
forall (m :: * -> *) a. Monad m => a -> m a
return Double
size
getHighResolutionTime :: IO Word64
{-# INLINABLE getHighResolutionTime #-}
getHighResolutionTime :: IO Word64
getHighResolutionTime = IO Word64
uv_hrtime
getResUsage :: HasCallStack => IO ResUsage
{-# INLINABLE getResUsage #-}
getResUsage :: HasCallStack => IO ResUsage
getResUsage = do
(MutableByteArray MBA# a
mba#) <- forall (m :: * -> *).
PrimMonad m =>
Int -> m (MutableByteArray (PrimState m))
newByteArray Int
sizeOfResUsage
forall a. (HasCallStack, Integral a) => IO a -> IO ()
throwUVIfMinus_ (forall {k} (a :: k). MBA# a -> IO CInt
uv_getrusage MBA# a
mba#)
forall {k} (a :: k). MBA# a -> IO ResUsage
peekResUsage MBA# a
mba#
getPID :: IO PID
{-# INLINABLE getPID #-}
getPID :: IO PID
getPID = IO PID
uv_os_getpid
getPPID :: IO PID
{-# INLINABLE getPPID #-}
getPPID :: IO PID
getPPID = IO PID
uv_os_getppid
getHostname :: HasCallStack => IO CBytes
{-# INLINABLE getHostname #-}
getHostname :: HasCallStack => IO CBytes
getHostname = do
(CBytes
n, (CSize, ())
_) <- forall a. HasCallStack => Int -> (MBA# a -> IO a) -> IO (CBytes, a)
allocCBytesUnsafe (forall a b. (Integral a, Num b) => a -> b
fromIntegral CSize
UV_MAXHOSTNAMESIZE) forall a b. (a -> b) -> a -> b
$ \ MBA# a
p_n ->
forall a b. Prim a => a -> (MBA# a -> IO b) -> IO (a, b)
withPrimUnsafe CSize
UV_MAXHOSTNAMESIZE forall a b. (a -> b) -> a -> b
$ \ MBA# a
p_siz ->
forall a. (HasCallStack, Integral a) => IO a -> IO ()
throwUVIfMinus_ (MBA# a -> MBA# a -> IO CInt
uv_os_gethostname MBA# a
p_n MBA# a
p_siz)
forall (m :: * -> *) a. Monad m => a -> m a
return CBytes
n
getRandom :: Int -> IO V.Bytes
{-# INLINABLE getRandom #-}
getRandom :: Int -> IO Bytes
getRandom Int
siz = do
(Bytes
v, ()
_) <- forall a b.
Prim a =>
Int -> (MBA# a -> IO b) -> IO (PrimVector a, b)
allocPrimVectorUnsafe Int
siz forall a b. (a -> b) -> a -> b
$ \ MBA# a
mba# ->
forall a. (HasCallStack, Integral a) => IO a -> IO ()
throwUVIfMinus_ (MBA# a -> CSize -> CInt -> IO CInt
hs_uv_random MBA# a
mba# (forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
siz) CInt
0)
forall (m :: * -> *) a. Monad m => a -> m a
return Bytes
v
getRandomT :: Int -> IO V.Bytes
{-# INLINABLE getRandomT #-}
getRandomT :: Int -> IO Bytes
getRandomT Int
siz = do
(Bytes
v, ()
_) <- forall a b.
Prim a =>
Int -> (Ptr a -> IO b) -> IO (PrimVector a, b)
allocPrimVectorSafe Int
siz forall a b. (a -> b) -> a -> b
$ \ Ptr Word8
p -> do
UVManager
uvm <- IO UVManager
getUVManager
HasCallStack =>
UVManager -> (Ptr UVLoop -> IO UVSlotUnsafe) -> IO ()
withUVRequest_ UVManager
uvm (Ptr Word8 -> CSize -> CInt -> Ptr UVLoop -> IO UVSlotUnsafe
hs_uv_random_threaded Ptr Word8
p (forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
siz) CInt
0)
forall (m :: * -> *) a. Monad m => a -> m a
return Bytes
v
getCWD :: HasCallStack => IO CBytes
{-# INLINABLE getCWD #-}
getCWD :: HasCallStack => IO CBytes
getCWD = Int -> IO CBytes
go Int
512
where
go :: Int -> IO CBytes
go Int
siz = do
(Int
siz', (CBytes
v, CInt
r))<- forall a b. Prim a => a -> (MBA# a -> IO b) -> IO (a, b)
withPrimUnsafe Int
siz forall a b. (a -> b) -> a -> b
$ \ MBA# a
p_siz ->
forall a. HasCallStack => Int -> (MBA# a -> IO a) -> IO (CBytes, a)
allocCBytesUnsafe Int
siz forall a b. (a -> b) -> a -> b
$ \ MBA# a
p_v ->
MBA# a -> MBA# a -> IO CInt
uv_cwd MBA# a
p_v MBA# a
p_siz
case CInt
r of
CInt
UV_ENOBUFS -> Int -> IO CBytes
go Int
siz'
CInt
_ -> do
forall a. (HasCallStack, Integral a) => IO a -> IO ()
throwUVIfMinus_ (forall (m :: * -> *) a. Monad m => a -> m a
return CInt
r)
forall (m :: * -> *) a. Monad m => a -> m a
return CBytes
v
chDir :: HasCallStack => CBytes -> IO ()
{-# INLINABLE chDir #-}
chDir :: HasCallStack => CBytes -> IO ()
chDir CBytes
p = forall a. (HasCallStack, Integral a) => IO a -> IO ()
throwUVIfMinus_ (forall a. CBytes -> (BA# Word8 -> IO a) -> IO a
withCBytesUnsafe CBytes
p forall a b. (a -> b) -> a -> b
$ \ BA# Word8
pp -> BA# Word8 -> IO CInt
uv_chdir BA# Word8
pp)
getHomeDir :: HasCallStack => IO CBytes
{-# INLINABLE getHomeDir #-}
getHomeDir :: HasCallStack => IO CBytes
getHomeDir = Int -> IO CBytes
go Int
512
where
go :: Int -> IO CBytes
go Int
siz = do
(Int
siz', (CBytes
v, CInt
r))<- forall a b. Prim a => a -> (MBA# a -> IO b) -> IO (a, b)
withPrimUnsafe Int
siz forall a b. (a -> b) -> a -> b
$ \ MBA# a
p_siz ->
forall a. HasCallStack => Int -> (MBA# a -> IO a) -> IO (CBytes, a)
allocCBytesUnsafe Int
siz forall a b. (a -> b) -> a -> b
$ \ MBA# a
p_v ->
MBA# a -> MBA# a -> IO CInt
uv_os_homedir MBA# a
p_v MBA# a
p_siz
case CInt
r of
CInt
UV_ENOBUFS -> Int -> IO CBytes
go Int
siz'
CInt
_ -> do
forall a. (HasCallStack, Integral a) => IO a -> IO ()
throwUVIfMinus_ (forall (m :: * -> *) a. Monad m => a -> m a
return CInt
r)
forall (m :: * -> *) a. Monad m => a -> m a
return CBytes
v
getTempDir :: HasCallStack => IO CBytes
{-# INLINABLE getTempDir #-}
getTempDir :: HasCallStack => IO CBytes
getTempDir = Int -> IO CBytes
go Int
512
where
go :: Int -> IO CBytes
go Int
siz = do
(Int
siz', (CBytes
v, CInt
r))<- forall a b. Prim a => a -> (MBA# a -> IO b) -> IO (a, b)
withPrimUnsafe Int
siz forall a b. (a -> b) -> a -> b
$ \ MBA# a
p_siz ->
forall a. HasCallStack => Int -> (MBA# a -> IO a) -> IO (CBytes, a)
allocCBytesUnsafe Int
siz forall a b. (a -> b) -> a -> b
$ \ MBA# a
p_v ->
MBA# a -> MBA# a -> IO CInt
uv_os_tmpdir MBA# a
p_v MBA# a
p_siz
case CInt
r of
CInt
UV_ENOBUFS -> Int -> IO CBytes
go Int
siz'
CInt
_ -> do
forall a. (HasCallStack, Integral a) => IO a -> IO ()
throwUVIfMinus_ (forall (m :: * -> *) a. Monad m => a -> m a
return CInt
r)
forall (m :: * -> *) a. Monad m => a -> m a
return CBytes
v
getFreeMem :: IO Word64
{-# INLINABLE getFreeMem #-}
getFreeMem :: IO Word64
getFreeMem = IO Word64
uv_get_free_memory
getTotalMem :: IO Word64
{-# INLINABLE getTotalMem #-}
getTotalMem :: IO Word64
getTotalMem = IO Word64
uv_get_total_memory
getConstrainedMem :: IO Word64
{-# INLINABLE getConstrainedMem #-}
getConstrainedMem :: IO Word64
getConstrainedMem = IO Word64
uv_get_constrained_memory
foreign import ccall unsafe getProgArgv :: MBA# CInt -> MBA# (Ptr CString) -> IO ()