From e4255ed712393db716f2e7e14a1052340ebab35d Mon Sep 17 00:00:00 2001 From: hagen Date: Mon, 11 Jan 2016 10:58:39 +0000 Subject: [PATCH] + add --pidfile cmdline option --- Daemon.h | 2 +- DaemonLinux.cpp | 34 ++++++++++++++++++---------------- docs/configuration.md | 1 + 3 files changed, 20 insertions(+), 17 deletions(-) diff --git a/Daemon.h b/Daemon.h index bfbdcaa0..9af8c1bb 100644 --- a/Daemon.h +++ b/Daemon.h @@ -63,7 +63,7 @@ namespace i2p virtual bool stop(); private: std::string pidfile; - int pidFilehandle; + int pidFH; }; #endif diff --git a/DaemonLinux.cpp b/DaemonLinux.cpp index 7215eca7..31ec209c 100644 --- a/DaemonLinux.cpp +++ b/DaemonLinux.cpp @@ -78,22 +78,25 @@ namespace i2p } // Pidfile - pidfile = IsService () ? "/var/run" : i2p::util::filesystem::GetDataDir().string(); - pidfile.append("/i2pd.pid"); - pidFilehandle = open(pidfile.c_str(), O_RDWR | O_CREAT, 0600); - if (pidFilehandle == -1) - { - LogPrint(eLogError, "Daemon: could not create pid file ", pidfile, ": ", strerror(errno)); - return false; - } - if (lockf(pidFilehandle, F_TLOCK, 0) == -1) - { - LogPrint(eLogError, "Daemon: could not lock pid file ", pidfile, ": ", strerror(errno)); - return false; + // this code is c-styled and a bit ugly, but we need fd for locking pidfile + pidfile = i2p::util::config::GetArg("pidfile", ""); + if (pidfile != "") { + pidFH = open(pidfile.c_str(), O_RDWR | O_CREAT, 0600); + if (pidFH < 0) + { + LogPrint(eLogError, "Daemon: could not create pid file ", pidfile, ": ", strerror(errno)); + return false; + } + if (lockf(pidFH, F_TLOCK, 0) != 0) + { + LogPrint(eLogError, "Daemon: could not lock pid file ", pidfile, ": ", strerror(errno)); + return false; + } + char pid[10]; + sprintf(pid, "%d\n", getpid()); + ftruncate(pidFH, 0); + write(pidFH, pid, strlen(pid)); } - char pid[10]; - sprintf(pid, "%d\n", getpid()); - write(pidFilehandle, pid, strlen(pid)); // Signal handler struct sigaction sa; @@ -110,7 +113,6 @@ namespace i2p bool DaemonLinux::stop() { - close(pidFilehandle); unlink(pidfile.c_str()); return Daemon_Singleton::stop(); diff --git a/docs/configuration.md b/docs/configuration.md index a5a69b48..57c038de 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -7,6 +7,7 @@ i2pd cmdline options * --httpport= - The port to listen on (HTTP server) * --log= - Enable or disable logging to file. 1 for yes, 0 for no. * --loglevel= - Log messages above this level (debug, *info, warn, error) +* --pidfile= - Where to write pidfile (dont write by default) * --daemon= - Enable or disable daemon mode. 1 for yes, 0 for no. * --service= - 1 if uses system folders (/var/run/i2pd.pid, /var/log/i2pd.log, /var/lib/i2pd). * --v6= - 1 if supports communication through ipv6, off by default