pipex/mandatory/pipex.c
Etienne Rey-bethbeder 6f5907bf3b 666
2023-03-21 16:13:08 +01:00

122 lines
2.6 KiB
C

/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* pipex.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: erey-bet <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2023/01/18 18:04:58 by erey-bet #+# #+# */
/* Updated: 2023/03/21 15:59:11 by erey-bet ### ########.fr */
/* */
/* ************************************************************************** */
#include "pipex.h"
int free_all(t_data *data)
{
int i;
if (data->fd1 > 0)
close(data->fd1);
if (data->fd2 > 0)
close(data->fd2);
if (data->flg1)
{
i = 0;
while (data->flg1[i])
free(data->flg1[i++]);
free(data->flg1);
}
if (data->flg2)
{
i = 0;
while (data->flg2[i])
free(data->flg2[i++]);
free(data->flg2);
}
if (data->cmd1)
free(data->cmd1);
if (data->cmd2)
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]);
if (data.fd2 > 0)
close(data.fd2);
if (data.fd1 > 0)
close(data.fd1);
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]);
if (data.fd2 > 0)
close(data.fd2);
if (data.fd1 > 0)
close(data.fd1);
execve(data.cmd2, data.flg2, data.env);
free_all(&data);
exit(1);
}
int pipex(t_data data)
{
int fd[2];
int f1;
int f2;
if (pipe(fd) < -1)
return (1);
if (data.fd1 > -1 && data.cmd1)
{
f1 = fork();
if (f1 < 0)
return (1);
if (f1 == 0)
first_cmd(fd, data);
}
f2 = fork();
if (f2 < 0)
return (1);
if (f2 == 0)
second_cmd(fd, data);
close(fd[0]);
close(fd[1]);
if (data.fd1 > 0 && data.cmd1)
waitpid(f1, NULL, 0);
waitpid(f2, NULL, 0);
return (0);
}
int main(int argc, char *argv[], char **env)
{
t_data data;
if (argc != 5)
{
write(2, "Bad argument's number\n", 22);
return (1);
}
if (parsing(argv, &data))
return (1);
if (finds_commands(argv, env, &data.cmd1, &data.cmd2))
return (free_all(&data));
data.env = env;
if (pipex(data))
return (free_all(&data));
free_all(&data);
return (0);
}