nsecify.c revision 70e5a7403f0e0a3bd292b8287c5fed5772c15270
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer/*
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews * Copyright (C) 2004, 2007 Internet Systems Consortium, Inc. ("ISC")
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer * Copyright (C) 1999-2001, 2003 Internet Software Consortium.
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews *
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews * Permission to use, copy, modify, and/or distribute this software for any
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews * purpose with or without fee is hereby granted, provided that the above
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer * copyright notice and this permission notice appear in all copies.
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer *
9a14f870ddc0108402d2daa7a7ff84b6e20f08b4Automatic Updater * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
9a14f870ddc0108402d2daa7a7ff84b6e20f08b4Automatic Updater * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer * PERFORMANCE OF THIS SOFTWARE.
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer */
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer/* $Id: nsecify.c,v 1.6 2007/06/19 23:46:59 tbox Exp $ */
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer#include <config.h>
f42c0dcca86f2009c089e27ba513cb6fc9ee88baEvan Hunt
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer#include <stdlib.h>
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer#include <isc/mem.h>
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer#include <isc/print.h>
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer#include <isc/string.h>
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer#include <dns/db.h>
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer#include <dns/dbiterator.h>
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer#include <dns/fixedname.h>
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer#include <dns/nsec.h>
f42c0dcca86f2009c089e27ba513cb6fc9ee88baEvan Hunt#include <dns/rdataset.h>
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer#include <dns/rdatasetiter.h>
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer#include <dns/result.h>
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer
29747dfe5e073a299b3681e01f5c55540f8bfed7Mark Andrewsstatic isc_mem_t *mctx = NULL;
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayerstatic inline void
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayerfatal(const char *message) {
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer fprintf(stderr, "%s\n", message);
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer exit(1);
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer}
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayerstatic inline void
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayercheck_result(isc_result_t result, const char *message) {
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer if (result != ISC_R_SUCCESS) {
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer fprintf(stderr, "%s: %s\n", message,
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer isc_result_totext(result));
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer exit(1);
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer }
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer}
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayerstatic inline isc_boolean_t
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayeractive_node(dns_db_t *db, dns_dbversion_t *version, dns_dbnode_t *node) {
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer dns_rdatasetiter_t *rdsiter;
1016f2638f8a34a802ce41043d5369553ac14246Francis Dupont isc_boolean_t active = ISC_FALSE;
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer isc_result_t result;
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer dns_rdataset_t rdataset;
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer dns_rdataset_init(&rdataset);
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer rdsiter = NULL;
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer result = dns_db_allrdatasets(db, node, version, 0, &rdsiter);
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer check_result(result, "dns_db_allrdatasets()");
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer result = dns_rdatasetiter_first(rdsiter);
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer while (result == ISC_R_SUCCESS) {
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer dns_rdatasetiter_current(rdsiter, &rdataset);
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer if (rdataset.type != dns_rdatatype_nsec)
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer active = ISC_TRUE;
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer dns_rdataset_disassociate(&rdataset);
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer if (!active)
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer result = dns_rdatasetiter_next(rdsiter);
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer else
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer result = ISC_R_NOMORE;
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer }
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer if (result != ISC_R_NOMORE)
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer fatal("rdataset iteration failed");
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer dns_rdatasetiter_destroy(&rdsiter);
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer if (!active) {
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer /*
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer * Make sure there is no NSEC record for this node.
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer */
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer result = dns_db_deleterdataset(db, node, version,
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer dns_rdatatype_nsec, 0);
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer if (result == DNS_R_UNCHANGED)
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer result = ISC_R_SUCCESS;
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer check_result(result, "dns_db_deleterdataset");
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer }
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer return (active);
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer}
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayerstatic inline isc_result_t
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayernext_active(dns_db_t *db, dns_dbversion_t *version, dns_dbiterator_t *dbiter,
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer dns_name_t *name, dns_dbnode_t **nodep)
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer{
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer isc_result_t result;
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer isc_boolean_t active;
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer do {
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer active = ISC_FALSE;
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer result = dns_dbiterator_current(dbiter, nodep, name);
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer if (result == ISC_R_SUCCESS) {
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer active = active_node(db, version, *nodep);
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer if (!active) {
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer dns_db_detachnode(db, nodep);
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer result = dns_dbiterator_next(dbiter);
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer }
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer }
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer } while (result == ISC_R_SUCCESS && !active);
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer return (result);
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer}
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayerstatic void
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayernsecify(char *filename) {
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer isc_result_t result;
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer dns_db_t *db;
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer dns_dbversion_t *wversion;
68c2ccc953059f389cefc0f8a5ce0f83be7458c9Danny Mayer dns_dbnode_t *node, *nextnode;
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer char *origintext;
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer dns_fixedname_t fname, fnextname;
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer dns_name_t *name, *nextname, *target;
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer isc_buffer_t b;
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer size_t len;
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer dns_dbiterator_t *dbiter;
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer char newfilename[1024];
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer
68c2ccc953059f389cefc0f8a5ce0f83be7458c9Danny Mayer dns_fixedname_init(&fname);
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer name = dns_fixedname_name(&fname);
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer dns_fixedname_init(&fnextname);
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer nextname = dns_fixedname_name(&fnextname);
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer origintext = strrchr(filename, '/');
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer if (origintext == NULL)
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer origintext = filename;
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer else
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer origintext++; /* Skip '/'. */
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer len = strlen(origintext);
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer isc_buffer_init(&b, origintext, len);
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer isc_buffer_add(&b, len);
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer result = dns_name_fromtext(name, &b, dns_rootname, ISC_FALSE, NULL);
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer check_result(result, "dns_name_fromtext()");
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer db = NULL;
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer result = dns_db_create(mctx, "rbt", name, dns_dbtype_zone,
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer dns_rdataclass_in, 0, NULL, &db);
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer check_result(result, "dns_db_create()");
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer result = dns_db_load(db, filename);
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer if (result == DNS_R_SEENINCLUDE)
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer result = ISC_R_SUCCESS;
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer check_result(result, "dns_db_load()");
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer wversion = NULL;
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer result = dns_db_newversion(db, &wversion);
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer check_result(result, "dns_db_newversion()");
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer dbiter = NULL;
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer result = dns_db_createiterator(db, ISC_FALSE, &dbiter);
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer check_result(result, "dns_db_createiterator()");
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer result = dns_dbiterator_first(dbiter);
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer node = NULL;
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer result = next_active(db, wversion, dbiter, name, &node);
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer while (result == ISC_R_SUCCESS) {
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer nextnode = NULL;
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer result = dns_dbiterator_next(dbiter);
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer if (result == ISC_R_SUCCESS)
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer result = next_active(db, wversion, dbiter, nextname,
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer &nextnode);
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer if (result == ISC_R_SUCCESS)
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer target = nextname;
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer else if (result == ISC_R_NOMORE)
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer target = dns_db_origin(db);
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer else {
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer target = NULL; /* Make compiler happy. */
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer fatal("db iteration failed");
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer }
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer dns_nsec_build(db, wversion, node, target, 3600); /* XXX BEW */
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer dns_db_detachnode(db, &node);
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer node = nextnode;
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer }
48b785fe6bcc95831f962b9b3a61c0b39e339558Danny Mayer if (result != ISC_R_NOMORE)
fatal("db iteration failed");
dns_dbiterator_destroy(&dbiter);
/*
* XXXRTH For now, we don't increment the SOA serial.
*/
dns_db_closeversion(db, &wversion, ISC_TRUE);
len = strlen(filename);
if (len + 4 + 1 > sizeof(newfilename))
fatal("filename too long");
sprintf(newfilename, "%s.new", filename);
result = dns_db_dump(db, NULL, newfilename);
check_result(result, "dns_db_dump");
dns_db_detach(&db);
}
int
main(int argc, char *argv[]) {
int i;
isc_result_t result;
dns_result_register();
result = isc_mem_create(0, 0, &mctx);
check_result(result, "isc_mem_create()");
argc--;
argv++;
for (i = 0; i < argc; i++)
nsecify(argv[i]);
/* isc_mem_stats(mctx, stdout); */
isc_mem_destroy(&mctx);
return (0);
}