All pastes #264378 Raw Edit

Untitled

public text v1 · immutable
·published 2006-12-02 10:01 UTC
rendered paste body
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);
}