diff options
Diffstat (limited to 'contrib/sdb/bdb')
-rw-r--r-- | contrib/sdb/bdb/README | 37 | ||||
-rw-r--r-- | contrib/sdb/bdb/bdb.c | 245 | ||||
-rw-r--r-- | contrib/sdb/bdb/bdb.h | 30 | ||||
-rw-r--r-- | contrib/sdb/bdb/zone2bdb.c | 186 |
4 files changed, 498 insertions, 0 deletions
diff --git a/contrib/sdb/bdb/README b/contrib/sdb/bdb/README new file mode 100644 index 0000000..d2acf4e --- /dev/null +++ b/contrib/sdb/bdb/README @@ -0,0 +1,37 @@ +(Message trash:37216) + +Date: Wed, 15 May 2002 20:44:45 +0100 +To: <bind-workers@isc.org> +From: Nuno Miguel Rodrigues <nmr@co.sapo.pt> +Subject: Berkeley DB BIND9 SDB + +Replied: Thu, 16 May 2002 11:47:35 +1000 +Replied: Nuno Miguel Rodrigues <nmr@co.sapo.pt> +Return-Path: <bind-workers-bounce@isc.org> +X-X-Sender: <nmr@angelina.sl.pt> +MIME-Version: 1.0 +X-ecartis-version: Ecartis v1.0.0 +Sender: bind-workers-bounce@isc.org +Errors-To: bind-workers-bounce@isc.org +X-original-sender: nmr@co.sapo.pt +Precedence: bulk +X-list: bind-workers +Status: + + + +Hello all, + +I'm making available a BIND9 SDB using Berkeley DB 4.0. + +You can get it at http://www.dhis.org/~nmr/bind9_berkeleydb_sdb-1.0.tar + +Thanks, + + +-- +Nuno M. Rodrigues <nmr@co.sapo.pt> + + + + diff --git a/contrib/sdb/bdb/bdb.c b/contrib/sdb/bdb/bdb.c new file mode 100644 index 0000000..6dbc187 --- /dev/null +++ b/contrib/sdb/bdb/bdb.c @@ -0,0 +1,245 @@ +/* + * Copyright (C) 2002 Nuno M. Rodrigues. + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND NUNO M. RODRIGUES + * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL + * INTERNET SOFTWARE CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, + * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING + * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, + * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION + * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + + +/* + * BIND 9.1.x simple database driver + * implementation, using Berkeley DB. + */ + +#include <errno.h> +#include <stdio.h> +#include <string.h> +#include <stdlib.h> + +#include <isc/file.h> +#include <isc/log.h> +#include <isc/lib.h> +#include <isc/mem.h> +#include <isc/msgs.h> +#include <isc/msgcat.h> +#include <isc/region.h> +#include <isc/result.h> +#include <isc/types.h> +#include <isc/util.h> + +#include <dns/sdb.h> +#include <dns/log.h> +#include <dns/lib.h> +#include <dns/ttl.h> + +#include <named/bdb.h> +#include <named/globals.h> +#include <named/config.h> + +#include <db.h> + +#define DRIVERNAME "bdb" + +static dns_sdbimplementation_t *bdb_imp; + +static isc_result_t +bdb_create(const char *zone, int argc, char **argv, + void *unused, void **dbdata) +{ + int ret; + + UNUSED(zone); + UNUSED(unused); + + if (argc < 1) + return ISC_R_FAILURE; /* database path must be given */ + + if (db_create((DB **)dbdata, NULL, 0) != 0) { + /* + * XXX Should use dns_msgcat et al + * but seems to be unavailable. + */ + isc_log_iwrite(dns_lctx, DNS_LOGCATEGORY_DATABASE, + DNS_LOGMODULE_SDB, ISC_LOG_CRITICAL, isc_msgcat, + ISC_MSGSET_GENERAL, ISC_MSG_FATALERROR, + "db_create"); + return ISC_R_FAILURE; + } + + if (isc_file_exists(*argv) != true) { + isc_log_iwrite(dns_lctx, DNS_LOGCATEGORY_DATABASE, + DNS_LOGMODULE_SDB, ISC_LOG_CRITICAL, isc_msgcat, + ISC_MSGSET_GENERAL, ISC_MSG_FATALERROR, + "isc_file_exists: %s", *argv); + return ISC_R_FAILURE; + } + + if ((ret = (*(DB **)dbdata)->open(*(DB **)dbdata, *argv, NULL, DB_HASH, + DB_RDONLY, 0)) != 0) { + isc_log_iwrite(dns_lctx, DNS_LOGCATEGORY_DATABASE, + DNS_LOGMODULE_SDB, ISC_LOG_CRITICAL, + isc_msgcat, ISC_MSGSET_GENERAL, + ISC_MSG_FATALERROR, "DB->open: %s", + db_strerror(ret)); + return ISC_R_FAILURE; + } + return ISC_R_SUCCESS; +} + +static isc_result_t +#ifdef DNS_CLIENTINFO_VERSION +bdb_lookup(const char *zone, const char *name, void *dbdata, + dns_sdblookup_t *l, dns_clientinfomethods_t *methods, + dns_clientinfo_t *clientinfo) +#else +bdb_lookup(const char *zone, const char *name, void *dbdata, + dns_sdblookup_t *l) +#endif /* DNS_CLIENTINFO_VERSION */ +{ + int ret; + char *type, *rdata; + dns_ttl_t ttl; + isc_consttextregion_t ttltext; + DBC *c; + DBT key, data; + + UNUSED(zone); +#ifdef DNS_CLIENTINFO_VERSION + UNUSED(methods); + UNUSED(clientinfo); +#endif /* DNS_CLIENTINFO_VERSION */ + + if ((ret = ((DB *)dbdata)->cursor((DB *)dbdata, NULL, &c, 0)) != 0) { + isc_log_iwrite(dns_lctx, DNS_LOGCATEGORY_DATABASE, + DNS_LOGMODULE_SDB, ISC_LOG_ERROR, + isc_msgcat, ISC_MSGSET_GENERAL, + ISC_MSG_FAILED, "DB->cursor: %s", + db_strerror(ret)); + return ISC_R_FAILURE; + } + + memset(&key, 0, sizeof(DBT)); + memset(&data, 0, sizeof(DBT)); + + (const char *)key.data = name; + key.size = strlen(name); + + ret = c->c_get(c, &key, &data, DB_SET); + while (ret == 0) { + ((char *)key.data)[key.size] = 0; + ((char *)data.data)[data.size] = 0; + ttltext.base = strtok((char *)data.data, " "); + ttltext.length = strlen(ttltext.base); + dns_ttl_fromtext((isc_textregion_t *)&ttltext, &ttl); + type = strtok(NULL, " "); + rdata = type + strlen(type) + 1; + + if (dns_sdb_putrr(l, type, ttl, rdata) != ISC_R_SUCCESS) { + isc_log_iwrite(dns_lctx, + DNS_LOGCATEGORY_DATABASE, + DNS_LOGMODULE_SDB, ISC_LOG_ERROR, + isc_msgcat, ISC_MSGSET_GENERAL, + ISC_MSG_FAILED, "dns_sdb_putrr"); + return ISC_R_FAILURE; + } + ret = c->c_get(c, &key, &data, DB_NEXT_DUP); + } + + c->c_close(c); + return ISC_R_SUCCESS; +} + +static isc_result_t +bdb_allnodes(const char *zone, void *dbdata, dns_sdballnodes_t *n) +{ + int ret; + char *type, *rdata; + dns_ttl_t ttl; + isc_consttextregion_t ttltext; + DBC *c; + DBT key, data; + + UNUSED(zone); + + if ((ret = ((DB *)dbdata)->cursor((DB *)dbdata, NULL, &c, 0)) != 0) { + isc_log_iwrite(dns_lctx, DNS_LOGCATEGORY_DATABASE, + DNS_LOGMODULE_SDB, ISC_LOG_ERROR, + isc_msgcat, ISC_MSGSET_GENERAL, + ISC_MSG_FAILED, "DB->cursor: %s", + db_strerror(ret)); + return ISC_R_FAILURE; + } + + memset(&key, 0, sizeof(DBT)); + memset(&data, 0, sizeof(DBT)); + + while (c->c_get(c, &key, &data, DB_NEXT) == 0) { + ((char *)key.data)[key.size] = 0; + ((char *)data.data)[data.size] = 0; + ttltext.base = strtok((char *)data.data, " "); + ttltext.length = strlen(ttltext.base); + dns_ttl_fromtext((isc_textregion_t *)&ttltext, &ttl); + type = strtok(NULL, " "); + rdata = type + strlen(type) + 1; + + if (dns_sdb_putnamedrr(n, key.data, type, ttl, rdata) != + ISC_R_SUCCESS) { + isc_log_iwrite(dns_lctx, + DNS_LOGCATEGORY_DATABASE, + DNS_LOGMODULE_SDB, ISC_LOG_ERROR, + isc_msgcat, ISC_MSGSET_GENERAL, + ISC_MSG_FAILED, "dns_sdb_putnamedrr"); + return ISC_R_FAILURE; + } + + } + + c->c_close(c); + return ISC_R_SUCCESS; +} + +static isc_result_t +bdb_destroy(const char *zone, void *unused, void **dbdata) +{ + + UNUSED(zone); + UNUSED(unused); + + (*(DB **)dbdata)->close(*(DB **)dbdata, 0); + + return ISC_R_SUCCESS; +} + +isc_result_t +bdb_init(void) +{ + static dns_sdbmethods_t bdb_methods = { + bdb_lookup, + NULL, + bdb_allnodes, + bdb_create, + bdb_destroy, + NULL /* lookup2 */ + }; + + return dns_sdb_register(DRIVERNAME, &bdb_methods, NULL, 0, ns_g_mctx, + &bdb_imp); +} + +void +bdb_clear(void) +{ + + if (bdb_imp != NULL) + dns_sdb_unregister(&bdb_imp); +} diff --git a/contrib/sdb/bdb/bdb.h b/contrib/sdb/bdb/bdb.h new file mode 100644 index 0000000..9857380 --- /dev/null +++ b/contrib/sdb/bdb/bdb.h @@ -0,0 +1,30 @@ +/* + * Copyright (C) 2002 Nuno M. Rodrigues. + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND NUNO M. RODRIGUES + * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL + * INTERNET SOFTWARE CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, + * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING + * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, + * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION + * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + + +#ifndef BDB_H +#define BDB_H 1 + +#include <isc/types.h> + +/* + * Prototypes. + */ +isc_result_t bdb_init(void); +void bdb_clear(void); + +#endif /* BDB_H */ diff --git a/contrib/sdb/bdb/zone2bdb.c b/contrib/sdb/bdb/zone2bdb.c new file mode 100644 index 0000000..6599db1 --- /dev/null +++ b/contrib/sdb/bdb/zone2bdb.c @@ -0,0 +1,186 @@ +/* + * Copyright (C) 2002 Nuno M. Rodrigues. + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND NUNO M. RODRIGUES + * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL + * INTERNET SOFTWARE CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, + * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING + * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, + * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION + * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + + +#include <stdio.h> + +#include <isc/mem.h> +#include <isc/result.h> +#include <isc/types.h> +#include <isc/util.h> + +#include <dns/db.h> +#include <dns/dbiterator.h> +#include <dns/fixedname.h> +#include <dns/name.h> +#include <dns/rdata.h> +#include <dns/rdataset.h> +#include <dns/rdatasetiter.h> +#include <dns/rdatatype.h> +#include <dns/ttl.h> +#include <dns/types.h> + +#include <db.h> + +#define MAX_RDATATEXT 63 + 4 + 65535 + 2 /* ttl + type + rdata + sep */ + +/* + * Returns a valid 'DB' handle. + * + * Requires: + * 'file' is a valid non-existant path. + */ +DB * +bdb_init(const char *file) +{ + DB *db; + + REQUIRE(db_create(&db, NULL, 0) == 0); + REQUIRE(db->set_flags(db, DB_DUP) == 0); + REQUIRE(db->open(db, file, NULL, DB_HASH, DB_CREATE | DB_EXCL, 0) == 0); + + return db; +} + +/* + * Puts resource record data on 'db'. + */ +isc_result_t +bdb_putrdata(DB *db, dns_name_t *name, dns_ttl_t ttl, dns_rdata_t *rdata) +{ + static DBT key, data; + isc_buffer_t keybuf, databuf; + char nametext[DNS_NAME_MAXTEXT]; + char rdatatext[MAX_RDATATEXT]; + + isc_buffer_init(&keybuf, nametext, DNS_NAME_MAXTEXT); + + dns_name_totext(name, true, &keybuf); + + key.data = isc_buffer_base(&keybuf); + key.size = isc_buffer_usedlength(&keybuf); + + isc_buffer_init(&databuf, rdatatext, MAX_RDATATEXT); + + dns_ttl_totext(ttl, false, &databuf); + *(char *)isc_buffer_used(&databuf) = ' '; + isc_buffer_add(&databuf, 1); + + dns_rdatatype_totext(rdata->type, &databuf); /* XXX private data */ + *(char *)isc_buffer_used(&databuf) = ' '; + isc_buffer_add(&databuf, 1); + + dns_rdata_totext(rdata, NULL, &databuf); + + data.data = isc_buffer_base(&databuf); + data.size = isc_buffer_usedlength(&databuf); + + REQUIRE(db->put(db, NULL, &key, &data, 0) == 0); + + return ISC_R_SUCCESS; +} + +isc_result_t +bdb_destroy(DB *db) +{ + + return (db->close(db, 0) == 0) ? ISC_R_SUCCESS : ISC_R_FAILURE; +} + +void +usage(const char *prog) +{ + + fprintf(stderr, "Usage: %s <origin> <zonefile> <db>\n", prog); + exit(1); +} + +int +main(int argc, char *argv[]) +{ + isc_mem_t *mctx = NULL; + isc_buffer_t b; + int n; + dns_fixedname_t origin, name; + dns_db_t *db = NULL; + dns_dbiterator_t *dbiter = NULL; + isc_result_t res; + dns_dbnode_t *node = NULL; + dns_rdataset_t rdataset; + dns_rdatasetiter_t *rdatasetiter = NULL; + dns_rdata_t rdata; + DB *bdb; + + if (argc != 4) usage(*argv); + + REQUIRE(isc_mem_create(0, 0, &mctx) == ISC_R_SUCCESS); + + n = strlen(argv[1]); + isc_buffer_init(&b, argv[1], n); + isc_buffer_add(&b, n); + + dns_fixedname_init(&origin); + + REQUIRE(dns_name_fromtext(dns_fixedname_name(&origin), &b, dns_rootname, + 0, NULL) == ISC_R_SUCCESS); + REQUIRE(dns_db_create(mctx, "rbt", dns_fixedname_name(&origin), + dns_dbtype_zone, dns_rdataclass_in, 0, NULL, + &db) == ISC_R_SUCCESS); + + REQUIRE(dns_db_load(db, argv[2]) == ISC_R_SUCCESS); + + REQUIRE(dns_db_createiterator(db, 0, &dbiter) == ISC_R_SUCCESS); + + dns_rdataset_init(&rdataset); + dns_rdata_init(&rdata); + dns_fixedname_init(&name); + bdb = bdb_init(argv[3]); + + for (res = dns_dbiterator_first(dbiter); res == ISC_R_SUCCESS; + res = dns_dbiterator_next(dbiter)) { + dns_dbiterator_current(dbiter, &node, dns_fixedname_name(&name)); + REQUIRE(dns_db_allrdatasets(db, node, NULL, 0, &rdatasetiter) + == ISC_R_SUCCESS); + + for (res = dns_rdatasetiter_first(rdatasetiter); + res == ISC_R_SUCCESS; + res = dns_rdatasetiter_next(rdatasetiter)) { + dns_rdatasetiter_current(rdatasetiter, &rdataset); + + res = dns_rdataset_first(&rdataset); + while (res == ISC_R_SUCCESS) { + dns_rdataset_current(&rdataset, &rdata); + REQUIRE(bdb_putrdata(bdb, + dns_fixedname_name(&name), + rdataset.ttl, &rdata) + == ISC_R_SUCCESS); + + dns_rdata_reset(&rdata); + res = dns_rdataset_next(&rdataset); + } + + dns_rdataset_disassociate(&rdataset); + } + dns_rdatasetiter_destroy(&rdatasetiter); + dns_db_detachnode(db, &node); + } + dns_dbiterator_destroy(&dbiter); + + REQUIRE(bdb_destroy(bdb) == ISC_R_SUCCESS); + + return 0; +} |