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; }
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; }
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; }
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; }