From 3f56536b54fa1282599a8110748a2eb829b80c58 Mon Sep 17 00:00:00 2001 From: Junghyun Yeon Date: Thu, 15 Dec 2016 16:02:13 +0900 Subject: [PATCH] execute backend with different argument based on pkg's basic status - Change argument on pkg's status, RO/RW or Global/User pkg Change-Id: Ib15cbf9e8736598883ab2760bda980f10d4b8669 Signed-off-by: Junghyun Yeon --- src/pkgmgr-server.c | 97 ++++++++++++++++++++++++++++++++++++++++++++++++----- src/signal.c | 6 ++++ 2 files changed, 94 insertions(+), 9 deletions(-) diff --git a/src/pkgmgr-server.c b/src/pkgmgr-server.c index b7cf244..c3d33d1 100644 --- a/src/pkgmgr-server.c +++ b/src/pkgmgr-server.c @@ -731,19 +731,52 @@ static int __process_enable_pkg(struct backend_job *job) char *backend_cmd; char **argv; char args[MAX_PKG_ARGS_LEN]; + pkgmgrinfo_pkginfo_h pkginfo_h; + bool is_readonly; + bool is_global; + int ret; int pid; backend_cmd = job->backend_path; if (backend_cmd == NULL) return -1; - snprintf(args, sizeof(args), "%s -k %s -u %d -A %s", backend_cmd, - job->req_id, (int)job->target_uid, job->pkgid); - argv = __generate_argv(args); + ret = pkgmgrinfo_pkginfo_get_usr_disabled_pkginfo( + job->pkgid, job->target_uid, &pkginfo_h); + if (ret != PMINFO_R_OK) { + ERR("Failed to get appinfo"); + return -1; + } + + ret = pkgmgrinfo_pkginfo_is_global(pkginfo_h, &is_global); + if (ret != PMINFO_R_OK) { + ERR("Failed to get global value"); + pkgmgrinfo_pkginfo_destroy_pkginfo(pkginfo_h); + return -1; + } + + if ((is_global && job->target_uid != GLOBAL_USER) || + (!is_global && job->target_uid == GLOBAL_USER)) { + ERR("Invalid attempt to enable pkg"); + pkgmgrinfo_pkginfo_destroy_pkginfo(pkginfo_h); + return -1; + } + ret = pkgmgrinfo_pkginfo_is_readonly(pkginfo_h, &is_readonly); + if (ret != PMINFO_R_OK) { + ERR("Failed to get readonly value"); + pkgmgrinfo_pkginfo_destroy_pkginfo(pkginfo_h); + return -1; + } + + snprintf(args, sizeof(args), "%s -k %s -u %d -A %s %s", + backend_cmd, job->req_id, (int)job->target_uid, + job->pkgid, (is_readonly) ? "--preload" : ""); + argv = __generate_argv(args); pid = __fork_and_exec_with_args(argv, APPFW_UID); g_strfreev(argv); + pkgmgrinfo_pkginfo_destroy_pkginfo(pkginfo_h); return pid; } @@ -753,20 +786,54 @@ static int __process_disable_pkg(struct backend_job *job) char *backend_cmd; char **argv; char args[MAX_PKG_ARGS_LEN]; + pkgmgrinfo_pkginfo_h pkginfo_h; + bool is_readonly; + bool is_global; + int ret; int pid; backend_cmd = job->backend_path; if (backend_cmd == NULL) return -1; - snprintf(args, sizeof(args), "%s -k %s -u %d -D %s", backend_cmd, - job->req_id, (int)job->target_uid, job->pkgid); + ret = pkgmgrinfo_pkginfo_get_usr_pkginfo( + job->pkgid, job->target_uid, &pkginfo_h); + if (ret != PMINFO_R_OK) { + ERR("Failed to get appinfo"); + return -1; + } + + ret = pkgmgrinfo_pkginfo_is_global(pkginfo_h, &is_global); + if (ret != PMINFO_R_OK) { + ERR("Failed to get global value"); + pkgmgrinfo_pkginfo_destroy_pkginfo(pkginfo_h); + return -1; + } + + if ((is_global && job->target_uid != GLOBAL_USER) || + (!is_global && job->target_uid == GLOBAL_USER)) { + ERR("Invalid attempt to disable pkg"); + pkgmgrinfo_pkginfo_destroy_pkginfo(pkginfo_h); + return -1; + } + + ret = pkgmgrinfo_pkginfo_is_readonly(pkginfo_h, &is_readonly); + if (ret != PMINFO_R_OK) { + ERR("Failed to get readonly value"); + pkgmgrinfo_pkginfo_destroy_pkginfo(pkginfo_h); + return -1; + } + + snprintf(args, sizeof(args), "%s -k %s -u %d -D %s %s", + backend_cmd, job->req_id, (int)job->target_uid, + job->pkgid, (is_readonly) ? "--preload" : ""); argv = __generate_argv(args); pid = __fork_and_exec_with_args(argv, APPFW_UID); g_strfreev(argv); + pkgmgrinfo_pkginfo_destroy_pkginfo(pkginfo_h); return pid; } @@ -1335,14 +1402,26 @@ gboolean queue_job(void *data) case REQUEST_TYPE_ENABLE_PKG: __set_backend_busy(x); ret = __process_enable_pkg(job); - g_hash_table_insert(backend_info_table, (gpointer)ret, - (gpointer)job); + if (ret == -1) { + _send_fail_signal(job); + __set_backend_free(x); + _free_backend_job(job); + } else { + g_hash_table_insert(backend_info_table, (gpointer)ret, + (gpointer)job); + } break; case REQUEST_TYPE_DISABLE_PKG: __set_backend_busy(x); ret = __process_disable_pkg(job); - g_hash_table_insert(backend_info_table, (gpointer)ret, - (gpointer)job); + if (ret == -1) { + _send_fail_signal(job); + __set_backend_free(x); + _free_backend_job(job); + } else { + g_hash_table_insert(backend_info_table, (gpointer)ret, + (gpointer)job); + } break; case REQUEST_TYPE_ENABLE_APP: ret = __process_enable_app(job); diff --git a/src/signal.c b/src/signal.c index b7891aa..c1efa8c 100644 --- a/src/signal.c +++ b/src/signal.c @@ -146,6 +146,12 @@ void _send_fail_signal(struct backend_job *job) case REQUEST_TYPE_GETSIZE: req_type = PKGMGR_REQ_GETSIZE; break; + case REQUEST_TYPE_DISABLE_PKG: + req_type = PKGMGR_REQ_DISABLE_PKG; + break; + case REQUEST_TYPE_ENABLE_PKG: + req_type = PKGMGR_REQ_ENABLE_PKG; + break; default: req_type = PKGMGR_REQ_INVALID; break; -- 2.7.4