From e555804661aac7a366777deed4dc3c4051b2dd49 Mon Sep 17 00:00:00 2001 From: Sangyoon Jang Date: Tue, 15 May 2018 18:05:50 +0900 Subject: [PATCH 01/16] Release version 0.4.14 Changes: - Fix pkg_upgrade tool to handle wgt packages - Add upgrade script for version 30002 Change-Id: Ifca72f6056f518bd95869bddc24f494cfd3c2eea Signed-off-by: Sangyoon Jang --- packaging/pkgmgr-tool.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/pkgmgr-tool.spec b/packaging/pkgmgr-tool.spec index af62bb4..b2cd5de 100644 --- a/packaging/pkgmgr-tool.spec +++ b/packaging/pkgmgr-tool.spec @@ -1,6 +1,6 @@ Name: pkgmgr-tool Summary: Packager Manager Tool package -Version: 0.4.13 +Version: 0.4.14 Release: 1 Group: Application Framework/Package Management License: Apache-2.0 -- 2.7.4 From 6106621826c81e497d103faa2425f98d70057b49 Mon Sep 17 00:00:00 2001 From: Junghyun Yeon Date: Mon, 21 May 2018 09:46:24 +0900 Subject: [PATCH 02/16] Fix static analysis issue Change-Id: Iae6f32b9a60aecd01802f32c830aa9d1ddc0393b Signed-off-by: Junghyun Yeon --- src/pkg_upgrade.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/pkg_upgrade.c b/src/pkg_upgrade.c index eb7b1c9..76fadf5 100644 --- a/src/pkg_upgrade.c +++ b/src/pkg_upgrade.c @@ -769,6 +769,7 @@ static int __find_deleted_pkgid_from_list(const char *source_file, if (update == NULL) { FREE_AND_NULL(pkgid); FREE_AND_NULL(version); + FREE_AND_NULL(pkgtype); continue; } if (!strncmp(update, "false", strlen("false"))) { -- 2.7.4 From 8d502343c3715ab6721f30f664a3bebf853e0c8f Mon Sep 17 00:00:00 2001 From: Junghyun Yeon Date: Mon, 21 May 2018 11:16:51 +0900 Subject: [PATCH 03/16] Release version 0.4.15 Changes: - Fix static analysis issue Change-Id: Ice29241c7d4ab83f78be30dcc799a307edc1be27 Signed-off-by: Junghyun Yeon --- packaging/pkgmgr-tool.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/pkgmgr-tool.spec b/packaging/pkgmgr-tool.spec index b2cd5de..953596c 100644 --- a/packaging/pkgmgr-tool.spec +++ b/packaging/pkgmgr-tool.spec @@ -1,6 +1,6 @@ Name: pkgmgr-tool Summary: Packager Manager Tool package -Version: 0.4.14 +Version: 0.4.15 Release: 1 Group: Application Framework/Package Management License: Apache-2.0 -- 2.7.4 From cc99b7e74f1e695964a46d17b7797a21d1b7ed68 Mon Sep 17 00:00:00 2001 From: Junghyun Yeon Date: Mon, 10 Sep 2018 11:59:25 +0900 Subject: [PATCH 04/16] Fix pkg_upgrade - Add codes to support rpm pkg type. Change-Id: Idca0d935c63e8a5591fb464f982eebab008409e5 Signed-off-by: Junghyun Yeon --- src/pkg_upgrade.c | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/pkg_upgrade.c b/src/pkg_upgrade.c index 76fadf5..4ab5d77 100644 --- a/src/pkg_upgrade.c +++ b/src/pkg_upgrade.c @@ -420,6 +420,8 @@ static void __send_args_to_backend(char *pkgid, const char *pkgtype, starttime = tv.tv_sec * 1000l + tv.tv_usec / 1000l; char buf[BUF_SIZE]; char backend_cmd[BUF_SIZE]; + const char *new_pkgtype; + const char tpk_pkgtype[] = "tpk"; const char *install_ro[] = { backend_cmd, "-y", pkgid, "--preload", "--partial-rw", NULL }; @@ -437,8 +439,13 @@ static void __send_args_to_backend(char *pkgid, const char *pkgtype, if (__compare_builtin_removable_pkgid(pkgid) < 0) return; + if (!strcmp(pkgtype, "rpm")) + new_pkgtype = tpk_pkgtype; + else + new_pkgtype = pkgtype; + snprintf(backend_cmd, sizeof(backend_cmd), "/usr/bin/%s-backend", - pkgtype); + new_pkgtype); switch (operation) { case PKG_NEED_INSTALL: -- 2.7.4 From 2ca224a192cc85454e569bb3b7cefe0c5c200199 Mon Sep 17 00:00:00 2001 From: Junghyun Yeon Date: Wed, 12 Sep 2018 14:18:01 +0900 Subject: [PATCH 05/16] Release version 0.4.16 Changes: - Fix pkg_upgrade Change-Id: Ia8023761f4e52348bbe960de2349b54078db11b3 Signed-off-by: Junghyun Yeon --- packaging/pkgmgr-tool.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/pkgmgr-tool.spec b/packaging/pkgmgr-tool.spec index 953596c..03ddf53 100644 --- a/packaging/pkgmgr-tool.spec +++ b/packaging/pkgmgr-tool.spec @@ -1,6 +1,6 @@ Name: pkgmgr-tool Summary: Packager Manager Tool package -Version: 0.4.15 +Version: 0.4.16 Release: 1 Group: Application Framework/Package Management License: Apache-2.0 -- 2.7.4 From eea911fa99ca557172e23fe5c248176b03fa1964 Mon Sep 17 00:00:00 2001 From: Junghyun Yeon Date: Wed, 24 Oct 2018 15:54:39 +0900 Subject: [PATCH 06/16] Fix upgrade script - uid of user "tizenglobalapp" has changed in 4.0. Change-Id: Ibedac9655875c725ec39013e7f71fd19ca0ce2aa Signed-off-by: Junghyun Yeon --- data/updates/upgrade_to_30001.sh.in | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/data/updates/upgrade_to_30001.sh.in b/data/updates/upgrade_to_30001.sh.in index 9cea988..d1e1091 100644 --- a/data/updates/upgrade_to_30001.sh.in +++ b/data/updates/upgrade_to_30001.sh.in @@ -86,8 +86,16 @@ function migrate_user_db() { done } +function migrate_globalapp_ownership() { + chown -R tizenglobalapp:root /opt/usr/globalapps/ + chown root:root /opt/usr/globalapps + chown -R tizenglobalapp:root /opt/share/packages/ + chown root:root /opt/share/packages +} + migrate_parser_db $PARSER_DB_PATH migrate_user_db migrate_cert_db +migrate_globalapp_ownership pkg_upgrade -rof -- 2.7.4 From 62e2a0589017350f602e14f434d84a7f3e66421c Mon Sep 17 00:00:00 2001 From: Junghyun Yeon Date: Fri, 5 Oct 2018 16:48:08 +0900 Subject: [PATCH 07/16] Refactor pkg_upgrade - Remove unused defines. - Add codes to migrate preloaded pkg to preload-rw pkg. - Invoking pkg_upgrade without parameter will migrate ro/rw pkgs. - Remove some useless variable initialization. Change-Id: I34e0afd77926b73a1a70667e43f2f69faa950c55 Signed-off-by: Junghyun Yeon --- src/pkg_upgrade.c | 460 ++++++++++++++++++++++++++++++++++-------------------- src/pkg_upgrade.h | 6 +- 2 files changed, 291 insertions(+), 175 deletions(-) diff --git a/src/pkg_upgrade.c b/src/pkg_upgrade.c index 4ab5d77..1a8be29 100644 --- a/src/pkg_upgrade.c +++ b/src/pkg_upgrade.c @@ -50,17 +50,17 @@ #define PKGID_LIST_FROM_XML_FILE \ tzplatform_mkpath(TZ_SYS_GLOBALUSER_DATA, \ "pkgmgr/fota/pkgid_list_from_xml.txt") +#define PRELOAD_RW_PKG_LIST \ + tzplatform_mkpath(TZ_SYS_RO_APP, \ + ".preload_rw_pkg_list") #define DBPATH tzplatform_mkpath(TZ_SYS_DB, "/.pkgmgr_parser.db") +#define OPT_ZIP_FILE "/usr/system/RestoreDir/opt.zip" -#define PRELOAD_RW_TPK_PATH \ - tzplatform_mkpath(TZ_SYS_RO_APP, ".preload-rw-tpk") -#define PRELOAD_RW_WGT_PATH \ - tzplatform_mkpath(TZ_SYS_RO_APP, ".preload-rw-wgt") -#define PRELOAD_RW_FLAG_PATH \ - tzplatform_mkpath(TZ_SYS_RO_APP, ".preload-rw-flag") -#define PRELOAD_RW_LIST_FILE \ - tzplatform_mkpath(TZ_SYS_RO_APP, \ - ".preload-rw-flag/restore_exception.list") +static char *unzip_path[BUF_SIZE] = { + "opt/usr/globalapps", + "opt/etc/skel/apps_rw", + NULL +}; float __get_elapsed_time() { @@ -94,6 +94,46 @@ float __get_elapsed_time() __get_elapsed_time(), ##arg); \ } while (0) +int remove_directory(const char *path) +{ + DIR *dir; + struct dirent *entry; + size_t path_len = strlen(path); + int ret = 0; + int iterate_ret; + char buf[BUF_SIZE] = {0}; + size_t len; + struct stat statbuf; + + dir = opendir(path); + if (!dir) + return -1; + + while (!ret && (entry = readdir(dir))) { + iterate_ret = -1; + + if (!strcmp(entry->d_name, ".") || !strcmp(entry->d_name, "..")) + continue; + + len = path_len + strlen(entry->d_name) + 2; + snprintf(buf, len, "%s/%s", path, entry->d_name); + + if (!stat(buf, &statbuf)) { + if (S_ISDIR(statbuf.st_mode)) + iterate_ret = remove_directory(buf); + else + iterate_ret = unlink(buf); + } + ret = iterate_ret; + } + + closedir(dir); + if (!ret) + ret = rmdir(path); + + return ret; +} + static int __is_dir(const char *dirname) { struct stat stFileInfo; @@ -357,37 +397,6 @@ static int __compare_pkgid(char *file_path, char *fota_pkgid, return ret; } -static int __compare_builtin_removable_pkgid(const char *pkgid) -{ - retvm_if(pkgid == NULL, 0, "pkgid is null\n"); - - int ret = 0; - FILE *fp = NULL; - char buf[BUF_SIZE] = {0}; - - fp = fopen(PRELOAD_RW_LIST_FILE, "r"); - if (fp == NULL) - return ret; - - while (fgets(buf, BUF_SIZE, fp) != NULL) { - __str_trim(buf); - - if (strstr(buf, pkgid) != NULL) { - _LOG("pkgid[%s] will be processed by builtin cmd.\n", - pkgid); - ret = -1; - break; - } - - memset(buf, 0x00, BUF_SIZE); - } - - if (fp != NULL) - fclose(fp); - - return ret; -} - char *__manifest_to_package(const char *manifest) { char *package; @@ -408,7 +417,7 @@ char *__manifest_to_package(const char *manifest) return package; } -static void __send_args_to_backend(char *pkgid, const char *pkgtype, +static void __send_args_to_backend(const char *pkgid, const char *pkgtype, int operation) { int ret = 0; @@ -423,22 +432,24 @@ static void __send_args_to_backend(char *pkgid, const char *pkgtype, const char *new_pkgtype; const char tpk_pkgtype[] = "tpk"; + const char *preload_rw[] = { backend_cmd, "-y", pkgid, + "--preload-rw", NULL }; const char *install_ro[] = { backend_cmd, "-y", pkgid, "--preload", "--partial-rw", NULL }; const char *uninstall_ro[] = { backend_cmd, "-d", pkgid, "--preload", "--force-remove", "--partial-rw", NULL }; + const char *uninstall_ro_keeprwdata[] = { backend_cmd, "-d", pkgid, + "--preload", "--force-remove", + "--keep-rwdata", NULL }; const char *uninstall_ro_update[] = { backend_cmd, "-d", pkgid, "--keep-rwdata", NULL }; - const char *db_update_to_normal_pkg[] = {"/usr/bin/sqlite3", + const char *db_cmd[] = {"/usr/bin/sqlite3", NULL, NULL, NULL}; if (operation == PKG_NEED_NOTHING) return; - if (__compare_builtin_removable_pkgid(pkgid) < 0) - return; - if (!strcmp(pkgtype, "rpm")) new_pkgtype = tpk_pkgtype; else @@ -461,16 +472,33 @@ static void __send_args_to_backend(char *pkgid, const char *pkgtype, "package_preload='false', " \ "package_system='false' "\ "WHERE package='%s'", pkgid); - db_update_to_normal_pkg[1] = strdup(DBPATH); - db_update_to_normal_pkg[2] = strdup(buf); - ret = __xsystem(db_update_to_normal_pkg); - FREE_AND_NULL(db_update_to_normal_pkg[1]); - FREE_AND_NULL(db_update_to_normal_pkg[2]); + db_cmd[1] = strdup(DBPATH); + db_cmd[2] = strdup(buf); + ret = __xsystem(db_cmd); + FREE_AND_NULL(db_cmd[1]); + FREE_AND_NULL(db_cmd[2]); break; case PKG_NEED_RWUNINSTALL: case PKG_NEED_UPDATE_TO_RO: ret = __xsystem(uninstall_ro_update); break; + case PKG_NEED_RO_DBREMOVE: + snprintf(buf, sizeof(buf), + "PRAGMA foreign_keys=on; " \ + "DELETE FROM package_info " \ + "WHERE package='%s'", pkgid); + db_cmd[1] = strdup(DBPATH); + db_cmd[2] = strdup(buf); + ret = __xsystem(db_cmd); + FREE_AND_NULL(db_cmd[1]); + FREE_AND_NULL(db_cmd[2]); + break; + case PKG_NEED_PRELOADRW_INSTALL: + ret = __xsystem(preload_rw); + break; + case PKG_NEED_RO_UNINSTALL_KEEPRWDATA: + ret = __xsystem(uninstall_ro_keeprwdata); + break; } gettimeofday(&tv, NULL); @@ -735,6 +763,116 @@ static int __find_matched_pkgid_from_list(const char *source_file, return 0; } +static bool __find_pkgid_from_rw_list(const char *pkgid) +{ + if (pkgid == NULL) + return false; + + bool ret = false; + FILE *fp = NULL; + char buf[BUF_SIZE] = {0}; + char *preload_rw_pkgid = NULL; + + fp = fopen(PRELOAD_RW_PKG_LIST, "r"); + retvm_if(fp == NULL, -1, "Failed to open : %s\n", PRELOAD_RW_PKG_LIST); + + while (fgets(buf, BUF_SIZE, fp) != NULL) { + __str_trim(buf); + + preload_rw_pkgid = __getvalue(buf, TOKEN_PKGID_STR, 1); + if (preload_rw_pkgid == NULL) { + _LOG("Failed to get pkgidstring[%s]\n", buf); + continue; + } + + if (strcmp(pkgid, preload_rw_pkgid) == 0) { + _LOG("pkgid[%s] is converted to preload rw pkg\n", pkgid); + FREE_AND_NULL(preload_rw_pkgid); + ret = true; + break; + } + FREE_AND_NULL(preload_rw_pkgid); + } + + fclose(fp); + return ret; +} + +static int __unzip_files(char *dest_path) +{ + const char *unzip_argv[] = { "/usr/bin/unzip", "-oXqq", + OPT_ZIP_FILE, dest_path, "-d", "/", NULL }; + int ret = __xsystem(unzip_argv); + + return ret; +} + +static int __install_preload_rw(const char *pkgid, const char *pkgtype) +{ + if (pkgid == NULL || pkgtype == NULL) + return -1; + + int index; + int ret; + char buf[BUF_SIZE] = {0}; + + /* copy modified manifest */ + snprintf(buf, BUF_SIZE, "%s/%s.xml", + (tzplatform_getenv(TZ_SYS_RW_PACKAGES) + 1), pkgid); + ret = __unzip_files(buf); + if (ret != 0) { + _LOG("Failed to unzip file from backup[%s]\n", buf); + return ret; + } + + /* copy stored signature */ + snprintf(buf, BUF_SIZE, "%s/signatures/%s.txt", + (tzplatform_getenv(TZ_SYS_SHARE) + 1), pkgid); + ret = __unzip_files(buf); + if (ret != 0) { + _LOG("Failed to unzip file from backup[%s]\n", buf); + return ret; + } + + /* copy RO and RW components */ + for (index = 0; index < BUF_SIZE; index++) { + if (unzip_path[index] == NULL) + break; + + snprintf(buf, BUF_SIZE, "%s/%s/*", unzip_path[index], pkgid); + ret = __unzip_files(buf); + if (ret != 0) { + _LOG("Failed to unzip file from backup[%s]\n", buf); + return ret; + } + } + + __send_args_to_backend(pkgid, pkgtype, PKG_NEED_PRELOADRW_INSTALL); + return ret; +} + +static void __convert_preload_to_rw(const char *pkgid, const char *pkgtype) +{ + if (pkgid == NULL || pkgtype == NULL) + return; + char buf[BUF_SIZE] = {0}; + int ret; + + snprintf(buf, BUF_SIZE, "%s/skel/apps_rw/%s", + tzplatform_getenv(TZ_SYS_ETC), pkgid); + + __send_args_to_backend(pkgid, pkgtype, PKG_NEED_RO_UNINSTALL_KEEPRWDATA); + ret = remove_directory(buf); + if (ret != 0) + _LOG("Failed to remove directory[%s]\n", buf); + + ret = __install_preload_rw(pkgid, pkgtype); + if (ret != 0) { + _LOG("Failed install preload rw pkg[%s]\n", pkgid); + return; + } +} + static int __find_deleted_pkgid_from_list(const char *source_file, const char *target_file) { @@ -743,15 +881,15 @@ static int __find_deleted_pkgid_from_list(const char *source_file, FILE *fp = NULL; char buf[BUF_SIZE] = {0}; - char *pkgid = NULL; - char *version = NULL; + char *pkgid; + char *version; char *pkgtype = NULL; char *update = NULL; + bool is_preload_rw_pkg; bool xml_update; int deleted_pkg_cnt = 0; int modified_pkg_cnt = 0; int total_pkg_cnt = 0; - int compare_result = 0; fp = fopen(source_file, "r"); @@ -763,11 +901,15 @@ static int __find_deleted_pkgid_from_list(const char *source_file, __str_trim(buf); pkgid = __getvalue(buf, TOKEN_PKGID_STR, 1); - if (pkgid == NULL) - continue; - version = __getvalue(buf, TOKEN_VERSION_STR, 1); pkgtype = __getvalue(buf, TOKEN_TYPE_STR, 1); + if (pkgid == NULL || version == NULL || pkgtype == NULL) { + _LOG("Failed to get pkg info from string[%s]\n", buf); + FREE_AND_NULL(pkgid); + FREE_AND_NULL(version); + FREE_AND_NULL(pkgtype); + continue; + } compare_result = __compare_pkgid((char *)target_file, pkgid, version, &xml_update); @@ -779,14 +921,27 @@ static int __find_deleted_pkgid_from_list(const char *source_file, FREE_AND_NULL(pkgtype); continue; } + + is_preload_rw_pkg = __find_pkgid_from_rw_list(pkgid); + if (!strncmp(update, "false", strlen("false"))) { - __send_args_to_backend(pkgid, pkgtype, - PKG_NEED_UNINSTALL); - deleted_pkg_cnt++; + if (is_preload_rw_pkg) { + __convert_preload_to_rw(pkgid, pkgtype); + modified_pkg_cnt++; + } else { + __send_args_to_backend(pkgid, pkgtype, + PKG_NEED_UNINSTALL); + deleted_pkg_cnt++; + } } else { __send_args_to_backend(pkgid, pkgtype, - PKG_NEED_UPDATE_TO_RW); + PKG_NEED_UPDATE_TO_RW); modified_pkg_cnt++; + if (is_preload_rw_pkg) { + __send_args_to_backend(pkgid, pkgtype, + PKG_NEED_RWUNINSTALL); + __install_preload_rw(pkgid, pkgtype); + } } } total_pkg_cnt++; @@ -846,24 +1001,12 @@ static int __process_ro_fota() gettimeofday(&tv, NULL); starttime = tv.tv_sec * 1000l + tv.tv_usec / 1000l; - /*check pkgmgr-fota dir, if it is not, then exit*/ - ret = __check_pkgmgr_fota_dir(); - retvm_if(ret < 0, -1, "__check_pkgmgr_fota_dir is failed.\n"); - - /*clean pkgid list file*/ - ret = __remove_pkgid_list(); - err_if(ret < 0, "remove[%s] failed\n", FOTA_RESULT_FILE); - - /*get pkgid from orginal pkgmgr db*/ - ret = __get_pkgid_list_from_db_and_xml(); - retvm_if(ret < 0, -1, "__get_pkgid_list_from_db_and_xml is failed.\n"); - - /*find deleted pkgid*/ + /* find deleted pkgid */ ret = __find_deleted_pkgid_from_list(PKGID_LIST_FROM_DB_FILE, PKGID_LIST_FROM_XML_FILE); err_if(ret < 0, "__find_deleted_pkgid_from_list fail.\n"); - /*find updated, inserted pkgid*/ + /* find updated, inserted pkgid */ ret = __find_matched_pkgid_from_list(PKGID_LIST_FROM_XML_FILE, PKGID_LIST_FROM_DB_FILE); err_if(ret < 0, "__find_matched_pkgid_from_list fail.\n"); @@ -880,74 +1023,55 @@ static int __process_ro_fota() return 0; } -static int __process_rw_fota(const char *directory, const char *pkgtype) +static int __process_rw_fota() { - retvm_if(directory == NULL, -1, "directory is null\n"); - + FILE *fp = NULL; + char buf[BUF_SIZE] = {0}; int ret = -1; - char file_path[BUF_SIZE] = {'\0'}; - DIR *dir; - struct dirent *entry = NULL; + char *pkgid = NULL; + char *list_version = NULL; + char *db_stored_version = NULL; + char *pkgtype = NULL; + pkgmgrinfo_pkginfo_h handle = NULL; + int compare = PMINFO_VERSION_SAME; long total_time = 0; - char backend_cmd[BUF_SIZE]; - dir = opendir(directory); - retvm_if(dir == NULL, -1, "Failed to access the [%s]\n", directory); + long starttime; + long endtime; + struct timeval tv; _LOG("=======================================================\n"); - _LOG("RW preload package fota (%s)\n", pkgtype); + _LOG("RW preload package fota\n"); _LOG("=======================================================\n"); - while ((entry = readdir(dir)) != NULL) { - - if (entry->d_name[0] == '.') continue; - - snprintf(file_path, sizeof(file_path), "%s/%s", directory, - entry->d_name); - - _LOG("---------------------------------------------------\n"); - _LOG(" start request : %s\n", file_path); + fp = fopen(PRELOAD_RW_PKG_LIST, "r"); + retvm_if(fp == NULL, -1, "Fail get : %s\n", PRELOAD_RW_PKG_LIST); - int compare = PMINFO_VERSION_SAME; - long starttime; - long endtime; - struct timeval tv; + while (fgets(buf, BUF_SIZE, fp) != NULL) { + __str_trim(buf); gettimeofday(&tv, NULL); starttime = tv.tv_sec * 1000l + tv.tv_usec / 1000l; - char *version = NULL; - pkgmgrinfo_pkginfo_h handle = NULL; - package_manager_pkg_detail_info_t *pkg_info = NULL; - - pkg_info = pkgmgr_client_check_pkginfo_from_file(file_path); - if (pkg_info == NULL) { - _LOG("can not get pkg_info from [%s]\n", file_path); + pkgid = __getvalue(buf, TOKEN_PKGID_STR, 1); + if (pkgid == NULL) continue; - } - ret = pkgmgrinfo_pkginfo_get_pkginfo(pkg_info->pkgid, &handle); + ret = pkgmgrinfo_pkginfo_get_pkginfo(pkgid, &handle); if (ret == PMINFO_R_OK) { - ret = pkgmgrinfo_pkginfo_get_version(handle, &version); - if (ret != PMINFO_R_OK) { - _LOG("can not get pkg version[%s]\n", - pkg_info->pkgid); - pkgmgrinfo_pkginfo_destroy_pkginfo(handle); - pkgmgr_client_free_pkginfo(pkg_info); + list_version = __getvalue(buf, TOKEN_VERSION_STR, 1); + if (list_version == NULL) { + FREE_AND_NULL(pkgid); continue; } - - _LOG("pkgid = %s, db version = %s, " - "new package version = %s\n", - pkg_info->pkgid, version, pkg_info->version); - - ret = pkgmgrinfo_compare_package_version(version, - pkg_info->version, &compare); + ret = pkgmgrinfo_pkginfo_get_version(handle, &db_stored_version); + ret = pkgmgrinfo_compare_package_version(db_stored_version, + list_version, &compare); if (ret != PMINFO_R_OK) { - _LOG("can not compare pkg version[%s]\n", - pkg_info->pkgid); + _LOG("can not compare pkg version[%s]\n", pkgid); pkgmgrinfo_pkginfo_destroy_pkginfo(handle); - pkgmgr_client_free_pkginfo(pkg_info); + FREE_AND_NULL(pkgid); + FREE_AND_NULL(list_version); continue; } @@ -955,7 +1079,6 @@ static int __process_rw_fota(const char *directory, const char *pkgtype) /* package version is not update on FOTA. */ _LOG("pkg is not updated\n"); pkgmgrinfo_pkginfo_destroy_pkginfo(handle); - pkgmgr_client_free_pkginfo(pkg_info); gettimeofday(&tv, NULL); endtime = tv.tv_sec * 1000l + @@ -963,43 +1086,19 @@ static int __process_rw_fota(const char *directory, const char *pkgtype) total_time += (int)(endtime - starttime); _LOG("finish request [time : %d ms]\n", (int)(endtime - starttime)); + FREE_AND_NULL(pkgid); + FREE_AND_NULL(list_version); continue; } _LOG("pkg is updated, need to upgrade\n"); } else { - char flag_path[BUF_SIZE] = { 0, }; - snprintf(flag_path, BUF_SIZE, "%s/%s", - PRELOAD_RW_FLAG_PATH, pkg_info->pkgid); - if (access(flag_path, F_OK) == 0) { - _LOG("pkgid[%s] is installed before and " - "uninstalled by user !! \n", - pkg_info->pkgid); - gettimeofday(&tv, NULL); - endtime = tv.tv_sec * 1000l + - tv.tv_usec / 1000l; - total_time += (int)(endtime - starttime); - _LOG("finish request [time : %d ms]\n", - (int)(endtime - starttime)); - pkgmgr_client_free_pkginfo(pkg_info); - continue; - } - - _LOG("pkgid[%s] is new\n", pkg_info->pkgid); + _LOG("pkgid[%s] is new\n", pkgid); } - const char *install_rw[] = { backend_cmd, "-y", - pkg_info->pkgid, "--preload-rw", NULL }; - snprintf(backend_cmd, sizeof(backend_cmd), - "/usr/bin/%s-backend", pkgtype); - ret = __xsystem(install_rw); - if (ret == 0) - _LOG("success request\n"); - else - _LOG("fail request : %d\n", ret); + pkgtype = __getvalue(buf, TOKEN_TYPE_STR, 1); + __install_preload_rw(pkgid, pkgtype); - if (pkg_info) - pkgmgr_client_free_pkginfo(pkg_info); if (handle) pkgmgrinfo_pkginfo_destroy_pkginfo(handle); @@ -1010,10 +1109,9 @@ static int __process_rw_fota(const char *directory, const char *pkgtype) (int)(endtime - starttime)); } - closedir(dir); - _LOG("=======================================================\n"); - _LOG("End RW process[time : %d ms]\n", (int)total_time); - _LOG("=======================================================\n"); + if (fp != NULL) + fclose(fp); + return 0; } @@ -1021,24 +1119,40 @@ int main(int argc, char *argv[]) { int ret = 0; - if (argc == 2) { - if (strcmp(argv[1], "-rof") == 0) { - ret = __process_ro_fota(); - retvm_if(ret < 0, EXIT_FAILURE, - "__process_ro_fota is failed.\n"); - } else if (strcmp(argv[1], "-rwf") == 0) { - ret = __process_rw_fota(PRELOAD_RW_TPK_PATH, "tpk"); - retvm_if(ret < 0, EXIT_FAILURE, - "PRELOAD_RW_TPK_PATH is failed.\n"); - ret = __process_rw_fota(PRELOAD_RW_WGT_PATH, "wgt"); - retvm_if(ret < 0, EXIT_FAILURE, - "PRELOAD_RW_WGT_PATH is failed.\n"); - } else { - fprintf(stderr, "not supported operand\n"); - } - } else { - fprintf(stderr, "mising operand\n"); + /* check pkgmgr-fota dir, if it is not, then exit */ + ret = __check_pkgmgr_fota_dir(); + retvm_if(ret < 0, -1, "__check_pkgmgr_fota_dir is failed.\n"); + + /* clean pkgid list file */ + ret = __remove_pkgid_list(); + err_if(ret < 0, "remove[%s] failed\n", FOTA_RESULT_FILE); + + /* get pkgid from orginal pkgmgr db */ + ret = __get_pkgid_list_from_db_and_xml(); + retvm_if(ret < 0, -1, "__get_pkgid_list_from_db_and_xml is failed.\n"); + + //__get_pkginfo_from_opt(); + + if (argc == 1) { + ret = __process_ro_fota(); + retvm_if(ret < 0, EXIT_FAILURE, + "__process_ro_fota is failed.\n"); + ret = __process_rw_fota(); + retvm_if(ret < 0, EXIT_FAILURE, + "__process_rw_fota is failed.\n"); + return EXIT_SUCCESS; } + if (strcmp(argv[1], "-rof") == 0) { + ret = __process_ro_fota(); + retvm_if(ret < 0, EXIT_FAILURE, + "__process_ro_fota is failed.\n"); + } else if (strcmp(argv[1], "-rwf") == 0) { + ret = __process_rw_fota(); + retvm_if(ret < 0, EXIT_FAILURE, + "__process_rw_fota is failed.\n"); + } else { + fprintf(stderr, "not supported operand\n"); + } return EXIT_SUCCESS; } diff --git a/src/pkg_upgrade.h b/src/pkg_upgrade.h index e8d0e2f..4f5a93f 100644 --- a/src/pkg_upgrade.h +++ b/src/pkg_upgrade.h @@ -22,7 +22,6 @@ #define TOKEN_TYPE_STR "type=" #define TOKEN_PKGID_STR "package=" #define TOKEN_VERSION_STR "version=" -#define TOKEN_PATH_STR "path=" #define TOKEN_OPERATION_STR "op=" #define TOKEN_REMOVE_STR "removable=" #define TOKEN_UPDATE_STR "update=" @@ -103,7 +102,10 @@ typedef enum { PKG_NEED_ROUPDATE, PKG_NEED_UPDATE_TO_RW, PKG_NEED_RWUNINSTALL, - PKG_NEED_UPDATE_TO_RO + PKG_NEED_UPDATE_TO_RO, + PKG_NEED_RO_DBREMOVE, + PKG_NEED_RO_UNINSTALL_KEEPRWDATA, + PKG_NEED_PRELOADRW_INSTALL } UPGRADE_OPRATION; enum rpm_request_type { -- 2.7.4 From c86fdeb2eacc59ac81991bc00b255ad61ce0ec9d Mon Sep 17 00:00:00 2001 From: ilho Date: Fri, 7 Sep 2018 11:49:48 +0900 Subject: [PATCH 08/16] Refactor __process_request function of pkg_cmd.c change that function's long switch-case statement using function pointer Change-Id: I2bbc26dab024b8827cb706dae14c73f8414a1252 Signed-off-by: ilho --- src/pkg_cmd.c | 1293 ++++++++++++++++++++++++++++++++------------------------- 1 file changed, 725 insertions(+), 568 deletions(-) diff --git a/src/pkg_cmd.c b/src/pkg_cmd.c index 14a4168..667d58b 100644 --- a/src/pkg_cmd.c +++ b/src/pkg_cmd.c @@ -127,6 +127,8 @@ enum pm_tool_request_e { }; typedef enum pm_tool_request_e req_type; +typedef int (*dispatch_func)(uid_t target_uid); + struct pm_tool_args_t { req_type request; char pkg_path[PATH_MAX]; @@ -599,661 +601,816 @@ static int __pkgmgr_list_clear_cb(const pkgmgrinfo_pkginfo_h handle, void *user_ ret = pkgmgr_client_usr_clear_user_data(pc, pkg_type, pkgid, PM_QUIET, uid); if (ret >= 0) - ret = data.result; + ret = data.result; pkgmgr_client_free(pc); return ret; } -static int __process_request(uid_t target_uid) +static void __invalid_arg_handler(void) { - int ret = -1; - pkgmgr_client *pc = NULL; - pkgmgr_client *listen_pc = NULL; - pkgmgrinfo_appinfo_h appinfo_h; - char buf[1024] = {'\0'}; - int pid = -1; - char pkg_old[PATH_MAX] = {0, }; - char pkg_new[PATH_MAX] = {0, }; - -#if !GLIB_CHECK_VERSION(2, 35, 0) - g_type_init(); -#endif - switch (data.request) { - case INSTALL_REQ: - if (data.pkg_path[0] == '\0') { - printf("Please provide the arguments.\n"); - printf("use -h option to see usage\n"); - data.result = PKGMGR_INSTALLER_ERRCODE_INVALID_VALUE; - break; - } - main_loop = g_main_loop_new(NULL, FALSE); - pc = pkgmgr_client_new(PC_REQUEST); - if (pc == NULL) { - printf("PkgMgr Client Creation Failed\n"); - data.result = PKGMGR_INSTALLER_ERRCODE_ERROR; - break; - } + printf("Please provide the arguments.\n"); + printf("use -h option to see usage\n"); + data.result = PKGMGR_INSTALLER_ERRCODE_INVALID_VALUE; +} - if (data.debug_mode) - pkgmgr_client_set_debug_mode(pc, true); +static int __install_req_dispatcher(uid_t target_uid) +{ + int ret; + pkgmgr_client *pc; - if (data.tep_path[0] != '\0') - pkgmgr_client_set_tep_path(pc, data.tep_path, data.tep_move); + if (data.pkg_path[0] == '\0') { + __invalid_arg_handler(); + return -1; + } + main_loop = g_main_loop_new(NULL, FALSE); + pc = pkgmgr_client_new(PC_REQUEST); + if (pc == NULL) { + printf("PkgMgr Client Creation Failed\n"); + data.result = PKGMGR_INSTALLER_ERRCODE_ERROR; + return -1; + } - if (data.des_path[0] == '\0') - ret = pkgmgr_client_usr_install(pc, - data.pkg_type[0] != '\0' ? data.pkg_type : NULL, - NULL, data.pkg_path, NULL, PM_QUIET, - __return_cb, pc, target_uid); - else - ret = pkgmgr_client_usr_install(pc, - data.pkg_type[0] != '\0' ? data.pkg_type : NULL, - data.des_path, data.pkg_path, - NULL, PM_QUIET, __return_cb, pc, target_uid); + if (data.debug_mode) + pkgmgr_client_set_debug_mode(pc, true); - if (ret < 0) { - data.result = PKGMGR_INSTALLER_ERRCODE_ERROR; - if (access(data.pkg_path, F_OK) != 0) - data.result = PKGMGR_INSTALLER_ERRCODE_PACKAGE_NOT_FOUND; - break; - } - g_main_loop_run(main_loop); - ret = data.result; - break; - case CREATE_DELTA: - printf("CREATE_DELTA\n"); - if (data.pkg_old[0] == '\0' || data.pkg_new[0] == '\0') { - printf("tpk pkg missing\n"); - break; - } - if (data.delta_pkg[0] == '\0') { - snprintf(data.resolved_path_delta_pkg, PATH_MAX, "/tmp/delta_pkg"); - printf("output file will be /tmp/delta_pkg.delta\n"); - } - const char *unzip_argv[] = {"sh", "/etc/package-manager/pkgmgr-unzip-pkg.sh", "-a", - data.resolved_path_pkg_old, "-b", data.resolved_path_pkg_new, "-p", - data.resolved_path_delta_pkg, NULL}; - ret = __xsystem(unzip_argv); - if (ret != 0) { - printf("unzip is fail .\n"); - return ret; - } - printf("unzip is success .\n"); - char *ptr_old_pkg = NULL; - ptr_old_pkg = strrchr(data.resolved_path_pkg_old, '/'); - if (!ptr_old_pkg) { - printf("not able to extract package name.\n"); - break; - } - ptr_old_pkg++; - char *ptr_new_pkg = NULL; - ptr_new_pkg = strrchr(data.resolved_path_pkg_new, '/'); - if (!ptr_new_pkg) { - printf("not able to extract package name.\n"); - break; - } - ptr_new_pkg++; - - snprintf(pkg_old, PATH_MAX, "%s%s%s", TEMP_DELTA_REPO, ptr_old_pkg, UNZIPFILE); - snprintf(pkg_new, PATH_MAX, "%s%s%s", TEMP_DELTA_REPO, ptr_new_pkg, UNZIPFILE); - __create_diff_file(pkg_old, pkg_new); - - const char *delta_argv[] = {"sh", "/etc/package-manager/pkgmgr-create-delta.sh", "-a", - data.resolved_path_pkg_old, "-b", data.resolved_path_pkg_new, "-p", - data.resolved_path_delta_pkg, NULL}; - ret = __xsystem(delta_argv); - if (ret != 0) { - printf("create delta script fail .\n"); - return ret; - } - printf("create delta script success .\n"); - break; - case UNINSTALL_REQ: - if (data.pkgid[0] == '\0') { - printf("Please provide the arguments.\n"); - printf("use -h option to see usage\n"); - data.result = PKGMGR_INSTALLER_ERRCODE_INVALID_VALUE; - break; - } - main_loop = g_main_loop_new(NULL, FALSE); - pc = pkgmgr_client_new(PC_REQUEST); - if (pc == NULL) { - printf("PkgMgr Client Creation Failed\n"); - data.result = PKGMGR_INSTALLER_ERRCODE_ERROR; - break; - } + if (data.tep_path[0] != '\0') + pkgmgr_client_set_tep_path(pc, data.tep_path, data.tep_move); - ret = __is_app_installed(data.pkgid, target_uid); - if (ret == -1) { - printf("package is not installed\n"); - break; - } + if (data.des_path[0] == '\0') + ret = pkgmgr_client_usr_install(pc, + data.pkg_type[0] != '\0' ? data.pkg_type : NULL, + NULL, data.pkg_path, NULL, PM_QUIET, + __return_cb, pc, target_uid); + else + ret = pkgmgr_client_usr_install(pc, + data.pkg_type[0] != '\0' ? data.pkg_type : NULL, + data.des_path, data.pkg_path, + NULL, PM_QUIET, __return_cb, pc, target_uid); - ret = pkgmgr_client_usr_uninstall(pc, data.pkg_type, data.pkgid, - PM_QUIET, __return_cb, NULL, target_uid); - if (ret < 0) { - data.result = PKGMGR_INSTALLER_ERRCODE_ERROR; - if (access(data.pkg_path, F_OK) != 0) - data.result = PKGMGR_INSTALLER_ERRCODE_PACKAGE_NOT_FOUND; - break; - } - g_main_loop_run(main_loop); - ret = data.result; - break; + if (ret < 0) { + data.result = PKGMGR_INSTALLER_ERRCODE_ERROR; + if (access(data.pkg_path, F_OK) != 0) + data.result = PKGMGR_INSTALLER_ERRCODE_PACKAGE_NOT_FOUND; + pkgmgr_client_free(pc); + return ret; + } + g_main_loop_run(main_loop); + pkgmgr_client_free(pc); + return data.result; +} - case REINSTALL_REQ: - if (data.pkgid[0] == '\0') { - printf("Please provide the arguments.\n"); - printf("use -h option to see usage\n"); - data.result = PKGMGR_INSTALLER_ERRCODE_INVALID_VALUE; - break; - } - main_loop = g_main_loop_new(NULL, FALSE); - pc = pkgmgr_client_new(PC_REQUEST); - if (pc == NULL) { - printf("PkgMgr Client Creation Failed\n"); - data.result = PKGMGR_INSTALLER_ERRCODE_ERROR; - break; - } +static int __uninstall_req_dispatcher(uid_t target_uid) +{ + int ret; + pkgmgr_client *pc; - if (data.debug_mode) - pkgmgr_client_set_debug_mode(pc, true); + if (data.pkgid[0] == '\0') { + __invalid_arg_handler(); + return -1; + } + main_loop = g_main_loop_new(NULL, FALSE); + pc = pkgmgr_client_new(PC_REQUEST); + if (pc == NULL) { + printf("PkgMgr Client Creation Failed\n"); + data.result = PKGMGR_INSTALLER_ERRCODE_ERROR; + return -1; + } - ret = pkgmgr_client_usr_reinstall(pc, NULL, data.pkgid, NULL, PM_QUIET, __return_cb, pc, target_uid); - if (ret < 0) { - data.result = PKGMGR_INSTALLER_ERRCODE_ERROR; - if (access(data.pkg_path, F_OK) != 0) - data.result = PKGMGR_INSTALLER_ERRCODE_PACKAGE_NOT_FOUND; - break; - } - g_main_loop_run(main_loop); - ret = data.result; - break; - case MOUNT_INSTALL_REQ: - if (data.pkg_path[0] == '\0') { - printf("Please provide the arguments.\n"); - printf("use -h option to see usage\n"); - data.result = PKGMGR_INSTALLER_ERRCODE_INVALID_VALUE; - break; - } - main_loop = g_main_loop_new(NULL, FALSE); - pc = pkgmgr_client_new(PC_REQUEST); - if (pc == NULL) { - printf("PkgMgr Client Creation Failed\n"); - data.result = PKGMGR_INSTALLER_ERRCODE_ERROR; - break; - } + ret = __is_app_installed(data.pkgid, target_uid); + if (ret == -1) { + printf("package is not installed\n"); + pkgmgr_client_free(pc); + return ret; + } - if (data.debug_mode) - pkgmgr_client_set_debug_mode(pc, true); + ret = pkgmgr_client_usr_uninstall(pc, data.pkg_type, data.pkgid, + PM_QUIET, __return_cb, NULL, target_uid); + if (ret < 0) { + data.result = PKGMGR_INSTALLER_ERRCODE_ERROR; + if (access(data.pkg_path, F_OK) != 0) + data.result = PKGMGR_INSTALLER_ERRCODE_PACKAGE_NOT_FOUND; + pkgmgr_client_free(pc); + return ret; + } + g_main_loop_run(main_loop); + pkgmgr_client_free(pc); + return data.result; +} - if (data.tep_path[0] != '\0') - pkgmgr_client_set_tep_path(pc, data.tep_path, data.tep_move); +static int __reinstall_req_dispatcher(uid_t target_uid) +{ + int ret; + pkgmgr_client *pc; - if (data.des_path[0] == '\0') - ret = pkgmgr_client_usr_mount_install(pc, - data.pkg_type[0] != '\0' ? data.pkg_type : NULL, - NULL, data.pkg_path, NULL, PM_QUIET, - __return_cb, pc, target_uid); - else - ret = pkgmgr_client_usr_mount_install(pc, - data.pkg_type[0] != '\0' ? data.pkg_type : NULL, - data.des_path, data.pkg_path, - NULL, PM_QUIET, __return_cb, pc, target_uid); + if (data.pkgid[0] == '\0') { + __invalid_arg_handler(); + return -1; + } + main_loop = g_main_loop_new(NULL, FALSE); + pc = pkgmgr_client_new(PC_REQUEST); + if (pc == NULL) { + printf("PkgMgr Client Creation Failed\n"); + data.result = PKGMGR_INSTALLER_ERRCODE_ERROR; + return -1; + } - if (ret < 0) { - data.result = PKGMGR_INSTALLER_ERRCODE_ERROR; - if (access(data.pkg_path, F_OK) != 0) - data.result = PKGMGR_INSTALLER_ERRCODE_PACKAGE_NOT_FOUND; - break; - } - g_main_loop_run(main_loop); - ret = data.result; - break; - case CLEAR_REQ: - if (data.pkg_type[0] == '\0' || data.pkgid[0] == '\0') { - printf("Please provide the arguments.\n"); - printf("use -h option to see usage\n"); - ret = -1; - break; - } + if (data.debug_mode) + pkgmgr_client_set_debug_mode(pc, true); - pc = pkgmgr_client_new(PC_REQUEST); - if (pc == NULL) { - printf("PkgMgr Client Creation Failed\n"); - ret = -1; - break; - } - ret = __is_app_installed(data.pkgid, target_uid); - if (ret == -1) { - printf("package is not installed\n"); - break; - } - ret = pkgmgr_client_usr_clear_user_data(pc, data.pkg_type, - data.pkgid, PM_QUIET, target_uid); - if (ret < 0) - break; - ret = data.result; - break; + ret = pkgmgr_client_usr_reinstall(pc, NULL, + data.pkgid, NULL, PM_QUIET, __return_cb, pc, target_uid); + if (ret < 0) { + data.result = PKGMGR_INSTALLER_ERRCODE_ERROR; + if (access(data.pkg_path, F_OK) != 0) + data.result = PKGMGR_INSTALLER_ERRCODE_PACKAGE_NOT_FOUND; + pkgmgr_client_free(pc); + return ret; + } + g_main_loop_run(main_loop); + pkgmgr_client_free(pc); + return data.result; +} - case CLEAR_ALL_REQ: - if (data.pkg_type[0] == '\0') { - ret = 0; - ret = pkgmgrinfo_pkginfo_get_usr_list(__pkgmgr_list_clear_cb, NULL, target_uid); - if (ret == -1) - printf("no packages found\n"); - break; - } else { - pkgmgrinfo_pkginfo_filter_h handle; +static int __mount_install_req_dispatcher(uid_t target_uid) +{ + int ret; + pkgmgr_client *pc; - ret = pkgmgrinfo_pkginfo_filter_create(&handle); - if (ret == -1) { - printf("Failed to get package filter handle\n"); - break; - } + if (data.pkg_path[0] == '\0') { + __invalid_arg_handler(); + return -1; + } + main_loop = g_main_loop_new(NULL, FALSE); + pc = pkgmgr_client_new(PC_REQUEST); + if (pc == NULL) { + printf("PkgMgr Client Creation Failed\n"); + data.result = PKGMGR_INSTALLER_ERRCODE_ERROR; + return -1; + } - ret = pkgmgrinfo_pkginfo_filter_add_string(handle, PMINFO_PKGINFO_PROP_PACKAGE_TYPE, data.pkg_type); - if (ret == -1) { - printf("Failed to add package type filter\n"); - pkgmgrinfo_pkginfo_filter_destroy(handle); - break; - } + if (data.debug_mode) + pkgmgr_client_set_debug_mode(pc, true); - ret = pkgmgrinfo_pkginfo_usr_filter_foreach_pkginfo(handle, __pkgmgr_list_clear_cb, NULL, target_uid); - if (ret != PMINFO_R_OK) - printf("no package filter list\n"); + if (data.tep_path[0] != '\0') + pkgmgr_client_set_tep_path(pc, data.tep_path, data.tep_move); - pkgmgrinfo_pkginfo_filter_destroy(handle); - break; - } + if (data.des_path[0] == '\0') + ret = pkgmgr_client_usr_mount_install(pc, + data.pkg_type[0] != '\0' ? data.pkg_type : NULL, + NULL, data.pkg_path, NULL, PM_QUIET, + __return_cb, pc, target_uid); + else + ret = pkgmgr_client_usr_mount_install(pc, + data.pkg_type[0] != '\0' ? data.pkg_type : NULL, + data.des_path, data.pkg_path, + NULL, PM_QUIET, __return_cb, pc, target_uid); - case ACTIVATE_REQ: - if (data.pkg_type[0] == '\0' || data.pkgid[0] == '\0') { - printf("Please provide the arguments.\n"); - printf("use -h option to see usage\n"); - ret = -1; - break; - } + if (ret < 0) { + data.result = PKGMGR_INSTALLER_ERRCODE_ERROR; + if (access(data.pkg_path, F_OK) != 0) + data.result = PKGMGR_INSTALLER_ERRCODE_PACKAGE_NOT_FOUND; + pkgmgr_client_free(pc); + return ret; + } + g_main_loop_run(main_loop); + pkgmgr_client_free(pc); + return data.result; +} - main_loop = g_main_loop_new(NULL, FALSE); - pc = pkgmgr_client_new(PC_REQUEST); - if (pc == NULL) { - printf("PkgMgr Client Creation Failed\n"); - ret = -1; - break; - } +static int __getsize_req_dispatcher(uid_t target_uid) +{ + int ret; + pkgmgr_client *pc; - if (strlen(data.label) != 0) { - printf("requested label = %s\n", data.label); + if (data.pkgid[0] == '\0') { + __invalid_arg_handler(); + return -1; + } - ret = pkgmgr_client_usr_set_app_label(pc, data.pkgid, - data.label, target_uid); - if (ret < 0) { - printf("set_app_label is failed\n"); - break; - } + pc = pkgmgr_client_new(PC_REQUEST); + if (pc == NULL) { + printf("PkgMgr Client Creation Failed\n"); + data.result = PKGMGR_INSTALLER_ERRCODE_ERROR; + return -1; + } - printf("set_app_label is done\n"); - } + if (data.type == 9) { + ret = pkgmgrinfo_pkginfo_get_usr_list(__pkg_list_cb, + (void *)(pc), target_uid); + pkgmgr_client_free(pc); + return ret; + } + ret = pkgmgr_client_usr_request_service(PM_REQUEST_GET_SIZE, data.type, + pc, NULL, data.pkgid, target_uid, NULL, NULL, NULL); + if (ret < 0) { + data.result = PKGMGR_INSTALLER_ERRCODE_ERROR; + pkgmgr_client_free(pc); + return ret; + } - if (strcmp(data.pkg_type, "app") == 0) { - if (data.global && data.uid != -1) { - if (data.uid != __get_current_user_id()) { - printf("Invalid uid : %d\n", data.uid); - ret = -1; - break; - } else { - target_uid = data.uid; - } - } - ret = pkgmgrinfo_appinfo_get_usr_disabled_appinfo(data.pkgid, - target_uid, &appinfo_h); - if (ret != PMINFO_R_OK) { - printf("Failed to get appinfo[%s]\n", data.pkgid); - ret = -1; - break; - } + printf("pkg[%s] size = %d\n", data.pkgid, ret); + pkgmgr_client_free(pc); + return data.result; +} - if (data.global) { - if (data.uid != -1) - /* enable global app for this user only */ - ret = pkgmgr_client_activate_global_app_for_uid(pc, - data.pkgid, __app_return_cb, NULL, - __get_current_user_id()); - else - /* enable global app for all user */ - ret = pkgmgr_client_usr_activate_app(pc, data.pkgid, - __app_return_cb, NULL, GLOBAL_USER); - } else { - /* enable local app */ - ret = pkgmgr_client_usr_activate_app(pc, data.pkgid, - __app_return_cb, NULL, target_uid); - } +static int __clear_req_dispatcher(uid_t target_uid) +{ + int ret; + pkgmgr_client *pc; - pkgmgrinfo_appinfo_destroy_appinfo(appinfo_h); - } else { - listen_pc = pkgmgr_client_new(PC_LISTENING); - if (listen_pc == NULL) { - printf("PkgMgr Client Creation Failed\n"); - ret = -1; - break; - } - ret = pkgmgr_client_listen_status(listen_pc, __return_cb, NULL); - if (ret < 0) { - printf("Failed to set callback[%d]\n", ret); - break; - } - ret = pkgmgr_client_usr_activate(pc, data.pkg_type, data.pkgid, - target_uid); - } - if (ret < 0) - break; + if (data.pkg_type[0] == '\0' || data.pkgid[0] == '\0') { + __invalid_arg_handler(); + return -1; + } - g_main_loop_run(main_loop); - ret = data.result; - break; + pc = pkgmgr_client_new(PC_REQUEST); + if (pc == NULL) { + printf("PkgMgr Client Creation Failed\n"); + return -1; + } + ret = __is_app_installed(data.pkgid, target_uid); + if (ret == -1) { + printf("package is not installed\n"); + pkgmgr_client_free(pc); + return ret; + } + ret = pkgmgr_client_usr_clear_user_data(pc, data.pkg_type, + data.pkgid, PM_QUIET, target_uid); + if (ret < 0) { + pkgmgr_client_free(pc); + return ret; + } + pkgmgr_client_free(pc); + return data.result; +} - case DEACTIVATE_REQ: - if (data.pkg_type[0] == '\0' || data.pkgid[0] == '\0') { - printf("Please provide the arguments.\n"); - printf("use -h option to see usage\n"); - ret = -1; - break; - } +static int __clear_all_req_dispatcher(uid_t target_uid) +{ + int ret; - main_loop = g_main_loop_new(NULL, FALSE); - pc = pkgmgr_client_new(PC_REQUEST); - if (pc == NULL) { - printf("PkgMgr Client Creation Failed\n"); - ret = -1; - break; - } + if (data.pkg_type[0] == '\0') { + ret = pkgmgrinfo_pkginfo_get_usr_list(__pkgmgr_list_clear_cb, + NULL, target_uid); + if (ret == -1) + printf("no packages found\n"); + return ret; + } + pkgmgrinfo_pkginfo_filter_h handle; - if (strcmp(data.pkg_type, "app") == 0) { - ret = pkgmgrinfo_appinfo_get_usr_appinfo(data.pkgid, - target_uid, &appinfo_h); - if (ret != PMINFO_R_OK) { - printf("Failed to get appinfo[%s]\n", data.pkgid); - ret = -1; - break; - } + ret = pkgmgrinfo_pkginfo_filter_create(&handle); + if (ret == -1) { + printf("Failed to get package filter handle\n"); + return ret; + } - if (data.global) { - if (data.uid != -1 && data.uid != getuid()) { - printf("Invalid uid : %d\n", data.uid); - pkgmgrinfo_appinfo_destroy_appinfo(appinfo_h); - ret = -1; - break; - } - if (data.uid != -1) - /* disable global app for this user only */ - ret = pkgmgr_client_deactivate_global_app_for_uid(pc, - data.pkgid, __app_return_cb, NULL, - __get_current_user_id()); - else - /* disable global app for all user */ - ret = pkgmgr_client_usr_deactivate_app(pc, data.pkgid, - __app_return_cb, NULL, GLOBAL_USER); - } else { - /* disable local app */ - ret = pkgmgr_client_usr_deactivate_app(pc, data.pkgid, - __app_return_cb, NULL, target_uid); - } + ret = pkgmgrinfo_pkginfo_filter_add_string(handle, + PMINFO_PKGINFO_PROP_PACKAGE_TYPE, data.pkg_type); + if (ret == -1) { + printf("Failed to add package type filter\n"); + pkgmgrinfo_pkginfo_filter_destroy(handle); + return ret; + } - pkgmgrinfo_appinfo_destroy_appinfo(appinfo_h); - } else { - listen_pc = pkgmgr_client_new(PC_LISTENING); - if (listen_pc == NULL) { - printf("PkgMgr Client Creation Failed\n"); - ret = -1; - break; - } - ret = pkgmgr_client_listen_status(listen_pc, __return_cb, NULL); - if (ret < 0) { - printf("Failed to set callback[%d]\n", ret); - break; - } - ret = pkgmgr_client_usr_deactivate(pc, data.pkg_type, data.pkgid, - target_uid); - } - if (ret < 0) - break; + ret = pkgmgrinfo_pkginfo_usr_filter_foreach_pkginfo(handle, + __pkgmgr_list_clear_cb, NULL, target_uid); + if (ret != PMINFO_R_OK) + printf("no package filter list\n"); - g_main_loop_run(main_loop); - ret = data.result; - break; + pkgmgrinfo_pkginfo_filter_destroy(handle); + return ret; +} - case MOVE_REQ: - if (data.pkg_type[0] == '\0' || data.pkgid[0] == '\0') { - printf("Please provide the arguments.\n"); - printf("use -h option to see usage\n"); - ret = -1; - break; - } - if (data.type < 0 || data.type > 2) { - printf("Invalid move type...See usage\n"); - ret = -1; - break; - } +static int __move_req_dispatcher(uid_t target_uid) +{ + int ret; + pkgmgr_client *pc; - main_loop = g_main_loop_new(NULL, FALSE); - pc = pkgmgr_client_new(PC_REQUEST); - if (pc == NULL) { - printf("PkgMgr Client Creation Failed\n"); - ret = -1; - break; - } - ret = __is_app_installed(data.pkgid, target_uid); - if (ret == -1) { - printf("package is not installed\n"); - break; - } - ret = pkgmgr_client_usr_request_service(PM_REQUEST_MOVE, data.type, pc, - data.pkg_type, data.pkgid, target_uid, NULL, __return_cb, NULL); + if (data.pkg_type[0] == '\0' || data.pkgid[0] == '\0') { + __invalid_arg_handler(); + return -1; + } + if (data.type < 0 || data.type > 2) { + printf("Invalid move type...See usage\n"); + return -1; + } - if (ret < 0) - break; + main_loop = g_main_loop_new(NULL, FALSE); + pc = pkgmgr_client_new(PC_REQUEST); + if (pc == NULL) { + printf("PkgMgr Client Creation Failed\n"); + return -1; + } + ret = __is_app_installed(data.pkgid, target_uid); + if (ret == -1) { + printf("package is not installed\n"); + pkgmgr_client_free(pc); + return ret; + } + ret = pkgmgr_client_usr_request_service(PM_REQUEST_MOVE, data.type, pc, + data.pkg_type, data.pkgid, target_uid, NULL, __return_cb, NULL); - g_main_loop_run(main_loop); - ret = data.result; - break; + if (ret < 0) { + pkgmgr_client_free(pc); + return ret; + } - case APPPATH_REQ: - if (data.pkg_type[0] == '\0' && data.pkgid[0] == '\0') { - printf("Tizen Application Installation Path: %s\n", APP_INSTALLATION_PATH_RW); - ret = 0; - break; + g_main_loop_run(main_loop); + pkgmgr_client_free(pc); + return data.result; +} + +static int __activate_req_dispatcher(uid_t target_uid) +{ + int ret; + pkgmgrinfo_appinfo_h appinfo_h; + pkgmgr_client *pc; + pkgmgr_client *listen_pc = NULL; + + if (data.pkg_type[0] == '\0' || data.pkgid[0] == '\0') { + __invalid_arg_handler(); + return -1; + } + + main_loop = g_main_loop_new(NULL, FALSE); + pc = pkgmgr_client_new(PC_REQUEST); + if (pc == NULL) { + printf("PkgMgr Client Creation Failed\n"); + return -1; + } + + if (strlen(data.label) != 0) { + printf("requested label = %s\n", data.label); + + ret = pkgmgr_client_usr_set_app_label(pc, data.pkgid, + data.label, target_uid); + if (ret < 0) { + printf("set_app_label is failed\n"); + pkgmgr_client_free(pc); + return ret; } - if ((data.pkg_type[0] == '\0') || (data.pkgid[0] == '\0')) { - printf("Use -h option to see usage\n"); - ret = -1; - break; + + printf("set_app_label is done\n"); + } + + if (strcmp(data.pkg_type, "app") == 0) { + if (data.global && data.uid != -1) { + if (data.uid != __get_current_user_id()) { + printf("Invalid uid : %d\n", data.uid); + pkgmgr_client_free(pc); + return -1; + } + target_uid = data.uid; } - if (strncmp(data.pkg_type, "wgt", PKG_TYPE_STRING_LEN_MAX - 1) == 0) { - snprintf(buf, 1023, "%s/%s/res/wgt", APP_INSTALLATION_PATH_RW, data.pkgid); - printf("Tizen Application Installation Path: %s\n", buf); - ret = 0; - break; - } else if (strncmp(data.pkg_type, "tpk", PKG_TYPE_STRING_LEN_MAX - 1) == 0) { - snprintf(buf, 1023, "%s/%s", APP_INSTALLATION_PATH_RW, data.pkgid); - printf("Tizen Application Installation Path: %s\n", buf); - ret = 0; - break; - } else { - printf("Invalid package type.\n"); - printf("use -h option to see usage\n"); - ret = -1; - break; + ret = pkgmgrinfo_appinfo_get_usr_disabled_appinfo(data.pkgid, + target_uid, &appinfo_h); + if (ret != PMINFO_R_OK) { + printf("Failed to get appinfo[%s]\n", data.pkgid); + pkgmgr_client_free(pc); + return -1; } - break; - case KILLAPP_REQ: - case CHECKAPP_REQ: - if (data.pkgid[0] == '\0') { - printf("Please provide the arguments.\n"); - printf("use -h option to see usage\n"); - data.result = PKGMGR_INSTALLER_ERRCODE_INVALID_VALUE; - break; + if (data.global) { + if (data.uid != -1) + /* enable global app for this user only */ + ret = pkgmgr_client_activate_global_app_for_uid(pc, + data.pkgid, __app_return_cb, NULL, + __get_current_user_id()); + else + /* enable global app for all user */ + ret = pkgmgr_client_usr_activate_app(pc, data.pkgid, + __app_return_cb, NULL, GLOBAL_USER); + } else { + /* enable local app */ + ret = pkgmgr_client_usr_activate_app(pc, data.pkgid, + __app_return_cb, NULL, target_uid); } - - pc = pkgmgr_client_new(PC_REQUEST); - if (pc == NULL) { + pkgmgrinfo_appinfo_destroy_appinfo(appinfo_h); + } else { + listen_pc = pkgmgr_client_new(PC_LISTENING); + if (listen_pc == NULL) { printf("PkgMgr Client Creation Failed\n"); - data.result = PKGMGR_INSTALLER_ERRCODE_ERROR; - break; + pkgmgr_client_free(pc); + return -1; + } + ret = pkgmgr_client_listen_status(listen_pc, __return_cb, NULL); + if (ret < 0) { + printf("Failed to set callback[%d]\n", ret); + pkgmgr_client_free(pc); + pkgmgr_client_free(listen_pc); + return ret; + } + ret = pkgmgr_client_usr_activate(pc, data.pkg_type, data.pkgid, + target_uid); + } + if (ret < 0) { + pkgmgr_client_free(pc); + if (listen_pc) + pkgmgr_client_free(listen_pc); + return ret; + } + + g_main_loop_run(main_loop); + + pkgmgr_client_free(pc); + if (listen_pc) + pkgmgr_client_free(listen_pc); + return data.result; +} + +static int __deactivate_req_dispatcher(uid_t target_uid) +{ + int ret; + pkgmgrinfo_appinfo_h appinfo_h; + pkgmgr_client *pc; + pkgmgr_client *listen_pc = NULL; + + if (data.pkg_type[0] == '\0' || data.pkgid[0] == '\0') { + __invalid_arg_handler(); + return -1; + } + + main_loop = g_main_loop_new(NULL, FALSE); + pc = pkgmgr_client_new(PC_REQUEST); + if (pc == NULL) { + printf("PkgMgr Client Creation Failed\n"); + return -1; + } + + if (strcmp(data.pkg_type, "app") == 0) { + ret = pkgmgrinfo_appinfo_get_usr_appinfo(data.pkgid, + target_uid, &appinfo_h); + if (ret != PMINFO_R_OK) { + printf("Failed to get appinfo[%s]\n", data.pkgid); + pkgmgr_client_free(pc); + return -1; } - if (data.request == KILLAPP_REQ) { - ret = pkgmgr_client_usr_request_service(PM_REQUEST_KILL_APP, 0, pc, - NULL, data.pkgid, target_uid, NULL, NULL, &pid); - if (ret < 0) { - data.result = PKGMGR_INSTALLER_ERRCODE_ERROR; - break; + if (data.global) { + if (data.uid != -1 && data.uid != getuid()) { + printf("Invalid uid : %d\n", data.uid); + pkgmgrinfo_appinfo_destroy_appinfo(appinfo_h); + pkgmgr_client_free(pc); + return -1; } - if (pid) - printf("Pkgid: %s is Terminated\n", data.pkgid); + if (data.uid != -1) + /* disable global app for this user only */ + ret = pkgmgr_client_deactivate_global_app_for_uid(pc, + data.pkgid, __app_return_cb, NULL, + __get_current_user_id()); else - printf("Pkgid: %s is already Terminated\n", data.pkgid); - - } else if (data.request == CHECKAPP_REQ) { - ret = pkgmgr_client_usr_request_service(PM_REQUEST_CHECK_APP, 0, pc, - NULL, data.pkgid, target_uid, NULL, NULL, &pid); - if (ret < 0) { - data.result = PKGMGR_INSTALLER_ERRCODE_ERROR; - break; - } + /* disable global app for all user */ + ret = pkgmgr_client_usr_deactivate_app(pc, data.pkgid, + __app_return_cb, NULL, GLOBAL_USER); + } else { + /* disable local app */ + ret = pkgmgr_client_usr_deactivate_app(pc, data.pkgid, + __app_return_cb, NULL, target_uid); + } - if (pid) - printf("Pkgid: %s is Running\n", data.pkgid); - else - printf("Pkgid: %s is Not Running\n", data.pkgid); + pkgmgrinfo_appinfo_destroy_appinfo(appinfo_h); + } else { + listen_pc = pkgmgr_client_new(PC_LISTENING); + if (listen_pc == NULL) { + printf("PkgMgr Client Creation Failed\n"); + pkgmgr_client_free(pc); + return -1; } - ret = data.result; - break; + ret = pkgmgr_client_listen_status(listen_pc, __return_cb, NULL); + if (ret < 0) { + printf("Failed to set callback[%d]\n", ret); + pkgmgr_client_free(pc); + pkgmgr_client_free(listen_pc); + return ret; + } + ret = pkgmgr_client_usr_deactivate(pc, data.pkg_type, data.pkgid, + target_uid); + } + if (ret < 0) { + pkgmgr_client_free(pc); + if (listen_pc) + pkgmgr_client_free(listen_pc); + return ret; + } - case LIST_REQ: - if (data.pkg_type[0] == '\0') { - ret = 0; - ret = pkgmgrinfo_pkginfo_get_usr_list(__pkgmgr_list_cb, NULL, target_uid); - if (ret == -1) - printf("no packages found\n"); - break; - } else { - pkgmgrinfo_pkginfo_filter_h handle; + g_main_loop_run(main_loop); - ret = pkgmgrinfo_pkginfo_filter_create(&handle); - if (ret == -1) { - printf("Failed to get package filter handle\n"); - break; - } + pkgmgr_client_free(pc); + if (listen_pc) + pkgmgr_client_free(listen_pc); + return data.result; +} - ret = pkgmgrinfo_pkginfo_filter_add_string(handle, PMINFO_PKGINFO_PROP_PACKAGE_TYPE, data.pkg_type); - if (ret == -1) { - printf("Failed to add package type filter\n"); - pkgmgrinfo_pkginfo_filter_destroy(handle); - break; - } +static int __apppath_req_dispatcher(uid_t target_uid) +{ + char buf[1024]; - ret = pkgmgrinfo_pkginfo_usr_filter_foreach_pkginfo(handle, __pkgmgr_list_cb, NULL, target_uid); - if (ret != PMINFO_R_OK) - printf("no package filter list\n"); + if (data.pkg_type[0] == '\0' && data.pkgid[0] == '\0') { + printf("Tizen Application Installation Path: %s\n", + APP_INSTALLATION_PATH_RW); + return 0; + } + if ((data.pkg_type[0] == '\0') || (data.pkgid[0] == '\0')) { + printf("Use -h option to see usage\n"); + return -1; + } + if (strncmp(data.pkg_type, "wgt", PKG_TYPE_STRING_LEN_MAX - 1) == 0) { + snprintf(buf, 1023, "%s/%s/res/wgt", + APP_INSTALLATION_PATH_RW, data.pkgid); + printf("Tizen Application Installation Path: %s\n", buf); + return 0; + } else if (strncmp(data.pkg_type, "tpk", PKG_TYPE_STRING_LEN_MAX - 1) == 0) { + snprintf(buf, 1023, "%s/%s", APP_INSTALLATION_PATH_RW, data.pkgid); + printf("Tizen Application Installation Path: %s\n", buf); + return 0; + } else { + printf("Invalid package type.\n"); + printf("use -h option to see usage\n"); + return -1; + } +} - pkgmgrinfo_pkginfo_filter_destroy(handle); - break; - } +static int __checkapp_req_dispatcher(uid_t target_uid) +{ + int ret; + int pid = -1; + pkgmgr_client *pc; - case SHOW_REQ: - /* unsupported */ - ret = -1; - break; + if (data.pkgid[0] == '\0') { + __invalid_arg_handler(); + return -1; + } - case GETSIZE_REQ: - if (data.pkgid[0] == '\0') { - printf("Please provide the arguments.\n"); - printf("use -h option to see usage\n"); - ret = -1; - break; - } + pc = pkgmgr_client_new(PC_REQUEST); + if (pc == NULL) { + printf("PkgMgr Client Creation Failed\n"); + data.result = PKGMGR_INSTALLER_ERRCODE_ERROR; + return -1; + } - pc = pkgmgr_client_new(PC_REQUEST); - if (pc == NULL) { - printf("PkgMgr Client Creation Failed\n"); + if (data.request == KILLAPP_REQ) { + ret = pkgmgr_client_usr_request_service(PM_REQUEST_KILL_APP, 0, pc, + NULL, data.pkgid, target_uid, NULL, NULL, &pid); + if (ret < 0) { data.result = PKGMGR_INSTALLER_ERRCODE_ERROR; - break; - } - - if (data.type == 9) { - ret = pkgmgrinfo_pkginfo_get_usr_list(__pkg_list_cb, (void *)pc, target_uid); - break; + pkgmgr_client_free(pc); + return ret; } - ret = pkgmgr_client_usr_request_service(PM_REQUEST_GET_SIZE, data.type, - pc, NULL, data.pkgid, target_uid, NULL, NULL, NULL); + if (pid) + printf("Pkgid: %s is Terminated\n", data.pkgid); + else + printf("Pkgid: %s is already Terminated\n", data.pkgid); + } else if (data.request == CHECKAPP_REQ) { + ret = pkgmgr_client_usr_request_service(PM_REQUEST_CHECK_APP, 0, pc, + NULL, data.pkgid, target_uid, NULL, NULL, &pid); if (ret < 0) { data.result = PKGMGR_INSTALLER_ERRCODE_ERROR; - break; + pkgmgr_client_free(pc); + return ret; } - printf("pkg[%s] size = %d\n", data.pkgid, ret); - ret = data.result; - break; + if (pid) + printf("Pkgid: %s is Running\n", data.pkgid); + else + printf("Pkgid: %s is Not Running\n", data.pkgid); + } + pkgmgr_client_free(pc); + return data.result; +} - case GET_PKG_SIZE_INFO_REQ: - if (data.pkgid[0] == '\0') { - printf("Please provide the arguments.\n"); - printf("use -h option to see usage\n"); - ret = -1; - break; - } +static int __killapp_req_dispatcher(uid_t target_uid) +{ + int ret; + int pid = -1; + pkgmgr_client *pc; - main_loop = g_main_loop_new(NULL, FALSE); - pc = pkgmgr_client_new(PC_REQUEST); - if (pc == NULL) { - printf("PkgMgr Client Creation Failed\n"); - data.result = PKGMGR_INSTALLER_ERR_FATAL_ERROR; - break; - } + if (data.pkgid[0] == '\0') { + __invalid_arg_handler(); + return -1; + } - if (strcmp(data.pkgid, PKG_SIZE_INFO_TOTAL) == 0) - ret = pkgmgr_client_usr_get_total_package_size_info(pc, - __total_pkg_size_info_recv_cb, NULL, - target_uid); - else - ret = pkgmgr_client_usr_get_package_size_info(pc, - data.pkgid, __pkg_size_info_recv_cb, NULL, - target_uid); + pc = pkgmgr_client_new(PC_REQUEST); + if (pc == NULL) { + printf("PkgMgr Client Creation Failed\n"); + data.result = PKGMGR_INSTALLER_ERRCODE_ERROR; + return -1; + } + if (data.request == KILLAPP_REQ) { + ret = pkgmgr_client_usr_request_service(PM_REQUEST_KILL_APP, 0, pc, + NULL, data.pkgid, target_uid, NULL, NULL, &pid); if (ret < 0) { - data.result = PKGMGR_INSTALLER_ERR_FATAL_ERROR; - break; + data.result = PKGMGR_INSTALLER_ERRCODE_ERROR; + pkgmgr_client_free(pc); + return ret; + } + if (pid) + printf("Pkgid: %s is Terminated\n", data.pkgid); + else + printf("Pkgid: %s is already Terminated\n", data.pkgid); + } else if (data.request == CHECKAPP_REQ) { + ret = pkgmgr_client_usr_request_service(PM_REQUEST_CHECK_APP, 0, pc, + NULL, data.pkgid, target_uid, NULL, NULL, &pid); + if (ret < 0) { + data.result = PKGMGR_INSTALLER_ERRCODE_ERROR; + pkgmgr_client_free(pc); + return ret; } - printf("pkg[%s] ret: %d\n", data.pkgid, ret); - ret = data.result; + if (pid) + printf("Pkgid: %s is Running\n", data.pkgid); + else + printf("Pkgid: %s is Not Running\n", data.pkgid); + } + pkgmgr_client_free(pc); + return data.result; +} - g_main_loop_run(main_loop); - break; +static int __list_req_dispatcher(uid_t target_uid) +{ + int ret; - case HELP_REQ: - __print_usage(); - ret = 0; - break; + if (data.pkg_type[0] == '\0') { + ret = pkgmgrinfo_pkginfo_get_usr_list(__pkgmgr_list_cb, + NULL, target_uid); + if (ret == -1) + printf("no packages found\n"); + return ret; + } + pkgmgrinfo_pkginfo_filter_h handle; - default: - printf("Wrong Request\n"); - ret = -1; - break; + ret = pkgmgrinfo_pkginfo_filter_create(&handle); + if (ret == -1) { + printf("Failed to get package filter handle\n"); + return ret; + } + + ret = pkgmgrinfo_pkginfo_filter_add_string(handle, + PMINFO_PKGINFO_PROP_PACKAGE_TYPE, data.pkg_type); + if (ret == -1) { + printf("Failed to add package type filter\n"); + pkgmgrinfo_pkginfo_filter_destroy(handle); + return ret; + } + + ret = pkgmgrinfo_pkginfo_usr_filter_foreach_pkginfo(handle, + __pkgmgr_list_cb, NULL, target_uid); + if (ret != PMINFO_R_OK) + printf("no package filter list\n"); + + pkgmgrinfo_pkginfo_filter_destroy(handle); + return ret; +} + +/* unsupported */ +static int __show_req_dispatcher(uid_t target_uid) +{ + return -1; +} + +static int __help_req_dispatcher(uid_t target_uid) +{ + __print_usage(); + return 0; +} + +static int __create_delta_dispatcher(uid_t target_uid) +{ + int ret; + char pkg_old[PATH_MAX]; + char pkg_new[PATH_MAX]; + + printf("CREATE_DELTA\n"); + if (data.pkg_old[0] == '\0' || data.pkg_new[0] == '\0') { + printf("tpk pkg missing\n"); + return -1; + } + if (data.delta_pkg[0] == '\0') { + snprintf(data.resolved_path_delta_pkg, PATH_MAX, "/tmp/delta_pkg"); + printf("output file will be /tmp/delta_pkg.delta\n"); + } + const char *unzip_argv[] = {"sh", + "/etc/package-manager/pkgmgr-unzip-pkg.sh", "-a", + data.resolved_path_pkg_old, "-b", data.resolved_path_pkg_new, "-p", + data.resolved_path_delta_pkg, NULL}; + ret = __xsystem(unzip_argv); + if (ret != 0) { + printf("unzip is fail .\n"); + return ret; + } + printf("unzip is success .\n"); + char *ptr_old_pkg = NULL; + ptr_old_pkg = strrchr(data.resolved_path_pkg_old, '/'); + + if (!ptr_old_pkg) { + printf("not able to extract package name.\n"); + return ret; + } + ptr_old_pkg++; + char *ptr_new_pkg = NULL; + ptr_new_pkg = strrchr(data.resolved_path_pkg_new, '/'); + + if (!ptr_new_pkg) { + printf("not able to extract package name.\n"); + return ret; + } + ptr_new_pkg++; + + snprintf(pkg_old, PATH_MAX, "%s%s%s", TEMP_DELTA_REPO, + ptr_old_pkg, UNZIPFILE); + snprintf(pkg_new, PATH_MAX, "%s%s%s", TEMP_DELTA_REPO, + ptr_new_pkg, UNZIPFILE); + __create_diff_file(pkg_old, pkg_new); + + const char *delta_argv[] = {"sh", + "/etc/package-manager/pkgmgr-create-delta.sh", "-a", + data.resolved_path_pkg_old, "-b", data.resolved_path_pkg_new, "-p", + data.resolved_path_delta_pkg, NULL}; + ret = __xsystem(delta_argv); + if (ret != 0) { + printf("create delta script fail .\n"); + return ret; } + printf("create delta script success .\n"); + return ret; +} + +static int __get_pkg_size_info_req_dispatcher(uid_t target_uid) +{ + int ret; + pkgmgr_client *pc; - if (pc) { + if (data.pkgid[0] == '\0') { + __invalid_arg_handler(); + return -1; + } + + main_loop = g_main_loop_new(NULL, FALSE); + pc = pkgmgr_client_new(PC_REQUEST); + if (pc == NULL) { + printf("PkgMgr Client Creation Failed\n"); + data.result = PKGMGR_INSTALLER_ERR_FATAL_ERROR; + return -1; + } + + if (strcmp(data.pkgid, PKG_SIZE_INFO_TOTAL) == 0) + ret = pkgmgr_client_usr_get_total_package_size_info(pc, + __total_pkg_size_info_recv_cb, NULL, + target_uid); + else + ret = pkgmgr_client_usr_get_package_size_info(pc, + data.pkgid, __pkg_size_info_recv_cb, NULL, + target_uid); + + if (ret < 0) { + data.result = PKGMGR_INSTALLER_ERR_FATAL_ERROR; pkgmgr_client_free(pc); - pc = NULL; + return ret; } - if (listen_pc) { - pkgmgr_client_free(listen_pc); - listen_pc = NULL; + printf("pkg[%s] ret: %d\n", data.pkgid, ret); + + g_main_loop_run(main_loop); + pkgmgr_client_free(pc); + return data.result; +} + +static dispatch_func __process_request_func_ptr[] = { + [INSTALL_REQ] = __install_req_dispatcher, + [UNINSTALL_REQ] = __uninstall_req_dispatcher, + [REINSTALL_REQ] = __reinstall_req_dispatcher, + [MOUNT_INSTALL_REQ] = __mount_install_req_dispatcher, + [GETSIZE_REQ] = __getsize_req_dispatcher, + [CLEAR_REQ] = __clear_req_dispatcher, + [CLEAR_ALL_REQ] = __clear_all_req_dispatcher, + [MOVE_REQ] = __move_req_dispatcher, + [ACTIVATE_REQ] = __activate_req_dispatcher, + [DEACTIVATE_REQ] = __deactivate_req_dispatcher, + [APPPATH_REQ] = __apppath_req_dispatcher, + [CHECKAPP_REQ] = __checkapp_req_dispatcher, + [KILLAPP_REQ] = __killapp_req_dispatcher, + [LIST_REQ] = __list_req_dispatcher, + [SHOW_REQ] = __show_req_dispatcher, + [HELP_REQ] = __help_req_dispatcher, + [CREATE_DELTA] = __create_delta_dispatcher, + [GET_PKG_SIZE_INFO_REQ] = __get_pkg_size_info_req_dispatcher, +}; + +static int __process_request(uid_t target_uid) +{ + int ret; + +#if !GLIB_CHECK_VERSION(2, 35, 0) + g_type_init(); +#endif + size_t req_size = + sizeof(__process_request_func_ptr) / sizeof(dispatch_func); + + if (data.request >= req_size || data.request == 0) { + printf("Wrong Request\n"); + return -1; } + ret = __process_request_func_ptr[data.request](target_uid); return ret; } -- 2.7.4 From a5f65e12601bdcf4f08e8a7d6909d660a253c218 Mon Sep 17 00:00:00 2001 From: Sangyoon Jang Date: Tue, 15 Jan 2019 15:32:33 +0900 Subject: [PATCH 09/16] Fix upgrade script Execute pkgmgr db migration script directly, because exec system call overwrites process. Change-Id: Id1aa8a490c1936dc1115b2cc987f53b255eed77f Signed-off-by: Sangyoon Jang --- data/700.pkgmgr.patch.sh.in | 4 ++-- data/updates/upgrade_to_30001.sh.in | 2 -- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/data/700.pkgmgr.patch.sh.in b/data/700.pkgmgr.patch.sh.in index cfdfa0f..0db3edb 100644 --- a/data/700.pkgmgr.patch.sh.in +++ b/data/700.pkgmgr.patch.sh.in @@ -2,6 +2,6 @@ source /etc/tizen-platform.conf -exec "/etc/package-manager/updates/update.sh" +/etc/package-manager/updates/update.sh -/usr/bin/pkg_upgrade -rof \ No newline at end of file +/usr/bin/pkg_upgrade -rof diff --git a/data/updates/upgrade_to_30001.sh.in b/data/updates/upgrade_to_30001.sh.in index d1e1091..867acb0 100644 --- a/data/updates/upgrade_to_30001.sh.in +++ b/data/updates/upgrade_to_30001.sh.in @@ -97,5 +97,3 @@ migrate_parser_db $PARSER_DB_PATH migrate_user_db migrate_cert_db migrate_globalapp_ownership - -pkg_upgrade -rof -- 2.7.4 From 23b945bb43eaca81c9606e73aa0581e9c8698f1a Mon Sep 17 00:00:00 2001 From: Sangyoon Jang Date: Thu, 17 Jan 2019 19:30:48 +0900 Subject: [PATCH 10/16] Fix to avoiding sql injection Change-Id: I8810ab87632294431fa7c162b380700682ec8838 Signed-off-by: Sangyoon Jang --- CMakeLists.txt | 2 +- packaging/pkgmgr-tool.spec | 2 +- src/pkg_upgrade.c | 20 +++++++++++--------- 3 files changed, 13 insertions(+), 11 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index dc9b6fc..ac4eb77 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -22,7 +22,7 @@ INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/client/include) INCLUDE(FindPkgConfig) pkg_check_modules(pkgs_test REQUIRED dlog glib-2.0 bundle pkgmgr pkgmgr-parser pkgmgr-info pkgmgr-installer iniparser -libtzplatform-config aul storage) +libtzplatform-config aul storage sqlite3) FOREACH(flag ${pkgs_test_CFLAGS}) SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}") ENDFOREACH(flag) diff --git a/packaging/pkgmgr-tool.spec b/packaging/pkgmgr-tool.spec index 03ddf53..3949836 100644 --- a/packaging/pkgmgr-tool.spec +++ b/packaging/pkgmgr-tool.spec @@ -24,10 +24,10 @@ BuildRequires: pkgconfig(pkgmgr) BuildRequires: pkgconfig(pkgmgr-installer) BuildRequires: pkgconfig(aul) BuildRequires: pkgconfig(storage) +BuildRequires: pkgconfig(sqlite3) BuildRequires: pkgmgr-info-parser-devel BuildRequires: pkgmgr-info-parser BuildRequires: fdupes -Requires: sqlite3 Requires(posttrans): /usr/bin/pkg_initdb %description diff --git a/src/pkg_upgrade.c b/src/pkg_upgrade.c index 1a8be29..566231b 100644 --- a/src/pkg_upgrade.c +++ b/src/pkg_upgrade.c @@ -32,6 +32,7 @@ #include #include #include +#include #include #include @@ -427,7 +428,7 @@ static void __send_args_to_backend(const char *pkgid, const char *pkgtype, struct timeval tv; gettimeofday(&tv, NULL); starttime = tv.tv_sec * 1000l + tv.tv_usec / 1000l; - char buf[BUF_SIZE]; + char *query; char backend_cmd[BUF_SIZE]; const char *new_pkgtype; const char tpk_pkgtype[] = "tpk"; @@ -467,31 +468,31 @@ static void __send_args_to_backend(const char *pkgid, const char *pkgtype, ret = __xsystem(uninstall_ro); break; case PKG_NEED_UPDATE_TO_RW: - snprintf(buf, sizeof(buf), + query = sqlite3_mprintf( "UPDATE package_info SET " \ "package_preload='false', " \ "package_system='false' "\ - "WHERE package='%s'", pkgid); + "WHERE package=%Q", pkgid); db_cmd[1] = strdup(DBPATH); - db_cmd[2] = strdup(buf); + db_cmd[2] = query; ret = __xsystem(db_cmd); FREE_AND_NULL(db_cmd[1]); - FREE_AND_NULL(db_cmd[2]); + sqlite3_free(query); break; case PKG_NEED_RWUNINSTALL: case PKG_NEED_UPDATE_TO_RO: ret = __xsystem(uninstall_ro_update); break; case PKG_NEED_RO_DBREMOVE: - snprintf(buf, sizeof(buf), + query = sqlite3_mprintf( "PRAGMA foreign_keys=on; " \ "DELETE FROM package_info " \ - "WHERE package='%s'", pkgid); + "WHERE package=%Q", pkgid); db_cmd[1] = strdup(DBPATH); - db_cmd[2] = strdup(buf); + db_cmd[2] = query; ret = __xsystem(db_cmd); FREE_AND_NULL(db_cmd[1]); - FREE_AND_NULL(db_cmd[2]); + sqlite3_free(query); break; case PKG_NEED_PRELOADRW_INSTALL: ret = __xsystem(preload_rw); @@ -1098,6 +1099,7 @@ static int __process_rw_fota() pkgtype = __getvalue(buf, TOKEN_TYPE_STR, 1); __install_preload_rw(pkgid, pkgtype); + free(pkgtype); if (handle) pkgmgrinfo_pkginfo_destroy_pkginfo(handle); -- 2.7.4 From 1da84c4c6fae848e7bba2208efba0b015e7c31a2 Mon Sep 17 00:00:00 2001 From: Sangyoon Jang Date: Fri, 1 Feb 2019 16:24:37 +0900 Subject: [PATCH 11/16] Fix upgrade_to_30002.sh script Add setting db version as 30002. Change-Id: Ibb7b8f05a65d18bc8613d6d7e4c29412432603fb Signed-off-by: Sangyoon Jang --- data/updates/upgrade_to_30002.sh.in | 2 ++ 1 file changed, 2 insertions(+) diff --git a/data/updates/upgrade_to_30002.sh.in b/data/updates/upgrade_to_30002.sh.in index 9576898..6e19fb6 100644 --- a/data/updates/upgrade_to_30002.sh.in +++ b/data/updates/upgrade_to_30002.sh.in @@ -10,6 +10,8 @@ function migrate_parser_db() { local dbpath=$1 echo -e "ALTER TABLE package_app_app_control ADD visibility TEXT NOT NULL DEFAULT 'local-only'" | sqlite3 $dbpath + + echo "PRAGMA user_version=30002;" | sqlite3 $dbpath } function migrate_user_db() { -- 2.7.4 From ac82262e66696de904c208cbca0622d7cce0eecf Mon Sep 17 00:00:00 2001 From: ilho Date: Fri, 15 Feb 2019 17:38:48 +0900 Subject: [PATCH 12/16] Release version 0.4.17 Changes: - Fix upgrade_to_30002.sh script - Fix to avoiding sql injection - Fix upgrade script - Refactor __process_request function of pkg_cmd.c - Refactor pkg_upgrade - Fix upgrade script Change-Id: I22012512765f255510a6adf19ed2a9bb762fef3f Signed-off-by: ilho --- packaging/pkgmgr-tool.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/pkgmgr-tool.spec b/packaging/pkgmgr-tool.spec index 3949836..619ce8d 100644 --- a/packaging/pkgmgr-tool.spec +++ b/packaging/pkgmgr-tool.spec @@ -1,6 +1,6 @@ Name: pkgmgr-tool Summary: Packager Manager Tool package -Version: 0.4.16 +Version: 0.4.17 Release: 1 Group: Application Framework/Package Management License: Apache-2.0 -- 2.7.4 From 066773d6ae4f3b1e77fb09dcb58a9f9a11980a59 Mon Sep 17 00:00:00 2001 From: Sangyoon Jang Date: Tue, 12 Feb 2019 16:49:41 +0900 Subject: [PATCH 13/16] Add missing upgrade script for version 30003 Add app_control_id column for package_app_app_control table. Change-Id: I3eefa5b4520d31976a94ecedec8d99744c3fdb09 Signed-off-by: Sangyoon Jang --- CMakeLists.txt | 2 ++ data/updates/upgrade_to_30003.sh.in | 27 +++++++++++++++++++++++++++ packaging/pkgmgr-tool.spec | 1 + 3 files changed, 30 insertions(+) create mode 100644 data/updates/upgrade_to_30003.sh.in diff --git a/CMakeLists.txt b/CMakeLists.txt index ac4eb77..d54965e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -88,3 +88,5 @@ CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/data/updates/upgrade_to_30001.sh.in u INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/upgrade_to_30001.sh DESTINATION /etc/package-manager/updates/) CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/data/updates/upgrade_to_30002.sh.in upgrade_to_30002.sh $ONLY) INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/upgrade_to_30002.sh DESTINATION /etc/package-manager/updates/) +CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/data/updates/upgrade_to_30003.sh.in upgrade_to_30003.sh $ONLY) +INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/upgrade_to_30003.sh DESTINATION /etc/package-manager/updates/) diff --git a/data/updates/upgrade_to_30003.sh.in b/data/updates/upgrade_to_30003.sh.in new file mode 100644 index 0000000..773ab43 --- /dev/null +++ b/data/updates/upgrade_to_30003.sh.in @@ -0,0 +1,27 @@ +#!/bin/sh +PATH=/bin:/usr/bin:/sbin:/usr/sbin + +source /etc/tizen-platform.conf + +PARSER_DB_NAME=.pkgmgr_parser.db +PARSER_DB_PATH=$TZ_SYS_DB/$PARSER_DB_NAME + +function migrate_parser_db() { + local dbpath=$1 + + echo -e "ALTER TABLE package_app_app_control ADD app_control_id TEXT NOT NULL DEFAULT 'no-name-app-control'" | sqlite3 $dbpath + + echo "PRAGMA user_version=30003;" | sqlite3 $dbpath +} + +function migrate_user_db() { + #get each user db path and call migrate_parser_db for each of it + + find $TZ_SYS_DB/user -name $PARSER_DB_NAME | while read DBPATH + do + migrate_parser_db $DBPATH + done +} + +migrate_parser_db $PARSER_DB_PATH +migrate_user_db diff --git a/packaging/pkgmgr-tool.spec b/packaging/pkgmgr-tool.spec index 619ce8d..ca78341 100644 --- a/packaging/pkgmgr-tool.spec +++ b/packaging/pkgmgr-tool.spec @@ -74,6 +74,7 @@ update-mime-database %{_datadir}/mime %attr(0700,root,root) /etc/package-manager/updates/upgrade_to_30000.sh %attr(0700,root,root) /etc/package-manager/updates/upgrade_to_30001.sh %attr(0700,root,root) /etc/package-manager/updates/upgrade_to_30002.sh +%attr(0700,root,root) /etc/package-manager/updates/upgrade_to_30003.sh %attr(0700,root,root) /usr/share/upgrade/scripts/701.app2sd.patch.sh %attr(0700,root,root) %{_sysconfdir}/opt/upgrade/pkgmgr.patch.sh %attr(0700,root,root) /usr/share/fixed_multiuser/scripts/pkgmgr-clear-skel.sh -- 2.7.4 From fddf5c776f25eeacf0cd0a34ebcba3d37f76f77d Mon Sep 17 00:00:00 2001 From: Sangyoon Jang Date: Wed, 16 Jan 2019 18:39:40 +0900 Subject: [PATCH 14/16] Add package dependency attribute to upgrade script Change-Id: Ic85f83896f6de645b572f884407f77e3099ecc04 Signed-off-by: Sangyoon Jang --- CMakeLists.txt | 2 ++ data/updates/upgrade_to_30004.sh.in | 34 ++++++++++++++++++++++++++++++++++ packaging/pkgmgr-tool.spec | 1 + 3 files changed, 37 insertions(+) create mode 100644 data/updates/upgrade_to_30004.sh.in diff --git a/CMakeLists.txt b/CMakeLists.txt index d54965e..f688adc 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -90,3 +90,5 @@ CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/data/updates/upgrade_to_30002.sh.in u INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/upgrade_to_30002.sh DESTINATION /etc/package-manager/updates/) CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/data/updates/upgrade_to_30003.sh.in upgrade_to_30003.sh $ONLY) INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/upgrade_to_30003.sh DESTINATION /etc/package-manager/updates/) +CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/data/updates/upgrade_to_30004.sh.in upgrade_to_30004.sh $ONLY) +INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/upgrade_to_30004.sh DESTINATION /etc/package-manager/updates/) diff --git a/data/updates/upgrade_to_30004.sh.in b/data/updates/upgrade_to_30004.sh.in new file mode 100644 index 0000000..23509a3 --- /dev/null +++ b/data/updates/upgrade_to_30004.sh.in @@ -0,0 +1,34 @@ +#!/bin/sh +PATH=/bin:/usr/bin:/sbin:/usr/sbin + +source /etc/tizen-platform.conf + +PARSER_DB_NAME=.pkgmgr_parser.db +PARSER_DB_PATH=$TZ_SYS_DB/$PARSER_DB_NAME + +function migrate_parser_db() { + local dbpath=$1 + + echo -e "CREATE TABLE IF NOT EXISTS package_dependency_info (\n" \ + " package TEXT NOT NULL,\n" \ + " depends_on TEXT NOT NULL,\n" \ + " type TEXT NOT NULL,\n" \ + " required_version TEXT,\n" \ + " PRIMARY KEY(package, depends_on, type, required_version)\n" \ + " FOREIGN KEY(package)\n" \ + " REFERENCES package_info(package) ON DELETE CASCADE);" | sqlite3 $dbpath + + echo "PRAGMA user_version=30004;" | sqlite3 $dbpath +} + +function migrate_user_db() { + #get each user db path and call migrate_parser_db for each of it + + find $TZ_SYS_DB/user -name $PARSER_DB_NAME | while read DBPATH + do + migrate_parser_db $DBPATH + done +} + +migrate_parser_db $PARSER_DB_PATH +migrate_user_db diff --git a/packaging/pkgmgr-tool.spec b/packaging/pkgmgr-tool.spec index ca78341..c2cc48d 100644 --- a/packaging/pkgmgr-tool.spec +++ b/packaging/pkgmgr-tool.spec @@ -75,6 +75,7 @@ update-mime-database %{_datadir}/mime %attr(0700,root,root) /etc/package-manager/updates/upgrade_to_30001.sh %attr(0700,root,root) /etc/package-manager/updates/upgrade_to_30002.sh %attr(0700,root,root) /etc/package-manager/updates/upgrade_to_30003.sh +%attr(0700,root,root) /etc/package-manager/updates/upgrade_to_30004.sh %attr(0700,root,root) /usr/share/upgrade/scripts/701.app2sd.patch.sh %attr(0700,root,root) %{_sysconfdir}/opt/upgrade/pkgmgr.patch.sh %attr(0700,root,root) /usr/share/fixed_multiuser/scripts/pkgmgr-clear-skel.sh -- 2.7.4 From d548af7bc59450f6348fff8697e3ee4321292044 Mon Sep 17 00:00:00 2001 From: Junghyun Yeon Date: Wed, 20 Feb 2019 17:24:42 +0900 Subject: [PATCH 15/16] Add codes to handle ReadonlyUpdateInstalled pkg - When readonlyupdateinstalled pkg version is higher than FOTA-updated pkg, pkg version should be preserved. Change-Id: I48e5718dca83db7e2777f51c6750f4d44478a37a Signed-off-by: Junghyun Yeon --- src/pkg_upgrade.c | 6 ++++++ src/pkg_upgrade.h | 3 ++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/pkg_upgrade.c b/src/pkg_upgrade.c index 566231b..e5d0782 100644 --- a/src/pkg_upgrade.c +++ b/src/pkg_upgrade.c @@ -377,6 +377,12 @@ static int __compare_pkgid(char *file_path, char *fota_pkgid, FREE_AND_NULL(version); FREE_AND_NULL(update); break; + } else if (compare == PMINFO_VERSION_OLD) { + ret = PKG_IS_OLD; + FREE_AND_NULL(pkgid); + FREE_AND_NULL(version); + FREE_AND_NULL(update); + break; } FREE_AND_NULL(pkgid); diff --git a/src/pkg_upgrade.h b/src/pkg_upgrade.h index 4f5a93f..de1e8de 100644 --- a/src/pkg_upgrade.h +++ b/src/pkg_upgrade.h @@ -92,7 +92,8 @@ typedef enum { PKG_IS_NOT_EXIST = 0, PKG_IS_SAME, PKG_IS_UPDATED, - PKG_IS_INSERTED + PKG_IS_INSERTED, + PKG_IS_OLD } COMPARE_RESULT; typedef enum { -- 2.7.4 From 9aaf14ed79f210b915af3cabd1f76165031dea79 Mon Sep 17 00:00:00 2001 From: Junghyun Yeon Date: Mon, 18 Feb 2019 14:48:12 +0900 Subject: [PATCH 16/16] Add db schema to version 30004 Change-Id: I9ffe4bf630341f21c1fb319450096a4515789ea1 Signed-off-by: Junghyun Yeon --- data/updates/upgrade_to_30004.sh.in | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/data/updates/upgrade_to_30004.sh.in b/data/updates/upgrade_to_30004.sh.in index 23509a3..ec3ea57 100644 --- a/data/updates/upgrade_to_30004.sh.in +++ b/data/updates/upgrade_to_30004.sh.in @@ -18,6 +18,12 @@ function migrate_parser_db() { " FOREIGN KEY(package)\n" \ " REFERENCES package_info(package) ON DELETE CASCADE);" | sqlite3 $dbpath + echo -e "CREATE TABLE IF NOT EXISTS package_plugin_info (\n" \ + " pkgid TEXT NOT NULL,\n" \ + " appid TEXT,\n" \ + " plugin_type TEXT NOT NULL,\n", + " plugin_name TEXT NOT NULL)" | sqlite3 $dbpath + echo "PRAGMA user_version=30004;" | sqlite3 $dbpath } -- 2.7.4