#include "substdio.h" #include "subfd.h" #include "exit.h" #include "fmt.h" #include "str.h" #include "control.h" #include "constmap.h" #include "stralloc.h" #include "direntry.h" #include "auto_qmail.h" stralloc me = {0}; int meok; stralloc line = {0}; char num[FMT_ULONG]; void safeput(buf,len) char *buf; unsigned int len; { char ch; while (len > 0) { ch = *buf; if ((ch < 32) || (ch > 126)) ch = '?'; substdio_put(subfdout,&ch,1); ++buf; --len; } } void do_int(fn,def,pre,post) char *fn; char *def; char *pre; char *post; { int i; substdio_puts(subfdout,"\n"); substdio_puts(subfdout,fn); substdio_puts(subfdout,": "); switch(control_readint(&i,fn)) { case 0: substdio_puts(subfdout,"(Default.) "); substdio_puts(subfdout,pre); substdio_puts(subfdout,def); substdio_puts(subfdout,post); substdio_puts(subfdout,".\n"); break; case 1: if (i < 0) i = 0; substdio_puts(subfdout,pre); substdio_put(subfdout,num,fmt_uint(num,i)); substdio_puts(subfdout,post); substdio_puts(subfdout,".\n"); break; default: substdio_puts(subfdout,"Oops! Trouble reading this file.\n"); break; } } void do_str(fn,flagme,def,pre) char *fn; int flagme; char *def; char *pre; { substdio_puts(subfdout,"\n"); substdio_puts(subfdout,fn); substdio_puts(subfdout,": "); switch(control_readline(&line,fn)) { case 0: substdio_puts(subfdout,"(Default.) "); if (!stralloc_copys(&line,def)) { substdio_puts(subfdout,"Oops! Out of memory.\n"); break; } if (flagme && meok) if (!stralloc_copy(&line,&me)) { substdio_puts(subfdout,"Oops! Out of memory.\n"); break; } case 1: substdio_puts(subfdout,pre); safeput(line.s,line.len); substdio_puts(subfdout,".\n"); break; default: substdio_puts(subfdout,"Oops! Trouble reading this file.\n"); break; } } void do_lst(fn,def,pre,post) char *fn; char *def; char *pre; char *post; { int i; int j; substdio_puts(subfdout,"\n"); substdio_puts(subfdout,fn); substdio_puts(subfdout,": "); switch(control_readfile(&line,fn)) { case 0: substdio_puts(subfdout,"(Default.) "); substdio_puts(subfdout,def); substdio_puts(subfdout,"\n"); break; case 1: substdio_puts(subfdout,"\n"); i = 0; for (j = 0;j < line.len;++j) if (!line.s[j]) { substdio_puts(subfdout,pre); safeput(line.s + i,j - i); substdio_puts(subfdout,post); substdio_puts(subfdout,"\n"); i = j + 1; } break; default: substdio_puts(subfdout,"Oops! Trouble reading this file.\n"); break; } } void main() { DIR *dir; direntry *d; substdio_puts(subfdout,"The qmail control files are stored in "); substdio_puts(subfdout,auto_qmail); substdio_puts(subfdout,"/control.\n"); if (chdir(auto_qmail) == -1) { substdio_puts(subfdout,"Oops! Unable to chdir to "); substdio_puts(subfdout,auto_qmail); substdio_puts(subfdout,".\n"); substdio_flush(subfdout); _exit(111); } if (chdir("control") == -1) { substdio_puts(subfdout,"Oops! Unable to chdir to control.\n"); substdio_flush(subfdout); _exit(111); } dir = opendir("."); if (!dir) { substdio_puts(subfdout,"Oops! Unable to open current directory.\n"); substdio_flush(subfdout); _exit(111); } meok = control_readline(&me,"me"); if (meok == -1) { substdio_puts(subfdout,"Oops! Trouble reading control/me."); substdio_flush(subfdout); _exit(111); } do_lst("badmailfrom","Any MAIL FROM is allowed.",""," not accepted in MAIL FROM."); do_str("bouncefrom",0,"MAILER-DAEMON","Bounce user name is "); do_str("bouncehost",1,"bouncehost","Bounce host name is "); do_int("concurrencylocal","10","Local concurrency is ",""); do_int("concurrencyremote","20","Remote concurrency is ",""); do_str("defaultdomain",1,"defaultdomain","Default domain name is "); do_str("defaulthost",1,"defaulthost","Default host name is "); do_str("doublebouncehost",1,"doublebouncehost","2B recipient host: "); do_str("doublebounceto",0,"postmaster","2B recipient user: "); do_str("envnoathost",1,"envnoathost","Presumed domain name is "); do_str("helohost",1,"helohost","SMTP client HELO host name is "); do_str("idhost",1,"idhost","Message-ID host name is "); do_str("localiphost",1,"localiphost","Local IP address becomes "); do_lst("locals","Messages for me are delivered locally.","Messages for "," are delivered locally."); do_str("me",0,"undefined! Uh-oh","My name is "); do_lst("percenthack","The percent hack is not allowed.","The percent hack is allowed for user%host@","."); do_str("plusdomain",1,"plusdomain","Plus domain name is "); do_int("queuelifetime","604800","Message lifetime in the queue is "," seconds"); do_lst("rcpthosts","SMTP clients may send messages to any recipient.","SMTP clients may send messages to recipients at ","."); do_lst("recipientmap","No redirections.","Redirection: ",""); do_str("smtpgreeting",1,"smtpgreeting","SMTP greeting: 220 "); do_lst("smtproutes","No artificial SMTP routes.","SMTP route: ",""); do_int("timeoutconnect","60","SMTP client connection timeout is "," seconds"); do_int("timeoutremote","1200","SMTP client data timeout is "," seconds"); do_int("timeoutsmtpd","1200","SMTP server data timeout is "," seconds"); do_lst("virtualdomains","No virtual domains.","Virtual domain: ",""); while (d = readdir(dir)) { if (str_equal(d->d_name,".")) continue; if (str_equal(d->d_name,"..")) continue; if (str_equal(d->d_name,"bouncefrom")) continue; if (str_equal(d->d_name,"bouncehost")) continue; if (str_equal(d->d_name,"badmailfrom")) continue; if (str_equal(d->d_name,"bouncefrom")) continue; if (str_equal(d->d_name,"bouncehost")) continue; if (str_equal(d->d_name,"concurrencylocal")) continue; if (str_equal(d->d_name,"concurrencyremote")) continue; if (str_equal(d->d_name,"defaultdomain")) continue; if (str_equal(d->d_name,"defaulthost")) continue; if (str_equal(d->d_name,"doublebouncehost")) continue; if (str_equal(d->d_name,"doublebounceto")) continue; if (str_equal(d->d_name,"envnoathost")) continue; if (str_equal(d->d_name,"helohost")) continue; if (str_equal(d->d_name,"idhost")) continue; if (str_equal(d->d_name,"localiphost")) continue; if (str_equal(d->d_name,"locals")) continue; if (str_equal(d->d_name,"me")) continue; if (str_equal(d->d_name,"percenthack")) continue; if (str_equal(d->d_name,"plusdomain")) continue; if (str_equal(d->d_name,"queuelifetime")) continue; if (str_equal(d->d_name,"rcpthosts")) continue; if (str_equal(d->d_name,"recipientmap")) continue; if (str_equal(d->d_name,"smtpgreeting")) continue; if (str_equal(d->d_name,"smtproutes")) continue; if (str_equal(d->d_name,"timeoutconnect")) continue; if (str_equal(d->d_name,"timeoutremote")) continue; if (str_equal(d->d_name,"timeoutsmtpd")) continue; if (str_equal(d->d_name,"virtualdomains")) continue; substdio_puts(subfdout,"\n"); substdio_puts(subfdout,d->d_name); substdio_puts(subfdout,": I have no idea what this file does.\n"); } substdio_flush(subfdout); _exit(0); }