pipex/bonus/pipex_bonus.c
2023-03-26 22:34:58 +02:00

116 lines
2.8 KiB
C

/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* pipex_bonus.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: erey-bet <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2023/03/20 09:48:45 by erey-bet #+# #+# */
/* Updated: 2023/03/26 21:52:53 by erey-bet ### ########.fr */
/* */
/* ************************************************************************** */
#include "pipex_bonus.h"
void make_cmd(t_data data, int i, int fl1, int fl2)
{
if (fl1 > 0)
dup2(fl1, 0);
dup2(fl2, 1);
close(data.fd[0][0]);
close(data.fd[0][1]);
if (i > 0)
{
close(data.fd[1][0]);
close(data.fd[1][1]);
}
if (data.fd1 > 0)
close(data.fd1);
if (data.fd2 > 0)
close(data.fd2);
execve(data.cmds[i], data.flgs[i], data.env);
}
void choice_cmd(t_data data, int i, int **forks)
{
if (i == 0)
make_cmd(data, 0, data.fd1, data.fd[0][1]);
else if (i + 1 < data.argc - 3)
make_cmd(data, i, data.fd[(i + 1) % 2][0], data.fd[i % 2][1]);
else
make_cmd(data, i, data.fd[(i + 1) % 2][0], data.fd2);
write(2, "Error execve\n", 13);
free(*forks);
free_all(&data);
exit(1);
}
int pipex_loop(int argc, int **forks, t_data data)
{
int i;
i = -1;
while (++i < argc - 3)
{
if (open_close_pipe(&data, 0, i % 2))
return (1);
if ((i > 0 || (i == 0 && data.fd1 > 0)) && data.cmds[i])
{
(*forks)[i] = fork();
if ((*forks)[i] < 0)
return (1);
if ((*forks)[i] == 0)
choice_cmd(data, i, forks);
}
if (i > 0)
if (open_close_pipe(&data, 1, (i + 1) % 2))
return (1);
}
return (open_close_pipe(&data, 1, (i + 1) % 2));
}
int pipex(int argc, t_data data)
{
int *forks;
int i;
forks = ft_calloc(argc - 3, sizeof(int));
if (!forks)
return (1);
if (pipex_loop(argc, &forks, data))
{
free(forks);
return (1);
}
i = -1;
while (++i < argc - 3)
waitpid(forks[i], NULL, 0);
free(forks);
return (0);
}
int main(int argc, char *argv[], char **env)
{
t_data data;
if (argc < 5 || (!ft_strncmp(argv[1], "here_doc", 8) && argc < 6))
{
write(2, "Not enought argument\n", 21);
return (1);
}
if (ft_strncmp(argv[1], "here_doc", 8) == 0)
{
argc = argc - 1;
if (here_doc(argc, argv, env, &data))
return (1);
}
else if (parsing(argc, argv, env, &data))
return (1);
if (verification_command(argv, data))
return (free_all(&data));
if (pipex(argc, data))
return (free_all(&data));
free_all(&data);
return (0);
}