From: Wilfried Goesgens Date: Sat, 8 Jan 2011 14:13:18 +0000 (+0100) Subject: libc-ares migration X-Git-Tag: v8.11~1123 X-Git-Url: https://code.citadel.org/?p=citadel.git;a=commitdiff_plain;h=c979a38432307a49c407933b9820226bdc348573 libc-ares migration - just use one callback for read/send into libevent - re-enable c-ares; still doesn't work --- diff --git a/citadel/event_client.c b/citadel/event_client.c index 2cf6dcea9..2ffc1c6e5 100644 --- a/citadel/event_client.c +++ b/citadel/event_client.c @@ -400,12 +400,12 @@ IO->curr_ai->ai_family, unsigned short dport = atoi("25"); ///todo struct sockaddr_in saddr; memset( (struct sockaddr_in *)&saddr, '\0', sizeof( saddr ) ); -/* + memcpy(&saddr.sin_addr, IO->HEnt->h_addr_list[0], sizeof(struct in_addr)); -*/ - saddr.sin_addr.s_addr = inet_addr("85.88.5.80"); + +// saddr.sin_addr.s_addr = inet_addr("85.88.5.80"); saddr.sin_family = AF_INET; saddr.sin_port = htons(dport);/// TODO rc = connect(IO->sock, diff --git a/citadel/event_client.h b/citadel/event_client.h index 4617908c5..6032a3c17 100644 --- a/citadel/event_client.h +++ b/citadel/event_client.h @@ -36,7 +36,8 @@ struct AsyncIO { int active_event; eNextState NextState; ev_io recv_event, - send_event; + send_event, + dns_io_event; StrBuf *ErrMsg; /* if we fail to connect, or lookup, error goes here. */ /* read/send related... */ 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 ae26751b0..adb0827f3 100644 --- a/citadel/modules/c-ares-dns/serv_c-ares-dns.c +++ b/citadel/modules/c-ares-dns/serv_c-ares-dns.c @@ -209,7 +209,6 @@ static void ParseAnswerTXT(AsyncIO *IO, unsigned char* abuf, int alen) IO->DNSReplyFree = (FreeDNSReply) ares_free_data; } - void QueryCb(void *arg, int status, int timeouts, @@ -221,6 +220,8 @@ void QueryCb(void *arg, IO->DNSStatus = status; if (status == ARES_SUCCESS) IO->DNS_CB(arg, abuf, alen); + ev_io_stop(event_base, &IO->dns_io_event); + IO->PostDNS(IO); } @@ -229,7 +230,6 @@ int QueueQuery(ns_type Type, char *name, AsyncIO *IO, IO_CallBack PostDNS) int length, family; char address_b[sizeof(struct in6_addr)]; int optmask = 0; - fd_set rfd, wfd; if (IO->DNSChannel == NULL) { optmask |= ARES_OPT_SOCK_STATE_CB; @@ -289,22 +289,14 @@ int QueueQuery(ns_type Type, char *name, AsyncIO *IO, IO_CallBack PostDNS) return 0; } ares_query(IO->DNSChannel, name, ns_c_in, Type, QueryCb, IO); - ares_fds(IO->DNSChannel, &rfd, &wfd); return 1; } -static void DNS_recv_callback(struct ev_loop *loop, ev_io *watcher, int revents) -{ - AsyncIO *IO = watcher->data; - - ares_process_fd(IO->DNSChannel, IO->sock, 0); -} - -static void DNS_send_callback(struct ev_loop *loop, ev_io *watcher, int revents) +static void DNS_io_callback(struct ev_loop *loop, ev_io *watcher, int revents) { AsyncIO *IO = watcher->data; - ares_process_fd(IO->DNSChannel, 0, IO->sock); + ares_process_fd(IO->DNSChannel, IO->dns_io_event.fd, 0); } void SockStateCb(void *data, int sock, int read, int write) @@ -314,23 +306,22 @@ void SockStateCb(void *data, int sock, int read, int write) int64_t time = 10; AsyncIO *IO = data; /* already inside of the event queue. */ - IO->sock = sock; - ev_io_init(&IO->recv_event, DNS_recv_callback, IO->sock, EV_READ); - IO->recv_event.data = IO; - ev_io_init(&IO->send_event, DNS_send_callback, IO->sock, EV_WRITE); - IO->send_event.data = IO; - if (write) - ev_io_start(event_base, &IO->send_event); - else - ev_io_start(event_base, &IO->recv_event); - - - maxtv.tv_sec = time/1000; - maxtv.tv_usec = (time % 1000) * 1000; - ret = ares_timeout(IO->DNSChannel, &maxtv, &tvbuf); + if (IO->dns_io_event.fd != sock) { + if (IO->dns_io_event.fd != 0) { + ev_io_stop(event_base, &IO->dns_io_event); + } + IO->dns_io_event.fd = sock; + ev_io_init(&IO->dns_io_event, DNS_io_callback, IO->dns_io_event.fd, EV_READ|EV_WRITE); + IO->dns_io_event.data = IO; + ev_io_start(event_base, &IO->dns_io_event); + maxtv.tv_sec = time/1000; + maxtv.tv_usec = (time % 1000) * 1000; + + ret = ares_timeout(IO->DNSChannel, &maxtv, &tvbuf); + } } CTDL_MODULE_INIT(c_ares_client) diff --git a/citadel/modules/smtp/serv_smtpeventclient.c b/citadel/modules/smtp/serv_smtpeventclient.c index 66674b3b2..f61e633f5 100644 --- a/citadel/modules/smtp/serv_smtpeventclient.c +++ b/citadel/modules/smtp/serv_smtpeventclient.c @@ -656,10 +656,6 @@ void connect_one_smtpsrv(SmtpOutMsg *SendMsg) SendMsg->mx_port = DefaultMXPort; - SendMsg->IO.SendBuf.Buf = NewStrBufPlain(NULL, 1024); - SendMsg->IO.RecvBuf.Buf = NewStrBufPlain(NULL, 1024); - SendMsg->IO.IOBuf = NewStrBuf(); - SendMsg->IO.ErrMsg = SendMsg->MyQEntry->StatusMessage; /* TODO: Relay! *SendMsg->mx_user = '\0'; @@ -962,6 +958,11 @@ eNextState smtp_resolve_mx_done(void *data) AsyncIO *IO = data; SmtpOutMsg * SendMsg = IO->Data; + SendMsg->IO.SendBuf.Buf = NewStrBufPlain(NULL, 1024); + SendMsg->IO.RecvBuf.Buf = NewStrBufPlain(NULL, 1024); + SendMsg->IO.IOBuf = NewStrBuf(); + SendMsg->IO.ErrMsg = SendMsg->MyQEntry->StatusMessage; + //// connect_one_smtpsrv_xamine_result SendMsg->CurrMX = SendMsg->AllMX = IO->VParsedDNSReply; //// TODO: should we remove the current ares context??? @@ -974,7 +975,7 @@ eNextState smtp_resolve_mx_done(void *data) int resolve_mx_records(void *Ctx) { SmtpOutMsg * SendMsg = Ctx; -///TMP +/*//TMP SendMsg->IO.SendBuf.Buf = NewStrBufPlain(NULL, 1024); SendMsg->IO.RecvBuf.Buf = NewStrBufPlain(NULL, 1024); SendMsg->IO.IOBuf = NewStrBuf();