1 /* $NetBSD: nsap-ptr_23.c,v 1.9 2025/01/26 16:25:35 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 /* RFC1348. Obsoleted in RFC 1706 - use PTR instead. */ 17 18 #ifndef RDATA_IN_1_NSAP_PTR_23_C 19 #define RDATA_IN_1_NSAP_PTR_23_C 20 21 #define RRTYPE_NSAP_PTR_ATTRIBUTES (0) 22 23 static isc_result_t 24 fromtext_in_nsap_ptr(ARGS_FROMTEXT) { 25 isc_token_t token; 26 dns_name_t name; 27 isc_buffer_t buffer; 28 29 REQUIRE(type == dns_rdatatype_nsap_ptr); 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_string, 37 false)); 38 39 dns_name_init(&name, NULL); 40 buffer_fromregion(&buffer, &token.value.as_region); 41 if (origin == NULL) { 42 origin = dns_rootname; 43 } 44 RETTOK(dns_name_fromtext(&name, &buffer, origin, options, target)); 45 return ISC_R_SUCCESS; 46 } 47 48 static isc_result_t 49 totext_in_nsap_ptr(ARGS_TOTEXT) { 50 isc_region_t region; 51 dns_name_t name; 52 dns_name_t prefix; 53 unsigned int opts; 54 55 REQUIRE(rdata->type == dns_rdatatype_nsap_ptr); 56 REQUIRE(rdata->rdclass == dns_rdataclass_in); 57 REQUIRE(rdata->length != 0); 58 59 dns_name_init(&name, NULL); 60 dns_name_init(&prefix, NULL); 61 62 dns_rdata_toregion(rdata, ®ion); 63 dns_name_fromregion(&name, ®ion); 64 65 opts = name_prefix(&name, tctx->origin, &prefix) ? DNS_NAME_OMITFINALDOT 66 : 0; 67 return dns_name_totext(&prefix, opts, target); 68 } 69 70 static isc_result_t 71 fromwire_in_nsap_ptr(ARGS_FROMWIRE) { 72 dns_name_t name; 73 74 REQUIRE(type == dns_rdatatype_nsap_ptr); 75 REQUIRE(rdclass == dns_rdataclass_in); 76 77 UNUSED(type); 78 UNUSED(rdclass); 79 80 dctx = dns_decompress_setpermitted(dctx, false); 81 82 dns_name_init(&name, NULL); 83 return dns_name_fromwire(&name, source, dctx, target); 84 } 85 86 static isc_result_t 87 towire_in_nsap_ptr(ARGS_TOWIRE) { 88 dns_name_t name; 89 dns_offsets_t offsets; 90 isc_region_t region; 91 92 REQUIRE(rdata->type == dns_rdatatype_nsap_ptr); 93 REQUIRE(rdata->rdclass == dns_rdataclass_in); 94 REQUIRE(rdata->length != 0); 95 96 dns_compress_setpermitted(cctx, false); 97 dns_name_init(&name, offsets); 98 dns_rdata_toregion(rdata, ®ion); 99 dns_name_fromregion(&name, ®ion); 100 101 return dns_name_towire(&name, cctx, target, NULL); 102 } 103 104 static int 105 compare_in_nsap_ptr(ARGS_COMPARE) { 106 dns_name_t name1; 107 dns_name_t name2; 108 isc_region_t region1; 109 isc_region_t region2; 110 111 REQUIRE(rdata1->type == rdata2->type); 112 REQUIRE(rdata1->rdclass == rdata2->rdclass); 113 REQUIRE(rdata1->type == dns_rdatatype_nsap_ptr); 114 REQUIRE(rdata1->rdclass == dns_rdataclass_in); 115 REQUIRE(rdata1->length != 0); 116 REQUIRE(rdata2->length != 0); 117 118 dns_name_init(&name1, NULL); 119 dns_name_init(&name2, NULL); 120 121 dns_rdata_toregion(rdata1, ®ion1); 122 dns_rdata_toregion(rdata2, ®ion2); 123 124 dns_name_fromregion(&name1, ®ion1); 125 dns_name_fromregion(&name2, ®ion2); 126 127 return dns_name_rdatacompare(&name1, &name2); 128 } 129 130 static isc_result_t 131 fromstruct_in_nsap_ptr(ARGS_FROMSTRUCT) { 132 dns_rdata_in_nsap_ptr_t *nsap_ptr = source; 133 isc_region_t region; 134 135 REQUIRE(type == dns_rdatatype_nsap_ptr); 136 REQUIRE(rdclass == dns_rdataclass_in); 137 REQUIRE(nsap_ptr != NULL); 138 REQUIRE(nsap_ptr->common.rdtype == type); 139 REQUIRE(nsap_ptr->common.rdclass == rdclass); 140 141 UNUSED(type); 142 UNUSED(rdclass); 143 144 dns_name_toregion(&nsap_ptr->owner, ®ion); 145 return isc_buffer_copyregion(target, ®ion); 146 } 147 148 static isc_result_t 149 tostruct_in_nsap_ptr(ARGS_TOSTRUCT) { 150 isc_region_t region; 151 dns_rdata_in_nsap_ptr_t *nsap_ptr = target; 152 dns_name_t name; 153 154 REQUIRE(rdata->type == dns_rdatatype_nsap_ptr); 155 REQUIRE(rdata->rdclass == dns_rdataclass_in); 156 REQUIRE(nsap_ptr != NULL); 157 REQUIRE(rdata->length != 0); 158 159 nsap_ptr->common.rdclass = rdata->rdclass; 160 nsap_ptr->common.rdtype = rdata->type; 161 ISC_LINK_INIT(&nsap_ptr->common, link); 162 163 dns_name_init(&name, NULL); 164 dns_rdata_toregion(rdata, ®ion); 165 dns_name_fromregion(&name, ®ion); 166 dns_name_init(&nsap_ptr->owner, NULL); 167 name_duporclone(&name, mctx, &nsap_ptr->owner); 168 nsap_ptr->mctx = mctx; 169 return ISC_R_SUCCESS; 170 } 171 172 static void 173 freestruct_in_nsap_ptr(ARGS_FREESTRUCT) { 174 dns_rdata_in_nsap_ptr_t *nsap_ptr = source; 175 176 REQUIRE(nsap_ptr != NULL); 177 REQUIRE(nsap_ptr->common.rdclass == dns_rdataclass_in); 178 REQUIRE(nsap_ptr->common.rdtype == dns_rdatatype_nsap_ptr); 179 180 if (nsap_ptr->mctx == NULL) { 181 return; 182 } 183 184 dns_name_free(&nsap_ptr->owner, nsap_ptr->mctx); 185 nsap_ptr->mctx = NULL; 186 } 187 188 static isc_result_t 189 additionaldata_in_nsap_ptr(ARGS_ADDLDATA) { 190 REQUIRE(rdata->type == dns_rdatatype_nsap_ptr); 191 REQUIRE(rdata->rdclass == dns_rdataclass_in); 192 193 UNUSED(rdata); 194 UNUSED(owner); 195 UNUSED(add); 196 UNUSED(arg); 197 198 return ISC_R_SUCCESS; 199 } 200 201 static isc_result_t 202 digest_in_nsap_ptr(ARGS_DIGEST) { 203 isc_region_t r; 204 dns_name_t name; 205 206 REQUIRE(rdata->type == dns_rdatatype_nsap_ptr); 207 REQUIRE(rdata->rdclass == dns_rdataclass_in); 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 bool 217 checkowner_in_nsap_ptr(ARGS_CHECKOWNER) { 218 REQUIRE(type == dns_rdatatype_nsap_ptr); 219 REQUIRE(rdclass == dns_rdataclass_in); 220 221 UNUSED(name); 222 UNUSED(type); 223 UNUSED(rdclass); 224 UNUSED(wildcard); 225 226 return true; 227 } 228 229 static bool 230 checknames_in_nsap_ptr(ARGS_CHECKNAMES) { 231 REQUIRE(rdata->type == dns_rdatatype_nsap_ptr); 232 REQUIRE(rdata->rdclass == dns_rdataclass_in); 233 234 UNUSED(rdata); 235 UNUSED(owner); 236 UNUSED(bad); 237 238 return true; 239 } 240 241 static int 242 casecompare_in_nsap_ptr(ARGS_COMPARE) { 243 return compare_in_nsap_ptr(rdata1, rdata2); 244 } 245 246 #endif /* RDATA_IN_1_NSAP_PTR_23_C */ 247