Add systemd state checking logic
[platform/core/system/storaged.git] / src / block / block.c
index 5e638b1..ab6ead9 100644 (file)
@@ -45,6 +45,7 @@
 #include <glib/gstdio.h>
 #include <gio/gio.h>
 #include <libsyscommon/dbus-system.h>
+#include <libsyscommon/systemd-state.h>
 
 #include "log.h"
 #include "config-parser.h"
@@ -2657,13 +2658,7 @@ static void remove_whole_block_device(void)
        }
 }
 
-static void booting_done(GDBusConnection  *conn,
-               const gchar *sender,
-               const gchar *path,
-               const gchar *iface,
-               const gchar *name,
-               GVariant *param,
-               gpointer data)
+static void booting_done(void)
 {
        static int done = 0;
        int ret;
@@ -2685,6 +2680,18 @@ static void booting_done(GDBusConnection  *conn,
        block_boot = true;
 }
 
+static void booting_done_received(GDBusConnection  *conn,
+               const gchar *sender,
+               const gchar *path,
+               const gchar *iface,
+               const gchar *name,
+               GVariant *param,
+               gpointer data)
+{
+       _I("Signal received: %s", SYSTEMD_DBUS_SIGNAL_SYSTEM_STARTUP_FINISHED);
+       booting_done();
+}
+
 static void block_poweroff(GDBusConnection  *conn,
                const gchar *sender,
                const gchar *path,
@@ -3681,17 +3688,6 @@ static void block_init(void *data)
        if (ret < 0)
                _E("Failed to init pipe.");
 
-       /* System Session is loaded completely */
-       id_booting_done = subscribe_dbus_signal(NULL, SYSTEMD_DBUS_PATH,
-                   SYSTEMD_DBUS_IFACE_MANAGER,
-                   SYSTEMD_DBUS_SIGNAL_SYSTEM_STARTUP_FINISHED,
-                   booting_done, NULL, NULL);
-
-       id_block_poweroff = subscribe_dbus_signal(NULL, DEVICED_PATH_POWEROFF,
-                       DEVICED_INTERFACE_POWEROFF,
-                       SIGNAL_POWEROFF_STATE,
-                       block_poweroff, NULL, NULL);
-
        for (i = 0; i < THREAD_MAX; i++) {
                th_manager[i].num_dev = 0;
                th_manager[i].op_len = 0;
@@ -3718,6 +3714,23 @@ static void block_init(void *data)
        ret = get_internal_storage_number();
        if (ret < 0)
                _E("Failed to get internal storage number.");
+
+       if (check_system_boot_finished() != 0) {
+               _I("System session is already loaded.");
+               id_booting_done = 0;
+               booting_done();
+       } else {
+               /* System Session is loaded completely */
+               id_booting_done = subscribe_dbus_signal(NULL, SYSTEMD_DBUS_PATH,
+                               SYSTEMD_DBUS_IFACE_MANAGER,
+                               SYSTEMD_DBUS_SIGNAL_SYSTEM_STARTUP_FINISHED,
+                               booting_done_received, NULL, NULL);
+       }
+
+       id_block_poweroff = subscribe_dbus_signal(NULL, DEVICED_PATH_POWEROFF,
+                       DEVICED_INTERFACE_POWEROFF,
+                       SIGNAL_POWEROFF_STATE,
+                       block_poweroff, NULL, NULL);
 }
 static void terminate_threads(void)
 {