about summary refs log tree commit diff
path: root/Src
diff options
context:
space:
mode:
authorPaul Ackersviller <packersv@users.sourceforge.net>2007-10-15 01:20:19 +0000
committerPaul Ackersviller <packersv@users.sourceforge.net>2007-10-15 01:20:19 +0000
commitdea45542ea34be253f175a32d8f905b80b8b8974 (patch)
treedc3674acf7d06b60d543493ece5c7d9dc8a96717 /Src
parent7f1b1d5a5d206f3972e86957127805b058a8c23a (diff)
downloadzsh-dea45542ea34be253f175a32d8f905b80b8b8974.tar.gz
zsh-dea45542ea34be253f175a32d8f905b80b8b8974.tar.xz
zsh-dea45542ea34be253f175a32d8f905b80b8b8974.zip
Merge of users/10343: make bad #! interpreters print a more informative message.
Diffstat (limited to 'Src')
-rw-r--r--Src/exec.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/Src/exec.c b/Src/exec.c
index 7963dfc52..1b54b7e0f 100644
--- a/Src/exec.c
+++ b/Src/exec.c
@@ -375,7 +375,7 @@ zexecve(char *pth, char **argv)
      * then check for an errno equal to ENOEXEC.  This errno is set *
      * if the process file has the appropriate access permission,   *
      * but has an invalid magic number in its header.               */
-    if ((eno = errno) == ENOEXEC) {
+    if ((eno = errno) == ENOEXEC || eno == ENOENT) {
 	char execvebuf[POUNDBANGLIMIT + 1], *ptr, *ptr2, *argv0;
 	int fd, ct, t0;
 
@@ -395,7 +395,14 @@ zexecve(char *pth, char **argv)
 			execvebuf[POUNDBANGLIMIT] = '\0';
 			for (ptr = execvebuf + 2; *ptr && *ptr == ' '; ptr++);
 			for (ptr2 = ptr; *ptr && *ptr != ' '; ptr++);
-			if (*ptr) {
+			if (eno == ENOENT) {
+			    char *buf;
+			    if (*ptr)
+				*ptr = '\0';
+			    buf = tricat("%s: bad interpreter: ", ptr2,
+					 ": %e");
+			    zerr(buf, pth, eno);
+			} else if (*ptr) {
 			    *ptr = '\0';
 			    argv[-2] = ptr2;
 			    argv[-1] = ptr + 1;
@@ -404,11 +411,11 @@ zexecve(char *pth, char **argv)
 			    argv[-1] = ptr2;
 			    execve(ptr2, argv - 1, environ);
 			}
-		    } else {
+		    } else if (eno == ENOEXEC) {
 			argv[-1] = "sh";
 			execve("/bin/sh", argv - 1, environ);
 		    }
-		} else {
+		} else if (eno == ENOEXEC) {
 		    for (t0 = 0; t0 != ct; t0++)
 			if (!execvebuf[t0])
 			    break;