pipex/bonus/pipex.c
Etienne Rey-bethbeder dac4fe9717 0.5
2023-01-20 18:51:53 +01:00

127 lines
2.8 KiB
C

/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* pipex.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: erey-bet <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2023/01/18 18:04:58 by erey-bet #+# #+# */
/* Updated: 2023/01/20 17:58:22 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]);
return (1);
}
void make_cmd(int fd[2][2], t_data data, int fl1, int fl2)
{
dup2(fl1, 0);
dup2(fl2, 1);
close(fd[0][0]);
close(fd[0][1]);
close(fd[1][0]);
close(fd[1][1]);
execve(data.cmds[0], data.flgs[0], data.env);
}
void cmd(int fd[2][2], t_data data, int i, int t)
{
if (t == 0)
make_cmd(fd, data, data.fd1, 0);
else if (t == 1)
make_cmd(fd, data, (i + 1) % 2, i % 2);
else if (t == 2)
make_cmd(fd, data, (i + 1) % 2, data.fd2);
free_all(&data);
exit(1);
}
int pipex(int argc, t_data data)
{
int fd[2][2];
int *fk;
int i;
if (pipe(fd[0]) < -1)
return (1);
if (pipe(fd[1]) < -1)
return (1);
fk = ft_calloc(argc - 3, sizeof(int));
i = -1;
while (++i < argc - 3)
{
fk[i] = fork();
if (fk < 0)
return (1);
if (fk == 0)
{
if (i == 0 && data.fd1 > 0 && data.cmds[0])
cmd(fd, data, i, 0);
else if (i == argc - 3)
cmd(fd, data, i, 1);
else
cmd(fd, data, i, 2);
}
}
close(fd[0][0]);
close(fd[0][1]);
close(fd[1][0]);
close(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);
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);
}