Guest User

Untitled

a guest
Jul 22nd, 2018
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.65 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <unistd.h>
  5.  
  6.  
  7. void run(char** commands[], int* fd);
  8. char*** tail(char*** array);
  9. int array_length(void *** array);
  10.  
  11. int main(int argc, char* argv[])
  12. {
  13. char ** arg[4];
  14. char *arg1[] = { "/bin/ls", "-1", (char *) 0 };
  15. char *arg2[] = { "grep", "main", (char *) 0 };
  16. char *arg3[] = { "less", NULL, (char *) 0 };
  17.  
  18. arg[0] = arg3;
  19. arg[1] = arg2;
  20. arg[2] = arg1;
  21. arg[3] = NULL;
  22.  
  23. run(arg, NULL);
  24. //Create example commands
  25. //run(commands);
  26.  
  27. return 0;
  28. }
  29.  
  30. void run(char **commands[], int* fd)
  31. {
  32. char** command = commands[0];
  33. char*** rest = tail(commands);
  34.  
  35. if(array_length((void ***)rest) == 0)
  36. {
  37. execvp(command[0], command);
  38. }
  39. else if(array_length((void ***)rest) > 0)
  40. {
  41. int new_fd[2];
  42. int pid;
  43.  
  44. pipe(new_fd);
  45. pid = fork();
  46. if(pid == 0)
  47. {
  48.  
  49. dup2(new_fd[1], STDOUT_FILENO);
  50. close(new_fd[0]);
  51. run(rest, new_fd);
  52. }
  53. else if(pid > 0)
  54. {
  55. dup2(new_fd[0], STDIN_FILENO);
  56. close(new_fd[1]);
  57. execvp(command[0], command);
  58. }
  59. }
  60.  
  61. return;
  62. }
  63.  
  64. char*** tail(char*** array)
  65. {
  66. int new_length = array_length((void ***)array)-1;
  67. int cmdelements = 3;
  68. int stringlength = 100;
  69. char *** ret = calloc(new_length, sizeof(char) * cmdelements * stringlength);
  70. int i = 0;
  71. for(i; i < new_length; i++)
  72. {
  73. ret[i] = array[i+1];
  74. }
  75. return ret;
  76. }
  77.  
  78. int array_length(void *** array) {
  79. int i = 0;
  80. while(array[i])
  81. i++;
  82.  
  83. return i;
  84. }
Add Comment
Please, Sign In to add comment