Add systemd state checking logic 52/203552/1
authorYunmi Ha <yunmi.ha@samsung.com>
Tue, 16 Apr 2019 01:35:02 +0000 (10:35 +0900)
committerYunmi Ha <yunmi.ha@samsung.com>
Tue, 16 Apr 2019 01:35:02 +0000 (10:35 +0900)
If system session is already running,
storaged can't receive StartupFinished signal.
In that case, add logic to check the systemd state at startup.

Change-Id: I92dea36a58f0aea7659f036fe893e476b5f9a370
Signed-off-by: Yunmi Ha <yunmi.ha@samsung.com>
src/block/block.c
src/shared/common.c
src/shared/storaged_common.h
src/storage/CMakeLists.txt
src/storage/storage.c

index 542baf70e4418e7cf245aa1aa4e51a9c984a9ff6..6c0908d272c84e6fb474a2a766194913b10cf20b 100644 (file)
@@ -55,6 +55,7 @@
 #include "fd_handler.h"
 #include "utils.h"
 #include "apps.h"
+#include "storaged_common.h"
 
 /**
  * TODO  Assume root device is always mmcblk0*.
@@ -2654,14 +2655,7 @@ static void remove_whole_block_device(void)
                } while (true);
        }
 }
-
-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;
@@ -2669,12 +2663,12 @@ static void booting_done(GDBusConnection  *conn,
        if (done > 0)
                return;
        done = 1;
-       _I("Booting done");
+       _I("Booting done.");
 
        /* register mmc uevent control routine */
        ret = register_udev_uevent_control(&uh);
        if (ret < 0)
-               _E("fail to register block uevent : %d", ret);
+               _E("Failed to register block uevent : %d", ret);
 
        block_control = true;
        /* if there is the attached device, try to mount */
@@ -2683,6 +2677,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,
@@ -3680,17 +3686,6 @@ static void block_init(void *data)
        if (ret < 0)
                _E("fail 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;
@@ -3739,6 +3734,22 @@ 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.");
+               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)
 {
index 76713ef7af8c76971aa33fa9756f78f17abd0115..8cc314212022a0ba4aeecc6c12b4cb57102535ae 100644 (file)
 #include <system_info.h>
 #include <sys/mount.h>
 #include <sys/time.h>
+#include <libgdbus/dbus-system.h>
+
 #include "log.h"
 #include "storaged_common.h"
 
-
 #define MODEL_NAME      "http://tizen.org/system/model_name"
 #define MODEL_EMULATOR  "Emulator"
 
+#define SYSTEMD_DBUS_DEST                      "org.freedesktop.systemd1"
+#define SYSTEMD_DBUS_PATH                      "/org/freedesktop/systemd1"
+#define DBUS_IFACE_DBUS_PROPERTIES     "org.freedesktop.DBus.Properties"
+#define SYSTEMD_DBUS_IFACE_MANAGER     SYSTEMD_DBUS_DEST ".Manager"
+
+#define SYSTEMD_DBUS_METHOD_SYSTEM_STATE    "SystemState"
+#define SYSTEMD_STATE_RUNNING               "running"
+#define SYSTEMD_STATE_DEGRADED              "degraded"
+
 bool is_emulator(void)
 {
        int ret;
@@ -142,3 +152,46 @@ int run_child(int argc, const char *argv[])
 
        return r;
 }
+
+int check_system_boot_finished(void)
+{
+       char *state = NULL;
+       int ret = 0;
+       size_t len;
+       GVariant *reply = NULL;
+       GVariant *val = NULL;
+
+       reply = dbus_handle_method_sync_with_reply_var(SYSTEMD_DBUS_DEST,
+                                       SYSTEMD_DBUS_PATH,
+                                       DBUS_IFACE_DBUS_PROPERTIES,
+                                       "Get",
+                                       g_variant_new("(ss)", SYSTEMD_DBUS_IFACE_MANAGER, SYSTEMD_DBUS_METHOD_SYSTEM_STATE));
+       if (!reply || !dh_get_param_from_var(reply, "(v)", &val)) {
+               _E("Failed to get system state: No reply");
+               goto err;
+       }
+
+       if (!dh_get_param_from_var(val, "s", &state)) {
+               _E("Failed to get system state(%s)", g_variant_get_type_string(reply));
+               goto err;
+       }
+
+       _I("System state=%s", state);
+
+       len = strlen(state) + 1;
+       if (!strncmp(state, SYSTEMD_STATE_RUNNING, len) ||
+               !strncmp(state, SYSTEMD_STATE_DEGRADED, len))
+               ret = 1;
+       else
+               ret = 0;
+
+err:
+       if (reply)
+               g_variant_unref(reply);
+
+       if (val)
+               g_variant_unref(val);
+
+       free(state);
+       return ret;
+}
index e0db5d471872b7b467b1f51e607a92e394f08ecf..9f3a30d916d0f8c3d2429dbc732becf9f70260a6 100644 (file)
@@ -40,6 +40,7 @@
 
 int run_child(int argc, const char *argv[]);
 bool is_emulator(void);
+int check_system_boot_finished(void);
 
 #endif /* __STORAGED_COMMON_H__ */
 
index d2a97ee3285ba5a6003a2ed4aa850a789b17616d..680a706f1da6f71de028113afb3873009c65556f 100644 (file)
@@ -9,6 +9,7 @@ pkg_check_modules(${PROJECT_NAME}_pkgs REQUIRED
                storage
                vconf
                libgdbus
+               capi-system-info
 )
 
 FOREACH(flag ${${PROJECT_NAME}_pkgs_CFLAGS})
@@ -26,6 +27,7 @@ SET(SRCS ${ALL_SRCS})
 SET(SHARED_SRCS
        ../shared/config-parser.c
        ../shared/fd_handler.c
+       ../shared/common.c
 )
 
 ADD_LIBRARY(${PROJECT_NAME} ${SRCS} ${SHARED_SRCS})
index 29a99605059574eda2e396ac20ea8d3cceac9980..1bfb8a281a3380b5a2bf1cd7dd62fdd547dba65c 100644 (file)
@@ -37,6 +37,7 @@
 #include "log.h"
 #include "config-parser.h"
 #include "module-intf.h"
+#include "storaged_common.h"
 
 #define MEMORY_STATUS_TMP_PATH  "/tmp"
 #define MEMORY_STATUS_OPT_PATH  "/opt"
@@ -636,23 +637,29 @@ static dbus_interface_u storage_interface = {
        .nr_methods = ARRAY_SIZE(storage_methods),
 };
 
-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;
 
        if (done > 0)
                return;
        done = 1;
-       _I("booting done");
+       _I("Booting done.");
 
        if (init_storage_config_info_all() == -1)
-               _E("fail remain mem noti control fd init");
+               _E("Failed remain mem noti control fd init.");
+}
+
+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 storage_poweroff(GDBusConnection  *conn,
@@ -712,17 +719,6 @@ static void storage_init(void *data)
 
        storage_config_load(&storage_internal_info);
 
-       /* 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_storage_poweroff = subscribe_dbus_signal(NULL, DEVICED_PATH_POWEROFF,
-                       DEVICED_INTERFACE_POWEROFF,
-                       SIGNAL_POWEROFF_STATE,
-                       storage_poweroff, NULL, NULL);
-
        ret = dbus_handle_register_dbus_object(NULL, STORAGED_PATH_STORAGE,
                        &storage_interface);
        if (ret < 0)
@@ -763,6 +759,23 @@ static void storage_init(void *data)
                if (ret < 0)
                        _E("Fail to change permissions of a file");
        }
+
+       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_storage_poweroff = subscribe_dbus_signal(NULL, DEVICED_PATH_POWEROFF,
+                       DEVICED_INTERFACE_POWEROFF,
+                       SIGNAL_POWEROFF_STATE,
+                       storage_poweroff, NULL, NULL);
 }
 
 static void storage_exit(void *data)