bugfix related storing external_path
[platform/core/appfw/app2sd.git] / plugin / app2sd / src / app2sd_interface.c
index 2991b8b..40e2cf8 100644 (file)
 
 #include "app2sd_internals.h"
 
-static int __app2sd_create_app2sd_directories(uid_t uid)
+static int __app2sd_create_app2sd_directories(uid_t uid, char *mmc_path)
 {
        int ret = 0;
+       char app2sd_path[FILENAME_MAX] = { 0, };
        mode_t mode = DIR_PERMS;
 
-       ret = mkdir(APP2SD_PATH, mode);
+       snprintf(app2sd_path, FILENAME_MAX - 1, "%s/%s",
+                       mmc_path, EXTIMG_DIR);
+       ret = mkdir(app2sd_path, mode);
        if (ret) {
                if (errno != EEXIST) {
                        _E("create directory failed," \
@@ -47,11 +50,13 @@ int app2sd_usr_pre_app_install(const char *pkgid, GList *dir_list, int size, uid
 {
        int ret = 0;
        int free_mmc_mem = 0;
+       char *sdpath = NULL;
        char *device_node = NULL;
 #if !defined(TIZEN_FEATURE_APP2SD_DMCRYPT_ENCRYPTION)
        char *devi = NULL;
-#endif
        char *result = NULL;
+#endif
+       char mmc_path[FILENAME_MAX] = { 0, };
        char application_path[FILENAME_MAX] = { 0, };
        char loopback_device[FILENAME_MAX] = { 0, };
        char *encoded_id = NULL;
@@ -64,17 +69,19 @@ int app2sd_usr_pre_app_install(const char *pkgid, GList *dir_list, int size, uid
        }
 
        /* check whether MMC is present or not */
-       ret = _app2sd_check_mmc_status();
+       ret = _app2sd_check_mmc_status(&sdpath);
        if (ret) {
-               _E("MMC not preset OR Not ready (%d)", ret);
+               _E("MMC not present OR Not ready (%d)", ret);
                return APP2EXT_ERROR_MMC_STATUS;
        }
+       snprintf(mmc_path, FILENAME_MAX - 1, "%s", sdpath);
+       free(sdpath);
+       sync();
 
        /* find available free memory in the MMC card */
-       ret = _app2sd_get_available_free_memory(MMC_PATH, &free_mmc_mem);
+       ret = _app2sd_get_available_free_memory(mmc_path, &free_mmc_mem);
        if (ret) {
-               _E("unable to get available free memory in MMC (%d)",
-                       ret);
+               _E("unable to get available free memory in MMC (%d)", ret);
                return APP2EXT_ERROR_MMC_STATUS;
        }
        _D("size details for application installation:" \
@@ -97,31 +104,24 @@ int app2sd_usr_pre_app_install(const char *pkgid, GList *dir_list, int size, uid
        if (_is_global(uid)) {
                snprintf(application_path, FILENAME_MAX - 1, "%s/%s",
                        tzplatform_getenv(TZ_SYS_RW_APP), pkgid);
-               snprintf(loopback_device, FILENAME_MAX - 1, "%s/%s",
-                       APP2SD_PATH, encoded_id);
+               snprintf(loopback_device, FILENAME_MAX - 1, "%s/%s/%s",
+                       mmc_path, EXTIMG_DIR, encoded_id);
        } else {
                tzplatform_set_user(uid);
                snprintf(application_path, FILENAME_MAX - 1, "%s/%s",
                        tzplatform_getenv(TZ_USER_APP), pkgid);
-               snprintf(loopback_device, FILENAME_MAX - 1, "%s/%s",
-                       APP2SD_PATH, encoded_id);
+               snprintf(loopback_device, FILENAME_MAX - 1, "%s/%s/%s",
+                       mmc_path, EXTIMG_DIR, encoded_id);
                tzplatform_reset_user();
        }
        free(encoded_id);
 
-       ret = __app2sd_create_app2sd_directories(uid);
+       ret = __app2sd_create_app2sd_directories(uid, mmc_path);
        if (ret) {
                _E("failed to create app2sd dirs");
                return ret;
        }
 
-       /* check same loopback_device existence */
-       result = (char *)_app2sd_find_associated_device(loopback_device);
-       if (result != NULL) {
-               _E("there is same associated File (%s)", loopback_device);
-               return APP2EXT_ERROR_SAME_LOOPBACK_DEVICE_EXISTS;
-       }
-
        /* create a loopback device */
        ret = _app2sd_create_loopback_device(pkgid, loopback_device,
                (reqd_disk_size + PKG_BUF_SIZE));
@@ -214,6 +214,7 @@ END:
        }
 #endif
 
+       sync();
        return ret;
 }
 
@@ -221,7 +222,10 @@ int app2sd_usr_post_app_install(const char *pkgid,
                app2ext_status install_status, uid_t uid)
 {
        char *device_name = NULL;
+       char *sdpath = NULL;
+       char mmc_path[FILENAME_MAX] = { 0, };
        char application_path[FILENAME_MAX] = { 0, };
+       char application_mmc_path[FILENAME_MAX] = { 0, };
        char loopback_device[FILENAME_MAX] = { 0, };
        char *encoded_id = NULL;
        int ret = APP2EXT_SUCCESS;
@@ -235,11 +239,13 @@ int app2sd_usr_post_app_install(const char *pkgid,
        }
 
        /* check whether MMC is present or not */
-       ret = _app2sd_check_mmc_status();
+       ret = _app2sd_check_mmc_status(&sdpath);
        if (ret) {
                _E("MMC not present OR Not ready (%d)", ret);
                return APP2EXT_ERROR_MMC_STATUS;
        }
+       snprintf(mmc_path, FILENAME_MAX - 1, "%s", sdpath);
+       free(sdpath);
        sync();
 
        encoded_id = _app2sd_get_encoded_name(pkgid, uid);
@@ -249,17 +255,19 @@ int app2sd_usr_post_app_install(const char *pkgid,
        if (_is_global(uid)) {
                snprintf(application_path, FILENAME_MAX - 1, "%s/%s",
                        tzplatform_getenv(TZ_SYS_RW_APP), pkgid);
-               snprintf(loopback_device, FILENAME_MAX - 1, "%s/%s",
-                       APP2SD_PATH, encoded_id);
+               snprintf(loopback_device, FILENAME_MAX - 1, "%s/%s/%s",
+                       mmc_path, EXTIMG_DIR, encoded_id);
        } else {
                tzplatform_set_user(uid);
                snprintf(application_path, FILENAME_MAX - 1, "%s/%s",
                        tzplatform_getenv(TZ_USER_APP), pkgid);
-               snprintf(loopback_device, FILENAME_MAX - 1, "%s/%s",
-                       APP2SD_PATH, encoded_id);
+               snprintf(loopback_device, FILENAME_MAX - 1, "%s/%s/%s",
+                       mmc_path, EXTIMG_DIR, encoded_id);
                tzplatform_reset_user();
        }
        free(encoded_id);
+       snprintf(application_mmc_path, FILENAME_MAX - 1, "%s/.mmc",
+               application_path);
 
        /* get the associated device node for SD card applicationer */
 #ifdef TIZEN_FEATURE_APP2SD_DMCRYPT_ENCRYPTION
@@ -325,7 +333,7 @@ int app2sd_usr_post_app_install(const char *pkgid,
                if (ret)
                        _E("unable to delete info");
 
-               ret = _app2sd_delete_directory(application_path);
+               ret = _app2sd_delete_directory(application_mmc_path);
                if (ret)
                        _E("unable to delete the directory (%s)", application_path);
        } else {
@@ -333,7 +341,7 @@ int app2sd_usr_post_app_install(const char *pkgid,
                 * to pkgmgr_parser db
                 */
                pkgmgr_ret = pkgmgrinfo_pkginfo_set_usr_installed_storage(pkgid,
-                       INSTALL_EXTERNAL, uid);
+                       INSTALL_EXTERNAL, loopback_device, uid);
                if (pkgmgr_ret < 0) {
                        _E("fail to update installed location " \
                                "to db[%s, %d] of uid(%d), pkgmgr ret(%d)",
@@ -342,14 +350,17 @@ int app2sd_usr_post_app_install(const char *pkgid,
                }
        }
 
+       sync();
        return ret;
 }
 
 int app2sd_usr_on_demand_setup_init(const char *pkgid, uid_t uid)
 {
        int ret = APP2EXT_SUCCESS;
+       char mmc_path[FILENAME_MAX] = { 0, };
        char application_path[FILENAME_MAX] = { 0, };
        char loopback_device[FILENAME_MAX] = { 0, };
+       char *sdpath = NULL;
        char *encoded_id = NULL;
        char *device_node = NULL;
 #if !defined(TIZEN_FEATURE_APP2SD_DMCRYPT_ENCRYPTION)
@@ -364,11 +375,13 @@ int app2sd_usr_on_demand_setup_init(const char *pkgid, uid_t uid)
        }
 
        /* check whether MMC is present or not */
-       ret = _app2sd_check_mmc_status();
+       ret = _app2sd_check_mmc_status(&sdpath);
        if (ret) {
-               _E("MMC not preset OR Not ready (%d)", ret);
+               _E("MMC not present OR Not ready (%d)", ret);
                return APP2EXT_ERROR_MMC_STATUS;
        }
+       snprintf(mmc_path, FILENAME_MAX - 1, "%s", sdpath);
+       free(sdpath);
 
        encoded_id = _app2sd_get_encoded_name(pkgid, uid);
        if (encoded_id == NULL)
@@ -378,14 +391,14 @@ int app2sd_usr_on_demand_setup_init(const char *pkgid, uid_t uid)
        if (_is_global(uid)) {
                snprintf(application_path, FILENAME_MAX - 1, "%s/%s",
                        tzplatform_getenv(TZ_SYS_RW_APP), pkgid);
-               snprintf(loopback_device, FILENAME_MAX - 1, "%s/%s",
-                       APP2SD_PATH, encoded_id);
+               snprintf(loopback_device, FILENAME_MAX - 1, "%s/%s/%s",
+                       mmc_path, EXTIMG_DIR, encoded_id);
        } else {
                tzplatform_set_user(uid);
                snprintf(application_path, FILENAME_MAX - 1, "%s/%s",
                        tzplatform_getenv(TZ_USER_APP), pkgid);
-               snprintf(loopback_device, FILENAME_MAX - 1, "%s/%s",
-                       APP2SD_PATH, encoded_id);
+               snprintf(loopback_device, FILENAME_MAX - 1, "%s/%s/%s",
+                       mmc_path, EXTIMG_DIR, encoded_id);
                tzplatform_reset_user();
        }
        free(encoded_id);
@@ -475,7 +488,7 @@ static int _app2sd_application_handler(const pkgmgrinfo_appinfo_h handle, void *
                return APP2EXT_ERROR_KILLAPP_ERROR;
        }
 
-       ret = aul_terminate_pid_sync_for_uid(pid, uid);
+       ret = aul_terminate_pid_sync_without_restart_for_uid(pid, uid);
        if (ret != AUL_R_OK) {
                _E("failed to kill app");
                return APP2EXT_ERROR_KILLAPP_ERROR;
@@ -514,8 +527,10 @@ static int _app2sd_kill_running_app(const char *pkgid, uid_t uid)
 int app2sd_usr_on_demand_setup_exit(const char *pkgid, uid_t uid)
 {
        int ret = APP2EXT_SUCCESS;
+       char mmc_path[FILENAME_MAX] = { 0, };
        char application_path[FILENAME_MAX] = { 0, };
        char loopback_device[FILENAME_MAX] = { 0, };
+       char *sdpath = NULL;
        char *encoded_id = NULL;
        FILE *fp = NULL;
        int mmc_present = 1;
@@ -529,11 +544,13 @@ int app2sd_usr_on_demand_setup_exit(const char *pkgid, uid_t uid)
        _app2sd_kill_running_app(pkgid, uid);
 
        /* check whether MMC is present or not */
-       ret = _app2sd_check_mmc_status();
+       ret = _app2sd_check_mmc_status(&sdpath);
        if (ret) {
-               _W("MMC not preset OR Not ready (%d)", ret);
+               _W("MMC not present OR Not ready (%d)", ret);
                mmc_present = 0;
        }
+       snprintf(mmc_path, FILENAME_MAX - 1, "%s", sdpath);
+       free(sdpath);
 
        encoded_id = _app2sd_get_encoded_name(pkgid, uid);
        if (encoded_id == NULL)
@@ -543,14 +560,14 @@ int app2sd_usr_on_demand_setup_exit(const char *pkgid, uid_t uid)
        if (_is_global(uid)) {
                snprintf(application_path, FILENAME_MAX - 1, "%s/%s",
                        tzplatform_getenv(TZ_SYS_RW_APP), pkgid);
-               snprintf(loopback_device, FILENAME_MAX - 1, "%s/%s",
-                       APP2SD_PATH, encoded_id);
+               snprintf(loopback_device, FILENAME_MAX - 1, "%s/%s/%s",
+                       mmc_path, EXTIMG_DIR, encoded_id);
        } else {
                tzplatform_set_user(uid);
                snprintf(application_path, FILENAME_MAX - 1, "%s/%s",
                        tzplatform_getenv(TZ_USER_APP), pkgid);
-               snprintf(loopback_device, FILENAME_MAX - 1, "%s/%s",
-                       APP2SD_PATH, encoded_id);
+               snprintf(loopback_device, FILENAME_MAX - 1, "%s/%s/%s",
+                       mmc_path, EXTIMG_DIR, encoded_id);
                tzplatform_reset_user();
        }
        free(encoded_id);
@@ -588,8 +605,10 @@ int app2sd_usr_on_demand_setup_exit(const char *pkgid, uid_t uid)
 int app2sd_usr_pre_app_uninstall(const char *pkgid, uid_t uid)
 {
        int ret = APP2EXT_SUCCESS;
+       char mmc_path[FILENAME_MAX] = { 0, };
        char application_path[FILENAME_MAX] = { 0, };
        char loopback_device[FILENAME_MAX] = { 0, };
+       char *sdpath = NULL;
        char *encoded_id = NULL;
        char *device_node = NULL;
        FILE *fp = NULL;
@@ -602,12 +621,15 @@ int app2sd_usr_pre_app_uninstall(const char *pkgid, uid_t uid)
        }
 
        /* check whether MMC is present or not */
-       ret = _app2sd_check_mmc_status();
+       ret = _app2sd_check_mmc_status(&sdpath);
        if (ret) {
-               _E("MMC not preset OR Not ready (%d)", ret);
+               _E("MMC not present OR Not ready (%d)", ret);
                ret = APP2EXT_ERROR_MMC_STATUS;
                goto END;
        }
+       snprintf(mmc_path, FILENAME_MAX - 1, "%s", sdpath);
+       free(sdpath);
+       sync();
 
        encoded_id = _app2sd_get_encoded_name(pkgid, uid);
        if (encoded_id == NULL)
@@ -616,14 +638,14 @@ int app2sd_usr_pre_app_uninstall(const char *pkgid, uid_t uid)
        if (_is_global(uid)) {
                snprintf(application_path, FILENAME_MAX - 1, "%s/%s",
                        tzplatform_getenv(TZ_SYS_RW_APP), pkgid);
-               snprintf(loopback_device, FILENAME_MAX - 1, "%s/%s",
-                       APP2SD_PATH, encoded_id);
+               snprintf(loopback_device, FILENAME_MAX - 1, "%s/%s/%s",
+                       mmc_path, EXTIMG_DIR, encoded_id);
        } else {
                tzplatform_set_user(uid);
                snprintf(application_path, FILENAME_MAX - 1, "%s/%s",
                        tzplatform_getenv(TZ_USER_APP), pkgid);
-               snprintf(loopback_device, FILENAME_MAX - 1, "%s/%s",
-                       APP2SD_PATH, encoded_id);
+               snprintf(loopback_device, FILENAME_MAX - 1, "%s/%s/%s",
+                       mmc_path, EXTIMG_DIR, encoded_id);
                tzplatform_reset_user();
        }
        free(encoded_id);
@@ -696,13 +718,17 @@ int app2sd_usr_pre_app_uninstall(const char *pkgid, uid_t uid)
        }
 
 END:
+       sync();
        return ret;
 }
 
 int app2sd_usr_post_app_uninstall(const char *pkgid, uid_t uid)
 {
+       char mmc_path[FILENAME_MAX] = { 0, };
        char application_path[FILENAME_MAX] = { 0, };
+       char application_mmc_path[FILENAME_MAX] = { 0, };
        char loopback_device[FILENAME_MAX] = { 0, };
+       char *sdpath = NULL;
        char *encoded_id = NULL;
        int ret = APP2EXT_SUCCESS;
 
@@ -714,12 +740,15 @@ int app2sd_usr_post_app_uninstall(const char *pkgid, uid_t uid)
        }
 
        /* check whether MMC is present or not */
-       ret = _app2sd_check_mmc_status();
+       ret = _app2sd_check_mmc_status(&sdpath);
        if (ret) {
-               _E("MMC not preset OR Not ready (%d)", ret);
+               _E("MMC not present OR Not ready (%d)", ret);
                ret = APP2EXT_ERROR_MMC_STATUS;
                goto END;
        }
+       snprintf(mmc_path, FILENAME_MAX - 1, "%s", sdpath);
+       free(sdpath);
+       sync();
 
        encoded_id = _app2sd_get_encoded_name(pkgid, uid);
        if (encoded_id == NULL)
@@ -728,17 +757,19 @@ int app2sd_usr_post_app_uninstall(const char *pkgid, uid_t uid)
        if (_is_global(uid)) {
                snprintf(application_path, FILENAME_MAX - 1, "%s/%s",
                        tzplatform_getenv(TZ_SYS_RW_APP), pkgid);
-               snprintf(loopback_device, FILENAME_MAX - 1, "%s/%s",
-                       APP2SD_PATH, encoded_id);
+               snprintf(loopback_device, FILENAME_MAX - 1, "%s/%s/%s",
+                       mmc_path, EXTIMG_DIR, encoded_id);
        } else {
                tzplatform_set_user(uid);
                snprintf(application_path, FILENAME_MAX - 1, "%s/%s",
                        tzplatform_getenv(TZ_USER_APP), pkgid);
-               snprintf(loopback_device, FILENAME_MAX - 1, "%s/%s",
-                       APP2SD_PATH, encoded_id);
+               snprintf(loopback_device, FILENAME_MAX - 1, "%s/%s/%s",
+                       mmc_path, EXTIMG_DIR, encoded_id);
                tzplatform_reset_user();
        }
        free(encoded_id);
+       snprintf(application_mmc_path, FILENAME_MAX - 1, "%s/.mmc",
+               application_path);
 
        /* unmount the loopback encrypted pseudo device from
         * the application installation path
@@ -775,7 +806,7 @@ int app2sd_usr_post_app_uninstall(const char *pkgid, uid_t uid)
                goto END;
        }
 
-       ret = _app2sd_delete_directory(application_path);
+       ret = _app2sd_delete_directory(application_mmc_path);
        if (ret) {
                _E("unable to delete the directory (%s)",
                application_path);
@@ -798,6 +829,7 @@ int app2sd_usr_post_app_uninstall(const char *pkgid, uid_t uid)
        }
 
 END:
+       sync();
        return ret;
 }
 
@@ -806,6 +838,9 @@ int app2sd_usr_pre_move_installed_app(const char *pkgid,
 {
        int ret = 0;
        int pkgmgr_ret = 0;
+       char *sdpath = NULL;
+       char *image_path = NULL;
+       char mmc_path[FILENAME_MAX] = { 0, };
 
        /* validate function arguments */
        if (pkgid == NULL || dir_list == NULL
@@ -815,13 +850,23 @@ int app2sd_usr_pre_move_installed_app(const char *pkgid,
                return APP2EXT_ERROR_INVALID_ARGUMENTS;
        }
 
-       ret = __app2sd_create_app2sd_directories(uid);
+       /* check whether MMC is present or not */
+       ret = _app2sd_check_mmc_status(&sdpath);
+       if (ret) {
+               _E("MMC not present OR Not ready(%d)", ret);
+               return APP2EXT_ERROR_MMC_STATUS;
+       }
+       snprintf(mmc_path, FILENAME_MAX - 1, "%s", sdpath);
+       free(sdpath);
+       sync();
+
+       ret = __app2sd_create_app2sd_directories(uid, mmc_path);
        if (ret) {
                _E("failed to create app2sd dirs");
                return ret;
        }
 
-       ret = _app2sd_usr_move_app(pkgid, move_type, dir_list, uid);
+       ret = _app2sd_usr_move_app(pkgid, move_type, dir_list, uid, mmc_path, &image_path);
        if (ret) {
                _D("unable to move application");
                return ret;
@@ -829,8 +874,12 @@ int app2sd_usr_pre_move_installed_app(const char *pkgid,
 
        /* if move is completed, then update installed storage to pkgmgr_parser db */
        if (move_type == APP2EXT_MOVE_TO_EXT) {
+               if (!image_path) {
+                       _E("image_path is NULL");
+                       return APP2EXT_ERROR_MEMORY_ALLOC_FAILED;
+               }
                pkgmgr_ret = pkgmgrinfo_pkginfo_set_usr_installed_storage(pkgid,
-                               INSTALL_EXTERNAL, uid);
+                               INSTALL_EXTERNAL, image_path, uid);
                if (pkgmgr_ret < 0) {
                        _E("failed to update installed location to db " \
                                "[%s, %s] of uid(%d), pkgmgr_ret(%d)",
@@ -839,7 +888,7 @@ int app2sd_usr_pre_move_installed_app(const char *pkgid,
                }
        } else {
                pkgmgr_ret = pkgmgrinfo_pkginfo_set_usr_installed_storage(pkgid,
-                               INSTALL_INTERNAL, uid);
+                               INSTALL_INTERNAL, image_path, uid);
                if (pkgmgr_ret < 0) {
                        _E("failed to update installed location to db " \
                                "[%s, %s] of uid(%d), pkgmgr_ret(%d)",
@@ -848,6 +897,10 @@ int app2sd_usr_pre_move_installed_app(const char *pkgid,
                }
        }
 
+       if (image_path)
+               free(image_path);
+
+       sync();
        return APP2EXT_SUCCESS;
 }
 
@@ -855,8 +908,10 @@ int app2sd_usr_post_move_installed_app(const char *pkgid,
                app2ext_move_type move_type, uid_t uid)
 {
        int ret = 0;
+       char mmc_path[FILENAME_MAX] = { 0, };
        char application_path[FILENAME_MAX] = { 0, };
        char loopback_device[FILENAME_MAX] = { 0, };
+       char *sdpath = NULL;
        char *encoded_id = NULL;
 
        /* validate function arguments */
@@ -870,18 +925,21 @@ int app2sd_usr_post_move_installed_app(const char *pkgid,
                return APP2EXT_SUCCESS;
 
        /* check whether MMC is present or not */
-       ret = _app2sd_check_mmc_status();
+       ret = _app2sd_check_mmc_status(&sdpath);
        if (ret) {
-               _E("MMC not preset OR Not ready(%d)", ret);
+               _E("MMC not present OR Not ready(%d)", ret);
                return APP2EXT_ERROR_MMC_STATUS;
        }
+       snprintf(mmc_path, FILENAME_MAX - 1, "%s", sdpath);
+       free(sdpath);
+       sync();
 
        encoded_id = _app2sd_get_encoded_name(pkgid, uid);
        if (encoded_id == NULL)
                return APP2EXT_ERROR_MEMORY_ALLOC_FAILED;
 
-       snprintf(loopback_device, FILENAME_MAX - 1, "%s/%s",
-                       APP2SD_PATH, encoded_id);
+       snprintf(loopback_device, FILENAME_MAX - 1, "%s/%s/%s",
+                       mmc_path, EXTIMG_DIR, encoded_id);
        free(encoded_id);
        if (_is_global(uid)) {
                snprintf(application_path, FILENAME_MAX - 1, "%s/%s",
@@ -916,9 +974,11 @@ int app2sd_usr_pre_app_upgrade(const char *pkgid, GList *dir_list,
                int size, uid_t uid)
 {
        int ret = APP2EXT_SUCCESS;
+       char app2sd_path[FILENAME_MAX] = { 0, };
        char loopback_device[FILENAME_MAX] = { 0, };
        char application_path[FILENAME_MAX] = { 0, };
        char temp_uid[32] = { 0, };
+       char *sdpath = NULL;
        char *temp_pkgid = NULL;
        char *temp_loopback_device = NULL;
        char *temp_application_path = NULL;
@@ -937,11 +997,15 @@ int app2sd_usr_pre_app_upgrade(const char *pkgid, GList *dir_list,
        }
 
        /* check whether MMC is present or not */
-       ret = _app2sd_check_mmc_status();
+       ret = _app2sd_check_mmc_status(&sdpath);
        if (ret) {
-               _E("MMC not preset OR Not ready (%d)", ret);
+               _E("MMC not present OR Not ready (%d)", ret);
                return APP2EXT_ERROR_MMC_STATUS;
        }
+       snprintf(app2sd_path, FILENAME_MAX - 1, "%s/%s",
+                       sdpath, EXTIMG_DIR);
+       free(sdpath);
+       sync();
 
        encoded_id = _app2sd_get_encoded_name(pkgid, uid);
        if (encoded_id == NULL)
@@ -951,13 +1015,13 @@ int app2sd_usr_pre_app_upgrade(const char *pkgid, GList *dir_list,
                snprintf(application_path, FILENAME_MAX - 1, "%s/%s",
                        tzplatform_getenv(TZ_SYS_RW_APP), pkgid);
                snprintf(loopback_device, FILENAME_MAX - 1, "%s/%s",
-                       APP2SD_PATH, encoded_id);
+                       app2sd_path, encoded_id);
        } else {
                tzplatform_set_user(uid);
                snprintf(application_path, FILENAME_MAX - 1, "%s/%s",
                        tzplatform_getenv(TZ_USER_APP), pkgid);
                snprintf(loopback_device, FILENAME_MAX - 1, "%s/%s",
-                       APP2SD_PATH, encoded_id);
+                       app2sd_path, encoded_id);
                tzplatform_reset_user();
        }
        free(encoded_id);
@@ -1003,7 +1067,7 @@ int app2sd_usr_pre_app_upgrade(const char *pkgid, GList *dir_list,
                                free(temp_application_path);
                                return APP2EXT_ERROR_MEMORY_ALLOC_FAILED;
                        }
-                       len = strlen(APP2SD_PATH) + strlen(temp_encoded_id) + 1;
+                       len = strlen(app2sd_path) + strlen(temp_encoded_id) + 1;
                        temp_loopback_device = calloc(len + 1, sizeof(char));
                        if (temp_loopback_device == NULL) {
                                _E("memory alloc failed");
@@ -1013,7 +1077,7 @@ int app2sd_usr_pre_app_upgrade(const char *pkgid, GList *dir_list,
                                return APP2EXT_ERROR_MEMORY_ALLOC_FAILED;
                        }
                        snprintf(temp_loopback_device, len + 1, "%s/%s",
-                               APP2SD_PATH, temp_encoded_id);
+                               app2sd_path, temp_encoded_id);
                        free(temp_encoded_id);
                } else {
                        tzplatform_set_user(uid);
@@ -1034,7 +1098,7 @@ int app2sd_usr_pre_app_upgrade(const char *pkgid, GList *dir_list,
                                return APP2EXT_ERROR_MEMORY_ALLOC_FAILED;
                        }
                        snprintf(temp_uid, 32, "%d", uid);
-                       len = strlen(APP2SD_PATH) + strlen(temp_uid) + strlen(temp_encoded_id) + 2;
+                       len = strlen(app2sd_path) + strlen(temp_uid) + strlen(temp_encoded_id) + 2;
                        temp_loopback_device = calloc(len + 1, sizeof(char));
                        if (temp_loopback_device == NULL) {
                                _E("memory alloc failed");
@@ -1044,7 +1108,7 @@ int app2sd_usr_pre_app_upgrade(const char *pkgid, GList *dir_list,
                                return APP2EXT_ERROR_MEMORY_ALLOC_FAILED;
                        }
                        snprintf(temp_loopback_device, len + 1, "%s/%s",
-                               APP2SD_PATH, temp_encoded_id);
+                               app2sd_path, temp_encoded_id);
                        free(temp_encoded_id);
                        tzplatform_reset_user();
                }
@@ -1117,17 +1181,22 @@ int app2sd_usr_pre_app_upgrade(const char *pkgid, GList *dir_list,
                free(device_node);
                device_node = NULL;
        }
+
+       sync();
        return ret;
 }
 
 int app2sd_usr_post_app_upgrade(const char *pkgid,
                app2ext_status install_status, uid_t uid)
 {
-       char *device_name = NULL;
+       char mmc_path[FILENAME_MAX] = { 0, };
        char loopback_device[FILENAME_MAX] = { 0, };
        char application_path[FILENAME_MAX] = { 0, };
+       char *sdpath = NULL;
+       char *device_name = NULL;
        char *encoded_id = NULL;
        int ret = APP2EXT_SUCCESS;
+       int pkgmgr_ret = 0;
 
        /* validate the function parameter recieved */
        if (pkgid == NULL || install_status < APP2EXT_STATUS_FAILED
@@ -1137,11 +1206,14 @@ int app2sd_usr_post_app_upgrade(const char *pkgid,
        }
 
        /* check whether MMC is present or not */
-       ret = _app2sd_check_mmc_status();
+       ret = _app2sd_check_mmc_status(&sdpath);
        if (ret) {
-               _E("MMC not preset OR Not ready (%d)", ret);
+               _E("MMC not present OR Not ready (%d)", ret);
                return APP2EXT_ERROR_MMC_STATUS;
        }
+       snprintf(mmc_path, FILENAME_MAX - 1, "%s", sdpath);
+       free(sdpath);
+       sync();
 
        encoded_id = _app2sd_get_encoded_name(pkgid, uid);
        if (encoded_id == NULL)
@@ -1150,14 +1222,14 @@ int app2sd_usr_post_app_upgrade(const char *pkgid,
        if (_is_global(uid)) {
                snprintf(application_path, FILENAME_MAX - 1, "%s/%s",
                        tzplatform_getenv(TZ_SYS_RW_APP), pkgid);
-               snprintf(loopback_device, FILENAME_MAX - 1, "%s/%s",
-                       APP2SD_PATH, encoded_id);
+               snprintf(loopback_device, FILENAME_MAX - 1, "%s/%s/%s",
+                       mmc_path, EXTIMG_DIR, encoded_id);
        } else {
                tzplatform_set_user(uid);
                snprintf(application_path, FILENAME_MAX - 1, "%s/%s",
                        tzplatform_getenv(TZ_USER_APP), pkgid);
-               snprintf(loopback_device, FILENAME_MAX - 1, "%s/%s",
-                       APP2SD_PATH, encoded_id);
+               snprintf(loopback_device, FILENAME_MAX - 1, "%s/%s/%s",
+                       mmc_path, EXTIMG_DIR, encoded_id);
                tzplatform_reset_user();
        }
        free(encoded_id);
@@ -1210,18 +1282,30 @@ int app2sd_usr_post_app_upgrade(const char *pkgid,
        }
 #endif
 
+       pkgmgr_ret = pkgmgrinfo_pkginfo_set_usr_installed_storage(pkgid,
+               INSTALL_EXTERNAL, loopback_device, uid);
+       if (pkgmgr_ret < 0) {
+               _E("fail to update installed location " \
+                       "to db[%s, %d] of uid(%d), pkgmgr ret(%d)",
+                       pkgid, INSTALL_EXTERNAL, uid, pkgmgr_ret);
+               return APP2EXT_ERROR_PKGMGR_ERROR;
+       }
+
        if (device_name) {
                free(device_name);
                device_name = NULL;
        }
 
+       sync();
        return ret;
 }
 
 int app2sd_usr_force_clean(const char *pkgid, uid_t uid)
 {
+       char mmc_path[FILENAME_MAX] = { 0, };
        char loopback_device[FILENAME_MAX] = { 0, };
        char application_path[FILENAME_MAX] = { 0, };
+       char *sdpath = NULL;
        char *encoded_id = NULL;
        int ret = APP2EXT_SUCCESS;
 
@@ -1231,6 +1315,14 @@ int app2sd_usr_force_clean(const char *pkgid, uid_t uid)
                return APP2EXT_ERROR_INVALID_ARGUMENTS;
        }
 
+       /* check whether MMC is present or not */
+       ret = _app2sd_check_mmc_status(&sdpath);
+       if (ret) {
+               _E("MMC not present OR Not ready (%d)", ret);
+               return APP2EXT_ERROR_MMC_STATUS;
+       }
+       snprintf(mmc_path, FILENAME_MAX - 1, "%s", sdpath);
+       free(sdpath);
        sync();
 
        encoded_id = _app2sd_get_encoded_name(pkgid, uid);
@@ -1240,20 +1332,21 @@ int app2sd_usr_force_clean(const char *pkgid, uid_t uid)
        if (_is_global(uid)) {
                snprintf(application_path, FILENAME_MAX - 1, "%s/%s",
                        tzplatform_getenv(TZ_SYS_RW_APP), pkgid);
-               snprintf(loopback_device, FILENAME_MAX - 1, "%s/%s",
-                       APP2SD_PATH, encoded_id);
+               snprintf(loopback_device, FILENAME_MAX - 1, "%s/%s/%s",
+                       mmc_path, EXTIMG_DIR, encoded_id);
        } else {
                tzplatform_set_user(uid);
                snprintf(application_path, FILENAME_MAX - 1, "%s/%s",
                        tzplatform_getenv(TZ_USER_APP), pkgid);
-               snprintf(loopback_device, FILENAME_MAX - 1, "%s/%s",
-                       APP2SD_PATH, encoded_id);
+               snprintf(loopback_device, FILENAME_MAX - 1, "%s/%s/%s",
+                       mmc_path, EXTIMG_DIR, encoded_id);
                tzplatform_reset_user();
        }
        free(encoded_id);
 
        ret = _app2sd_force_clean(pkgid, application_path, loopback_device, uid);
 
+       sync();
        return ret;
 }
 
@@ -1262,14 +1355,26 @@ int app2sd_enable_full_pkg(void)
        int ret = APP2EXT_SUCCESS;
        int rc = 0;
        char buf[FILENAME_MAX] = { 0, };
+       char app2sd_path[FILENAME_MAX] = { 0, };
        char loopback_device[FILENAME_MAX] = { 0, };
+       char *sdpath = NULL;
+       char *pkgid = NULL;
        DIR *dir = NULL;
        struct dirent entry;
        struct dirent *result = NULL;
-       char *pkgid = NULL;
        uid_t uid = 0;
 
-       dir = opendir(APP2SD_PATH);
+       /* check whether MMC is present or not */
+       ret = _app2sd_check_mmc_status(&sdpath);
+       if (ret) {
+               _E("MMC not present OR Not ready (%d)", ret);
+               return APP2EXT_ERROR_MMC_STATUS;
+       }
+       snprintf(app2sd_path, FILENAME_MAX - 1, "%s/%s",
+                       sdpath, EXTIMG_DIR);
+       free(sdpath);
+
+       dir = opendir(app2sd_path);
        if (!dir) {
                strerror_r(errno, buf, sizeof(buf));
                _E("failed to opendir (%s)", buf);
@@ -1290,7 +1395,7 @@ int app2sd_enable_full_pkg(void)
                        strcmp(entry.d_name, "..") == 0)
                        continue;
                snprintf(loopback_device, FILENAME_MAX - 1, "%s/%s",
-                       APP2SD_PATH, entry.d_name);
+                       app2sd_path, entry.d_name);
                ret = _app2sd_get_info_from_db(loopback_device,
                        &pkgid, &uid);
                if (ret) {
@@ -1315,6 +1420,7 @@ int app2sd_enable_full_pkg(void)
        }
        closedir(dir);
 
+       sync();
        return ret;
 }
 
@@ -1346,5 +1452,6 @@ int app2sd_disable_full_pkg(void)
        if (ret)
                _E("disable full pkg error(%d)", ret);
 
+       sync();
        return ret;
 }