|
0
|
1 |
#include <sys/types.h>
|
|
|
2 |
#include <sys/stat.h>
|
|
|
3 |
#include "substdio.h"
|
|
|
4 |
#include "subfd.h"
|
|
|
5 |
#include "exit.h"
|
|
|
6 |
#include "fmt.h"
|
|
|
7 |
#include "str.h"
|
|
|
8 |
#include "control.h"
|
|
|
9 |
#include "constmap.h"
|
|
|
10 |
#include "stralloc.h"
|
|
|
11 |
#include "direntry.h"
|
|
|
12 |
#include "auto_uids.h"
|
|
|
13 |
#include "auto_qmail.h"
|
|
|
14 |
#include "auto_break.h"
|
|
|
15 |
#include "auto_patrn.h"
|
|
|
16 |
#include "auto_spawn.h"
|
|
|
17 |
#include "auto_split.h"
|
|
|
18 |
|
|
|
19 |
stralloc me = {0};
|
|
|
20 |
int meok;
|
|
|
21 |
|
|
|
22 |
stralloc line = {0};
|
|
|
23 |
char num[FMT_ULONG];
|
|
|
24 |
|
|
|
25 |
void safeput(buf,len)
|
|
|
26 |
char *buf;
|
|
|
27 |
unsigned int len;
|
|
|
28 |
{
|
|
|
29 |
char ch;
|
|
|
30 |
|
|
|
31 |
while (len > 0) {
|
|
|
32 |
ch = *buf;
|
|
|
33 |
if ((ch < 32) || (ch > 126)) ch = '?';
|
|
|
34 |
substdio_put(subfdout,&ch,1);
|
|
|
35 |
++buf;
|
|
|
36 |
--len;
|
|
|
37 |
}
|
|
|
38 |
}
|
|
|
39 |
|
|
|
40 |
void do_int(fn,def,pre,post)
|
|
|
41 |
char *fn;
|
|
|
42 |
char *def;
|
|
|
43 |
char *pre;
|
|
|
44 |
char *post;
|
|
|
45 |
{
|
|
|
46 |
int i;
|
|
|
47 |
substdio_puts(subfdout,"\n");
|
|
|
48 |
substdio_puts(subfdout,fn);
|
|
|
49 |
substdio_puts(subfdout,": ");
|
|
|
50 |
switch(control_readint(&i,fn)) {
|
|
|
51 |
case 0:
|
|
|
52 |
substdio_puts(subfdout,"(Default.) ");
|
|
|
53 |
substdio_puts(subfdout,pre);
|
|
|
54 |
substdio_puts(subfdout,def);
|
|
|
55 |
substdio_puts(subfdout,post);
|
|
|
56 |
substdio_puts(subfdout,".\n");
|
|
|
57 |
break;
|
|
|
58 |
case 1:
|
|
|
59 |
if (i < 0) i = 0;
|
|
|
60 |
substdio_puts(subfdout,pre);
|
|
|
61 |
substdio_put(subfdout,num,fmt_uint(num,i));
|
|
|
62 |
substdio_puts(subfdout,post);
|
|
|
63 |
substdio_puts(subfdout,".\n");
|
|
|
64 |
break;
|
|
|
65 |
default:
|
|
|
66 |
substdio_puts(subfdout,"Oops! Trouble reading this file.\n");
|
|
|
67 |
break;
|
|
|
68 |
}
|
|
|
69 |
}
|
|
|
70 |
|
|
|
71 |
void do_str(fn,flagme,def,pre)
|
|
|
72 |
char *fn;
|
|
|
73 |
int flagme;
|
|
|
74 |
char *def;
|
|
|
75 |
char *pre;
|
|
|
76 |
{
|
|
|
77 |
substdio_puts(subfdout,"\n");
|
|
|
78 |
substdio_puts(subfdout,fn);
|
|
|
79 |
substdio_puts(subfdout,": ");
|
|
|
80 |
switch(control_readline(&line,fn)) {
|
|
|
81 |
case 0:
|
|
|
82 |
substdio_puts(subfdout,"(Default.) ");
|
|
|
83 |
if (!stralloc_copys(&line,def)) {
|
|
|
84 |
substdio_puts(subfdout,"Oops! Out of memory.\n");
|
|
|
85 |
break;
|
|
|
86 |
}
|
|
|
87 |
if (flagme && meok)
|
|
|
88 |
if (!stralloc_copy(&line,&me)) {
|
|
|
89 |
substdio_puts(subfdout,"Oops! Out of memory.\n");
|
|
|
90 |
break;
|
|
|
91 |
}
|
|
|
92 |
case 1:
|
|
|
93 |
substdio_puts(subfdout,pre);
|
|
|
94 |
safeput(line.s,line.len);
|
|
|
95 |
substdio_puts(subfdout,".\n");
|
|
|
96 |
break;
|
|
|
97 |
default:
|
|
|
98 |
substdio_puts(subfdout,"Oops! Trouble reading this file.\n");
|
|
|
99 |
break;
|
|
|
100 |
}
|
|
|
101 |
}
|
|
|
102 |
|
|
|
103 |
int do_lst(fn,def,pre,post)
|
|
|
104 |
char *fn;
|
|
|
105 |
char *def;
|
|
|
106 |
char *pre;
|
|
|
107 |
char *post;
|
|
|
108 |
{
|
|
|
109 |
int i;
|
|
|
110 |
int j;
|
|
|
111 |
|
|
|
112 |
substdio_puts(subfdout,"\n");
|
|
|
113 |
substdio_puts(subfdout,fn);
|
|
|
114 |
substdio_puts(subfdout,": ");
|
|
|
115 |
switch(control_readfile(&line,fn)) {
|
|
|
116 |
case 0:
|
|
|
117 |
substdio_puts(subfdout,"(Default.) ");
|
|
|
118 |
substdio_puts(subfdout,def);
|
|
|
119 |
substdio_puts(subfdout,"\n");
|
|
|
120 |
return 0;
|
|
|
121 |
case 1:
|
|
|
122 |
substdio_puts(subfdout,"\n");
|
|
|
123 |
i = 0;
|
|
|
124 |
for (j = 0;j < line.len;++j)
|
|
|
125 |
if (!line.s[j]) {
|
|
|
126 |
substdio_puts(subfdout,pre);
|
|
|
127 |
safeput(line.s + i,j - i);
|
|
|
128 |
substdio_puts(subfdout,post);
|
|
|
129 |
substdio_puts(subfdout,"\n");
|
|
|
130 |
i = j + 1;
|
|
|
131 |
}
|
|
|
132 |
return 1;
|
|
|
133 |
default:
|
|
|
134 |
substdio_puts(subfdout,"Oops! Trouble reading this file.\n");
|
|
|
135 |
return -1;
|
|
|
136 |
}
|
|
|
137 |
}
|
|
|
138 |
|
|
|
139 |
void main()
|
|
|
140 |
{
|
|
|
141 |
DIR *dir;
|
|
|
142 |
direntry *d;
|
|
|
143 |
struct stat stmrh;
|
|
|
144 |
struct stat stmrhcdb;
|
|
|
145 |
|
|
|
146 |
substdio_puts(subfdout,"qmail home directory: ");
|
|
|
147 |
substdio_puts(subfdout,auto_qmail);
|
|
|
148 |
substdio_puts(subfdout,".\n");
|
|
|
149 |
|
|
|
150 |
substdio_puts(subfdout,"user-ext delimiter: ");
|
|
|
151 |
substdio_puts(subfdout,auto_break);
|
|
|
152 |
substdio_puts(subfdout,".\n");
|
|
|
153 |
|
|
|
154 |
substdio_puts(subfdout,"paternalism (in decimal): ");
|
|
|
155 |
substdio_put(subfdout,num,fmt_ulong(num,(unsigned long) auto_patrn));
|
|
|
156 |
substdio_puts(subfdout,".\n");
|
|
|
157 |
|
|
|
158 |
substdio_puts(subfdout,"silent concurrency limit: ");
|
|
|
159 |
substdio_put(subfdout,num,fmt_ulong(num,(unsigned long) auto_spawn));
|
|
|
160 |
substdio_puts(subfdout,".\n");
|
|
|
161 |
|
|
|
162 |
substdio_puts(subfdout,"subdirectory split: ");
|
|
|
163 |
substdio_put(subfdout,num,fmt_ulong(num,(unsigned long) auto_split));
|
|
|
164 |
substdio_puts(subfdout,".\n");
|
|
|
165 |
|
|
|
166 |
substdio_puts(subfdout,"user ids: ");
|
|
|
167 |
substdio_put(subfdout,num,fmt_ulong(num,(unsigned long) auto_uida));
|
|
|
168 |
substdio_puts(subfdout,", ");
|
|
|
169 |
substdio_put(subfdout,num,fmt_ulong(num,(unsigned long) auto_uidd));
|
|
|
170 |
substdio_puts(subfdout,", ");
|
|
|
171 |
substdio_put(subfdout,num,fmt_ulong(num,(unsigned long) auto_uidl));
|
|
|
172 |
substdio_puts(subfdout,", ");
|
|
|
173 |
substdio_put(subfdout,num,fmt_ulong(num,(unsigned long) auto_uido));
|
|
|
174 |
substdio_puts(subfdout,", ");
|
|
|
175 |
substdio_put(subfdout,num,fmt_ulong(num,(unsigned long) auto_uidp));
|
|
|
176 |
substdio_puts(subfdout,", ");
|
|
|
177 |
substdio_put(subfdout,num,fmt_ulong(num,(unsigned long) auto_uidq));
|
|
|
178 |
substdio_puts(subfdout,", ");
|
|
|
179 |
substdio_put(subfdout,num,fmt_ulong(num,(unsigned long) auto_uidr));
|
|
|
180 |
substdio_puts(subfdout,", ");
|
|
|
181 |
substdio_put(subfdout,num,fmt_ulong(num,(unsigned long) auto_uids));
|
|
|
182 |
substdio_puts(subfdout,".\n");
|
|
|
183 |
|
|
|
184 |
substdio_puts(subfdout,"group ids: ");
|
|
|
185 |
substdio_put(subfdout,num,fmt_ulong(num,(unsigned long) auto_gidn));
|
|
|
186 |
substdio_puts(subfdout,", ");
|
|
|
187 |
substdio_put(subfdout,num,fmt_ulong(num,(unsigned long) auto_gidq));
|
|
|
188 |
substdio_puts(subfdout,".\n");
|
|
|
189 |
|
|
|
190 |
if (chdir(auto_qmail) == -1) {
|
|
|
191 |
substdio_puts(subfdout,"Oops! Unable to chdir to ");
|
|
|
192 |
substdio_puts(subfdout,auto_qmail);
|
|
|
193 |
substdio_puts(subfdout,".\n");
|
|
|
194 |
substdio_flush(subfdout);
|
|
|
195 |
_exit(111);
|
|
|
196 |
}
|
|
|
197 |
if (chdir("control") == -1) {
|
|
|
198 |
substdio_puts(subfdout,"Oops! Unable to chdir to control.\n");
|
|
|
199 |
substdio_flush(subfdout);
|
|
|
200 |
_exit(111);
|
|
|
201 |
}
|
|
|
202 |
|
|
|
203 |
dir = opendir(".");
|
|
|
204 |
if (!dir) {
|
|
|
205 |
substdio_puts(subfdout,"Oops! Unable to open current directory.\n");
|
|
|
206 |
substdio_flush(subfdout);
|
|
|
207 |
_exit(111);
|
|
|
208 |
}
|
|
|
209 |
|
|
|
210 |
meok = control_readline(&me,"me");
|
|
|
211 |
if (meok == -1) {
|
|
|
212 |
substdio_puts(subfdout,"Oops! Trouble reading control/me.");
|
|
|
213 |
substdio_flush(subfdout);
|
|
|
214 |
_exit(111);
|
|
|
215 |
}
|
|
|
216 |
|
|
|
217 |
do_lst("badmailfrom","Any MAIL FROM is allowed.",""," not accepted in MAIL FROM.");
|
|
|
218 |
do_str("bouncefrom",0,"MAILER-DAEMON","Bounce user name is ");
|
|
|
219 |
do_str("bouncehost",1,"bouncehost","Bounce host name is ");
|
|
|
220 |
do_int("concurrencylocal","10","Local concurrency is ","");
|
|
|
221 |
do_int("concurrencyremote","20","Remote concurrency is ","");
|
|
|
222 |
do_int("databytes","0","SMTP DATA limit is "," bytes");
|
|
|
223 |
do_str("defaultdomain",1,"defaultdomain","Default domain name is ");
|
|
|
224 |
do_str("defaulthost",1,"defaulthost","Default host name is ");
|
|
|
225 |
do_str("doublebouncehost",1,"doublebouncehost","2B recipient host: ");
|
|
|
226 |
do_str("doublebounceto",0,"postmaster","2B recipient user: ");
|
|
|
227 |
do_str("envnoathost",1,"envnoathost","Presumed domain name is ");
|
|
|
228 |
do_str("helohost",1,"helohost","SMTP client HELO host name is ");
|
|
|
229 |
do_str("idhost",1,"idhost","Message-ID host name is ");
|
|
|
230 |
do_str("localiphost",1,"localiphost","Local IP address becomes ");
|
|
|
231 |
do_lst("locals","Messages for me are delivered locally.","Messages for "," are delivered locally.");
|
|
|
232 |
do_str("me",0,"undefined! Uh-oh","My name is ");
|
|
|
233 |
do_lst("percenthack","The percent hack is not allowed.","The percent hack is allowed for user%host@",".");
|
|
|
234 |
do_str("plusdomain",1,"plusdomain","Plus domain name is ");
|
|
|
235 |
do_lst("qmqpservers","No QMQP servers.","QMQP server: ",".");
|
|
|
236 |
do_int("queuelifetime","604800","Message lifetime in the queue is "," seconds");
|
|
|
237 |
|
|
|
238 |
if (do_lst("rcpthosts","SMTP clients may send messages to any recipient.","SMTP clients may send messages to recipients at ","."))
|
|
|
239 |
do_lst("morercpthosts","No effect.","SMTP clients may send messages to recipients at ",".");
|
|
|
240 |
else
|
|
|
241 |
do_lst("morercpthosts","No rcpthosts; morercpthosts is irrelevant.","No rcpthosts; doesn't matter that morercpthosts has ",".");
|
|
|
242 |
/* XXX: check morercpthosts.cdb contents */
|
|
|
243 |
substdio_puts(subfdout,"\nmorercpthosts.cdb: ");
|
|
|
244 |
if (stat("morercpthosts",&stmrh) == -1)
|
|
|
245 |
if (stat("morercpthosts.cdb",&stmrhcdb) == -1)
|
|
|
246 |
substdio_puts(subfdout,"(Default.) No effect.\n");
|
|
|
247 |
else
|
|
|
248 |
substdio_puts(subfdout,"Oops! morercpthosts.cdb exists but morercpthosts doesn't.\n");
|
|
|
249 |
else
|
|
|
250 |
if (stat("morercpthosts.cdb",&stmrhcdb) == -1)
|
|
|
251 |
substdio_puts(subfdout,"Oops! morercpthosts exists but morercpthosts.cdb doesn't.\n");
|
|
|
252 |
else
|
|
|
253 |
if (stmrh.st_mtime > stmrhcdb.st_mtime)
|
|
|
254 |
substdio_puts(subfdout,"Oops! morercpthosts.cdb is older than morercpthosts.\n");
|
|
|
255 |
else
|
|
|
256 |
substdio_puts(subfdout,"Modified recently enough; hopefully up to date.\n");
|
|
|
257 |
|
|
|
258 |
do_str("smtpgreeting",1,"smtpgreeting","SMTP greeting: 220 ");
|
|
|
259 |
do_lst("smtproutes","No artificial SMTP routes.","SMTP route: ","");
|
|
|
260 |
do_int("timeoutconnect","60","SMTP client connection timeout is "," seconds");
|
|
|
261 |
do_int("timeoutremote","1200","SMTP client data timeout is "," seconds");
|
|
|
262 |
do_int("timeoutsmtpd","1200","SMTP server data timeout is "," seconds");
|
|
|
263 |
do_lst("virtualdomains","No virtual domains.","Virtual domain: ","");
|
|
|
264 |
|
|
|
265 |
while (d = readdir(dir)) {
|
|
|
266 |
if (str_equal(d->d_name,".")) continue;
|
|
|
267 |
if (str_equal(d->d_name,"..")) continue;
|
|
|
268 |
if (str_equal(d->d_name,"bouncefrom")) continue;
|
|
|
269 |
if (str_equal(d->d_name,"bouncehost")) continue;
|
|
|
270 |
if (str_equal(d->d_name,"badmailfrom")) continue;
|
|
|
271 |
if (str_equal(d->d_name,"bouncefrom")) continue;
|
|
|
272 |
if (str_equal(d->d_name,"bouncehost")) continue;
|
|
|
273 |
if (str_equal(d->d_name,"concurrencylocal")) continue;
|
|
|
274 |
if (str_equal(d->d_name,"concurrencyremote")) continue;
|
|
|
275 |
if (str_equal(d->d_name,"databytes")) continue;
|
|
|
276 |
if (str_equal(d->d_name,"defaultdomain")) continue;
|
|
|
277 |
if (str_equal(d->d_name,"defaulthost")) continue;
|
|
|
278 |
if (str_equal(d->d_name,"doublebouncehost")) continue;
|
|
|
279 |
if (str_equal(d->d_name,"doublebounceto")) continue;
|
|
|
280 |
if (str_equal(d->d_name,"envnoathost")) continue;
|
|
|
281 |
if (str_equal(d->d_name,"helohost")) continue;
|
|
|
282 |
if (str_equal(d->d_name,"idhost")) continue;
|
|
|
283 |
if (str_equal(d->d_name,"localiphost")) continue;
|
|
|
284 |
if (str_equal(d->d_name,"locals")) continue;
|
|
|
285 |
if (str_equal(d->d_name,"me")) continue;
|
|
|
286 |
if (str_equal(d->d_name,"morercpthosts")) continue;
|
|
|
287 |
if (str_equal(d->d_name,"morercpthosts.cdb")) continue;
|
|
|
288 |
if (str_equal(d->d_name,"percenthack")) continue;
|
|
|
289 |
if (str_equal(d->d_name,"plusdomain")) continue;
|
|
|
290 |
if (str_equal(d->d_name,"qmqpservers")) continue;
|
|
|
291 |
if (str_equal(d->d_name,"queuelifetime")) continue;
|
|
|
292 |
if (str_equal(d->d_name,"rcpthosts")) continue;
|
|
|
293 |
if (str_equal(d->d_name,"smtpgreeting")) continue;
|
|
|
294 |
if (str_equal(d->d_name,"smtproutes")) continue;
|
|
|
295 |
if (str_equal(d->d_name,"timeoutconnect")) continue;
|
|
|
296 |
if (str_equal(d->d_name,"timeoutremote")) continue;
|
|
|
297 |
if (str_equal(d->d_name,"timeoutsmtpd")) continue;
|
|
|
298 |
if (str_equal(d->d_name,"virtualdomains")) continue;
|
|
|
299 |
substdio_puts(subfdout,"\n");
|
|
|
300 |
substdio_puts(subfdout,d->d_name);
|
|
|
301 |
substdio_puts(subfdout,": I have no idea what this file does.\n");
|
|
|
302 |
}
|
|
|
303 |
|
|
|
304 |
substdio_flush(subfdout);
|
|
|
305 |
_exit(0);
|
|
|
306 |
}
|