int main( int cmd1_argc, char *cmd1_argv[] ) { cmd c; int status, pid, file = -1, flag = 0; int status2, pid2, flag2 = 0, p[2]; do { /* Read and parse command line */ parse(&c); if (c.cmd1_argc > 0) { if (!strcmp(c.cmd1_argv[0], "exit")) return 0; if(c.redirect == REDIRECT_PIPE) { flag = 1; if(pipe(p) == -1) { perror("Pipe failed"); flag2 = 1; } } if (c.redirect == REDIRECT_STDOUT) { if ((file = open(c.redirect_stdout, O_CREAT | O_RDWR | O_TRUNC, 00600)) == -1) { perror("Could not open file"); flag = 1; } } if (c.redirect == REDIRECT_STDIN) { if ((file = open(c.redirect_stdin, O_RDONLY)) == -1) { perror("Could not open file"); flag = 1; } } if ((pid = fork()) == 0) { if (c.redirect == REDIRECT_STDOUT && file != -1) dup2(file, 1); if (c.redirect == REDIRECT_STDIN && file != -1) dup2(file, 0); if (c.redirect == REDIRECT_PIPE && flag2 == 0) { if ((pid2 = fork()) == 0) { dup2(p[1], 1); execvp(c.cmd1_argv[0], c.cmd1_argv); perror("Execution failed"); exit(EXIT_FAILURE); } else if (pid2 == -1) perror("Fork failed"); else { waitpid(pid2, &status2, 0); dup2(p[0], 0); execvp(c.cmd2_argv[0], c.cmd2_argv); perror("Execution failed"); exit(EXIT_FAILURE); } } if (flag == 0) { execvp(c.cmd1_argv[0], c.cmd1_argv); perror("Execution failed"); exit(EXIT_FAILURE); } } else if (pid == -1) perror("Fork failed"); else { close(p[0]); close(p[1]); waitpid(pid, &status, 0); } } flag = 0; flag2 = 0; } while (0 == 0); }