mirror of https://github.com/mpv-player/mpv
subprocess: allow disabling redirection of stdout/stderr
If the stdout or stderr write callback is NULL, then don't redirect this stream. Preparation for the next commit. Not sure what to do on Windows; it seems STARTUPINFO doesn't allow redirection only one of them. So just let them write nothing. For our intended use-case (next commit), this is probably sensible.
This commit is contained in:
parent
bafb9b2271
commit
44701238c7
|
@ -66,18 +66,18 @@ int mp_subprocess(char **args, struct mp_cancel *cancel, void *ctx,
|
||||||
int p_stderr[2] = {-1, -1};
|
int p_stderr[2] = {-1, -1};
|
||||||
pid_t pid = -1;
|
pid_t pid = -1;
|
||||||
|
|
||||||
if (mp_make_cloexec_pipe(p_stdout) < 0)
|
if (on_stdout && mp_make_cloexec_pipe(p_stdout) < 0)
|
||||||
goto done;
|
goto done;
|
||||||
if (mp_make_cloexec_pipe(p_stderr) < 0)
|
if (on_stderr && mp_make_cloexec_pipe(p_stderr) < 0)
|
||||||
goto done;
|
goto done;
|
||||||
|
|
||||||
if (posix_spawn_file_actions_init(&fa))
|
if (posix_spawn_file_actions_init(&fa))
|
||||||
goto done;
|
goto done;
|
||||||
fa_destroy = true;
|
fa_destroy = true;
|
||||||
// redirect stdout and stderr
|
// redirect stdout and stderr
|
||||||
if (posix_spawn_file_actions_adddup2(&fa, p_stdout[1], 1))
|
if (p_stdout[1] >= 0 && posix_spawn_file_actions_adddup2(&fa, p_stdout[1], 1))
|
||||||
goto done;
|
goto done;
|
||||||
if (posix_spawn_file_actions_adddup2(&fa, p_stderr[1], 2))
|
if (p_stderr[1] >= 0 && posix_spawn_file_actions_adddup2(&fa, p_stderr[1], 2))
|
||||||
goto done;
|
goto done;
|
||||||
|
|
||||||
if (posix_spawnp(&pid, args[0], &fa, NULL, args, environ)) {
|
if (posix_spawnp(&pid, args[0], &fa, NULL, args, environ)) {
|
||||||
|
|
|
@ -220,6 +220,10 @@ static int async_read(HANDLE file, void *buf, unsigned size, OVERLAPPED* ol)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void write_none(void *ctx, char *data, size_t size)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
int mp_subprocess(char **args, struct mp_cancel *cancel, void *ctx,
|
int mp_subprocess(char **args, struct mp_cancel *cancel, void *ctx,
|
||||||
subprocess_read_cb on_stdout, subprocess_read_cb on_stderr,
|
subprocess_read_cb on_stdout, subprocess_read_cb on_stderr,
|
||||||
char **error)
|
char **error)
|
||||||
|
@ -233,8 +237,8 @@ int mp_subprocess(char **args, struct mp_cancel *cancel, void *ctx,
|
||||||
char buf[4096];
|
char buf[4096];
|
||||||
subprocess_read_cb read_cb;
|
subprocess_read_cb read_cb;
|
||||||
} pipes[2] = {
|
} pipes[2] = {
|
||||||
{ .read_cb = on_stdout },
|
{ .read_cb = on_stdout ? on_stdout : write_none },
|
||||||
{ .read_cb = on_stderr },
|
{ .read_cb = on_stderr ? on_stderr : write_none },
|
||||||
};
|
};
|
||||||
|
|
||||||
// If the function exits before CreateProcess, there was an init error
|
// If the function exits before CreateProcess, there was an init error
|
||||||
|
|
Loading…
Reference in New Issue