1135446Strhodes/* 2224092Sdougb * Copyright (C) 2004, 2005, 2007, 2009 Internet Systems Consortium, Inc. ("ISC") 3135446Strhodes * Copyright (C) 1999-2001 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: rp_17.c,v 1.44 2009/12/04 22:06:37 tbox Exp $ */ 19135446Strhodes 20170222Sdougb/* RFC1183 */ 21135446Strhodes 22135446Strhodes#ifndef RDATA_GENERIC_RP_17_C 23135446Strhodes#define RDATA_GENERIC_RP_17_C 24135446Strhodes 25135446Strhodes#define RRTYPE_RP_ATTRIBUTES (0) 26135446Strhodes 27135446Strhodesstatic inline isc_result_t 28135446Strhodesfromtext_rp(ARGS_FROMTEXT) { 29135446Strhodes isc_token_t token; 30135446Strhodes dns_name_t name; 31135446Strhodes isc_buffer_t buffer; 32135446Strhodes int i; 33135446Strhodes isc_boolean_t ok; 34135446Strhodes 35135446Strhodes REQUIRE(type == 17); 36135446Strhodes 37135446Strhodes UNUSED(type); 38135446Strhodes UNUSED(rdclass); 39135446Strhodes UNUSED(callbacks); 40135446Strhodes 41135446Strhodes origin = (origin != NULL) ? origin : dns_rootname; 42135446Strhodes 43135446Strhodes for (i = 0; i < 2; i++) { 44135446Strhodes RETERR(isc_lex_getmastertoken(lexer, &token, 45135446Strhodes isc_tokentype_string, 46135446Strhodes ISC_FALSE)); 47135446Strhodes dns_name_init(&name, NULL); 48135446Strhodes buffer_fromregion(&buffer, &token.value.as_region); 49135446Strhodes RETTOK(dns_name_fromtext(&name, &buffer, origin, 50135446Strhodes options, target)); 51135446Strhodes ok = ISC_TRUE; 52135446Strhodes if ((options & DNS_RDATA_CHECKNAMES) != 0 && i == 0) 53135446Strhodes ok = dns_name_ismailbox(&name); 54135446Strhodes if (!ok && (options & DNS_RDATA_CHECKNAMESFAIL) != 0) 55135446Strhodes RETTOK(DNS_R_BADNAME); 56135446Strhodes if (!ok && callbacks != NULL) 57135446Strhodes warn_badname(&name, lexer, callbacks); 58135446Strhodes } 59135446Strhodes return (ISC_R_SUCCESS); 60135446Strhodes} 61135446Strhodes 62135446Strhodesstatic inline isc_result_t 63135446Strhodestotext_rp(ARGS_TOTEXT) { 64135446Strhodes isc_region_t region; 65135446Strhodes dns_name_t rmail; 66135446Strhodes dns_name_t email; 67135446Strhodes dns_name_t prefix; 68135446Strhodes isc_boolean_t sub; 69135446Strhodes 70135446Strhodes REQUIRE(rdata->type == 17); 71135446Strhodes REQUIRE(rdata->length != 0); 72135446Strhodes 73135446Strhodes dns_name_init(&rmail, NULL); 74135446Strhodes dns_name_init(&email, NULL); 75135446Strhodes dns_name_init(&prefix, NULL); 76135446Strhodes 77135446Strhodes dns_rdata_toregion(rdata, ®ion); 78135446Strhodes 79135446Strhodes dns_name_fromregion(&rmail, ®ion); 80135446Strhodes isc_region_consume(®ion, rmail.length); 81135446Strhodes 82135446Strhodes dns_name_fromregion(&email, ®ion); 83135446Strhodes isc_region_consume(®ion, email.length); 84135446Strhodes 85135446Strhodes sub = name_prefix(&rmail, tctx->origin, &prefix); 86135446Strhodes RETERR(dns_name_totext(&prefix, sub, target)); 87135446Strhodes 88135446Strhodes RETERR(str_totext(" ", target)); 89135446Strhodes 90135446Strhodes sub = name_prefix(&email, tctx->origin, &prefix); 91135446Strhodes return (dns_name_totext(&prefix, sub, target)); 92135446Strhodes} 93135446Strhodes 94135446Strhodesstatic inline isc_result_t 95135446Strhodesfromwire_rp(ARGS_FROMWIRE) { 96224092Sdougb dns_name_t rmail; 97224092Sdougb dns_name_t email; 98135446Strhodes 99135446Strhodes REQUIRE(type == 17); 100135446Strhodes 101135446Strhodes UNUSED(type); 102135446Strhodes UNUSED(rdclass); 103135446Strhodes 104135446Strhodes dns_decompress_setmethods(dctx, DNS_COMPRESS_NONE); 105135446Strhodes 106224092Sdougb dns_name_init(&rmail, NULL); 107224092Sdougb dns_name_init(&email, NULL); 108135446Strhodes 109224092Sdougb RETERR(dns_name_fromwire(&rmail, source, dctx, options, target)); 110224092Sdougb return (dns_name_fromwire(&email, source, dctx, options, target)); 111135446Strhodes} 112135446Strhodes 113135446Strhodesstatic inline isc_result_t 114135446Strhodestowire_rp(ARGS_TOWIRE) { 115135446Strhodes isc_region_t region; 116135446Strhodes dns_name_t rmail; 117135446Strhodes dns_name_t email; 118135446Strhodes dns_offsets_t roffsets; 119135446Strhodes dns_offsets_t eoffsets; 120135446Strhodes 121135446Strhodes REQUIRE(rdata->type == 17); 122135446Strhodes REQUIRE(rdata->length != 0); 123135446Strhodes 124135446Strhodes dns_compress_setmethods(cctx, DNS_COMPRESS_NONE); 125135446Strhodes dns_name_init(&rmail, roffsets); 126135446Strhodes dns_name_init(&email, eoffsets); 127135446Strhodes 128135446Strhodes dns_rdata_toregion(rdata, ®ion); 129135446Strhodes 130135446Strhodes dns_name_fromregion(&rmail, ®ion); 131135446Strhodes isc_region_consume(®ion, rmail.length); 132135446Strhodes 133135446Strhodes RETERR(dns_name_towire(&rmail, cctx, target)); 134135446Strhodes 135135446Strhodes dns_name_fromregion(&rmail, ®ion); 136135446Strhodes isc_region_consume(®ion, rmail.length); 137135446Strhodes 138135446Strhodes return (dns_name_towire(&rmail, cctx, target)); 139135446Strhodes} 140135446Strhodes 141135446Strhodesstatic inline int 142135446Strhodescompare_rp(ARGS_COMPARE) { 143135446Strhodes isc_region_t region1; 144135446Strhodes isc_region_t region2; 145135446Strhodes dns_name_t name1; 146135446Strhodes dns_name_t name2; 147135446Strhodes int order; 148135446Strhodes 149135446Strhodes REQUIRE(rdata1->type == rdata2->type); 150135446Strhodes REQUIRE(rdata1->rdclass == rdata2->rdclass); 151135446Strhodes REQUIRE(rdata1->type == 17); 152135446Strhodes REQUIRE(rdata1->length != 0); 153135446Strhodes REQUIRE(rdata2->length != 0); 154135446Strhodes 155135446Strhodes dns_name_init(&name1, NULL); 156135446Strhodes dns_name_init(&name2, NULL); 157135446Strhodes 158135446Strhodes dns_rdata_toregion(rdata1, ®ion1); 159135446Strhodes dns_rdata_toregion(rdata2, ®ion2); 160135446Strhodes 161135446Strhodes dns_name_fromregion(&name1, ®ion1); 162135446Strhodes dns_name_fromregion(&name2, ®ion2); 163135446Strhodes 164135446Strhodes order = dns_name_rdatacompare(&name1, &name2); 165135446Strhodes if (order != 0) 166135446Strhodes return (order); 167135446Strhodes 168135446Strhodes isc_region_consume(®ion1, name_length(&name1)); 169135446Strhodes isc_region_consume(®ion2, name_length(&name2)); 170135446Strhodes 171135446Strhodes dns_name_init(&name1, NULL); 172135446Strhodes dns_name_init(&name2, NULL); 173135446Strhodes 174135446Strhodes dns_name_fromregion(&name1, ®ion1); 175135446Strhodes dns_name_fromregion(&name2, ®ion2); 176135446Strhodes 177135446Strhodes return (dns_name_rdatacompare(&name1, &name2)); 178135446Strhodes} 179135446Strhodes 180135446Strhodesstatic inline isc_result_t 181135446Strhodesfromstruct_rp(ARGS_FROMSTRUCT) { 182135446Strhodes dns_rdata_rp_t *rp = source; 183135446Strhodes isc_region_t region; 184135446Strhodes 185135446Strhodes REQUIRE(type == 17); 186135446Strhodes REQUIRE(source != NULL); 187135446Strhodes REQUIRE(rp->common.rdtype == type); 188135446Strhodes REQUIRE(rp->common.rdclass == rdclass); 189135446Strhodes 190135446Strhodes UNUSED(type); 191135446Strhodes UNUSED(rdclass); 192135446Strhodes 193135446Strhodes dns_name_toregion(&rp->mail, ®ion); 194135446Strhodes RETERR(isc_buffer_copyregion(target, ®ion)); 195135446Strhodes dns_name_toregion(&rp->text, ®ion); 196135446Strhodes return (isc_buffer_copyregion(target, ®ion)); 197135446Strhodes} 198135446Strhodes 199135446Strhodesstatic inline isc_result_t 200135446Strhodestostruct_rp(ARGS_TOSTRUCT) { 201135446Strhodes isc_result_t result; 202135446Strhodes isc_region_t region; 203135446Strhodes dns_rdata_rp_t *rp = target; 204135446Strhodes dns_name_t name; 205135446Strhodes 206135446Strhodes REQUIRE(rdata->type == 17); 207135446Strhodes REQUIRE(target != NULL); 208135446Strhodes REQUIRE(rdata->length != 0); 209135446Strhodes 210135446Strhodes rp->common.rdclass = rdata->rdclass; 211135446Strhodes rp->common.rdtype = rdata->type; 212135446Strhodes ISC_LINK_INIT(&rp->common, link); 213135446Strhodes 214135446Strhodes dns_name_init(&name, NULL); 215135446Strhodes dns_rdata_toregion(rdata, ®ion); 216135446Strhodes dns_name_fromregion(&name, ®ion); 217135446Strhodes dns_name_init(&rp->mail, NULL); 218135446Strhodes RETERR(name_duporclone(&name, mctx, &rp->mail)); 219135446Strhodes isc_region_consume(®ion, name_length(&name)); 220135446Strhodes dns_name_fromregion(&name, ®ion); 221135446Strhodes dns_name_init(&rp->text, NULL); 222135446Strhodes result = name_duporclone(&name, mctx, &rp->text); 223135446Strhodes if (result != ISC_R_SUCCESS) 224135446Strhodes goto cleanup; 225135446Strhodes 226135446Strhodes rp->mctx = mctx; 227135446Strhodes return (ISC_R_SUCCESS); 228135446Strhodes 229135446Strhodes cleanup: 230135446Strhodes if (mctx != NULL) 231135446Strhodes dns_name_free(&rp->mail, mctx); 232135446Strhodes return (ISC_R_NOMEMORY); 233135446Strhodes} 234135446Strhodes 235135446Strhodesstatic inline void 236135446Strhodesfreestruct_rp(ARGS_FREESTRUCT) { 237135446Strhodes dns_rdata_rp_t *rp = source; 238135446Strhodes 239135446Strhodes REQUIRE(source != NULL); 240135446Strhodes REQUIRE(rp->common.rdtype == 17); 241135446Strhodes 242135446Strhodes if (rp->mctx == NULL) 243135446Strhodes return; 244135446Strhodes 245135446Strhodes dns_name_free(&rp->mail, rp->mctx); 246135446Strhodes dns_name_free(&rp->text, rp->mctx); 247135446Strhodes rp->mctx = NULL; 248135446Strhodes} 249135446Strhodes 250135446Strhodesstatic inline isc_result_t 251135446Strhodesadditionaldata_rp(ARGS_ADDLDATA) { 252135446Strhodes REQUIRE(rdata->type == 17); 253135446Strhodes 254135446Strhodes UNUSED(rdata); 255135446Strhodes UNUSED(add); 256135446Strhodes UNUSED(arg); 257135446Strhodes 258135446Strhodes return (ISC_R_SUCCESS); 259135446Strhodes} 260135446Strhodes 261135446Strhodesstatic inline isc_result_t 262135446Strhodesdigest_rp(ARGS_DIGEST) { 263135446Strhodes isc_region_t r; 264135446Strhodes dns_name_t name; 265135446Strhodes 266135446Strhodes REQUIRE(rdata->type == 17); 267135446Strhodes 268135446Strhodes dns_rdata_toregion(rdata, &r); 269135446Strhodes dns_name_init(&name, NULL); 270135446Strhodes 271135446Strhodes dns_name_fromregion(&name, &r); 272135446Strhodes RETERR(dns_name_digest(&name, digest, arg)); 273135446Strhodes isc_region_consume(&r, name_length(&name)); 274135446Strhodes 275135446Strhodes dns_name_init(&name, NULL); 276135446Strhodes dns_name_fromregion(&name, &r); 277135446Strhodes 278135446Strhodes return (dns_name_digest(&name, digest, arg)); 279135446Strhodes} 280135446Strhodes 281135446Strhodesstatic inline isc_boolean_t 282135446Strhodescheckowner_rp(ARGS_CHECKOWNER) { 283135446Strhodes 284135446Strhodes REQUIRE(type == 17); 285135446Strhodes 286135446Strhodes UNUSED(name); 287135446Strhodes UNUSED(type); 288135446Strhodes UNUSED(rdclass); 289135446Strhodes UNUSED(wildcard); 290135446Strhodes 291135446Strhodes return (ISC_TRUE); 292135446Strhodes} 293135446Strhodes 294135446Strhodesstatic inline isc_boolean_t 295135446Strhodeschecknames_rp(ARGS_CHECKNAMES) { 296135446Strhodes isc_region_t region; 297135446Strhodes dns_name_t name; 298135446Strhodes 299135446Strhodes REQUIRE(rdata->type == 17); 300135446Strhodes 301135446Strhodes UNUSED(owner); 302135446Strhodes 303135446Strhodes dns_rdata_toregion(rdata, ®ion); 304135446Strhodes dns_name_init(&name, NULL); 305135446Strhodes dns_name_fromregion(&name, ®ion); 306135446Strhodes if (!dns_name_ismailbox(&name)) { 307135446Strhodes if (bad != NULL) 308135446Strhodes dns_name_clone(&name, bad); 309135446Strhodes return (ISC_FALSE); 310135446Strhodes } 311135446Strhodes return (ISC_TRUE); 312135446Strhodes} 313135446Strhodes 314224092Sdougbstatic inline int 315224092Sdougbcasecompare_rp(ARGS_COMPARE) { 316224092Sdougb return (compare_rp(rdata1, rdata2)); 317224092Sdougb} 318135446Strhodes#endif /* RDATA_GENERIC_RP_17_C */ 319