summaryrefslogtreecommitdiffstats
path: root/osdep/subprocess-posix.c
diff options
context:
space:
mode:
Diffstat (limited to 'osdep/subprocess-posix.c')
-rw-r--r--osdep/subprocess-posix.c27
1 files changed, 12 insertions, 15 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";