s/qmail
4.3.20
Next generation secure email transport
Loading...
Searching...
No Matches
4.3
sqmail-4.3.20
src
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
8
char
*(
qsargs
[]) = {
"qmail-send"
, 0 };
9
char
*(
qcargs
[]) = {
"qmail-clean"
, 0 };
10
char
*(
qlargs
[]) = {
"qmail-lspawn"
,
"./Maildir/"
, 0 };
11
char
*(
qrargs
[]) = {
"qmail-rspawn"
, 0 };
12
char
*(
qtargs
[]) = {
"qmail-todo"
, 0};
13
14
void
die
() {
_exit
(111); }
15
16
int
pi0
[2];
17
int
pi1
[2];
18
int
pi2
[2];
19
int
pi3
[2];
20
int
pi4
[2];
21
int
pi5
[2];
22
int
pi6
[2];
23
int
pi7
[2];
24
int
pi8
[2];
25
int
pi9
[2];
26
int
pi10
[2];
27
28
void
closefds
()
29
{
30
close(2); close(3); close(4); close(5); close(6);
31
close(7); close(8);
32
}
33
34
void
closepipes
()
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
43
int
main
(
int
argc,
char
*
const
*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];
// defaultdelivery
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);
// logger
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
);
// qmail-lspawn
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
);
// qmail-rspawn
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
);
// qmail-clean
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
);
// qmail-todo
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
);
// qmail-clean
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
);
// qmail-send
164
die
();
165
}
auto_uids.h
auto_gidq
int auto_gidq
auto_uidr
int auto_uidr
auto_uidq
int auto_uidq
auto_uidl
int auto_uidl
auto_uids
int auto_uids
auto_gidn
int auto_gidn
main
int main()
Definition:
chkshsgr.c:6
exit.h
_exit
void _exit(int)
prot.h
prot_uid
int prot_uid(int)
Definition:
prot.c:18
prot_gid
int prot_gid(int)
Definition:
prot.c:6
die
void die()
Definition:
qmail-start.c:14
pi1
int pi1[2]
Definition:
qmail-start.c:17
qrargs
char * qrargs[]
Definition:
qmail-start.c:11
closepipes
void closepipes()
Definition:
qmail-start.c:34
pi10
int pi10[2]
Definition:
qmail-start.c:26
pi3
int pi3[2]
Definition:
qmail-start.c:19
pi4
int pi4[2]
Definition:
qmail-start.c:20
pi6
int pi6[2]
Definition:
qmail-start.c:22
qtargs
char * qtargs[]
Definition:
qmail-start.c:12
pi8
int pi8[2]
Definition:
qmail-start.c:24
pi0
int pi0[2]
Definition:
qmail-start.c:16
pi9
int pi9[2]
Definition:
qmail-start.c:25
pi5
int pi5[2]
Definition:
qmail-start.c:21
qsargs
char * qsargs[]
Definition:
qmail-start.c:8
pi7
int pi7[2]
Definition:
qmail-start.c:23
qlargs
char * qlargs[]
Definition:
qmail-start.c:10
closefds
void closefds()
Definition:
qmail-start.c:28
qcargs
char * qcargs[]
Definition:
qmail-start.c:9
pi2
int pi2[2]
Definition:
qmail-start.c:18
Generated on Thu Jan 16 2025 17:42:04 for s/qmail by
1.9.6