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, ®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 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, ®ion); 132 133 dns_name_fromregion(&rmail, ®ion); 134 isc_region_consume(®ion, name_length(&rmail)); 135 136 RETERR(dns_name_towire(&rmail, cctx, target, NULL)); 137 138 dns_name_fromregion(&rmail, ®ion); 139 isc_region_consume(®ion, 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, ®ion1); 162 dns_rdata_toregion(rdata2, ®ion2); 163 164 dns_name_fromregion(&name1, ®ion1); 165 dns_name_fromregion(&name2, ®ion2); 166 167 order = dns_name_rdatacompare(&name1, &name2); 168 if (order != 0) { 169 return order; 170 } 171 172 isc_region_consume(®ion1, name_length(&name1)); 173 isc_region_consume(®ion2, name_length(&name2)); 174 175 dns_name_init(&name1, NULL); 176 dns_name_init(&name2, NULL); 177 178 dns_name_fromregion(&name1, ®ion1); 179 dns_name_fromregion(&name2, ®ion2); 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, ®ion); 199 RETERR(isc_buffer_copyregion(target, ®ion)); 200 dns_name_toregion(&minfo->emailbox, ®ion); 201 return isc_buffer_copyregion(target, ®ion); 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, ®ion); 220 dns_name_fromregion(&name, ®ion); 221 dns_name_init(&minfo->rmailbox, NULL); 222 name_duporclone(&name, mctx, &minfo->rmailbox); 223 isc_region_consume(®ion, name_length(&name)); 224 225 dns_name_fromregion(&name, ®ion); 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, ®ion); 304 dns_name_init(&name, NULL); 305 dns_name_fromregion(&name, ®ion); 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(®ion, name_length(&name)); 313 dns_name_fromregion(&name, ®ion); 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