difffile.h revision 1.5
1/* 2 * difffile.h - nsd.diff file handling header file. Read/write diff files. 3 * 4 * Copyright (c) 2001-2006, NLnet Labs. All rights reserved. 5 * 6 * See LICENSE for the license. 7 * 8 */ 9#ifndef DIFFFILE_H 10#define DIFFFILE_H 11 12#include "rbtree.h" 13#include "namedb.h" 14#include "options.h" 15#include "udb.h" 16struct nsd; 17struct nsdst; 18 19#define DIFF_PART_XXFR ('X'<<24 | 'X'<<16 | 'F'<<8 | 'R') 20#define DIFF_PART_XFRF ('X'<<24 | 'F'<<16 | 'R'<<8 | 'F') 21 22#define DIFF_NOT_COMMITTED (0u) /* XFR not (yet) committed to disk */ 23#define DIFF_COMMITTED (1u<<0) /* XFR committed to disk */ 24#define DIFF_CORRUPT (1u<<1) /* XFR corrupt */ 25#define DIFF_INCONSISTENT (1u<<2) /* IXFR cannot be applied */ 26#define DIFF_VERIFIED (1u<<3) /* XFR already verified */ 27 28/* write an xfr packet data to the diff file, type=IXFR. 29 The diff file is created if necessary, with initial header(notcommitted). */ 30void diff_write_packet(const char* zone, const char* pat, uint32_t old_serial, 31 uint32_t new_serial, uint32_t seq_nr, uint8_t* data, size_t len, 32 struct nsd* nsd, uint64_t filenumber); 33 34/* 35 * Overwrite header of diff file with committed vale and other data. 36 * append log string. 37 */ 38void diff_write_commit(const char* zone, uint32_t old_serial, 39 uint32_t new_serial, uint32_t num_parts, uint8_t commit, 40 const char* log_msg, struct nsd* nsd, uint64_t filenumber); 41 42/* 43 * Overwrite committed value of diff file with discarded to ensure diff 44 * file is not reapplied on reload. 45 */ 46void diff_update_commit(const char* zone, 47 uint8_t commit, struct nsd* nsd, uint64_t filenumber); 48 49/* 50 * These functions read parts of the diff file. 51 */ 52int diff_read_32(FILE *in, uint32_t* result); 53int diff_read_8(FILE *in, uint8_t* result); 54int diff_read_str(FILE* in, char* buf, size_t len); 55 56/* delete the RRs for a zone from memory */ 57void delete_zone_rrs(namedb_type* db, zone_type* zone); 58/* delete an RR */ 59int delete_RR(namedb_type* db, const dname_type* dname, 60 uint16_t type, uint16_t klass, 61 buffer_type* packet, size_t rdatalen, zone_type *zone, 62 region_type* temp_region, int* softfail); 63/* add an RR */ 64int add_RR(namedb_type* db, const dname_type* dname, 65 uint16_t type, uint16_t klass, uint32_t ttl, 66 buffer_type* packet, size_t rdatalen, zone_type *zone, 67 int* softfail); 68 69enum soainfo_hint { 70 soainfo_ok, 71 soainfo_gone, 72 soainfo_bad 73}; 74 75/* task udb structure */ 76struct task_list_d { 77 /** next task in list */ 78 udb_rel_ptr next; 79 /** task type */ 80 enum { 81 /** expire or un-expire a zone */ 82 task_expire, 83 /** apply an ixfr or axfr to a zone */ 84 task_apply_xfr, 85 /** soa info for zone */ 86 task_soa_info, 87 /** check mtime of zonefiles and read them, done on SIGHUP */ 88 task_check_zonefiles, 89 /** write zonefiles (if changed) */ 90 task_write_zonefiles, 91 /** set verbosity */ 92 task_set_verbosity, 93 /** add a zone */ 94 task_add_zone, 95 /** delete zone */ 96 task_del_zone, 97 /** add TSIG key */ 98 task_add_key, 99 /** delete TSIG key */ 100 task_del_key, 101 /** add pattern */ 102 task_add_pattern, 103 /** delete pattern */ 104 task_del_pattern, 105 /** options change */ 106 task_opt_change, 107 /** zonestat increment */ 108 task_zonestat_inc, 109 /** add a new cookie secret */ 110 task_add_cookie_secret, 111 /** drop the oldest cookie secret */ 112 task_drop_cookie_secret, 113 /** make staging cookie secret active */ 114 task_activate_cookie_secret, 115 } task_type; 116 uint32_t size; /* size of this struct */ 117 118 /** soainfo: zonename dname, soaRR wireform, yesno is soainfo_hint */ 119 /** expire: zonename, boolyesno */ 120 /** apply_xfr: zonename, serials, yesno is filenamecounter */ 121 uint32_t oldserial, newserial; 122 /** general variable. for some used to see if zname is present. */ 123 uint64_t yesno; 124 struct dname zname[0]; 125}; 126#define TASKLIST(ptr) ((struct task_list_d*)UDB_PTR(ptr)) 127/** create udb for tasks */ 128struct udb_base* task_file_create(const char* file); 129void task_remap(udb_base* udb); 130void task_process_sync(udb_base* udb); 131void task_clear(udb_base* udb); 132void task_new_soainfo(udb_base* udb, udb_ptr* last, struct zone* z, enum soainfo_hint hint); 133void task_new_expire(udb_base* udb, udb_ptr* last, 134 const struct dname* z, int expired); 135void task_new_check_zonefiles(udb_base* udb, udb_ptr* last, 136 const dname_type* zone); 137void task_new_write_zonefiles(udb_base* udb, udb_ptr* last, 138 const dname_type* zone); 139void task_new_set_verbosity(udb_base* udb, udb_ptr* last, int v); 140void task_new_add_zone(udb_base* udb, udb_ptr* last, const char* zone, 141 const char* pattern, unsigned zonestatid); 142void task_new_del_zone(udb_base* udb, udb_ptr* last, const dname_type* dname); 143void task_new_add_key(udb_base* udb, udb_ptr* last, struct key_options* key); 144void task_new_del_key(udb_base* udb, udb_ptr* last, const char* name); 145void task_new_add_pattern(udb_base* udb, udb_ptr* last, 146 struct pattern_options* p); 147void task_new_del_pattern(udb_base* udb, udb_ptr* last, const char* name); 148void task_new_opt_change(udb_base* udb, udb_ptr* last, struct nsd_options* opt); 149void task_new_zonestat_inc(udb_base* udb, udb_ptr* last, unsigned sz); 150void task_new_add_cookie_secret(udb_base* udb, udb_ptr* last, const char* secret); 151void task_new_drop_cookie_secret(udb_base* udb, udb_ptr* last); 152void task_new_activate_cookie_secret(udb_base* udb, udb_ptr* last); 153int task_new_apply_xfr(udb_base* udb, udb_ptr* last, const dname_type* zone, 154 uint32_t old_serial, uint32_t new_serial, uint64_t filenumber); 155void task_process_in_reload(struct nsd* nsd, udb_base* udb, udb_ptr *last_task, 156 udb_ptr* task); 157void task_process_expire(namedb_type* db, struct task_list_d* task); 158 159#endif /* DIFFFILE_H */ 160