db_test.c revision a2f5b51dff25f819b874821ac4810595a6487420
66bd3b3c6b171271c705b897823dcdcf29464698Michael Graff/*
499b34cea04a46823d003d4c0520c8b03e8513cbBrian Wellington * Copyright (C) 1999 Internet Software Consortium.
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence *
66bd3b3c6b171271c705b897823dcdcf29464698Michael Graff * Permission to use, copy, modify, and distribute this software for any
66bd3b3c6b171271c705b897823dcdcf29464698Michael Graff * purpose with or without fee is hereby granted, provided that the above
66bd3b3c6b171271c705b897823dcdcf29464698Michael Graff * copyright notice and this permission notice appear in all copies.
40f53fa8d9c6a4fc38c0014495e7a42b08f52481David Lawrence *
15a44745412679c30a6d022733925af70a38b715David Lawrence * THE SOFTWARE IS PROVIDED "AS IS" AND INTERNET SOFTWARE CONSORTIUM DISCLAIMS
15a44745412679c30a6d022733925af70a38b715David Lawrence * ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
15a44745412679c30a6d022733925af70a38b715David Lawrence * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL INTERNET SOFTWARE
15a44745412679c30a6d022733925af70a38b715David Lawrence * CONSORTIUM BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
15a44745412679c30a6d022733925af70a38b715David Lawrence * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
15a44745412679c30a6d022733925af70a38b715David Lawrence * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
15a44745412679c30a6d022733925af70a38b715David Lawrence * ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
15a44745412679c30a6d022733925af70a38b715David Lawrence * SOFTWARE.
66bd3b3c6b171271c705b897823dcdcf29464698Michael Graff */
66bd3b3c6b171271c705b897823dcdcf29464698Michael Graff
c20ffa38dee7efa0dc01822d4bac5e41729b9b61Brian Wellington#include <config.h>
9c3531d72aeaad6c5f01efe6a1c82023e1379e4dDavid Lawrence
ad3a5c4b7e21af04d1b872f933c2e19e5c0a135bMichael Graff#include <stddef.h>
ad3a5c4b7e21af04d1b872f933c2e19e5c0a135bMichael Graff#include <stdlib.h>
ad3a5c4b7e21af04d1b872f933c2e19e5c0a135bMichael Graff#include <string.h>
ad3a5c4b7e21af04d1b872f933c2e19e5c0a135bMichael Graff#include <unistd.h> /* XXX Naughty. */
c803787146cadcb2d7e10cbf4491f3be513dfa1aMichael Graff
ad3a5c4b7e21af04d1b872f933c2e19e5c0a135bMichael Graff#include <isc/assertions.h>
8cdfd17426179ae6f629a9b7475d46a22f535047Bob Halley#include <isc/error.h>
ad3a5c4b7e21af04d1b872f933c2e19e5c0a135bMichael Graff#include <isc/boolean.h>
ad3a5c4b7e21af04d1b872f933c2e19e5c0a135bMichael Graff#include <isc/region.h>
ad3a5c4b7e21af04d1b872f933c2e19e5c0a135bMichael Graff
294802790e8030f1c19b6c2c5d5204b6f464c729Michael Graff#include <dns/types.h>
294802790e8030f1c19b6c2c5d5204b6f464c729Michael Graff#include <dns/result.h>
294802790e8030f1c19b6c2c5d5204b6f464c729Michael Graff#include <dns/name.h>
9282e3c21a20f354e22ad3f092aea4956abaea5cMichael Graff#include <dns/rdata.h>
294802790e8030f1c19b6c2c5d5204b6f464c729Michael Graff#include <dns/rdataclass.h>
9282e3c21a20f354e22ad3f092aea4956abaea5cMichael Graff#include <dns/rdatatype.h>
294802790e8030f1c19b6c2c5d5204b6f464c729Michael Graff#include <dns/rdatalist.h>
66bd3b3c6b171271c705b897823dcdcf29464698Michael Graff#include <dns/rdataset.h>
66bd3b3c6b171271c705b897823dcdcf29464698Michael Graff#include <dns/compress.h>
058eeac2105c39e7cb31fb75ee0b473717ec3bbcMark Andrews#include <dns/db.h>
1a69a1a78cfaa86f3b68bbc965232b7876d4da2aDavid Lawrence
3024dbecbac365171bc6de0f3fa04951d6558be3Michael Graffstatic void
5fca48054b5e791a2fa0c5015bc3b6fef4fcdce1Andreas Gustafssonmakename(isc_mem_t *mctx, char *text, dns_name_t *name, dns_name_t *origin) {
f181f94ec8da8b1dbcc6353e8be965ea4a5ea282Michael Graff char b[255];
6028d1ce0380d0ba7f6c6ecd1ad20b31ddd1becbDavid Lawrence isc_buffer_t source, target;
1a69a1a78cfaa86f3b68bbc965232b7876d4da2aDavid Lawrence size_t len;
3ac63b472022ff92691d1fe69ac715a729671965Michael Graff isc_region_t r1, r2;
440be4c866f6935ac069db79a414304507a664c2Michael Graff dns_result_t result;
11fcc67616fac1bc6a28b3d4fed24641137888e7Michael Graff
fe14eafefa91fada7cea0a55b09196c01477406cBob Halley if (origin == NULL)
e45d323a2a0f4ca08d4b139546e60a5fa7bd3f0cMichael Graff origin = dns_rootname;
29f28fe573d4b3b318b3b026d567c1eb86738015Michael Graff dns_name_init(name, NULL);
86944a4c8002e80ae9b6eb5a5e29b797879be45fMichael Graff len = strlen(text);
21e7034ec046105c00a0dab86c83732e2e77ad99Michael Graff isc_buffer_init(&source, text, len, ISC_BUFFERTYPE_TEXT);
e51511aa3281f8dc384eb1283115c7f8d5c402aeMichael Graff isc_buffer_add(&source, len);
e51511aa3281f8dc384eb1283115c7f8d5c402aeMichael Graff isc_buffer_init(&target, b, sizeof b, ISC_BUFFERTYPE_BINARY);
d1cbf714097e900ed1703529584d3e1a50e8a4a8Brian Wellington result = dns_name_fromtext(name, &source, origin, ISC_FALSE, &target);
11efdeb076d65fa9f0c5fc067dc040e7c99dfba6Michael Graff RUNTIME_CHECK(result == DNS_R_SUCCESS);
09f22ac5b09e70bc526015f37168ba33e21ea91fDavid Lawrence dns_name_toregion(name, &r1);
ad3a5c4b7e21af04d1b872f933c2e19e5c0a135bMichael Graff r2.base = isc_mem_get(mctx, r1.length);
31fab17bcdbe302592a6c0dc5374ef56333ee879Michael Graff RUNTIME_CHECK(r2.base != NULL);
31fab17bcdbe302592a6c0dc5374ef56333ee879Michael Graff r2.length = r1.length;
31fab17bcdbe302592a6c0dc5374ef56333ee879Michael Graff memcpy(r2.base, r1.base, r1.length);
31fab17bcdbe302592a6c0dc5374ef56333ee879Michael Graff dns_name_fromregion(name, &r2);
31fab17bcdbe302592a6c0dc5374ef56333ee879Michael Graff}
31fab17bcdbe302592a6c0dc5374ef56333ee879Michael Graff
31fab17bcdbe302592a6c0dc5374ef56333ee879Michael Graffstatic void
31fab17bcdbe302592a6c0dc5374ef56333ee879Michael Grafffreename(isc_mem_t *mctx, dns_name_t *name) {
31fab17bcdbe302592a6c0dc5374ef56333ee879Michael Graff isc_region_t r;
31fab17bcdbe302592a6c0dc5374ef56333ee879Michael Graff
ff9bb3fc5453bbf310b67c560fbf04a5c0fb60daMichael Graff dns_name_toregion(name, &r);
bb143613cf26e0f27dfd9caf1a7336065d064b26Michael Graff isc_mem_put(mctx, r.base, r.length);
fe14eafefa91fada7cea0a55b09196c01477406cBob Halley dns_name_invalidate(name);
fe14eafefa91fada7cea0a55b09196c01477406cBob Halley}
11fcc67616fac1bc6a28b3d4fed24641137888e7Michael Graff
ad3a5c4b7e21af04d1b872f933c2e19e5c0a135bMichael Graffint
8cdfd17426179ae6f629a9b7475d46a22f535047Bob Halleymain(int argc, char *argv[]) {
8cdfd17426179ae6f629a9b7475d46a22f535047Bob Halley isc_mem_t *mctx = NULL;
8cdfd17426179ae6f629a9b7475d46a22f535047Bob Halley dns_db_t *db;
ad3a5c4b7e21af04d1b872f933c2e19e5c0a135bMichael Graff dns_dbnode_t *node;
3115cd89bc1e1fd3ecc4705d253e3484a3f5c555Michael Graff dns_result_t result;
3115cd89bc1e1fd3ecc4705d253e3484a3f5c555Michael Graff dns_name_t name, base, *origin;
3115cd89bc1e1fd3ecc4705d253e3484a3f5c555Michael Graff dns_offsets_t offsets;
3115cd89bc1e1fd3ecc4705d253e3484a3f5c555Michael Graff size_t len;
d947011dc393d9f9988d1349d585b246d19cc3c7Michael Graff isc_buffer_t source, target, text;
d947011dc393d9f9988d1349d585b246d19cc3c7Michael Graff char s[1000];
d947011dc393d9f9988d1349d585b246d19cc3c7Michael Graff char t[1000];
3115cd89bc1e1fd3ecc4705d253e3484a3f5c555Michael Graff char b[255];
16508d9185e5eb96af2ebe900a08c46a6e5eb7edBob Halley dns_rdataset_t rdataset;
a14eb88840e06b8d458c1556e5452b6d2a50012eMichael Graff isc_region_t r;
ad3a5c4b7e21af04d1b872f933c2e19e5c0a135bMichael Graff char basetext[1000];
8cdfd17426179ae6f629a9b7475d46a22f535047Bob Halley int ch;
7b5172166d816efabcdb22519b136ba124bb2619Brian Wellington dns_rdatatype_t type = 2;
7b5172166d816efabcdb22519b136ba124bb2619Brian Wellington
8cdfd17426179ae6f629a9b7475d46a22f535047Bob Halley strcpy(basetext, "");
7b5172166d816efabcdb22519b136ba124bb2619Brian Wellington while ((ch = getopt(argc, argv, "z:t:")) != -1) {
7b5172166d816efabcdb22519b136ba124bb2619Brian Wellington switch (ch) {
7b5172166d816efabcdb22519b136ba124bb2619Brian Wellington case 'z':
3ac63b472022ff92691d1fe69ac715a729671965Michael Graff strcpy(basetext, optarg);
acafce24bbc6140464302fb18c729791f1bfddd6Michael Graff break;
acafce24bbc6140464302fb18c729791f1bfddd6Michael Graff case 't':
213973a334f92d4aef4ef62b4538fc2e4d0e8082Michael Graff type = atoi(optarg);
64828244e04e86dfa40f0a4f0c05f27923da499dMichael Graff break;
64828244e04e86dfa40f0a4f0c05f27923da499dMichael Graff }
213973a334f92d4aef4ef62b4538fc2e4d0e8082Michael Graff }
11fcc67616fac1bc6a28b3d4fed24641137888e7Michael Graff
ff9bb3fc5453bbf310b67c560fbf04a5c0fb60daMichael Graff argc -= optind;
11fcc67616fac1bc6a28b3d4fed24641137888e7Michael Graff argv += optind;
ad3a5c4b7e21af04d1b872f933c2e19e5c0a135bMichael Graff
bb143613cf26e0f27dfd9caf1a7336065d064b26Michael Graff if (argc < 1) {
fe14eafefa91fada7cea0a55b09196c01477406cBob Halley fprintf(stderr, "usage: db_test filename\n");
66bd3b3c6b171271c705b897823dcdcf29464698Michael Graff exit(1);
66bd3b3c6b171271c705b897823dcdcf29464698Michael Graff }
11fcc67616fac1bc6a28b3d4fed24641137888e7Michael Graff
11fcc67616fac1bc6a28b3d4fed24641137888e7Michael Graff RUNTIME_CHECK(isc_mem_create(0, 0, &mctx) == ISC_R_SUCCESS);
11fcc67616fac1bc6a28b3d4fed24641137888e7Michael Graff
45dadd25ba4b72ec2d8eecc342edc787d8421e3aBob Halley if (strcmp(basetext, "") == 0)
11fcc67616fac1bc6a28b3d4fed24641137888e7Michael Graff strcpy(basetext, "vix.com.");
439c0011e642fb1d26011116144af698125262dbMichael Graff makename(mctx, basetext, &base, NULL);
11efdeb076d65fa9f0c5fc067dc040e7c99dfba6Michael Graff
3ac63b472022ff92691d1fe69ac715a729671965Michael Graff db = NULL;
11efdeb076d65fa9f0c5fc067dc040e7c99dfba6Michael Graff result = dns_db_create(mctx, "rbt", &base, ISC_FALSE, 1, 0, NULL,
3ac63b472022ff92691d1fe69ac715a729671965Michael Graff &db);
84c46a7acb961cac19c0d857bfdd00f3383a9bc6Michael Graff RUNTIME_CHECK(result == DNS_R_SUCCESS);
3ac63b472022ff92691d1fe69ac715a729671965Michael Graff
a44c12b332b867f29631e235eb11d1263c73d6c0Bob Halley origin = &base;
11fcc67616fac1bc6a28b3d4fed24641137888e7Michael Graff printf("loading %s\n", argv[0]);
30251e07d1705d1a85b0e1d5a969496e1aed612eMichael Graff result = dns_db_load(db, argv[0]);
30251e07d1705d1a85b0e1d5a969496e1aed612eMichael Graff if (result != DNS_R_SUCCESS) {
e51511aa3281f8dc384eb1283115c7f8d5c402aeMichael Graff printf("couldn't load master file: %s\n",
ad3a5c4b7e21af04d1b872f933c2e19e5c0a135bMichael Graff dns_result_totext(result));
11fcc67616fac1bc6a28b3d4fed24641137888e7Michael Graff exit(1);
11fcc67616fac1bc6a28b3d4fed24641137888e7Michael Graff }
11fcc67616fac1bc6a28b3d4fed24641137888e7Michael Graff
11fcc67616fac1bc6a28b3d4fed24641137888e7Michael Graff while (gets(s) != NULL) {
2992344aacdb08e4af936c176d49ef789f5673ddMichael Graff dns_name_init(&name, offsets);
11fcc67616fac1bc6a28b3d4fed24641137888e7Michael Graff len = strlen(s);
bb143613cf26e0f27dfd9caf1a7336065d064b26Michael Graff isc_buffer_init(&source, s, len, ISC_BUFFERTYPE_TEXT);
fe14eafefa91fada7cea0a55b09196c01477406cBob Halley isc_buffer_add(&source, len);
11fcc67616fac1bc6a28b3d4fed24641137888e7Michael Graff isc_buffer_init(&target, b, sizeof b, ISC_BUFFERTYPE_BINARY);
213973a334f92d4aef4ef62b4538fc2e4d0e8082Michael Graff result = dns_name_fromtext(&name, &source, origin, ISC_FALSE,
213973a334f92d4aef4ef62b4538fc2e4d0e8082Michael Graff &target);
8cdfd17426179ae6f629a9b7475d46a22f535047Bob Halley if (result != DNS_R_SUCCESS) {
8cdfd17426179ae6f629a9b7475d46a22f535047Bob Halley printf("bad name: %s\n", dns_result_totext(result));
213973a334f92d4aef4ef62b4538fc2e4d0e8082Michael Graff continue;
6dde125c2f47617ceef1518cf9e5588e8f366b71Michael Graff }
6dde125c2f47617ceef1518cf9e5588e8f366b71Michael Graff node = NULL;
6dde125c2f47617ceef1518cf9e5588e8f366b71Michael Graff result = dns_db_findnode(db, &name, ISC_FALSE, &node);
6dde125c2f47617ceef1518cf9e5588e8f366b71Michael Graff if (result == DNS_R_NOTFOUND)
213973a334f92d4aef4ef62b4538fc2e4d0e8082Michael Graff printf("not found\n");
213973a334f92d4aef4ef62b4538fc2e4d0e8082Michael Graff else if (result != DNS_R_SUCCESS)
213973a334f92d4aef4ef62b4538fc2e4d0e8082Michael Graff printf("%s\n", dns_result_totext(result));
8cdfd17426179ae6f629a9b7475d46a22f535047Bob Halley else {
8cdfd17426179ae6f629a9b7475d46a22f535047Bob Halley printf("success\n");
213973a334f92d4aef4ef62b4538fc2e4d0e8082Michael Graff dns_rdataset_init(&rdataset);
6dde125c2f47617ceef1518cf9e5588e8f366b71Michael Graff result = dns_db_findrdataset(db, node, NULL, type,
6dde125c2f47617ceef1518cf9e5588e8f366b71Michael Graff &rdataset);
a44c12b332b867f29631e235eb11d1263c73d6c0Bob Halley if (result == DNS_R_NOTFOUND)
a44c12b332b867f29631e235eb11d1263c73d6c0Bob Halley printf("type %d rdataset not found\n", type);
59c049874bbef182857c57bd9cca292898921c69Bob Halley else if (result != DNS_R_SUCCESS)
59c049874bbef182857c57bd9cca292898921c69Bob Halley printf("%s\n", dns_result_totext(result));
59c049874bbef182857c57bd9cca292898921c69Bob Halley else {
59c049874bbef182857c57bd9cca292898921c69Bob Halley isc_buffer_init(&text, t, sizeof t,
59c049874bbef182857c57bd9cca292898921c69Bob Halley ISC_BUFFERTYPE_TEXT);
66bd3b3c6b171271c705b897823dcdcf29464698Michael Graff result = dns_rdataset_totext(&rdataset,
66bd3b3c6b171271c705b897823dcdcf29464698Michael Graff &name,
8cdfd17426179ae6f629a9b7475d46a22f535047Bob Halley ISC_FALSE,
8cdfd17426179ae6f629a9b7475d46a22f535047Bob Halley &text);
8cdfd17426179ae6f629a9b7475d46a22f535047Bob Halley isc_buffer_used(&text, &r);
8cdfd17426179ae6f629a9b7475d46a22f535047Bob Halley if (result == DNS_R_SUCCESS)
11fcc67616fac1bc6a28b3d4fed24641137888e7Michael Graff printf("%.*s", (int)r.length,
11fcc67616fac1bc6a28b3d4fed24641137888e7Michael Graff (char *)r.base);
ad3a5c4b7e21af04d1b872f933c2e19e5c0a135bMichael Graff else
1c3bc66ada38236cc81c41b7174a9f0a872c9ab6Michael Graff printf("%s\n",
1f90c108282533a23b8362c34bcde4267c1eb4b1Michael Graff dns_result_totext(result));
4281fe4a80af7402613f0d5c3eeff8829a4ede1fMichael Graff dns_rdataset_disassociate(&rdataset);
ebdd11e84734e28ddd64562e82a7c646a58a04f4Michael Graff }
16508d9185e5eb96af2ebe900a08c46a6e5eb7edBob Halley dns_db_detachnode(db, &node);
16508d9185e5eb96af2ebe900a08c46a6e5eb7edBob Halley }
ff9bb3fc5453bbf310b67c560fbf04a5c0fb60daMichael Graff }
ff9bb3fc5453bbf310b67c560fbf04a5c0fb60daMichael Graff
fe14eafefa91fada7cea0a55b09196c01477406cBob Halley dns_db_detach(&db);
ff9bb3fc5453bbf310b67c560fbf04a5c0fb60daMichael Graff freename(mctx, &base);
ff9bb3fc5453bbf310b67c560fbf04a5c0fb60daMichael Graff
59e22acc4f79ff481f7bfa46ef0558957ae53cfcMichael Graff isc_mem_stats(mctx, stdout);
59e22acc4f79ff481f7bfa46ef0558957ae53cfcMichael Graff
fe14eafefa91fada7cea0a55b09196c01477406cBob Halley return (0);
306a93530536f05edfb477cac1c2667d90129a8fMichael Graff}
306a93530536f05edfb477cac1c2667d90129a8fMichael Graff