Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <unistd.h>
- void run(char** commands[], int* fd);
- char*** tail(char*** array);
- int array_length(void *** array);
- int main(int argc, char* argv[])
- {
- char ** arg[4];
- char *arg1[] = { "/bin/ls", "-1", (char *) 0 };
- char *arg2[] = { "grep", "main", (char *) 0 };
- char *arg3[] = { "less", NULL, (char *) 0 };
- arg[0] = arg3;
- arg[1] = arg2;
- arg[2] = arg1;
- arg[3] = NULL;
- run(arg, NULL);
- //Create example commands
- //run(commands);
- return 0;
- }
- void run(char **commands[], int* fd)
- {
- char** command = commands[0];
- char*** rest = tail(commands);
- if(array_length((void ***)rest) == 0)
- {
- execvp(command[0], command);
- }
- else if(array_length((void ***)rest) > 0)
- {
- int new_fd[2];
- int pid;
- pipe(new_fd);
- pid = fork();
- if(pid == 0)
- {
- dup2(new_fd[1], STDOUT_FILENO);
- close(new_fd[0]);
- run(rest, new_fd);
- }
- else if(pid > 0)
- {
- dup2(new_fd[0], STDIN_FILENO);
- close(new_fd[1]);
- execvp(command[0], command);
- }
- }
- return;
- }
- char*** tail(char*** array)
- {
- int new_length = array_length((void ***)array)-1;
- int cmdelements = 3;
- int stringlength = 100;
- char *** ret = calloc(new_length, sizeof(char) * cmdelements * stringlength);
- int i = 0;
- for(i; i < new_length; i++)
- {
- ret[i] = array[i+1];
- }
- return ret;
- }
- int array_length(void *** array) {
- int i = 0;
- while(array[i])
- i++;
- return i;
- }
Add Comment
Please, Sign In to add comment