1 /* 2 * Copyright (C) 2004-2009, 2011-2013 Internet Systems Consortium, Inc. ("ISC") 3 * Copyright (C) 1999-2002 Internet Software Consortium. 4 * 5 * Permission to use, copy, modify, and/or distribute this software for any 6 * purpose with or without fee is hereby granted, provided that the above 7 * copyright notice and this permission notice appear in all copies. 8 * 9 * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH 10 * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 11 * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, 12 * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM 13 * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE 14 * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 15 * PERFORMANCE OF THIS SOFTWARE. 16 */ 17 18 /* $Id$ */ 19 20 #ifndef DNS_MASTER_H 21 #define DNS_MASTER_H 1 22 23 /*! \file dns/master.h */ 24 25 /*** 26 *** Imports 27 ***/ 28 29 #include <stdio.h> 30 31 #include <isc/lang.h> 32 33 #include <dns/types.h> 34 35 /* 36 * Flags to be passed in the 'options' argument in the functions below. 37 */ 38 #define DNS_MASTER_AGETTL 0x00000001 /*%< Age the ttl based on $DATE. */ 39 #define DNS_MASTER_MANYERRORS 0x00000002 /*%< Continue processing on errors. */ 40 #define DNS_MASTER_NOINCLUDE 0x00000004 /*%< Disallow $INCLUDE directives. */ 41 #define DNS_MASTER_ZONE 0x00000008 /*%< Loading a zone master file. */ 42 #define DNS_MASTER_HINT 0x00000010 /*%< Loading a hint master file. */ 43 #define DNS_MASTER_SLAVE 0x00000020 /*%< Loading a slave master file. */ 44 #define DNS_MASTER_CHECKNS 0x00000040 /*%< 45 * Check NS records to see 46 * if they are an address 47 */ 48 #define DNS_MASTER_FATALNS 0x00000080 /*%< 49 * Treat DNS_MASTER_CHECKNS 50 * matches as fatal 51 */ 52 #define DNS_MASTER_CHECKNAMES 0x00000100 53 #define DNS_MASTER_CHECKNAMESFAIL 0x00000200 54 #define DNS_MASTER_CHECKWILDCARD 0x00000400 /* Check for internal wildcards. */ 55 #define DNS_MASTER_CHECKMX 0x00000800 56 #define DNS_MASTER_CHECKMXFAIL 0x00001000 57 58 #define DNS_MASTER_RESIGN 0x00002000 59 #define DNS_MASTER_KEY 0x00004000 /*%< Loading a key zone master file. */ 60 #define DNS_MASTER_NOTTL 0x00008000 /*%< Don't require ttl. */ 61 62 ISC_LANG_BEGINDECLS 63 64 /* 65 * Structures that implement the "raw" format for master dump. 66 * These are provided for a reference purpose only; in the actual 67 * encoding, we directly read/write each field so that the encoded data 68 * is always "packed", regardless of the hardware architecture. 69 */ 70 #define DNS_RAWFORMAT_VERSION 1 71 72 /* 73 * Flags to indicate the status of the data in the raw file header 74 */ 75 #define DNS_MASTERRAW_COMPAT 0x01 76 #define DNS_MASTERRAW_SOURCESERIALSET 0x02 77 #define DNS_MASTERRAW_LASTXFRINSET 0x04 78 79 /* Common header */ 80 struct dns_masterrawheader { 81 isc_uint32_t format; /* must be 82 * dns_masterformat_raw */ 83 isc_uint32_t version; /* compatibility for future 84 * extensions */ 85 isc_uint32_t dumptime; /* timestamp on creation 86 * (currently unused) */ 87 isc_uint32_t flags; /* Flags */ 88 isc_uint32_t sourceserial; /* Source serial number (used 89 * by inline-signing zones) */ 90 isc_uint32_t lastxfrin; /* timestamp of last transfer 91 * (used by slave zones) */ 92 }; 93 94 /* The structure for each RRset */ 95 typedef struct { 96 isc_uint32_t totallen; /* length of the data for this 97 * RRset, including the 98 * "header" part */ 99 dns_rdataclass_t rdclass; /* 16-bit class */ 100 dns_rdatatype_t type; /* 16-bit type */ 101 dns_rdatatype_t covers; /* same as type */ 102 dns_ttl_t ttl; /* 32-bit TTL */ 103 isc_uint32_t nrdata; /* number of RRs in this set */ 104 /* followed by encoded owner name, and then rdata */ 105 } dns_masterrawrdataset_t; 106 107 /*** 108 *** Function 109 ***/ 110 111 isc_result_t 112 dns_master_loadfile(const char *master_file, 113 dns_name_t *top, 114 dns_name_t *origin, 115 dns_rdataclass_t zclass, 116 unsigned int options, 117 dns_rdatacallbacks_t *callbacks, 118 isc_mem_t *mctx); 119 120 isc_result_t 121 dns_master_loadfile2(const char *master_file, 122 dns_name_t *top, 123 dns_name_t *origin, 124 dns_rdataclass_t zclass, 125 unsigned int options, 126 dns_rdatacallbacks_t *callbacks, 127 isc_mem_t *mctx, 128 dns_masterformat_t format); 129 130 isc_result_t 131 dns_master_loadfile3(const char *master_file, 132 dns_name_t *top, 133 dns_name_t *origin, 134 dns_rdataclass_t zclass, 135 unsigned int options, 136 isc_uint32_t resign, 137 dns_rdatacallbacks_t *callbacks, 138 isc_mem_t *mctx, 139 dns_masterformat_t format); 140 141 isc_result_t 142 dns_master_loadstream(FILE *stream, 143 dns_name_t *top, 144 dns_name_t *origin, 145 dns_rdataclass_t zclass, 146 unsigned int options, 147 dns_rdatacallbacks_t *callbacks, 148 isc_mem_t *mctx); 149 150 isc_result_t 151 dns_master_loadbuffer(isc_buffer_t *buffer, 152 dns_name_t *top, 153 dns_name_t *origin, 154 dns_rdataclass_t zclass, 155 unsigned int options, 156 dns_rdatacallbacks_t *callbacks, 157 isc_mem_t *mctx); 158 159 isc_result_t 160 dns_master_loadlexer(isc_lex_t *lex, 161 dns_name_t *top, 162 dns_name_t *origin, 163 dns_rdataclass_t zclass, 164 unsigned int options, 165 dns_rdatacallbacks_t *callbacks, 166 isc_mem_t *mctx); 167 168 isc_result_t 169 dns_master_loadfileinc(const char *master_file, 170 dns_name_t *top, 171 dns_name_t *origin, 172 dns_rdataclass_t zclass, 173 unsigned int options, 174 dns_rdatacallbacks_t *callbacks, 175 isc_task_t *task, 176 dns_loaddonefunc_t done, void *done_arg, 177 dns_loadctx_t **ctxp, isc_mem_t *mctx); 178 179 isc_result_t 180 dns_master_loadfileinc2(const char *master_file, 181 dns_name_t *top, 182 dns_name_t *origin, 183 dns_rdataclass_t zclass, 184 unsigned int options, 185 dns_rdatacallbacks_t *callbacks, 186 isc_task_t *task, 187 dns_loaddonefunc_t done, void *done_arg, 188 dns_loadctx_t **ctxp, isc_mem_t *mctx, 189 dns_masterformat_t format); 190 191 isc_result_t 192 dns_master_loadfileinc3(const char *master_file, 193 dns_name_t *top, 194 dns_name_t *origin, 195 dns_rdataclass_t zclass, 196 unsigned int options, 197 isc_uint32_t resign, 198 dns_rdatacallbacks_t *callbacks, 199 isc_task_t *task, 200 dns_loaddonefunc_t done, void *done_arg, 201 dns_loadctx_t **ctxp, isc_mem_t *mctx, 202 dns_masterformat_t format); 203 204 isc_result_t 205 dns_master_loadstreaminc(FILE *stream, 206 dns_name_t *top, 207 dns_name_t *origin, 208 dns_rdataclass_t zclass, 209 unsigned int options, 210 dns_rdatacallbacks_t *callbacks, 211 isc_task_t *task, 212 dns_loaddonefunc_t done, void *done_arg, 213 dns_loadctx_t **ctxp, isc_mem_t *mctx); 214 215 isc_result_t 216 dns_master_loadbufferinc(isc_buffer_t *buffer, 217 dns_name_t *top, 218 dns_name_t *origin, 219 dns_rdataclass_t zclass, 220 unsigned int options, 221 dns_rdatacallbacks_t *callbacks, 222 isc_task_t *task, 223 dns_loaddonefunc_t done, void *done_arg, 224 dns_loadctx_t **ctxp, isc_mem_t *mctx); 225 226 isc_result_t 227 dns_master_loadlexerinc(isc_lex_t *lex, 228 dns_name_t *top, 229 dns_name_t *origin, 230 dns_rdataclass_t zclass, 231 unsigned int options, 232 dns_rdatacallbacks_t *callbacks, 233 isc_task_t *task, 234 dns_loaddonefunc_t done, void *done_arg, 235 dns_loadctx_t **ctxp, isc_mem_t *mctx); 236 237 /*%< 238 * Loads a RFC1305 master file from a file, stream, buffer, or existing 239 * lexer into rdatasets and then calls 'callbacks->commit' to commit the 240 * rdatasets. Rdata memory belongs to dns_master_load and will be 241 * reused / released when the callback completes. dns_load_master will 242 * abort if callbacks->commit returns any value other than ISC_R_SUCCESS. 243 * 244 * If 'DNS_MASTER_AGETTL' is set and the master file contains one or more 245 * $DATE directives, the TTLs of the data will be aged accordingly. 246 * 247 * 'callbacks->commit' is assumed to call 'callbacks->error' or 248 * 'callbacks->warn' to generate any error messages required. 249 * 250 * 'done' is called with 'done_arg' and a result code when the loading 251 * is completed or has failed. If the initial setup fails 'done' is 252 * not called. 253 * 254 * 'resign' the number of seconds before a RRSIG expires that it should 255 * be re-signed. 0 is used if not provided. 256 * 257 * Requires: 258 *\li 'master_file' points to a valid string. 259 *\li 'lexer' points to a valid lexer. 260 *\li 'top' points to a valid name. 261 *\li 'origin' points to a valid name. 262 *\li 'callbacks->commit' points to a valid function. 263 *\li 'callbacks->error' points to a valid function. 264 *\li 'callbacks->warn' points to a valid function. 265 *\li 'mctx' points to a valid memory context. 266 *\li 'task' and 'done' to be valid. 267 *\li 'lmgr' to be valid. 268 *\li 'ctxp != NULL && ctxp == NULL'. 269 * 270 * Returns: 271 *\li ISC_R_SUCCESS upon successfully loading the master file. 272 *\li ISC_R_SEENINCLUDE upon successfully loading the master file with 273 * a $INCLUDE statement. 274 *\li ISC_R_NOMEMORY out of memory. 275 *\li ISC_R_UNEXPECTEDEND expected to be able to read a input token and 276 * there was not one. 277 *\li ISC_R_UNEXPECTED 278 *\li DNS_R_NOOWNER failed to specify a ownername. 279 *\li DNS_R_NOTTL failed to specify a ttl. 280 *\li DNS_R_BADCLASS record class did not match zone class. 281 *\li DNS_R_CONTINUE load still in progress (dns_master_load*inc() only). 282 *\li Any dns_rdata_fromtext() error code. 283 *\li Any error code from callbacks->commit(). 284 */ 285 286 void 287 dns_loadctx_detach(dns_loadctx_t **ctxp); 288 /*%< 289 * Detach from the load context. 290 * 291 * Requires: 292 *\li '*ctxp' to be valid. 293 * 294 * Ensures: 295 *\li '*ctxp == NULL' 296 */ 297 298 void 299 dns_loadctx_attach(dns_loadctx_t *source, dns_loadctx_t **target); 300 /*%< 301 * Attach to the load context. 302 * 303 * Requires: 304 *\li 'source' to be valid. 305 *\li 'target != NULL && *target == NULL'. 306 */ 307 308 void 309 dns_loadctx_cancel(dns_loadctx_t *ctx); 310 /*%< 311 * Cancel loading the zone file associated with this load context. 312 * 313 * Requires: 314 *\li 'ctx' to be valid 315 */ 316 317 void 318 dns_master_initrawheader(dns_masterrawheader_t *header); 319 /*%< 320 * Initializes the header for a raw master file, setting all 321 * values to zero. 322 */ 323 ISC_LANG_ENDDECLS 324 325 #endif /* DNS_MASTER_H */ 326