122 lines
2.6 KiB
C
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);
|
|
}
|