sbase

suckless unix tools
git clone git://git.2f30.org/sbase
Log | Files | Refs | README | LICENSE

commit 43b472601dc0ccefac66cabaf564ce85d6014762
parent 79a913f4e6c4bb79bb3843a1417cf95db03e708c
Author: sin <sin@2f30.org>
Date:   Thu, 13 Feb 2014 13:02:12 +0000

Return proper error values in case execvp() fails

Diffstat:
Mchroot.c | 14++++++++++----
1 file changed, 10 insertions(+), 4 deletions(-)

diff --git a/chroot.c b/chroot.c @@ -1,4 +1,5 @@ /* See LICENSE file for copyright and license details. */ +#include <errno.h> #include <stdlib.h> #include <unistd.h> #include "util.h" @@ -8,7 +9,8 @@ static void usage(void); int main(int argc, char **argv) { - char *shell[] = { "/bin/sh", "-i", NULL }, *aux; + char *shell[] = { "/bin/sh", "-i", NULL }, *aux, *p; + int savederrno; ARGBEGIN { default: @@ -22,18 +24,22 @@ main(int argc, char **argv) shell[0] = aux; if(chroot(argv[0]) == -1) - eprintf("chroot: '%s':", argv[0]); + eprintf("chroot %s:", argv[0]); if(chdir("/") == -1) - eprintf("chroot:"); + eprintf("chdir:"); if(argc == 1) { + p = *shell; execvp(*shell, shell); } else { + p = argv[1]; execvp(argv[1], argv+1); } - eprintf("chroot: '%s':", argv[1]); + savederrno = errno; + weprintf("execvp %s:", p); + _exit(savederrno == ENOENT ? 127 : 126); return EXIT_FAILURE; }