#ifndef DAEMON_HH #define DAEMON_HH #include 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); // 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); protected: Daemon() = default; }; #endif // DAEMON_HH