This patch enables tarpitting for rblsmtpd from the ucspi-tcp-0.88 package. Use -t to set the maximum tarpitting time. It writes a message like "host 1.2.3.4 tarpitted for 3600 seconds" to stderr. http://www.wolfermann.org/djbware.html --- rblsmtpd.c.orig 10 Feb 2003 09:00:43 -0000 +++ rblsmtpd.c 4 Jun 2004 15:13:30 -0000 @@ -99,11 +99,46 @@ 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 reject() { buffer_putflush(&out,message.s,message.len); } +static int startpit; +void logpit() +{ + buffer_puts(buffer_2,"rblsmtpd: "); + buffer_puts(buffer_2,"host "); + buffer_puts(buffer_2,ip_env); + buffer_puts(buffer_2," tarpitted for "); + buffer_put(buffer_2,strnum,fmt_ulong(strnum,(int)time() - startpit)); + buffer_puts(buffer_2," seconds"); + buffer_puts(buffer_2,"\n"); + buffer_flush(buffer_2); +} + +void reject() +{ + startpit = (int)time(); + message.s[3] = '-'; + buffer_putflush(&out,message.s,message.len); + message.s[4] = '\r'; + message.s[5] = '\n'; + message.len = 6; + while(1) { + buffer_putflush(&out,message.s,message.len); + sleep(10); + } +} + void accept() { buffer_putsflush(&out,"250 rblsmtpd.local\r\n"); } void greet() { buffer_putsflush(&out,"220 rblsmtpd.local\r\n"); } -void quit() { buffer_putsflush(&out,"221 rblsmtpd.local\r\n"); _exit(0); } -void drop() { _exit(0); } +void quit() +{ + buffer_putsflush(&out,"221 rblsmtpd.local\r\n"); + logpit(); + _exit(0); +} +void drop() +{ + logpit(); + _exit(0); +} struct commands smtpcommands[] = { { "quit", quit, 0 } @@ -146,6 +181,7 @@ reject(); else { sig_catch(sig_alarm,drop); + sig_catch(sig_pipe,drop); alarm(timeout); greet(); commands(&in,smtpcommands);