-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpipex.c
118 lines (108 loc) · 2.85 KB
/
pipex.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* pipex.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: yli <yli@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2023/01/24 18:27:17 by yli #+# #+# */
/* Updated: 2023/01/26 20:07:23 by yli ### ########.fr */
/* */
/* ************************************************************************** */
#include "pipex.h"
char **ft_check_cmd(char *cmd)
{
char **command;
if (cmd == 0)
ft_perror("0");
else if (cmd[0] == '\0')
ft_perror("0");
command = ft_split(cmd, ' ');
if (command == 0)
ft_perror("1");
return (command);
}
void ft_executer(char *cmd, char **envp)
{
char **command;
char **path;
char *path_cmd;
int i;
command = ft_check_cmd(cmd);
path = split_path(envp);
if (path[0] == NULL)
ft_perror("2");
i = 0;
while (path[i])
{
path_cmd = ft_strjoin_path_cmd(path[i], '/', command[0]);
if (access(path_cmd, F_OK) != -1)
{
if (execve(path_cmd, command, NULL) == -1)
ft_perror("3");
}
free (path_cmd);
i++;
}
check_free_all(command);
check_free_all(path);
ft_perror("4");
}
void first_command_executer(int *fd, char **argv, char **envp)
{
int fd_in;
if (access(argv[1], R_OK) == -1)
ft_perror("5");
fd_in = open(argv[1], O_RDONLY);
if (fd_in < 0)
ft_perror("5");
if (dup2(fd_in, STDIN_FILENO) == -1)
ft_perror("5");
if (dup2(fd[1], STDOUT_FILENO) == -1)
ft_perror("5");
close(fd_in);
close(fd[0]);
close(fd[1]);
ft_executer(argv[2], envp);
}
void second_command_executer(int *fd, char **argv, char **envp)
{
int fd_out;
if (access(argv[4], F_OK) == 0 && access(argv[4], W_OK) == -1)
ft_perror("6");
fd_out = open(argv[4], O_CREAT | O_WRONLY | O_TRUNC, 0644);
if (fd_out < 0)
ft_perror("6");
if (dup2(fd[0], STDIN_FILENO) == -1)
ft_perror("6");
if (dup2(fd_out, STDOUT_FILENO) == -1)
ft_perror("6");
close(fd[1]);
close(fd[0]);
close(fd_out);
ft_executer(argv[3], envp);
}
void pipex(int argc, char **argv, char **envp)
{
int fd[2];
int pid1;
int pid2;
if (argc != 5)
ft_perror("7");
if (pipe(fd) == -1)
ft_perror("8");
pid1 = fork();
if (pid1 == -1)
ft_perror("9");
if (pid1 == 0)
first_command_executer(fd, argv, envp);
pid2 = fork();
if (pid2 == -1)
ft_perror("10");
if (pid2 == 0)
second_command_executer(fd, argv, envp);
close(fd[0]);
close(fd[1]);
waitpid(pid1, NULL, 0);
waitpid(pid2, NULL, 0);
}