1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
open Eio.Std
module Impl = struct
type t = Low_level.Process.t
type tag = [ `Generic | `Unix ]
let pid = Low_level.Process.pid
let await t =
match Eio.Promise.await @@ Low_level.Process.exit_status t with
| Unix.WEXITED i -> `Exited i
| Unix.WSIGNALED i -> `Signaled i
| Unix.WSTOPPED _ -> assert false
let signal = Low_level.Process.signal
end
let process =
let handler = Eio.Process.Pi.process (module Impl) in
fun proc -> Eio.Resource.T (proc, handler)
module Mgr = struct
module T = struct
type t = unit
let spawn_unix () ~sw ?cwd ?pgid ?uid ?gid ?login_tty ~env ~fds ~executable args =
let login_tty_action, fds = match login_tty with
| None -> [], fds
| Some tty ->
let fds = [
0, tty, `Blocking;
1, tty, `Blocking;
2, tty, `Blocking;
] @ fds in
[Eio_unix.Private.Fork_action.login_tty tty], fds
in
let actions = Low_level.Process.Fork_action.(
login_tty_action @
[ Eio_unix.Private.Fork_action.inherit_fds fds;
execve executable ~argv:(Array.of_list args) ~env ]
) in
let actions = match pgid with
| None -> actions
| Some pgid -> Eio_unix.Private.Fork_action.setpgid pgid :: actions
in
let actions = match uid with
| None -> actions
| Some uid -> Eio_unix.Private.Fork_action.setuid uid :: actions
in
let actions = match gid with
| None -> actions
| Some gid -> Eio_unix.Private.Fork_action.setgid gid :: actions
in
let with_actions cwd fn = match cwd with
| None -> fn actions
| Some (fd, s) ->
match Fs.get_dir_fd_opt fd with
| None -> Fmt.invalid_arg "cwd is not an OS directory!"
| Some dir_fd ->
Fs.with_dir dir_fd s @@ fun cwd ->
fn (Low_level.Process.Fork_action.fchdir cwd :: actions)
in
with_actions cwd @@ fun actions ->
process (Low_level.Process.spawn ~sw actions)
end
include Eio_unix.Process.Make_mgr (T)
end
let mgr : Eio_unix.Process.mgr_ty r =
let h = Eio_unix.Process.Pi.mgr_unix (module Mgr) in
Eio.Resource.T ((), h)