03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews/*
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews * Copyright (C) 2002 Stichting NLnet, Netherlands, stichting@nlnet.nl.
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews *
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews * Permission to use, copy, modify, and distribute this software for any
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews * purpose with or without fee is hereby granted, provided that the
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews * above copyright notice and this permission notice appear in all
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews * copies.
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews *
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews * THE SOFTWARE IS PROVIDED "AS IS" AND STICHTING NLNET
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews * STICHTING NLNET BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews * USE OR PERFORMANCE OF THIS SOFTWARE.
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews *
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews * The development of Dynamically Loadable Zones (DLZ) for Bind 9 was
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews * conceived and contributed by Rob Butler.
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews *
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews * Permission to use, copy, modify, and distribute this software for any
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews * purpose with or without fee is hereby granted, provided that the
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews * above copyright notice and this permission notice appear in all
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews * copies.
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews *
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews * THE SOFTWARE IS PROVIDED "AS IS" AND ROB BUTLER
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews * ROB BUTLER BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews * USE OR PERFORMANCE OF THIS SOFTWARE.
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews/*
02d54949f0f1db4729e14c3322b207f58d2578a4Mark Andrews * Copyright (C) 1999-2001, 2016 Internet Systems Consortium, Inc. ("ISC")
03e200df5dc283f24a6a349f0b31d3eab26da893Mark 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/.
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews#ifdef DLZ_BDB
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews/*
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews * exit codes
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews * 0 everything ok
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews * 1 error parsing command line
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews * 2 Missing, too many or invalid combination of command line parameters
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews * 3 Unable to open BDB database.
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews * 4 Unable to allocate memory for, or create lexer.
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews * 5 unable to perform BDB cursor operation
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews#include <config.h>
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews#include <stdio.h>
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews#include <string.h>
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews#include <stdlib.h>
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews#include <isc/buffer.h>
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews#include <isc/commandline.h>
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews#include <isc/formatcheck.h>
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews#include <isc/lex.h>
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews#include <isc/mem.h>
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews#include <isc/result.h>
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews#include <isc/string.h>
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews#include <isc/util.h>
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews#include <db.h>
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews/* shut up compiler warnings about no previous prototype */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrewsstatic void
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrewsshow_usage(void);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrewsint
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrewsgetzone(DB *dbp, const DBT *pkey, const DBT *pdata, DBT *skey);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrewsint
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrewsgethost(DB *dbp, const DBT *pkey, const DBT *pdata, DBT *skey);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrewsvoid
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrewsbdb_cleanup(void);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrewsisc_result_t
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrewsbdb_opendb(DBTYPE db_type, DB **db_out, const char *db_name, int flags);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrewsvoid
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrewsput_data(isc_boolean_t dns_data, char *input_key, char *input_data);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrewsvoid
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrewsinsert_data(void);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrewsisc_result_t
03e200df5dc283f24a6a349f0b31d3eab26da893Mark AndrewsopenBDB(void);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrewsisc_result_t
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrewsopen_lexer(void);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrewsvoid
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrewsclose_lexer(void);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrewsisc_result_t
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrewsbulk_write(char type, DB *database, DBC *dbcursor, DBT *bdbkey, DBT *bdbdata);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrewsvoid
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrewsoperation_add(void);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrewsvoid
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrewsoperation_bulk(void);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrewsvoid
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrewsoperation_listOrDelete(isc_boolean_t dlt);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews/*%
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews * Maximum length of a single data line that
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews * may be inserted into database by this program.
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews * If you need to insert a line of data that is more
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews * than 10,000 characters change this definition.
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews#define max_data_len 10000
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews/*%
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews * BDB database names. If you want to use different
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews * database names change them here.
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews#define dlz_data "dns_data"
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews#define dlz_zone "dns_zone"
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews#define dlz_host "dns_host"
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews#define dlz_client "dns_client"
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews/*%
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews * Error code returned by BDB secondary index callback functions.
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews * This error is returned if the callback function could not create
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews * the secondary index for any reason.
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews#define BDBparseErr 1
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews/* A struct to hold all the relevant info about the database */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrewstypedef struct bdb_instance {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews DB_ENV *dbenv; /* BDB environment */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews DB *data; /* dns_data database handle */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews DBC *cursor; /* database cursor */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews DBC *cursor2; /* second cursor used during list operation. */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews DBC *cursor3; /* third cursor used during list operation */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews DBC *cursor4; /* fourth cursor used during list operation */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews DB *zone; /* zone database handle */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews DB *host; /* host database handle */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews DB *client; /* client database handle */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews} bdb_instance_t;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews/* Possible operations */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews#define list 1 /* list data */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews#define dele 2 /* delete data */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews#define add 3 /* add a single piece of data */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews#define bulk 4 /* bulk load data */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews/*%
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews * quit macro is used instead of exit. quit always trys to close the lexer
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews * and the BDB database before exiting.
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews#define quit(i) close_lexer(); bdb_cleanup(); exit(i);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews/*%
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews * checkOp is used to verify that only one operation (list, del, add,
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews * bulk from file, bulk from stdin) is specified on the command line.
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews * This prevents a user from specifying two operations on the command
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews * line, which would make no sense anyway.
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews#define checkOp(x) if (x != 0) {fprintf(stderr, "\nonly one operation "\
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews "(l e d a f s) may be specified\n"); quit(2);}
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews/*%
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews * checkParam is used to only allow a parameter to be specified once.
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews * I.E. the parameter key can only be used on the command line once.
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews * any attempt to use it twice causes an error.
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews#define checkParam(x, y) if (x != NULL) {fprintf(stderr, "\n%s may only "\
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews "be specified once\n", y); quit(2);}
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews/*%
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews * checkInvalidParam is used to only allow paramters which make sense for
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews * the operation selected. I.E. passing the key parameter makes no sense
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews * for the add operation, and thus it isn't allowed.
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews#define checkInvalidParam(x, y, z) if (x != NULL) {fprintf(stderr, "\n%s "\
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews "may not be specified %s\n", y, z); quit(2);}
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews/*%
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews * checkInvalidOption is used to only allow paramters which make sense for
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews * the operation selected - but checks boolean options.
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews * I.E. passing the "b" bare_list parameter makes no sense for the add
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews * operation, and thus it isn't allowed.
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews * if w == x then output error message "flag", "message"
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews#define checkInvalidOption(w, x, y, z) if (w == x) {fprintf(stderr, "\n%s "\
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews "may not be specified %s\n", y, z); quit(2);}
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews/* Global Variables */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrewsint operation = 0; /*%< operation to perform. */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews/*% allow new lock files or DB to be created. */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrewsisc_boolean_t create_allowed = isc_boolean_false;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrewschar *key = NULL; /*%< key to use in list & del operations */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews/*% dump DB in DLZBDB bulk format */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrewsisc_boolean_t list_everything = isc_boolean_false;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrewsunsigned int key_val; /*%< key as unsigned int used in list & del operations */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrewschar *zone = NULL; /*%< zone to use in list operations */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrewschar *host = NULL; /*%< host to use in list operations */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrewschar *c_zone = NULL; /*%< client zone to use in list operations */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrewschar *c_ip = NULL; /*%< client IP to use in list operations */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrewschar *a_data = NULL; /*%< data in add operation */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrewschar *bulk_file = NULL; /*%< bulk data file to load */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrewschar *db_envdir = NULL; /*%< BDB environment location */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrewschar *db_file = NULL; /*%< BDB database file location. */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrewsbdb_instance_t db; /* BDB instance we are operating on */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrewsisc_lex_t *lexer = NULL; /*%< lexer for use to use in parsing input */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrewsisc_mem_t *lex_mctx = NULL; /*%< memory context for lexer */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrewschar lex_data_buf[max_data_len]; /*%< data array to use for lex_buffer below */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrewsisc_buffer_t lex_buffer; /*%< buffer for lexer during add operation */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews/*%
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews * Displays usage message
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrewsstatic void
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrewsshow_usage(void) {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews fprintf(stderr, "\n\n\
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews---Usage:---------------------------------------------------------------------\
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews\n\n\
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews List data:\n\
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews dlzbdb -l [-k key] [-z zone] [-h host] [-c client_zone] [-i client_ip]\n\
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews BDB_environment BDB_database\n\n\
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews Delete data:\n\
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews dlzbdb -d [-k key] [-c client_zone] [-i client_ip]\n\
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews BDB_environment BDB_database\n\n\
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews Bulk load data from file:\n\
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews dlzbdb -f file_to_load BDB_environment BDB_database\n\n\
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews Bulk load data from stdin\n\
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews dlzbdb -s BDB_environment BDB_database\n\n\
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews Add data:\n\
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews dlzbdb -a \"dns data to be added\" BDB_environment BDB_database\n\n\
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews Export data:\n\
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews dlzbdb -e BDB_environment BDB_database\n\n\
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews Normally operations can only be performed on an existing database files.\n\
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews Use the -n flag with any operation to allow files to be created.\n\
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews Existing files will NOT be truncated by using the -n flag.\n\
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews The -n flag will allow a new database to be created, or allow new\n\
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews environment files to be created for an existing database.\n\n\
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews---Format for -f & -a options:------------------------------------------------\
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews\n\n\
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrewsdb_type zone host dns_type ttl ip\n\
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrewsdb_type zone host dns_type ttl mx_priority mail_host\n\
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrewsdb_type zone host dns_type ttl nm_svr resp_psn serial refresh retry expire min\
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews\n\
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrewsdb_type zone client_ip\n\n\
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews---Examples:------------------------------------------------------------------\
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews\n\n\
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrewsd mynm.com www A 10 127.0.0.1\n\
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrewsd mynm.com @ MX 10 5 mail\n\
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrewsd mynm.com @ SOA 10 ns1.mynm.com. root.mynm.com. 2 28800 7200 604800 86400\n\
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrewsc mynm.com 127.0.0.1\n\
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrewsc mynm.com 192.168.0.10\n\
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews");
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrewsquit(1);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews}
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews/*% BDB callback to create zone secondary index */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrewsint
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrewsgetzone(DB *dbp, const DBT *pkey, const DBT *pdata, DBT *skey) {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews char *tmp;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews char *left;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews char *right;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews int result=0;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews UNUSED(dbp);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews UNUSED(pkey);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews /* Allocate memory to use in parsing the string */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews tmp = right = malloc(pdata->size + 1);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews /* verify memory was allocated */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews if (right == NULL) {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews result = BDBparseErr;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews goto getzone_cleanup;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews }
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews /* copy data string into newly allocated memory */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews strncpy(right, pdata->data, pdata->size);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews right[pdata->size] = '\0';
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews /* split string at the first space */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews left = isc_string_separate(&right, " ");
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews /* copy string for "zone" secondary index */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews skey->data = strdup(left);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews if (skey->data == NULL) {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews result = BDBparseErr;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews goto getzone_cleanup;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews }
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews /* set required values for BDB */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews skey->size = strlen(skey->data);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews skey->flags = DB_DBT_APPMALLOC;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews getzone_cleanup:
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews /* cleanup memory */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews if (tmp != NULL)
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews free(tmp);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews return result;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews}
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews/*%
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews * BDB callback to create host secondary index
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrewsint
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrewsgethost(DB *dbp, const DBT *pkey, const DBT *pdata, DBT *skey) {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews char *tmp;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews char *left;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews char *right;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews int result=0;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews UNUSED(dbp);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews UNUSED(pkey);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews /* allocate memory to use in parsing the string */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews tmp = right = malloc(pdata->size + 1);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews /* verify memory was allocated */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews if (tmp == NULL) {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews result = BDBparseErr;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews goto gethost_cleanup;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews }
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews /* copy data string into newly allocated memory */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews strncpy(right, pdata->data, pdata->size);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews right[pdata->size] = '\0';
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews /* we don't care about left string. */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews /* memory of left string will be freed when tmp is freed. */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews isc_string_separate(&right, " ");
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews /* verify right still has some characters left */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews if (right == NULL) {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews result = BDBparseErr;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews goto gethost_cleanup;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews }
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews /* get "host" from data string */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews left = isc_string_separate(&right, " ");
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews /* copy string for "host" secondary index */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews skey->data = strdup(left);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews if (skey->data == NULL) {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews result = BDBparseErr;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews goto gethost_cleanup;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews }
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews /* set required values for BDB */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews skey->size = strlen(skey->data);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews skey->flags = DB_DBT_APPMALLOC;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews gethost_cleanup:
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews /* cleanup memory */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews if (tmp != NULL)
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews free(tmp);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews return result;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews}
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews/*%
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews * Performs BDB cleanup. Close each database that we opened.
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews * Close environment. Set each var to NULL so we know they
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews * were closed and don't accidentally try to close them twice.
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrewsvoid
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrewsbdb_cleanup(void) {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews /* close cursors */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews if (db.cursor4 != NULL) {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews db.cursor4->c_close(db.cursor4);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews db.cursor4 = NULL;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews }
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews if (db.cursor3 != NULL) {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews db.cursor3->c_close(db.cursor3);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews db.cursor3 = NULL;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews }
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews if (db.cursor2 != NULL) {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews db.cursor2->c_close(db.cursor2);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews db.cursor2 = NULL;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews }
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews if (db.cursor != NULL) {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews db.cursor->c_close(db.cursor);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews db.cursor = NULL;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews }
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews /* close databases */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews if (db.data != NULL) {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews db.data->close(db.data, 0);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews db.data = NULL;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews }
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews if (db.host != NULL) {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews db.host->close(db.host, 0);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews db.host = NULL;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews }
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews if (db.zone != NULL) {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews db.zone->close(db.zone, 0);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews db.zone = NULL;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews }
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews if (db.client != NULL) {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews db.client->close(db.client, 0);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews db.client = NULL;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews }
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews /* close environment */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews if (db.dbenv != NULL) {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews db.dbenv->close(db.dbenv, 0);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews db.dbenv = NULL;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews }
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews}
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews/*% Initializes, sets flags and then opens Berkeley databases. */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrewsisc_result_t
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrewsbdb_opendb(DBTYPE db_type, DB **db_out, const char *db_name, int flags) {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews int result;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews int createFlag = 0;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews /* Initialize the database. */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews if ((result = db_create(db_out, db.dbenv, 0)) != 0) {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews fprintf(stderr, "BDB could not initialize %s database. BDB error: %s",
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews db_name, db_strerror(result));
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews return ISC_R_FAILURE;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews }
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews /* set database flags. */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews if ((result = (*db_out)->set_flags(*db_out, flags)) != 0) {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews fprintf(stderr, "BDB could not set flags for %s database. BDB error: %s",
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews db_name, db_strerror(result));
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews return ISC_R_FAILURE;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews }
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews if (create_allowed == isc_boolean_true) {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews createFlag = DB_CREATE;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews }
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews /* open the database. */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews if ((result = (*db_out)->open(*db_out, NULL, db_file, db_name, db_type,
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews createFlag, 0)) != 0) {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews fprintf(stderr, "BDB could not open %s database in %s. BDB error: %s",
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews db_name, db_file, db_strerror(result));
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews return ISC_R_FAILURE;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews }
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews return ISC_R_SUCCESS;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews}
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews/*%
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews * parses input and adds it to the BDB database
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews * Lexer should be instantiated, and either a file or buffer opened for it.
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews * The insert_data function is used by both the add, and bulk insert
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews * operations
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrewsvoid
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrewsput_data(isc_boolean_t dns_data, char *input_key, char *input_data) {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews int bdbres;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews DBT key, data;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews /* make sure key & data are completely empty */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews memset(&key, 0, sizeof(key));
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews memset(&data, 0, sizeof(data));
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews /* if client data, setup key for insertion */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews if (!dns_data && input_key != NULL) {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews key.data = input_key;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews key.size = strlen(input_key);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews key.flags = 0;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews }
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews /* always setup data for insertion */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews data.data = input_data;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews data.size = strlen(input_data);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews data.flags = 0;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews /* execute insert against appropriate database. */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews if (dns_data) {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews bdbres = db.data->put(db.data, NULL, &key, &data, DB_APPEND);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews } else {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews bdbres = db.client->put(db.client, NULL, &key, &data, 0);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews }
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews /* if something went wrong, log error and quit */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews if (bdbres != 0) {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews fprintf(stderr, "BDB could not insert data. Error: %s",
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews db_strerror(bdbres));
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews quit(5);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews }
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews}
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrewsvoid
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrewsinsert_data(void) {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews unsigned int opt =
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews ISC_LEXOPT_EOL | /* Want end-of-line token. */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews ISC_LEXOPT_EOF | /* Want end-of-file token. */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews ISC_LEXOPT_QSTRING | /* Recognize qstrings. */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews ISC_LEXOPT_QSTRINGMULTILINE; /* Allow multiline "" strings */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews isc_result_t result;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews isc_token_t token; /* token from lexer */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews isc_boolean_t loop = isc_boolean_true;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews isc_boolean_t have_czone = isc_boolean_false;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews char data_arr[max_data_len];
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews isc_buffer_t buf;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews char data_arr2[max_data_len];
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews isc_buffer_t buf2;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews char data_type = 'u'; /* u =unknown, b =bad token, d/D =DNS, c/C =client IP */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews /* Initialize buffers */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews isc_buffer_init(&buf, &data_arr, max_data_len);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews isc_buffer_init(&buf2, &data_arr2, max_data_len);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews while (loop) {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews result = isc_lex_gettoken(lexer, opt, &token);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews if (result != ISC_R_SUCCESS)
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews goto data_cleanup;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews switch(token.type) {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews case isc_tokentype_string:
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews if (data_type == 'u') {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews /* store data_type */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews strncpy(&data_type, token.value.as_pointer, 1);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews /* verify data_type was specified correctly on input */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews if (strlen(token.value.as_pointer) > 1 || (
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews data_type != 'd' && data_type != 'D' &&
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews data_type != 'c' && data_type != 'C') ) {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews /* if not, set to 'b' so this line is ignored. */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews data_type = 'b';
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews }
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews } else if (data_type == 'c' || data_type == 'C') {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews if (have_czone == isc_boolean_true) {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews isc_buffer_putstr(&buf2, token.value.as_pointer);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews /* add string terminator to buffer */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews isc_buffer_putmem(&buf2, "\0", 1);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews } else {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews isc_buffer_putstr(&buf, token.value.as_pointer);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews /* add string terminator to buffer */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews isc_buffer_putmem(&buf, "\0", 1);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews have_czone = isc_boolean_true;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews }
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews } else {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews isc_buffer_putstr(&buf, token.value.as_pointer);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews isc_buffer_putstr(&buf, " ");
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews }
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews break;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews case isc_tokentype_qstring:
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews isc_buffer_putstr(&buf, "\"");
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews isc_buffer_putstr(&buf, token.value.as_pointer);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews isc_buffer_putstr(&buf, "\" ");
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews break;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews case isc_tokentype_eol:
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews case isc_tokentype_eof:
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews if ((data_type != 'u' && isc_buffer_usedlength(&buf) > 0) || data_type == 'b') {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews /* perform insert operation */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews if (data_type == 'd' || data_type == 'D') {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews /* add string terminator to buffer */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews isc_buffer_putmem(&buf, "\0", 1);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews put_data(isc_boolean_true, NULL, (char *) &data_arr);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews } else if (data_type == 'c' || data_type == 'C') {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews put_data(isc_boolean_false, (char *) &data_arr,
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews (char *) &data_arr2);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews } else if (data_type == 'b') {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews fprintf(stderr, "Bad / unknown token encountered on line %lu."\
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews " Skipping line.", isc_lex_getsourceline(lexer) - 1);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews } else {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews fprintf(stderr, "Bad / unknown db data type encountered on " \
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews "line %lu. Skipping line\n", isc_lex_getsourceline(lexer) - 1);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews }
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews }
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews if (token.type == isc_tokentype_eof) {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews loop = isc_boolean_false;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews }
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews /* reset buffer for next insert */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews isc_buffer_clear(&buf);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews isc_buffer_clear(&buf2);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews have_czone = isc_boolean_false;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews data_type ='u';
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews break;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews default:
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews data_type = 'b';
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews break;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews }
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews }
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews return;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews data_cleanup:
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews /* let user know we had problems */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews fprintf(stderr, "Unknown error processing tokens during \"add\" or " \
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews "\"bulk\" operation.\nStoped processing on line %lu.",
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews isc_lex_getsourceline(lexer));
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews}
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrewsisc_result_t
03e200df5dc283f24a6a349f0b31d3eab26da893Mark AndrewsopenBDB(void) {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews int bdbres;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews isc_result_t result;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews /* create BDB environment */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews /* Basically BDB allocates and assigns memory to db->dbenv */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews bdbres = db_env_create(&db.dbenv, 0);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews if (bdbres != 0) {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews fprintf(stderr, "BDB environment could not be created. BDB error: %s",
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews db_strerror(bdbres));
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews result = ISC_R_FAILURE;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews goto openBDB_cleanup;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews }
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews /* open BDB environment */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews if (create_allowed == isc_boolean_true) {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews /* allowed to create new files */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews bdbres = db.dbenv->open(db.dbenv, db_envdir,
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews DB_INIT_CDB | DB_INIT_MPOOL | DB_CREATE, 0);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews } else { /* not allowed to create new files. */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews bdbres = db.dbenv->open(db.dbenv, db_envdir,
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews DB_INIT_CDB | DB_INIT_MPOOL, 0);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews }
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews if (bdbres != 0) {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews fprintf(stderr, "BDB environment at '%s' could not be opened. BDB " \
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews "error: %s", db_envdir, db_strerror(bdbres));
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews result = ISC_R_FAILURE;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews goto openBDB_cleanup;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews }
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews /* open dlz_data database. */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews result = bdb_opendb(DB_RECNO, &db.data, dlz_data, 0);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews if (result != ISC_R_SUCCESS)
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews goto openBDB_cleanup;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews /* open dlz_host database */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews result = bdb_opendb(DB_BTREE, &db.host, dlz_host, DB_DUP | DB_DUPSORT);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews if (result != ISC_R_SUCCESS)
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews goto openBDB_cleanup;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews /* open dlz_zone database. */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews result = bdb_opendb(DB_BTREE, &db.zone, dlz_zone, DB_DUP | DB_DUPSORT);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews if (result != ISC_R_SUCCESS)
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews goto openBDB_cleanup;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews /* open dlz_client database. */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews result = bdb_opendb(DB_BTREE, &db.client, dlz_client, DB_DUP | DB_DUPSORT);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews if (result != ISC_R_SUCCESS)
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews goto openBDB_cleanup;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews /* associate the host secondary database with the primary database */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews bdbres = db.data->associate(db.data, NULL, db.host, gethost, 0);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews if (bdbres != 0) {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews fprintf(stderr, "BDB could not associate %s database with %s. BDB "\
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews "error: %s", dlz_host, dlz_data, db_strerror(bdbres));
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews result = ISC_R_FAILURE;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews goto openBDB_cleanup;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews }
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews /* associate the zone secondary database with the primary database */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews bdbres = db.data->associate(db.data, NULL, db.zone, getzone, 0);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews if (bdbres != 0) {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews fprintf(stderr, "BDB could not associate %s database with %s. BDB "\
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews "error: %s", dlz_zone, dlz_data, db_strerror(bdbres));
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews result = ISC_R_FAILURE;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews goto openBDB_cleanup;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews }
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews return result;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews openBDB_cleanup:
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews bdb_cleanup();
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews return result;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews}
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews/*% Create & open lexer to parse input data */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrewsisc_result_t
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrewsopen_lexer(void) {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews isc_result_t result;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews /* check if we already opened the lexer, if we did, return success */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews if (lexer != NULL)
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews return ISC_R_SUCCESS;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews /* allocate memory for lexer, and verify it was allocated */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews result = isc_mem_create(0, 0, &lex_mctx);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews if (result != ISC_R_SUCCESS) {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews fprintf(stderr, "unexpected error creating lexer\n");
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews return result;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews }
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews /* create lexer */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews result = isc_lex_create(lex_mctx, 1500, &lexer);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews if (result != ISC_R_SUCCESS)
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews fprintf(stderr, "unexpected error creating lexer\n");
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews /* set allowed commenting style */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews isc_lex_setcomments(lexer, ISC_LEXCOMMENT_C | /* Allow C comments */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews ISC_LEXCOMMENT_CPLUSPLUS | /* Allow C++ comments */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews ISC_LEXCOMMENT_SHELL); /* Allow shellcomments */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews isc_buffer_init(&lex_buffer, &lex_data_buf, max_data_len);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews return result;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews}
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews/*% Close the lexer, and cleanup memory */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrewsvoid
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrewsclose_lexer(void) {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews /* If lexer is still open, close it & destroy it. */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews if (lexer != NULL) {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews isc_lex_close(lexer);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews isc_lex_destroy(&lexer);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews }
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews /* if lexer memory is still allocated, destroy it. */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews if (lex_mctx != NULL)
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews isc_mem_destroy(&lex_mctx);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews}
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews/*% Perform add operation */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrewsvoid
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrewsoperation_add(void) {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews /* check for any parameters that are not allowed during add */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews checkInvalidParam(key, "k", "for add operation");
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews checkInvalidParam(zone, "z", "for add operation");
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews checkInvalidParam(host, "h", "for add operation");
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews checkInvalidParam(c_zone, "c", "for add operation");
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews checkInvalidParam(c_ip, "i", "for add operation");
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews checkInvalidOption(list_everything, isc_boolean_true, "e",
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews "for add operation");
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews /* if open lexer fails it alread prints error messages. */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews if (open_lexer() != ISC_R_SUCCESS) {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews quit(4);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews }
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews /* copy input data to buffer */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews isc_buffer_putstr(&lex_buffer, a_data);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews /* tell lexer to use buffer as input */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews if (isc_lex_openbuffer(lexer, &lex_buffer) != ISC_R_SUCCESS) {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews fprintf(stderr, "unexpected error opening lexer buffer");
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews quit(4);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews }
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews /*common logic for "add" & "bulk" operations are handled by insert_data */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews insert_data();
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews}
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews/*% Perform bulk insert operation */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrewsvoid
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrewsoperation_bulk(void) {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews /* check for any parameters that are not allowed during bulk */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews checkInvalidParam(key, "k", "for bulk load operation");
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews checkInvalidParam(zone, "z", "for bulk load operation");
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews checkInvalidParam(host, "h", "for bulk load operation");
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews checkInvalidParam(c_zone, "c", "for bulk load operation");
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews checkInvalidParam(c_ip, "i", "for bulk load operation");
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews checkInvalidOption(list_everything, isc_boolean_true, "e",
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews "for bulk load operation");
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews /* if open lexer fails it already prints error messages. */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews if (open_lexer() != ISC_R_SUCCESS) {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews quit(4);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews }
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews if (bulk_file == NULL) {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews if (isc_lex_openstream(lexer, stdin) != ISC_R_SUCCESS) {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews fprintf(stderr, "unexpected error opening stdin by lexer.");
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews quit(4);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews }
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews } else if (isc_lex_openfile(lexer, bulk_file) != ISC_R_SUCCESS) {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews fprintf(stderr, "unexpected error opening %s by lexer.", bulk_file);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews quit(4);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews }
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews /* common logic for "add" & "bulk" operations are handled by insert_data */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews insert_data();
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews}
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrewsisc_result_t
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrewsbulk_write(char type, DB *database, DBC *dbcursor, DBT *bdbkey, DBT *bdbdata) {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews int bdbres;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews db_recno_t recNum;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews char *retkey = NULL, *retdata;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews size_t retklen = 0, retdlen;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews void *p;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews /* use a 5MB buffer for the bulk dump */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews int buffer_size = 5 * 1024 * 1024;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews /* try to allocate a 5 MB buffer, if we fail write err msg, die. */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews bdbdata->data = malloc(buffer_size);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews if (bdbdata->data == NULL) {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews fprintf(stderr,
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews "Unable to allocate 5 MB buffer for bulk database dump\n");
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews return ISC_R_FAILURE;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews }
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews bdbdata->ulen = buffer_size;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews bdbdata->flags = DB_DBT_USERMEM;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews /* get a cursor, make sure it worked. */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews bdbres = database->cursor(database, NULL, &dbcursor, 0);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews if (bdbres != 0) {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews fprintf(stderr, "Unexpected error. BDB Error: %s\n",db_strerror(bdbres));
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews free(bdbdata->data);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews return ISC_R_FAILURE;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews }
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews /* loop and dump all data */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews for (;;) {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews /* loop through data until DB_NOTFOUND is returned */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews bdbres = dbcursor->c_get(dbcursor, bdbkey, bdbdata,
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews DB_MULTIPLE_KEY | DB_NEXT);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews /* if not successful did we encounter DB_NOTFOUND, or */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews /* have a different problem. */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews if (bdbres != 0) {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews if (bdbres != DB_NOTFOUND) {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews fprintf(stderr, "Unexpected error. BDB Error: %s\n",
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews db_strerror(bdbres));
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews free(bdbdata->data);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews return ISC_R_FAILURE;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews }
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews /* Hit DB_NOTFOUND which means end of data. */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews break;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews } /* end of if (bdbres !=0) */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews for (DB_MULTIPLE_INIT(p, bdbdata);;) {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews if (type == 'c')
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews DB_MULTIPLE_KEY_NEXT(p, bdbdata, retkey, retklen, retdata, retdlen);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews else
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews DB_MULTIPLE_RECNO_NEXT(p, bdbdata, recNum, retdata, retdlen);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews if (p == NULL)
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews break;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews if (type == 'c')
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews printf("c %.*s %.*s\n",(int)retklen, retkey,(int)retdlen, retdata);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews else
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews printf("d %.*s\n", (int)retdlen, retdata);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews } /* end of for (DB_MULTIPLE_INIT....) */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews } /* end of for (;;) */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews /* free the buffer we created earlier */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews free(bdbdata->data);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews return ISC_R_SUCCESS;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews}
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews/*%
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews * Perform listOrDelete operation
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews * if dlt == true, delete data
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews * else list data
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrewsvoid
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrewsoperation_listOrDelete(isc_boolean_t dlt) {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews int bdbres = 0;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews DBC *curList[3];
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews DBT bdbkey, bdbdata;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews db_recno_t recno;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews int curIndex = 0;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews /* verify that only allowed parameters were passed. */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews if (dlt == isc_boolean_true) {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews checkInvalidParam(zone, "z", "for delete operation");
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews checkInvalidParam(host, "h", "for delete operation");
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews checkInvalidOption(list_everything, isc_boolean_true, "e",
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews "for delete operation");
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews checkInvalidOption(create_allowed, isc_boolean_true, "n",
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews "for delete operation");
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews } else if (key != NULL || zone != NULL || host != NULL) {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews checkInvalidParam(c_zone, "c", "for list when k, z or h are specified");
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews checkInvalidParam(c_ip, "i", "for list when k, z, or h are specified");
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews checkInvalidOption(list_everything, isc_boolean_true, "e",
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews "for list when k, z, or h are specified");
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews checkInvalidOption(create_allowed, isc_boolean_true, "n",
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews "for list operation");
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews } else if (c_ip != NULL || c_zone != NULL) {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews checkInvalidOption(list_everything, isc_boolean_true, "e",
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews "for list when c or i are specified");
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews checkInvalidOption(create_allowed, isc_boolean_true, "n",
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews "for list operation");
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews }
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews memset(&bdbkey, 0, sizeof(bdbkey));
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews memset(&bdbdata, 0, sizeof(bdbdata));
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews /* Dump database in "dlzbdb" bulk format */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews if (list_everything == isc_boolean_true) {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews if (bulk_write('c', db.client, db.cursor, &bdbkey, &bdbdata)
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews != ISC_R_SUCCESS)
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews return;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews memset(&bdbkey, 0, sizeof(bdbkey));
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews memset(&bdbdata, 0, sizeof(bdbdata));
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews bulk_write('d', db.data, db.cursor2, &bdbkey, &bdbdata);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews return;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews } /* end if (list_everything) */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews /* set NULL the 2nd and 3rd positions in curList. */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews /* that way later when add cursors to the join list */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews /* it is already null terminated. */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews curList[1] = curList[2] = NULL;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews if (key != NULL) {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews /* make sure other parameters weren't */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews checkInvalidParam(zone, "z", "when k is specified");
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews checkInvalidParam(host, "h", "when k is specified");
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews recno = key_val;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews bdbkey.data = &recno;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews bdbkey.size = sizeof(recno);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews if (dlt == isc_boolean_true) {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews bdbres = db.data->del(db.data, NULL, &bdbkey, 0);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews } else {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews bdbdata.flags = DB_DBT_REALLOC;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews bdbres = db.data->get(db.data, NULL, &bdbkey, &bdbdata, 0);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews if (bdbres == 0) {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews printf("KEY | DATA\n");
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews printf("%lu | %.*s\n", *(u_long *) bdbkey.data,
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews (int)bdbdata.size, (char *)bdbdata.data);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews }
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews } /* closes else of if (dlt == isc_boolean_true) */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews if (bdbres == DB_NOTFOUND) {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews printf("Key not found in database");
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews }
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews } /* closes if (key != NULL) */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews /* if zone is passed */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews if (zone != NULL) {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews /* create a cursor and make sure it worked */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews bdbres = db.zone->cursor(db.zone, NULL, &db.cursor2, 0);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews if (bdbres != 0) {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews fprintf(stderr, "Unexpected error. BDB Error: %s\n",
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews db_strerror(bdbres));
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews return;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews }
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews bdbkey.data = zone;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews bdbkey.size = strlen(zone);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews bdbres = db.cursor2->c_get(db.cursor2, &bdbkey, &bdbdata, DB_SET);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews if (bdbres != 0) {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews if (bdbres != DB_NOTFOUND) {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews fprintf(stderr, "Unexpected error. BDB Error: %s\n",
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews db_strerror(bdbres));
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews } else {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews printf("Zone not found in database");
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews }
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews return;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews }
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews /* add cursor to cursor list for later use in join */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews curList[curIndex++] = db.cursor2;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews }
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews /* if host is passed */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews if (host != NULL) {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews /* create a cursor and make sure it worked. */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews bdbres = db.host->cursor(db.host, NULL, &db.cursor3, 0);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews if (bdbres != 0) {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews fprintf(stderr, "Unexpected error. BDB Error: %s\n",
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews db_strerror(bdbres));
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews return;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews }
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews bdbkey.data = host;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews bdbkey.size = strlen(host);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews bdbres = db.cursor3->c_get(db.cursor3, &bdbkey, &bdbdata, DB_SET);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews if (bdbres != 0) {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews if (bdbres != DB_NOTFOUND) {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews fprintf(stderr, "Unexpected error. BDB Error: %s\n",
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews db_strerror(bdbres));
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews } else {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews printf("Host not found in database");
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews }
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews return;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews }
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews /* add cursor to cursor list for later use in join */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews curList[curIndex++] = db.cursor3;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews }
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews if (zone != NULL || host != NULL) {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews /* join any cursors */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews bdbres = db.data->join(db.data, curList, &db.cursor4, 0);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews if (bdbres != 0) {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews fprintf(stderr, "Unexpected error. BDB Error: %s\n",
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews db_strerror(bdbres));
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews return;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews }
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews memset(&bdbkey, 0, sizeof(bdbkey));
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews bdbkey.flags = DB_DBT_REALLOC;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews memset(&bdbdata, 0, sizeof(bdbdata));
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews bdbdata.flags = DB_DBT_REALLOC;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews /* print a header to explain the output */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews printf("KEY | DATA\n");
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews /* loop and list all results. */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews while (bdbres == 0) {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews /* get data */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews bdbres = db.cursor4->c_get(db.cursor4, &bdbkey, &bdbdata, 0);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews /* verify call had no errors */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews if (bdbres != 0) {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews break;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews }
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews printf("%lu | %.*s\n", *(u_long *) bdbkey.data,
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews (int)bdbdata.size, (char *)bdbdata.data);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews } /* closes while loop */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews }
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews if (c_ip != NULL && c_zone == NULL) {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews fprintf(stderr, "i may only be specified when c is also specified\n");
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews quit(2);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews }
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews /* if client_zone was passed */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews if (c_zone != NULL) {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews /* create a cursor and make sure it worked. */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews if (dlt == isc_boolean_true) {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews /* open read-write cursor */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews bdbres = db.client->cursor(db.client, NULL, &db.cursor,
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews DB_WRITECURSOR);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews } else {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews /* open read only cursor */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews bdbres = db.client->cursor(db.client, NULL, &db.cursor, 0);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews /* print a header to explain the output */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews printf("CLIENT_ZONE | CLIENT_IP\n");
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews }
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews bdbkey.data = c_zone;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews bdbkey.size = strlen(c_zone);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews if (c_ip != NULL) {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews bdbdata.data = c_ip;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews bdbdata.size = strlen(c_ip);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews bdbres = db.cursor->c_get(db.cursor, &bdbkey, &bdbdata, DB_GET_BOTH);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews if (bdbres == DB_NOTFOUND) {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews printf("Client zone & IP not found in database");
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews }
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews } else {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews bdbdata.flags = DB_DBT_REALLOC;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews bdbres = db.cursor->c_get(db.cursor, &bdbkey, &bdbdata, DB_SET);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews if (bdbres == DB_NOTFOUND) {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews printf("Client zone not found in database");
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews }
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews }
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews while (bdbres == 0) {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews if (dlt == isc_boolean_false) {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews printf("%.*s | %.*s\n", (int)bdbkey.size, (char *) bdbkey.data,
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews (int)bdbdata.size, (char *) bdbdata.data);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews } else {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews /* delete record. */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews bdbres = db.cursor->c_del(db.cursor, 0);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews if (bdbres != 0) {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews fprintf(stderr, "Unexpected error. BDB Error: %s\n",
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews db_strerror(bdbres));
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews break;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews }
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews }
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews if (c_ip != NULL) {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews break;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews }
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews bdbres = db.cursor->c_get(db.cursor, &bdbkey, &bdbdata, DB_NEXT_DUP);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews if (bdbres != 0) {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews break;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews }
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews } /* end while loop */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews }
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews if (bdbres != 0 && bdbres != DB_NOTFOUND) {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews fprintf(stderr, "Unexpected error during list operation " \
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews "BDB error: %s", db_strerror(bdbres));
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews }
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews if (bdbkey.flags == DB_DBT_REALLOC && bdbkey.data != NULL) {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews free(bdbkey.data);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews }
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews if (bdbdata.flags == DB_DBT_REALLOC && bdbdata.data != NULL) {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews free(bdbdata.data);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews }
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews}
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrewsint
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrewsmain(int argc, char **argv) {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews int ch;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews char *endp;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews /* there has to be at least 2 args, some operations require more */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews if (argc < 2)
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews show_usage();
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews /* use the ISC commandline parser to get all the program arguments */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews while ((ch= isc_commandline_parse(argc, argv, "ldesna:f:k:z:h:c:i:")) != -1) {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews switch (ch) {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews case 'n':
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews create_allowed = isc_boolean_true;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews break;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews case 'l':
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews checkOp(operation);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews operation = list;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews break;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews case 'd':
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews checkOp(operation);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews operation = dele;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews break;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews case 'a':
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews checkOp(operation);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews operation = add;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews a_data = isc_commandline_argument;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews break;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews case 'f':
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews checkOp(operation);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews operation = bulk;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews bulk_file = isc_commandline_argument;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews break;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews case 's':
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews checkOp(operation);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews operation = bulk;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews break;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews case 'k':
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews checkParam(key, "k");
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews key = isc_commandline_argument;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews key_val = strtoul(key, &endp, 10);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews if (*endp != '\0' || key_val < 1) {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews fprintf(stderr, "Error converting key to integer");
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews }
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews break;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews case 'z':
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews checkParam(zone, "z");
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews zone = isc_commandline_argument;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews break;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews case 'h':
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews checkParam(host, "h");
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews host = isc_commandline_argument;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews break;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews case 'c':
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews checkParam(c_zone, "c");
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews c_zone = isc_commandline_argument;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews break;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews case 'i':
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews checkParam(c_ip, "i");
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews c_ip = isc_commandline_argument;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews break;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews case 'e':
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews checkOp(operation);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews operation = list;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews list_everything = isc_boolean_true;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews break;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews case '?':
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews show_usage();
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews break;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews default:
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews /* should never reach this point */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews fprintf(stderr, "unexpected error parsing command arguments\n");
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews quit(1);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews break;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews }
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews }
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews argc -= isc_commandline_index;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews argv += isc_commandline_index;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews /* argc & argv have been modified, so now only "extra" parameters are */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews /* left in argc & argv. "Extra" parameters are any parameters that were */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews /* not passed using a command line flag. Exactly 2 args should be left. */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews /* The first should be the BDB environment path, the second should be the */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews /* BDB database. The BDB database path can be either relative to the */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews /* BDB environment path, or absolute. */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews if (argc < 2) {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews fprintf(stderr, "Both a Berkeley DB environment and file "\
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews "must be specified");
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews quit(2);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews } else if (argc > 2) {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews fprintf(stderr, "Too many parameters. Check command line for errors.");
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews quit(2);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews }
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews /* get db_file to operate on */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews db_envdir = argv[0];
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews db_file = argv[1];
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews if (openBDB() != ISC_R_SUCCESS) {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews /* openBDB already prints error messages, don't do it here. */
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews bdb_cleanup();
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews quit(3);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews }
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews switch(operation) {
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews case list:
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews operation_listOrDelete(isc_boolean_false);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews break;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews case dele:
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews operation_listOrDelete(isc_boolean_true);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews break;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews case add:
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews operation_add();
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews break;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews case bulk:
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews operation_bulk();
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews break;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews default:
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews fprintf(stderr, "\nNo operation was selected. "\
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews "Select an operation (l d a f)");
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews quit(2);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews break;
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews }
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews quit(0);
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews}
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews#endif
03e200df5dc283f24a6a349f0b31d3eab26da893Mark Andrews