libc-ares migration
authorWilfried Goesgens <dothebart@citadel.org>
Sat, 8 Jan 2011 14:13:18 +0000 (15:13 +0100)
committerWilfried Goesgens <dothebart@citadel.org>
Sat, 8 Jan 2011 14:13:18 +0000 (15:13 +0100)
  - just use one callback for read/send into libevent
  - re-enable c-ares; still doesn't work

citadel/event_client.c
citadel/event_client.h
citadel/modules/c-ares-dns/serv_c-ares-dns.c
citadel/modules/smtp/serv_smtpeventclient.c

index 2cf6dcea9ff8543bf2fa78174fe11b28e6c98176..2ffc1c6e5e1970759d84326eab57b3ce2558b759 100644 (file)
@@ -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, 
index 4617908c578bb060b37b764ffd491bb1d4a4057e..6032a3c17167e0ce11b35eb3fe520d562bf250a4 100644 (file)
@@ -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... */
index ae26751b068da5db78985235d1c61bca1c6e414d..adb0827f35cab7bcea4206442f25f87d74f2bb06 100644 (file)
@@ -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)
index 66674b3b22fb443c10b987a39bafff1f84d8dcd7..f61e633f57958b72a0b89d229bae0ce33b74a52a 100644 (file)
@@ -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();