1 /* $NetBSD: ns_2.c,v 1.5 2020/05/24 19:46:24 christos Exp $ */ 2 3 /* 4 * Copyright (C) Internet Systems Consortium, Inc. ("ISC") 5 * 6 * This Source Code Form is subject to the terms of the Mozilla Public 7 * License, v. 2.0. If a copy of the MPL was not distributed with this 8 * file, You can obtain one at http://mozilla.org/MPL/2.0/. 9 * 10 * See the COPYRIGHT file distributed with this work for additional 11 * information regarding copyright ownership. 12 */ 13 14 #ifndef RDATA_GENERIC_NS_2_C 15 #define RDATA_GENERIC_NS_2_C 16 17 #define RRTYPE_NS_ATTRIBUTES (DNS_RDATATYPEATTR_ZONECUTAUTH) 18 19 static inline isc_result_t 20 fromtext_ns(ARGS_FROMTEXT) { 21 isc_token_t token; 22 dns_name_t name; 23 isc_buffer_t buffer; 24 bool ok; 25 26 REQUIRE(type == dns_rdatatype_ns); 27 28 UNUSED(type); 29 UNUSED(rdclass); 30 UNUSED(callbacks); 31 32 RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_string, 33 false)); 34 35 dns_name_init(&name, NULL); 36 buffer_fromregion(&buffer, &token.value.as_region); 37 if (origin == NULL) { 38 origin = dns_rootname; 39 } 40 RETTOK(dns_name_fromtext(&name, &buffer, origin, options, target)); 41 ok = true; 42 if ((options & DNS_RDATA_CHECKNAMES) != 0) { 43 ok = dns_name_ishostname(&name, false); 44 } 45 if (!ok && (options & DNS_RDATA_CHECKNAMESFAIL) != 0) { 46 RETTOK(DNS_R_BADNAME); 47 } 48 if (!ok && callbacks != NULL) { 49 warn_badname(&name, lexer, callbacks); 50 } 51 return (ISC_R_SUCCESS); 52 } 53 54 static inline isc_result_t 55 totext_ns(ARGS_TOTEXT) { 56 isc_region_t region; 57 dns_name_t name; 58 dns_name_t prefix; 59 bool sub; 60 61 REQUIRE(rdata->type == dns_rdatatype_ns); 62 REQUIRE(rdata->length != 0); 63 64 dns_name_init(&name, NULL); 65 dns_name_init(&prefix, NULL); 66 67 dns_rdata_toregion(rdata, ®ion); 68 dns_name_fromregion(&name, ®ion); 69 70 sub = name_prefix(&name, tctx->origin, &prefix); 71 72 return (dns_name_totext(&prefix, sub, target)); 73 } 74 75 static inline isc_result_t 76 fromwire_ns(ARGS_FROMWIRE) { 77 dns_name_t name; 78 79 REQUIRE(type == dns_rdatatype_ns); 80 81 UNUSED(type); 82 UNUSED(rdclass); 83 84 dns_decompress_setmethods(dctx, DNS_COMPRESS_GLOBAL14); 85 86 dns_name_init(&name, NULL); 87 return (dns_name_fromwire(&name, source, dctx, options, target)); 88 } 89 90 static inline isc_result_t 91 towire_ns(ARGS_TOWIRE) { 92 dns_name_t name; 93 dns_offsets_t offsets; 94 isc_region_t region; 95 96 REQUIRE(rdata->type == dns_rdatatype_ns); 97 REQUIRE(rdata->length != 0); 98 99 dns_compress_setmethods(cctx, DNS_COMPRESS_GLOBAL14); 100 101 dns_name_init(&name, offsets); 102 dns_rdata_toregion(rdata, ®ion); 103 dns_name_fromregion(&name, ®ion); 104 105 return (dns_name_towire(&name, cctx, target)); 106 } 107 108 static inline int 109 compare_ns(ARGS_COMPARE) { 110 dns_name_t name1; 111 dns_name_t name2; 112 isc_region_t region1; 113 isc_region_t region2; 114 115 REQUIRE(rdata1->type == rdata2->type); 116 REQUIRE(rdata1->rdclass == rdata2->rdclass); 117 REQUIRE(rdata1->type == dns_rdatatype_ns); 118 REQUIRE(rdata1->length != 0); 119 REQUIRE(rdata2->length != 0); 120 121 dns_name_init(&name1, NULL); 122 dns_name_init(&name2, NULL); 123 124 dns_rdata_toregion(rdata1, ®ion1); 125 dns_rdata_toregion(rdata2, ®ion2); 126 127 dns_name_fromregion(&name1, ®ion1); 128 dns_name_fromregion(&name2, ®ion2); 129 130 return (dns_name_rdatacompare(&name1, &name2)); 131 } 132 133 static inline isc_result_t 134 fromstruct_ns(ARGS_FROMSTRUCT) { 135 dns_rdata_ns_t *ns = source; 136 isc_region_t region; 137 138 REQUIRE(type == dns_rdatatype_ns); 139 REQUIRE(ns != NULL); 140 REQUIRE(ns->common.rdtype == type); 141 REQUIRE(ns->common.rdclass == rdclass); 142 143 UNUSED(type); 144 UNUSED(rdclass); 145 146 dns_name_toregion(&ns->name, ®ion); 147 return (isc_buffer_copyregion(target, ®ion)); 148 } 149 150 static inline isc_result_t 151 tostruct_ns(ARGS_TOSTRUCT) { 152 isc_region_t region; 153 dns_rdata_ns_t *ns = target; 154 dns_name_t name; 155 156 REQUIRE(rdata->type == dns_rdatatype_ns); 157 REQUIRE(ns != NULL); 158 REQUIRE(rdata->length != 0); 159 160 ns->common.rdclass = rdata->rdclass; 161 ns->common.rdtype = rdata->type; 162 ISC_LINK_INIT(&ns->common, link); 163 164 dns_name_init(&name, NULL); 165 dns_rdata_toregion(rdata, ®ion); 166 dns_name_fromregion(&name, ®ion); 167 dns_name_init(&ns->name, NULL); 168 RETERR(name_duporclone(&name, mctx, &ns->name)); 169 ns->mctx = mctx; 170 return (ISC_R_SUCCESS); 171 } 172 173 static inline void 174 freestruct_ns(ARGS_FREESTRUCT) { 175 dns_rdata_ns_t *ns = source; 176 177 REQUIRE(ns != NULL); 178 179 if (ns->mctx == NULL) { 180 return; 181 } 182 183 dns_name_free(&ns->name, ns->mctx); 184 ns->mctx = NULL; 185 } 186 187 static inline isc_result_t 188 additionaldata_ns(ARGS_ADDLDATA) { 189 dns_name_t name; 190 dns_offsets_t offsets; 191 isc_region_t region; 192 193 REQUIRE(rdata->type == dns_rdatatype_ns); 194 195 dns_name_init(&name, offsets); 196 dns_rdata_toregion(rdata, ®ion); 197 dns_name_fromregion(&name, ®ion); 198 199 return ((add)(arg, &name, dns_rdatatype_a)); 200 } 201 202 static inline isc_result_t 203 digest_ns(ARGS_DIGEST) { 204 isc_region_t r; 205 dns_name_t name; 206 207 REQUIRE(rdata->type == dns_rdatatype_ns); 208 209 dns_rdata_toregion(rdata, &r); 210 dns_name_init(&name, NULL); 211 dns_name_fromregion(&name, &r); 212 213 return (dns_name_digest(&name, digest, arg)); 214 } 215 216 static inline bool 217 checkowner_ns(ARGS_CHECKOWNER) { 218 REQUIRE(type == dns_rdatatype_ns); 219 220 UNUSED(name); 221 UNUSED(type); 222 UNUSED(rdclass); 223 UNUSED(wildcard); 224 225 return (true); 226 } 227 228 static inline bool 229 checknames_ns(ARGS_CHECKNAMES) { 230 isc_region_t region; 231 dns_name_t name; 232 233 REQUIRE(rdata->type == dns_rdatatype_ns); 234 235 UNUSED(owner); 236 237 dns_rdata_toregion(rdata, ®ion); 238 dns_name_init(&name, NULL); 239 dns_name_fromregion(&name, ®ion); 240 if (!dns_name_ishostname(&name, false)) { 241 if (bad != NULL) { 242 dns_name_clone(&name, bad); 243 } 244 return (false); 245 } 246 return (true); 247 } 248 249 static inline int 250 casecompare_ns(ARGS_COMPARE) { 251 return (compare_ns(rdata1, rdata2)); 252 } 253 254 #endif /* RDATA_GENERIC_NS_2_C */ 255