Adjust to change of pkg_cleardata interface
[platform/core/appfw/pkgmgr-server.git] / src / pkgmgr-server.c
index 764894a..f55c88d 100644 (file)
 #include <sys/types.h>
 #include <sys/wait.h>
 #include <sys/stat.h>
-#include <dirent.h>
 #include <sys/types.h>
-#include <fcntl.h>
 #include <signal.h>
 #include <grp.h>
+#include <fcntl.h>
 
 #include <glib.h>
 #include <gio/gio.h>
 
+#include <aul.h>
 #include <pkgmgr-info.h>
 #include <pkgmgr/pkgmgr_parser_db.h>
 #include <tzplatform_config.h>
 
 #include "pkgmgr_installer.h"
 #include "pkgmgr-server.h"
-#include "pm-queue.h"
+#include "queue.h"
 #include "package-manager.h"
 
-#define BUFMAX 128
-#define NO_MATCHING_FILE 11
-
 #define OWNER_ROOT 0
 #define GLOBAL_USER tzplatform_getuid(TZ_SYS_GLOBALAPP_USER)
 #define APPFW_UID 301
@@ -63,6 +60,7 @@
 #define EXT_STORAGE_APPDATA_GROUP 10002
 #define MEDIA_STORAGE_GROUP 10502
 #define ARRAY_SIZE(array) (sizeof(array) / sizeof(array[0]))
+#define MAX_LONGLONG_LENGTH 32
 
 typedef struct  {
        char **env;
@@ -73,6 +71,7 @@ typedef struct  {
 typedef struct {
        uid_t uid;
        char *cmd;
+       int pid;
 } pkgcmd_data;
 
 /*
@@ -80,7 +79,7 @@ typedef struct {
 Each bit position corresponds to a queue slot which
 is dynamically determined.
 */
-char backend_busy = 0;
+static char backend_busy = 0;
 extern int num_of_backends;
 
 struct signal_info_t {
@@ -91,22 +90,8 @@ struct signal_info_t {
 static int pipe_sig[2];
 static GIOChannel *pipe_io;
 static guint pipe_wid;
-
-backend_info *begin;
-extern queue_info_map *start;
-extern int entries;
-
-GMainLoop *mainloop = NULL;
-
-
-/* operation_type */
-typedef enum {
-       OPERATION_INSTALL = 0,
-       OPERATION_UNINSTALL,
-       OPERATION_ACTIVATE,
-       OPERATION_REINSTALL,
-       OPERATION_MAX
-} OPERATION_TYPE;
+static GHashTable *backend_info_table;
+static GMainLoop *mainloop;
 
 static int __check_backend_status_for_exit(void);
 static int __check_queue_status_for_exit(void);
@@ -117,59 +102,127 @@ static void sighandler(int signo);
 
 gboolean exit_server(void *data);
 
-/* To check whether a particular backend is free/busy*/
+/* To check whether a particular backend is free/busy */
 static int __is_backend_busy(int position)
 {
-       return backend_busy & 1<<position;
+       return backend_busy & (1 << position);
 }
-/*To set a particular backend as busy*/
+/* To set a particular backend as busy */
 static void __set_backend_busy(int position)
 {
-       backend_busy = backend_busy | 1<<position;
+       backend_busy = backend_busy | (1 << position);
 }
-/*To set a particular backend as free */
+/* To set a particular backend as free */
 static void __set_backend_free(int position)
 {
-       backend_busy = backend_busy & ~(1<<position);
+       backend_busy = backend_busy & ~(1 << position);
 }
 
-static gboolean pipe_io_handler(GIOChannel *io, GIOCondition cond, gpointer data)
+static gboolean getsize_io_handler(GIOChannel *io, GIOCondition cond,
+               gpointer data)
+{
+       GError *err = NULL;
+       GIOStatus s;
+       gsize len;
+       char buf[MAX_LONGLONG_LENGTH];
+       long long result = 0;
+       struct backend_job *job = (struct backend_job *)data;
+
+       s = g_io_channel_read_chars(io, (gchar *)buf, sizeof(buf), &len, &err);
+       if (s != G_IO_STATUS_NORMAL) {
+               ERR("getsize fd read failed: %s", err->message);
+               g_error_free(err);
+               result = -1;
+       } else {
+               if (strlen(buf) == 0) {
+                       ERR("empty result");
+                       result = -1;
+               } else {
+                       result = atoll(buf);
+               }
+       }
+
+       _return_value_to_caller(job->req_id, g_variant_new("(ix)",
+               (result < 0) ? PKGMGR_R_ERROR : PKGMGR_R_OK, result));
+
+       unlink(job->extra->getsize_fifo);
+       free(job->extra->getsize_fifo);
+       job->extra->getsize_fifo = NULL;
+
+       return FALSE;
+}
+
+static int __setup_size_info_io(struct backend_job *job)
+{
+       guint getsize_wid;
+
+       job->extra->getsize_fd = open(job->extra->getsize_fifo,
+               O_RDONLY | O_NONBLOCK);
+       if (job->extra->getsize_fd < 0) {
+               ERR("failed to open the fifo(%s), errno(%d)",
+                       job->extra->getsize_fifo, errno);
+               return -1;
+       }
+
+       job->extra->getsize_io = g_io_channel_unix_new(job->extra->getsize_fd);
+       if (!job->extra->getsize_io)
+               return -1;
+       g_io_channel_set_encoding(job->extra->getsize_io, NULL, NULL);
+       g_io_channel_set_buffered(job->extra->getsize_io, FALSE);
+       getsize_wid = g_io_add_watch(job->extra->getsize_io,
+               G_IO_IN, getsize_io_handler, job);
+       if (!getsize_wid) {
+               ERR("failed to add io watch");
+               return -1;
+       }
+
+       return 0;
+}
+
+static gboolean pipe_io_handler(GIOChannel *io, GIOCondition cond,
+               gpointer data)
 {
-       int x;
        GError *err = NULL;
        GIOStatus s;
        gsize len;
        struct signal_info_t info;
-       backend_info *ptr = begin;
+       struct backend_job *job;
 
-       s = g_io_channel_read_chars(io, (gchar *)&info, sizeof(struct signal_info_t), &len, &err);
+       s = g_io_channel_read_chars(io, (gchar *)&info,
+                       sizeof(struct signal_info_t), &len, &err);
        if (s != G_IO_STATUS_NORMAL) {
                ERR("Signal pipe read failed: %s", err->message);
                g_error_free(err);
                return TRUE;
        }
 
-       for (x = 0; x < num_of_backends; x++, ptr++) {
-               if (ptr && ptr->pid == info.pid)
-                       break;
-       }
-
-       if (x == num_of_backends) {
+       job = (struct backend_job *)g_hash_table_lookup(backend_info_table,
+                       (gconstpointer)info.pid);
+       if (job == NULL) {
                ERR("Unknown child exit");
                return -1;
        }
 
-       __set_backend_free(x);
+       __set_backend_free(job->backend_slot);
        if (WIFSIGNALED(info.status)) {
-               __send_fail_signal(ptr);
-               DBG("backend[%s] exit with signal[%d]", ptr->pkgtype,
+               _send_fail_signal(job);
+               DBG("backend[%s] exit with signal[%d]", job->backend_type,
                                WTERMSIG(info.status));
        } else if (WEXITSTATUS(info.status)) {
-               DBG("backend[%s] exit with error", ptr->pkgtype);
+               DBG("backend[%s] exit with error", job->backend_type);
        } else {
-               DBG("backend[%s] exit", ptr->pkgtype);
+               DBG("backend[%s] exit", job->backend_type);
        }
 
+       if (job->extra) {
+               if (job->extra->getsize_fifo) {
+                       ERR("invalid backend close");
+                       _return_value_to_caller(job->req_id,
+                               g_variant_new("(ix)", PKGMGR_R_ERROR, -1));
+               }
+       }
+
+       g_hash_table_remove(backend_info_table, (gconstpointer)info.pid);
        g_idle_add(queue_job, NULL);
 
        return TRUE;
@@ -177,15 +230,9 @@ static gboolean pipe_io_handler(GIOChannel *io, GIOCondition cond, gpointer data
 
 static int __init_backend_info(void)
 {
-       backend_info *ptr;
-
-       /*Allocate memory for holding pid, pkgtype and pkgid*/
-       ptr = (backend_info*)calloc(num_of_backends, sizeof(backend_info));
-       if (ptr == NULL) {
-               DBG("Malloc Failed\n");
-               return -1;
-       }
-       begin = ptr;
+       backend_info_table = g_hash_table_new_full(g_direct_hash,
+                       g_direct_equal, NULL,
+                       (GDestroyNotify)_free_backend_job);
 
        if (pipe(pipe_sig)) {
                ERR("create pipe failed");
@@ -208,7 +255,7 @@ static void __fini_backend_info(void)
        close(pipe_sig[1]);
 
        /*Free backend info */
-       free(begin);
+       g_hash_table_destroy(backend_info_table);
 }
 
 static void sighandler(int signo)
@@ -218,7 +265,8 @@ static void sighandler(int signo)
 
        info.pid = waitpid(-1, &info.status, WNOHANG);
        if (write(pipe_sig[1], &info, sizeof(struct signal_info_t)) < 0)
-               ERR("failed to write result: %s", strerror_r(errno, buf, sizeof(buf)));
+               ERR("failed to write result: %s",
+                               strerror_r(errno, buf, sizeof(buf)));
 }
 
 static int __register_signal_handler(void)
@@ -233,7 +281,7 @@ static int __register_signal_handler(void)
        sigemptyset(&act.sa_mask);
        act.sa_flags = SA_NOCLDSTOP;
        if (sigaction(SIGCHLD, &act, NULL) < 0) {
-               ERR("signal: SIGCHLD failed\n");
+               ERR("signal: SIGCHLD failed");
                return -1;
        }
 
@@ -245,7 +293,7 @@ static int __register_signal_handler(void)
 
 static int __check_backend_status_for_exit(void)
 {
-       int i = 0;
+       int i;
        for (i = 0; i < num_of_backends; i++) {
                if (__is_backend_busy(i))
                        return 0;
@@ -255,24 +303,9 @@ static int __check_backend_status_for_exit(void)
 
 static int __check_queue_status_for_exit(void)
 {
-       pm_queue_data *head[MAX_QUEUE_NUM] = {NULL,};
-       queue_info_map *ptr = NULL;
-       ptr = start;
-       int i = 0;
-       int c = 0;
-       int slot = -1;
-       for (i = 0; i < entries; i++) {
-               if (ptr->queue_slot <= slot) {
-                       ptr++;
-               } else {
-                       head[c] = ptr->head;
-                       slot = ptr->queue_slot;
-                       c++;
-                       ptr++;
-               }
-       }
+       int i;
        for (i = 0; i < num_of_backends; i++) {
-               if (head[i])
+               if (_is_queue_empty(i) == 0)
                        return 0;
        }
        return 1;
@@ -280,57 +313,17 @@ static int __check_queue_status_for_exit(void)
 
 gboolean exit_server(void *data)
 {
-       DBG("exit_server Start\n");
+       DBG("exit_server Start");
        if (__check_backend_status_for_exit() &&
                        __check_queue_status_for_exit()) {
-               if (!getenv("PMS_STANDALONE")) {
-                       g_main_loop_quit(mainloop);
-                       return FALSE;
-               }
+               g_main_loop_quit(mainloop);
+               return FALSE;
        }
        return TRUE;
 }
 
-static int __pkgcmd_read_proc(const char *path, char *buf, int size)
-{
-       int fd;
-       int ret;
-       if (buf == NULL || path == NULL)
-               return -1;
-       fd = open(path, O_RDONLY);
-       if (fd < 0)
-               return -1;
-       ret = read(fd, buf, size - 1);
-       if (ret <= 0) {
-               close(fd);
-               return -1;
-       } else
-               buf[ret] = 0;
-       close(fd);
-       return ret;
-}
-
-static int __pkgcmd_find_pid_by_cmdline(const char *dname,
-                       const char *cmdline, const char *apppath)
-{
-       int pid = 0;
-       int pgid = 0;
-
-       if (strcmp(cmdline, apppath) == 0) {
-               pid = atoi(dname);
-               pgid = getpgid(pid);
-               if (pgid < 0) {
-                       ERR("getpgid failed, errno(%d)", errno);
-                       pid = 0;
-               }
-               if (pid != pgid)
-                       pid = 0;
-       }
-       return pid;
-}
-
 #ifdef TIZEN_FEATURE_CSR
-static int __check_csr(backend_info *ptr)
+static int __check_csr(const char *path)
 {
        csr_cs_context_h context = NULL;
        csr_cs_malware_h detected = NULL;
@@ -343,12 +336,12 @@ static int __check_csr(backend_info *ptr)
        }
 
        if (context) {
-               ret = csr_cs_scan_file(context, ptr->pkgid, &detected);
+               ret = csr_cs_scan_file(context, path, &detected);
                DBG("CSR result[%d]", ret);
 
                csr_cs_context_destroy(context);
                if (detected != NULL) {
-                       ERR("CSR Denied[%s] Installation", ptr->pkgid);
+                       ERR("CSR Denied[%s] Installation", path);
                        return -1;
                }
        }
@@ -357,127 +350,50 @@ static int __check_csr(backend_info *ptr)
 }
 #endif
 
-static int __pkgcmd_proc_iter_kill_cmdline(const char *apppath, int option)
-{
-       DIR *dp;
-       struct dirent dentry, *result;
-       int pid;
-       int ret;
-       char buf[1024] = {'\0'};
-       int pgid;
-
-       dp = opendir("/proc");
-       if (dp == NULL)
-               return -1;
-
-       for (ret = readdir_r(dp, &dentry, &result);
-                       ret == 0 && result != NULL;
-                       ret = readdir_r(dp, &dentry, &result)) {
-               if (!isdigit(dentry.d_name[0]))
-                       continue;
-
-               snprintf(buf, sizeof(buf), "/proc/%s/cmdline", dentry.d_name);
-               ret = __pkgcmd_read_proc(buf, buf, sizeof(buf));
-               if (ret <= 0)
-                       continue;
-
-               pid = __pkgcmd_find_pid_by_cmdline(dentry.d_name, buf, apppath);
-               if (pid > 0) {
-                       if (option == 0) {
-                               closedir(dp);
-                               return pid;
-                       }
-                       pgid = getpgid(pid);
-                       if (pgid <= 1) {
-                               closedir(dp);
-                               ERR("getpgid failed, errno(%d)", errno);
-                               return -1;
-                       }
-                       if (killpg(pgid, SIGKILL) < 0) {
-                               closedir(dp);
-                               ERR("killpg failed, errno(%d)", errno);
-                               return -1;
-                       }
-                       closedir(dp);
-                       return pid;
-               }
-       }
-       closedir(dp);
-       return 0;
-}
-
-static void __make_pid_info_file(char *req_key, int pid, uid_t uid)
+static int __kill_app(char *appid, uid_t uid)
 {
-       FILE* file;
-       int fd;
        int ret;
-       char buf[MAX_PKG_TYPE_LEN] = {0};
-       char info_file[PATH_MAX] = {'\0'};
-       struct passwd pwd;
-       struct passwd *pwd_result;
-
-       if (req_key == NULL)
-               return;
+       int pid;
+       int is_running;
 
-       ret = getpwuid_r(uid, &pwd, buf, sizeof(buf), &pwd_result);
-       if (ret != 0 || pwd_result == NULL) {
-               ERR("get uid failed(%d) for user(%d)", ret, uid);
-               return;
-       }
-       DBG("uid(%d), gid(%d)", uid, pwd.pw_gid);
+       is_running = aul_app_is_running_for_uid(appid, uid);
+       /* app is not running */
+       if (!is_running)
+               return 0;
 
-       snprintf(info_file, PATH_MAX, "/tmp/pkgmgr/%s", req_key);
+       pid = aul_app_get_pid_for_uid(appid, uid);
+       if (pid == -1)
+               return -1;
 
-       DBG("info_path(%s)", info_file);
-       file = fopen(info_file, "w");
-       if (file == NULL) {
-               ERR("Couldn't open the file(%s)", info_file);
-               return;
+       ret = aul_terminate_pid_for_uid(pid, uid);
+       if (ret != AUL_R_OK) {
+               ERR("failed to terminate app(%d)", appid);
+               return -1;
        }
 
-       snprintf(buf, MAX_PKG_TYPE_LEN, "%d\n", pid);
-       fwrite(buf, 1, strlen(buf), file);
-
-       fflush(file);
-       fd = fileno(file);
-       if (fchmod(fd, 0777) < 0)
-               ERR("chmod failed, errno(%d)", errno);
-       if (fchown(fd, uid, pwd.pw_gid) < 0)
-               ERR("chown failed, errno(%d)", errno);
-       fsync(fd);
-       fclose(file);
+       return 0;
 }
 
-static int __kill_app(char *appid, uid_t uid)
+static int __check_app(char *appid, uid_t uid)
 {
-       pkgmgrinfo_appinfo_h appinfo;
-       int ret = PMINFO_R_ERROR;
-       char *exec = NULL;
-
-       ret = pkgmgrinfo_appinfo_get_usr_appinfo(appid, uid, &appinfo);
-       if (ret != PMINFO_R_OK)
-               return PMINFO_R_ERROR;
+       int pid;
+       int is_running;
 
-       ret = pkgmgrinfo_appinfo_get_exec(appinfo, &exec);
-       if (ret != PMINFO_R_OK) {
-               pkgmgrinfo_appinfo_destroy_appinfo(appinfo);
-               return PMINFO_R_ERROR;
-       }
+       is_running = aul_app_is_running_for_uid(appid, uid);
+       if (!is_running)
+               return 0;
 
-       ret = __pkgcmd_proc_iter_kill_cmdline(exec, 1);
-       if (ret != PMINFO_R_OK)
-               DBG("failed to kill app[%s], exec[%s]", appid, exec);
+       pid = aul_app_get_pid_for_uid(appid, uid);
 
-       pkgmgrinfo_appinfo_destroy_appinfo(appinfo);
-       return ret;
+       return pid;
 }
 
 static int __pkgcmd_app_cb(const pkgmgrinfo_appinfo_h handle, void *user_data)
 {
        char *pkgid;
+       char *appid;
        char *exec;
        int ret;
-       int pid = -1;
        pkgcmd_data *pdata = (pkgcmd_data *)user_data;
 
        if (handle == NULL) {
@@ -489,23 +405,29 @@ static int __pkgcmd_app_cb(const pkgmgrinfo_appinfo_h handle, void *user_data)
                perror("Failed to get app exec path\n");
                exit(1);
        }
+       ret = pkgmgrinfo_appinfo_get_appid(handle, &appid);
+       if (ret) {
+               perror("Failed to get appid\n");
+               exit(1);
+       }
        ret = pkgmgrinfo_appinfo_get_pkgid(handle, &pkgid);
        if (ret) {
                perror("Failed to get pkgid\n");
                exit(1);
        }
 
-       if (strcmp(pdata->cmd, "kill") == 0)
-               pid = __pkgcmd_proc_iter_kill_cmdline(exec, 1);
-       else if (strcmp(pdata->cmd, "check") == 0)
-               pid = __pkgcmd_proc_iter_kill_cmdline(exec, 0);
-
-       __make_pid_info_file(pkgid, pid, pdata->uid);
+       if (strcmp(pdata->cmd, "kill") == 0) {
+               pdata->pid = __check_app(appid, pdata->uid);
+               if (pdata->pid > 0)
+                       ret = __kill_app(appid, pdata->uid);
+       } else if (strcmp(pdata->cmd, "check") == 0) {
+               pdata->pid = __check_app(appid, pdata->uid);
+       }
 
        return 0;
 }
 
-void free_user_context(user_ctxctx)
+void free_user_context(user_ctx *ctx)
 {
        char **env = NULL;
        int i = 0;
@@ -691,7 +613,7 @@ void __set_environment(gpointer user_data)
 
 static int __fork_and_exec_with_args(char **argv, uid_t uid)
 {
-       user_ctxuser_context;
+       user_ctx *user_context;
        GError *error = NULL;
        gboolean ret;
        int pid;
@@ -708,6 +630,8 @@ static int __fork_and_exec_with_args(char **argv, uid_t uid)
        if (ret != TRUE) {
                ERR("Failed to excute backend: %s", error->message);
                g_error_free(error);
+               free_user_context(user_context);
+               return -1;
        }
 
        free_user_context(user_context);
@@ -715,27 +639,21 @@ static int __fork_and_exec_with_args(char **argv, uid_t uid)
        return pid;
 }
 
-static int __change_item_info(pm_dbus_msg *item, uid_t uid, bool *is_global)
+static int __change_job_info(struct backend_job *job, uid_t uid,
+               bool *is_global)
 {
        int ret = 0;
        char *pkgid = NULL;
        pkgmgrinfo_appinfo_h handle = NULL;
-
-       switch (item->req_type) {
-       case PKGMGR_REQUEST_TYPE_DISABLE_APP:
-       case PKGMGR_REQUEST_TYPE_DISABLE_GLOBAL_APP_FOR_UID:
-       case PKGMGR_REQUEST_TYPE_ENABLE_APP_SPLASH_SCREEN:
-       case PKGMGR_REQUEST_TYPE_DISABLE_APP_SPLASH_SCREEN:
-               ret = pkgmgrinfo_appinfo_get_usr_appinfo(item->pkgid, uid, &handle);
-               break;
-       case PKGMGR_REQUEST_TYPE_ENABLE_APP:
-       case PKGMGR_REQUEST_TYPE_ENABLE_GLOBAL_APP_FOR_UID:
-               ret = pkgmgrinfo_appinfo_get_usr_disabled_appinfo(item->pkgid, uid, &handle);
-               break;
-       default:
+       if (job->req_type != REQUEST_TYPE_DISABLE_APP &&
+                       job->req_type != REQUEST_TYPE_DISABLE_GLOBAL_APP_FOR_UID &&
+                       job->req_type != REQUEST_TYPE_ENABLE_APP_SPLASH_SCREEN &&
+                       job->req_type != REQUEST_TYPE_DISABLE_APP_SPLASH_SCREEN &&
+                       job->req_type != REQUEST_TYPE_ENABLE_APP &&
+                       job->req_type != REQUEST_TYPE_ENABLE_GLOBAL_APP_FOR_UID)
                return PMINFO_R_ERROR;
-       }
 
+       ret = pkgmgrinfo_appinfo_get_usr_all_appinfo(job->pkgid, uid, &handle);
        if (ret != PMINFO_R_OK)
                return PMINFO_R_ERROR;
 
@@ -743,25 +661,22 @@ static int __change_item_info(pm_dbus_msg *item, uid_t uid, bool *is_global)
        if (ret != PMINFO_R_OK)
                goto catch;
 
-       if ((item->req_type == PKGMGR_REQUEST_TYPE_DISABLE_APP
-                       || item->req_type == PKGMGR_REQUEST_TYPE_ENABLE_APP)
-                       && *is_global) {
-                       ret = PMINFO_R_ERROR;
-                       goto catch;
-       } else if ((item->req_type == PKGMGR_REQUEST_TYPE_DISABLE_GLOBAL_APP_FOR_UID
-                       || item->req_type == PKGMGR_REQUEST_TYPE_ENABLE_GLOBAL_APP_FOR_UID)
-                       && !*is_global) {
-                       ret = PMINFO_R_ERROR;
-                       goto catch;
+       if ((job->req_type == REQUEST_TYPE_DISABLE_GLOBAL_APP_FOR_UID ||
+                       job->req_type ==
+                       REQUEST_TYPE_ENABLE_GLOBAL_APP_FOR_UID) &&
+                       !*is_global) {
+               ret = PMINFO_R_ERROR;
+               goto catch;
        }
 
        ret = pkgmgrinfo_appinfo_get_pkgid(handle, &pkgid);
        if (ret != PMINFO_R_OK)
                goto catch;
 
-       strncpy(item->appid, item->pkgid, sizeof(item->pkgid) - 1);
-       memset((item->pkgid), 0, MAX_PKG_NAME_LEN);
-       strncpy(item->pkgid, pkgid, sizeof(item->pkgid) - 1);
+       free(job->appid);
+       job->appid = strdup(job->pkgid);
+       free(job->pkgid);
+       job->pkgid = strdup(pkgid);
 
 catch:
        pkgmgrinfo_appinfo_destroy_appinfo(handle);
@@ -769,404 +684,553 @@ catch:
        return ret;
 }
 
-static int __process_install(pm_dbus_msg *item)
+static int __process_install(struct backend_job *job)
 {
        char *backend_cmd;
        char **argv;
-       char args[MAX_PKG_ARGS_LEN] = {'\0', };
+       char args[MAX_PKG_ARGS_LEN];
        int pid;
 
-       backend_cmd = _get_backend_cmd(item->pkg_type);
+       backend_cmd = job->backend_path;
        if (backend_cmd == NULL)
                return -1;
 
        snprintf(args, sizeof(args), "%s -k %s -i %s -u %d %s", backend_cmd,
-                       item->req_id, item->pkgid, (int)item->uid, item->args);
+                       job->req_id, job->pkgid, (int)job->target_uid, job->args);
 
        argv = __generate_argv(args);
 
        pid = __fork_and_exec_with_args(argv, APPFW_UID);
        g_strfreev(argv);
-       free(backend_cmd);
 
        return pid;
 }
 
-static int __process_mount_install(pm_dbus_msg *item)
+static int __process_mount_install(struct backend_job *job)
 {
        char *backend_cmd;
        char **argv;
-       char args[MAX_PKG_ARGS_LEN] = {'\0', };
+       char args[MAX_PKG_ARGS_LEN];
        int pid;
 
-       backend_cmd = _get_backend_cmd(item->pkg_type);
+       backend_cmd = job->backend_path;
        if (backend_cmd == NULL)
                return -1;
 
        snprintf(args, sizeof(args), "%s -k %s -w %s -u %d %s", backend_cmd,
-                                        item->req_id, item->pkgid, (int)item->uid, item->args);
+                       job->req_id, job->pkgid, (int)job->target_uid, job->args);
 
        argv = __generate_argv(args);
 
        pid = __fork_and_exec_with_args(argv, APPFW_UID);
        g_strfreev(argv);
-       free(backend_cmd);
 
        return pid;
 }
 
-static int __process_reinstall(pm_dbus_msg *item)
+static int __process_reinstall(struct backend_job *job)
 {
        char *backend_cmd;
        char **argv;
        char args[MAX_PKG_ARGS_LEN];
        int pid;
 
-       backend_cmd = _get_backend_cmd(item->pkg_type);
+       backend_cmd = job->backend_path;
        if (backend_cmd == NULL)
                return -1;
 
        snprintf(args, sizeof(args), "%s -k %s -r %s -u %d", backend_cmd,
-                       item->req_id, item->pkgid, (int)item->uid);
+                       job->req_id, job->pkgid, (int)job->target_uid);
        argv = __generate_argv(args);
 
        pid = __fork_and_exec_with_args(argv, APPFW_UID);
 
        g_strfreev(argv);
-       free(backend_cmd);
 
        return pid;
 }
 
-static int __process_uninstall(pm_dbus_msg *item)
+static int __process_uninstall(struct backend_job *job)
 {
        char *backend_cmd;
        char **argv;
        char args[MAX_PKG_ARGS_LEN];
        int pid;
 
-       backend_cmd = _get_backend_cmd(item->pkg_type);
+       backend_cmd = job->backend_path;
        if (backend_cmd == NULL)
                return -1;
 
        snprintf(args, sizeof(args), "%s -k %s -d %s -u %d", backend_cmd,
-                       item->req_id, item->pkgid, (int)item->uid);
+                       job->req_id, job->pkgid, (int)job->target_uid);
        argv = __generate_argv(args);
 
        pid = __fork_and_exec_with_args(argv, APPFW_UID);
 
        g_strfreev(argv);
-       free(backend_cmd);
 
        return pid;
 }
 
-static int __process_move(pm_dbus_msg *item)
+static int __process_move(struct backend_job *job)
 {
        char *backend_cmd;
        char **argv;
        char args[MAX_PKG_ARGS_LEN];
        int pid;
 
-       backend_cmd = _get_backend_cmd(item->pkg_type);
+       backend_cmd = job->backend_path;
        if (backend_cmd == NULL)
                return -1;
 
        snprintf(args, sizeof(args), "%s -k %s -m %s -u %d -t %s", backend_cmd,
-                       item->req_id, item->pkgid, (int)item->uid, item->args);
+                       job->req_id, job->pkgid, (int)job->target_uid, job->args);
        argv = __generate_argv(args);
 
        pid = __fork_and_exec_with_args(argv, APPFW_UID);
 
        g_strfreev(argv);
-       free(backend_cmd);
 
        return pid;
 }
 
-static int __process_enable_pkg(pm_dbus_msg *item)
+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 = _get_backend_cmd(item->pkg_type);
+       backend_cmd = job->backend_path;
        if (backend_cmd == NULL)
                return -1;
 
-       snprintf(args, sizeof(args), "%s -k %s -u %d -A %s", backend_cmd,
-                       item->req_id, (int)item->uid, item->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);
-       free(backend_cmd);
+       pkgmgrinfo_pkginfo_destroy_pkginfo(pkginfo_h);
 
        return pid;
 }
 
-static int __process_disable_pkg(pm_dbus_msg *item)
+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 = _get_backend_cmd(item->pkg_type);
+       backend_cmd = job->backend_path;
        if (backend_cmd == NULL)
                return -1;
 
-       snprintf(args, sizeof(args), "%s -k %s -u %d -D %s", backend_cmd,
-                       item->req_id, (int)item->uid, item->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);
-       free(backend_cmd);
 
+       pkgmgrinfo_pkginfo_destroy_pkginfo(pkginfo_h);
        return pid;
 }
 
-static int __process_enable_app(pm_dbus_msg *item)
+static int __process_enable_app(struct backend_job *job)
 {
        int ret = -1;
        bool is_global = false;
 
-       /* get actual pkgid and replace it to appid which is currently stored at pkgid variable */
-       ret = __change_item_info(item, item->uid, &is_global);
-       if (ret != PMINFO_R_OK || strlen(item->appid) == 0) {
-               __send_app_signal(item->uid, item->req_id, item->pkgid, item->pkgid,
+       /* get actual pkgid and replace it to appid which is currently stored
+        * at pkgid variable
+        */
+       ret = __change_job_info(job, job->target_uid, &is_global);
+       if (ret != PMINFO_R_OK || strlen(job->appid) == 0) {
+               _send_app_signal(job->target_uid, job->req_id, job->pkgid, job->pkgid,
                                PKGMGR_INSTALLER_START_KEY_STR,
-                               PKGMGR_INSTALLER_APP_ENABLE_EVENT_STR, item->req_type);
-               __send_app_signal(item->uid, item->req_id, item->pkgid, item->pkgid,
-                               PKGMGR_INSTALLER_END_KEY_STR, PKGMGR_INSTALLER_FAIL_EVENT_STR,
-                               item->req_type);
+                               PKGMGR_INSTALLER_APP_ENABLE_EVENT_STR,
+                               job->req_type);
+               _send_app_signal(job->target_uid, job->req_id, job->pkgid, job->pkgid,
+                               PKGMGR_INSTALLER_END_KEY_STR,
+                               PKGMGR_INSTALLER_FAIL_EVENT_STR,
+                               job->req_type);
                return ret;
        }
 
-       __send_app_signal(item->uid, item->req_id, item->pkgid, item->appid,
+       _send_app_signal(job->target_uid, job->req_id, job->pkgid, job->appid,
                        PKGMGR_INSTALLER_START_KEY_STR,
-                       PKGMGR_INSTALLER_APP_ENABLE_EVENT_STR, item->req_type);
+                       PKGMGR_INSTALLER_APP_ENABLE_EVENT_STR, job->req_type);
 
-       ret = pkgmgr_parser_update_app_disable_info_in_usr_db(item->appid, item->uid, 0);
+       ret = pkgmgr_parser_update_app_disable_info_in_usr_db(job->appid,
+                       job->target_uid, 0);
        if (ret != PMINFO_R_OK)
-               __send_app_signal(item->uid, item->req_id, item->pkgid, item->appid,
-                               PKGMGR_INSTALLER_END_KEY_STR, PKGMGR_INSTALLER_FAIL_EVENT_STR,
-                               item->req_type);
+               _send_app_signal(job->target_uid, job->req_id, job->pkgid, job->appid,
+                               PKGMGR_INSTALLER_END_KEY_STR,
+                               PKGMGR_INSTALLER_FAIL_EVENT_STR,
+                               job->req_type);
        else
-               __send_app_signal(item->uid, item->req_id, item->pkgid, item->appid,
-                               PKGMGR_INSTALLER_END_KEY_STR, PKGMGR_INSTALLER_OK_EVENT_STR,
-                               item->req_type);
-
+               _send_app_signal(job->target_uid, job->req_id, job->pkgid, job->appid,
+                               PKGMGR_INSTALLER_END_KEY_STR,
+                               PKGMGR_INSTALLER_OK_EVENT_STR,
+                               job->req_type);
 
        return ret;
 }
 
-static int __process_disable_app(pm_dbus_msg *item)
+static int __process_disable_app(struct backend_job *job)
 {
        int ret = -1;
        bool is_global = false;
 
-       /* get actual pkgid and replace it to appid which is currently stored at pkgid variable */
-       ret = __change_item_info(item, item->uid, &is_global);
-       if (ret != PMINFO_R_OK || strlen(item->appid) == 0) {
-               __send_app_signal(item->uid, item->req_id, item->pkgid, item->pkgid,
+       /* get actual pkgid and replace it to appid which is currently stored
+        * at pkgid variable
+        */
+       ret = __change_job_info(job, job->target_uid, &is_global);
+       if (ret != PMINFO_R_OK || strlen(job->appid) == 0) {
+               _send_app_signal(job->target_uid, job->req_id, job->pkgid, job->pkgid,
                                PKGMGR_INSTALLER_START_KEY_STR,
-                               PKGMGR_INSTALLER_APP_DISABLE_EVENT_STR, item->req_type);
-               __send_app_signal(item->uid, item->req_id, item->pkgid, item->pkgid,
-                               PKGMGR_INSTALLER_END_KEY_STR, PKGMGR_INSTALLER_FAIL_EVENT_STR,
-                               item->req_type);
+                               PKGMGR_INSTALLER_APP_DISABLE_EVENT_STR,
+                               job->req_type);
+               _send_app_signal(job->target_uid, job->req_id, job->pkgid, job->pkgid,
+                               PKGMGR_INSTALLER_END_KEY_STR,
+                               PKGMGR_INSTALLER_FAIL_EVENT_STR,
+                               job->req_type);
                return ret;
        }
 
-       __send_app_signal(item->uid, item->req_id, item->pkgid, item->appid,
+       _send_app_signal(job->target_uid, job->req_id, job->pkgid, job->appid,
                        PKGMGR_INSTALLER_START_KEY_STR,
-                       PKGMGR_INSTALLER_APP_DISABLE_EVENT_STR, item->req_type);
+                       PKGMGR_INSTALLER_APP_DISABLE_EVENT_STR, job->req_type);
 
-       ret = __kill_app(item->appid, item->uid);
-       if (ret != PMINFO_R_OK) {
-               __send_app_signal(item->uid, item->req_id, item->pkgid, item->appid,
-                               PKGMGR_INSTALLER_END_KEY_STR, PKGMGR_INSTALLER_FAIL_EVENT_STR,
-                               item->req_type);
+       ret = __kill_app(job->appid, job->target_uid);
+       if (ret != 0) {
+               _send_app_signal(job->target_uid, job->req_id, job->pkgid, job->appid,
+                               PKGMGR_INSTALLER_END_KEY_STR,
+                               PKGMGR_INSTALLER_FAIL_EVENT_STR,
+                               job->req_type);
        }
 
-       ret = pkgmgr_parser_update_app_disable_info_in_usr_db(item->appid, item->uid, 1);
+       ret = pkgmgr_parser_update_app_disable_info_in_usr_db(job->appid,
+                       job->target_uid, 1);
        if (ret != PMINFO_R_OK)
-               __send_app_signal(item->uid, item->req_id, item->pkgid, item->appid,
-                               PKGMGR_INSTALLER_END_KEY_STR, PKGMGR_INSTALLER_FAIL_EVENT_STR,
-                               item->req_type);
+               _send_app_signal(job->target_uid, job->req_id, job->pkgid, job->appid,
+                               PKGMGR_INSTALLER_END_KEY_STR,
+                               PKGMGR_INSTALLER_FAIL_EVENT_STR,
+                               job->req_type);
        else
-               __send_app_signal(item->uid, item->req_id, item->pkgid, item->appid,
-                               PKGMGR_INSTALLER_END_KEY_STR, PKGMGR_INSTALLER_OK_EVENT_STR,
-                               item->req_type);
+               _send_app_signal(job->target_uid, job->req_id, job->pkgid, job->appid,
+                               PKGMGR_INSTALLER_END_KEY_STR,
+                               PKGMGR_INSTALLER_OK_EVENT_STR,
+                               job->req_type);
 
        return ret;
 }
 
-static int __process_enable_global_app_for_uid(pm_dbus_msg *item)
+static int __process_enable_global_app_for_uid(struct backend_job *job)
 {
        int ret = -1;
        bool is_global = true;
 
-       /* get actual pkgid and replace it to appid which is currently stored at pkgid variable */
-       ret = __change_item_info(item, item->uid, &is_global);
-       if (ret != PMINFO_R_OK || strlen(item->appid) == 0) {
-               __send_app_signal(item->uid, item->req_id, item->pkgid, item->pkgid,
+       /* get actual pkgid and replace it to appid which is currently stored
+        * at pkgid variable
+        */
+       ret = __change_job_info(job, job->target_uid, &is_global);
+       if (ret != PMINFO_R_OK || strlen(job->appid) == 0) {
+               _send_app_signal(job->target_uid, job->req_id, job->pkgid, job->pkgid,
                                PKGMGR_INSTALLER_START_KEY_STR,
-                               PKGMGR_INSTALLER_GLOBAL_APP_ENABLE_FOR_UID, item->req_type);
-               __send_app_signal(item->uid, item->req_id, item->pkgid, item->pkgid,
-                               PKGMGR_INSTALLER_END_KEY_STR, PKGMGR_INSTALLER_FAIL_EVENT_STR,
-                               item->req_type);
+                               PKGMGR_INSTALLER_GLOBAL_APP_ENABLE_FOR_UID,
+                               job->req_type);
+               _send_app_signal(job->target_uid, job->req_id, job->pkgid, job->pkgid,
+                               PKGMGR_INSTALLER_END_KEY_STR,
+                               PKGMGR_INSTALLER_FAIL_EVENT_STR,
+                               job->req_type);
                return ret;
        }
 
-       __send_app_signal(item->uid, item->req_id, item->pkgid, item->appid,
+       _send_app_signal(job->target_uid, job->req_id, job->pkgid, job->appid,
                        PKGMGR_INSTALLER_START_KEY_STR,
-                       PKGMGR_INSTALLER_GLOBAL_APP_ENABLE_FOR_UID, item->req_type);
+                       PKGMGR_INSTALLER_GLOBAL_APP_ENABLE_FOR_UID,
+                       job->req_type);
 
-       ret = pkgmgr_parser_update_global_app_disable_for_uid_info_in_db(item->appid, item->uid, 0);
+       ret = pkgmgr_parser_update_global_app_disable_for_uid_info_in_db(
+                       job->appid, job->target_uid, 0);
        if (ret != PMINFO_R_OK)
-               __send_app_signal(item->uid, item->req_id, item->pkgid, item->appid,
-                               PKGMGR_INSTALLER_END_KEY_STR, PKGMGR_INSTALLER_FAIL_EVENT_STR,
-                               item->req_type);
+               _send_app_signal(job->target_uid, job->req_id, job->pkgid, job->appid,
+                               PKGMGR_INSTALLER_END_KEY_STR,
+                               PKGMGR_INSTALLER_FAIL_EVENT_STR,
+                               job->req_type);
        else
-               __send_app_signal(item->uid, item->req_id, item->pkgid, item->appid,
-                               PKGMGR_INSTALLER_END_KEY_STR, PKGMGR_INSTALLER_OK_EVENT_STR,
-                               item->req_type);
+               _send_app_signal(job->target_uid, job->req_id, job->pkgid, job->appid,
+                               PKGMGR_INSTALLER_END_KEY_STR,
+                               PKGMGR_INSTALLER_OK_EVENT_STR,
+                               job->req_type);
 
        return ret;
 }
 
-static int __process_disable_global_app_for_uid(pm_dbus_msg *item)
+static int __process_disable_global_app_for_uid(struct backend_job *job)
 {
        int ret = -1;
        bool is_global = true;
 
-       /* get actual pkgid and replace it to appid which is currently stored at pkgid variable */
-       ret = __change_item_info(item, GLOBAL_USER, &is_global);
-       if (ret != PMINFO_R_OK || strlen(item->appid) == 0) {
-               __send_app_signal(item->uid, item->req_id,
-                               item->pkgid, item->pkgid,
+       /* get actual pkgid and replace it to appid which is currently stored
+        * at pkgid variable
+        */
+       ret = __change_job_info(job, GLOBAL_USER, &is_global);
+       if (ret != PMINFO_R_OK || strlen(job->appid) == 0) {
+               _send_app_signal(job->target_uid, job->req_id,
+                               job->pkgid, job->pkgid,
                                PKGMGR_INSTALLER_START_KEY_STR,
-                               PKGMGR_INSTALLER_GLOBAL_APP_DISABLE_FOR_UID, item->req_type);
-               __send_app_signal(item->uid, item->req_id, item->pkgid, item->pkgid,
-                               PKGMGR_INSTALLER_END_KEY_STR, PKGMGR_INSTALLER_FAIL_EVENT_STR,
-                               item->req_type);
+                               PKGMGR_INSTALLER_GLOBAL_APP_DISABLE_FOR_UID,
+                               job->req_type);
+               _send_app_signal(job->target_uid, job->req_id, job->pkgid, job->pkgid,
+                               PKGMGR_INSTALLER_END_KEY_STR,
+                               PKGMGR_INSTALLER_FAIL_EVENT_STR,
+                               job->req_type);
                return ret;
        }
 
-       __send_app_signal(item->uid, item->req_id,
-                       item->pkgid, item->appid,
+       _send_app_signal(job->target_uid, job->req_id,
+                       job->pkgid, job->appid,
                        PKGMGR_INSTALLER_START_KEY_STR,
-                       PKGMGR_INSTALLER_GLOBAL_APP_DISABLE_FOR_UID, item->req_type);
+                       PKGMGR_INSTALLER_GLOBAL_APP_DISABLE_FOR_UID,
+                       job->req_type);
 
-       ret = __kill_app(item->appid, item->uid);
-       ret = pkgmgr_parser_update_global_app_disable_for_uid_info_in_db(item->appid,
-               item->uid, 1);
+       ret = __kill_app(job->appid, job->target_uid);
+       ret = pkgmgr_parser_update_global_app_disable_for_uid_info_in_db(
+                       job->appid, job->target_uid, 1);
 
        if (ret != PMINFO_R_OK)
-               __send_app_signal(item->uid, item->req_id, item->pkgid, item->appid,
-                               PKGMGR_INSTALLER_END_KEY_STR, PKGMGR_INSTALLER_FAIL_EVENT_STR,
-                               item->req_type);
+               _send_app_signal(job->target_uid, job->req_id, job->pkgid, job->appid,
+                               PKGMGR_INSTALLER_END_KEY_STR,
+                               PKGMGR_INSTALLER_FAIL_EVENT_STR,
+                               job->req_type);
        else
-               __send_app_signal(item->uid, item->req_id, item->pkgid, item->appid,
-                               PKGMGR_INSTALLER_END_KEY_STR, PKGMGR_INSTALLER_OK_EVENT_STR,
-                               item->req_type);
+               _send_app_signal(job->target_uid, job->req_id, job->pkgid, job->appid,
+                               PKGMGR_INSTALLER_END_KEY_STR,
+                               PKGMGR_INSTALLER_OK_EVENT_STR,
+                               job->req_type);
 
        return ret;
 }
 
-static int __process_getsize(pm_dbus_msg *item)
+static int __process_getsize(struct backend_job *job)
 {
-       static const char *backend_cmd = "/usr/bin/pkg_getsize";
+       static const char backend_cmd[] = "/usr/bin/pkg_getsize";
        char **argv;
        char args[MAX_PKG_ARGS_LEN];
        int pid;
 
-       snprintf(args, sizeof(args), "%s %s %s -k %s", backend_cmd, item->pkgid,
-                       item->args, item->req_id);
+       snprintf(args, sizeof(args), "%s %s %s %d -k %s -u %d",
+                       backend_cmd, job->pkgid, job->args, job->caller_uid,
+                       job->req_id, job->target_uid);
        argv = __generate_argv(args);
-       pid = __fork_and_exec_with_args(argv, item->uid);
+       pid = __fork_and_exec_with_args(argv, APPFW_UID);
 
        g_strfreev(argv);
 
        return pid;
 }
 
-static int __process_cleardata(pm_dbus_msg *item)
+static int __process_getsize_sync(struct backend_job *job)
 {
-       char *backend_cmd;
+       static const char backend_cmd[] = "/usr/bin/pkg_getsize";
        char **argv;
        char args[MAX_PKG_ARGS_LEN];
+       char fifo_path[PATH_MAX];
        int pid;
 
-       backend_cmd = _get_backend_cmd(item->pkg_type);
-       if (backend_cmd == NULL)
-               return -1;
+       snprintf(fifo_path, sizeof(fifo_path), "/tmp/pkgmgr/%s",
+                       job->req_id);
 
-       /* TODO: set movetype */
-       snprintf(args, sizeof(args), "%s -k %s -c %s -u %d", backend_cmd,
-                       item->req_id, item->pkgid, (int)item->uid);
-       argv = __generate_argv(args);
+       job->extra = calloc(1, sizeof(struct job_extra_info));
+       if (!job->extra) {
+               ERR("memory alloc failed");
+               goto error;
+       }
 
+       job->extra->getsize_fifo = strdup(fifo_path);
+       if (!job->extra->getsize_fifo) {
+               ERR("out of memory");
+               goto error;
+       }
+
+       if (mkfifo(job->extra->getsize_fifo, 0600) < 0) {
+               ERR("failed to mkfifo");
+               goto error;
+       }
+
+       snprintf(args, sizeof(args), "%s %s %s %d -k %s -u %d --sync",
+                       backend_cmd, job->pkgid, job->args, job->caller_uid,
+                       job->req_id, job->target_uid);
+       argv = __generate_argv(args);
        pid = __fork_and_exec_with_args(argv, APPFW_UID);
 
        g_strfreev(argv);
-       free(backend_cmd);
+
+       if (pid < 0) {
+               ERR("failed to execute backend");
+               goto error;
+       }
+       if (__setup_size_info_io(job) < 0) {
+               ERR("failed to setup io handler");
+               goto error;
+       }
 
        return pid;
+
+error:
+       _return_value_to_caller(job->req_id,
+               g_variant_new("(ix)", PKGMGR_R_ERROR, -1));
+       return -1;
 }
 
-static int __process_clearcache(pm_dbus_msg *item)
+static int __process_cleardata(struct backend_job *job)
 {
-       static const char *backend_cmd = "/usr/bin/pkg_clearcache";
+       static const char *backend_cmd = "/usr/bin/pkg_cleardata";
        char **argv;
        char args[MAX_PKG_ARGS_LEN];
        int pid;
 
-       snprintf(args, sizeof(args), "%s %s", backend_cmd, item->pkgid);
+       if ((int)job->target_uid < REGULAR_USER)
+               return -1;
+
+       snprintf(args, sizeof(args), "%s -d -n %s -u %d",
+                       backend_cmd, job->pkgid, job->target_uid);
        argv = __generate_argv(args);
-       pid = __fork_and_exec_with_args(argv, item->uid);
+       pid = __fork_and_exec_with_args(argv, APPFW_UID);
 
        g_strfreev(argv);
+       return pid;
+}
 
+static int __process_clearcache(struct backend_job *job)
+{
+       static const char *backend_cmd = "/usr/bin/pkg_cleardata";
+       char **argv;
+       char args[MAX_PKG_ARGS_LEN];
+       int pid;
+
+       if ((int)job->target_uid < REGULAR_USER)
+               return -1;
+
+       snprintf(args, sizeof(args), "%s -c -n %s -u %d",
+                       backend_cmd, job->pkgid, job->target_uid);
+       argv = __generate_argv(args);
+       pid = __fork_and_exec_with_args(argv, APPFW_UID);
+
+       g_strfreev(argv);
        return pid;
 }
 
-static int __process_kill(pm_dbus_msg *item)
+static int __process_kill(struct backend_job *job)
 {
        int ret;
        pkgmgrinfo_pkginfo_h handle;
-       pkgcmd_data *pdata = NULL;
+       pkgcmd_data *pdata;
 
-       ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(item->pkgid, item->uid,
+       ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(job->pkgid, job->target_uid,
                        &handle);
        if (ret < 0) {
                ERR("Failed to get handle");
+               _return_value_to_caller(job->req_id,
+                               g_variant_new("(ii)", PKGMGR_R_ERROR, 0));
                return -1;
        }
 
        pdata = calloc(1, sizeof(pkgcmd_data));
        if (pdata == NULL) {
                ERR("memory alloc failed");
+               _return_value_to_caller(job->req_id,
+                               g_variant_new("(ii)", PKGMGR_R_ENOMEM, 0));
                return -1;
        }
        pdata->cmd = strdup("kill");
        if (pdata->cmd == NULL) {
                ERR("out of memory");
+               _return_value_to_caller(job->req_id,
+                               g_variant_new("(ii)", PKGMGR_R_ENOMEM, 0));
                free(pdata);
-               pdata = NULL;
                return -1;
        }
-       pdata->uid = item->uid;
+       pdata->uid = job->target_uid;
        ret = pkgmgrinfo_appinfo_get_usr_list(handle, PMINFO_ALL_APP,
-                       __pkgcmd_app_cb, pdata, item->uid);
+                       __pkgcmd_app_cb, pdata, job->target_uid);
+
+       _return_value_to_caller(job->req_id,
+                       g_variant_new("(ii)", PKGMGR_R_OK, pdata->pid));
+
        free(pdata->cmd);
        free(pdata);
-       pdata = NULL;
        pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
        if (ret < 0) {
                ERR("pkgmgrinfo_appinfo_get_list() failed");
@@ -1176,37 +1240,45 @@ static int __process_kill(pm_dbus_msg *item)
        return 0;
 }
 
-static int __process_check(pm_dbus_msg *item)
+static int __process_check(struct backend_job *job)
 {
        int ret;
        pkgmgrinfo_pkginfo_h handle;
-       pkgcmd_data *pdata = NULL;
+       pkgcmd_data *pdata;
 
-       ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(item->pkgid, item->uid,
+       ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(job->pkgid, job->target_uid,
                        &handle);
        if (ret < 0) {
                ERR("Failed to get handle");
+               _return_value_to_caller(job->req_id,
+                               g_variant_new("(ii)", PKGMGR_R_ERROR, 0));
                return -1;
        }
 
        pdata = calloc(1, sizeof(pkgcmd_data));
        if (pdata == NULL) {
                ERR("memory alloc failed");
+               _return_value_to_caller(job->req_id,
+                               g_variant_new("(ii)", PKGMGR_R_ENOMEM, 0));
                return -1;
        }
        pdata->cmd = strdup("check");
        if (pdata->cmd == NULL) {
                ERR("out of memory");
+               _return_value_to_caller(job->req_id,
+                               g_variant_new("(ii)", PKGMGR_R_ENOMEM, 0));
                free(pdata);
-               pdata = NULL;
                return -1;
        }
-       pdata->uid = item->uid;
+       pdata->uid = job->target_uid;
        ret = pkgmgrinfo_appinfo_get_usr_list(handle, PMINFO_ALL_APP,
-                       __pkgcmd_app_cb, pdata, item->uid);
+                       __pkgcmd_app_cb, pdata, job->target_uid);
+
+       _return_value_to_caller(job->req_id,
+                       g_variant_new("(ii)", PKGMGR_R_OK, pdata->pid));
+
        free(pdata->cmd);
        free(pdata);
-       pdata = NULL;
        pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
        if (ret < 0) {
                ERR("pkgmgrinfo_appinfo_get_list() failed");
@@ -1216,7 +1288,7 @@ static int __process_check(pm_dbus_msg *item)
        return 0;
 }
 
-static int __process_generate_license_request(pm_dbus_msg *item)
+static int __process_generate_license_request(struct backend_job *job)
 {
        int ret;
        char *resp_data;
@@ -1225,7 +1297,7 @@ static int __process_generate_license_request(pm_dbus_msg *item)
        char license_url[MAX_PKG_ARGS_LEN];
        unsigned int license_url_len;
 
-       resp_data = item->args;
+       resp_data = job->args;
        req_data_len = sizeof(req_data);
        license_url_len = sizeof(license_url);
 
@@ -1233,353 +1305,329 @@ static int __process_generate_license_request(pm_dbus_msg *item)
                        req_data, &req_data_len, license_url, &license_url_len);
        if (ret != TADC_SUCCESS) {
                ERR("drm_tizen_generate_license_request failed: %d", ret);
-               __return_value_to_caller(item->req_id, g_variant_new("(iss)",
+               _return_value_to_caller(job->req_id, g_variant_new("(iss)",
                                        PKGMGR_R_ESYSTEM, "", ""));
                return -1;
        }
 
-       __return_value_to_caller(item->req_id,
+       _return_value_to_caller(job->req_id,
                        g_variant_new("(iss)", PKGMGR_R_OK, req_data,
                                license_url));
 
        return 0;
 }
 
-static int __process_register_license(pm_dbus_msg *item)
+static int __process_register_license(struct backend_job *job)
 {
        int ret;
        char *resp_data;
 
-       resp_data = item->args;
+       resp_data = job->args;
 
        ret = drm_tizen_register_license(resp_data, strlen(resp_data));
        if (ret != TADC_SUCCESS) {
                ERR("drm_tizen_register_license failed: %d", ret);
-               __return_value_to_caller(item->req_id,
+               _return_value_to_caller(job->req_id,
                                g_variant_new("(i)", PKGMGR_R_ESYSTEM));
                return -1;
        }
 
-       __return_value_to_caller(item->req_id,
+       _return_value_to_caller(job->req_id,
                        g_variant_new("(i)", PKGMGR_R_OK));
 
        return 0;
 }
 
-static int __process_decrypt_package(pm_dbus_msg *item)
+static int __process_decrypt_package(struct backend_job *job)
 {
        int ret;
        char *drm_file_path;
        char *decrypted_file_path;
 
-       drm_file_path = item->pkgid;
-       decrypted_file_path = item->args;
+       drm_file_path = job->pkgid;
+       decrypted_file_path = job->args;
 
        /* TODO: check ownership of decrypted file */
        ret = drm_tizen_decrypt_package(drm_file_path, strlen(drm_file_path),
                        decrypted_file_path, strlen(decrypted_file_path));
        if (ret != TADC_SUCCESS) {
                ERR("drm_tizen_register_license failed: %d", ret);
-               __return_value_to_caller(item->req_id,
+               _return_value_to_caller(job->req_id,
                                g_variant_new("(i)", PKGMGR_R_ESYSTEM));
                return -1;
        }
 
-       __return_value_to_caller(item->req_id,
+       _return_value_to_caller(job->req_id,
                        g_variant_new("(i)", PKGMGR_R_OK));
 
        return 0;
 }
 
-static int __process_update_app_splash_screen(pm_dbus_msg *item, int flag)
+static int __process_update_app_splash_screen(struct backend_job *job, int flag)
 {
        int ret;
        bool is_global = false;
        const char *val;
 
-       ret = __change_item_info(item, item->uid, &is_global);
-       if (ret != PMINFO_R_OK || strlen(item->appid) == 0)
+       ret = __change_job_info(job, job->target_uid, &is_global);
+       if (ret != PMINFO_R_OK || strlen(job->appid) == 0)
                return -1;
 
        val = flag ? PKGMGR_INSTALLER_APP_ENABLE_SPLASH_SCREEN_EVENT_STR :
                PKGMGR_INSTALLER_APP_DISABLE_SPLASH_SCREEN_EVENT_STR;
-       __send_app_signal(item->uid, item->req_id, item->pkgid, item->appid,
-                       PKGMGR_INSTALLER_START_KEY_STR, val, item->req_type);
+       _send_app_signal(job->target_uid, job->req_id, job->pkgid, job->appid,
+                       PKGMGR_INSTALLER_START_KEY_STR, val, job->req_type);
 
        if (is_global)
-               ret = pkgmgr_parser_update_global_app_splash_screen_display_info_in_usr_db(
-                               item->appid, item->uid, flag);
+               ret = pkgmgr_parser_update_global_app_splash_screen_display_info_in_usr_db(job->appid, job->target_uid, flag);
        else
                ret = pkgmgr_parser_update_app_splash_screen_display_info_in_usr_db(
-                       item->appid, item->uid, flag);
+                       job->appid, job->target_uid, flag);
        if (ret != PMINFO_R_OK)
-               __send_app_signal(item->uid, item->req_id, item->pkgid,
-                               item->appid, PKGMGR_INSTALLER_END_KEY_STR,
+               _send_app_signal(job->target_uid, job->req_id, job->pkgid,
+                               job->appid, PKGMGR_INSTALLER_END_KEY_STR,
                                PKGMGR_INSTALLER_FAIL_EVENT_STR,
-                               item->req_type);
+                               job->req_type);
        else
-               __send_app_signal(item->uid, item->req_id, item->pkgid,
-                               item->appid, PKGMGR_INSTALLER_END_KEY_STR,
+               _send_app_signal(job->target_uid, job->req_id, job->pkgid,
+                               job->appid, PKGMGR_INSTALLER_END_KEY_STR,
                                PKGMGR_INSTALLER_OK_EVENT_STR,
-                               item->req_type);
+                               job->req_type);
 
        return ret;
 }
 
-static int __process_set_restriction_mode(pm_dbus_msg *item)
+static int __process_set_restriction_mode(struct backend_job *job)
 {
        int ret;
        int mode;
 
-       mode = atoi(item->args);
-       ret = _restriction_mode_set(item->uid, item->pkgid, mode);
+       mode = atoi(job->args);
+       ret = _set_restriction_mode(job->target_uid, job->pkgid, mode);
 
-       __return_value_to_caller(item->req_id,
+       _return_value_to_caller(job->req_id,
                        g_variant_new("(i)", ret));
 
        return ret;
 }
 
-static int __process_unset_restriction_mode(pm_dbus_msg *item)
+static int __process_unset_restriction_mode(struct backend_job *job)
 {
        int ret;
        int mode;
 
-       mode = atoi(item->args);
-       ret = _restriction_mode_unset(item->uid, item->pkgid, mode);
+       mode = atoi(job->args);
+       ret = _unset_restriction_mode(job->target_uid, job->pkgid, mode);
 
-       __return_value_to_caller(item->req_id,
+       _return_value_to_caller(job->req_id,
                        g_variant_new("(i)", ret));
 
        return ret;
 }
 
-static int __process_get_restriction_mode(pm_dbus_msg *item)
+static int __process_get_restriction_mode(struct backend_job *job)
 {
        int ret;
        int mode = -1;
 
-       ret = _restriction_mode_get(item->uid, item->pkgid, &mode);
+       ret = _get_restriction_mode(job->target_uid, job->pkgid, &mode);
 
-       __return_value_to_caller(item->req_id,
+       _return_value_to_caller(job->req_id,
                        g_variant_new("(ii)", mode, ret));
 
        return ret;
 }
 
+static int __process_set_app_label(struct backend_job *job)
+{
+       int ret;
+
+       ret = pkgmgr_parser_update_app_label_info_in_usr_db(job->pkgid,
+                       job->target_uid, job->args);
+       _return_value_to_caller(job->req_id, g_variant_new("(i)", ret));
+
+       return ret;
+}
+
+static int __post_process(int ret, int x, struct backend_job *job)
+{
+       if (ret < 0) {
+               __set_backend_free(x);
+               _free_backend_job(job);
+       } else {
+               g_hash_table_insert(backend_info_table, (gpointer)ret,
+                               (gpointer)job);
+       }
+       return 0;
+}
+
 gboolean queue_job(void *data)
 {
-       pm_dbus_msg *item = NULL;
-       backend_info *ptr;
+       struct backend_job *job = NULL;
        int x;
        int ret;
 
        /* Pop a job from queue */
-       for (x = 0, ptr = begin; x < num_of_backends; x++, ptr++) {
+       for (x = 0; x < num_of_backends; x++) {
                if (__is_backend_busy(x))
                        continue;
 
-               item = _pm_queue_pop(x);
-               if (item && item->req_type != -1)
+               job = _pop_queue(x);
+               if (job)
                        break;
-               free(item);
        }
 
        /* all backend messages queue are empty or busy */
-       if (x == num_of_backends)
+       if (x == num_of_backends || job == NULL) {
+               DBG("no job available");
                return FALSE;
+       }
 
-       /*save pkg type and pkg name for future*/
-       strncpy(ptr->req_id, item->req_id, MAX_REQ_ID_LEN - 1);
-       strncpy(ptr->pkgtype, item->pkg_type, MAX_PKG_TYPE_LEN - 1);
-       strncpy(ptr->pkgid, item->pkgid, MAX_PKG_NAME_LEN - 1);
-       strncpy(ptr->args, item->args, MAX_PKG_ARGS_LEN - 1);
-       memset((item->appid), 0, MAX_PKG_NAME_LEN);
-       ptr->uid = item->uid;
-       ptr->req_type = item->req_type;
-       DBG("handle request type [%d]", item->req_type);
+       /* set current backend job */
+       DBG("handle request type [%d]", job->req_type);
 
 #ifdef TIZEN_FEATURE_CSR
-       if (item->req_type == PKGMGR_REQUEST_TYPE_INSTALL ||
-                       item->req_type == PKGMGR_REQUEST_TYPE_MOUNT_INSTALL ||
-                       item->req_type == PKGMGR_REQUEST_TYPE_REINSTALL) {
-               ret = __check_csr(ptr);
+       if (job->req_type == REQUEST_TYPE_INSTALL ||
+                       job->req_type == REQUEST_TYPE_MOUNT_INSTALL ||
+                       job->req_type == REQUEST_TYPE_REINSTALL) {
+               ret = __check_csr(job->pkgid);
                if (ret != 0) {
                        ret = -1;
-                       __send_fail_signal(ptr);
-                       goto end;
+                       _send_fail_signal(job);
+                       _free_backend_job(job);
+                       return TRUE;
                }
        }
 #endif
 
-       switch (item->req_type) {
-       case PKGMGR_REQUEST_TYPE_INSTALL:
+       switch (job->req_type) {
+       case REQUEST_TYPE_INSTALL:
                __set_backend_busy(x);
-               ret = __process_install(item);
+               ret = __process_install(job);
+               __post_process(ret, x, job);
                break;
-       case PKGMGR_REQUEST_TYPE_MOUNT_INSTALL:
+       case REQUEST_TYPE_MOUNT_INSTALL:
                __set_backend_busy(x);
-               ret = __process_mount_install(item);
+               ret = __process_mount_install(job);
+               __post_process(ret, x, job);
                break;
-       case PKGMGR_REQUEST_TYPE_REINSTALL:
+       case REQUEST_TYPE_REINSTALL:
                __set_backend_busy(x);
-               ret = __process_reinstall(item);
+               ret = __process_reinstall(job);
+               __post_process(ret, x, job);
                break;
-       case PKGMGR_REQUEST_TYPE_UNINSTALL:
+       case REQUEST_TYPE_UNINSTALL:
                __set_backend_busy(x);
-               ret = __process_uninstall(item);
+               ret = __process_uninstall(job);
+               __post_process(ret, x, job);
                break;
-       case PKGMGR_REQUEST_TYPE_MOVE:
+       case REQUEST_TYPE_MOVE:
                __set_backend_busy(x);
-               ret = __process_move(item);
+               ret = __process_move(job);
+               __post_process(ret, x, job);
                break;
-       case PKGMGR_REQUEST_TYPE_ENABLE_PKG:
+       case REQUEST_TYPE_ENABLE_PKG:
                __set_backend_busy(x);
-               ret = __process_enable_pkg(item);
+               ret = __process_enable_pkg(job);
+               if (ret < 0)
+                       _send_fail_signal(job);
+               __post_process(ret, x, job);
                break;
-       case PKGMGR_REQUEST_TYPE_DISABLE_PKG:
+       case REQUEST_TYPE_DISABLE_PKG:
                __set_backend_busy(x);
-               ret = __process_disable_pkg(item);
+               ret = __process_disable_pkg(job);
+               if (ret < 0)
+                       _send_fail_signal(job);
+               __post_process(ret, x, job);
                break;
-       case PKGMGR_REQUEST_TYPE_ENABLE_APP:
-               ret = __process_enable_app(item);
+       case REQUEST_TYPE_ENABLE_APP:
+               ret = __process_enable_app(job);
+               _free_backend_job(job);
                break;
-       case PKGMGR_REQUEST_TYPE_DISABLE_APP:
-               ret = __process_disable_app(item);
+       case REQUEST_TYPE_DISABLE_APP:
+               ret = __process_disable_app(job);
+               _free_backend_job(job);
                break;
-       case PKGMGR_REQUEST_TYPE_GETSIZE:
+       case REQUEST_TYPE_GETSIZE:
                __set_backend_busy(x);
-               ret = __process_getsize(item);
+               ret = __process_getsize(job);
+               __post_process(ret, x, job);
                break;
-       case PKGMGR_REQUEST_TYPE_CLEARDATA:
+       case REQUEST_TYPE_GETSIZE_SYNC:
                __set_backend_busy(x);
-               ret = __process_cleardata(item);
+               ret = __process_getsize_sync(job);
+               if (ret < 0)
+                       __free_extra_info(job);
+               __post_process(ret, x, job);
                break;
-       case PKGMGR_REQUEST_TYPE_CLEARCACHE:
+       case REQUEST_TYPE_CLEARDATA:
                __set_backend_busy(x);
-               ret = __process_clearcache(item);
+               ret = __process_cleardata(job);
+               __post_process(ret, x, job);
                break;
-       case PKGMGR_REQUEST_TYPE_ENABLE_GLOBAL_APP_FOR_UID:
-               ret = __process_enable_global_app_for_uid(item);
+       case REQUEST_TYPE_CLEARCACHE:
+               __set_backend_busy(x);
+               ret = __process_clearcache(job);
+               __post_process(ret, x, job);
+               break;
+       case REQUEST_TYPE_ENABLE_GLOBAL_APP_FOR_UID:
+               ret = __process_enable_global_app_for_uid(job);
+               _free_backend_job(job);
                break;
-       case PKGMGR_REQUEST_TYPE_DISABLE_GLOBAL_APP_FOR_UID:
-               ret = __process_disable_global_app_for_uid(item);
+       case REQUEST_TYPE_DISABLE_GLOBAL_APP_FOR_UID:
+               ret = __process_disable_global_app_for_uid(job);
+               _free_backend_job(job);
                break;
-       case PKGMGR_REQUEST_TYPE_KILL:
-               ret = __process_kill(item);
+       case REQUEST_TYPE_KILL:
+               ret = __process_kill(job);
+               _free_backend_job(job);
                break;
-       case PKGMGR_REQUEST_TYPE_CHECK:
-               ret = __process_check(item);
+       case REQUEST_TYPE_CHECK:
+               ret = __process_check(job);
+               _free_backend_job(job);
                break;
-       case PKGMGR_REQUEST_TYPE_GENERATE_LICENSE_REQUEST:
-               ret = __process_generate_license_request(item);
+       case REQUEST_TYPE_GENERATE_LICENSE_REQUEST:
+               ret = __process_generate_license_request(job);
+               _free_backend_job(job);
                break;
-       case PKGMGR_REQUEST_TYPE_REGISTER_LICENSE:
-               ret = __process_register_license(item);
+       case REQUEST_TYPE_REGISTER_LICENSE:
+               ret = __process_register_license(job);
+               _free_backend_job(job);
                break;
-       case PKGMGR_REQUEST_TYPE_DECRYPT_PACKAGE:
-               ret = __process_decrypt_package(item);
+       case REQUEST_TYPE_DECRYPT_PACKAGE:
+               ret = __process_decrypt_package(job);
+               _free_backend_job(job);
                break;
-       case PKGMGR_REQUEST_TYPE_ENABLE_APP_SPLASH_SCREEN:
-               ret = __process_update_app_splash_screen(item, 1);
+       case REQUEST_TYPE_ENABLE_APP_SPLASH_SCREEN:
+               ret = __process_update_app_splash_screen(job, 1);
+               _free_backend_job(job);
                break;
-       case PKGMGR_REQUEST_TYPE_DISABLE_APP_SPLASH_SCREEN:
-               ret = __process_update_app_splash_screen(item, 0);
+       case REQUEST_TYPE_DISABLE_APP_SPLASH_SCREEN:
+               ret = __process_update_app_splash_screen(job, 0);
+               _free_backend_job(job);
                break;
-       case PKGMGR_REQUEST_TYPE_SET_RESTRICTION_MODE:
-               ret = __process_set_restriction_mode(item);
+       case REQUEST_TYPE_SET_RESTRICTION_MODE:
+               ret = __process_set_restriction_mode(job);
+               _free_backend_job(job);
                break;
-       case PKGMGR_REQUEST_TYPE_UNSET_RESTRICTION_MODE:
-               ret = __process_unset_restriction_mode(item);
+       case REQUEST_TYPE_UNSET_RESTRICTION_MODE:
+               ret = __process_unset_restriction_mode(job);
+               _free_backend_job(job);
                break;
-       case PKGMGR_REQUEST_TYPE_GET_RESTRICTION_MODE:
-               ret = __process_get_restriction_mode(item);
+       case REQUEST_TYPE_GET_RESTRICTION_MODE:
+               ret = __process_get_restriction_mode(job);
+               _free_backend_job(job);
+               break;
+       case REQUEST_TYPE_SET_APP_LABEL:
+               ret = __process_set_app_label(job);
+               _free_backend_job(job);
                break;
        default:
                ret = -1;
                break;
        }
 
-#ifdef TIZEN_FEATURE_CSR
-end:
-#endif
-       ptr->pid = ret;
-       free(item);
-
-       return FALSE;
-}
-
-#define IS_WHITESPACE(CHAR) \
-((CHAR == ' ' || CHAR == '\t' || CHAR == '\r' || CHAR == '\n') ? TRUE : FALSE)
-
-void _app_str_trim(char *input)
-{
-       char *trim_str = input;
-
-       if (input == NULL)
-               return;
-
-       while (*input != 0) {
-               if (!IS_WHITESPACE(*input)) {
-                       *trim_str = *input;
-                       trim_str++;
-               }
-               input++;
-       }
-
-       *trim_str = 0;
-       return;
-}
-
-char *_get_backend_cmd(char *type)
-{
-       FILE *fp = NULL;
-       char buffer[1024] = { 0 };
-       char *command = NULL;
-       int size = 0;
-
-       fp = fopen(PKG_CONF_PATH, "r");
-       if (fp == NULL)
-               return NULL;
-
-       char *path = NULL;
-       while (fgets(buffer, 1024, fp) != NULL) {
-               if (buffer[0] == '#')
-                       continue;
-
-               _app_str_trim(buffer);
-
-               if ((path = strstr(buffer, PKG_BACKEND)) != NULL) {
-                       DBG("buffer [%s]", buffer);
-                       path = path + strlen(PKG_BACKEND);
-                       DBG("path [%s]", path);
-
-                       command =
-                           (char *)malloc(sizeof(char) * strlen(path) +
-                                          strlen(type) + 1);
-                       if (command == NULL) {
-                               fclose(fp);
-                               return NULL;
-                       }
-
-                       size = strlen(path) + strlen(type) + 1;
-                       snprintf(command, size, "%s%s", path, type);
-                       command[strlen(path) + strlen(type)] = '\0';
-                       DBG("command [%s]", command);
-
-                       if (fp != NULL)
-                               fclose(fp);
-
-                       return command;
-               }
-
-               memset(buffer, 0x00, 1024);
-       }
-
-       if (fp != NULL)
-               fclose(fp);
-
-       return NULL;            /* cannot find proper command */
+       return TRUE;
 }
 
 int main(int argc, char *argv[])
@@ -1588,9 +1636,9 @@ int main(int argc, char *argv[])
 
        DBG("server start");
 
-       r = _pm_queue_init();
+       r = _init_backend_queue();
        if (r) {
-               DBG("Queue Initialization Failed\n");
+               DBG("Queue Initialization Failed");
                return -1;
        }
 
@@ -1600,7 +1648,7 @@ int main(int argc, char *argv[])
                return -1;
        }
 
-       r = __init_request_handler();
+       r = _init_request_handler();
        if (r) {
                ERR("dbus init failed");
                return -1;
@@ -1625,9 +1673,9 @@ int main(int argc, char *argv[])
        g_main_loop_run(mainloop);
 
        DBG("Quit main loop.");
-       __fini_request_handler();
+       _fini_request_handler();
        __fini_backend_info();
-       _pm_queue_final();
+       _fini_backend_queue();
 
        DBG("package manager server terminated.");