
#include <assert.h>
#include <stdio.h>

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>

int main(void)
{
    struct sockaddr_in sin = {0};
    struct sockaddr_in6 sin6 = {0};
    struct in_addr ipv4;
    unsigned int *addr32;
    int rc;
    char hostbuf[512];

    ipv4.s_addr = inet_addr("129.42.18.99");

#ifdef SIN6_LEN
    sin.sin_len = sizeof sin;
    sin6.sin6_len = sizeof sin6;
#endif
    
    sin.sin_family = AF_INET;
    sin6.sin6_family = AF_INET6;

    sin.sin_addr = ipv4;
    addr32 = (unsigned int *)&sin6.sin6_addr;
    addr32[2] = htonl(0x0000FFFF);
    addr32[3] = ipv4.s_addr;
    assert(IN6_IS_ADDR_V4MAPPED(&sin6.sin6_addr));

    strcpy(hostbuf, "not found");
    rc = getnameinfo((struct sockaddr *)&sin, sizeof sin, hostbuf, sizeof hostbuf, NULL, 0, 0);
    printf("look up via IPv4: %d/%s\n", rc, hostbuf);
    
    strcpy(hostbuf, "not found");
    rc = getnameinfo((struct sockaddr *)&sin6, sizeof sin6, hostbuf, sizeof hostbuf, NULL, 0, NI_NAMEREQD);
    printf("look up via IPv6: %d/%s\n", rc, hostbuf);
    
    return 0;
}

