diff --git a/main.cpp b/main.cpp index 153ced78d..6485b8ff7 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 b4e0a5d04..a982a4222 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) {