1 /* $NetBSD: kx_36.c,v 1.1 2024/02/18 20:57:46 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 /* RFC2230 */ 17 18 #ifndef RDATA_IN_1_KX_36_C 19 #define RDATA_IN_1_KX_36_C 20 21 #define RRTYPE_KX_ATTRIBUTES (0) 22 23 static isc_result_t 24 fromtext_in_kx(ARGS_FROMTEXT) { 25 isc_token_t token; 26 dns_name_t name; 27 isc_buffer_t buffer; 28 29 REQUIRE(type == dns_rdatatype_kx); 30 REQUIRE(rdclass == dns_rdataclass_in); 31 32 UNUSED(type); 33 UNUSED(rdclass); 34 UNUSED(callbacks); 35 36 RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_number, 37 false)); 38 if (token.value.as_ulong > 0xffffU) { 39 RETTOK(ISC_R_RANGE); 40 } 41 RETERR(uint16_tobuffer(token.value.as_ulong, target)); 42 43 RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_string, 44 false)); 45 dns_name_init(&name, NULL); 46 buffer_fromregion(&buffer, &token.value.as_region); 47 if (origin == NULL) { 48 origin = dns_rootname; 49 } 50 RETTOK(dns_name_fromtext(&name, &buffer, origin, options, target)); 51 return (ISC_R_SUCCESS); 52 } 53 54 static isc_result_t 55 totext_in_kx(ARGS_TOTEXT) { 56 isc_region_t region; 57 dns_name_t name; 58 dns_name_t prefix; 59 bool sub; 60 char buf[sizeof("64000")]; 61 unsigned short num; 62 63 REQUIRE(rdata->type == dns_rdatatype_kx); 64 REQUIRE(rdata->rdclass == dns_rdataclass_in); 65 REQUIRE(rdata->length != 0); 66 67 dns_name_init(&name, NULL); 68 dns_name_init(&prefix, NULL); 69 70 dns_rdata_toregion(rdata, ®ion); 71 num = uint16_fromregion(®ion); 72 isc_region_consume(®ion, 2); 73 snprintf(buf, sizeof(buf), "%u", num); 74 RETERR(str_totext(buf, target)); 75 76 RETERR(str_totext(" ", target)); 77 78 dns_name_fromregion(&name, ®ion); 79 sub = name_prefix(&name, tctx->origin, &prefix); 80 return (dns_name_totext(&prefix, sub, target)); 81 } 82 83 static isc_result_t 84 fromwire_in_kx(ARGS_FROMWIRE) { 85 dns_name_t name; 86 isc_region_t sregion; 87 88 REQUIRE(type == dns_rdatatype_kx); 89 REQUIRE(rdclass == dns_rdataclass_in); 90 91 UNUSED(type); 92 UNUSED(rdclass); 93 94 dns_decompress_setmethods(dctx, DNS_COMPRESS_NONE); 95 96 dns_name_init(&name, NULL); 97 98 isc_buffer_activeregion(source, &sregion); 99 if (sregion.length < 2) { 100 return (ISC_R_UNEXPECTEDEND); 101 } 102 RETERR(mem_tobuffer(target, sregion.base, 2)); 103 isc_buffer_forward(source, 2); 104 return (dns_name_fromwire(&name, source, dctx, options, target)); 105 } 106 107 static isc_result_t 108 towire_in_kx(ARGS_TOWIRE) { 109 dns_name_t name; 110 dns_offsets_t offsets; 111 isc_region_t region; 112 113 REQUIRE(rdata->type == dns_rdatatype_kx); 114 REQUIRE(rdata->rdclass == dns_rdataclass_in); 115 REQUIRE(rdata->length != 0); 116 117 dns_compress_setmethods(cctx, DNS_COMPRESS_NONE); 118 dns_rdata_toregion(rdata, ®ion); 119 RETERR(mem_tobuffer(target, region.base, 2)); 120 isc_region_consume(®ion, 2); 121 122 dns_name_init(&name, offsets); 123 dns_name_fromregion(&name, ®ion); 124 125 return (dns_name_towire(&name, cctx, target)); 126 } 127 128 static int 129 compare_in_kx(ARGS_COMPARE) { 130 dns_name_t name1; 131 dns_name_t name2; 132 isc_region_t region1; 133 isc_region_t region2; 134 int order; 135 136 REQUIRE(rdata1->type == rdata2->type); 137 REQUIRE(rdata1->rdclass == rdata2->rdclass); 138 REQUIRE(rdata1->type == dns_rdatatype_kx); 139 REQUIRE(rdata1->rdclass == dns_rdataclass_in); 140 REQUIRE(rdata1->length != 0); 141 REQUIRE(rdata2->length != 0); 142 143 order = memcmp(rdata1->data, rdata2->data, 2); 144 if (order != 0) { 145 return (order < 0 ? -1 : 1); 146 } 147 148 dns_name_init(&name1, NULL); 149 dns_name_init(&name2, NULL); 150 151 dns_rdata_toregion(rdata1, ®ion1); 152 dns_rdata_toregion(rdata2, ®ion2); 153 154 isc_region_consume(®ion1, 2); 155 isc_region_consume(®ion2, 2); 156 157 dns_name_fromregion(&name1, ®ion1); 158 dns_name_fromregion(&name2, ®ion2); 159 160 return (dns_name_rdatacompare(&name1, &name2)); 161 } 162 163 static isc_result_t 164 fromstruct_in_kx(ARGS_FROMSTRUCT) { 165 dns_rdata_in_kx_t *kx = source; 166 isc_region_t region; 167 168 REQUIRE(type == dns_rdatatype_kx); 169 REQUIRE(rdclass == dns_rdataclass_in); 170 REQUIRE(kx != NULL); 171 REQUIRE(kx->common.rdtype == type); 172 REQUIRE(kx->common.rdclass == rdclass); 173 174 UNUSED(type); 175 UNUSED(rdclass); 176 177 RETERR(uint16_tobuffer(kx->preference, target)); 178 dns_name_toregion(&kx->exchange, ®ion); 179 return (isc_buffer_copyregion(target, ®ion)); 180 } 181 182 static isc_result_t 183 tostruct_in_kx(ARGS_TOSTRUCT) { 184 isc_region_t region; 185 dns_rdata_in_kx_t *kx = target; 186 dns_name_t name; 187 188 REQUIRE(rdata->type == dns_rdatatype_kx); 189 REQUIRE(rdata->rdclass == dns_rdataclass_in); 190 REQUIRE(kx != NULL); 191 REQUIRE(rdata->length != 0); 192 193 kx->common.rdclass = rdata->rdclass; 194 kx->common.rdtype = rdata->type; 195 ISC_LINK_INIT(&kx->common, link); 196 197 dns_name_init(&name, NULL); 198 dns_rdata_toregion(rdata, ®ion); 199 200 kx->preference = uint16_fromregion(®ion); 201 isc_region_consume(®ion, 2); 202 203 dns_name_fromregion(&name, ®ion); 204 dns_name_init(&kx->exchange, NULL); 205 RETERR(name_duporclone(&name, mctx, &kx->exchange)); 206 kx->mctx = mctx; 207 return (ISC_R_SUCCESS); 208 } 209 210 static void 211 freestruct_in_kx(ARGS_FREESTRUCT) { 212 dns_rdata_in_kx_t *kx = source; 213 214 REQUIRE(kx != NULL); 215 REQUIRE(kx->common.rdclass == dns_rdataclass_in); 216 REQUIRE(kx->common.rdtype == dns_rdatatype_kx); 217 218 if (kx->mctx == NULL) { 219 return; 220 } 221 222 dns_name_free(&kx->exchange, kx->mctx); 223 kx->mctx = NULL; 224 } 225 226 static isc_result_t 227 additionaldata_in_kx(ARGS_ADDLDATA) { 228 dns_name_t name; 229 dns_offsets_t offsets; 230 isc_region_t region; 231 232 REQUIRE(rdata->type == dns_rdatatype_kx); 233 REQUIRE(rdata->rdclass == dns_rdataclass_in); 234 235 dns_name_init(&name, offsets); 236 dns_rdata_toregion(rdata, ®ion); 237 isc_region_consume(®ion, 2); 238 dns_name_fromregion(&name, ®ion); 239 240 return ((add)(arg, &name, dns_rdatatype_a)); 241 } 242 243 static isc_result_t 244 digest_in_kx(ARGS_DIGEST) { 245 isc_region_t r1, r2; 246 dns_name_t name; 247 248 REQUIRE(rdata->type == dns_rdatatype_kx); 249 REQUIRE(rdata->rdclass == dns_rdataclass_in); 250 251 dns_rdata_toregion(rdata, &r1); 252 r2 = r1; 253 isc_region_consume(&r2, 2); 254 r1.length = 2; 255 RETERR((digest)(arg, &r1)); 256 dns_name_init(&name, NULL); 257 dns_name_fromregion(&name, &r2); 258 return (dns_name_digest(&name, digest, arg)); 259 } 260 261 static bool 262 checkowner_in_kx(ARGS_CHECKOWNER) { 263 REQUIRE(type == dns_rdatatype_kx); 264 REQUIRE(rdclass == dns_rdataclass_in); 265 266 UNUSED(name); 267 UNUSED(type); 268 UNUSED(rdclass); 269 UNUSED(wildcard); 270 271 return (true); 272 } 273 274 static bool 275 checknames_in_kx(ARGS_CHECKNAMES) { 276 REQUIRE(rdata->type == dns_rdatatype_kx); 277 REQUIRE(rdata->rdclass == dns_rdataclass_in); 278 279 UNUSED(rdata); 280 UNUSED(owner); 281 UNUSED(bad); 282 283 return (true); 284 } 285 286 static int 287 casecompare_in_kx(ARGS_COMPARE) { 288 return (compare_in_kx(rdata1, rdata2)); 289 } 290 291 #endif /* RDATA_IN_1_KX_36_C */ 292