rendered paste body#include <stdio.h>#include <stdlib.h>#include <string.h>#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <arpa/inet.h>#include <ifaddrs.h> /* getifaddrs() */#include <netinet/ether.h> /* ether_ntoa() */#include <netpacket/packet.h> /* struct sockaddr_ll */char *generic_ntoa(struct sockaddr *sa){ static char *str = 0; static size_t size = 0; struct sockaddr_ll *sll; if ( size ) { free(str); str = 0; size = 0; } switch ( sa->sa_family ) { case AF_INET: size = INET_ADDRSTRLEN; str = malloc(size); memset((void *)str, 0, size); inet_ntop(((struct sockaddr_in *)sa)->sin_family, &(((struct sockaddr_in *)sa)->sin_addr), str, size); break; case AF_INET6: size = INET6_ADDRSTRLEN; str = malloc(size); memset((void *)str, 0, size); inet_ntop(((struct sockaddr_in6 *)sa)->sin6_family, &(((struct sockaddr_in6 *)sa)->sin6_addr), str, size); break; case AF_PACKET: sll = (struct sockaddr_ll *)sa; switch (sll->sll_hatype) { case ARPHRD_LOOPBACK: /* loopback interfaces don't have a hardware address */ break; case ARPHRD_ETHER: str = ether_ntoa((struct ether_addr *)(sll->sll_addr)); break; default: size = 40; str = malloc(size); memset((void *)str, 0, size); snprintf(str, size, "Can't decode raw packet type %d", sll->sll_hatype); break; } break; default: size = 30; str = malloc(size); memset((void *)str, 0, size); snprintf(str, size, "Can't decode family %d", sa->sa_family); break; } return str;}int main(){ struct ifaddrs *id; char *address_str; int val; val = getifaddrs(&id); for ( ; id != NULL ; id = id->ifa_next ) { printf("Network Interface: %s\n", id->ifa_name); address_str = generic_ntoa(id->ifa_addr); if ( address_str ) { printf("Address: %s\n", address_str); } if ( id->ifa_netmask != NULL ) { address_str = generic_ntoa(id->ifa_netmask); printf("Netmask: %s\n", address_str); } printf("\n"); } return 0;}