* @brief This is main routing for Security Daemon
*/
-#include <string>
-
-#include <dpl/application.h>
+#include <systemd/sd-daemon.h>
#include <dpl/log/log.h>
#include <dpl/single_instance.h>
#include "security_daemon.h"
+#include "privacy_manager_daemon.h"
+
+#include <pthread.h>
+#include <glib.h>
+#include <Ecore.h>
static const std::string DAEMON_INSTANCE_UUID =
"5ebf3f24-dad6-4a27-88b4-df7970efe7a9";
-int main(int argc, char* argv[])
+static Ecore_Event_Handler *g_exitHandler;
+static Eina_Bool exitHandler(void */*data*/, int /*type*/, void */*event*/)
{
- DPL::SingleInstance instance;
- if (!instance.TryLock(DAEMON_INSTANCE_UUID)) {
- LogError("Security Daemon is already running");
- return -1;
- }
+ privacy_manager_daemon_stop();
+ privacy_manager_daemon_shutdown();
auto& daemon = SecurityDaemonSingleton::Instance();
+ daemon.shutdown();
- daemon.initialize(argc, argv);
+ ecore_event_handler_del(g_exitHandler);
- //Run daemon
- auto retVal = daemon.execute();
+ ecore_main_loop_quit();
- daemon.shutdown();
- instance.Release();
+ return ECORE_CALLBACK_CANCEL;
+}
+
+static Eina_Bool startHandler(void */*data*/)
+{
+ int retVal;
+ auto& daemon = SecurityDaemonSingleton::Instance();
+
+ privacy_manager_daemon_initialize();
+
+ privacy_manager_daemon_start();
+
+ int argc = 0;
+ char* argv = NULL;
+
+ daemon.initialize(argc, &argv);
+ retVal = daemon.execute();
+ if (retVal != 0)
+ {
+ LogError("Failed to execute daemon.");
+ ecore_main_loop_quit();
+
+ return ECORE_CALLBACK_CANCEL;
+ }
- return retVal;
+ // Notification to systemd
+ sd_notify(0, "READY=1");
+
+ return ECORE_CALLBACK_CANCEL;
+}
+
+int main(int argc, char* argv[])
+{
+ DPL::SingleInstance instance;
+
+ Try {
+ if (!instance.TryLock(DAEMON_INSTANCE_UUID)) {
+ LogError("Security Daemon is already running");
+ return -1;
+ }
+ } Catch (DPL::SingleInstance::Exception::LockError) {
+ LogError("Failed to lock/unlock Security Daemon instance.");
+ return -1;
+ }
+
+ if (!ecore_init())
+ {
+ LogError("Ecore cannot be initialized");
+ return -1;
+ }
+
+ ecore_timer_add(0.1, &startHandler, NULL);
+ g_exitHandler = ecore_event_handler_add(ECORE_EVENT_SIGNAL_EXIT, &exitHandler, NULL);
+ ecore_main_loop_begin();
+ ecore_shutdown();
+
+ instance.Release();
+
+ return 0;
}