#include #include #include #include #include #include #include #include int main(void) { int sd; struct ifreq ifr, *ifrp; struct ifconf ifc; char buf[1024]; int n, i; unsigned char *a; struct sockaddr_dl *sdlp; #ifndef max #define max(a,b) ((a) > (b) ? (a) : (b)) #endif #define ifreq_size(i) max(sizeof(struct ifreq),\ sizeof((i).ifr_name)+(i).ifr_addr.sa_len) sd = socket(AF_INET, SOCK_DGRAM, IPPROTO_IP); if (sd < 0) { return -1; } memset(buf, 0, sizeof(buf)); ifc.ifc_len = sizeof(buf); ifc.ifc_buf = buf; if (ioctl (sd, SIOCGIFCONF, (char *)&ifc) < 0) { close(sd); return -1; } n = ifc.ifc_len; for (i = 0; i < n; i+= ifreq_size(*ifrp) ) { ifrp = (struct ifreq *)((char *) ifc.ifc_buf+i); strncpy(ifr.ifr_name, ifrp->ifr_name, IFNAMSIZ); #ifdef SIOCGIFHWADDR #error SIOCGIFHWADDR #else #ifdef SIOCGENADDR #error SIOCGENADDR #else #ifdef AF_LINK sdlp = (struct sockaddr_dl *) &ifrp->ifr_addr; if ((sdlp->sdl_family != AF_LINK) || (sdlp->sdl_alen != 6)) continue; a = (unsigned char *) &sdlp->sdl_data[sdlp->sdl_nlen]; #else #error "No options" #endif /* AF_LINK */ #endif /* SIOCGENADDR */ #endif /* SIOCGIFHWADDR */ /* * Skip interfaces that return either 00:00:00:00:00:00 or * 02:00:00:00:00:00. */ //if ((!a[0] || a[0] == 0x02) && !a[1] && !a[2] && !a[3] && !a[4] && !a[5]) // continue; printf("%02x:%02x:%02x:%02x:%02x:%02x\n", (int)(a[0]), (int)(a[1]), (int)(a[2]), (int)(a[3]), (int)(a[4]), (int)(a[5])); } close(sd); return 0; }