summaryrefslogtreecommitdiff
path: root/src/zcompile/zcompile.h
blob: d19ef4ca1a546c37b13f525201510a067f0fd128 (plain)
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
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
/*!
 * \file zoneparser.h
 *
 * \author modifications by Jan Kadlec <jan.kadlec@nic.cz>, most of the code
 *         by NLnet Labs.
 *         Copyright (c) 2001-2011, NLnet Labs. All rights reserved.
 *
 * \brief Zone compiler.
 *
 * \addtogroup zoneparser
 * @{
 */

/*
 * Copyright (c) 2001-2011, NLnet Labs. All rights reserved.
 *
 * This software is open source.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 * Redistributions of source code must retain the above copyright notice,
 * this list of conditions and the following disclaimer.
 *
 * Redistributions in binary form must reproduce the above copyright notice,
 * this list of conditions and the following disclaimer in the documentation
 * and/or other materials provided with the distribution.
 *
 * Neither the name of the NLNET LABS nor the names of its contributors may
 * be used to endorse or promote products derived from this software without
 * specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */

#ifndef _KNOTD_ZONEPARSER_H_
#define _KNOTD_ZONEPARSER_H_

#include <stdio.h>

#include "libknot/dname.h"
#include "libknot/rrset.h"
#include "libknot/zone/node.h"
#include "libknot/rdata.h"
#include "libknot/zone/zone.h"
#include "libknot/zone/dname-table.h"
#include "libknot/zone/dname-table.h"
#include "common/slab/slab.h"

#define MAXRDATALEN	64	/*!< Maximum number of RDATA items. */
#define MAXLABELLEN	63	/*!< Maximum label length. */
#define MAXDOMAINLEN	255	/*!< Maximum domain name length */
#define MAX_RDLENGTH	65535	/*!< Maximum length of RDATA item */
#define	MAXTOKENSLEN	512	/*!< Maximum number of tokens per entry. */
#define	B64BUFSIZE	65535	/*!< Buffer size for b64 conversion. */
#define	ROOT		(const uint8_t *)"\001" /*!< Root domain name. */

#define NSEC_WINDOW_COUNT     256	/*!< Number of NSEC windows. */
#define NSEC_WINDOW_BITS_COUNT 256	/*!< Number of bits in NSEC window. */
/*! \brief Size of NSEC window in bytes. */
#define NSEC_WINDOW_BITS_SIZE  (NSEC_WINDOW_BITS_COUNT / 8)

/*
 * RFC 4025 - codes for different types that IPSECKEY can hold.
 */
#define IPSECKEY_NOGATEWAY      0
#define IPSECKEY_IP4            1
#define IPSECKEY_IP6            2
#define IPSECKEY_DNAME          3

#define LINEBUFSZ 1024	/*!< Buffer size for one line in zone file. */

struct lex_data {
    size_t   len;		/*!< holds the label length */
    char    *str;		/*!< holds the data */
};

#define DEFAULT_TTL 3600

int yylex_destroy(void *scanner);
int zp_parse(void *scanner);
void zp_set_in(FILE *f, void *scanner);
int zp_lex_init(void **scanner);
int zp_lex_destroy(void *scanner);

/*! \todo Implement ZoneDB. */
typedef void namedb_type;

/*!
 * \brief One-purpose linked list holding pointers to RRSets.
 */
struct rrset_list {
	knot_rrset_t *data; /*!< List data. */
	struct rrset_list *next; /*!< Next node. */
};

typedef struct rrset_list rrset_list_t;

/*!
 * \brief Main zoneparser structure.
 */
struct zparser {
	const char *filename; /*!< File with zone. */
	uint32_t default_ttl; /*!< Default TTL. */
	uint16_t default_class; /*!< Default class. */
	knot_zone_t *current_zone; /*!< Current zone. */
	knot_node_t *origin; /*!< Origin node. */
	knot_dname_t *prev_dname; /*!< Previous dname. */
	knot_dname_t *origin_from_config; /*!< Zone origin from config. */
	knot_node_t *default_apex; /*!< Zone default apex. */

	knot_node_t *last_node; /*!< Last processed node. */

	char *dname_str; /*!< Temporary dname. */

	int error_occurred; /*!< Error occured flag */
	unsigned int errors; /*!< Number of errors. */
	unsigned int line; /*!< Current line */

	knot_rrset_t *current_rrset; /*!< Current RRSet. */
	knot_rdata_item_t *temporary_items; /*!< Temporary rdata items. */

	knot_dname_t *root_domain; /*!< Root domain name. */
	slab_cache_t *parser_slab; /*!< Slab for parser. */
	rrset_list_t *node_rrsigs; /*!< List of RRSIGs in current node. */

	int rdata_count; /*!< Count of parsed rdata. */
};

typedef struct zparser zparser_type;

extern zparser_type *parser;

extern void zc_error_prev_line(const char *fmt, ...);

/* used in zonec.lex */

void zc_error_prev_line(const char *fmt, ...);
void zc_warning_prev_line(const char *fmt, ...);

/*!
 * \brief Does all the processing of RR - saves to zone, assigns RRSIGs etc.
 */
int process_rr();

/*!
 * \brief Parses and creates zone from given file.
 *
 * \param name Origin domain name string.
 * \param zonefile File containing the zone.
 * \param outfile File to save dump of the zone to.
 * \param semantic_checks Enables or disables sematic checks.
 *
 * \retval 0 on success.
 * \retval -1 on error.
 */
int zone_read(const char *name, const char *zonefile, const char *outfile,
              int semantic_checks);

/*!
 * \brief Creates zparser instance.
 *
 *
 * \return Created zparser instance.
 */
zparser_type *zparser_create();

/*!
 * \brief Inits zoneparser structure.
 *
 * \param filename Name of file with zone.
 * \param ttl Default TTL.
 * \param rclass Default class.
 * \param origin Zone origin.
 */
void zparser_init(const char *filename, uint32_t ttl, uint16_t rclass,
		  knot_node_t *origin, knot_dname_t *owner_from_config);

/*!
 * \brief Frees zoneparser structure.
 *
 */
void zparser_free();

int save_dnames_in_table(knot_dname_table_t *table,
                         knot_rrset_t *rrset);

#endif /* _KNOTD_ZONEPARSER_H_ */

/*! @} */