Спасибо всем за ответы.Действительно, есть функция getifaddrs, возвращающая все адреса (и МАКи) для всех интерфейсов. И как я понимаю, она использует всё тот-же ioctl с запросом SIOCGIFADDR (или что-то вроде).
Кому нужно, вот пример:
#include <sys/types.h> // библиотека различных "макротипов"
#include <sys/socket.h> // библиотека для работы с сокетами
#include <net/if_dl.h> // библиотека для работы с Link Layer адресами
#include <ifaddrs.h> // библиотека для работы с адресами интерфейсов
#include <string.h> // библиотека работы со строками
/* Функция получения MAC-адреса, возвращает структуру типа ether_addr (ethernet.h)*/
struct ether_addr *GetMyMAC(
char *ifname // входной параметр - имя интерфейса
){
struct ifaddrs *ifa, *ifap; // структуры (ifaddrs.h) для получения адресов интерфейсов
struct sockaddr_dl *sdl; // структура (if_dl.h) содержит MAC-адресс (и не только)
/* получение всех адресов (Ethernet, IP, IP6 ... ) всех интерфейсов */
if(getifaddrs(&ifap)<0 ) return (NULL);
for(ifa = ifap; ifa; ifa = ifa->ifa_next){
/* поиск нужного интерфейса и адреса */
if( (ifa->ifa_addr->sa_family != AF_LINK) || // поиск по типу адреса Link Layer
(strcmp(ifa->ifa_name,ifname) != 0) ) { // поиск по имени интерфейса
continue;
}
freeifaddrs(ifap); // очистка памяти - необязательно
return (struct ether_addr *)
(LLADDR((struct sockaddr_dl *)ifa->ifa_addr)); // возврат MAC-адресa
}
freeifaddrs(ifap); // очистка памяти
return(NULL); // возврат ошибки
}
int main(){
struct ether_addr *MAC = GetMyMAC("bge0");
if(MAC != NULL) printf("My MAC is %s\n", ether_ntoa(MAC));
else printf("Can't get MAC\n");
}