Fix error when doing FOTA 48/210848/7
authorIlho Kim <ilho159.kim@samsung.com>
Thu, 25 Jul 2019 07:52:05 +0000 (16:52 +0900)
committerIlho Kim <ilho159.kim@samsung.com>
Fri, 26 Jul 2019 06:10:32 +0000 (15:10 +0900)
It doesn't have ALL_PRELOAD_RW_PKG in the past,
the case this file not exist is not error

Make preload rw package list from db in that case

Change-Id: I53fc539e22481070fde998518b05beaeef3eedfa
Signed-off-by: Ilho Kim <ilho159.kim@samsung.com>
src/pkg_upgrade.c

index 4ecacee97708bbcfac367f9e8f0be11f7eb59f0e..90781265668449bc42da2d4a0056237171fa1c32 100644 (file)
@@ -282,6 +282,15 @@ static int __make_pkgid_list(const char *file_path, char *pkgid,
        return 0;
 }
 
+static int __insert_preload_rw_table(GHashTable *preload_rw_table,
+               const char *pkgid)
+{
+       char *package = strdup(pkgid);
+       retvm_if(package == NULL, -1, "strdup failed\n");
+       g_hash_table_insert(preload_rw_table, package, NULL);
+       return 0;
+}
+
 static int __pkgid_list_cb(const pkgmgrinfo_pkginfo_h handle, void *user_data)
 {
        int ret = -1;
@@ -307,6 +316,21 @@ static int __pkgid_list_cb(const pkgmgrinfo_pkginfo_h handle, void *user_data)
        return ret;
 }
 
+static int __preload_rw_pkgid_list_cb(const pkgmgrinfo_pkginfo_h handle,
+               void *user_data)
+{
+       int ret;
+       char *pkgid;
+       GHashTable *preload_rw_table = (GHashTable *)user_data;
+
+       ret = pkgmgrinfo_pkginfo_get_pkgid(handle, &pkgid);
+       retvm_if(ret < 0, -1, "pkgmgrinfo_pkginfo_get_pkgid failed");
+
+       ret = __insert_preload_rw_table(preload_rw_table, pkgid);
+       retvm_if(ret < 0, -1, "__insert_preload_rw_table fail\n");
+       return 0;
+}
+
 static void __str_trim(char *input)
 {
        char *trim_str = input;
@@ -739,6 +763,46 @@ catch:
        return ret;
 }
 
+static int __find_preload_rw_pkgid_from_db(GHashTable *preload_rw_table)
+{
+       int ret;
+       pkgmgrinfo_pkginfo_filter_h handle;
+
+       ret = pkgmgrinfo_pkginfo_filter_create(&handle);
+       retvm_if(ret != PMINFO_R_OK, -1,
+                       "pkginfo filter handle create failed\n");
+
+       ret = pkgmgrinfo_pkginfo_filter_add_bool(handle,
+               PMINFO_PKGINFO_PROP_PACKAGE_PRELOAD, 1);
+       tryvm_if(ret != PMINFO_R_OK, ret = -1, "pkgmgrinfo_pkginfo_filter_add_bool"
+                       "(PMINFO_PKGINFO_PROP_PACKAGE_PRELOAD) failed\n");
+
+       ret = pkgmgrinfo_pkginfo_filter_add_bool(handle,
+               PMINFO_PKGINFO_PROP_PACKAGE_REMOVABLE, 1);
+       tryvm_if(ret != PMINFO_R_OK, ret = -1, "pkgmgrinfo_pkginfo_filter_add_bool"
+                       "(PMINFO_PKGINFO_PROP_PACKAGE_REMOVABLE) failed\n");
+
+       ret = pkgmgrinfo_pkginfo_filter_add_bool(handle,
+               PMINFO_PKGINFO_PROP_PACKAGE_READONLY, 0);
+       tryvm_if(ret != PMINFO_R_OK, ret = -1, "pkgmgrinfo_pkginfo_filter_add_bool"
+                       "(PMINFO_PKGINFO_PROP_PACKAGE_READONLY) failed\n");
+
+       ret = pkgmgrinfo_pkginfo_filter_add_bool(handle,
+               PMINFO_PKGINFO_PROP_PACKAGE_SYSTEM, 0);
+       tryvm_if(ret != PMINFO_R_OK, ret = -1, "pkgmgrinfo_pkginfo_filter_add_bool"
+                       "(PMINFO_PKGINFO_PROP_PACKAGE_SYSTEM) failed\n");
+
+       ret = pkgmgrinfo_pkginfo_filter_foreach_pkginfo(handle,
+               __preload_rw_pkgid_list_cb, (void *)preload_rw_table);
+       err_if(ret != PMINFO_R_OK,
+                       "pkgmgrinfo_pkginfo_filter_foreach_pkginfo() failed\n");
+
+       ret = 0;
+catch:
+       pkgmgrinfo_pkginfo_filter_destroy(handle);
+       return ret;
+}
+
 static int __find_matched_pkgid_from_list(const char *source_file,
                const char *target_file)
 {
@@ -864,13 +928,6 @@ static int __unzip_files(char *dest_path)
        return ret;
 }
 
-static int __insert_preload_rw_table(GHashTable *preload_rw_table,
-               const char *pkgid)
-{
-       g_hash_table_insert(preload_rw_table, strdup(pkgid), NULL);
-       return 0;
-}
-
 static int __install_preload_rw(const char *pkgid, const char *pkgtype,
                GHashTable *preload_rw_table)
 {
@@ -1271,8 +1328,10 @@ int main(int argc, char *argv[])
 
        preload_rw_table = g_hash_table_new_full(
                                g_str_hash, g_str_equal, free, NULL);
-       ret = __fill_preload_rw_table(preload_rw_table);
-       retvm_if(ret < 0, -1, "__fill_preload_rw_table is failed.\n");
+       if (__fill_preload_rw_table(preload_rw_table) < 0) {
+               ret = __find_preload_rw_pkgid_from_db(preload_rw_table);
+               retvm_if(ret < 0, -1, "__find_preload_rw_pkgid_from_db is failed\n");
+       }
 
        if (argc == 1) {
                ret = __process_ro_fota(preload_rw_table);