Fix pkgcmd to handle multiple install request 71/225071/3
authorSangyoon Jang <jeremy.jang@samsung.com>
Mon, 10 Feb 2020 06:00:57 +0000 (15:00 +0900)
committerSangyoon Jang <jeremy.jang@samsung.com>
Fri, 20 Mar 2020 05:36:40 +0000 (14:36 +0900)
Usage:
 $ pkgcmd -i -p {pkgpath1} {pkgpath2} {pkgpath3}
 $ pkgcmd -u -n {pkgid1} {pkgid2} {pkgid3}

Change-Id: I0febf29e5f737e50c3c35c21c81b6a7e5281c1e3
Signed-off-by: Sangyoon Jang <jeremy.jang@samsung.com>
src/pkg_cmd.c

index 5fa2e32..ff3ec65 100644 (file)
@@ -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 */