+ IO->DNS.Query->DNSStatus = 0;
+}
+
+static void
+DNStimeouttrigger_callback(struct ev_loop *loop, ev_timer *watcher, int revents)
+{
+ AsyncIO *IO = watcher->data;
+ struct timeval tv, MaxTV;
+ struct timeval *NextTV;
+
+ memset(&MaxTV, 0, sizeof(MaxTV));
+ memset(&tv, 0, sizeof(tv));
+ MaxTV.tv_sec = 30;
+ NextTV = ares_timeout(IO->DNS.Channel, &MaxTV, &tv);
+
+ if ((NextTV->tv_sec != MaxTV.tv_sec) ||
+ (NextTV->tv_usec != MaxTV.tv_usec))
+ {
+ fd_set readers, writers;
+#ifdef DEBUG_CARES
+ EV_syslog(LOG_DEBUG, "C-ARES: %s Timeout!\n", __FUNCTION__);
+#endif
+ FD_ZERO(&readers);
+ FD_ZERO(&writers);
+ ares_fds(IO->DNS.Channel, &readers, &writers);
+ ares_process(IO->DNS.Channel, &readers, &writers);
+ }
+}
+
+void QueueGetHostByNameDone(void *Ctx,
+ int status,
+ int timeouts,
+ struct hostent *hostent)
+{
+ AsyncIO *IO = (AsyncIO *) Ctx;
+#ifdef DEBUG_CARES
+ EV_syslog(LOG_DEBUG, "C-ARES: %s\n", __FUNCTION__);
+#endif
+
+ IO->DNS.Query->DNSStatus = status;
+ IO->DNS.Query->VParsedDNSReply = hostent;
+ IO->DNS.Query->DNSReplyFree = (FreeDNSReply) ares_free_hostent;
+
+ ev_idle_init(&IO->unwind_stack,
+ IO_postdns_callback);
+ IO->unwind_stack.data = IO;
+ EV_DNS_LOGT_INIT(unwind_stack);
+ EV_DNS_LOGT_START(unwind_stack);
+ ev_idle_start(event_base, &IO->unwind_stack);
+ ev_timer_stop (event_base, &IO->DNS.timeout);
+}
+
+void QueueGetHostByName(AsyncIO *IO,
+ const char *Hostname,
+ DNSQueryParts *QueryParts,
+ IO_CallBack PostDNS)
+{
+#ifdef DEBUG_CARES
+ EV_syslog(LOG_DEBUG, "C-ARES: %s\n", __FUNCTION__);
+ IO->DNS.SourcePort = 0;
+#endif
+
+ IO->DNS.Query = QueryParts;
+ IO->DNS.Query->PostDNS = PostDNS;
+
+ InitC_ares_dns(IO);
+
+ ev_timer_init(&IO->DNS.timeout, DNStimeouttrigger_callback, 10, 1);
+ EV_DNS_LOGT_INIT(DNS.timeout);
+ IO->DNS.timeout.data = IO;
+ ares_gethostbyname(IO->DNS.Channel,
+ Hostname,
+ AF_INET6, /* it falls back to ipv4 in doubt... */
+ QueueGetHostByNameDone,
+ IO);
+ EV_DNS_LOGT_START(DNS.timeout);
+ ev_timer_start(event_base, &IO->DNS.timeout);
+