зеркало из https://github.com/microsoft/git.git
Use start_command() to run content filters instead of explicit fork/exec.
The previous code already used finish_command() to wait for the process to terminate, but did not use start_command() to run it. Signed-off-by: Johannes Sixt <johannes.sixt@telecom.at> Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
This commit is contained in:
Родитель
f364cb8823
Коммит
dc1bfdcd1a
30
convert.c
30
convert.c
|
@ -199,34 +199,18 @@ static int filter_buffer(const char *path, const char *src,
|
||||||
* Spawn cmd and feed the buffer contents through its stdin.
|
* Spawn cmd and feed the buffer contents through its stdin.
|
||||||
*/
|
*/
|
||||||
struct child_process child_process;
|
struct child_process child_process;
|
||||||
int pipe_feed[2];
|
|
||||||
int write_err, status;
|
int write_err, status;
|
||||||
|
const char *argv[] = { "sh", "-c", cmd, NULL };
|
||||||
|
|
||||||
memset(&child_process, 0, sizeof(child_process));
|
memset(&child_process, 0, sizeof(child_process));
|
||||||
|
child_process.argv = argv;
|
||||||
|
child_process.in = -1;
|
||||||
|
|
||||||
if (pipe(pipe_feed) < 0) {
|
if (start_command(&child_process))
|
||||||
error("cannot create pipe to run external filter %s", cmd);
|
return error("cannot fork to run external filter %s", cmd);
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
child_process.pid = fork();
|
write_err = (write_in_full(child_process.in, src, size) < 0);
|
||||||
if (child_process.pid < 0) {
|
if (close(child_process.in))
|
||||||
error("cannot fork to run external filter %s", cmd);
|
|
||||||
close(pipe_feed[0]);
|
|
||||||
close(pipe_feed[1]);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
if (!child_process.pid) {
|
|
||||||
dup2(pipe_feed[0], 0);
|
|
||||||
close(pipe_feed[0]);
|
|
||||||
close(pipe_feed[1]);
|
|
||||||
execlp("sh", "sh", "-c", cmd, NULL);
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
close(pipe_feed[0]);
|
|
||||||
|
|
||||||
write_err = (write_in_full(pipe_feed[1], src, size) < 0);
|
|
||||||
if (close(pipe_feed[1]))
|
|
||||||
write_err = 1;
|
write_err = 1;
|
||||||
if (write_err)
|
if (write_err)
|
||||||
error("cannot feed the input to external filter %s", cmd);
|
error("cannot feed the input to external filter %s", cmd);
|
||||||
|
|
Загрузка…
Ссылка в новой задаче