1 /* $NetBSD: talink_58.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_TALINK_58_C
17 #define RDATA_GENERIC_TALINK_58_C
18
19 #define RRTYPE_TALINK_ATTRIBUTES 0
20
21 static isc_result_t
fromtext_talink(ARGS_FROMTEXT)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
totext_talink(ARGS_TOTEXT)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 bool sub;
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 sub = name_prefix(&prev, tctx->origin, &prefix);
75 RETERR(dns_name_totext(&prefix, sub, target));
76
77 RETERR(str_totext(" ", target));
78
79 sub = name_prefix(&next, tctx->origin, &prefix);
80 return (dns_name_totext(&prefix, sub, target));
81 }
82
83 static isc_result_t
fromwire_talink(ARGS_FROMWIRE)84 fromwire_talink(ARGS_FROMWIRE) {
85 dns_name_t prev;
86 dns_name_t next;
87
88 REQUIRE(type == dns_rdatatype_talink);
89
90 UNUSED(type);
91 UNUSED(rdclass);
92
93 dns_decompress_setmethods(dctx, DNS_COMPRESS_NONE);
94
95 dns_name_init(&prev, NULL);
96 dns_name_init(&next, NULL);
97
98 RETERR(dns_name_fromwire(&prev, source, dctx, options, target));
99 return (dns_name_fromwire(&next, source, dctx, options, target));
100 }
101
102 static isc_result_t
towire_talink(ARGS_TOWIRE)103 towire_talink(ARGS_TOWIRE) {
104 isc_region_t sregion;
105 dns_name_t prev;
106 dns_name_t next;
107 dns_offsets_t moffsets;
108 dns_offsets_t roffsets;
109
110 REQUIRE(rdata->type == dns_rdatatype_talink);
111 REQUIRE(rdata->length != 0);
112
113 dns_compress_setmethods(cctx, DNS_COMPRESS_NONE);
114
115 dns_name_init(&prev, moffsets);
116 dns_name_init(&next, roffsets);
117
118 dns_rdata_toregion(rdata, &sregion);
119
120 dns_name_fromregion(&prev, &sregion);
121 isc_region_consume(&sregion, name_length(&prev));
122 RETERR(dns_name_towire(&prev, cctx, target));
123
124 dns_name_fromregion(&next, &sregion);
125 isc_region_consume(&sregion, name_length(&next));
126 return (dns_name_towire(&next, cctx, target));
127 }
128
129 static int
compare_talink(ARGS_COMPARE)130 compare_talink(ARGS_COMPARE) {
131 isc_region_t region1;
132 isc_region_t region2;
133
134 REQUIRE(rdata1->type == rdata2->type);
135 REQUIRE(rdata1->rdclass == rdata2->rdclass);
136 REQUIRE(rdata1->type == dns_rdatatype_talink);
137 REQUIRE(rdata1->length != 0);
138 REQUIRE(rdata2->length != 0);
139
140 dns_rdata_toregion(rdata1, ®ion1);
141 dns_rdata_toregion(rdata2, ®ion2);
142 return (isc_region_compare(®ion1, ®ion2));
143 }
144
145 static isc_result_t
fromstruct_talink(ARGS_FROMSTRUCT)146 fromstruct_talink(ARGS_FROMSTRUCT) {
147 dns_rdata_talink_t *talink = source;
148 isc_region_t region;
149
150 REQUIRE(type == dns_rdatatype_talink);
151 REQUIRE(talink != NULL);
152 REQUIRE(talink->common.rdtype == type);
153 REQUIRE(talink->common.rdclass == rdclass);
154
155 UNUSED(type);
156 UNUSED(rdclass);
157
158 dns_name_toregion(&talink->prev, ®ion);
159 RETERR(isc_buffer_copyregion(target, ®ion));
160 dns_name_toregion(&talink->next, ®ion);
161 return (isc_buffer_copyregion(target, ®ion));
162 }
163
164 static isc_result_t
tostruct_talink(ARGS_TOSTRUCT)165 tostruct_talink(ARGS_TOSTRUCT) {
166 isc_region_t region;
167 dns_rdata_talink_t *talink = target;
168 dns_name_t name;
169 isc_result_t result;
170
171 REQUIRE(rdata->type == dns_rdatatype_talink);
172 REQUIRE(talink != NULL);
173 REQUIRE(rdata->length != 0);
174
175 talink->common.rdclass = rdata->rdclass;
176 talink->common.rdtype = rdata->type;
177 ISC_LINK_INIT(&talink->common, link);
178
179 dns_rdata_toregion(rdata, ®ion);
180
181 dns_name_init(&name, NULL);
182 dns_name_fromregion(&name, ®ion);
183 isc_region_consume(®ion, name_length(&name));
184 dns_name_init(&talink->prev, NULL);
185 RETERR(name_duporclone(&name, mctx, &talink->prev));
186
187 dns_name_fromregion(&name, ®ion);
188 isc_region_consume(®ion, name_length(&name));
189 dns_name_init(&talink->next, NULL);
190 result = name_duporclone(&name, mctx, &talink->next);
191 if (result != ISC_R_SUCCESS) {
192 goto cleanup;
193 }
194
195 talink->mctx = mctx;
196 return (ISC_R_SUCCESS);
197
198 cleanup:
199 if (mctx != NULL) {
200 dns_name_free(&talink->prev, mctx);
201 }
202 return (ISC_R_NOMEMORY);
203 }
204
205 static void
freestruct_talink(ARGS_FREESTRUCT)206 freestruct_talink(ARGS_FREESTRUCT) {
207 dns_rdata_talink_t *talink = source;
208
209 REQUIRE(talink != NULL);
210 REQUIRE(talink->common.rdtype == dns_rdatatype_talink);
211
212 if (talink->mctx == NULL) {
213 return;
214 }
215
216 dns_name_free(&talink->prev, talink->mctx);
217 dns_name_free(&talink->next, talink->mctx);
218 talink->mctx = NULL;
219 }
220
221 static isc_result_t
additionaldata_talink(ARGS_ADDLDATA)222 additionaldata_talink(ARGS_ADDLDATA) {
223 UNUSED(rdata);
224 UNUSED(add);
225 UNUSED(arg);
226
227 REQUIRE(rdata->type == dns_rdatatype_talink);
228
229 return (ISC_R_SUCCESS);
230 }
231
232 static isc_result_t
digest_talink(ARGS_DIGEST)233 digest_talink(ARGS_DIGEST) {
234 isc_region_t r;
235
236 REQUIRE(rdata->type == dns_rdatatype_talink);
237
238 dns_rdata_toregion(rdata, &r);
239 return ((digest)(arg, &r));
240 }
241
242 static bool
checkowner_talink(ARGS_CHECKOWNER)243 checkowner_talink(ARGS_CHECKOWNER) {
244 REQUIRE(type == dns_rdatatype_talink);
245
246 UNUSED(name);
247 UNUSED(type);
248 UNUSED(rdclass);
249 UNUSED(wildcard);
250
251 return (true);
252 }
253
254 static bool
checknames_talink(ARGS_CHECKNAMES)255 checknames_talink(ARGS_CHECKNAMES) {
256 REQUIRE(rdata->type == dns_rdatatype_talink);
257
258 UNUSED(bad);
259 UNUSED(owner);
260
261 return (true);
262 }
263
264 static int
casecompare_talink(ARGS_COMPARE)265 casecompare_talink(ARGS_COMPARE) {
266 return (compare_talink(rdata1, rdata2));
267 }
268
269 #endif /* RDATA_GENERIC_TALINK_58_C */
270