/* * Copyright (C) 2002 Stichting NLnet, Netherlands, stichting@nlnet.nl. * * Permission to use, copy, modify, and 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 STICHTING NLNET * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL * STICHTING NLNET 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. * * The development of Dynamically Loadable Zones (DLZ) for Bind 9 was * conceived and contributed by Rob Butler. * * Permission to use, copy, modify, and 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 ROB BUTLER * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL * ROB BUTLER 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. */ /* * Copyright (C) 1999-2001, 2016 Internet Systems Consortium, Inc. ("ISC") * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ #ifdef DLZ_STUB #include #include #include #include #include #include #include #include #include #include #include #include #include static dns_sdlzimplementation_t *dlz_stub = NULL; typedef struct config_data { char *myzone; char *myname; char *myip; isc_mem_t *mctx; } config_data_t; /* * SDLZ methods */ static isc_result_t stub_dlz_allnodes(const char *zone, void *driverarg, void *dbdata, dns_sdlzallnodes_t *allnodes) { config_data_t *cd; isc_result_t result; UNUSED(zone); UNUSED(driverarg); cd = (config_data_t *) dbdata; result = dns_sdlz_putnamedrr(allnodes, cd->myname, "soa", 86400, "web root.localhost. " "0 28800 7200 604800 86400"); if (result != ISC_R_SUCCESS) return (ISC_R_FAILURE); result = dns_sdlz_putnamedrr(allnodes, "ns", "ns", 86400, cd->myname); if (result != ISC_R_SUCCESS) return (ISC_R_FAILURE); result = dns_sdlz_putnamedrr(allnodes, cd->myname, "a", 1, cd->myip); if (result != ISC_R_SUCCESS) return (ISC_R_FAILURE); return (ISC_R_SUCCESS); } static isc_result_t stub_dlz_allowzonexfr(void *driverarg, void *dbdata, const char *name, const char *client) { UNUSED(driverarg); UNUSED(dbdata); UNUSED(name); UNUSED(client); return ISC_R_SUCCESS; } static isc_result_t stub_dlz_authority(const char *zone, void *driverarg, void *dbdata, dns_sdlzlookup_t *lookup) { isc_result_t result; config_data_t *cd; UNUSED(driverarg); cd = (config_data_t *) dbdata; if (strcmp(zone, cd->myzone) == 0) { result = dns_sdlz_putsoa(lookup, cd->myname, "root.localhost.", 0); if (result != ISC_R_SUCCESS) return (ISC_R_FAILURE); result = dns_sdlz_putrr(lookup, "ns", 86400, cd->myname); if (result != ISC_R_SUCCESS) return (ISC_R_FAILURE); return (ISC_R_SUCCESS); } return (ISC_R_NOTFOUND); } static isc_result_t stub_dlz_findzonedb(void *driverarg, void *dbdata, const char *name, dns_clientinfomethods_t *methods, dns_clientinfo_t *clientinfo) { config_data_t *cd; UNUSED(driverarg); UNUSED(methods); UNUSED(clientinfo); cd = (config_data_t *) dbdata; /* Write info message to log */ isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, DNS_LOGMODULE_DLZ, ISC_LOG_DEBUG(2), "dlz_stub findzone looking for '%s'", name); if (strcmp(cd->myzone, name) == 0) return (ISC_R_SUCCESS); else return (ISC_R_NOTFOUND); } static isc_result_t stub_dlz_lookup(const char *zone, const char *name, void *driverarg, void *dbdata, dns_sdlzlookup_t *lookup, dns_clientinfomethods_t *methods, dns_clientinfo_t *clientinfo) { isc_result_t result; config_data_t *cd; UNUSED(zone); UNUSED(driverarg); UNUSED(methods); UNUSED(clientinfo); cd = (config_data_t *) dbdata; if (strcmp(name, cd->myname) == 0) { result = dns_sdlz_putrr(lookup, "a", 1, cd->myip); if (result != ISC_R_SUCCESS) return (ISC_R_FAILURE); return (ISC_R_SUCCESS); } return (ISC_R_FAILURE); } static isc_result_t stub_dlz_create(const char *dlzname, unsigned int argc, char *argv[], void *driverarg, void **dbdata) { config_data_t *cd; UNUSED(driverarg); if (argc < 4) return (ISC_R_FAILURE); /* * Write info message to log */ isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, DNS_LOGMODULE_DLZ, ISC_LOG_INFO, "Loading '%s' using DLZ_stub driver. " "Zone: %s, Name: %s IP: %s", dlzname, argv[1], argv[2], argv[3]); cd = isc_mem_get(ns_g_mctx, sizeof(config_data_t)); if ((cd) == NULL) { return (ISC_R_NOMEMORY); } memset(cd, 0, sizeof(config_data_t)); cd->myzone = isc_mem_strdup(ns_g_mctx, argv[1]); if (cd->myzone == NULL) { isc_mem_put(ns_g_mctx, cd, sizeof(config_data_t)); return (ISC_R_NOMEMORY); } cd->myname = isc_mem_strdup(ns_g_mctx, argv[2]); if (cd->myname == NULL) { isc_mem_put(ns_g_mctx, cd, sizeof(config_data_t)); isc_mem_free(ns_g_mctx, cd->myzone); return (ISC_R_NOMEMORY); } cd->myip = isc_mem_strdup(ns_g_mctx, argv[3]); if (cd->myip == NULL) { isc_mem_put(ns_g_mctx, cd, sizeof(config_data_t)); isc_mem_free(ns_g_mctx, cd->myname); isc_mem_free(ns_g_mctx, cd->myzone); return (ISC_R_NOMEMORY); } isc_mem_attach(ns_g_mctx, &cd->mctx); *dbdata = cd; return(ISC_R_SUCCESS); } static void stub_dlz_destroy(void *driverarg, void *dbdata) { config_data_t *cd; isc_mem_t *mctx; UNUSED(driverarg); cd = (config_data_t *) dbdata; /* * Write debugging message to log */ isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, DNS_LOGMODULE_DLZ, ISC_LOG_DEBUG(2), "Unloading DLZ_stub driver."); isc_mem_free(ns_g_mctx, cd->myzone); isc_mem_free(ns_g_mctx, cd->myname); isc_mem_free(ns_g_mctx, cd->myip); mctx = cd->mctx; isc_mem_put(mctx, cd, sizeof(config_data_t)); isc_mem_detach(&mctx); } static dns_sdlzmethods_t dlz_stub_methods = { stub_dlz_create, stub_dlz_destroy, stub_dlz_findzonedb, stub_dlz_lookup, stub_dlz_authority, stub_dlz_allnodes, stub_dlz_allowzonexfr, NULL, NULL, NULL, NULL, NULL, NULL, NULL, }; /*% * Wrapper around dns_sdlzregister(). */ isc_result_t dlz_stub_init(void) { isc_result_t result; /* * Write debugging message to log */ isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, DNS_LOGMODULE_DLZ, ISC_LOG_DEBUG(2), "Registering DLZ_stub driver."); result = dns_sdlzregister("dlz_stub", &dlz_stub_methods, NULL, DNS_SDLZFLAG_RELATIVEOWNER | DNS_SDLZFLAG_RELATIVERDATA, ns_g_mctx, &dlz_stub); if (result != ISC_R_SUCCESS) { UNEXPECTED_ERROR(__FILE__, __LINE__, "dns_sdlzregister() failed: %s", isc_result_totext(result)); result = ISC_R_UNEXPECTED; } return result; } /* * Wrapper around dns_sdlzunregister(). */ void dlz_stub_clear(void) { /* * Write debugging message to log */ isc_log_write(dns_lctx, DNS_LOGCATEGORY_DATABASE, DNS_LOGMODULE_DLZ, ISC_LOG_DEBUG(2), "Unregistering DLZ_stub driver."); if (dlz_stub != NULL) dns_sdlzunregister(&dlz_stub); } #endif