diff --git a/spec/example/Makefile.in b/spec/example/Makefile.in index 6313c4b2..8d13de75 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 simple-json-pointer.lo tree-json-pointer.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 tree-json-pointer.lo reverse-json-pointer.lo -PROGRAMS=example-all-functions example-synchronous example-simple-answers example-tree example-reverse synchronous-json-pointer simple-json-pointer tree-json-pointer +PROGRAMS=example-all-functions example-synchronous example-simple-answers example-tree example-reverse synchronous-json-pointer simple-json-pointer tree-json-pointer reverse-json-pointer .SUFFIXES: .c .o .a .lo .h @@ -83,6 +83,9 @@ simple-json-pointer: simple-json-pointer.lo tree-json-pointer: tree-json-pointer.lo $(LIBTOOL) --tag=CC --mode=link $(CC) $(CFLAGS) $(LDFLAGS) $(LDLIBS) $(EXTENSION_LIBEVENT_LIB) $(EXTENSION_LIBEVENT_LDFLAGS) $(EXTENSION_LIBEVENT_EXT_LIBS) -o $@ tree-json-pointer.lo +reverse-json-pointer: reverse-json-pointer.lo + $(LIBTOOL) --tag=CC --mode=link $(CC) $(CFLAGS) $(LDFLAGS) $(LDLIBS) $(EXTENSION_LIBEVENT_LIB) $(EXTENSION_LIBEVENT_LDFLAGS) $(EXTENSION_LIBEVENT_EXT_LIBS) -o $@ reverse-json-pointer.lo + $(EXTENSION_LIBEVENT_LIB): @echo "***" @echo "*** Three examples from the specification need libevent." @@ -169,6 +172,9 @@ 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 +reverse-json-pointer.lo reverse-json-pointer.o: $(srcdir)/reverse-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 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 diff --git a/spec/example/reverse-json-pointer.c b/spec/example/reverse-json-pointer.c new file mode 100644 index 00000000..2b62b72f --- /dev/null +++ b/spec/example/reverse-json-pointer.c @@ -0,0 +1,110 @@ +#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 */ + getdns_list *answer; + size_t n_answers, i; + + 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_list(response, "/replies_tree/0/answer", &answer))) + fprintf(stderr, "Could not get \"answer\" section from first reply in the reponse"); + + else if ((r = getdns_list_get_length(answer, &n_answers))) + fprintf(stderr, "Could not get replies_tree\'s length"); + + else for (i = 0; i < n_answers && r == GETDNS_RETURN_GOOD; i++) { + getdns_dict *rr; + getdns_bindata *dname; + char *dname_str; + + if ((r = getdns_list_get_dict(answer, i, &rr))) + fprintf(stderr, "Could not get rr %zu from answer section", i); + + else if (getdns_dict_get_bindata(rr, "/rdata/ptrdname", &dname)) + continue; /* Not a PTR */ + + else if ((r = getdns_convert_dns_name_to_fqdn(dname, &dname_str))) + fprintf(stderr, "Could not convert PTR dname to string"); + + else { + printf("The dname is %s\n", dname_str); + free(dname_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_bindata address_type = { 4, (void *)"IPv4" }; + getdns_bindata address_data = { 4, (void *)"\x08\x08\x08\x08" }; + getdns_dict *address = NULL; + getdns_dict *extensions = NULL; + /* Could add things here to help identify this call */ + char *userarg = NULL; + 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 (!(address = getdns_dict_create())) + fprintf(stderr, "Could not create address dict.\n"); + + else if ((r = getdns_dict_set_bindata(address, "address_type", &address_type))) + fprintf(stderr, "Could not set address_type in address dict.\n"); + + else if ((r = getdns_dict_set_bindata(address, "address_data", &address_data))) + fprintf(stderr, "Could not set address_data in address dict.\n"); + + else if ((r = getdns_hostname( context, address, extensions + , userarg, &transaction_id, callback))) + fprintf(stderr, "Error scheduling asynchronous request"); + + else 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); +}