96754ed7b400ce080279de2f92111ad868105290Bob Halley/*
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews * Copyright (C) 1999-2001, 2004, 2005, 2007, 2009, 2013-2016 Internet Systems Consortium, Inc. ("ISC")
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence *
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews * This Source Code Form is subject to the terms of the Mozilla Public
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews * License, v. 2.0. If a copy of the MPL was not distributed with this
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews * file, You can obtain one at http://mozilla.org/MPL/2.0/.
96754ed7b400ce080279de2f92111ad868105290Bob Halley */
96754ed7b400ce080279de2f92111ad868105290Bob Halley
9f8d002a665cb12a5236883c697ea1f1c96409b8Evan Hunt/* $Id: lib.c,v 1.19 2009/09/03 00:12:23 each Exp $ */
ab023a65562e62b85a824509d829b6fad87e00b1Rob Austein
ab023a65562e62b85a824509d829b6fad87e00b1Rob Austein/*! \file */
9c3531d72aeaad6c5f01efe6a1c82023e1379e4dDavid Lawrence
96754ed7b400ce080279de2f92111ad868105290Bob Halley#include <config.h>
96754ed7b400ce080279de2f92111ad868105290Bob Halley
5ae91ef8762a314a126accc3764897ef19504eb8Brian Wellington#include <stddef.h>
5ae91ef8762a314a126accc3764897ef19504eb8Brian Wellington
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉#include <isc/hash.h>
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉#include <isc/mem.h>
96754ed7b400ce080279de2f92111ad868105290Bob Halley#include <isc/msgcat.h>
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉#include <isc/mutex.h>
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉#include <isc/once.h>
364a82f7c25b62967678027043425201a5e5171aBob Halley#include <isc/util.h>
96754ed7b400ce080279de2f92111ad868105290Bob Halley
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉#include <dns/db.h>
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉#include <dns/ecdb.h>
96754ed7b400ce080279de2f92111ad868105290Bob Halley#include <dns/lib.h>
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉#include <dns/result.h>
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉#include <dst/dst.h>
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉
96754ed7b400ce080279de2f92111ad868105290Bob Halley
96754ed7b400ce080279de2f92111ad868105290Bob Halley/***
96754ed7b400ce080279de2f92111ad868105290Bob Halley *** Globals
96754ed7b400ce080279de2f92111ad868105290Bob Halley ***/
96754ed7b400ce080279de2f92111ad868105290Bob Halley
261a6a1f7d95eaf0cd882f3123dcfd775517a54fMark AndrewsLIBDNS_EXTERNAL_DATA unsigned int dns_pps = 0U;
e61793f0865117ad87a19d6e245bea8f3b712d1bDanny MayerLIBDNS_EXTERNAL_DATA isc_msgcat_t * dns_msgcat = NULL;
96754ed7b400ce080279de2f92111ad868105290Bob Halley
96754ed7b400ce080279de2f92111ad868105290Bob Halley
96754ed7b400ce080279de2f92111ad868105290Bob Halley/***
96754ed7b400ce080279de2f92111ad868105290Bob Halley *** Private
96754ed7b400ce080279de2f92111ad868105290Bob Halley ***/
96754ed7b400ce080279de2f92111ad868105290Bob Halley
96754ed7b400ce080279de2f92111ad868105290Bob Halleystatic isc_once_t msgcat_once = ISC_ONCE_INIT;
96754ed7b400ce080279de2f92111ad868105290Bob Halley
96754ed7b400ce080279de2f92111ad868105290Bob Halley
96754ed7b400ce080279de2f92111ad868105290Bob Halley/***
96754ed7b400ce080279de2f92111ad868105290Bob Halley *** Functions
96754ed7b400ce080279de2f92111ad868105290Bob Halley ***/
96754ed7b400ce080279de2f92111ad868105290Bob Halley
96754ed7b400ce080279de2f92111ad868105290Bob Halleystatic void
96754ed7b400ce080279de2f92111ad868105290Bob Halleyopen_msgcat(void) {
96754ed7b400ce080279de2f92111ad868105290Bob Halley isc_msgcat_open("libdns.cat", &dns_msgcat);
96754ed7b400ce080279de2f92111ad868105290Bob Halley}
96754ed7b400ce080279de2f92111ad868105290Bob Halley
96754ed7b400ce080279de2f92111ad868105290Bob Halleyvoid
96754ed7b400ce080279de2f92111ad868105290Bob Halleydns_lib_initmsgcat(void) {
96754ed7b400ce080279de2f92111ad868105290Bob Halley
96754ed7b400ce080279de2f92111ad868105290Bob Halley /*
96754ed7b400ce080279de2f92111ad868105290Bob Halley * Initialize the DNS library's message catalog, dns_msgcat, if it
96754ed7b400ce080279de2f92111ad868105290Bob Halley * has not already been initialized.
96754ed7b400ce080279de2f92111ad868105290Bob Halley */
96754ed7b400ce080279de2f92111ad868105290Bob Halley
96754ed7b400ce080279de2f92111ad868105290Bob Halley RUNTIME_CHECK(isc_once_do(&msgcat_once, open_msgcat) == ISC_R_SUCCESS);
96754ed7b400ce080279de2f92111ad868105290Bob Halley}
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉static isc_once_t init_once = ISC_ONCE_INIT;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉static isc_mem_t *dns_g_mctx = NULL;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉static dns_dbimplementation_t *dbimp = NULL;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉static isc_boolean_t initialize_done = ISC_FALSE;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉static isc_mutex_t reflock;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉static unsigned int references = 0;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉static void
9f8d002a665cb12a5236883c697ea1f1c96409b8Evan Huntinitialize(void) {
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 isc_result_t result;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 REQUIRE(initialize_done == ISC_FALSE);
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 result = isc_mem_create(0, 0, &dns_g_mctx);
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 if (result != ISC_R_SUCCESS)
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 return;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 dns_result_register();
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 result = dns_ecdb_register(dns_g_mctx, &dbimp);
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 if (result != ISC_R_SUCCESS)
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 goto cleanup_mctx;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 result = isc_hash_create(dns_g_mctx, NULL, DNS_NAME_MAXWIRE);
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 if (result != ISC_R_SUCCESS)
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 goto cleanup_db;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 result = dst_lib_init(dns_g_mctx, NULL, 0);
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 if (result != ISC_R_SUCCESS)
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 goto cleanup_hash;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 result = isc_mutex_init(&reflock);
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 if (result != ISC_R_SUCCESS)
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 goto cleanup_dst;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 initialize_done = ISC_TRUE;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 return;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 cleanup_dst:
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 dst_lib_destroy();
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 cleanup_hash:
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 isc_hash_destroy();
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 cleanup_db:
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt if (dbimp != NULL)
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt dns_ecdb_unregister(&dbimp);
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 cleanup_mctx:
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt if (dns_g_mctx != NULL)
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt isc_mem_detach(&dns_g_mctx);
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉}
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉isc_result_t
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉dns_lib_init(void) {
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 isc_result_t result;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 /*
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 * Since this routine is expected to be used by a normal application,
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 * it should be better to return an error, instead of an emergency
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 * abort, on any failure.
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 */
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 result = isc_once_do(&init_once, initialize);
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 if (result != ISC_R_SUCCESS)
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 return (result);
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 if (!initialize_done)
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 return (ISC_R_FAILURE);
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 LOCK(&reflock);
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 references++;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 UNLOCK(&reflock);
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 return (ISC_R_SUCCESS);
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉}
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉void
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉dns_lib_shutdown(void) {
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 isc_boolean_t cleanup_ok = ISC_FALSE;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 LOCK(&reflock);
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 if (--references == 0)
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 cleanup_ok = ISC_TRUE;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 UNLOCK(&reflock);
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 if (!cleanup_ok)
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 return;
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉 dst_lib_destroy();
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt if (isc_hashctx != NULL)
a00f9e2f50675bd43cc6a9fe2669709162a2ccb4Evan Hunt isc_hash_destroy();
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt if (dbimp != NULL)
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt dns_ecdb_unregister(&dbimp);
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt if (dns_g_mctx != NULL)
b99bfa184bc9375421b5df915eea7dfac6a68a99Evan Hunt isc_mem_detach(&dns_g_mctx);
307d2084502eddc7ce921e5ce439aec3531d90e0Tatuya JINMEI 神明達哉}