mirror of https://github.com/getdnsapi/getdns.git
moved example code to src/example
This commit is contained in:
parent
c8d2005d49
commit
6f9deafbb6
|
@ -1,297 +0,0 @@
|
|||
#include <stdio.h>
|
||||
#include <stdint.h>
|
||||
#include <inttypes.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdbool.h>
|
||||
#include <getdns_libevent.h>
|
||||
|
||||
#define UNUSED_PARAM(x) ((void)(x))
|
||||
|
||||
/* The return values */
|
||||
getdns_return_t retregular;
|
||||
char * retcharstar;
|
||||
|
||||
/* The args */
|
||||
bool boolarg;
|
||||
char * charstararg;
|
||||
getdns_callback_t callbackarg;
|
||||
uint16_t regulararg;
|
||||
uint16_t *regularptrarg;
|
||||
getdns_transaction_t txidarg;
|
||||
getdns_transaction_t * txidptrarg;
|
||||
|
||||
getdns_data_type * datatypeptrarg;
|
||||
struct getdns_bindata ** bindataptrarg;
|
||||
struct getdns_dict * dictarg;
|
||||
struct getdns_bindata * bindataarg;
|
||||
struct getdns_list * listarg;
|
||||
struct getdns_dict ** dictptrarg;
|
||||
struct getdns_list ** listptrarg;
|
||||
|
||||
size_t sizetarg;
|
||||
size_t * sizetptrarg;
|
||||
getdns_context_t contextarg = NULL;
|
||||
uint8_t uint8arg;
|
||||
uint16_t uint16arg;
|
||||
uint32_t uint32arg;
|
||||
uint8_t * uint8ptrarg;
|
||||
uint16_t * uint16ptrarg;
|
||||
uint32_t * uint32ptrarg;
|
||||
void * arrayarg;
|
||||
void allocfunctionarg(size_t foo) {UNUSED_PARAM(foo);}
|
||||
void deallocfunctionarg(void* foo) {UNUSED_PARAM(foo);}
|
||||
void setcallbackfunctionarg(struct getdns_context_t *foo1, uint16_t foo2)
|
||||
{UNUSED_PARAM(foo1);UNUSED_PARAM(foo2);}
|
||||
|
||||
int main()
|
||||
{
|
||||
|
||||
retregular = getdns_general(
|
||||
contextarg,
|
||||
charstararg,
|
||||
uint16arg,
|
||||
dictarg,
|
||||
arrayarg,
|
||||
txidptrarg,
|
||||
callbackarg
|
||||
);
|
||||
|
||||
retregular = getdns_address(
|
||||
contextarg,
|
||||
charstararg,
|
||||
dictarg,
|
||||
arrayarg,
|
||||
txidptrarg,
|
||||
callbackarg
|
||||
);
|
||||
|
||||
retregular = getdns_hostname(
|
||||
contextarg,
|
||||
dictarg,
|
||||
dictarg,
|
||||
arrayarg,
|
||||
txidptrarg,
|
||||
callbackarg
|
||||
);
|
||||
|
||||
retregular = getdns_service(
|
||||
contextarg,
|
||||
charstararg,
|
||||
dictarg,
|
||||
arrayarg,
|
||||
txidptrarg,
|
||||
callbackarg
|
||||
);
|
||||
|
||||
retregular = getdns_context_create(
|
||||
&contextarg,
|
||||
boolarg
|
||||
);
|
||||
|
||||
getdns_context_destroy(
|
||||
contextarg
|
||||
);
|
||||
|
||||
retregular = getdns_cancel_callback(
|
||||
contextarg,
|
||||
txidarg
|
||||
);
|
||||
|
||||
retregular = getdns_general_sync(
|
||||
contextarg,
|
||||
charstararg,
|
||||
uint16arg,
|
||||
dictarg,
|
||||
uint32ptrarg,
|
||||
dictarg
|
||||
);
|
||||
|
||||
retregular = getdns_address_sync(
|
||||
contextarg,
|
||||
charstararg,
|
||||
dictarg,
|
||||
uint32ptrarg,
|
||||
dictarg
|
||||
);
|
||||
|
||||
retregular = getdns_hostname_sync(
|
||||
contextarg,
|
||||
dictarg,
|
||||
dictarg,
|
||||
uint32ptrarg,
|
||||
dictarg
|
||||
);
|
||||
|
||||
retregular = getdns_service_sync(
|
||||
contextarg,
|
||||
charstararg,
|
||||
dictarg,
|
||||
uint32ptrarg,
|
||||
dictarg
|
||||
);
|
||||
|
||||
getdns_free_sync_request_memory(
|
||||
dictarg
|
||||
);
|
||||
|
||||
retregular = getdns_list_get_length(listarg, sizetptrarg);
|
||||
retregular = getdns_list_get_data_type(listarg, sizetarg, datatypeptrarg);
|
||||
retregular = getdns_list_get_dict(listarg, sizetarg, dictptrarg);
|
||||
retregular = getdns_list_get_list(listarg, sizetarg, listptrarg);
|
||||
retregular = getdns_list_get_bindata(listarg, sizetarg, bindataptrarg);
|
||||
retregular = getdns_list_get_int(listarg, sizetarg, uint32ptrarg);
|
||||
|
||||
retregular = getdns_dict_get_names(dictarg, listptrarg);
|
||||
retregular = getdns_dict_get_data_type(dictarg, charstararg, datatypeptrarg);
|
||||
retregular = getdns_dict_get_dict(dictarg, charstararg, dictptrarg);
|
||||
retregular = getdns_dict_get_list(dictarg, charstararg, listptrarg);
|
||||
retregular = getdns_dict_get_bindata(dictarg, charstararg, bindataptrarg);
|
||||
retregular = getdns_dict_get_int(dictarg, charstararg, uint32ptrarg);
|
||||
|
||||
listarg = getdns_list_create();
|
||||
getdns_list_destroy(listarg);
|
||||
retregular = getdns_list_set_dict(listarg, sizetarg, dictarg);
|
||||
retregular = getdns_list_set_list(listarg, sizetarg, listarg);
|
||||
retregular = getdns_list_set_bindata(listarg, sizetarg, bindataarg);
|
||||
retregular = getdns_list_set_int(listarg, sizetarg, uint32arg);
|
||||
|
||||
dictarg = getdns_dict_create();
|
||||
getdns_dict_destroy(dictarg);
|
||||
retregular = getdns_dict_set_dict(dictarg, charstararg, dictarg);
|
||||
retregular = getdns_dict_set_list(dictarg, charstararg, listarg);
|
||||
retregular = getdns_dict_set_bindata(dictarg, charstararg, bindataarg);
|
||||
retregular = getdns_dict_set_int(dictarg, charstararg, uint32arg);
|
||||
|
||||
retcharstar = getdns_convert_fqdn_to_dns_name(
|
||||
charstararg
|
||||
);
|
||||
|
||||
retcharstar = getdns_convert_dns_name_to_fqdn(
|
||||
charstararg
|
||||
);
|
||||
|
||||
retcharstar = getdns_convert_ulabel_to_alabel(
|
||||
charstararg
|
||||
);
|
||||
|
||||
retcharstar = getdns_convert_alabel_to_ulabel(
|
||||
charstararg
|
||||
);
|
||||
|
||||
retregular = getdns_validate_dnssec(
|
||||
bindataarg,
|
||||
listarg,
|
||||
listarg
|
||||
);
|
||||
|
||||
retcharstar = getdns_pretty_print_dict(
|
||||
dictarg
|
||||
);
|
||||
|
||||
retcharstar = getdns_display_ip_address(
|
||||
bindataarg
|
||||
);
|
||||
|
||||
retregular = getdns_context_set_context_update_callback(
|
||||
contextarg,
|
||||
setcallbackfunctionarg
|
||||
);
|
||||
|
||||
retregular = getdns_context_set_resolution_type(
|
||||
contextarg,
|
||||
regulararg
|
||||
);
|
||||
|
||||
retregular = getdns_context_set_namespaces(
|
||||
contextarg,
|
||||
sizetarg,
|
||||
regularptrarg
|
||||
);
|
||||
|
||||
retregular = getdns_context_set_dns_transport(
|
||||
contextarg,
|
||||
regulararg
|
||||
);
|
||||
|
||||
retregular = getdns_context_set_limit_outstanding_queries(
|
||||
contextarg,
|
||||
uint16arg
|
||||
);
|
||||
|
||||
retregular = getdns_context_set_timeout(
|
||||
contextarg,
|
||||
uint16arg
|
||||
);
|
||||
|
||||
retregular = getdns_context_set_follow_redirects(
|
||||
contextarg,
|
||||
regulararg
|
||||
);
|
||||
|
||||
retregular = getdns_context_set_dns_root_servers(
|
||||
contextarg,
|
||||
listarg
|
||||
);
|
||||
|
||||
retregular = getdns_context_set_append_name(
|
||||
contextarg,
|
||||
regulararg
|
||||
);
|
||||
|
||||
retregular = getdns_context_set_suffix(
|
||||
contextarg,
|
||||
listarg
|
||||
);
|
||||
|
||||
retregular = getdns_context_set_dnssec_trust_anchors(
|
||||
contextarg,
|
||||
listarg
|
||||
);
|
||||
|
||||
retregular = getdns_context_set_dnssec_allowed_skew(
|
||||
contextarg,
|
||||
uint16arg
|
||||
);
|
||||
|
||||
retregular = getdns_context_set_stub_resolution(
|
||||
contextarg,
|
||||
listarg
|
||||
);
|
||||
|
||||
retregular = getdns_context_set_edns_maximum_udp_payload_size(
|
||||
contextarg,
|
||||
uint16arg
|
||||
);
|
||||
|
||||
retregular = getdns_context_set_edns_extended_rcode(
|
||||
contextarg,
|
||||
uint8arg
|
||||
);
|
||||
|
||||
retregular = getdns_context_set_edns_version(
|
||||
contextarg,
|
||||
uint8arg
|
||||
);
|
||||
|
||||
retregular = getdns_context_set_edns_do_bit(
|
||||
contextarg,
|
||||
uint8arg
|
||||
);
|
||||
|
||||
retregular = getdns_context_set_memory_allocator(
|
||||
contextarg,
|
||||
allocfunctionarg
|
||||
);
|
||||
|
||||
retregular = getdns_context_set_memory_deallocator(
|
||||
contextarg,
|
||||
deallocfunctionarg
|
||||
);
|
||||
|
||||
retregular = getdns_context_set_memory_reallocator(
|
||||
contextarg,
|
||||
deallocfunctionarg
|
||||
);
|
||||
|
||||
return(0); } /* End of main() */
|
|
@ -1,130 +0,0 @@
|
|||
/**
|
||||
* /brief demonstrate asynchronous use of the API for fetching DNS data
|
||||
*
|
||||
* Originally taken from the getdns API description pseudo implementation.
|
||||
*/
|
||||
|
||||
/* The MIT License (MIT)
|
||||
* Copyright (c) 2013 Verisign, Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <inttypes.h>
|
||||
#include <getdns_libevent.h>
|
||||
|
||||
#define UNUSED_PARAM(x) ((void)(x))
|
||||
|
||||
/* Set up the callback function, which will also do the processing of the results */
|
||||
void this_callbackfn(struct getdns_context_t *this_context,
|
||||
uint16_t this_callback_type,
|
||||
struct getdns_dict *this_response,
|
||||
void *this_userarg,
|
||||
getdns_transaction_t this_transaction_id)
|
||||
{
|
||||
UNUSED_PARAM(this_userarg); /* Not looking at the userarg for this example */
|
||||
UNUSED_PARAM(this_context); /* Not looking at the context for this example */
|
||||
getdns_return_t this_ret; /* Holder for all function returns */
|
||||
if (this_callback_type == GETDNS_CALLBACK_COMPLETE) /* This is a callback with data */
|
||||
{
|
||||
/* Be sure the search returned something */
|
||||
uint32_t * this_error = NULL;
|
||||
this_ret = getdns_dict_get_int(this_response, "status", this_error); // Ignore any error
|
||||
if (*this_error != GETDNS_RESPSTATUS_GOOD) // If the search didn't return "good"
|
||||
{
|
||||
fprintf(stderr, "The search had no results, and a return value of %d. Exiting.", *this_error);
|
||||
return;
|
||||
}
|
||||
struct getdns_list * just_the_addresses_ptr;
|
||||
this_ret = getdns_dict_get_list(this_response, "just_address_answers", &just_the_addresses_ptr);
|
||||
if (this_ret != GETDNS_RETURN_GOOD) // This check is really not needed, but prevents a compiler error under "pedantic"
|
||||
{
|
||||
fprintf(stderr, "Trying to get the answers failed: %d", this_ret);
|
||||
return;
|
||||
}
|
||||
size_t * num_addresses_ptr = NULL;
|
||||
this_ret = getdns_list_get_length(just_the_addresses_ptr, num_addresses_ptr); // Ignore any error
|
||||
/* Go through each record */
|
||||
for ( size_t rec_count = 0; rec_count <= *num_addresses_ptr; ++rec_count )
|
||||
{
|
||||
struct getdns_dict * this_address;
|
||||
this_ret = getdns_list_get_dict(just_the_addresses_ptr, rec_count, &this_address); // Ignore any error
|
||||
/* Just print the address */
|
||||
struct getdns_bindata * this_address_data;
|
||||
this_ret = getdns_dict_get_bindata(this_address, "address_data", &this_address_data); // Ignore any error
|
||||
printf("The address is %s", getdns_display_ip_address(this_address_data));
|
||||
}
|
||||
}
|
||||
else if (this_callback_type == GETDNS_CALLBACK_CANCEL)
|
||||
fprintf(stderr, "The callback with ID %"PRIu64" was cancelled. Exiting.", this_transaction_id);
|
||||
else
|
||||
fprintf(stderr, "The callback got a callback_type of %d. Exiting.", this_callback_type);
|
||||
}
|
||||
|
||||
int
|
||||
main()
|
||||
{
|
||||
/* Create the DNS context for this call */
|
||||
struct getdns_context_t *this_context = NULL;
|
||||
getdns_return_t context_create_return = getdns_context_create(&this_context, true);
|
||||
if (context_create_return != GETDNS_RETURN_GOOD)
|
||||
{
|
||||
fprintf(stderr, "Trying to create the context failed: %d", context_create_return);
|
||||
return(GETDNS_RETURN_GENERIC_ERROR);
|
||||
}
|
||||
/* Create an event base and put it in the context using the unknown function name */
|
||||
struct event_base *this_event_base;
|
||||
this_event_base = event_base_new();
|
||||
if (this_event_base == NULL)
|
||||
{
|
||||
fprintf(stderr, "Trying to create the event base failed.");
|
||||
return(GETDNS_RETURN_GENERIC_ERROR);
|
||||
}
|
||||
(void)getdns_extension_set_libevent_base(this_context, this_event_base);
|
||||
/* Set up the getdns call */
|
||||
const char * this_name = "www.example.com";
|
||||
char* this_userarg = "somestring"; // Could add things here to help identify this call
|
||||
getdns_transaction_t this_transaction_id = 0;
|
||||
|
||||
/* Make the call */
|
||||
getdns_return_t dns_request_return = getdns_address(this_context, this_name,
|
||||
NULL, this_userarg, &this_transaction_id, this_callbackfn);
|
||||
if (dns_request_return == GETDNS_RETURN_BAD_DOMAIN_NAME)
|
||||
{
|
||||
fprintf(stderr, "A bad domain name was used: %s. Exiting.", this_name);
|
||||
return(GETDNS_RETURN_GENERIC_ERROR);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Call the event loop */
|
||||
int dispatch_return = event_base_dispatch(this_event_base);
|
||||
UNUSED_PARAM(dispatch_return);
|
||||
// TODO: check the return value above
|
||||
}
|
||||
/* Clean up */
|
||||
getdns_context_destroy(this_context);
|
||||
/* Assuming we get here, leave gracefully */
|
||||
exit(EXIT_SUCCESS);
|
||||
} /* main */
|
||||
|
||||
/* example-simple-answers.c */
|
|
@ -1,109 +0,0 @@
|
|||
/* example-synchronous.c
|
||||
*
|
||||
* Originally taken from the getdns API description pseudo implementation.
|
||||
*
|
||||
* The MIT License (MIT)
|
||||
* Copyright (c) 2013 Verisign, Inc.
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
* of this software and associated documentation files (the "Software"), to deal
|
||||
* in the Software without restriction, including without limitation the rights
|
||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
* copies of the Software, and to permit persons to whom the Software is
|
||||
* furnished to do so, subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in
|
||||
* all copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
* THE SOFTWARE.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <inttypes.h>
|
||||
#include <getdns_core_only.h>
|
||||
|
||||
int
|
||||
main()
|
||||
{
|
||||
getdns_return_t context_create_return;
|
||||
struct getdns_list *just_the_addresses_ptr;
|
||||
size_t *num_addresses_ptr = NULL;
|
||||
size_t rec_count;
|
||||
struct getdns_dict *this_address;
|
||||
struct getdns_bindata *this_address_data;
|
||||
struct getdns_context_t *this_context = NULL;
|
||||
uint32_t *this_error = NULL;
|
||||
struct getdns_dict *this_extensions = NULL;
|
||||
const char *this_name = "www.example.com";
|
||||
uint8_t this_request_type = GETDNS_RRTYPE_A;
|
||||
struct getdns_dict *this_response = NULL;
|
||||
uint32_t this_response_length;
|
||||
getdns_return_t this_ret;
|
||||
|
||||
/* Create the DNS context for this call */
|
||||
context_create_return = getdns_context_create(&this_context, true);
|
||||
if (context_create_return != GETDNS_RETURN_GOOD)
|
||||
{
|
||||
fprintf(stderr, "Trying to create the context failed: %d", context_create_return);
|
||||
return(GETDNS_RETURN_GENERIC_ERROR);
|
||||
}
|
||||
|
||||
/* Set up the getdns_sync_request call */
|
||||
/* Get the A and AAAA records */
|
||||
this_extensions = getdns_dict_create();
|
||||
this_ret = getdns_dict_set_int(this_extensions, "return_both_v4_and_v6", GETDNS_EXTENSION_TRUE);
|
||||
if (this_ret != GETDNS_RETURN_GOOD)
|
||||
{
|
||||
fprintf(stderr, "Trying to set an extension do both IPv4 and IPv6 failed: %d", this_ret);
|
||||
return(GETDNS_RETURN_GENERIC_ERROR);
|
||||
}
|
||||
|
||||
/* Make the call */
|
||||
getdns_return_t dns_request_return = getdns_general_sync(this_context, this_name, this_request_type,
|
||||
this_extensions, &this_response_length, this_response);
|
||||
if (dns_request_return == GETDNS_RETURN_BAD_DOMAIN_NAME)
|
||||
{
|
||||
fprintf(stderr, "A bad domain name was used: %s. Exiting.", this_name);
|
||||
return(GETDNS_RETURN_GENERIC_ERROR);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Be sure the search returned something */
|
||||
this_ret = getdns_dict_get_int(this_response, "status", this_error); // Ignore any error
|
||||
if (this_error && (*this_error != GETDNS_RESPSTATUS_GOOD)) // If the search didn't return "good"
|
||||
{
|
||||
fprintf(stderr, "The search had no results, and a return value of %d. Exiting.", *this_error);
|
||||
return(GETDNS_RETURN_GENERIC_ERROR);
|
||||
}
|
||||
this_ret = getdns_dict_get_list(this_response, "just_address_answers", &just_the_addresses_ptr); // Ignore any error
|
||||
this_ret = getdns_list_get_length(just_the_addresses_ptr, num_addresses_ptr); // Ignore any error
|
||||
/* Go through each record */
|
||||
if (num_addresses_ptr) {
|
||||
for (rec_count = 0; rec_count <= *num_addresses_ptr; ++rec_count )
|
||||
{
|
||||
this_ret = getdns_list_get_dict(just_the_addresses_ptr, rec_count, &this_address); // Ignore any error
|
||||
/* Just print the address */
|
||||
this_ret = getdns_dict_get_bindata(this_address, "address_data", &this_address_data); // Ignore any error
|
||||
printf("The address is %s", getdns_display_ip_address(this_address_data));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Clean up */
|
||||
getdns_context_destroy(this_context);
|
||||
getdns_free_sync_request_memory(this_response);
|
||||
|
||||
exit(EXIT_SUCCESS);
|
||||
} /* main */
|
||||
|
||||
/* example-synchronous.c */
|
|
@ -1,138 +0,0 @@
|
|||
#include <stdio.h>
|
||||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <inttypes.h>
|
||||
#include <getdns_libevent.h>
|
||||
|
||||
#define UNUSED_PARAM(x) ((void)(x))
|
||||
|
||||
/* Set up the callback function, which will also do the processing of the results */
|
||||
void this_callbackfn(struct getdns_context_t *this_context,
|
||||
getdns_return_t this_callback_type,
|
||||
struct getdns_dict *this_response,
|
||||
void *this_userarg,
|
||||
getdns_transaction_t this_transaction_id)
|
||||
{
|
||||
UNUSED_PARAM(this_userarg); /* Not looking at the userarg for this example */
|
||||
UNUSED_PARAM(this_context); /* Not looking at the context for this example */
|
||||
getdns_return_t this_ret; /* Holder for all function returns */
|
||||
if (this_callback_type == GETDNS_CALLBACK_COMPLETE) /* This is a callback with data */
|
||||
{
|
||||
/* Be sure the search returned something */
|
||||
uint32_t * this_error = NULL;
|
||||
this_ret = getdns_dict_get_int(this_response, "status", this_error); // Ignore any error
|
||||
if (*this_error != GETDNS_RESPSTATUS_GOOD) // If the search didn't return "good"
|
||||
{
|
||||
fprintf(stderr, "The search had no results, and a return value of %d. Exiting.", *this_error);
|
||||
return;
|
||||
}
|
||||
/* Find all the answers returned */
|
||||
struct getdns_list * these_answers;
|
||||
this_ret = getdns_dict_get_list(this_response, "replies-tree", &these_answers);
|
||||
if (this_ret == GETDNS_RETURN_NO_SUCH_DICT_NAME)
|
||||
{
|
||||
fprintf(stderr, "Weird: the response had no error, but also no replies-tree. Exiting.");
|
||||
return;
|
||||
}
|
||||
size_t * num_answers_ptr = NULL;
|
||||
this_ret = getdns_list_get_length(these_answers, num_answers_ptr);
|
||||
/* Go through each answer */
|
||||
for ( size_t rec_count = 0; rec_count <= *num_answers_ptr; ++rec_count )
|
||||
{
|
||||
struct getdns_dict * this_record;
|
||||
this_ret = getdns_list_get_dict(these_answers, rec_count, &this_record); // Ignore any error
|
||||
/* Get the answer section */
|
||||
struct getdns_list * this_answer;
|
||||
this_ret = getdns_dict_get_list(this_record, "answer", &this_answer); // Ignore any error
|
||||
/* Get each RR in the answer section */
|
||||
size_t * num_rrs_ptr = NULL;
|
||||
this_ret = getdns_list_get_length(this_answer, num_rrs_ptr);
|
||||
for ( size_t rr_count = 0; rr_count <= *num_rrs_ptr; ++rr_count )
|
||||
{
|
||||
struct getdns_dict * this_rr = NULL;
|
||||
this_ret = getdns_list_get_dict(this_answer, rr_count, &this_rr); // Ignore any error
|
||||
/* Get the RDATA */
|
||||
struct getdns_dict * this_rdata = NULL;
|
||||
this_ret = getdns_dict_get_dict(this_rr, "rdata", &this_rdata); // Ignore any error
|
||||
/* Get the RDATA type */
|
||||
uint32_t * this_type = NULL;
|
||||
this_ret = getdns_dict_get_int(this_rdata, "type", this_type); // Ignore any error
|
||||
/* If it is type A or AAAA, print the value */
|
||||
if (*this_type == GETDNS_RRTYPE_A)
|
||||
{
|
||||
struct getdns_bindata * this_a_record = NULL;
|
||||
this_ret = getdns_dict_get_bindata(this_rdata, "ipv4_address", &this_a_record);
|
||||
if (this_ret == GETDNS_RETURN_NO_SUCH_DICT_NAME)
|
||||
{
|
||||
fprintf(stderr, "Weird: the A record at %d in record at %d had no address. Exiting.",
|
||||
(int) rr_count, (int) rec_count);
|
||||
return;
|
||||
}
|
||||
printf("The IPv4 address is %s", getdns_display_ip_address(this_a_record));
|
||||
}
|
||||
else if (*this_type == GETDNS_RRTYPE_AAAA)
|
||||
{
|
||||
struct getdns_bindata * this_aaaa_record = NULL;
|
||||
this_ret = getdns_dict_get_bindata(this_rdata, "ipv6_address", &this_aaaa_record);
|
||||
if (this_ret == GETDNS_RETURN_NO_SUCH_DICT_NAME)
|
||||
{
|
||||
fprintf(stderr, "Weird: the AAAA record at %d in record at %d had no address. Exiting.",
|
||||
(int) rr_count, (int) rec_count);
|
||||
return;
|
||||
}
|
||||
printf("The IPv6 address is %s", getdns_display_ip_address(this_aaaa_record));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else if (this_callback_type == GETDNS_CALLBACK_CANCEL)
|
||||
fprintf(stderr, "The callback with ID %"PRIu64" was cancelled. Exiting.", this_transaction_id);
|
||||
else
|
||||
fprintf(stderr, "The callback got a callback_type of %d. Exiting.", this_callback_type);
|
||||
}
|
||||
|
||||
int main()
|
||||
{
|
||||
/* Create the DNS context for this call */
|
||||
struct getdns_context_t *this_context = NULL;
|
||||
getdns_return_t context_create_return = getdns_context_create(&this_context, true);
|
||||
if (context_create_return != GETDNS_RETURN_GOOD)
|
||||
{
|
||||
fprintf(stderr, "Trying to create the context failed: %d", context_create_return);
|
||||
return(GETDNS_RETURN_GENERIC_ERROR);
|
||||
}
|
||||
/* Create an event base and put it in the context using the unknown function name */
|
||||
struct event_base *this_event_base;
|
||||
this_event_base = event_base_new();
|
||||
if (this_event_base == NULL)
|
||||
{
|
||||
fprintf(stderr, "Trying to create the event base failed.");
|
||||
return(GETDNS_RETURN_GENERIC_ERROR);
|
||||
}
|
||||
(void)getdns_extension_set_libevent_base(this_context, this_event_base);
|
||||
/* Set up the getdns call */
|
||||
const char * this_name = "www.example.com";
|
||||
char* this_userarg = "somestring"; // Could add things here to help identify this call
|
||||
getdns_transaction_t this_transaction_id = 0;
|
||||
|
||||
/* Make the call */
|
||||
getdns_return_t dns_request_return = getdns_address(this_context, this_name,
|
||||
NULL, this_userarg, &this_transaction_id, this_callbackfn);
|
||||
if (dns_request_return == GETDNS_RETURN_BAD_DOMAIN_NAME)
|
||||
{
|
||||
fprintf(stderr, "A bad domain name was used: %s. Exiting.", this_name);
|
||||
return(GETDNS_RETURN_GENERIC_ERROR);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Call the event loop */
|
||||
int dispatch_return = event_base_dispatch(this_event_base);
|
||||
UNUSED_PARAM(dispatch_return);
|
||||
// TODO: check the return value above
|
||||
}
|
||||
/* Clean up */
|
||||
getdns_context_destroy(this_context);
|
||||
/* Assuming we get here, leave gracefully */
|
||||
exit(EXIT_SUCCESS);
|
||||
}
|
Loading…
Reference in New Issue