aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sh/parser.c9
-rw-r--r--sh/sh.c19
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;
}
diff --git a/sh/sh.c b/sh/sh.c
index 3bd0843..b914272 100644
--- a/sh/sh.c
+++ b/sh/sh.c
@@ -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) {