xref: /netbsd-src/external/mpl/dhcp/bind/dist/lib/dns/rdata/in_1/kx_36.c (revision 4afad4b7fa6d4a0d3dedf41d1587a7250710ae54)
1 /*	$NetBSD: kx_36.c,v 1.1 2024/02/18 20:57:46 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 /* RFC2230 */
17 
18 #ifndef RDATA_IN_1_KX_36_C
19 #define RDATA_IN_1_KX_36_C
20 
21 #define RRTYPE_KX_ATTRIBUTES (0)
22 
23 static isc_result_t
fromtext_in_kx(ARGS_FROMTEXT)24 fromtext_in_kx(ARGS_FROMTEXT) {
25 	isc_token_t token;
26 	dns_name_t name;
27 	isc_buffer_t buffer;
28 
29 	REQUIRE(type == dns_rdatatype_kx);
30 	REQUIRE(rdclass == dns_rdataclass_in);
31 
32 	UNUSED(type);
33 	UNUSED(rdclass);
34 	UNUSED(callbacks);
35 
36 	RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_number,
37 				      false));
38 	if (token.value.as_ulong > 0xffffU) {
39 		RETTOK(ISC_R_RANGE);
40 	}
41 	RETERR(uint16_tobuffer(token.value.as_ulong, target));
42 
43 	RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_string,
44 				      false));
45 	dns_name_init(&name, NULL);
46 	buffer_fromregion(&buffer, &token.value.as_region);
47 	if (origin == NULL) {
48 		origin = dns_rootname;
49 	}
50 	RETTOK(dns_name_fromtext(&name, &buffer, origin, options, target));
51 	return (ISC_R_SUCCESS);
52 }
53 
54 static isc_result_t
totext_in_kx(ARGS_TOTEXT)55 totext_in_kx(ARGS_TOTEXT) {
56 	isc_region_t region;
57 	dns_name_t name;
58 	dns_name_t prefix;
59 	bool sub;
60 	char buf[sizeof("64000")];
61 	unsigned short num;
62 
63 	REQUIRE(rdata->type == dns_rdatatype_kx);
64 	REQUIRE(rdata->rdclass == dns_rdataclass_in);
65 	REQUIRE(rdata->length != 0);
66 
67 	dns_name_init(&name, NULL);
68 	dns_name_init(&prefix, NULL);
69 
70 	dns_rdata_toregion(rdata, &region);
71 	num = uint16_fromregion(&region);
72 	isc_region_consume(&region, 2);
73 	snprintf(buf, sizeof(buf), "%u", num);
74 	RETERR(str_totext(buf, target));
75 
76 	RETERR(str_totext(" ", target));
77 
78 	dns_name_fromregion(&name, &region);
79 	sub = name_prefix(&name, tctx->origin, &prefix);
80 	return (dns_name_totext(&prefix, sub, target));
81 }
82 
83 static isc_result_t
fromwire_in_kx(ARGS_FROMWIRE)84 fromwire_in_kx(ARGS_FROMWIRE) {
85 	dns_name_t name;
86 	isc_region_t sregion;
87 
88 	REQUIRE(type == dns_rdatatype_kx);
89 	REQUIRE(rdclass == dns_rdataclass_in);
90 
91 	UNUSED(type);
92 	UNUSED(rdclass);
93 
94 	dns_decompress_setmethods(dctx, DNS_COMPRESS_NONE);
95 
96 	dns_name_init(&name, NULL);
97 
98 	isc_buffer_activeregion(source, &sregion);
99 	if (sregion.length < 2) {
100 		return (ISC_R_UNEXPECTEDEND);
101 	}
102 	RETERR(mem_tobuffer(target, sregion.base, 2));
103 	isc_buffer_forward(source, 2);
104 	return (dns_name_fromwire(&name, source, dctx, options, target));
105 }
106 
107 static isc_result_t
towire_in_kx(ARGS_TOWIRE)108 towire_in_kx(ARGS_TOWIRE) {
109 	dns_name_t name;
110 	dns_offsets_t offsets;
111 	isc_region_t region;
112 
113 	REQUIRE(rdata->type == dns_rdatatype_kx);
114 	REQUIRE(rdata->rdclass == dns_rdataclass_in);
115 	REQUIRE(rdata->length != 0);
116 
117 	dns_compress_setmethods(cctx, DNS_COMPRESS_NONE);
118 	dns_rdata_toregion(rdata, &region);
119 	RETERR(mem_tobuffer(target, region.base, 2));
120 	isc_region_consume(&region, 2);
121 
122 	dns_name_init(&name, offsets);
123 	dns_name_fromregion(&name, &region);
124 
125 	return (dns_name_towire(&name, cctx, target));
126 }
127 
128 static int
compare_in_kx(ARGS_COMPARE)129 compare_in_kx(ARGS_COMPARE) {
130 	dns_name_t name1;
131 	dns_name_t name2;
132 	isc_region_t region1;
133 	isc_region_t region2;
134 	int order;
135 
136 	REQUIRE(rdata1->type == rdata2->type);
137 	REQUIRE(rdata1->rdclass == rdata2->rdclass);
138 	REQUIRE(rdata1->type == dns_rdatatype_kx);
139 	REQUIRE(rdata1->rdclass == dns_rdataclass_in);
140 	REQUIRE(rdata1->length != 0);
141 	REQUIRE(rdata2->length != 0);
142 
143 	order = memcmp(rdata1->data, rdata2->data, 2);
144 	if (order != 0) {
145 		return (order < 0 ? -1 : 1);
146 	}
147 
148 	dns_name_init(&name1, NULL);
149 	dns_name_init(&name2, NULL);
150 
151 	dns_rdata_toregion(rdata1, &region1);
152 	dns_rdata_toregion(rdata2, &region2);
153 
154 	isc_region_consume(&region1, 2);
155 	isc_region_consume(&region2, 2);
156 
157 	dns_name_fromregion(&name1, &region1);
158 	dns_name_fromregion(&name2, &region2);
159 
160 	return (dns_name_rdatacompare(&name1, &name2));
161 }
162 
163 static isc_result_t
fromstruct_in_kx(ARGS_FROMSTRUCT)164 fromstruct_in_kx(ARGS_FROMSTRUCT) {
165 	dns_rdata_in_kx_t *kx = source;
166 	isc_region_t region;
167 
168 	REQUIRE(type == dns_rdatatype_kx);
169 	REQUIRE(rdclass == dns_rdataclass_in);
170 	REQUIRE(kx != NULL);
171 	REQUIRE(kx->common.rdtype == type);
172 	REQUIRE(kx->common.rdclass == rdclass);
173 
174 	UNUSED(type);
175 	UNUSED(rdclass);
176 
177 	RETERR(uint16_tobuffer(kx->preference, target));
178 	dns_name_toregion(&kx->exchange, &region);
179 	return (isc_buffer_copyregion(target, &region));
180 }
181 
182 static isc_result_t
tostruct_in_kx(ARGS_TOSTRUCT)183 tostruct_in_kx(ARGS_TOSTRUCT) {
184 	isc_region_t region;
185 	dns_rdata_in_kx_t *kx = target;
186 	dns_name_t name;
187 
188 	REQUIRE(rdata->type == dns_rdatatype_kx);
189 	REQUIRE(rdata->rdclass == dns_rdataclass_in);
190 	REQUIRE(kx != NULL);
191 	REQUIRE(rdata->length != 0);
192 
193 	kx->common.rdclass = rdata->rdclass;
194 	kx->common.rdtype = rdata->type;
195 	ISC_LINK_INIT(&kx->common, link);
196 
197 	dns_name_init(&name, NULL);
198 	dns_rdata_toregion(rdata, &region);
199 
200 	kx->preference = uint16_fromregion(&region);
201 	isc_region_consume(&region, 2);
202 
203 	dns_name_fromregion(&name, &region);
204 	dns_name_init(&kx->exchange, NULL);
205 	RETERR(name_duporclone(&name, mctx, &kx->exchange));
206 	kx->mctx = mctx;
207 	return (ISC_R_SUCCESS);
208 }
209 
210 static void
freestruct_in_kx(ARGS_FREESTRUCT)211 freestruct_in_kx(ARGS_FREESTRUCT) {
212 	dns_rdata_in_kx_t *kx = source;
213 
214 	REQUIRE(kx != NULL);
215 	REQUIRE(kx->common.rdclass == dns_rdataclass_in);
216 	REQUIRE(kx->common.rdtype == dns_rdatatype_kx);
217 
218 	if (kx->mctx == NULL) {
219 		return;
220 	}
221 
222 	dns_name_free(&kx->exchange, kx->mctx);
223 	kx->mctx = NULL;
224 }
225 
226 static isc_result_t
additionaldata_in_kx(ARGS_ADDLDATA)227 additionaldata_in_kx(ARGS_ADDLDATA) {
228 	dns_name_t name;
229 	dns_offsets_t offsets;
230 	isc_region_t region;
231 
232 	REQUIRE(rdata->type == dns_rdatatype_kx);
233 	REQUIRE(rdata->rdclass == dns_rdataclass_in);
234 
235 	dns_name_init(&name, offsets);
236 	dns_rdata_toregion(rdata, &region);
237 	isc_region_consume(&region, 2);
238 	dns_name_fromregion(&name, &region);
239 
240 	return ((add)(arg, &name, dns_rdatatype_a));
241 }
242 
243 static isc_result_t
digest_in_kx(ARGS_DIGEST)244 digest_in_kx(ARGS_DIGEST) {
245 	isc_region_t r1, r2;
246 	dns_name_t name;
247 
248 	REQUIRE(rdata->type == dns_rdatatype_kx);
249 	REQUIRE(rdata->rdclass == dns_rdataclass_in);
250 
251 	dns_rdata_toregion(rdata, &r1);
252 	r2 = r1;
253 	isc_region_consume(&r2, 2);
254 	r1.length = 2;
255 	RETERR((digest)(arg, &r1));
256 	dns_name_init(&name, NULL);
257 	dns_name_fromregion(&name, &r2);
258 	return (dns_name_digest(&name, digest, arg));
259 }
260 
261 static bool
checkowner_in_kx(ARGS_CHECKOWNER)262 checkowner_in_kx(ARGS_CHECKOWNER) {
263 	REQUIRE(type == dns_rdatatype_kx);
264 	REQUIRE(rdclass == dns_rdataclass_in);
265 
266 	UNUSED(name);
267 	UNUSED(type);
268 	UNUSED(rdclass);
269 	UNUSED(wildcard);
270 
271 	return (true);
272 }
273 
274 static bool
checknames_in_kx(ARGS_CHECKNAMES)275 checknames_in_kx(ARGS_CHECKNAMES) {
276 	REQUIRE(rdata->type == dns_rdatatype_kx);
277 	REQUIRE(rdata->rdclass == dns_rdataclass_in);
278 
279 	UNUSED(rdata);
280 	UNUSED(owner);
281 	UNUSED(bad);
282 
283 	return (true);
284 }
285 
286 static int
casecompare_in_kx(ARGS_COMPARE)287 casecompare_in_kx(ARGS_COMPARE) {
288 	return (compare_in_kx(rdata1, rdata2));
289 }
290 
291 #endif /* RDATA_IN_1_KX_36_C */
292