128 lines
2.9 KiB
C
128 lines
2.9 KiB
C
/* ************************************************************************** */
|
|
/* */
|
|
/* ::: :::::::: */
|
|
/* pipex.c :+: :+: :+: */
|
|
/* +:+ +:+ +:+ */
|
|
/* By: erey-bet <marvin@42.fr> +#+ +:+ +#+ */
|
|
/* +#+#+#+#+#+ +#+ */
|
|
/* Created: 2023/01/18 18:04:58 by erey-bet #+# #+# */
|
|
/* Updated: 2023/01/30 14:24:01 by erey-bet ### ########.fr */
|
|
/* */
|
|
/* ************************************************************************** */
|
|
|
|
#include "pipex.h"
|
|
|
|
int free_all(t_data *data)
|
|
{
|
|
int i;
|
|
int y;
|
|
|
|
if (data->fd1 > 0 && data->cmds[0])
|
|
close(data->fd1);
|
|
close(data->fd2);
|
|
y = -1;
|
|
while (++y < data->argc - 3)
|
|
{
|
|
i = -1;
|
|
while (data->flgs[y][++i])
|
|
free(data->flgs[y][i]);
|
|
free(data->flgs[y]);
|
|
}
|
|
free(data->flgs);
|
|
i = -1;
|
|
while (++i < data->argc - 3)
|
|
free(data->cmds[i]);
|
|
free(data->cmds);
|
|
return (1);
|
|
}
|
|
|
|
void make_cmd(t_data data, int i, int fl1, int fl2)
|
|
{
|
|
dup2(fl1, 0);
|
|
dup2(fl2, 1);
|
|
close(data.fd[0][0]);
|
|
close(data.fd[0][1]);
|
|
close(data.fd[1][0]);
|
|
close(data.fd[1][1]);
|
|
execve(data.cmds[i], data.flgs[i], data.env);
|
|
}
|
|
|
|
void cmd(t_data data, int i, int t)
|
|
{
|
|
if (t == 0)
|
|
make_cmd(data, 0, data.fd1, data.fd[0][1]);
|
|
else if (t == 1)
|
|
make_cmd(data, i, data.fd[(i + 1) % 2][0], data.fd[i % 2][1]);
|
|
else if (t == 2)
|
|
make_cmd(data, i, data.fd[(i + 1) % 2][0], data.fd2);
|
|
free_all(&data);
|
|
exit(1);
|
|
}
|
|
|
|
int pipex(int argc, t_data data)
|
|
{
|
|
int *fk;
|
|
int i;
|
|
|
|
if (pipe(data.fd[0]) < -1)
|
|
return (1);
|
|
if (pipe(data.fd[1]) < -1)
|
|
return (1);
|
|
fk = ft_calloc(argc - 3, sizeof(int));
|
|
i = -1;
|
|
while (++i < argc - 3)
|
|
{
|
|
fk[i] = fork();
|
|
if (fk[i] < 0)
|
|
return (1);
|
|
if (fk[i] == 0)
|
|
{
|
|
if (i == 0 && data.fd1 > 0 && data.cmds[0])
|
|
cmd(data, i, 0);
|
|
else if (i + 1 < argc - 3)
|
|
cmd(data, i, 1);
|
|
else
|
|
cmd(data, i, 2);
|
|
}
|
|
}
|
|
close(data.fd[0][0]);
|
|
close(data.fd[0][1]);
|
|
close(data.fd[1][0]);
|
|
close(data.fd[1][1]);
|
|
if (data.fd1 > 0 && data.cmds[0])
|
|
waitpid(fk[0], NULL, 0);
|
|
i = -1;
|
|
while (++i < argc - 3)
|
|
waitpid(fk[i], NULL, 0);
|
|
free(fk);
|
|
return (0);
|
|
}
|
|
|
|
int main(int argc, char *argv[], char **env)
|
|
{
|
|
t_data data;
|
|
int i;
|
|
|
|
if (argc < 5)
|
|
return (1);
|
|
if (parsing(argc, argv, &data))
|
|
return (2);
|
|
data.argc = argc;
|
|
i = -1;
|
|
while (++i < argc - 3)
|
|
{
|
|
data.cmds[i] = find_command(env, data.cmds[i]);
|
|
if (data.cmds[i] == NULL)
|
|
{
|
|
print_error(1, argv[2 + i]);
|
|
if (i == argc - 4)
|
|
return (free_all(&data));
|
|
}
|
|
}
|
|
data.env = env;
|
|
if (pipex(argc, data))
|
|
return (free_all(&data));
|
|
free_all(&data);
|
|
return (0);
|
|
}
|