| #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; |
| } |