mirror of
https://github.com/Netflix/dial-reference.git
synced 2026-06-08 02:49:58 +00:00
Changes: * Added method to get mac and ip address for OSX. Current Linux method of query via SIOCGIFCONF doesn't work. Added code to read via getifaddrs() API. * Put non OSX specific code under #ifdef flags. * Removed few linker libraries which are not required (lcares and lrt). * Fixed many warnings. Tested on: OSX 10.12
81 lines
2.1 KiB
C
81 lines
2.1 KiB
C
#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;
|
|
}
|
|
|