pipex/mandatory/pipex.c
Etienne Rey-bethbeder e72d1a3e95 0.jesaisplus
2023-01-19 17:34:53 +01:00

109 lines
2.4 KiB
C

/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* pipex.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: erey-bet <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2023/01/18 18:04:58 by erey-bet #+# #+# */
/* Updated: 2023/01/19 17:30:04 by erey-bet ### ########.fr */
/* */
/* ************************************************************************** */
#include "../pipex.h"
int free_all(t_data *data)
{
int i;
if (data->fd1 > 0 && data->cmd1)
close(data->fd1);
close(data->fd2);
i = 0;
while (data->flg1[i])
free(data->flg1[i++]);
free(data->flg1);
i = 0;
while (data->flg2[i])
free(data->flg2[i++]);
free(data->flg2);
free(data->cmd1);
free(data->cmd2);
return (1);
}
void first_cmd(int fd[2], t_data data)
{
dup2(data.fd1, 0);
dup2(fd[1], 1);
close(fd[0]);
close(fd[1]);
execve(data.cmd1, data.flg1, data.env);
free_all(&data);
exit(1);
}
void second_cmd(int fd[2], t_data data)
{
dup2(fd[0], 0);
dup2(data.fd2, 1);
close(fd[0]);
close(fd[1]);
execve(data.cmd2, data.flg2, data.env);
free_all(&data);
exit(1);
}
int pipex(t_data data)
{
int fd[2];
int cmd1;
int cmd2;
if (pipe(fd) < -1)
return (1);
if (data.fd1 > 0 && data.cmd1)
{
cmd1 = fork();
if (cmd1 < 0)
return (1);
if (cmd1 == 0)
first_cmd(fd, data);
}
cmd2 = fork();
if (cmd2 < 0)
return (1);
if (cmd2 == 0)
second_cmd(fd, data);
close(fd[0]);
close(fd[1]);
if (data.fd1 > 0 && data.cmd1)
waitpid(cmd1, NULL, 0);
waitpid(cmd2, NULL, 0);
return (0);
}
int main(int argc, char *argv[], char **env)
{
t_data data;
if (argc != 5)
return (1);
if (parsing(argv, &data))
return (2);
data.cmd1 = find_command(env, data.cmd1);
if (data.cmd1 == NULL)
print_error(1, argv[2]);
data.cmd2 = find_command(env, data.cmd2);
if (data.cmd2 == NULL)
{
print_error(1, argv[3]);
return (free_all(&data));
}
data.env = env;
if (pipex(data))
return (free_all(&data));
free_all(&data);
return (0);
}