aboutsummaryrefslogtreecommitdiff
path: root/src/eval.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/eval.cc')
-rw-r--r--src/eval.cc30
1 files changed, 27 insertions, 3 deletions
diff --git a/src/eval.cc b/src/eval.cc
index 3b3a3ba..f25f6cd 100644
--- a/src/eval.cc
+++ b/src/eval.cc
@@ -67,12 +67,36 @@ void eval(char *cmdline)
// program inside execve may use SIGTTIN/SIGTTOU so just restore in child
sigprocmask(SIG_UNBLOCK, &block_io, nullptr);
-
execve(cmd_c, argv, environ);
wrap_eliminator(cmdline);
- cout << cmdline << ": Command not found" << endl;
- exit(-1); // if no command is found
+ cout << cmdline << flush;
+ switch (errno)
+ {
+ case ENOTDIR:
+ println(": A component of the path prefix is not a directory.");
+ exit(errno);
+ break;
+
+ case ENAMETOOLONG:
+ println(": A component of a pathname exceeded 255 characters, or an entire path name exceeded 1023 characters.");
+ exit(errno);
+ break;
+
+ case ENOENT:
+ println(": The new process file does not exist.");
+ exit(errno);
+ break;
+
+ case EACCES:
+ println(": The new process file mode denies execute permission.");
+ exit(errno);
+ break;
+
+ default:
+ println(": Error, code: {}", errno);
+ exit(errno);
+ }
}
// parent