int conf_ifaddrs(FILE *output, char *ifname, int flags, int af) { struct ifaddrs *ifa, *ifap; struct sockaddr_in *sin, *sinmask, *sindest; struct sockaddr_in6 *sin6, *sin6mask, *sin6dest; struct in6_ifreq ifr6; int ippntd = 0; if (getifaddrs(&ifap) != 0) { printf("%% conf: getifaddrs failed: %s\n", strerror(errno)); return(-1); } /* * Cycle through getifaddrs for interfaces with our * desired name that sport af or (AF_INET | AF_INET6). * Print the IP and related information. */ for (ifa = ifap; ifa; ifa = ifa->ifa_next) { if (strncmp(ifname, ifa->ifa_name, IFNAMSIZ)) continue; switch (ifa->ifa_addr->sa_family) { int s; case AF_INET: if (af != AF_INET && af != 0) continue; sin = (struct sockaddr_in *)ifa->ifa_addr; if (sin->sin_addr.s_addr == INADDR_ANY) continue; sinmask = (struct sockaddr_in *)ifa->ifa_netmask; if (flags & IFF_POINTOPOINT) { sindest = (struct sockaddr_in *)ifa->ifa_dstaddr; fprintf(output, " ip %s", routename4(sin->sin_addr.s_addr)); fprintf(output, " %s", inet_ntoa(sindest->sin_addr)); } else if (flags & IFF_BROADCAST) { sindest = (struct sockaddr_in *)ifa->ifa_broadaddr; fprintf(output, " ip %s", netname4(sin->sin_addr.s_addr, sinmask)); /* * no reason to save the broadcast addr * if it is standard (this should always * be true unless someone has messed up their * network or they are playing around...) */ if (ntohl(sindest->sin_addr.s_addr) != in4_brdaddr(sin->sin_addr.s_addr, sinmask->sin_addr.s_addr)) fprintf(output, " %s", inet_ntoa(sindest->sin_addr)); } else { fprintf(output, " ip %s", netname4(sin->sin_addr.s_addr, sinmask)); } ippntd = 1; break; case AF_INET6: if (af != AF_INET6 && af != 0) continue; sin6 = (struct sockaddr_in6 *)ifa->ifa_addr; sin6mask = (struct sockaddr_in6 *)ifa->ifa_netmask; if (IN6_IS_ADDR_UNSPECIFIED(&sin6->sin6_addr)) continue; if (!ipv6ll_db_compare(sin6, sin6mask, ifname)) continue; in6_fillscopeid(sin6); /* get address flags */ memset(&ifr6, 0, sizeof(ifr6)); strlcpy(ifr6.ifr_name, ifname, sizeof(ifr6.ifr_name)); memcpy(&ifr6.ifr_addr, &sin6, sizeof(ifr6.ifr_addr)); s = socket(PF_INET6, SOCK_DGRAM, 0); if (s < 0) printf("%% conf_ifaddrs: socket: %s\n", strerror(errno)); if (ioctl(s, SIOCGIFAFLAG_IN6, (caddr_t)&ifr6) < 0) { if (errno != EADDRNOTAVAIL) printf("%% conf_ifaddrs: " \ "SIOCGIFAFLAG_IN6: %s\n", strerror(errno)); } else { /* skip autoconf addresses */ if (ifr6.ifr_ifru.ifru_flags6 & IN6_IFF_AUTOCONF) continue; } if (flags & IFF_POINTOPOINT) { fprintf(output, " ip %s", routename6(sin6)); sin6dest = (struct sockaddr_in6 *)ifa->ifa_dstaddr; in6_fillscopeid(sin6dest); fprintf(output, " %s", routename6(sin6dest)); } else { fprintf(output, " ip %s", netname6(sin6, sin6mask)); } ippntd = 1; break; default: continue; } fprintf(output, "\n"); } freeifaddrs(ifap); return ippntd; }
int conf_ifaddrs(FILE *output, char *ifname, int flags, int af) { struct ifaddrs *ifa, *ifap; struct sockaddr_in *sin, *sinmask, *sindest; struct sockaddr_in6 *sin6, *sin6mask, *sin6dest; int ippntd = 0; if (getifaddrs(&ifap) != 0) { printf("%% conf: getifaddrs failed: %s\n", strerror(errno)); return(-1); } /* * Cycle through getifaddrs for interfaces with our * desired name that sport AF_INET | AF_INET6. Print * the IP and related information. */ for (ifa = ifap; ifa; ifa = ifa->ifa_next) { if (strncmp(ifname, ifa->ifa_name, IFNAMSIZ)) continue; switch (ifa->ifa_addr->sa_family) { case AF_INET: if (af != AF_INET && af != 0) continue; sin = (struct sockaddr_in *)ifa->ifa_addr; if (sin->sin_addr.s_addr == 0) continue; sinmask = (struct sockaddr_in *)ifa->ifa_netmask; if (flags & IFF_POINTOPOINT) { sindest = (struct sockaddr_in *)ifa->ifa_dstaddr; fprintf(output, " ip %s", routename4(sin->sin_addr.s_addr)); fprintf(output, " %s", inet_ntoa(sindest->sin_addr)); } else if (flags & IFF_BROADCAST) { sindest = (struct sockaddr_in *)ifa->ifa_broadaddr; fprintf(output, " ip %s", netname4(sin->sin_addr.s_addr, sinmask)); /* * no reason to save the broadcast addr * if it is standard (this should always * be true unless someone has messed up their * network or they are playing around...) */ if (ntohl(sindest->sin_addr.s_addr) != in4_brdaddr(sin->sin_addr.s_addr, sinmask->sin_addr.s_addr)) fprintf(output, " %s", inet_ntoa(sindest->sin_addr)); } else { fprintf(output, " ip %s", netname4(sin->sin_addr.s_addr, sinmask)); } ippntd = 1; break; case AF_INET6: if (af != AF_INET6 && af != 0) continue; sin6 = (struct sockaddr_in6 *)ifa->ifa_addr; sin6mask = (struct sockaddr_in6 *)ifa->ifa_netmask; if (IN6_IS_ADDR_UNSPECIFIED(&sin6->sin6_addr)) continue; if (!ipv6ll_db_compare(sin6, sin6mask, ifname)) continue; in6_fillscopeid(sin6); if (flags & IFF_POINTOPOINT) { fprintf(output, " ip %s", routename6(sin6)); sin6dest = (struct sockaddr_in6 *)ifa->ifa_dstaddr; in6_fillscopeid(sin6dest); fprintf(output, " %s", routename6(sin6dest)); } else { fprintf(output, " ip %s", netname6(sin6, sin6mask)); } ippntd = 1; break; default: continue; } fprintf(output, "\n"); } freeifaddrs(ifap); return ippntd; }