#include #include #include #include #include #include #include void print_sockaddr(struct sockaddr* addr,const char *name) { char addrbuf[128] ; addrbuf[0] = 0; if(addr->sa_family == AF_UNSPEC) return; switch(addr->sa_family) { case AF_INET: inet_ntop(addr->sa_family,&((struct sockaddr_in*)addr)->sin_addr,addrbuf,sizeof(struct sockaddr_in)); break; case AF_INET6: inet_ntop(addr->sa_family,&((struct sockaddr_in6*)addr)->sin6_addr,addrbuf,sizeof(struct sockaddr_in6)); break; case AF_PACKET: { struct sockaddr_ll *s = (struct sockaddr_ll*)addr; int i; int len = 0; for(i = 0; i < 6; i++) len+=sprintf(addrbuf+len,"%02X%s",s->sll_addr[i],i < 5 ? ":":""); len+=sprintf(addrbuf+len,"\nInterface Index %d Physical layer protocol %u Header type %u Packet type %u Length of address %u",s->sll_ifindex,s->sll_protocol,s->sll_hatype, s->sll_pkttype,s->sll_halen); } break; default: sprintf(addrbuf,"Unknown (%d)",(int)addr->sa_family); break; } printf("%-16s %s\n",name,addrbuf); } void print_ifaddr(struct ifaddrs *addr) { char addrbuf[128] ; addrbuf[0] = 0; printf("%-16s %s\n","Name",addr->ifa_name); if(addr->ifa_addr != NULL) print_sockaddr(addr->ifa_addr,"Address"); if(addr->ifa_netmask != NULL) print_sockaddr(addr->ifa_netmask,"Netmask"); if(addr->ifa_broadaddr != NULL) print_sockaddr(addr->ifa_broadaddr,"Broadcast addr."); if(addr->ifa_dstaddr != NULL) print_sockaddr(addr->ifa_dstaddr,"Peer addr."); puts(""); } int main(int argc,char *argv[]) { struct ifaddrs *addrs,*tmp; if(getifaddrs(&addrs) != 0) { perror("getifaddrs"); return 1; } for(tmp = addrs; tmp ; tmp = tmp->ifa_next) { print_ifaddr(tmp); } freeifaddrs(addrs); return 0; }