From 51bfa9c86a5dd71000b8e32fa652f23864638050 Mon Sep 17 00:00:00 2001 From: Willem Toorop Date: Tue, 6 Oct 2015 11:57:18 +0200 Subject: [PATCH] Simple example rewritten --- spec/example/Makefile.in | 14 ++- spec/example/simple-concise.c | 113 ++++++++++++++++++++++++ spec/example/simple-json-pointer.c | 107 ++++++++++++++++++++++ spec/example/synchronous-json-pointer.c | 11 ++- 4 files changed, 237 insertions(+), 8 deletions(-) create mode 100644 spec/example/simple-concise.c create mode 100644 spec/example/simple-json-pointer.c diff --git a/spec/example/Makefile.in b/spec/example/Makefile.in index f43eb33c..1b45fc97 100644 --- a/spec/example/Makefile.in +++ b/spec/example/Makefile.in @@ -48,9 +48,9 @@ LDFLAGS=@LDFLAGS@ -L../../src LDLIBS=../../src/libgetdns.la @LIBS@ -OBJS=example-all-functions.lo example-simple-answers.lo example-tree.lo example-synchronous.lo example-reverse.lo synchronous-json-pointer.lo synchronous-concise.lo +OBJS=example-all-functions.lo example-simple-answers.lo example-tree.lo example-synchronous.lo example-reverse.lo synchronous-json-pointer.lo simple-json-pointer.lo -PROGRAMS=example-all-functions example-synchronous example-simple-answers example-tree example-reverse synchronous-json-pointer synchronous-concise +PROGRAMS=example-all-functions example-synchronous example-simple-answers example-tree example-reverse synchronous-json-pointer simple-json-pointer .SUFFIXES: .c .o .a .lo .h @@ -77,8 +77,8 @@ example-synchronous: example-synchronous.lo synchronous-json-pointer: synchronous-json-pointer.lo $(LIBTOOL) --tag=CC --mode=link $(CC) $(CFLAGS) $(LDFLAGS) $(LDLIBS) -o $@ synchronous-json-pointer.lo -synchronous-concise: synchronous-concise.lo - $(LIBTOOL) --tag=CC --mode=link $(CC) $(CFLAGS) $(LDFLAGS) $(LDLIBS) -o $@ synchronous-concise.lo +simple-json-pointer: simple-json-pointer.lo + $(LIBTOOL) --tag=CC --mode=link $(CC) $(CFLAGS) $(LDFLAGS) $(LDLIBS) $(EXTENSION_LIBEVENT_LIB) $(EXTENSION_LIBEVENT_LDFLAGS) $(EXTENSION_LIBEVENT_EXT_LIBS) -o $@ simple-json-pointer.lo $(EXTENSION_LIBEVENT_LIB): @echo "***" @@ -166,6 +166,12 @@ example-synchronous.lo example-synchronous.o: $(srcdir)/example-synchronous.c $( example-tree.lo example-tree.o: $(srcdir)/example-tree.c $(srcdir)/getdns_libevent.h ../../src/config.h \ ../../src/getdns/getdns.h $(srcdir)/../../src/getdns/getdns_ext_libevent.h \ $(srcdir)/../../src/getdns/getdns_extra.h +simple-concise.lo simple-concise.o: $(srcdir)/simple-concise.c $(srcdir)/getdns_libevent.h ../../src/config.h \ + ../../src/getdns/getdns.h $(srcdir)/../../src/getdns/getdns_ext_libevent.h \ + $(srcdir)/../../src/getdns/getdns_extra.h +simple-json-pointer.lo simple-json-pointer.o: $(srcdir)/simple-json-pointer.c $(srcdir)/getdns_libevent.h \ + ../../src/config.h ../../src/getdns/getdns.h \ + $(srcdir)/../../src/getdns/getdns_ext_libevent.h $(srcdir)/../../src/getdns/getdns_extra.h synchronous-concise.lo synchronous-concise.o: $(srcdir)/synchronous-concise.c $(srcdir)/getdns_core_only.h \ ../../src/getdns/getdns.h synchronous-json-pointer.lo synchronous-json-pointer.o: $(srcdir)/synchronous-json-pointer.c $(srcdir)/getdns_core_only.h \ diff --git a/spec/example/simple-concise.c b/spec/example/simple-concise.c new file mode 100644 index 00000000..54bcb449 --- /dev/null +++ b/spec/example/simple-concise.c @@ -0,0 +1,113 @@ +#include +#include +#include +#include + +/* Set up the callback function, which will also do the processing of the results */ +void callback(getdns_context *context, + getdns_callback_type_t callback_type, + getdns_dict *response, + void *userarg, + getdns_transaction_t transaction_id) +{ + getdns_return_t r; /* Holder for all function returns */ + uint32_t status; + getdns_list *just_address_answers; + size_t length, i; + + printf( "Callback for query \"%s\" with request ID %"PRIu64".\n" + , (char *)userarg, transaction_id ); + + switch(callback_type) { + case GETDNS_CALLBACK_CANCEL: + printf("Transaction with ID %"PRIu64" was cancelled.\n", transaction_id); + return; + case GETDNS_CALLBACK_TIMEOUT: + printf("Transaction with ID %"PRIu64" timed out.\n", transaction_id); + return; + case GETDNS_CALLBACK_ERROR: + printf("An error occurred for transaction ID %"PRIu64".\n", transaction_id); + return; + default: break; + } + assert( callback_type == GETDNS_CALLBACK_COMPLETE ); + + if ((r = getdns_dict_get_int(response, "status", &status))) + fprintf(stderr, "Could not get \"status\" from reponse"); + + else if (status != GETDNS_RESPSTATUS_GOOD) + fprintf(stderr, "The search had no results, and a return value of %"PRIu32".\n", status); + + else if ((r = getdns_dict_get_list(response, "just_address_answers", &just_address_answers))) + fprintf(stderr, "Could not get \"just_address_answers\" from reponse"); + + else if ((r = getdns_list_get_length(just_address_answers, &length))) + fprintf(stderr, "Could not get just_address_answers\' length"); + + else for (i = 0; i < length && r == GETDNS_RETURN_GOOD; i++) { + getdns_dict *address; + getdns_bindata *address_data; + char *address_str; + + if ((r = getdns_list_get_dict(just_address_answers, i, &address))) + fprintf(stderr, "Could not get address %zu from just_address_answers", i); + + else if ((r = getdns_dict_get_bindata(address, "address_data", &address_data))) + fprintf(stderr, "Could not get \"address_data\" from address"); + + else if (!(address_str = getdns_display_ip_address(address_data))) { + fprintf(stderr, "Could not convert address to string"); + r = GETDNS_RETURN_MEMORY_ERROR; + } + else { + printf("The address is %s\n", address_str); + free(address_str); + } + } + if (r) { + assert( r != GETDNS_RETURN_GOOD ); + fprintf(stderr, ": %d\n", r); + } + getdns_dict_destroy(response); +} + +int main() +{ + getdns_return_t r; /* Holder for all function returns */ + getdns_context *context = NULL; + struct event_base *event_base = NULL; + getdns_dict *extensions = NULL; + char *query_name = "www.example.com"; + /* Could add things here to help identify this call */ + char *userarg = query_name; + getdns_transaction_t transaction_id; + + if ((r = getdns_context_create(&context, 1))) + fprintf(stderr, "Trying to create the context failed"); + + else if (!(event_base = event_base_new())) + fprintf(stderr, "Trying to create the event base failed.\n"); + + else if ((r = getdns_extension_set_libevent_base(context, event_base))) + fprintf(stderr, "Setting the event base failed"); + + else if ((r = getdns_address( context, "www.example.com", extensions + , userarg, &transaction_id, callback))) + fprintf(stderr, "Error scheduling asynchronous request"); + + else { + printf("Request with transaction ID %"PRIu64" scheduled.\n", transaction_id); + if (event_base_dispatch(event_base) < 0) + fprintf(stderr, "Error dispatching events\n"); + } + + /* Clean up */ + if (event_base) + event_base_free(event_base); + + if (context) + getdns_context_destroy(context); + + /* Assuming we get here, leave gracefully */ + exit(EXIT_SUCCESS); +} diff --git a/spec/example/simple-json-pointer.c b/spec/example/simple-json-pointer.c new file mode 100644 index 00000000..ae3a611f --- /dev/null +++ b/spec/example/simple-json-pointer.c @@ -0,0 +1,107 @@ +#include +#include +#include +#include + +/* Set up the callback function, which will also do the processing of the results */ +void callback(getdns_context *context, + getdns_callback_type_t callback_type, + getdns_dict *response, + void *userarg, + getdns_transaction_t transaction_id) +{ + getdns_return_t r; /* Holder for all function returns */ + uint32_t status; + getdns_bindata *address_data; + char *first = NULL, *second = NULL; + + printf( "Callback for query \"%s\" with request ID %"PRIu64".\n" + , (char *)userarg, transaction_id ); + + switch(callback_type) { + case GETDNS_CALLBACK_CANCEL: + printf("Transaction with ID %"PRIu64" was cancelled.\n", transaction_id); + return; + case GETDNS_CALLBACK_TIMEOUT: + printf("Transaction with ID %"PRIu64" timed out.\n", transaction_id); + return; + case GETDNS_CALLBACK_ERROR: + printf("An error occurred for transaction ID %"PRIu64".\n", transaction_id); + return; + default: break; + } + assert( callback_type == GETDNS_CALLBACK_COMPLETE ); + + if ((r = getdns_dict_get_int(response, "status", &status))) + fprintf(stderr, "Could not get \"status\" from reponse"); + + else if (status != GETDNS_RESPSTATUS_GOOD) + fprintf(stderr, "The search had no results, and a return value of %"PRIu32".\n", status); + + else if ((r = getdns_dict_get_bindata(response, "/just_address_answers/0/address_data", &address_data))) + fprintf(stderr, "Could not get first address"); + + else if (!(first = getdns_display_ip_address(address_data))) + fprintf(stderr, "Could not convert first address to string\n"); + + else if ((r = getdns_dict_get_bindata(response, "/just_address_answers/1/address_data", &address_data))) + fprintf(stderr, "Could not get second address"); + + else if (!(second = getdns_display_ip_address(address_data))) + fprintf(stderr, "Could not convert second address to string\n"); + + if (first) { + printf("The address is %s\n", first); + free(first); + } + if (second) { + printf("The address is %s\n", second); + free(second); + } + if (r) { + assert( r != GETDNS_RETURN_GOOD ); + fprintf(stderr, ": %d\n", r); + } + getdns_dict_destroy(response); +} + +int main() +{ + getdns_return_t r; /* Holder for all function returns */ + getdns_context *context = NULL; + struct event_base *event_base = NULL; + getdns_dict *extensions = NULL; + char *query_name = "www.example.com"; + /* Could add things here to help identify this call */ + char *userarg = query_name; + getdns_transaction_t transaction_id; + + if ((r = getdns_context_create(&context, 1))) + fprintf(stderr, "Trying to create the context failed"); + + else if (!(event_base = event_base_new())) + fprintf(stderr, "Trying to create the event base failed.\n"); + + else if ((r = getdns_extension_set_libevent_base(context, event_base))) + fprintf(stderr, "Setting the event base failed"); + + else if ((r = getdns_address( context, "www.example.com", extensions + , userarg, &transaction_id, callback))) + fprintf(stderr, "Error scheduling asynchronous request"); + + else { + printf("Request with transaction ID %"PRIu64" scheduled.\n", transaction_id); + if (event_base_dispatch(event_base) < 0) + fprintf(stderr, "Error dispatching events\n"); + } + + /* Clean up */ + if (event_base) + event_base_free(event_base); + + if (context) + getdns_context_destroy(context); + + /* Assuming we get here, leave gracefully */ + exit(EXIT_SUCCESS); +} diff --git a/spec/example/synchronous-json-pointer.c b/spec/example/synchronous-json-pointer.c index 9f0f9465..d80182e7 100644 --- a/spec/example/synchronous-json-pointer.c +++ b/spec/example/synchronous-json-pointer.c @@ -1,9 +1,10 @@ #include +#include #include int main() { - getdns_return_t r; + getdns_return_t r; /* Holder for all function returns */ getdns_context *context = NULL; getdns_dict *response = NULL; getdns_bindata *address_data; @@ -43,11 +44,13 @@ int main() if (context) getdns_context_destroy(context); - /* Assuming we get here, leave gracefully */ if (r) { + assert( r != GETDNS_RETURN_GOOD ); + fprintf(stderr, ": %d\n", r); exit(EXIT_FAILURE); } - else - exit(EXIT_SUCCESS); + /* Assuming we get here, leave gracefully */ + exit(EXIT_SUCCESS); } +