1 /* $NetBSD: ns_2.c,v 1.7 2022/09/23 12:15:31 christos Exp $ */
2
3 /*
4 * Copyright (C) Internet Systems Consortium, Inc. ("ISC")
5 *
6 * SPDX-License-Identifier: MPL-2.0
7 *
8 * This Source Code Form is subject to the terms of the Mozilla Public
9 * License, v. 2.0. If a copy of the MPL was not distributed with this
10 * file, you can obtain one at https://mozilla.org/MPL/2.0/.
11 *
12 * See the COPYRIGHT file distributed with this work for additional
13 * information regarding copyright ownership.
14 */
15
16 #ifndef RDATA_GENERIC_NS_2_C
17 #define RDATA_GENERIC_NS_2_C
18
19 #define RRTYPE_NS_ATTRIBUTES (DNS_RDATATYPEATTR_ZONECUTAUTH)
20
21 static isc_result_t
fromtext_ns(ARGS_FROMTEXT)22 fromtext_ns(ARGS_FROMTEXT) {
23 isc_token_t token;
24 dns_name_t name;
25 isc_buffer_t buffer;
26 bool ok;
27
28 REQUIRE(type == dns_rdatatype_ns);
29
30 UNUSED(type);
31 UNUSED(rdclass);
32 UNUSED(callbacks);
33
34 RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_string,
35 false));
36
37 dns_name_init(&name, NULL);
38 buffer_fromregion(&buffer, &token.value.as_region);
39 if (origin == NULL) {
40 origin = dns_rootname;
41 }
42 RETTOK(dns_name_fromtext(&name, &buffer, origin, options, target));
43 ok = true;
44 if ((options & DNS_RDATA_CHECKNAMES) != 0) {
45 ok = dns_name_ishostname(&name, false);
46 }
47 if (!ok && (options & DNS_RDATA_CHECKNAMESFAIL) != 0) {
48 RETTOK(DNS_R_BADNAME);
49 }
50 if (!ok && callbacks != NULL) {
51 warn_badname(&name, lexer, callbacks);
52 }
53 return (ISC_R_SUCCESS);
54 }
55
56 static isc_result_t
totext_ns(ARGS_TOTEXT)57 totext_ns(ARGS_TOTEXT) {
58 isc_region_t region;
59 dns_name_t name;
60 dns_name_t prefix;
61 bool sub;
62
63 REQUIRE(rdata->type == dns_rdatatype_ns);
64 REQUIRE(rdata->length != 0);
65
66 dns_name_init(&name, NULL);
67 dns_name_init(&prefix, NULL);
68
69 dns_rdata_toregion(rdata, ®ion);
70 dns_name_fromregion(&name, ®ion);
71
72 sub = name_prefix(&name, tctx->origin, &prefix);
73
74 return (dns_name_totext(&prefix, sub, target));
75 }
76
77 static isc_result_t
fromwire_ns(ARGS_FROMWIRE)78 fromwire_ns(ARGS_FROMWIRE) {
79 dns_name_t name;
80
81 REQUIRE(type == dns_rdatatype_ns);
82
83 UNUSED(type);
84 UNUSED(rdclass);
85
86 dns_decompress_setmethods(dctx, DNS_COMPRESS_GLOBAL14);
87
88 dns_name_init(&name, NULL);
89 return (dns_name_fromwire(&name, source, dctx, options, target));
90 }
91
92 static isc_result_t
towire_ns(ARGS_TOWIRE)93 towire_ns(ARGS_TOWIRE) {
94 dns_name_t name;
95 dns_offsets_t offsets;
96 isc_region_t region;
97
98 REQUIRE(rdata->type == dns_rdatatype_ns);
99 REQUIRE(rdata->length != 0);
100
101 dns_compress_setmethods(cctx, DNS_COMPRESS_GLOBAL14);
102
103 dns_name_init(&name, offsets);
104 dns_rdata_toregion(rdata, ®ion);
105 dns_name_fromregion(&name, ®ion);
106
107 return (dns_name_towire(&name, cctx, target));
108 }
109
110 static int
compare_ns(ARGS_COMPARE)111 compare_ns(ARGS_COMPARE) {
112 dns_name_t name1;
113 dns_name_t name2;
114 isc_region_t region1;
115 isc_region_t region2;
116
117 REQUIRE(rdata1->type == rdata2->type);
118 REQUIRE(rdata1->rdclass == rdata2->rdclass);
119 REQUIRE(rdata1->type == dns_rdatatype_ns);
120 REQUIRE(rdata1->length != 0);
121 REQUIRE(rdata2->length != 0);
122
123 dns_name_init(&name1, NULL);
124 dns_name_init(&name2, NULL);
125
126 dns_rdata_toregion(rdata1, ®ion1);
127 dns_rdata_toregion(rdata2, ®ion2);
128
129 dns_name_fromregion(&name1, ®ion1);
130 dns_name_fromregion(&name2, ®ion2);
131
132 return (dns_name_rdatacompare(&name1, &name2));
133 }
134
135 static isc_result_t
fromstruct_ns(ARGS_FROMSTRUCT)136 fromstruct_ns(ARGS_FROMSTRUCT) {
137 dns_rdata_ns_t *ns = source;
138 isc_region_t region;
139
140 REQUIRE(type == dns_rdatatype_ns);
141 REQUIRE(ns != NULL);
142 REQUIRE(ns->common.rdtype == type);
143 REQUIRE(ns->common.rdclass == rdclass);
144
145 UNUSED(type);
146 UNUSED(rdclass);
147
148 dns_name_toregion(&ns->name, ®ion);
149 return (isc_buffer_copyregion(target, ®ion));
150 }
151
152 static isc_result_t
tostruct_ns(ARGS_TOSTRUCT)153 tostruct_ns(ARGS_TOSTRUCT) {
154 isc_region_t region;
155 dns_rdata_ns_t *ns = target;
156 dns_name_t name;
157
158 REQUIRE(rdata->type == dns_rdatatype_ns);
159 REQUIRE(ns != NULL);
160 REQUIRE(rdata->length != 0);
161
162 ns->common.rdclass = rdata->rdclass;
163 ns->common.rdtype = rdata->type;
164 ISC_LINK_INIT(&ns->common, link);
165
166 dns_name_init(&name, NULL);
167 dns_rdata_toregion(rdata, ®ion);
168 dns_name_fromregion(&name, ®ion);
169 dns_name_init(&ns->name, NULL);
170 RETERR(name_duporclone(&name, mctx, &ns->name));
171 ns->mctx = mctx;
172 return (ISC_R_SUCCESS);
173 }
174
175 static void
freestruct_ns(ARGS_FREESTRUCT)176 freestruct_ns(ARGS_FREESTRUCT) {
177 dns_rdata_ns_t *ns = source;
178
179 REQUIRE(ns != NULL);
180
181 if (ns->mctx == NULL) {
182 return;
183 }
184
185 dns_name_free(&ns->name, ns->mctx);
186 ns->mctx = NULL;
187 }
188
189 static isc_result_t
additionaldata_ns(ARGS_ADDLDATA)190 additionaldata_ns(ARGS_ADDLDATA) {
191 dns_name_t name;
192 dns_offsets_t offsets;
193 isc_region_t region;
194
195 REQUIRE(rdata->type == dns_rdatatype_ns);
196
197 dns_name_init(&name, offsets);
198 dns_rdata_toregion(rdata, ®ion);
199 dns_name_fromregion(&name, ®ion);
200
201 return ((add)(arg, &name, dns_rdatatype_a));
202 }
203
204 static isc_result_t
digest_ns(ARGS_DIGEST)205 digest_ns(ARGS_DIGEST) {
206 isc_region_t r;
207 dns_name_t name;
208
209 REQUIRE(rdata->type == dns_rdatatype_ns);
210
211 dns_rdata_toregion(rdata, &r);
212 dns_name_init(&name, NULL);
213 dns_name_fromregion(&name, &r);
214
215 return (dns_name_digest(&name, digest, arg));
216 }
217
218 static bool
checkowner_ns(ARGS_CHECKOWNER)219 checkowner_ns(ARGS_CHECKOWNER) {
220 REQUIRE(type == dns_rdatatype_ns);
221
222 UNUSED(name);
223 UNUSED(type);
224 UNUSED(rdclass);
225 UNUSED(wildcard);
226
227 return (true);
228 }
229
230 static bool
checknames_ns(ARGS_CHECKNAMES)231 checknames_ns(ARGS_CHECKNAMES) {
232 isc_region_t region;
233 dns_name_t name;
234
235 REQUIRE(rdata->type == dns_rdatatype_ns);
236
237 UNUSED(owner);
238
239 dns_rdata_toregion(rdata, ®ion);
240 dns_name_init(&name, NULL);
241 dns_name_fromregion(&name, ®ion);
242 if (!dns_name_ishostname(&name, false)) {
243 if (bad != NULL) {
244 dns_name_clone(&name, bad);
245 }
246 return (false);
247 }
248 return (true);
249 }
250
251 static int
casecompare_ns(ARGS_COMPARE)252 casecompare_ns(ARGS_COMPARE) {
253 return (compare_ns(rdata1, rdata2));
254 }
255
256 #endif /* RDATA_GENERIC_NS_2_C */
257