xref: /netbsd-src/external/mpl/bind/dist/lib/dns/rdata/generic/rp_17.c (revision bcda20f65a8566e103791ec395f7f499ef322704)
1 /*	$NetBSD: rp_17.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 /* RFC1183 */
17 
18 #ifndef RDATA_GENERIC_RP_17_C
19 #define RDATA_GENERIC_RP_17_C
20 
21 #define RRTYPE_RP_ATTRIBUTES (0)
22 
23 static isc_result_t
24 fromtext_rp(ARGS_FROMTEXT) {
25 	isc_token_t token;
26 	dns_name_t name;
27 	isc_buffer_t buffer;
28 	int i;
29 	bool ok;
30 
31 	REQUIRE(type == dns_rdatatype_rp);
32 
33 	UNUSED(type);
34 	UNUSED(rdclass);
35 	UNUSED(callbacks);
36 
37 	if (origin == NULL) {
38 		origin = dns_rootname;
39 	}
40 
41 	for (i = 0; i < 2; i++) {
42 		RETERR(isc_lex_getmastertoken(lexer, &token,
43 					      isc_tokentype_string, false));
44 		dns_name_init(&name, NULL);
45 		buffer_fromregion(&buffer, &token.value.as_region);
46 		RETTOK(dns_name_fromtext(&name, &buffer, origin, options,
47 					 target));
48 		ok = true;
49 		if ((options & DNS_RDATA_CHECKNAMES) != 0 && i == 0) {
50 			ok = dns_name_ismailbox(&name);
51 		}
52 		if (!ok && (options & DNS_RDATA_CHECKNAMESFAIL) != 0) {
53 			RETTOK(DNS_R_BADNAME);
54 		}
55 		if (!ok && callbacks != NULL) {
56 			warn_badname(&name, lexer, callbacks);
57 		}
58 	}
59 	return ISC_R_SUCCESS;
60 }
61 
62 static isc_result_t
63 totext_rp(ARGS_TOTEXT) {
64 	isc_region_t region;
65 	dns_name_t rmail;
66 	dns_name_t email;
67 	dns_name_t prefix;
68 	unsigned int opts;
69 
70 	REQUIRE(rdata->type == dns_rdatatype_rp);
71 	REQUIRE(rdata->length != 0);
72 
73 	dns_name_init(&rmail, NULL);
74 	dns_name_init(&email, NULL);
75 	dns_name_init(&prefix, NULL);
76 
77 	dns_rdata_toregion(rdata, &region);
78 
79 	dns_name_fromregion(&rmail, &region);
80 	isc_region_consume(&region, rmail.length);
81 
82 	dns_name_fromregion(&email, &region);
83 	isc_region_consume(&region, email.length);
84 
85 	opts = name_prefix(&rmail, tctx->origin, &prefix)
86 		       ? DNS_NAME_OMITFINALDOT
87 		       : 0;
88 	RETERR(dns_name_totext(&prefix, opts, target));
89 
90 	RETERR(str_totext(" ", target));
91 
92 	opts = name_prefix(&email, tctx->origin, &prefix)
93 		       ? DNS_NAME_OMITFINALDOT
94 		       : 0;
95 	return dns_name_totext(&prefix, opts, target);
96 }
97 
98 static isc_result_t
99 fromwire_rp(ARGS_FROMWIRE) {
100 	dns_name_t rmail;
101 	dns_name_t email;
102 
103 	REQUIRE(type == dns_rdatatype_rp);
104 
105 	UNUSED(type);
106 	UNUSED(rdclass);
107 
108 	dctx = dns_decompress_setpermitted(dctx, false);
109 
110 	dns_name_init(&rmail, NULL);
111 	dns_name_init(&email, NULL);
112 
113 	RETERR(dns_name_fromwire(&rmail, source, dctx, target));
114 	return dns_name_fromwire(&email, source, dctx, target);
115 }
116 
117 static isc_result_t
118 towire_rp(ARGS_TOWIRE) {
119 	isc_region_t region;
120 	dns_name_t rmail;
121 	dns_name_t email;
122 	dns_offsets_t roffsets;
123 	dns_offsets_t eoffsets;
124 
125 	REQUIRE(rdata->type == dns_rdatatype_rp);
126 	REQUIRE(rdata->length != 0);
127 
128 	dns_compress_setpermitted(cctx, false);
129 	dns_name_init(&rmail, roffsets);
130 	dns_name_init(&email, eoffsets);
131 
132 	dns_rdata_toregion(rdata, &region);
133 
134 	dns_name_fromregion(&rmail, &region);
135 	isc_region_consume(&region, rmail.length);
136 
137 	RETERR(dns_name_towire(&rmail, cctx, target, NULL));
138 
139 	dns_name_fromregion(&rmail, &region);
140 	isc_region_consume(&region, rmail.length);
141 
142 	return dns_name_towire(&rmail, cctx, target, NULL);
143 }
144 
145 static int
146 compare_rp(ARGS_COMPARE) {
147 	isc_region_t region1;
148 	isc_region_t region2;
149 	dns_name_t name1;
150 	dns_name_t name2;
151 	int order;
152 
153 	REQUIRE(rdata1->type == rdata2->type);
154 	REQUIRE(rdata1->rdclass == rdata2->rdclass);
155 	REQUIRE(rdata1->type == dns_rdatatype_rp);
156 	REQUIRE(rdata1->length != 0);
157 	REQUIRE(rdata2->length != 0);
158 
159 	dns_name_init(&name1, NULL);
160 	dns_name_init(&name2, NULL);
161 
162 	dns_rdata_toregion(rdata1, &region1);
163 	dns_rdata_toregion(rdata2, &region2);
164 
165 	dns_name_fromregion(&name1, &region1);
166 	dns_name_fromregion(&name2, &region2);
167 
168 	order = dns_name_rdatacompare(&name1, &name2);
169 	if (order != 0) {
170 		return order;
171 	}
172 
173 	isc_region_consume(&region1, name_length(&name1));
174 	isc_region_consume(&region2, name_length(&name2));
175 
176 	dns_name_init(&name1, NULL);
177 	dns_name_init(&name2, NULL);
178 
179 	dns_name_fromregion(&name1, &region1);
180 	dns_name_fromregion(&name2, &region2);
181 
182 	return dns_name_rdatacompare(&name1, &name2);
183 }
184 
185 static isc_result_t
186 fromstruct_rp(ARGS_FROMSTRUCT) {
187 	dns_rdata_rp_t *rp = source;
188 	isc_region_t region;
189 
190 	REQUIRE(type == dns_rdatatype_rp);
191 	REQUIRE(rp != NULL);
192 	REQUIRE(rp->common.rdtype == type);
193 	REQUIRE(rp->common.rdclass == rdclass);
194 
195 	UNUSED(type);
196 	UNUSED(rdclass);
197 
198 	dns_name_toregion(&rp->mail, &region);
199 	RETERR(isc_buffer_copyregion(target, &region));
200 	dns_name_toregion(&rp->text, &region);
201 	return isc_buffer_copyregion(target, &region);
202 }
203 
204 static isc_result_t
205 tostruct_rp(ARGS_TOSTRUCT) {
206 	isc_region_t region;
207 	dns_rdata_rp_t *rp = target;
208 	dns_name_t name;
209 
210 	REQUIRE(rdata->type == dns_rdatatype_rp);
211 	REQUIRE(rp != NULL);
212 	REQUIRE(rdata->length != 0);
213 
214 	rp->common.rdclass = rdata->rdclass;
215 	rp->common.rdtype = rdata->type;
216 	ISC_LINK_INIT(&rp->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(&rp->mail, NULL);
222 	name_duporclone(&name, mctx, &rp->mail);
223 	isc_region_consume(&region, name_length(&name));
224 	dns_name_fromregion(&name, &region);
225 	dns_name_init(&rp->text, NULL);
226 	name_duporclone(&name, mctx, &rp->text);
227 	rp->mctx = mctx;
228 	return ISC_R_SUCCESS;
229 }
230 
231 static void
232 freestruct_rp(ARGS_FREESTRUCT) {
233 	dns_rdata_rp_t *rp = source;
234 
235 	REQUIRE(rp != NULL);
236 	REQUIRE(rp->common.rdtype == dns_rdatatype_rp);
237 
238 	if (rp->mctx == NULL) {
239 		return;
240 	}
241 
242 	dns_name_free(&rp->mail, rp->mctx);
243 	dns_name_free(&rp->text, rp->mctx);
244 	rp->mctx = NULL;
245 }
246 
247 static isc_result_t
248 additionaldata_rp(ARGS_ADDLDATA) {
249 	REQUIRE(rdata->type == dns_rdatatype_rp);
250 
251 	UNUSED(rdata);
252 	UNUSED(owner);
253 	UNUSED(add);
254 	UNUSED(arg);
255 
256 	return ISC_R_SUCCESS;
257 }
258 
259 static isc_result_t
260 digest_rp(ARGS_DIGEST) {
261 	isc_region_t r;
262 	dns_name_t name;
263 
264 	REQUIRE(rdata->type == dns_rdatatype_rp);
265 
266 	dns_rdata_toregion(rdata, &r);
267 	dns_name_init(&name, NULL);
268 
269 	dns_name_fromregion(&name, &r);
270 	RETERR(dns_name_digest(&name, digest, arg));
271 	isc_region_consume(&r, name_length(&name));
272 
273 	dns_name_init(&name, NULL);
274 	dns_name_fromregion(&name, &r);
275 
276 	return dns_name_digest(&name, digest, arg);
277 }
278 
279 static bool
280 checkowner_rp(ARGS_CHECKOWNER) {
281 	REQUIRE(type == dns_rdatatype_rp);
282 
283 	UNUSED(name);
284 	UNUSED(type);
285 	UNUSED(rdclass);
286 	UNUSED(wildcard);
287 
288 	return true;
289 }
290 
291 static bool
292 checknames_rp(ARGS_CHECKNAMES) {
293 	isc_region_t region;
294 	dns_name_t name;
295 
296 	REQUIRE(rdata->type == dns_rdatatype_rp);
297 
298 	UNUSED(owner);
299 
300 	dns_rdata_toregion(rdata, &region);
301 	dns_name_init(&name, NULL);
302 	dns_name_fromregion(&name, &region);
303 	if (!dns_name_ismailbox(&name)) {
304 		if (bad != NULL) {
305 			dns_name_clone(&name, bad);
306 		}
307 		return false;
308 	}
309 	return true;
310 }
311 
312 static int
313 casecompare_rp(ARGS_COMPARE) {
314 	return compare_rp(rdata1, rdata2);
315 }
316 #endif /* RDATA_GENERIC_RP_17_C */
317