Lines Matching defs:catz

1 /*	$NetBSD: catz.c,v 1.14 2025/01/26 16:25:22 christos Exp $	*/
33 #include <dns/catz.h>
44 #define DNS_CATZ_ZONE_VALID(catz) ISC_MAGIC_VALID(catz, DNS_CATZ_ZONE_MAGIC)
113 dns__catz_timer_start(dns_catz_zone_t *catz);
123 catz_process_zones_entry(dns_catz_zone_t *catz, dns_rdataset_t *value,
126 catz_process_zones_suboption(dns_catz_zone_t *catz, dns_rdataset_t *value,
129 catz_entry_add_or_mod(dns_catz_zone_t *catz, isc_ht_t *ht, unsigned char *key,
262 catz_coo_detach(dns_catz_zone_t *catz, dns_catz_coo_t **coop) {
265 REQUIRE(DNS_CATZ_ZONE_VALID(catz));
271 isc_mem_t *mctx = catz->catzs->mctx;
282 catz_coo_add(dns_catz_zone_t *catz, dns_catz_entry_t *entry,
284 REQUIRE(DNS_CATZ_ZONE_VALID(catz));
290 isc_result_t result = isc_ht_find(catz->coos, entry->name.ndata,
293 coo = catz_coo_new(catz->catzs->mctx, domain);
294 result = isc_ht_add(catz->coos, entry->name.ndata,
327 dns_catz_entry_copy(dns_catz_zone_t *catz, const dns_catz_entry_t *entry) {
328 REQUIRE(DNS_CATZ_ZONE_VALID(catz));
331 dns_catz_entry_t *nentry = dns_catz_entry_new(catz->catzs->mctx,
334 dns_catz_options_copy(catz->catzs->mctx, &entry->opts, &nentry->opts);
349 dns_catz_entry_detach(dns_catz_zone_t *catz, dns_catz_entry_t **entryp) {
352 REQUIRE(DNS_CATZ_ZONE_VALID(catz));
358 isc_mem_t *mctx = catz->catzs->mctx;
463 dns_catz_zone_getname(dns_catz_zone_t *catz) {
464 REQUIRE(DNS_CATZ_ZONE_VALID(catz));
466 return &catz->name;
470 dns_catz_zone_getdefoptions(dns_catz_zone_t *catz) {
471 REQUIRE(DNS_CATZ_ZONE_VALID(catz));
473 return &catz->defoptions;
477 dns_catz_zone_resetdefoptions(dns_catz_zone_t *catz) {
478 REQUIRE(DNS_CATZ_ZONE_VALID(catz));
480 dns_catz_options_free(&catz->defoptions, catz->catzs->mctx);
481 dns_catz_options_init(&catz->defoptions);
485 * Merge 'newcatz' into 'catz', calling addzone/delzone/modzone
486 * (from catz->catzs->zmm) for appropriate member zones.
489 * \li 'catz' is a valid dns_catz_zone_t.
494 dns__catz_zones_merge(dns_catz_zone_t *catz, dns_catz_zone_t *newcatz) {
504 REQUIRE(DNS_CATZ_ZONE_VALID(catz));
507 LOCK(&catz->lock);
511 addzone = catz->catzs->zmm->addzone;
512 modzone = catz->catzs->zmm->modzone;
513 delzone = catz->catzs->zmm->delzone;
515 /* Copy zoneoptions from newcatz into catz. */
517 dns_catz_options_free(&catz->zoneoptions, catz->catzs->mctx);
518 dns_catz_options_copy(catz->catzs->mctx, &newcatz->zoneoptions,
519 &catz->zoneoptions);
520 dns_catz_options_setdefault(catz->catzs->mctx, &catz->defoptions,
521 &catz->zoneoptions);
523 dns_name_format(&catz->name, czname, DNS_NAME_FORMATSIZE);
525 isc_ht_init(&toadd, catz->catzs->mctx, 1, ISC_HT_CASE_SENSITIVE);
526 isc_ht_init(&tomod, catz->catzs->mctx, 1, ISC_HT_CASE_SENSITIVE);
528 isc_ht_iter_create(catz->entries, &iter2);
572 "catz: iterating over '%s' from catalog '%s'",
574 dns_catz_options_setdefault(catz->catzs->mctx,
575 &catz->zoneoptions, &nentry->opts);
578 find_result = dns_view_findzone(catz->catzs->view,
590 if (parentcatz != NULL && parentcatz != catz) {
591 UNLOCK(&catz->lock);
599 dns_name_equal(&coo->name, &catz->name))
606 "catz: zone '%s' "
616 "catz: deleting zone '%s' "
623 LOCK(&catz->lock);
629 result = isc_ht_find(catz->entries, key, (uint32_t)keysize,
632 if (find_result == ISC_R_SUCCESS && parentcatz == catz)
649 "catz: zone '%s' unique label "
654 catz_entry_add_or_mod(catz, toadd, key, keysize, nentry,
662 "catz: zone '%s' was expected to exist "
665 catz_entry_add_or_mod(catz, toadd, key, keysize, nentry,
671 catz_entry_add_or_mod(catz, tomod, key, keysize, nentry,
681 dns_catz_entry_detach(catz, &oentry);
682 result = isc_ht_delete(catz->entries, key, (uint32_t)keysize);
698 result = delzone(entry, catz, catz->catzs->view,
699 catz->catzs->zmm->udata);
702 "catz: deleting zone '%s' from catalog '%s' - %s",
704 dns_catz_entry_detach(catz, &entry);
708 /* At this moment catz->entries has to be be empty. */
709 INSIST(isc_ht_count(catz->entries) == 0);
710 isc_ht_destroy(&catz->entries);
719 result = addzone(entry, catz, catz->catzs->view,
720 catz->catzs->zmm->udata);
723 "catz: adding zone '%s' from catalog "
735 result = modzone(entry, catz, catz->catzs->view,
736 catz->catzs->zmm->udata);
739 "catz: modifying zone '%s' from catalog "
744 catz->entries = newcatz->entries;
751 if (catz->coos != NULL && newcatz->coos != NULL) {
754 isc_ht_iter_create(catz->coos, &iter);
761 catz_coo_detach(catz, &coo);
767 INSIST(isc_ht_count(catz->coos) == 0);
768 isc_ht_destroy(&catz->coos);
770 catz->coos = newcatz->coos;
781 UNLOCK(&catz->lock);
833 dns_catz_zone_t *catz = isc_mem_get(catzs->mctx, sizeof(*catz));
834 *catz = (dns_catz_zone_t){ .active = true,
838 dns_catz_zones_attach(catzs, &catz->catzs);
839 isc_mutex_init(&catz->lock);
840 isc_refcount_init(&catz->references, 1);
841 isc_ht_init(&catz->entries, catzs->mctx, 4, ISC_HT_CASE_SENSITIVE);
842 isc_ht_init(&catz->coos, catzs->mctx, 4, ISC_HT_CASE_INSENSITIVE);
843 isc_time_settoepoch(&catz->lastupdated);
844 dns_catz_options_init(&catz->defoptions);
845 dns_catz_options_init(&catz->zoneoptions);
846 dns_name_init(&catz->name, NULL);
847 dns_name_dup(name, catzs->mctx, &catz->name);
849 return catz;
853 dns__catz_timer_start(dns_catz_zone_t *catz) {
858 REQUIRE(DNS_CATZ_ZONE_VALID(catz));
861 tdiff = isc_time_microdiff(&now, &catz->lastupdated) / 1000000;
862 if (tdiff < catz->defoptions.min_update_interval) {
863 uint64_t defer = catz->defoptions.min_update_interval - tdiff;
866 dns_name_format(&catz->name, dname, DNS_NAME_FORMATSIZE);
869 "catz: %s: new zone version came "
878 catz->loop = isc_loop();
880 isc_timer_create(catz->loop, dns__catz_timer_cb, catz,
881 &catz->updatetimer);
882 isc_timer_start(catz->updatetimer, isc_timertype_once, &interval);
887 dns_catz_zone_t *catz = arg;
888 REQUIRE(DNS_CATZ_ZONE_VALID(catz));
890 isc_timer_stop(catz->updatetimer);
891 isc_timer_destroy(&catz->updatetimer);
892 catz->loop = NULL;
894 dns_catz_zone_detach(&catz);
904 dns_catz_zone_t *catz = NULL;
910 ISC_LOG_DEBUG(3), "catz: dns_catz_zone_add %s", zname);
922 (void **)&catz);
925 INSIST(!catz->active);
926 catz->active = true;
930 catz = dns_catz_zone_new(catzs, name);
932 result = isc_ht_add(catzs->zones, catz->name.ndata,
933 catz->name.length, catz);
942 *catzp = catz;
971 dns__catz_zone_shutdown(dns_catz_zone_t *catz) {
973 if (catz->updatetimer != NULL) {
975 INSIST(catz->loop != NULL);
977 isc_async_run(catz->loop, dns__catz_timer_stop, catz);
979 dns_catz_zone_detach(&catz);
984 dns__catz_zone_destroy(dns_catz_zone_t *catz) {
985 isc_mem_t *mctx = catz->catzs->mctx;
987 if (catz->entries != NULL) {
990 isc_ht_iter_create(catz->entries, &iter);
997 dns_catz_entry_detach(catz, &entry);
1003 INSIST(isc_ht_count(catz->entries) == 0);
1004 isc_ht_destroy(&catz->entries);
1006 if (catz->coos != NULL) {
1009 isc_ht_iter_create(catz->coos, &iter);
1016 catz_coo_detach(catz, &coo);
1022 INSIST(isc_ht_count(catz->coos) == 0);
1023 isc_ht_destroy(&catz->coos);
1025 catz->magic = 0;
1026 isc_mutex_destroy(&catz->lock);
1028 if (catz->updatetimer != NULL) {
1029 isc_timer_async_destroy(&catz->updatetimer);
1032 if (catz->db != NULL) {
1033 if (catz->dbversion != NULL) {
1034 dns_db_closeversion(catz->db, &catz->dbversion, false);
1037 catz->db, dns_catz_dbupdate_callback, catz->catzs);
1038 dns_db_detach(&catz->db);
1041 INSIST(!catz->updaterunning);
1043 dns_name_free(&catz->name, mctx);
1044 dns_catz_options_free(&catz->defoptions, mctx);
1045 dns_catz_options_free(&catz->zoneoptions, mctx);
1047 dns_catz_zones_detach(&catz->catzs);
1049 isc_mem_put(mctx, catz, sizeof(*catz));
1082 dns_catz_zone_t *catz = NULL;
1083 isc_ht_iter_current(iter, (void **)&catz);
1085 dns__catz_zone_shutdown(catz);
1152 catz_process_zones(dns_catz_zone_t *catz, dns_rdataset_t *value,
1157 REQUIRE(DNS_CATZ_ZONE_VALID(catz));
1168 return catz_process_zones_entry(catz, value, &mhash);
1172 return catz_process_zones_suboption(catz, value, &mhash, &opt);
1177 catz_process_coo(dns_catz_zone_t *catz, dns_label_t *mhash,
1184 REQUIRE(DNS_CATZ_ZONE_VALID(catz));
1189 if (catz->version < 2) {
1200 "catz: 'coo' property PTR RRset contains "
1202 catz->broken = true;
1224 result = isc_ht_find(catz->entries, mhash->base, mhash->length,
1236 catz_coo_add(catz, entry, &ptr.ptr);
1245 catz_process_zones_entry(dns_catz_zone_t *catz, dns_rdataset_t *value,
1259 "catz: member zone PTR RRset contains "
1261 catz->broken = true;
1278 result = isc_ht_find(catz->entries, mhash->base, mhash->length,
1286 dns_name_dup(&ptr.ptr, catz->catzs->mctx, &entry->name);
1289 entry = dns_catz_entry_new(catz->catzs->mctx, &ptr.ptr);
1291 result = isc_ht_add(catz->entries, mhash->base, mhash->length,
1302 catz_process_version(dns_catz_zone_t *catz, dns_rdataset_t *value) {
1310 REQUIRE(DNS_CATZ_ZONE_VALID(catz));
1320 "catz: 'version' property TXT RRset contains "
1322 catz->broken = true;
1364 catz->version = tversion;
1372 "catz: invalid record for the catalog "
1374 catz->broken = true;
1380 catz_process_primaries(dns_catz_zone_t *catz, dns_ipkeylist_t *ipkl,
1394 REQUIRE(DNS_CATZ_ZONE_VALID(catz));
1400 mctx = catz->catzs->mctx;
1562 catz_process_apl(dns_catz_zone_t *catz, isc_buffer_t **aclbp,
1572 REQUIRE(DNS_CATZ_ZONE_VALID(catz));
1585 "catz: more than one APL entry for member zone, "
1592 result = dns_rdata_tostruct(&rdata, &rdata_apl, catz->catzs->mctx);
1596 isc_buffer_allocate(catz->catzs->mctx, &aclb, 16);
1643 catz_process_zones_suboption(dns_catz_zone_t *catz, dns_rdataset_t *value,
1652 REQUIRE(DNS_CATZ_ZONE_VALID(catz));
1667 if (catz->version >= 2 && opt >= CATZ_OPT_CUSTOM_START) {
1680 result = isc_ht_find(catz->entries, mhash->base, mhash->length,
1683 entry = dns_catz_entry_new(catz->catzs->mctx, NULL);
1684 result = isc_ht_add(catz->entries, mhash->base, mhash->length,
1693 return catz_process_coo(catz, mhash, value);
1695 return catz_process_primaries(catz, &entry->opts.masters, value,
1701 return catz_process_apl(catz, &entry->opts.allow_query, value);
1706 return catz_process_apl(catz, &entry->opts.allow_transfer,
1716 catz_entry_add_or_mod(dns_catz_zone_t *catz, isc_ht_t *ht, unsigned char *key,
1725 "catz: error %s zone '%s' from catalog '%s' - %s",
1729 dns_catz_entry_detach(catz, &oentry);
1730 result = isc_ht_delete(catz->entries, key, (uint32_t)keysize);
1736 catz_process_value(dns_catz_zone_t *catz, dns_name_t *name,
1743 REQUIRE(DNS_CATZ_ZONE_VALID(catz));
1757 if (catz->version >= 2 && opt >= CATZ_OPT_CUSTOM_START) {
1771 return catz_process_zones(catz, rdataset, &prefix);
1773 return catz_process_primaries(catz, &catz->zoneoptions.masters,
1779 return catz_process_apl(catz, &catz->zoneoptions.allow_query,
1785 return catz_process_apl(catz, &catz->zoneoptions.allow_transfer,
1791 return catz_process_version(catz, rdataset);
1798 * Process a single rdataset from a catalog zone 'catz' update, src_name is the
1802 * \li 'catz' is a valid dns_catz_zone_t.
1807 dns__catz_update_process(dns_catz_zone_t *catz, const dns_name_t *src_name,
1817 REQUIRE(DNS_CATZ_ZONE_VALID(catz));
1823 "catz: RR found which has a non-IN class");
1824 catz->broken = true;
1828 nrres = dns_name_fullcompare(src_name, &catz->name, &order, &nlabels);
1855 dns_name_split(src_name, catz->name.labels, &prefix, NULL);
1856 result = catz_process_value(catz, &prefix, rdataset);
1876 dns_catz_generate_masterfilename(dns_catz_zone_t *catz, dns_catz_entry_t *entry,
1884 REQUIRE(DNS_CATZ_ZONE_VALID(catz));
1888 isc_buffer_allocate(catz->catzs->mctx, &tbuf,
1889 strlen(catz->catzs->view->name) +
1892 isc_buffer_putstr(tbuf, catz->catzs->view->name);
1894 result = dns_name_totext(&catz->name, DNS_NAME_OMITFINALDOT, tbuf);
1972 dns_catz_generate_zonecfg(dns_catz_zone_t *catz, dns_catz_entry_t *entry,
1982 REQUIRE(DNS_CATZ_ZONE_VALID(catz));
1990 isc_buffer_allocate(catz->catzs->mctx, &buffer, ISC_BUFFER_INCR);
2010 "catz: zone '%s' uses an invalid primary "
2049 result = dns_catz_generate_masterfilename(catz, entry, &buffer);
2081 dns_catz_zone_t *catz = (dns_catz_zone_t *)arg;
2083 REQUIRE(DNS_CATZ_ZONE_VALID(catz));
2085 if (atomic_load(&catz->catzs->shuttingdown)) {
2089 LOCK(&catz->catzs->lock);
2091 INSIST(DNS_DB_VALID(catz->db));
2092 INSIST(catz->dbversion != NULL);
2093 INSIST(catz->updb == NULL);
2094 INSIST(catz->updbversion == NULL);
2096 catz->updatepending = false;
2097 catz->updaterunning = true;
2098 catz->updateresult = ISC_R_UNSET;
2100 dns_name_format(&catz->name, domain, DNS_NAME_FORMATSIZE);
2102 if (!catz->active) {
2105 "catz: %s: no longer active, reload is canceled",
2107 catz->updaterunning = false;
2108 catz->updateresult = ISC_R_CANCELED;
2112 dns_db_attach(catz->db, &catz->updb);
2113 catz->updbversion = catz->dbversion;
2114 catz->dbversion = NULL;
2117 ISC_LOG_INFO, "catz: %s: reload start", domain);
2119 dns_catz_zone_ref(catz);
2120 isc_work_enqueue(catz->loop, dns__catz_update_cb, dns__catz_done_cb,
2121 catz);
2124 isc_timer_destroy(&catz->updatetimer);
2125 catz->loop = NULL;
2127 catz->lastupdated = isc_time_now();
2129 UNLOCK(&catz->catzs->lock);
2135 dns_catz_zone_t *catz = NULL;
2154 result = isc_ht_find(catzs->zones, r.base, r.length, (void **)&catz);
2160 if (catz->db != NULL && catz->db != db) {
2162 if (catz->dbversion != NULL) {
2163 dns_db_closeversion(catz->db, &catz->dbversion, false);
2166 catz->db, dns_catz_dbupdate_callback, catz->catzs);
2167 dns_db_detach(&catz->db);
2169 if (catz->db == NULL) {
2171 dns_db_attach(db, &catz->db);
2173 catz->catzs);
2176 if (!catz->updatepending && !catz->updaterunning) {
2177 catz->updatepending = true;
2178 dns_db_currentversion(db, &catz->dbversion);
2179 dns__catz_timer_start(catz);
2183 catz->updatepending = true;
2184 dns_name_format(&catz->name, dname, DNS_NAME_FORMATSIZE);
2187 "catz: %s: update already queued or running",
2189 if (catz->dbversion != NULL) {
2190 dns_db_closeversion(catz->db, &catz->dbversion, false);
2192 dns_db_currentversion(catz->db, &catz->dbversion);
2225 * It creates a new catz, iterates over database to fill it with content, and
2226 * then merges new catz into old catz.
2230 dns_catz_zone_t *catz = (dns_catz_zone_t *)data;
2250 REQUIRE(DNS_CATZ_ZONE_VALID(catz));
2251 REQUIRE(DNS_DB_VALID(catz->updb));
2252 REQUIRE(DNS_CATZ_ZONES_VALID(catz->catzs));
2254 updb = catz->updb;
2255 catzs = catz->catzs;
2265 * Create a new catz in the same context as current catz.
2281 "catz: zone '%s' not in config", bname);
2289 "catz: zone '%s' is no longer active", bname);
2299 "catz: zone '%s' has no SOA record (%s)", bname,
2306 "catz: updating catalog zone '%s' with serial %" PRIu32,
2313 "catz: failed to create DB iterator - %s",
2330 "catz: failed to create name from string - %s",
2340 "catz: zone '%s' has no 'version' record (%s) "
2362 "catz: failed to get db iterator - %s",
2385 "catz: failed to fetch rrdatasets - %s",
2430 "catz: invalid record in catalog "
2455 "catz: update_from_db: iteration finished: %s",
2467 "catz: zone '%s' version is not set", bname);
2472 "catz: zone '%s' unsupported version "
2484 "catz: new catalog zone '%s' is broken and "
2500 "catz: failed merging zones: %s",
2508 "catz: update_from_db: new zone merged");
2511 catz->updateresult = result;
2516 dns_catz_zone_t *catz = (dns_catz_zone_t *)data;
2519 REQUIRE(DNS_CATZ_ZONE_VALID(catz));
2521 LOCK(&catz->catzs->lock);
2522 catz->updaterunning = false;
2524 dns_name_format(&catz->name, dname, DNS_NAME_FORMATSIZE);
2526 if (catz->updatepending && !atomic_load(&catz->catzs->shuttingdown)) {
2528 dns__catz_timer_start(catz);
2531 dns_db_closeversion(catz->updb, &catz->updbversion, false);
2532 dns_db_detach(&catz->updb);
2534 UNLOCK(&catz->catzs->lock);
2537 ISC_LOG_INFO, "catz: %s: reload done: %s", dname,
2538 isc_result_totext(catz->updateresult));
2540 dns_catz_zone_unref(catz);
2555 dns_catz_zone_t *catz = NULL;
2556 isc_ht_iter_current(iter, (void **)&catz);
2557 catz->active = false;
2575 dns_catz_zone_t *catz = NULL;
2577 isc_ht_iter_current(iter, (void **)&catz);
2578 if (!catz->active) {
2580 dns_name_format(&catz->name, cname,
2584 "catz: removing catalog zone %s", cname);
2590 newcatz = dns_catz_zone_new(catzs, &catz->name);
2591 dns__catz_zones_merge(catz, newcatz);
2595 INSIST(isc_ht_count(catz->entries) == 0);
2597 dns_catz_zone_detach(&catz);
2608 dns_catz_zone_for_each_entry2(dns_catz_zone_t *catz, dns_catz_entry_cb2 cb,
2610 REQUIRE(DNS_CATZ_ZONE_VALID(catz));
2615 LOCK(&catz->catzs->lock);
2616 isc_ht_iter_create(catz->entries, &iter);
2626 UNLOCK(&catz->catzs->lock);