📄 t_db.c
字号:
dns_result = t_create(db_type, origin, class, model, mctx, &db); if (dns_result != ISC_R_SUCCESS) { isc_mem_destroy(&mctx); return(T_UNRESOLVED); } dns_result = dns_db_load(db, filename); if (dns_result != ISC_R_SUCCESS) { t_info("dns_db_load returned %s\n", dns_result_totext(dns_result)); dns_db_detach(&db); isc_mem_destroy(&mctx); return(T_UNRESOLVED); } /* * Remove all rdata for an existing name. */ dns_fixedname_init(&dns_existingname); len = strlen(existing_name); isc_buffer_init(&name_buffer, existing_name, len); isc_buffer_add(&name_buffer, len); dns_result = dns_name_fromtext(dns_fixedname_name(&dns_existingname), &name_buffer, NULL, ISC_FALSE, NULL); if (dns_result != ISC_R_SUCCESS) { t_info("dns_name_fromtext failed %s\n", dns_result_totext(dns_result)); dns_db_detach(&db); isc_mem_destroy(&mctx); return(T_UNRESOLVED); } textregion.base = existing_type; textregion.length = strlen(existing_type); dns_result = dns_rdatatype_fromtext(&existing_rdatatype, &textregion); if (dns_result != ISC_R_SUCCESS) { t_info("dns_rdatatype_fromtext %s failed %s\n", existing_type, dns_result_totext(dns_result)); dns_db_detachnode(db, &nodep); dns_db_detach(&db); isc_mem_destroy(&mctx); return(T_UNRESOLVED); } nodep = NULL; dns_result = dns_db_findnode(db, dns_fixedname_name(&dns_existingname), ISC_FALSE, &nodep); if (dns_result != ISC_R_SUCCESS) { t_info("dns_db_findnode %s\n", dns_result_totext(dns_result)); dns_db_detach(&db); isc_mem_destroy(&mctx); return(T_UNRESOLVED); } /* * Open a new version. */ nversionp = NULL; dns_result = dns_db_newversion(db, &nversionp); if (dns_result != ISC_R_SUCCESS) { t_info("dns_db_newversion failed %s\n", dns_result_totext(dns_result)); dns_db_detachnode(db, &nodep); dns_db_detach(&db); isc_mem_destroy(&mctx); return(T_UNRESOLVED); } dns_result = dns_db_deleterdataset(db, nodep, nversionp, existing_rdatatype, 0); if (dns_result != ISC_R_SUCCESS) { t_info("dns_db_deleterdataset failed %s\n", dns_result_totext(dns_result)); dns_db_closeversion(db, &nversionp, ISC_FALSE); dns_db_detachnode(db, &nodep); dns_db_detach(&db); isc_mem_destroy(&mctx); return(T_UNRESOLVED); } /* * add a new name and associate some rdata with it */ dns_db_detachnode(db, &nodep); nodep = NULL; dns_fixedname_init(&dns_newname); len = strlen(new_name); isc_buffer_init(&name_buffer, new_name, len); isc_buffer_add(&name_buffer, len); dns_result = dns_name_fromtext(dns_fixedname_name(&dns_newname), &name_buffer, NULL, ISC_FALSE, NULL); if (dns_result != ISC_R_SUCCESS) { t_info("dns_name_fromtext failed %s\n", dns_result_totext(dns_result)); dns_db_closeversion(db, &nversionp, ISC_FALSE); dns_db_detach(&db); isc_mem_destroy(&mctx); return(T_UNRESOLVED); } dns_result = dns_db_findnode(db, dns_fixedname_name(&dns_newname), ISC_TRUE, &nodep); if (dns_result != ISC_R_SUCCESS) { t_info("dns_db_findnode failed %s\n", dns_result_totext(dns_result)); dns_db_closeversion(db, &nversionp, ISC_FALSE); dns_db_detach(&db); isc_mem_destroy(&mctx); return(T_UNRESOLVED); } textregion.base = new_type; textregion.length = strlen(new_type); dns_result = dns_rdatatype_fromtext(&new_rdatatype, &textregion); if (dns_result != ISC_R_SUCCESS) { t_info("dns_rdatatype_fromtext %s failed %s\n", new_type, dns_result_totext(dns_result)); dns_db_detachnode(db, &nodep); dns_db_detach(&db); isc_mem_destroy(&mctx); return(T_UNRESOLVED); } textregion.base = class; textregion.length = strlen(class); dns_result = dns_rdataclass_fromtext(&rdataclass, &textregion); if (dns_result != ISC_R_SUCCESS) { t_info("dns_rdataclass_fromtext failed %s\n", dns_result_totext(dns_result)); dns_db_detachnode(db, &nodep); dns_db_detach(&db); isc_mem_destroy(&mctx); return(T_UNRESOLVED); } dns_rdata_init(&added_rdata); added_rdata_data = "\x10\x00\x00\x01"; DE_CONST(added_rdata_data, added_rdata.data); added_rdata.length = 4; added_rdata.rdclass = rdataclass; added_rdata.type = new_rdatatype; dns_rdataset_init(&added_rdataset); rdatalist.type = new_rdatatype; rdatalist.covers = 0; rdatalist.rdclass = rdataclass; rdatalist.ttl = 0; ISC_LIST_INIT(rdatalist.rdata); ISC_LIST_APPEND(rdatalist.rdata, &added_rdata, link); dns_result = dns_rdatalist_tordataset(&rdatalist, &added_rdataset); if (dns_result != ISC_R_SUCCESS) { t_info("dns_rdatalist_tordataset failed %s\n", dns_result_totext(dns_result)); dns_db_detachnode(db, &nodep); dns_db_detach(&db); isc_mem_destroy(&mctx); return(T_UNRESOLVED); } dns_result = dns_db_addrdataset(db, nodep, nversionp, 0, &added_rdataset, 0, NULL); if (dns_result != ISC_R_SUCCESS) { t_info("dns_db_addrdataset failed %s\n", dns_result_totext(dns_result)); dns_db_closeversion(db, &nversionp, ISC_FALSE); dns_db_detachnode(db, &nodep); dns_db_detach(&db); isc_mem_destroy(&mctx); return(T_UNRESOLVED); } /* * Check that our changes took. */ dns_db_detachnode(db, &nodep); nodep = NULL; dns_fixedname_init(&dns_foundname); dns_rdataset_init(&found_rdataset); /* * Find the recently added name and rdata. */ dns_result = dns_db_find(db, dns_fixedname_name(&dns_newname), nversionp, new_rdatatype, 0, 0, &nodep, dns_fixedname_name(&dns_foundname), &found_rdataset, NULL); if ((dns_result == ISC_R_NOTFOUND) || (dns_result == DNS_R_NXDOMAIN) || (dns_result == DNS_R_NXRRSET)) { t_info("dns_db_find failed %s\n", dns_result_totext(dns_result)); dns_db_closeversion(db, &nversionp, ISC_FALSE); dns_db_detachnode(db, &nodep); if (dns_rdataset_isassociated(&found_rdataset)) dns_rdataset_disassociate(&found_rdataset); dns_db_detach(&db); isc_mem_destroy(&mctx); return(T_FAIL); } dns_result = dns_rdataset_first(&found_rdataset); if (dns_result != ISC_R_SUCCESS) { t_info("dns_rdataset_first failed %s\n", dns_result_totext(dns_result)); dns_db_detachnode(db, &nodep); if (dns_rdataset_isassociated(&found_rdataset)) dns_rdataset_disassociate(&found_rdataset); dns_db_closeversion(db, &nversionp, ISC_FALSE); dns_db_detach(&db); isc_mem_destroy(&mctx); return(T_FAIL); } /* * Now make sure its what we expect. */ dns_rdata_init(&found_rdata); dns_rdataset_current(&found_rdataset, &found_rdata); rval = dns_rdata_compare(&added_rdata, &found_rdata); if (rval != 0) { t_info("dns_rdata_compare returned %d\n", rval); ++nfails; } /* * Now check the rdata deletion. */ if (dns_rdataset_isassociated(&found_rdataset)) dns_rdataset_disassociate(&found_rdataset); dns_rdataset_init(&found_rdataset); dns_db_detachnode(db, &nodep); nodep = NULL; dns_fixedname_init(&dns_foundname); dns_result = dns_db_find(db, dns_fixedname_name(&dns_existingname), nversionp, existing_rdatatype, 0, 0, &nodep, dns_fixedname_name(&dns_foundname), &found_rdataset, NULL); if ((dns_result != ISC_R_NOTFOUND) && (dns_result != DNS_R_NXDOMAIN)) { t_info("dns_db_find %s returned %s\n", existing_name, dns_result_totext(dns_result)); if (dns_rdataset_isassociated(&found_rdataset)) dns_rdataset_disassociate(&found_rdataset); dns_db_detachnode(db, &nodep); ++nfails; } /* * Close the version without a commit. */ dns_db_closeversion(db, &nversionp, ISC_FALSE); /* * Open the current version and check changes. */ dns_fixedname_init(&dns_foundname); dns_rdataset_init(&found_rdataset); cversionp = NULL; dns_db_currentversion(db, &cversionp); /* * Find the recently added name and rdata. */ dns_result = dns_db_find(db, dns_fixedname_name(&dns_newname), cversionp, new_rdatatype, 0, 0, &nodep, dns_fixedname_name(&dns_foundname), &found_rdataset, NULL); if ((dns_result != ISC_R_NOTFOUND) && (dns_result != DNS_R_NXDOMAIN)) { t_info("dns_db_find %s returned %s\n", new_name, dns_result_totext(dns_result)); dns_rdataset_disassociate(&found_rdataset); dns_db_detachnode(db, &nodep); dns_db_closeversion(db, &cversionp, ISC_FALSE); dns_db_detach(&db); isc_mem_destroy(&mctx); return(T_FAIL); } /* * Now check the rdata deletion. */ nodep = NULL; dns_rdataset_init(&found_rdataset); dns_fixedname_init(&dns_foundname); dns_result = dns_db_find(db, dns_fixedname_name(&dns_existingname), cversionp, existing_rdatatype, 0, 0, &nodep, dns_fixedname_name(&dns_foundname), &found_rdataset, NULL); if ((dns_result == ISC_R_NOTFOUND) || (dns_result == DNS_R_NXDOMAIN) || (dns_result == DNS_R_NXRRSET)) { t_info("dns_db_find %s returned %s\n", existing_name, dns_result_totext(dns_result)); dns_rdataset_disassociate(&found_rdataset); dns_db_detachnode(db, &nodep); ++nfails; } dns_db_detachnode(db, &nodep); dns_rdataset_disassociate(&found_rdataset); dns_db_closeversion(db, &cversionp, ISC_FALSE); dns_db_detach(&db); isc_mem_destroy(&mctx); if (nfails == 0) result = T_PASS; else result = T_FAIL; return(result);}static voidt11(void) { int result; t_assert("dns_db_closeversion", 11, T_REQUIRED, a11); result = t_eval("dns_db_closeversion_2_data", t_dns_db_closeversion_2, 9); t_result(result);}static const char *a12 = "A call to dns_db_expirenode() marks as stale all records at node " "which expire at or before 'now'. If 'now' is zero, then the current " "time will be used.";static intt_dns_db_expirenode(char **av) { char *filename; char *db_type; char *origin; char *class; char *existing_name; char *node_xtime; char *find_xtime; char *exp_find_result; int result; int len; dns_db_t *db; isc_result_t dns_result; isc_result_t exp_result; isc_result_t isc_result; isc_mem_t *mctx; dns_dbnode_t *nodep; isc_buffer_t name_buffer; dns_fixedname_t dns_foundname; dns_fixedname_t dns_existingname; isc_stdtime_t node_expire_time; isc_stdtime_t find_expire_time; isc_stdtime_t now; dns_rdataset_t rdataset; filename = T_ARG(0); db_type = T_ARG(1); origin = T_ARG(2); class = T_ARG(3); existing_name = T_ARG(4); node_xtime = T_ARG(5); find_xtime = T_ARG(6); exp_find_result = T_ARG(7); result = T_UNRESOLVED; /* * Find a node, mark it as stale, do a dns_db_find on the name and * expect it to fail. */ t_info("testing using file %s and name %s\n", filename, existing_name); node_expire_time = (isc_stdtime_t) strtol(node_xtime, NULL, 10); find_expire_time = (isc_stdtime_t) strtol(find_xtime, NULL, 10); exp_result = t_dns_result_fromtext(exp_find_result); isc_stdtime_get(&now); dns_fixedname_init(&dns_existingname); len = strlen(existing_name); isc_buffer_init(&name_buffer, existing_name, len); isc_buffer_add(&name_buffer, len); dns_result = dns_name_fromtext(dns_fixedname_name(&dns_existingname), &name_buffer, NULL, ISC_FALSE, NULL); if (dns_result != ISC_R_SUCCESS) { t_info("dns_name_fromtext failed %s\n", dns_result_totext(dns_result)); return(T_UNRESOLVED); } mctx = NULL; isc_result = isc_mem_create(0, 0, &mctx); if (isc_result != ISC_R_SUCCESS) { t_info("isc_mem_create failed %s\n", isc_result_totext(isc_result)); return(T_UNRESOLVED); } db = NULL; dns_result = t_create(db_type, origin, class, "cache", mctx, &db); if (dns_result != ISC_R_SUCCESS) { isc_mem_destroy(&mctx); return(T_UNRESOLVED); } dns_result = dns_db_load(db, filename); if (dns_result != ISC_R_SUCCESS) { t_info("dns_db_load returned %s\n", dns_result_totext(dns_result)); dns_db_detach(&db); isc_mem_destroy(&mctx); return(T_UNRESOLVED); } nodep = NULL; /* * Check that the node is there. */ dns_result = dns_db_findnode(db, dns_fixedname_name(&dns_existingname), ISC_FALSE, &nodep); if (dns_result != ISC_R_SUCCESS) { t_info("unable to find %s\n", existing_name); dns_db_detach(&db); isc_mem_destroy(&mctx); return(T_UNRESOLVED); } /* * Expire it. */ if (node_expire_time != 0) node_expire_time += now; dns_result = dns_db_expirenode(db, nodep, node_expire_time); if (dns_result != ISC_R_SUCCESS) { t_info("dns_db_expirenode failed %s\n", dns_result_totext(dns_result)); dns_db_detachnode(db, &nodep); dns_db_detach(&db); isc_mem_destroy(&mctx); return(T_FAIL); } dns_fixedname_init(&dns_foundname); dns_rdataset_init(&rdataset); dns_db_detachnode(db, &nodep); nodep = NULL; if (find_expire_time != 0) find_expire_time += now; dns_result = dns_db_find(db, dns_fixedname_name(&dns_existingname), NULL, dns_rdatatype_any, 0, find_expire_time, &nodep, dns_fixedname_name(&dns_foundname), &rdataset, NULL); if (dns_result == exp_result) { result = T_PASS; } else { t_info("dns_db_find %s returned %s\n", existing_name, dns_result_totext(dns_result)); result = T_FAIL; } if ((dns_result != ISC_R_NOTFOUND) && (dns_result != DNS_R_NXDOMAIN) && (dns_result != DNS_R_NXRRSET)) { /* * Don't need to disassociate the rdataset because * we're searching with dns_rdatatype_any. */ dns_db_detachnode(db, &nodep); } dns_db_detach(&db); isc_mem_destroy(&mctx); return(result);}static voidt12(void) { int result; t_assert("dns_db_expirenode", 12, T_REQUIRED, a12); result = t_eval("dns_db_expirenode_data", t_dns_db_expirenode, 8); t_result(result);}static const char *a13 = "If the node name exists, then a call to " "dns_db_findnode(db, name, ISC_FALSE, nodep) initializes nodep "
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -