rendered paste bodyint 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);
}