1 /* $NetBSD: cname_5.c,v 1.10 2026/01/29 18:37:52 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_CNAME_5_C 17 #define RDATA_GENERIC_CNAME_5_C 18 19 #define RRTYPE_CNAME_ATTRIBUTES \ 20 (DNS_RDATATYPEATTR_EXCLUSIVE | DNS_RDATATYPEATTR_SINGLETON) 21 22 static isc_result_t 23 fromtext_cname(ARGS_FROMTEXT) { 24 isc_token_t token; 25 dns_name_t name; 26 isc_buffer_t buffer; 27 28 REQUIRE(type == dns_rdatatype_cname); 29 30 UNUSED(type); 31 UNUSED(rdclass); 32 UNUSED(callbacks); 33 34 RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_string, 35 false)); 36 37 dns_name_init(&name, NULL); 38 buffer_fromregion(&buffer, &token.value.as_region); 39 if (origin == NULL) { 40 origin = dns_rootname; 41 } 42 RETTOK(dns_name_fromtext(&name, &buffer, origin, options, target)); 43 return ISC_R_SUCCESS; 44 } 45 46 static isc_result_t 47 totext_cname(ARGS_TOTEXT) { 48 isc_region_t region; 49 dns_name_t name; 50 dns_name_t prefix; 51 unsigned int opts; 52 53 REQUIRE(rdata->type == dns_rdatatype_cname); 54 REQUIRE(rdata->length != 0); 55 56 dns_name_init(&name, NULL); 57 dns_name_init(&prefix, NULL); 58 59 dns_rdata_toregion(rdata, ®ion); 60 dns_name_fromregion(&name, ®ion); 61 62 opts = name_prefix(&name, tctx->origin, &prefix) ? DNS_NAME_OMITFINALDOT 63 : 0; 64 return dns_name_totext(&prefix, opts, target); 65 } 66 67 static isc_result_t 68 fromwire_cname(ARGS_FROMWIRE) { 69 dns_name_t name; 70 71 REQUIRE(type == dns_rdatatype_cname); 72 73 UNUSED(type); 74 UNUSED(rdclass); 75 76 dctx = dns_decompress_setpermitted(dctx, true); 77 78 dns_name_init(&name, NULL); 79 return dns_name_fromwire(&name, source, dctx, target); 80 } 81 82 static isc_result_t 83 towire_cname(ARGS_TOWIRE) { 84 dns_name_t name; 85 dns_offsets_t offsets; 86 isc_region_t region; 87 88 REQUIRE(rdata->type == dns_rdatatype_cname); 89 REQUIRE(rdata->length != 0); 90 91 dns_compress_setpermitted(cctx, true); 92 93 dns_name_init(&name, offsets); 94 dns_rdata_toregion(rdata, ®ion); 95 dns_name_fromregion(&name, ®ion); 96 97 return dns_name_towire(&name, cctx, target, NULL); 98 } 99 100 static int 101 compare_cname(ARGS_COMPARE) { 102 dns_name_t name1; 103 dns_name_t name2; 104 isc_region_t region1; 105 isc_region_t region2; 106 107 REQUIRE(rdata1->type == rdata2->type); 108 REQUIRE(rdata1->rdclass == rdata2->rdclass); 109 REQUIRE(rdata1->type == dns_rdatatype_cname); 110 REQUIRE(rdata1->length != 0); 111 REQUIRE(rdata2->length != 0); 112 113 dns_name_init(&name1, NULL); 114 dns_name_init(&name2, NULL); 115 116 dns_rdata_toregion(rdata1, ®ion1); 117 dns_rdata_toregion(rdata2, ®ion2); 118 119 dns_name_fromregion(&name1, ®ion1); 120 dns_name_fromregion(&name2, ®ion2); 121 122 return dns_name_rdatacompare(&name1, &name2); 123 } 124 125 static isc_result_t 126 fromstruct_cname(ARGS_FROMSTRUCT) { 127 dns_rdata_cname_t *cname = source; 128 isc_region_t region; 129 130 REQUIRE(type == dns_rdatatype_cname); 131 REQUIRE(cname != NULL); 132 REQUIRE(cname->common.rdtype == type); 133 REQUIRE(cname->common.rdclass == rdclass); 134 135 UNUSED(type); 136 UNUSED(rdclass); 137 138 dns_name_toregion(&cname->cname, ®ion); 139 return isc_buffer_copyregion(target, ®ion); 140 } 141 142 static isc_result_t 143 tostruct_cname(ARGS_TOSTRUCT) { 144 isc_region_t region; 145 dns_rdata_cname_t *cname = target; 146 dns_name_t name; 147 148 REQUIRE(rdata->type == dns_rdatatype_cname); 149 REQUIRE(cname != NULL); 150 REQUIRE(rdata->length != 0); 151 152 DNS_RDATACOMMON_INIT(cname, rdata->type, rdata->rdclass); 153 154 dns_name_init(&name, NULL); 155 dns_rdata_toregion(rdata, ®ion); 156 dns_name_fromregion(&name, ®ion); 157 dns_name_init(&cname->cname, NULL); 158 name_duporclone(&name, mctx, &cname->cname); 159 cname->mctx = mctx; 160 return ISC_R_SUCCESS; 161 } 162 163 static void 164 freestruct_cname(ARGS_FREESTRUCT) { 165 dns_rdata_cname_t *cname = source; 166 167 REQUIRE(cname != NULL); 168 169 if (cname->mctx == NULL) { 170 return; 171 } 172 173 dns_name_free(&cname->cname, cname->mctx); 174 cname->mctx = NULL; 175 } 176 177 static isc_result_t 178 additionaldata_cname(ARGS_ADDLDATA) { 179 UNUSED(rdata); 180 UNUSED(owner); 181 UNUSED(add); 182 UNUSED(arg); 183 184 REQUIRE(rdata->type == dns_rdatatype_cname); 185 186 return ISC_R_SUCCESS; 187 } 188 189 static isc_result_t 190 digest_cname(ARGS_DIGEST) { 191 isc_region_t r; 192 dns_name_t name; 193 194 REQUIRE(rdata->type == dns_rdatatype_cname); 195 196 dns_rdata_toregion(rdata, &r); 197 dns_name_init(&name, NULL); 198 dns_name_fromregion(&name, &r); 199 200 return dns_name_digest(&name, digest, arg); 201 } 202 203 static bool 204 checkowner_cname(ARGS_CHECKOWNER) { 205 REQUIRE(type == dns_rdatatype_cname); 206 207 UNUSED(name); 208 UNUSED(type); 209 UNUSED(rdclass); 210 UNUSED(wildcard); 211 212 return true; 213 } 214 215 static bool 216 checknames_cname(ARGS_CHECKNAMES) { 217 REQUIRE(rdata->type == dns_rdatatype_cname); 218 219 UNUSED(rdata); 220 UNUSED(owner); 221 UNUSED(bad); 222 223 return true; 224 } 225 226 static int 227 casecompare_cname(ARGS_COMPARE) { 228 return compare_cname(rdata1, rdata2); 229 } 230 231 #endif /* RDATA_GENERIC_CNAME_5_C */ 232