static isc_result_t rdata_clone(isc_mem_t *mctx, dns_rdata_t *source, dns_rdata_t **targetp) { isc_result_t result; dns_rdata_t *target = NULL; isc_region_t target_region, source_region; REQUIRE(mctx != NULL); REQUIRE(source != NULL); REQUIRE(targetp != NULL && *targetp == NULL); CHECKED_MEM_GET_PTR(mctx, target); dns_rdata_init(target); dns_rdata_toregion(source, &source_region); CHECKED_MEM_GET(mctx, target_region.base, source_region.length); target_region.length = source_region.length; memcpy(target_region.base, source_region.base, source_region.length); dns_rdata_fromregion(target, source->rdclass, source->type, &target_region); *targetp = target; return ISC_R_SUCCESS; cleanup: SAFE_MEM_PUT_PTR(mctx, target); return result; }
static isc_result_t ATTR_NONNULLS ATTR_CHECKRESULT get_types(isc_mem_t *mctx, const cfg_obj_t *obj, dns_rdatatype_t **typesp, unsigned int *np) { isc_result_t result = ISC_R_SUCCESS; unsigned int i; unsigned int n = 0; const cfg_listelt_t *el; dns_rdatatype_t *types = NULL; REQUIRE(obj != NULL); REQUIRE(typesp != NULL && *typesp == NULL); REQUIRE(np != NULL); obj = cfg_tuple_get(obj, "types"); n = count_list_elements(obj); if (n > 0) CHECKED_MEM_GET(mctx, types, n * sizeof(dns_rdatatype_t)); i = 0; for (el = cfg_list_first(obj); el != NULL; el = cfg_list_next(el)) { const cfg_obj_t *typeobj; const char *str; isc_textregion_t r; INSIST(i < n); typeobj = cfg_listelt_value(el); str = cfg_obj_asstring(typeobj); DE_CONST(str, r.base); r.length = strlen(str); result = dns_rdatatype_fromtext(&types[i++], &r); if (result != ISC_R_SUCCESS) { log_error("'%s' is not a valid type", str); goto cleanup; } } INSIST(i == n); *typesp = types; *np = n; return result; cleanup: SAFE_MEM_PUT(mctx, types, n * sizeof(dns_rdatatype_t)); return result; }