1{-# LANGUAGE CPP #-}
2
3{-|
4This module makes the operations exported by @System.Posix.User@
5available on all platforms. On POSIX systems it re-exports operations from
6@System.Posix.User@. On other platforms it provides dummy implementations.
7-}
8module System.PosixCompat.User (
9    -- * User environment
10    -- ** Querying the user environment
11      getRealUserID
12    , getRealGroupID
13    , getEffectiveUserID
14    , getEffectiveGroupID
15    , getGroups
16    , getLoginName
17    , getEffectiveUserName
18
19    -- *** The group database
20    , GroupEntry(..)
21    , getGroupEntryForID
22    , getGroupEntryForName
23    , getAllGroupEntries
24
25    -- *** The user database
26    , UserEntry(..)
27    , getUserEntryForID
28    , getUserEntryForName
29    , getAllUserEntries
30
31    -- ** Modifying the user environment
32    , setUserID
33    , setGroupID
34    ) where
35
36#ifndef mingw32_HOST_OS
37
38#include "HsUnixCompat.h"
39
40import System.Posix.User
41
42#if __GLASGOW_HASKELL__<605
43getAllGroupEntries :: IO [GroupEntry]
44getAllGroupEntries = return []
45
46getAllUserEntries :: IO [UserEntry]
47getAllUserEntries = return []
48#endif
49
50#else /* Portable implementation */
51
52import System.IO.Error
53import System.PosixCompat.Types
54
55unsupported :: String -> IO a
56unsupported f = ioError $ mkIOError illegalOperationErrorType x Nothing Nothing
57    where x = "System.PosixCompat.User." ++ f ++ ": not supported"
58
59-- -----------------------------------------------------------------------------
60-- User environment
61
62getRealUserID :: IO UserID
63getRealUserID = unsupported "getRealUserID"
64
65getRealGroupID :: IO GroupID
66getRealGroupID = unsupported "getRealGroupID"
67
68getEffectiveUserID :: IO UserID
69getEffectiveUserID = unsupported "getEffectiveUserID"
70
71getEffectiveGroupID :: IO GroupID
72getEffectiveGroupID = unsupported "getEffectiveGroupID"
73
74getGroups :: IO [GroupID]
75getGroups = return []
76
77getLoginName :: IO String
78getLoginName = unsupported "getLoginName"
79
80setUserID :: UserID -> IO ()
81setUserID _ = return ()
82
83setGroupID :: GroupID -> IO ()
84setGroupID _ = return ()
85
86-- -----------------------------------------------------------------------------
87-- User names
88
89getEffectiveUserName :: IO String
90getEffectiveUserName = unsupported "getEffectiveUserName"
91
92-- -----------------------------------------------------------------------------
93-- The group database
94
95data GroupEntry = GroupEntry
96    { groupName     :: String
97    , groupPassword :: String
98    , groupID       :: GroupID
99    , groupMembers  :: [String]
100    } deriving (Show, Read, Eq)
101
102getGroupEntryForID :: GroupID -> IO GroupEntry
103getGroupEntryForID _ = unsupported "getGroupEntryForID"
104
105getGroupEntryForName :: String -> IO GroupEntry
106getGroupEntryForName _ = unsupported "getGroupEntryForName"
107
108getAllGroupEntries :: IO [GroupEntry]
109getAllGroupEntries = return []
110
111-- -----------------------------------------------------------------------------
112-- The user database (pwd.h)
113
114data UserEntry = UserEntry
115    { userName      :: String
116    , userPassword  :: String
117    , userID        :: UserID
118    , userGroupID   :: GroupID
119    , userGecos     :: String
120    , homeDirectory :: String
121    , userShell     :: String
122    } deriving (Show, Read, Eq)
123
124getUserEntryForID :: UserID -> IO UserEntry
125getUserEntryForID _ = unsupported "getUserEntryForID"
126
127getUserEntryForName :: String -> IO UserEntry
128getUserEntryForName _ = unsupported "getUserEntryForName"
129
130getAllUserEntries :: IO [UserEntry]
131getAllUserEntries = return []
132
133#endif
134