tgrekov-pipex
HIVE pipex May 2024
Loading...
Searching...
No Matches
dispatcher.c
1/* ************************************************************************** */
2/* */
3/* ::: :::::::: */
4/* dispatcher.c :+: :+: :+: */
5/* +:+ +:+ +:+ */
6/* By: tgrekov <tgrekov@student.hive.fi> +#+ +:+ +#+ */
7/* +#+#+#+#+#+ +#+ */
8/* Created: 2024/04/23 08:18:15 by tgrekov #+# #+# */
9/* Updated: 2024/05/09 19:27:42 by tgrekov ### ########.fr */
10/* */
11/* ************************************************************************** */
12
13#include <unistd.h>
14#include "../utils/utils.h"
15
16void dispatch(char **paths, char *args, char **envp, int *in_out);
17int wait_all(int *pids, int n, int override);
18
19static int child1(char ***str_arrs, int *pair, int *in_out)
20{
21 int pid;
22
23 pid = fork();
24 if (pid == -1)
25 return ((int) err("fork()", 0));
26 if (!pid)
27 {
28 if (close(pair[0]) == -1)
29 return ((int) err("close()", (void *) 1));
30 dispatch(str_arrs[0], str_arrs[1][0], str_arrs[2],
31 (int []){in_out[0], pair[1]});
32 }
33 return (pid);
34}
35
36static int child2(char ***str_arrs, int *pair, int *in_out)
37{
38 int pid;
39
40 pid = fork();
41 if (pid == -1)
42 return ((int) err("fork()", 0));
43 if (!pid)
44 dispatch(str_arrs[0], str_arrs[1][1], str_arrs[2],
45 (int []){pair[0], in_out[1]});
46 return (pid);
47}
48
49int dispatcher(char **paths, char **argv, char **envp, int *in_out)
50{
51 int pair[2];
52 int pids[2];
53
54 if (pipe(pair) == -1)
55 return ((int) err("pipe()", (void *) 1));
56 pids[0] = child1((char **[]){paths, argv, envp}, pair, in_out);
57 if (!pids[0])
58 return (1);
59 if (in_out[0] != -1 && close(in_out[0]) == -1)
60 return (wait_all(pids, 1, (int) err("close()", (void *) 1)));
61 if (close(pair[1]) == -1)
62 return (wait_all(pids, 1, (int) err("close()", (void *) 1)));
63 pids[1] = child2((char **[]){paths, argv, envp}, pair, in_out);
64 if (!pids[1])
65 return (wait_all(pids, 1, 1));
66 if (close(pair[0]) == -1)
67 return (wait_all(pids, 2, (int) err("close()", (void *) 1)));
68 if (in_out[1] != -1 && close(in_out[1]) == -1)
69 return (wait_all(pids, 2, (int) err("close()", (void *) 1)));
70 return (wait_all(pids, 2, 0));
71}
void dispatch(char **paths, char *args, char **envp, int *in_out)
Dispatch child process with argument string args, environment envp, and stdin / stdout in_out[0] / in...
Definition dispatch.c:67
int wait_all(int *pids, int n, int override)
Wait for first n processes in pids to change state and return the last process's exit code,...
Definition wait_all.c:31
int dispatcher(int n, char ***str_arrs, int *in_out)
Dispatch n child processes with argument strings str_arrs[1][i], environment pointer str_arrs[2],...
Definition dispatcher.c:85
void * err(const char *str, void *retval)
Wrapper around perror() that always returns retval.
Definition err.c:29