|
|
|
|
@ -79,6 +79,7 @@ MacEthernetTap::MacEthernetTap(
|
|
|
|
|
_homePath(homePath), |
|
|
|
|
_mtu(mtu), |
|
|
|
|
_metric(metric), |
|
|
|
|
_devNo(0), |
|
|
|
|
_agentStdin(-1), |
|
|
|
|
_agentStdout(-1), |
|
|
|
|
_agentStderr(-1), |
|
|
|
|
@ -97,7 +98,7 @@ MacEthernetTap::MacEthernetTap(
|
|
|
|
|
agentPath.push_back(ZT_PATH_SEPARATOR); |
|
|
|
|
agentPath.append("MacEthernetTapAgent"); |
|
|
|
|
if (!OSUtils::fileExists(agentPath.c_str())) |
|
|
|
|
throw std::runtime_error("MacEthernetTapAgent not installed in ZeroTier home"); |
|
|
|
|
throw std::runtime_error("MacEthernetTapAgent not present in ZeroTier home"); |
|
|
|
|
|
|
|
|
|
Mutex::Lock _gl(globalTapCreateLock); // only make one at a time
|
|
|
|
|
|
|
|
|
|
@ -112,7 +113,7 @@ MacEthernetTap::MacEthernetTap(
|
|
|
|
|
while (p) { |
|
|
|
|
int nameLen = (int)strlen(p->ifa_name); |
|
|
|
|
// Delete feth# from feth0 to feth9999, but don't touch >10000.
|
|
|
|
|
if ((!strncmp(p->ifa_name,"feth",4))&&(nameLen >= 5)&&(nameLen < 9)&&(deleted.count(std::string(p->ifa_name)) == 0)) { |
|
|
|
|
if ((!strncmp(p->ifa_name,"feth",4))&&(nameLen >= 5)&&(nameLen <= 8)&&(deleted.count(std::string(p->ifa_name)) == 0)) { |
|
|
|
|
deleted.insert(std::string(p->ifa_name)); |
|
|
|
|
const char *args[4]; |
|
|
|
|
args[0] = "/sbin/ifconfig"; |
|
|
|
|
@ -156,10 +157,11 @@ MacEthernetTap::MacEthernetTap(
|
|
|
|
|
if (devNo < 100) |
|
|
|
|
devNo = 100; |
|
|
|
|
} else { |
|
|
|
|
_dev = devstr; |
|
|
|
|
_devNo = devNo; |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
_dev = devstr; |
|
|
|
|
|
|
|
|
|
if (::pipe(_shutdownSignalPipe)) |
|
|
|
|
throw std::runtime_error("pipe creation failed"); |
|
|
|
|
@ -204,22 +206,60 @@ MacEthernetTap::MacEthernetTap(
|
|
|
|
|
|
|
|
|
|
MacEthernetTap::~MacEthernetTap() |
|
|
|
|
{ |
|
|
|
|
char tmp[64]; |
|
|
|
|
const char *args[4]; |
|
|
|
|
pid_t pid0,pid1; |
|
|
|
|
|
|
|
|
|
MacDNSHelper::removeDNS(_nwid); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Mutex::Lock _gl(globalTapCreateLock); |
|
|
|
|
::write(_shutdownSignalPipe[1],"\0",1); // causes thread to exit
|
|
|
|
|
Thread::join(_thread); |
|
|
|
|
::close(_shutdownSignalPipe[0]); |
|
|
|
|
::close(_shutdownSignalPipe[1]); |
|
|
|
|
|
|
|
|
|
int ec = 0; |
|
|
|
|
::kill(_agentPid,SIGTERM); |
|
|
|
|
::waitpid(_agentPid,&ec,0); |
|
|
|
|
::kill(_agentPid,SIGKILL); |
|
|
|
|
|
|
|
|
|
::close(_agentStdin); |
|
|
|
|
::close(_agentStdout); |
|
|
|
|
::close(_agentStderr); |
|
|
|
|
::close(_agentStdin2); |
|
|
|
|
::close(_agentStdout2); |
|
|
|
|
::close(_agentStderr2); |
|
|
|
|
|
|
|
|
|
::waitpid(_agentPid,&ec,0); |
|
|
|
|
|
|
|
|
|
args[0] = "/sbin/ifconfig"; |
|
|
|
|
args[1] = _dev.c_str(); |
|
|
|
|
args[2] = "destroy"; |
|
|
|
|
args[3] = (char *)0; |
|
|
|
|
pid0 = vfork(); |
|
|
|
|
if (pid0 == 0) { |
|
|
|
|
execv(args[0],const_cast<char **>(args)); |
|
|
|
|
_exit(-1); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
snprintf(tmp,sizeof(tmp),"feth%u",_devNo + 5000); |
|
|
|
|
//args[0] = "/sbin/ifconfig";
|
|
|
|
|
args[1] = tmp; |
|
|
|
|
//args[2] = "destroy";
|
|
|
|
|
//args[3] = (char *)0;
|
|
|
|
|
pid1 = vfork(); |
|
|
|
|
if (pid1 == 0) { |
|
|
|
|
execv(args[0],const_cast<char **>(args)); |
|
|
|
|
_exit(-1); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (pid0 > 0) { |
|
|
|
|
int rv = 0; |
|
|
|
|
waitpid(pid0,&rv,0); |
|
|
|
|
} |
|
|
|
|
if (pid1 > 0) { |
|
|
|
|
int rv = 0; |
|
|
|
|
waitpid(pid1,&rv,0); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
Thread::join(_thread); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void MacEthernetTap::setEnabled(bool en) { _enabled = en; } |
|
|
|
|
|