Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- void pipeHandler(char * args[]){
- int filedes[2];
- int filedes2[2];
- int num_cmds = 0;
- char *command[256];
- pid_t pid;
- int err = -1;
- int end = 0;
- int i = 0;
- int j = 0;
- int k = 0;
- int l = 0;
- while (args[l] != NULL){
- if (strcmp(args[l],"|") == 0){
- num_cmds++;
- }
- l++;
- }
- num_cmds++;
- while (args[j] != NULL && end != 1){
- k = 0;
- while (strcmp(args[j],"|") != 0){
- command[k] = args[j];
- j++;
- if (args[j] == NULL){
- end = 1;
- k++;
- break;
- }
- k++;
- }
- command[k] = NULL;
- j++;
- if (i % 2 != 0){
- pipe(filedes);
- }else{
- pipe(filedes2);
- }
- pid=fork();
- if(pid==-1){
- if (i != num_cmds - 1){
- if (i % 2 != 0){
- close(filedes[1]);
- }else{
- close(filedes2[1]);
- }
- }
- return;
- }
- if(pid==0){
- if (i == 0){
- dup2(filedes2[1], STDOUT_FILENO);
- }
- else if (i == num_cmds - 1){
- if (num_cmds % 2 != 0){
- dup2(filedes[0],STDIN_FILENO);
- }else{
- dup2(filedes2[0],STDIN_FILENO);
- }
- }else{
- if (i % 2 != 0){
- dup2(filedes2[0],STDIN_FILENO);
- dup2(filedes[1],STDOUT_FILENO);
- }else{
- dup2(filedes[0],STDIN_FILENO);
- dup2(filedes2[1],STDOUT_FILENO);
- }
- }
- if (execvp(command[0],command)==err){
- kill(getpid(),SIGTERM);
- }
- }
- if (i == 0){
- close(filedes2[1]);
- }
- else if (i == num_cmds - 1){
- if (num_cmds % 2 != 0){
- close(filedes[0]);
- }else{
- close(filedes2[0]);
- }
- }else{
- if (i % 2 != 0){
- close(filedes2[0]);
- close(filedes[1]);
- }else{
- close(filedes[0]);
- close(filedes2[1]);
- }
- }
- waitpid(pid,NULL,0);
- i++;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement