From ff1d3a67da1e7f7af6a760ba5f0cee70763666da Mon Sep 17 00:00:00 2001 From: Andreas Gruenbacher Date: Fri, 6 Apr 2018 20:24:07 +0200 Subject: [PATCH 08/17] Use gnulib execute module * bootstrap.conf (gnulib_modules): Add execute. * src/pch.c (do_ed_script): Switch from fork + execlp to execute. --- bootstrap.conf | 1 + m4/.gitignore | 13 +++++++++++++ src/pch.c | 40 +++++++++++++++++++++------------------- 3 files changed, 35 insertions(+), 19 deletions(-) diff --git a/src/pch.c b/src/pch.c index 16e001a..1f14624 100644 --- a/src/pch.c +++ b/src/pch.c @@ -33,7 +33,8 @@ # include #endif #include -#include +#include +#include "execute.h" #define INITHUNKMAX 125 /* initial dynamic allocation size */ @@ -2453,6 +2454,9 @@ do_ed_script (char const *inname, char const *outname, if (! dry_run && ! skip_rest_of_patch) { int exclusive = *outname_needs_removal ? 0 : O_EXCL; + char const **ed_argv; + int stdin_dup, status; + *outname_needs_removal = true; if (inerrno != ENOENT) { @@ -2461,24 +2465,22 @@ do_ed_script (char const *inname, char const *outname, } fflush (stdout); - pid = fork(); - if (pid == -1) - pfatal ("Can't fork"); - else if (pid == 0) - { - dup2 (tmpfd, 0); - assert (outname[0] != '!' && outname[0] != '-'); - execlp (editor_program, editor_program, "-", outname, (char *) NULL); - _exit (2); - } - else - { - int wstatus; - if (waitpid (pid, &wstatus, 0) == -1 - || ! WIFEXITED (wstatus) - || WEXITSTATUS (wstatus) != 0) - fatal ("%s FAILED", editor_program); - } + if ((stdin_dup = dup (0)) == -1 + || dup2 (tmpfd, 0) == -1) + pfatal ("Failed to duplicate standard input"); + assert (outname[0] != '!' && outname[0] != '-'); + ed_argv = alloca (4 * sizeof * ed_argv); + ed_argv[0] = editor_program; + ed_argv[1] = "-"; + ed_argv[2] = outname; + ed_argv[3] = (char *) NULL; + status = execute (editor_program, editor_program, (char **)ed_argv, + false, false, false, false, true, false, NULL); + if (status) + fatal ("%s FAILED", editor_program); + if (dup2 (stdin_dup, 0) == -1 + || close (stdin_dup) == -1) + pfatal ("Failed to duplicate standard input"); } fclose (tmpfp); -- 2.11.0