static int find_ip_from_mac(const char *stamac, char *staip)
{
FILE *fp = NULL;
char match_cmd[256] = {0};
char match_line[256] = {0};
sprintf(match_cmd, "cat /proc/net/arp | grep %s | awk \'{print $1}\'", stamac);
if (NULL == (fp = popen(match_cmd, "r"))) {
printf("popen failed...\n");
return -1;
}
/* get ARP. */
if (NULL == fgets(match_line, sizeof(match_line), fp)){
pclose(fp);
return -1;
}
else {
sprintf(staip, "%s", match_line);
staip[strlen(staip) - 1] = '\0';
pclose(fp);
/* match support device list. */
return 0;
}
}
static int find_mac_from_arptbl(char *staip, const char *devname, char *buf)
{
int fd = -1;
struct arpreq arpr;
unsigned char *eip;
int is_find = 0;
fd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if (fd < 0) {
goto end;
}
memset(&arpr, 0, sizeof(arpr));
inet_pton(AF_INET, staip, &((struct sockaddr_in*)&arpr.arp_pa)->sin_addr);
arpr.arp_pa.sa_family = AF_INET;
strcpy(arpr.arp_dev, devname);
if (ioctl(fd, SIOCGARP, (void *)&arpr) < 0) {
goto end;
}
if ((arpr.arp_flags & ATF_COM) == 0) {
goto end;
}
eip = (unsigned char *)arpr.arp_ha.sa_data;
if (NULL == eip) {
goto end;
}
sprintf(buf, "%02x%02x%02x%02x%02x%02x",
(unsigned char)eip[0],
(unsigned char)eip[1],
(unsigned char)eip[2],
(unsigned char)eip[3],
(unsigned char)eip[4],
(unsigned char)eip[5]);
is_find = 1;
end:
if (fd >= 0) { close(fd); }
return is_find;
}