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