xref: /netbsd-src/external/mpl/bind/dist/lib/dns/rdata/generic/minfo_14.c (revision bcda20f65a8566e103791ec395f7f499ef322704)
1 /*	$NetBSD: minfo_14.c,v 1.9 2025/01/26 16:25:32 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
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
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 	unsigned int opts;
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, &region);
76 
77 	dns_name_fromregion(&rmail, &region);
78 	isc_region_consume(&region, rmail.length);
79 
80 	dns_name_fromregion(&email, &region);
81 	isc_region_consume(&region, email.length);
82 
83 	opts = name_prefix(&rmail, tctx->origin, &prefix)
84 		       ? DNS_NAME_OMITFINALDOT
85 		       : 0;
86 	RETERR(dns_name_totext(&prefix, opts, target));
87 
88 	RETERR(str_totext(" ", target));
89 
90 	opts = name_prefix(&email, tctx->origin, &prefix)
91 		       ? DNS_NAME_OMITFINALDOT
92 		       : 0;
93 	return dns_name_totext(&prefix, opts, target);
94 }
95 
96 static isc_result_t
97 fromwire_minfo(ARGS_FROMWIRE) {
98 	dns_name_t rmail;
99 	dns_name_t email;
100 
101 	REQUIRE(type == dns_rdatatype_minfo);
102 
103 	UNUSED(type);
104 	UNUSED(rdclass);
105 
106 	dctx = dns_decompress_setpermitted(dctx, true);
107 
108 	dns_name_init(&rmail, NULL);
109 	dns_name_init(&email, NULL);
110 
111 	RETERR(dns_name_fromwire(&rmail, source, dctx, target));
112 	return dns_name_fromwire(&email, source, dctx, target);
113 }
114 
115 static isc_result_t
116 towire_minfo(ARGS_TOWIRE) {
117 	isc_region_t region;
118 	dns_name_t rmail;
119 	dns_name_t email;
120 	dns_offsets_t roffsets;
121 	dns_offsets_t eoffsets;
122 
123 	REQUIRE(rdata->type == dns_rdatatype_minfo);
124 	REQUIRE(rdata->length != 0);
125 
126 	dns_compress_setpermitted(cctx, true);
127 
128 	dns_name_init(&rmail, roffsets);
129 	dns_name_init(&email, eoffsets);
130 
131 	dns_rdata_toregion(rdata, &region);
132 
133 	dns_name_fromregion(&rmail, &region);
134 	isc_region_consume(&region, name_length(&rmail));
135 
136 	RETERR(dns_name_towire(&rmail, cctx, target, NULL));
137 
138 	dns_name_fromregion(&rmail, &region);
139 	isc_region_consume(&region, rmail.length);
140 
141 	return dns_name_towire(&rmail, cctx, target, NULL);
142 }
143 
144 static int
145 compare_minfo(ARGS_COMPARE) {
146 	isc_region_t region1;
147 	isc_region_t region2;
148 	dns_name_t name1;
149 	dns_name_t name2;
150 	int order;
151 
152 	REQUIRE(rdata1->type == rdata2->type);
153 	REQUIRE(rdata1->rdclass == rdata2->rdclass);
154 	REQUIRE(rdata1->type == dns_rdatatype_minfo);
155 	REQUIRE(rdata1->length != 0);
156 	REQUIRE(rdata2->length != 0);
157 
158 	dns_name_init(&name1, NULL);
159 	dns_name_init(&name2, NULL);
160 
161 	dns_rdata_toregion(rdata1, &region1);
162 	dns_rdata_toregion(rdata2, &region2);
163 
164 	dns_name_fromregion(&name1, &region1);
165 	dns_name_fromregion(&name2, &region2);
166 
167 	order = dns_name_rdatacompare(&name1, &name2);
168 	if (order != 0) {
169 		return order;
170 	}
171 
172 	isc_region_consume(&region1, name_length(&name1));
173 	isc_region_consume(&region2, name_length(&name2));
174 
175 	dns_name_init(&name1, NULL);
176 	dns_name_init(&name2, NULL);
177 
178 	dns_name_fromregion(&name1, &region1);
179 	dns_name_fromregion(&name2, &region2);
180 
181 	order = dns_name_rdatacompare(&name1, &name2);
182 	return order;
183 }
184 
185 static isc_result_t
186 fromstruct_minfo(ARGS_FROMSTRUCT) {
187 	dns_rdata_minfo_t *minfo = source;
188 	isc_region_t region;
189 
190 	REQUIRE(type == dns_rdatatype_minfo);
191 	REQUIRE(minfo != NULL);
192 	REQUIRE(minfo->common.rdtype == type);
193 	REQUIRE(minfo->common.rdclass == rdclass);
194 
195 	UNUSED(type);
196 	UNUSED(rdclass);
197 
198 	dns_name_toregion(&minfo->rmailbox, &region);
199 	RETERR(isc_buffer_copyregion(target, &region));
200 	dns_name_toregion(&minfo->emailbox, &region);
201 	return isc_buffer_copyregion(target, &region);
202 }
203 
204 static isc_result_t
205 tostruct_minfo(ARGS_TOSTRUCT) {
206 	dns_rdata_minfo_t *minfo = target;
207 	isc_region_t region;
208 	dns_name_t name;
209 
210 	REQUIRE(rdata->type == dns_rdatatype_minfo);
211 	REQUIRE(minfo != NULL);
212 	REQUIRE(rdata->length != 0);
213 
214 	minfo->common.rdclass = rdata->rdclass;
215 	minfo->common.rdtype = rdata->type;
216 	ISC_LINK_INIT(&minfo->common, link);
217 
218 	dns_name_init(&name, NULL);
219 	dns_rdata_toregion(rdata, &region);
220 	dns_name_fromregion(&name, &region);
221 	dns_name_init(&minfo->rmailbox, NULL);
222 	name_duporclone(&name, mctx, &minfo->rmailbox);
223 	isc_region_consume(&region, name_length(&name));
224 
225 	dns_name_fromregion(&name, &region);
226 	dns_name_init(&minfo->emailbox, NULL);
227 	name_duporclone(&name, mctx, &minfo->emailbox);
228 	minfo->mctx = mctx;
229 	return ISC_R_SUCCESS;
230 }
231 
232 static void
233 freestruct_minfo(ARGS_FREESTRUCT) {
234 	dns_rdata_minfo_t *minfo = source;
235 
236 	REQUIRE(minfo != NULL);
237 	REQUIRE(minfo->common.rdtype == dns_rdatatype_minfo);
238 
239 	if (minfo->mctx == NULL) {
240 		return;
241 	}
242 
243 	dns_name_free(&minfo->rmailbox, minfo->mctx);
244 	dns_name_free(&minfo->emailbox, minfo->mctx);
245 	minfo->mctx = NULL;
246 }
247 
248 static isc_result_t
249 additionaldata_minfo(ARGS_ADDLDATA) {
250 	REQUIRE(rdata->type == dns_rdatatype_minfo);
251 
252 	UNUSED(rdata);
253 	UNUSED(owner);
254 	UNUSED(add);
255 	UNUSED(arg);
256 
257 	return ISC_R_SUCCESS;
258 }
259 
260 static isc_result_t
261 digest_minfo(ARGS_DIGEST) {
262 	isc_region_t r;
263 	dns_name_t name;
264 	isc_result_t result;
265 
266 	REQUIRE(rdata->type == dns_rdatatype_minfo);
267 
268 	dns_rdata_toregion(rdata, &r);
269 	dns_name_init(&name, NULL);
270 	dns_name_fromregion(&name, &r);
271 	result = dns_name_digest(&name, digest, arg);
272 	if (result != ISC_R_SUCCESS) {
273 		return result;
274 	}
275 	isc_region_consume(&r, name_length(&name));
276 	dns_name_init(&name, NULL);
277 	dns_name_fromregion(&name, &r);
278 
279 	return dns_name_digest(&name, digest, arg);
280 }
281 
282 static bool
283 checkowner_minfo(ARGS_CHECKOWNER) {
284 	REQUIRE(type == dns_rdatatype_minfo);
285 
286 	UNUSED(name);
287 	UNUSED(type);
288 	UNUSED(rdclass);
289 	UNUSED(wildcard);
290 
291 	return true;
292 }
293 
294 static bool
295 checknames_minfo(ARGS_CHECKNAMES) {
296 	isc_region_t region;
297 	dns_name_t name;
298 
299 	REQUIRE(rdata->type == dns_rdatatype_minfo);
300 
301 	UNUSED(owner);
302 
303 	dns_rdata_toregion(rdata, &region);
304 	dns_name_init(&name, NULL);
305 	dns_name_fromregion(&name, &region);
306 	if (!dns_name_ismailbox(&name)) {
307 		if (bad != NULL) {
308 			dns_name_clone(&name, bad);
309 		}
310 		return false;
311 	}
312 	isc_region_consume(&region, name_length(&name));
313 	dns_name_fromregion(&name, &region);
314 	if (!dns_name_ismailbox(&name)) {
315 		if (bad != NULL) {
316 			dns_name_clone(&name, bad);
317 		}
318 		return false;
319 	}
320 	return true;
321 }
322 
323 static int
324 casecompare_minfo(ARGS_COMPARE) {
325 	return compare_minfo(rdata1, rdata2);
326 }
327 
328 #endif /* RDATA_GENERIC_MINFO_14_C */
329