]> code.citadel.org Git - citadel.git/blobdiff - citadel/modules/c-ares-dns/serv_c-ares-dns.c
libev/c-ares migration: unstack out ouf c-ares before querying new requests
[citadel.git] / citadel / modules / c-ares-dns / serv_c-ares-dns.c
index 6c1be1f167a9ed3bb701a5c0b2fac9c98579352c..de124f64b2191c4776785dcad3cfc42e2c447ee1 100644 (file)
@@ -218,24 +218,38 @@ void QueryCb(void *arg,
        IO->DNSStatus = status;
        if (status == ARES_SUCCESS)
                IO->DNS_CB(arg, abuf, alen);
+       else
+               IO->DNSStatus = status;
 ///    ev_io_stop(event_base, &IO->dns_io_event);
-               
-       IO->PostDNS(IO);
+       
+       ev_timer_init(&IO->unwind_stack_timeout,
+                     IO_postdns_callback, 0.0, 0);
+       IO->unwind_stack_timeout.data = IO;
+       ev_timer_start(event_base, &IO->unwind_stack_timeout);
 }
 
-int QueueQuery(ns_type Type, char *name, AsyncIO *IO, IO_CallBack PostDNS)
+void QueryCbDone(AsyncIO *IO)
 {
-       int length, family;
-       char address_b[sizeof(struct in6_addr)];
-       int optmask = 0;
+       ev_timer_stop(event_base, &IO->unwind_stack_timeout);
+}
+
 
+void InitC_ares_dns(AsyncIO *IO)
+{
+       int optmask = 0;
        if (IO->DNSChannel == NULL) {
                optmask |= ARES_OPT_SOCK_STATE_CB;
                IO->DNSOptions.sock_state_cb = SockStateCb;
                IO->DNSOptions.sock_state_cb_data = IO;
                ares_init_options(&IO->DNSChannel, &IO->DNSOptions, optmask);
        }
+}
+int QueueQuery(ns_type Type, char *name, AsyncIO *IO, IO_CallBack PostDNS)
+{
+       int length, family;
+       char address_b[sizeof(struct in6_addr)];
 
+       InitC_ares_dns(IO);
        IO->PostDNS = PostDNS;
        switch(Type) {
        case ns_t_a: