Advertisement
volkovich_maksim

shell_pipe.c

Dec 8th, 2016
404
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 7.68 KB | None | 0 0
  1. #include <string.h>
  2. #include <unistd.h>
  3. #include <sys/wait.h>
  4. #include <sys/types.h>
  5. #include <stdio.h>
  6. #include <errno.h>
  7. #include <ctype.h>
  8. #include "util.h"
  9. #include <stdlib.h>
  10.  
  11. #define max_words 30
  12.  
  13. typedef struct arg_list{
  14.     struct arg_list *next;
  15.     char* arg;
  16. }arg_list;
  17.  
  18. typedef struct pr_list{
  19.     pid_t pid;
  20.     char *pr;
  21.     arg_list *args;
  22.     struct pr_list *next;
  23. }pr_list;
  24.  
  25. typedef struct pipe_list{
  26.     char *line;
  27.     struct pipe_list *next;
  28.     pr_list *prs;
  29. }pipe_list;
  30.  
  31. void printf_args(arg_list **curr){
  32.     arg_list **pointer;
  33.     pointer = curr;
  34.     if (*curr != NULL){
  35.         if ((*pointer)->arg != NULL){
  36.             printf("%s\n", (*pointer)->arg);
  37.             while ((*pointer)->next){
  38.                 pointer = (&(*pointer)->next);
  39.                 if ((*pointer)->arg != NULL)
  40.                     printf("%s\n", (*pointer)->arg);
  41.             }
  42.         }
  43.     }
  44. }
  45.  
  46. void printf_prs(pr_list **curr){
  47.     pr_list **pointer;
  48.     pointer = curr;
  49.     if (*curr != NULL){
  50.         if ((*pointer)->pr != NULL){
  51.             printf("%s\n", (*pointer)->pr);
  52.             printf_args(&(*pointer)->args);
  53.             while ((*pointer)->next != NULL){
  54.                 pointer = (&(*pointer)->next);
  55.                 if ((*pointer)->pr != NULL)
  56.                     printf("%s\n", (*pointer)->pr);
  57.                 printf_args(&(*pointer)->args);            
  58.             }
  59.         }
  60.     }
  61. }
  62.  
  63. void free_args(arg_list **curr){
  64.     arg_list *pointer;
  65.     pointer = *curr;
  66.     if (*curr != NULL){
  67.         while ((*curr)->next){
  68.             pointer = (*curr)->next;
  69.             if ((*curr)->arg)
  70.                 free((*curr)->arg);
  71.             free(*curr);
  72.             (*curr) = pointer;
  73.         }
  74.     }
  75. }
  76.  
  77. void free_prs(pr_list **curr){
  78.     pr_list *pointer;
  79.     pointer = *curr;
  80.     if (*curr != NULL){
  81.         if ((*curr)->args != NULL)
  82.             free_args(&((*curr)->args));
  83.         while ((*curr)->next != NULL){
  84.             pointer = (*curr)->next;
  85.             if ((*curr)->pr)
  86.                 free((*curr)->pr);
  87.             if ((*curr)->args != NULL)
  88.                 free_args(&(pointer->args));
  89.             free(*curr);
  90.             (*curr) = pointer;
  91.         }
  92.     }
  93. }
  94.  
  95. void free_pipes(pipe_list **curr){
  96.     pipe_list *pointer;
  97.     pointer = *curr;
  98.     if (*curr != NULL){
  99.         if ((*curr)->line != NULL){
  100.             free((*curr)->line);
  101.             if ((*curr)->prs != NULL)
  102.                 free_prs(&((*curr)->prs));
  103.             while ((*curr)->next != NULL){
  104.                 pointer = (*curr)->next;
  105.                 if ((*curr)->prs != NULL)
  106.                     free_prs(&(pointer->prs));
  107.                 free(*curr);
  108.                 (*curr) = pointer;
  109.             }
  110.         }
  111.     }
  112. }
  113.  
  114. int word_len(char* word){
  115.     int i=0;
  116.     if (strcmp(word,"")){
  117.         for (; word[i] != '\0'; i++);
  118.     }
  119.     return i;
  120. }
  121. int word_counter(arg_list **curr){
  122.     int i;
  123.     arg_list *pointer;
  124.     pointer = *curr;
  125.     if (*curr != NULL){
  126.         if ((*curr)->arg != NULL){
  127.             while ((*curr)->next != NULL){
  128.                 pointer = (*curr)->next;
  129.                 i++;
  130.                 (*curr) = pointer;
  131.             }
  132.         }
  133.     }
  134.     return i;
  135. }
  136.  
  137. void make_arr(pr_list **curr, char *exec_arg[]){
  138.     //arg_list *c_arg;
  139.     //c_arg = ((*curr)->args);
  140.     //int i, j, word_num, flag = 1;
  141.     /*if ((*curr)->args){
  142.         word_num = word_counter((&(*curr)->args));
  143.         for (i = 0; i <= word_num; i++){
  144.             exec_arg[i] = calloc(word_len, sizeof(char));
  145.         }
  146.         for (j = 0; j < word_len && (*curr)->pr[j] != '\0'; j++){
  147.             exec_arg[0][j] = (*curr)->pr[j];
  148.         }
  149.         for (; j < word_len; j++){
  150.             exec_arg[0][j] = '\0';
  151.         }
  152.  
  153.         for (i = 1; i <= word_num && flag; i++){
  154.             for (j = 0; j < word_len && c_arg->arg[j] != '\0' ; j++){
  155.                 exec_arg[i][j] = c_arg->arg[j];
  156.             }
  157.             for (; j < word_len; j++){
  158.                 exec_arg[i][j] = '\0';
  159.             }
  160.             if (c_arg->next != NULL){
  161.                 c_arg = c_arg->next;
  162.             }else{
  163.                 flag = 0;
  164.             }
  165.         }
  166.     }*/
  167. }
  168.  
  169. void put_pr(pr_list **curr, char *new_pr){
  170.     int i, j;
  171.     j = word_len(new_pr);
  172.     (*curr)->pr = calloc(word_len(new_pr), sizeof(char));
  173.     for (i = 0; i < j; i++){
  174.         (*curr)->pr[i] = new_pr[i];
  175.     }
  176. }
  177.  
  178. void put_arg(arg_list **curr, char *new_arg){
  179.     int i, j;
  180.     j = word_len(new_arg);
  181.     (*curr)->arg = calloc(j, sizeof(char));
  182.     for (i = 0; i < j; i++){   
  183.         (*curr)->arg[i] = new_arg[i];
  184.     }
  185. }
  186.  
  187. /*  MAIN    */
  188.  
  189. int main(int argc, char *argv[]){
  190.     int i, len, flag, pr_flag, not_empty, back_mode;
  191.     char *new_line, *word_beg;
  192.     pipe_list *executing_pipes, *c_pipe;
  193.     pr_list *c_pr;
  194.     arg_list *c_arg;
  195.  
  196.     c_pipe = malloc(sizeof(pipe_list));
  197.     c_pipe->prs = malloc(sizeof(pr_list));
  198.     c_pipe->prs->args = malloc(sizeof(arg_list));
  199.     c_pipe->line = NULL;
  200.     c_pipe->next = NULL;
  201.     c_pr = c_pipe->prs;
  202.     c_pr->pr = NULL;
  203.     c_pr->next = NULL;
  204.     c_arg = c_pr->args;
  205.     c_arg->next = NULL;
  206.     c_arg->arg = NULL;
  207.  
  208.     executing_pipes = c_pipe;
  209.  
  210.     while ((new_line = getline_unlim()) != NULL){
  211.  
  212.         len = strlen(new_line);
  213.         pr_flag = 1;
  214.         not_empty = 0;
  215.         back_mode = 0;
  216.  
  217.         /* processing line, creating pipe */
  218.         c_pipe->line = calloc(len + 1, sizeof(char));
  219.         c_pipe->line = new_line;
  220.  
  221.         for (i = 0, word_beg = new_line; i < len; i++){
  222.             flag = 0; back_mode = 0;
  223.             if (!isalnum(new_line[i]) || new_line[i] == '\0'){
  224.                 if (new_line[i] == '|'){
  225.                     flag = 1;
  226.                 }
  227.                 if (new_line[i] == '&'){
  228.                     back_mode = 1;
  229.                 }
  230.                 new_line[i] = '\0';
  231.                 if (flag && (!not_empty)){
  232.                     printf("pipe was written incorrectly\n");
  233.                     if (c_pipe->prs != NULL){
  234.                         //printf_prs(&(c_pipe->prs));
  235.                         free_prs(&(c_pipe->prs));
  236.                     }
  237.                     not_empty = 1;
  238.                     break;
  239.                 }
  240.                 if ( strcmp(word_beg,"") && strcmp(word_beg, " ") && !back_mode ){
  241.                     if (pr_flag == 1){
  242.                         put_pr(&c_pr, word_beg);
  243.                         //c_pr->next = malloc(sizeof(arg_list));
  244.                         not_empty = 1;
  245.                         pr_flag = 0;
  246.                     }else{
  247.                         put_arg(&c_arg, word_beg);
  248.                         c_arg->next = malloc(sizeof(arg_list));
  249.                         c_arg = c_arg->next;
  250.                         c_arg->arg = NULL;
  251.                         c_arg->next = NULL;
  252.                     }
  253.                 }
  254.                 word_beg = new_line + i + 1;
  255.                 if (flag == 1){
  256.                     c_pr->next = malloc(sizeof(pr_list));
  257.                     c_pr->next->args = malloc(sizeof(arg_list));
  258.                     c_pr = c_pr->next;
  259.                     c_pr->next = NULL;
  260.                     c_pr->pr = NULL;
  261.                     c_arg = c_pr->args;
  262.                     c_arg->next = NULL;
  263.                     c_arg->arg = NULL;
  264.                     pr_flag = 1;
  265.                     not_empty = 0;
  266.                 }
  267.             }
  268.         }
  269.         if (strcmp(word_beg,"")){
  270.             if (pr_flag){
  271.                 put_pr(&c_pr, word_beg);
  272.             }else{
  273.                 put_arg(&c_arg, word_beg);
  274.             }
  275.         }else{
  276.             if ((flag || pr_flag) && (!not_empty)){
  277.                 printf("pipe was written incorrectly\n");
  278.                 if (c_pipe->prs != NULL){
  279.                     //printf_prs(&(c_pipe->prs));
  280.                     free_prs(&(c_pipe->prs));
  281.                 }
  282.             }
  283.         }
  284.         /* pipe was created */
  285.  
  286.         /*  executing pipe  */
  287.         /*                  */
  288.  
  289.         printf_prs(&(c_pipe->prs));
  290.  
  291.         if (!back_mode){
  292.             if (c_pipe && c_pipe->prs){
  293.                 c_pr = c_pipe->prs;
  294.                 int j, i = 0;
  295.                 j = 1 + word_counter(&(c_pr->args));
  296.                 printf("%d\n", j);
  297. //              char* exec_arg[j];
  298. //              for (i = 0; i < j; i++){
  299. //                  exec_arg[i] = calloc(2, sizeof(char*));
  300. //              }
  301. //              c_arg = (c_pr->args);
  302. //              int k, flag = 1;
  303.                 /*if (c_pr){
  304.                     for (i = 0; i < 2; i++){
  305.                         for (k = 0; k < word_len && c_pr->pr[k] != '\0'; j++){
  306.                             exec_arg[i][k] = c_pr->pr[k];
  307.                             exec_arg[i] = realloc(exec_arg[i], k + 1);
  308.                         }
  309.                         for (; k < word_len; j++){
  310.                             exec_arg[i][k] = '\0';
  311.                         }
  312.                     }*/
  313.  
  314.                     /*for (; i <= j && flag; i++){
  315.                         for (j = 0; j < word_len && c_arg->arg[j] != '\0' ; j++){
  316.                             exec_arg[i][j] = c_arg->arg[j];
  317.                         }
  318.                         for (; j < word_len; j++){
  319.                             exec_arg[i][j] = '\0';
  320.                         }
  321.                         if (c_arg->next != NULL){
  322.                         c_arg = c_arg->next;
  323.                         }else{
  324.                             flag = 0;
  325.                         }
  326.                     }*/
  327. //              }
  328.  
  329.                 /*for (i; i < j; i++)
  330.                     printf("%s ", mass[i]);
  331.                 printf("\n");*/
  332.             }
  333.         }else{
  334.             printf("background mode\n");   
  335.         }
  336.  
  337.         c_pipe->next = malloc(sizeof(pipe_list));
  338.         c_pipe->next->prs = malloc(sizeof(pr_list));
  339.         c_pipe->next->prs->args = malloc(sizeof(arg_list));
  340.         c_pipe->next->line = NULL;
  341.         c_pipe->next->next = NULL;
  342.         c_pr = c_pipe->next->prs;
  343.         c_pr->pr = NULL;
  344.         c_pr->next = NULL;
  345.         c_arg = c_pr->args;
  346.         c_arg->next = NULL;
  347.         c_arg->arg = NULL;
  348.         c_pipe = c_pipe->next;
  349.     }
  350.     free_pipes(&executing_pipes);  
  351.     return 0;
  352. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement