From 8870b2477e86a859fe0fab370681711671d0516e Mon Sep 17 00:00:00 2001 From: James Yonan Date: Tue, 8 Sep 2015 22:21:26 -0700 Subject: [PATCH] Added linux-specific is_daemon_alive() function to determine if a particular daemon is running. --- openvpn/linux/daemon_alive.hpp | 47 ++++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 openvpn/linux/daemon_alive.hpp diff --git a/openvpn/linux/daemon_alive.hpp b/openvpn/linux/daemon_alive.hpp new file mode 100644 index 00000000..ca1779cb --- /dev/null +++ b/openvpn/linux/daemon_alive.hpp @@ -0,0 +1,47 @@ +// OpenVPN -- An application to securely tunnel IP networks +// over a single port, with support for SSL/TLS-based +// session authentication and key exchange, +// packet encryption, packet authentication, and +// packet compression. +// +// Copyright (C) 2012-2015 OpenVPN Technologies, Inc. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License Version 3 +// as published by the Free Software Foundation. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program in the COPYING file. +// If not, see . + +#ifndef OPENVPN_LINUX_DAEMON_ALIVE_H +#define OPENVPN_LINUX_DAEMON_ALIVE_H + +#include +#include + +namespace openvpn { + inline bool is_daemon_alive(const std::string& cmd, + const std::string& pidfile) + { + try { + std::string pidstr = read_text(pidfile); + string::trim_crlf(pidstr); + const std::string cmdline_fn = "/proc/" + pidstr + "/cmdline"; + BufferPtr cmdbuf = read_binary_linear(cmdline_fn); + const size_t len = ::strnlen((const char *)cmdbuf->c_data(), cmdbuf->size()); + return cmd == std::string((const char *)cmdbuf->c_data(), len); + } + catch (const std::exception& e) + { + return false; + } + } +} + +#endif