djbdnscurve6 53
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
17/* this version retains DJB's original logic
18 * allowing 'private' name servers even in FORWARDONLY mode
19 * given by their domain name entry in servers/<domain name>
20 */
21
22static stralloc data;
23static stralloc ifname = {0};
24
25static int roots_find(char *q)
26{
27 int i;
28 int j;
29
30 i = 0;
31 while (i < data.len) {
32 j = dns_domain_length(data.s + i);
33 if (dns_domain_equal(data.s + i,q)) return i + j;
34 i += j;
35 i += QUERY_MAXIPLEN;
36 }
37 return -1;
38}
39
40static int roots_search(char *q)
41{
42 int r;
43
44 for (;;) {
45 r = roots_find(q);
46 if (r >= 0) return r;
47 if (!*q) return -1; /* user misconfiguration */
48 q += *q;
49 q += 1;
50 }
51}
52
53int roots(char servers[QUERY_MAXIPLEN],char *q)
54{
55 int r;
56 r = roots_find(q);
57 if (r == -1) return 0;
58 byte_copy(servers,QUERY_MAXIPLEN,data.s + r);
59 return 1;
60}
61
62int roots_same(char *q,char *q2)
63{
64 return roots_search(q) == roots_search(q2);
65}
66
67static int init2(DIR *dir)
68{
69 direntry *d;
70 const char *fqdn;
71 static char *q;
72 static stralloc text;
74 int serverslen;
75 int i;
76 int j;
77 int k;
78 uint32 scope_ids[QUERY_MAXNS];
79
80 byte_zero((char *)scope_ids,4 * QUERY_MAXNS);
81
82 for (;;) {
83 errno = 0;
84 d = readdir(dir);
85 if (!d) {
86 if (errno) return 0;
87 stralloc_free(&text); /* fehQlibs-23 required */
88 return 1;
89 }
90
91 if (d->d_name[0] != '.') {
92 fqdn = d->d_name;
93 if (str_equal(fqdn,"@")) fqdn = ".";
94 if (dns_domain_fromdot(&q,fqdn,str_len(fqdn)) <= 0) return 0;
95 if (openreadclose(d->d_name,&text,128) <= 0) return 0;
96 if (!stralloc_append(&text,"\n")) return 0;
97
98 serverslen = 0;
99 j = 0;
100 for (i = k = 0; i < text.len; ++i)
101 if (text.s[i] == '\n') {
102 if (serverslen <= QUERY_MAXIPLEN - 16)
103 if (ip6_ifscan(text.s + j,servers + serverslen,&ifname)) {
104 serverslen += 16; /* all constant length IPv6 addresses */
105 scope_ids[k] = socket_getifidx(ifname.s); k++;
106 }
107 j = i + 1;
108 }
109 byte_zero(servers + serverslen,QUERY_MAXIPLEN - serverslen);
110
111 if (!stralloc_catb(&data,q,dns_domain_length(q))) return 0;
112 if (!stralloc_catb(&data,servers,QUERY_MAXIPLEN)) return 0;
113 }
114 }
115}
116
117static int init1(void)
118{
119 DIR *dir;
120 int r;
121
122 if (chdir("servers") == -1) return 0;
123 dir = opendir(".");
124 if (!dir) return 0;
125 r = init2(dir);
126 closedir(dir);
127 return r;
128}
129
130int roots_init(void)
131{
132 int fddir;
133 int r;
134
135 if (!stralloc_copys(&data,"")) return 0;
136
137 fddir = open_read(".");
138 if (fddir == -1) return 0;
139 r = init1();
140 if (fchdir(fddir) == -1) r = 0;
141 close(fddir);
142 return r;
143}
char * dir
Definition: axfrdns-conf.c:15
char data[32767]
Definition: axfrdns.c:133
#define QUERY_MAXIPLEN
Definition: dns.h:55
#define QUERY_MAXNS
Definition: dns.h:54
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:15
stralloc ifname
Definition: dnscache.c:31
char servers[QUERY_MAXIPLEN]
Definition: dnsfilter.c:54
void d(const char *home, const char *subdir, int uid, int gid, int mode)
int roots_init(void)
Definition: roots.c:130
int roots_same(char *q, char *q2)
Definition: roots.c:62
int roots(char servers[QUERY_MAXIPLEN], char *q)
Definition: roots.c:53