#include "main.h" int main() { int status = 0; size_t input_size = 2048; size_t getline_len; char* input = malloc(sizeof(char) * input_size); while(1) { printf(": "); fflush(stdout); getline_len = getline(&input, &input_size, stdin); input[getline_len - 1] = '\0'; // Ignore whitespace or comments if(input == NULL || input[0] == '#') { continue; } char*** array = malloc(sizeof(char**)); int num_strings = input_format(input, input_size, array); char* first_array = (*array)[0]; // Built in shell commands if(!strncmp(first_array, "exit", 4)) return 0; else if(!strncmp(first_array, "cd", 2)) inbuilt_cd((*array)[1]); else if (!strncmp(first_array, "status", 6)) printf("%d\n", status); else status = run_command(array, num_strings); fflush(stdout); } } int input_format(char* input, size_t input_size, char*** array) { const int max_args = 512; int num_strings = 0; char* pch; *array = malloc(sizeof(char*) * max_args); pch = strtok (input," "); while (pch != NULL) { (*array)[num_strings] = malloc(sizeof(char*) * (strlen(pch) + 1)); strcpy((*array)[num_strings], pch); num_strings++; pch = strtok (NULL, " "); } return num_strings; } void inbuilt_cd(char* args) { if(args) chdir(args); else chdir(getenv("HOME")); } int run_command(char*** array, int num_array) { char* comb_string = malloc(sizeof(char) * 100); sprintf(comb_string, "/usr/bin/"); strcat(comb_string, (*array)[0]); int f = fork(); pid_t pid; if(!f) pid = execv(comb_string, (*array)); int status; waitpid(pid, &status, 0); free(comb_string); return status; }