Import Upstream version 20180207
[hcoop/debian/mlton.git] / basis-library / posix / sys-db.sml
CommitLineData
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
9structure 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