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;
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)
"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;
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;
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;
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;
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)
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;
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;
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;
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);
return -1;
}
printf("path is %s\n", data.pkg_path);
+
+ __parse_multiple_pkgs(&data, argc, argv);
break;
case 'X': /* old_tpk */
if (optarg)
snprintf(data.pkgid, sizeof(data.pkgid),
"%s", optarg);
+
+ __parse_multiple_pkgs(&data, argc, argv);
break;
case 'e': /* tep name */