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>