File ucspi-tcp-0.88.rbltimeout.patch of Package ucspi-tcp
Index: rblsmtpd.c
===================================================================
--- rblsmtpd.c.orig
+++ rblsmtpd.c
@@ -55,6 +55,7 @@ int flagmustnotbounce = 0;
int decision = 0; /* 0 undecided, 1 accept, 2 reject, 3 bounce */
static stralloc text; /* defined if decision is 2 or 3 */
+char *lastrbl;
static stralloc tmp;
@@ -153,10 +154,25 @@ struct commands smtpcommands[] = {
, { 0, reject, 0 }
} ;
+void put_log(char *s, int len) {
+ int i;
+ 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,": ");
+ for (i = 0;i < len;++i)
+ if ((s[i] < 32) || (s[i] > 126))
+ s[i] = '?';
+ buffer_put(buffer_2,s,len);
+ buffer_puts(buffer_2,"\n");
+ buffer_flush(buffer_2);
+}
+
+
void rblsmtpd(void)
{
int i;
-
if (flagmustnotbounce || (decision == 2)) {
if (!stralloc_copys(&message,"451 ")) nomem();
}
@@ -165,19 +181,8 @@ void rblsmtpd(void)
if (text.len > 500) text.len = 500;
if (!stralloc_cat(&message,&text)) nomem();
- 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 ");
- buffer_put(buffer_2,strnum,fmt_ulong(strnum,getpid()));
- buffer_puts(buffer_2,": ");
- buffer_put(buffer_2,message.s,message.len);
- buffer_puts(buffer_2,"\n");
- buffer_flush(buffer_2);
+ put_log(message.s,message.len);
if (!stralloc_cats(&message,"\r\n")) nomem();
if (!timeout)
@@ -191,11 +196,27 @@ void rblsmtpd(void)
_exit(0);
}
+int ARGC; char **ARGV; char **ENVP;
+
+void run() {
+ pathexec_run(*ARGV,ARGV,ENVP);
+ strerr_die4sys(111,FATAL,"unable to run ",*ARGV,": ");
+}
+
+void timeout_run() {
+ static stralloc log_text;
+ if (!stralloc_copys(&log_text,"timeout while waiting for : ")) nomem();
+ if (!stralloc_cats(&log_text,lastrbl)) nomem();
+ put_log(log_text.s,log_text.len);
+ run();
+}
+
main(int argc,char **argv,char **envp)
{
int flagwantdefaultrbl = 1;
char *x;
int opt;
+ unsigned long Timeout=0;
ip_init();
@@ -212,6 +233,25 @@ main(int argc,char **argv,char **envp)
decision = 2;
}
}
+ if (!decision) {
+ x = env_get("RBLTIMEOUT");
+ if (x) scan_ulong(x,&Timeout);
+ }
+ ARGC=argc; ARGV=argv; ENVP=envp;
+
+
+ while ((opt = getopt(ARGC,ARGV,"bBcCt:r:a:")) != opteof)
+ switch(opt) {
+ case 'b': case 'B': case 'c': case 'C':
+ case 't': case 'r': case 'a': break;
+ default: usage();
+ }
+
+ ARGV += optind;
+ if (!*ARGV) usage();
+
+ if (Timeout) { sig_catch(sig_alarm,timeout_run); alarm(Timeout); }
+ optind = 1;
while ((opt = getopt(argc,argv,"bBcCt:r:a:")) != opteof)
switch(opt) {
@@ -220,17 +260,14 @@ main(int argc,char **argv,char **envp)
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 'a': antirbl(optarg); break;
+ case 'r': lastrbl=optarg;rbl(optarg); flagwantdefaultrbl = 0; break;
+ case 'a': lastrbl=optarg;antirbl(optarg); break;
default: usage();
}
- argv += optind;
- if (!*argv) usage();
+ if (Timeout) { alarm(0); sig_uncatch(sig_alarm); }
if (flagwantdefaultrbl) rbl("rbl.maps.vix.com");
if (decision >= 2) rblsmtpd();
-
- pathexec_run(*argv,argv,envp);
- strerr_die4sys(111,FATAL,"unable to run ",*argv,": ");
+ run();
}