#include #include #include #include #include #include #include #include #include "Integrated.h" // Checks for commands that are built into Pish int IntegratedCheck(CommandStruct *command) { if (strcmp(command->argv[0], "exit") == 0) exit(0); // If there is an argument, change to argument location // Else, change to home directory if (command->argv[0][0] == 'c' && command->argv[0][1] == 'd') { if (command->argv[1] != NULL) chdir(command->argv[1]); if (command->argv[1] == NULL) chdir(GetHomeDir()); return 1; } return 0; } // Prints a prompt and then reads a command from the terminal void GetInput(char *inputString) { char c; char *prompt = "pish%>"; printf("%s ", prompt); // assert(scanf("%[^\n]s", inputString) == 1); scanf("%1000[^\n]s", inputString); while ((c = getchar()) != '\n' && c != EOF) // Cleans input /* discard */; return; } // Splits a string separated by spaces into an array of strings void ParseInput(char *inputString, CommandStruct *command, char *symbol) { // Parse command int *argc = &(command->argc); char *token = strtok(inputString, symbol);//change 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, symbol);//change command->argv[*argc] = token; (*argc)++; } } // Splits a string separated by spaces into an array of strings void SplitInput(char *inputString, CommandStruct *command) { int *argc = &(command->argc); char *token = strtok(inputString, " "); command->argv[*argc] = token; (*argc)++; while (token != NULL) { token = strtok(NULL, " "); command->argv[*argc] = token; (*argc)++; } (*argc)--; } // Splits a command array into left and right // void SplitPipe(CommandStruct* commandLeft, CommandStruct* commandRight); int CheckSymbol(CommandStruct* command, char symbol, int start) { for (int i = start; i < command->argc; i++) if (command->argv[i][0] == symbol) return i; return -1; } // Checking redirection void CheckRedirection(CommandStruct* command) { // check command standard output // TODO: Check command->argv[] for symbol instead for (int i = 0; i < command->argc; i++) { if ((command->argv[i][0] == '>') && (command->argv[i][1] == '>')) printf(">> was found.\n"); // ParseInput(inputString, command, ">>"); if (command->argv[i][0] == '<') printf("< was found.\n"); // ParseInput(inputString, command, "<"); if (command->argv[i][0] == '>' && command->argv[i][1] != '>') printf("> was found.\n"); // ParseInput(inputString, command, ">"); if (command->argv[i][0] == '|') printf("| was found.\n"); // ParseInput(inputString, command, "|"); // else // ParseInput(inputString, command, " "); } return; } // Count number of appearances of a symbol in a CommandStruct int CountSymbol(CommandStruct* command, char symbol) { int count = 0; for (int i = 0; i < command->argc; i++) if (command->argv[i][0] == symbol) count++; return count; } void ioRedirection(CommandStruct* command) { for (int i = 0; i < (int)sizeof(command); i++) { if (strpbrk(command->argv[i], ">>")!= NULL)//append { append(command->argv[i-1], command->argv[i+1]); } else if (command->argv[i][0] =='<')//input { input(command->argv[i+1]); } else if (strchr(command->argv[i],'|')!= NULL)//pipe { //ExecPipe(); } else if (command->argv[i][0] == '>')//output { output(command->argv[i+1]); } else{} //exit } } void output(char *command){ int newfd; if ((newfd = open(command, O_CREAT | O_CREAT, 0666)) < 0) { perror(command); exit(1); } dup2(newfd,1); } void input(char *command) { int newfd; if ((newfd = open(command, O_RDONLY | O_CREAT)) < 0) { perror(command); exit(1); } dup2(newfd,0); } // Splits a parent process into separate children processes int ExecPipe(CommandStruct* commandParent, CommandStruct* commandChild, int* pipefd) { char buffer[1024]; int forkPID; int pipeAmount = CountSymbol(commandParent, '|'); int pipeLocation = 0; int startArgc = 0; int endArgc = commandParent->argc; pipe(pipefd); for (int i = 0; i < pipeAmount; i++) { pipeLocation = CheckSymbol(commandParent, '|', startArgc); endArgc = pipeLocation; CopyCommandStruct(commandParent, commandChild, startArgc, endArgc); forkPID = fork(); if (forkPID == 0) return forkPID; close(pipefd[0]); close(pipefd[1]); wait(&forkPID); startArgc = pipeLocation + 1; ResetCommandStruct(commandChild); // Clean command pipe(pipefd); } endArgc = commandParent->argc; forkPID = fork(); CopyCommandStruct(commandParent, commandChild, startArgc, endArgc); if (forkPID == 0) return forkPID; close(pipefd[1]); wait(&forkPID); while (read(pipefd[0], buffer, sizeof(buffer)) != 0) printf("%s", buffer); close(pipefd[0]); ResetCommandStruct(commandChild); // Clean command return 1; } void append(char* input, char* fileName) { char buffer[4]; // int fd = open(fileName, O_APPEND | O_CREAT); // fp = fopen(file, "a+"); // fputs(input, fp); // fclose(fp); } // check command standard input // if (strchr(inputString, '<') != NULL) // { // newfd = open((command, O_CREAT |O_TRUNC | O_WRONLY, 0644)) < 0); // // No if statement for fail checking, brackets just exist here // { // // failed // perror(command); // exit(1); // } // dup2(newfd, 0); // } // check pipe // TODO: Check for pipe symbol // Check in command->argv[] instead // if (strchr(command, '|') != NULL) // { // ; // } // check append // TODO: Implement append // if (strpbrk(command, ">>") != NULL) // { // newfd = open((command, O_CREAT |O_TRUNC | O_WRONLY, 0644)) < 0); // // No if statement for fail checking, brackets just exist here // { // // failed // perror(command); // exit(1); // } // dup2(newfd, 0); // } // check pipe // TODO: Check pipe already exists above, maybe loop? // if (strchr(command, '|') != NULL) // { // ; // } // check append // TODO: Check append already exists above, maybe loop? // if (strpbrk(command, ">>") != NULL) // { // ; // } // Environment varibles // TODO: Add this function to CommandStruct // Environment Variables can just be a part of the struct // void varibles(char str, int count) // { // char var[1000]; // var[count] = str; // }