From 61cd0af471b018e6b4627f37897ad02823470928 Mon Sep 17 00:00:00 2001 From: shockrah Date: Mon, 16 Sep 2019 02:07:28 -0700 Subject: [PATCH] couple things missing but meh its there mostly --- 334/homework/3/msh.c | 79 ++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 72 insertions(+), 7 deletions(-) diff --git a/334/homework/3/msh.c b/334/homework/3/msh.c index 956d3de..6ad650d 100644 --- a/334/homework/3/msh.c +++ b/334/homework/3/msh.c @@ -1,24 +1,47 @@ #include #include #include +#include +#include +#include #define PROMPT "msh> " #define EXIT_CMD "exit" #define MAX_BUF 121 +// Statuses from builtin responses +#define RESP_HELP 1 +#define RESP_DATE 2 +#define RESP_ECHO 3 +#define RESP_SHELL 4 + void echo(const char*); void remove_newline(char*); void exit_branch(const char*); +int builtin_response(char*); + int main(void) { char buffer[MAX_BUF]; while(1) { printf("%s", PROMPT); fgets(buffer, MAX_BUF, stdin); - // process the input - remove_newline(buffer); + // Deal with EOF input + if(!strlen(buffer)) { + exit(0); + } exit_branch(buffer); - echo(buffer); + + remove_newline(buffer); + int status = builtin_response(buffer); + // the switch in case we need to add more response flags later + switch(status) { + case RESP_ECHO: + echo(buffer); + case RESP_SHELL: // shell command handler was used + continue; + } + memset(buffer, 0x00, MAX_BUF); // reset buffer after each usage } return 0; } @@ -35,9 +58,51 @@ void remove_newline(char* buf) { } void exit_branch(const char* buf) { - if(strcmp(buf, EXIT_CMD)) { - return; + if(!strcmp(buf, EXIT_CMD)) { + exit(0); } - exit(0); - return; // just for gcc but exit shouldn't fail +} + +int builtin_response(char* buffer) { +#define STRING_DELIMITER " " +#define TIME_FMT "%D" + exit_branch(buffer); // exit is builtin so here we are + if(!strcmp(buffer, "help")) { + echo("enter Linux commands, or ‘exit’ to exit"); + return RESP_HELP; + } + + // Printout the date today + if(!strcmp(buffer, "date")) { + static char date[64]; + time_t now = time(0); + strftime(date, sizeof(date), TIME_FMT, localtime(&now)); + echo(date); + return RESP_DATE; + } + + char *tokens[64]; + int idx = 0; + for(char* cur = strtok(buffer, STRING_DELIMITER); cur != NULL; cur=strtok(NULL, STRING_DELIMITER)) { +#ifdef DBG_LINE + printf("%s ", cur); +#endif + tokens[idx] = cur; + idx++; + } + + // Execute child process + pid_t child = fork(); + if(child) { + int status_child = wait(NULL); + if(status_child == 127) { + echo("command not found: oh btw remember to not print this string kek"); + } + } + execvp(tokens[0], tokens); + // Cleanup pointers + for(int i = 0; i< 64; i++) { + tokens[i] = NULL; + } + }