Advertisement
Guest User

Untitled

a guest
Dec 15th, 2019
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.70 KB | None | 0 0
  1. #include <unistd.h>
  2. #include <sys/wait.h>
  3. #include <stdlib.h>
  4. #include <stdio.h>
  5. #include <signal.h>
  6.  
  7. int
  8. check(int status) {
  9.     return WIFEXITED(status) == 1 && WEXITSTATUS(status) == 0;
  10. }
  11.  
  12. int
  13. main(int argc, char **argv) {
  14.     int fd[2];
  15.     int past = -1, st;
  16.     int *waits = calloc(argc - 1, sizeof(int));
  17.     for (int j = 1; j < argc; ++j) {
  18.         pipe(fd);
  19.         if (!(waits[j - 1] = fork())) {
  20.             if (j > 1 && j < argc - 1) {
  21.                 dup2(past, 0);
  22.                 if (close(past) == -1) {
  23.                     for (int i = 0; i < j - 1; ++i) {
  24.                         kill(waits[i], SIGKILL);
  25.                     }
  26.                     free(waits);
  27.                     exit(1);
  28.                 }
  29.                 dup2(fd[1], 1);
  30.                 if (close(fd[1]) == -1) {
  31.                     for (int i = 0; i < j - 1; ++i) {
  32.                         kill(waits[i], SIGKILL);
  33.                     }
  34.                     free(waits);
  35.                     exit(1);
  36.                 }
  37.             } else if (j == 1) {
  38.                 if (j != argc - 1) {
  39.                     dup2(fd[1], 1);
  40.                     if (close(fd[1]) == -1) {
  41.                         for (int i = 0; i < j - 1; ++i) {
  42.                             kill(waits[i], SIGKILL);
  43.                         }
  44.                         free(waits);
  45.                         exit(1);
  46.                     }
  47.                 }
  48.             } else {
  49.                 dup2(past, 0);
  50.                 if (close(past) == -1) {
  51.                     for (int i = 0; i < j - 1; ++i) {
  52.                         kill(waits[i], SIGKILL);
  53.                     }
  54.                     free(waits);
  55.                     exit(1);
  56.                 }
  57.             }
  58.             execlp(argv[j], argv[j], NULL);
  59.             for (int i = 0; i < j - 1; ++i) {
  60.                 kill(waits[i], SIGKILL);
  61.             }
  62.             free(waits);
  63.             exit(1);
  64.         } else if (waits[j - 1] == -1) {
  65.             for (int i = 0; i < j - 1; ++i) {
  66.                 kill(waits[i], SIGKILL);
  67.             }
  68.             exit(1);
  69.         }
  70.         if (past != -1) {
  71.             if (close(past) == -1) {
  72.                 for (int i = 0; i < j - 1; ++i) {
  73.                     kill(waits[i], SIGKILL);
  74.                 }
  75.                 free(waits);
  76.                 exit(1);
  77.             }
  78.         }
  79.         past = fd[0];
  80.         if (close(fd[1]) == -1) {
  81.             for (int i = 0; i < j - 1; ++i) {
  82.                 kill(waits[i], SIGKILL);
  83.             }
  84.             free(waits);
  85.             exit(1);
  86.         }
  87.     }
  88.  
  89.     while (wait(&st) > 0){
  90.         if(!check(st)){
  91.             return 1;
  92.         }
  93.     }
  94.     free(waits);
  95.     return 0;
  96. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement