xref: /netbsd-src/external/mpl/dhcp/bind/dist/lib/dns/lib.c (revision 4afad4b7fa6d4a0d3dedf41d1587a7250710ae54)
1*4afad4b7Schristos /*	$NetBSD: lib.c,v 1.1 2024/02/18 20:57:32 christos Exp $	*/
2*4afad4b7Schristos 
3*4afad4b7Schristos /*
4*4afad4b7Schristos  * Copyright (C) Internet Systems Consortium, Inc. ("ISC")
5*4afad4b7Schristos  *
6*4afad4b7Schristos  * SPDX-License-Identifier: MPL-2.0
7*4afad4b7Schristos  *
8*4afad4b7Schristos  * This Source Code Form is subject to the terms of the Mozilla Public
9*4afad4b7Schristos  * License, v. 2.0.  If a copy of the MPL was not distributed with this
10*4afad4b7Schristos  * file, you can obtain one at https://mozilla.org/MPL/2.0/.
11*4afad4b7Schristos  *
12*4afad4b7Schristos  * See the COPYRIGHT file distributed with this work for additional
13*4afad4b7Schristos  * information regarding copyright ownership.
14*4afad4b7Schristos  */
15*4afad4b7Schristos 
16*4afad4b7Schristos /*! \file */
17*4afad4b7Schristos 
18*4afad4b7Schristos #include <stdbool.h>
19*4afad4b7Schristos #include <stddef.h>
20*4afad4b7Schristos 
21*4afad4b7Schristos #include <isc/hash.h>
22*4afad4b7Schristos #include <isc/mem.h>
23*4afad4b7Schristos #include <isc/mutex.h>
24*4afad4b7Schristos #include <isc/once.h>
25*4afad4b7Schristos #include <isc/refcount.h>
26*4afad4b7Schristos #include <isc/util.h>
27*4afad4b7Schristos 
28*4afad4b7Schristos #include <dns/db.h>
29*4afad4b7Schristos #include <dns/ecdb.h>
30*4afad4b7Schristos #include <dns/lib.h>
31*4afad4b7Schristos #include <dns/result.h>
32*4afad4b7Schristos 
33*4afad4b7Schristos #include <dst/dst.h>
34*4afad4b7Schristos 
35*4afad4b7Schristos /***
36*4afad4b7Schristos  *** Globals
37*4afad4b7Schristos  ***/
38*4afad4b7Schristos 
39*4afad4b7Schristos LIBDNS_EXTERNAL_DATA unsigned int dns_pps = 0U;
40*4afad4b7Schristos 
41*4afad4b7Schristos /***
42*4afad4b7Schristos  *** Functions
43*4afad4b7Schristos  ***/
44*4afad4b7Schristos 
45*4afad4b7Schristos static isc_once_t init_once = ISC_ONCE_INIT;
46*4afad4b7Schristos static isc_mem_t *dns_g_mctx = NULL;
47*4afad4b7Schristos static dns_dbimplementation_t *dbimp = NULL;
48*4afad4b7Schristos static bool initialize_done = false;
49*4afad4b7Schristos static isc_refcount_t references;
50*4afad4b7Schristos 
51*4afad4b7Schristos static void
initialize(void)52*4afad4b7Schristos initialize(void) {
53*4afad4b7Schristos 	isc_result_t result;
54*4afad4b7Schristos 
55*4afad4b7Schristos 	REQUIRE(!initialize_done);
56*4afad4b7Schristos 
57*4afad4b7Schristos 	isc_refcount_init(&references, 0);
58*4afad4b7Schristos 
59*4afad4b7Schristos 	isc_mem_create(&dns_g_mctx);
60*4afad4b7Schristos 	dns_result_register();
61*4afad4b7Schristos 	result = dns_ecdb_register(dns_g_mctx, &dbimp);
62*4afad4b7Schristos 	if (result != ISC_R_SUCCESS) {
63*4afad4b7Schristos 		goto cleanup_mctx;
64*4afad4b7Schristos 	}
65*4afad4b7Schristos 
66*4afad4b7Schristos 	result = dst_lib_init(dns_g_mctx, NULL);
67*4afad4b7Schristos 	if (result != ISC_R_SUCCESS) {
68*4afad4b7Schristos 		goto cleanup_db;
69*4afad4b7Schristos 	}
70*4afad4b7Schristos 
71*4afad4b7Schristos 	initialize_done = true;
72*4afad4b7Schristos 	return;
73*4afad4b7Schristos 
74*4afad4b7Schristos cleanup_db:
75*4afad4b7Schristos 	if (dbimp != NULL) {
76*4afad4b7Schristos 		dns_ecdb_unregister(&dbimp);
77*4afad4b7Schristos 	}
78*4afad4b7Schristos cleanup_mctx:
79*4afad4b7Schristos 	if (dns_g_mctx != NULL) {
80*4afad4b7Schristos 		isc_mem_detach(&dns_g_mctx);
81*4afad4b7Schristos 	}
82*4afad4b7Schristos }
83*4afad4b7Schristos 
84*4afad4b7Schristos isc_result_t
dns_lib_init(void)85*4afad4b7Schristos dns_lib_init(void) {
86*4afad4b7Schristos 	isc_result_t result;
87*4afad4b7Schristos 
88*4afad4b7Schristos 	/*
89*4afad4b7Schristos 	 * Since this routine is expected to be used by a normal application,
90*4afad4b7Schristos 	 * it should be better to return an error, instead of an emergency
91*4afad4b7Schristos 	 * abort, on any failure.
92*4afad4b7Schristos 	 */
93*4afad4b7Schristos 	result = isc_once_do(&init_once, initialize);
94*4afad4b7Schristos 	if (result != ISC_R_SUCCESS) {
95*4afad4b7Schristos 		return (result);
96*4afad4b7Schristos 	}
97*4afad4b7Schristos 
98*4afad4b7Schristos 	if (!initialize_done) {
99*4afad4b7Schristos 		return (ISC_R_FAILURE);
100*4afad4b7Schristos 	}
101*4afad4b7Schristos 
102*4afad4b7Schristos 	isc_refcount_increment0(&references);
103*4afad4b7Schristos 
104*4afad4b7Schristos 	return (ISC_R_SUCCESS);
105*4afad4b7Schristos }
106*4afad4b7Schristos 
107*4afad4b7Schristos void
dns_lib_shutdown(void)108*4afad4b7Schristos dns_lib_shutdown(void) {
109*4afad4b7Schristos 	if (isc_refcount_decrement(&references) == 1) {
110*4afad4b7Schristos 		dst_lib_destroy();
111*4afad4b7Schristos 
112*4afad4b7Schristos 		isc_refcount_destroy(&references);
113*4afad4b7Schristos 
114*4afad4b7Schristos 		if (dbimp != NULL) {
115*4afad4b7Schristos 			dns_ecdb_unregister(&dbimp);
116*4afad4b7Schristos 		}
117*4afad4b7Schristos 		if (dns_g_mctx != NULL) {
118*4afad4b7Schristos 			isc_mem_detach(&dns_g_mctx);
119*4afad4b7Schristos 		}
120*4afad4b7Schristos 	}
121*4afad4b7Schristos }
122