diff -u qmail-1.03.orig/dns.c qmail-1.03/dns.c --- qmail-1.03.orig/dns.c Mon Jun 15 05:53:16 1998 +++ qmail-1.03/dns.c Wed Jul 22 20:50:21 1998 @@ -104,6 +104,43 @@ return 0; } +static int findstring(wanttype) +int wanttype; +{ + unsigned short rrtype; + unsigned short rrdlen; + int i; + + if (numanswers <= 0) return 2; + --numanswers; + if (responsepos == responseend) return DNS_SOFT; + + i = dn_expand(response.buf,responseend,responsepos,name,MAXDNAME); + if (i < 0) return DNS_SOFT; + responsepos += i; + + i = responseend - responsepos; + if (i < 4 + 3 * 2) return DNS_SOFT; + + rrtype = getshort(responsepos); + rrdlen = getshort(responsepos + 8); + responsepos += 10; + + if (rrtype == wanttype) + { + i = *responsepos; + if (i > MAXDNAME - 1) return DNS_SOFT; + if (responsepos + i > responseend) return DNS_SOFT; + byte_copy(name, i, responsepos+1); + name[i] = '\0'; + responsepos += rrdlen; + return 1; + } + + responsepos += rrdlen; + return 0; +} + static int findip(wanttype) int wanttype; { @@ -219,9 +256,10 @@ #define FMT_IAA 40 -static int iaafmt(s,ip) +static int iaafmt(s,ip,dom) char *s; struct ip_address *ip; +const char *dom; { unsigned int i; unsigned int len; @@ -233,7 +271,7 @@ i = fmt_ulong(s,(unsigned long) ip->d[1]); len += i; if (s) s += i; i = fmt_str(s,"."); len += i; if (s) s += i; i = fmt_ulong(s,(unsigned long) ip->d[0]); len += i; if (s) s += i; - i = fmt_str(s,".in-addr.arpa."); len += i; if (s) s += i; + i = fmt_str(s,dom); len += i; if (s) s += i; return len; } @@ -243,8 +281,8 @@ { int r; - if (!stralloc_ready(sa,iaafmt((char *) 0,ip))) return DNS_MEM; - sa->len = iaafmt(sa->s,ip); + if (!stralloc_ready(sa,iaafmt((char *) 0,ip,".in-addr.arpa."))) return DNS_MEM; + sa->len = iaafmt(sa->s,ip,".in-addr.arpa."); switch(resolve(sa,T_PTR)) { case DNS_MEM: return DNS_MEM; @@ -252,6 +290,32 @@ case DNS_HARD: return DNS_HARD; } while ((r = findname(T_PTR)) != 2) + { + if (r == DNS_SOFT) return DNS_SOFT; + if (r == 1) + { + if (!stralloc_copys(sa,name)) return DNS_MEM; + return 0; + } + } + return DNS_HARD; +} + +int dns_maps(sa,ip) +stralloc *sa; +struct ip_address *ip; +{ + int r; + + if (!stralloc_ready(sa,iaafmt((char *) 0,ip,".blackholes.mail-abuse.org."))) return DNS_MEM; + sa->len = iaafmt(sa->s,ip,".blackholes.mail-abuse.org."); + switch(resolve(sa,T_TXT)) + { + case DNS_MEM: return DNS_MEM; + case DNS_SOFT: return DNS_SOFT; + case DNS_HARD: return DNS_HARD; + } + while ((r = findstring(T_TXT)) != 2) { if (r == DNS_SOFT) return DNS_SOFT; if (r == 1) diff -u qmail-1.03.orig/qmail-smtpd.c qmail-1.03/qmail-smtpd.c --- qmail-1.03.orig/qmail-smtpd.c Mon Jun 15 05:53:16 1998 +++ qmail-1.03/qmail-smtpd.c Wed Jul 22 20:50:21 1998 @@ -51,6 +51,7 @@ void err_bmf() { out("553 sorry, your envelope sender is in my badmailfrom list (#5.7.1)\r\n"); } void err_nogateway() { out("553 sorry, that domain isn't in my list of allowed rcpthosts (#5.7.1)\r\n"); } +void err_maps(char *m) { out(m);out("\r\n"); } void err_unimpl() { out("502 unimplemented (#5.5.1)\r\n"); } void err_syntax() { out("555 syntax error (#5.5.4)\r\n"); } void err_wantmail() { out("503 MAIL first (#5.5.1)\r\n"); } @@ -81,6 +82,7 @@ char *remoteinfo; char *local; char *relayclient; +char *bouncemail; stralloc helohost = {0}; char *fakehelo; /* pointer into helohost, or 0 */ @@ -131,6 +133,7 @@ if (!remotehost) remotehost = "unknown"; remoteinfo = env_get("TCPREMOTEINFO"); relayclient = env_get("RELAYCLIENT"); + bouncemail = env_get("BOUNCEMAIL"); dohelo(remotehost); } @@ -251,6 +254,7 @@ if (!seenmail) { err_wantmail(); return; } if (!addrparse(arg)) { err_syntax(); return; } if (flagbarf) { err_bmf(); return; } + if (bouncemail) { err_maps(bouncemail); return; } if (relayclient) { --addr.len; if (!stralloc_cats(&addr,relayclient)) die_nomem(); diff -u qmail-1.03.orig/tcp-env.c qmail-1.03/tcp-env.c --- qmail-1.03.orig/tcp-env.c Mon Jun 15 05:53:16 1998 +++ qmail-1.03/tcp-env.c Wed Jul 22 20:50:21 1998 @@ -28,6 +28,9 @@ struct ip_address ipremote; stralloc remotename = {0}; +stralloc bouncemail = {0}; +stralloc bouncetmp = {0}; + char temp[IPFMT + FMT_ULONG]; void main(argc,argv) @@ -58,8 +61,6 @@ if (argc < 1) die(); if (!env_init()) die(); - proto = env_get("PROTO"); - if (!proto || str_diff(proto,"TCP")) { if (!env_put("PROTO=TCP")) die(); @@ -122,6 +123,19 @@ if (!env_put2("TCPREMOTEINFO",rinfo)) die(); } } + + switch(dns_maps(&bouncemail,&ipremote)) + { + case DNS_MEM: die(); + case 0: + if (!stralloc_copys(&bouncetmp,"553 ")) die(); + if (!stralloc_cat(&bouncetmp, &bouncemail)) die(); + if (!stralloc_0(&bouncetmp)) die(); + if (!env_put2("BOUNCEMAIL",bouncetmp.s)) die(); + break; + default: + if (!env_unset("BOUNCEMAIL")) die(); + } sig_pipedefault(); execvp(*argv,argv);