From: Sangyoon Jang Date: Mon, 10 Feb 2020 06:00:57 +0000 (+0900) Subject: Fix pkgcmd to handle multiple install request X-Git-Tag: submit/tizen/20200403.082852~1 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=b77b8683ef346236ffd42cce9d4656ea4c1c3659;p=platform%2Fcore%2Fappfw%2Fpkgmgr-tool.git Fix pkgcmd to handle multiple install request Usage: $ pkgcmd -i -p {pkgpath1} {pkgpath2} {pkgpath3} $ pkgcmd -u -n {pkgid1} {pkgid2} {pkgid3} Change-Id: I0febf29e5f737e50c3c35c21c81b6a7e5281c1e3 Signed-off-by: Sangyoon Jang --- diff --git a/src/pkg_cmd.c b/src/pkg_cmd.c index 5fa2e32..ff3ec65 100644 --- a/src/pkg_cmd.c +++ b/src/pkg_cmd.c @@ -97,6 +97,9 @@ struct pm_tool_args_t { char *resolved_path_delta_pkg; char label[PKG_NAME_STRING_LEN_MAX]; char tep_path[PATH_MAX]; + GList *pkgs; + int start_count; + int end_count; bool tep_move; int global; @@ -120,6 +123,8 @@ static void __free_data(pm_tool_args *data) free(data->resolved_path_pkg_new); if (data->resolved_path_delta_pkg) free(data->resolved_path_delta_pkg); + if (data->pkgs) + g_list_free_full(data->pkgs, free); } static void __error_no_to_string(int errnumber, char **errstr) @@ -249,10 +254,15 @@ static int __return_cb(uid_t target_uid, int req_id, const char *pkg_type, "pkgid[%s] key[%s] val[%s]\n", req_id, pkg_type, pkgid, key, val); + if (strncmp(key, "start", strlen("start")) == 0) + data->start_count++; + if (strncmp(key, "end", strlen("end")) == 0) { + data->end_count++; if ((strncmp(val, "fail", strlen("fail")) == 0) && data->result == 0) data->result = PKGMGR_INSTALLER_ERRCODE_ERROR; - g_main_loop_quit(main_loop); + if (data->start_count == data->end_count) + g_main_loop_quit(main_loop); } return 0; @@ -601,6 +611,48 @@ static void __invalid_arg_handler(pm_tool_args *data) data->result = PKGMGR_INSTALLER_ERRCODE_INVALID_VALUE; } +static int __install_single_pkg(pkgmgr_client *pc, pm_tool_args *data, + uid_t target_uid) +{ + int ret; + + 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, data, 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, data, target_uid); + + return ret; +} + +static int __install_multiple_pkgs(pkgmgr_client *pc, pm_tool_args *data, + uid_t target_uid) +{ + int ret; + const char **pkgs; + int n_pkgs; + GList *l; + int i; + + n_pkgs = g_list_length(data->pkgs); + + pkgs = malloc(sizeof(char *) * n_pkgs); + for (l = data->pkgs, i = 0; l; l = l->next, i++) + pkgs[i] = (char *)l->data; + + ret = pkgmgr_client_usr_install_packages(pc, pkgs, n_pkgs, __return_cb, + data, target_uid); + + free(pkgs); + + return ret; +} + static int __install_req_dispatcher(pm_tool_args *data, uid_t target_uid) { int ret; @@ -627,16 +679,10 @@ static int __install_req_dispatcher(pm_tool_args *data, uid_t target_uid) if (data->tep_path[0] != '\0') pkgmgr_client_set_tep_path(pc, data->tep_path, data->tep_move); - 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, data, target_uid); + if (g_list_length(data->pkgs) > 1) + ret = __install_multiple_pkgs(pc, data, 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, data, target_uid); + ret = __install_single_pkg(pc, data, target_uid); if (ret < 0) { data->result = PKGMGR_INSTALLER_ERRCODE_ERROR; @@ -650,6 +696,36 @@ static int __install_req_dispatcher(pm_tool_args *data, uid_t target_uid) return data->result; } +static int __uninstall_single_pkg(pkgmgr_client *pc, pm_tool_args *data, + uid_t target_uid) +{ + return pkgmgr_client_usr_uninstall(pc, data->pkg_type, data->pkgid, + PM_QUIET, __return_cb, data, target_uid); +} + +static int __uninstall_multiple_pkgs(pkgmgr_client *pc, pm_tool_args *data, + uid_t target_uid) +{ + int ret; + const char **pkgs; + int n_pkgs; + GList *l; + int i; + + n_pkgs = g_list_length(data->pkgs); + + pkgs = malloc(sizeof(char *) * n_pkgs); + for (l = data->pkgs, i = 0; l; l = l->next, i++) + pkgs[i] = (char *)l->data; + + ret = pkgmgr_client_usr_uninstall_packages(pc, pkgs, n_pkgs, + __return_cb, data, target_uid); + + free(pkgs); + + return ret; +} + static int __uninstall_req_dispatcher(pm_tool_args *data, uid_t target_uid) { int ret; @@ -674,8 +750,11 @@ static int __uninstall_req_dispatcher(pm_tool_args *data, uid_t target_uid) return ret; } - ret = pkgmgr_client_usr_uninstall(pc, data->pkg_type, data->pkgid, - PM_QUIET, __return_cb, data, target_uid); + if (g_list_length(data->pkgs) > 1) + ret = __uninstall_multiple_pkgs(pc, data, target_uid); + else + ret = __uninstall_single_pkg(pc, data, target_uid); + if (ret < 0) { data->result = PKGMGR_INSTALLER_ERRCODE_ERROR; if (access(data->pkg_path, F_OK) != 0) @@ -725,6 +804,48 @@ static int __reinstall_req_dispatcher(pm_tool_args *data, uid_t target_uid) return data->result; } +static int __mount_install_single_pkg(pkgmgr_client *pc, pm_tool_args *data, + uid_t target_uid) +{ + int ret; + + 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, data, 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, data, target_uid); + + return ret; +} + +static int __mount_install_multiple_pkgs(pkgmgr_client *pc, pm_tool_args *data, + uid_t target_uid) +{ + int ret; + const char **pkgs; + int n_pkgs; + GList *l; + int i; + + n_pkgs = g_list_length(data->pkgs); + + pkgs = malloc(sizeof(char *) * n_pkgs); + for (l = data->pkgs, i = 0; l; l = l->next, i++) + pkgs[i] = (char *)l->data; + + ret = pkgmgr_client_usr_mount_install_packages(pc, pkgs, n_pkgs, + __return_cb, data, target_uid); + + free(pkgs); + + return ret; +} + static int __mount_install_req_dispatcher(pm_tool_args *data, uid_t target_uid) { int ret; @@ -751,16 +872,10 @@ static int __mount_install_req_dispatcher(pm_tool_args *data, uid_t target_uid) if (data->tep_path[0] != '\0') pkgmgr_client_set_tep_path(pc, data->tep_path, data->tep_move); - 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, data, target_uid); + if (g_list_length(data->pkgs) > 1) + ret = __mount_install_multiple_pkgs(pc, data, 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, data, target_uid); + ret = __mount_install_single_pkg(pc, data, target_uid); if (ret < 0) { data->result = PKGMGR_INSTALLER_ERRCODE_ERROR; @@ -1404,6 +1519,16 @@ static int __process_request(pm_tool_args *data, uid_t target_uid) return ret; } +static void __parse_multiple_pkgs(pm_tool_args *data, int argc, char **argv) +{ + while ((optind <= argc) && (*argv[optind - 1] != '-')) { + data->pkgs = g_list_append(data->pkgs, + strdup(argv[optind - 1])); + optind++; + } + optind--; +} + int main(int argc, char *argv[]) { optind = 1; @@ -1479,6 +1604,10 @@ int main(int argc, char *argv[]) data.result = 0; data.type = -1; data.uid = -1; + data.pkgs = NULL; + data.start_count = 0; + data.end_count = 0; + while (1) { c = getopt_long(argc, argv, short_options, long_options, &opt_idx); @@ -1571,6 +1700,8 @@ int main(int argc, char *argv[]) return -1; } printf("path is %s\n", data.pkg_path); + + __parse_multiple_pkgs(&data, argc, argv); break; case 'X': /* old_tpk */ @@ -1625,6 +1756,8 @@ int main(int argc, char *argv[]) if (optarg) snprintf(data.pkgid, sizeof(data.pkgid), "%s", optarg); + + __parse_multiple_pkgs(&data, argc, argv); break; case 'e': /* tep name */