Alex Rivera | Logout

How to use getaddrinfo_a to do async resolve with glibc

Asked 2008-09-12T01:07:06.167
21

An often overlooked function that requires no external library, but basically has no documentation whatsoever.

Edit
Report

1 Answer

25

UPDATE (2010-10-11): The linux man-pages now have documentation of the getaddrinfo_a, you can find it here: http://www.kernel.org/doc/man-pages/online/pages/man3/getaddrinfo_a.3.html

As a disclaimer I should add that I'm quite new to C but not exactly a newbie, so there might be bugs, or bad coding practices, please do correct me (and my grammar sucks too).

I personally didn't know about it until I came upon this post by Adam Langley, I shall give a few code snippets to illustrate the usage of it and clarify some things that might not be that clear on first use. The benefits of using this is that you get back data readily usable in socket(), listen() and other functions, and if done right you won't have to worry about ipv4/v6 either.
So to start off with the basics, as taken from the link above (you will need to link against libanl (-lanl)) :
Here is the function prototype:

int getaddrinfo_a(int mode, struct gaicb *list[], int ent, 
                  struct sigevent *);
  1. The mode is either GAI_WAIT (which is probably not what you want) and GAI_NOWAIT for async lookups
  2. The gaicb argument accepts an array of hosts to lookup with the ent argument specifying how many elements the array has
  3. The sigevent will be responsible for telling the function how we are to be notified, more on this in a moment

A gaicb struct looks like this:

struct gaicb {
    const char *ar_name;
    const char *ar_service;
    const struct addrinfo *ar_request;
    struct addrinfo *ar_result;
};

If you're familiar with getaddrinfo, then these fields correspond to them like so:

answered 2008-09-12T01:07:18.537

Your Answer