diff qmail/qmail-1.03/Makefile qmail-validtcptto/qmail-1.03/Makefile
1563c1563
< datetime.a getln.a open.a sig.a case.a env.a stralloc.a alloc.a substdio.a \
---
> datetime.a getln.a open.a sig.a case.a env.a stralloc.a alloc.a strerr.a substdio.a \
1569c1569
< 	alloc.a substdio.a error.a str.a fs.a auto_qmail.o base64.o `cat \
---
> 	alloc.a strerr.a substdio.a error.a str.a fs.a auto_qmail.o base64.o `cat \
1581c1581
< exit.h rcpthosts.h timeoutread.h timeoutwrite.h commands.h spf.h
---
> exit.h rcpthosts.h timeoutread.h timeoutwrite.h commands.h spf.h cdb.h uint32.h
Only in qmail-validtcptto/qmail-1.03/: Makefile.orig
diff qmail/qmail-1.03/qmail-smtpd.c qmail-validtcptto/qmail-1.03/qmail-smtpd.c
27a28,29
> #include "strerr.h"
> #include "cdb.h"
185a188,192
> int vrtfd = -1;
> int vrtcount = 0;
> int vrtlimit = 10;
> int vrtlog_do = 0;
> 
212a220,222
>     
>      	vrtfd = open_read("control/validrcptto.cdb");
>      	if (-1 == vrtfd) if (errno != error_noent) die_control();
256a267,268
> void err_vrt() { out("553 sorry, this recipient is not in my validrcptto list (#5.7.1)\r\n"); }
> void die_vrt() { out("421 too many invalid addresses, goodbye (#4.3.0)\r\n"); flush(); _exit(1); }
349a362,426
> void vrtlog(a,b)
> const char *a;
> const char *b;
> {
>   if (vrtlog_do) strerr_warn2(a,b,0);
> }
> 
> int vrtcheck()
> {
>   static char *rcptto = "qmail-smtpd: validrcptto RCPT TO: ";
>   static char *found = "qmail-smtpd: validrcptto found: ";
>   int j,k,r;
>   uint32 dlen;
>   stralloc laddr = {0};
> 
>   stralloc user = {0};
>   stralloc adom = {0};
>   stralloc utry = {0};
> 
>   if (-1 == vrtfd) return 1;
> 
>   /* lowercase whatever we were sent */
>   if (!stralloc_copy(&laddr,&addr)) die_nomem() ;
>   case_lowerb(laddr.s,laddr.len);
> 
>   vrtlog(rcptto,laddr.s,0);
> 
>   /* exact match? */
>   r = cdb_seek(vrtfd,laddr.s,laddr.len-1,&dlen) ;
>   if (r>0) { vrtlog(found,laddr.s,0); return r; }
> 
>   j = byte_rchr(laddr.s,laddr.len,'@');
>   if (j < laddr.len)
>   {
>     /* start "-default" search loop */
>     stralloc_copyb(&user,laddr.s,j) ;
>     stralloc_copyb(&adom,laddr.s+j,laddr.len-j-1);
> 
>     while(1)
>     {
>       k = byte_rchr(user.s,user.len,'-');
>       if (k >= user.len) break ;
> 
>       user.len = k+1;
>       stralloc_cats(&user,"default");
> 
>       stralloc_copy(&utry,&user);
>       stralloc_cat (&utry,&adom);
>       stralloc_0(&utry);
> 
>       r = cdb_seek(vrtfd,utry.s,utry.len-1,&dlen);
>       if (r>0) { vrtlog(found,utry.s,0); return r; }
> 
>       user.len = k ;
>     }
> 
>     /* try "@domain" */
> 
>     r = cdb_seek(vrtfd,laddr.s+j,laddr.len-j-1,&dlen) ;
>     if (r>0) { vrtlog(found,laddr.s+j,0); return r; }
>   }
> 
>   return 0;
> }
> 
544a622,633
>    if (!env_get("RELAYCLIENT") && !vrtcheck()) {
>      strerr_warn4("qmail-smtpd: not in validrcptto: ",addr.s,
>        " at ",remoteip,0);
>      if(vrtlimit && (++vrtcount >= vrtlimit)) {
>        strerr_warn2("qmail-smtpd: excessive validrcptto violations,"
>          " hanging up on ",remoteip,0);
>        die_vrt();
>      }
>      err_vrt();
>      return;
>    }
> 
1010,1011c1099,1102
<   char *x ;
<   unsigned long u ;
---
> //  char *x ;
> //  unsigned long u ;
>    char *x ;
>    uint32 u;
1026,1027c1117,1125
<   sig_pipeignore();
<   if (chdir(auto_qmail) == -1) die_control();
---
> 
>     sig_pipeignore();
>     if (chdir(auto_qmail) == -1) die_control();
>  
>    x = env_get("VALIDRCPTTO_LIMIT");
>    if(x) { scan_ulong(x,&u); vrtlimit = (int) u; }
>    x = env_get("VALIDRCPTTO_LOG");
>    if(x) { scan_ulong(x,&u); vrtlog_do = (int) u; }
>  


