diff options
author | Adam Ierymenko <adam.ierymenko@gmail.com> | 2014-08-07 06:35:54 -0700 |
---|---|---|
committer | Adam Ierymenko <adam.ierymenko@gmail.com> | 2014-08-07 06:35:54 -0700 |
commit | 80fc5849233c63b60c91e3fc1bf106b810e45c36 (patch) | |
tree | a945eb80c628923fef41b1e06c37d07c4e990ff8 | |
parent | b7389995f4003a2c1d1bb6b6ce9171be08565f6d (diff) | |
download | infinitytier-80fc5849233c63b60c91e3fc1bf106b810e45c36.tar.gz infinitytier-80fc5849233c63b60c91e3fc1bf106b810e45c36.zip |
Fix for GitHub issue #97
-rw-r--r-- | main.cpp | 6 | ||||
-rw-r--r-- | node/Utils.cpp | 23 | ||||
-rw-r--r-- | node/Utils.hpp | 15 |
3 files changed, 43 insertions, 1 deletions
@@ -729,12 +729,16 @@ int main(int argc,char **argv) // like OSX's launchd. if (upgPath) { Utils::rm((std::string(homeDir)+"/zerotier-one.pid").c_str()); + std::string updateLogPath(homeDir); + updateLogPath.append("/autoupdate.log"); + Utils::rm(updateLogPath.c_str()); + Utils::redirectUnixOutputs(updateLogPath.c_str(),(const char *)0); ::execl(upgPath,upgPath,(char *)0); } exitCode = 3; fprintf(stderr,"%s: abnormal termination: unable to execute update at %s\n",argv[0],(upgPath) ? upgPath : "(unknown path)"); } break; -#endif +#endif // __WINDOWS__ / __UNIX_LIKE__ case Node::NODE_UNRECOVERABLE_ERROR: { exitCode = 3; const char *termReason = node->reasonForTermination(); diff --git a/node/Utils.cpp b/node/Utils.cpp index b1912198..e1dbedaa 100644 --- a/node/Utils.cpp +++ b/node/Utils.cpp @@ -38,6 +38,7 @@ #include <errno.h> #include <fcntl.h> #include <sys/types.h> +#include <sys/stat.h> #include <sys/uio.h> #include <dirent.h> #endif @@ -50,6 +51,28 @@ namespace ZeroTier { const char Utils::HEXCHARS[16] = { '0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f' }; +bool Utils::redirectUnixOutputs(const char *stdoutPath,const char *stderrPath) + throw() +{ + int fdout = ::open(stdoutPath,O_WRONLY|O_CREAT); + if (fdout > 0) { + int fderr; + if (stderrPath) { + fderr = ::open(stderrPath,O_WRONLY|O_CREAT); + if (fderr <= 0) { + ::close(fdout); + return false; + } + } else fderr = fdout; + ::close(STDOUT_FILENO); + ::close(STDERR_FILENO); + ::dup2(fdout,STDOUT_FILENO); + ::dup2(fderr,STDERR_FILENO); + return true; + } + return false; +} + std::map<std::string,bool> Utils::listDirectory(const char *path) { std::map<std::string,bool> r; diff --git a/node/Utils.hpp b/node/Utils.hpp index bafe0b39..91620d78 100644 --- a/node/Utils.hpp +++ b/node/Utils.hpp @@ -58,6 +58,21 @@ namespace ZeroTier { class Utils { public: +#ifdef __UNIX_LIKE__ + /** + * Close STDOUT_FILENO and STDERR_FILENO and replace them with output to given path + * + * This can be called after fork() and prior to exec() to suppress output + * from a subprocess, such as auto-update. + * + * @param stdoutPath Path to file to use for stdout + * @param stderrPath Path to file to use for stderr, or NULL for same as stdout (default) + * @return True on success + */ + static bool redirectUnixOutputs(const char *stdoutPath,const char *stderrPath = (const char *)0) + throw(); +#endif + /** * Perform a time-invariant binary comparison * |