Example #1
0
/*
 * 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;
}
Example #2
0
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);
}