chiark / gitweb /
Merge branches 'idx/verh' and 'idx/qmqpc'
[qmail] / rcpthosts.c
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 }