named-rrchecker.c revision 49c1e0d18d6f8b894ce2e6b485ef666599a83c21
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington/*
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington * Copyright (C) 2013 Internet Systems Consortium, Inc. ("ISC")
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington *
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington * Permission to use, copy, modify, and/or distribute this software for any
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington * purpose with or without fee is hereby granted, provided that the above
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington * copyright notice and this permission notice appear in all copies.
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington *
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington * PERFORMANCE OF THIS SOFTWARE.
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington */
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington#include <config.h>
9a6bbb206efa528373c31928ebd0b7216c747a13Brian Wellington
9c3531d72aeaad6c5f01efe6a1c82023e1379e4dDavid Lawrence#include <stdlib.h>
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington#include <isc/buffer.h>
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington#include <isc/commandline.h>
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington#include <isc/lex.h>
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington#include <isc/mem.h>
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington#include <isc/string.h>
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington#include <isc/util.h>
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington#include <dns/fixedname.h>
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington#include <dns/name.h>
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington#include <dns/rdata.h>
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington#include <dns/rdataclass.h>
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington#include <dns/rdatatype.h>
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington#include <dns/result.h>
9a6bbb206efa528373c31928ebd0b7216c747a13Brian Wellington
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellingtonstatic isc_mem_t *mctx;
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellingtonstatic isc_lex_t *lex;
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellingtonstatic isc_lexspecials_t specials;
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellingtonstatic void
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellingtonusage(void) {
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington fprintf(stderr, "usage: named-rrchecker [-o origin] [-hpCPT]\n");
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington fprintf(stderr, "\t-h: print this help message\n");
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington fprintf(stderr, "\t-o origin: set origin to be used when interpeting the record\n");
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington fprintf(stderr, "\t-p: print the record in cannonical format\n");
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington fprintf(stderr, "\t-C: list the supported class names\n");
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington fprintf(stderr, "\t-T: list the supported standard type names\n");
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington fprintf(stderr, "\t-P: list the supported private type names\n");
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington}
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellingtonint
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellingtonmain(int argc, char *argv[]) {
bb54e57a8e24d70e640def95da3142b9b742adfeBrian Wellington isc_token_t token;
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington isc_result_t result;
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington int c;
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington unsigned int options = 0;
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington dns_rdatatype_t rdtype;
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington dns_rdataclass_t rdclass;
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington char text[256*1024];
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington char data[64*1024];
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington isc_buffer_t tbuf;
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington isc_buffer_t dbuf;
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington dns_rdata_t rdata = DNS_RDATA_INIT;
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington isc_boolean_t doexit = ISC_FALSE;
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington isc_boolean_t once = ISC_FALSE;
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington isc_boolean_t print = ISC_FALSE;
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington isc_boolean_t unknown = ISC_FALSE;
9a6bbb206efa528373c31928ebd0b7216c747a13Brian Wellington unsigned int t;
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington char *origin = NULL;
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington dns_fixedname_t fixed;
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington dns_name_t *name = NULL;
9a6bbb206efa528373c31928ebd0b7216c747a13Brian Wellington
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington while ((c = isc_commandline_parse(argc, argv, "ho:puCPT")) != -1) {
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington switch (c) {
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington case '?':
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington case 'h':
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington if (isc_commandline_option != '?' &&
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington isc_commandline_option != 'h')
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington fprintf(stderr, "%s: invalid argument -%c\n",
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington argv[0], isc_commandline_option);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington usage();
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington exit(1);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington case 'o':
9a6bbb206efa528373c31928ebd0b7216c747a13Brian Wellington origin = isc_commandline_argument;
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington break;
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington case 'p':
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington print = ISC_TRUE;
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington break;
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington case 'u':
9a6bbb206efa528373c31928ebd0b7216c747a13Brian Wellington unknown = ISC_TRUE;
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington break;
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington case 'C':
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington for (t = 1; t <= 0xfeffu; t++) {
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington if (dns_rdataclass_ismeta(t))
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington continue;
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington dns_rdataclass_format(t, text, sizeof(text));
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington if (strncmp(text, "CLASS", 4) != 0)
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington fprintf(stdout, "%s\n", text);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington }
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington exit(0);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington case 'P':
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington for (t = 0xff00; t <= 0xfffeu; t++) {
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington if (dns_rdatatype_ismeta(t))
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington continue;
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington dns_rdatatype_format(t, text, sizeof(text));
9a6bbb206efa528373c31928ebd0b7216c747a13Brian Wellington if (strncmp(text, "TYPE", 4) != 0)
9a6bbb206efa528373c31928ebd0b7216c747a13Brian Wellington fprintf(stdout, "%s\n", text);
9a6bbb206efa528373c31928ebd0b7216c747a13Brian Wellington }
9a6bbb206efa528373c31928ebd0b7216c747a13Brian Wellington doexit = ISC_TRUE;
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington break;
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington case 'T':
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington for (t = 1; t <= 0xfeffu; t++) {
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington if (dns_rdatatype_ismeta(t))
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington continue;
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington dns_rdatatype_format(t, text, sizeof(text));
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington if (strncmp(text, "TYPE", 4) != 0)
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington fprintf(stdout, "%s\n", text);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington }
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington doexit = ISC_TRUE;
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington break;
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington }
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington }
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington if (doexit)
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington exit(0);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington RUNTIME_CHECK(isc_mem_create(0, 0, &mctx) == ISC_R_SUCCESS);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington RUNTIME_CHECK(isc_lex_create(mctx, 256, &lex) == ISC_R_SUCCESS);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington /*
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington * Set up to lex DNS master file.
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington */
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington specials['('] = 1;
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington specials[')'] = 1;
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington specials['"'] = 1;
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington isc_lex_setspecials(lex, specials);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington options = ISC_LEXOPT_EOL;
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington isc_lex_setcomments(lex, ISC_LEXCOMMENT_DNSMASTERFILE);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington RUNTIME_CHECK(isc_lex_openstream(lex, stdin) == ISC_R_SUCCESS);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington if (origin != NULL) {
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington dns_fixedname_init(&fixed);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington name = dns_fixedname_name(&fixed);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington result = dns_name_fromstring(name, origin, 0, NULL);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington if (result != ISC_R_SUCCESS) {
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington fprintf(stderr, "dns_name_fromstring: %s\n",
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington dns_result_totext(result));
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington fflush(stderr);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington exit(1);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington }
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington }
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington while ((result = isc_lex_gettoken(lex, options | ISC_LEXOPT_NUMBER,
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington &token)) == ISC_R_SUCCESS) {
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington if (token.type == isc_tokentype_eof)
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington break;
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington if (token.type == isc_tokentype_eol)
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington continue;
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington if (once) {
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington fprintf(stderr, "extra data\n");
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington exit(1);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington }
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington once = ISC_TRUE;
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington /*
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington * Get class.
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington */
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington if (token.type == isc_tokentype_number) {
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington rdclass = token.value.as_ulong;
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington if (token.value.as_ulong > 0xffffu) {
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington fprintf(stderr, "class value too big %lu\n",
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington token.value.as_ulong);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington fflush(stderr);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington exit(1);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington }
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington if (dns_rdataclass_ismeta(rdclass)) {
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington fprintf(stderr, "class %lu is a meta value\n",
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington token.value.as_ulong);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington fflush(stderr);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington exit(1);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington }
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington } else if (token.type == isc_tokentype_string) {
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington result = dns_rdataclass_fromtext(&rdclass,
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington &token.value.as_textregion);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington if (result != ISC_R_SUCCESS) {
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington fprintf(stderr, "dns_rdataclass_fromtext: %s\n",
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington dns_result_totext(result));
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington fflush(stderr);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington exit(1);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington }
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington if (dns_rdataclass_ismeta(rdclass)) {
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington fprintf(stderr,
9a6bbb206efa528373c31928ebd0b7216c747a13Brian Wellington "class %.*s(%d) is a meta value\n",
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington (int)token.value.as_textregion.length,
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington token.value.as_textregion.base, rdclass);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington fflush(stderr);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington exit(1);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington }
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington } else {
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington fprintf(stderr, "unexpected token %u\n", token.type);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington exit(1);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington }
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington result = isc_lex_gettoken(lex, options | ISC_LEXOPT_NUMBER,
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington &token);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington if (result != ISC_R_SUCCESS)
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington break;
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington if (token.type == isc_tokentype_eol)
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington continue;
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington if (token.type == isc_tokentype_eof)
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington break;
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington /*
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington * Get type.
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington */
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington if (token.type == isc_tokentype_number) {
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington rdtype = token.value.as_ulong;
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington if (token.value.as_ulong > 0xffffu) {
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington fprintf(stderr, "type value too big %lu\n",
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington token.value.as_ulong);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington exit(1);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington }
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington if (dns_rdatatype_ismeta(rdtype)) {
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington fprintf(stderr, "type %lu is a meta value\n",
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington token.value.as_ulong);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington fflush(stderr);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington exit(1);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington }
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington } else if (token.type == isc_tokentype_string) {
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington result = dns_rdatatype_fromtext(&rdtype,
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington &token.value.as_textregion);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington if (result != ISC_R_SUCCESS) {
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington fprintf(stdout, "dns_rdatatype_fromtext: %s\n",
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington dns_result_totext(result));
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington fflush(stdout);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington exit(1);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington }
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington if (dns_rdatatype_ismeta(rdtype)) {
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington fprintf(stderr,
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington "type %.*s(%d) is a meta value\n",
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington (int)token.value.as_textregion.length,
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington token.value.as_textregion.base, rdtype);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington fflush(stderr);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington exit(1);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington }
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington } else {
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington fprintf(stderr, "unexpected token %u\n", token.type);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington exit(1);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington }
9a6bbb206efa528373c31928ebd0b7216c747a13Brian Wellington
9a6bbb206efa528373c31928ebd0b7216c747a13Brian Wellington isc_buffer_init(&dbuf, data, sizeof(data));
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington result = dns_rdata_fromtext(&rdata, rdclass, rdtype, lex,
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington name, 0, mctx, &dbuf, NULL);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington if (result != ISC_R_SUCCESS) {
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington fprintf(stderr, "dns_rdata_fromtext: %s\n",
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington dns_result_totext(result));
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington fflush(stderr);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington exit(1);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington }
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington }
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington if (result != ISC_R_EOF) {
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington fprintf(stderr, "eof not found\n");
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington exit(1);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington }
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington if (!once) {
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington fprintf(stderr, "no records found\n");
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington exit(1);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington }
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington if (print) {
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington isc_buffer_init(&tbuf, text, sizeof(text));
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington result = dns_rdataclass_totext(rdclass, &tbuf);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington if (result != ISC_R_SUCCESS) {
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington fprintf(stderr, "dns_rdataclass_totext: %s\n",
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington dns_result_totext(result));
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington fflush(stderr);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington exit(1);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington }
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington isc_buffer_putstr(&tbuf, "\t");
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington result = dns_rdatatype_totext(rdtype, &tbuf);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington if (result != ISC_R_SUCCESS) {
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington fprintf(stderr, "dns_rdatatype_totext: %s\n",
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington dns_result_totext(result));
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington fflush(stderr);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington exit(1);
878d3073b13833ee1a50dfeabf8e400b6fdfc754Brian Wellington }
isc_buffer_putstr(&tbuf, "\t");
result = dns_rdata_totext(&rdata, NULL, &tbuf);
if (result != ISC_R_SUCCESS)
fprintf(stderr, "dns_rdata_totext: %s\n",
dns_result_totext(result));
else
fprintf(stdout, "%.*s\n", (int)tbuf.used,
(char*)tbuf.base);
fflush(stdout);
}
if (unknown) {
fprintf(stdout, "CLASS%u\tTYPE%u\t\\# %u", rdclass, rdtype,
rdata.length);
if (rdata.length != 0) {
unsigned int i;
fprintf(stdout, " ");
for (i = 0; i < rdata.length; i++)
fprintf(stdout, "%02x", rdata.data[i]);
}
fprintf(stdout, "\n");
}
isc_lex_close(lex);
isc_lex_destroy(&lex);
isc_mem_destroy(&mctx);
return (0);
}