/src/bind9/lib/dns/rdata/generic/rp_17.c
Line | Count | Source (jump to first uncovered line) |
1 | | /* |
2 | | * Copyright (C) Internet Systems Consortium, Inc. ("ISC") |
3 | | * |
4 | | * SPDX-License-Identifier: MPL-2.0 |
5 | | * |
6 | | * This Source Code Form is subject to the terms of the Mozilla Public |
7 | | * License, v. 2.0. If a copy of the MPL was not distributed with this |
8 | | * file, you can obtain one at https://mozilla.org/MPL/2.0/. |
9 | | * |
10 | | * See the COPYRIGHT file distributed with this work for additional |
11 | | * information regarding copyright ownership. |
12 | | */ |
13 | | |
14 | | /* RFC1183 */ |
15 | | |
16 | | #ifndef RDATA_GENERIC_RP_17_C |
17 | | #define RDATA_GENERIC_RP_17_C |
18 | | |
19 | 27.4k | #define RRTYPE_RP_ATTRIBUTES (0) |
20 | | |
21 | | static isc_result_t |
22 | 3.55k | fromtext_rp(ARGS_FROMTEXT) { |
23 | 3.55k | isc_token_t token; |
24 | 3.55k | dns_name_t name; |
25 | 3.55k | isc_buffer_t buffer; |
26 | 3.55k | int i; |
27 | 3.55k | bool ok; |
28 | | |
29 | 3.55k | REQUIRE(type == dns_rdatatype_rp); |
30 | | |
31 | 3.55k | UNUSED(type); |
32 | 3.55k | UNUSED(rdclass); |
33 | 3.55k | UNUSED(callbacks); |
34 | | |
35 | 3.55k | if (origin == NULL) { |
36 | 5 | origin = dns_rootname; |
37 | 5 | } |
38 | | |
39 | 10.6k | for (i = 0; i < 2; i++) { |
40 | 7.09k | RETERR(isc_lex_getmastertoken(lexer, &token, |
41 | 7.09k | isc_tokentype_string, false)); |
42 | 7.08k | dns_name_init(&name, NULL); |
43 | 7.08k | buffer_fromregion(&buffer, &token.value.as_region); |
44 | 7.08k | RETTOK(dns_name_fromtext(&name, &buffer, origin, options, |
45 | 7.08k | target)); |
46 | 7.08k | ok = true; |
47 | 7.08k | if ((options & DNS_RDATA_CHECKNAMES) != 0 && i == 0) { |
48 | 0 | ok = dns_name_ismailbox(&name); |
49 | 0 | } |
50 | 7.08k | if (!ok && (options & DNS_RDATA_CHECKNAMESFAIL) != 0) { |
51 | 0 | RETTOK(DNS_R_BADNAME); |
52 | 0 | } |
53 | 7.08k | if (!ok && callbacks != NULL) { |
54 | 0 | warn_badname(&name, lexer, callbacks); |
55 | 0 | } |
56 | 7.08k | } |
57 | 3.53k | return (ISC_R_SUCCESS); |
58 | 3.55k | } |
59 | | |
60 | | static isc_result_t |
61 | 4.42k | totext_rp(ARGS_TOTEXT) { |
62 | 4.42k | isc_region_t region; |
63 | 4.42k | dns_name_t rmail; |
64 | 4.42k | dns_name_t email; |
65 | 4.42k | dns_name_t prefix; |
66 | 4.42k | bool sub; |
67 | | |
68 | 4.42k | REQUIRE(rdata->type == dns_rdatatype_rp); |
69 | 4.42k | REQUIRE(rdata->length != 0); |
70 | | |
71 | 4.42k | dns_name_init(&rmail, NULL); |
72 | 4.42k | dns_name_init(&email, NULL); |
73 | 4.42k | dns_name_init(&prefix, NULL); |
74 | | |
75 | 4.42k | dns_rdata_toregion(rdata, ®ion); |
76 | | |
77 | 4.42k | dns_name_fromregion(&rmail, ®ion); |
78 | 4.42k | isc_region_consume(®ion, rmail.length); |
79 | | |
80 | 4.42k | dns_name_fromregion(&email, ®ion); |
81 | 4.42k | isc_region_consume(®ion, email.length); |
82 | | |
83 | 4.42k | sub = name_prefix(&rmail, tctx->origin, &prefix); |
84 | 4.42k | RETERR(dns_name_totext(&prefix, sub, target)); |
85 | | |
86 | 4.42k | RETERR(str_totext(" ", target)); |
87 | | |
88 | 4.42k | sub = name_prefix(&email, tctx->origin, &prefix); |
89 | 4.42k | return (dns_name_totext(&prefix, sub, target)); |
90 | 4.42k | } |
91 | | |
92 | | static isc_result_t |
93 | 6.81k | fromwire_rp(ARGS_FROMWIRE) { |
94 | 6.81k | dns_name_t rmail; |
95 | 6.81k | dns_name_t email; |
96 | | |
97 | 6.81k | REQUIRE(type == dns_rdatatype_rp); |
98 | | |
99 | 6.81k | UNUSED(type); |
100 | 6.81k | UNUSED(rdclass); |
101 | | |
102 | 6.81k | dctx = dns_decompress_setpermitted(dctx, false); |
103 | | |
104 | 6.81k | dns_name_init(&rmail, NULL); |
105 | 6.81k | dns_name_init(&email, NULL); |
106 | | |
107 | 6.81k | RETERR(dns_name_fromwire(&rmail, source, dctx, target)); |
108 | 6.39k | return (dns_name_fromwire(&email, source, dctx, target)); |
109 | 6.81k | } |
110 | | |
111 | | static isc_result_t |
112 | 640 | towire_rp(ARGS_TOWIRE) { |
113 | 640 | isc_region_t region; |
114 | 640 | dns_name_t rmail; |
115 | 640 | dns_name_t email; |
116 | 640 | dns_offsets_t roffsets; |
117 | 640 | dns_offsets_t eoffsets; |
118 | | |
119 | 640 | REQUIRE(rdata->type == dns_rdatatype_rp); |
120 | 640 | REQUIRE(rdata->length != 0); |
121 | | |
122 | 640 | dns_compress_setpermitted(cctx, false); |
123 | 640 | dns_name_init(&rmail, roffsets); |
124 | 640 | dns_name_init(&email, eoffsets); |
125 | | |
126 | 640 | dns_rdata_toregion(rdata, ®ion); |
127 | | |
128 | 640 | dns_name_fromregion(&rmail, ®ion); |
129 | 640 | isc_region_consume(®ion, rmail.length); |
130 | | |
131 | 640 | RETERR(dns_name_towire(&rmail, cctx, target)); |
132 | | |
133 | 639 | dns_name_fromregion(&rmail, ®ion); |
134 | 639 | isc_region_consume(®ion, rmail.length); |
135 | | |
136 | 639 | return (dns_name_towire(&rmail, cctx, target)); |
137 | 640 | } |
138 | | |
139 | | static int |
140 | 354k | compare_rp(ARGS_COMPARE) { |
141 | 354k | isc_region_t region1; |
142 | 354k | isc_region_t region2; |
143 | 354k | dns_name_t name1; |
144 | 354k | dns_name_t name2; |
145 | 354k | int order; |
146 | | |
147 | 354k | REQUIRE(rdata1->type == rdata2->type); |
148 | 354k | REQUIRE(rdata1->rdclass == rdata2->rdclass); |
149 | 354k | REQUIRE(rdata1->type == dns_rdatatype_rp); |
150 | 354k | REQUIRE(rdata1->length != 0); |
151 | 354k | REQUIRE(rdata2->length != 0); |
152 | | |
153 | 354k | dns_name_init(&name1, NULL); |
154 | 354k | dns_name_init(&name2, NULL); |
155 | | |
156 | 354k | dns_rdata_toregion(rdata1, ®ion1); |
157 | 354k | dns_rdata_toregion(rdata2, ®ion2); |
158 | | |
159 | 354k | dns_name_fromregion(&name1, ®ion1); |
160 | 354k | dns_name_fromregion(&name2, ®ion2); |
161 | | |
162 | 354k | order = dns_name_rdatacompare(&name1, &name2); |
163 | 354k | if (order != 0) { |
164 | 260k | return (order); |
165 | 260k | } |
166 | | |
167 | 94.1k | isc_region_consume(®ion1, name_length(&name1)); |
168 | 94.1k | isc_region_consume(®ion2, name_length(&name2)); |
169 | | |
170 | 94.1k | dns_name_init(&name1, NULL); |
171 | 94.1k | dns_name_init(&name2, NULL); |
172 | | |
173 | 94.1k | dns_name_fromregion(&name1, ®ion1); |
174 | 94.1k | dns_name_fromregion(&name2, ®ion2); |
175 | | |
176 | 94.1k | return (dns_name_rdatacompare(&name1, &name2)); |
177 | 354k | } |
178 | | |
179 | | static isc_result_t |
180 | 0 | fromstruct_rp(ARGS_FROMSTRUCT) { |
181 | 0 | dns_rdata_rp_t *rp = source; |
182 | 0 | isc_region_t region; |
183 | |
|
184 | 0 | REQUIRE(type == dns_rdatatype_rp); |
185 | 0 | REQUIRE(rp != NULL); |
186 | 0 | REQUIRE(rp->common.rdtype == type); |
187 | 0 | REQUIRE(rp->common.rdclass == rdclass); |
188 | |
|
189 | 0 | UNUSED(type); |
190 | 0 | UNUSED(rdclass); |
191 | |
|
192 | 0 | dns_name_toregion(&rp->mail, ®ion); |
193 | 0 | RETERR(isc_buffer_copyregion(target, ®ion)); |
194 | 0 | dns_name_toregion(&rp->text, ®ion); |
195 | 0 | return (isc_buffer_copyregion(target, ®ion)); |
196 | 0 | } |
197 | | |
198 | | static isc_result_t |
199 | 0 | tostruct_rp(ARGS_TOSTRUCT) { |
200 | 0 | isc_region_t region; |
201 | 0 | dns_rdata_rp_t *rp = target; |
202 | 0 | dns_name_t name; |
203 | |
|
204 | 0 | REQUIRE(rdata->type == dns_rdatatype_rp); |
205 | 0 | REQUIRE(rp != NULL); |
206 | 0 | REQUIRE(rdata->length != 0); |
207 | |
|
208 | 0 | rp->common.rdclass = rdata->rdclass; |
209 | 0 | rp->common.rdtype = rdata->type; |
210 | 0 | ISC_LINK_INIT(&rp->common, link); |
211 | |
|
212 | 0 | dns_name_init(&name, NULL); |
213 | 0 | dns_rdata_toregion(rdata, ®ion); |
214 | 0 | dns_name_fromregion(&name, ®ion); |
215 | 0 | dns_name_init(&rp->mail, NULL); |
216 | 0 | name_duporclone(&name, mctx, &rp->mail); |
217 | 0 | isc_region_consume(®ion, name_length(&name)); |
218 | 0 | dns_name_fromregion(&name, ®ion); |
219 | 0 | dns_name_init(&rp->text, NULL); |
220 | 0 | name_duporclone(&name, mctx, &rp->text); |
221 | 0 | rp->mctx = mctx; |
222 | 0 | return (ISC_R_SUCCESS); |
223 | 0 | } |
224 | | |
225 | | static void |
226 | 0 | freestruct_rp(ARGS_FREESTRUCT) { |
227 | 0 | dns_rdata_rp_t *rp = source; |
228 | |
|
229 | 0 | REQUIRE(rp != NULL); |
230 | 0 | REQUIRE(rp->common.rdtype == dns_rdatatype_rp); |
231 | |
|
232 | 0 | if (rp->mctx == NULL) { |
233 | 0 | return; |
234 | 0 | } |
235 | | |
236 | 0 | dns_name_free(&rp->mail, rp->mctx); |
237 | 0 | dns_name_free(&rp->text, rp->mctx); |
238 | 0 | rp->mctx = NULL; |
239 | 0 | } |
240 | | |
241 | | static isc_result_t |
242 | 0 | additionaldata_rp(ARGS_ADDLDATA) { |
243 | 0 | REQUIRE(rdata->type == dns_rdatatype_rp); |
244 | |
|
245 | 0 | UNUSED(rdata); |
246 | 0 | UNUSED(owner); |
247 | 0 | UNUSED(add); |
248 | 0 | UNUSED(arg); |
249 | |
|
250 | 0 | return (ISC_R_SUCCESS); |
251 | 0 | } |
252 | | |
253 | | static isc_result_t |
254 | 0 | digest_rp(ARGS_DIGEST) { |
255 | 0 | isc_region_t r; |
256 | 0 | dns_name_t name; |
257 | |
|
258 | 0 | REQUIRE(rdata->type == dns_rdatatype_rp); |
259 | |
|
260 | 0 | dns_rdata_toregion(rdata, &r); |
261 | 0 | dns_name_init(&name, NULL); |
262 | |
|
263 | 0 | dns_name_fromregion(&name, &r); |
264 | 0 | RETERR(dns_name_digest(&name, digest, arg)); |
265 | 0 | isc_region_consume(&r, name_length(&name)); |
266 | |
|
267 | 0 | dns_name_init(&name, NULL); |
268 | 0 | dns_name_fromregion(&name, &r); |
269 | |
|
270 | 0 | return (dns_name_digest(&name, digest, arg)); |
271 | 0 | } |
272 | | |
273 | | static bool |
274 | 0 | checkowner_rp(ARGS_CHECKOWNER) { |
275 | 0 | REQUIRE(type == dns_rdatatype_rp); |
276 | |
|
277 | 0 | UNUSED(name); |
278 | 0 | UNUSED(type); |
279 | 0 | UNUSED(rdclass); |
280 | 0 | UNUSED(wildcard); |
281 | |
|
282 | 0 | return (true); |
283 | 0 | } |
284 | | |
285 | | static bool |
286 | 0 | checknames_rp(ARGS_CHECKNAMES) { |
287 | 0 | isc_region_t region; |
288 | 0 | dns_name_t name; |
289 | |
|
290 | 0 | REQUIRE(rdata->type == dns_rdatatype_rp); |
291 | |
|
292 | 0 | UNUSED(owner); |
293 | |
|
294 | 0 | dns_rdata_toregion(rdata, ®ion); |
295 | 0 | dns_name_init(&name, NULL); |
296 | 0 | dns_name_fromregion(&name, ®ion); |
297 | 0 | if (!dns_name_ismailbox(&name)) { |
298 | 0 | if (bad != NULL) { |
299 | 0 | dns_name_clone(&name, bad); |
300 | 0 | } |
301 | 0 | return (false); |
302 | 0 | } |
303 | 0 | return (true); |
304 | 0 | } |
305 | | |
306 | | static int |
307 | 0 | casecompare_rp(ARGS_COMPARE) { |
308 | 0 | return (compare_rp(rdata1, rdata2)); |
309 | 0 | } |
310 | | #endif /* RDATA_GENERIC_RP_17_C */ |