aboutsummaryrefslogtreecommitdiff
path: root/bin
diff options
context:
space:
mode:
authorJilles Tjoelker <jilles@FreeBSD.org>2018-11-27 21:49:59 +0000
committerJilles Tjoelker <jilles@FreeBSD.org>2018-11-27 21:49:59 +0000
commit77da4a95e81a3d27991a2d2af5a93fcdbd4c7cf7 (patch)
treee2a0d805f2cfea47de6db3395da0d4e6d131fd24 /bin
parent32b083531ff504a49e03be47059d4bd53d518e8a (diff)
downloadsrc-77da4a95e81a3d27991a2d2af5a93fcdbd4c7cf7.tar.gz
src-77da4a95e81a3d27991a2d2af5a93fcdbd4c7cf7.zip
sh: Use 126 and 127 exit status for failures opening a script
This affects scripts named on the command line, named with a '.' special builtin and found via the PATH %func autoloading mechanism. PR: 231986
Notes
Notes: svn path=/head/; revision=341097
Diffstat (limited to 'bin')
-rw-r--r--bin/sh/input.c8
-rw-r--r--bin/sh/sh.18
-rw-r--r--bin/sh/tests/errors/Makefile1
-rw-r--r--bin/sh/tests/errors/script-error1.05
4 files changed, 18 insertions, 4 deletions
diff --git a/bin/sh/input.c b/bin/sh/input.c
index 391953190b54..d48aab803903 100644
--- a/bin/sh/input.c
+++ b/bin/sh/input.c
@@ -359,12 +359,16 @@ popstring(void)
void
setinputfile(const char *fname, int push)
{
+ int e;
int fd;
int fd2;
INTOFF;
- if ((fd = open(fname, O_RDONLY | O_CLOEXEC)) < 0)
- error("cannot open %s: %s", fname, strerror(errno));
+ if ((fd = open(fname, O_RDONLY | O_CLOEXEC)) < 0) {
+ e = errno;
+ errorwithstatus(e == ENOENT || e == ENOTDIR ? 127 : 126,
+ "cannot open %s: %s", fname, strerror(e));
+ }
if (fd < 10) {
fd2 = fcntl(fd, F_DUPFD_CLOEXEC, 10);
close(fd);
diff --git a/bin/sh/sh.1 b/bin/sh/sh.1
index 3ea5af67637b..3158b41bc87e 100644
--- a/bin/sh/sh.1
+++ b/bin/sh/sh.1
@@ -32,7 +32,7 @@
.\" from: @(#)sh.1 8.6 (Berkeley) 5/4/95
.\" $FreeBSD$
.\"
-.Dd July 19, 2018
+.Dd November 27, 2018
.Dt SH 1
.Os
.Sh NAME
@@ -2819,7 +2819,11 @@ Shell database.
Privileged shell profile.
.El
.Sh EXIT STATUS
-Errors that are detected by the shell, such as a syntax error, will
+If the
+.Ar script
+cannot be found, the exit status will be 127;
+if it cannot be opened for another reason, the exit status will be 126.
+Other errors that are detected by the shell, such as a syntax error, will
cause the shell to exit with a non-zero exit status.
If the shell is not an interactive shell, the execution of the shell
file will be aborted.
diff --git a/bin/sh/tests/errors/Makefile b/bin/sh/tests/errors/Makefile
index 868f43599973..5f8d16d22295 100644
--- a/bin/sh/tests/errors/Makefile
+++ b/bin/sh/tests/errors/Makefile
@@ -30,6 +30,7 @@ ${PACKAGE}FILES+= redirection-error5.0
${PACKAGE}FILES+= redirection-error6.0
${PACKAGE}FILES+= redirection-error7.0
${PACKAGE}FILES+= redirection-error8.0
+${PACKAGE}FILES+= script-error1.0
${PACKAGE}FILES+= write-error1.0
.include <bsd.test.mk>
diff --git a/bin/sh/tests/errors/script-error1.0 b/bin/sh/tests/errors/script-error1.0
new file mode 100644
index 000000000000..558d9007353f
--- /dev/null
+++ b/bin/sh/tests/errors/script-error1.0
@@ -0,0 +1,5 @@
+# $FreeBSD$
+
+{ stderr=$(${SH} /var/empty/nosuchscript 2>&1 >&3); } 3>&1
+r=$?
+[ -n "$stderr" ] && [ "$r" = 127 ]