From 649deafef2de4dde7515771276f6721595e76aee Mon Sep 17 00:00:00 2001 From: bigsketti Date: Sun, 10 Nov 2024 16:06:06 -0500 Subject: [PATCH] A simple terminal written in C, nothing really special yet. --- main | Bin 0 -> 16472 bytes main.c | 101 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 101 insertions(+) create mode 100755 main create mode 100644 main.c diff --git a/main b/main new file mode 100755 index 0000000000000000000000000000000000000000..022b6675caa189032b6ad62c7601ee03adb386e8 GIT binary patch literal 16472 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 literal 0 HcmV?d00001 diff --git a/main.c b/main.c new file mode 100644 index 0000000..8edad8d --- /dev/null +++ b/main.c @@ -0,0 +1,101 @@ +#include +#include +#include +#include +#include + +#define INPUT_SIZE 1024 + +const double VERSION = 0.1; + +void execute(char **args) { + pid_t pid = fork(); + if (pid == 0) { + execvp(args[0], args); + perror("execvp failed"); + exit(EXIT_FAILURE); + } else if (pid > 0) { + wait(NULL); + } else { + perror("fork failed"); + } +} + +void parse_input(char *input, char **args) { + char *token = strtok(input, " "); + int i = 0; + while (token != NULL) { + args[i++] = token; + token = strtok(NULL, " "); + } + args[i] = NULL; +} + +char* getCWD() { + char *cwd = malloc(1024); + + if (cwd == NULL) { + perror("Malloc failed"); + return NULL; + } + + if (getcwd(cwd, 1024) != NULL) { + return cwd; + } else { + perror("Could not get current working directory"); + free(cwd); + return NULL; + } +} + +int main() { + char input[INPUT_SIZE]; + char *args[100]; + char user[100] = "defaultusr"; + + while (1) { + char *cwd = getCWD(); // current working directory + + if (cwd != NULL) { + printf("[cShell-%s] %s $> ", user, cwd); + } else { + printf("[cShell-%s] $> ", user); + } + + if (!fgets(input, sizeof(input), stdin)) { + break; + } + + input[strcspn(input, "\n")] = '\0'; // Remove trailing newline + + // built in command checks + if (strcmp("exit", input) == 0) { + exit(0); + } else if (strcmp("help", input) == 0) { + printf("Welcome to cShell, my simple terminal written in C\nBuilt-in commands:\n\texit\n\thelp\n\tcd\n\tversion\n"); + continue; + } else if (strcmp("version", input) == 0) { + printf("cShell version: %f\n", VERSION); + continue; + } + + parse_input(input, args); + + // Handle 'cd' built-in command + if (strcmp("cd", args[0]) == 0) { + if (args[1] == NULL) { + fprintf(stderr, "Missing argument for command \"cd\"\n"); + } else { + if (chdir(args[1]) != 0) { + perror("chdir failed"); + } + } + continue; + } + + // If not a built-in command, execute the external command + execute(args); + } + + return 0; +}