#include #include #include #include #include #include "Integrated.h" #include "Pish.h" // Main function for Pish program void Pish(void) { CommandStruct commandObject = {"", 0}; CommandStruct* command = &commandObject; char inputString[1000]; // Max 1000 characters int forkPID; ReadPishrc(command, inputString); while (1) { ResetCommandStruct(command); // Clean command memset(inputString, 0, sizeof(inputString)); // Clean inputString GetInput(inputString); ParseInput(inputString, command); IntegratedCheck(command->argv[0]); forkPID = fork(); // Child if (forkPID == 0) { // This is the child process // Setup the child's process environment here // E.g., where is standard I/O, how to handle signals? // execve() is recommended, execvpe() may be better execvp(command->argv[0], command->argv); // exec does not return if it succeeds printf("ERROR: Could not execute %s\n", inputString); exit(1); } // Parent // This is the parent process; Wait for the child to finish // Removed due to potentially useless // int pid = forkPID; // wait(&pid); wait(&forkPID); // TODO: Remove break when while loop doesn't break program // break; } } // Prints a prompt and then reads a command from the terminal void GetInput(char* inputString) { char* prompt = "pish%>"; printf("%s ", prompt); scanf("%[^\n]", inputString); return; } // Splits a string separated by spaces into an array of strings void ParseInput(char* inputString, CommandStruct* command) { //Parse command int* argc = &(command->argc); char* token = strtok(inputString, " "); command->argv[*argc] = token; (*argc)++; while (token != NULL) { //This only holds 1 command at a time then it overrides //Will need modified token = strtok(NULL, " "); command->argv[*argc] = token; (*argc)++; } }