From: ilho Date: Fri, 7 Sep 2018 02:49:48 +0000 (+0900) Subject: Refactor __process_request function of pkg_cmd.c X-Git-Tag: submit/tizen/20190215.085133~4 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=c86fdeb2eacc59ac81991bc00b255ad61ce0ec9d;p=platform%2Fcore%2Fappfw%2Fpkgmgr-tool.git 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 --- 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; }