/**
* Permissioner: set file ownerships and permissions
* Copyright 2020: Stefan Schuermans, Aachen, Germany <stefan@schuermans.info>
* Copyleft: GNU GENERAL PUBLIC LICENSE version 3 (see LICENSE)
*/
#include <permissioner/Callback.h>
#include <permissioner/Config.h>
#include <chrono>
#include <csignal>
#include <cstdlib>
#include <iostream>
#include <stdexcept>
#include <string>
#include <thread>
class DaemonCallback : public Callback {
public:
DaemonCallback() : go_on(true) {}
bool callback();
std::chrono::duration<float, std::ratio<1>> sleepTime;
template <class Rep, class Period>
bool iterativeSleep(std::chrono::duration<Rep, Period> duration) const;
bool go_on;
};
bool DaemonCallback::callback() {
iterativeSleep(sleepTime);
return go_on;
}
// iterative sleep, watching go_on, returns whether sleep completed
template <class Rep, class Period>
bool DaemonCallback::iterativeSleep(
std::chrono::duration<Rep, Period> duration) const {
const std::chrono::duration<int, std::milli> zero(0), step(100);
while (duration > zero && go_on) {
if (duration >= step) {
std::this_thread::sleep_for(step);
duration -= step;
} else {
std::this_thread::sleep_for(duration);
duration = zero;
}
}
return duration <= zero;
}
DaemonCallback daemonCallback;