djbdnscurve6
53
djbdnscurve6
Loading...
Searching...
No Matches
VERS_4
djbdnscurve6-53
src
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
22
static
stralloc
data
;
23
static
stralloc
ifname
= {0};
24
25
static
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
40
static
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
53
int
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
62
int
roots_same
(
char
*q,
char
*q2)
63
{
64
return
roots_search(q) == roots_search(q2);
65
}
66
67
static
int
init2(DIR *
dir
)
68
{
69
direntry *
d
;
70
const
char
*fqdn;
71
static
char
*q;
72
static
stralloc text;
73
char
servers
[
QUERY_MAXIPLEN
];
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
117
static
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
130
int
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
}
dir
char * dir
Definition:
axfrdns-conf.c:15
data
char data[32767]
Definition:
axfrdns.c:133
dns.h
QUERY_MAXIPLEN
#define QUERY_MAXIPLEN
Definition:
dns.h:55
QUERY_MAXNS
#define QUERY_MAXNS
Definition:
dns.h:54
dns_domain_fromdot
int dns_domain_fromdot(char **out, const char *buf, unsigned int n)
Definition:
dns_dfd.c:6
dns_domain_equal
int dns_domain_equal(const char *dn1, const char *dn2)
Definition:
dns_domain.c:39
dns_domain_length
unsigned int dns_domain_length(const char *dn)
Definition:
dns_domain.c:6
scope_ids
uint32 scope_ids[QUERY_MAXNS]
Definition:
dns_transmit.c:15
ifname
stralloc ifname
Definition:
dnscache.c:31
servers
char servers[QUERY_MAXIPLEN]
Definition:
dnsfilter.c:54
d
void d(const char *home, const char *subdir, int uid, int gid, int mode)
roots_init
int roots_init(void)
Definition:
roots.c:130
roots_same
int roots_same(char *q, char *q2)
Definition:
roots.c:62
roots
int roots(char servers[QUERY_MAXIPLEN], char *q)
Definition:
roots.c:53
roots.h
Generated on Wed May 27 2026 12:24:18 for djbdnscurve6 by
1.9.6