diff options
author | Dag-Erling Smørgrav <des@FreeBSD.org> | 2002-03-09 22:08:14 +0000 |
---|---|---|
committer | Dag-Erling Smørgrav <des@FreeBSD.org> | 2002-03-09 22:08:14 +0000 |
commit | 8ad749a45dc694694b5bbeb9a7ec0c7c388db54f (patch) | |
tree | 0d4590753c77495e6c7159ddba65f69a9665291d /usr.bin | |
parent | be4af4b723db38189353cc532b002d4a728c8b20 (diff) | |
download | src-8ad749a45dc694694b5bbeb9a7ec0c7c388db54f.tar.gz src-8ad749a45dc694694b5bbeb9a7ec0c7c388db54f.zip |
Change back to using vfork() now that execvp() is vfork()-safe. If execvp()
fails, errno is saved to a volatile variable that the parent later inspects.
PR: bin/34898
Submitted by: Tim J. Robbins <tim@robbins.dropbear.id.au>
MFC after: 1 week
Notes
Notes:
svn path=/head/; revision=91969
Diffstat (limited to 'usr.bin')
-rw-r--r-- | usr.bin/xargs/xargs.c | 17 |
1 files changed, 10 insertions, 7 deletions
diff --git a/usr.bin/xargs/xargs.c b/usr.bin/xargs/xargs.c index 5d3eaa4178d3..1785cc2a1ccd 100644 --- a/usr.bin/xargs/xargs.c +++ b/usr.bin/xargs/xargs.c @@ -53,6 +53,7 @@ __FBSDID("$FreeBSD$"); #include <sys/wait.h> #include <err.h> +#include <errno.h> #include <stdio.h> #include <stdlib.h> #include <string.h> @@ -297,7 +298,7 @@ void run(argv) char **argv; { - volatile int noinvoke; + volatile int childerr; char **p; pid_t pid; int status; @@ -309,22 +310,24 @@ run(argv) (void)fprintf(stderr, "\n"); (void)fflush(stderr); } - noinvoke = 0; - switch(pid = fork()) { + childerr = 0; + switch(pid = vfork()) { case -1: - err(1, "fork"); + err(1, "vfork"); case 0: execvp(argv[0], argv); - warn("%s", argv[0]); - noinvoke = 1; + childerr = errno; _exit(1); } pid = waitpid(pid, &status, 0); if (pid == -1) err(1, "waitpid"); /* If we couldn't invoke the utility, exit 127. */ - if (noinvoke) + if (childerr != 0) { + errno = childerr; + warn("%s", argv[0]); exit(127); + } /* If utility signaled or exited with a value of 255, exit 1-125. */ if (WIFSIGNALED(status) || WEXITSTATUS(status) == 255) exit(1); |