Commit | Line | Data |
---|---|---|
2117e02e MW |
1 | #include "fd.h" |
2 | #include "prot.h" | |
3 | #include "exit.h" | |
4 | #include "fork.h" | |
5 | #include "auto_uids.h" | |
6 | ||
7 | char *(qsargs[]) = { "qmail-send", 0 }; | |
8 | char *(qcargs[]) = { "qmail-clean", 0 }; | |
9 | char *(qlargs[]) = { "qmail-lspawn", "./Mailbox", 0 }; | |
10 | char *(qrargs[]) = { "qmail-rspawn", 0 }; | |
11 | ||
12 | void die() { _exit(111); } | |
13 | ||
14 | int pi0[2]; | |
15 | int pi1[2]; | |
16 | int pi2[2]; | |
17 | int pi3[2]; | |
18 | int pi4[2]; | |
19 | int pi5[2]; | |
20 | int pi6[2]; | |
21 | ||
22 | void close23456() { close(2); close(3); close(4); close(5); close(6); } | |
23 | ||
24 | void closepipes() { | |
25 | close(pi1[0]); close(pi1[1]); close(pi2[0]); close(pi2[1]); | |
26 | close(pi3[0]); close(pi3[1]); close(pi4[0]); close(pi4[1]); | |
27 | close(pi5[0]); close(pi5[1]); close(pi6[0]); close(pi6[1]); | |
28 | } | |
29 | ||
30 | void main(argc,argv) | |
31 | int argc; | |
32 | char **argv; | |
33 | { | |
34 | if (chdir("/") == -1) die(); | |
35 | umask(077); | |
36 | if (prot_gid(auto_gidq) == -1) die(); | |
37 | ||
38 | if (fd_copy(2,0) == -1) die(); | |
39 | if (fd_copy(3,0) == -1) die(); | |
40 | if (fd_copy(4,0) == -1) die(); | |
41 | if (fd_copy(5,0) == -1) die(); | |
42 | if (fd_copy(6,0) == -1) die(); | |
43 | ||
44 | if (argv[1]) { | |
45 | qlargs[1] = argv[1]; | |
46 | ++argv; | |
47 | } | |
48 | ||
49 | if (argv[1]) { | |
50 | if (pipe(pi0) == -1) die(); | |
51 | switch(fork()) { | |
52 | case -1: | |
53 | die(); | |
54 | case 0: | |
55 | if (prot_gid(auto_gidn) == -1) die(); | |
56 | if (prot_uid(auto_uidl) == -1) die(); | |
57 | close(pi0[1]); | |
58 | if (fd_move(0,pi0[0]) == -1) die(); | |
59 | close23456(); | |
60 | execvp(argv[1],argv + 1); | |
61 | die(); | |
62 | } | |
63 | close(pi0[0]); | |
64 | if (fd_move(1,pi0[1]) == -1) die(); | |
65 | } | |
66 | ||
67 | if (pipe(pi1) == -1) die(); | |
68 | if (pipe(pi2) == -1) die(); | |
69 | if (pipe(pi3) == -1) die(); | |
70 | if (pipe(pi4) == -1) die(); | |
71 | if (pipe(pi5) == -1) die(); | |
72 | if (pipe(pi6) == -1) die(); | |
73 | ||
74 | switch(fork()) { | |
75 | case -1: die(); | |
76 | case 0: | |
77 | if (fd_copy(0,pi1[0]) == -1) die(); | |
78 | if (fd_copy(1,pi2[1]) == -1) die(); | |
79 | close23456(); | |
80 | closepipes(); | |
81 | execvp(*qlargs,qlargs); | |
82 | die(); | |
83 | } | |
84 | ||
85 | switch(fork()) { | |
86 | case -1: die(); | |
87 | case 0: | |
88 | if (prot_uid(auto_uidr) == -1) die(); | |
89 | if (fd_copy(0,pi3[0]) == -1) die(); | |
90 | if (fd_copy(1,pi4[1]) == -1) die(); | |
91 | close23456(); | |
92 | closepipes(); | |
93 | execvp(*qrargs,qrargs); | |
94 | die(); | |
95 | } | |
96 | ||
97 | switch(fork()) { | |
98 | case -1: die(); | |
99 | case 0: | |
100 | if (prot_uid(auto_uidq) == -1) die(); | |
101 | if (fd_copy(0,pi5[0]) == -1) die(); | |
102 | if (fd_copy(1,pi6[1]) == -1) die(); | |
103 | close23456(); | |
104 | closepipes(); | |
105 | execvp(*qcargs,qcargs); | |
106 | die(); | |
107 | } | |
108 | ||
109 | if (prot_uid(auto_uids) == -1) die(); | |
110 | if (fd_copy(0,1) == -1) die(); | |
111 | if (fd_copy(1,pi1[1]) == -1) die(); | |
112 | if (fd_copy(2,pi2[0]) == -1) die(); | |
113 | if (fd_copy(3,pi3[1]) == -1) die(); | |
114 | if (fd_copy(4,pi4[0]) == -1) die(); | |
115 | if (fd_copy(5,pi5[1]) == -1) die(); | |
116 | if (fd_copy(6,pi6[0]) == -1) die(); | |
117 | closepipes(); | |
118 | execvp(*qsargs,qsargs); | |
119 | die(); | |
120 | } |