From 56ae875861ab260b80a030f50c4aff9f9dc8fff0 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sat, 13 Apr 2024 13:32:39 +0200 Subject: Adding upstream version 2.14.2. Signed-off-by: Daniel Baumann --- lib/base/process.hpp | 117 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 117 insertions(+) create mode 100644 lib/base/process.hpp (limited to 'lib/base/process.hpp') diff --git a/lib/base/process.hpp b/lib/base/process.hpp new file mode 100644 index 0000000..d83ba6e --- /dev/null +++ b/lib/base/process.hpp @@ -0,0 +1,117 @@ +/* Icinga 2 | (c) 2012 Icinga GmbH | GPLv2+ */ + +#ifndef PROCESS_H +#define PROCESS_H + +#include "base/i2-base.hpp" +#include "base/dictionary.hpp" +#include +#include +#include +#include +#include +#include + +namespace icinga +{ + +/** + * The result of a Process task. + * + * @ingroup base + */ +struct ProcessResult +{ + pid_t PID; + double ExecutionStart; + double ExecutionEnd; + long ExitStatus; + String Output; +}; + +/** + * A process task. Executes an external application and returns the exit + * code and console output. + * + * @ingroup base + */ +class Process final : public Object +{ +public: + DECLARE_PTR_TYPEDEFS(Process); + +#ifdef _WIN32 + typedef String Arguments; + typedef HANDLE ProcessHandle; + typedef HANDLE ConsoleHandle; +#else /* _WIN32 */ + typedef std::vector Arguments; + typedef pid_t ProcessHandle; + typedef int ConsoleHandle; +#endif /* _WIN32 */ + + static const std::deque::size_type MaxTasksPerThread = 512; + + Process(Arguments arguments, Dictionary::Ptr extraEnvironment = nullptr); + ~Process() override; + + void SetTimeout(double timeout); + double GetTimeout() const; + + void SetAdjustPriority(bool adjust); + bool GetAdjustPriority() const; + + void Run(const std::function& callback = std::function()); + + const ProcessResult& WaitForResult(); + + pid_t GetPID() const; + + static Arguments PrepareCommand(const Value& command); + + static void ThreadInitialize(); + + static String PrettyPrintArguments(const Arguments& arguments); + +#ifndef _WIN32 + static void InitializeSpawnHelper(); +#endif /* _WIN32 */ + +private: + Arguments m_Arguments; + Dictionary::Ptr m_ExtraEnvironment; + + double m_Timeout; +#ifndef _WIN32 + bool m_SentSigterm; +#endif /* _WIN32 */ + + bool m_AdjustPriority; + + ProcessHandle m_Process; + pid_t m_PID; + ConsoleHandle m_FD; + +#ifdef _WIN32 + bool m_ReadPending; + bool m_ReadFailed; + OVERLAPPED m_Overlapped; + char m_ReadBuffer[1024]; +#endif /* _WIN32 */ + + std::ostringstream m_OutputStream; + std::function m_Callback; + ProcessResult m_Result; + bool m_ResultAvailable; + std::mutex m_ResultMutex; + std::condition_variable m_ResultCondition; + + static void IOThreadProc(int tid); + bool DoEvents(); + int GetTID() const; + double GetNextTimeout() const; +}; + +} + +#endif /* PROCESS_H */ -- cgit v1.2.3