|
|
|
|
@ -36,6 +36,7 @@
|
|
|
|
|
#include "RuntimeEnvironment.hpp" |
|
|
|
|
#include "Utils.hpp" |
|
|
|
|
#include "Mutex.hpp" |
|
|
|
|
#include "Utils.hpp" |
|
|
|
|
|
|
|
|
|
// ff:ff:ff:ff:ff:ff with no ADI
|
|
|
|
|
static const ZeroTier::MulticastGroup _blindWildcardMulticastGroup(ZeroTier::MAC(0xff),0); |
|
|
|
|
@ -99,22 +100,22 @@ private:
|
|
|
|
|
inline void _findCmd(int id,const char *name) |
|
|
|
|
{ |
|
|
|
|
char tmp[4096]; |
|
|
|
|
sprintf(tmp,"/sbin/%s",name); |
|
|
|
|
ZeroTier::Utils::snprintf(tmp,sizeof(tmp),"/sbin/%s",name); |
|
|
|
|
if (ZeroTier::Utils::fileExists(tmp)) { |
|
|
|
|
_paths[id] = tmp; |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
sprintf(tmp,"/usr/sbin/%s",name); |
|
|
|
|
ZeroTier::Utils::snprintf(tmp,sizeof(tmp),"/usr/sbin/%s",name); |
|
|
|
|
if (ZeroTier::Utils::fileExists(tmp)) { |
|
|
|
|
_paths[id] = tmp; |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
sprintf(tmp,"/bin/%s",name); |
|
|
|
|
ZeroTier::Utils::snprintf(tmp,sizeof(tmp),"/bin/%s",name); |
|
|
|
|
if (ZeroTier::Utils::fileExists(tmp)) { |
|
|
|
|
_paths[id] = tmp; |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
sprintf(tmp,"/usr/bin/%s",name); |
|
|
|
|
ZeroTier::Utils::snprintf(tmp,sizeof(tmp),"/usr/bin/%s",name); |
|
|
|
|
if (ZeroTier::Utils::fileExists(tmp)) { |
|
|
|
|
_paths[id] = tmp; |
|
|
|
|
return; |
|
|
|
|
@ -178,8 +179,8 @@ EthernetTap::EthernetTap(
|
|
|
|
|
int devno = 0; |
|
|
|
|
struct stat sbuf; |
|
|
|
|
do { |
|
|
|
|
sprintf(ifr.ifr_name,"zt%d",devno++); |
|
|
|
|
sprintf(procpath,"/proc/sys/net/ipv4/conf/%s",ifr.ifr_name); |
|
|
|
|
Utils::snprintf(ifr.ifr_name,sizeof(ifr.ifr_name),"zt%d",devno++); |
|
|
|
|
Utils::snprintf(procpath,sizeof(procpath),"/proc/sys/net/ipv4/conf/%s",ifr.ifr_name); |
|
|
|
|
} while (stat(procpath,&sbuf) == 0); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ -292,12 +293,12 @@ EthernetTap::EthernetTap(
|
|
|
|
|
|
|
|
|
|
// Open the first available device (ones in use will fail with resource busy)
|
|
|
|
|
for(int i=0;i<256;++i) { |
|
|
|
|
sprintf(devpath,"/dev/zt%d",i); |
|
|
|
|
Utils::snprintf(devpath,sizeof(devpath),"/dev/zt%d",i); |
|
|
|
|
if (stat(devpath,&tmp)) |
|
|
|
|
throw std::runtime_error("no more TAP devices available"); |
|
|
|
|
_fd = ::open(devpath,O_RDWR); |
|
|
|
|
if (_fd > 0) { |
|
|
|
|
sprintf(_dev,"zt%d",i); |
|
|
|
|
Utils::snprintf(_dev,sizeof(_dev),"zt%d",i); |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
@ -316,8 +317,8 @@ EthernetTap::EthernetTap(
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Configure MAC address and MTU, bring interface up
|
|
|
|
|
sprintf(ethaddr,"%.2x:%.2x:%.2x:%.2x:%.2x:%.2x",(int)mac[0],(int)mac[1],(int)mac[2],(int)mac[3],(int)mac[4],(int)mac[5]); |
|
|
|
|
sprintf(mtustr,"%u",mtu); |
|
|
|
|
Utils::snprintf(ethaddr,sizeof(ethaddr),"%.2x:%.2x:%.2x:%.2x:%.2x:%.2x",(int)mac[0],(int)mac[1],(int)mac[2],(int)mac[3],(int)mac[4],(int)mac[5]); |
|
|
|
|
Utils::snprintf(mtustr,sizeof(mtustr),"%u",mtu); |
|
|
|
|
long cpid; |
|
|
|
|
if ((cpid = (long)vfork()) == 0) { |
|
|
|
|
execl(ifconfig,ifconfig,_dev,"lladdr",ethaddr,"mtu",mtustr,"up",(const char *)0); |
|
|
|
|
@ -895,7 +896,7 @@ EthernetTap::EthernetTap(
|
|
|
|
|
// If we have a device, configure it
|
|
|
|
|
if (_myDeviceInstanceId.length() > 0) { |
|
|
|
|
char tmps[4096]; |
|
|
|
|
unsigned int tmpsl = sprintf_s(tmps,"%.2X-%.2X-%.2X-%.2X-%.2X-%.2X",(unsigned int)mac.data[0],(unsigned int)mac.data[1],(unsigned int)mac.data[2],(unsigned int)mac.data[3],(unsigned int)mac.data[4],(unsigned int)mac.data[5]) + 1; |
|
|
|
|
unsigned int tmpsl = Utils::snprintf(tmps,sizeof(tmps),"%.2X-%.2X-%.2X-%.2X-%.2X-%.2X",(unsigned int)mac.data[0],(unsigned int)mac.data[1],(unsigned int)mac.data[2],(unsigned int)mac.data[3],(unsigned int)mac.data[4],(unsigned int)mac.data[5]) + 1; |
|
|
|
|
RegSetKeyValueA(nwAdapters,mySubkeyName.c_str(),"NetworkAddress",REG_SZ,tmps,tmpsl); |
|
|
|
|
RegSetKeyValueA(nwAdapters,mySubkeyName.c_str(),"MAC",REG_SZ,tmps,tmpsl); |
|
|
|
|
DWORD tmp = mtu; |
|
|
|
|
@ -961,7 +962,7 @@ EthernetTap::EthernetTap(
|
|
|
|
|
|
|
|
|
|
// Open the tap, which is in this weird Windows analog of /dev
|
|
|
|
|
char tapPath[4096]; |
|
|
|
|
sprintf_s(tapPath,"\\\\.\\Global\\%s.tap",_myDeviceInstanceId.c_str()); |
|
|
|
|
Utils::snprintf(tapPath,sizeof(tapPath),"\\\\.\\Global\\%s.tap",_myDeviceInstanceId.c_str()); |
|
|
|
|
_tap = CreateFileA(tapPath,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_SYSTEM|FILE_FLAG_OVERLAPPED,NULL); |
|
|
|
|
if (_tap == INVALID_HANDLE_VALUE) |
|
|
|
|
throw std::runtime_error("unable to open tap in \\\\.\\Global\\ namespace"); |
|
|
|
|
|