s/qmail 4.2.29a
Next generation secure email transport
Loading...
Searching...
No Matches
qmail-start.c
Go to the documentation of this file.
1#include <unistd.h>
2#include <sys/stat.h>
3#include "fd.h"
4#include "prot.h"
5#include "exit.h"
6#include "auto_uids.h"
7
8char *(qsargs[]) = { "qmail-send", 0 };
9char *(qcargs[]) = { "qmail-clean", 0 };
10char *(qlargs[]) = { "qmail-lspawn", "./Mailbox", 0 };
11char *(qrargs[]) = { "qmail-rspawn", 0 };
12char *(qtargs[]) = { "qmail-todo", 0};
13
14void die() { _exit(111); }
15
16int pi0[2];
17int pi1[2];
18int pi2[2];
19int pi3[2];
20int pi4[2];
21int pi5[2];
22int pi6[2];
23int pi7[2];
24int pi8[2];
25int pi9[2];
26int pi10[2];
27
28void closefds()
29{
30 close(2); close(3); close(4); close(5); close(6);
31 close(7); close(8);
32}
33
35{
36 close(pi1[0]); close(pi1[1]); close(pi2[0]); close(pi2[1]);
37 close(pi3[0]); close(pi3[1]); close(pi4[0]); close(pi4[1]);
38 close(pi5[0]); close(pi5[1]); close(pi6[0]); close(pi6[1]);
39 close(pi7[0]); close(pi7[1]); close(pi8[0]); close(pi8[1]);
40 close(pi9[0]); close(pi9[1]); close(pi10[0]); close(pi10[1]);
41}
42
43int main(int argc,char **argv)
44{
45 if (chdir("/") == -1) die();
46 umask(077);
47 if (prot_gid(auto_gidq) == -1) die();
48
49 if (fd_copy(2,0) == -1) die();
50 if (fd_copy(3,0) == -1) die();
51 if (fd_copy(4,0) == -1) die();
52 if (fd_copy(5,0) == -1) die();
53 if (fd_copy(6,0) == -1) die();
54 if (fd_copy(7,0) == -1) die();
55 if (fd_copy(8,0) == -1) die();
56
57 if (argv[1]) {
58 qlargs[1] = argv[1];
59 ++argv;
60 }
61
62 if (argv[1]) {
63 if (pipe(pi0) == -1) die();
64 switch (fork()) {
65 case -1:
66 die();
67 case 0:
68 if (prot_gid(auto_gidn) == -1) die();
69 if (prot_uid(auto_uidl) == -1) die();
70 close(pi0[1]);
71 if (fd_move(0,pi0[0]) == -1) die();
72 closefds();
73 execvp(argv[1],argv + 1);
74 die();
75 }
76 close(pi0[0]);
77 if (fd_move(1,pi0[1]) == -1) die();
78 }
79
80 if (pipe(pi1) == -1) die();
81 if (pipe(pi2) == -1) die();
82 if (pipe(pi3) == -1) die();
83 if (pipe(pi4) == -1) die();
84 if (pipe(pi5) == -1) die();
85 if (pipe(pi6) == -1) die();
86 if (pipe(pi7) == -1) die();
87 if (pipe(pi8) == -1) die();
88 if (pipe(pi9) == -1) die();
89 if (pipe(pi10) == -1) die();
90
91 switch (fork()) {
92 case -1: die();
93 case 0:
94 if (fd_copy(0,pi1[0]) == -1) die();
95 if (fd_copy(1,pi2[1]) == -1) die();
96 closefds();
97 closepipes();
98 execvp(*qlargs,qlargs);
99 die();
100 }
101
102 switch (fork()) {
103 case -1: die();
104 case 0:
105 if (prot_uid(auto_uidr) == -1) die();
106 if (fd_copy(0,pi3[0]) == -1) die();
107 if (fd_copy(1,pi4[1]) == -1) die();
108 closefds();
109 closepipes();
110 execvp(*qrargs,qrargs);
111 die();
112 }
113
114 switch (fork()) {
115 case -1: die();
116 case 0:
117 if (prot_uid(auto_uidq) == -1) die();
118 if (fd_copy(0,pi5[0]) == -1) die();
119 if (fd_copy(1,pi6[1]) == -1) die();
120 closefds();
121 closepipes();
122 execvp(*qcargs,qcargs);
123 die();
124 }
125
126 switch (fork()) {
127 case -1: die();
128 case 0:
129 if (prot_uid(auto_uids) == -1) die();
130 if (fd_copy(0,pi7[0]) == -1) die();
131 if (fd_copy(1,pi8[1]) == -1) die();
132 closefds();
133 if (fd_copy(2,pi9[1]) == -1) die();
134 if (fd_copy(3,pi10[0]) == -1) die();
135 closepipes();
136 execvp(*qtargs,qtargs);
137 die();
138 }
139
140 switch (fork()) {
141 case -1: die();
142 case 0:
143 if (prot_uid(auto_uidq) == -1) die();
144 if (fd_copy(0,pi9[0]) == -1) die();
145 if (fd_copy(1,pi10[1]) == -1) die();
146 closefds();
147 closepipes();
148 execvp(*qcargs,qcargs);
149 die();
150 }
151
152 if (prot_uid(auto_uids) == -1) die();
153 if (fd_copy(0,1) == -1) die();
154 if (fd_copy(1,pi1[1]) == -1) die();
155 if (fd_copy(2,pi2[0]) == -1) die();
156 if (fd_copy(3,pi3[1]) == -1) die();
157 if (fd_copy(4,pi4[0]) == -1) die();
158 if (fd_copy(5,pi5[1]) == -1) die();
159 if (fd_copy(6,pi6[0]) == -1) die();
160 if (fd_copy(7,pi7[1]) == -1) die();
161 if (fd_copy(8,pi8[0]) == -1) die();
162 closepipes();
163 execvp(*qsargs,qsargs);
164 die();
165}
int auto_gidq
int auto_uidr
int auto_uidq
int auto_uidl
int auto_uids
int auto_gidn
int main()
Definition: chkshsgr.c:6
void _exit()
int prot_uid()
int prot_gid()
void die()
Definition: qmail-start.c:14
int pi1[2]
Definition: qmail-start.c:17
char * qrargs[]
Definition: qmail-start.c:11
void closepipes()
Definition: qmail-start.c:34
int pi10[2]
Definition: qmail-start.c:26
int pi3[2]
Definition: qmail-start.c:19
int pi4[2]
Definition: qmail-start.c:20
int pi6[2]
Definition: qmail-start.c:22
char * qtargs[]
Definition: qmail-start.c:12
int pi8[2]
Definition: qmail-start.c:24
int pi0[2]
Definition: qmail-start.c:16
int pi9[2]
Definition: qmail-start.c:25
int pi5[2]
Definition: qmail-start.c:21
char * qsargs[]
Definition: qmail-start.c:8
int pi7[2]
Definition: qmail-start.c:23
char * qlargs[]
Definition: qmail-start.c:10
void closefds()
Definition: qmail-start.c:28
char * qcargs[]
Definition: qmail-start.c:9
int pi2[2]
Definition: qmail-start.c:18