diff options
Diffstat (limited to 'testcode/readzone.c')
| -rw-r--r-- | testcode/readzone.c | 158 | 
1 files changed, 158 insertions, 0 deletions
| diff --git a/testcode/readzone.c b/testcode/readzone.c new file mode 100644 index 000000000000..94511e5771f4 --- /dev/null +++ b/testcode/readzone.c @@ -0,0 +1,158 @@ +/* + * testcode/readzone.c - readzone tool reads zonefiles + * + * Copyright (c) 2021, 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 COPYRIGHT + * HOLDER 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. + * + */ +/** + * \file + * Command to read and echo a zonefile. + */ + +#include "config.h" +#include <stdio.h> +#include <stdlib.h> +#include <errno.h> +#include <string.h> +#include <unistd.h> + +#include <stdint.h> +#include "sldns/str2wire.h" +#include "sldns/wire2str.h" + +int print_usage(FILE *out, const char *progname) +{ +	fprintf(out, "usage: %s [ -u ] <zonefile> [<origin>]\n", progname); +	fprintf(out, "\t-u\tprint in unknown type (RFC3597) format\n"); +	return out == stdout ? EXIT_SUCCESS : EXIT_FAILURE; +} + +int main(int argc, char *const *argv) +{ +	char *progname = argv[0]; +	uint8_t rr[LDNS_RR_BUF_SIZE]; +	char *str = malloc(1024 * 1024); +	size_t str_len = sizeof(str); +	struct sldns_file_parse_state state; +	FILE *in = NULL; +	int s = -1; +	int opt; +	int print_in_unknown_type_format = 0; + +	while ((opt = getopt(argc, argv, "hu")) != -1) { +		switch (opt) { +		case 'h': +			free(str); +			return print_usage(stdout, progname); +		case 'u': +			print_in_unknown_type_format = 1; +			break; +		default: +			free(str); +			return print_usage(stderr, progname); +		} +	} +	argc -= optind; +	argv += optind; + +	memset(&state, 0, sizeof(state)); +	state.default_ttl = 3600; +	state.lineno = 1; +	if (argc == 2) { +		state.origin_len = sizeof(state.origin); +		s = sldns_str2wire_dname_buf(argv[1], state.origin +		                                    , &state.origin_len); +		if (s) { +			fprintf(stderr, "Error parsing origin: %s\n" +			              , sldns_get_errorstr_parse(s)); +			free(str); +			return EXIT_FAILURE; +		} +		s = -1; +	} +	if (!str) +		fprintf(stderr, "Memory allocation error: %s\n" +		              , strerror(errno)); + +	else if (argc != 1 && argc != 2) { +		free(str); +		return print_usage(stderr, progname); +	} + +	else if (!(in = fopen(argv[0], "r"))) +		fprintf(stderr, "Error opening \"%s\": %s\n" +		              , argv[0], strerror(errno)); +	else while (!feof(in)) { +		size_t rr_len = sizeof(rr), dname_len = 0; +		size_t written; + +		s = sldns_fp2wire_rr_buf(in, rr, &rr_len, &dname_len, &state); +		if (s) { +			fprintf( stderr, "parse error %d:%d: %s\n" +			               , state.lineno, LDNS_WIREPARSE_OFFSET(s) +			               , sldns_get_errorstr_parse(s)); +			break; +		} +		if (rr_len == 0) +			continue; + +		if (print_in_unknown_type_format) +			written = sldns_wire2str_rr_unknown_buf( +				rr, rr_len, str, str_len); +		else +			written = sldns_wire2str_rr_buf( +				rr, rr_len, str, str_len); + +		if (written > str_len) { +			while (written > str_len) +				str_len *= 2; +			free(str); +			if (!(str = malloc(str_len))) { +				fprintf(stderr, "Memory allocation error: %s\n" +				              , strerror(errno)); +				s = -1; +				break; +			} +			if (print_in_unknown_type_format) +				(void) sldns_wire2str_rr_unknown_buf( +					rr, rr_len, str, str_len); +			else +				(void) sldns_wire2str_rr_buf( +					rr, rr_len, str, str_len); +		} +		fprintf(stdout, "%s", str); +	} +	if (in) +		fclose(in); +	free(str); +	return !in || s ? EXIT_FAILURE : EXIT_SUCCESS; +} | 
