summaryrefslogtreecommitdiffstats
path: root/patches/0008-Use-gnulib-execute-module.patch
blob: 847d20abc33160422708e525165f076c657f887b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
From ff1d3a67da1e7f7af6a760ba5f0cee70763666da Mon Sep 17 00:00:00 2001
From: Andreas Gruenbacher <agruen@gnu.org>
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 <io.h>
 #endif
 #include <safe.h>
-#include <sys/wait.h>
+#include <alloca.h>
+#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