5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt/*
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt * Copyright (C) 2002 Stichting NLnet, Netherlands, stichting@nlnet.nl.
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt *
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt * Permission to use, copy, modify, and distribute this software for any
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt * purpose with or without fee is hereby granted, provided that the
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt * above copyright notice and this permission notice appear in all
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt * copies.
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt *
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt * THE SOFTWARE IS PROVIDED "AS IS" AND STICHTING NLNET
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt * STICHTING NLNET BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt * USE OR PERFORMANCE OF THIS SOFTWARE.
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt *
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt * The development of Dynamically Loadable Zones (DLZ) for BIND 9 was
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt * conceived and contributed by Rob Butler.
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt *
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt * Permission to use, copy, modify, and distribute this software for any
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt * purpose with or without fee is hereby granted, provided that the
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt * above copyright notice and this permission notice appear in all
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt * copies.
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt *
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt * THE SOFTWARE IS PROVIDED "AS IS" AND ROB BUTLER
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt * ROB BUTLER BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt * USE OR PERFORMANCE OF THIS SOFTWARE.
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt */
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt/*
02d54949f0f1db4729e14c3322b207f58d2578a4Mark Andrews * Copyright (C) 1999-2001, 2013, 2016 Internet Systems Consortium, Inc. ("ISC")
02d54949f0f1db4729e14c3322b207f58d2578a4Mark Andrews *
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/.
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt */
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt/*
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt * This provides the externally loadable MySQL DLZ module, without
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt * update support
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt */
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt#include <stdio.h>
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt#include <string.h>
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt#include <stdarg.h>
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt#include <stdint.h>
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt#include <stdlib.h>
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt#include <dlz_minimal.h>
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt#include <dlz_list.h>
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt#include <dlz_dbi.h>
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt#include <dlz_pthread.h>
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt#include <mysql/mysql.h>
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt#define dbc_search_limit 30
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt#define ALLNODES 1
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt#define ALLOWXFR 2
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt#define AUTHORITY 3
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt#define FINDZONE 4
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt#define COUNTZONE 5
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt#define LOOKUP 6
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt#define safeGet(in) in == NULL ? "" : in
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt/*%
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt * Structure to hold everthing needed by this "instance" of the MySQL
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt * module remember, the module code is only loaded once, but may have
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt * many separate instances.
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt */
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunttypedef struct {
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt#if PTHREADS
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt db_list_t *db; /*%< handle to a list of DB */
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt int dbcount;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt#else
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt dbinstance_t *db; /*%< handle to DB */
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt#endif
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt unsigned int flags;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt char *dbname;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt char *host;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt char *user;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt char *pass;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt char *socket;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt int port;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt /* Helper functions from the dlz_dlopen driver */
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt log_t *log;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt dns_sdlz_putrr_t *putrr;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt dns_sdlz_putnamedrr_t *putnamedrr;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt dns_dlz_writeablezone_t *writeable_zone;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt} mysql_instance_t;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt/* forward references */
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Huntisc_result_t
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Huntdlz_findzonedb(void *dbdata, const char *name,
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt dns_clientinfomethods_t *methods,
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt dns_clientinfo_t *clientinfo);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Huntvoid
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Huntdlz_destroy(void *dbdata);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Huntstatic void
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Huntb9_add_helper(mysql_instance_t *db, const char *helper_name, void *ptr);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt/*
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt * Private methods
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt */
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Huntvoid
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Huntmysql_destroy(dbinstance_t *db) {
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt /* release DB connection */
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt if (db->dbconn != NULL)
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt mysql_close((MYSQL *) db->dbconn);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt /* destroy DB instance */
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt destroy_dbinstance(db);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt}
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt#if PTHREADS
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt/*%
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt * Properly cleans up a list of database instances.
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt * This function is only used when the module is compiled for
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt * multithreaded operation.
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt */
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Huntstatic void
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Huntmysql_destroy_dblist(db_list_t *dblist) {
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt dbinstance_t *ndbi = NULL;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt dbinstance_t *dbi = NULL;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt ndbi = DLZ_LIST_HEAD(*dblist);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt while (ndbi != NULL) {
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt dbi = ndbi;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt ndbi = DLZ_LIST_NEXT(dbi, link);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt mysql_destroy(dbi);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt }
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt /* release memory for the list structure */
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt free(dblist);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt}
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt/*%
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt * Loops through the list of DB instances, attempting to lock
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt * on the mutex. If successful, the DBI is reserved for use
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt * and the thread can perform queries against the database.
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt * If the lock fails, the next one in the list is tried.
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt * looping continues until a lock is obtained, or until
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt * the list has been searched dbc_search_limit times.
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt * This function is only used when the module is compiled for
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt * multithreaded operation.
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt */
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Huntstatic dbinstance_t *
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Huntmysql_find_avail_conn(mysql_instance_t *mysql) {
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt dbinstance_t *dbi = NULL, *head;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt int count = 0;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt /* get top of list */
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt head = dbi = DLZ_LIST_HEAD(*(mysql->db));
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt /* loop through list */
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt while (count < dbc_search_limit) {
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt /* try to lock on the mutex */
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt if (dlz_mutex_trylock(&dbi->lock) == 0)
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt return (dbi); /* success, return the DBI for use. */
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt /* not successful, keep trying */
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt dbi = DLZ_LIST_NEXT(dbi, link);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt /* check to see if we have gone to the top of the list. */
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt if (dbi == NULL) {
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt count++;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt dbi = head;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt }
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt }
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt mysql->log(ISC_LOG_INFO,
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt "MySQL module unable to find available connection "
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt "after searching %d times", count);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt return (NULL);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt}
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt#endif /* PTHREADS */
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt/*%
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt * Allocates memory for a new string, and then constructs the new
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt * string by "escaping" the input string. The new string is
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt * safe to be used in queries. This is necessary because we cannot
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt * be sure of what types of strings are passed to us, and we don't
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt * want special characters in the string causing problems.
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt */
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Huntstatic char *
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Huntmysqldrv_escape_string(MYSQL *mysql, const char *instr) {
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt char *outstr;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt unsigned int len;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt if (instr == NULL)
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt return (NULL);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt len = strlen(instr);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt outstr = malloc((2 * len * sizeof(char)) + 1);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt if (outstr == NULL)
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt return (NULL);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt mysql_real_escape_string(mysql, outstr, instr, len);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt return (outstr);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt}
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt/*%
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt * This function is the real core of the module. Zone, record
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt * and client strings are passed in (or NULL is passed if the
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt * string is not available). The type of query we want to run
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt * is indicated by the query flag, and the dbdata object is passed
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt * passed in to. dbdata really holds a single database instance.
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt * The function will construct and run the query, hopefully getting
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt * a result set.
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt */
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Huntstatic isc_result_t
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Huntmysql_get_resultset(const char *zone, const char *record,
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt const char *client, unsigned int query,
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt void *dbdata, MYSQL_RES **rs)
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt{
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt isc_result_t result;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt dbinstance_t *dbi = NULL;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt mysql_instance_t *db = (mysql_instance_t *)dbdata;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt char *querystring = NULL;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt unsigned int i = 0;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt unsigned int j = 0;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt int qres = 0;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt#if PTHREADS
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt /* find an available DBI from the list */
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt dbi = mysql_find_avail_conn(db);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt#else /* PTHREADS */
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt /*
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt * only 1 DBI - no need to lock instance lock either
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt * only 1 thread in the whole process, no possible contention.
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt */
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt dbi = (dbinstance_t *)(db->db);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt#endif /* PTHREADS */
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt if (dbi == NULL) {
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt result = ISC_R_FAILURE;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt goto cleanup;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt }
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt /* what type of query are we going to run? */
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt switch(query) {
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt case ALLNODES:
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt if (dbi->allnodes_q == NULL) {
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt result = ISC_R_NOTIMPLEMENTED;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt goto cleanup;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt }
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt break;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt case ALLOWXFR:
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt if (dbi->allowxfr_q == NULL) {
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt result = ISC_R_NOTIMPLEMENTED;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt goto cleanup;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt }
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt break;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt case AUTHORITY:
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt if (dbi->authority_q == NULL) {
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt result = ISC_R_NOTIMPLEMENTED;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt goto cleanup;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt }
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt break;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt case FINDZONE:
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt if (dbi->findzone_q == NULL) {
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt db->log(ISC_LOG_DEBUG(2),
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt "No query specified for findzone. "
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt "Findzone requires a query");
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt result = ISC_R_FAILURE;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt goto cleanup;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt }
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt break;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt case COUNTZONE:
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt if (dbi->countzone_q == NULL) {
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt result = ISC_R_NOTIMPLEMENTED;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt goto cleanup;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt }
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt break;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt case LOOKUP:
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt if (dbi->lookup_q == NULL) {
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt db->log(ISC_LOG_DEBUG(2),
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt "No query specified for lookup. "
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt "Lookup requires a query");
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt result = ISC_R_FAILURE;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt goto cleanup;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt }
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt break;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt default:
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt db->log(ISC_LOG_ERROR,
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt "Incorrect query flag passed to "
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt "mysql_get_resultset");
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt result = ISC_R_UNEXPECTED;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt goto cleanup;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt }
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt if (zone != NULL) {
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt if (dbi->zone != NULL)
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt free(dbi->zone);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt dbi->zone = mysqldrv_escape_string((MYSQL *) dbi->dbconn,
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt zone);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt if (dbi->zone == NULL) {
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt result = ISC_R_NOMEMORY;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt goto cleanup;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt }
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt } else
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt dbi->zone = NULL;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt if (record != NULL) {
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt if (dbi->record != NULL)
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt free(dbi->record);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt dbi->record = mysqldrv_escape_string((MYSQL *) dbi->dbconn,
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt record);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt if (dbi->record == NULL) {
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt result = ISC_R_NOMEMORY;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt goto cleanup;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt }
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt } else
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt dbi->record = NULL;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt if (client != NULL) {
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt if (dbi->client != NULL)
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt free(dbi->client);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt dbi->client = mysqldrv_escape_string((MYSQL *) dbi->dbconn,
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt client);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt if (dbi->client == NULL) {
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt result = ISC_R_NOMEMORY;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt goto cleanup;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt }
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt } else
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt dbi->client = NULL;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt /*
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt * what type of query are we going to run? this time we build
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt * the actual query to run.
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt */
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt switch(query) {
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt case ALLNODES:
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt querystring = build_querystring(dbi->allnodes_q);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt break;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt case ALLOWXFR:
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt querystring = build_querystring(dbi->allowxfr_q);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt break;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt case AUTHORITY:
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt querystring = build_querystring(dbi->authority_q);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt break;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt case FINDZONE:
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt querystring = build_querystring(dbi->findzone_q);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt break;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt case COUNTZONE:
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt querystring = build_querystring(dbi->countzone_q);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt break;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt case LOOKUP:
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt querystring = build_querystring(dbi->lookup_q);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt break;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt default:
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt db->log(ISC_LOG_ERROR,
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt "Incorrect query flag passed to "
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt "mysql_get_resultset");
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt result = ISC_R_UNEXPECTED; goto cleanup;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt }
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt if (querystring == NULL) {
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt result = ISC_R_NOMEMORY;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt goto cleanup;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt }
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt /* output the full query string when debugging */
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt db->log(ISC_LOG_DEBUG(1), "\nQuery String: %s\n", querystring);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt /* attempt query up to 3 times. */
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt for (i = 0; i < 3; i++) {
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt qres = mysql_query((MYSQL *) dbi->dbconn, querystring);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt if (qres == 0)
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt break;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt for (j = 0; j < 4; j++)
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt if (mysql_ping((MYSQL *) dbi->dbconn) == 0)
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt break;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt }
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt if (qres == 0) {
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt result = ISC_R_SUCCESS;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt if (query != COUNTZONE) {
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt *rs = mysql_store_result((MYSQL *) dbi->dbconn);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt if (*rs == NULL)
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt result = ISC_R_FAILURE;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt }
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt } else
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt result = ISC_R_FAILURE;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt cleanup:
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt if (dbi == NULL)
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt return (ISC_R_FAILURE);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt if (dbi->zone != NULL) {
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt free(dbi->zone);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt dbi->zone = NULL;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt }
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt if (dbi->record != NULL) {
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt free(dbi->record);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt dbi->record = NULL;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt }
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt if (dbi->client != NULL) {
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt free(dbi->client);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt dbi->client = NULL;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt }
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt /* release the lock so another thread can use this dbi */
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt (void) dlz_mutex_unlock(&dbi->lock);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt if (querystring != NULL)
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt free(querystring);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt return (result);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt}
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt/*%
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt * The processing of result sets for lookup and authority are
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt * exactly the same. So that functionality has been moved
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt * into this function to minimize code.
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt */
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Huntstatic isc_result_t
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Huntmysql_process_rs(mysql_instance_t *db, dns_sdlzlookup_t *lookup,
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt MYSQL_RES *rs)
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt{
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt isc_result_t result = ISC_R_NOTFOUND;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt MYSQL_ROW row;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt unsigned int fields;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt unsigned int j;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt char *tmpString;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt char *endp;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt int ttl;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt fields = mysql_num_fields(rs); /* how many columns in result set */
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt row = mysql_fetch_row(rs); /* get a row from the result set */
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt while (row != NULL) {
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt unsigned int len = 0;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt switch(fields) {
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt case 1:
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt /*
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt * one column in rs, it's the data field. use
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt * default type of A record, and default TTL
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt * of 86400
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt */
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt result = db->putrr(lookup, "a", 86400, safeGet(row[0]));
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt break;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt case 2:
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt /*
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt * two columns, data field, and data type.
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt * use default TTL of 86400.
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt */
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt result = db->putrr(lookup, safeGet(row[0]), 86400,
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt safeGet(row[1]));
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt break;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt case 3:
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt /*
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt * three columns, all data no defaults.
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt * convert text to int, make sure it worked
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt * right.
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt */
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt ttl = strtol(safeGet(row[0]), &endp, 10);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt if (*endp != '\0' || ttl < 0) {
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt db->log(ISC_LOG_ERROR,
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt "MySQL module ttl must be "
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt "a postive number");
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt return (ISC_R_FAILURE);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt }
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt result = db->putrr(lookup, safeGet(row[1]), ttl,
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt safeGet(row[2]));
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt break;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt default:
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt /*
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt * more than 3 fields, concatenate the last
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt * ones together. figure out how long to make
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt * string.
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt */
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt for (j = 2; j < fields; j++)
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt len += strlen(safeGet(row[j])) + 1;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt /*
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt * allocate string memory, allow for NULL to
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt * term string
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt */
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt tmpString = malloc(len + 1);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt if (tmpString == NULL) {
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt db->log(ISC_LOG_ERROR,
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt "MySQL module unable to allocate "
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt "memory for temporary string");
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt mysql_free_result(rs);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt return (ISC_R_FAILURE);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt }
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt strcpy(tmpString, safeGet(row[2]));
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt for (j = 3; j < fields; j++) {
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt strcat(tmpString, " ");
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt strcat(tmpString, safeGet(row[j]));
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt }
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt ttl = strtol(safeGet(row[0]), &endp, 10);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt if (*endp != '\0' || ttl < 0) {
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt db->log(ISC_LOG_ERROR,
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt "MySQL module ttl must be "
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt "a postive number");
047e477d27b7faa9a063fde549e2b2c141f2291bWitold Krecicki free(tmpString);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt return (ISC_R_FAILURE);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt }
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt result = db->putrr(lookup, safeGet(row[1]),
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt ttl, tmpString);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt free(tmpString);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt }
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt if (result != ISC_R_SUCCESS) {
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt mysql_free_result(rs);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt db->log(ISC_LOG_ERROR,
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt "putrr returned error: %d", result);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt return (ISC_R_FAILURE);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt }
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt row = mysql_fetch_row(rs);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt }
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt mysql_free_result(rs);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt return (result);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt}
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt/*
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt * DLZ methods
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt */
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt/*% determine if the zone is supported by (in) the database */
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Huntisc_result_t
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Huntdlz_findzonedb(void *dbdata, const char *name,
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt dns_clientinfomethods_t *methods,
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt dns_clientinfo_t *clientinfo)
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt{
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt isc_result_t result;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt MYSQL_RES *rs = NULL;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt my_ulonglong rows;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt mysql_instance_t *db = (mysql_instance_t *)dbdata;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt UNUSED(methods);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt UNUSED(clientinfo);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt result = mysql_get_resultset(name, NULL, NULL, FINDZONE, dbdata, &rs);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt if (result != ISC_R_SUCCESS || rs == NULL) {
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt if (rs != NULL)
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt mysql_free_result(rs);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt db->log(ISC_LOG_ERROR,
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt "MySQL module unable to return "
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt "result set for findzone query");
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt return (ISC_R_FAILURE);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt }
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt /*
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt * if we returned any rows, the zone is supported.
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt */
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt rows = mysql_num_rows(rs);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt mysql_free_result(rs);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt if (rows > 0) {
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt mysql_get_resultset(name, NULL, NULL, COUNTZONE, dbdata, NULL);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt return (ISC_R_SUCCESS);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt }
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt return (ISC_R_NOTFOUND);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt}
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt/*% Determine if the client is allowed to perform a zone transfer */
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Huntisc_result_t
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Huntdlz_allowzonexfr(void *dbdata, const char *name, const char *client) {
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt isc_result_t result;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt mysql_instance_t *db = (mysql_instance_t *)dbdata;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt MYSQL_RES *rs = NULL;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt my_ulonglong rows;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt /* first check if the zone is supported by the database. */
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt result = dlz_findzonedb(dbdata, name, NULL, NULL);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt if (result != ISC_R_SUCCESS)
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt return (ISC_R_NOTFOUND);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt /*
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt * if we get to this point we know the zone is supported by
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt * the database the only questions now are is the zone
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt * transfer is allowed for this client and did the config file
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt * have an allow zone xfr query.
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt */
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt result = mysql_get_resultset(name, NULL, client, ALLOWXFR,
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt dbdata, &rs);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt if (result == ISC_R_NOTIMPLEMENTED)
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt return (result);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt if (result != ISC_R_SUCCESS || rs == NULL) {
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt if (rs != NULL)
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt mysql_free_result(rs);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt db->log(ISC_LOG_ERROR,
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt "MySQL module unable to return "
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt "result set for allow xfr query");
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt return (ISC_R_FAILURE);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt }
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt /*
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt * count how many rows in result set; if we returned any,
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt * zone xfr is allowed.
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt */
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt rows = mysql_num_rows(rs);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt mysql_free_result(rs);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt if (rows > 0)
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt return (ISC_R_SUCCESS);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt return (ISC_R_NOPERM);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt}
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt/*%
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt * If the client is allowed to perform a zone transfer, the next order of
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt * business is to get all the nodes in the zone, so bind can respond to the
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt * query.
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt */
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Huntisc_result_t
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Huntdlz_allnodes(const char *zone, void *dbdata, dns_sdlzallnodes_t *allnodes) {
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt isc_result_t result;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt mysql_instance_t *db = (mysql_instance_t *)dbdata;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt MYSQL_RES *rs = NULL;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt MYSQL_ROW row;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt unsigned int fields;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt unsigned int j;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt char *tmpString;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt char *endp;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt int ttl;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt result = mysql_get_resultset(zone, NULL, NULL, ALLNODES, dbdata, &rs);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt if (result == ISC_R_NOTIMPLEMENTED)
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt return (result);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt /* if we didn't get a result set, log an err msg. */
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt if (result != ISC_R_SUCCESS) {
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt db->log(ISC_LOG_ERROR,
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt "MySQL module unable to return "
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt "result set for all nodes query");
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt goto cleanup;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt }
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt result = ISC_R_NOTFOUND;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt fields = mysql_num_fields(rs); /* how many columns in result set */
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt row = mysql_fetch_row(rs); /* get a row from the result set */
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt while (row != NULL) {
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt if (fields < 4) {
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt db->log(ISC_LOG_ERROR,
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt "MySQL module too few fields returned "
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt "by all nodes query");
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt result = ISC_R_FAILURE;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt goto cleanup;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt }
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt ttl = strtol(safeGet(row[0]), &endp, 10);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt if (*endp != '\0' || ttl < 0) {
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt db->log(ISC_LOG_ERROR,
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt "MySQL module ttl must be "
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt "a postive number");
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt result = ISC_R_FAILURE;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt goto cleanup;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt }
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt if (fields == 4) {
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt result = db->putnamedrr(allnodes, safeGet(row[2]),
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt safeGet(row[1]), ttl,
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt safeGet(row[3]));
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt } else {
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt unsigned int len = 0;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt /*
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt * more than 4 fields, concatenate the last
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt * ones together.
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt */
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt for (j = 3; j < fields; j++)
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt len += strlen(safeGet(row[j])) + 1;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt tmpString = malloc(len + 1);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt if (tmpString == NULL) {
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt db->log(ISC_LOG_ERROR,
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt "MySQL module unable to allocate "
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt "memory for temporary string");
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt result = ISC_R_FAILURE;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt goto cleanup;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt }
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt strcpy(tmpString, safeGet(row[3]));
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt for (j = 4; j < fields; j++) {
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt strcat(tmpString, " ");
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt strcat(tmpString, safeGet(row[j]));
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt }
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt result = db->putnamedrr(allnodes, safeGet(row[2]),
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt safeGet(row[1]),
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt ttl, tmpString);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt free(tmpString);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt }
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt if (result != ISC_R_SUCCESS) {
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt db->log(ISC_LOG_ERROR,
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt "putnamedrr returned error: %s", result);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt result = ISC_R_FAILURE;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt break;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt }
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt row = mysql_fetch_row(rs);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt }
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt cleanup:
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt if (rs != NULL)
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt mysql_free_result(rs);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt return (result);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt}
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt/*%
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt * If the lookup function does not return SOA or NS records for the zone,
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt * use this function to get that information for named.
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt */
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Huntisc_result_t
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Huntdlz_authority(const char *zone, void *dbdata, dns_sdlzlookup_t *lookup) {
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt isc_result_t result;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt MYSQL_RES *rs = NULL;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt mysql_instance_t *db = (mysql_instance_t *)dbdata;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt result = mysql_get_resultset(zone, NULL, NULL, AUTHORITY, dbdata, &rs);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt if (result == ISC_R_NOTIMPLEMENTED)
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt return (result);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt if (result != ISC_R_SUCCESS) {
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt if (rs != NULL)
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt mysql_free_result(rs);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt db->log(ISC_LOG_ERROR,
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt "MySQL module unable to return "
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt "result set for authority query");
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt return (ISC_R_FAILURE);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt }
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt /*
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt * lookup and authority result sets are processed in the same
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt * manner: mysql_process_rs does the job for both functions.
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt */
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt return (mysql_process_rs(db, lookup, rs));
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt}
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt/*% If zone is supported, lookup up a (or multiple) record(s) in it */
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Huntisc_result_t
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Huntdlz_lookup(const char *zone, const char *name,
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt void *dbdata, dns_sdlzlookup_t *lookup,
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt dns_clientinfomethods_t *methods,
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt dns_clientinfo_t *clientinfo)
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt{
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt isc_result_t result;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt MYSQL_RES *rs = NULL;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt mysql_instance_t *db = (mysql_instance_t *)dbdata;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt UNUSED(methods);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt UNUSED(clientinfo);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt result = mysql_get_resultset(zone, name, NULL, LOOKUP, dbdata, &rs);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt /* if we didn't get a result set, log an err msg. */
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt if (result != ISC_R_SUCCESS) {
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt if (rs != NULL)
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt mysql_free_result(rs);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt db->log(ISC_LOG_ERROR,
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt "MySQL module unable to return "
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt "result set for lookup query");
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt return (ISC_R_FAILURE);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt }
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt /*
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt * lookup and authority result sets are processed in the same
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt * manner: mysql_process_rs does the job for both functions.
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt */
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt return (mysql_process_rs(db, lookup, rs));
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt}
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt/*%
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt * Create an instance of the module.
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt */
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Huntisc_result_t
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Huntdlz_create(const char *dlzname, unsigned int argc, char *argv[],
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt void **dbdata, ...)
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt{
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt isc_result_t result = ISC_R_FAILURE;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt mysql_instance_t *mysql = NULL;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt dbinstance_t *dbi = NULL;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt MYSQL *dbc;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt char *tmp = NULL;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt char *endp;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt int j;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt const char *helper_name;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt#if MYSQL_VERSION_ID >= 50000
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt my_bool auto_reconnect = 1;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt#endif
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt#if PTHREADS
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt int dbcount;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt int i;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt#endif /* PTHREADS */
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt va_list ap;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt UNUSED(dlzname);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt /* allocate memory for MySQL instance */
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt mysql = calloc(1, sizeof(mysql_instance_t));
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt if (mysql == NULL)
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt return (ISC_R_NOMEMORY);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt memset(mysql, 0, sizeof(mysql_instance_t));
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt /* Fill in the helper functions */
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt va_start(ap, dbdata);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt while ((helper_name = va_arg(ap, const char*)) != NULL)
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt b9_add_helper(mysql, helper_name, va_arg(ap, void*));
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt va_end(ap);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt#if PTHREADS
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt /* if debugging, let user know we are multithreaded. */
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt mysql->log(ISC_LOG_DEBUG(1), "MySQL module running multithreaded");
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt#else /* PTHREADS */
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt /* if debugging, let user know we are single threaded. */
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt mysql->log(ISC_LOG_DEBUG(1), "MySQL module running single threaded");
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt#endif /* PTHREADS */
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt /* verify we have at least 4 arg's passed to the module */
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt if (argc < 4) {
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt mysql->log(ISC_LOG_ERROR,
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt "MySQL module requires "
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt "at least 4 command line args.");
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt return (ISC_R_FAILURE);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt }
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt /* no more than 8 arg's should be passed to the module */
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt if (argc > 8) {
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt mysql->log(ISC_LOG_ERROR,
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt "MySQL module cannot accept "
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt "more than 7 command line args.");
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt return (ISC_R_FAILURE);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt }
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt /* get db name - required */
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt mysql->dbname = get_parameter_value(argv[1], "dbname=");
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt if (mysql->dbname == NULL) {
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt mysql->log(ISC_LOG_ERROR,
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt "MySQL module requires a dbname parameter.");
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt result = ISC_R_FAILURE;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt goto cleanup;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt }
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt /* get db port. Not required, but must be > 0 if specified */
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt tmp = get_parameter_value(argv[1], "port=");
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt if (tmp == NULL)
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt mysql->port = 0;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt else {
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt mysql->port = strtol(tmp, &endp, 10);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt if (*endp != '\0' || mysql->port < 0) {
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt mysql->log(ISC_LOG_ERROR,
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt "Mysql module: port "
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt "must be a positive number.");
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt free(tmp);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt result = ISC_R_FAILURE;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt goto cleanup;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt }
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt free(tmp);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt }
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt mysql->host = get_parameter_value(argv[1], "host=");
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt mysql->user = get_parameter_value(argv[1], "user=");
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt mysql->pass = get_parameter_value(argv[1], "pass=");
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt mysql->socket = get_parameter_value(argv[1], "socket=");
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt mysql->flags = CLIENT_REMEMBER_OPTIONS;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt tmp = get_parameter_value(argv[1], "compress=");
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt if (tmp != NULL) {
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt if (strcasecmp(tmp, "true") == 0)
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt mysql->flags |= CLIENT_COMPRESS;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt free(tmp);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt }
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt tmp = get_parameter_value(argv[1], "ssl=");
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt if (tmp != NULL) {
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt if (strcasecmp(tmp, "true") == 0)
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt mysql->flags |= CLIENT_SSL;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt free(tmp);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt }
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt tmp = get_parameter_value(argv[1], "space=");
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt if (tmp != NULL) {
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt if (strcasecmp(tmp, "ignore") == 0)
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt mysql->flags |= CLIENT_IGNORE_SPACE;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt free(tmp);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt }
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt#if PTHREADS
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt /* multithreaded build can have multiple DB connections */
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt tmp = get_parameter_value(argv[1], "threads=");
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt if (tmp == NULL)
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt dbcount = 1;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt else {
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt dbcount = strtol(tmp, &endp, 10);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt if (*endp != '\0' || dbcount < 1) {
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt mysql->log(ISC_LOG_ERROR,
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt "MySQL database connection count "
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt "must be positive.");
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt free(tmp);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt result = ISC_R_FAILURE;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt goto cleanup;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt }
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt free(tmp);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt }
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt /* allocate memory for database connection list */
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt mysql->db = calloc(1, sizeof(db_list_t));
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt if (mysql->db == NULL) {
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt result = ISC_R_NOMEMORY;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt goto cleanup;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt }
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt /* initialize DB connection list */
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt DLZ_LIST_INIT(*(mysql->db));
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt /*
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt * create the appropriate number of database instances (DBI)
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt * append each new DBI to the end of the list
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt */
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt for (i = 0; i < dbcount; i++) {
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt#endif /* PTHREADS */
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt switch(argc) {
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt case 4:
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt result = build_dbinstance(NULL, NULL, NULL,
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt argv[2], argv[3], NULL,
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt &dbi, mysql->log);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt break;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt case 5:
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt result = build_dbinstance(NULL, NULL, argv[4],
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt argv[2], argv[3], NULL,
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt &dbi, mysql->log);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt break;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt case 6:
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt result = build_dbinstance(argv[5], NULL, argv[4],
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt argv[2], argv[3], NULL,
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt &dbi, mysql->log);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt break;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt case 7:
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt result = build_dbinstance(argv[5], argv[6], argv[4],
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt argv[2], argv[3], NULL,
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt &dbi, mysql->log);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt break;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt case 8:
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt result = build_dbinstance(argv[5], argv[6], argv[4],
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt argv[2], argv[3], argv[7],
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt &dbi, mysql->log);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt break;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt default:
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt result = ISC_R_FAILURE;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt }
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt if (result != ISC_R_SUCCESS) {
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt mysql->log(ISC_LOG_ERROR,
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt "MySQL module could not create "
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt "database instance object.");
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt result = ISC_R_FAILURE;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt goto cleanup;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt }
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt#if PTHREADS
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt /* when multithreaded, build a list of DBI's */
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt DLZ_LINK_INIT(dbi, link);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt DLZ_LIST_APPEND(*(mysql->db), dbi, link);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt#else
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt /*
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt * when single threaded, hold onto the one connection
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt * instance.
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt */
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt mysql->db = dbi;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt#endif
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt /* create and set db connection */
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt dbi->dbconn = mysql_init(NULL);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt if (dbi->dbconn == NULL) {
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt mysql->log(ISC_LOG_ERROR,
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt "MySQL module could not allocate "
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt "memory for database connection");
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt result = ISC_R_FAILURE;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt goto cleanup;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt }
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt dbc = NULL;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt#if MYSQL_VERSION_ID >= 50000
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt /* enable automatic reconnection. */
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt if (mysql_options((MYSQL *) dbi->dbconn, MYSQL_OPT_RECONNECT,
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt &auto_reconnect) != 0) {
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt mysql->log(ISC_LOG_WARNING,
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt "MySQL module failed to set "
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt "MYSQL_OPT_RECONNECT option, continuing");
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt }
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt#endif
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt for (j = 0; dbc == NULL && j < 4; j++) {
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt dbc = mysql_real_connect((MYSQL *) dbi->dbconn,
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt mysql->host, mysql->user,
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt mysql->pass, mysql->dbname,
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt mysql->port, mysql->socket,
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt mysql->flags);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt if (dbc == NULL)
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt mysql->log(ISC_LOG_ERROR,
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt "MySQL connection failed: %s",
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt mysql_error((MYSQL *) dbi->dbconn));
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt }
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt if (dbc == NULL) {
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt mysql->log(ISC_LOG_ERROR,
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt "MySQL module failed to create "
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt "database connection after 4 attempts");
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt result = ISC_R_FAILURE;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt goto cleanup;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt }
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt#if PTHREADS
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt /* set DBI = null for next loop through. */
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt dbi = NULL;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt }
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt#endif /* PTHREADS */
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt *dbdata = mysql;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt return (ISC_R_SUCCESS);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt cleanup:
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt dlz_destroy(mysql);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt return (result);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt}
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt/*%
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt * Destroy the module.
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt */
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Huntvoid
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Huntdlz_destroy(void *dbdata) {
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt mysql_instance_t *db = (mysql_instance_t *)dbdata;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt#if PTHREADS
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt /* cleanup the list of DBI's */
5f8d6cec48cef9055359c628942d633693f732b2Evan Hunt if (db->db != NULL)
5f8d6cec48cef9055359c628942d633693f732b2Evan Hunt mysql_destroy_dblist((db_list_t *)(db->db));
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt#else /* PTHREADS */
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt mysql_destroy(db);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt#endif /* PTHREADS */
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt if (db->dbname != NULL)
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt free(db->dbname);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt if (db->host != NULL)
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt free(db->host);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt if (db->user != NULL)
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt free(db->user);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt if (db->pass != NULL)
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt free(db->pass);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt if (db->socket != NULL)
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt free(db->socket);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt}
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt/*
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt * Return the version of the API
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt */
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Huntint
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Huntdlz_version(unsigned int *flags) {
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt *flags |= (DNS_SDLZFLAG_RELATIVEOWNER |
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt DNS_SDLZFLAG_RELATIVERDATA |
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt DNS_SDLZFLAG_THREADSAFE);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt return (DLZ_DLOPEN_VERSION);
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt}
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt/*
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt * Register a helper function from the bind9 dlz_dlopen driver
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt */
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Huntstatic void
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Huntb9_add_helper(mysql_instance_t *db, const char *helper_name, void *ptr) {
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt if (strcmp(helper_name, "log") == 0)
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt db->log = (log_t *)ptr;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt if (strcmp(helper_name, "putrr") == 0)
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt db->putrr = (dns_sdlz_putrr_t *)ptr;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt if (strcmp(helper_name, "putnamedrr") == 0)
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt db->putnamedrr = (dns_sdlz_putnamedrr_t *)ptr;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt if (strcmp(helper_name, "writeable_zone") == 0)
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt db->writeable_zone = (dns_dlz_writeablezone_t *)ptr;
5ba1d3dcc5739a1f77ec2875b276b163a42ef1e8Evan Hunt}