rcpthosts.c
changeset 0 068428edee47
equal deleted inserted replaced
-1:000000000000 0:068428edee47
       
     1 #include "cdb.h"
       
     2 #include "byte.h"
       
     3 #include "open.h"
       
     4 #include "error.h"
       
     5 #include "control.h"
       
     6 #include "constmap.h"
       
     7 #include "stralloc.h"
       
     8 #include "rcpthosts.h"
       
     9 
       
    10 static int flagrh = 0;
       
    11 static stralloc rh = {0};
       
    12 static struct constmap maprh;
       
    13 static int fdmrh;
       
    14 
       
    15 int rcpthosts_init()
       
    16 {
       
    17   flagrh = control_readfile(&rh,"control/rcpthosts",0);
       
    18   if (flagrh != 1) return flagrh;
       
    19   if (!constmap_init(&maprh,rh.s,rh.len,0)) return flagrh = -1;
       
    20   fdmrh = open_read("control/morercpthosts.cdb");
       
    21   if (fdmrh == -1) if (errno != error_noent) return flagrh = -1;
       
    22   return 0;
       
    23 }
       
    24 
       
    25 static stralloc host = {0};
       
    26 
       
    27 int rcpthosts(buf,len)
       
    28 char *buf;
       
    29 int len;
       
    30 {
       
    31   int j;
       
    32 
       
    33   if (flagrh != 1) return 1;
       
    34 
       
    35   j = byte_rchr(buf,len,'@');
       
    36   if (j >= len) return 1; /* presumably envnoathost is acceptable */
       
    37 
       
    38   ++j; buf += j; len -= j;
       
    39 
       
    40   if (!stralloc_copyb(&host,buf,len)) return -1;
       
    41   buf = host.s;
       
    42   case_lowerb(buf,len);
       
    43 
       
    44   for (j = 0;j < len;++j)
       
    45     if (!j || (buf[j] == '.'))
       
    46       if (constmap(&maprh,buf + j,len - j)) return 1;
       
    47 
       
    48   if (fdmrh != -1) {
       
    49     uint32 dlen;
       
    50     int r;
       
    51 
       
    52     for (j = 0;j < len;++j)
       
    53       if (!j || (buf[j] == '.')) {
       
    54 	r = cdb_seek(fdmrh,buf + j,len - j,&dlen);
       
    55 	if (r) return r;
       
    56       }
       
    57   }
       
    58 
       
    59   return 0;
       
    60 }