xref: /netbsd-src/external/mpl/bind/dist/lib/dns/rdata/generic/talink_58.c (revision bcda20f65a8566e103791ec395f7f499ef322704)
1 /*	$NetBSD: talink_58.c,v 1.9 2025/01/26 16:25:33 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_TALINK_58_C
17 #define RDATA_GENERIC_TALINK_58_C
18 
19 #define RRTYPE_TALINK_ATTRIBUTES 0
20 
21 static isc_result_t
22 fromtext_talink(ARGS_FROMTEXT) {
23 	isc_token_t token;
24 	dns_name_t name;
25 	isc_buffer_t buffer;
26 	int i;
27 
28 	REQUIRE(type == dns_rdatatype_talink);
29 
30 	UNUSED(type);
31 	UNUSED(rdclass);
32 	UNUSED(callbacks);
33 
34 	if (origin == NULL) {
35 		origin = dns_rootname;
36 	}
37 
38 	for (i = 0; i < 2; i++) {
39 		RETERR(isc_lex_getmastertoken(lexer, &token,
40 					      isc_tokentype_string, false));
41 
42 		dns_name_init(&name, NULL);
43 		buffer_fromregion(&buffer, &token.value.as_region);
44 		RETTOK(dns_name_fromtext(&name, &buffer, origin, options,
45 					 target));
46 	}
47 
48 	return ISC_R_SUCCESS;
49 }
50 
51 static isc_result_t
52 totext_talink(ARGS_TOTEXT) {
53 	isc_region_t dregion;
54 	dns_name_t prev;
55 	dns_name_t next;
56 	dns_name_t prefix;
57 	unsigned int opts;
58 
59 	REQUIRE(rdata->type == dns_rdatatype_talink);
60 	REQUIRE(rdata->length != 0);
61 
62 	dns_name_init(&prev, NULL);
63 	dns_name_init(&next, NULL);
64 	dns_name_init(&prefix, NULL);
65 
66 	dns_rdata_toregion(rdata, &dregion);
67 
68 	dns_name_fromregion(&prev, &dregion);
69 	isc_region_consume(&dregion, name_length(&prev));
70 
71 	dns_name_fromregion(&next, &dregion);
72 	isc_region_consume(&dregion, name_length(&next));
73 
74 	opts = name_prefix(&prev, tctx->origin, &prefix) ? DNS_NAME_OMITFINALDOT
75 							 : 0;
76 	RETERR(dns_name_totext(&prefix, opts, target));
77 
78 	RETERR(str_totext(" ", target));
79 
80 	opts = name_prefix(&next, tctx->origin, &prefix) ? DNS_NAME_OMITFINALDOT
81 							 : 0;
82 	return dns_name_totext(&prefix, opts, target);
83 }
84 
85 static isc_result_t
86 fromwire_talink(ARGS_FROMWIRE) {
87 	dns_name_t prev;
88 	dns_name_t next;
89 
90 	REQUIRE(type == dns_rdatatype_talink);
91 
92 	UNUSED(type);
93 	UNUSED(rdclass);
94 
95 	dctx = dns_decompress_setpermitted(dctx, false);
96 
97 	dns_name_init(&prev, NULL);
98 	dns_name_init(&next, NULL);
99 
100 	RETERR(dns_name_fromwire(&prev, source, dctx, target));
101 	return dns_name_fromwire(&next, source, dctx, target);
102 }
103 
104 static isc_result_t
105 towire_talink(ARGS_TOWIRE) {
106 	isc_region_t sregion;
107 	dns_name_t prev;
108 	dns_name_t next;
109 	dns_offsets_t moffsets;
110 	dns_offsets_t roffsets;
111 
112 	REQUIRE(rdata->type == dns_rdatatype_talink);
113 	REQUIRE(rdata->length != 0);
114 
115 	dns_compress_setpermitted(cctx, false);
116 
117 	dns_name_init(&prev, moffsets);
118 	dns_name_init(&next, roffsets);
119 
120 	dns_rdata_toregion(rdata, &sregion);
121 
122 	dns_name_fromregion(&prev, &sregion);
123 	isc_region_consume(&sregion, name_length(&prev));
124 	RETERR(dns_name_towire(&prev, cctx, target, NULL));
125 
126 	dns_name_fromregion(&next, &sregion);
127 	isc_region_consume(&sregion, name_length(&next));
128 	return dns_name_towire(&next, cctx, target, NULL);
129 }
130 
131 static int
132 compare_talink(ARGS_COMPARE) {
133 	isc_region_t region1;
134 	isc_region_t region2;
135 
136 	REQUIRE(rdata1->type == rdata2->type);
137 	REQUIRE(rdata1->rdclass == rdata2->rdclass);
138 	REQUIRE(rdata1->type == dns_rdatatype_talink);
139 	REQUIRE(rdata1->length != 0);
140 	REQUIRE(rdata2->length != 0);
141 
142 	dns_rdata_toregion(rdata1, &region1);
143 	dns_rdata_toregion(rdata2, &region2);
144 	return isc_region_compare(&region1, &region2);
145 }
146 
147 static isc_result_t
148 fromstruct_talink(ARGS_FROMSTRUCT) {
149 	dns_rdata_talink_t *talink = source;
150 	isc_region_t region;
151 
152 	REQUIRE(type == dns_rdatatype_talink);
153 	REQUIRE(talink != NULL);
154 	REQUIRE(talink->common.rdtype == type);
155 	REQUIRE(talink->common.rdclass == rdclass);
156 
157 	UNUSED(type);
158 	UNUSED(rdclass);
159 
160 	dns_name_toregion(&talink->prev, &region);
161 	RETERR(isc_buffer_copyregion(target, &region));
162 	dns_name_toregion(&talink->next, &region);
163 	return isc_buffer_copyregion(target, &region);
164 }
165 
166 static isc_result_t
167 tostruct_talink(ARGS_TOSTRUCT) {
168 	isc_region_t region;
169 	dns_rdata_talink_t *talink = target;
170 	dns_name_t name;
171 
172 	REQUIRE(rdata->type == dns_rdatatype_talink);
173 	REQUIRE(talink != NULL);
174 	REQUIRE(rdata->length != 0);
175 
176 	talink->common.rdclass = rdata->rdclass;
177 	talink->common.rdtype = rdata->type;
178 	ISC_LINK_INIT(&talink->common, link);
179 
180 	dns_rdata_toregion(rdata, &region);
181 
182 	dns_name_init(&name, NULL);
183 	dns_name_fromregion(&name, &region);
184 	isc_region_consume(&region, name_length(&name));
185 	dns_name_init(&talink->prev, NULL);
186 	name_duporclone(&name, mctx, &talink->prev);
187 
188 	dns_name_fromregion(&name, &region);
189 	isc_region_consume(&region, name_length(&name));
190 	dns_name_init(&talink->next, NULL);
191 	name_duporclone(&name, mctx, &talink->next);
192 
193 	talink->mctx = mctx;
194 	return ISC_R_SUCCESS;
195 }
196 
197 static void
198 freestruct_talink(ARGS_FREESTRUCT) {
199 	dns_rdata_talink_t *talink = source;
200 
201 	REQUIRE(talink != NULL);
202 	REQUIRE(talink->common.rdtype == dns_rdatatype_talink);
203 
204 	if (talink->mctx == NULL) {
205 		return;
206 	}
207 
208 	dns_name_free(&talink->prev, talink->mctx);
209 	dns_name_free(&talink->next, talink->mctx);
210 	talink->mctx = NULL;
211 }
212 
213 static isc_result_t
214 additionaldata_talink(ARGS_ADDLDATA) {
215 	REQUIRE(rdata->type == dns_rdatatype_talink);
216 
217 	UNUSED(rdata);
218 	UNUSED(owner);
219 	UNUSED(add);
220 	UNUSED(arg);
221 
222 	return ISC_R_SUCCESS;
223 }
224 
225 static isc_result_t
226 digest_talink(ARGS_DIGEST) {
227 	isc_region_t r;
228 
229 	REQUIRE(rdata->type == dns_rdatatype_talink);
230 
231 	dns_rdata_toregion(rdata, &r);
232 	return (digest)(arg, &r);
233 }
234 
235 static bool
236 checkowner_talink(ARGS_CHECKOWNER) {
237 	REQUIRE(type == dns_rdatatype_talink);
238 
239 	UNUSED(name);
240 	UNUSED(type);
241 	UNUSED(rdclass);
242 	UNUSED(wildcard);
243 
244 	return true;
245 }
246 
247 static bool
248 checknames_talink(ARGS_CHECKNAMES) {
249 	REQUIRE(rdata->type == dns_rdatatype_talink);
250 
251 	UNUSED(bad);
252 	UNUSED(owner);
253 
254 	return true;
255 }
256 
257 static int
258 casecompare_talink(ARGS_COMPARE) {
259 	return compare_talink(rdata1, rdata2);
260 }
261 
262 #endif /* RDATA_GENERIC_TALINK_58_C */
263