#include "LinuxInterfaces.h" #include #include #include /* Fetch the MACAddress of a network interface */ int getMACAddress(char* ifname, char* macBuf, unsigned int macBufSize) { struct ifreq ifr; int sock; unsigned char chMAC[6]; sock=socket(AF_INET,SOCK_DGRAM,0); strcpy( ifr.ifr_name, ifname ); ifr.ifr_addr.sa_family = AF_INET; if (ioctl( sock, SIOCGIFHWADDR, &ifr ) < 0) { close(sock); return -1; } memcpy(chMAC, ifr.ifr_hwaddr.sa_data, 6); if (macBufSize<32){ close(sock); return -1; }else{ sprintf(macBuf,"%02X:%02X:%02X:%02X:%02X:%02X",chMAC[0],chMAC[1],chMAC[2],chMAC[3],chMAC[4],chMAC[5]); } close(sock); return 0; } bool hasRoute(const char *nf, int flag) { bool result = false; const char* fileName = "/proc/net/route"; int r; FILE* fp = fopen(fileName, "r"); if (fp) { char line[1024]; int nfBegin = 0, nfEnd = 0, nfFlag = 0; const int nfLen = strlen(nf); while (!feof(fp)) { if (!fgets(line, sizeof(line), fp)) break; r = sscanf(line, "%n%*s%n %*s %*s %d %*s %*s %*s %*s %*s %*s %*s", &nfBegin, &nfEnd, &nfFlag); if (r == 1 && nfBegin == 0 && nfEnd == nfLen && !strncmp(nf, line, nfLen) && (flag == -1 || nfFlag == flag)) { result = true; break; } } fclose(fp); } return result; } bool isDefault(char *nf) { return hasRoute(nf, 0x03); } NetInterface getDefaultNetworkInterfaces() { DIR *d; struct dirent *dir; d = opendir("/sys/class/net/"); NetInterface defaultNet; if (d){ while ((dir = readdir(d)) != NULL){ if(strcmp(dir->d_name,".") && strcmp(dir->d_name,"..")){ if (hasRoute(dir->d_name, -1) && isDefault(dir->d_name)){ getMACAddress(dir->d_name, defaultNet.macAddress, MACBUFSIZE); break; } } } closedir(d); } return defaultNet; }