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
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 ADDRSTRLEN] ;
int main(int argc, char *argv[])
{
struct addrinfo hints;
struct addrinfo *rp, *result;
struct sockaddr *sa;
int rc;
char s[INET6_
size_t slen = sizeof(s);
memset(&hints, 0, sizeof(hints));
switch( atoi(argv[ 1])) {
hints. ai_family = AF_INET;
hints. ai_family = AF_INET6;
hints. ai_family = AF_UNSPEC;
case 4:
break;
case 6:
break;
default:
break;
}
rc = getaddrinfo( argv[2] , NULL, &hints, &result);
fprintf( stderr, "getaddrinfo: %s\n", gai_strerror(rc));
exit(EXIT_ FAILURE) ;
if(rc) {
}
for (rp = result; rp != NULL; rp = rp->ai_next) {
switch( sa->sa_ family) {
inet_ ntop(AF_ INET, &(((struct sockaddr_in *)sa)->sin_addr), s, slen);
fprintf( stderr, "result (IPv4): %s\n", s);
break;
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;
sa = rp->ai_addr;
case AF_INET:
case AF_INET6:
}
}
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