ifaddrs.c revision 55c76589fd19e5f04697dcfd0084039cd77ef304
278N/Atypedef struct NetlinkList
278N/Astatic int netlink_socket(void)
return l_socket;
if(l_result < 0)
return l_result;
return NULL;
if(l_read >= 0)
for(l_hdr = (struct nlmsghdr *)l_buffer; NLMSG_OK(l_hdr, (unsigned int)l_read); l_hdr = (struct nlmsghdr *)NLMSG_NEXT(l_hdr, l_read))
return NULL;
return l_buffer;
return l_item;
while(p_list)
return NULL;
int l_size;
int l_done = 0;
while(!l_done)
if(!l_hdr)
return NULL;
if(!l_list)
return l_list;
switch(p_family)
case AF_INET:
return sizeof(struct sockaddr_in);
case AF_INET6:
return sizeof(struct sockaddr_in6);
case AF_PACKET:
static void makeSockaddr(sa_family_t p_family, struct sockaddr *p_dest, void *p_data, size_t p_size)
switch(p_family)
case AF_INET:
case AF_INET6:
case AF_PACKET:
if(!*p_resultList)
static void interpretLink(struct nlmsghdr *p_hdr, struct ifaddrs **p_links, struct ifaddrs **p_resultList)
for(l_rta = (struct rtattr *)(((char *)l_info) + NLMSG_ALIGN(sizeof(struct ifinfomsg))); RTA_OK(l_rta, l_rtaSize); l_rta = RTA_NEXT(l_rta, l_rtaSize))
case IFLA_ADDRESS:
case IFLA_BROADCAST:
case IFLA_IFNAME:
case IFLA_STATS:
for(l_rta = (struct rtattr *)(((char *)l_info) + NLMSG_ALIGN(sizeof(struct ifinfomsg))); RTA_OK(l_rta, l_rtaSize); l_rta = RTA_NEXT(l_rta, l_rtaSize))
case IFLA_ADDRESS:
case IFLA_BROADCAST:
case IFLA_IFNAME:
case IFLA_STATS:
static void interpretAddr(struct nlmsghdr *p_hdr, struct ifaddrs **p_links, struct ifaddrs **p_resultList)
int l_addedNetmask = 0;
for(l_rta = (struct rtattr *)(((char *)l_info) + NLMSG_ALIGN(sizeof(struct ifaddrmsg))); RTA_OK(l_rta, l_rtaSize); l_rta = RTA_NEXT(l_rta, l_rtaSize))
case IFA_ADDRESS:
case IFA_LOCAL:
case IFA_BROADCAST:
case IFA_LABEL:
for(l_rta = (struct rtattr *)(((char *)l_info) + NLMSG_ALIGN(sizeof(struct ifaddrmsg))); RTA_OK(l_rta, l_rtaSize); l_rta = RTA_NEXT(l_rta, l_rtaSize))
case IFA_ADDRESS:
case IFA_BROADCAST:
case IFA_LOCAL:
if(IN6_IS_ADDR_LINKLOCAL((struct in6_addr *)l_rtaData) || IN6_IS_ADDR_MC_LINKLOCAL((struct in6_addr *)l_rtaData))
{ // apparently in a point-to-point network IFA_ADDRESS contains the dest address and IFA_LOCAL contains the local address
case IFA_LABEL:
if(l_entry->ifa_addr && (l_entry->ifa_addr->sa_family == AF_INET || l_entry->ifa_addr->sa_family == AF_INET6))
static void interpret(int p_socket, NetlinkList *p_netlinkList, struct ifaddrs **p_links, struct ifaddrs **p_resultList)
unsigned l_links = 0;
++l_links;
return l_links;
if(!ifap)
if(l_socket < 0)
if(!l_linkResults)
if(!l_addrResults)
while(ifa)