s/qmail 4.2.29a
Next generation secure email transport
Loading...
Searching...
No Matches
qmail-showctl.c
Go to the documentation of this file.
1#include <sys/types.h>
2#include <sys/stat.h>
3#include <unistd.h>
4#include "spf.h"
5#include "buffer.h"
6#include "exit.h"
7#include "fmt.h"
8#include "str.h"
9#include "control.h"
10#include "constmap.h"
11#include "stralloc.h"
12#include "direntry.h"
13#include "auto_uids.h"
14#include "auto_qmail.h"
15#include "auto_break.h"
16#include "auto_patrn.h"
17#include "auto_spawn.h"
18#include "auto_split.h"
19
20stralloc me = {0};
21int meok;
22
23stralloc line = {0};
24char num[FMT_ULONG];
25
26void safeput(char *buf,unsigned int len)
27{
28 char ch;
29
30 while (len > 0) {
31 ch = *buf;
32 if ((ch < 32) || (ch > 126)) ch = '?';
33 buffer_put(buffer_1,&ch,1);
34 ++buf;
35 --len;
36 }
37}
38
39void do_int(char *fn,char *def,char *pre,char *post)
40{
41 int i;
42 buffer_puts(buffer_1,"\n");
43 buffer_puts(buffer_1,fn);
44 buffer_puts(buffer_1,": ");
45 switch (control_readint(&i,fn)) {
46 case 0:
47 buffer_puts(buffer_1,"(Default.) ");
48 buffer_puts(buffer_1,pre);
49 buffer_puts(buffer_1,def);
50 buffer_puts(buffer_1,post);
51 buffer_puts(buffer_1,".\n");
52 break;
53 case 1:
54 if (i < 0) i = 0;
55 buffer_puts(buffer_1,pre);
56 buffer_put(buffer_1,num,fmt_uint(num,i));
57 buffer_puts(buffer_1,post);
58 buffer_puts(buffer_1,".\n");
59 break;
60 default:
61 buffer_puts(buffer_1,"Oops! Trouble reading this file.\n");
62 break;
63 }
64}
65
66void do_str(char *fn,int flagme,char *def,char *pre)
67{
68 buffer_puts(buffer_1,"\n");
69 buffer_puts(buffer_1,fn);
70 buffer_puts(buffer_1,": ");
71 switch (control_readline(&line,fn)) {
72 case 0:
73 buffer_puts(buffer_1,"(Default.) ");
74 if (!stralloc_copys(&line,def)) {
75 buffer_puts(buffer_1,"Oops! Out of memory.\n");
76 break;
77 };
78 if (flagme && meok)
79 if (!stralloc_copy(&line,&me)) {
80 buffer_puts(buffer_1,"Oops! Out of memory.\n");
81 break;
82 };
83 case 1:
84 buffer_puts(buffer_1,pre);
85 safeput(line.s,line.len);
86 buffer_puts(buffer_1,".\n");
87 break;
88 default:
89 buffer_puts(buffer_1,"Oops! Trouble reading this file.\n");
90 break;
91 }
92}
93
94int do_lst(char *fn,char *def,char *pre,char *post)
95{
96 int i;
97 int j;
98
99 buffer_puts(buffer_1,"\n");
100 buffer_puts(buffer_1,fn);
101 buffer_puts(buffer_1,": ");
102 switch (control_readfile(&line,fn,0)) {
103 case 0:
104 buffer_puts(buffer_1,"(Default.) ");
105 buffer_puts(buffer_1,def);
106 buffer_puts(buffer_1,"\n");
107 return 0;
108 case 1:
109 buffer_puts(buffer_1,"\n");
110 i = 0;
111 for (j = 0; j < line.len; ++j)
112 if (!line.s[j]) {
113 buffer_puts(buffer_1,pre);
114 safeput(line.s + i,j - i);
115 buffer_puts(buffer_1,post);
116 buffer_puts(buffer_1,"\n");
117 i = j + 1;
118 }
119 return 1;
120 default:
121 buffer_puts(buffer_1,"Oops! Trouble reading this file.\n");
122 return -1;
123 }
124}
125
126int main()
127{
128 DIR *dir;
129 direntry *d;
130 struct stat stmrh;
131 struct stat stmrhcdb;
132
133 buffer_puts(buffer_1,"s/qmail home directory: ");
134 buffer_puts(buffer_1,auto_qmail);
135 buffer_puts(buffer_1,".\n");
136
137 buffer_puts(buffer_1,"user-ext delimiter: ");
138 buffer_puts(buffer_1,auto_break);
139 buffer_puts(buffer_1,".\n");
140
141 buffer_puts(buffer_1,"paternalism (in decimal): ");
142 buffer_put(buffer_1,num,fmt_ulong(num,(unsigned long) auto_patrn));
143 buffer_puts(buffer_1,".\n");
144
145 buffer_puts(buffer_1,"silent concurrency limit: ");
146 buffer_put(buffer_1,num,fmt_ulong(num,(unsigned long) auto_spawn));
147 buffer_puts(buffer_1,".\n");
148
149 buffer_puts(buffer_1,"subdirectory split: ");
150 buffer_put(buffer_1,num,fmt_ulong(num,(unsigned long) auto_split));
151 buffer_puts(buffer_1,".\n");
152
153 buffer_puts(buffer_1,"user ids: ");
154 buffer_put(buffer_1,num,fmt_ulong(num,(unsigned long) auto_uida));
155 buffer_puts(buffer_1,", ");
156 buffer_put(buffer_1,num,fmt_ulong(num,(unsigned long) auto_uidd));
157 buffer_puts(buffer_1,", ");
158 buffer_put(buffer_1,num,fmt_ulong(num,(unsigned long) auto_uidl));
159 buffer_puts(buffer_1,", ");
160 buffer_put(buffer_1,num,fmt_ulong(num,(unsigned long) auto_uido));
161 buffer_puts(buffer_1,", ");
162 buffer_put(buffer_1,num,fmt_ulong(num,(unsigned long) auto_uidp));
163 buffer_puts(buffer_1,", ");
164 buffer_put(buffer_1,num,fmt_ulong(num,(unsigned long) auto_uidq));
165 buffer_puts(buffer_1,", ");
166 buffer_put(buffer_1,num,fmt_ulong(num,(unsigned long) auto_uidr));
167 buffer_puts(buffer_1,", ");
168 buffer_put(buffer_1,num,fmt_ulong(num,(unsigned long) auto_uids));
169 buffer_puts(buffer_1,".\n");
170
171 buffer_puts(buffer_1,"group ids: ");
172 buffer_put(buffer_1,num,fmt_ulong(num,(unsigned long) auto_gidn));
173 buffer_puts(buffer_1,", ");
174 buffer_put(buffer_1,num,fmt_ulong(num,(unsigned long) auto_gidq));
175 buffer_puts(buffer_1,".\n");
176
177 if (chdir(auto_qmail) == -1) {
178 buffer_puts(buffer_1,"Oops! Unable to chdir to ");
179 buffer_puts(buffer_1,auto_qmail);
180 buffer_puts(buffer_1,".\n");
181 buffer_flush(buffer_1);
182 _exit(110);
183 }
184 if (chdir("control") == -1) {
185 buffer_puts(buffer_1,"Oops! Unable to chdir to control.\n");
186 buffer_flush(buffer_1);
187 _exit(110);
188 }
189
190 dir = opendir(".");
191 if (!dir) {
192 buffer_puts(buffer_1,"Oops! Unable to open current directory.\n");
193 buffer_flush(buffer_1);
194 _exit(110);
195 }
196
197 meok = control_readline(&me,"me");
198 if (meok == -1) {
199 buffer_puts(buffer_1,"Oops! Trouble reading control/me.");
200 buffer_flush(buffer_1);
201 _exit(112);
202 }
203
204 do_lst("authsenders","No authenticated SMTP senders.","Authenticated SMTP senders: ","");
205 do_lst("badhelo","Any HELO/EHLO greeting is allowed.",""," not accepted in HELO/EHLO; exception token is '!'.");
206 do_lst("badmailfrom","Any MAIL FROM is allowed.",""," are rejected or treated special in MAIL FROM depending on tokens: '!', '?', '=', '~', '+'.");
207 do_lst("badloadertypes","Any loader types are accepted.",""," not accepted as loader type.");
208 /* XXX: check badloadertypes.cdb contents */
209 buffer_puts(buffer_1,"\nbadloadertypes.cdb: ");
210 if (stat("badloadertypes",&stmrh) == -1)
211 if (stat("badloadertypes.cdb",&stmrhcdb) == -1)
212 buffer_puts(buffer_1,"(Default.) No effect.\n");
213 else
214 buffer_puts(buffer_1,"Oops! badloadertypes.cdb exists but badloadertypes doesn't.\n");
215 else
216 if (stat("badloadertypes.cdb",&stmrhcdb) == -1)
217 buffer_puts(buffer_1,"Oops! badloadertypes exists but badloadertypes.cdb doesn't.\n");
218 else
219 if (stmrh.st_mtime > stmrhcdb.st_mtime)
220 buffer_puts(buffer_1,"Oops! badloadertypes.cdb is older than badloadertypes.\n");
221 else
222 buffer_puts(buffer_1,"Modified recently enough; hopefully up to date.\n");
223 do_lst("badmimetypes","Any MIME types are accepted.",""," not accepted as MIME type.");
224 /* XXX: check badmimetypes.cdb contents */
225 buffer_puts(buffer_1,"\nbadmimetypes.cdb: ");
226 if (stat("badmimetypes",&stmrh) == -1)
227 if (stat("badmimetypes.cdb",&stmrhcdb) == -1)
228 buffer_puts(buffer_1,"(Default.) No effect.\n");
229 else
230 buffer_puts(buffer_1,"Oops! badmimetypes.cdb exists but badmimetypes doesn't.\n");
231 else
232 if (stat("badmimetypes.cdb",&stmrhcdb) == -1)
233 buffer_puts(buffer_1,"Oops! badmimetypes exists but badmimetypes.cdb doesn't.\n");
234 else
235 if (stmrh.st_mtime > stmrhcdb.st_mtime)
236 buffer_puts(buffer_1,"Oops! badmimetypes.cdb is older than badmimetypes.\n");
237 else
238 buffer_puts(buffer_1,"Modified recently enough; hopefully up to date.\n");
239 do_lst("badrcptto","Any RCPT TO is allowed.",""," not accepted in RCPT TO.");
240 do_str("bouncefrom",0,"MAILER-DAEMON","Bounce user name is ");
241 do_str("bouncehost",1,"bouncehost","Bounce host name is ");
242 do_int("bouncemaxbytes","0","Bounce size limit is "," bytes");
243 do_int("concurrencylocal","10","Local concurrency is ","");
244 do_int("concurrencyremote","20","Remote concurrency is ","");
245 do_int("databytes","0","SMTP DATA limit is "," bytes");
246 do_str("defaultdomain",1,"defaultdomain","Default domain name is ");
247 do_str("defaulthost",1,"defaulthost","Default host name is ");
248 do_lst("dkimdomains","No DKIM domains defined for signing.","DKIM domains: ","");
249 do_lst("domaincerts","No domain certs defined.","Domain certs: ","");
250 do_lst("domainips","No domain ip mappings defined.","Mappping sender domain part to local ip: ","");
251 do_str("doublebouncehost",1,"doublebouncehost","2B recipient host: ");
252 do_str("doublebounceto",0,"postmaster","2B recipient user: ");
253 do_str("envnoathost",1,"envnoathost","Presumed domain name is ");
254 do_str("helohost",1,"helohost","SMTP client HELO host name is ");
255 do_str("idhost",1,"idhost","Message-ID host name is ");
256 do_str("localiphost",1,"localiphost","Local IP address becomes ");
257 do_lst("locals","Messages for me are delivered locally.","Messages for "," are delivered locally.");
258 do_str("me",0,"undefined! Uh-oh","My name is ");
259
260 do_lst("mailfromrules","Any envelope sender are accepted.",""," (MAV rule).");
261 /* XXX: check mailfromrules.cdb contents */
262 buffer_puts(buffer_1,"\nmailfromrules.cdb: ");
263 if (stat("mailfromrules",&stmrh) == -1)
264 if (stat("mailfromrules.cdb",&stmrhcdb) == -1)
265 buffer_puts(buffer_1,"(Default.) No effect.\n");
266 else
267 buffer_puts(buffer_1,"Oops! mailfromrules.cdb exists but mailfromrules doesn't.\n");
268 else
269 if (stat("mailfromrules.cdb",&stmrhcdb) == -1)
270 buffer_puts(buffer_1,"Oops! mailfromrules exists but mailfromrules.cdb doesn't.\n");
271 else
272 if (stmrh.st_mtime > stmrhcdb.st_mtime)
273 buffer_puts(buffer_1,"Oops! mailfromrules.cdb is older than mailfromrules.\n");
274 else
275 buffer_puts(buffer_1,"Modified recently enough; hopefully up to date.\n");
276
277 do_lst("percenthack","The percent hack is not allowed.","The percent hack is allowed for user%host@",".");
278 do_str("plusdomain",1,"plusdomain","Plus domain name is ");
279 do_lst("qmqpservers","No QMQP servers.","QMQP server: ",".");
280 do_int("queuelifetime","604800","Message lifetime in the queue is "," seconds");
281
282 if (do_lst("rcpthosts","SMTP clients may send messages to any recipient.","SMTP clients may send messages to recipients at ","."))
283 do_lst("morercpthosts","No effect.","SMTP clients may send messages to recipients at ",".");
284 else
285 do_lst("morercpthosts","No rcpthosts; morercpthosts is irrelevant.","No rcpthosts; doesn't matter that morercpthosts has ",".");
286 /* XXX: check morercpthosts.cdb contents */
287 buffer_puts(buffer_1,"\nmorercpthosts.cdb: ");
288 if (stat("morercpthosts",&stmrh) == -1)
289 if (stat("morercpthosts.cdb",&stmrhcdb) == -1)
290 buffer_puts(buffer_1,"(Default.) No effect.\n");
291 else
292 buffer_puts(buffer_1,"Oops! morercpthosts.cdb exists but morercpthosts doesn't.\n");
293 else
294 if (stat("morercpthosts.cdb",&stmrhcdb) == -1)
295 buffer_puts(buffer_1,"Oops! morercpthosts exists but morercpthosts.cdb doesn't.\n");
296 else
297 if (stmrh.st_mtime > stmrhcdb.st_mtime)
298 buffer_puts(buffer_1,"Oops! morercpthosts.cdb is older than morercpthosts.\n");
299 else
300 buffer_puts(buffer_1,"Modified recently enough; hopefully up to date.\n");
301 do_lst("recipients","SMTP clients may send messages to any recipient.","SMTP clients may send messages to local recipients listed in ",".");
302 do_str("smtpgreeting",1,"smtpgreeting","SMTP greeting: 220 ");
303 do_lst("qmtproutes","No additional QMTP routes.","QMTP route: ","");
304 do_lst("smtproutes","No artificial SMTP routes.","SMTP route: ","");
305 do_str("spfexplain",0,SPF_DEFEXP,"SPF default explanation is: 550 ");
306 do_str("spflocalrules",0,"(None)","Defined local SPF rules are: ");
307 do_lst("srsrdomains","No SRS fowarding rules.","SRS rules: ","");
308 do_int("timeoutconnect","60","SMTP client connection timeout is "," seconds");
309 do_int("timeoutremote","1200","SMTP client data timeout is "," seconds");
310 do_int("timeoutsmtpd","1200","SMTP server data timeout is "," seconds");
311 do_lst("tlsdestinations","No TLS destinations defined.","TLS destination: ","");
312 do_lst("virtualdomains","No virtual domains.","Virtual domain: ","");
313
314 while ((d = readdir(dir))) {
315 if (str_equal(d->d_name,".")) continue;
316 if (str_equal(d->d_name,"..")) continue;
317 if (str_equal(d->d_name,"authsenders")) continue;
318 if (str_equal(d->d_name,"badhelo")) continue;
319 if (str_equal(d->d_name,"badrcptto")) continue;
320 if (str_equal(d->d_name,"badmailfrom")) continue;
321 if (str_equal(d->d_name,"badloadertypes")) continue;
322 if (str_equal(d->d_name,"badloadertypes.cdb")) continue;
323 if (str_equal(d->d_name,"badmimetypes")) continue;
324 if (str_equal(d->d_name,"badmimetypes.cdb")) continue;
325 if (str_equal(d->d_name,"bouncefrom")) continue;
326 if (str_equal(d->d_name,"bouncehost")) continue;
327 if (str_equal(d->d_name,"bouncemaxbytes")) continue;
328 if (str_equal(d->d_name,"concurrencylocal")) continue;
329 if (str_equal(d->d_name,"concurrencyremote")) continue;
330 if (str_equal(d->d_name,"databytes")) continue;
331 if (str_equal(d->d_name,"defaultdomain")) continue;
332 if (str_equal(d->d_name,"defaulthost")) continue;
333 if (str_equal(d->d_name,"dkimdomains")) continue;
334 if (str_equal(d->d_name,"domainips")) continue;
335 if (str_equal(d->d_name,"domaincerts")) continue;
336 if (str_equal(d->d_name,"doublebouncehost")) continue;
337 if (str_equal(d->d_name,"doublebounceto")) continue;
338 if (str_equal(d->d_name,"envnoathost")) continue;
339 if (str_equal(d->d_name,"helohost")) continue;
340 if (str_equal(d->d_name,"idhost")) continue;
341 if (str_equal(d->d_name,"localiphost")) continue;
342 if (str_equal(d->d_name,"locals")) continue;
343 if (str_equal(d->d_name,"me")) continue;
344 if (str_equal(d->d_name,"mailfromrules")) continue;
345 if (str_equal(d->d_name,"mailfromrules.cdb")) continue;
346 if (str_equal(d->d_name,"morercpthosts")) continue;
347 if (str_equal(d->d_name,"morercpthosts.cdb")) continue;
348 if (str_equal(d->d_name,"percenthack")) continue;
349 if (str_equal(d->d_name,"plusdomain")) continue;
350 if (str_equal(d->d_name,"qmqpservers")) continue;
351 if (str_equal(d->d_name,"queuelifetime")) continue;
352 if (str_equal(d->d_name,"rcpthosts")) continue;
353 if (str_equal(d->d_name,"recipients")) continue;
354 if (str_equal(d->d_name,"smtpgreeting")) continue;
355 if (str_equal(d->d_name,"qmtproutes")) continue;
356 if (str_equal(d->d_name,"smtproutes")) continue;
357 if (str_equal(d->d_name,"spfexplain")) continue;
358 if (str_equal(d->d_name,"spflocalrules")) continue;
359 if (str_equal(d->d_name,"srsdomains")) continue;
360 if (str_equal(d->d_name,"timeoutconnect")) continue;
361 if (str_equal(d->d_name,"timeoutremote")) continue;
362 if (str_equal(d->d_name,"timeoutsmtpd")) continue;
363 if (str_equal(d->d_name,"tlsdestinations")) continue;
364 if (str_equal(d->d_name,"virtualdomains")) continue;
365 buffer_puts(buffer_1,"\n");
366 buffer_puts(buffer_1,d->d_name);
367 buffer_puts(buffer_1,": I have no idea what this file does.\n");
368 }
369
370 buffer_flush(buffer_1);
371 _exit(0);
372}
char auto_break[]
int auto_patrn
char auto_qmail[]
int auto_spawn
int auto_split
int auto_gidq
int auto_uidd
int auto_uidr
int auto_uidq
int auto_uidl
int auto_uida
int auto_uids
int auto_uidp
int auto_uido
int auto_gidn
int control_readint(int *i, char *fn)
Definition: control.c:71
int control_readline(stralloc *sa, char *fn)
Definition: control.c:52
int control_readfile(stralloc *sa, char *fn, int flagme)
Definition: control.c:86
int stralloc_copys(stralloc *, char const *)
void _exit()
char buf[100+FMT_ULONG]
Definition: hier.c:10
stralloc fn
Definition: qmail-qmaint.c:483
int j
Definition: qmail-send.c:920
struct del * d[CHANNELS]
Definition: qmail-send.c:720
stralloc me
Definition: qmail-showctl.c:20
int do_lst(char *fn, char *def, char *pre, char *post)
Definition: qmail-showctl.c:94
void safeput(char *buf, unsigned int len)
Definition: qmail-showctl.c:26
void do_str(char *fn, int flagme, char *def, char *pre)
Definition: qmail-showctl.c:66
char num[FMT_ULONG]
Definition: qmail-showctl.c:24
stralloc line
Definition: qmail-showctl.c:23
int meok
Definition: qmail-showctl.c:21
void do_int(char *fn, char *def, char *pre, char *post)
Definition: qmail-showctl.c:39
int main()
#define SPF_DEFEXP
Definition: spf.h:34