Avoid prematurely closing file descriptors when redirecting IO

This commit is contained in:
Michael Camilleri 2023-06-23 15:50:19 +09:00
parent c3f4dc0c15
commit f977ace7f8
No known key found for this signature in database
GPG Key ID: 7EB218A48DF8B572
2 changed files with 18 additions and 5 deletions

View File

@ -1145,14 +1145,16 @@ static Janet os_execute_impl(int32_t argc, Janet *argv, int is_spawn) {
posix_spawn_file_actions_addclose(&actions, pipe_in); posix_spawn_file_actions_addclose(&actions, pipe_in);
} else if (new_in != JANET_HANDLE_NONE && new_in != 0) { } else if (new_in != JANET_HANDLE_NONE && new_in != 0) {
posix_spawn_file_actions_adddup2(&actions, new_in, 0); posix_spawn_file_actions_adddup2(&actions, new_in, 0);
posix_spawn_file_actions_addclose(&actions, new_in); if (new_in != new_out && new_in != new_err)
posix_spawn_file_actions_addclose(&actions, new_in);
} }
if (pipe_out != JANET_HANDLE_NONE) { if (pipe_out != JANET_HANDLE_NONE) {
posix_spawn_file_actions_adddup2(&actions, pipe_out, 1); posix_spawn_file_actions_adddup2(&actions, pipe_out, 1);
posix_spawn_file_actions_addclose(&actions, pipe_out); posix_spawn_file_actions_addclose(&actions, pipe_out);
} else if (new_out != JANET_HANDLE_NONE && new_out != 1) { } else if (new_out != JANET_HANDLE_NONE && new_out != 1) {
posix_spawn_file_actions_adddup2(&actions, new_out, 1); posix_spawn_file_actions_adddup2(&actions, new_out, 1);
posix_spawn_file_actions_addclose(&actions, new_out); if (new_out != new_err)
posix_spawn_file_actions_addclose(&actions, new_out);
} }
if (pipe_err != JANET_HANDLE_NONE) { if (pipe_err != JANET_HANDLE_NONE) {
posix_spawn_file_actions_adddup2(&actions, pipe_err, 2); posix_spawn_file_actions_adddup2(&actions, pipe_err, 2);

View File

@ -94,9 +94,9 @@
(assert (= (length buf) 2) "cryptorand appends to buffer")) (assert (= (length buf) 2) "cryptorand appends to buffer"))
# 80db68210 # 80db68210
(assert-no-error (os/clock :realtime) "realtime clock") (assert-no-error "realtime clock" (os/clock :realtime))
(assert-no-error (os/clock :cputime) "cputime clock") (assert-no-error "cputime clock" (os/clock :cputime))
(assert-no-error (os/clock :monotonic) "monotonic clock") (assert-no-error "monotonic clock" (os/clock :monotonic))
(def before (os/clock :monotonic)) (def before (os/clock :monotonic))
(def after (os/clock :monotonic)) (def after (os/clock :monotonic))
@ -129,5 +129,16 @@
(string/format "(os/exit %d)" i)] :p)) (string/format "(os/exit %d)" i)] :p))
(string "os/execute " i))) (string "os/execute " i)))
# os/execute IO redirection
(assert-no-error "IO redirection"
(defn devnull []
(def os (os/which))
(def path (if (or (= os :mingw) (= os :windows))
"NUL"
"/dev/null"))
(os/open path :w))
(with [dn (devnull)]
(os/execute ["ls"] :px {:out dn :err dn})))
(end-suite) (end-suite)