Archive Index This month's Index

Subject: recursive MX lookup <-> libc-ares <-> libev

recursive MX lookup <-> libc-ares <-> libev

From: Wilfried Goesgens <>
Date: Sat, 08 Jan 2011 10:00:37 -0500

Hy everyone;

I'm trying to evolve citadel.orgs smtp client to become async.

My toolchain of choice became c-ares and libev.

My current workstate can be found here:

For finding out the host needed to connect I need to do two DNS-calls in
sequence; first the MX record, then the IP of that host.

I've managed to implement the MX lookup by inspecting the
implementation; i'm successfully retrieving names here.

My journey starts like this:


its setting* ares_init_options() *with a *SockStateCb()* and then sends out
the *ares_query(Channel, "', ns_c_in, ns_t_mx, QueryCb, IO) ;*

ngrep shows, my query goes out, *SockStateCb() *is called, it registers the
given Socket with libev for read & write operations.

My query-cb *DNS_io_callback()* gets invoked by libev, and calls
ares_process_fd(). My callback *QueryCb*() is invoked, parses the MX-record
using ares_parse_mx_reply()

It then calls my application code, which then should resolve the IP of that
first MX-Record. It does so by calling

*ares_gethostbyname(Channel*/*(same as the last query)*/*,
"", xxx)*

I can then see the first a-query go out from within ares_gethostbyname(), the
SockStateCB() isn't called.

when stepping out of it, back through my application call, back into c-ares,
I can see it sending that query out again; my SockStateCB() isn't called all
the time; the IO-Callback also isn't called.

If I don't step through it, the query for the IP just goes out once, but I
also don't get neither of my my callback called by *ares_gethostbyname()*, no
SockStateCb, nor my DNS_io_callback().

I'm also a little bit puzzled, that my IO-callback isn't called for sending
the mx-query.


Any hints what I'm doing wrong here? Where should I look at?


TIA, Wilfried Goesgens
Received on 2011-01-08