diff options
-rw-r--r-- | sh/parser.c | 9 | ||||
-rw-r--r-- | sh/sh.c | 19 |
2 files changed, 21 insertions, 7 deletions
diff --git a/sh/parser.c b/sh/parser.c index 17e7a58..fd00b51 100644 --- a/sh/parser.c +++ b/sh/parser.c @@ -45,7 +45,7 @@ int splitCommand(char [4096], char *[4096]); int parseCommand(int argc, char *argv[]) { struct sigaction signal_action; - int status_code = 0; + int status_code = 0, err = 0; pid_t isparent; if (!strcmp(argv[0], "cd")) return builtin_cd(argc, argv); /* The command isn't built-in. */ @@ -62,12 +62,15 @@ int parseCommand(int argc, char *argv[]) { */ status_code = execvp(argv[0], argv); /* If the child process is still alive, we know execvp(3) failed. */ - exit(127); + exit(errno); } /* This code may be used to store the exit value in $?. */ //if (errno != EINTR && WEXITSTATUS(status_code) !=) return WEXITSTATUS(status_code); //else return 0; - if (WEXITSTATUS(status_code) == 127) return 127; + err = WEXITSTATUS(status_code); + if (err == E2BIG || err == EACCES || err == EINVAL || err == ELOOP || + err == ENAMETOOLONG || err == ENOENT || err == ENOTDIR) + return err; return 0; } @@ -51,6 +51,7 @@ void printUsage(); int main(int argc, char *const argv[]) { int argument, i = 1; + FILE *file; char param[256]; struct sigaction signal_action; signal_action.sa_handler = SIG_IGN; @@ -64,10 +65,18 @@ int main(int argc, char *const argv[]) { } param[(uint8_t)argument] = argument; } + argc -= optind; + argv += optind; sigaction(SIGINT, &signal_action, NULL); if (errno) return errno; - commandLoop(1); + + if (argv[0]) { + file = fopen(argv[0], "r"); + if (errno) return errno; + commandLoop(file); + } + else commandLoop(stdin); return 0; } @@ -80,7 +89,7 @@ int main(int argc, char *const argv[]) { * This function is the actual command prompt. */ -void commandLoop(int isinteractive) { +void commandLoop(FILE *filstr) { struct sigaction signal_action; char *prompt = getenv("PS1"); char *path = getenv("PATH"); @@ -97,8 +106,10 @@ void commandLoop(int isinteractive) { command[i] = 0; } setvbuf(stdout, NULL, _IONBF, 0); - if (isinteractive) { printf(prompt); } - read(STDIN_FILENO, name, 4096); + if (filstr == stdin && isatty(STDIN_FILENO)) printf(prompt); + if (fgets(name, 4096, filstr) == NULL) + break; + //read(fildes, name, 4096); if (!strcmp(name, "\n")) continue; else if (*name == 0 || *name == EOF) { |