diff options
author | Stefan Zabka <zabkaste@hu-berlin.de> | 2020-05-24 12:19:52 +0200 |
---|---|---|
committer | Stefan Zabka <zabkaste@hu-berlin.de> | 2020-05-24 12:19:52 +0200 |
commit | 04576dc2a3f761eb041b808b56f13a58052e7655 (patch) | |
tree | c6bed6db34e29f0dec0c844fbc931b3dd4fab8db /02_exercise/shell.c | |
parent | 65966ded0cc15c5966c6568cf0ff2f2bbe1fc29a (diff) | |
download | betriebssysteme-04576dc2a3f761eb041b808b56f13a58052e7655.tar.gz betriebssysteme-04576dc2a3f761eb041b808b56f13a58052e7655.zip |
Moved back to 02_exercise
Diffstat (limited to '02_exercise/shell.c')
-rw-r--r-- | 02_exercise/shell.c | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/02_exercise/shell.c b/02_exercise/shell.c new file mode 100644 index 0000000..dd0085d --- /dev/null +++ b/02_exercise/shell.c @@ -0,0 +1,77 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> +#include <stdbool.h> + +#include "array.h" +#include "process.h" +#include "prompt_utils.h" + + +int main(void) { + chdir("."); + setvbuf(stdout, NULL, _IONBF, 0); + + char const *const original_wd = get_current_dir_name(); + char const *prompt = relative_path(original_wd, original_wd); + bool done = false; + while (!done) { + char *line = NULL; + size_t cap = 0; + __ssize_t length = 0; + + printf("%s > ", prompt); + if ((length = getline(&line, &cap, stdin)) < 0) { + fprintf(stderr, "Failed to read from STDIN"); + exit(-1); + } + + if (strspn(line, " \n\t") == strlen(line)) { + continue; + } + line[length - 1] = '\0'; // cut the line feed + + Process * processes = NULL; + parse_line(line, &processes); + + if (strcmp(processes[0].argv[0], "cd") == 0) { + + if(arrayLen(processes) != 1) { + perror("Can't chain cd with other processes"); + } + if (arrayLen(processes[0].argv) != 3) { + fprintf(stderr, "usage: cd <path>"); + goto clean; + } + + int ret = chdir(processes[0].argv[1]); + if (ret) + printf("[%i] ", ret); + + free((void *)prompt); + char const *current_wd = get_current_dir_name(); + prompt = relative_path(original_wd, current_wd); + free((void *)current_wd); + } else if (strcmp(processes[0].argv[0], "exit") == 0) { + done = true; + } else { + int ret; + for (size_t i = 0; i < arrayLen(processes); ++i) { + ret = exec_command(processes[i]); + if (ret) + printf("[%i] ", ret); + } + + } + + clean: + free((void *)line); + line = NULL; + cap = 0; + free_processes(&processes); + } + + free((void *)original_wd); + free((void *)prompt); +} |