From 3e9ff3c7bedb8f61a84b43d7c22e3fcfcc5e215d Mon Sep 17 00:00:00 2001 From: Ilho Kim Date: Thu, 25 Jul 2019 16:52:05 +0900 Subject: [PATCH] Fix error when doing FOTA 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 --- src/pkg_upgrade.c | 77 +++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 68 insertions(+), 9 deletions(-) diff --git a/src/pkg_upgrade.c b/src/pkg_upgrade.c index 4ecacee..9078126 100644 --- a/src/pkg_upgrade.c +++ b/src/pkg_upgrade.c @@ -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); -- 2.34.1