diff --git a/websh.c b/websh.c index 79dbc5b..d045f6a 100644 --- a/websh.c +++ b/websh.c @@ -1,6 +1,5 @@ /** * @file websh.c - * @author Tobias Eidelpes * @date 2018-04-16 * * @brief Formats program output for the web. @@ -18,16 +17,46 @@ #include #define MAX_LEN 256 +#define MAX_LINES 1024 +/** + * @details Global variable for the program name. + */ static const char *pname; +/** + * @details Global variable for the e-Flag. + */ static int eFlag = 0; + +/** + * @details Global variable for the h-Flag. + */ static int hFlag = 0; + +/** + * @details Global variable for the s-Flag. + */ static int sFlag = 0; +/** + * @details Global variable for the supplied word. + */ static const char *word; + +/** + * @details Global variable for the supplied tag. + */ static const char *tag; +/** + * @details Global array which saves the supplied linux commands. + */ +static char *lines[MAX_LINES] = {NULL}; + +/** + * @detals Variable which gets set on signal received. + */ volatile sig_atomic_t quit = 0; static void handle_signal(int signal) @@ -100,16 +129,42 @@ void parse(int argc, char *argv[]) pname = argv[0]; } -void child2(int fd[], char readbuffer[]) +void child2(int fd[], char *line) { /* CHILD TWO */ + char readbuffer[MAX_LEN]; close(fd[1]); int nbytes = read(fd[0], readbuffer, MAX_LEN); if (nbytes == -1) { perror(pname); exit(EXIT_FAILURE); } - printf("%s", readbuffer); + readbuffer[nbytes-1] = '\0'; + if (eFlag && (strcmp(line, lines[0]) == 0)) { + printf("\n"); + } + if (hFlag) { + char *pch = strstr(line, "\n"); + if (pch != NULL) + strncpy(pch, "\0", 1); + printf("

%s

\n", line); + } + if (sFlag) { + if (strstr(readbuffer, word) != NULL) { + printf("<%s>%s
\n", tag, readbuffer, tag); + } else { + printf("%s
\n", readbuffer); + } + } else { + printf("%s
\n", readbuffer); + } + int i = 0; + while (lines[i] != NULL) { + i++; + } + if (eFlag && (strcmp(line, lines[i-1]) == 0)) { + printf("\n"); + } return; } @@ -139,61 +194,68 @@ int main(int argc, char *argv[]) char *line = NULL; size_t len = 0; ssize_t nread; - char readbuffer[MAX_LEN]; int status; int w; - if (eFlag) - printf("\n"); - int fd[2]; pid_t childpid1; pid_t childpid2; pipe(fd); - while ((nread = getline(&line, &len, stdin)) > 0) { - childpid1 = fork(); - if (childpid1 > 0) { - /* PARENT ONE */ - childpid2 = fork(); - if (childpid2 > 0) { - /* PARENT TWO */ - } else if (childpid2 == 0) { - /* CHILD TWO */ - child2(fd, readbuffer); - } else { - perror(pname); - free(line); - exit(EXIT_FAILURE); - } - do { - w = waitpid(childpid2, &status, WUNTRACED | WCONTINUED); - if (w == -1) { - perror(pname); - exit(EXIT_FAILURE); - } + int count = 0; - if (WIFSIGNALED(status)) { - printf("Killed by signal %d\n", WTERMSIG(status)); - } else if (WIFSTOPPED(status)) { - printf("Stopped by signal %d\n", WSTOPSIG(status)); - } else if (WIFCONTINUED(status)) { - printf("Continued\n"); - } - } while (!WIFEXITED(status) && !WIFSIGNALED(status)); - } else if (childpid1 == 0) { - /* CHILD ONE */ - child1(fd, line); - } else { + while ((nread = getline(&line, &len, stdin)) > 0) { + lines[count] = (char *) malloc (len); + strcpy(lines[count], line); + count++; + if (count == 1024) + break; + } + + for (int i = 0; i < count; i++) { + switch (childpid1 = fork()) { + case -1: perror(pname); free(line); exit(EXIT_FAILURE); + case 0: + child1(fd, lines[i]); + exit(EXIT_SUCCESS); + break; + default: + switch (childpid2 = fork()) { + case -1: + perror(pname); + free(line); + exit(EXIT_FAILURE); + case 0: + child2(fd, lines[i]); + exit(EXIT_SUCCESS); + break; + default: + do { + w = waitpid(-1, &status, WUNTRACED | WCONTINUED); + if (w == -1) { + perror(pname); + exit(EXIT_FAILURE); + } + + if (WIFSIGNALED(status)) { + printf("Killed by signal %d\n", WTERMSIG(status)); + } else if (WIFSTOPPED(status)) { + printf("Stopped by signal %d\n", WSTOPSIG(status)); + } else if (WIFCONTINUED(status)) { + printf("Continued\n"); + } + } while (!WIFEXITED(status) && !WIFSIGNALED(status)); + break; + } } } free(line); break; } - + return 0; }