blob: ba9153ad2c3166385ef1030374e7eb2c1d250b25 [file] [log] [blame]
#include "LinuxInterfaces.h"
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
/* 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;
}