diff options
Diffstat (limited to 'osdep')
-rw-r--r-- | osdep/subprocess-posix.c | 27 | ||||
-rw-r--r-- | osdep/terminal-unix.c | 17 |
2 files changed, 24 insertions, 20 deletions
diff --git a/osdep/subprocess-posix.c b/osdep/subprocess-posix.c index 163559edbc..c780473fce 100644 --- a/osdep/subprocess-posix.c +++ b/osdep/subprocess-posix.c @@ -32,6 +32,8 @@ extern char **environ; +#define SAFE_CLOSE(fd) do { if ((fd) >= 0) close((fd)); (fd) = -1; } while (0) + // A silly helper: automatically skips entries with negative FDs static int sparse_poll(struct pollfd *fds, int num_fds, int timeout) { @@ -93,12 +95,9 @@ int mp_subprocess(char **args, struct mp_cancel *cancel, void *ctx, } spawned = true; - close(p_stdout[1]); - p_stdout[1] = -1; - close(p_stderr[1]); - p_stderr[1] = -1; - close(devnull); - devnull = -1; + SAFE_CLOSE(p_stdout[1]); + SAFE_CLOSE(p_stderr[1]); + SAFE_CLOSE(devnull); int *read_fds[2] = {&p_stdout[0], &p_stderr[0]}; subprocess_read_cb read_cbs[2] = {on_stdout, on_stderr}; @@ -119,10 +118,8 @@ int mp_subprocess(char **args, struct mp_cancel *cancel, void *ctx, continue; if (r > 0 && read_cbs[n]) read_cbs[n](ctx, buf, r); - if (r <= 0) { - close(*read_fds[n]); - *read_fds[n] = -1; - } + if (r <= 0) + SAFE_CLOSE(*read_fds[n]); } } if (fds[2].revents) { @@ -141,11 +138,11 @@ int mp_subprocess(char **args, struct mp_cancel *cancel, void *ctx, done: if (fa_destroy) posix_spawn_file_actions_destroy(&fa); - close(p_stdout[0]); - close(p_stdout[1]); - close(p_stderr[0]); - close(p_stderr[1]); - close(devnull); + SAFE_CLOSE(p_stdout[0]); + SAFE_CLOSE(p_stdout[1]); + SAFE_CLOSE(p_stderr[0]); + SAFE_CLOSE(p_stderr[1]); + SAFE_CLOSE(devnull); if (!spawned || (WIFEXITED(status) && WEXITSTATUS(status) == 127)) { *error = "init"; diff --git a/osdep/terminal-unix.c b/osdep/terminal-unix.c index ffd6ee486c..eca6c69461 100644 --- a/osdep/terminal-unix.c +++ b/osdep/terminal-unix.c @@ -368,7 +368,16 @@ static void continue_sighandler(int signum) static pthread_t input_thread; static struct input_ctx *input_ctx; -static int death_pipe[2]; +static int death_pipe[2] = {-1, -1}; + +static void close_death_pipe(void) +{ + for (int n = 0; n < 2; n++) { + if (death_pipe[n] >= 0) + close(death_pipe[n]); + death_pipe[n] = -1; + } +} static void quit_request_sighandler(int signum) { @@ -421,8 +430,7 @@ void terminal_setup_getch(struct input_ctx *ictx) if (pthread_create(&input_thread, NULL, terminal_thread, NULL)) { input_ctx = NULL; - close(death_pipe[0]); - close(death_pipe[1]); + close_death_pipe(); return; } @@ -450,8 +458,7 @@ void terminal_uninit(void) if (input_ctx) { (void)write(death_pipe[1], &(char){0}, 1); pthread_join(input_thread, NULL); - close(death_pipe[0]); - close(death_pipe[1]); + close_death_pipe(); input_ctx = NULL; } |