Comment 3 for bug 2047155

Revision history for this message
James Dingwall (a-james-launchpad) wrote :

Here is a short test program which demonstrates behaviour with/without nscd:

#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <arpa/inet.h>

extern
int main(int argc, char *argv[])
{
    struct addrinfo hints;
    struct addrinfo *rp, *result;
    struct sockaddr *sa;
    int rc;
    char s[INET6_ADDRSTRLEN];
    size_t slen = sizeof(s);

    memset(&hints, 0, sizeof(hints));

    switch(atoi(argv[1])) {
    case 4:
        hints.ai_family = AF_INET;
        break;
    case 6:
        hints.ai_family = AF_INET6;
        break;
    default:
        hints.ai_family = AF_UNSPEC;
        break;
    }

    rc = getaddrinfo(argv[2], NULL, &hints, &result);
    if(rc) {
        fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(rc));
        exit(EXIT_FAILURE);
    }

    for (rp = result; rp != NULL; rp = rp->ai_next) {
        sa = rp->ai_addr;
        switch(sa->sa_family) {
             case AF_INET:
                 inet_ntop(AF_INET, &(((struct sockaddr_in *)sa)->sin_addr), s, slen);
                 fprintf(stderr, "result (IPv4): %s\n", s);
                 break;
             case AF_INET6:
                 inet_ntop(AF_INET6, &(((struct sockaddr_in6 *)sa)->sin6_addr), s, slen);
                 fprintf(stderr, "result (IPv6): %s\n", s);
                 break;
             default:
                 fprintf(stderr, "Unknown AF: %d\n", sa->sa_family);
                 break;
        }
    }

    return 0;
}

nscd running:

$ ./a.out 0 ap1.example.com
result (IPv6): x:x:x:x::x:c
result (IPv6): x:x:x:x::x:c
result (IPv6): x:x:x:x::x:c
result (IPv4): x.x.x.12
result (IPv4): x.x.x.12
result (IPv4): x.x.x.12
$ ./a.out 4 ap1.example.com
result (IPv4): x.x.x.12
result (IPv4): x.x.x.12
result (IPv4): x.x.x.12
$ ./a.out 6 ap1.example.com
Unknown AF: 0
Unknown AF: 0
Unknown AF: 0

nscd not running:

$ ./a.out 0 ap1.example.com
result (IPv6): x:x:x:x::x:c
result (IPv6): x:x:x:x::x:c
result (IPv6): x:x:x:x::x:c
result (IPv4): x.x.x.12
result (IPv4): x.x.x.12
result (IPv4): x.x.x.12
$ ./a.out 4 ap1.example.com
result (IPv4): x.x.x.12
result (IPv4): x.x.x.12
result (IPv4): x.x.x.12
$ ./a.out 6 ap1.example.com
result (IPv6): x:x:x:x::x:c
result (IPv6): x:x:x:x::x:c
result (IPv6): x:x:x:x::x:c