1/* $NetBSD: zone2bdb.c,v 1.2.6.1 2012/06/05 21:15:40 bouyer Exp $ */ 2 3/* 4 * Copyright (C) 2002 Nuno M. Rodrigues. 5 * 6 * Permission to use, copy, modify, and distribute this software for any 7 * purpose with or without fee is hereby granted, provided that the above 8 * copyright notice and this permission notice appear in all copies. 9 * 10 * THE SOFTWARE IS PROVIDED "AS IS" AND NUNO M. RODRIGUES 11 * DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL 12 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL 13 * INTERNET SOFTWARE CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, 14 * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING 15 * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, 16 * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION 17 * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 18 */ 19 20/* Id: zone2bdb.c,v 1.3 2009/09/01 00:22:26 jinmei Exp */ 21 22#include <stdio.h> 23 24#include <isc/mem.h> 25#include <isc/result.h> 26#include <isc/types.h> 27#include <isc/util.h> 28 29#include <dns/db.h> 30#include <dns/dbiterator.h> 31#include <dns/fixedname.h> 32#include <dns/name.h> 33#include <dns/rdata.h> 34#include <dns/rdataset.h> 35#include <dns/rdatasetiter.h> 36#include <dns/rdatatype.h> 37#include <dns/ttl.h> 38#include <dns/types.h> 39 40#include <db.h> 41 42#define MAX_RDATATEXT 63 + 4 + 65535 + 2 /* ttl + type + rdata + sep */ 43 44/* 45 * Returns a valid 'DB' handle. 46 * 47 * Requires: 48 * 'file' is a valid non-existant path. 49 */ 50DB * 51bdb_init(const char *file) 52{ 53 DB *db; 54 55 REQUIRE(db_create(&db, NULL, 0) == 0); 56 REQUIRE(db->set_flags(db, DB_DUP) == 0); 57 REQUIRE(db->open(db, file, NULL, DB_HASH, DB_CREATE | DB_EXCL, 0) == 0); 58 59 return db; 60} 61 62/* 63 * Puts resource record data on 'db'. 64 */ 65isc_result_t 66bdb_putrdata(DB *db, dns_name_t *name, dns_ttl_t ttl, dns_rdata_t *rdata) 67{ 68 static DBT key, data; 69 isc_buffer_t keybuf, databuf; 70 char nametext[DNS_NAME_MAXTEXT]; 71 char rdatatext[MAX_RDATATEXT]; 72 73 isc_buffer_init(&keybuf, nametext, DNS_NAME_MAXTEXT); 74 75 dns_name_totext(name, ISC_TRUE, &keybuf); 76 77 key.data = isc_buffer_base(&keybuf); 78 key.size = isc_buffer_usedlength(&keybuf); 79 80 isc_buffer_init(&databuf, rdatatext, MAX_RDATATEXT); 81 82 dns_ttl_totext(ttl, ISC_FALSE, &databuf); 83 *(char *)isc_buffer_used(&databuf) = ' '; 84 isc_buffer_add(&databuf, 1); 85 86 dns_rdatatype_totext(rdata->type, &databuf); /* XXX private data */ 87 *(char *)isc_buffer_used(&databuf) = ' '; 88 isc_buffer_add(&databuf, 1); 89 90 dns_rdata_totext(rdata, NULL, &databuf); 91 92 data.data = isc_buffer_base(&databuf); 93 data.size = isc_buffer_usedlength(&databuf); 94 95 REQUIRE(db->put(db, NULL, &key, &data, 0) == 0); 96 97 return ISC_R_SUCCESS; 98} 99 100isc_result_t 101bdb_destroy(DB *db) 102{ 103 104 return (db->close(db, 0) == 0) ? ISC_R_SUCCESS : ISC_R_FAILURE; 105} 106 107void 108usage(const char *prog) 109{ 110 111 fprintf(stderr, "Usage: %s <origin> <zonefile> <db>\n", prog); 112 exit(1); 113} 114 115int 116main(int argc, char *argv[]) 117{ 118 isc_mem_t *mctx = NULL; 119 isc_buffer_t b; 120 int n; 121 dns_fixedname_t origin, name; 122 dns_db_t *db = NULL; 123 dns_dbiterator_t *dbiter = NULL; 124 isc_result_t res; 125 dns_dbnode_t *node = NULL; 126 dns_rdataset_t rdataset; 127 dns_rdatasetiter_t *rdatasetiter = NULL; 128 dns_rdata_t rdata; 129 DB *bdb; 130 131 if (argc != 4) usage(*argv); 132 133 REQUIRE(isc_mem_create(0, 0, &mctx) == ISC_R_SUCCESS); 134 135 n = strlen(argv[1]); 136 isc_buffer_init(&b, argv[1], n); 137 isc_buffer_add(&b, n); 138 139 dns_fixedname_init(&origin); 140 141 REQUIRE(dns_name_fromtext(dns_fixedname_name(&origin), &b, dns_rootname, 142 0, NULL) == ISC_R_SUCCESS); 143 REQUIRE(dns_db_create(mctx, "rbt", dns_fixedname_name(&origin), 144 dns_dbtype_zone, dns_rdataclass_in, 0, NULL, 145 &db) == ISC_R_SUCCESS); 146 147 REQUIRE(dns_db_load(db, argv[2]) == ISC_R_SUCCESS); 148 149 REQUIRE(dns_db_createiterator(db, 0, &dbiter) == ISC_R_SUCCESS); 150 151 dns_rdataset_init(&rdataset); 152 dns_rdata_init(&rdata); 153 dns_fixedname_init(&name); 154 bdb = bdb_init(argv[3]); 155 156 for (res = dns_dbiterator_first(dbiter); res == ISC_R_SUCCESS; 157 res = dns_dbiterator_next(dbiter)) { 158 dns_dbiterator_current(dbiter, &node, dns_fixedname_name(&name)); 159 REQUIRE(dns_db_allrdatasets(db, node, NULL, 0, &rdatasetiter) 160 == ISC_R_SUCCESS); 161 162 for (res = dns_rdatasetiter_first(rdatasetiter); 163 res == ISC_R_SUCCESS; 164 res = dns_rdatasetiter_next(rdatasetiter)) { 165 dns_rdatasetiter_current(rdatasetiter, &rdataset); 166 167 res = dns_rdataset_first(&rdataset); 168 while (res == ISC_R_SUCCESS) { 169 dns_rdataset_current(&rdataset, &rdata); 170 REQUIRE(bdb_putrdata(bdb, 171 dns_fixedname_name(&name), 172 rdataset.ttl, &rdata) 173 == ISC_R_SUCCESS); 174 175 dns_rdata_reset(&rdata); 176 res = dns_rdataset_next(&rdataset); 177 } 178 179 dns_rdataset_disassociate(&rdataset); 180 } 181 dns_rdatasetiter_destroy(&rdatasetiter); 182 dns_db_detachnode(db, &node); 183 } 184 dns_dbiterator_destroy(&dbiter); 185 186 REQUIRE(bdb_destroy(bdb) == ISC_R_SUCCESS); 187 188 return 0; 189} 190