#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <arpa/inet.h>
#include <unbound.h>

/* examine the result structure in detail */
void examine_result(char* query, struct ub_result* result)
{
	int i;
	int num;

	printf("The query is for: %s\n", query);
	printf("The result has:\n");
	printf("qname: %s\n", result->qname);
	printf("qtype: %d\n", result->qtype);
	printf("qclass: %d\n", result->qclass);
	if(result->canonname)
		printf("canonical name: %s\n", 
			result->canonname);
	else	printf("canonical name: <none>\n");

	if(result->havedata)
		printf("has data\n");
	else	printf("has no data\n");
	
	if(result->nxdomain)
		printf("nxdomain (name does not exist)\n");
	else	printf("not an nxdomain (name exists)\n");
	
	if(result->secure)
		printf("validated to be secure\n");
	else	printf("not validated as secure\n");

	if(result->bogus)
		printf("a security failure! (bogus)\n");
	else	printf("not a security failure (not bogus)\n");
	
	printf("DNS rcode: %d\n", result->rcode);
	printf("\n");

	num = 0;
	for(i=0; result->data[i]; i++) {
		printf("result data element %d has length %d\n",
			i, result->len[i]);
		printf("result data element %d is: %s\n",
			i, inet_ntoa(*(struct in_addr*)result->data[i]));
		num++;
	}
	printf("result has %d data element(s)\n", num);
}

int main(int argc, char** argv)
{
	struct ub_ctx* ctx;
	struct ub_result* result;
	int retval;

	if(argc != 2) {
		printf("usage: <hostname>\n");
		return 1;
	}

	/* create context */
	ctx = ub_ctx_create();
	if(!ctx) {
		printf("error: could not create unbound context\n");
		return 1;
	}
	/* read /etc/resolv.conf for DNS proxy settings (from DHCP) */
	if( (retval=ub_ctx_resolvconf(ctx, "/etc/resolv.conf")) != 0) {
		printf("error reading resolv.conf: %s. errno says: %s\n", 
			ub_strerror(retval), strerror(errno));
		return 1;
	}
	/* read /etc/hosts for locally supplied host addresses */
	if( (retval=ub_ctx_hosts(ctx, "/etc/hosts")) != 0) {
		printf("error reading hosts: %s. errno says: %s\n", 
			ub_strerror(retval), strerror(errno));
		return 1;
	}

	/* query for webserver */
	retval = ub_resolve(ctx, argv[1], 
		1 /* TYPE A (IPv4 address) */, 
		1 /* CLASS IN (internet) */, &result);
	if(retval != 0) {
		printf("resolve error: %s\n", ub_strerror(retval));
		return 1;
	}
	examine_result(argv[1], result);

	ub_resolve_free(result);
	ub_ctx_delete(ctx);
	return 0;
}

