2 * Copyright (C) 2004-2007 Internet Systems Consortium, Inc. ("ISC")
3 * Copyright (C) 1998-2003 Internet Software Consortium.
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.
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.
18 /* $Id: rdata_test.c,v 1.48 2007/06/19 23:46:59 tbox Exp $ */
24 #include <isc/buffer.h>
25 #include <isc/commandline.h>
28 #include <isc/string.h>
31 #include <dns/rdata.h>
32 #include <dns/compress.h>
33 #include <dns/rdataclass.h>
34 #include <dns/rdatastruct.h>
35 #include <dns/rdatatype.h>
36 #include <dns/result.h>
41 isc_lexspecials_t specials;
44 viastruct(dns_rdata_t *rdata, isc_mem_t *mctx,
45 dns_rdata_t *rdata2, isc_buffer_t *b)
49 isc_boolean_t need_free = ISC_FALSE;
53 UNUSED(rdata2); /* XXXMPA remove when fromstruct is ready. */
56 switch (rdata->type) {
57 case dns_rdatatype_a6: {
58 dns_rdata_in_a6_t in_a6;
59 result = dns_rdata_tostruct(rdata, sp = &in_a6, NULL);
62 case dns_rdatatype_a: {
63 switch (rdata->rdclass) {
64 case dns_rdataclass_hs: {
65 dns_rdata_hs_a_t hs_a;
66 result = dns_rdata_tostruct(rdata, sp = &hs_a, NULL);
69 case dns_rdataclass_in: {
70 dns_rdata_in_a_t in_a;
71 result = dns_rdata_tostruct(rdata, sp = &in_a, NULL);
75 result = ISC_R_NOTIMPLEMENTED;
80 case dns_rdatatype_aaaa: {
81 dns_rdata_in_aaaa_t in_aaaa;
82 result = dns_rdata_tostruct(rdata, sp = &in_aaaa, NULL);
85 case dns_rdatatype_afsdb: {
86 dns_rdata_afsdb_t afsdb;
87 result = dns_rdata_tostruct(rdata, sp = &afsdb, NULL);
90 case dns_rdatatype_any: {
91 result = ISC_R_NOTIMPLEMENTED;
94 case dns_rdatatype_apl: {
95 switch (rdata->rdclass) {
96 case dns_rdataclass_in: {
97 dns_rdata_in_apl_t in_apl;
98 result = dns_rdata_tostruct(rdata, sp = &in_apl, NULL);
102 result = ISC_R_NOTIMPLEMENTED;
107 case dns_rdatatype_cert: {
108 dns_rdata_cert_t cert;
109 result = dns_rdata_tostruct(rdata, sp = &cert, NULL);
112 case dns_rdatatype_cname: {
113 dns_rdata_cname_t cname;
114 result = dns_rdata_tostruct(rdata, sp = &cname, NULL);
117 case dns_rdatatype_dname: {
118 dns_rdata_dname_t dname;
119 result = dns_rdata_tostruct(rdata, sp = &dname, NULL);
122 case dns_rdatatype_gpos: {
123 dns_rdata_gpos_t gpos;
124 result = dns_rdata_tostruct(rdata, sp = &gpos, NULL);
127 case dns_rdatatype_hinfo: {
128 dns_rdata_hinfo_t hinfo;
129 result = dns_rdata_tostruct(rdata, sp = &hinfo, NULL);
132 case dns_rdatatype_isdn: {
133 dns_rdata_isdn_t isdn;
134 result = dns_rdata_tostruct(rdata, sp = &isdn, NULL);
137 case dns_rdatatype_key: {
139 result = dns_rdata_tostruct(rdata, sp = &key, NULL);
142 case dns_rdatatype_kx: {
143 dns_rdata_in_kx_t in_kx;
144 result = dns_rdata_tostruct(rdata, sp = &in_kx, NULL);
147 case dns_rdatatype_loc: {
149 result = dns_rdata_tostruct(rdata, sp = &loc, NULL);
152 case dns_rdatatype_mb: {
154 result = dns_rdata_tostruct(rdata, sp = &mb, NULL);
157 case dns_rdatatype_md: {
159 result = dns_rdata_tostruct(rdata, sp = &md, NULL);
162 case dns_rdatatype_mf: {
164 result = dns_rdata_tostruct(rdata, sp = &mf, NULL);
167 case dns_rdatatype_mg: {
169 result = dns_rdata_tostruct(rdata, sp = &mg, NULL);
172 case dns_rdatatype_minfo: {
173 dns_rdata_minfo_t minfo;
174 result = dns_rdata_tostruct(rdata, sp = &minfo, NULL);
177 case dns_rdatatype_mr: {
179 result = dns_rdata_tostruct(rdata, sp = &mr, NULL);
182 case dns_rdatatype_mx: {
184 result = dns_rdata_tostruct(rdata, sp = &mx, NULL);
187 case dns_rdatatype_naptr: {
188 dns_rdata_in_naptr_t in_naptr;
189 result = dns_rdata_tostruct(rdata, sp = &in_naptr, NULL);
192 case dns_rdatatype_ns: {
194 result = dns_rdata_tostruct(rdata, sp = &ns, NULL);
197 case dns_rdatatype_nsap: {
198 dns_rdata_in_nsap_t in_nsap;
199 result = dns_rdata_tostruct(rdata, sp = &in_nsap, NULL);
202 case dns_rdatatype_nsap_ptr: {
203 dns_rdata_in_nsap_ptr_t in_nsap_ptr;
204 result = dns_rdata_tostruct(rdata, sp = &in_nsap_ptr, NULL);
207 case dns_rdatatype_null: {
208 dns_rdata_null_t null;
209 result = dns_rdata_tostruct(rdata, sp = &null, NULL);
212 case dns_rdatatype_nxt: {
214 result = dns_rdata_tostruct(rdata, sp = &nxt, NULL);
217 case dns_rdatatype_opt: {
219 result = dns_rdata_tostruct(rdata, sp = &opt, NULL);
222 case dns_rdatatype_ptr: {
224 result = dns_rdata_tostruct(rdata, sp = &ptr, NULL);
227 case dns_rdatatype_px: {
228 dns_rdata_in_px_t in_px;
229 result = dns_rdata_tostruct(rdata, sp = &in_px, NULL);
232 case dns_rdatatype_rp: {
234 result = dns_rdata_tostruct(rdata, sp = &rp, NULL);
237 case dns_rdatatype_rt: {
239 result = dns_rdata_tostruct(rdata, sp = &rt, NULL);
242 case dns_rdatatype_sig: {
244 result = dns_rdata_tostruct(rdata, sp = &sig, NULL);
247 case dns_rdatatype_soa: {
249 result = dns_rdata_tostruct(rdata, sp = &soa, NULL);
252 case dns_rdatatype_srv: {
253 dns_rdata_in_srv_t in_srv;
254 result = dns_rdata_tostruct(rdata, sp = &in_srv, NULL);
257 case dns_rdatatype_tkey: {
258 dns_rdata_tkey_t tkey;
259 result = dns_rdata_tostruct(rdata, sp = &tkey, NULL);
262 case dns_rdatatype_tsig: {
263 dns_rdata_any_tsig_t tsig;
264 result = dns_rdata_tostruct(rdata, sp = &tsig, NULL);
267 case dns_rdatatype_txt: {
269 result = dns_rdata_tostruct(rdata, sp = &txt, NULL);
272 case dns_rdatatype_spf: {
274 result = dns_rdata_tostruct(rdata, sp = &spf, NULL);
277 case dns_rdatatype_unspec: {
278 dns_rdata_unspec_t unspec;
279 result = dns_rdata_tostruct(rdata, sp = &unspec, NULL);
282 case dns_rdatatype_wks: {
283 dns_rdata_in_wks_t in_wks;
284 result = dns_rdata_tostruct(rdata, sp = &in_wks, NULL);
287 case dns_rdatatype_x25: {
289 result = dns_rdata_tostruct(rdata, sp = &x25, NULL);
292 case dns_rdatatype_nsec: {
293 dns_rdata_nsec_t nsec;
294 result = dns_rdata_tostruct(rdata, sp = &nsec, NULL);
297 case dns_rdatatype_rrsig: {
298 dns_rdata_rrsig_t rrsig;
299 result = dns_rdata_tostruct(rdata, sp = &rrsig, NULL);
302 case dns_rdatatype_dnskey: {
303 dns_rdata_dnskey_t dnskey;
304 result = dns_rdata_tostruct(rdata, sp = &dnskey, NULL);
308 result = ISC_R_NOTIMPLEMENTED;
311 if (result != ISC_R_SUCCESS)
312 fprintf(stdout, "viastruct: tostruct %d %d return %s\n",
313 rdata->type, rdata->rdclass,
314 dns_result_totext(result));
316 dns_rdata_freestruct(sp);
318 switch (rdata->type) {
319 case dns_rdatatype_a6: {
320 dns_rdata_in_a6_t in_a6;
321 result = dns_rdata_tostruct(rdata, sp = &in_a6, mctx);
324 case dns_rdatatype_a: {
325 switch (rdata->rdclass) {
326 case dns_rdataclass_hs: {
327 dns_rdata_hs_a_t hs_a;
328 result = dns_rdata_tostruct(rdata, sp = &hs_a, mctx);
331 case dns_rdataclass_in: {
332 dns_rdata_in_a_t in_a;
333 result = dns_rdata_tostruct(rdata, sp = &in_a, mctx);
337 result = ISC_R_NOTIMPLEMENTED;
342 case dns_rdatatype_aaaa: {
343 dns_rdata_in_aaaa_t in_aaaa;
344 result = dns_rdata_tostruct(rdata, sp = &in_aaaa, mctx);
347 case dns_rdatatype_afsdb: {
348 dns_rdata_afsdb_t afsdb;
349 result = dns_rdata_tostruct(rdata, sp = &afsdb, mctx);
352 case dns_rdatatype_any: {
353 result = ISC_R_NOTIMPLEMENTED;
356 case dns_rdatatype_apl: {
357 switch (rdata->rdclass) {
358 case dns_rdataclass_in: {
359 dns_rdata_in_apl_t in_apl;
360 result = dns_rdata_tostruct(rdata, sp = &in_apl, mctx);
364 result = ISC_R_NOTIMPLEMENTED;
369 case dns_rdatatype_cert: {
370 dns_rdata_cert_t cert;
371 result = dns_rdata_tostruct(rdata, sp = &cert, mctx);
374 case dns_rdatatype_cname: {
375 dns_rdata_cname_t cname;
376 result = dns_rdata_tostruct(rdata, sp = &cname, mctx);
379 case dns_rdatatype_dname: {
380 dns_rdata_dname_t dname;
381 result = dns_rdata_tostruct(rdata, sp = &dname, mctx);
384 case dns_rdatatype_gpos: {
385 dns_rdata_gpos_t gpos;
386 result = dns_rdata_tostruct(rdata, sp = &gpos, mctx);
389 case dns_rdatatype_hinfo: {
390 dns_rdata_hinfo_t hinfo;
391 result = dns_rdata_tostruct(rdata, sp = &hinfo, mctx);
394 case dns_rdatatype_isdn: {
395 dns_rdata_isdn_t isdn;
396 result = dns_rdata_tostruct(rdata, sp = &isdn, mctx);
399 case dns_rdatatype_key: {
401 result = dns_rdata_tostruct(rdata, sp = &key, mctx);
404 case dns_rdatatype_kx: {
405 dns_rdata_in_kx_t in_kx;
406 result = dns_rdata_tostruct(rdata, sp = &in_kx, mctx);
409 case dns_rdatatype_loc: {
411 result = dns_rdata_tostruct(rdata, sp = &loc, mctx);
414 case dns_rdatatype_mb: {
416 result = dns_rdata_tostruct(rdata, sp = &mb, mctx);
419 case dns_rdatatype_md: {
421 result = dns_rdata_tostruct(rdata, sp = &md, mctx);
424 case dns_rdatatype_mf: {
426 result = dns_rdata_tostruct(rdata, sp = &mf, mctx);
429 case dns_rdatatype_mg: {
431 result = dns_rdata_tostruct(rdata, sp = &mg, mctx);
434 case dns_rdatatype_minfo: {
435 dns_rdata_minfo_t minfo;
436 result = dns_rdata_tostruct(rdata, sp = &minfo, mctx);
439 case dns_rdatatype_mr: {
441 result = dns_rdata_tostruct(rdata, sp = &mr, mctx);
444 case dns_rdatatype_mx: {
446 result = dns_rdata_tostruct(rdata, sp = &mx, mctx);
449 case dns_rdatatype_naptr: {
450 dns_rdata_in_naptr_t in_naptr;
451 result = dns_rdata_tostruct(rdata, sp = &in_naptr, mctx);
454 case dns_rdatatype_ns: {
456 result = dns_rdata_tostruct(rdata, sp = &ns, mctx);
459 case dns_rdatatype_nsap: {
460 dns_rdata_in_nsap_t in_nsap;
461 result = dns_rdata_tostruct(rdata, sp = &in_nsap, mctx);
464 case dns_rdatatype_nsap_ptr: {
465 dns_rdata_in_nsap_ptr_t in_nsap_ptr;
466 result = dns_rdata_tostruct(rdata, sp = &in_nsap_ptr, mctx);
469 case dns_rdatatype_null: {
470 dns_rdata_null_t null;
471 result = dns_rdata_tostruct(rdata, sp = &null, mctx);
474 case dns_rdatatype_nxt: {
476 result = dns_rdata_tostruct(rdata, sp = &nxt, mctx);
479 case dns_rdatatype_opt: {
481 result = dns_rdata_tostruct(rdata, sp = &opt, mctx);
484 case dns_rdatatype_ptr: {
486 result = dns_rdata_tostruct(rdata, sp = &ptr, mctx);
489 case dns_rdatatype_px: {
490 dns_rdata_in_px_t in_px;
491 result = dns_rdata_tostruct(rdata, sp = &in_px, mctx);
494 case dns_rdatatype_rp: {
496 result = dns_rdata_tostruct(rdata, sp = &rp, mctx);
499 case dns_rdatatype_rt: {
501 result = dns_rdata_tostruct(rdata, sp = &rt, mctx);
504 case dns_rdatatype_sig: {
506 result = dns_rdata_tostruct(rdata, sp = &sig, mctx);
509 case dns_rdatatype_soa: {
511 result = dns_rdata_tostruct(rdata, sp = &soa, mctx);
514 case dns_rdatatype_srv: {
515 dns_rdata_in_srv_t in_srv;
516 result = dns_rdata_tostruct(rdata, sp = &in_srv, mctx);
519 case dns_rdatatype_tkey: {
520 dns_rdata_tkey_t tkey;
521 result = dns_rdata_tostruct(rdata, sp = &tkey, mctx);
524 case dns_rdatatype_tsig: {
525 dns_rdata_any_tsig_t tsig;
526 result = dns_rdata_tostruct(rdata, sp = &tsig, mctx);
529 case dns_rdatatype_txt: {
531 result = dns_rdata_tostruct(rdata, sp = &txt, mctx);
534 case dns_rdatatype_spf: {
536 result = dns_rdata_tostruct(rdata, sp = &spf, mctx);
539 case dns_rdatatype_unspec: {
540 dns_rdata_unspec_t unspec;
541 result = dns_rdata_tostruct(rdata, sp = &unspec, mctx);
544 case dns_rdatatype_wks: {
545 dns_rdata_in_wks_t in_wks;
546 result = dns_rdata_tostruct(rdata, sp = &in_wks, mctx);
549 case dns_rdatatype_x25: {
551 result = dns_rdata_tostruct(rdata, sp = &x25, mctx);
554 case dns_rdatatype_nsec: {
555 dns_rdata_nsec_t nsec;
556 result = dns_rdata_tostruct(rdata, sp = &nsec, mctx);
559 case dns_rdatatype_rrsig: {
560 dns_rdata_rrsig_t rrsig;
561 result = dns_rdata_tostruct(rdata, sp = &rrsig, mctx);
564 case dns_rdatatype_dnskey: {
565 dns_rdata_dnskey_t dnskey;
566 result = dns_rdata_tostruct(rdata, sp = &dnskey, mctx);
570 result = ISC_R_NOTIMPLEMENTED;
573 if (result != ISC_R_SUCCESS)
574 fprintf(stdout, "viastruct: tostruct %d %d return %s\n",
575 rdata->type, rdata->rdclass,
576 dns_result_totext(result));
578 need_free = ISC_TRUE;
580 rdc = rdata->rdclass;
582 result = dns_rdata_fromstruct(rdata2, rdc, rdt, sp, b);
583 if (result != ISC_R_SUCCESS)
585 "viastruct: fromstruct %d %d return %s\n",
586 rdata->type, rdata->rdclass,
587 dns_result_totext(result));
588 else if (rdata->length != rdata2->length ||
589 memcmp(rdata->data, rdata2->data, rdata->length) != 0)
594 fprintf(stdout, "viastruct: memcmp failed\n");
596 fprintf(stdout, "%d %d\n",
597 rdata->length, rdata2->length);
599 if (rdata2->length < l)
601 for (i = 0; i < l; i++)
602 fprintf(stdout, "%02x %02x\n",
603 rdata->data[i], rdata2->data[i]);
607 switch (rdata->type) {
608 case dns_rdatatype_a6: {
609 dns_rdata_in_a6_t in_a6;
610 result = dns_rdata_fromstruct(rdata2, rdc, rdt, &in_a6, b);
613 case dns_rdatatype_a: {
614 switch (rdata->rdclass) {
615 case dns_rdataclass_hs: {
616 dns_rdata_hs_a_t hs_a;
617 result = dns_rdata_fromstruct(rdata2, rdc, rdt,
621 case dns_rdataclass_in: {
622 dns_rdata_in_a_t in_a;
623 result = dns_rdata_fromstruct(rdata2, rdc, rdt,
628 result = ISC_R_NOTIMPLEMENTED;
633 case dns_rdatatype_aaaa: {
634 dns_rdata_in_aaaa_t in_aaaa;
635 result = dns_rdata_fromstruct(rdata2, rdc, rdt, &in_aaaa, b);
638 case dns_rdatatype_afsdb: {
639 dns_rdata_afsdb_t afsdb;
640 result = dns_rdata_fromstruct(rdata2, rdc, rdt, &afsdb, b);
643 case dns_rdatatype_any: {
644 result = ISC_R_NOTIMPLEMENTED;
647 case dns_rdatatype_apl: {
648 switch (rdata->rdclass) {
649 case dns_rdataclass_in: {
650 dns_rdata_in_apl_t in_apl;
651 result = dns_rdata_fromstruct(rdata, rdc, rdt, &in_apl, b);
655 result = ISC_R_NOTIMPLEMENTED;
660 case dns_rdatatype_cert: {
661 dns_rdata_cert_t cert;
662 result = dns_rdata_fromstruct(rdata2, rdc, rdt, &cert, b);
665 case dns_rdatatype_cname: {
666 dns_rdata_cname_t cname;
667 result = dns_rdata_fromstruct(rdata2, rdc, rdt, &cname, b);
670 case dns_rdatatype_dname: {
671 dns_rdata_dname_t dname;
672 result = dns_rdata_fromstruct(rdata2, rdc, rdt, &dname, b);
675 case dns_rdatatype_gpos: {
676 dns_rdata_gpos_t gpos;
677 result = dns_rdata_fromstruct(rdata2, rdc, rdt, &gpos, b);
680 case dns_rdatatype_hinfo: {
681 dns_rdata_hinfo_t hinfo;
682 result = dns_rdata_fromstruct(rdata2, rdc, rdt, &hinfo, b);
685 case dns_rdatatype_isdn: {
686 dns_rdata_isdn_t isdn;
687 result = dns_rdata_fromstruct(rdata2, rdc, rdt, &isdn, b);
690 case dns_rdatatype_key: {
692 result = dns_rdata_fromstruct(rdata2, rdc, rdt, &key, b);
695 case dns_rdatatype_kx: {
696 dns_rdata_in_kx_t in_kx;
697 result = dns_rdata_fromstruct(rdata2, rdc, rdt, &in_kx, b);
700 case dns_rdatatype_loc: {
702 result = dns_rdata_fromstruct(rdata2, rdc, rdt, &loc, b);
705 case dns_rdatatype_mb: {
707 result = dns_rdata_fromstruct(rdata2, rdc, rdt, &mb, b);
710 case dns_rdatatype_md: {
712 result = dns_rdata_fromstruct(rdata2, rdc, rdt, &md, b);
715 case dns_rdatatype_mf: {
717 result = dns_rdata_fromstruct(rdata2, rdc, rdt, &mf, b);
720 case dns_rdatatype_mg: {
722 result = dns_rdata_fromstruct(rdata2, rdc, rdt, &mg, b);
725 case dns_rdatatype_minfo: {
726 dns_rdata_minfo_t minfo;
727 result = dns_rdata_fromstruct(rdata2, rdc, rdt, &minfo, b);
730 case dns_rdatatype_mr: {
732 result = dns_rdata_fromstruct(rdata2, rdc, rdt, &mr, b);
735 case dns_rdatatype_mx: {
737 result = dns_rdata_fromstruct(rdata2, rdc, rdt, &mx, b);
740 case dns_rdatatype_naptr: {
741 dns_rdata_in_naptr_t in_naptr;
742 result = dns_rdata_fromstruct(rdata2, rdc, rdt, &in_naptr, b);
745 case dns_rdatatype_ns: {
747 result = dns_rdata_fromstruct(rdata2, rdc, rdt, &ns, b);
750 case dns_rdatatype_nsap: {
751 dns_rdata_in_nsap_t in_nsap;
752 result = dns_rdata_fromstruct(rdata2, rdc, rdt, &in_nsap, b);
755 case dns_rdatatype_nsap_ptr: {
756 dns_rdata_in_nsap_ptr_t in_nsap_ptr;
757 result = dns_rdata_fromstruct(rdata2, rdc, rdt, &in_nsap_ptr,
761 case dns_rdatatype_null: {
762 dns_rdata_null_t null;
763 result = dns_rdata_fromstruct(rdata2, rdc, rdt, &null, b);
766 case dns_rdatatype_nxt: {
768 result = dns_rdata_fromstruct(rdata2, rdc, rdt, &nxt, b);
771 case dns_rdatatype_opt: {
773 result = dns_rdata_fromstruct(rdata2, rdc, rdt, &opt, b);
776 case dns_rdatatype_ptr: {
778 result = dns_rdata_fromstruct(rdata2, rdc, rdt, &ptr, b);
781 case dns_rdatatype_px: {
782 dns_rdata_in_px_t in_px;
783 result = dns_rdata_fromstruct(rdata2, rdc, rdt, &in_px, b);
786 case dns_rdatatype_rp: {
788 result = dns_rdata_fromstruct(rdata2, rdc, rdt, &rp, b);
791 case dns_rdatatype_rt: {
793 result = dns_rdata_fromstruct(rdata2, rdc, rdt, &rt, b);
796 case dns_rdatatype_sig: {
798 result = dns_rdata_fromstruct(rdata2, rdc, rdt, &sig, b);
801 case dns_rdatatype_soa: {
803 result = dns_rdata_fromstruct(rdata2, rdc, rdt, &soa, b);
806 case dns_rdatatype_srv: {
807 dns_rdata_in_srv_t in_srv;
808 result = dns_rdata_fromstruct(rdata2, rdc, rdt, &in_srv, b);
811 case dns_rdatatype_tkey: {
812 dns_rdata_tkey_t tkey;
813 result = dns_rdata_fromstruct(rdata2, rdc, rdt, &tkey, b);
816 case dns_rdatatype_tsig: {
817 dns_rdata_any_tsig_t tsig;
818 result = dns_rdata_fromstruct(rdata2, rdc, rdt, &tsig, b);
821 case dns_rdatatype_txt: {
823 result = dns_rdata_fromstruct(rdata2, rdc, rdt, &txt, b);
826 case dns_rdatatype_spf: {
828 result = dns_rdata_fromstruct(rdata2, rdc, rdt, &spf, b);
831 case dns_rdatatype_unspec: {
832 dns_rdata_unspec_t unspec;
833 result = dns_rdata_fromstruct(rdata2, rdc, rdt, &unspec, b);
836 case dns_rdatatype_wks: {
837 dns_rdata_in_wks_t in_wks;
838 result = dns_rdata_fromstruct(rdata2, rdc, rdt, &in_wks, b);
841 case dns_rdatatype_x25: {
843 result = dns_rdata_fromstruct(rdata2, rdc, rdt, &x25, b);
846 case dns_rdatatype_nsec: {
847 dns_rdata_nsec_t nsec;
848 result = dns_rdata_fromstruct(rdata2, rdc, rdt, &nsec, b);
851 case dns_rdatatype_rrsig: {
852 dns_rdata_rrsig_t rrsig;
853 result = dns_rdata_fromstruct(rdata2, rdc, rdt, &rrsig, b);
856 case dns_rdatatype_dnskey: {
857 dns_rdata_dnskey_t dnskey;
858 result = dns_rdata_fromstruct(rdata2, rdc, rdt, &dnskey, b);
862 result = ISC_R_NOTIMPLEMENTED;
867 dns_rdata_freestruct(sp);
871 main(int argc, char *argv[]) {
877 unsigned int options = 0;
878 dns_rdatatype_t type;
879 dns_rdataclass_t class;
880 dns_rdatatype_t lasttype = 0;
881 char outbuf[16*1024];
883 char wirebuf[16*1024];
884 char viabuf[16*1024];
888 dns_rdata_t rdata = DNS_RDATA_INIT;
889 dns_rdata_t last = DNS_RDATA_INIT;
893 dns_decompress_t dctx;
904 while ((c = isc_commandline_parse(argc, argv, "dqswtarzS")) != -1) {
938 memset(&dctx, 0, sizeof(dctx));
939 dctx.allowed = DNS_COMPRESS_ALL;
941 RUNTIME_CHECK(isc_mem_create(0, 0, &mctx) == ISC_R_SUCCESS);
942 RUNTIME_CHECK(isc_lex_create(mctx, 256, &lex) == ISC_R_SUCCESS);
945 * Set up to lex DNS master file.
951 isc_lex_setspecials(lex, specials);
952 options = ISC_LEXOPT_EOL;
953 isc_lex_setcomments(lex, ISC_LEXCOMMENT_DNSMASTERFILE);
955 RUNTIME_CHECK(isc_lex_openstream(lex, stdin) == ISC_R_SUCCESS);
957 dns_rdata_init(&last);
958 while ((result = isc_lex_gettoken(lex, options | ISC_LEXOPT_NUMBER,
959 &token)) == ISC_R_SUCCESS) {
960 if (debug) fprintf(stdout, "token.type = %d\n", token.type);
962 if (token.type == isc_tokentype_eol)
966 if (token.type == isc_tokentype_eof)
972 if (token.type == isc_tokentype_number) {
973 type = token.value.as_ulong;
974 isc_buffer_init(&tbuf, outbuf, sizeof(outbuf));
975 result = dns_rdatatype_totext(type, &tbuf);
976 fprintf(stdout, "type = %.*s(%d)\n",
977 (int)tbuf.used, (char*)tbuf.base, type);
978 } else if (token.type == isc_tokentype_string) {
979 result = dns_rdatatype_fromtext(&type,
980 &token.value.as_textregion);
981 if (result != ISC_R_SUCCESS) {
983 "dns_rdatatype_fromtext "
985 dns_result_totext(result), result);
990 fprintf(stdout, "type = %.*s(%d)\n",
991 (int)token.value.as_textregion.length,
992 token.value.as_textregion.base, type);
996 result = isc_lex_gettoken(lex, options | ISC_LEXOPT_NUMBER,
998 if (result != ISC_R_SUCCESS)
1000 if (token.type == isc_tokentype_eol)
1002 if (token.type == isc_tokentype_eof)
1004 if (token.type == isc_tokentype_number) {
1005 class = token.value.as_ulong;
1006 isc_buffer_init(&tbuf, outbuf, sizeof(outbuf));
1007 result = dns_rdatatype_totext(class, &tbuf);
1008 fprintf(stdout, "class = %.*s(%d)\n",
1009 (int)tbuf.used, (char*)tbuf.base, class);
1010 } else if (token.type == isc_tokentype_string) {
1011 result = dns_rdataclass_fromtext(&class,
1012 &token.value.as_textregion);
1013 if (result != ISC_R_SUCCESS) {
1014 fprintf(stdout, "dns_rdataclass_fromtext "
1015 "returned %s(%d)\n",
1016 dns_result_totext(result), result);
1021 fprintf(stdout, "class = %.*s(%d)\n",
1022 (int)token.value.as_textregion.length,
1023 token.value.as_textregion.base, class);
1028 dns_rdata_init(&rdata);
1029 isc_buffer_init(&dbuf, inbuf, sizeof(inbuf));
1030 result = dns_rdata_fromtext(&rdata, class, type, lex,
1031 NULL, 0, mctx, &dbuf,
1033 if (result != ISC_R_SUCCESS) {
1035 "dns_rdata_fromtext returned %s(%d)\n",
1036 dns_result_totext(result), result);
1042 for (i = 0; i < rdata.length; /* */ ) {
1043 fprintf(stdout, "%02x", rdata.data[i]);
1044 if ((++i % 20) == 0)
1045 fputs("\n", stdout);
1047 if (i == rdata.length)
1048 fputs("\n", stdout);
1055 * Convert to wire and back?
1058 result = dns_compress_init(&cctx, -1, mctx);
1059 if (result != ISC_R_SUCCESS) {
1061 "dns_compress_init returned %s(%d)\n",
1062 dns_result_totext(result), result);
1065 isc_buffer_init(&wbuf, wirebuf, sizeof(wirebuf));
1066 result = dns_rdata_towire(&rdata, &cctx, &wbuf);
1067 dns_compress_invalidate(&cctx);
1068 if (result != ISC_R_SUCCESS) {
1070 "dns_rdata_towire returned %s(%d)\n",
1071 dns_result_totext(result), result);
1074 len = wbuf.used - wbuf.current;
1077 fputs("\n", stdout);
1078 for (i = 0; i < (unsigned int)len; /* */ ) {
1079 fprintf(stdout, "%02x",
1080 ((unsigned char*)wbuf.base)[i + wbuf.current]);
1081 if ((++i % 20) == 0)
1082 fputs("\n", stdout);
1085 fputs("\n", stdout);
1093 len = (len * 3) / 4;
1095 isc_buffer_add(&wbuf, len / 4 + 1);
1099 isc_buffer_setactive(&wbuf, len);
1100 dns_rdata_init(&rdata);
1101 isc_buffer_init(&dbuf, inbuf, sizeof(inbuf));
1102 dns_decompress_init(&dctx, -1, DNS_DECOMPRESS_ANY);
1103 result = dns_rdata_fromwire(&rdata, class, type, &wbuf,
1105 dns_decompress_invalidate(&dctx);
1106 if (result != ISC_R_SUCCESS) {
1108 "dns_rdata_fromwire returned %s(%d)\n",
1109 dns_result_totext(result), result);
1116 fputs("\n", stdout);
1117 for (i = 0; i < rdata.length; /* */ ) {
1118 fprintf(stdout, "%02x", rdata.data[i]);
1119 if ((++i % 20) == 0)
1120 fputs("\n", stdout);
1122 if (i == rdata.length)
1123 fputs("\n", stdout);
1129 isc_mem_t *mctx2 = NULL;
1130 dns_rdata_t rdata2 = DNS_RDATA_INIT;
1133 RUNTIME_CHECK(isc_mem_create(0, 0, &mctx2)
1136 isc_buffer_init(&vbuf, viabuf, sizeof(viabuf));
1137 dns_rdata_init(&rdata2);
1138 viastruct(&rdata, mctx2, &rdata2, &vbuf);
1139 if (!quiet && stats)
1140 isc_mem_stats(mctx2, stdout);
1141 isc_mem_destroy(&mctx2);
1144 isc_buffer_init(&tbuf, outbuf, sizeof(outbuf));
1145 result = dns_rdata_totext(&rdata, NULL, &tbuf);
1146 if (result != ISC_R_SUCCESS)
1147 fprintf(stdout, "dns_rdata_totext returned %s(%d)\n",
1148 dns_result_totext(result), result);
1150 fprintf(stdout, "\"%.*s\"\n",
1151 (int)tbuf.used, (char*)tbuf.base);
1153 if (lasttype == type) {
1154 fprintf(stdout, "dns_rdata_compare = %d\n",
1155 dns_rdata_compare(&rdata, &last));
1161 dns_rdata_init(&last);
1162 region.base = malloc(region.length = rdata.length);
1164 memcpy(region.base, rdata.data, rdata.length);
1165 dns_rdata_fromregion(&last, class, type, ®ion);
1172 if (result != ISC_R_EOF)
1173 printf("Result: %s\n", isc_result_totext(result));
1176 isc_lex_destroy(&lex);
1177 if (!quiet && stats)
1178 isc_mem_stats(mctx, stdout);
1179 isc_mem_destroy(&mctx);