Tap driver load fix.

This commit is contained in:
Adam Ierymenko 2015-04-14 19:21:56 -07:00
parent c9af603b9f
commit 508519b62a

View File

@ -344,23 +344,20 @@ OSXEthernetTap::OSXEthernetTap(
Mutex::Lock _gl(globalTapCreateLock); Mutex::Lock _gl(globalTapCreateLock);
if (stat("/dev/zt0",&stattmp)) { if (::stat("/dev/zt0",&stattmp)) {
if (homePath) { long kextpid = (long)vfork();
long kextpid = (long)vfork(); if (kextpid == 0) {
if (kextpid == 0) { ::chdir(homePath);
::chdir(homePath); OSUtils::redirectUnixOutputs("/dev/null",(const char *)0);
OSUtils::redirectUnixOutputs("/dev/null",(const char *)0); ::execl("/sbin/kextload","/sbin/kextload","-q","-repository",homePath,"tap.kext",(const char *)0);
::execl("/sbin/kextload","/sbin/kextload","-q","-repository",homePath,"tap.kext",(const char *)0); ::_exit(-1);
::_exit(-1); } else if (kextpid > 0) {
} else if (kextpid > 0) { int exitcode = -1;
int exitcode = -1; ::waitpid(kextpid,&exitcode,0);
::waitpid(kextpid,&exitcode,0);
}
::usleep(500); // give tap device driver time to start up and try again
if (stat("/dev/zt0",&stattmp))
throw std::runtime_error("/dev/zt# tap devices do not exist and cannot load tap.kext");
} }
throw std::runtime_error("/dev/zt# tap devices do not exist and tap.kext not available"); ::usleep(500); // give tap device driver time to start up and try again
if (::stat("/dev/zt0",&stattmp))
throw std::runtime_error("/dev/zt# tap devices do not exist and cannot load tap.kext");
} }
// Try to reopen the last device we had, if we had one and it's still unused. // Try to reopen the last device we had, if we had one and it's still unused.