diff options
-rwxr-xr-x | tests | 11 | ||||
-rw-r--r-- | xe.c | 16 |
2 files changed, 19 insertions, 8 deletions
diff --git a/tests b/tests index b02b638..5a5168a 100755 --- a/tests +++ b/tests @@ -1,5 +1,5 @@ #!/bin/sh -printf '1..38\n' +printf '1..40\n' set -e @@ -215,6 +215,15 @@ a 123 EOF +check_output 'should close stdin when arguments were read from it' 'necho a b c | $XE -s "sed q"' <<EOF +EOF + +check_output 'should not close stdin when arguments were read from command line' 'yes | $XE -a -s "sed q" -- 1 2 3' <<EOF +y +y +y +EOF + printf '# limit checks, expecting maximal POSIX limits available\n' check_output 'argscap check' 'head -c 17711 /dev/zero | tr "\0" "\012" | $XE -N0 -s "echo \$#"' <<EOF diff --git a/xe.c b/xe.c index 77acdd7..c4b6292 100644 --- a/xe.c +++ b/xe.c @@ -205,14 +205,16 @@ run() char iter[32]; snprintf(iter, sizeof iter, "%ld", iterations); setenv("ITER", iter, 1); - // redirect stdin to /dev/null - int fd = open("/dev/null", O_RDONLY); - if (fd >= 0) { - if (dup2(fd, 0) != 0) - exit(1); - close(fd); - execvp(args[0], args); + // redirect stdin to /dev/null when we read arguments from it + if (!(aflag || Aflag)) { + int fd = open("/dev/null", O_RDONLY); + if (fd >= 0) { + if (dup2(fd, 0) != 0) + exit(1); + close(fd); + } } + execvp(args[0], args); fprintf(stderr, "xe: %s: %s\n", args[0], strerror(errno)); exit(errno == ENOENT ? 127 : 126); } |