Add an internal api: storage_is_mounted_opt_usr
[platform/core/system/libstorage.git] / src / storage-inhouse.c
index 3c36f58..3c06157 100755 (executable)
@@ -22,6 +22,7 @@
 #include <string.h>
 #include <errno.h>
 #include <tzplatform_config.h>
+#include <blkid.h>
 
 #include "common.h"
 #include "list.h"
@@ -30,6 +31,7 @@
 #include "storage-external-dbus.h"
 
 #define FORMAT_TIMEOUT (120*1000)
+#define USER_PARTITION "user"
 
 /*
        Get compat path from origin Multi-user path
@@ -222,6 +224,7 @@ API int storage_get_storage_level(const char *path, char **level)
        return STORAGE_ERROR_NONE;
 }
 
+//LCOV_EXCL_START Not called callback
 static void mount_mmc_cb(GVariant *var, void *user_data, GError *err)
 {
        struct mmc_contents *mmc_data = (struct mmc_contents*)user_data;
@@ -244,6 +247,7 @@ exit:
                g_variant_unref(var);
        (mmc_data->mmc_cb)(mmc_ret, mmc_data->user_data);
 }
+//LCOV_EXCL_STOP
 
 API int storage_request_mount_mmc(struct mmc_contents *mmc_data)
 {
@@ -282,6 +286,7 @@ API int storage_request_mount_mmc(struct mmc_contents *mmc_data)
        return STORAGE_ERROR_NONE;
 }
 
+//LCOV_EXCL_START Not called callback
 static void unmount_mmc_cb(GVariant *var, void *user_data, GError *err)
 {
        struct mmc_contents *mmc_data = (struct mmc_contents*)user_data;
@@ -304,6 +309,7 @@ exit:
                g_variant_unref(var);
        (mmc_data->mmc_cb)(mmc_ret, mmc_data->user_data);
 }
+//LCOV_EXCL_STOP
 
 API int storage_request_unmount_mmc(struct mmc_contents *mmc_data, int option)
 {
@@ -345,6 +351,7 @@ API int storage_request_unmount_mmc(struct mmc_contents *mmc_data, int option)
        return STORAGE_ERROR_NONE;
 }
 
+//LCOV_EXCL_START Not called callback
 static void format_mmc_cb(GVariant *var, void *user_data, GError *err)
 {
        struct mmc_contents *mmc_data = (struct mmc_contents*)user_data;
@@ -367,6 +374,7 @@ exit:
                g_variant_unref(var);
        (mmc_data->mmc_cb)(mmc_ret, mmc_data->user_data);
 }
+//LCOV_EXCL_STOP
 
 API int storage_request_format_mmc(struct mmc_contents *mmc_data)
 {
@@ -412,3 +420,75 @@ API int storage_format_mmc(struct mmc_contents *mmc_data, int option)
 
        return STORAGE_ERROR_NONE;
 }
+
+API int storage_is_mounted_opt_usr(storage_part_mount_e *mounted)
+{
+       blkid_cache cache = NULL;
+       blkid_dev_iterate iter;
+       blkid_dev dev;
+       int ret;
+       bool found = false;
+
+       ret = blkid_get_cache(&cache, NULL);
+       if (ret < 0) {
+               _E("Failed to get cache"); //LCOV_EXCL_LINE
+               *mounted = STORAGE_PART_ERROR; //LCOV_EXCL_LINE
+               return STORAGE_ERROR_OPERATION_FAILED; //LCOV_EXCL_LINE
+       }
+
+       ret = blkid_probe_all(cache);
+       if (ret < 0) {
+               _E("Failed to probe all block devices"); //LCOV_EXCL_LINE
+               *mounted = STORAGE_PART_ERROR; //LCOV_EXCL_LINE
+               return STORAGE_ERROR_OPERATION_FAILED; //LCOV_EXCL_LINE
+       }
+
+       iter = blkid_dev_iterate_begin(cache);
+       if (!iter) {
+               _E("Failed to get iterate"); //LCOV_EXCL_LINE
+               *mounted = STORAGE_PART_ERROR; //LCOV_EXCL_LINE
+               return STORAGE_ERROR_OUT_OF_MEMORY; //LCOV_EXCL_LINE
+       }
+
+       ret = blkid_dev_set_search(iter, "LABEL", USER_PARTITION);
+       if (blkid_dev_next(iter, &dev) == 0) {
+               dev = blkid_verify(cache, dev);
+               if (dev) {
+                       found = true;
+                       _D("Partition for user data is found(LABEL=user)");
+               }
+       }
+       blkid_dev_iterate_end(iter);
+
+       if (!found) {
+               iter = blkid_dev_iterate_begin(cache);
+               if (!iter) {
+                       _E("Failed to get iterate"); //LCOV_EXCL_LINE
+                       *mounted = STORAGE_PART_ERROR; //LCOV_EXCL_LINE
+                       return STORAGE_ERROR_OUT_OF_MEMORY; //LCOV_EXCL_LINE
+               }
+
+               ret = blkid_dev_set_search(iter, "PARTLABEL", USER_PARTITION);
+               if (blkid_dev_next(iter, &dev) == 0) {
+                       dev = blkid_verify(cache, dev);
+                       if (dev) {
+                               found = true;
+                               _D("Partition for user data is found(PARTLABEL=user)");
+                       }
+               }
+               blkid_dev_iterate_end(iter);
+       }
+
+       blkid_put_cache(cache);
+
+       if (found) {
+               ret = mount_check(tzplatform_getenv(TZ_SYS_USER));
+               if (ret)
+                       *mounted = STORAGE_PART_MOUNTED;
+               else
+                       *mounted = STORAGE_PART_NOT_MOUNTED;
+       } else
+               *mounted = STORAGE_PART_NOT_SUPPORTED;
+
+       return STORAGE_ERROR_NONE;
+}