djbdnscurve6  38
djbdnscurve6
roots.c
Go to the documentation of this file.
1 #include <unistd.h>
2 #include "open.h"
3 #include "error.h"
4 #include "str.h"
5 #include "byte.h"
6 #include "error.h"
7 #include "direntry.h"
8 #include "ip.h"
9 #include "dns.h"
10 #include "readclose.h"
11 #include "roots.h"
12 #include "socket_if.h"
13 #include "dns.h"
14 
15 static stralloc data;
16 static stralloc ifname = {0};
17 
18 static int roots_find(char *q)
19 {
20  int i;
21  int j;
22 
23  i = 0;
24  while (i < data.len) {
25  j = dns_domain_length(data.s + i);
26  if (dns_domain_equal(data.s + i,q)) return i + j;
27  i += j;
28  i += 512;
29  }
30  return -1;
31 }
32 
33 static int roots_search(char *q)
34 {
35  int r;
36 
37  for (;;) {
38  r = roots_find(q);
39  if (r >= 0) return r;
40  if (!*q) return -1; /* user misconfiguration */
41  q += *q;
42  q += 1;
43  }
44 }
45 
46 int roots(char servers[QUERY_MAXIPLEN],char *q)
47 {
48  int r;
49  r = roots_find(q);
50  if (r == -1) return 0;
51  byte_copy(servers,QUERY_MAXIPLEN,data.s + r);
52  return 1;
53 }
54 
55 int roots_same(char *q,char *q2)
56 {
57  return roots_search(q) == roots_search(q2);
58 }
59 
60 static int init2(DIR *dir)
61 {
62  direntry *d;
63  const char *fqdn;
64  static char *q;
65  static stralloc text;
66  char servers[QUERY_MAXIPLEN];
67  int serverslen;
68  int i;
69  int j;
70  int k;
71  uint32 scope_ids[QUERY_MAXNS];
72 
73  byte_zero(scope_ids,4*QUERY_MAXNS);
74 
75  for (;;) {
76  errno = 0;
77  d = readdir(dir);
78  if (!d) {
79  if (errno) return 0;
80  return 1;
81  }
82 
83  if (d->d_name[0] != '.') {
84  if (openreadclose(d->d_name,&text,QUERY_MAXNS) != 1) return 0;
85  if (!stralloc_append(&text,"\n")) return 0;
86 
87  fqdn = d->d_name;
88  if (str_equal(fqdn,"@")) fqdn = ".";
89  if (dns_domain_fromdot(&q,fqdn,str_len(fqdn)) <= 0) return 0;
90 
91  serverslen = 0;
92  j = 0;
93  for (i = k = 0; i < text.len; ++i)
94  if (text.s[i] == '\n') {
95  if (serverslen <= 60)
96  if (ip6_ifscan(text.s + j,servers + serverslen,&ifname)) {
97  serverslen += 16; /* all constant IPv6 addresses */
98  scope_ids[k] = socket_getifidx(ifname.s); k++;
99  }
100  j = i + 1;
101  }
102  byte_zero(servers + serverslen,QUERY_MAXIPLEN - serverslen);
103 
104  if (!stralloc_catb(&data,q,dns_domain_length(q))) return 0;
105  if (!stralloc_catb(&data,servers,QUERY_MAXIPLEN)) return 0;
106  }
107  }
108 }
109 
110 static int init1(void)
111 {
112  DIR *dir;
113  int r;
114 
115  if (chdir("servers") == -1) return 0;
116  dir = opendir(".");
117  if (!dir) return 0;
118  r = init2(dir);
119  closedir(dir);
120  return r;
121 }
122 
123 int roots_init(void)
124 {
125  int fddir;
126  int r;
127 
128  if (!stralloc_copys(&data,"")) return 0;
129 
130  fddir = open_read(".");
131  if (fddir == -1) return 0;
132  r = init1();
133  if (fchdir(fddir) == -1) r = 0;
134  close(fddir);
135  return r;
136 }
char * dir
Definition: axfrdns-conf.c:15
char data[32767]
Definition: axfrdns.c:131
#define QUERY_MAXIPLEN
Definition: dns.h:30
int dns_domain_equal(const char *, const char *)
Definition: dns_domain.c:39
int dns_domain_fromdot(char **, const char *, unsigned int)
Definition: dns_dfd.c:6
unsigned int dns_domain_length(const char *)
Definition: dns_domain.c:6
#define QUERY_MAXNS
Definition: dns.h:29
uint32 scope_ids[QUERY_MAXNS]
Definition: dns_transmit.c:16
stralloc ifname
Definition: dnscache.c:30
char servers[QUERY_MAXIPLEN]
Definition: dnsfilter.c:48
void d(const char *home, const char *subdir, int uid, int gid, int mode)
int roots_init(void)
Definition: roots.c:123
int roots_same(char *q, char *q2)
Definition: roots.c:55
int roots(char servers[QUERY_MAXIPLEN], char *q)
Definition: roots.c:46