#include <sys/types.h>
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
#include <ifaddrs.h>
#include <sys/socket.h>
#include <netdb.h>

extern int rk_getifaddrs(struct ifaddrs **ifap);

static void die(const char *msg) {
    perror(msg);
    exit(1);
}

//#define getifaddrs rk_getifaddrs

#if !defined(INET6_ADDRSTRLEN)
# define INET6_ADDRSTRLEN 46
#endif

int main(void) {
    int err;
    struct ifaddrs *ifaddrs;
    const struct ifaddrs *ifa;

    err = getifaddrs(&ifaddrs);
    if (err)
	die("getifaddrs");

    for (ifa = ifaddrs; ifa; ifa = ifa->ifa_next) {
	int af;
	char name[INET6_ADDRSTRLEN];
	printf("%s\n", ifa->ifa_name);

	af = ifa->ifa_addr->sa_family;

	if (af != AF_INET && af != AF_INET6) {
	    printf(" not an inet or inet6 address\n");
	    continue;
	}

	err = getnameinfo(ifa->ifa_addr,
		(af == AF_INET6) ? sizeof(struct sockaddr_in6) :
		    sizeof(struct sockaddr_in),
		name, sizeof(name),
		NULL, 0, NI_NUMERICHOST);
	if (err)
	    die("getnameinfo"); /* should use gai_strerror */

	printf(" %.*s\n", (int) sizeof(name), name);
    }

    freeifaddrs(ifaddrs);

    return 0;
}

