aboutsummaryrefslogtreecommitdiff
path: root/contrib/bind9/lib/irs/context.c
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/bind9/lib/irs/context.c')
-rw-r--r--contrib/bind9/lib/irs/context.c396
1 files changed, 0 insertions, 396 deletions
diff --git a/contrib/bind9/lib/irs/context.c b/contrib/bind9/lib/irs/context.c
deleted file mode 100644
index be69622b5b6a..000000000000
--- a/contrib/bind9/lib/irs/context.c
+++ /dev/null
@@ -1,396 +0,0 @@
-/*
- * Copyright (C) 2009 Internet Systems Consortium, Inc. ("ISC")
- *
- * Permission to use, copy, modify, and/or distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
- * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
- * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
- * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
- * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
- * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- * PERFORMANCE OF THIS SOFTWARE.
- */
-
-/* $Id: context.c,v 1.3 2009/09/02 23:48:02 tbox Exp $ */
-
-#include <config.h>
-
-#include <isc/app.h>
-#include <isc/lib.h>
-#include <isc/magic.h>
-#include <isc/mem.h>
-#include <isc/once.h>
-#include <isc/socket.h>
-#include <isc/task.h>
-#include <isc/thread.h>
-#include <isc/timer.h>
-#include <isc/util.h>
-
-#include <dns/client.h>
-#include <dns/lib.h>
-
-#include <irs/context.h>
-#include <irs/dnsconf.h>
-#include <irs/resconf.h>
-
-#define IRS_CONTEXT_MAGIC ISC_MAGIC('I', 'R', 'S', 'c')
-#define IRS_CONTEXT_VALID(c) ISC_MAGIC_VALID(c, IRS_CONTEXT_MAGIC)
-
-#ifndef RESOLV_CONF
-/*% location of resolve.conf */
-#define RESOLV_CONF "/etc/resolv.conf"
-#endif
-
-#ifndef DNS_CONF
-/*% location of dns.conf */
-#define DNS_CONF "/etc/dns.conf"
-#endif
-
-#ifndef ISC_PLATFORM_USETHREADS
-irs_context_t *irs_g_context = NULL;
-#else
-static isc_boolean_t thread_key_initialized = ISC_FALSE;
-static isc_mutex_t thread_key_mutex;
-static isc_thread_key_t irs_context_key;
-static isc_once_t once = ISC_ONCE_INIT;
-#endif
-
-
-struct irs_context {
- /*
- * An IRS context is a thread-specific object, and does not need to
- * be locked.
- */
- unsigned int magic;
- isc_mem_t *mctx;
- isc_appctx_t *actx;
- isc_taskmgr_t *taskmgr;
- isc_task_t *task;
- isc_socketmgr_t *socketmgr;
- isc_timermgr_t *timermgr;
- dns_client_t *dnsclient;
- irs_resconf_t *resconf;
- irs_dnsconf_t *dnsconf;
-};
-
-static void
-ctxs_destroy(isc_mem_t **mctxp, isc_appctx_t **actxp,
- isc_taskmgr_t **taskmgrp, isc_socketmgr_t **socketmgrp,
- isc_timermgr_t **timermgrp)
-{
- if (taskmgrp != NULL)
- isc_taskmgr_destroy(taskmgrp);
-
- if (timermgrp != NULL)
- isc_timermgr_destroy(timermgrp);
-
- if (socketmgrp != NULL)
- isc_socketmgr_destroy(socketmgrp);
-
- if (actxp != NULL)
- isc_appctx_destroy(actxp);
-
- if (mctxp != NULL)
- isc_mem_destroy(mctxp);
-}
-
-static isc_result_t
-ctxs_init(isc_mem_t **mctxp, isc_appctx_t **actxp,
- isc_taskmgr_t **taskmgrp, isc_socketmgr_t **socketmgrp,
- isc_timermgr_t **timermgrp)
-{
- isc_result_t result;
-
- result = isc_mem_create(0, 0, mctxp);
- if (result != ISC_R_SUCCESS)
- goto fail;
-
- result = isc_appctx_create(*mctxp, actxp);
- if (result != ISC_R_SUCCESS)
- goto fail;
-
- result = isc_taskmgr_createinctx(*mctxp, *actxp, 1, 0, taskmgrp);
- if (result != ISC_R_SUCCESS)
- goto fail;
-
- result = isc_socketmgr_createinctx(*mctxp, *actxp, socketmgrp);
- if (result != ISC_R_SUCCESS)
- goto fail;
-
- result = isc_timermgr_createinctx(*mctxp, *actxp, timermgrp);
- if (result != ISC_R_SUCCESS)
- goto fail;
-
- return (ISC_R_SUCCESS);
-
- fail:
- ctxs_destroy(mctxp, actxp, taskmgrp, socketmgrp, timermgrp);
-
- return (result);
-}
-
-#ifdef ISC_PLATFORM_USETHREADS
-static void
-free_specific_context(void *arg) {
- irs_context_t *context = arg;
-
- irs_context_destroy(&context);
-
- isc_thread_key_setspecific(irs_context_key, NULL);
-}
-
-static void
-thread_key_mutex_init(void) {
- RUNTIME_CHECK(isc_mutex_init(&thread_key_mutex) == ISC_R_SUCCESS);
-}
-
-static isc_result_t
-thread_key_init() {
- isc_result_t result;
-
- result = isc_once_do(&once, thread_key_mutex_init);
- if (result != ISC_R_SUCCESS)
- return (result);
-
- if (!thread_key_initialized) {
- LOCK(&thread_key_mutex);
-
- if (!thread_key_initialized &&
- isc_thread_key_create(&irs_context_key,
- free_specific_context) != 0) {
- result = ISC_R_FAILURE;
- } else
- thread_key_initialized = ISC_TRUE;
-
- UNLOCK(&thread_key_mutex);
- }
-
- return (result);
-}
-#endif /* ISC_PLATFORM_USETHREADS */
-
-isc_result_t
-irs_context_get(irs_context_t **contextp) {
- irs_context_t *context;
- isc_result_t result;
-
- REQUIRE(contextp != NULL && *contextp == NULL);
-
-#ifndef ISC_PLATFORM_USETHREADS
- if (irs_g_context == NULL) {
- result = irs_context_create(&irs_g_context);
- if (result != ISC_R_SUCCESS)
- return (result);
- }
-
- context = irs_g_context;
-#else
- result = thread_key_init();
- if (result != ISC_R_SUCCESS)
- return (result);
-
- context = isc_thread_key_getspecific(irs_context_key);
- if (context == NULL) {
- result = irs_context_create(&context);
- if (result != ISC_R_SUCCESS)
- return (result);
- result = isc_thread_key_setspecific(irs_context_key, context);
- if (result != ISC_R_SUCCESS) {
- irs_context_destroy(&context);
- return (result);
- }
- }
-#endif /* ISC_PLATFORM_USETHREADS */
-
- *contextp = context;
-
- return (ISC_R_SUCCESS);
-}
-
-isc_result_t
-irs_context_create(irs_context_t **contextp) {
- isc_result_t result;
- irs_context_t *context;
- isc_appctx_t *actx = NULL;
- isc_mem_t *mctx = NULL;
- isc_taskmgr_t *taskmgr = NULL;
- isc_socketmgr_t *socketmgr = NULL;
- isc_timermgr_t *timermgr = NULL;
- dns_client_t *client = NULL;
- isc_sockaddrlist_t *nameservers;
- irs_dnsconf_dnskeylist_t *trustedkeys;
- irs_dnsconf_dnskey_t *trustedkey;
-
- isc_lib_register();
- result = dns_lib_init();
- if (result != ISC_R_SUCCESS)
- return (result);
-
- result = ctxs_init(&mctx, &actx, &taskmgr, &socketmgr, &timermgr);
- if (result != ISC_R_SUCCESS)
- return (result);
-
- result = isc_app_ctxstart(actx);
- if (result != ISC_R_SUCCESS) {
- ctxs_destroy(&mctx, &actx, &taskmgr, &socketmgr, &timermgr);
- return (result);
- }
-
- context = isc_mem_get(mctx, sizeof(*context));
- if (context == NULL) {
- ctxs_destroy(&mctx, &actx, &taskmgr, &socketmgr, &timermgr);
- return (ISC_R_NOMEMORY);
- }
-
- context->mctx = mctx;
- context->actx = actx;
- context->taskmgr = taskmgr;
- context->socketmgr = socketmgr;
- context->timermgr = timermgr;
- context->resconf = NULL;
- context->dnsconf = NULL;
- context->task = NULL;
- result = isc_task_create(taskmgr, 0, &context->task);
- if (result != ISC_R_SUCCESS)
- goto fail;
-
- /* Create a DNS client object */
- result = dns_client_createx(mctx, actx, taskmgr, socketmgr, timermgr,
- 0, &client);
- if (result != ISC_R_SUCCESS)
- goto fail;
- context->dnsclient = client;
-
- /* Read resolver configuration file */
- result = irs_resconf_load(mctx, RESOLV_CONF, &context->resconf);
- if (result != ISC_R_SUCCESS)
- goto fail;
- /* Set nameservers */
- nameservers = irs_resconf_getnameservers(context->resconf);
- result = dns_client_setservers(client, dns_rdataclass_in, NULL,
- nameservers);
- if (result != ISC_R_SUCCESS)
- goto fail;
-
- /* Read advanced DNS configuration (if any) */
- result = irs_dnsconf_load(mctx, DNS_CONF, &context->dnsconf);
- if (result != ISC_R_SUCCESS)
- goto fail;
- trustedkeys = irs_dnsconf_gettrustedkeys(context->dnsconf);
- for (trustedkey = ISC_LIST_HEAD(*trustedkeys);
- trustedkey != NULL;
- trustedkey = ISC_LIST_NEXT(trustedkey, link)) {
- result = dns_client_addtrustedkey(client, dns_rdataclass_in,
- trustedkey->keyname,
- trustedkey->keydatabuf);
- if (result != ISC_R_SUCCESS)
- goto fail;
- }
-
- context->magic = IRS_CONTEXT_MAGIC;
- *contextp = context;
-
- return (ISC_R_SUCCESS);
-
- fail:
- if (context->task != NULL)
- isc_task_detach(&context->task);
- if (context->resconf != NULL)
- irs_resconf_destroy(&context->resconf);
- if (context->dnsconf != NULL)
- irs_dnsconf_destroy(&context->dnsconf);
- if (client != NULL)
- dns_client_destroy(&client);
- ctxs_destroy(NULL, &actx, &taskmgr, &socketmgr, &timermgr);
- isc_mem_putanddetach(&mctx, context, sizeof(*context));
-
- return (result);
-}
-
-void
-irs_context_destroy(irs_context_t **contextp) {
- irs_context_t *context;
-
- REQUIRE(contextp != NULL);
- context = *contextp;
- REQUIRE(IRS_CONTEXT_VALID(context));
-
- isc_task_detach(&context->task);
- irs_dnsconf_destroy(&context->dnsconf);
- irs_resconf_destroy(&context->resconf);
- dns_client_destroy(&context->dnsclient);
-
- ctxs_destroy(NULL, &context->actx, &context->taskmgr,
- &context->socketmgr, &context->timermgr);
-
- context->magic = 0;
-
- isc_mem_putanddetach(&context->mctx, context, sizeof(*context));
-
- *contextp = NULL;
-
-#ifndef ISC_PLATFORM_USETHREADS
- irs_g_context = NULL;
-#else
- (void)isc_thread_key_setspecific(irs_context_key, NULL);
-#endif
-}
-
-isc_mem_t *
-irs_context_getmctx(irs_context_t *context) {
- REQUIRE(IRS_CONTEXT_VALID(context));
-
- return (context->mctx);
-}
-
-isc_appctx_t *
-irs_context_getappctx(irs_context_t *context) {
- REQUIRE(IRS_CONTEXT_VALID(context));
-
- return (context->actx);
-}
-
-isc_taskmgr_t *
-irs_context_gettaskmgr(irs_context_t *context) {
- REQUIRE(IRS_CONTEXT_VALID(context));
-
- return (context->taskmgr);
-}
-
-isc_timermgr_t *
-irs_context_gettimermgr(irs_context_t *context) {
- REQUIRE(IRS_CONTEXT_VALID(context));
-
- return (context->timermgr);
-}
-
-isc_task_t *
-irs_context_gettask(irs_context_t *context) {
- REQUIRE(IRS_CONTEXT_VALID(context));
-
- return (context->task);
-}
-
-dns_client_t *
-irs_context_getdnsclient(irs_context_t *context) {
- REQUIRE(IRS_CONTEXT_VALID(context));
-
- return (context->dnsclient);
-}
-
-irs_resconf_t *
-irs_context_getresconf(irs_context_t *context) {
- REQUIRE(IRS_CONTEXT_VALID(context));
-
- return (context->resconf);
-}
-
-irs_dnsconf_t *
-irs_context_getdnsconf(irs_context_t *context) {
- REQUIRE(IRS_CONTEXT_VALID(context));
-
- return (context->dnsconf);
-}