Home | History | Annotate | Line # | Download | only in generic
      1 /*	$NetBSD: cname_5.c,v 1.1 2024/02/18 20:57:41 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, &region);
     60 	dns_name_fromregion(&name, &region);
     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, &region);
     95 	dns_name_fromregion(&name, &region);
     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, &region1);
    117 	dns_rdata_toregion(rdata2, &region2);
    118 
    119 	dns_name_fromregion(&name1, &region1);
    120 	dns_name_fromregion(&name2, &region2);
    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, &region);
    139 	return (isc_buffer_copyregion(target, &region));
    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, &region);
    158 	dns_name_fromregion(&name, &region);
    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