int c_get_network_interfaces(struct network_interface *ns, int max_ns) { struct sockaddr *addr; IP_ADAPTER_ADDRESSES *adapters, *adapter; IP_ADAPTER_UNICAST_ADDRESS *unicast; ULONG buffer_size; DWORD error; int family, i; /* make an initial call to get the necessary * size into the buffer_size variable */ error = get_adapters_addresses(NULL, &buffer_size); if (error != ERROR_BUFFER_OVERFLOW) { /* if we didn't get ERROR_BUFFER_OVERFLOW * then buffer_size was not set */ return 0; } adapters = malloc(buffer_size); error = get_adapters_addresses(adapters, &buffer_size); i = 0; if (error == NO_ERROR) { adapter = adapters; while (i < max_ns && adapter) { wszcopy(ns[i].name, adapter->FriendlyName, NAME_SIZE); memcpy(ns[i].mac_address, adapter->PhysicalAddress, MAC_SIZE); for (unicast = adapter->FirstUnicastAddress; unicast; unicast = unicast->Next) { addr = unicast->Address.lpSockaddr; family = addr->sa_family; if (family == AF_INET) { ipv4copy(&ns[i].ip_address, addr); } else if (family == AF_INET6) { ipv6copy(&ns[i].ip6_address, addr); } } i++; adapter = adapter->Next; } } free(adapters); return i; }
static Boolean ssh_dns_resolver_get_xp(SshDNSResolver resolver) { HMODULE module; p_get_adapters_addresses get_adapters_addresses; IP_ADAPTER_ADDRESSES *adapter_addresses, *adapter; IP_ADAPTER_DNS_SERVER_ADDRESS *dns_address; SshUInt32 size; SshUInt32 result; SshIpAddrStruct address[1]; Boolean added = FALSE; module = LoadLibrary(TEXT("iphlpapi")); if (module == NULL) { SSH_DEBUG(SSH_D_FAIL, ("Unable to load iphelper library")); return FALSE; } get_adapters_addresses = (p_get_adapters_addresses) GetProcAddress(module, TEXT("GetAdaptersAddresses")); if (get_adapters_addresses == NULL) { SSH_DEBUG(SSH_D_FAIL, ("Could not find GetAdaptersAddresses" " function in the library")); goto exit_function; } result = get_adapters_addresses(AF_UNSPEC, GAA_FLAG_SKIP_ANYCAST | GAA_FLAG_SKIP_FRIENDLY_NAME | GAA_FLAG_SKIP_MULTICAST, NULL, NULL, &size); if (result != ERROR_BUFFER_OVERFLOW) { SSH_DEBUG(SSH_D_FAIL, ("Unable to get the size of Interface info. Error is %d", result)); goto exit_function; } adapter_addresses = ssh_calloc(1, size); if (adapter_addresses == NULL) { SSH_DEBUG(SSH_D_FAIL, ("Unable to allocate memory")); goto exit_function; } result = get_adapters_addresses(AF_UNSPEC, GAA_FLAG_SKIP_ANYCAST | GAA_FLAG_SKIP_FRIENDLY_NAME | GAA_FLAG_SKIP_MULTICAST, NULL, adapter_addresses, &size); if (result != NO_ERROR) { SSH_DEBUG(SSH_D_FAIL, ("Call to GetAdaptersAddresses failed." " Error 0x%x", result)); goto exit_function; } adapter = adapter_addresses; while (adapter) { if ((adapter->OperStatus != IfOperStatusUp) || (adapter->IfType == IF_TYPE_SOFTWARE_LOOPBACK) || (adapter->IfType == IF_TYPE_TUNNEL)) goto loop; dns_address = (PIP_ADAPTER_DNS_SERVER_ADDRESS) adapter->FirstDnsServerAddress; while (dns_address) { if (((SOCKADDR *)dns_address->Address.lpSockaddr)->sa_family == AF_INET) SSH_IP4_DECODE(address, &((PSOCKADDR_IN)dns_address->Address.lpSockaddr) ->sin_addr.s_addr); else if (((SOCKADDR *)dns_address->Address.lpSockaddr)->sa_family == AF_INET6) SSH_IP6_DECODE(address, &((PSOCKADDR_IN6)dns_address->Address.lpSockaddr) ->sin6_addr.s6_addr); else goto next; ssh_dns_resolver_safety_belt_add(resolver, 1, address); added = TRUE; SSH_DEBUG(SSH_D_NICETOKNOW, ("Added DNS server %@", ssh_ipaddr_render, address)); next: dns_address = dns_address->Next; } loop: adapter = adapter->Next; } ssh_free(adapter_addresses); exit_function: FreeLibrary(module); return added; }