storage: Write file when storage status is changed 51/181351/5
authorpr.jung <pr.jung@samsung.com>
Tue, 12 Jun 2018 09:34:38 +0000 (18:34 +0900)
committerHyotaek Shim <hyotaek.shim@samsung.com>
Fri, 22 Jun 2018 05:31:07 +0000 (05:31 +0000)
- /run/storaged/needcleanup/trigger

Change-Id: Ie48cb6020670e321a54771def0a4a40331df6152
Signed-off-by: pr.jung <pr.jung@samsung.com>
src/storage/storage.c

index de66353..60b3323 100644 (file)
 
 #define STORAGE_CONF_FILE       "/etc/storaged/storage.conf"
 
+#define STORAGED_DIR_PATH      "/run/storaged"
+#define NEED_CLEANUP_DIR_PATH  "/run/storaged/needcleanup"
+#define NEED_CLEANUP_FILE_PATH "/run/storaged/needcleanup/trigger"
+
 #define ARRAY_SIZE(name) (sizeof(name)/sizeof(name[0]))
 
 enum memnoti_level {
@@ -91,7 +95,7 @@ static guint id_booting_done;
 static guint id_storage_poweroff;
 
 static struct storage_config_info storage_internal_info = {
-       .mem_id                 = MEMORY_INTERNAL,
+       .mem_id             = MEMORY_INTERNAL,
        .current_noti_level = MEMNOTI_LEVEL_NORMAL,
        .warning_level      = MEMNOTI_WARNING_VALUE,
        .critical_level     = MEMNOTI_CRITICAL_VALUE,
@@ -99,7 +103,7 @@ static struct storage_config_info storage_internal_info = {
 };
 
 static struct storage_config_info storage_tmp_info = {
-       .mem_id                 = MEMORY_TMP,
+       .mem_id             = MEMORY_TMP,
        .current_noti_level = MEMNOTI_LEVEL_NORMAL,
        .warning_level      = MEMNOTI_TMP_CRITICAL_VALUE,
        .critical_level     = MEMNOTI_TMP_CRITICAL_VALUE,
@@ -107,13 +111,25 @@ static struct storage_config_info storage_tmp_info = {
 };
 
 static struct storage_config_info storage_opt_info = {
-       .mem_id                 = MEMORY_OPT,
+       .mem_id             = MEMORY_OPT,
        .current_noti_level = MEMNOTI_LEVEL_NORMAL,
        .warning_level      = MEMNOTI_WARNING_VALUE,
        .critical_level     = MEMNOTI_CRITICAL_VALUE,
        .full_level         = MEMNOTI_FULL_VALUE,
 };
 
+static void write_file()
+{
+       FILE *fp;
+
+       fp = fopen(NEED_CLEANUP_FILE_PATH, "w+");
+       if (fp) {
+               fprintf(fp, "needcleanup\n");
+               fclose(fp);
+       } else
+               _E("Fail to open %s", NEED_CLEANUP_FILE_PATH);
+}
+
 static void memstatus_send_broadcast(enum memory_id no, char *signal, int status)
 {
        if (no == MEMORY_OPT)
@@ -126,8 +142,11 @@ static void memstatus_send_broadcast(enum memory_id no, char *signal, int status
 
 static void memcleanup_send_broadcast(struct storage_config_info *info, enum memnoti_level level, enum memnoti_level prev_level)
 {
+       time_t t;
+       struct tm *timeinfo;
        const char *path;
        char *value;
+       char buf[20];
 
        if (info->mem_id == MEMORY_INTERNAL)
                path = tzplatform_getenv(TZ_SYS_HOME);
@@ -150,7 +169,13 @@ static void memcleanup_send_broadcast(struct storage_config_info *info, enum mem
        else
                return;
 
-       _I("%s level: %s", path, value);
+       write_file();
+
+       t = time(NULL);
+       timeinfo = localtime(&t);
+       strftime(buf, sizeof(buf), "%b %d %T", timeinfo);
+       _D("time: %s path: %s level: %s", buf, path, value);
+
        dbus_handle_broadcast_dbus_signal_var(STORAGED_PATH_LOWMEM, STORAGED_INTERFACE_LOWMEM,
                        SIGNAL_NEED_CLEANUP, g_variant_new("(ss)", path, value));
 
@@ -505,6 +530,7 @@ static void storage_config_load(struct storage_config_info *info)
 
 static void storage_init(void *data)
 {
+       struct stat buf;
        int ret;
 
        storage_config_load(&storage_internal_info);
@@ -524,6 +550,42 @@ static void storage_init(void *data)
                        &storage_interface);
        if (ret < 0)
                _E("Failed to register dbus interface and methods(%d)", ret);
+
+       ret = stat(STORAGED_DIR_PATH, &buf);
+       if (ret < 0) {
+               ret = mkdir(STORAGED_DIR_PATH, 0644);
+               if (ret < 0)
+                       _E("Failed to make directory: %d", errno);
+       } else if (!S_ISDIR(buf.st_mode)) {
+               ret = remove(STORAGED_DIR_PATH);
+               if (ret < 0)
+                       _E("Fail to remove %s. errno: %d", STORAGED_DIR_PATH, errno);
+               ret = mkdir(STORAGED_DIR_PATH, 0644);
+               if (ret < 0)
+                       _E("Failed to make directory: %d", errno);
+       } else {
+               ret = chmod(STORAGED_DIR_PATH, 0644);
+               if (ret < 0)
+                       _E("Fail to change permissions of a file");
+       }
+
+       ret = stat(NEED_CLEANUP_DIR_PATH, &buf);
+       if (ret < 0) {
+               ret = mkdir(NEED_CLEANUP_DIR_PATH, 0644);
+               if (ret < 0)
+                       _E("Failed to make directory: %d", errno);
+       } else if (!S_ISDIR(buf.st_mode)) {
+               ret = remove(NEED_CLEANUP_DIR_PATH);
+               if (ret < 0)
+                       _E("Fail to remove %s. errno: %d", NEED_CLEANUP_DIR_PATH, errno);
+               ret = mkdir(NEED_CLEANUP_DIR_PATH, 0644);
+               if (ret < 0)
+                       _E("Failed to make directory: %d", errno);
+       } else {
+               ret = chmod(NEED_CLEANUP_DIR_PATH, 0644);
+               if (ret < 0)
+                       _E("Fail to change permissions of a file");
+       }
 }
 
 static void storage_exit(void *data)