72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt/*
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt * Copyright (C) 2002 Stichting NLnet, Netherlands, stichting@nlnet.nl.
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt *
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt * Permission to use, copy, modify, and distribute this software for any
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt * purpose with or without fee is hereby granted, provided that the
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt * above copyright notice and this permission notice appear in all
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt * copies.
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt *
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt * THE SOFTWARE IS PROVIDED "AS IS" AND STICHTING NLNET
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt * STICHTING NLNET BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt * USE OR PERFORMANCE OF THIS SOFTWARE.
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt *
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt * The development of Dynamically Loadable Zones (DLZ) for BIND 9 was
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt * conceived and contributed by Rob Butler.
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt *
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt * Permission to use, copy, modify, and distribute this software for any
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt * purpose with or without fee is hereby granted, provided that the
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt * above copyright notice and this permission notice appear in all
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt * copies.
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt *
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt * THE SOFTWARE IS PROVIDED "AS IS" AND ROB BUTLER
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt * ROB BUTLER BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt * USE OR PERFORMANCE OF THIS SOFTWARE.
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt/*
02d54949f0f1db4729e14c3322b207f58d2578a4Mark Andrews * Copyright (C) 1999-2001, 2013, 2016 Internet Systems Consortium, Inc. ("ISC")
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt *
02d54949f0f1db4729e14c3322b207f58d2578a4Mark Andrews * This Source Code Form is subject to the terms of the Mozilla Public
02d54949f0f1db4729e14c3322b207f58d2578a4Mark Andrews * License, v. 2.0. If a copy of the MPL was not distributed with this
02d54949f0f1db4729e14c3322b207f58d2578a4Mark Andrews * file, You can obtain one at http://mozilla.org/MPL/2.0/.
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt/*
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt * This provides the externally loadable ldap DLZ module, without
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt * update support
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt#include <stdio.h>
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt#include <string.h>
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt#include <stdarg.h>
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt#include <stdint.h>
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt#include <stdlib.h>
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt#include <dlz_minimal.h>
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt#include <dlz_list.h>
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt#include <dlz_dbi.h>
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt#include <dlz_pthread.h>
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt/*
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt * Need older API functions from ldap.h.
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt#define LDAP_DEPRECATED 1
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt#include <ldap.h>
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt#define SIMPLE "simple"
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt#define KRB41 "krb41"
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt#define KRB42 "krb42"
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt#define V2 "v2"
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt#define V3 "v3"
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt#define dbc_search_limit 30
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt#define ALLNODES 1
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt#define ALLOWXFR 2
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt#define AUTHORITY 3
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt#define FINDZONE 4
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt#define LOOKUP 5
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt/*%
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt * Structure to hold everthing needed by this "instance" of the LDAP
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt * driver remember, the driver code is only loaded once, but may have
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt * many separate instances.
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunttypedef struct {
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt#if PTHREADS
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt db_list_t *db; /*%< handle to a list of DB */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt#else
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt dbinstance_t *db; /*%< handle to db */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt#endif
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt int method; /*%< security authentication method */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt char *user; /*%< who is authenticating */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt char *cred; /*%< password for simple authentication method */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt int protocol; /*%< LDAP communication protocol version */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt char *hosts; /*%< LDAP server hosts */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt /* Helper functions from the dlz_dlopen driver */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt log_t *log;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt dns_sdlz_putrr_t *putrr;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt dns_sdlz_putnamedrr_t *putnamedrr;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt dns_dlz_writeablezone_t *writeable_zone;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt} ldap_instance_t;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt/* forward references */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
f469d5d440d9580e4c7007632d72a08a92a98d89Evan Hunt#if DLZ_DLOPEN_VERSION < 3
f469d5d440d9580e4c7007632d72a08a92a98d89Evan Huntisc_result_t
f469d5d440d9580e4c7007632d72a08a92a98d89Evan Huntdlz_findzonedb(void *dbdata, const char *name);
f469d5d440d9580e4c7007632d72a08a92a98d89Evan Hunt#else
72c86c105a7cf315036d7131a4ef408bc6227639Evan Huntisc_result_t
72c86c105a7cf315036d7131a4ef408bc6227639Evan Huntdlz_findzonedb(void *dbdata, const char *name,
f469d5d440d9580e4c7007632d72a08a92a98d89Evan Hunt dns_clientinfomethods_t *methods,
f469d5d440d9580e4c7007632d72a08a92a98d89Evan Hunt dns_clientinfo_t *clientinfo);
f469d5d440d9580e4c7007632d72a08a92a98d89Evan Hunt#endif
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Huntvoid
72c86c105a7cf315036d7131a4ef408bc6227639Evan Huntdlz_destroy(void *dbdata);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Huntstatic void
72c86c105a7cf315036d7131a4ef408bc6227639Evan Huntb9_add_helper(ldap_instance_t *db, const char *helper_name, void *ptr);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt/*
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt * Private methods
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt/*% checks that the LDAP URL parameters make sense */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Huntstatic isc_result_t
72c86c105a7cf315036d7131a4ef408bc6227639Evan Huntldap_checkURL(ldap_instance_t *db, char *URL, int attrCnt, const char *msg) {
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt isc_result_t result = ISC_R_SUCCESS;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt int ldap_result;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt LDAPURLDesc *ldap_url = NULL;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt if (!ldap_is_ldap_url(URL)) {
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt db->log(ISC_LOG_ERROR,
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt "%s query is not a valid LDAP URL", msg);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt result = ISC_R_FAILURE;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt goto cleanup;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt }
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt ldap_result = ldap_url_parse(URL, &ldap_url);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt if (ldap_result != LDAP_SUCCESS || ldap_url == NULL) {
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt db->log(ISC_LOG_ERROR, "parsing %s query failed", msg);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt result = ISC_R_FAILURE;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt goto cleanup;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt }
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt if (ldap_count_values(ldap_url->lud_attrs) < attrCnt) {
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt db->log(ISC_LOG_ERROR,
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt "%s query must specify at least "
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt "%d attributes to return", msg, attrCnt);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt result = ISC_R_FAILURE;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt goto cleanup;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt }
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt if (ldap_url->lud_host != NULL) {
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt db->log(ISC_LOG_ERROR,
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt "%s query must not specify a host", msg);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt result = ISC_R_FAILURE;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt goto cleanup;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt }
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt if (ldap_url->lud_port != 389) {
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt db->log(ISC_LOG_ERROR,
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt "%s query must not specify a port", msg);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt result = ISC_R_FAILURE;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt goto cleanup;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt }
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt if (ldap_url->lud_dn == NULL || strlen (ldap_url->lud_dn) < 1) {
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt db->log(ISC_LOG_ERROR,
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt "%s query must specify a search base", msg);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt result = ISC_R_FAILURE;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt goto cleanup;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt }
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt if (ldap_url->lud_exts != NULL || ldap_url->lud_crit_exts != 0) {
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt db->log(ISC_LOG_ERROR,
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt "%s uses extensions. "
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt "The driver does not support LDAP extensions.", msg);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt result = ISC_R_FAILURE;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt goto cleanup;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt }
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt cleanup:
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt if (ldap_url != NULL)
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt ldap_free_urldesc(ldap_url);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt return (result);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt}
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt/*% Connects / reconnects to LDAP server */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Huntstatic isc_result_t
72c86c105a7cf315036d7131a4ef408bc6227639Evan Huntldap_connect(ldap_instance_t *dbi, dbinstance_t *dbc) {
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt isc_result_t result;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt int ldap_result;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt /* if we have a connection, get ride of it. */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt if (dbc->dbconn != NULL) {
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt ldap_unbind_s((LDAP *) dbc->dbconn);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt dbc->dbconn = NULL;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt }
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt /* now connect / reconnect. */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt /* initialize. */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt dbc->dbconn = ldap_init(dbi->hosts, LDAP_PORT);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt if (dbc->dbconn == NULL)
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt return (ISC_R_NOMEMORY);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt /* set protocol version. */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt ldap_result = ldap_set_option((LDAP *) dbc->dbconn,
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt LDAP_OPT_PROTOCOL_VERSION,
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt &(dbi->protocol));
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt if (ldap_result != LDAP_SUCCESS) {
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt result = ISC_R_NOPERM;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt goto cleanup;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt }
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt /* "bind" to server. i.e. send username / pass */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt ldap_result = ldap_bind_s((LDAP *) dbc->dbconn, dbi->user,
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt dbi->cred, dbi->method);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt if (ldap_result != LDAP_SUCCESS) {
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt result = ISC_R_FAILURE;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt goto cleanup;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt }
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt return (ISC_R_SUCCESS);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt cleanup:
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt /* cleanup if failure. */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt if (dbc->dbconn != NULL) {
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt ldap_unbind_s((LDAP *) dbc->dbconn);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt dbc->dbconn = NULL;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt }
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt return (result);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt}
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt#if PTHREADS
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt/*%
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt * Properly cleans up a list of database instances.
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt * This function is only used when the driver is compiled for
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt * multithreaded operation.
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Huntstatic void
72c86c105a7cf315036d7131a4ef408bc6227639Evan Huntldap_destroy_dblist(db_list_t *dblist) {
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt dbinstance_t *ndbi = NULL;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt dbinstance_t *dbi = NULL;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt /* get the first DBI in the list */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt ndbi = DLZ_LIST_HEAD(*dblist);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt /* loop through the list */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt while (ndbi != NULL) {
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt dbi = ndbi;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt /* get the next DBI in the list */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt ndbi = DLZ_LIST_NEXT(dbi, link);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt /* release DB connection */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt if (dbi->dbconn != NULL)
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt ldap_unbind_s((LDAP *) dbi->dbconn);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt /* release all memory that comprised a DBI */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt destroy_dbinstance(dbi);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt }
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt /* release memory for the list structure */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt free(dblist);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt}
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt/*%
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt * Loops through the list of DB instances, attempting to lock
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt * on the mutex. If successful, the DBI is reserved for use
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt * and the thread can perform queries against the database.
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt * If the lock fails, the next one in the list is tried.
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt * looping continues until a lock is obtained, or until
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt * the list has been searched dbc_search_limit times.
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt * This function is only used when the driver is compiled for
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt * multithreaded operation.
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Huntstatic dbinstance_t *
72c86c105a7cf315036d7131a4ef408bc6227639Evan Huntldap_find_avail_conn(ldap_instance_t *ldap) {
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt dbinstance_t *dbi = NULL;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt dbinstance_t *head;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt int count = 0;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt /* get top of list */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt head = dbi = DLZ_LIST_HEAD(*ldap->db);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt /* loop through list */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt while (count < dbc_search_limit) {
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt /* try to lock on the mutex */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt if (dlz_mutex_trylock(&dbi->lock) == 0)
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt return (dbi); /* success, return the DBI for use. */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt /* not successful, keep trying */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt dbi = DLZ_LIST_NEXT(dbi, link);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt /* check to see if we have gone to the top of the list. */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt if (dbi == NULL) {
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt count++;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt dbi = head;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt }
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt }
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt ldap->log(ISC_LOG_INFO,
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt "LDAP driver unable to find available connection "
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt "after searching %d times", count);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt return (NULL);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt}
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt#endif /* PTHREADS */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Huntstatic isc_result_t
72c86c105a7cf315036d7131a4ef408bc6227639Evan Huntldap_process_results(ldap_instance_t *db, LDAP *dbc, LDAPMessage *msg,
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt char **attrs, void *ptr, isc_boolean_t allnodes)
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt{
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt isc_result_t result = ISC_R_SUCCESS;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt int i = 0;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt int j;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt int len;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt char *attribute = NULL;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt LDAPMessage *entry;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt char *endp = NULL;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt char *host = NULL;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt char *type = NULL;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt char *data = NULL;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt char **vals = NULL;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt int ttl;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt /* get the first entry to process */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt entry = ldap_first_entry(dbc, msg);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt if (entry == NULL) {
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt db->log(ISC_LOG_INFO, "LDAP no entries to process.");
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt return (ISC_R_FAILURE);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt }
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt /* loop through all entries returned */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt while (entry != NULL) {
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt /* reset for this loop */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt ttl = 0;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt len = 0;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt i = 0;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt attribute = attrs[i];
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt /* determine how much space we need for data string */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt for (j = 0; attrs[j] != NULL; j++) {
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt /* get the list of values for this attribute. */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt vals = ldap_get_values(dbc, entry, attrs[j]);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt /* skip empty attributes. */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt if (vals == NULL || ldap_count_values(vals) < 1)
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt continue;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt /*
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt * we only use the first value. this driver
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt * does not support multi-valued attributes.
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt len = len + strlen(vals[0]) + 1;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt /* free vals for next loop */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt ldap_value_free(vals);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt }
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt /* allocate memory for data string */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt data = malloc(len + 1);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt if (data == NULL) {
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt db->log(ISC_LOG_ERROR,
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt "LDAP driver unable to allocate memory "
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt "while processing results");
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt result = ISC_R_FAILURE;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt goto cleanup;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt }
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt /*
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt * Make sure data is null termed at the beginning so
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt * we can check if any data was stored to it later.
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt data[0] = '\0';
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt /* reset j to re-use below */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt j = 0;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt /* loop through the attributes in the order specified. */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt while (attribute != NULL) {
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt /* get the list of values for this attribute. */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt vals = ldap_get_values(dbc, entry, attribute);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt /* skip empty attributes. */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt if (vals == NULL || vals[0] == NULL) {
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt /* increment attibute pointer */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt attribute = attrs[++i];
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt /* start loop over */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt continue;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt }
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt /*
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt * j initially = 0. Increment j each time we
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt * set a field that way next loop will set
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt * next field.
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt switch (j) {
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt case 0:
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt j++;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt /*
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt * convert text to int, make sure it
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt * worked right
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt ttl = strtol(vals[0], &endp, 10);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt if (*endp != '\0' || ttl < 0) {
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt db->log(ISC_LOG_ERROR,
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt "LDAP driver ttl must "
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt "be a postive number");
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt goto cleanup;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt }
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt break;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt case 1:
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt j++;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt type = strdup(vals[0]);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt break;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt case 2:
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt j++;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt if (allnodes)
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt host = strdup(vals[0]);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt else
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt strcpy(data, vals[0]);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt break;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt case 3:
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt j++;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt if (allnodes)
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt strcpy(data, vals[0]);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt else {
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt strcat(data, " ");
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt strcat(data, vals[0]);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt }
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt break;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt default:
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt strcat(data, " ");
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt strcat(data, vals[0]);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt break;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt }
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt /* free values */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt ldap_value_free(vals);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt vals = NULL;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt /* increment attibute pointer */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt attribute = attrs[++i];
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt }
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt if (type == NULL) {
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt db->log(ISC_LOG_ERROR,
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt "LDAP driver unable to retrieve DNS type");
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt result = ISC_R_FAILURE;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt goto cleanup;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt }
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt if (strlen(data) < 1) {
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt db->log(ISC_LOG_ERROR,
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt "LDAP driver unable to retrieve DNS data");
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt result = ISC_R_FAILURE;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt goto cleanup;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt }
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt if (allnodes && host != NULL) {
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt dns_sdlzallnodes_t *an = (dns_sdlzallnodes_t *) ptr;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt if (strcasecmp(host, "~") == 0)
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt result = db->putnamedrr(an, "*", type,
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt ttl, data);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt else
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt result = db->putnamedrr(an, host, type,
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt ttl, data);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt if (result != ISC_R_SUCCESS)
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt db->log(ISC_LOG_ERROR,
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt "ldap_dynamic: putnamedrr failed "
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt "for \"%s %s %u %s\" (%d)",
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt host, type, ttl, data, result);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt } else {
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt dns_sdlzlookup_t *lookup = (dns_sdlzlookup_t *) ptr;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt result = db->putrr(lookup, type, ttl, data);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt if (result != ISC_R_SUCCESS)
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt db->log(ISC_LOG_ERROR,
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt "ldap_dynamic: putrr failed "
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt "for \"%s %u %s\" (%s)",
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt type, ttl, data, result);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt }
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt if (result != ISC_R_SUCCESS) {
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt db->log(ISC_LOG_ERROR,
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt "LDAP driver failed "
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt "while sending data to BIND.");
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt goto cleanup;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt }
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt /* free memory for type, data and host for next loop */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt free(type);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt type = NULL;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt free(data);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt data = NULL;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt if (host != NULL) {
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt free(host);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt host = NULL;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt }
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt /* get the next entry to process */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt entry = ldap_next_entry(dbc, entry);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt }
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt cleanup:
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt /* de-allocate memory */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt if (vals != NULL)
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt ldap_value_free(vals);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt if (host != NULL)
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt free(host);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt if (type != NULL)
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt free(type);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt if (data != NULL)
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt free(data);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt return (result);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt}
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt/*%
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt * This function is the real core of the driver. Zone, record
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt * and client strings are passed in (or NULL is passed if the
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt * string is not available). The type of query we want to run
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt * is indicated by the query flag, and the dbdata object is passed
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt * passed in to. dbdata really holds either:
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt * 1) a list of database instances (in multithreaded mode) OR
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt * 2) a single database instance (in single threaded mode)
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt * The function will construct the query and obtain an available
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt * database instance (DBI). It will then run the query and hopefully
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt * obtain a result set.
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Huntstatic isc_result_t
72c86c105a7cf315036d7131a4ef408bc6227639Evan Huntldap_get_results(const char *zone, const char *record,
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt const char *client, unsigned int query,
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt void *dbdata, void *ptr)
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt{
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt isc_result_t result;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt ldap_instance_t *db = (ldap_instance_t *)dbdata;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt dbinstance_t *dbi = NULL;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt char *querystring = NULL;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt LDAPURLDesc *ldap_url = NULL;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt int ldap_result = 0;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt LDAPMessage *ldap_msg = NULL;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt int i;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt int entries;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt /* get db instance / connection */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt#if PTHREADS
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt /* find an available DBI from the list */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt dbi = ldap_find_avail_conn(db);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt#else /* PTHREADS */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt /*
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt * only 1 DBI - no need to lock instance lock either
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt * only 1 thread in the whole process, no possible contention.
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt dbi = (dbinstance_t *)(db->db);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt#endif /* PTHREADS */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt /* if DBI is null, can't do anything else */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt if (dbi == NULL)
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt return (ISC_R_FAILURE);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt /* set fields */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt if (zone != NULL) {
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt dbi->zone = strdup(zone);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt if (dbi->zone == NULL) {
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt result = ISC_R_NOMEMORY;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt goto cleanup;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt }
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt } else
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt dbi->zone = NULL;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt if (record != NULL) {
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt dbi->record = strdup(record);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt if (dbi->record == NULL) {
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt result = ISC_R_NOMEMORY;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt goto cleanup;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt }
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt } else
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt dbi->record = NULL;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt if (client != NULL) {
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt dbi->client = strdup(client);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt if (dbi->client == NULL) {
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt result = ISC_R_NOMEMORY;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt goto cleanup;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt }
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt } else
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt dbi->client = NULL;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt /* what type of query are we going to run? */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt switch (query) {
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt case ALLNODES:
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt /*
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt * if the query was not passed in from the config file
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt * then we can't run it. return not_implemented, so
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt * it's like the code for that operation was never
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt * built into the driver.... AHHH flexibility!!!
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt if (dbi->allnodes_q == NULL) {
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt result = ISC_R_NOTIMPLEMENTED;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt goto cleanup;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt } else
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt querystring = build_querystring(dbi->allnodes_q);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt break;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt case ALLOWXFR:
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt /* same as comments as ALLNODES */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt if (dbi->allowxfr_q == NULL) {
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt result = ISC_R_NOTIMPLEMENTED;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt goto cleanup;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt } else
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt querystring = build_querystring(dbi->allowxfr_q);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt break;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt case AUTHORITY:
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt /* same as comments as ALLNODES */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt if (dbi->authority_q == NULL) {
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt result = ISC_R_NOTIMPLEMENTED;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt goto cleanup;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt } else
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt querystring = build_querystring(dbi->authority_q);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt break;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt case FINDZONE:
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt /* this is required. It's the whole point of DLZ! */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt if (dbi->findzone_q == NULL) {
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt db->log(ISC_LOG_DEBUG(2),
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt "No query specified for findzone. "
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt "Findzone requires a query");
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt result = ISC_R_FAILURE;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt goto cleanup;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt } else
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt querystring = build_querystring(dbi->findzone_q);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt break;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt case LOOKUP:
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt /* this is required. It's also a major point of DLZ! */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt if (dbi->lookup_q == NULL) {
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt db->log(ISC_LOG_DEBUG(2),
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt "No query specified for lookup. "
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt "Lookup requires a query");
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt result = ISC_R_FAILURE;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt goto cleanup;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt } else
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt querystring = build_querystring(dbi->lookup_q);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt break;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt default:
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt /*
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt * this should never happen. If it does, the code is
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt * screwed up!
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt db->log(ISC_LOG_ERROR,
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt "Incorrect query flag passed to ldap_get_results");
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt result = ISC_R_UNEXPECTED;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt goto cleanup;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt }
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt /* if the querystring is null, Bummer, outta RAM. UPGRADE TIME!!! */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt if (querystring == NULL) {
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt result = ISC_R_NOMEMORY;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt goto cleanup;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt }
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt /*
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt * output the full query string during debug so we can see
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt * what lame error the query has.
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt db->log(ISC_LOG_DEBUG(1), "Query String: %s", querystring);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
f469d5d440d9580e4c7007632d72a08a92a98d89Evan Hunt /* break URL down into it's component parts, if error cleanup */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt ldap_result = ldap_url_parse(querystring, &ldap_url);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt if (ldap_result != LDAP_SUCCESS || ldap_url == NULL) {
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt result = ISC_R_FAILURE;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt goto cleanup;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt }
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt for (i = 0; i < 3; i++) {
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt /*
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt * dbi->dbconn may be null if trying to reconnect on a
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt * previous query failed.
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt if (dbi->dbconn == NULL) {
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt db->log(ISC_LOG_INFO,
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt "LDAP driver attempting to re-connect");
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt result = ldap_connect((ldap_instance_t *) dbdata, dbi);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt if (result != ISC_R_SUCCESS) {
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt result = ISC_R_FAILURE;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt continue;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt }
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt }
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt /* perform ldap search syncronously */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt ldap_result = ldap_search_s((LDAP *) dbi->dbconn,
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt ldap_url->lud_dn,
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt ldap_url->lud_scope,
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt ldap_url->lud_filter,
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt ldap_url->lud_attrs, 0, &ldap_msg);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt /*
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt * check return code. No such object is ok, just
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt * didn't find what we wanted
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt switch (ldap_result) {
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt case LDAP_NO_SUCH_OBJECT:
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt db->log(ISC_LOG_DEBUG(1),
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt "No object found matching query requirements");
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt result = ISC_R_NOTFOUND;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt goto cleanup;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt break;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt case LDAP_SUCCESS: /* on success do nothing */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt result = ISC_R_SUCCESS;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt i = 3;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt break;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt case LDAP_SERVER_DOWN:
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt db->log(ISC_LOG_INFO,
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt "LDAP driver attempting to re-connect");
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt result = ldap_connect((ldap_instance_t *) dbdata, dbi);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt if (result != ISC_R_SUCCESS)
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt result = ISC_R_FAILURE;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt break;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt default:
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt /*
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt * other errors not ok. Log error message and
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt * get out
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt db->log(ISC_LOG_ERROR, "LDAP error: %s",
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt ldap_err2string(ldap_result));
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt result = ISC_R_FAILURE;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt goto cleanup;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt break;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt }
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt }
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt if (result != ISC_R_SUCCESS)
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt goto cleanup;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt switch (query) {
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt case ALLNODES:
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt result = ldap_process_results(db, (LDAP *) dbi->dbconn,
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt ldap_msg, ldap_url->lud_attrs,
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt ptr, ISC_TRUE);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt break;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt case AUTHORITY:
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt case LOOKUP:
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt result = ldap_process_results(db, (LDAP *) dbi->dbconn,
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt ldap_msg, ldap_url->lud_attrs,
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt ptr, ISC_FALSE);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt break;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt case ALLOWXFR:
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt entries = ldap_count_entries((LDAP *) dbi->dbconn, ldap_msg);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt if (entries == 0)
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt result = ISC_R_NOPERM;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt else if (entries > 0)
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt result = ISC_R_SUCCESS;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt else
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt result = ISC_R_FAILURE;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt break;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt case FINDZONE:
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt entries = ldap_count_entries((LDAP *) dbi->dbconn, ldap_msg);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt if (entries == 0)
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt result = ISC_R_NOTFOUND;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt else if (entries > 0)
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt result = ISC_R_SUCCESS;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt else
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt result = ISC_R_FAILURE;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt break;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt default:
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt /*
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt * this should never happen. If it does, the code is
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt * screwed up!
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt db->log(ISC_LOG_ERROR,
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt "Incorrect query flag passed to ldap_get_results");
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt result = ISC_R_UNEXPECTED;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt }
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt cleanup:
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt /* it's always good to cleanup after yourself */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
f469d5d440d9580e4c7007632d72a08a92a98d89Evan Hunt /* if we retrieved results, free them */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt if (ldap_msg != NULL)
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt ldap_msgfree(ldap_msg);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt if (ldap_url != NULL)
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt ldap_free_urldesc(ldap_url);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt /* cleanup */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt if (dbi->zone != NULL)
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt free(dbi->zone);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt if (dbi->record != NULL)
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt free(dbi->record);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt if (dbi->client != NULL)
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt free(dbi->client);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt dbi->zone = dbi->record = dbi->client = NULL;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt /* release the lock so another thread can use this dbi */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt (void) dlz_mutex_unlock(&dbi->lock);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
f469d5d440d9580e4c7007632d72a08a92a98d89Evan Hunt /* release query string */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt if (querystring != NULL)
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt free(querystring);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt /* return result */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt return (result);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt}
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt/*
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt * DLZ methods
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Huntisc_result_t
72c86c105a7cf315036d7131a4ef408bc6227639Evan Huntdlz_allowzonexfr(void *dbdata, const char *name, const char *client) {
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt isc_result_t result;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt /* check to see if we are authoritative for the zone first */
f469d5d440d9580e4c7007632d72a08a92a98d89Evan Hunt#if DLZ_DLOPEN_VERSION < 3
f469d5d440d9580e4c7007632d72a08a92a98d89Evan Hunt result = dlz_findzonedb(dbdata, name);
f469d5d440d9580e4c7007632d72a08a92a98d89Evan Hunt#else
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt result = dlz_findzonedb(dbdata, name, NULL, NULL);
f469d5d440d9580e4c7007632d72a08a92a98d89Evan Hunt#endif
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt if (result != ISC_R_SUCCESS) {
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt return (result);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt }
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
f469d5d440d9580e4c7007632d72a08a92a98d89Evan Hunt /* get all the zone data */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt result = ldap_get_results(name, NULL, client, ALLOWXFR, dbdata, NULL);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt return (result);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt}
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Huntisc_result_t
72c86c105a7cf315036d7131a4ef408bc6227639Evan Huntdlz_allnodes(const char *zone, void *dbdata, dns_sdlzallnodes_t *allnodes)
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt{
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt return (ldap_get_results(zone, NULL, NULL, ALLNODES, dbdata, allnodes));
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt}
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Huntisc_result_t
72c86c105a7cf315036d7131a4ef408bc6227639Evan Huntdlz_authority(const char *zone, void *dbdata, dns_sdlzlookup_t *lookup) {
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt return (ldap_get_results(zone, NULL, NULL, AUTHORITY, dbdata, lookup));
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt}
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
f469d5d440d9580e4c7007632d72a08a92a98d89Evan Hunt#if DLZ_DLOPEN_VERSION < 3
f469d5d440d9580e4c7007632d72a08a92a98d89Evan Huntisc_result_t
f469d5d440d9580e4c7007632d72a08a92a98d89Evan Huntdlz_findzonedb(void *dbdata, const char *name)
f469d5d440d9580e4c7007632d72a08a92a98d89Evan Hunt#else
72c86c105a7cf315036d7131a4ef408bc6227639Evan Huntisc_result_t
72c86c105a7cf315036d7131a4ef408bc6227639Evan Huntdlz_findzonedb(void *dbdata, const char *name,
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt dns_clientinfomethods_t *methods,
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt dns_clientinfo_t *clientinfo)
f469d5d440d9580e4c7007632d72a08a92a98d89Evan Hunt#endif
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt{
f469d5d440d9580e4c7007632d72a08a92a98d89Evan Hunt#if DLZ_DLOPEN_VERSION >= 3
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt UNUSED(methods);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt UNUSED(clientinfo);
f469d5d440d9580e4c7007632d72a08a92a98d89Evan Hunt#endif
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt return (ldap_get_results(name, NULL, NULL, FINDZONE, dbdata, NULL));
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt}
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
f469d5d440d9580e4c7007632d72a08a92a98d89Evan Hunt#if DLZ_DLOPEN_VERSION == 1
f469d5d440d9580e4c7007632d72a08a92a98d89Evan Huntisc_result_t dlz_lookup(const char *zone, const char *name,
f469d5d440d9580e4c7007632d72a08a92a98d89Evan Hunt void *dbdata, dns_sdlzlookup_t *lookup)
f469d5d440d9580e4c7007632d72a08a92a98d89Evan Hunt#else
f469d5d440d9580e4c7007632d72a08a92a98d89Evan Huntisc_result_t dlz_lookup(const char *zone, const char *name,
f469d5d440d9580e4c7007632d72a08a92a98d89Evan Hunt void *dbdata, dns_sdlzlookup_t *lookup,
f469d5d440d9580e4c7007632d72a08a92a98d89Evan Hunt dns_clientinfomethods_t *methods,
f469d5d440d9580e4c7007632d72a08a92a98d89Evan Hunt dns_clientinfo_t *clientinfo)
f469d5d440d9580e4c7007632d72a08a92a98d89Evan Hunt#endif
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt{
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt isc_result_t result;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
f469d5d440d9580e4c7007632d72a08a92a98d89Evan Hunt#if DLZ_DLOPEN_VERSION >= 2
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt UNUSED(methods);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt UNUSED(clientinfo);
f469d5d440d9580e4c7007632d72a08a92a98d89Evan Hunt#endif
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt if (strcmp(name, "*") == 0)
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt result = ldap_get_results(zone, "~", NULL, LOOKUP,
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt dbdata, lookup);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt else
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt result = ldap_get_results(zone, name, NULL, LOOKUP,
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt dbdata, lookup);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt return (result);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt}
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Huntisc_result_t
72c86c105a7cf315036d7131a4ef408bc6227639Evan Huntdlz_create(const char *dlzname, unsigned int argc, char *argv[],
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt void **dbdata, ...)
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt{
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt isc_result_t result = ISC_R_FAILURE;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt ldap_instance_t *ldap = NULL;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt dbinstance_t *dbi = NULL;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt const char *helper_name;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt int protocol;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt int method;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt#if PTHREADS
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt int dbcount;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt char *endp;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt int i;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt#endif /* PTHREADS */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt va_list ap;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt UNUSED(dlzname);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt /* allocate memory for LDAP instance */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt ldap = calloc(1, sizeof(ldap_instance_t));
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt if (ldap == NULL)
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt return (ISC_R_NOMEMORY);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt memset(ldap, 0, sizeof(ldap_instance_t));
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
f469d5d440d9580e4c7007632d72a08a92a98d89Evan Hunt /* Fill in the helper functions */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt va_start(ap, dbdata);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt while ((helper_name = va_arg(ap, const char*)) != NULL)
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt b9_add_helper(ldap, helper_name, va_arg(ap, void*));
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt va_end(ap);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt#if PTHREADS
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt /* if debugging, let user know we are multithreaded. */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt ldap->log(ISC_LOG_DEBUG(1), "LDAP driver running multithreaded");
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt#else /* PTHREADS */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt /* if debugging, let user know we are single threaded. */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt ldap->log(ISC_LOG_DEBUG(1), "LDAP driver running single threaded");
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt#endif /* PTHREADS */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt if (argc < 9) {
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt ldap->log(ISC_LOG_ERROR,
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt "LDAP driver requires at least "
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt "8 command line args.");
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt goto cleanup;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt }
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt /* no more than 13 arg's should be passed to the driver */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt if (argc > 12) {
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt ldap->log(ISC_LOG_ERROR,
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt "LDAP driver cannot accept more than "
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt "11 command line args.");
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt goto cleanup;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt }
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt /* determine protocol version. */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt if (strncasecmp(argv[2], V2, strlen(V2)) == 0)
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt protocol = 2;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt else if (strncasecmp(argv[2], V3, strlen(V3)) == 0)
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt protocol = 3;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt else {
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt ldap->log(ISC_LOG_ERROR,
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt "LDAP driver protocol must be either %s or %s",
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt V2, V3);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt goto cleanup;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt }
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt /* determine connection method. */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt if (strncasecmp(argv[3], SIMPLE, strlen(SIMPLE)) == 0)
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt method = LDAP_AUTH_SIMPLE;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt else if (strncasecmp(argv[3], KRB41, strlen(KRB41)) == 0)
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt method = LDAP_AUTH_KRBV41;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt else if (strncasecmp(argv[3], KRB42, strlen(KRB42)) == 0)
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt method = LDAP_AUTH_KRBV42;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt else {
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt ldap->log(ISC_LOG_ERROR,
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt "LDAP driver authentication method must be "
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt "one of %s, %s or %s", SIMPLE, KRB41, KRB42);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt goto cleanup;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt }
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt /* multithreaded build can have multiple DB connections */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt#if PTHREADS
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt /* check how many db connections we should create */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt dbcount = strtol(argv[1], &endp, 10);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt if (*endp != '\0' || dbcount < 0) {
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt ldap->log(ISC_LOG_ERROR,
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt "LDAP driver database connection count "
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt "must be positive.");
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt goto cleanup;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt }
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt#endif
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt /* check that LDAP URL parameters make sense */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt switch (argc) {
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt case 12:
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt result = ldap_checkURL(ldap, argv[11], 0,
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt "allow zone transfer");
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt if (result != ISC_R_SUCCESS)
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt goto cleanup;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt case 11:
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt result = ldap_checkURL(ldap, argv[10], 3, "all nodes");
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt if (result != ISC_R_SUCCESS)
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt goto cleanup;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt case 10:
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt if (strlen(argv[9]) > 0) {
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt result = ldap_checkURL(ldap, argv[9], 3, "authority");
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt if (result != ISC_R_SUCCESS)
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt goto cleanup;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt }
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt case 9:
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt result = ldap_checkURL(ldap, argv[8], 3, "lookup");
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt if (result != ISC_R_SUCCESS)
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt goto cleanup;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt result = ldap_checkURL(ldap, argv[7], 0, "find zone");
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt if (result != ISC_R_SUCCESS)
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt goto cleanup;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt break;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt default:
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt /* not really needed, should shut up compiler. */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt result = ISC_R_FAILURE;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt }
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt /* store info needed to automatically re-connect. */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt ldap->protocol = protocol;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt ldap->method = method;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt ldap->hosts = strdup(argv[6]);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt if (ldap->hosts == NULL) {
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt result = ISC_R_NOMEMORY;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt goto cleanup;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt }
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt ldap->user = strdup(argv[4]);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt if (ldap->user == NULL) {
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt result = ISC_R_NOMEMORY;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt goto cleanup;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt }
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt ldap->cred = strdup(argv[5]);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt if (ldap->cred == NULL) {
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt result = ISC_R_NOMEMORY;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt goto cleanup;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt }
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt#if PTHREADS
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt /* allocate memory for database connection list */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt ldap->db = calloc(1, sizeof(db_list_t));
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt if (ldap->db == NULL) {
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt result = ISC_R_NOMEMORY;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt goto cleanup;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt }
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt /* initialize DB connection list */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt DLZ_LIST_INIT(*(ldap->db));
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt /*
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt * create the appropriate number of database instances (DBI)
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt * append each new DBI to the end of the list
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt for (i = 0; i < dbcount; i++) {
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt#endif /* PTHREADS */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt /* how many queries were passed in from config file? */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt switch (argc) {
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt case 9:
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt result = build_dbinstance(NULL, NULL, NULL, argv[7],
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt argv[8], NULL, &dbi,
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt ldap->log);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt break;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt case 10:
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt result = build_dbinstance(NULL, NULL, argv[9],
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt argv[7], argv[8],
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt NULL, &dbi, ldap->log);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt break;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt case 11:
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt result = build_dbinstance(argv[10], NULL, argv[9],
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt argv[7], argv[8],
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt NULL, &dbi, ldap->log);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt break;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt case 12:
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt result = build_dbinstance(argv[10], argv[11],
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt argv[9], argv[7],
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt argv[8], NULL, &dbi,
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt ldap->log);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt break;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt default:
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt /* not really needed, should shut up compiler. */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt result = ISC_R_FAILURE;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt }
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt if (result == ISC_R_SUCCESS) {
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt ldap->log(ISC_LOG_DEBUG(2),
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt "LDAP driver created "
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt "database instance object.");
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt } else { /* unsuccessful?, log err msg and cleanup. */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt ldap->log(ISC_LOG_ERROR,
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt "LDAP driver could not create "
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt "database instance object.");
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt goto cleanup;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt }
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt#if PTHREADS
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt /* when multithreaded, build a list of DBI's */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt DLZ_LINK_INIT(dbi, link);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt DLZ_LIST_APPEND(*(ldap->db), dbi, link);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt#else
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt /*
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt * when single threaded, hold onto the one connection
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt * instance.
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt ldap->db = dbi;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt#endif
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt /* attempt to connect */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt result = ldap_connect(ldap, dbi);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt /*
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt * if db connection cannot be created, log err msg and
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt * cleanup.
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt switch (result) {
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt /* success, do nothing */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt case ISC_R_SUCCESS:
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt break;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt /*
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt * no memory means ldap_init could not
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt * allocate memory
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt case ISC_R_NOMEMORY:
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt#if PTHREADS
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt ldap->log(ISC_LOG_ERROR,
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt "LDAP driver could not allocate memory "
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt "for connection number %u", i + 1);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt#else
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt ldap->log(ISC_LOG_ERROR,
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt "LDAP driver could not allocate memory "
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt "for connection");
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt#endif
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt goto cleanup;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt /*
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt * no perm means ldap_set_option could not set
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt * protocol version
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt case ISC_R_NOPERM:
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt ldap->log(ISC_LOG_ERROR,
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt "LDAP driver could not "
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt "set protocol version.");
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt result = ISC_R_FAILURE;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt goto cleanup;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt /* failure means couldn't connect to ldap server */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt case ISC_R_FAILURE:
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt#if PTHREADS
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt ldap->log(ISC_LOG_ERROR,
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt "LDAP driver could not bind "
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt "connection number %u to server.", i + 1);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt#else
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt ldap->log(ISC_LOG_ERROR,
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt "LDAP driver could not "
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt "bind connection to server.");
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt#endif
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt goto cleanup;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt /*
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt * default should never happen. If it does,
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt * major errors.
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt default:
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt ldap->log(ISC_LOG_ERROR,
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt "dlz_create() failed (%d)", result);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt result = ISC_R_UNEXPECTED;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt goto cleanup;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt }
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt#if PTHREADS
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt /* set DBI = null for next loop through. */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt dbi = NULL;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt }
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt#endif /* PTHREADS */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt /* set dbdata to the ldap_instance we created. */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt *dbdata = ldap;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt return (ISC_R_SUCCESS);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt cleanup:
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt dlz_destroy(ldap);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt return (result);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt}
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Huntvoid
72c86c105a7cf315036d7131a4ef408bc6227639Evan Huntdlz_destroy(void *dbdata) {
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt if (dbdata != NULL) {
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt ldap_instance_t *db = (ldap_instance_t *)dbdata;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt#if PTHREADS
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt /* cleanup the list of DBI's */
5f8d6cec48cef9055359c628942d633693f732b2Evan Hunt if (db->db != NULL)
5f8d6cec48cef9055359c628942d633693f732b2Evan Hunt ldap_destroy_dblist((db_list_t *)(db->db));
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt#else /* PTHREADS */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt if (db->db->dbconn != NULL)
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt ldap_unbind_s((LDAP *)(db->db->dbconn));
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt /* destroy single DB instance */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt destroy_dbinstance(db->db);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt#endif /* PTHREADS */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt if (db->hosts != NULL)
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt free(db->hosts);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt if (db->user != NULL)
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt free(db->user);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt if (db->cred != NULL)
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt free(db->cred);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt free(dbdata);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt }
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt}
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt/*
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt * Return the version of the API
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Huntint
72c86c105a7cf315036d7131a4ef408bc6227639Evan Huntdlz_version(unsigned int *flags) {
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt *flags |= DNS_SDLZFLAG_RELATIVERDATA;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt#if PTHREADS
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt *flags |= DNS_SDLZFLAG_THREADSAFE;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt#else
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt *flags &= ~DNS_SDLZFLAG_THREADSAFE;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt#endif
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt return (DLZ_DLOPEN_VERSION);
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt}
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt/*
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt * Register a helper function from the bind9 dlz_dlopen driver
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt */
72c86c105a7cf315036d7131a4ef408bc6227639Evan Huntstatic void
72c86c105a7cf315036d7131a4ef408bc6227639Evan Huntb9_add_helper(ldap_instance_t *db, const char *helper_name, void *ptr) {
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt if (strcmp(helper_name, "log") == 0)
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt db->log = (log_t *)ptr;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt if (strcmp(helper_name, "putrr") == 0)
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt db->putrr = (dns_sdlz_putrr_t *)ptr;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt if (strcmp(helper_name, "putnamedrr") == 0)
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt db->putnamedrr = (dns_sdlz_putnamedrr_t *)ptr;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt if (strcmp(helper_name, "writeable_zone") == 0)
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt db->writeable_zone = (dns_dlz_writeablezone_t *)ptr;
72c86c105a7cf315036d7131a4ef408bc6227639Evan Hunt}