zt.c revision 4a80a005507e0f69135a6e6fe45718e84cdf8c56
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉/*
c10fda07d68c04221c2d552dc71a2de1352074cbTinderbox User * Copyright (C) 1999 Internet Software Consortium.
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 *
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 * Permission to use, copy, modify, and distribute this software for any
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 * purpose with or without fee is hereby granted, provided that the above
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 * copyright notice and this permission notice appear in all copies.
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 *
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 * CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 * SOFTWARE.
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 */
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉#include <config.h>
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉#include <isc/assertions.h>
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉#include <isc/magic.h>
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉#include "../isc/util.h"
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉#include <dns/zt.h>
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉
2fff8b8280779a25fbdb891b2d3d9b435d2084f0Tatuya JINMEI 神明達哉struct dns_zt {
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 unsigned int magic;
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 isc_mem_t *mctx;
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 dns_rdataclass_t rdclass;
1bb2f53b9f74a8ca9812cbe9243ef41190b4da14Evan Hunt isc_mutex_t lock;
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 isc_uint32_t references;
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 dns_rbt_t *table;
7781f25078c491a9650dec555bdc86cb0ed49861Tatuya JINMEI 神明達哉};
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews#define ZTMAGIC 0x5a54626cU /* ZTbl */
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉#define VALID_ZT(zt) ISC_MAGIC_VALID(zt, ZTMAGIC)
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrewsstatic void auto_detach(void *, void *);
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉dns_result_t
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrewsdns_zt_create(isc_mem_t *mctx, dns_rdataclass_t rdclass, dns_zt_t **zt) {
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 dns_zt_t *new;
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 dns_result_t result;
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 isc_result_t iresult;
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 REQUIRE(zt != NULL && *zt == NULL);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt new = isc_mem_get(mctx, sizeof *new);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt if (new == NULL)
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt return (DNS_R_NOMEMORY);
feb067b25a8e33db62e2a7bf2e83bbb7f6eee845Evan Hunt
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews new->table = NULL;
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews result = dns_rbt_create(mctx, auto_detach, NULL, &new->table);
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 if (result != DNS_R_SUCCESS)
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 goto cleanup0;
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 iresult = isc_mutex_init(&new->lock);
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 if (iresult != ISC_R_SUCCESS) {
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 UNEXPECTED_ERROR(__FILE__, __LINE__,
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 "isc_lock_init() failed: %s",
7f1785d0ded8897082abacec5219b27feac755afFrancis Dupont isc_result_totext(result));
2f012d936b5ccdf6520c96a4de23721dc58a2221Automatic Updater result = DNS_R_UNEXPECTED;
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 goto cleanup1;
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 }
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 new->mctx = mctx;
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 new->references = 1;
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 new->rdclass = rdclass;
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 new->magic = ZTMAGIC;
bfcc5ae79a46c5c55e6cf1a9fe4d70a957712d2bTatuya JINMEI 神明達哉 *zt = new;
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews return (DNS_R_SUCCESS);
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews
dd2a0a6d2dec1c23787351e51b434a838dec5603Evan Hunt cleanup1:
dd2a0a6d2dec1c23787351e51b434a838dec5603Evan Hunt dns_rbt_destroy(&new->table);
dd2a0a6d2dec1c23787351e51b434a838dec5603Evan Hunt
dd2a0a6d2dec1c23787351e51b434a838dec5603Evan Hunt cleanup0:
dd2a0a6d2dec1c23787351e51b434a838dec5603Evan Hunt isc_mem_put(mctx, new, sizeof *new);
dd2a0a6d2dec1c23787351e51b434a838dec5603Evan Hunt return (result);
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews}
8907d8fa04fdaa65baf0bc6b01230b2ebde93106Mark Andrews
2fff8b8280779a25fbdb891b2d3d9b435d2084f0Tatuya JINMEI 神明達哉dns_result_t
2fff8b8280779a25fbdb891b2d3d9b435d2084f0Tatuya JINMEI 神明達哉dns_zt_mount(dns_zt_t *zt, dns_zone_t *zone) {
a0f91e910bd9af006a65e555ec4082864ca1eb8dMark Andrews dns_result_t result;
a0f91e910bd9af006a65e555ec4082864ca1eb8dMark Andrews dns_zone_t *dummy = NULL;
a0f91e910bd9af006a65e555ec4082864ca1eb8dMark Andrews dns_name_t name;
a0f91e910bd9af006a65e555ec4082864ca1eb8dMark Andrews
a0f91e910bd9af006a65e555ec4082864ca1eb8dMark Andrews REQUIRE(VALID_ZT(zt));
a0f91e910bd9af006a65e555ec4082864ca1eb8dMark Andrews
7c60401dbd4dce617dffc685c269fca224c589adTatuya JINMEI 神明達哉 dns_name_init(&name, NULL);
7c60401dbd4dce617dffc685c269fca224c589adTatuya JINMEI 神明達哉 result = dns_zone_getorigin(zone, zt->mctx, &name);
7c60401dbd4dce617dffc685c269fca224c589adTatuya JINMEI 神明達哉 if (result != DNS_R_SUCCESS)
7c60401dbd4dce617dffc685c269fca224c589adTatuya JINMEI 神明達哉 return (result);
7c60401dbd4dce617dffc685c269fca224c589adTatuya JINMEI 神明達哉 LOCK(&zt->lock);
7c60401dbd4dce617dffc685c269fca224c589adTatuya JINMEI 神明達哉 result = dns_rbt_addname(zt->table, &name, zone);
7c60401dbd4dce617dffc685c269fca224c589adTatuya JINMEI 神明達哉 UNLOCK(&zt->lock);
dd2a0a6d2dec1c23787351e51b434a838dec5603Evan Hunt dns_name_free(&name, zt->mctx);
7c60401dbd4dce617dffc685c269fca224c589adTatuya JINMEI 神明達哉 if (result == DNS_R_SUCCESS)
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 dns_zone_attach(zone, &dummy);
26833735d3d95e731a1cfb2a9b12c9bc10ba208aEvan Hunt
a0f91e910bd9af006a65e555ec4082864ca1eb8dMark Andrews return (result);
7c60401dbd4dce617dffc685c269fca224c589adTatuya JINMEI 神明達哉}
7c60401dbd4dce617dffc685c269fca224c589adTatuya JINMEI 神明達哉
dd2a0a6d2dec1c23787351e51b434a838dec5603Evan Huntdns_result_t
7c60401dbd4dce617dffc685c269fca224c589adTatuya JINMEI 神明達哉dns_zt_unmount(dns_zt_t *zt, dns_zone_t *zone) {
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 dns_result_t result;
26833735d3d95e731a1cfb2a9b12c9bc10ba208aEvan Hunt dns_name_t name;
7c60401dbd4dce617dffc685c269fca224c589adTatuya JINMEI 神明達哉
7c60401dbd4dce617dffc685c269fca224c589adTatuya JINMEI 神明達哉 REQUIRE(VALID_ZT(zt));
7c60401dbd4dce617dffc685c269fca224c589adTatuya JINMEI 神明達哉
dd2a0a6d2dec1c23787351e51b434a838dec5603Evan Hunt dns_name_init(&name, NULL);
7c60401dbd4dce617dffc685c269fca224c589adTatuya JINMEI 神明達哉 result = dns_zone_getorigin(zone, zt->mctx, &name);
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 if (result != DNS_R_SUCCESS)
26833735d3d95e731a1cfb2a9b12c9bc10ba208aEvan Hunt return (result);
a0f91e910bd9af006a65e555ec4082864ca1eb8dMark Andrews LOCK(&zt->lock);
7c60401dbd4dce617dffc685c269fca224c589adTatuya JINMEI 神明達哉 result = dns_rbt_deletename(zt->table, &name, ISC_FALSE);
8ac908b38a2fd9b780ae3a27ff26932a17823ae0Mark Andrews UNLOCK(&zt->lock);
8ac908b38a2fd9b780ae3a27ff26932a17823ae0Mark Andrews dns_name_free(&name, zt->mctx);
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 return (result);
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉}
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉dns_result_t
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉dns_zt_find(dns_zt_t *zt, dns_name_t *name, dns_name_t *foundname,
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 dns_zone_t **zone)
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉{
26833735d3d95e731a1cfb2a9b12c9bc10ba208aEvan Hunt dns_result_t result;
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 dns_zone_t *dummy = NULL;
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉
26833735d3d95e731a1cfb2a9b12c9bc10ba208aEvan Hunt REQUIRE(VALID_ZT(zt));
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉
7c60401dbd4dce617dffc685c269fca224c589adTatuya JINMEI 神明達哉 LOCK(&zt->lock);
7c60401dbd4dce617dffc685c269fca224c589adTatuya JINMEI 神明達哉 result = dns_rbt_findname(zt->table, name, foundname, (void **)&dummy);
7c60401dbd4dce617dffc685c269fca224c589adTatuya JINMEI 神明達哉 UNLOCK(&zt->lock);
7c60401dbd4dce617dffc685c269fca224c589adTatuya JINMEI 神明達哉
7c60401dbd4dce617dffc685c269fca224c589adTatuya JINMEI 神明達哉 if (result == DNS_R_SUCCESS || result == DNS_R_PARTIALMATCH)
a0f91e910bd9af006a65e555ec4082864ca1eb8dMark Andrews dns_zone_attach(dummy, zone);
a0f91e910bd9af006a65e555ec4082864ca1eb8dMark Andrews
a0f91e910bd9af006a65e555ec4082864ca1eb8dMark Andrews return (result);
7c60401dbd4dce617dffc685c269fca224c589adTatuya JINMEI 神明達哉}
7c60401dbd4dce617dffc685c269fca224c589adTatuya JINMEI 神明達哉
7c60401dbd4dce617dffc685c269fca224c589adTatuya JINMEI 神明達哉void
a0f91e910bd9af006a65e555ec4082864ca1eb8dMark Andrewsdns_zt_detach(dns_zt_t **ztp) {
7c60401dbd4dce617dffc685c269fca224c589adTatuya JINMEI 神明達哉 isc_boolean_t destroy = ISC_FALSE;
7c60401dbd4dce617dffc685c269fca224c589adTatuya JINMEI 神明達哉 dns_zt_t *zt;
7c60401dbd4dce617dffc685c269fca224c589adTatuya JINMEI 神明達哉
7c60401dbd4dce617dffc685c269fca224c589adTatuya JINMEI 神明達哉 REQUIRE(ztp != NULL && VALID_ZT(*ztp));
7c60401dbd4dce617dffc685c269fca224c589adTatuya JINMEI 神明達哉
7c60401dbd4dce617dffc685c269fca224c589adTatuya JINMEI 神明達哉 zt = *ztp;
7c60401dbd4dce617dffc685c269fca224c589adTatuya JINMEI 神明達哉
7c60401dbd4dce617dffc685c269fca224c589adTatuya JINMEI 神明達哉 LOCK(&zt->lock);
dc842cdcb946b3f89448f07a9f024497a50c216aMark Andrews
7c60401dbd4dce617dffc685c269fca224c589adTatuya JINMEI 神明達哉 INSIST(zt->references > 0);
7c60401dbd4dce617dffc685c269fca224c589adTatuya JINMEI 神明達哉 zt->references--;
7c60401dbd4dce617dffc685c269fca224c589adTatuya JINMEI 神明達哉 if (zt->references == 0)
859cfb24bfd7bd7754bb1d9ca68bce861a4b0a40Mark Andrews destroy = ISC_TRUE;
859cfb24bfd7bd7754bb1d9ca68bce861a4b0a40Mark Andrews UNLOCK(&zt->lock);
a0f91e910bd9af006a65e555ec4082864ca1eb8dMark Andrews
859cfb24bfd7bd7754bb1d9ca68bce861a4b0a40Mark Andrews if (destroy) {
859cfb24bfd7bd7754bb1d9ca68bce861a4b0a40Mark Andrews dns_rbt_destroy(&zt->table);
7c60401dbd4dce617dffc685c269fca224c589adTatuya JINMEI 神明達哉 isc_mutex_destroy(&zt->lock);
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 isc_mem_put(zt->mctx, zt, sizeof *zt);
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 zt->magic = 0;
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 }
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 *ztp = NULL;
39a8abdb83d00eb57e2395dbd3931c129391a951Automatic Updater}
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉void
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉dns_zt_attach(dns_zt_t *zt, dns_zt_t **ztp) {
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 REQUIRE(VALID_ZT(zt));
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 REQUIRE(ztp != NULL && *ztp == NULL);
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 LOCK(&zt->lock);
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 INSIST(zt->references > 0);
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 zt->references++;
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 INSIST(zt->references != 0xffffffffU);
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 UNLOCK(&zt->lock);
31f6244cc25ab0f8937edc26dbb26ba4f6a01f19Evan Hunt
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 *ztp = zt;
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉}
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉void
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉dns_zt_print(dns_zt_t *zt) {
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 dns_rbtnode_t *node;
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 dns_rbtnodechain_t chain;
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 dns_result_t result;
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 dns_zone_t *zone;
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 REQUIRE(VALID_ZT(zt));
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 dns_rbtnodechain_init(&chain, zt->mctx);
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 result = dns_rbtnodechain_first(&chain, zt->table, NULL, NULL);
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 while (result == DNS_R_NEWORIGIN || result == DNS_R_SUCCESS) {
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 result = dns_rbtnodechain_current(&chain, NULL, NULL,
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 &node);
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 if (result == DNS_R_SUCCESS) {
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 zone = node->data;
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 if (zone != NULL)
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 (void)dns_zone_print(zone);
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 }
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 result = dns_rbtnodechain_next(&chain, NULL, NULL);
aecadaf3b1bbbe0bd58f703989baf38eedd0ffcackb }
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 dns_rbtnodechain_invalidate(&chain);
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉}
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉void
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉dns_zt_load(dns_zt_t *zt) {
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 dns_rbtnode_t *node;
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 dns_rbtnodechain_t chain;
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 dns_result_t result;
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 dns_zone_t *zone;
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 REQUIRE(VALID_ZT(zt));
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 dns_rbtnodechain_init(&chain, zt->mctx);
d9059b0c38bd630c367d81424d72b1308cd74b04Tatuya JINMEI 神明達哉 result = dns_rbtnodechain_first(&chain, zt->table, NULL, NULL);
dd2a0a6d2dec1c23787351e51b434a838dec5603Evan Hunt while (result == DNS_R_NEWORIGIN || result == DNS_R_SUCCESS) {
dd2a0a6d2dec1c23787351e51b434a838dec5603Evan Hunt result = dns_rbtnodechain_current(&chain, NULL, NULL,
4786e693a7c4b41ba4554f06a2f6d16c74017f15Mark Andrews &node);
55e5c51e661e23e24573db84114a3837817745c9Evan Hunt if (result == DNS_R_SUCCESS) {
55e5c51e661e23e24573db84114a3837817745c9Evan Hunt zone = node->data;
55e5c51e661e23e24573db84114a3837817745c9Evan Hunt if (zone != NULL)
55e5c51e661e23e24573db84114a3837817745c9Evan Hunt (void)dns_zone_load(zone);
94315060c2b0d9deafabe72d6a0482405fd9d377Evan Hunt }
94315060c2b0d9deafabe72d6a0482405fd9d377Evan Hunt result = dns_rbtnodechain_next(&chain, NULL, NULL);
31f6244cc25ab0f8937edc26dbb26ba4f6a01f19Evan Hunt }
31f6244cc25ab0f8937edc26dbb26ba4f6a01f19Evan Hunt dns_rbtnodechain_invalidate(&chain);
02a5e3ed85cbfc099874bb34e5901537399b5e24Mark Andrews}
02a5e3ed85cbfc099874bb34e5901537399b5e24Mark Andrews
02a5e3ed85cbfc099874bb34e5901537399b5e24Mark Andrews/***
b5f6271f4daf1e54501af2cb7dd278d7e8003d65Mark Andrews *** Private
b5f6271f4daf1e54501af2cb7dd278d7e8003d65Mark Andrews ***/
b5f6271f4daf1e54501af2cb7dd278d7e8003d65Mark Andrews
b5f6271f4daf1e54501af2cb7dd278d7e8003d65Mark Andrewsstatic void
b5f6271f4daf1e54501af2cb7dd278d7e8003d65Mark Andrewsauto_detach(void *zone, void *xxx) {
b5f6271f4daf1e54501af2cb7dd278d7e8003d65Mark Andrews dns_zone_t *dummy = zone;
b5f6271f4daf1e54501af2cb7dd278d7e8003d65Mark Andrews
b5f6271f4daf1e54501af2cb7dd278d7e8003d65Mark Andrews xxx = xxx; /*unused*/
b5f6271f4daf1e54501af2cb7dd278d7e8003d65Mark Andrews
b5f6271f4daf1e54501af2cb7dd278d7e8003d65Mark Andrews printf("auto_detach\n");
b5f6271f4daf1e54501af2cb7dd278d7e8003d65Mark Andrews dns_zone_detach(&dummy);
b5f6271f4daf1e54501af2cb7dd278d7e8003d65Mark Andrews}
b5f6271f4daf1e54501af2cb7dd278d7e8003d65Mark Andrews