コード例 #1
0
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;
}
コード例 #2
0
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;


}