#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <net/if.h>
#include <sys/ioctl.h>
#include <ifaddrs.h>
#define IFI_NAME 16 /* same as IFNAMSIZ in <net/if.h> */
#define IFI_HADDR 8 /* allow for 64-bit EUI-64 in future */
struct ifi_info {
char ifi_name[IFI_NAME]; /* interface name, null-terminated */
short ifi_index; /* interface index */
short ifi_flags; /* IFF_xxx constants from <net/if.h> */
struct sockaddr *ifi_addr; /* primary address */
struct sockaddr *ifi_brdaddr;/* broadcast address */
struct ifi_info *ifi_next; /* next of these structures */
};
struct ifi_info* get_ifi_info() {
struct ifi_info *ifi, *ifihead, **ifipnext,*p;
struct sockaddr_in6 *sin6ptr;
struct ifaddrs *ifas;
// char addr[128];
int sockfd;
ifihead = NULL;
ifipnext = &ifihead;
if(getifaddrs(&ifas)!=0) return;
for(;ifas!=NULL;ifas=(*ifas).ifa_next)
{
if(((*ifas).ifa_addr)->sa_family!=AF_INET6) continue;
ifi=(struct ifi_info*)calloc(1,sizeof(struct ifi_info));
*ifipnext=ifi;
ifipnext=&ifi->ifi_next;
ifi->ifi_flags=(*ifas).ifa_flags;
memcpy(ifi->ifi_name,(*ifas).ifa_name,IFI_NAME);
ifi->ifi_name[IFI_NAME]='/0';
/**/
sin6ptr=(struct sockaddr_in6*)(*ifas).ifa_addr;
ifi->ifi_addr=(struct sockaddr*)calloc(1,sizeof(struct sockaddr_in6));
memcpy(ifi->ifi_addr,sin6ptr,sizeof(struct sockaddr_in6));
}
freeifaddrs(ifas);
return(ifihead);
}
int main()
{
char addr[128];
struct ifi_info *ifi,*ifihead;
for(ifihead=ifi=get_ifi_info();ifi!=NULL;ifi=ifi->ifi_next)
{
if(0!=strcmp("eth0",ifi->ifi_name)) continue;
inet_ntop(AF_INET6,&(((struct sockaddr_in6 *)(ifi->ifi_addr))->sin6_addr),addr,sizeof(addr));
printf("eth0: %s/n",addr);
}
return 0;
}