-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathpipeslin.h
More file actions
59 lines (56 loc) · 1.5 KB
/
pipeslin.h
File metadata and controls
59 lines (56 loc) · 1.5 KB
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
int pipeLoop(char *inpt) {
char *comms[1024];
for(int i=0;i<1024;i++){
comms[i] = (char *)malloc(sizeof(char) * 1024);
memset(comms[i],0,sizeof(comms[i]));
}
int cntr=0;
cnt = getwords(inpt);
for(int i=0;i<cnt;i++){
if(input[i][0]!='|'){
char buff[105]={'\0'};
sprintf(buff," %s",input[i]);
strcat(comms[cntr],buff);
} else
cntr++;
}
int sttarr[cntr+1];
int status;
int pipfsz = (cntr) * 2;
int pipes[pipfsz];
int return_value = -1;
pid_t waitresult;
pid_t forkArr[cntr+1];
for (int i = 0; i < pipfsz; i += 2)
pipe(pipes + i);
for (int i = 0; i < cntr+1; i++) {
if ((forkArr[i] = fork()) == -1) {
perror("Pipes fork error ");
exit(-1);
}
if (!forkArr[i]) {
if (!i) {
dup2(pipes[1], 1);
} else if (i == cntr) {
dup2(pipes[2 * cntr - 2], 0);
} else {
dup2(pipes[2 * (i - 1)], 0);
dup2(pipes[(2 * i) + 1], 1);
}
for(int i=0;i<pipfsz;i++)
close(pipes[i]);
verify_cmd(comms[i]);
exit(0);
}
}
for(int i=0;i<pipfsz;i++)
close(pipes[i]);
for (int i = 0; i < cntr+1; i++) {
waitresult = waitpid(forkArr[i], &status, WUNTRACED);
sttarr[i] = status;
}
if (!sttarr[cntr]) {
return_value = 0;
}
return 0;
}