Commit | Line | Data |
---|---|---|
7f918cf1 CE |
1 | (* Copyright (C) 1999-2006, 2008 Henry Cejtin, Matthew Fluet, Suresh |
2 | * Jagannathan, and Stephen Weeks. | |
3 | * Copyright (C) 1997-2000 NEC Research Institute. | |
4 | * | |
5 | * MLton is released under a BSD-style license. | |
6 | * See the file MLton-LICENSE for details. | |
7 | *) | |
8 | ||
9 | structure PosixSysDB: POSIX_SYS_DB = | |
10 | struct | |
11 | structure Prim = PrimitiveFFI.Posix.SysDB | |
12 | structure GId = PrePosix.GId | |
13 | structure UId = PrePosix.UId | |
14 | ||
15 | structure Error = PosixError | |
16 | structure SysCall = Error.SysCall | |
17 | ||
18 | type gid = GId.t | |
19 | type uid = UId.t | |
20 | ||
21 | structure Passwd = | |
22 | struct | |
23 | type passwd = {name: string, | |
24 | uid: uid, | |
25 | gid: gid, | |
26 | home: string, | |
27 | shell: string} | |
28 | ||
29 | structure Passwd = Prim.Passwd | |
30 | ||
31 | fun fromC (f: unit -> C_Int.t C_Errno.t, fname, fitem): passwd = | |
32 | SysCall.syscallErr | |
33 | ({clear = true, restart = false, errVal = C_Int.zero}, fn () => | |
34 | {return = f (), | |
35 | post = fn _ => {name = CUtil.C_String.toString (Passwd.getName ()), | |
36 | uid = UId.fromRep (Passwd.getUId ()), | |
37 | gid = GId.fromRep (Passwd.getGId ()), | |
38 | home = CUtil.C_String.toString (Passwd.getDir ()), | |
39 | shell = CUtil.C_String.toString (Passwd.getShell ())}, | |
40 | handlers = [(Error.cleared, fn () => | |
41 | raise Error.SysErr (concat ["Posix.SysDB.", | |
42 | fname, | |
43 | ": no group with ", | |
44 | fitem], NONE))]}) | |
45 | ||
46 | val name: passwd -> string = #name | |
47 | val uid: passwd -> uid = #uid | |
48 | val gid: passwd -> gid = #gid | |
49 | val home: passwd -> string = #home | |
50 | val shell: passwd -> string = #shell | |
51 | end | |
52 | ||
53 | fun getpwnam name = | |
54 | let val name = NullString.nullTerm name | |
55 | in Passwd.fromC (fn () => Prim.getpwnam name, "getpwnam", "name") | |
56 | end | |
57 | ||
58 | fun getpwuid uid = | |
59 | let val uid = UId.toRep uid | |
60 | in Passwd.fromC (fn () => Prim.getpwuid uid, "getpwuid", "user id") | |
61 | end | |
62 | ||
63 | structure Group = | |
64 | struct | |
65 | type group = {name: string, | |
66 | gid: gid, | |
67 | members: string list} | |
68 | ||
69 | structure Group = Prim.Group | |
70 | ||
71 | fun fromC (f: unit -> C_Int.t C_Errno.t, fname, fitem): group = | |
72 | SysCall.syscallErr | |
73 | ({clear = true, restart = false, errVal = C_Int.zero}, fn () => | |
74 | {return = f (), | |
75 | post = fn _ => {name = CUtil.C_String.toString (Group.getName ()), | |
76 | gid = GId.fromRep (Group.getGId ()), | |
77 | members = CUtil.C_StringArray.toList (Group.getMem ())}, | |
78 | handlers = [(Error.cleared, fn () => | |
79 | raise Error.SysErr (concat ["Posix.SysDB.", | |
80 | fname, | |
81 | ": no group with ", | |
82 | fitem], NONE))]}) | |
83 | ||
84 | val name: group -> string = #name | |
85 | val gid: group -> gid = #gid | |
86 | val members: group -> string list = #members | |
87 | end | |
88 | ||
89 | fun getgrnam name = | |
90 | let val name = NullString.nullTerm name | |
91 | in Group.fromC (fn () => Prim.getgrnam name, "getgrnam", "name") | |
92 | end | |
93 | ||
94 | fun getgrgid gid = | |
95 | let val gid = GId.toRep gid | |
96 | in Group.fromC (fn () => Prim.getgrgid gid, "getgrgid", "group id") | |
97 | end | |
98 | end |