#include <errno.h>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <net/if.h>
#include <netinet/in.h>
#include <netdb.h>

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

int main(void) {
	int fd;
	int err;
	struct ifconf ifconf;
	char buf[8192];
	struct ifreq *ifreq;

	fd = socket(PF_INET, SOCK_DGRAM, 0);
	if (fd < 0)
		die("socket");

	memset(&ifconf, 0, sizeof(ifconf));
	ifconf.ifc_buf = buf;
	ifconf.ifc_len = sizeof(buf);

	err = ioctl(fd, SIOCGIFCONF, &ifconf);

	if (err)
		die("ioctl");

	for (ifreq = (struct ifreq*) ifconf.ifc_buf;
			(void*)ifreq < ((void*)ifconf.ifc_buf) + ifconf.ifc_len;
			++ifreq)
	{
		struct ifreq ifreq_addr;
		char addrstr[INET_ADDRSTRLEN];

		printf("%.*s\n", IFNAMSIZ, ifreq->ifr_name);

		memset(&ifreq_addr, 0, sizeof(ifreq_addr));
		memcpy(ifreq_addr.ifr_name, ifreq->ifr_name, sizeof(ifreq_addr.ifr_name));

		err = ioctl(fd, SIOCGIFADDR, &ifreq_addr);
		if (err)
			die("ifaddr ioctl");

		err = getnameinfo(&ifreq_addr.ifr_addr, sizeof(ifreq_addr.ifr_addr),
				addrstr, sizeof(addrstr),
				NULL, 0, NI_NUMERICHOST);

		if (err)
			die("getnameinfo");

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

    return 0;
}

/* vim: set ts=4 sw=4 noet: */

