Home | History | Annotate | Line # | Download | only in generic
      1 /*	$NetBSD: ns_2.c,v 1.1 2024/02/18 20:57:43 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_NS_2_C
     17 #define RDATA_GENERIC_NS_2_C
     18 
     19 #define RRTYPE_NS_ATTRIBUTES (DNS_RDATATYPEATTR_ZONECUTAUTH)
     20 
     21 static isc_result_t
     22 fromtext_ns(ARGS_FROMTEXT) {
     23 	isc_token_t token;
     24 	dns_name_t name;
     25 	isc_buffer_t buffer;
     26 	bool ok;
     27 
     28 	REQUIRE(type == dns_rdatatype_ns);
     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 	ok = true;
     44 	if ((options & DNS_RDATA_CHECKNAMES) != 0) {
     45 		ok = dns_name_ishostname(&name, false);
     46 	}
     47 	if (!ok && (options & DNS_RDATA_CHECKNAMESFAIL) != 0) {
     48 		RETTOK(DNS_R_BADNAME);
     49 	}
     50 	if (!ok && callbacks != NULL) {
     51 		warn_badname(&name, lexer, callbacks);
     52 	}
     53 	return (ISC_R_SUCCESS);
     54 }
     55 
     56 static isc_result_t
     57 totext_ns(ARGS_TOTEXT) {
     58 	isc_region_t region;
     59 	dns_name_t name;
     60 	dns_name_t prefix;
     61 	bool sub;
     62 
     63 	REQUIRE(rdata->type == dns_rdatatype_ns);
     64 	REQUIRE(rdata->length != 0);
     65 
     66 	dns_name_init(&name, NULL);
     67 	dns_name_init(&prefix, NULL);
     68 
     69 	dns_rdata_toregion(rdata, &region);
     70 	dns_name_fromregion(&name, &region);
     71 
     72 	sub = name_prefix(&name, tctx->origin, &prefix);
     73 
     74 	return (dns_name_totext(&prefix, sub, target));
     75 }
     76 
     77 static isc_result_t
     78 fromwire_ns(ARGS_FROMWIRE) {
     79 	dns_name_t name;
     80 
     81 	REQUIRE(type == dns_rdatatype_ns);
     82 
     83 	UNUSED(type);
     84 	UNUSED(rdclass);
     85 
     86 	dns_decompress_setmethods(dctx, DNS_COMPRESS_GLOBAL14);
     87 
     88 	dns_name_init(&name, NULL);
     89 	return (dns_name_fromwire(&name, source, dctx, options, target));
     90 }
     91 
     92 static isc_result_t
     93 towire_ns(ARGS_TOWIRE) {
     94 	dns_name_t name;
     95 	dns_offsets_t offsets;
     96 	isc_region_t region;
     97 
     98 	REQUIRE(rdata->type == dns_rdatatype_ns);
     99 	REQUIRE(rdata->length != 0);
    100 
    101 	dns_compress_setmethods(cctx, DNS_COMPRESS_GLOBAL14);
    102 
    103 	dns_name_init(&name, offsets);
    104 	dns_rdata_toregion(rdata, &region);
    105 	dns_name_fromregion(&name, &region);
    106 
    107 	return (dns_name_towire(&name, cctx, target));
    108 }
    109 
    110 static int
    111 compare_ns(ARGS_COMPARE) {
    112 	dns_name_t name1;
    113 	dns_name_t name2;
    114 	isc_region_t region1;
    115 	isc_region_t region2;
    116 
    117 	REQUIRE(rdata1->type == rdata2->type);
    118 	REQUIRE(rdata1->rdclass == rdata2->rdclass);
    119 	REQUIRE(rdata1->type == dns_rdatatype_ns);
    120 	REQUIRE(rdata1->length != 0);
    121 	REQUIRE(rdata2->length != 0);
    122 
    123 	dns_name_init(&name1, NULL);
    124 	dns_name_init(&name2, NULL);
    125 
    126 	dns_rdata_toregion(rdata1, &region1);
    127 	dns_rdata_toregion(rdata2, &region2);
    128 
    129 	dns_name_fromregion(&name1, &region1);
    130 	dns_name_fromregion(&name2, &region2);
    131 
    132 	return (dns_name_rdatacompare(&name1, &name2));
    133 }
    134 
    135 static isc_result_t
    136 fromstruct_ns(ARGS_FROMSTRUCT) {
    137 	dns_rdata_ns_t *ns = source;
    138 	isc_region_t region;
    139 
    140 	REQUIRE(type == dns_rdatatype_ns);
    141 	REQUIRE(ns != NULL);
    142 	REQUIRE(ns->common.rdtype == type);
    143 	REQUIRE(ns->common.rdclass == rdclass);
    144 
    145 	UNUSED(type);
    146 	UNUSED(rdclass);
    147 
    148 	dns_name_toregion(&ns->name, &region);
    149 	return (isc_buffer_copyregion(target, &region));
    150 }
    151 
    152 static isc_result_t
    153 tostruct_ns(ARGS_TOSTRUCT) {
    154 	isc_region_t region;
    155 	dns_rdata_ns_t *ns = target;
    156 	dns_name_t name;
    157 
    158 	REQUIRE(rdata->type == dns_rdatatype_ns);
    159 	REQUIRE(ns != NULL);
    160 	REQUIRE(rdata->length != 0);
    161 
    162 	ns->common.rdclass = rdata->rdclass;
    163 	ns->common.rdtype = rdata->type;
    164 	ISC_LINK_INIT(&ns->common, link);
    165 
    166 	dns_name_init(&name, NULL);
    167 	dns_rdata_toregion(rdata, &region);
    168 	dns_name_fromregion(&name, &region);
    169 	dns_name_init(&ns->name, NULL);
    170 	RETERR(name_duporclone(&name, mctx, &ns->name));
    171 	ns->mctx = mctx;
    172 	return (ISC_R_SUCCESS);
    173 }
    174 
    175 static void
    176 freestruct_ns(ARGS_FREESTRUCT) {
    177 	dns_rdata_ns_t *ns = source;
    178 
    179 	REQUIRE(ns != NULL);
    180 
    181 	if (ns->mctx == NULL) {
    182 		return;
    183 	}
    184 
    185 	dns_name_free(&ns->name, ns->mctx);
    186 	ns->mctx = NULL;
    187 }
    188 
    189 static isc_result_t
    190 additionaldata_ns(ARGS_ADDLDATA) {
    191 	dns_name_t name;
    192 	dns_offsets_t offsets;
    193 	isc_region_t region;
    194 
    195 	REQUIRE(rdata->type == dns_rdatatype_ns);
    196 
    197 	dns_name_init(&name, offsets);
    198 	dns_rdata_toregion(rdata, &region);
    199 	dns_name_fromregion(&name, &region);
    200 
    201 	return ((add)(arg, &name, dns_rdatatype_a));
    202 }
    203 
    204 static isc_result_t
    205 digest_ns(ARGS_DIGEST) {
    206 	isc_region_t r;
    207 	dns_name_t name;
    208 
    209 	REQUIRE(rdata->type == dns_rdatatype_ns);
    210 
    211 	dns_rdata_toregion(rdata, &r);
    212 	dns_name_init(&name, NULL);
    213 	dns_name_fromregion(&name, &r);
    214 
    215 	return (dns_name_digest(&name, digest, arg));
    216 }
    217 
    218 static bool
    219 checkowner_ns(ARGS_CHECKOWNER) {
    220 	REQUIRE(type == dns_rdatatype_ns);
    221 
    222 	UNUSED(name);
    223 	UNUSED(type);
    224 	UNUSED(rdclass);
    225 	UNUSED(wildcard);
    226 
    227 	return (true);
    228 }
    229 
    230 static bool
    231 checknames_ns(ARGS_CHECKNAMES) {
    232 	isc_region_t region;
    233 	dns_name_t name;
    234 
    235 	REQUIRE(rdata->type == dns_rdatatype_ns);
    236 
    237 	UNUSED(owner);
    238 
    239 	dns_rdata_toregion(rdata, &region);
    240 	dns_name_init(&name, NULL);
    241 	dns_name_fromregion(&name, &region);
    242 	if (!dns_name_ishostname(&name, false)) {
    243 		if (bad != NULL) {
    244 			dns_name_clone(&name, bad);
    245 		}
    246 		return (false);
    247 	}
    248 	return (true);
    249 }
    250 
    251 static int
    252 casecompare_ns(ARGS_COMPARE) {
    253 	return (compare_ns(rdata1, rdata2));
    254 }
    255 
    256 #endif /* RDATA_GENERIC_NS_2_C */
    257