123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142 |
- /*
- * Copyright (C) 2011-2012 Reto Guadagnini
- * HSR Hochschule fuer Technik Rapperswil
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation; either version 2 of the License, or (at your
- * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
- *
- * This program is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * for more details.
- */
- #include <stdio.h>
- #include <library.h>
- #include <utils/debug.h>
- /**
- * Define debug level
- */
- static level_t dbg_level = 1;
- static void dbg_dnssec(debug_t group, level_t level, char *fmt, ...)
- {
- if ((level <= dbg_level) || level <= 1)
- {
- va_list args;
- va_start(args, fmt);
- vfprintf(stderr, fmt, args);
- fprintf(stderr, "\n");
- va_end(args);
- }
- }
- int main(int argc, char *argv[])
- {
- resolver_t *resolver;
- resolver_response_t *response;
- enumerator_t *enumerator;
- chunk_t rdata;
- rr_set_t *rrset;
- rr_t *rr;
- library_init(NULL, "dnssec");
- atexit(library_deinit);
- dbg = dbg_dnssec;
- if (!lib->plugins->load(lib->plugins, PLUGINS))
- {
- return 1;
- }
- if (argc != 2)
- {
- fprintf(stderr, "usage: dnssec <name>\n");
- return 1;
- }
- resolver = lib->resolver->create(lib->resolver);
- if (!resolver)
- {
- printf("failed to create a resolver!\n");
- return 1;
- }
- response = resolver->query(resolver, argv[1], RR_CLASS_IN, RR_TYPE_A);
- if (!response)
- {
- printf("no response received!\n");
- resolver->destroy(resolver);
- return 1;
- }
- printf("DNS response:\n");
- if (!response->has_data(response) || !response->query_name_exist(response))
- {
- if (!response->has_data(response))
- {
- printf(" no data in the response\n");
- }
- if (!response->query_name_exist(response))
- {
- printf(" query name does not exist\n");
- }
- response->destroy(response);
- resolver->destroy(resolver);
- return 1;
- }
- printf(" RRs in the response:\n");
- rrset = response->get_rr_set(response);
- if (!rrset)
- {
- printf(" response contains no RRset!\n");
- response->destroy(response);
- resolver->destroy(resolver);
- return 1;
- }
- enumerator = rrset->create_rr_enumerator(rrset);
- while (enumerator->enumerate(enumerator, &rr))
- {
- printf(" name: %s\n", rr->get_name(rr));
- }
- enumerator = rrset->create_rrsig_enumerator(rrset);
- if (enumerator)
- {
- printf(" RRSIGs for the RRset:\n");
- while (enumerator->enumerate(enumerator, &rr))
- {
- rdata = rr->get_rdata(rr);
- printf(" name: %s\n", rr->get_name(rr));
- printf(" RDATA: %#B\n", &rdata);
- }
- }
- printf(" security status of the response: ");
- switch (response->get_security_state(response))
- {
- case SECURE:
- printf("SECURE\n\n");
- break;
- case INSECURE:
- printf("INSECURE\n\n");
- break;
- case BOGUS:
- printf("BOGUS\n\n");
- break;
- case INDETERMINATE:
- printf("INDETERMINATE\n\n");
- break;
- }
- response->destroy(response);
- resolver->destroy(resolver);
- return 0;
- }
|