22 logmsg(
WHO,111,FATAL,
"out of memory");
26 logmsg(
WHO,100,USAGE,
"rblsmtpd \
29[ -i ] [ -t timeout ] \
30[ -r base ] [ -a base ] \
31[-W] [-w delay] smtpd [ arg ... ]");
36static stralloc ip_reverse;
52 ip_env = env_get(
"TCP6REMOTEIP");
54 if (byte_equal(
ip_env,7,V4MAPPREFIX))
59 ip_env = env_get(
"TCPREMOTEIP");
61 else if (byte_equal(
ip_env,7,V4MAPPREFIX))
65 if (!stralloc_copys(&ip_reverse,
""))
nomem();
70 for (j = 15; j >= 0; j--) {
72 if (!stralloc_catb(&ip_reverse,&hexval,1))
nomem();
73 if (!stralloc_cats(&ip_reverse,
"."))
nomem();
75 hexval = tohex(
remoteip[j] >> 4 & 15);
76 if (!stralloc_catb(&ip_reverse,&hexval,1))
nomem();
77 if (!stralloc_cats(&ip_reverse,
"."))
nomem();
84 for (j = i; j > 0; --j)
85 if (
ip_env[j - 1] ==
'.')
break;
86 if (!stralloc_catb(&ip_reverse,
ip_env + j,i - j))
nomem();
87 if (!stralloc_cats(&ip_reverse,
"."))
nomem();
108 if (!stralloc_copy(&tmp,&ip_reverse))
nomem();
109 if (!stralloc_cats(&tmp,base))
nomem();
110 if (dns_txt(&text,&tmp) < 0) {
113 if (!stralloc_copys(&text,
"temporary RBL lookup error"))
nomem();
131 if (!stralloc_copy(&tmp,&ip_reverse))
nomem();
132 if (!stralloc_cats(&tmp,base))
nomem();
135 flagip = dns_ip6(&text,&tmp);
137 flagip = dns_ip4(&text,&tmp);
149static char strnum[FMT_ULONG];
150static stralloc message = {0};;
151static stralloc info = {0};
164 x = env_get(
"GREETDELAY");
172 if (!stralloc_copys(&info,
"greetdelay: "))
nomem();
174 buffer_puts(buffer_2,
"rblsmtpd: ");
175 buffer_puts(buffer_2,
ip_env);
176 buffer_puts(buffer_2,
" pid ");
177 buffer_put(buffer_2,strnum,fmt_ulong(strnum,getpid()));
178 buffer_puts(buffer_2,
": ");
179 buffer_put(buffer_2,info.s,info.len);
180 buffer_put(buffer_2,strnum,fmt_ulong(strnum,delay));
181 buffer_puts(buffer_2,
"\n");
182 buffer_flush(buffer_2);
184 if (!stralloc_cats(&info,
"\r\n"))
nomem();
194 if (!stralloc_copys(&message,
"[RBL info] "))
nomem();
196 if (text.len > 200) text.len = 200;
197 if (!stralloc_cat(&message,&text))
nomem();
199 for (i = 0; i < message.len; ++i)
200 if ((message.s[i] < 32) || (message.s[i] > 126))
203 buffer_puts(buffer_2,
"rblsmtpd: ");
204 buffer_puts(buffer_2,
ip_env);
205 buffer_puts(buffer_2,
" pid ");
206 buffer_put(buffer_2,strnum,fmt_ulong(strnum,getpid()));
207 buffer_puts(buffer_2,
": ");
208 buffer_put(buffer_2,message.s,message.len);
209 buffer_puts(buffer_2,
"\n");
210 buffer_flush(buffer_2);
212 if (!stralloc_copy(&info,&message))
nomem();
213 if (!stralloc_0(&info))
nomem();
214 if (!pathexec_env(
"RBLSMTPD",info.s))
nomem();
217void reject() { buffer_putflush(&
out,message.s,message.len); }
218void accept() { buffer_putsflush(&
out,
"250 rblsmtpd.local\r\n"); }
219void greet() { buffer_putsflush(&
out,
"220 rblsmtpd.local\r\n"); }
220void quit() { buffer_putsflush(&
out,
"221 rblsmtpd.local\r\n"); _exit(0); }
238 if (!stralloc_copys(&message,
"451 "))
nomem();
240 if (!stralloc_copys(&message,
"553 "))
nomem();
242 if (text.len > 200) text.len = 200;
243 if (!stralloc_cat(&message,&text))
nomem();
244 for (i = 0; i < message.len; ++i)
245 if ((message.s[i] < 32) || (message.s[i] > 126))
248 buffer_puts(buffer_2,
"rblsmtpd: ");
249 buffer_puts(buffer_2,
ip_env);
250 buffer_puts(buffer_2,
" pid ");
251 buffer_put(buffer_2,strnum,fmt_ulong(strnum,getpid()));
252 buffer_puts(buffer_2,
": ");
253 buffer_put(buffer_2,message.s,message.len);
254 buffer_puts(buffer_2,
"\n");
255 buffer_flush(buffer_2);
257 if (!stralloc_cats(&message,
"\r\n"))
nomem();
262 sig_catch(sig_alarm,
drop);
270int main(
int argc,
char *
const *argv,
char *
const *envp)
274 unsigned long greetdelay = 0;
278 x = env_get(
"RBLSMTPD");
282 else if (*x ==
'-') {
283 if (!stralloc_copys(&text,x + 1))
nomem();
287 if (!stralloc_copys(&text,x))
nomem();
292 while ((opt = getoptb(argc,(
char **)argv,
"bBcCit:r:a:w:W")) != opteof)
299 case 't': scan_ulong(optarg,&
timeout);
break;
300 case 'r':
rbl(optarg);
break;
301 case 'a':
antirbl(optarg);
break;
303 case 'w':
if (!
decision) { scan_ulong(optarg,&greetdelay);
waitdelay(greetdelay); }
break;
316 logmsg(
WHO,111,FATAL,B(
"unable to run: ",*argv));
void waitdelay(unsigned long delay)
struct commands smtpcommands[]