1 /* $NetBSD: cname_5.c,v 1.7 2022/09/23 12:15:31 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 bool sub; 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 sub = name_prefix(&name, tctx->origin, &prefix); 63 64 return (dns_name_totext(&prefix, sub, 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 dns_decompress_setmethods(dctx, DNS_COMPRESS_GLOBAL14); 77 78 dns_name_init(&name, NULL); 79 return (dns_name_fromwire(&name, source, dctx, options, 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_setmethods(cctx, DNS_COMPRESS_GLOBAL14); 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)); 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 cname->common.rdclass = rdata->rdclass; 153 cname->common.rdtype = rdata->type; 154 ISC_LINK_INIT(&cname->common, link); 155 156 dns_name_init(&name, NULL); 157 dns_rdata_toregion(rdata, ®ion); 158 dns_name_fromregion(&name, ®ion); 159 dns_name_init(&cname->cname, NULL); 160 RETERR(name_duporclone(&name, mctx, &cname->cname)); 161 cname->mctx = mctx; 162 return (ISC_R_SUCCESS); 163 } 164 165 static void 166 freestruct_cname(ARGS_FREESTRUCT) { 167 dns_rdata_cname_t *cname = source; 168 169 REQUIRE(cname != NULL); 170 171 if (cname->mctx == NULL) { 172 return; 173 } 174 175 dns_name_free(&cname->cname, cname->mctx); 176 cname->mctx = NULL; 177 } 178 179 static isc_result_t 180 additionaldata_cname(ARGS_ADDLDATA) { 181 UNUSED(rdata); 182 UNUSED(add); 183 UNUSED(arg); 184 185 REQUIRE(rdata->type == dns_rdatatype_cname); 186 187 return (ISC_R_SUCCESS); 188 } 189 190 static isc_result_t 191 digest_cname(ARGS_DIGEST) { 192 isc_region_t r; 193 dns_name_t name; 194 195 REQUIRE(rdata->type == dns_rdatatype_cname); 196 197 dns_rdata_toregion(rdata, &r); 198 dns_name_init(&name, NULL); 199 dns_name_fromregion(&name, &r); 200 201 return (dns_name_digest(&name, digest, arg)); 202 } 203 204 static bool 205 checkowner_cname(ARGS_CHECKOWNER) { 206 REQUIRE(type == dns_rdatatype_cname); 207 208 UNUSED(name); 209 UNUSED(type); 210 UNUSED(rdclass); 211 UNUSED(wildcard); 212 213 return (true); 214 } 215 216 static bool 217 checknames_cname(ARGS_CHECKNAMES) { 218 REQUIRE(rdata->type == dns_rdatatype_cname); 219 220 UNUSED(rdata); 221 UNUSED(owner); 222 UNUSED(bad); 223 224 return (true); 225 } 226 227 static int 228 casecompare_cname(ARGS_COMPARE) { 229 return (compare_cname(rdata1, rdata2)); 230 } 231 232 #endif /* RDATA_GENERIC_CNAME_5_C */ 233