summaryrefslogtreecommitdiff
path: root/Utility/UserInfo.hs
diff options
context:
space:
mode:
Diffstat (limited to 'Utility/UserInfo.hs')
-rw-r--r--Utility/UserInfo.hs27
1 files changed, 16 insertions, 11 deletions
diff --git a/Utility/UserInfo.hs b/Utility/UserInfo.hs
index 17ce8db..827229d 100644
--- a/Utility/UserInfo.hs
+++ b/Utility/UserInfo.hs
@@ -19,31 +19,32 @@ import Utility.Exception
#ifndef mingw32_HOST_OS
import Utility.Data
import Control.Applicative
+import System.Posix.User
+#if MIN_VERSION_unix(2,8,0)
+import System.Posix.User.ByteString (UserEntry)
+#endif
#endif
-import System.PosixCompat
import Prelude
{- Current user's home directory.
-
- getpwent will fail on LDAP or NIS, so use HOME if set. -}
myHomeDir :: IO FilePath
-myHomeDir = either giveup return =<< myVal env homeDirectory
- where
+myHomeDir = either giveup return =<<
#ifndef mingw32_HOST_OS
- env = ["HOME"]
+ myVal ["HOME"] homeDirectory
#else
- env = ["USERPROFILE", "HOME"] -- HOME is used in Cygwin
+ myVal ["USERPROFILE", "HOME"] -- HOME is used in Cygwin
#endif
{- Current user's user name. -}
myUserName :: IO (Either String String)
-myUserName = myVal env userName
- where
+myUserName =
#ifndef mingw32_HOST_OS
- env = ["USER", "LOGNAME"]
+ myVal ["USER", "LOGNAME"] userName
#else
- env = ["USERNAME", "USER", "LOGNAME"]
+ myVal ["USERNAME", "USER", "LOGNAME"]
#endif
myUserGecos :: IO (Maybe String)
@@ -54,16 +55,20 @@ myUserGecos = return Nothing
myUserGecos = eitherToMaybe <$> myVal [] userGecos
#endif
+#ifndef mingw32_HOST_OS
myVal :: [String] -> (UserEntry -> String) -> IO (Either String String)
myVal envvars extract = go envvars
where
go [] = either (const $ envnotset) (Right . extract) <$> get
go (v:vs) = maybe (go vs) (return . Right) =<< getEnv v
-#ifndef mingw32_HOST_OS
-- This may throw an exception if the system doesn't have a
-- passwd file etc; don't let it crash.
get = tryNonAsync $ getUserEntryForID =<< getEffectiveUserID
#else
- get = return envnotset
+myVal :: [String] -> IO (Either String String)
+myVal envvars = go envvars
+ where
+ go [] = return envnotset
+ go (v:vs) = maybe (go vs) (return . Right) =<< getEnv v
#endif
envnotset = Left ("environment not set: " ++ show envvars)