summaryrefslogtreecommitdiff
path: root/src/daemon.hh
diff options
context:
space:
mode:
Diffstat (limited to 'src/daemon.hh')
-rw-r--r--src/daemon.hh45
1 files changed, 45 insertions, 0 deletions
diff --git a/src/daemon.hh b/src/daemon.hh
new file mode 100644
index 0000000..10f0584
--- /dev/null
+++ b/src/daemon.hh
@@ -0,0 +1,45 @@
+#ifndef DAEMON_HH
+#define DAEMON_HH
+
+#include <memory>
+
+class Logger;
+
+class Daemon {
+public:
+ virtual ~Daemon() = default;
+
+ // Method is called after forking;
+ // if it returns true then parent process will detach and return success and
+ // run is executed.
+ // if it returns false then parent process will exit in failure and run is
+ // never executed.
+ // Anything logged to logger will write to calling logger regardless of return
+ // value.
+ // Note that stdin, stdout and stderr are all closed when this runs, you
+ // must use logger object if you want to output anything.
+ // Current directory is not modified.
+ virtual bool setup(Logger* logger) = 0;
+
+ // Method is called after forking and only after setup returns true.
+ // Note that stdin, stdout and stderr are all closed when this runs.
+ // Current directory is changed to root.
+ virtual bool run() = 0;
+
+ // Forks, runs setup() method before returning true or false.
+ // If setup() returns true then so does this method and run() is called.
+ // If setup() returns false then so does this method and run() is never
+ // called.
+ static bool fork_in_background(Logger* logger,
+ std::unique_ptr<Daemon> daemon);
+
+ // Doesn't fork, just runs setup() and if it returns true then
+ // also run() and waits for it to return.
+ static bool run_in_foreground(Logger* logger,
+ std::unique_ptr<Daemon> daemon);
+
+protected:
+ Daemon() = default;
+};
+
+#endif // DAEMON_HH