Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 8 Mar 2014 23:05:29 +0000 (UTC)
From:      Jilles Tjoelker <jilles@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r262934 - head/usr.bin/xinstall
Message-ID:  <201403082305.s28N5Tt1098575@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: jilles
Date: Sat Mar  8 23:05:28 2014
New Revision: 262934
URL: http://svnweb.freebsd.org/changeset/base/262934

Log:
  install: Use posix_spawnp() for starting strip and improve error messages.

Modified:
  head/usr.bin/xinstall/xinstall.c

Modified: head/usr.bin/xinstall/xinstall.c
==============================================================================
--- head/usr.bin/xinstall/xinstall.c	Sat Mar  8 20:31:04 2014	(r262933)
+++ head/usr.bin/xinstall/xinstall.c	Sat Mar  8 23:05:28 2014	(r262934)
@@ -62,6 +62,7 @@ __FBSDID("$FreeBSD$");
 #include <sha.h>
 #include <sha256.h>
 #include <sha512.h>
+#include <spawn.h>
 #include <stdint.h>
 #include <stdio.h>
 #include <stdlib.h>
@@ -102,6 +103,8 @@ static enum {
 	DIGEST_SHA512,
 } digesttype = DIGEST_NONE;
 
+extern char **environ;
+
 static gid_t gid;
 static uid_t uid;
 static int dobackup, docompare, dodir, dolink, dopreserve, dostrip, dounpriv,
@@ -1215,27 +1218,33 @@ static void
 strip(const char *to_name)
 {
 	const char *stripbin;
-	int serrno, status;
-
-	switch (fork()) {
-	case -1:
-		serrno = errno;
+	const char *args[3];
+	pid_t pid;
+	int error, status;
+
+	stripbin = getenv("STRIPBIN");
+	if (stripbin == NULL)
+		stripbin = "strip";
+	args[0] = stripbin;
+	args[1] = to_name;
+	args[2] = NULL;
+	error = posix_spawnp(&pid, stripbin, NULL, NULL,
+	    __DECONST(char **, args), environ);
+	if (error != 0) {
 		(void)unlink(to_name);
-		errno = serrno;
-		err(EX_TEMPFAIL, "fork");
-	case 0:
-		stripbin = getenv("STRIPBIN");
-		if (stripbin == NULL)
-			stripbin = "strip";
-		execlp(stripbin, stripbin, to_name, (char *)NULL);
-		err(EX_OSERR, "exec(%s)", stripbin);
-	default:
-		if (wait(&status) == -1 || status) {
-			serrno = errno;
-			(void)unlink(to_name);
-			errc(EX_SOFTWARE, serrno, "wait");
-			/* NOTREACHED */
-		}
+		errc(error == EAGAIN || error == EPROCLIM || error == ENOMEM ?
+		    EX_TEMPFAIL : EX_OSERR, error, "spawn %s", stripbin);
+	}
+	if (waitpid(pid, &status, 0) == -1) {
+		error = errno;
+		(void)unlink(to_name);
+		errc(EX_SOFTWARE, error, "wait");
+		/* NOTREACHED */
+	}
+	if (status != 0) {
+		(void)unlink(to_name);
+		errx(EX_SOFTWARE, "strip command %s failed on %s",
+		    stripbin, to_name);
 	}
 }
 



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