xref: /netbsd-src/external/bsd/nsd/dist/difffile.h (revision 811a4a0195236f69295602fbee687a174d42af9b)
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"
16 struct nsd;
17 struct 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). */
30 void 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  */
38 void 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  */
46 void 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  */
52 int diff_read_32(FILE *in, uint32_t* result);
53 int diff_read_8(FILE *in, uint8_t* result);
54 int diff_read_str(FILE* in, char* buf, size_t len);
55 
56 /* delete the RRs for a zone from memory */
57 void delete_zone_rrs(namedb_type* db, zone_type* zone);
58 /* delete an RR */
59 int 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 */
64 int 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 
69 enum soainfo_hint {
70 	soainfo_ok,
71 	soainfo_gone,
72 	soainfo_bad
73 };
74 
75 /* task udb structure */
76 struct 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 */
128 struct udb_base* task_file_create(const char* file);
129 void task_remap(udb_base* udb);
130 void task_process_sync(udb_base* udb);
131 void task_clear(udb_base* udb);
132 void task_new_soainfo(udb_base* udb, udb_ptr* last, struct zone* z, enum soainfo_hint hint);
133 void task_new_expire(udb_base* udb, udb_ptr* last,
134 	const struct dname* z, int expired);
135 void task_new_check_zonefiles(udb_base* udb, udb_ptr* last,
136 	const dname_type* zone);
137 void task_new_write_zonefiles(udb_base* udb, udb_ptr* last,
138 	const dname_type* zone);
139 void task_new_set_verbosity(udb_base* udb, udb_ptr* last, int v);
140 void task_new_add_zone(udb_base* udb, udb_ptr* last, const char* zone,
141 	const char* pattern, unsigned zonestatid);
142 void task_new_del_zone(udb_base* udb, udb_ptr* last, const dname_type* dname);
143 void task_new_add_key(udb_base* udb, udb_ptr* last, struct key_options* key);
144 void task_new_del_key(udb_base* udb, udb_ptr* last, const char* name);
145 void task_new_add_pattern(udb_base* udb, udb_ptr* last,
146 	struct pattern_options* p);
147 void task_new_del_pattern(udb_base* udb, udb_ptr* last, const char* name);
148 void task_new_opt_change(udb_base* udb, udb_ptr* last, struct nsd_options* opt);
149 void task_new_zonestat_inc(udb_base* udb, udb_ptr* last, unsigned sz);
150 void task_new_add_cookie_secret(udb_base* udb, udb_ptr* last, const char* secret);
151 void task_new_drop_cookie_secret(udb_base* udb, udb_ptr* last);
152 void task_new_activate_cookie_secret(udb_base* udb, udb_ptr* last);
153 int 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);
155 void task_process_in_reload(struct nsd* nsd, udb_base* udb, udb_ptr *last_task,
156 	udb_ptr* task);
157 void task_process_expire(namedb_type* db, struct task_list_d* task);
158 
159 #endif /* DIFFFILE_H */
160