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
24 import CString ( unvectorize, strcpy, packStringIO )
34 groupMembers :: [String]
41 userGroupID :: GroupID,
42 homeDirectory :: String,
47 getGroupEntryForID :: GroupID -> IO GroupEntry
48 getGroupEntryForID gid = do
49 ptr <- _ccall_ getgrgid gid
50 if ptr == nullAddr then
51 fail (IOError Nothing NoSuchThing
52 "getGroupEntryForID" "no such group entry")
56 getGroupEntryForName :: String -> IO GroupEntry
57 getGroupEntryForName name = do
58 gname <- packStringIO name
59 ptr <- _ccall_ getgrnam gname
60 if ptr == nullAddr then
61 fail (IOError Nothing NoSuchThing
62 "getGroupEntryForName" "no such group entry")
66 getUserEntryForID :: UserID -> IO UserEntry
67 getUserEntryForID uid = do
68 ptr <- _ccall_ getpwuid uid
69 if ptr == nullAddr then
70 fail (IOError Nothing NoSuchThing
71 "getUserEntryForID" "no such user entry")
75 getUserEntryForName :: String -> IO UserEntry
76 getUserEntryForName name = do
77 uname <- packStringIO name
78 ptr <- _ccall_ getpwnam uname
79 if ptr == nullAddr then
80 fail (IOError Nothing NoSuchThing
81 "getUserEntryForName" "no such user entry")
86 Local utility functions
89 -- Copy the static structure returned by getgr* into a Haskell structure
91 unpackGroupEntry :: Addr -> IO GroupEntry
92 unpackGroupEntry ptr =
94 str <- _casm_ ``%r = ((struct group *)%0)->gr_name;'' ptr
96 gid <- _casm_ ``%r = ((struct group *)%0)->gr_gid;'' ptr
97 mem <- _casm_ ``%r = ((struct group *)%0)->gr_mem;'' ptr
98 members <- unvectorize mem 0
99 return (GroupEntry name gid members)
101 -- Copy the static structure returned by getpw* into a Haskell structure
103 unpackUserEntry :: Addr -> IO UserEntry
104 unpackUserEntry ptr =
106 str <- _casm_ ``%r = ((struct passwd *)%0)->pw_name;'' ptr
108 uid <- _casm_ ``%r = ((struct passwd *)%0)->pw_uid;'' ptr
109 gid <- _casm_ ``%r = ((struct passwd *)%0)->pw_gid;'' ptr
110 str <- _casm_ ``%r = ((struct passwd *)%0)->pw_dir;'' ptr
112 str <- _casm_ ``%r = ((struct passwd *)%0)->pw_shell;'' ptr
114 return (UserEntry name uid gid home shell)