1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
|
/*
* difffile.h - nsd.diff file handling header file. Read/write diff files.
*
* Copyright (c) 2001-2011, NLnet Labs. All rights reserved.
*
* See LICENSE for the license.
*
*/
#ifndef DIFFFILE_H
#define DIFFFILE_H
#include <config.h>
#include "rbtree.h"
#include "namedb.h"
#include "options.h"
#define DIFF_PART_IXFR ('I'<<24 | 'X'<<16 | 'F'<<8 | 'R')
#define DIFF_PART_SURE ('S'<<24 | 'U'<<16 | 'R'<<8 | 'E')
/*
* Used to pass commit logs
*/
struct diff_log {
char* zone_name;
char* error;
char* comment;
struct diff_log* next;
};
/* write an xfr packet data to the diff file, type=IXFR.
The diff file is created if necessary. */
void diff_write_packet(const char* zone, uint32_t new_serial, uint16_t id,
uint32_t seq_nr, uint8_t* data, size_t len, nsd_options_t* opt);
/*
* Write a commit packet to the diff file, type=SURE.
* The zone data (preceding ixfr packets) are committed.
* See NSD-DIFFFILE for meaning of the arguments.
*/
void diff_write_commit(const char* zone, uint32_t old_serial,
uint32_t new_serial, uint16_t id, uint32_t num_parts,
uint8_t commit, const char* log_msg,
nsd_options_t* opt);
/* check if the crc in the nsd.db is the same in memory as on disk.
returns 1 if different. 0 if the same. returns -1 on error. */
int db_crc_different(namedb_type* db);
/* read the diff file and apply to the database in memory.
It will attempt to skip bad data.
If you pass a non-null value log, log comments are alloced in namedb.region
then, *log must be 0 on start of call (entries are prepended).
returns 0 on an unrecoverable error. */
int diff_read_file(namedb_type* db, nsd_options_t* opt, struct diff_log** log,
size_t child_count);
/* check the diff file for garbage at the end (bad type, partial write)
* and snip it off.
*/
void diff_snip_garbage(namedb_type* db, nsd_options_t* opt);
/*
* These functions read parts of the diff file.
*/
int diff_read_32(FILE *in, uint32_t* result);
int diff_read_16(FILE *in, uint16_t* result);
int diff_read_8(FILE *in, uint8_t* result);
int diff_read_str(FILE* in, char* buf, size_t len);
#endif /* DIFFFILE_H */
|