static inline isc_result_t tostruct_minfo(ARGS_TOSTRUCT) { dns_rdata_minfo_t *minfo = target; isc_region_t region; dns_name_t name; isc_result_t result; REQUIRE(rdata->type == dns_rdatatype_minfo); REQUIRE(target != NULL); REQUIRE(rdata->length != 0); minfo->common.rdclass = rdata->rdclass; minfo->common.rdtype = rdata->type; ISC_LINK_INIT(&minfo->common, link); dns_name_init(&name, NULL); dns_rdata_toregion(rdata, ®ion); dns_name_fromregion(&name, ®ion); dns_name_init(&minfo->rmailbox, NULL); RETERR(name_duporclone(&name, mctx, &minfo->rmailbox)); isc_region_consume(®ion, name_length(&name)); dns_name_fromregion(&name, ®ion); dns_name_init(&minfo->emailbox, NULL); result = name_duporclone(&name, mctx, &minfo->emailbox); if (result != ISC_R_SUCCESS) goto cleanup; minfo->mctx = mctx; return (ISC_R_SUCCESS); cleanup: if (mctx != NULL) dns_name_free(&minfo->rmailbox, mctx); return (ISC_R_NOMEMORY); }
static inline isc_result_t tostruct_rp(ARGS_TOSTRUCT) { isc_result_t result; isc_region_t region; dns_rdata_rp_t *rp = target; dns_name_t name; REQUIRE(rdata->type == 17); REQUIRE(target != NULL); REQUIRE(rdata->length != 0); rp->common.rdclass = rdata->rdclass; rp->common.rdtype = rdata->type; ISC_LINK_INIT(&rp->common, link); dns_name_init(&name, NULL); dns_rdata_toregion(rdata, ®ion); dns_name_fromregion(&name, ®ion); dns_name_init(&rp->mail, NULL); RETERR(name_duporclone(&name, mctx, &rp->mail)); isc_region_consume(®ion, name_length(&name)); dns_name_fromregion(&name, ®ion); dns_name_init(&rp->text, NULL); result = name_duporclone(&name, mctx, &rp->text); if (result != ISC_R_SUCCESS) goto cleanup; rp->mctx = mctx; return (ISC_R_SUCCESS); cleanup: if (mctx != NULL) dns_name_free(&rp->mail, mctx); return (ISC_R_NOMEMORY); }
static inline isc_result_t tostruct_soa(ARGS_TOSTRUCT) { isc_region_t region; dns_rdata_soa_t *soa = target; dns_name_t name; isc_result_t result; REQUIRE(rdata->type == 6); REQUIRE(target != NULL); REQUIRE(rdata->length != 0); soa->common.rdclass = rdata->rdclass; soa->common.rdtype = rdata->type; ISC_LINK_INIT(&soa->common, link); dns_rdata_toregion(rdata, ®ion); dns_name_init(&name, NULL); dns_name_fromregion(&name, ®ion); isc_region_consume(®ion, name_length(&name)); dns_name_init(&soa->origin, NULL); RETERR(name_duporclone(&name, mctx, &soa->origin)); dns_name_fromregion(&name, ®ion); isc_region_consume(®ion, name_length(&name)); dns_name_init(&soa->contact, NULL); result = name_duporclone(&name, mctx, &soa->contact); if (result != ISC_R_SUCCESS) goto cleanup; soa->serial = uint32_fromregion(®ion); isc_region_consume(®ion, 4); soa->refresh = uint32_fromregion(®ion); isc_region_consume(®ion, 4); soa->retry = uint32_fromregion(®ion); isc_region_consume(®ion, 4); soa->expire = uint32_fromregion(®ion); isc_region_consume(®ion, 4); soa->minimum = uint32_fromregion(®ion); soa->mctx = mctx; return (ISC_R_SUCCESS); cleanup: if (mctx != NULL) dns_name_free(&soa->origin, mctx); return (ISC_R_NOMEMORY); }
static inline isc_result_t tostruct_ch_a(ARGS_TOSTRUCT) { dns_rdata_ch_a_t *a = target; isc_region_t region; dns_name_t name; REQUIRE(rdata->type == 1); REQUIRE(rdata->rdclass == dns_rdataclass_ch); REQUIRE(rdata->length != 0); a->common.rdclass = rdata->rdclass; a->common.rdtype = rdata->type; ISC_LINK_INIT(&a->common, link); dns_rdata_toregion(rdata, ®ion); dns_name_init(&name, NULL); dns_name_fromregion(&name, ®ion); isc_region_consume(®ion, name_length(&name)); dns_name_init(&a->ch_addr_dom, NULL); RETERR(name_duporclone(&name, mctx, &a->ch_addr_dom)); a->ch_addr = htons(uint16_fromregion(®ion)); a->mctx = mctx; return (ISC_R_SUCCESS); }
static inline isc_result_t tostruct_in_srv(ARGS_TOSTRUCT) { isc_region_t region; dns_rdata_in_srv_t *srv = target; dns_name_t name; REQUIRE(rdata->rdclass == 1); REQUIRE(rdata->type == 33); REQUIRE(target != NULL); REQUIRE(rdata->length != 0); srv->common.rdclass = rdata->rdclass; srv->common.rdtype = rdata->type; ISC_LINK_INIT(&srv->common, link); dns_name_init(&name, NULL); dns_rdata_toregion(rdata, ®ion); srv->priority = uint16_fromregion(®ion); isc_region_consume(®ion, 2); srv->weight = uint16_fromregion(®ion); isc_region_consume(®ion, 2); srv->port = uint16_fromregion(®ion); isc_region_consume(®ion, 2); dns_name_fromregion(&name, ®ion); dns_name_init(&srv->target, NULL); RETERR(name_duporclone(&name, mctx, &srv->target)); srv->mctx = mctx; return (ISC_R_SUCCESS); }
static inline isc_result_t tostruct_in_kx(ARGS_TOSTRUCT) { isc_region_t region; dns_rdata_in_kx_t *kx = target; dns_name_t name; REQUIRE(rdata->type == 36); REQUIRE(rdata->rdclass == 1); REQUIRE(target != NULL); REQUIRE(rdata->length != 0); kx->common.rdclass = rdata->rdclass; kx->common.rdtype = rdata->type; ISC_LINK_INIT(&kx->common, link); dns_name_init(&name, NULL); dns_rdata_toregion(rdata, ®ion); kx->preference = uint16_fromregion(®ion); isc_region_consume(®ion, 2); dns_name_fromregion(&name, ®ion); dns_name_init(&kx->exchange, NULL); RETERR(name_duporclone(&name, mctx, &kx->exchange)); kx->mctx = mctx; return (ISC_R_SUCCESS); }
static inline isc_result_t tostruct_afsdb(ARGS_TOSTRUCT) { isc_region_t region; dns_rdata_afsdb_t *afsdb = target; dns_name_t name; REQUIRE(rdata->type == 18); REQUIRE(target != NULL); REQUIRE(rdata->length != 0); afsdb->common.rdclass = rdata->rdclass; afsdb->common.rdtype = rdata->type; ISC_LINK_INIT(&afsdb->common, link); dns_name_init(&afsdb->server, NULL); dns_rdata_toregion(rdata, ®ion); afsdb->subtype = uint16_fromregion(®ion); isc_region_consume(®ion, 2); dns_name_init(&name, NULL); dns_name_fromregion(&name, ®ion); RETERR(name_duporclone(&name, mctx, &afsdb->server)); afsdb->mctx = mctx; return (ISC_R_SUCCESS); }
static inline isc_result_t tostruct_in_px(ARGS_TOSTRUCT) { dns_rdata_in_px_t *px = target; dns_name_t name; isc_region_t region; isc_result_t result; REQUIRE(rdata->type == dns_rdatatype_px); REQUIRE(rdata->rdclass == dns_rdataclass_in); REQUIRE(target != NULL); REQUIRE(rdata->length != 0); px->common.rdclass = rdata->rdclass; px->common.rdtype = rdata->type; ISC_LINK_INIT(&px->common, link); dns_name_init(&name, NULL); dns_rdata_toregion(rdata, ®ion); px->preference = uint16_fromregion(®ion); isc_region_consume(®ion, 2); dns_name_fromregion(&name, ®ion); dns_name_init(&px->map822, NULL); RETERR(name_duporclone(&name, mctx, &px->map822)); isc_region_consume(®ion, name_length(&px->map822)); dns_name_init(&px->mapx400, NULL); result = name_duporclone(&name, mctx, &px->mapx400); if (result != ISC_R_SUCCESS) goto cleanup; px->mctx = mctx; return (result); cleanup: dns_name_free(&px->map822, mctx); return (ISC_R_NOMEMORY); }
static inline isc_result_t tostruct_mf(ARGS_TOSTRUCT) { dns_rdata_mf_t *mf = target; isc_region_t r; dns_name_t name; REQUIRE(rdata->type == dns_rdatatype_mf); REQUIRE(target != NULL); REQUIRE(rdata->length != 0); mf->common.rdclass = rdata->rdclass; mf->common.rdtype = rdata->type; ISC_LINK_INIT(&mf->common, link); dns_name_init(&name, NULL); dns_rdata_toregion(rdata, &r); dns_name_fromregion(&name, &r); dns_name_init(&mf->mf, NULL); RETERR(name_duporclone(&name, mctx, &mf->mf)); mf->mctx = mctx; return (ISC_R_SUCCESS); }
static inline isc_result_t tostruct_ns(ARGS_TOSTRUCT) { isc_region_t region; dns_rdata_ns_t *ns = target; dns_name_t name; REQUIRE(rdata->type == 2); REQUIRE(target != NULL); REQUIRE(rdata->length != 0); ns->common.rdclass = rdata->rdclass; ns->common.rdtype = rdata->type; ISC_LINK_INIT(&ns->common, link); dns_name_init(&name, NULL); dns_rdata_toregion(rdata, ®ion); dns_name_fromregion(&name, ®ion); dns_name_init(&ns->name, NULL); RETERR(name_duporclone(&name, mctx, &ns->name)); ns->mctx = mctx; return (ISC_R_SUCCESS); }
static inline isc_result_t tostruct_lp(ARGS_TOSTRUCT) { isc_region_t region; dns_rdata_lp_t *lp = target; dns_name_t name; REQUIRE(rdata->type == dns_rdatatype_lp); REQUIRE(target != NULL); REQUIRE(rdata->length != 0); lp->common.rdclass = rdata->rdclass; lp->common.rdtype = rdata->type; ISC_LINK_INIT(&lp->common, link); dns_name_init(&name, NULL); dns_rdata_toregion(rdata, ®ion); lp->pref = uint16_fromregion(®ion); isc_region_consume(®ion, 2); dns_name_fromregion(&name, ®ion); dns_name_init(&lp->lp, NULL); RETERR(name_duporclone(&name, mctx, &lp->lp)); lp->mctx = mctx; return (ISC_R_SUCCESS); }
static inline isc_result_t tostruct_tkey(ARGS_TOSTRUCT) { dns_rdata_tkey_t *tkey = target; dns_name_t alg; isc_region_t sr; REQUIRE(rdata->type == 249); REQUIRE(target != NULL); REQUIRE(rdata->length != 0); tkey->common.rdclass = rdata->rdclass; tkey->common.rdtype = rdata->type; ISC_LINK_INIT(&tkey->common, link); dns_rdata_toregion(rdata, &sr); /* * Algorithm Name. */ dns_name_init(&alg, NULL); dns_name_fromregion(&alg, &sr); dns_name_init(&tkey->algorithm, NULL); RETERR(name_duporclone(&alg, mctx, &tkey->algorithm)); isc_region_consume(&sr, name_length(&tkey->algorithm)); /* * Inception. */ tkey->inception = uint32_fromregion(&sr); isc_region_consume(&sr, 4); /* * Expire. */ tkey->expire = uint32_fromregion(&sr); isc_region_consume(&sr, 4); /* * Mode. */ tkey->mode = uint16_fromregion(&sr); isc_region_consume(&sr, 2); /* * Error. */ tkey->error = uint16_fromregion(&sr); isc_region_consume(&sr, 2); /* * Key size. */ tkey->keylen = uint16_fromregion(&sr); isc_region_consume(&sr, 2); /* * Key. */ tkey->key = mem_maybedup(mctx, sr.base, tkey->keylen); if (tkey->key == NULL) goto cleanup; isc_region_consume(&sr, tkey->keylen); /* * Other size. */ tkey->otherlen = uint16_fromregion(&sr); isc_region_consume(&sr, 2); /* * Other. */ tkey->other = mem_maybedup(mctx, sr.base, tkey->otherlen); if (tkey->other == NULL) goto cleanup; tkey->mctx = mctx; return (ISC_R_SUCCESS); cleanup: if (mctx != NULL) dns_name_free(&tkey->algorithm, mctx); if (mctx != NULL && tkey->key != NULL) isc_mem_free(mctx, tkey->key); return (ISC_R_NOMEMORY); }
static inline isc_result_t tostruct_sig(ARGS_TOSTRUCT) { isc_region_t sr; dns_rdata_sig_t *sig = target; dns_name_t signer; REQUIRE(rdata->type == dns_rdatatype_sig); REQUIRE(target != NULL); REQUIRE(rdata->length != 0); sig->common.rdclass = rdata->rdclass; sig->common.rdtype = rdata->type; ISC_LINK_INIT(&sig->common, link); dns_rdata_toregion(rdata, &sr); /* * Type covered. */ sig->covered = uint16_fromregion(&sr); isc_region_consume(&sr, 2); /* * Algorithm. */ sig->algorithm = uint8_fromregion(&sr); isc_region_consume(&sr, 1); /* * Labels. */ sig->labels = uint8_fromregion(&sr); isc_region_consume(&sr, 1); /* * Original TTL. */ sig->originalttl = uint32_fromregion(&sr); isc_region_consume(&sr, 4); /* * Expire time. */ sig->timeexpire = uint32_fromregion(&sr); isc_region_consume(&sr, 4); /* * Time signed. */ sig->timesigned = uint32_fromregion(&sr); isc_region_consume(&sr, 4); /* * Key ID. */ sig->keyid = uint16_fromregion(&sr); isc_region_consume(&sr, 2); dns_name_init(&signer, NULL); dns_name_fromregion(&signer, &sr); dns_name_init(&sig->signer, NULL); RETERR(name_duporclone(&signer, mctx, &sig->signer)); isc_region_consume(&sr, name_length(&sig->signer)); /* * Signature. */ sig->siglen = sr.length; sig->signature = mem_maybedup(mctx, sr.base, sig->siglen); if (sig->signature == NULL) goto cleanup; sig->mctx = mctx; return (ISC_R_SUCCESS); cleanup: if (mctx != NULL) dns_name_free(&sig->signer, mctx); return (ISC_R_NOMEMORY); }
static inline isc_result_t tostruct_ipseckey(ARGS_TOSTRUCT) { isc_region_t region; dns_rdata_ipseckey_t *ipseckey = target; dns_name_t name; isc_uint32_t n; REQUIRE(rdata->type == 45); REQUIRE(target != NULL); REQUIRE(rdata->length >= 3); if (rdata->data[1] > 3U) return (ISC_R_NOTIMPLEMENTED); ipseckey->common.rdclass = rdata->rdclass; ipseckey->common.rdtype = rdata->type; ISC_LINK_INIT(&ipseckey->common, link); dns_name_init(&name, NULL); dns_rdata_toregion(rdata, ®ion); ipseckey->precedence = uint8_fromregion(®ion); isc_region_consume(®ion, 1); ipseckey->gateway_type = uint8_fromregion(®ion); isc_region_consume(®ion, 1); ipseckey->algorithm = uint8_fromregion(®ion); isc_region_consume(®ion, 1); switch (ipseckey->gateway_type) { case 0: break; case 1: n = uint32_fromregion(®ion); ipseckey->in_addr.s_addr = htonl(n); isc_region_consume(®ion, 4); break; case 2: memmove(ipseckey->in6_addr.s6_addr, region.base, 16); isc_region_consume(®ion, 16); break; case 3: dns_name_init(&ipseckey->gateway, NULL); dns_name_fromregion(&name, ®ion); RETERR(name_duporclone(&name, mctx, &ipseckey->gateway)); isc_region_consume(®ion, name_length(&name)); break; } ipseckey->keylength = region.length; if (ipseckey->keylength != 0U) { ipseckey->key = mem_maybedup(mctx, region.base, ipseckey->keylength); if (ipseckey->key == NULL) { if (ipseckey->gateway_type == 3) dns_name_free(&ipseckey->gateway, ipseckey->mctx); return (ISC_R_NOMEMORY); } } else ipseckey->key = NULL; ipseckey->mctx = mctx; return (ISC_R_SUCCESS); }
static inline isc_result_t tostruct_naptr(ARGS_TOSTRUCT) { dns_rdata_naptr_t *naptr = target; isc_region_t r; isc_result_t result; dns_name_t name; REQUIRE(rdata->type == dns_rdatatype_naptr); REQUIRE(target != NULL); REQUIRE(rdata->length != 0); naptr->common.rdclass = rdata->rdclass; naptr->common.rdtype = rdata->type; ISC_LINK_INIT(&naptr->common, link); naptr->flags = NULL; naptr->service = NULL; naptr->regexp = NULL; dns_rdata_toregion(rdata, &r); naptr->order = uint16_fromregion(&r); isc_region_consume(&r, 2); naptr->preference = uint16_fromregion(&r); isc_region_consume(&r, 2); naptr->flags_len = uint8_fromregion(&r); isc_region_consume(&r, 1); INSIST(naptr->flags_len <= r.length); naptr->flags = mem_maybedup(mctx, r.base, naptr->flags_len); if (naptr->flags == NULL) goto cleanup; isc_region_consume(&r, naptr->flags_len); naptr->service_len = uint8_fromregion(&r); isc_region_consume(&r, 1); INSIST(naptr->service_len <= r.length); naptr->service = mem_maybedup(mctx, r.base, naptr->service_len); if (naptr->service == NULL) goto cleanup; isc_region_consume(&r, naptr->service_len); naptr->regexp_len = uint8_fromregion(&r); isc_region_consume(&r, 1); INSIST(naptr->regexp_len <= r.length); naptr->regexp = mem_maybedup(mctx, r.base, naptr->regexp_len); if (naptr->regexp == NULL) goto cleanup; isc_region_consume(&r, naptr->regexp_len); dns_name_init(&name, NULL); dns_name_fromregion(&name, &r); dns_name_init(&naptr->replacement, NULL); result = name_duporclone(&name, mctx, &naptr->replacement); if (result != ISC_R_SUCCESS) goto cleanup; naptr->mctx = mctx; return (ISC_R_SUCCESS); cleanup: if (mctx != NULL && naptr->flags != NULL) isc_mem_free(mctx, naptr->flags); if (mctx != NULL && naptr->service != NULL) isc_mem_free(mctx, naptr->service); if (mctx != NULL && naptr->regexp != NULL) isc_mem_free(mctx, naptr->regexp); return (ISC_R_NOMEMORY); }