/* * checks for ip address for hit */ int hip_hit_to_ip(hip_hit_t *hit, struct in6_addr *retval) { struct addrinfo *rp = NULL; // no C99 :( char hit_to_ip_hostname[64+HIT_TO_IP_ZONE_MAX_LEN+1]; int found_addr = 0; struct addrinfo hints; struct addrinfo *result = NULL; int res; if ((hit == NULL)||(retval == NULL)) return ERR; if (hip_get_hit_to_ip_hostname(hit, hit_to_ip_hostname, sizeof(hit_to_ip_hostname))!=OK) return ERR; memset(&hints, 0, sizeof(hints)); hints.ai_family = AF_UNSPEC; /* Allow IPv4 or IPv6 */ hints.ai_socktype = SOCK_DGRAM; /* Datagram socket. Right? */ hints.ai_flags = AI_PASSIVE; /* For wildcard IP address */ hints.ai_protocol = 0; /* Any protocol */ hints.ai_canonname = NULL; hints.ai_addr = NULL; hints.ai_next = NULL; /* getaddrinfo is too complex for DNS lookup, but let us use it now */ res = getaddrinfo( hit_to_ip_hostname, NULL, &hints, &result ); HIP_DEBUG("getaddrinfo(%s) returned %d\n", hit_to_ip_hostname, res); if (res!=0) { HIP_DEBUG("getaddrinfo error %s\n", gai_strerror(res)); return ERR; } /* Look at the list and return only one address, let us prefer AF_INET */ for (rp = result; rp != NULL; rp = rp->ai_next) { HIP_DEBUG_SOCKADDR("getaddrinfo result", rp->ai_addr); if (rp->ai_family == AF_INET) { struct sockaddr_in *tmp_sockaddr_in_ptr = (struct sockaddr_in *) (rp->ai_addr); IPV4_TO_IPV6_MAP(&(tmp_sockaddr_in_ptr->sin_addr), retval) found_addr = 1; break; } else if (rp->ai_family == AF_INET6) { struct sockaddr_in6 *tmp_sockaddr_in6_ptr = (struct sockaddr_in6 *) (rp->ai_addr); ipv6_addr_copy(retval, &(tmp_sockaddr_in6_ptr->sin6_addr)); found_addr = 1; } } if (result) freeaddrinfo(result); if (found_addr) return OK; else return ERR; }
int main(int argc,char *argv[]) { struct ifaddrs *g_ifaces = NULL, *g_iface; struct if_nameindex *i_ifaces = NULL, *i_iface; int err = 0; char *default_str = "<unknown>"; char addr_str[INET6_ADDRSTRLEN+1]; /* Segfault? Alloc this dynamically?x */ /* getifaddrs */ err = getifaddrs(&g_ifaces); if (err) { HIP_ERROR("getifaddr failed\n"); goto out; } printf("===getifaddrs===\n"); for (g_iface = g_ifaces; g_iface; g_iface = g_iface->ifa_next) { sa_family_t family = g_iface->ifa_addr->sa_family; fprintf(stderr, "name: %s, family: %d, address ", g_iface->ifa_name, family); HIP_DEBUG_SOCKADDR(NULL, g_iface->ifa_addr); } /* if_nameindex */ printf("===nameindex===\n"); i_ifaces = if_nameindex(); for (i_iface = i_ifaces; i_iface->if_index; i_iface++) { fprintf(stderr, "name: %s index: %d\n", i_iface->if_name, i_iface->if_index); } out: if (g_ifaces) freeifaddrs(g_ifaces); if (i_ifaces) if_freenameindex(i_ifaces); }