execute backend with different argument based on pkg's basic status 37/105037/7
authorJunghyun Yeon <jungh.yeon@samsung.com>
Thu, 15 Dec 2016 07:02:13 +0000 (16:02 +0900)
committerJunghyun Yeon <jungh.yeon@samsung.com>
Tue, 20 Dec 2016 06:24:24 +0000 (22:24 -0800)
- Change argument on pkg's status, RO/RW or Global/User pkg

Change-Id: Ib15cbf9e8736598883ab2760bda980f10d4b8669
Signed-off-by: Junghyun Yeon <jungh.yeon@samsung.com>
src/pkgmgr-server.c
src/signal.c

index b7cf244..c3d33d1 100644 (file)
@@ -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);
index b7891aa..c1efa8c 100644 (file)
@@ -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;