1135446Strhodes/* 2254402Serwin * Copyright (C) 2004, 2005, 2007, 2009, 2013 Internet Systems Consortium, Inc. ("ISC") 3135446Strhodes * Copyright (C) 1999-2002 Internet Software Consortium. 4135446Strhodes * 5193149Sdougb * Permission to use, copy, modify, and/or distribute this software for any 6135446Strhodes * purpose with or without fee is hereby granted, provided that the above 7135446Strhodes * copyright notice and this permission notice appear in all copies. 8135446Strhodes * 9135446Strhodes * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH 10135446Strhodes * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 11135446Strhodes * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, 12135446Strhodes * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM 13135446Strhodes * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE 14135446Strhodes * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 15135446Strhodes * PERFORMANCE OF THIS SOFTWARE. 16135446Strhodes */ 17135446Strhodes 18234010Sdougb/* $Id: nsap_22.c,v 1.44 2009/12/04 22:06:37 tbox Exp $ */ 19135446Strhodes 20135446Strhodes/* Reviewed: Fri Mar 17 10:41:07 PST 2000 by gson */ 21135446Strhodes 22170222Sdougb/* RFC1706 */ 23135446Strhodes 24135446Strhodes#ifndef RDATA_IN_1_NSAP_22_C 25135446Strhodes#define RDATA_IN_1_NSAP_22_C 26135446Strhodes 27135446Strhodes#define RRTYPE_NSAP_ATTRIBUTES (0) 28135446Strhodes 29135446Strhodesstatic inline isc_result_t 30135446Strhodesfromtext_in_nsap(ARGS_FROMTEXT) { 31135446Strhodes isc_token_t token; 32135446Strhodes isc_textregion_t *sr; 33135446Strhodes int n; 34135446Strhodes int digits; 35135446Strhodes unsigned char c = 0; 36135446Strhodes 37135446Strhodes REQUIRE(type == 22); 38135446Strhodes REQUIRE(rdclass == 1); 39135446Strhodes 40135446Strhodes UNUSED(type); 41135446Strhodes UNUSED(origin); 42135446Strhodes UNUSED(options); 43135446Strhodes UNUSED(rdclass); 44135446Strhodes UNUSED(callbacks); 45135446Strhodes 46135446Strhodes /* 0x<hex.string.with.periods> */ 47135446Strhodes RETERR(isc_lex_getmastertoken(lexer, &token, isc_tokentype_string, 48135446Strhodes ISC_FALSE)); 49135446Strhodes sr = &token.value.as_textregion; 50135446Strhodes if (sr->length < 2) 51135446Strhodes RETTOK(ISC_R_UNEXPECTEDEND); 52135446Strhodes if (sr->base[0] != '0' || (sr->base[1] != 'x' && sr->base[1] != 'X')) 53135446Strhodes RETTOK(DNS_R_SYNTAX); 54135446Strhodes isc_textregion_consume(sr, 2); 55135446Strhodes digits = 0; 56135446Strhodes while (sr->length > 0) { 57135446Strhodes if (sr->base[0] == '.') { 58135446Strhodes isc_textregion_consume(sr, 1); 59135446Strhodes continue; 60135446Strhodes } 61135446Strhodes if ((n = hexvalue(sr->base[0])) == -1) 62135446Strhodes RETTOK(DNS_R_SYNTAX); 63135446Strhodes c <<= 4; 64135446Strhodes c += n; 65135446Strhodes if (++digits == 2) { 66135446Strhodes RETERR(mem_tobuffer(target, &c, 1)); 67135446Strhodes digits = 0; 68135446Strhodes } 69135446Strhodes isc_textregion_consume(sr, 1); 70135446Strhodes } 71135446Strhodes if (digits) 72135446Strhodes RETTOK(ISC_R_UNEXPECTEDEND); 73135446Strhodes return (ISC_R_SUCCESS); 74135446Strhodes} 75135446Strhodes 76135446Strhodesstatic inline isc_result_t 77135446Strhodestotext_in_nsap(ARGS_TOTEXT) { 78135446Strhodes isc_region_t region; 79135446Strhodes char buf[sizeof("xx")]; 80135446Strhodes 81135446Strhodes REQUIRE(rdata->type == 22); 82135446Strhodes REQUIRE(rdata->rdclass == 1); 83135446Strhodes REQUIRE(rdata->length != 0); 84135446Strhodes 85135446Strhodes UNUSED(tctx); 86135446Strhodes 87135446Strhodes dns_rdata_toregion(rdata, ®ion); 88135446Strhodes RETERR(str_totext("0x", target)); 89135446Strhodes while (region.length != 0) { 90135446Strhodes sprintf(buf, "%02x", region.base[0]); 91135446Strhodes isc_region_consume(®ion, 1); 92135446Strhodes RETERR(str_totext(buf, target)); 93135446Strhodes } 94135446Strhodes return (ISC_R_SUCCESS); 95135446Strhodes} 96135446Strhodes 97135446Strhodesstatic inline isc_result_t 98135446Strhodesfromwire_in_nsap(ARGS_FROMWIRE) { 99135446Strhodes isc_region_t region; 100135446Strhodes 101135446Strhodes REQUIRE(type == 22); 102135446Strhodes REQUIRE(rdclass == 1); 103135446Strhodes 104135446Strhodes UNUSED(type); 105135446Strhodes UNUSED(dctx); 106135446Strhodes UNUSED(options); 107135446Strhodes UNUSED(rdclass); 108135446Strhodes 109135446Strhodes isc_buffer_activeregion(source, ®ion); 110135446Strhodes if (region.length < 1) 111135446Strhodes return (ISC_R_UNEXPECTEDEND); 112135446Strhodes 113135446Strhodes RETERR(mem_tobuffer(target, region.base, region.length)); 114135446Strhodes isc_buffer_forward(source, region.length); 115135446Strhodes return (ISC_R_SUCCESS); 116135446Strhodes} 117135446Strhodes 118135446Strhodesstatic inline isc_result_t 119135446Strhodestowire_in_nsap(ARGS_TOWIRE) { 120135446Strhodes REQUIRE(rdata->type == 22); 121135446Strhodes REQUIRE(rdata->rdclass == 1); 122135446Strhodes REQUIRE(rdata->length != 0); 123135446Strhodes 124135446Strhodes UNUSED(cctx); 125135446Strhodes 126135446Strhodes return (mem_tobuffer(target, rdata->data, rdata->length)); 127135446Strhodes} 128135446Strhodes 129135446Strhodesstatic inline int 130135446Strhodescompare_in_nsap(ARGS_COMPARE) { 131135446Strhodes isc_region_t r1; 132135446Strhodes isc_region_t r2; 133135446Strhodes 134135446Strhodes REQUIRE(rdata1->type == rdata2->type); 135135446Strhodes REQUIRE(rdata1->rdclass == rdata2->rdclass); 136135446Strhodes REQUIRE(rdata1->type == 22); 137135446Strhodes REQUIRE(rdata1->rdclass == 1); 138135446Strhodes REQUIRE(rdata1->length != 0); 139135446Strhodes REQUIRE(rdata2->length != 0); 140135446Strhodes 141135446Strhodes dns_rdata_toregion(rdata1, &r1); 142135446Strhodes dns_rdata_toregion(rdata2, &r2); 143135446Strhodes return (isc_region_compare(&r1, &r2)); 144135446Strhodes} 145135446Strhodes 146135446Strhodesstatic inline isc_result_t 147135446Strhodesfromstruct_in_nsap(ARGS_FROMSTRUCT) { 148135446Strhodes dns_rdata_in_nsap_t *nsap = source; 149135446Strhodes 150135446Strhodes REQUIRE(type == 22); 151135446Strhodes REQUIRE(rdclass == 1); 152135446Strhodes REQUIRE(source != NULL); 153135446Strhodes REQUIRE(nsap->common.rdtype == type); 154135446Strhodes REQUIRE(nsap->common.rdclass == rdclass); 155135446Strhodes REQUIRE(nsap->nsap != NULL || nsap->nsap_len == 0); 156135446Strhodes 157135446Strhodes UNUSED(type); 158135446Strhodes UNUSED(rdclass); 159135446Strhodes 160135446Strhodes return (mem_tobuffer(target, nsap->nsap, nsap->nsap_len)); 161135446Strhodes} 162135446Strhodes 163135446Strhodesstatic inline isc_result_t 164135446Strhodestostruct_in_nsap(ARGS_TOSTRUCT) { 165135446Strhodes dns_rdata_in_nsap_t *nsap = target; 166135446Strhodes isc_region_t r; 167135446Strhodes 168135446Strhodes REQUIRE(rdata->type == 22); 169135446Strhodes REQUIRE(rdata->rdclass == 1); 170135446Strhodes REQUIRE(target != NULL); 171135446Strhodes REQUIRE(rdata->length != 0); 172135446Strhodes 173135446Strhodes nsap->common.rdclass = rdata->rdclass; 174135446Strhodes nsap->common.rdtype = rdata->type; 175135446Strhodes ISC_LINK_INIT(&nsap->common, link); 176135446Strhodes 177135446Strhodes dns_rdata_toregion(rdata, &r); 178135446Strhodes nsap->nsap_len = r.length; 179135446Strhodes nsap->nsap = mem_maybedup(mctx, r.base, r.length); 180135446Strhodes if (nsap->nsap == NULL) 181135446Strhodes return (ISC_R_NOMEMORY); 182135446Strhodes 183135446Strhodes nsap->mctx = mctx; 184135446Strhodes return (ISC_R_SUCCESS); 185135446Strhodes} 186135446Strhodes 187135446Strhodesstatic inline void 188135446Strhodesfreestruct_in_nsap(ARGS_FREESTRUCT) { 189135446Strhodes dns_rdata_in_nsap_t *nsap = source; 190135446Strhodes 191135446Strhodes REQUIRE(source != NULL); 192135446Strhodes REQUIRE(nsap->common.rdclass == 1); 193135446Strhodes REQUIRE(nsap->common.rdtype == 22); 194135446Strhodes 195135446Strhodes if (nsap->mctx == NULL) 196135446Strhodes return; 197135446Strhodes 198135446Strhodes if (nsap->nsap != NULL) 199135446Strhodes isc_mem_free(nsap->mctx, nsap->nsap); 200135446Strhodes nsap->mctx = NULL; 201135446Strhodes} 202135446Strhodes 203135446Strhodesstatic inline isc_result_t 204135446Strhodesadditionaldata_in_nsap(ARGS_ADDLDATA) { 205135446Strhodes REQUIRE(rdata->type == 22); 206135446Strhodes REQUIRE(rdata->rdclass == 1); 207135446Strhodes 208135446Strhodes UNUSED(rdata); 209135446Strhodes UNUSED(add); 210135446Strhodes UNUSED(arg); 211135446Strhodes 212135446Strhodes return (ISC_R_SUCCESS); 213135446Strhodes} 214135446Strhodes 215135446Strhodesstatic inline isc_result_t 216135446Strhodesdigest_in_nsap(ARGS_DIGEST) { 217135446Strhodes isc_region_t r; 218135446Strhodes 219135446Strhodes REQUIRE(rdata->type == 22); 220135446Strhodes REQUIRE(rdata->rdclass == 1); 221135446Strhodes 222135446Strhodes dns_rdata_toregion(rdata, &r); 223135446Strhodes 224135446Strhodes return ((digest)(arg, &r)); 225135446Strhodes} 226135446Strhodes 227135446Strhodesstatic inline isc_boolean_t 228135446Strhodescheckowner_in_nsap(ARGS_CHECKOWNER) { 229135446Strhodes 230135446Strhodes REQUIRE(type == 22); 231135446Strhodes REQUIRE(rdclass == 1); 232135446Strhodes 233135446Strhodes UNUSED(name); 234135446Strhodes UNUSED(type); 235135446Strhodes UNUSED(rdclass); 236135446Strhodes UNUSED(wildcard); 237135446Strhodes 238135446Strhodes return (ISC_TRUE); 239135446Strhodes} 240135446Strhodes 241135446Strhodesstatic inline isc_boolean_t 242135446Strhodeschecknames_in_nsap(ARGS_CHECKNAMES) { 243135446Strhodes 244135446Strhodes REQUIRE(rdata->type == 22); 245135446Strhodes REQUIRE(rdata->rdclass == 1); 246135446Strhodes 247135446Strhodes UNUSED(rdata); 248135446Strhodes UNUSED(owner); 249135446Strhodes UNUSED(bad); 250135446Strhodes 251135446Strhodes return (ISC_TRUE); 252135446Strhodes} 253135446Strhodes 254224092Sdougbstatic inline int 255224092Sdougbcasecompare_in_nsap(ARGS_COMPARE) { 256224092Sdougb return (compare_in_nsap(rdata1, rdata2)); 257224092Sdougb} 258224092Sdougb 259135446Strhodes#endif /* RDATA_IN_1_NSAP_22_C */ 260