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