djbdnscurve6
45
djbdnscurve6
Loading...
Searching...
No Matches
djbdnscurve6-45
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
static
stralloc
data
;
18
static
stralloc
ifname
= {0};
19
20
static
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
35
static
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
48
int
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
57
int
roots_same
(
char
*q,
char
*q2)
58
{
59
return
roots_search(q) == roots_search(q2);
60
}
61
62
static
int
init2(DIR *
dir
)
63
{
64
direntry *
d
;
65
const
char
*fqdn;
66
static
char
*q;
67
static
stralloc text;
68
char
servers
[
QUERY_MAXIPLEN
];
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
114
static
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
127
int
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
}
dir
char * dir
Definition:
axfrdns-conf.c:15
data
char data[32767]
Definition:
axfrdns.c:130
dns.h
QUERY_MAXIPLEN
#define QUERY_MAXIPLEN
Definition:
dns.h:45
QUERY_MAXNS
#define QUERY_MAXNS
Definition:
dns.h:44
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:16
ifname
stralloc ifname
Definition:
dnscache.c:31
servers
char servers[QUERY_MAXIPLEN]
Definition:
dnsfilter.c:48
d
void d(const char *home, const char *subdir, int uid, int gid, int mode)
roots_init
int roots_init(void)
Definition:
roots.c:127
roots_same
int roots_same(char *q, char *q2)
Definition:
roots.c:57
roots
int roots(char servers[QUERY_MAXIPLEN], char *q)
Definition:
roots.c:48
roots.h
Generated on Fri Aug 30 2024 11:58:34 for djbdnscurve6 by
1.9.6