В соответствии с документацией вместо
execfile("./filename")
Используйте
exec(open("./filename").read())
См.:
Что-то вроде этого должно это сделать:
char mac[6 * 2 + 5 + 1];
for(size_t i = 0, pos = 0; i < sizeof ethernet->ether_dhost; i++)
{
if(i > 0)
mac[pos++] = ':';
sprintf(mac + pos, "%02x", (unsigned int) ethernet->ether_dhost[i] & 0xffu);
}
Это также вставляет двоеточия между каждым байтом, поэтому вывод будет выглядеть как DE:AD:BE:EF:BA:BE
, который как MAC-адреса обычно форматируются для Ethernet.
Как насчет:
printf("%02x:%02x:%02x:%02x:%02x:%02x",
(unsigned)ethernet->ether_dhost[0],
(unsigned)ethernet->ether_dhost[1],
(unsigned)ethernet->ether_dhost[2],
(unsigned)ethernet->ether_dhost[3],
(unsigned)ethernet->ether_dhost[4],
(unsigned)ethernet->ether_dhost[5]);
Я думаю, лучший способ - использовать ether_ntoa (), который доступен практически для любой операционной системы * nix (доступной в net / ethernet.h). Для меня это хорошо работает.
char *addr;
struct ether_addr host;
memcpy(&host, ethernet->ether_dhost, sizeof(host));
addr = ether_ntoa(&host);