1 1.10 christos /* $NetBSD: isdn_20.c,v 1.11 2026/01/29 18:37:52 christos Exp $ */ 2 1.1 christos 3 1.1 christos /* 4 1.1 christos * Copyright (C) Internet Systems Consortium, Inc. ("ISC") 5 1.1 christos * 6 1.7 christos * SPDX-License-Identifier: MPL-2.0 7 1.7 christos * 8 1.1 christos * This Source Code Form is subject to the terms of the Mozilla Public 9 1.1 christos * License, v. 2.0. If a copy of the MPL was not distributed with this 10 1.6 christos * file, you can obtain one at https://mozilla.org/MPL/2.0/. 11 1.1 christos * 12 1.1 christos * See the COPYRIGHT file distributed with this work for additional 13 1.1 christos * information regarding copyright ownership. 14 1.1 christos */ 15 1.1 christos 16 1.1 christos /* RFC1183 */ 17 1.1 christos 18 1.1 christos #ifndef RDATA_GENERIC_ISDN_20_C 19 1.1 christos #define RDATA_GENERIC_ISDN_20_C 20 1.1 christos 21 1.1 christos #define RRTYPE_ISDN_ATTRIBUTES (0) 22 1.1 christos 23 1.7 christos static isc_result_t 24 1.1 christos fromtext_isdn(ARGS_FROMTEXT) { 25 1.1 christos isc_token_t token; 26 1.1 christos 27 1.1 christos REQUIRE(type == dns_rdatatype_isdn); 28 1.1 christos 29 1.1 christos UNUSED(type); 30 1.1 christos UNUSED(rdclass); 31 1.1 christos UNUSED(origin); 32 1.1 christos UNUSED(options); 33 1.1 christos UNUSED(callbacks); 34 1.1 christos 35 1.1 christos /* ISDN-address */ 36 1.1 christos RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_qstring, 37 1.3 christos false)); 38 1.1 christos RETTOK(txt_fromtext(&token.value.as_textregion, target)); 39 1.1 christos 40 1.1 christos /* sa: optional */ 41 1.1 christos RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_qstring, 42 1.3 christos true)); 43 1.1 christos if (token.type != isc_tokentype_string && 44 1.8 christos token.type != isc_tokentype_qstring) 45 1.8 christos { 46 1.1 christos isc_lex_ungettoken(lexer, &token); 47 1.10 christos return ISC_R_SUCCESS; 48 1.1 christos } 49 1.1 christos RETTOK(txt_fromtext(&token.value.as_textregion, target)); 50 1.10 christos return ISC_R_SUCCESS; 51 1.1 christos } 52 1.1 christos 53 1.7 christos static isc_result_t 54 1.1 christos totext_isdn(ARGS_TOTEXT) { 55 1.1 christos isc_region_t region; 56 1.1 christos 57 1.1 christos REQUIRE(rdata->type == dns_rdatatype_isdn); 58 1.1 christos REQUIRE(rdata->length != 0); 59 1.1 christos 60 1.1 christos UNUSED(tctx); 61 1.1 christos 62 1.1 christos dns_rdata_toregion(rdata, ®ion); 63 1.3 christos RETERR(txt_totext(®ion, true, target)); 64 1.5 christos if (region.length == 0) { 65 1.10 christos return ISC_R_SUCCESS; 66 1.5 christos } 67 1.1 christos RETERR(str_totext(" ", target)); 68 1.10 christos return txt_totext(®ion, true, target); 69 1.1 christos } 70 1.1 christos 71 1.7 christos static isc_result_t 72 1.1 christos fromwire_isdn(ARGS_FROMWIRE) { 73 1.1 christos REQUIRE(type == dns_rdatatype_isdn); 74 1.1 christos 75 1.1 christos UNUSED(type); 76 1.1 christos UNUSED(dctx); 77 1.1 christos UNUSED(rdclass); 78 1.1 christos 79 1.1 christos RETERR(txt_fromwire(source, target)); 80 1.5 christos if (buffer_empty(source)) { 81 1.10 christos return ISC_R_SUCCESS; 82 1.5 christos } 83 1.10 christos return txt_fromwire(source, target); 84 1.1 christos } 85 1.1 christos 86 1.7 christos static isc_result_t 87 1.1 christos towire_isdn(ARGS_TOWIRE) { 88 1.1 christos UNUSED(cctx); 89 1.1 christos 90 1.1 christos REQUIRE(rdata->type == dns_rdatatype_isdn); 91 1.1 christos REQUIRE(rdata->length != 0); 92 1.1 christos 93 1.10 christos return mem_tobuffer(target, rdata->data, rdata->length); 94 1.1 christos } 95 1.1 christos 96 1.7 christos static int 97 1.1 christos compare_isdn(ARGS_COMPARE) { 98 1.1 christos isc_region_t r1; 99 1.1 christos isc_region_t r2; 100 1.1 christos 101 1.1 christos REQUIRE(rdata1->type == rdata2->type); 102 1.1 christos REQUIRE(rdata1->rdclass == rdata2->rdclass); 103 1.1 christos REQUIRE(rdata1->type == dns_rdatatype_isdn); 104 1.1 christos REQUIRE(rdata1->length != 0); 105 1.1 christos REQUIRE(rdata2->length != 0); 106 1.1 christos 107 1.1 christos dns_rdata_toregion(rdata1, &r1); 108 1.1 christos dns_rdata_toregion(rdata2, &r2); 109 1.10 christos return isc_region_compare(&r1, &r2); 110 1.1 christos } 111 1.1 christos 112 1.7 christos static isc_result_t 113 1.1 christos fromstruct_isdn(ARGS_FROMSTRUCT) { 114 1.1 christos dns_rdata_isdn_t *isdn = source; 115 1.1 christos 116 1.1 christos REQUIRE(type == dns_rdatatype_isdn); 117 1.4 christos REQUIRE(isdn != NULL); 118 1.1 christos REQUIRE(isdn->common.rdtype == type); 119 1.1 christos REQUIRE(isdn->common.rdclass == rdclass); 120 1.1 christos 121 1.1 christos UNUSED(type); 122 1.1 christos UNUSED(rdclass); 123 1.1 christos 124 1.1 christos RETERR(uint8_tobuffer(isdn->isdn_len, target)); 125 1.1 christos RETERR(mem_tobuffer(target, isdn->isdn, isdn->isdn_len)); 126 1.5 christos if (isdn->subaddress == NULL) { 127 1.10 christos return ISC_R_SUCCESS; 128 1.5 christos } 129 1.1 christos RETERR(uint8_tobuffer(isdn->subaddress_len, target)); 130 1.10 christos return mem_tobuffer(target, isdn->subaddress, isdn->subaddress_len); 131 1.1 christos } 132 1.1 christos 133 1.7 christos static isc_result_t 134 1.1 christos tostruct_isdn(ARGS_TOSTRUCT) { 135 1.1 christos dns_rdata_isdn_t *isdn = target; 136 1.1 christos isc_region_t r; 137 1.1 christos 138 1.1 christos REQUIRE(rdata->type == dns_rdatatype_isdn); 139 1.4 christos REQUIRE(isdn != NULL); 140 1.1 christos REQUIRE(rdata->length != 0); 141 1.1 christos 142 1.11 christos DNS_RDATACOMMON_INIT(isdn, rdata->type, rdata->rdclass); 143 1.1 christos 144 1.1 christos dns_rdata_toregion(rdata, &r); 145 1.1 christos 146 1.1 christos isdn->isdn_len = uint8_fromregion(&r); 147 1.1 christos isc_region_consume(&r, 1); 148 1.1 christos isdn->isdn = mem_maybedup(mctx, r.base, isdn->isdn_len); 149 1.1 christos isc_region_consume(&r, isdn->isdn_len); 150 1.1 christos 151 1.1 christos if (r.length == 0) { 152 1.1 christos isdn->subaddress_len = 0; 153 1.1 christos isdn->subaddress = NULL; 154 1.1 christos } else { 155 1.1 christos isdn->subaddress_len = uint8_fromregion(&r); 156 1.1 christos isc_region_consume(&r, 1); 157 1.1 christos isdn->subaddress = mem_maybedup(mctx, r.base, 158 1.1 christos isdn->subaddress_len); 159 1.1 christos } 160 1.1 christos 161 1.1 christos isdn->mctx = mctx; 162 1.10 christos return ISC_R_SUCCESS; 163 1.1 christos } 164 1.1 christos 165 1.7 christos static void 166 1.1 christos freestruct_isdn(ARGS_FREESTRUCT) { 167 1.1 christos dns_rdata_isdn_t *isdn = source; 168 1.1 christos 169 1.4 christos REQUIRE(isdn != NULL); 170 1.1 christos 171 1.5 christos if (isdn->mctx == NULL) { 172 1.1 christos return; 173 1.5 christos } 174 1.1 christos 175 1.5 christos if (isdn->isdn != NULL) { 176 1.1 christos isc_mem_free(isdn->mctx, isdn->isdn); 177 1.5 christos } 178 1.5 christos if (isdn->subaddress != NULL) { 179 1.1 christos isc_mem_free(isdn->mctx, isdn->subaddress); 180 1.5 christos } 181 1.1 christos isdn->mctx = NULL; 182 1.1 christos } 183 1.1 christos 184 1.7 christos static isc_result_t 185 1.1 christos additionaldata_isdn(ARGS_ADDLDATA) { 186 1.1 christos REQUIRE(rdata->type == dns_rdatatype_isdn); 187 1.1 christos 188 1.1 christos UNUSED(rdata); 189 1.9 christos UNUSED(owner); 190 1.1 christos UNUSED(add); 191 1.1 christos UNUSED(arg); 192 1.1 christos 193 1.10 christos return ISC_R_SUCCESS; 194 1.1 christos } 195 1.1 christos 196 1.7 christos static isc_result_t 197 1.1 christos digest_isdn(ARGS_DIGEST) { 198 1.1 christos isc_region_t r; 199 1.1 christos 200 1.1 christos REQUIRE(rdata->type == dns_rdatatype_isdn); 201 1.1 christos 202 1.1 christos dns_rdata_toregion(rdata, &r); 203 1.1 christos 204 1.10 christos return (digest)(arg, &r); 205 1.1 christos } 206 1.1 christos 207 1.7 christos static bool 208 1.1 christos checkowner_isdn(ARGS_CHECKOWNER) { 209 1.1 christos REQUIRE(type == dns_rdatatype_isdn); 210 1.1 christos 211 1.1 christos UNUSED(name); 212 1.1 christos UNUSED(type); 213 1.1 christos UNUSED(rdclass); 214 1.1 christos UNUSED(wildcard); 215 1.1 christos 216 1.10 christos return true; 217 1.1 christos } 218 1.1 christos 219 1.7 christos static bool 220 1.1 christos checknames_isdn(ARGS_CHECKNAMES) { 221 1.1 christos REQUIRE(rdata->type == dns_rdatatype_isdn); 222 1.1 christos 223 1.1 christos UNUSED(rdata); 224 1.1 christos UNUSED(owner); 225 1.1 christos UNUSED(bad); 226 1.1 christos 227 1.10 christos return true; 228 1.1 christos } 229 1.1 christos 230 1.7 christos static int 231 1.1 christos casecompare_isdn(ARGS_COMPARE) { 232 1.10 christos return compare_isdn(rdata1, rdata2); 233 1.1 christos } 234 1.1 christos 235 1.5 christos #endif /* RDATA_GENERIC_ISDN_20_C */ 236