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