Home | History | Annotate | Line # | Download | only in generic
      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, &region);
     63   1.3  christos 	RETERR(txt_totext(&region, 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(&region, 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