summaryrefslogtreecommitdiffstats
path: root/src/lib/util/pid_file.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/util/pid_file.cc')
-rw-r--r--src/lib/util/pid_file.cc93
1 files changed, 93 insertions, 0 deletions
diff --git a/src/lib/util/pid_file.cc b/src/lib/util/pid_file.cc
new file mode 100644
index 0000000..ef519b3
--- /dev/null
+++ b/src/lib/util/pid_file.cc
@@ -0,0 +1,93 @@
+// Copyright (C) 2015 Internet Systems Consortium, Inc. ("ISC")
+//
+// This Source Code Form is subject to the terms of the Mozilla Public
+// License, v. 2.0. If a copy of the MPL was not distributed with this
+// file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+#include <config.h>
+
+#include <util/pid_file.h>
+#include <cstdio>
+#include <signal.h>
+#include <unistd.h>
+#include <cerrno>
+
+namespace isc {
+namespace util {
+
+PIDFile::PIDFile(const std::string& filename)
+ : filename_(filename) {
+}
+
+PIDFile::~PIDFile() {
+}
+
+int
+PIDFile::check() const {
+ std::ifstream fs(filename_.c_str());
+ int pid;
+ bool good;
+
+ // If we weren't able to open the file treat
+ // it as if the process wasn't running
+ if (!fs.is_open()) {
+ return (false);
+ }
+
+ // Try to get the pid, get the status and get rid of the file
+ fs >> pid;
+ good = fs.good();
+ fs.close();
+
+ // If we weren't able to read a pid send back an exception
+ if (!good) {
+ isc_throw(PIDCantReadPID, "Unable to read PID from file '"
+ << filename_ << "'");
+ }
+
+ // If the process is still running return its pid.
+ if (kill(pid, 0) == 0) {
+ return (pid);
+ }
+
+ // No process
+ return (0);
+}
+
+void
+PIDFile::write() const {
+ write(getpid());
+}
+
+void
+PIDFile::write(int pid) const {
+ std::ofstream fs(filename_.c_str(), std::ofstream::trunc);
+
+ if (!fs.is_open()) {
+ isc_throw(PIDFileError, "Unable to open PID file '"
+ << filename_ << "' for write");
+ }
+
+ // File is open, write the pid.
+ fs << pid << std::endl;
+
+ bool good = fs.good();
+ fs.close();
+
+ if (!good) {
+ isc_throw(PIDFileError, "Unable to write to PID file '"
+ << filename_ << "'");
+ }
+}
+
+void
+PIDFile::deleteFile() const {
+ if ((remove(filename_.c_str()) != 0) &&
+ (errno != ENOENT)) {
+ isc_throw(PIDFileError, "Unable to delete PID file '"
+ << filename_ << "'");
+ }
+}
+
+} // namespace isc::util
+} // namespace isc