|
|
|
|
@ -209,8 +209,30 @@ MacEthernetTap::MacEthernetTap(
|
|
|
|
|
::_exit(-1); |
|
|
|
|
} else { |
|
|
|
|
_agentPid = apid; |
|
|
|
|
|
|
|
|
|
// Wait up to 10 seconds for the subprocess to actually create the device. This prevents
|
|
|
|
|
// things like routes from being created before the device exists.
|
|
|
|
|
for(int waitLoops=0;;++waitLoops) { |
|
|
|
|
struct ifaddrs *ifa = (struct ifaddrs *)0; |
|
|
|
|
if (!getifaddrs(&ifa)) { |
|
|
|
|
struct ifaddrs *p = ifa; |
|
|
|
|
while (p) { |
|
|
|
|
if ((p->ifa_name)&&(!strcmp(devstr, p->ifa_name))) { |
|
|
|
|
waitLoops = -1; |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
p = p->ifa_next; |
|
|
|
|
} |
|
|
|
|
freeifaddrs(ifa); |
|
|
|
|
} |
|
|
|
|
if (waitLoops == -1) { |
|
|
|
|
break; |
|
|
|
|
} else if (waitLoops >= 100) { // 10 seconds
|
|
|
|
|
throw std::runtime_error("feth device creation timed out"); |
|
|
|
|
} |
|
|
|
|
Thread::sleep(100); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
Thread::sleep(100); // this causes them to come up in a more user-friendly order on launch
|
|
|
|
|
|
|
|
|
|
_thread = Thread::start(this); |
|
|
|
|
} |
|
|
|
|
|