summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdam Ierymenko <adam.ierymenko@gmail.com>2014-08-07 06:35:54 -0700
committerAdam Ierymenko <adam.ierymenko@gmail.com>2014-08-07 06:35:54 -0700
commit80fc5849233c63b60c91e3fc1bf106b810e45c36 (patch)
treea945eb80c628923fef41b1e06c37d07c4e990ff8
parentb7389995f4003a2c1d1bb6b6ce9171be08565f6d (diff)
downloadinfinitytier-80fc5849233c63b60c91e3fc1bf106b810e45c36.tar.gz
infinitytier-80fc5849233c63b60c91e3fc1bf106b810e45c36.zip
Fix for GitHub issue #97
-rw-r--r--main.cpp6
-rw-r--r--node/Utils.cpp23
-rw-r--r--node/Utils.hpp15
3 files changed, 43 insertions, 1 deletions
diff --git a/main.cpp b/main.cpp
index 65ea7125..153ced78 100644
--- a/main.cpp
+++ b/main.cpp
@@ -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
*