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)
30 groupMembers :: [String]
37 userGroupID :: GroupID,
38 homeDirectory :: String,
43 getGroupEntryForID :: GroupID -> IO GroupEntry
44 getGroupEntryForID gid =
45 _ccall_ getgrgid gid >>= \ ptr ->
46 if ptr == (``NULL'' :: Addr) then
47 fail (IOError Nothing NoSuchThing
48 "getGroupEntryForID: no such group entry")
52 getGroupEntryForName :: String -> IO GroupEntry
53 getGroupEntryForName name =
54 stToIO (psToByteArrayST name) >>= \ gname ->
55 _ccall_ getgrnam gname >>= \ ptr ->
56 if ptr == (``NULL'' :: Addr) then
57 fail (IOError Nothing NoSuchThing
58 "getGroupEntryForName: no such group entry")
62 getUserEntryForID :: UserID -> IO UserEntry
63 getUserEntryForID uid =
64 _ccall_ getpwuid uid >>= \ ptr ->
65 if ptr == ``NULL'' then
66 fail (IOError Nothing NoSuchThing
67 "getUserEntryForID: no such user entry")
71 getUserEntryForName :: String -> IO UserEntry
72 getUserEntryForName name =
73 stToIO (psToByteArrayST name) >>= \ uname ->
74 _ccall_ getpwnam uname >>= \ ptr ->
75 if ptr == ``NULL'' then
76 fail (IOError Nothing NoSuchThing
77 "getUserEntryForName: no such user entry")
82 Local utility functions
85 -- Copy the static structure returned by getgr* into a Haskell structure
87 unpackGroupEntry :: Addr -> IO GroupEntry
88 unpackGroupEntry ptr =
90 str <- _casm_ ``%r = ((struct group *)%0)->gr_name;'' ptr
92 gid <- _casm_ ``%r = ((struct group *)%0)->gr_gid;'' ptr
93 mem <- _casm_ ``%r = ((struct group *)%0)->gr_mem;'' ptr
94 members <- unvectorize mem 0
95 return (GroupEntry name gid members)
97 -- Copy the static structure returned by getpw* into a Haskell structure
99 unpackUserEntry :: Addr -> IO UserEntry
100 unpackUserEntry ptr =
102 str <- _casm_ ``%r = ((struct passwd *)%0)->pw_name;'' ptr
104 uid <- _casm_ ``%r = ((struct passwd *)%0)->pw_uid;'' ptr
105 gid <- _casm_ ``%r = ((struct passwd *)%0)->pw_gid;'' ptr
106 str <- _casm_ ``%r = ((struct passwd *)%0)->pw_dir;'' ptr
108 str <- _casm_ ``%r = ((struct passwd *)%0)->pw_shell;'' ptr
110 return (UserEntry name uid gid home shell)