1/*	$NetBSD: ns_2.c,v 1.8 2024/02/21 22:52:13 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
21static isc_result_t
22fromtext_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
56static isc_result_t
57totext_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, &region);
70	dns_name_fromregion(&name, &region);
71
72	sub = name_prefix(&name, tctx->origin, &prefix);
73
74	return (dns_name_totext(&prefix, sub, target));
75}
76
77static isc_result_t
78fromwire_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
92static isc_result_t
93towire_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, &region);
105	dns_name_fromregion(&name, &region);
106
107	return (dns_name_towire(&name, cctx, target));
108}
109
110static int
111compare_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, &region1);
127	dns_rdata_toregion(rdata2, &region2);
128
129	dns_name_fromregion(&name1, &region1);
130	dns_name_fromregion(&name2, &region2);
131
132	return (dns_name_rdatacompare(&name1, &name2));
133}
134
135static isc_result_t
136fromstruct_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, &region);
149	return (isc_buffer_copyregion(target, &region));
150}
151
152static isc_result_t
153tostruct_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, &region);
168	dns_name_fromregion(&name, &region);
169	dns_name_init(&ns->name, NULL);
170	name_duporclone(&name, mctx, &ns->name);
171	ns->mctx = mctx;
172	return (ISC_R_SUCCESS);
173}
174
175static void
176freestruct_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
189static isc_result_t
190additionaldata_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	UNUSED(owner);
198
199	dns_name_init(&name, offsets);
200	dns_rdata_toregion(rdata, &region);
201	dns_name_fromregion(&name, &region);
202
203	return ((add)(arg, &name, dns_rdatatype_a, NULL));
204}
205
206static isc_result_t
207digest_ns(ARGS_DIGEST) {
208	isc_region_t r;
209	dns_name_t name;
210
211	REQUIRE(rdata->type == dns_rdatatype_ns);
212
213	dns_rdata_toregion(rdata, &r);
214	dns_name_init(&name, NULL);
215	dns_name_fromregion(&name, &r);
216
217	return (dns_name_digest(&name, digest, arg));
218}
219
220static bool
221checkowner_ns(ARGS_CHECKOWNER) {
222	REQUIRE(type == dns_rdatatype_ns);
223
224	UNUSED(name);
225	UNUSED(type);
226	UNUSED(rdclass);
227	UNUSED(wildcard);
228
229	return (true);
230}
231
232static bool
233checknames_ns(ARGS_CHECKNAMES) {
234	isc_region_t region;
235	dns_name_t name;
236
237	REQUIRE(rdata->type == dns_rdatatype_ns);
238
239	UNUSED(owner);
240
241	dns_rdata_toregion(rdata, &region);
242	dns_name_init(&name, NULL);
243	dns_name_fromregion(&name, &region);
244	if (!dns_name_ishostname(&name, false)) {
245		if (bad != NULL) {
246			dns_name_clone(&name, bad);
247		}
248		return (false);
249	}
250	return (true);
251}
252
253static int
254casecompare_ns(ARGS_COMPARE) {
255	return (compare_ns(rdata1, rdata2));
256}
257
258#endif /* RDATA_GENERIC_NS_2_C */
259