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, ®ion); 78 79 dns_name_fromregion(&rmail, ®ion); 80 isc_region_consume(®ion, rmail.length); 81 82 dns_name_fromregion(&email, ®ion); 83 isc_region_consume(®ion, 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, ®ion); 133 134 dns_name_fromregion(&rmail, ®ion); 135 isc_region_consume(®ion, rmail.length); 136 137 RETERR(dns_name_towire(&rmail, cctx, target, NULL)); 138 139 dns_name_fromregion(&rmail, ®ion); 140 isc_region_consume(®ion, 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, ®ion1); 163 dns_rdata_toregion(rdata2, ®ion2); 164 165 dns_name_fromregion(&name1, ®ion1); 166 dns_name_fromregion(&name2, ®ion2); 167 168 order = dns_name_rdatacompare(&name1, &name2); 169 if (order != 0) { 170 return order; 171 } 172 173 isc_region_consume(®ion1, name_length(&name1)); 174 isc_region_consume(®ion2, name_length(&name2)); 175 176 dns_name_init(&name1, NULL); 177 dns_name_init(&name2, NULL); 178 179 dns_name_fromregion(&name1, ®ion1); 180 dns_name_fromregion(&name2, ®ion2); 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, ®ion); 199 RETERR(isc_buffer_copyregion(target, ®ion)); 200 dns_name_toregion(&rp->text, ®ion); 201 return isc_buffer_copyregion(target, ®ion); 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, ®ion); 220 dns_name_fromregion(&name, ®ion); 221 dns_name_init(&rp->mail, NULL); 222 name_duporclone(&name, mctx, &rp->mail); 223 isc_region_consume(®ion, name_length(&name)); 224 dns_name_fromregion(&name, ®ion); 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, ®ion); 301 dns_name_init(&name, NULL); 302 dns_name_fromregion(&name, ®ion); 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