2 % (c) The GRASP/AQUA Project, Glasgow University, 1995-1997
4 \section[PosixDB]{Haskell 1.4 POSIX System Databases}
11 getUserEntryForID, -- :: UserID -> IO UserEntry
12 getUserEntryForName, -- :: String -> IO UserEntry
14 getGroupEntryForID, -- :: GroupID -> IO GroupEntry
15 getGroupEntryForName -- :: String -> IO GroupEntry
20 import PackedString (psToByteArrayST)
25 import Util ( unvectorize )
31 groupMembers :: [String]
38 userGroupID :: GroupID,
39 homeDirectory :: String,
44 getGroupEntryForID :: GroupID -> IO GroupEntry
45 getGroupEntryForID gid =
46 _ccall_ getgrgid gid >>= \ ptr ->
47 if ptr == (``NULL'' :: Addr) then
48 fail (IOError Nothing NoSuchThing
49 "getGroupEntryForID: no such group entry")
53 getGroupEntryForName :: String -> IO GroupEntry
54 getGroupEntryForName name =
55 stToIO (psToByteArrayST name) >>= \ gname ->
56 _ccall_ getgrnam gname >>= \ ptr ->
57 if ptr == (``NULL'' :: Addr) then
58 fail (IOError Nothing NoSuchThing
59 "getGroupEntryForName: no such group entry")
63 getUserEntryForID :: UserID -> IO UserEntry
64 getUserEntryForID uid =
65 _ccall_ getpwuid uid >>= \ ptr ->
66 if ptr == ``NULL'' then
67 fail (IOError Nothing NoSuchThing
68 "getUserEntryForID: no such user entry")
72 getUserEntryForName :: String -> IO UserEntry
73 getUserEntryForName name =
74 stToIO (psToByteArrayST name) >>= \ uname ->
75 _ccall_ getpwnam uname >>= \ ptr ->
76 if ptr == ``NULL'' then
77 fail (IOError Nothing NoSuchThing
78 "getUserEntryForName: no such user entry")
83 Local utility functions
86 -- Copy the static structure returned by getgr* into a Haskell structure
88 unpackGroupEntry :: Addr -> IO GroupEntry
89 unpackGroupEntry ptr =
91 str <- _casm_ ``%r = ((struct group *)%0)->gr_name;'' ptr
93 gid <- _casm_ ``%r = ((struct group *)%0)->gr_gid;'' ptr
94 mem <- _casm_ ``%r = ((struct group *)%0)->gr_mem;'' ptr
95 members <- unvectorize mem 0
96 return (GroupEntry name gid members)
98 -- Copy the static structure returned by getpw* into a Haskell structure
100 unpackUserEntry :: Addr -> IO UserEntry
101 unpackUserEntry ptr =
103 str <- _casm_ ``%r = ((struct passwd *)%0)->pw_name;'' ptr
105 uid <- _casm_ ``%r = ((struct passwd *)%0)->pw_uid;'' ptr
106 gid <- _casm_ ``%r = ((struct passwd *)%0)->pw_gid;'' ptr
107 str <- _casm_ ``%r = ((struct passwd *)%0)->pw_dir;'' ptr
109 str <- _casm_ ``%r = ((struct passwd *)%0)->pw_shell;'' ptr
111 return (UserEntry name uid gid home shell)