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);
        }
 }
 
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to