-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathstartforking.c
73 lines (68 loc) · 2.39 KB
/
startforking.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
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* startforking.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: yrhiba <yrhiba@student.1337.ma> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2022/12/05 20:18:40 by yrhiba #+# #+# */
/* Updated: 2022/12/06 03:48:18 by yrhiba ### ########.fr */
/* */
/* ************************************************************************** */
#include "pipex.h"
void wichfds(int *rw, t_pipex *vars, int *fds, int i)
{
if ((i != 0) && (i != (((int)(vars->cmds_count)) - 1)))
{
rw[0] = ((vars->pipes)[i][0]);
rw[1] = ((vars->pipes)[i + 1][1]);
}
else if (i == 0)
{
rw[0] = fds[0];
rw[1] = ((vars->pipes)[i + 1][1]);
}
else if (i == (((int)(vars->cmds_count)) - 1))
{
rw[0] = ((vars->pipes)[i][0]);
rw[1] = fds[1];
}
}
int startproc(int *rw, t_pipex *vars, int *fds, int i)
{
wichfds(rw, vars, fds, i);
if (dup2(rw[1], STDOUT_FILENO) == -1 || dup2(rw[0], STDIN_FILENO) == -1)
return (closeallfds(vars, fds), free(vars->pids),
perror("error 50(startforking)"), 1);
closeallfds(vars, fds);
vars->args = getcmdargs(vars, vars->av, vars->ev, i);
if (!(vars->args))
return (free(vars->pids), perror("error 56(startforking)"), 1);
if (execve((vars->args)[0], vars->args, (char *const *)vars->ev) == -1)
return (free(vars->pids), free(vars->args),
perror("error 55(startforking)"), 1);
return (1);
}
int startforking(t_pipex *vars, const char **av, const char **ev, int *fds)
{
int i;
int rw[2];
vars->pids = (int *)malloc(sizeof(int) * vars->cmds_count);
if (!(vars->pids))
return (perror("error 20(startforking)"), 1);
i = -1;
while (++i < ((int)(vars->cmds_count)))
{
(vars->pids)[i] = fork();
if ((vars->pids)[i] == -1)
return (free(vars->pids), perror("error 50(startforking)"), 1);
if (((vars->pids)[i]) == 0)
{
vars->av = av;
vars->ev = ev;
startproc(rw, vars, fds, i);
return (1);
}
}
return (free(vars->pids), 0);
}