X-Git-Url: https://code.citadel.org/?a=blobdiff_plain;f=citadel%2Fmodules%2Fc-ares-dns%2Fserv_c-ares-dns.c;h=a06e2e5a18b3242f1cd0355f9447b062e4ea785d;hb=271924aeff4c786b31ec293ab48c861f7fe77bd0;hp=642abb26068a8053a81cb76e15cbfcb9edcffc0c;hpb=5268c0a9bf8202336b9e3e8b86f45d9d010f2811;p=citadel.git diff --git a/citadel/modules/c-ares-dns/serv_c-ares-dns.c b/citadel/modules/c-ares-dns/serv_c-ares-dns.c index 642abb260..a06e2e5a1 100644 --- a/citadel/modules/c-ares-dns/serv_c-ares-dns.c +++ b/citadel/modules/c-ares-dns/serv_c-ares-dns.c @@ -1,19 +1,19 @@ /* - * Copyright (c) 1998-2009 by the citadel.org team + * Copyright (c) 1998-2012 by the citadel.org team * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. + * This program is open source software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 3. + * + * * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + * + * * * Inspired by NodeJS.org; thanks for the MX-Parser ;-) */ @@ -57,6 +57,7 @@ #include "ctdl_module.h" #include "event_client.h" +int DebugCAres = 0; extern struct ev_loop *event_base; @@ -64,14 +65,15 @@ void SockStateCb(void *data, int sock, int read, int write); static void HostByAddrCb(void *data, - int status, - int timeouts, - struct hostent *hostent) + int status, + int timeouts, + struct hostent *hostent) { AsyncIO *IO = data; -#ifdef DEBUG_CARES - EV_syslog(LOG_DEBUG, "C-ARES: %s\n", __FUNCTION__); -#endif + + EV_DNS_syslog(LOG_DEBUG, "C-ARES: %s\n", __FUNCTION__); + + EV_DNS_LOGT_STOP(DNS.timeout); ev_timer_stop (event_base, &IO->DNS.timeout); IO->DNS.Query->DNSStatus = status; @@ -80,23 +82,28 @@ static void HostByAddrCb(void *data, return; } IO->DNS.Query->Data = hostent; -/// TODO: howto free this?? } -static void ParseAnswerA(AsyncIO *IO, unsigned char* abuf, int alen) +static void ParseAnswerA(AsyncIO *IO, unsigned char* abuf, int alen) { - struct hostent* host; -#ifdef DEBUG_CARES - EV_syslog(LOG_DEBUG, "C-ARES: %s\n", __FUNCTION__); -#endif + struct hostent* host = NULL; + + EV_DNS_syslog(LOG_DEBUG, "C-ARES: %s\n", __FUNCTION__); if (IO->DNS.Query->VParsedDNSReply != NULL) IO->DNS.Query->DNSReplyFree(IO->DNS.Query->VParsedDNSReply); IO->DNS.Query->VParsedDNSReply = NULL; - IO->DNS.Query->DNSStatus = ares_parse_a_reply(abuf, alen, &host, NULL, NULL); + IO->DNS.Query->DNSStatus = ares_parse_a_reply(abuf, + alen, + &host, + NULL, + NULL); if (IO->DNS.Query->DNSStatus != ARES_SUCCESS) { - StrBufPlain(IO->ErrMsg, ares_strerror(IO->DNS.Query->DNSStatus), -1); + if (host != NULL) + ares_free_hostent(host); + StrBufPlain(IO->ErrMsg, + ares_strerror(IO->DNS.Query->DNSStatus), -1); return; } IO->DNS.Query->VParsedDNSReply = host; @@ -104,20 +111,26 @@ static void ParseAnswerA(AsyncIO *IO, unsigned char* abuf, int alen) } -static void ParseAnswerAAAA(AsyncIO *IO, unsigned char* abuf, int alen) +static void ParseAnswerAAAA(AsyncIO *IO, unsigned char* abuf, int alen) { - struct hostent* host; -#ifdef DEBUG_CARES - EV_syslog(LOG_DEBUG, "C-ARES: %s\n", __FUNCTION__); -#endif + struct hostent* host = NULL; + + EV_DNS_syslog(LOG_DEBUG, "C-ARES: %s\n", __FUNCTION__); if (IO->DNS.Query->VParsedDNSReply != NULL) IO->DNS.Query->DNSReplyFree(IO->DNS.Query->VParsedDNSReply); IO->DNS.Query->VParsedDNSReply = NULL; - IO->DNS.Query->DNSStatus = ares_parse_aaaa_reply(abuf, alen, &host, NULL, NULL); + IO->DNS.Query->DNSStatus = ares_parse_aaaa_reply(abuf, + alen, + &host, + NULL, + NULL); if (IO->DNS.Query->DNSStatus != ARES_SUCCESS) { - StrBufPlain(IO->ErrMsg, ares_strerror(IO->DNS.Query->DNSStatus), -1); + if (host != NULL) + ares_free_hostent(host); + StrBufPlain(IO->ErrMsg, + ares_strerror(IO->DNS.Query->DNSStatus), -1); return; } IO->DNS.Query->VParsedDNSReply = host; @@ -125,21 +138,26 @@ static void ParseAnswerAAAA(AsyncIO *IO, unsigned char* abuf, int alen) } -static void ParseAnswerCNAME(AsyncIO *IO, unsigned char* abuf, int alen) +static void ParseAnswerCNAME(AsyncIO *IO, unsigned char* abuf, int alen) { - struct hostent* host; + struct hostent* host = NULL; -#ifdef DEBUG_CARES - EV_syslog(LOG_DEBUG, "C-ARES: %s\n", __FUNCTION__); -#endif + EV_DNS_syslog(LOG_DEBUG, "C-ARES: %s\n", __FUNCTION__); if (IO->DNS.Query->VParsedDNSReply != NULL) IO->DNS.Query->DNSReplyFree(IO->DNS.Query->VParsedDNSReply); IO->DNS.Query->VParsedDNSReply = NULL; - IO->DNS.Query->DNSStatus = ares_parse_a_reply(abuf, alen, &host, NULL, NULL); + IO->DNS.Query->DNSStatus = ares_parse_a_reply(abuf, + alen, + &host, + NULL, + NULL); if (IO->DNS.Query->DNSStatus != ARES_SUCCESS) { - StrBufPlain(IO->ErrMsg, ares_strerror(IO->DNS.Query->DNSStatus), -1); + if (host != NULL) + ares_free_hostent(host); + StrBufPlain(IO->ErrMsg, + ares_strerror(IO->DNS.Query->DNSStatus), -1); return; } @@ -149,12 +167,11 @@ static void ParseAnswerCNAME(AsyncIO *IO, unsigned char* abuf, int alen) } -static void ParseAnswerMX(AsyncIO *IO, unsigned char* abuf, int alen) +static void ParseAnswerMX(AsyncIO *IO, unsigned char* abuf, int alen) { - struct ares_mx_reply *mx_out; -#ifdef DEBUG_CARES - EV_syslog(LOG_DEBUG, "C-ARES: %s\n", __FUNCTION__); -#endif + struct ares_mx_reply *mx_out = NULL; + + EV_DNS_syslog(LOG_DEBUG, "C-ARES: %s\n", __FUNCTION__); if (IO->DNS.Query->VParsedDNSReply != NULL) IO->DNS.Query->DNSReplyFree(IO->DNS.Query->VParsedDNSReply); @@ -162,7 +179,10 @@ static void ParseAnswerMX(AsyncIO *IO, unsigned char* abuf, int alen) IO->DNS.Query->DNSStatus = ares_parse_mx_reply(abuf, alen, &mx_out); if (IO->DNS.Query->DNSStatus != ARES_SUCCESS) { - StrBufPlain(IO->ErrMsg, ares_strerror(IO->DNS.Query->DNSStatus), -1); + if (mx_out != NULL) + ares_free_data(mx_out); + StrBufPlain(IO->ErrMsg, + ares_strerror(IO->DNS.Query->DNSStatus), -1); return; } @@ -171,12 +191,11 @@ static void ParseAnswerMX(AsyncIO *IO, unsigned char* abuf, int alen) } -static void ParseAnswerNS(AsyncIO *IO, unsigned char* abuf, int alen) +static void ParseAnswerNS(AsyncIO *IO, unsigned char* abuf, int alen) { - struct hostent* host; -#ifdef DEBUG_CARES - EV_syslog(LOG_DEBUG, "C-ARES: %s\n", __FUNCTION__); -#endif + struct hostent* host = NULL; + + EV_DNS_syslog(LOG_DEBUG, "C-ARES: %s\n", __FUNCTION__); if (IO->DNS.Query->VParsedDNSReply != NULL) IO->DNS.Query->DNSReplyFree(IO->DNS.Query->VParsedDNSReply); @@ -184,7 +203,10 @@ static void ParseAnswerNS(AsyncIO *IO, unsigned char* abuf, int alen) IO->DNS.Query->DNSStatus = ares_parse_ns_reply(abuf, alen, &host); if (IO->DNS.Query->DNSStatus != ARES_SUCCESS) { - StrBufPlain(IO->ErrMsg, ares_strerror(IO->DNS.Query->DNSStatus), -1); + if (host != NULL) + ares_free_hostent(host); + StrBufPlain(IO->ErrMsg, + ares_strerror(IO->DNS.Query->DNSStatus), -1); return; } IO->DNS.Query->VParsedDNSReply = host; @@ -192,12 +214,11 @@ static void ParseAnswerNS(AsyncIO *IO, unsigned char* abuf, int alen) } -static void ParseAnswerSRV(AsyncIO *IO, unsigned char* abuf, int alen) +static void ParseAnswerSRV(AsyncIO *IO, unsigned char* abuf, int alen) { - struct ares_srv_reply *srv_out; -#ifdef DEBUG_CARES - EV_syslog(LOG_DEBUG, "C-ARES: %s\n", __FUNCTION__); -#endif + struct ares_srv_reply *srv_out = NULL; + + EV_DNS_syslog(LOG_DEBUG, "C-ARES: %s\n", __FUNCTION__); if (IO->DNS.Query->VParsedDNSReply != NULL) IO->DNS.Query->DNSReplyFree(IO->DNS.Query->VParsedDNSReply); @@ -205,7 +226,10 @@ static void ParseAnswerSRV(AsyncIO *IO, unsigned char* abuf, int alen) IO->DNS.Query->DNSStatus = ares_parse_srv_reply(abuf, alen, &srv_out); if (IO->DNS.Query->DNSStatus != ARES_SUCCESS) { - StrBufPlain(IO->ErrMsg, ares_strerror(IO->DNS.Query->DNSStatus), -1); + if (srv_out != NULL) + ares_free_data(srv_out); + StrBufPlain(IO->ErrMsg, + ares_strerror(IO->DNS.Query->DNSStatus), -1); return; } @@ -214,12 +238,11 @@ static void ParseAnswerSRV(AsyncIO *IO, unsigned char* abuf, int alen) } -static void ParseAnswerTXT(AsyncIO *IO, unsigned char* abuf, int alen) +static void ParseAnswerTXT(AsyncIO *IO, unsigned char* abuf, int alen) { struct ares_txt_reply *txt_out; -#ifdef DEBUG_CARES - EV_syslog(LOG_DEBUG, "C-ARES: %s\n", __FUNCTION__); -#endif + + EV_DNS_syslog(LOG_DEBUG, "C-ARES: %s\n", __FUNCTION__); if (IO->DNS.Query->VParsedDNSReply != NULL) IO->DNS.Query->DNSReplyFree(IO->DNS.Query->VParsedDNSReply); @@ -227,7 +250,10 @@ static void ParseAnswerTXT(AsyncIO *IO, unsigned char* abuf, int alen) IO->DNS.Query->DNSStatus = ares_parse_txt_reply(abuf, alen, &txt_out); if (IO->DNS.Query->DNSStatus != ARES_SUCCESS) { - StrBufPlain(IO->ErrMsg, ares_strerror(IO->DNS.Query->DNSStatus), -1); + if (txt_out != NULL) + ares_free_data(txt_out); + StrBufPlain(IO->ErrMsg, + ares_strerror(IO->DNS.Query->DNSStatus), -1); return; } IO->DNS.Query->VParsedDNSReply = txt_out; @@ -238,47 +264,69 @@ void QueryCb(void *arg, int status, int timeouts, unsigned char* abuf, - int alen) + int alen) { AsyncIO *IO = arg; -#ifdef DEBUG_CARES - EV_syslog(LOG_DEBUG, "C-ARES: %s\n", __FUNCTION__); -#endif + + EV_DNS_syslog(LOG_DEBUG, "C-ARES: %s\n", __FUNCTION__); + + EV_DNS_LOGT_STOP(DNS.timeout); ev_timer_stop (event_base, &IO->DNS.timeout); IO->DNS.Query->DNSStatus = status; if (status == ARES_SUCCESS) IO->DNS.Query->DNS_CB(arg, abuf, alen); else { - EV_syslog(LOG_DEBUG, "C-ARES: Failed by: %s error %s\n", - __FUNCTION__, - ares_strerror(status)); + EV_DNS_syslog(LOG_DEBUG, "C-ARES: Failed by: %s error %s\n", + __FUNCTION__, + ares_strerror(status)); StrBufPlain(IO->ErrMsg, ares_strerror(status), -1); IO->DNS.Query->DNSStatus = status; } - + 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); } void QueryCbDone(AsyncIO *IO) { -#ifdef DEBUG_CARES - EV_syslog(LOG_DEBUG, "C-ARES: %s\n", __FUNCTION__); -#endif + EV_DNS_syslog(LOG_DEBUG, "C-ARES: %s\n", __FUNCTION__); + EV_DNS_LOGT_STOP(DNS.timeout); + ev_timer_stop (event_base, &IO->DNS.timeout); + + EV_DNS_LOGT_STOP(unwind_stack); ev_idle_stop(event_base, &IO->unwind_stack); } +void DestructCAres(AsyncIO *IO) +{ + EV_DNS_syslog(LOG_DEBUG, "C-ARES: %s\n", __FUNCTION__); + + EV_DNS_LOG_STOP(DNS.recv_event); + ev_io_stop(event_base, &IO->DNS.recv_event); + + EV_DNS_LOG_STOP(DNS.send_event); + ev_io_stop(event_base, &IO->DNS.send_event); + + EV_DNS_LOGT_STOP(DNS.timeout); + ev_timer_stop (event_base, &IO->DNS.timeout); + + EV_DNS_LOGT_STOP(unwind_stack); + ev_idle_stop(event_base, &IO->unwind_stack); + ares_destroy_options(&IO->DNS.Options); +} + void InitC_ares_dns(AsyncIO *IO) { int optmask = 0; -#ifdef DEBUG_CARES - EV_syslog(LOG_DEBUG, "C-ARES: %s %p\n", __FUNCTION__, IO->DNS.Channel); -#endif + + EV_DNS_syslog(LOG_DEBUG, "C-ARES: %s %p\n", __FUNCTION__, IO->DNS.Channel); if (IO->DNS.Channel == NULL) { optmask |= ARES_OPT_SOCK_STATE_CB; @@ -305,9 +353,8 @@ DNStimeouttrigger_callback(struct ev_loop *loop, ev_timer *watcher, int revents) (NextTV->tv_usec != MaxTV.tv_usec)) { fd_set readers, writers; -#ifdef DEBUG_CARES - EV_syslog(LOG_DEBUG, "C-ARES: %s Timeout!\n", __FUNCTION__); -#endif + EV_DNS_syslog(LOG_DEBUG, "C-ARES: %s Timeout!\n", __FUNCTION__); + FD_ZERO(&readers); FD_ZERO(&writers); ares_fds(IO->DNS.Channel, &readers, &writers); @@ -315,32 +362,40 @@ DNStimeouttrigger_callback(struct ev_loop *loop, ev_timer *watcher, int revents) } } -void QueueGetHostByNameDone(void *Ctx, +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 + + EV_DNS_syslog(LOG_DEBUG, "C-ARES: %s\n", __FUNCTION__); + IO->DNS.Query->DNSStatus = status; IO->DNS.Query->VParsedDNSReply = hostent; IO->DNS.Query->DNSReplyFree = (FreeDNSReply) ares_free_hostent; + EV_DNS_LOGT_STOP(DNS.timeout); + ev_timer_stop (event_base, &IO->DNS.timeout); + 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); + } -void QueueGetHostByName(AsyncIO *IO, const char *Hostname, DNSQueryParts *QueryParts, IO_CallBack PostDNS) +void QueueGetHostByName(AsyncIO *IO, + const char *Hostname, + DNSQueryParts *QueryParts, + IO_CallBack PostDNS) { -#ifdef DEBUG_CARES - EV_syslog(LOG_DEBUG, "C-ARES: %s\n", __FUNCTION__); + + EV_DNS_syslog(LOG_DEBUG, "C-ARES: %s\n", __FUNCTION__); IO->DNS.SourcePort = 0; -#endif IO->DNS.Query = QueryParts; IO->DNS.Query->PostDNS = PostDNS; @@ -348,31 +403,38 @@ void QueueGetHostByName(AsyncIO *IO, const char *Hostname, DNSQueryParts *QueryP 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, + 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); } -int QueueQuery(ns_type Type, const char *name, AsyncIO *IO, DNSQueryParts *QueryParts, IO_CallBack PostDNS) + +int QueueQuery(ns_type Type, + const char *name, + AsyncIO *IO, + DNSQueryParts *QueryParts, + IO_CallBack PostDNS) { int length, family; char address_b[sizeof(struct in6_addr)]; -#ifdef DEBUG_CARES IO->DNS.SourcePort = 0; -#endif IO->DNS.Query = QueryParts; IO->DNS.Query->PostDNS = PostDNS; + IO->DNS.Start = IO->Now; InitC_ares_dns(IO); ev_timer_init(&IO->DNS.timeout, DNStimeouttrigger_callback, 10, 1); IO->DNS.timeout.data = IO; + EV_DNS_LOGT_INIT(DNS.timeout); switch(Type) { case ns_t_a: @@ -416,23 +478,28 @@ int QueueQuery(ns_type Type, const char *name, AsyncIO *IO, DNSQueryParts *Query return -1; } - ares_gethostbyaddr(IO->DNS.Channel, address_b, length, family, HostByAddrCb, IO); + ares_gethostbyaddr(IO->DNS.Channel, + address_b, + length, + family, + HostByAddrCb, + IO); + EV_DNS_LOGT_START(DNS.timeout); ev_timer_start(event_base, &IO->DNS.timeout); -#ifdef DEBUG_CARES - EV_syslog(LOG_DEBUG, "C-ARES: %s X1\n", __FUNCTION__); -#endif + + EV_DNS_syslog(LOG_DEBUG, "C-ARES: %s X1\n", __FUNCTION__); + return 1; default: -#ifdef DEBUG_CARES - EV_syslog(LOG_DEBUG, "C-ARES: %sX2\n", __FUNCTION__); -#endif + + EV_DNS_syslog(LOG_DEBUG, "C-ARES: %sX2\n", __FUNCTION__); return 0; } -#ifdef DEBUG_CARES - EV_syslog(LOG_DEBUG, "C-ARES: %s\n", __FUNCTION__); -#endif + EV_DNS_syslog(LOG_DEBUG, "C-ARES: %s\n", __FUNCTION__); + ares_query(IO->DNS.Channel, name, ns_c_in, Type, QueryCb, IO); + EV_DNS_LOGT_START(DNS.timeout); ev_timer_start(event_base, &IO->DNS.timeout); return 1; } @@ -447,82 +514,104 @@ int QueueQuery(ns_type Type, const char *name, AsyncIO *IO, DNSQueryParts *Query static void DNS_send_callback(struct ev_loop *loop, ev_io *watcher, int revents) { AsyncIO *IO = watcher->data; - -#ifdef DEBUG_CARES - EV_syslog(LOG_DEBUG, "C-ARES: %s\n", __FUNCTION__); -#endif - ares_process_fd(IO->DNS.Channel, ARES_SOCKET_BAD, IO->DNS.send_event.fd); + IO->Now = ev_now(event_base); + + EV_DNS_syslog(LOG_DEBUG, "C-ARES: %s\n", __FUNCTION__); + + ares_process_fd(IO->DNS.Channel, + ARES_SOCKET_BAD, + IO->DNS.send_event.fd); } static void DNS_recv_callback(struct ev_loop *loop, ev_io *watcher, int revents) { AsyncIO *IO = watcher->data; - -#ifdef DEBUG_CARES - EV_syslog(LOG_DEBUG, "C-ARES: %s\n", __FUNCTION__); -#endif - ares_process_fd(IO->DNS.Channel, IO->DNS.recv_event.fd, ARES_SOCKET_BAD); + IO->Now = ev_now(event_base); + + EV_DNS_syslog(LOG_DEBUG, "C-ARES: %s\n", __FUNCTION__); + + ares_process_fd(IO->DNS.Channel, + IO->DNS.recv_event.fd, + ARES_SOCKET_BAD); } -void SockStateCb(void *data, int sock, int read, int write) +void SockStateCb(void *data, int sock, int read, int write) { AsyncIO *IO = data; /* already inside of the event queue. */ -#ifdef DEBUG_CARES -{ - struct sockaddr_in sin = {}; - socklen_t slen; - slen = sizeof(sin); - if ((IO->DNS.SourcePort == 0) && - (getsockname(sock, &sin, &slen) == 0)) + if (DebugCAres) { - IO->DNS.SourcePort = ntohs(sin.sin_port); + struct sockaddr_in sin = {}; + socklen_t slen; + slen = sizeof(sin); + if ((IO->DNS.SourcePort == 0) && + (getsockname(sock, &sin, &slen) == 0)) + { + IO->DNS.SourcePort = ntohs(sin.sin_port); + } + EV_DNS_syslog(LOG_DEBUG, "C-ARES: %s %d|%d Sock %d port %hu\n", + __FUNCTION__, + read, + write, + sock, + IO->DNS.SourcePort); } - EV_syslog(LOG_DEBUG, "C-ARES: %s %d|%d Sock %d port %hu\n", - __FUNCTION__, - read, - write, - sock, - IO->DNS.SourcePort); -} -#endif + + IO->Now = ev_now(event_base); if (read) { if ((IO->DNS.recv_event.fd != sock) && (IO->DNS.recv_event.fd != 0)) { + EV_DNS_LOG_STOP(DNS.recv_event); ev_io_stop(event_base, &IO->DNS.recv_event); } IO->DNS.recv_event.fd = sock; - ev_io_init(&IO->DNS.recv_event, DNS_recv_callback, IO->DNS.recv_event.fd, EV_READ); + ev_io_init(&IO->DNS.recv_event, + DNS_recv_callback, + IO->DNS.recv_event.fd, + EV_READ); + EV_DNS_LOG_INIT(DNS.recv_event); IO->DNS.recv_event.data = IO; + EV_DNS_LOG_START(DNS.recv_event); ev_io_start(event_base, &IO->DNS.recv_event); - } + } if (write) { if ((IO->DNS.send_event.fd != sock) && (IO->DNS.send_event.fd != 0)) { + EV_DNS_LOG_STOP(DNS.send_event); ev_io_stop(event_base, &IO->DNS.send_event); } IO->DNS.send_event.fd = sock; - ev_io_init(&IO->DNS.send_event, DNS_send_callback, IO->DNS.send_event.fd, EV_WRITE); + ev_io_init(&IO->DNS.send_event, + DNS_send_callback, + IO->DNS.send_event.fd, + EV_WRITE); IO->DNS.send_event.data = IO; + EV_DNS_LOG_INIT(DNS.send_event); + EV_DNS_LOG_START(DNS.send_event); ev_io_start(event_base, &IO->DNS.send_event); } if ((read == 0) && (write == 0)) { + EV_DNS_LOG_STOP(DNS.recv_event); + EV_DNS_LOG_STOP(DNS.send_event); ev_io_stop(event_base, &IO->DNS.recv_event); ev_io_stop(event_base, &IO->DNS.send_event); } } +void EnableDebugCAres(const int n) +{ + DebugCAres = n; +} CTDL_MODULE_INIT(c_ares_client) { if (!threading) { + CtdlRegisterDebugFlagHook(HKEY("cares"), EnableDebugCAres, &DebugCAres); int r = ares_library_init(ARES_LIB_INIT_ALL); if (0 != r) { - // TODO - // ThrowException(Exception::Error(String::New(ares_strerror(r)))); -//// assert(r == 0); + } } return "c-ares";