- if (h_errno == HOST_NOT_FOUND) {
- debug("host not found: %s", hostname);
- return RBL_NOTFOUND;
+ debug("asynchronous request done, %s FOUND", result->qname);
+ *context->result = RBL_FOUND;
+ }
+ if (context->call != NULL) {
+ context->call(context->result, context->data);
+ }
+ ub_resolve_free(result);
+ rbl_context_release(context);
+}
+
+static int rbl_handler(client_t *event, void *config)
+{
+ int retval = 0;
+ debug("rbl_handler called: ub_fd triggered");
+ client_io_none(event);
+ if ((retval = ub_process(ctx)) != 0) {
+ err("error in DNS resolution: %s", ub_strerror(retval));
+ }
+ client_io_ro(event);
+ return 0;
+}
+
+static inline bool rbl_dns_check(const char *hostname, rbl_result_t *result,
+ rbl_result_callback_t callback, void *data)
+{
+ if (ctx == NULL) {
+ ctx = ub_ctx_create();
+ ub_ctx_async(ctx, true);
+ if ((async_event = client_register(ub_fd(ctx), rbl_handler, NULL)) == NULL) {
+ crit("cannot register asynchronous DNS event handler");
+ abort();