summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--main.cpp9
-rw-r--r--osnet/OSXEthernetTapFactory.cpp4
2 files changed, 12 insertions, 1 deletions
diff --git a/main.cpp b/main.cpp
index 153ced78..6485b8ff 100644
--- a/main.cpp
+++ b/main.cpp
@@ -707,6 +707,7 @@ int main(int argc,char **argv)
RoutingTable *routingTable = ZTCreatePlatformRoutingTable;
node = new Node(homeDir,tapFactory,routingTable,udpPort,tcpPort,needsReset);
+
switch(node->run()) {
#ifdef __WINDOWS__
case Node::NODE_RESTART_FOR_UPGRADE: {
@@ -739,18 +740,24 @@ int main(int argc,char **argv)
fprintf(stderr,"%s: abnormal termination: unable to execute update at %s\n",argv[0],(upgPath) ? upgPath : "(unknown path)");
} break;
#endif // __WINDOWS__ / __UNIX_LIKE__
+
case Node::NODE_UNRECOVERABLE_ERROR: {
exitCode = 3;
const char *termReason = node->reasonForTermination();
fprintf(stderr,"%s: abnormal termination: %s\n",argv[0],(termReason) ? termReason : "(unknown reason)");
} break;
+
default:
break;
}
+
delete node;
node = (Node *)0;
+ } catch ( std::exception &exc ) {
+ fprintf(stderr,"%s: unexpected exception: %s"ZT_EOL_S,argv[0],exc.what());
+ exitCode = 3;
} catch ( ... ) {
- fprintf(stderr,"%s: unexpected exception!"ZT_EOL_S,argv[0]);
+ fprintf(stderr,"%s: unexpected exception: unknown exception"ZT_EOL_S,argv[0]);
exitCode = 3;
}
diff --git a/osnet/OSXEthernetTapFactory.cpp b/osnet/OSXEthernetTapFactory.cpp
index b4e0a5d0..a982a422 100644
--- a/osnet/OSXEthernetTapFactory.cpp
+++ b/osnet/OSXEthernetTapFactory.cpp
@@ -34,6 +34,8 @@
#include "OSXEthernetTapFactory.hpp"
#include "OSXEthernetTap.hpp"
+#include "../node/Utils.hpp"
+
namespace ZeroTier {
OSXEthernetTapFactory::OSXEthernetTapFactory(const char *pathToTapKext,const char *tapKextName) :
@@ -47,6 +49,7 @@ OSXEthernetTapFactory::OSXEthernetTapFactory(const char *pathToTapKext,const cha
long kextpid = (long)vfork();
if (kextpid == 0) {
::chdir(_pathToTapKext.c_str());
+ Utils::redirectUnixOutputs("/dev/null",(const char *)0);
::execl("/sbin/kextload","/sbin/kextload","-q","-repository",_pathToTapKext.c_str(),_tapKextName.c_str(),(const char *)0);
::_exit(-1);
} else if (kextpid > 0) {
@@ -76,6 +79,7 @@ OSXEthernetTapFactory::~OSXEthernetTapFactory()
sprintf(tmp,"%s/%s",_pathToTapKext.c_str(),_tapKextName.c_str());
long kextpid = (long)vfork();
if (kextpid == 0) {
+ Utils::redirectUnixOutputs("/dev/null",(const char *)0);
::execl("/sbin/kextunload","/sbin/kextunload",tmp,(const char *)0);
::_exit(-1);
} else if (kextpid > 0) {