mirror of
https://github.com/isc-projects/bind9.git
synced 2026-05-28 04:34:54 -04:00
1292. [contrib] Berkeley DB 4.0 sdb implementation from
Nuno Miguel Rodrigues <nmr@co.sapo.pt>.
This commit is contained in:
parent
4c83dd7f22
commit
88aa68f478
5 changed files with 493 additions and 0 deletions
3
CHANGES
3
CHANGES
|
|
@ -1,3 +1,6 @@
|
|||
1292. [contrib] Berkeley DB 4.0 sdb implementation from
|
||||
Nuno Miguel Rodrigues <nmr@co.sapo.pt>.
|
||||
|
||||
1291. [bug] "recursion available: {denied,approved}" was too
|
||||
confusing.
|
||||
|
||||
|
|
|
|||
37
contrib/sdb/bdb/README
Normal file
37
contrib/sdb/bdb/README
Normal file
|
|
@ -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>
|
||||
|
||||
|
||||
|
||||
|
||||
235
contrib/sdb/bdb/bdb.c
Normal file
235
contrib/sdb/bdb/bdb.c
Normal file
|
|
@ -0,0 +1,235 @@
|
|||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
/* $Id: bdb.c,v 1.1 2002/05/16 04:25:22 marka Exp $ */
|
||||
|
||||
/*
|
||||
* 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) != ISC_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
|
||||
bdb_lookup(const char *zone, const char *name, void *dbdata,
|
||||
dns_sdblookup_t *l)
|
||||
{
|
||||
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));
|
||||
|
||||
(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
|
||||
};
|
||||
|
||||
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);
|
||||
}
|
||||
31
contrib/sdb/bdb/bdb.h
Normal file
31
contrib/sdb/bdb/bdb.h
Normal file
|
|
@ -0,0 +1,31 @@
|
|||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
/* $Id: bdb.h,v 1.1 2002/05/16 04:25:22 marka Exp $ */
|
||||
|
||||
#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 */
|
||||
187
contrib/sdb/bdb/zone2bdb.c
Normal file
187
contrib/sdb/bdb/zone2bdb.c
Normal file
|
|
@ -0,0 +1,187 @@
|
|||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
/* $Id: zone2bdb.c,v 1.1 2002/05/16 04:25:22 marka Exp $ */
|
||||
|
||||
#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, ISC_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, ISC_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,
|
||||
ISC_FALSE, 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, ISC_FALSE, &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;
|
||||
}
|
||||
Loading…
Reference in a new issue