--- rblsmtpd.c.org Wed Feb 27 21:28:56 2008 +++ rblsmtpd.c Wed Feb 27 21:29:16 2008 @@ -1,3 +1,4 @@ + #include "byte.h" #include "str.h" #include "scan.h" @@ -22,7 +23,7 @@ } void usage(void) { - strerr_die1x(100,"rblsmtpd: usage: rblsmtpd [ -b ] [ -R ] [ -t timeout ] [ -r base ] [ -a base ] smtpd [ arg ... ]"); + strerr_die1x(100,"rblsmtpd: usage: rblsmtpd [ -b ] [ -R ] [ -t timeout ] [ -r base ] [ -a base ] [-W] [-w delay] smtpd [ arg ... ]"); } char *ip_env; @@ -95,10 +96,36 @@ char strnum[FMT_ULONG]; static stralloc message; +static stralloc info; char inspace[64]; buffer in = BUFFER_INIT(read,0,inspace,sizeof inspace); char outspace[1]; buffer out = BUFFER_INIT(write,1,outspace,sizeof outspace); +void wait (unsigned long delay) +{ + unsigned long u; + char *x; + + x = env_get("GREETDELAY"); + if (x) { scan_ulong(x,&u); delay= u; } + + if (!stralloc_copys(&info,"greetdelay: ")) nomem(); + + buffer_puts(buffer_2,"rblsmtpd: "); + buffer_puts(buffer_2,ip_env); + buffer_puts(buffer_2," pid "); + buffer_put(buffer_2,strnum,fmt_ulong(strnum,getpid())); + buffer_puts(buffer_2,": "); + buffer_put(buffer_2,info.s,info.len); + buffer_put(buffer_2,strnum,fmt_ulong(strnum,delay)); + buffer_puts(buffer_2,"\n"); + buffer_flush(buffer_2); + + if (!stralloc_cats(&info,"\r\n")) nomem(); + + if (delay) sleep(delay); +} + void reject() { buffer_putflush(&out,message.s,message.len); } void accept() { buffer_putsflush(&out,"250 rblsmtpd.local\r\n"); } void greet() { buffer_putsflush(&out,"220 rblsmtpd.local\r\n"); } @@ -130,7 +157,7 @@ for (i = 0;i < message.len;++i) if ((message.s[i] < 32) || (message.s[i] > 126)) message.s[i] = '?'; - + buffer_puts(buffer_2,"rblsmtpd: "); buffer_puts(buffer_2,ip_env); buffer_puts(buffer_2," pid "); @@ -155,9 +182,9 @@ main(int argc,char **argv,char **envp) { - int flagwantdefaultrbl = 1; char *x; int opt; + unsigned long greetdelay = 0; ip_init(); @@ -175,22 +202,23 @@ } } - while ((opt = getopt(argc,argv,"bBcCt:r:a:")) != opteof) + while ((opt = getopt(argc,argv,"bBcCWt:r:a:w:")) != opteof) switch(opt) { case 'b': flagrblbounce = 1; break; case 'B': flagrblbounce = 0; break; case 'c': flagfailclosed = 1; break; case 'C': flagfailclosed = 0; break; case 't': scan_ulong(optarg,&timeout); break; - case 'r': rbl(optarg); flagwantdefaultrbl = 0; break; + case 'r': rbl(optarg); break; case 'a': antirbl(optarg); break; + case 'W': wait(greetdelay); break; + case 'w': scan_ulong(optarg,&greetdelay); wait(greetdelay); break; default: usage(); } argv += optind; if (!*argv) usage(); - if (flagwantdefaultrbl) rbl("rbl.maps.vix.com"); if (decision >= 2) rblsmtpd(); pathexec_run(*argv,argv,envp);