Exemplo n.º 1
0
my_bool my_gethwaddr(uchar *to)
{
  size_t len;
  uchar  *buf, *next, *end, *addr;
  struct if_msghdr *ifm;
  struct sockaddr_dl *sdl;
  int i, res=1, mib[6]={CTL_NET, AF_ROUTE, 0, AF_LINK, NET_RT_IFLIST, 0};

  if (sysctl(mib, 6, NULL, &len, NULL, 0) == -1)
    goto err;
  if (!(buf = alloca(len)))
    goto err;
  if (sysctl(mib, 6, buf, &len, NULL, 0) < 0)
    goto err;

  end = buf + len;

  for (next = buf ; res && next < end ; next += ifm->ifm_msglen)
  {
    ifm = (struct if_msghdr *)next;
    if (ifm->ifm_type == RTM_IFINFO)
    {
      sdl = (struct sockaddr_dl *)(ifm + 1);
      addr=LLADDR(sdl);
      res=memcpy_and_test(to, addr, ETHER_ADDR_LEN);
    }
  }

err:
  return res;
}
Exemplo n.º 2
0
my_bool my_gethwaddr(uchar *to)
{
  my_bool res= 1;

  IP_ADAPTER_INFO *info= NULL;
  ULONG info_len= 0;

  if (GetAdaptersInfo(info, &info_len) != ERROR_BUFFER_OVERFLOW)
    goto err;

  info= (IP_ADAPTER_INFO *)alloca(info_len);

  if (GetAdaptersInfo(info, &info_len) != NO_ERROR)
    goto err;

  while (info && res)
  {
    if (info->Type == MIB_IF_TYPE_ETHERNET &&
        info->AddressLength == ETHER_ADDR_LEN)
    {
      res= memcpy_and_test(to, info->Address, ETHER_ADDR_LEN);
    }
    info = info->Next;
  }

err:
  return res;
}
Exemplo n.º 3
0
my_bool my_gethwaddr(uchar *to)
{
  int fd, res= 1;
  struct ifreq ifr[32];
  struct ifconf ifc;

  ifc.ifc_req= ifr;
  ifc.ifc_len= sizeof(ifr);

  fd = socket(AF_INET, SOCK_DGRAM, 0);
  if (fd < 0)
    goto err;

  if (ioctl(fd, SIOCGIFCONF, (char*)&ifc) >= 0)
  {
    uint i;
    for (i= 0; res && i < ifc.ifc_len / sizeof(ifr[0]); i++)
    {
#ifdef __linux__
      if (ioctl(fd, SIOCGIFHWADDR, &ifr[i]) >= 0)
        res= memcpy_and_test(to, (uchar *)&ifr[i].ifr_hwaddr.sa_data,
                             ETHER_ADDR_LEN);
#else
      /*
        A bug in OpenSolaris used to prevent non-root from getting a mac address:
        {no url. Oracle killed the old OpenSolaris bug database}

        Thus, we'll use an alternative method and extract the address from the
        arp table.
      */
      struct arpreq arpr;
      arpr.arp_pa= ifr[i].ifr_addr;

      if (ioctl(fd, SIOCGARP, (char*)&arpr) >= 0)
        res= memcpy_and_test(to, (uchar *)&arpr.arp_ha.sa_data,
                             ETHER_ADDR_LEN);
#endif
    }
  }

  close(fd);
err:
  return res;
}
Exemplo n.º 4
0
my_bool my_gethwaddr(uchar *to)
{
  int fd, res=1;
  struct ifreq ifr;

  fd = socket(AF_INET, SOCK_DGRAM, 0);
  if (fd < 0)
    goto err;

  bzero(&ifr, sizeof(ifr));
  strnmov(ifr.ifr_name, "eth0", sizeof(ifr.ifr_name) - 1);

  do {
    if (ioctl(fd, SIOCGIFHWADDR, &ifr) >= 0)
      res=memcpy_and_test(to, (uchar *)&ifr.ifr_hwaddr.sa_data, ETHER_ADDR_LEN);
  } while (res && (errno == 0 || errno == ENODEV) && ifr.ifr_name[3]++ < '6');

  close(fd);
err:
  return res;
}