Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 26 Mar 2026 07:37:00 +0000
From:      Baptiste Daroussin <bapt@FreeBSD.org>
To:        src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-main@FreeBSD.org
Subject:   git: 5f7f0efe8e13 - main - diff3: prefer posix_spawn over pdfork/execlp
Message-ID:  <69c4e21c.47ed5.35a98634@gitrepo.freebsd.org>

index | next in thread | raw e-mail

The branch main has been updated by bapt:

URL: https://cgit.FreeBSD.org/src/commit/?id=5f7f0efe8e13247fc80a2a739e757f73a5d7ebda

commit 5f7f0efe8e13247fc80a2a739e757f73a5d7ebda
Author:     Baptiste Daroussin <bapt@FreeBSD.org>
AuthorDate: 2026-03-25 10:08:58 +0000
Commit:     Baptiste Daroussin <bapt@FreeBSD.org>
CommitDate: 2026-03-26 07:36:55 +0000

    diff3: prefer posix_spawn over pdfork/execlp
    
    MFC After:              1 week
    Reviewed by:            kib
    Differential Revision:  https://reviews.freebsd.org/D56075
---
 usr.bin/diff3/diff3.c | 49 ++++++++++++++++++++++++++++++-------------------
 1 file changed, 30 insertions(+), 19 deletions(-)

diff --git a/usr.bin/diff3/diff3.c b/usr.bin/diff3/diff3.c
index d85a5da94b10..75e8c6297855 100644
--- a/usr.bin/diff3/diff3.c
+++ b/usr.bin/diff3/diff3.c
@@ -73,14 +73,17 @@
 #include <capsicum_helpers.h>
 #include <ctype.h>
 #include <err.h>
+#include <fcntl.h>
 #include <getopt.h>
 #include <inttypes.h>
 #include <limits.h>
+#include <spawn.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <unistd.h>
 
+extern char **environ;
 /*
  * "from" is first in range of changed lines; "to" is last+1
  * from=to=line after point of insertion for added lines.
@@ -301,23 +304,30 @@ readin(int fd, struct diff **dd)
 }
 
 static int
-diffexec(const char *diffprog, char **diffargv, int fd[])
+diffexec(char **diffargv, int fd[])
 {
-	int pd;
-
-	switch (pdfork(&pd, PD_CLOEXEC)) {
-	case 0:
-		close(fd[0]);
-		if (dup2(fd[1], STDOUT_FILENO) == -1)
-			err(2, "child could not duplicate descriptor");
-		close(fd[1]);
-		execvp(diffprog, diffargv);
-		err(2, "could not execute diff: %s", diffprog);
-		break;
-	case -1:
-		err(2, "could not fork");
-		break;
-	}
+	posix_spawnattr_t sa;
+	posix_spawn_file_actions_t fa;
+	pid_t pid;
+	int pd, error;
+
+	if ((error = posix_spawnattr_init(&sa)) != 0)
+		errc(2, error, "posix_spawnattr_init");
+	if ((error = posix_spawn_file_actions_init(&fa)) != 0)
+		errc(2, error, "posix_spawn_file_actions_init");
+
+	posix_spawnattr_setprocdescp_np(&sa, &pd, 0);
+
+	posix_spawn_file_actions_addclose(&fa, fd[0]);
+	posix_spawn_file_actions_adddup2(&fa, fd[1], STDOUT_FILENO);
+	posix_spawn_file_actions_addclose(&fa, fd[1]);
+
+	error = posix_spawn(&pid, diffargv[0], &fa, &sa, diffargv, environ);
+	if (error != 0)
+		errc(2, error, "could not spawn diff");
+
+	posix_spawn_file_actions_destroy(&fa);
+	posix_spawnattr_destroy(&sa);
 	close(fd[1]);
 	return (pd);
 }
@@ -1004,7 +1014,7 @@ main(int argc, char **argv)
 			eflag = EFLAG_OVERLAP;
 			break;
 		case DIFFPROG_OPT:
-			diffprog = optarg;
+			diffargv[0] = optarg;
 			break;
 		case STRIPCR_OPT:
 			strip_cr = 1;
@@ -1079,13 +1089,14 @@ main(int argc, char **argv)
 	if (pipe(fd23))
 		err(2, "pipe");
 
+
 	diffargv[diffargc] = file1;
 	diffargv[diffargc + 1] = file3;
 	diffargv[diffargc + 2] = NULL;
-	pd13 = diffexec(diffprog, diffargv, fd13);
+	pd13 = diffexec(diffargv, fd13);
 
 	diffargv[diffargc] = file2;
-	pd23 = diffexec(diffprog, diffargv, fd23);
+	pd23 = diffexec(diffargv, fd23);
 
 	caph_cache_catpages();
 	if (caph_enter() < 0)


home | help

Want to link to this message? Use this
URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?69c4e21c.47ed5.35a98634>