//传入的参数是接口名,如eth0,返回值是mac地址
char * get_iface_mac(const char *ifname)
{
#if defined(__linux__)
int r, s;
struct ifreq ifr;
char *hwaddr, mac[13];
strcpy(ifr.ifr_name, ifname);
s = socket(PF_INET, SOCK_DGRAM, 0);
if (-1 == s) {
debug(LOG_ERR, "get_iface_mac socket: %s", strerror(errno));
return NULL;
}
r = ioctl(s, SIOCGIFHWADDR, &ifr);
if (r == -1) {
debug(LOG_ERR, "get_iface_mac ioctl(SIOCGIFHWADDR): %s", strerror(errno));
close(s);
return NULL;
}
hwaddr = ifr.ifr_hwaddr.sa_data;
close(s);
snprintf(mac, sizeof(mac), "%02X%02X%02X%02X%02X%02X",
hwaddr[0] & 0xFF,
hwaddr[1] & 0xFF,
hwaddr[2] & 0xFF,
hwaddr[3] & 0xFF,
hwaddr[4] & 0xFF,
hwaddr[5] & 0xFF
);
return safe_strdup(mac);
#elif defined(__NetBSD__)
struct ifaddrs *ifa, *ifap;
const char *hwaddr;
char mac[13], *str = NULL;
struct sockaddr_dl *sdl;
if (getifaddrs(&ifap) == -1) {
debug(LOG_ERR, "getifaddrs(): %s", strerror(errno));
return NULL;
}
for (ifa = ifap; ifa != NULL; ifa = ifa->ifa_next) {
if (strcmp(ifa->ifa_name, ifname) == 0 &&
ifa->ifa_addr->sa_family == AF_LINK)
break;
}
if (ifa == NULL) {
debug(LOG_ERR, "%s: no link-layer address assigned");
goto out;
}
sdl = (struct sockaddr_dl *)ifa->ifa_addr;
hwaddr = LLADDR(sdl);
snprintf(mac, sizeof(mac), "%02X%02X%02X%02X%02X%02X",
hwaddr[0] & 0xFF, hwaddr[1] & 0xFF,
hwaddr[2] & 0xFF, hwaddr[3] & 0xFF,
hwaddr[4] & 0xFF, hwaddr[5] & 0xFF);
str = safe_strdup(mac);
out:
freeifaddrs(ifap);
return str;
#else
return NULL;
#endif
}
根据传入的接口名获取相应的mac地址
最新推荐文章于 2024-09-12 23:09:37 发布