Advertisement
Guest User

Untitled

a guest
Dec 14th, 2019
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.33 KB | None | 0 0
  1. #define _GNU_SOURCE
  2.  
  3. #include <string.h>
  4. #include <stdlib.h>
  5. #include <stdio.h>
  6. #include <dirent.h>
  7. #include <unistd.h>
  8.  
  9. #include <sys/stat.h>
  10. #include <sys/msg.h>
  11. #include <sys/ipc.h>
  12. #include <sys/wait.h>
  13.  
  14. #define FIFO_PATH "/tmp/dario%d.fifo"
  15. #define DIM_BUFFER 2048
  16.  
  17. void reader(char *path, int pp){
  18. FILE *input;
  19. FILE *file;
  20. char buffer[DIM_BUFFER];
  21.  
  22. if((input = fdopen(pp, "w")) == NULL){
  23. perror("fdopen pipe1");
  24. exit(1);
  25. }
  26.  
  27. if((file = fopen(path, "r")) == NULL){
  28. perror("fopen fifo1");
  29. exit(1);
  30. }
  31.  
  32. while(fgets(buffer, DIM_BUFFER, file)){
  33. fputs(buffer, input);
  34. }
  35.  
  36. exit(0);
  37. }
  38.  
  39. void filter(char *word, int pp, char *fifo, int i, int v){
  40. FILE *pipe_file;
  41. FILE *fifo_file;
  42. char buffer[DIM_BUFFER];
  43.  
  44. if((pipe_file = fdopen(pp, "r")) == NULL){
  45. perror("fdopen pipe2");
  46. exit(1);
  47. }
  48.  
  49. if((fifo_file = fopen(fifo, "w")) == NULL){
  50. perror("fopen fifo2");
  51. exit(1);
  52. }
  53.  
  54. while(fgets(buffer, DIM_BUFFER, pipe_file)){
  55. /*if(buffer[strlen(buffer) - 1] == '\n')
  56. buffer[strlen(buffer) - 1] = '\0';*/
  57.  
  58. if(i == 1){
  59. if(v == 0){
  60. if(strcasestr(buffer, word)){
  61. fputs(buffer, fifo_file);
  62. }
  63. }else if(v == 1){
  64. if(!strcasestr(buffer, word)){
  65. fputs(buffer, fifo_file);
  66. }
  67. }
  68. }else{
  69. if(v == 0){
  70. if(strstr(buffer, word)){
  71. fputs(buffer, fifo_file);
  72. }
  73. }else if(v == 1){
  74. if(!strstr(buffer, word)){
  75. fputs(buffer, fifo_file);
  76. }
  77. }
  78. }
  79.  
  80. }
  81.  
  82. exit(0);
  83. }
  84.  
  85. void writer(char *fifo){
  86. FILE *fifo_file;
  87. char buffer[DIM_BUFFER];
  88.  
  89. if((fifo_file = fopen(fifo, "r")) == NULL){
  90. perror("fopen fifo3");
  91. exit(1);
  92. }
  93.  
  94. while(fgets(buffer, DIM_BUFFER, fifo_file)){
  95. printf("%s \n", buffer);
  96. }
  97.  
  98. exit(0);
  99. }
  100.  
  101. int main(int argc, char *argv[]){
  102. int pp[2];
  103. int v, i;
  104. v = i = 0;
  105. char fifopathname[DIM_BUFFER];
  106. int file, word;
  107.  
  108. if(pipe(pp) == -1){
  109. perror("pipe");
  110. exit(1);
  111. }
  112.  
  113. snprintf(fifopathname, DIM_BUFFER, FIFO_PATH, getpid());
  114.  
  115. if(mkfifo(fifopathname, 0600) == -1){
  116. perror("fifo");
  117. exit(1);
  118. }
  119.  
  120. if(strcmp(argv[1], "-i") == 0){
  121. i = 1;
  122. }
  123.  
  124. if((i == 1 && (strcmp(argv[2], "-v") == 0)) || (i == 0 && (strcmp(argv[1], "-v") == 0))){
  125. v = 1;
  126. }
  127.  
  128. if(i == 0 && v == 0){
  129. word = 1;
  130. }else if((i == 0 && v == 1) || (i == 1 && v == 0)){
  131. word = 2;
  132. }else if(i == 1 && v == 1){
  133. word = 3;
  134. }
  135. file = word + 1;
  136.  
  137. if(fork() == 0){
  138. close(pp[0]);
  139. reader(argv[file], pp[1]);
  140. }
  141.  
  142. if(fork() == 0){
  143. close(pp[1]);
  144. filter(argv[word], pp[0], fifopathname, i, v);
  145. }
  146.  
  147. close(pp[0]);
  148. close(pp[1]);
  149.  
  150. if(fork() == 0){
  151. writer(fifopathname);
  152. }
  153.  
  154. wait(NULL);
  155. wait(NULL);
  156. wait(NULL);
  157.  
  158. if (unlink(fifopathname) == -1) {
  159. perror(fifopathname);
  160. exit(1);
  161. }
  162.  
  163. exit(0);
  164. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement