5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews/*
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews * Copyright (C) 1999-2001, 2004, 2005, 2007, 2015, 2016 Internet Systems Consortium, Inc. ("ISC")
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence *
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews * This Source Code Form is subject to the terms of the Mozilla Public
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews * License, v. 2.0. If a copy of the MPL was not distributed with this
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews * file, You can obtain one at http://mozilla.org/MPL/2.0/.
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews */
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews
4b6dc226f78862286daa69fba761eac9fd5da16aAutomatic Updater#include <config.h>
659c68b446073e4e450dd2021fdb5bc40decffe2David Lawrence
659c68b446073e4e450dd2021fdb5bc40decffe2David Lawrence#include <stdlib.h>
3761c433912beabe43abeed2c3513b6201c59f64Mark Andrews
854d0238dbc2908490197984b3b9d558008a53dfMark Andrews#include <isc/buffer.h>
854d0238dbc2908490197984b3b9d558008a53dfMark Andrews#include <isc/commandline.h>
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews#include <isc/file.h>
6324997211a5e2d82528dcde98e8981190a35faeMichael Graff#include <isc/mem.h>
6324997211a5e2d82528dcde98e8981190a35faeMichael Graff#include <isc/print.h>
3ddd814a97de1d152ba0913c592d6e6dc83d38a6Michael Graff#include <isc/string.h>
6d12fdf96621801e80f3f4c2a8a569fe48766a20David Lawrence#include <isc/util.h>
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews#include <dns/message.h>
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews#include <dns/result.h>
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews
b0ba1a6059b6d6c4b3aa77d8bc84cc443b981e01Mukund Sivaramanint parseflags = 0;
f7b99290c31abeb20c55fc55391510450ce60423Mark Andrewsisc_mem_t *mctx = NULL;
ae114ded82e773a4d9058f833f964a17514712a8Brian Wellingtonisc_boolean_t printmemstats = ISC_FALSE;
659c68b446073e4e450dd2021fdb5bc40decffe2David Lawrenceisc_boolean_t dorender = ISC_FALSE;
bddfe77128b0f16af263ff149db40f0d885f43d0Mark Andrews
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrencestatic void
add4043305ca411202ed9cf1929a4179016515ceBrian Wellingtonprocess_message(isc_buffer_t *source);
add4043305ca411202ed9cf1929a4179016515ceBrian Wellington
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrewsstatic isc_result_t
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrewsprintmessage(dns_message_t *msg);
6e49e91bd08778d7eae45a2229dcf41ed97cc636David Lawrence
e0a30050c8516a3d54a4f8dcdd88435704a8a3edMark Andrewsstatic inline void
e0a30050c8516a3d54a4f8dcdd88435704a8a3edMark AndrewsCHECKRESULT(isc_result_t result, const char *msg) {
2047977ce2dfcfe3a0fa2d638c3242841310fad3Mark Andrews if (result != ISC_R_SUCCESS) {
9ac7076ebad044afb15e9e2687e3696868778538Mark Andrews printf("%s: %s\n", msg, dns_result_totext(result));
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews exit(1);
3ddd814a97de1d152ba0913c592d6e6dc83d38a6Michael Graff }
6d12fdf96621801e80f3f4c2a8a569fe48766a20David Lawrence}
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrewsstatic int
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrewsfromhex(char c) {
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews if (c >= '0' && c <= '9')
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews return (c - '0');
b0ba1a6059b6d6c4b3aa77d8bc84cc443b981e01Mukund Sivaraman else if (c >= 'a' && c <= 'f')
b589e90689c6e87bf9608424ca8d99571c18bc61Mark Andrews return (c - 'a' + 10);
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews else if (c >= 'A' && c <= 'F')
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews return (c - 'A' + 10);
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews fprintf(stderr, "bad input format: %02x\n", c);
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews exit(3);
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews /* NOTREACHED */
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews}
5fc7ba3e1ac5d72239e9971e0f469dd5796738f9Andreas Gustafsson
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrewsstatic void
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrewsusage(void) {
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews fprintf(stderr, "wire_test [-b] [-d] [-p] [-r] [-s]\n");
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews fprintf(stderr, " [-m {usage|trace|record|size|mctx}]\n");
3ddd814a97de1d152ba0913c592d6e6dc83d38a6Michael Graff fprintf(stderr, " [filename]\n\n");
6d12fdf96621801e80f3f4c2a8a569fe48766a20David Lawrence fprintf(stderr, "\t-b\tBest-effort parsing (ignore some errors)\n");
4b6dc226f78862286daa69fba761eac9fd5da16aAutomatic Updater fprintf(stderr, "\t-d\tRead input as raw binary data\n");
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews fprintf(stderr, "\t-p\tPreserve order of the records in messages\n");
b0ba1a6059b6d6c4b3aa77d8bc84cc443b981e01Mukund Sivaraman fprintf(stderr, "\t-r\tAfter parsing, re-render the message\n");
f7b99290c31abeb20c55fc55391510450ce60423Mark Andrews fprintf(stderr, "\t-s\tPrint memory statistics\n");
ae114ded82e773a4d9058f833f964a17514712a8Brian Wellington fprintf(stderr, "\t-t\tTCP mode - ignore the first 2 bytes\n");
659c68b446073e4e450dd2021fdb5bc40decffe2David Lawrence}
1ef8965366d91e02a4672c35a187d30aa4a4c72cMark Andrews
94a08e09db3dc844b6ee4841c368a2d7074a9c3fAndreas Gustafssonstatic isc_result_t
659c68b446073e4e450dd2021fdb5bc40decffe2David Lawrenceprintmessage(dns_message_t *msg) {
4b6dc226f78862286daa69fba761eac9fd5da16aAutomatic Updater isc_buffer_t b;
4b6dc226f78862286daa69fba761eac9fd5da16aAutomatic Updater char *buf = NULL;
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews int len = 1024;
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews isc_result_t result = ISC_R_SUCCESS;
3ddd814a97de1d152ba0913c592d6e6dc83d38a6Michael Graff
6d12fdf96621801e80f3f4c2a8a569fe48766a20David Lawrence do {
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews buf = isc_mem_get(mctx, len);
cdc50af0bff41accc02c613b9c6d8cd41b171ffeBrian Wellington if (buf == NULL) {
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews result = ISC_R_NOMEMORY;
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews break;
b0ba1a6059b6d6c4b3aa77d8bc84cc443b981e01Mukund Sivaraman }
b589e90689c6e87bf9608424ca8d99571c18bc61Mark Andrews
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews isc_buffer_init(&b, buf, len);
94a08e09db3dc844b6ee4841c368a2d7074a9c3fAndreas Gustafsson result = dns_message_totext(msg, &dns_master_style_debug,
52637f592f705ca93fadc218e403fd55e8ce4aeaMark Andrews 0, &b);
cdc50af0bff41accc02c613b9c6d8cd41b171ffeBrian Wellington if (result == ISC_R_NOSPACE) {
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews isc_mem_put(mctx, buf, len);
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews len *= 2;
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews } else if (result == ISC_R_SUCCESS)
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews printf("%.*s\n", (int) isc_buffer_usedlength(&b), buf);
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews } while (result == ISC_R_NOSPACE);
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews
4529cdaedaf1a0a5f8ff89aeca510b7a4475446cBob Halley if (buf != NULL)
6d12fdf96621801e80f3f4c2a8a569fe48766a20David Lawrence isc_mem_put(mctx, buf, len);
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews return (result);
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews}
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrewsint
3d5cad69ec20157912e95cf3b79316dfb0a314f3Mark Andrewsmain(int argc, char *argv[]) {
d981ca645597116d227a48bf37cc5edc061c854dBob Halley isc_buffer_t *input = NULL;
b0ba1a6059b6d6c4b3aa77d8bc84cc443b981e01Mukund Sivaraman isc_boolean_t need_close = ISC_FALSE;
b589e90689c6e87bf9608424ca8d99571c18bc61Mark Andrews isc_boolean_t tcp = ISC_FALSE;
b589e90689c6e87bf9608424ca8d99571c18bc61Mark Andrews isc_boolean_t rawdata = ISC_FALSE;
f7b99290c31abeb20c55fc55391510450ce60423Mark Andrews isc_result_t result;
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews isc_uint8_t c;
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews FILE *f;
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews int ch;
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews#define CMDLINE_FLAGS "bdm:prst"
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews /*
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews * Process memory debugging argument first.
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews */
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews while ((ch = isc_commandline_parse(argc, argv, CMDLINE_FLAGS)) != -1) {
7c0539bea56022274da04263eb41fbb5b8835c38Mark Andrews switch (ch) {
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews case 'm':
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews if (strcasecmp(isc_commandline_argument, "record") == 0)
3ddd814a97de1d152ba0913c592d6e6dc83d38a6Michael Graff isc_mem_debugging |= ISC_MEM_DEBUGRECORD;
6d12fdf96621801e80f3f4c2a8a569fe48766a20David Lawrence if (strcasecmp(isc_commandline_argument, "trace") == 0)
373ce67419680a398ba3dc51a14a486caaf0afb0Mark Andrews isc_mem_debugging |= ISC_MEM_DEBUGTRACE;
373ce67419680a398ba3dc51a14a486caaf0afb0Mark Andrews if (strcasecmp(isc_commandline_argument, "usage") == 0)
f7b99290c31abeb20c55fc55391510450ce60423Mark Andrews isc_mem_debugging |= ISC_MEM_DEBUGUSAGE;
b0ba1a6059b6d6c4b3aa77d8bc84cc443b981e01Mukund Sivaraman if (strcasecmp(isc_commandline_argument, "size") == 0)
373ce67419680a398ba3dc51a14a486caaf0afb0Mark Andrews isc_mem_debugging |= ISC_MEM_DEBUGSIZE;
373ce67419680a398ba3dc51a14a486caaf0afb0Mark Andrews if (strcasecmp(isc_commandline_argument, "mctx") == 0)
373ce67419680a398ba3dc51a14a486caaf0afb0Mark Andrews isc_mem_debugging |= ISC_MEM_DEBUGCTX;
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews break;
ae114ded82e773a4d9058f833f964a17514712a8Brian Wellington default:
63cef8bde8b92aeb30ccdcf21d4e44c9be9cc6e3Andreas Gustafsson break;
63cef8bde8b92aeb30ccdcf21d4e44c9be9cc6e3Andreas Gustafsson }
373ce67419680a398ba3dc51a14a486caaf0afb0Mark Andrews }
373ce67419680a398ba3dc51a14a486caaf0afb0Mark Andrews isc_commandline_reset = ISC_TRUE;
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews RUNTIME_CHECK(isc_mem_create(0, 0, &mctx) == ISC_R_SUCCESS);
3ddd814a97de1d152ba0913c592d6e6dc83d38a6Michael Graff
6d12fdf96621801e80f3f4c2a8a569fe48766a20David Lawrence while ((ch = isc_commandline_parse(argc, argv, CMDLINE_FLAGS)) != -1) {
9281e7aa775026dc47c01745fdcc438645146877Mark Andrews switch (ch) {
9281e7aa775026dc47c01745fdcc438645146877Mark Andrews case 'b':
9281e7aa775026dc47c01745fdcc438645146877Mark Andrews parseflags |= DNS_MESSAGEPARSE_BESTEFFORT;
9281e7aa775026dc47c01745fdcc438645146877Mark Andrews break;
b0ba1a6059b6d6c4b3aa77d8bc84cc443b981e01Mukund Sivaraman case 'd':
9281e7aa775026dc47c01745fdcc438645146877Mark Andrews rawdata = ISC_TRUE;
b589e90689c6e87bf9608424ca8d99571c18bc61Mark Andrews break;
f7b99290c31abeb20c55fc55391510450ce60423Mark Andrews case 'm':
9281e7aa775026dc47c01745fdcc438645146877Mark Andrews break;
9281e7aa775026dc47c01745fdcc438645146877Mark Andrews case 'p':
9281e7aa775026dc47c01745fdcc438645146877Mark Andrews parseflags |= DNS_MESSAGEPARSE_PRESERVEORDER;
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews break;
9281e7aa775026dc47c01745fdcc438645146877Mark Andrews case 'r':
9281e7aa775026dc47c01745fdcc438645146877Mark Andrews dorender = ISC_TRUE;
9281e7aa775026dc47c01745fdcc438645146877Mark Andrews break;
9281e7aa775026dc47c01745fdcc438645146877Mark Andrews case 's':
9281e7aa775026dc47c01745fdcc438645146877Mark Andrews printmemstats = ISC_TRUE;
9281e7aa775026dc47c01745fdcc438645146877Mark Andrews break;
9281e7aa775026dc47c01745fdcc438645146877Mark Andrews case 't':
5d51e67c3b4f35c1be742574aacc1d88fe6ed444Mark Andrews tcp = ISC_TRUE;
94a3bcd132e515b4baa0884ba9dd0f361d2e17bcMark Andrews break;
4529cdaedaf1a0a5f8ff89aeca510b7a4475446cBob Halley default:
6d12fdf96621801e80f3f4c2a8a569fe48766a20David Lawrence usage();
9281e7aa775026dc47c01745fdcc438645146877Mark Andrews exit(1);
9281e7aa775026dc47c01745fdcc438645146877Mark Andrews }
94a3bcd132e515b4baa0884ba9dd0f361d2e17bcMark Andrews }
b0ba1a6059b6d6c4b3aa77d8bc84cc443b981e01Mukund Sivaraman
82ca33427bdd4f3bc4ed3431e86bd810fe751674Andreas Gustafsson argc -= isc_commandline_index;
9281e7aa775026dc47c01745fdcc438645146877Mark Andrews argv += isc_commandline_index;
9281e7aa775026dc47c01745fdcc438645146877Mark Andrews
9281e7aa775026dc47c01745fdcc438645146877Mark Andrews if (argc >= 1) {
9281e7aa775026dc47c01745fdcc438645146877Mark Andrews f = fopen(argv[0], "r");
94a3bcd132e515b4baa0884ba9dd0f361d2e17bcMark Andrews if (f == NULL) {
d981ca645597116d227a48bf37cc5edc061c854dBob Halley fprintf(stderr, "%s: fopen failed\n", argv[0]);
3ddd814a97de1d152ba0913c592d6e6dc83d38a6Michael Graff exit(1);
6d12fdf96621801e80f3f4c2a8a569fe48766a20David Lawrence }
b0ba1a6059b6d6c4b3aa77d8bc84cc443b981e01Mukund Sivaraman need_close = ISC_TRUE;
d981ca645597116d227a48bf37cc5edc061c854dBob Halley } else
82ca33427bdd4f3bc4ed3431e86bd810fe751674Andreas Gustafsson f = stdin;
659c68b446073e4e450dd2021fdb5bc40decffe2David Lawrence
659c68b446073e4e450dd2021fdb5bc40decffe2David Lawrence result = isc_buffer_allocate(mctx, &input, 64 * 1024);
d981ca645597116d227a48bf37cc5edc061c854dBob Halley RUNTIME_CHECK(result == ISC_R_SUCCESS);
419590499823ce15b5d2ad4fe71eaf04bd5a86c0Michael Graff
d981ca645597116d227a48bf37cc5edc061c854dBob Halley if (rawdata) {
d981ca645597116d227a48bf37cc5edc061c854dBob Halley while (fread(&c, 1, 1, f) != 0) {
3ddd814a97de1d152ba0913c592d6e6dc83d38a6Michael Graff result = isc_buffer_reserve(&input, 1);
6d12fdf96621801e80f3f4c2a8a569fe48766a20David Lawrence RUNTIME_CHECK(result == ISC_R_SUCCESS);
e27a69f8bd9538e08f775265167ba6cc5f47c587Bob Halley isc_buffer_putuint8(input, (isc_uint8_t) c);
e27a69f8bd9538e08f775265167ba6cc5f47c587Bob Halley }
e27a69f8bd9538e08f775265167ba6cc5f47c587Bob Halley } else {
b0ba1a6059b6d6c4b3aa77d8bc84cc443b981e01Mukund Sivaraman char s[BUFSIZ];
e27a69f8bd9538e08f775265167ba6cc5f47c587Bob Halley
e27a69f8bd9538e08f775265167ba6cc5f47c587Bob Halley while (fgets(s, sizeof(s), f) != NULL) {
e27a69f8bd9538e08f775265167ba6cc5f47c587Bob Halley char *rp = s, *wp = s;
e27a69f8bd9538e08f775265167ba6cc5f47c587Bob Halley size_t i, len = 0;
e27a69f8bd9538e08f775265167ba6cc5f47c587Bob Halley
e27a69f8bd9538e08f775265167ba6cc5f47c587Bob Halley while (*rp != '\0') {
e27a69f8bd9538e08f775265167ba6cc5f47c587Bob Halley if (*rp == '#')
e27a69f8bd9538e08f775265167ba6cc5f47c587Bob Halley break;
2047977ce2dfcfe3a0fa2d638c3242841310fad3Mark Andrews if (*rp != ' ' && *rp != '\t' &&
2047977ce2dfcfe3a0fa2d638c3242841310fad3Mark Andrews *rp != '\r' && *rp != '\n') {
2047977ce2dfcfe3a0fa2d638c3242841310fad3Mark Andrews *wp++ = *rp;
b0ba1a6059b6d6c4b3aa77d8bc84cc443b981e01Mukund Sivaraman len++;
2047977ce2dfcfe3a0fa2d638c3242841310fad3Mark Andrews }
2047977ce2dfcfe3a0fa2d638c3242841310fad3Mark Andrews rp++;
2047977ce2dfcfe3a0fa2d638c3242841310fad3Mark Andrews }
2047977ce2dfcfe3a0fa2d638c3242841310fad3Mark Andrews if (len == 0U)
2047977ce2dfcfe3a0fa2d638c3242841310fad3Mark Andrews continue;
2047977ce2dfcfe3a0fa2d638c3242841310fad3Mark Andrews if (len % 2 != 0U) {
2047977ce2dfcfe3a0fa2d638c3242841310fad3Mark Andrews fprintf(stderr, "bad input format: %lu\n",
2047977ce2dfcfe3a0fa2d638c3242841310fad3Mark Andrews (unsigned long)len);
2047977ce2dfcfe3a0fa2d638c3242841310fad3Mark Andrews exit(1);
2047977ce2dfcfe3a0fa2d638c3242841310fad3Mark Andrews }
2047977ce2dfcfe3a0fa2d638c3242841310fad3Mark Andrews
2047977ce2dfcfe3a0fa2d638c3242841310fad3Mark Andrews rp = s;
b0ba1a6059b6d6c4b3aa77d8bc84cc443b981e01Mukund Sivaraman for (i = 0; i < len; i += 2) {
2047977ce2dfcfe3a0fa2d638c3242841310fad3Mark Andrews c = fromhex(*rp++);
2047977ce2dfcfe3a0fa2d638c3242841310fad3Mark Andrews c *= 16;
2047977ce2dfcfe3a0fa2d638c3242841310fad3Mark Andrews c += fromhex(*rp++);
2047977ce2dfcfe3a0fa2d638c3242841310fad3Mark Andrews result = isc_buffer_reserve(&input, 1);
2047977ce2dfcfe3a0fa2d638c3242841310fad3Mark Andrews RUNTIME_CHECK(result == ISC_R_SUCCESS);
2047977ce2dfcfe3a0fa2d638c3242841310fad3Mark Andrews isc_buffer_putuint8(input, (isc_uint8_t) c);
2047977ce2dfcfe3a0fa2d638c3242841310fad3Mark Andrews }
2047977ce2dfcfe3a0fa2d638c3242841310fad3Mark Andrews }
3d17a3ba61a303d5c4d9867068d0fbe9f24d2988Mark Andrews }
3d17a3ba61a303d5c4d9867068d0fbe9f24d2988Mark Andrews
3d17a3ba61a303d5c4d9867068d0fbe9f24d2988Mark Andrews if (need_close)
3d17a3ba61a303d5c4d9867068d0fbe9f24d2988Mark Andrews fclose(f);
3d17a3ba61a303d5c4d9867068d0fbe9f24d2988Mark Andrews
854d0238dbc2908490197984b3b9d558008a53dfMark Andrews if (tcp) {
while (isc_buffer_remaininglength(input) != 0) {
unsigned int tcplen;
if (isc_buffer_remaininglength(input) < 2) {
fprintf(stderr, "premature end of packet\n");
exit(1);
}
tcplen = isc_buffer_getuint16(input);
if (isc_buffer_remaininglength(input) < tcplen) {
fprintf(stderr, "premature end of packet\n");
exit(1);
}
process_message(input);
}
} else
process_message(input);
if (input != NULL)
isc_buffer_free(&input);
if (printmemstats)
isc_mem_stats(mctx, stdout);
isc_mem_destroy(&mctx);
return (0);
}
static void
process_message(isc_buffer_t *source) {
dns_message_t *message;
isc_result_t result;
int i;
message = NULL;
result = dns_message_create(mctx, DNS_MESSAGE_INTENTPARSE, &message);
CHECKRESULT(result, "dns_message_create failed");
result = dns_message_parse(message, source, parseflags);
if (result == DNS_R_RECOVERABLE)
result = ISC_R_SUCCESS;
CHECKRESULT(result, "dns_message_parse failed");
result = printmessage(message);
CHECKRESULT(result, "printmessage() failed");
if (printmemstats)
isc_mem_stats(mctx, stdout);
if (dorender) {
unsigned char b2[64 * 1024];
isc_buffer_t buffer;
dns_compress_t cctx;
isc_buffer_init(&buffer, b2, sizeof(b2));
/*
* XXXMLG
* Changing this here is a hack, and should not be done in
* reasonable application code, ever.
*/
message->from_to_wire = DNS_MESSAGE_INTENTRENDER;
for (i = 0; i < DNS_SECTION_MAX; i++)
message->counts[i] = 0; /* Another hack XXX */
result = dns_compress_init(&cctx, -1, mctx);
CHECKRESULT(result, "dns_compress_init() failed");
result = dns_message_renderbegin(message, &cctx, &buffer);
CHECKRESULT(result, "dns_message_renderbegin() failed");
result = dns_message_rendersection(message,
DNS_SECTION_QUESTION, 0);
CHECKRESULT(result,
"dns_message_rendersection(QUESTION) failed");
result = dns_message_rendersection(message,
DNS_SECTION_ANSWER, 0);
CHECKRESULT(result,
"dns_message_rendersection(ANSWER) failed");
result = dns_message_rendersection(message,
DNS_SECTION_AUTHORITY, 0);
CHECKRESULT(result,
"dns_message_rendersection(AUTHORITY) failed");
result = dns_message_rendersection(message,
DNS_SECTION_ADDITIONAL, 0);
CHECKRESULT(result,
"dns_message_rendersection(ADDITIONAL) failed");
dns_message_renderend(message);
dns_compress_invalidate(&cctx);
message->from_to_wire = DNS_MESSAGE_INTENTPARSE;
dns_message_destroy(&message);
printf("Message rendered.\n");
if (printmemstats)
isc_mem_stats(mctx, stdout);
result = dns_message_create(mctx, DNS_MESSAGE_INTENTPARSE,
&message);
CHECKRESULT(result, "dns_message_create failed");
result = dns_message_parse(message, &buffer, parseflags);
CHECKRESULT(result, "dns_message_parse failed");
result = printmessage(message);
CHECKRESULT(result, "printmessage() failed");
}
dns_message_destroy(&message);
}