1 /* $NetBSD: minfo_14.c,v 1.1 2024/02/18 20:57:43 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_MINFO_14_C
17 #define RDATA_GENERIC_MINFO_14_C
18
19 #define RRTYPE_MINFO_ATTRIBUTES (0)
20
21 static isc_result_t
fromtext_minfo(ARGS_FROMTEXT)22 fromtext_minfo(ARGS_FROMTEXT) {
23 isc_token_t token;
24 dns_name_t name;
25 isc_buffer_t buffer;
26 int i;
27 bool ok;
28
29 REQUIRE(type == dns_rdatatype_minfo);
30
31 UNUSED(type);
32 UNUSED(rdclass);
33 UNUSED(callbacks);
34
35 if (origin == NULL) {
36 origin = dns_rootname;
37 }
38
39 for (i = 0; i < 2; i++) {
40 RETERR(isc_lex_getmastertoken(lexer, &token,
41 isc_tokentype_string, false));
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 ok = true;
47 if ((options & DNS_RDATA_CHECKNAMES) != 0) {
48 ok = dns_name_ismailbox(&name);
49 }
50 if (!ok && (options & DNS_RDATA_CHECKNAMESFAIL) != 0) {
51 RETTOK(DNS_R_BADNAME);
52 }
53 if (!ok && callbacks != NULL) {
54 warn_badname(&name, lexer, callbacks);
55 }
56 }
57 return (ISC_R_SUCCESS);
58 }
59
60 static isc_result_t
totext_minfo(ARGS_TOTEXT)61 totext_minfo(ARGS_TOTEXT) {
62 isc_region_t region;
63 dns_name_t rmail;
64 dns_name_t email;
65 dns_name_t prefix;
66 bool sub;
67
68 REQUIRE(rdata->type == dns_rdatatype_minfo);
69 REQUIRE(rdata->length != 0);
70
71 dns_name_init(&rmail, NULL);
72 dns_name_init(&email, NULL);
73 dns_name_init(&prefix, NULL);
74
75 dns_rdata_toregion(rdata, ®ion);
76
77 dns_name_fromregion(&rmail, ®ion);
78 isc_region_consume(®ion, rmail.length);
79
80 dns_name_fromregion(&email, ®ion);
81 isc_region_consume(®ion, email.length);
82
83 sub = name_prefix(&rmail, tctx->origin, &prefix);
84
85 RETERR(dns_name_totext(&prefix, sub, target));
86
87 RETERR(str_totext(" ", target));
88
89 sub = name_prefix(&email, tctx->origin, &prefix);
90 return (dns_name_totext(&prefix, sub, target));
91 }
92
93 static isc_result_t
fromwire_minfo(ARGS_FROMWIRE)94 fromwire_minfo(ARGS_FROMWIRE) {
95 dns_name_t rmail;
96 dns_name_t email;
97
98 REQUIRE(type == dns_rdatatype_minfo);
99
100 UNUSED(type);
101 UNUSED(rdclass);
102
103 dns_decompress_setmethods(dctx, DNS_COMPRESS_GLOBAL14);
104
105 dns_name_init(&rmail, NULL);
106 dns_name_init(&email, NULL);
107
108 RETERR(dns_name_fromwire(&rmail, source, dctx, options, target));
109 return (dns_name_fromwire(&email, source, dctx, options, target));
110 }
111
112 static isc_result_t
towire_minfo(ARGS_TOWIRE)113 towire_minfo(ARGS_TOWIRE) {
114 isc_region_t region;
115 dns_name_t rmail;
116 dns_name_t email;
117 dns_offsets_t roffsets;
118 dns_offsets_t eoffsets;
119
120 REQUIRE(rdata->type == dns_rdatatype_minfo);
121 REQUIRE(rdata->length != 0);
122
123 dns_compress_setmethods(cctx, DNS_COMPRESS_GLOBAL14);
124
125 dns_name_init(&rmail, roffsets);
126 dns_name_init(&email, eoffsets);
127
128 dns_rdata_toregion(rdata, ®ion);
129
130 dns_name_fromregion(&rmail, ®ion);
131 isc_region_consume(®ion, name_length(&rmail));
132
133 RETERR(dns_name_towire(&rmail, cctx, target));
134
135 dns_name_fromregion(&rmail, ®ion);
136 isc_region_consume(®ion, rmail.length);
137
138 return (dns_name_towire(&rmail, cctx, target));
139 }
140
141 static int
compare_minfo(ARGS_COMPARE)142 compare_minfo(ARGS_COMPARE) {
143 isc_region_t region1;
144 isc_region_t region2;
145 dns_name_t name1;
146 dns_name_t name2;
147 int order;
148
149 REQUIRE(rdata1->type == rdata2->type);
150 REQUIRE(rdata1->rdclass == rdata2->rdclass);
151 REQUIRE(rdata1->type == dns_rdatatype_minfo);
152 REQUIRE(rdata1->length != 0);
153 REQUIRE(rdata2->length != 0);
154
155 dns_name_init(&name1, NULL);
156 dns_name_init(&name2, NULL);
157
158 dns_rdata_toregion(rdata1, ®ion1);
159 dns_rdata_toregion(rdata2, ®ion2);
160
161 dns_name_fromregion(&name1, ®ion1);
162 dns_name_fromregion(&name2, ®ion2);
163
164 order = dns_name_rdatacompare(&name1, &name2);
165 if (order != 0) {
166 return (order);
167 }
168
169 isc_region_consume(®ion1, name_length(&name1));
170 isc_region_consume(®ion2, name_length(&name2));
171
172 dns_name_init(&name1, NULL);
173 dns_name_init(&name2, NULL);
174
175 dns_name_fromregion(&name1, ®ion1);
176 dns_name_fromregion(&name2, ®ion2);
177
178 order = dns_name_rdatacompare(&name1, &name2);
179 return (order);
180 }
181
182 static isc_result_t
fromstruct_minfo(ARGS_FROMSTRUCT)183 fromstruct_minfo(ARGS_FROMSTRUCT) {
184 dns_rdata_minfo_t *minfo = source;
185 isc_region_t region;
186
187 REQUIRE(type == dns_rdatatype_minfo);
188 REQUIRE(minfo != NULL);
189 REQUIRE(minfo->common.rdtype == type);
190 REQUIRE(minfo->common.rdclass == rdclass);
191
192 UNUSED(type);
193 UNUSED(rdclass);
194
195 dns_name_toregion(&minfo->rmailbox, ®ion);
196 RETERR(isc_buffer_copyregion(target, ®ion));
197 dns_name_toregion(&minfo->emailbox, ®ion);
198 return (isc_buffer_copyregion(target, ®ion));
199 }
200
201 static isc_result_t
tostruct_minfo(ARGS_TOSTRUCT)202 tostruct_minfo(ARGS_TOSTRUCT) {
203 dns_rdata_minfo_t *minfo = target;
204 isc_region_t region;
205 dns_name_t name;
206 isc_result_t result;
207
208 REQUIRE(rdata->type == dns_rdatatype_minfo);
209 REQUIRE(minfo != NULL);
210 REQUIRE(rdata->length != 0);
211
212 minfo->common.rdclass = rdata->rdclass;
213 minfo->common.rdtype = rdata->type;
214 ISC_LINK_INIT(&minfo->common, link);
215
216 dns_name_init(&name, NULL);
217 dns_rdata_toregion(rdata, ®ion);
218 dns_name_fromregion(&name, ®ion);
219 dns_name_init(&minfo->rmailbox, NULL);
220 RETERR(name_duporclone(&name, mctx, &minfo->rmailbox));
221 isc_region_consume(®ion, name_length(&name));
222
223 dns_name_fromregion(&name, ®ion);
224 dns_name_init(&minfo->emailbox, NULL);
225 result = name_duporclone(&name, mctx, &minfo->emailbox);
226 if (result != ISC_R_SUCCESS) {
227 goto cleanup;
228 }
229 minfo->mctx = mctx;
230 return (ISC_R_SUCCESS);
231
232 cleanup:
233 if (mctx != NULL) {
234 dns_name_free(&minfo->rmailbox, mctx);
235 }
236 return (ISC_R_NOMEMORY);
237 }
238
239 static void
freestruct_minfo(ARGS_FREESTRUCT)240 freestruct_minfo(ARGS_FREESTRUCT) {
241 dns_rdata_minfo_t *minfo = source;
242
243 REQUIRE(minfo != NULL);
244 REQUIRE(minfo->common.rdtype == dns_rdatatype_minfo);
245
246 if (minfo->mctx == NULL) {
247 return;
248 }
249
250 dns_name_free(&minfo->rmailbox, minfo->mctx);
251 dns_name_free(&minfo->emailbox, minfo->mctx);
252 minfo->mctx = NULL;
253 }
254
255 static isc_result_t
additionaldata_minfo(ARGS_ADDLDATA)256 additionaldata_minfo(ARGS_ADDLDATA) {
257 REQUIRE(rdata->type == dns_rdatatype_minfo);
258
259 UNUSED(rdata);
260 UNUSED(add);
261 UNUSED(arg);
262
263 return (ISC_R_SUCCESS);
264 }
265
266 static isc_result_t
digest_minfo(ARGS_DIGEST)267 digest_minfo(ARGS_DIGEST) {
268 isc_region_t r;
269 dns_name_t name;
270 isc_result_t result;
271
272 REQUIRE(rdata->type == dns_rdatatype_minfo);
273
274 dns_rdata_toregion(rdata, &r);
275 dns_name_init(&name, NULL);
276 dns_name_fromregion(&name, &r);
277 result = dns_name_digest(&name, digest, arg);
278 if (result != ISC_R_SUCCESS) {
279 return (result);
280 }
281 isc_region_consume(&r, name_length(&name));
282 dns_name_init(&name, NULL);
283 dns_name_fromregion(&name, &r);
284
285 return (dns_name_digest(&name, digest, arg));
286 }
287
288 static bool
checkowner_minfo(ARGS_CHECKOWNER)289 checkowner_minfo(ARGS_CHECKOWNER) {
290 REQUIRE(type == dns_rdatatype_minfo);
291
292 UNUSED(name);
293 UNUSED(type);
294 UNUSED(rdclass);
295 UNUSED(wildcard);
296
297 return (true);
298 }
299
300 static bool
checknames_minfo(ARGS_CHECKNAMES)301 checknames_minfo(ARGS_CHECKNAMES) {
302 isc_region_t region;
303 dns_name_t name;
304
305 REQUIRE(rdata->type == dns_rdatatype_minfo);
306
307 UNUSED(owner);
308
309 dns_rdata_toregion(rdata, ®ion);
310 dns_name_init(&name, NULL);
311 dns_name_fromregion(&name, ®ion);
312 if (!dns_name_ismailbox(&name)) {
313 if (bad != NULL) {
314 dns_name_clone(&name, bad);
315 }
316 return (false);
317 }
318 isc_region_consume(®ion, name_length(&name));
319 dns_name_fromregion(&name, ®ion);
320 if (!dns_name_ismailbox(&name)) {
321 if (bad != NULL) {
322 dns_name_clone(&name, bad);
323 }
324 return (false);
325 }
326 return (true);
327 }
328
329 static int
casecompare_minfo(ARGS_COMPARE)330 casecompare_minfo(ARGS_COMPARE) {
331 return (compare_minfo(rdata1, rdata2));
332 }
333
334 #endif /* RDATA_GENERIC_MINFO_14_C */
335