Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 27 Aug 2015 21:52:10 +0000 (UTC)
From:      Xin LI <delphij@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-10@freebsd.org
Subject:   svn commit: r287223 - stable/10/usr.bin/patch
Message-ID:  <201508272152.t7RLqA8K068282@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: delphij
Date: Thu Aug 27 21:52:09 2015
New Revision: 287223
URL: https://svnweb.freebsd.org/changeset/base/287223

Log:
  MFC r281800 (pfg):
  
  patch(1): small include changes.
  
  Mostly to match OpenBSD, no functional change.
  
  MFC r286601 + 286617:
  
  use posix_spawn(3) instead of fork() and exec() manually as suggested
  by jmg@.

Modified:
  stable/10/usr.bin/patch/inp.c
  stable/10/usr.bin/patch/pch.c
  stable/10/usr.bin/patch/util.c
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/usr.bin/patch/inp.c
==============================================================================
--- stable/10/usr.bin/patch/inp.c	Thu Aug 27 21:27:47 2015	(r287222)
+++ stable/10/usr.bin/patch/inp.c	Thu Aug 27 21:52:09 2015	(r287223)
@@ -36,8 +36,10 @@
 #include <ctype.h>
 #include <errno.h>
 #include <libgen.h>
-#include <limits.h>
+#include <paths.h>
+#include <spawn.h>
 #include <stddef.h>
+#include <stdint.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -134,14 +136,13 @@ reallocate_lines(size_t *lines_allocated
 static bool
 plan_a(const char *filename)
 {
-	int		ifd, statfailed, devnull, pstat;
+	int		ifd, statfailed, pstat;
 	char		*p, *s, lbuf[INITLINELEN];
 	struct stat	filestat;
 	ptrdiff_t	sz;
 	size_t		i;
 	size_t		iline, lines_allocated;
 	pid_t		pid;
-	char		*argp[4] = {NULL};
 
 #ifdef DEBUGGING
 	if (debug & 8)
@@ -178,7 +179,9 @@ plan_a(const char *filename)
 	    ((filestat.st_mode & 0022) == 0 && filestat.st_uid != getuid())) {
 		char	*filebase, *filedir;
 		struct stat	cstat;
-		char *tmp_filename1, *tmp_filename2;
+		char	*tmp_filename1, *tmp_filename2;
+		char	*argp[4] = { NULL };
+		posix_spawn_file_actions_t file_actions;
 
 		tmp_filename1 = strdup(filename);
 		tmp_filename2 = strdup(filename);
@@ -188,6 +191,8 @@ plan_a(const char *filename)
 		filebase = basename(tmp_filename1);
 		filedir = dirname(tmp_filename2);
 
+		memset(argp, 0, sizeof(argp));
+
 #define try(f, a1, a2, a3) \
 	(snprintf(lbuf, sizeof(lbuf), f, a1, a2, a3), stat(lbuf, &cstat) == 0)
 
@@ -213,50 +218,39 @@ plan_a(const char *filename)
 					say("Comparing file %s to default "
 					    "RCS version...\n", filename);
 
-				switch (pid = fork()) {
-				case -1:
-					fatal("can't fork: %s\n",
-					    strerror(errno));
-				case 0:
-					devnull = open("/dev/null", O_RDONLY);
-					if (devnull == -1) {
-						fatal("can't open /dev/null: %s",
-						    strerror(errno));
-					}
-					(void)dup2(devnull, STDOUT_FILENO);
-					argp[0] = strdup(RCSDIFF);
-					argp[1] = strdup(filename);
-					execv(RCSDIFF, argp);
-					exit(127);
-				}
-				pid = waitpid(pid, &pstat, 0);
-				if (pid == -1 || WEXITSTATUS(pstat) != 0) {
-					fatal("can't check out file %s: "
-					    "differs from default RCS version\n",
-					    filename);
-				}
+				argp[0] = __DECONST(char *, RCSDIFF);
+				argp[1] = __DECONST(char *, filename);
+				posix_spawn_file_actions_init(&file_actions);
+				posix_spawn_file_actions_addopen(&file_actions,
+				    STDOUT_FILENO, _PATH_DEVNULL, O_WRONLY, 0);
+				if (posix_spawn(&pid, RCSDIFF, &file_actions,
+				    NULL, argp, NULL) == 0) {
+					pid = waitpid(pid, &pstat, 0);
+					if (pid == -1 || WEXITSTATUS(pstat) != 0)
+						fatal("can't check out file %s: "
+						    "differs from default RCS version\n",
+						    filename);
+				} else
+					fatal("posix_spawn: %s\n", strerror(errno));
+				posix_spawn_file_actions_destroy(&file_actions);
 			}
 
 			if (verbose)
 				say("Checking out file %s from RCS...\n",
 				    filename);
 
-			switch (pid = fork()) {
-			case -1:
-				fatal("can't fork: %s\n", strerror(errno));
-			case 0:
-				argp[0] = strdup(CHECKOUT);
-				argp[1] = strdup("-l");
-				argp[2] = strdup(filename);
-				execv(CHECKOUT, argp);
-				exit(127);
-			}
-			pid = waitpid(pid, &pstat, 0);
-			if (pid == -1 || WEXITSTATUS(pstat) != 0 ||
-			    stat(filename, &filestat)) {
-				fatal("can't check out file %s from RCS\n",
-				    filename);
-			}
+			argp[0] = __DECONST(char *, CHECKOUT);
+			argp[1] = __DECONST(char *, "-l");
+			argp[2] = __DECONST(char *, filename);
+			if (posix_spawn(&pid, CHECKOUT, NULL, NULL, argp,
+			    NULL) == 0) {
+				pid = waitpid(pid, &pstat, 0);
+				if (pid == -1 || WEXITSTATUS(pstat) != 0 ||
+				    stat(filename, &filestat))
+					fatal("can't check out file %s from RCS\n",
+					    filename);
+			} else
+				fatal("posix_spawn: %s\n", strerror(errno));
 		} else if (statfailed) {
 			fatal("can't find %s\n", filename);
 		}

Modified: stable/10/usr.bin/patch/pch.c
==============================================================================
--- stable/10/usr.bin/patch/pch.c	Thu Aug 27 21:27:47 2015	(r287222)
+++ stable/10/usr.bin/patch/pch.c	Thu Aug 27 21:52:09 2015	(r287223)
@@ -33,6 +33,7 @@
 #include <ctype.h>
 #include <libgen.h>
 #include <limits.h>
+#include <stdint.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>

Modified: stable/10/usr.bin/patch/util.c
==============================================================================
--- stable/10/usr.bin/patch/util.c	Thu Aug 27 21:27:47 2015	(r287222)
+++ stable/10/usr.bin/patch/util.c	Thu Aug 27 21:52:09 2015	(r287223)
@@ -27,13 +27,13 @@
  * $FreeBSD$
  */
 
-#include <sys/param.h>
 #include <sys/stat.h>
 
 #include <ctype.h>
 #include <errno.h>
 #include <fcntl.h>
 #include <libgen.h>
+#include <limits.h>
 #include <paths.h>
 #include <signal.h>
 #include <stdarg.h>
@@ -96,7 +96,7 @@ int
 backup_file(const char *orig)
 {
 	struct stat	filestat;
-	char		bakname[MAXPATHLEN], *s, *simplename;
+	char		bakname[PATH_MAX], *s, *simplename;
 	dev_t		orig_device;
 	ino_t		orig_inode;
 
@@ -406,7 +406,7 @@ fetchname(const char *at, bool *exists, 
 char *
 checked_in(char *file)
 {
-	char		*filebase, *filedir, tmpbuf[MAXPATHLEN];
+	char		*filebase, *filedir, tmpbuf[PATH_MAX];
 	struct stat	filestat;
 
 	filebase = basename(file);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201508272152.t7RLqA8K068282>