Advertisement
Guest User

Untitled

a guest
Apr 27th, 2017
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.75 KB | None | 0 0
  1. void pipeHandler(char * args[]){
  2. int filedes[2];
  3. int filedes2[2];
  4.  
  5. int num_cmds = 0;
  6.  
  7. char *command[256];
  8.  
  9. pid_t pid;
  10.  
  11. int err = -1;
  12. int end = 0;
  13.  
  14. int i = 0;
  15. int j = 0;
  16. int k = 0;
  17. int l = 0;
  18.  
  19. while (args[l] != NULL){
  20. if (strcmp(args[l],"|") == 0){
  21. num_cmds++;
  22. }
  23. l++;
  24. }
  25. num_cmds++;
  26.  
  27. while (args[j] != NULL && end != 1){
  28. k = 0;
  29. while (strcmp(args[j],"|") != 0){
  30. command[k] = args[j];
  31. j++;
  32. if (args[j] == NULL){
  33. end = 1;
  34. k++;
  35. break;
  36. }
  37. k++;
  38. }
  39. command[k] = NULL;
  40. j++;
  41.  
  42. if (i % 2 != 0){
  43. pipe(filedes);
  44. }else{
  45. pipe(filedes2);
  46. }
  47.  
  48. pid=fork();
  49.  
  50. if(pid==-1){
  51. if (i != num_cmds - 1){
  52. if (i % 2 != 0){
  53. close(filedes[1]);
  54. }else{
  55. close(filedes2[1]);
  56. }
  57. }
  58.  
  59. return;
  60. }
  61. if(pid==0){
  62. if (i == 0){
  63. dup2(filedes2[1], STDOUT_FILENO);
  64. }
  65. else if (i == num_cmds - 1){
  66. if (num_cmds % 2 != 0){
  67. dup2(filedes[0],STDIN_FILENO);
  68. }else{
  69. dup2(filedes2[0],STDIN_FILENO);
  70. }
  71. }else{
  72. if (i % 2 != 0){
  73. dup2(filedes2[0],STDIN_FILENO);
  74. dup2(filedes[1],STDOUT_FILENO);
  75. }else{
  76. dup2(filedes[0],STDIN_FILENO);
  77. dup2(filedes2[1],STDOUT_FILENO);
  78. }
  79. }
  80.  
  81. if (execvp(command[0],command)==err){
  82. kill(getpid(),SIGTERM);
  83. }
  84. }
  85.  
  86. if (i == 0){
  87. close(filedes2[1]);
  88. }
  89. else if (i == num_cmds - 1){
  90. if (num_cmds % 2 != 0){
  91. close(filedes[0]);
  92. }else{
  93. close(filedes2[0]);
  94. }
  95. }else{
  96. if (i % 2 != 0){
  97. close(filedes2[0]);
  98. close(filedes[1]);
  99. }else{
  100. close(filedes[0]);
  101. close(filedes2[1]);
  102. }
  103. }
  104.  
  105. waitpid(pid,NULL,0);
  106.  
  107. i++;
  108. }
  109. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement