xref: /openbsd/usr.sbin/nsd/difffile.h (revision d415bd75)
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, struct udb_ptr* udbz, 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 	struct udb_ptr* udbz, 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 		/** statistic info */
94 		task_stat_info,
95 		/** add a zone */
96 		task_add_zone,
97 		/** delete zone */
98 		task_del_zone,
99 		/** add TSIG key */
100 		task_add_key,
101 		/** delete TSIG key */
102 		task_del_key,
103 		/** add pattern */
104 		task_add_pattern,
105 		/** delete pattern */
106 		task_del_pattern,
107 		/** options change */
108 		task_opt_change,
109 		/** zonestat increment */
110 		task_zonestat_inc,
111 		/** add a new cookie secret */
112 		task_add_cookie_secret,
113 		/** drop the oldest cookie secret */
114 		task_drop_cookie_secret,
115 		/** make staging cookie secret active */
116 		task_activate_cookie_secret,
117 	} task_type;
118 	uint32_t size; /* size of this struct */
119 
120 	/** soainfo: zonename dname, soaRR wireform, yesno is soainfo_hint */
121 	/** expire: zonename, boolyesno */
122 	/** apply_xfr: zonename, serials, yesno is filenamecounter */
123 	uint32_t oldserial, newserial;
124 	/** general variable.  for some used to see if zname is present. */
125 	uint64_t yesno;
126 	struct dname zname[0];
127 };
128 #define TASKLIST(ptr) ((struct task_list_d*)UDB_PTR(ptr))
129 /** create udb for tasks */
130 struct udb_base* task_file_create(const char* file);
131 void task_remap(udb_base* udb);
132 void task_process_sync(udb_base* udb);
133 void task_clear(udb_base* udb);
134 void task_new_soainfo(udb_base* udb, udb_ptr* last, struct zone* z, enum soainfo_hint hint);
135 void task_new_expire(udb_base* udb, udb_ptr* last,
136 	const struct dname* z, int expired);
137 void* task_new_stat_info(udb_base* udb, udb_ptr* last, struct nsdst* stat,
138 	size_t child_count);
139 void task_new_check_zonefiles(udb_base* udb, udb_ptr* last,
140 	const dname_type* zone);
141 void task_new_write_zonefiles(udb_base* udb, udb_ptr* last,
142 	const dname_type* zone);
143 void task_new_set_verbosity(udb_base* udb, udb_ptr* last, int v);
144 void task_new_add_zone(udb_base* udb, udb_ptr* last, const char* zone,
145 	const char* pattern, unsigned zonestatid);
146 void task_new_del_zone(udb_base* udb, udb_ptr* last, const dname_type* dname);
147 void task_new_add_key(udb_base* udb, udb_ptr* last, struct key_options* key);
148 void task_new_del_key(udb_base* udb, udb_ptr* last, const char* name);
149 void task_new_add_pattern(udb_base* udb, udb_ptr* last,
150 	struct pattern_options* p);
151 void task_new_del_pattern(udb_base* udb, udb_ptr* last, const char* name);
152 void task_new_opt_change(udb_base* udb, udb_ptr* last, struct nsd_options* opt);
153 void task_new_zonestat_inc(udb_base* udb, udb_ptr* last, unsigned sz);
154 void task_new_add_cookie_secret(udb_base* udb, udb_ptr* last, const char* secret);
155 void task_new_drop_cookie_secret(udb_base* udb, udb_ptr* last);
156 void task_new_activate_cookie_secret(udb_base* udb, udb_ptr* last);
157 int task_new_apply_xfr(udb_base* udb, udb_ptr* last, const dname_type* zone,
158 	uint32_t old_serial, uint32_t new_serial, uint64_t filenumber);
159 void task_process_in_reload(struct nsd* nsd, udb_base* udb, udb_ptr *last_task,
160 	udb_ptr* task);
161 void task_process_expire(namedb_type* db, struct task_list_d* task);
162 
163 #endif /* DIFFFILE_H */
164