diff options
author | Paul Ackersviller <packersv@users.sourceforge.net> | 2007-10-15 01:20:19 +0000 |
---|---|---|
committer | Paul Ackersviller <packersv@users.sourceforge.net> | 2007-10-15 01:20:19 +0000 |
commit | dea45542ea34be253f175a32d8f905b80b8b8974 (patch) | |
tree | dc3674acf7d06b60d543493ece5c7d9dc8a96717 /Src | |
parent | 7f1b1d5a5d206f3972e86957127805b058a8c23a (diff) | |
download | zsh-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.c | 15 |
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; |