diff options
| author | jason <jkercher43@gmail.com> | 2024-08-04 01:47:10 -0400 |
|---|---|---|
| committer | jason <jkercher43@gmail.com> | 2024-08-04 01:47:10 -0400 |
| commit | c691c7dc68c517068e024df34ac166fd19d2ea0b (patch) | |
| tree | da5b8b7d2c22291982b118268963d39ab6bd27c3 | |
| parent | 2a7db08c20811139c9410b65499d27eca47e793c (diff) | |
point stdin, stdout, stderr to /dev/null if unused in os2.process_start
| -rw-r--r-- | core/os/os2/process_linux.odin | 48 |
1 files changed, 37 insertions, 11 deletions
diff --git a/core/os/os2/process_linux.odin b/core/os/os2/process_linux.odin index f645131b2..b3e9f1852 100644 --- a/core/os/os2/process_linux.odin +++ b/core/os/os2/process_linux.odin @@ -412,23 +412,51 @@ _process_start :: proc(desc: Process_Desc) -> (process: Process, err: Error) { if pid == 0 { // in child process now + stdin_fd: linux.Fd + stdout_fd: linux.Fd + stderr_fd: linux.Fd + if desc.stdin != nil { - fd := linux.Fd(fd(desc.stdin)) - if _, errno = linux.dup2(fd, STDIN); errno != .NONE { - intrinsics.trap() + stdin_fd = linux.Fd(fd(desc.stdin)) + } else { + stdin_fd, errno = linux.open("/dev/null", {}) + if errno != nil { + intrinsics.trap() // TODO: our own special pipe } } + + write_devnull: linux.Fd = -1 + if desc.stdout != nil { - fd := linux.Fd(fd(desc.stdout)) - if _, errno = linux.dup2(fd, STDOUT); errno != .NONE { - intrinsics.trap() + stdout_fd = linux.Fd(fd(desc.stdout)) + } else { + write_devnull, errno = linux.open("/dev/null", {.WRONLY}) + if errno != nil { + intrinsics.trap() // TODO } + stdout_fd = write_devnull } + if desc.stderr != nil { - fd := linux.Fd(fd(desc.stderr)) - if _, errno = linux.dup2(fd, STDERR); errno != .NONE { - intrinsics.trap() + stderr_fd = linux.Fd(fd(desc.stderr)) + } else { + if write_devnull == -1 { + write_devnull, errno = linux.open("/dev/null", {.WRONLY}) + if errno != nil { + intrinsics.trap() // TODO + } } + stderr_fd = write_devnull + } + + if _, errno = linux.dup2(stdin_fd, STDIN); errno != .NONE { + intrinsics.trap() + } + if _, errno = linux.dup2(stdout_fd, STDOUT); errno != .NONE { + intrinsics.trap() + } + if _, errno = linux.dup2(stderr_fd, STDERR); errno != .NONE { + intrinsics.trap() } if errno = linux.execveat(exe_fd, "", &cargs[0], env, {.AT_EMPTY_PATH}); errno != .NONE { @@ -437,8 +465,6 @@ _process_start :: proc(desc: Process_Desc) -> (process: Process, err: Error) { unreachable() } - // TODO: We need to come up with a way to detect the execve failure from here. - process, err = process_open(int(pid)) if err == .Unsupported { return process, nil |