|
Packit |
5ce601 |
/*
|
|
Packit |
5ce601 |
* Copyright (C) 2002 Nuno M. Rodrigues.
|
|
Packit |
5ce601 |
*
|
|
Packit |
5ce601 |
* Permission to use, copy, modify, and distribute this software for any
|
|
Packit |
5ce601 |
* purpose with or without fee is hereby granted, provided that the above
|
|
Packit |
5ce601 |
* copyright notice and this permission notice appear in all copies.
|
|
Packit |
5ce601 |
*
|
|
Packit |
5ce601 |
* THE SOFTWARE IS PROVIDED "AS IS" AND NUNO M. RODRIGUES
|
|
Packit |
5ce601 |
* DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL
|
|
Packit |
5ce601 |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL
|
|
Packit |
5ce601 |
* INTERNET SOFTWARE CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT,
|
|
Packit |
5ce601 |
* INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
|
|
Packit |
5ce601 |
* FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
|
|
Packit |
5ce601 |
* NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
|
|
Packit |
5ce601 |
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
Packit |
5ce601 |
*/
|
|
Packit |
5ce601 |
|
|
Packit |
5ce601 |
|
|
Packit |
5ce601 |
#include <stdio.h>
|
|
Packit |
5ce601 |
|
|
Packit |
5ce601 |
#include <isc/mem.h>
|
|
Packit |
5ce601 |
#include <isc/result.h>
|
|
Packit |
5ce601 |
#include <isc/types.h>
|
|
Packit |
5ce601 |
#include <isc/util.h>
|
|
Packit |
5ce601 |
|
|
Packit |
5ce601 |
#include <dns/db.h>
|
|
Packit |
5ce601 |
#include <dns/dbiterator.h>
|
|
Packit |
5ce601 |
#include <dns/fixedname.h>
|
|
Packit |
5ce601 |
#include <dns/name.h>
|
|
Packit |
5ce601 |
#include <dns/rdata.h>
|
|
Packit |
5ce601 |
#include <dns/rdataset.h>
|
|
Packit |
5ce601 |
#include <dns/rdatasetiter.h>
|
|
Packit |
5ce601 |
#include <dns/rdatatype.h>
|
|
Packit |
5ce601 |
#include <dns/ttl.h>
|
|
Packit |
5ce601 |
#include <dns/types.h>
|
|
Packit |
5ce601 |
|
|
Packit |
5ce601 |
#include <db.h>
|
|
Packit |
5ce601 |
|
|
Packit |
5ce601 |
#define MAX_RDATATEXT 63 + 4 + 65535 + 2 /* ttl + type + rdata + sep */
|
|
Packit |
5ce601 |
|
|
Packit |
5ce601 |
/*
|
|
Packit |
5ce601 |
* Returns a valid 'DB' handle.
|
|
Packit |
5ce601 |
*
|
|
Packit |
5ce601 |
* Requires:
|
|
Packit |
5ce601 |
* 'file' is a valid non-existent path.
|
|
Packit |
5ce601 |
*/
|
|
Packit |
5ce601 |
DB *
|
|
Packit |
5ce601 |
bdb_init(const char *file)
|
|
Packit |
5ce601 |
{
|
|
Packit |
5ce601 |
DB *db;
|
|
Packit |
5ce601 |
|
|
Packit |
5ce601 |
REQUIRE(db_create(&db, NULL, 0) == 0);
|
|
Packit |
5ce601 |
REQUIRE(db->set_flags(db, DB_DUP) == 0);
|
|
Packit |
5ce601 |
REQUIRE(db->open(db, file, NULL, DB_HASH, DB_CREATE | DB_EXCL, 0) == 0);
|
|
Packit |
5ce601 |
|
|
Packit |
5ce601 |
return db;
|
|
Packit |
5ce601 |
}
|
|
Packit |
5ce601 |
|
|
Packit |
5ce601 |
/*
|
|
Packit |
5ce601 |
* Puts resource record data on 'db'.
|
|
Packit |
5ce601 |
*/
|
|
Packit |
5ce601 |
isc_result_t
|
|
Packit |
5ce601 |
bdb_putrdata(DB *db, dns_name_t *name, dns_ttl_t ttl, dns_rdata_t *rdata)
|
|
Packit |
5ce601 |
{
|
|
Packit |
5ce601 |
static DBT key, data;
|
|
Packit |
5ce601 |
isc_buffer_t keybuf, databuf;
|
|
Packit |
5ce601 |
char nametext[DNS_NAME_MAXTEXT];
|
|
Packit |
5ce601 |
char rdatatext[MAX_RDATATEXT];
|
|
Packit |
5ce601 |
|
|
Packit |
5ce601 |
isc_buffer_init(&keybuf, nametext, DNS_NAME_MAXTEXT);
|
|
Packit |
5ce601 |
|
|
Packit |
5ce601 |
dns_name_totext(name, true, &keybuf);
|
|
Packit |
5ce601 |
|
|
Packit |
5ce601 |
key.data = isc_buffer_base(&keybuf);
|
|
Packit |
5ce601 |
key.size = isc_buffer_usedlength(&keybuf);
|
|
Packit |
5ce601 |
|
|
Packit |
5ce601 |
isc_buffer_init(&databuf, rdatatext, MAX_RDATATEXT);
|
|
Packit |
5ce601 |
|
|
Packit |
5ce601 |
dns_ttl_totext(ttl, false, &databuf);
|
|
Packit |
5ce601 |
*(char *)isc_buffer_used(&databuf) = ' ';
|
|
Packit |
5ce601 |
isc_buffer_add(&databuf, 1);
|
|
Packit |
5ce601 |
|
|
Packit |
5ce601 |
dns_rdatatype_totext(rdata->type, &databuf); /* XXX private data */
|
|
Packit |
5ce601 |
*(char *)isc_buffer_used(&databuf) = ' ';
|
|
Packit |
5ce601 |
isc_buffer_add(&databuf, 1);
|
|
Packit |
5ce601 |
|
|
Packit |
5ce601 |
dns_rdata_totext(rdata, NULL, &databuf);
|
|
Packit |
5ce601 |
|
|
Packit |
5ce601 |
data.data = isc_buffer_base(&databuf);
|
|
Packit |
5ce601 |
data.size = isc_buffer_usedlength(&databuf);
|
|
Packit |
5ce601 |
|
|
Packit |
5ce601 |
REQUIRE(db->put(db, NULL, &key, &data, 0) == 0);
|
|
Packit |
5ce601 |
|
|
Packit |
5ce601 |
return ISC_R_SUCCESS;
|
|
Packit |
5ce601 |
}
|
|
Packit |
5ce601 |
|
|
Packit |
5ce601 |
isc_result_t
|
|
Packit |
5ce601 |
bdb_destroy(DB *db)
|
|
Packit |
5ce601 |
{
|
|
Packit |
5ce601 |
|
|
Packit |
5ce601 |
return (db->close(db, 0) == 0) ? ISC_R_SUCCESS : ISC_R_FAILURE;
|
|
Packit |
5ce601 |
}
|
|
Packit |
5ce601 |
|
|
Packit |
5ce601 |
void
|
|
Packit |
5ce601 |
usage(const char *prog)
|
|
Packit |
5ce601 |
{
|
|
Packit |
5ce601 |
|
|
Packit |
5ce601 |
fprintf(stderr, "Usage: %s <origin> <zonefile> <db>\n", prog);
|
|
Packit |
5ce601 |
exit(1);
|
|
Packit |
5ce601 |
}
|
|
Packit |
5ce601 |
|
|
Packit |
5ce601 |
int
|
|
Packit |
5ce601 |
main(int argc, char *argv[])
|
|
Packit |
5ce601 |
{
|
|
Packit |
5ce601 |
isc_mem_t *mctx = NULL;
|
|
Packit |
5ce601 |
isc_buffer_t b;
|
|
Packit |
5ce601 |
int n;
|
|
Packit |
5ce601 |
dns_fixedname_t origin, name;
|
|
Packit |
5ce601 |
dns_db_t *db = NULL;
|
|
Packit |
5ce601 |
dns_dbiterator_t *dbiter = NULL;
|
|
Packit |
5ce601 |
isc_result_t res;
|
|
Packit |
5ce601 |
dns_dbnode_t *node = NULL;
|
|
Packit |
5ce601 |
dns_rdataset_t rdataset;
|
|
Packit |
5ce601 |
dns_rdatasetiter_t *rdatasetiter = NULL;
|
|
Packit |
5ce601 |
dns_rdata_t rdata;
|
|
Packit |
5ce601 |
DB *bdb;
|
|
Packit |
5ce601 |
|
|
Packit |
5ce601 |
if (argc != 4) usage(*argv);
|
|
Packit |
5ce601 |
|
|
Packit |
5ce601 |
REQUIRE(isc_mem_create(0, 0, &mctx) == ISC_R_SUCCESS);
|
|
Packit |
5ce601 |
|
|
Packit |
5ce601 |
n = strlen(argv[1]);
|
|
Packit |
5ce601 |
isc_buffer_init(&b, argv[1], n);
|
|
Packit |
5ce601 |
isc_buffer_add(&b, n);
|
|
Packit |
5ce601 |
|
|
Packit |
5ce601 |
dns_fixedname_init(&origin);
|
|
Packit |
5ce601 |
|
|
Packit |
5ce601 |
REQUIRE(dns_name_fromtext(dns_fixedname_name(&origin), &b, dns_rootname,
|
|
Packit |
5ce601 |
0, NULL) == ISC_R_SUCCESS);
|
|
Packit |
5ce601 |
REQUIRE(dns_db_create(mctx, "rbt", dns_fixedname_name(&origin),
|
|
Packit |
5ce601 |
dns_dbtype_zone, dns_rdataclass_in, 0, NULL,
|
|
Packit |
5ce601 |
&db) == ISC_R_SUCCESS);
|
|
Packit |
5ce601 |
|
|
Packit |
5ce601 |
REQUIRE(dns_db_load(db, argv[2]) == ISC_R_SUCCESS);
|
|
Packit |
5ce601 |
|
|
Packit |
5ce601 |
REQUIRE(dns_db_createiterator(db, 0, &dbiter) == ISC_R_SUCCESS);
|
|
Packit |
5ce601 |
|
|
Packit |
5ce601 |
dns_rdataset_init(&rdataset);
|
|
Packit |
5ce601 |
dns_rdata_init(&rdata);
|
|
Packit |
5ce601 |
dns_fixedname_init(&name);
|
|
Packit |
5ce601 |
bdb = bdb_init(argv[3]);
|
|
Packit |
5ce601 |
|
|
Packit |
5ce601 |
for (res = dns_dbiterator_first(dbiter); res == ISC_R_SUCCESS;
|
|
Packit |
5ce601 |
res = dns_dbiterator_next(dbiter)) {
|
|
Packit |
5ce601 |
dns_dbiterator_current(dbiter, &node, dns_fixedname_name(&name));
|
|
Packit |
5ce601 |
REQUIRE(dns_db_allrdatasets(db, node, NULL, 0, &rdatasetiter)
|
|
Packit |
5ce601 |
== ISC_R_SUCCESS);
|
|
Packit |
5ce601 |
|
|
Packit |
5ce601 |
for (res = dns_rdatasetiter_first(rdatasetiter);
|
|
Packit |
5ce601 |
res == ISC_R_SUCCESS;
|
|
Packit |
5ce601 |
res = dns_rdatasetiter_next(rdatasetiter)) {
|
|
Packit |
5ce601 |
dns_rdatasetiter_current(rdatasetiter, &rdataset);
|
|
Packit |
5ce601 |
|
|
Packit |
5ce601 |
res = dns_rdataset_first(&rdataset);
|
|
Packit |
5ce601 |
while (res == ISC_R_SUCCESS) {
|
|
Packit |
5ce601 |
dns_rdataset_current(&rdataset, &rdata);
|
|
Packit |
5ce601 |
REQUIRE(bdb_putrdata(bdb,
|
|
Packit |
5ce601 |
dns_fixedname_name(&name),
|
|
Packit |
5ce601 |
rdataset.ttl, &rdata)
|
|
Packit |
5ce601 |
== ISC_R_SUCCESS);
|
|
Packit |
5ce601 |
|
|
Packit |
5ce601 |
dns_rdata_reset(&rdata);
|
|
Packit |
5ce601 |
res = dns_rdataset_next(&rdataset);
|
|
Packit |
5ce601 |
}
|
|
Packit |
5ce601 |
|
|
Packit |
5ce601 |
dns_rdataset_disassociate(&rdataset);
|
|
Packit |
5ce601 |
}
|
|
Packit |
5ce601 |
dns_rdatasetiter_destroy(&rdatasetiter);
|
|
Packit |
5ce601 |
dns_db_detachnode(db, &node);
|
|
Packit |
5ce601 |
}
|
|
Packit |
5ce601 |
dns_dbiterator_destroy(&dbiter);
|
|
Packit |
5ce601 |
|
|
Packit |
5ce601 |
REQUIRE(bdb_destroy(bdb) == ISC_R_SUCCESS);
|
|
Packit |
5ce601 |
|
|
Packit |
5ce601 |
return 0;
|
|
Packit |
5ce601 |
}
|