1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98
| char **make_cmd(char *one_string_cmd, char **envp)
{
char **cmd;
char *tempo_cmd;
size_t i;
cmd = ft_split(one_string_cmd, ' ');
if (!cmd)
return (NULL);
tempo_cmd = format_string(cmd);
if (!tempo_cmd)
return (NULL);
cmd[0] = tempo_cmd;
i = 0;
while (envp[i] && ft_strncmp(envp[i], "PATH=", 5) != 0)
++i;
tempo_cmd = find_path(envp, cmd, i);
if (!tempo_cmd)
return (NULL);
cmd[0] = tempo_cmd;
return (cmd);
}
void receiver(char *input_cmd, char **envp, int *pipe_fd, size_t num_proc, size_t pipes_nb)
{
char **cmd;
//verif make cmd
cmd = make_cmd(input_cmd, envp);
pipes_nb = (size_t) pipes_nb;
num_proc = (size_t) num_proc;
close(pipe_fd[1]);
dup2(pipe_fd[0], 0);
close(pipe_fd[0]);
execve(cmd[0], cmd, envp);
//verif execve
}
void sender(char *input_cmd, char **envp, int *pipe_fd, size_t num_proc, size_t pipes_nb)
{
char **cmd;
//verif make cmd
cmd = make_cmd(input_cmd, envp);
pipes_nb = (size_t) pipes_nb;
num_proc = (size_t) num_proc;
close(pipe_fd[0]);
dup2(pipe_fd[1], 1);
close(pipe_fd[1]);
execve(cmd[0], cmd, envp);
//verif execve
}
int run_pipe(char *in_put, char **envp)
{
size_t i;
size_t pipes_nb;
pid_t pid;
char **cmds;
int pipes_fd[2];
i = 0;
pipes_nb = 0;
while (*(in_put + i))
{
if (*(in_put + i) == '|')
++pipes_nb;
++i;
}
cmds = ft_split(in_put, '|');
envp = (char **) envp;
if (pipe(pipes_fd) == -1)
{
printf("Erreur init pipe\n");
return (0);
}
i = 0;
while (i < pipes_nb + 1)
{
pid = fork();
if (pid < 0)
{
perror("Probleme fork");
return(0);
}
else if (pid == 0)
{
if (i == 0)
sender(cmds[i], envp, pipes_fd, i, pipes_nb);
else
receiver(cmds[i], envp, pipes_fd, i, pipes_nb);
}
++i;
}
return (1);
} |