{-# LINE 1 "System/Posix/Env.hsc" #-}
{-# LANGUAGE CApiFFI #-}
{-# LANGUAGE Safe #-}
module System.Posix.Env (
      getEnv
    , getEnvDefault
    , getEnvironmentPrim
    , getEnvironment
    , setEnvironment
    , putEnv
    , setEnv
    , unsetEnv
    , clearEnv
) where
import Foreign hiding (void)
import Foreign.C.Error (throwErrnoIfMinus1_)
import Foreign.C.Types
import Foreign.C.String
import Control.Monad
import Data.Maybe (fromMaybe)
import System.Posix.Internals
import qualified System.Posix.Env.Internal as Internal
getEnv ::
  String             ->
  IO (Maybe String) 
getEnv name = do
  litstring <- withFilePath name c_getenv
  if litstring /= nullPtr
     then Just <$> peekFilePath litstring
     else return Nothing
getEnvDefault ::
  String     ->
  String     ->
  IO String 
getEnvDefault name fallback = fromMaybe fallback <$> getEnv name
foreign import ccall unsafe "getenv"
   c_getenv :: CString -> IO CString
getEnvironmentPrim :: IO [String]
getEnvironmentPrim = Internal.getEnvironmentPrim >>= mapM peekFilePath 
getEnvironment :: IO [(String,String)] 
getEnvironment = do
  env <- getEnvironmentPrim
  return $ map (dropEq.(break ((==) '='))) env
 where
   dropEq (x,'=':ys) = (x,ys)
   dropEq (x,_)      = error $ "getEnvironment: insane variable " ++ x
setEnvironment ::
  [(String,String)]  ->
  IO ()
setEnvironment env = do
  clearEnv
  forM_ env $ \(key,value) ->
    setEnv key value True 
unsetEnv :: String  -> IO ()
{-# LINE 95 "System/Posix/Env.hsc" #-}
{-# LINE 96 "System/Posix/Env.hsc" #-}
unsetEnv name = withFilePath name $ \ s ->
  throwErrnoIfMinus1_ "unsetenv" (c_unsetenv s)
foreign import capi unsafe "HsUnix.h unsetenv"
   c_unsetenv :: CString -> IO CInt
{-# LINE 109 "System/Posix/Env.hsc" #-}
{-# LINE 112 "System/Posix/Env.hsc" #-}
putEnv :: String  -> IO ()
putEnv keyvalue = do s <- newFilePath keyvalue
                     
                     
                     
                     throwErrnoIfMinus1_ "putenv" (c_putenv s)
foreign import ccall unsafe "putenv"
   c_putenv :: CString -> IO CInt
setEnv ::
  String  ->
  String  ->
  Bool    ->
  IO ()
{-# LINE 139 "System/Posix/Env.hsc" #-}
setEnv key value ovrwrt = do
  withFilePath key $ \ keyP ->
    withFilePath value $ \ valueP ->
      throwErrnoIfMinus1_ "setenv" $
        c_setenv keyP valueP (fromIntegral (fromEnum ovrwrt))
foreign import ccall unsafe "setenv"
   c_setenv :: CString -> CString -> CInt -> IO CInt
{-# LINE 155 "System/Posix/Env.hsc" #-}
clearEnv :: IO ()
{-# LINE 159 "System/Posix/Env.hsc" #-}
clearEnv = void c_clearenv
foreign import ccall unsafe "clearenv"
  c_clearenv :: IO Int
{-# LINE 170 "System/Posix/Env.hsc" #-}