From 4230961e9fd92d558be6629d3f84f783a5e7a93e Mon Sep 17 00:00:00 2001 From: Willem Toorop Date: Tue, 1 Mar 2016 16:29:37 +0100 Subject: [PATCH] Basic usage of unbound pluggable event loop --- configure.ac | 17 +- spec/example/Makefile.in | 24 +-- src/Makefile.in | 219 +++++++++++-------------- src/context.c | 24 +-- src/context.h | 4 +- src/general.c | 8 +- src/test/Makefile.in | 96 ++++------- src/ub_loop.c | 341 +++++++++++++++++++++++++++++++++++++++ src/ub_loop.h | 70 ++++++++ 9 files changed, 581 insertions(+), 222 deletions(-) create mode 100644 src/ub_loop.c create mode 100644 src/ub_loop.h diff --git a/configure.ac b/configure.ac index 21f5a32a..1d4d24db 100644 --- a/configure.ac +++ b/configure.ac @@ -526,15 +526,14 @@ fi if test $my_with_libunbound = 1 then + AC_CHECK_HEADERS([unbound-event.h],,, [AC_INCLUDES_DEFAULT]) AC_MSG_NOTICE([Checking for dependency libunbound]) AC_CHECK_LIB([unbound], [ub_fd], [ AC_DEFINE_UNQUOTED([HAVE_LIBUNBOUND], [1], [Define to 1 if you have the `unbound' library (-lunbound).]) LIBS="-lunbound $LIBS" - AC_CHECK_HEADER([unbound-event.h],[ - AC_CHECK_FUNC([ub_event_get_version], [ - AC_DEFINE_UNQUOTED([HAVE_UNBOUND_EVENT_API], [1], [Define this when libunbound is compiled with the --enable-event-api option.]) - ]) - ],,[AC_INCLUDES_DEFAULT]) + AC_CHECK_FUNC([ub_ctx_create_ub_event], [ + AC_DEFINE_UNQUOTED([HAVE_UNBOUND_EVENT_API], [1], [Define this when libunbound is compiled with the --enable-event-api option.]) + ]) ], [found_all_libs=0]) fi @@ -1202,8 +1201,14 @@ const char *inet_ntop(int af, const void *src, char *dst, size_t size); #ifdef HAVE_LIBUNBOUND # include -# ifdef HAVE_UNBOUND_EVENT_API +# ifdef HAVE_UNBOUND_EVENT_H # include +# else +struct ub_event_base; +struct ub_ctx* ub_ctx_create_ub_event(struct ub_event_base* base); +typedef void (*ub_event_callback_t)(void*, int, void*, int, int, char*); +int ub_resolve_event(struct ub_ctx* ctx, const char* name, int rrtype, + int rrclass, void* mydata, ub_event_callback_t callback, int* async_id); # endif #endif ]) diff --git a/spec/example/Makefile.in b/spec/example/Makefile.in index 8ff7f2d1..7bf5e016 100644 --- a/spec/example/Makefile.in +++ b/spec/example/Makefile.in @@ -149,24 +149,16 @@ depend: # Dependencies for the examples example-all-functions.lo example-all-functions.o: $(srcdir)/example-all-functions.c $(srcdir)/getdns_libevent.h \ - ../../src/config.h \ - ../../src/getdns/getdns.h \ - $(srcdir)/../../src/getdns/getdns_ext_libevent.h \ - ../../src/getdns/getdns_extra.h -example-reverse.lo example-reverse.o: $(srcdir)/example-reverse.c $(srcdir)/getdns_libevent.h \ - ../../src/config.h \ - ../../src/getdns/getdns.h \ - $(srcdir)/../../src/getdns/getdns_ext_libevent.h \ + ../../src/config.h ../../src/getdns/getdns.h \ + $(srcdir)/../../src/getdns/getdns_ext_libevent.h ../../src/getdns/getdns_extra.h +example-reverse.lo example-reverse.o: $(srcdir)/example-reverse.c $(srcdir)/getdns_libevent.h ../../src/config.h \ + ../../src/getdns/getdns.h $(srcdir)/../../src/getdns/getdns_ext_libevent.h \ ../../src/getdns/getdns_extra.h example-simple-answers.lo example-simple-answers.o: $(srcdir)/example-simple-answers.c $(srcdir)/getdns_libevent.h \ - ../../src/config.h \ - ../../src/getdns/getdns.h \ - $(srcdir)/../../src/getdns/getdns_ext_libevent.h \ - ../../src/getdns/getdns_extra.h + ../../src/config.h ../../src/getdns/getdns.h \ + $(srcdir)/../../src/getdns/getdns_ext_libevent.h ../../src/getdns/getdns_extra.h example-synchronous.lo example-synchronous.o: $(srcdir)/example-synchronous.c $(srcdir)/getdns_core_only.h \ ../../src/getdns/getdns.h -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 \ +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 \ ../../src/getdns/getdns_extra.h diff --git a/src/Makefile.in b/src/Makefile.in index f51a0ab4..ad04c7f6 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -65,7 +65,7 @@ C99COMPATFLAGS=@C99COMPATFLAGS@ GETDNS_OBJ=const-info.lo convert.lo dict.lo dnssec.lo general.lo \ list.lo request-internal.lo pubkey-pinning.lo rr-dict.lo \ - rr-iter.lo stub.lo sync.lo util-internal.lo + rr-iter.lo stub.lo sync.lo ub_loop.lo util-internal.lo GLDNS_OBJ=keyraw.lo gbuffer.lo wire2str.lo parse.lo parseutil.lo rrdef.lo \ str2wire.lo @@ -225,136 +225,107 @@ depend: FORCE: # Dependencies for gldns, utils, the extensions and compat functions -const-info.lo const-info.o: $(srcdir)/const-info.c getdns/getdns.h \ - getdns/getdns_extra.h $(srcdir)/const-info.h -context.lo context.o: $(srcdir)/context.c config.h $(srcdir)/debug.h \ - $(srcdir)/gldns/str2wire.h $(srcdir)/gldns/rrdef.h $(srcdir)/gldns/wire2str.h $(srcdir)/context.h \ - getdns/getdns.h \ - getdns/getdns_extra.h $(srcdir)/types-internal.h \ - $(srcdir)/util/rbtree.h $(srcdir)/extension/default_eventloop.h $(srcdir)/util-internal.h $(srcdir)/rr-iter.h \ - $(srcdir)/rr-dict.h $(srcdir)/gldns/gbuffer.h $(srcdir)/gldns/pkthdr.h $(srcdir)/dnssec.h $(srcdir)/stub.h $(srcdir)/list.h $(srcdir)/dict.h \ - $(srcdir)/pubkey-pinning.h -convert.lo convert.o: $(srcdir)/convert.c config.h \ - getdns/getdns.h \ - getdns/getdns_extra.h $(srcdir)/util-internal.h \ - $(srcdir)/context.h $(srcdir)/types-internal.h $(srcdir)/util/rbtree.h $(srcdir)/extension/default_eventloop.h \ +const-info.lo const-info.o: $(srcdir)/const-info.c getdns/getdns.h getdns/getdns_extra.h \ + getdns/getdns.h $(srcdir)/const-info.h +context.lo context.o: $(srcdir)/context.c config.h $(srcdir)/debug.h $(srcdir)/gldns/str2wire.h $(srcdir)/gldns/rrdef.h \ + $(srcdir)/gldns/wire2str.h $(srcdir)/context.h getdns/getdns.h getdns/getdns_extra.h \ + getdns/getdns.h $(srcdir)/types-internal.h $(srcdir)/util/rbtree.h \ + $(srcdir)/extension/default_eventloop.h config.h getdns/getdns_extra.h $(srcdir)/ub_loop.h \ + $(srcdir)/util-internal.h $(srcdir)/rr-iter.h $(srcdir)/rr-dict.h $(srcdir)/gldns/gbuffer.h $(srcdir)/gldns/pkthdr.h \ + $(srcdir)/dnssec.h $(srcdir)/stub.h $(srcdir)/list.h $(srcdir)/dict.h $(srcdir)/pubkey-pinning.h +convert.lo convert.o: $(srcdir)/convert.c config.h getdns/getdns.h getdns/getdns_extra.h \ + getdns/getdns.h $(srcdir)/util-internal.h $(srcdir)/context.h $(srcdir)/types-internal.h $(srcdir)/util/rbtree.h \ + $(srcdir)/extension/default_eventloop.h config.h getdns/getdns_extra.h $(srcdir)/ub_loop.h \ $(srcdir)/rr-iter.h $(srcdir)/rr-dict.h $(srcdir)/gldns/gbuffer.h $(srcdir)/gldns/pkthdr.h $(srcdir)/gldns/wire2str.h \ $(srcdir)/gldns/str2wire.h $(srcdir)/gldns/rrdef.h $(srcdir)/dict.h $(srcdir)/list.h $(srcdir)/convert.h -dict.lo dict.o: $(srcdir)/dict.c config.h $(srcdir)/types-internal.h \ - getdns/getdns.h \ - getdns/getdns_extra.h $(srcdir)/util/rbtree.h \ - $(srcdir)/util-internal.h $(srcdir)/context.h $(srcdir)/extension/default_eventloop.h $(srcdir)/rr-iter.h \ - $(srcdir)/rr-dict.h $(srcdir)/gldns/gbuffer.h $(srcdir)/gldns/pkthdr.h $(srcdir)/dict.h $(srcdir)/list.h $(srcdir)/const-info.h \ - $(srcdir)/gldns/wire2str.h -dnssec.lo dnssec.o: $(srcdir)/dnssec.c config.h $(srcdir)/debug.h \ - getdns/getdns.h $(srcdir)/context.h \ - getdns/getdns_extra.h $(srcdir)/types-internal.h \ - $(srcdir)/util/rbtree.h $(srcdir)/extension/default_eventloop.h $(srcdir)/util-internal.h $(srcdir)/rr-iter.h \ - $(srcdir)/rr-dict.h $(srcdir)/gldns/gbuffer.h $(srcdir)/gldns/pkthdr.h $(srcdir)/dnssec.h $(srcdir)/gldns/str2wire.h \ - $(srcdir)/gldns/rrdef.h $(srcdir)/gldns/wire2str.h $(srcdir)/gldns/keyraw.h $(srcdir)/gldns/parseutil.h \ - $(srcdir)/general.h $(srcdir)/dict.h $(srcdir)/list.h $(srcdir)/util/val_secalgo.h -general.lo general.o: $(srcdir)/general.c config.h $(srcdir)/general.h \ - getdns/getdns.h $(srcdir)/types-internal.h \ - getdns/getdns_extra.h $(srcdir)/util/rbtree.h \ - $(srcdir)/gldns/wire2str.h $(srcdir)/context.h $(srcdir)/extension/default_eventloop.h $(srcdir)/util-internal.h \ - $(srcdir)/rr-iter.h $(srcdir)/rr-dict.h $(srcdir)/gldns/gbuffer.h $(srcdir)/gldns/pkthdr.h $(srcdir)/dnssec.h $(srcdir)/stub.h \ - $(srcdir)/dict.h -list.lo list.o: $(srcdir)/list.c $(srcdir)/types-internal.h \ - getdns/getdns.h \ - getdns/getdns_extra.h $(srcdir)/util/rbtree.h \ - $(srcdir)/util-internal.h config.h $(srcdir)/context.h \ - $(srcdir)/extension/default_eventloop.h $(srcdir)/rr-iter.h $(srcdir)/rr-dict.h $(srcdir)/gldns/gbuffer.h \ - $(srcdir)/gldns/pkthdr.h $(srcdir)/list.h $(srcdir)/dict.h -pubkey-pinning.lo pubkey-pinning.o: $(srcdir)/pubkey-pinning.c config.h \ - $(srcdir)/debug.h getdns/getdns.h $(srcdir)/context.h \ - getdns/getdns_extra.h $(srcdir)/types-internal.h \ - $(srcdir)/util/rbtree.h $(srcdir)/extension/default_eventloop.h -request-internal.lo request-internal.o: $(srcdir)/request-internal.c \ - config.h $(srcdir)/types-internal.h \ - getdns/getdns.h \ - getdns/getdns_extra.h $(srcdir)/util/rbtree.h \ - $(srcdir)/util-internal.h $(srcdir)/context.h $(srcdir)/extension/default_eventloop.h $(srcdir)/rr-iter.h \ - $(srcdir)/rr-dict.h $(srcdir)/gldns/gbuffer.h $(srcdir)/gldns/pkthdr.h $(srcdir)/gldns/rrdef.h $(srcdir)/gldns/str2wire.h \ - $(srcdir)/gldns/rrdef.h $(srcdir)/dict.h $(srcdir)/debug.h -rr-dict.lo rr-dict.o: $(srcdir)/rr-dict.c $(srcdir)/rr-dict.h config.h \ - getdns/getdns.h $(srcdir)/gldns/gbuffer.h \ - $(srcdir)/util-internal.h $(srcdir)/context.h \ - getdns/getdns_extra.h $(srcdir)/types-internal.h \ - $(srcdir)/util/rbtree.h $(srcdir)/extension/default_eventloop.h $(srcdir)/rr-iter.h $(srcdir)/gldns/pkthdr.h \ - $(srcdir)/dict.h -rr-iter.lo rr-iter.o: $(srcdir)/rr-iter.c $(srcdir)/rr-iter.h \ - getdns/getdns.h $(srcdir)/rr-dict.h \ - config.h $(srcdir)/gldns/gbuffer.h $(srcdir)/gldns/pkthdr.h \ - $(srcdir)/gldns/rrdef.h -stub.lo stub.o: $(srcdir)/stub.c config.h $(srcdir)/debug.h $(srcdir)/stub.h \ - getdns/getdns.h $(srcdir)/types-internal.h \ - getdns/getdns_extra.h $(srcdir)/util/rbtree.h \ - $(srcdir)/gldns/gbuffer.h $(srcdir)/gldns/pkthdr.h $(srcdir)/gldns/rrdef.h $(srcdir)/gldns/str2wire.h \ - $(srcdir)/gldns/rrdef.h $(srcdir)/gldns/wire2str.h $(srcdir)/rr-iter.h $(srcdir)/rr-dict.h $(srcdir)/context.h \ - $(srcdir)/extension/default_eventloop.h $(srcdir)/util-internal.h $(srcdir)/general.h $(srcdir)/pubkey-pinning.h -sync.lo sync.o: $(srcdir)/sync.c getdns/getdns.h \ - config.h $(srcdir)/context.h \ - getdns/getdns_extra.h $(srcdir)/types-internal.h \ - $(srcdir)/util/rbtree.h $(srcdir)/extension/default_eventloop.h $(srcdir)/general.h $(srcdir)/util-internal.h \ - $(srcdir)/rr-iter.h $(srcdir)/rr-dict.h $(srcdir)/gldns/gbuffer.h $(srcdir)/gldns/pkthdr.h $(srcdir)/dnssec.h $(srcdir)/stub.h \ - $(srcdir)/gldns/wire2str.h -util-internal.lo util-internal.o: $(srcdir)/util-internal.c config.h \ - getdns/getdns.h $(srcdir)/dict.h $(srcdir)/util/rbtree.h \ - $(srcdir)/types-internal.h getdns/getdns_extra.h \ - $(srcdir)/list.h $(srcdir)/util-internal.h $(srcdir)/context.h $(srcdir)/extension/default_eventloop.h $(srcdir)/rr-iter.h \ - $(srcdir)/rr-dict.h $(srcdir)/gldns/gbuffer.h $(srcdir)/gldns/pkthdr.h $(srcdir)/gldns/str2wire.h $(srcdir)/gldns/rrdef.h -gbuffer.lo gbuffer.o: $(srcdir)/gldns/gbuffer.c config.h \ +dict.lo dict.o: $(srcdir)/dict.c config.h $(srcdir)/types-internal.h getdns/getdns.h \ + getdns/getdns_extra.h getdns/getdns.h $(srcdir)/util/rbtree.h $(srcdir)/util-internal.h \ + $(srcdir)/context.h $(srcdir)/extension/default_eventloop.h config.h getdns/getdns_extra.h \ + $(srcdir)/ub_loop.h $(srcdir)/rr-iter.h $(srcdir)/rr-dict.h $(srcdir)/gldns/gbuffer.h $(srcdir)/gldns/pkthdr.h $(srcdir)/dict.h \ + $(srcdir)/list.h $(srcdir)/const-info.h $(srcdir)/gldns/wire2str.h +dnssec.lo dnssec.o: $(srcdir)/dnssec.c config.h $(srcdir)/debug.h getdns/getdns.h $(srcdir)/context.h \ + getdns/getdns_extra.h getdns/getdns.h $(srcdir)/types-internal.h $(srcdir)/util/rbtree.h \ + $(srcdir)/extension/default_eventloop.h config.h getdns/getdns_extra.h $(srcdir)/ub_loop.h \ + $(srcdir)/util-internal.h $(srcdir)/rr-iter.h $(srcdir)/rr-dict.h $(srcdir)/gldns/gbuffer.h $(srcdir)/gldns/pkthdr.h \ + $(srcdir)/dnssec.h $(srcdir)/gldns/str2wire.h $(srcdir)/gldns/rrdef.h $(srcdir)/gldns/wire2str.h $(srcdir)/gldns/keyraw.h \ + $(srcdir)/gldns/parseutil.h $(srcdir)/general.h $(srcdir)/dict.h $(srcdir)/list.h $(srcdir)/util/val_secalgo.h +general.lo general.o: $(srcdir)/general.c config.h $(srcdir)/general.h getdns/getdns.h $(srcdir)/types-internal.h \ + getdns/getdns_extra.h getdns/getdns.h $(srcdir)/util/rbtree.h $(srcdir)/gldns/wire2str.h \ + $(srcdir)/context.h $(srcdir)/extension/default_eventloop.h config.h getdns/getdns_extra.h \ + $(srcdir)/ub_loop.h $(srcdir)/util-internal.h $(srcdir)/rr-iter.h $(srcdir)/rr-dict.h $(srcdir)/gldns/gbuffer.h \ + $(srcdir)/gldns/pkthdr.h $(srcdir)/dnssec.h $(srcdir)/stub.h $(srcdir)/dict.h +list.lo list.o: $(srcdir)/list.c $(srcdir)/types-internal.h getdns/getdns.h getdns/getdns_extra.h \ + getdns/getdns.h $(srcdir)/util/rbtree.h $(srcdir)/util-internal.h config.h $(srcdir)/context.h \ + $(srcdir)/extension/default_eventloop.h config.h getdns/getdns_extra.h $(srcdir)/ub_loop.h \ + $(srcdir)/rr-iter.h $(srcdir)/rr-dict.h $(srcdir)/gldns/gbuffer.h $(srcdir)/gldns/pkthdr.h $(srcdir)/list.h $(srcdir)/dict.h +pubkey-pinning.lo pubkey-pinning.o: $(srcdir)/pubkey-pinning.c config.h $(srcdir)/debug.h getdns/getdns.h \ + $(srcdir)/context.h getdns/getdns.h getdns/getdns_extra.h $(srcdir)/types-internal.h \ + $(srcdir)/util/rbtree.h $(srcdir)/extension/default_eventloop.h config.h \ + getdns/getdns_extra.h $(srcdir)/ub_loop.h +request-internal.lo request-internal.o: $(srcdir)/request-internal.c config.h $(srcdir)/types-internal.h \ + getdns/getdns.h getdns/getdns_extra.h getdns/getdns.h $(srcdir)/util/rbtree.h \ + $(srcdir)/util-internal.h $(srcdir)/context.h $(srcdir)/extension/default_eventloop.h config.h \ + getdns/getdns_extra.h $(srcdir)/ub_loop.h $(srcdir)/rr-iter.h $(srcdir)/rr-dict.h $(srcdir)/gldns/gbuffer.h \ + $(srcdir)/gldns/pkthdr.h $(srcdir)/gldns/rrdef.h $(srcdir)/gldns/str2wire.h $(srcdir)/gldns/rrdef.h $(srcdir)/dict.h \ + $(srcdir)/debug.h +rr-dict.lo rr-dict.o: $(srcdir)/rr-dict.c $(srcdir)/rr-dict.h config.h getdns/getdns.h $(srcdir)/gldns/gbuffer.h \ + $(srcdir)/util-internal.h $(srcdir)/context.h getdns/getdns_extra.h getdns/getdns.h \ + $(srcdir)/types-internal.h $(srcdir)/util/rbtree.h $(srcdir)/extension/default_eventloop.h config.h \ + getdns/getdns_extra.h $(srcdir)/ub_loop.h $(srcdir)/rr-iter.h $(srcdir)/gldns/pkthdr.h $(srcdir)/dict.h +rr-iter.lo rr-iter.o: $(srcdir)/rr-iter.c $(srcdir)/rr-iter.h getdns/getdns.h $(srcdir)/rr-dict.h config.h \ + $(srcdir)/gldns/gbuffer.h $(srcdir)/gldns/pkthdr.h $(srcdir)/gldns/rrdef.h +stub.lo stub.o: $(srcdir)/stub.c config.h $(srcdir)/debug.h $(srcdir)/stub.h getdns/getdns.h $(srcdir)/types-internal.h \ + getdns/getdns_extra.h getdns/getdns.h $(srcdir)/util/rbtree.h $(srcdir)/gldns/gbuffer.h \ + $(srcdir)/gldns/pkthdr.h $(srcdir)/gldns/rrdef.h $(srcdir)/gldns/str2wire.h $(srcdir)/gldns/rrdef.h \ + $(srcdir)/gldns/wire2str.h $(srcdir)/rr-iter.h $(srcdir)/rr-dict.h $(srcdir)/context.h \ + $(srcdir)/extension/default_eventloop.h config.h getdns/getdns_extra.h $(srcdir)/ub_loop.h \ + $(srcdir)/util-internal.h $(srcdir)/general.h $(srcdir)/pubkey-pinning.h +sync.lo sync.o: $(srcdir)/sync.c config.h getdns/getdns.h getdns/getdns_extra.h \ + getdns/getdns.h +ub_loop.lo ub_loop.o: $(srcdir)/ub_loop.c $(srcdir)/ub_loop.h config.h getdns/getdns.h \ + getdns/getdns_extra.h getdns/getdns.h $(srcdir)/types-internal.h $(srcdir)/util/rbtree.h +util-internal.lo util-internal.o: $(srcdir)/util-internal.c config.h getdns/getdns.h $(srcdir)/dict.h \ + $(srcdir)/util/rbtree.h $(srcdir)/types-internal.h getdns/getdns_extra.h getdns/getdns.h \ + $(srcdir)/list.h $(srcdir)/util-internal.h $(srcdir)/context.h $(srcdir)/extension/default_eventloop.h config.h \ + getdns/getdns_extra.h $(srcdir)/ub_loop.h $(srcdir)/rr-iter.h $(srcdir)/rr-dict.h $(srcdir)/gldns/gbuffer.h \ + $(srcdir)/gldns/pkthdr.h $(srcdir)/gldns/str2wire.h $(srcdir)/gldns/rrdef.h +version.lo version.o: version.c +gbuffer.lo gbuffer.o: $(srcdir)/gldns/gbuffer.c config.h $(srcdir)/gldns/gbuffer.h +keyraw.lo keyraw.o: $(srcdir)/gldns/keyraw.c config.h $(srcdir)/gldns/keyraw.h $(srcdir)/gldns/rrdef.h +parse.lo parse.o: $(srcdir)/gldns/parse.c config.h $(srcdir)/gldns/parse.h $(srcdir)/gldns/parseutil.h \ $(srcdir)/gldns/gbuffer.h -keyraw.lo keyraw.o: $(srcdir)/gldns/keyraw.c config.h \ - $(srcdir)/gldns/keyraw.h $(srcdir)/gldns/rrdef.h -parse.lo parse.o: $(srcdir)/gldns/parse.c config.h \ - $(srcdir)/gldns/parse.h $(srcdir)/gldns/parseutil.h $(srcdir)/gldns/gbuffer.h -parseutil.lo parseutil.o: $(srcdir)/gldns/parseutil.c config.h \ - $(srcdir)/gldns/parseutil.h -rrdef.lo rrdef.o: $(srcdir)/gldns/rrdef.c config.h \ - $(srcdir)/gldns/rrdef.h $(srcdir)/gldns/parseutil.h -str2wire.lo str2wire.o: $(srcdir)/gldns/str2wire.c config.h \ - $(srcdir)/gldns/str2wire.h $(srcdir)/gldns/rrdef.h $(srcdir)/gldns/wire2str.h $(srcdir)/gldns/gbuffer.h \ - $(srcdir)/gldns/parse.h $(srcdir)/gldns/parseutil.h -wire2str.lo wire2str.o: $(srcdir)/gldns/wire2str.c config.h \ - $(srcdir)/gldns/wire2str.h $(srcdir)/gldns/str2wire.h $(srcdir)/gldns/rrdef.h $(srcdir)/gldns/pkthdr.h \ - $(srcdir)/gldns/parseutil.h $(srcdir)/gldns/gbuffer.h $(srcdir)/gldns/keyraw.h +parseutil.lo parseutil.o: $(srcdir)/gldns/parseutil.c config.h $(srcdir)/gldns/parseutil.h +rrdef.lo rrdef.o: $(srcdir)/gldns/rrdef.c config.h $(srcdir)/gldns/rrdef.h $(srcdir)/gldns/parseutil.h +str2wire.lo str2wire.o: $(srcdir)/gldns/str2wire.c config.h $(srcdir)/gldns/str2wire.h $(srcdir)/gldns/rrdef.h \ + $(srcdir)/gldns/wire2str.h $(srcdir)/gldns/gbuffer.h $(srcdir)/gldns/parse.h $(srcdir)/gldns/parseutil.h +wire2str.lo wire2str.o: $(srcdir)/gldns/wire2str.c config.h $(srcdir)/gldns/wire2str.h $(srcdir)/gldns/str2wire.h \ + $(srcdir)/gldns/rrdef.h $(srcdir)/gldns/pkthdr.h $(srcdir)/gldns/parseutil.h $(srcdir)/gldns/gbuffer.h \ + $(srcdir)/gldns/keyraw.h arc4_lock.lo arc4_lock.o: $(srcdir)/compat/arc4_lock.c config.h -arc4random.lo arc4random.o: $(srcdir)/compat/arc4random.c config.h \ - $(srcdir)/compat/chacha_private.h -arc4random_uniform.lo arc4random_uniform.o: $(srcdir)/compat/arc4random_uniform.c \ - config.h -explicit_bzero.lo explicit_bzero.o: $(srcdir)/compat/explicit_bzero.c \ - config.h -getentropy_linux.lo getentropy_linux.o: $(srcdir)/compat/getentropy_linux.c \ - config.h -getentropy_osx.lo getentropy_osx.o: $(srcdir)/compat/getentropy_osx.c \ - config.h -getentropy_solaris.lo getentropy_solaris.o: $(srcdir)/compat/getentropy_solaris.c \ - config.h +arc4random.lo arc4random.o: $(srcdir)/compat/arc4random.c config.h $(srcdir)/compat/chacha_private.h +arc4random_uniform.lo arc4random_uniform.o: $(srcdir)/compat/arc4random_uniform.c config.h +explicit_bzero.lo explicit_bzero.o: $(srcdir)/compat/explicit_bzero.c config.h +getentropy_linux.lo getentropy_linux.o: $(srcdir)/compat/getentropy_linux.c config.h +getentropy_osx.lo getentropy_osx.o: $(srcdir)/compat/getentropy_osx.c config.h +getentropy_solaris.lo getentropy_solaris.o: $(srcdir)/compat/getentropy_solaris.c config.h getentropy_win.lo getentropy_win.o: $(srcdir)/compat/getentropy_win.c inet_ntop.lo inet_ntop.o: $(srcdir)/compat/inet_ntop.c config.h inet_pton.lo inet_pton.o: $(srcdir)/compat/inet_pton.c config.h sha512.lo sha512.o: $(srcdir)/compat/sha512.c config.h strlcpy.lo strlcpy.o: $(srcdir)/compat/strlcpy.c config.h -rbtree.lo rbtree.o: $(srcdir)/util/rbtree.c config.h $(srcdir)/util/log.h \ - $(srcdir)/debug.h $(srcdir)/util/fptr_wlist.h $(srcdir)/util/rbtree.h -val_secalgo.lo val_secalgo.o: $(srcdir)/util/val_secalgo.c config.h \ - $(srcdir)/util/val_secalgo.h $(srcdir)/util/log.h $(srcdir)/debug.h $(srcdir)/gldns/rrdef.h $(srcdir)/gldns/keyraw.h \ - $(srcdir)/gldns/gbuffer.h +rbtree.lo rbtree.o: $(srcdir)/util/rbtree.c config.h $(srcdir)/util/log.h $(srcdir)/debug.h config.h \ + $(srcdir)/util/fptr_wlist.h $(srcdir)/util/rbtree.h +val_secalgo.lo val_secalgo.o: $(srcdir)/util/val_secalgo.c config.h $(srcdir)/util/val_secalgo.h $(srcdir)/util/log.h \ + $(srcdir)/debug.h config.h $(srcdir)/gldns/rrdef.h $(srcdir)/gldns/keyraw.h $(srcdir)/gldns/gbuffer.h default_eventloop.lo default_eventloop.o: $(srcdir)/extension/default_eventloop.c \ - $(srcdir)/extension/default_eventloop.h config.h \ - getdns/getdns.h \ - getdns/getdns_extra.h $(srcdir)/debug.h -libev.lo libev.o: $(srcdir)/extension/libev.c config.h \ - $(srcdir)/types-internal.h getdns/getdns.h \ - getdns/getdns_extra.h $(srcdir)/util/rbtree.h \ - $(srcdir)/getdns/getdns_ext_libev.h -libevent.lo libevent.o: $(srcdir)/extension/libevent.c config.h \ - $(srcdir)/types-internal.h getdns/getdns.h \ - getdns/getdns_extra.h $(srcdir)/util/rbtree.h \ - $(srcdir)/getdns/getdns_ext_libevent.h -libuv.lo libuv.o: $(srcdir)/extension/libuv.c config.h $(srcdir)/debug.h \ - $(srcdir)/types-internal.h getdns/getdns.h \ - getdns/getdns_extra.h $(srcdir)/util/rbtree.h \ - $(srcdir)/getdns/getdns_ext_libuv.h + $(srcdir)/extension/default_eventloop.h config.h getdns/getdns.h \ + getdns/getdns_extra.h $(srcdir)/debug.h config.h +libev.lo libev.o: $(srcdir)/extension/libev.c config.h $(srcdir)/types-internal.h getdns/getdns.h \ + getdns/getdns_extra.h getdns/getdns.h $(srcdir)/util/rbtree.h \ + $(srcdir)/getdns/getdns_ext_libev.h getdns/getdns_extra.h +libevent.lo libevent.o: $(srcdir)/extension/libevent.c config.h $(srcdir)/types-internal.h \ + getdns/getdns.h getdns/getdns_extra.h getdns/getdns.h $(srcdir)/util/rbtree.h \ + $(srcdir)/getdns/getdns_ext_libevent.h getdns/getdns_extra.h +libuv.lo libuv.o: $(srcdir)/extension/libuv.c config.h $(srcdir)/debug.h config.h $(srcdir)/types-internal.h \ + getdns/getdns.h getdns/getdns_extra.h getdns/getdns.h $(srcdir)/util/rbtree.h \ + $(srcdir)/getdns/getdns_ext_libuv.h getdns/getdns_extra.h diff --git a/src/context.c b/src/context.c index 342ac485..784a966f 100644 --- a/src/context.c +++ b/src/context.c @@ -63,6 +63,9 @@ typedef unsigned short in_port_t; #include #include "config.h" +#ifdef HAVE_LIBUNBOUND +#include +#endif #include "debug.h" #include "gldns/str2wire.h" #include "gldns/wire2str.h" @@ -1372,7 +1375,7 @@ getdns_context_request_count_changed(getdns_context *context) &context->ub_event, context->ub_event.ev); #ifndef USE_WINSOCK #ifdef HAVE_UNBOUND_EVENT_API - if (!context->unbound_event_api) + if (!_getdns_ub_loop_enabled(&context->ub_loop)) #endif context->extension->vmt->schedule( context->extension, ub_fd(context->unbound_ctx), @@ -1386,7 +1389,7 @@ getdns_context_request_count_changed(getdns_context *context) #ifndef USE_WINSOCK #ifdef HAVE_UNBOUND_EVENT_API - if (!context->unbound_event_api) + if (!_getdns_ub_loop_enabled(&context->ub_loop)) #endif context->extension->vmt->clear( context->extension, &context->ub_event); @@ -1421,10 +1424,9 @@ rebuild_ub_ctx(struct getdns_context* context) { } /* setup */ #ifdef HAVE_UNBOUND_EVENT_API - context->unbound_event_api = - strncmp(ub_event_get_version(), "getdns-event", 12) == 0; - if (context->unbound_event_api) { - context->unbound_ctx = ub_ctx_create_event((void *)context->extension); + _getdns_ub_loop_init(&context->ub_loop, &context->mf, context->extension); + if (_getdns_ub_loop_enabled(&context->ub_loop)) { + context->unbound_ctx = ub_ctx_create_ub_event(&context->ub_loop.super); } else { #endif context->unbound_ctx = ub_ctx_create(); @@ -3006,9 +3008,8 @@ getdns_context_detach_eventloop(struct getdns_context* context) context->extension = &context->default_eventloop.loop; _getdns_default_eventloop_init(&context->default_eventloop); #ifdef HAVE_UNBOUND_EVENT_API - if (context->unbound_event_api) - (void) ub_ctx_set_event( - context->unbound_ctx, (void *)context->extension); + if (_getdns_ub_loop_enabled(&context->ub_loop)) + context->ub_loop.extension = context->extension; #endif return GETDNS_RETURN_GOOD; } @@ -3025,9 +3026,8 @@ getdns_context_set_eventloop(getdns_context* context, getdns_eventloop* loop) } context->extension = loop; #ifdef HAVE_UNBOUND_EVENT_API - if (context->unbound_event_api) - (void) ub_ctx_set_event( - context->unbound_ctx, (void *)context->extension); + if (_getdns_ub_loop_enabled(&context->ub_loop)) + context->ub_loop.extension = loop; #endif return GETDNS_RETURN_GOOD; } diff --git a/src/context.h b/src/context.h index 2ba134f9..d3bff070 100644 --- a/src/context.h +++ b/src/context.h @@ -43,6 +43,7 @@ #include "types-internal.h" #include "extension/default_eventloop.h" #include "util/rbtree.h" +#include "ub_loop.h" struct getdns_dns_req; struct ub_ctx; @@ -221,10 +222,9 @@ struct getdns_context { struct ub_ctx *unbound_ctx; int unbound_ta_set; #ifdef HAVE_UNBOUND_EVENT_API - int unbound_event_api; + _getdns_ub_loop ub_loop; #endif #endif - /* A tree to hold local host information*/ _getdns_rbtree_t local_hosts; diff --git a/src/general.c b/src/general.c index 43cd8724..f5f1abf1 100644 --- a/src/general.c +++ b/src/general.c @@ -39,6 +39,12 @@ #include #include "config.h" #include "general.h" +#ifdef HAVE_LIBUNBOUND +#include +#endif +#ifdef HAVE_UNBOUND_EVENT_API +#include "ub_loop.h" +#endif #include "gldns/wire2str.h" #include "context.h" #include "types-internal.h" @@ -342,7 +348,7 @@ _getdns_submit_netreq(getdns_network_req *netreq) #ifdef HAVE_LIBUNBOUND #ifdef HAVE_UNBOUND_EVENT_API - if (dns_req->context->unbound_event_api) + if (_getdns_ub_loop_enabled(&dns_req->context->ub_loop)) return ub_resolve_event(dns_req->context->unbound_ctx, name, netreq->request_type, netreq->owner->request_class, netreq, ub_resolve_event_callback, &(netreq->unbound_id)) ? diff --git a/src/test/Makefile.in b/src/test/Makefile.in index b2c6c22d..016b9e22 100644 --- a/src/test/Makefile.in +++ b/src/test/Makefile.in @@ -232,24 +232,21 @@ depend: .PHONY: clean test # Dependencies for the unit tests -check_getdns.lo check_getdns.o: $(srcdir)/check_getdns.c \ - ../getdns/getdns.h \ - $(srcdir)/check_getdns_common.h \ - ../getdns/getdns_extra.h \ - $(srcdir)/check_getdns_general.h $(srcdir)/check_getdns_general_sync.h \ - $(srcdir)/check_getdns_address.h $(srcdir)/check_getdns_address_sync.h \ - $(srcdir)/check_getdns_hostname.h $(srcdir)/check_getdns_hostname_sync.h \ - $(srcdir)/check_getdns_context_create.h $(srcdir)/check_getdns_context_destroy.h \ - $(srcdir)/check_getdns_cancel_callback.h $(srcdir)/check_getdns_list_get_length.h \ - $(srcdir)/check_getdns_list_get_data_type.h $(srcdir)/check_getdns_list_get_dict.h \ - $(srcdir)/check_getdns_list_get_list.h $(srcdir)/check_getdns_list_get_int.h \ - $(srcdir)/check_getdns_list_get_bindata.h $(srcdir)/check_getdns_dict_get_names.h \ - $(srcdir)/check_getdns_dict_get_data_type.h $(srcdir)/check_getdns_dict_get_dict.h \ - $(srcdir)/check_getdns_dict_get_list.h $(srcdir)/check_getdns_dict_get_bindata.h \ - $(srcdir)/check_getdns_dict_get_int.h $(srcdir)/check_getdns_dict_destroy.h \ - $(srcdir)/check_getdns_dict_set_dict.h $(srcdir)/check_getdns_dict_set_list.h \ - $(srcdir)/check_getdns_dict_set_bindata.h $(srcdir)/check_getdns_dict_set_int.h \ - $(srcdir)/check_getdns_convert_ulabel_to_alabel.h \ +check_getdns.lo check_getdns.o: $(srcdir)/check_getdns.c ../getdns/getdns.h $(srcdir)/check_getdns_common.h \ + ../getdns/getdns_extra.h $(srcdir)/check_getdns_general.h \ + $(srcdir)/check_getdns_general_sync.h $(srcdir)/check_getdns_address.h \ + $(srcdir)/check_getdns_address_sync.h $(srcdir)/check_getdns_hostname.h \ + $(srcdir)/check_getdns_hostname_sync.h $(srcdir)/check_getdns_context_create.h \ + $(srcdir)/check_getdns_context_destroy.h $(srcdir)/check_getdns_cancel_callback.h \ + $(srcdir)/check_getdns_list_get_length.h $(srcdir)/check_getdns_list_get_data_type.h \ + $(srcdir)/check_getdns_list_get_dict.h $(srcdir)/check_getdns_list_get_list.h \ + $(srcdir)/check_getdns_list_get_int.h $(srcdir)/check_getdns_list_get_bindata.h \ + $(srcdir)/check_getdns_dict_get_names.h $(srcdir)/check_getdns_dict_get_data_type.h \ + $(srcdir)/check_getdns_dict_get_dict.h $(srcdir)/check_getdns_dict_get_list.h \ + $(srcdir)/check_getdns_dict_get_bindata.h $(srcdir)/check_getdns_dict_get_int.h \ + $(srcdir)/check_getdns_dict_destroy.h $(srcdir)/check_getdns_dict_set_dict.h \ + $(srcdir)/check_getdns_dict_set_list.h $(srcdir)/check_getdns_dict_set_bindata.h \ + $(srcdir)/check_getdns_dict_set_int.h $(srcdir)/check_getdns_convert_ulabel_to_alabel.h \ $(srcdir)/check_getdns_convert_alabel_to_ulabel.h $(srcdir)/check_getdns_pretty_print_dict.h \ $(srcdir)/check_getdns_display_ip_address.h \ $(srcdir)/check_getdns_context_set_context_update_callback.h \ @@ -257,59 +254,36 @@ check_getdns.lo check_getdns.o: $(srcdir)/check_getdns.c \ $(srcdir)/check_getdns_context_set_upstream_recursive_servers.h \ $(srcdir)/check_getdns_service.h $(srcdir)/check_getdns_service_sync.h \ $(srcdir)/check_getdns_transport.h -check_getdns_common.lo check_getdns_common.o: $(srcdir)/check_getdns_common.c \ - ../getdns/getdns.h \ - ../config.h $(srcdir)/check_getdns_common.h \ - ../getdns/getdns_extra.h \ +check_getdns_common.lo check_getdns_common.o: $(srcdir)/check_getdns_common.c ../getdns/getdns.h \ + ../config.h $(srcdir)/check_getdns_common.h ../getdns/getdns_extra.h \ $(srcdir)/check_getdns_eventloop.h check_getdns_context_set_timeout.lo check_getdns_context_set_timeout.o: $(srcdir)/check_getdns_context_set_timeout.c \ $(srcdir)/check_getdns_context_set_timeout.h $(srcdir)/check_getdns_common.h \ - ../getdns/getdns.h \ - ../getdns/getdns_extra.h + ../getdns/getdns.h ../getdns/getdns_extra.h check_getdns_libev.lo check_getdns_libev.o: $(srcdir)/check_getdns_libev.c $(srcdir)/check_getdns_eventloop.h \ - ../config.h \ - ../getdns/getdns.h \ - $(srcdir)/../getdns/getdns_ext_libev.h \ - ../getdns/getdns_extra.h \ - $(srcdir)/check_getdns_common.h + ../config.h ../getdns/getdns.h $(srcdir)/../getdns/getdns_ext_libev.h \ + ../getdns/getdns_extra.h $(srcdir)/check_getdns_common.h check_getdns_libevent.lo check_getdns_libevent.o: $(srcdir)/check_getdns_libevent.c $(srcdir)/check_getdns_eventloop.h \ - ../config.h \ - ../getdns/getdns.h \ - $(srcdir)/../getdns/getdns_ext_libevent.h \ - ../getdns/getdns_extra.h \ - $(srcdir)/check_getdns_libevent.h $(srcdir)/check_getdns_common.h + ../config.h ../getdns/getdns.h $(srcdir)/../getdns/getdns_ext_libevent.h \ + ../getdns/getdns_extra.h $(srcdir)/check_getdns_libevent.h $(srcdir)/check_getdns_common.h check_getdns_libuv.lo check_getdns_libuv.o: $(srcdir)/check_getdns_libuv.c $(srcdir)/check_getdns_eventloop.h \ - ../config.h \ - ../getdns/getdns.h \ - $(srcdir)/../getdns/getdns_ext_libuv.h \ - ../getdns/getdns_extra.h \ - $(srcdir)/check_getdns_common.h + ../config.h ../getdns/getdns.h $(srcdir)/../getdns/getdns_ext_libuv.h \ + ../getdns/getdns_extra.h $(srcdir)/check_getdns_common.h check_getdns_selectloop.lo check_getdns_selectloop.o: $(srcdir)/check_getdns_selectloop.c \ - $(srcdir)/check_getdns_eventloop.h ../config.h \ - ../getdns/getdns.h \ + $(srcdir)/check_getdns_eventloop.h ../config.h ../getdns/getdns.h \ ../getdns/getdns_extra.h check_getdns_transport.lo check_getdns_transport.o: $(srcdir)/check_getdns_transport.c \ - $(srcdir)/check_getdns_transport.h $(srcdir)/check_getdns_common.h \ - ../getdns/getdns.h \ + $(srcdir)/check_getdns_transport.h $(srcdir)/check_getdns_common.h ../getdns/getdns.h \ ../getdns/getdns_extra.h -getdns_query.lo getdns_query.o: $(srcdir)/getdns_query.c \ - ../config.h $(srcdir)/../debug.h \ - ../getdns/getdns.h \ - ../getdns/getdns_extra.h -scratchpad.template.lo scratchpad.template.o: scratchpad.template.c \ - ../getdns/getdns.h \ +getdns_query.lo getdns_query.o: $(srcdir)/getdns_query.c ../config.h $(srcdir)/../debug.h ../config.h \ + ../getdns/getdns.h ../getdns/getdns_extra.h +scratchpad.template.lo scratchpad.template.o: scratchpad.template.c ../getdns/getdns.h \ ../getdns/getdns_extra.h testmessages.lo testmessages.o: $(srcdir)/testmessages.c $(srcdir)/testmessages.h -tests_dict.lo tests_dict.o: $(srcdir)/tests_dict.c $(srcdir)/testmessages.h \ - ../getdns/getdns.h -tests_list.lo tests_list.o: $(srcdir)/tests_list.c $(srcdir)/testmessages.h \ - ../getdns/getdns.h -tests_namespaces.lo tests_namespaces.o: $(srcdir)/tests_namespaces.c $(srcdir)/testmessages.h \ - ../getdns/getdns.h -tests_stub_async.lo tests_stub_async.o: $(srcdir)/tests_stub_async.c \ - ../config.h $(srcdir)/testmessages.h \ - ../getdns/getdns.h \ - ../getdns/getdns_extra.h -tests_stub_sync.lo tests_stub_sync.o: $(srcdir)/tests_stub_sync.c $(srcdir)/testmessages.h \ - ../getdns/getdns.h \ +tests_dict.lo tests_dict.o: $(srcdir)/tests_dict.c $(srcdir)/testmessages.h ../getdns/getdns.h +tests_list.lo tests_list.o: $(srcdir)/tests_list.c $(srcdir)/testmessages.h ../getdns/getdns.h +tests_namespaces.lo tests_namespaces.o: $(srcdir)/tests_namespaces.c $(srcdir)/testmessages.h ../getdns/getdns.h +tests_stub_async.lo tests_stub_async.o: $(srcdir)/tests_stub_async.c ../config.h $(srcdir)/testmessages.h \ + ../getdns/getdns.h ../getdns/getdns_extra.h +tests_stub_sync.lo tests_stub_sync.o: $(srcdir)/tests_stub_sync.c $(srcdir)/testmessages.h ../getdns/getdns.h \ ../getdns/getdns_extra.h diff --git a/src/ub_loop.c b/src/ub_loop.c new file mode 100644 index 00000000..ee02986a --- /dev/null +++ b/src/ub_loop.c @@ -0,0 +1,341 @@ +/** + * + * \file ub_loop.c + * @brief Interface to the unbound pluggable event API + * + * These routines are not intended to be used by applications calling into + * the library. + * + */ + +/* + * Copyright (c) 2013, NLnet Labs, Verisign, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the names of the copyright holders nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL Verisign, Inc. BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "ub_loop.h" +#ifdef HAVE_UNBOUND_EVENT_API + +#ifndef HAVE_UNBOUND_EVENT_H +/** event timeout */ +#define UB_EV_TIMEOUT 0x01 +/** event fd readable */ +#define UB_EV_READ 0x02 +/** event fd writable */ +#define UB_EV_WRITE 0x04 +/** event signal */ +#define UB_EV_SIGNAL 0x08 +/** event must persist */ +#define UB_EV_PERSIST 0x10 + +struct ub_event_base_vmt { + void (*event_base_free)(struct ub_event_base*); + int (*event_base_dispatch)(struct ub_event_base*); + int (*event_base_loopexit)(struct ub_event_base*, struct timeval*); + struct ub_event* (*event_new)(struct ub_event_base*, + int fd, short bits, void (*cb)(int, short, void*), void* arg); + struct ub_event* (*signal_new)(struct ub_event_base*, int fd, + void (*cb)(int, short, void*), void* arg); + struct ub_event* (*winsock_register_wsaevent)(struct ub_event_base*, + void* wsaevent, void (*cb)(int, short, void*), void* arg); +}; + +struct ub_event_vmt { + void (*event_add_bits)(struct ub_event*, short); + void (*event_del_bits)(struct ub_event*, short); + void (*event_set_fd)(struct ub_event*, int); + void (*event_free)(struct ub_event*); + int (*event_add)(struct ub_event*, struct timeval*); + int (*event_del)(struct ub_event*); + int (*timer_add)(struct ub_event*, struct ub_event_base*, + void (*cb)(int, short, void*), void* arg, struct timeval*); + int (*timer_del)(struct ub_event*); + int (*signal_add)(struct ub_event*, struct timeval*); + int (*signal_del)(struct ub_event*); + void (*winsock_unregister_wsaevent)(struct ub_event* ev); + void (*winsock_tcp_wouldblock)(struct ub_event*, int eventbit); +}; + +struct ub_event { + struct ub_event_vmt* vmt; +}; +#endif + +typedef struct my_event { + struct ub_event super; + /** event in the getdns event loop */ + getdns_eventloop_event gev; + /** is event already added */ + int added; + + /** event loop it belongs to */ + _getdns_ub_loop *loop; + /** fd to poll or -1 for timeouts. signal number for sigs. */ + int fd; + /** what events this event is interested in, see EV_.. above. */ + short bits; + /** timeout value */ + uint64_t timeout; + /** callback to call: fd, eventbits, userarg */ + void (*cb)(int, short, void *arg); + /** callback user arg */ + void *arg; +} my_event; + +#define AS_UB_LOOP(x) \ + (((union {struct ub_event_base* a; _getdns_ub_loop* b;})x).b) +#define AS_MY_EVENT(x) \ + (((union {struct ub_event* a; my_event* b;})x).b) + +static void my_event_base_free(struct ub_event_base* base) +{ + (void)base; + return; +} + +static int my_event_base_dispatch(struct ub_event_base* base) +{ + (void)base; + /* We don't run the pluggable event base ourselfs */ + return -1; +} + +static int my_event_base_loopexit(struct ub_event_base* base, struct timeval* tv) +{ + (void)tv; + AS_UB_LOOP(base)->running = 0; + return 0; +} + +#define CLEAR_MY_EVENT(ev) \ + do { (ev)->loop->extension->vmt->clear((ev)->loop->extension, \ + &(ev)->gev); (ev)->added = 0; } while(0) + +#define SCHEDULE_MY_EVENT(ev) \ + do { if ((ev)->gev.read_cb||(ev)->gev.write_cb||(ev)->gev.timeout_cb){\ + (ev)->loop->extension->vmt->schedule((ev)->loop->extension, \ + (ev)->fd, (uint64_t)-1, &(ev)->gev); (ev)->added=1; }}while(0) + +static void read_cb(void *userarg) +{ + struct my_event *ev = (struct my_event *)userarg; + (*ev->cb)(ev->fd, UB_EV_READ, ev->arg); + if ((ev->bits & UB_EV_PERSIST) == 0) + CLEAR_MY_EVENT(ev); +} + +static void write_cb(void *userarg) +{ + struct my_event *ev = (struct my_event *)userarg; + (*ev->cb)(ev->fd, UB_EV_WRITE, ev->arg); + if ((ev->bits & UB_EV_PERSIST) == 0) + CLEAR_MY_EVENT(ev); +} + +static void timeout_cb(void *userarg) +{ + struct my_event *ev = (struct my_event *)userarg; + (*ev->cb)(ev->fd, UB_EV_TIMEOUT, ev->arg); + if ((ev->bits & UB_EV_PERSIST) == 0) + CLEAR_MY_EVENT(ev); +} + +static void set_gev_callbacks(my_event* ev, short bits) +{ + int added = ev->added; + + if (ev->bits != bits) { + if (added) + CLEAR_MY_EVENT(ev); + + ev->gev.read_cb = bits & UB_EV_READ ? read_cb : NULL; + ev->gev.write_cb = bits & UB_EV_WRITE ? write_cb : NULL; + ev->gev.timeout_cb = bits & UB_EV_TIMEOUT ? timeout_cb : NULL; + ev->bits = bits; + + if (added) + SCHEDULE_MY_EVENT(ev); + } +} + +static void my_event_add_bits(struct ub_event* ev, short bits) +{ + set_gev_callbacks(AS_MY_EVENT(ev), AS_MY_EVENT(ev)->bits | bits); +} + +static void my_event_del_bits(struct ub_event* ev, short bits) +{ + set_gev_callbacks(AS_MY_EVENT(ev), AS_MY_EVENT(ev)->bits & ~bits); +} + +static void my_event_set_fd(struct ub_event* ub_ev, int fd) +{ + my_event *ev = AS_MY_EVENT(ub_ev); + + if (ev->fd != fd) { + if (ev->added) { + CLEAR_MY_EVENT(ev); + ev->fd = fd; + SCHEDULE_MY_EVENT(ev); + } else + ev->fd = fd; + } +} + +static void my_event_free(struct ub_event* ev) +{ + GETDNS_FREE(AS_MY_EVENT(ev)->loop->mf, ev); +} + +static int my_event_del(struct ub_event* ev) +{ + if (AS_MY_EVENT(ev)->added) + CLEAR_MY_EVENT(AS_MY_EVENT(ev)); + return 0; +} + +static int my_event_add(struct ub_event* ev, struct timeval* tv) +{ + if (AS_MY_EVENT(ev)->added) + my_event_del(ev); + if (tv && (AS_MY_EVENT(ev)->bits & UB_EV_TIMEOUT) != 0) + AS_MY_EVENT(ev)->timeout = (tv->tv_sec * 1000) + (tv->tv_usec / 1000); + SCHEDULE_MY_EVENT(AS_MY_EVENT(ev)); + return 0; +} + +static int my_timer_add(struct ub_event* ub_ev, struct ub_event_base* base, + void (*cb)(int, short, void*), void* arg, struct timeval* tv) +{ + my_event *ev = AS_MY_EVENT(ub_ev); + + if (!base || !cb || !tv || AS_UB_LOOP(base) != ev->loop) + return -1; + + if (ev->added) + CLEAR_MY_EVENT(ev); + + ev->cb = cb; + ev->arg = arg; + return my_event_add(ub_ev, tv); +} + +static int my_timer_del(struct ub_event* ev) +{ + return my_event_del(ev); +} + + +static int my_signal_add(struct ub_event* ub_ev, struct timeval* tv) +{ + return -1; +} + +static int my_signal_del(struct ub_event* ub_ev) +{ + return -1; +} + +static void my_winsock_unregister_wsaevent(struct ub_event* ev) +{ + (void)ev; +} + +static void my_winsock_tcp_wouldblock(struct ub_event* ev, int bits) +{ + (void)ev; (void)bits; +} + +static struct ub_event* my_event_new(struct ub_event_base* base, int fd, + short bits, void (*cb)(int, short, void*), void* arg) +{ + static struct ub_event_vmt vmt = { + my_event_add_bits, + my_event_del_bits, + my_event_set_fd, + my_event_free, + my_event_add, + my_event_del, + my_timer_add, + my_timer_del, + my_signal_add, + my_signal_del, + my_winsock_unregister_wsaevent, + my_winsock_tcp_wouldblock + }; + my_event *ev; + + if (!base || !cb) + return NULL; + + ev = GETDNS_MALLOC(AS_UB_LOOP(base)->mf, my_event); + ev->super.vmt = &vmt; + ev->loop = AS_UB_LOOP(base); + ev->added = 0; + ev->fd = fd; + ev->bits = bits; + ev->timeout = (uint64_t)-1; + ev->cb = cb; + ev->arg = arg; + ev->gev.userarg = ev; + ev->gev.read_cb = bits & UB_EV_READ ? read_cb : NULL; + ev->gev.write_cb = bits & UB_EV_WRITE ? write_cb : NULL; + ev->gev.timeout_cb = bits & UB_EV_TIMEOUT ? timeout_cb : NULL; + return &ev->super; +} + +static struct ub_event* my_signal_new(struct ub_event_base* base, int fd, + void (*cb)(int, short, void*), void* arg) +{ + return my_event_new(base, fd, UB_EV_SIGNAL | UB_EV_PERSIST, cb, arg); +} + +static struct ub_event* my_winsock_register_wsaevent(struct ub_event_base *b, + void* wsaevent, void (*cb)(int, short, void*), void* arg) +{ + /* Not applicable, because in unbound used for tubes only */ + (void)b; (void)wsaevent; (void)cb; (void)arg; + return NULL; +} + +void _getdns_ub_loop_init(_getdns_ub_loop *loop, struct mem_funcs *mf, getdns_eventloop *extension) +{ + static struct ub_event_base_vmt vmt = { + my_event_base_free, + my_event_base_dispatch, + my_event_base_loopexit, + my_event_new, + my_signal_new, + my_winsock_register_wsaevent + }; + + loop->super.vmt = &vmt; + loop->mf = *mf; + loop->extension = extension; + loop->running = 1; +} + +#endif +/* ub_loop.c */ diff --git a/src/ub_loop.h b/src/ub_loop.h new file mode 100644 index 00000000..abc2e773 --- /dev/null +++ b/src/ub_loop.h @@ -0,0 +1,70 @@ +/** + * + * \file ub_loop.h + * /brief Interface for the pluggable unbound event API + * + */ + +/* + * Copyright (c) 2015, NLnet Labs, Verisign, Inc. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * * Neither the names of the copyright holders nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL Verisign, Inc. BE LIABLE FOR ANY + * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef UB_LOOP_H +#define UB_LOOP_H + +#include "config.h" +#ifdef HAVE_UNBOUND_EVENT_API +#include "getdns/getdns.h" +#include "getdns/getdns_extra.h" +#include "types-internal.h" + +#ifndef HAVE_UNBOUND_EVENT_H +struct ub_event_base_vmt; +struct ub_event_base { + struct ub_event_base_vmt* vmt; +}; +struct ub_event_base; +struct ub_ctx* ub_ctx_create_ub_event(struct ub_event_base* base); +typedef void (*ub_event_callback_t)(void*, int, void*, int, int, char*); +int ub_resolve_event(struct ub_ctx* ctx, const char* name, int rrtype, + int rrclass, void* mydata, ub_event_callback_t callback, int* async_id); +#endif + +typedef struct _getdns_ub_loop { + struct ub_event_base super; + struct mem_funcs mf; + getdns_eventloop *extension; + int running; +} _getdns_ub_loop; + +void _getdns_ub_loop_init(_getdns_ub_loop *loop, struct mem_funcs *mf, getdns_eventloop *extension); + +inline static int _getdns_ub_loop_enabled(_getdns_ub_loop *loop) +{ return loop->super.vmt ? 1 : 0; } + +#endif /* HAVE_UNBOUND_EVENT_API */ +#endif +/* ub_loop.h */