4 * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
6 * Contact: Jayoun Lee <airjany@samsung.com>, Sewook Park <sewook7.park@samsung.com>,
7 * Jaeho Lee <jaeho81.lee@samsung.com>, Shobhit Srivastava <shobhit.s@samsung.com>
9 * Licensed under the Apache License, Version 2.0 (the "License");
10 * you may not use this file except in compliance with the License.
11 * You may obtain a copy of the License at
13 * http://www.apache.org/licenses/LICENSE-2.0
15 * Unless required by applicable law or agreed to in writing, software
16 * distributed under the License is distributed on an "AS IS" BASIS,
17 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18 * See the License for the specific language governing permissions and
19 * limitations under the License.
29 #include <sys/types.h>
32 #include <sys/types.h>
33 #include <sys/signalfd.h>
44 #include <pkgmgr-info.h>
45 #include <pkgmgr/pkgmgr_parser_db.h>
46 #include <tzplatform_config.h>
47 #include <dd-display.h>
49 #include "pkgmgr_installer.h"
50 #include "pkgmgr-server.h"
52 #include "package-manager.h"
54 #define USRLIB "/usr/lib"
56 #define PATH_LIBDRM_SVC_CORE \
57 "/usr/lib/libdrm-service-core-tizen.so.0"
58 #define PATH_LIBCSR_CLIENT \
59 "/usr/lib/libcsr-client.so.2"
61 #define GLOBAL_USER tzplatform_getuid(TZ_SYS_GLOBALAPP_USER)
65 #define EXT_STORAGE_GROUP 10001
66 #define EXT_STORAGE_APPDATA_GROUP 10002
67 #define MEDIA_STORAGE_GROUP 10502
68 #define ARRAY_SIZE(array) (sizeof(array) / sizeof(array[0]))
69 #define MAX_LONGLONG_LENGTH 32
84 8 bit value to represent maximum 8 backends.
85 Each bit position corresponds to a queue slot which
86 is dynamically determined.
88 static char backend_busy = 0;
89 extern int num_of_backends;
90 bool is_drm_busy = false;
91 static bool is_lock_set = false;
93 static GIOChannel *sio;
95 static GHashTable *backend_info_table;
96 static GMainLoop *mainloop;
98 static int (*_drm_tizen_register_license)
99 (const char *pRespBuf, unsigned int respBufLen);
100 static int (*_drm_tizen_decrypt_package)(const char *pTADCFilepath,
101 int tadcFileLen, const char *pDecryptedFile,
102 int decryptedFileLen);
103 static int (*_drm_tizen_generate_license_request)(const char *pRespBuf,
104 unsigned int respBufLen, char *pReqBuf,
105 unsigned int *pReqBufLen, char *pLicenseUrl,
106 unsigned int *pLicenseUrlLen);
107 static void *drm_lib_handle;
109 static int __check_backend_status_for_exit(void);
110 static int __check_queue_status_for_exit(void);
111 static int __is_backend_busy(int position);
112 static void __set_backend_busy(int position);
113 static void __set_backend_free(int position);
115 gboolean exit_server(void *data);
117 /* To check whether a particular backend is free/busy */
118 static int __is_backend_busy(int position)
120 return backend_busy & (1 << position);
122 /* To set a particular backend as busy */
123 static void __set_backend_busy(int position)
125 backend_busy = backend_busy | (1 << position);
127 /* To set a particular backend as free */
128 static void __set_backend_free(int position)
130 backend_busy = backend_busy & ~(1 << position);
133 static void __set_power_lock(void)
138 if (display_lock_state(LCD_OFF, STAY_CUR_STATE, 0) == 0)
142 static void __release_power_lock(void)
147 if (display_unlock_state(LCD_OFF, PM_SLEEP_MARGIN) == 0)
151 static gboolean getsize_io_handler(GIOChannel *io, GIOCondition cond,
157 char buf[MAX_LONGLONG_LENGTH];
158 long long result = 0;
159 struct backend_job *job = (struct backend_job *)data;
160 struct getsize_sync_extra_info *extra_getsize_info =
161 (struct getsize_sync_extra_info *)job->extra_data;
163 s = g_io_channel_read_chars(io, (gchar *)buf, sizeof(buf), &len, &err);
164 if (s != G_IO_STATUS_NORMAL) {
165 ERR("getsize fd read failed: %s", err->message);
169 if (strlen(buf) == 0) {
177 _return_value_to_caller(job->req_id, g_variant_new("(ix)",
178 (result < 0) ? PKGMGR_R_ERROR : PKGMGR_R_OK, result));
180 unlink(extra_getsize_info->getsize_fifo);
181 free(extra_getsize_info->getsize_fifo);
182 extra_getsize_info->getsize_fifo = NULL;
187 static int __setup_size_info_io(struct backend_job *job)
190 struct getsize_sync_extra_info *extra_getsize_info =
191 (struct getsize_sync_extra_info *)job->extra_data;
193 extra_getsize_info->getsize_fd = open(extra_getsize_info->getsize_fifo,
194 O_RDONLY | O_NONBLOCK);
195 if (extra_getsize_info->getsize_fd < 0) {
196 ERR("failed to open the fifo(%s), errno(%d)",
197 extra_getsize_info->getsize_fifo, errno);
201 extra_getsize_info->getsize_io =
202 g_io_channel_unix_new(extra_getsize_info->getsize_fd);
203 if (!extra_getsize_info->getsize_io)
205 g_io_channel_set_encoding(extra_getsize_info->getsize_io, NULL, NULL);
206 g_io_channel_set_buffered(extra_getsize_info->getsize_io, FALSE);
207 getsize_wid = g_io_add_watch_full(extra_getsize_info->getsize_io,
208 G_PRIORITY_HIGH, G_IO_IN, getsize_io_handler, job, NULL);
210 ERR("failed to add io watch");
217 static gboolean __signal_handler(GIOChannel *io, GIOCondition cond,
223 struct signalfd_siginfo fdsi;
224 struct backend_job *job;
225 struct getsize_sync_extra_info *extra_getsize_info;
229 s = g_io_channel_read_chars(io, (gchar *)&fdsi,
230 sizeof(struct signalfd_siginfo), &len, &err);
231 if (s != G_IO_STATUS_NORMAL || len != sizeof(struct signalfd_siginfo)) {
232 ERR("Signal read failed");
237 while ((pid = waitpid(-1, &status, WNOHANG)) > 0) {
238 job = (struct backend_job *)g_hash_table_lookup(
239 backend_info_table, (gconstpointer)pid);
241 ERR("Unknown child exit");
245 __set_backend_free(job->backend_slot);
246 if (WIFSIGNALED(status)) {
247 _send_fail_signal(job);
248 INFO("backend[%s][%d] exit with signal[%d]",
249 job->backend_type, pid, WTERMSIG(status));
250 } else if (WEXITSTATUS(status)) {
251 INFO("backend[%s][%d] exit with error",
252 job->backend_type, pid);
254 INFO("backend[%s][%d] exit", job->backend_type, pid);
257 if (job->req_type == REQUEST_TYPE_GETSIZE_SYNC &&
260 (struct getsize_sync_extra_info *)job->extra_data;
261 if (extra_getsize_info->getsize_fifo) {
262 ERR("invalid backend close");
263 _return_value_to_caller(job->req_id,
264 g_variant_new("(ix)",
265 PKGMGR_R_ERROR, -1));
268 g_hash_table_remove(backend_info_table, (gconstpointer)pid);
270 g_idle_add(queue_job, NULL);
275 static int __init_backend_info(void)
277 backend_info_table = g_hash_table_new_full(g_direct_hash,
278 g_direct_equal, NULL,
279 (GDestroyNotify)_free_backend_job);
284 static void __fini_backend_info(void)
286 /*Free backend info */
287 g_hash_table_destroy(backend_info_table);
290 static int __register_signal_handler(void)
296 sigaddset(&mask, SIGCHLD);
298 if (sigprocmask(SIG_BLOCK, &mask, NULL) == -1) {
299 ERR("sigprocmask failed");
303 sfd = signalfd(-1, &mask, SFD_NONBLOCK);
305 ERR("signalfd failed");
309 sio = g_io_channel_unix_new(sfd);
310 g_io_channel_set_close_on_unref(sio, TRUE);
311 g_io_channel_set_encoding(sio, NULL, NULL);
312 g_io_channel_set_buffered(sio, FALSE);
313 swid = g_io_add_watch(sio, G_IO_IN, __signal_handler, NULL);
315 g_timeout_add_seconds_full(G_PRIORITY_LOW, 2, exit_server, NULL, NULL);
320 static int __check_backend_status_for_exit(void)
323 for (i = 0; i < num_of_backends; i++) {
324 if (__is_backend_busy(i))
330 static int __check_queue_status_for_exit(void)
333 for (i = 0; i < num_of_backends; i++) {
334 if (_is_queue_empty(i) == 0)
340 gboolean exit_server(void *data)
342 DBG("exit_server Start");
343 if (__check_backend_status_for_exit() &&
344 __check_queue_status_for_exit() && !is_drm_busy) {
345 g_main_loop_quit(mainloop);
347 __release_power_lock();
353 static int __check_csr(const char *path)
359 int (*_csr_cs_context_create)(void **handle);
360 int (*_csr_cs_scan_file)(void *handle, const char *file_path, void **malware);
361 int (*_csr_cs_context_destroy)(void *handle);
363 lib_handle = dlopen(PATH_LIBCSR_CLIENT, RTLD_LAZY);
365 DBG("Unable to open %s", PATH_LIBCSR_CLIENT);
369 _csr_cs_context_create = dlsym(lib_handle, "csr_cs_context_create");
370 _csr_cs_scan_file = dlsym(lib_handle, "csr_cs_scan_file");
371 _csr_cs_context_destroy = dlsym(lib_handle, "csr_cs_context_destroy");
373 if (!_csr_cs_context_create || !_csr_cs_scan_file ||
374 !_csr_cs_context_destroy) {
375 ERR("Failed to load CSR symbols");
380 ret = _csr_cs_context_create(&context);
382 ERR("Failed to create context");
387 ret = _csr_cs_scan_file(context, path, &malware);
389 DBG("CSR result[%d]", ret);
394 ret = _csr_cs_context_destroy(context);
396 ERR("Failed to destroy context");
401 if (malware != NULL) {
402 ERR("CSR denied[%d] installation", path);
413 static int __kill_app(char *appid, uid_t uid)
419 is_running = aul_app_is_running_for_uid(appid, uid);
420 /* app is not running */
424 pid = aul_app_get_pid_for_uid(appid, uid);
428 ret = aul_terminate_pid_for_uid(pid, uid);
429 if (ret != AUL_R_OK) {
430 ERR("failed to terminate app(%d)", appid);
437 static int __check_app(char *appid, uid_t uid)
442 is_running = aul_app_is_running_for_uid(appid, uid);
446 pid = aul_app_get_pid_for_uid(appid, uid);
451 static int __pkgcmd_app_cb(const pkgmgrinfo_appinfo_h handle, void *user_data)
457 pkgcmd_data *pdata = (pkgcmd_data *)user_data;
459 if (handle == NULL) {
460 perror("appinfo handle is NULL\n");
463 ret = pkgmgrinfo_appinfo_get_exec(handle, &exec);
465 perror("Failed to get app exec path\n");
468 ret = pkgmgrinfo_appinfo_get_appid(handle, &appid);
470 perror("Failed to get appid\n");
473 ret = pkgmgrinfo_appinfo_get_pkgid(handle, &pkgid);
475 perror("Failed to get pkgid\n");
479 if (strcmp(pdata->cmd, "kill") == 0) {
480 pdata->pid = __check_app(appid, pdata->uid);
482 ret = __kill_app(appid, pdata->uid);
483 } else if (strcmp(pdata->cmd, "check") == 0) {
484 pdata->pid = __check_app(appid, pdata->uid);
490 void free_user_context(user_ctx *ctx)
497 /* env variable ends by NULL element */
507 int set_environement(user_ctx *ctx)
518 if (ctx->uid != APPFW_UID) {
519 if (setuid(ctx->uid)) {
520 ERR("setuid failed: %d", errno);
524 if (setgid(ctx->gid)) {
525 ERR("setgid failed: %d", errno);
530 n = getgroups(0, NULL);
532 ERR("Failed to get the number of supplementary group IDs");
536 groups = (gid_t *)calloc(1, sizeof(gid_t) * (n + 3));
537 if (groups == NULL) {
538 ERR("out of memory");
542 n = getgroups(n, groups);
544 ERR("Failed to get list of supplementary group IDs");
549 groups[n++] = EXT_STORAGE_GROUP;
550 groups[n++] = EXT_STORAGE_APPDATA_GROUP;
551 groups[n++] = MEDIA_STORAGE_GROUP;
553 if (setgroups(n, groups) < 0) {
554 ERR("setgroups failed: %d", errno);
561 /* env variable ends by NULL element */
563 if (putenv(env[i]) != 0)
570 user_ctx *get_user_context(uid_t uid)
572 /* we can use getpwnam because this is used only after a
573 * fork and just before an execv
574 * No concurrencial call can corrupt the data
575 * returned by getpwuid
577 user_ctx *context_res;
579 char buf[1024] = {0, };
580 struct passwd pwd, *result;
585 ret = getpwuid_r(uid, &pwd, buf, sizeof(buf), &result);
586 if (ret != 0 || result == NULL)
590 context_res = (user_ctx *)malloc(sizeof(user_ctx));
595 env = (char **)malloc(3 * sizeof(char *));
600 /* Build environment context */
601 len = snprintf(NULL, 0, "HOME=%s", pwd.pw_dir);
602 env[0] = (char *)malloc((len + 1) * sizeof(char));
603 if (env[0] == NULL) {
607 snprintf(env[0], len + 1, "HOME=%s", pwd.pw_dir);
608 len = snprintf(NULL, 0, "USER=%s", pwd.pw_name);
609 env[1] = (char *)malloc((len + 1) * sizeof(char));
610 if (env[1] == NULL) {
614 snprintf(env[1], len + 1, "USER=%s", pwd.pw_name);
622 /* env variable ends by NULL element */
623 while (env && env[i]) {
630 context_res->env = env;
631 context_res->uid = uid;
632 context_res->gid = pwd.pw_gid;
637 static char **__generate_argv(const char *args)
639 /* Create args vector
640 * req_id + pkgid + args
642 * vector size = # of args +
643 *(req_id + pkgid + NULL termination = 3)
644 * Last value must be NULL for execv.
652 ret_parse = g_shell_parse_argv(args, &argcp, &argvp, &gerr);
653 if (FALSE == ret_parse) {
654 ERR("Failed to split args: %s", args);
655 ERR("messsage: %s", gerr->message);
660 for (i = 0; i < argcp; i++)
661 DBG(">>>>>> argsv[%d]=%s", i, argvp[i]);
666 void __set_environment(gpointer user_data)
668 user_ctx *ctx = (user_ctx *)user_data;
670 if (set_environement(ctx))
671 ERR("Failed to set env for the user : %d", ctx->uid);
674 static int __fork_and_exec_with_args(char **argv, uid_t uid)
676 user_ctx *user_context;
677 GError *error = NULL;
681 user_context = get_user_context(uid);
683 ERR("Failed to getenv");
687 ret = g_spawn_async(NULL, argv, NULL, G_SPAWN_DO_NOT_REAP_CHILD,
688 __set_environment, (gpointer)user_context, &pid,
691 ERR("Failed to excute backend: %s", error->message);
693 free_user_context(user_context);
697 free_user_context(user_context);
702 static int __change_job_info(struct backend_job *job, uid_t uid,
707 pkgmgrinfo_appinfo_h handle = NULL;
708 if (job->req_type != REQUEST_TYPE_DISABLE_APP &&
709 job->req_type != REQUEST_TYPE_DISABLE_GLOBAL_APP_FOR_UID &&
710 job->req_type != REQUEST_TYPE_ENABLE_APP_SPLASH_SCREEN &&
711 job->req_type != REQUEST_TYPE_DISABLE_APP_SPLASH_SCREEN &&
712 job->req_type != REQUEST_TYPE_ENABLE_APP &&
713 job->req_type != REQUEST_TYPE_ENABLE_GLOBAL_APP_FOR_UID)
714 return PMINFO_R_ERROR;
716 ret = pkgmgrinfo_appinfo_get_usr_all_appinfo(job->pkgid, uid, &handle);
717 if (ret != PMINFO_R_OK)
718 return PMINFO_R_ERROR;
720 ret = pkgmgrinfo_appinfo_is_global(handle, is_global);
721 if (ret != PMINFO_R_OK)
724 if ((job->req_type == REQUEST_TYPE_DISABLE_GLOBAL_APP_FOR_UID ||
726 REQUEST_TYPE_ENABLE_GLOBAL_APP_FOR_UID) &&
728 ret = PMINFO_R_ERROR;
732 ret = pkgmgrinfo_appinfo_get_pkgid(handle, &pkgid);
733 if (ret != PMINFO_R_OK)
737 job->appid = strdup(job->pkgid);
739 job->pkgid = strdup(pkgid);
742 pkgmgrinfo_appinfo_destroy_appinfo(handle);
747 static int __process_install(struct backend_job *job)
751 char args[MAX_PKG_ARGS_LEN];
756 backend_cmd = job->backend_path;
757 if (backend_cmd == NULL)
760 req_id = g_shell_quote(job->req_id);
761 pkgid = g_shell_quote(job->pkgid);
762 if (!req_id || !pkgid)
765 snprintf(args, sizeof(args), "%s -k %s -i %s -u %d %s", backend_cmd,
766 req_id, pkgid, (int)job->target_uid, job->args);
768 argv = __generate_argv(args);
770 pid = __fork_and_exec_with_args(argv, APPFW_UID);
778 static int __process_mount_install(struct backend_job *job)
782 char args[MAX_PKG_ARGS_LEN];
787 backend_cmd = job->backend_path;
788 if (backend_cmd == NULL)
791 req_id = g_shell_quote(job->req_id);
792 pkgid = g_shell_quote(job->pkgid);
793 if (!req_id || !pkgid)
796 snprintf(args, sizeof(args), "%s -k %s -w %s -u %d %s", backend_cmd,
797 req_id, pkgid, (int)job->target_uid, job->args);
799 argv = __generate_argv(args);
801 pid = __fork_and_exec_with_args(argv, APPFW_UID);
809 static int __process_reinstall(struct backend_job *job)
813 char args[MAX_PKG_ARGS_LEN];
818 backend_cmd = job->backend_path;
819 if (backend_cmd == NULL)
822 req_id = g_shell_quote(job->req_id);
823 pkgid = g_shell_quote(job->pkgid);
824 if (!req_id || !pkgid)
827 snprintf(args, sizeof(args), "%s -k %s -r %s -u %d", backend_cmd,
828 req_id, pkgid, (int)job->target_uid);
829 argv = __generate_argv(args);
831 pid = __fork_and_exec_with_args(argv, APPFW_UID);
840 static int __process_uninstall(struct backend_job *job)
844 char args[MAX_PKG_ARGS_LEN];
847 backend_cmd = job->backend_path;
848 if (backend_cmd == NULL)
851 snprintf(args, sizeof(args), "%s -k %s -d %s -u %d", backend_cmd,
852 job->req_id, job->pkgid, (int)job->target_uid);
853 argv = __generate_argv(args);
855 pid = __fork_and_exec_with_args(argv, APPFW_UID);
862 static int __process_move(struct backend_job *job)
866 char args[MAX_PKG_ARGS_LEN];
869 backend_cmd = job->backend_path;
870 if (backend_cmd == NULL)
873 snprintf(args, sizeof(args), "%s -k %s -m %s -u %d -t %s", backend_cmd,
874 job->req_id, job->pkgid, (int)job->target_uid, job->args);
875 argv = __generate_argv(args);
877 pid = __fork_and_exec_with_args(argv, APPFW_UID);
884 static int __process_enable_pkg(struct backend_job *job)
888 char args[MAX_PKG_ARGS_LEN];
889 pkgmgrinfo_pkginfo_h pkginfo_h;
895 backend_cmd = job->backend_path;
896 if (backend_cmd == NULL)
899 ret = pkgmgrinfo_pkginfo_get_usr_disabled_pkginfo(
900 job->pkgid, job->target_uid, &pkginfo_h);
901 if (ret != PMINFO_R_OK) {
902 ERR("Failed to get appinfo");
906 ret = pkgmgrinfo_pkginfo_is_global(pkginfo_h, &is_global);
907 if (ret != PMINFO_R_OK) {
908 ERR("Failed to get global value");
909 pkgmgrinfo_pkginfo_destroy_pkginfo(pkginfo_h);
913 if ((is_global && job->target_uid != GLOBAL_USER) ||
914 (!is_global && job->target_uid == GLOBAL_USER)) {
915 ERR("Invalid attempt to enable pkg");
916 pkgmgrinfo_pkginfo_destroy_pkginfo(pkginfo_h);
920 ret = pkgmgrinfo_pkginfo_is_readonly(pkginfo_h, &is_readonly);
921 if (ret != PMINFO_R_OK) {
922 ERR("Failed to get readonly value");
923 pkgmgrinfo_pkginfo_destroy_pkginfo(pkginfo_h);
927 snprintf(args, sizeof(args), "%s -k %s -u %d -A %s %s",
928 backend_cmd, job->req_id, (int)job->target_uid,
929 job->pkgid, (is_readonly) ? "--preload" : "");
930 argv = __generate_argv(args);
931 pid = __fork_and_exec_with_args(argv, APPFW_UID);
934 pkgmgrinfo_pkginfo_destroy_pkginfo(pkginfo_h);
939 static int __process_disable_pkg(struct backend_job *job)
943 char args[MAX_PKG_ARGS_LEN];
944 pkgmgrinfo_pkginfo_h pkginfo_h;
950 backend_cmd = job->backend_path;
951 if (backend_cmd == NULL)
954 ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(
955 job->pkgid, job->target_uid, &pkginfo_h);
956 if (ret != PMINFO_R_OK) {
957 ERR("Failed to get appinfo");
961 ret = pkgmgrinfo_pkginfo_is_global(pkginfo_h, &is_global);
962 if (ret != PMINFO_R_OK) {
963 ERR("Failed to get global value");
964 pkgmgrinfo_pkginfo_destroy_pkginfo(pkginfo_h);
968 if ((is_global && job->target_uid != GLOBAL_USER) ||
969 (!is_global && job->target_uid == GLOBAL_USER)) {
970 ERR("Invalid attempt to disable pkg");
971 pkgmgrinfo_pkginfo_destroy_pkginfo(pkginfo_h);
975 ret = pkgmgrinfo_pkginfo_is_readonly(pkginfo_h, &is_readonly);
976 if (ret != PMINFO_R_OK) {
977 ERR("Failed to get readonly value");
978 pkgmgrinfo_pkginfo_destroy_pkginfo(pkginfo_h);
982 snprintf(args, sizeof(args), "%s -k %s -u %d -D %s %s",
983 backend_cmd, job->req_id, (int)job->target_uid,
984 job->pkgid, (is_readonly) ? "--preload" : "");
985 argv = __generate_argv(args);
987 pid = __fork_and_exec_with_args(argv, APPFW_UID);
991 pkgmgrinfo_pkginfo_destroy_pkginfo(pkginfo_h);
995 static int __process_register_pkg_update_info(struct backend_job *job)
999 if (!job->extra_data) {
1000 _return_value_to_caller(job->req_id,
1001 g_variant_new("(i)", PKGMGR_R_ESYSTEM));
1005 ret = pkgmgr_parser_register_pkg_update_info_in_usr_db(
1006 (pkgmgrinfo_updateinfo_h)job->extra_data, job->target_uid);
1007 if (ret == PMINFO_R_OK)
1008 _return_value_to_caller(job->req_id,
1009 g_variant_new("(i)", PKGMGR_R_OK));
1011 _return_value_to_caller(job->req_id,
1012 g_variant_new("(i)", PKGMGR_R_ESYSTEM));
1014 pkgmgrinfo_updateinfo_destroy(job->extra_data);
1015 job->extra_data = NULL;
1020 static int __process_unregister_pkg_update_info(struct backend_job *job)
1022 int ret = pkgmgr_parser_unregister_pkg_update_info_in_usr_db
1023 (job->pkgid, job->target_uid);
1025 if (ret == PMINFO_R_OK)
1026 _return_value_to_caller(job->req_id,
1027 g_variant_new("(i)", PKGMGR_R_OK));
1029 _return_value_to_caller(job->req_id,
1030 g_variant_new("(i)", PKGMGR_R_ESYSTEM));
1034 static int __process_unregister_all_pkg_update_info(struct backend_job *job)
1036 int ret = pkgmgr_parser_unregister_all_pkg_update_info_in_usr_db(
1039 if (ret != PMINFO_R_OK) {
1040 _return_value_to_caller(job->req_id,
1041 g_variant_new("(i)", PKGMGR_R_ESYSTEM));
1045 if (__is_admin_user(job->caller_uid)) {
1046 ret = pkgmgr_parser_unregister_all_pkg_update_info_in_usr_db(
1048 if (ret != PMINFO_R_OK) {
1049 _return_value_to_caller(job->req_id,
1050 g_variant_new("(i)", PKGMGR_R_ESYSTEM));
1054 _return_value_to_caller(job->req_id,
1055 g_variant_new("(i)", PKGMGR_R_OK));
1060 static int __process_enable_app(struct backend_job *job)
1063 bool is_global = false;
1065 /* get actual pkgid and replace it to appid which is currently stored
1068 ret = __change_job_info(job, job->target_uid, &is_global);
1069 if (ret != PMINFO_R_OK || strlen(job->appid) == 0) {
1070 _send_app_signal(job->target_uid, job->req_id, job->pkgid, job->pkgid,
1071 PKGMGR_INSTALLER_START_KEY_STR,
1072 PKGMGR_INSTALLER_APP_ENABLE_EVENT_STR,
1074 _send_app_signal(job->target_uid, job->req_id, job->pkgid, job->pkgid,
1075 PKGMGR_INSTALLER_END_KEY_STR,
1076 PKGMGR_INSTALLER_FAIL_EVENT_STR,
1081 _send_app_signal(job->target_uid, job->req_id, job->pkgid, job->appid,
1082 PKGMGR_INSTALLER_START_KEY_STR,
1083 PKGMGR_INSTALLER_APP_ENABLE_EVENT_STR, job->req_type);
1085 ret = pkgmgr_parser_update_app_disable_info_in_usr_db(job->appid,
1086 job->target_uid, 0);
1087 if (ret != PMINFO_R_OK)
1088 _send_app_signal(job->target_uid, job->req_id, job->pkgid, job->appid,
1089 PKGMGR_INSTALLER_END_KEY_STR,
1090 PKGMGR_INSTALLER_FAIL_EVENT_STR,
1093 _send_app_signal(job->target_uid, job->req_id, job->pkgid, job->appid,
1094 PKGMGR_INSTALLER_END_KEY_STR,
1095 PKGMGR_INSTALLER_OK_EVENT_STR,
1101 static int __process_disable_app(struct backend_job *job)
1104 bool is_global = false;
1106 /* get actual pkgid and replace it to appid which is currently stored
1109 ret = __change_job_info(job, job->target_uid, &is_global);
1110 if (ret != PMINFO_R_OK || strlen(job->appid) == 0) {
1111 _send_app_signal(job->target_uid, job->req_id, job->pkgid, job->pkgid,
1112 PKGMGR_INSTALLER_START_KEY_STR,
1113 PKGMGR_INSTALLER_APP_DISABLE_EVENT_STR,
1115 _send_app_signal(job->target_uid, job->req_id, job->pkgid, job->pkgid,
1116 PKGMGR_INSTALLER_END_KEY_STR,
1117 PKGMGR_INSTALLER_FAIL_EVENT_STR,
1122 _send_app_signal(job->target_uid, job->req_id, job->pkgid, job->appid,
1123 PKGMGR_INSTALLER_START_KEY_STR,
1124 PKGMGR_INSTALLER_APP_DISABLE_EVENT_STR, job->req_type);
1126 ret = __kill_app(job->appid, job->target_uid);
1128 _send_app_signal(job->target_uid, job->req_id, job->pkgid, job->appid,
1129 PKGMGR_INSTALLER_END_KEY_STR,
1130 PKGMGR_INSTALLER_FAIL_EVENT_STR,
1134 ret = pkgmgr_parser_update_app_disable_info_in_usr_db(job->appid,
1135 job->target_uid, 1);
1136 if (ret != PMINFO_R_OK)
1137 _send_app_signal(job->target_uid, job->req_id, job->pkgid, job->appid,
1138 PKGMGR_INSTALLER_END_KEY_STR,
1139 PKGMGR_INSTALLER_FAIL_EVENT_STR,
1142 _send_app_signal(job->target_uid, job->req_id, job->pkgid, job->appid,
1143 PKGMGR_INSTALLER_END_KEY_STR,
1144 PKGMGR_INSTALLER_OK_EVENT_STR,
1150 static int __process_enable_global_app_for_uid(struct backend_job *job)
1153 bool is_global = true;
1155 /* get actual pkgid and replace it to appid which is currently stored
1158 ret = __change_job_info(job, job->target_uid, &is_global);
1159 if (ret != PMINFO_R_OK || strlen(job->appid) == 0) {
1160 _send_app_signal(job->target_uid, job->req_id, job->pkgid, job->pkgid,
1161 PKGMGR_INSTALLER_START_KEY_STR,
1162 PKGMGR_INSTALLER_APP_ENABLE_EVENT_STR,
1164 _send_app_signal(job->target_uid, job->req_id, job->pkgid, job->pkgid,
1165 PKGMGR_INSTALLER_END_KEY_STR,
1166 PKGMGR_INSTALLER_FAIL_EVENT_STR,
1171 _send_app_signal(job->target_uid, job->req_id, job->pkgid, job->appid,
1172 PKGMGR_INSTALLER_START_KEY_STR,
1173 PKGMGR_INSTALLER_APP_ENABLE_EVENT_STR,
1176 ret = pkgmgr_parser_update_global_app_disable_for_uid_info_in_db(
1177 job->appid, job->target_uid, 0);
1178 if (ret != PMINFO_R_OK)
1179 _send_app_signal(job->target_uid, job->req_id, job->pkgid, job->appid,
1180 PKGMGR_INSTALLER_END_KEY_STR,
1181 PKGMGR_INSTALLER_FAIL_EVENT_STR,
1184 _send_app_signal(job->target_uid, job->req_id, job->pkgid, job->appid,
1185 PKGMGR_INSTALLER_END_KEY_STR,
1186 PKGMGR_INSTALLER_OK_EVENT_STR,
1192 static int __process_disable_global_app_for_uid(struct backend_job *job)
1195 bool is_global = true;
1197 /* get actual pkgid and replace it to appid which is currently stored
1200 ret = __change_job_info(job, GLOBAL_USER, &is_global);
1201 if (ret != PMINFO_R_OK || strlen(job->appid) == 0) {
1202 _send_app_signal(job->target_uid, job->req_id,
1203 job->pkgid, job->pkgid,
1204 PKGMGR_INSTALLER_START_KEY_STR,
1205 PKGMGR_INSTALLER_APP_DISABLE_EVENT_STR,
1207 _send_app_signal(job->target_uid, job->req_id, job->pkgid, job->pkgid,
1208 PKGMGR_INSTALLER_END_KEY_STR,
1209 PKGMGR_INSTALLER_FAIL_EVENT_STR,
1214 _send_app_signal(job->target_uid, job->req_id,
1215 job->pkgid, job->appid,
1216 PKGMGR_INSTALLER_START_KEY_STR,
1217 PKGMGR_INSTALLER_APP_DISABLE_EVENT_STR,
1220 ret = __kill_app(job->appid, job->target_uid);
1221 ret = pkgmgr_parser_update_global_app_disable_for_uid_info_in_db(
1222 job->appid, job->target_uid, 1);
1224 if (ret != PMINFO_R_OK)
1225 _send_app_signal(job->target_uid, job->req_id, job->pkgid, job->appid,
1226 PKGMGR_INSTALLER_END_KEY_STR,
1227 PKGMGR_INSTALLER_FAIL_EVENT_STR,
1230 _send_app_signal(job->target_uid, job->req_id, job->pkgid, job->appid,
1231 PKGMGR_INSTALLER_END_KEY_STR,
1232 PKGMGR_INSTALLER_OK_EVENT_STR,
1238 static int __process_getsize(struct backend_job *job)
1240 static const char backend_cmd[] = "/usr/bin/pkg_getsize";
1242 char args[MAX_PKG_ARGS_LEN];
1245 snprintf(args, sizeof(args), "%s %s %s %d -k %s -u %d",
1246 backend_cmd, job->pkgid, job->args, job->caller_uid,
1247 job->req_id, job->target_uid);
1248 argv = __generate_argv(args);
1249 pid = __fork_and_exec_with_args(argv, APPFW_UID);
1256 static int __process_getsize_sync(struct backend_job *job)
1258 static const char backend_cmd[] = "/usr/bin/pkg_getsize";
1260 char args[MAX_PKG_ARGS_LEN];
1261 char fifo_path[PATH_MAX];
1262 struct getsize_sync_extra_info *extra_getsize_info;
1265 snprintf(fifo_path, sizeof(fifo_path), "/tmp/pkgmgr/%s",
1268 extra_getsize_info = calloc(1, sizeof(struct getsize_sync_extra_info));
1269 if (!extra_getsize_info) {
1270 ERR("memory alloc failed");
1274 extra_getsize_info->getsize_fifo = strdup(fifo_path);
1275 if (!extra_getsize_info->getsize_fifo) {
1276 ERR("out of memory");
1280 if (mkfifo(extra_getsize_info->getsize_fifo, 0600) < 0) {
1281 ERR("failed to mkfifo");
1284 job->extra_data = extra_getsize_info;
1286 snprintf(args, sizeof(args), "%s %s %s %d -k %s -u %d --sync",
1287 backend_cmd, job->pkgid, job->args, job->caller_uid,
1288 job->req_id, job->target_uid);
1289 argv = __generate_argv(args);
1290 pid = __fork_and_exec_with_args(argv, APPFW_UID);
1295 ERR("failed to execute backend");
1298 if (__setup_size_info_io(job) < 0) {
1299 ERR("failed to setup io handler");
1306 _return_value_to_caller(job->req_id,
1307 g_variant_new("(ix)", PKGMGR_R_ERROR, -1));
1311 static int __process_cleardata(struct backend_job *job)
1313 static const char *backend_cmd = "/usr/bin/pkg_cleardata";
1315 char args[MAX_PKG_ARGS_LEN];
1318 if ((int)job->target_uid < REGULAR_USER)
1321 snprintf(args, sizeof(args), "%s -d -n %s -u %d",
1322 backend_cmd, job->pkgid, job->target_uid);
1323 argv = __generate_argv(args);
1324 pid = __fork_and_exec_with_args(argv, APPFW_UID);
1330 static int __process_clearcache(struct backend_job *job)
1332 static const char *backend_cmd = "/usr/bin/pkg_cleardata";
1334 char args[MAX_PKG_ARGS_LEN];
1337 if ((int)job->target_uid < REGULAR_USER)
1340 snprintf(args, sizeof(args), "%s -c -n %s -u %d",
1341 backend_cmd, job->pkgid, job->target_uid);
1342 argv = __generate_argv(args);
1343 pid = __fork_and_exec_with_args(argv, APPFW_UID);
1349 static int __process_kill(struct backend_job *job)
1352 pkgmgrinfo_pkginfo_h handle;
1355 ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(job->pkgid, job->target_uid,
1358 ERR("Failed to get handle");
1359 _return_value_to_caller(job->req_id,
1360 g_variant_new("(ii)", PKGMGR_R_ERROR, 0));
1364 pdata = calloc(1, sizeof(pkgcmd_data));
1365 if (pdata == NULL) {
1366 ERR("memory alloc failed");
1367 _return_value_to_caller(job->req_id,
1368 g_variant_new("(ii)", PKGMGR_R_ENOMEM, 0));
1371 pdata->cmd = strdup("kill");
1372 if (pdata->cmd == NULL) {
1373 ERR("out of memory");
1374 _return_value_to_caller(job->req_id,
1375 g_variant_new("(ii)", PKGMGR_R_ENOMEM, 0));
1379 pdata->uid = job->target_uid;
1380 ret = pkgmgrinfo_appinfo_get_usr_list(handle, PMINFO_ALL_APP,
1381 __pkgcmd_app_cb, pdata, job->target_uid);
1383 _return_value_to_caller(job->req_id,
1384 g_variant_new("(ii)", PKGMGR_R_OK, pdata->pid));
1388 pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
1390 ERR("pkgmgrinfo_appinfo_get_list() failed");
1397 static int __process_check(struct backend_job *job)
1400 pkgmgrinfo_pkginfo_h handle;
1403 ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(job->pkgid, job->target_uid,
1406 ERR("Failed to get handle");
1407 _return_value_to_caller(job->req_id,
1408 g_variant_new("(ii)", PKGMGR_R_ERROR, 0));
1412 pdata = calloc(1, sizeof(pkgcmd_data));
1413 if (pdata == NULL) {
1414 ERR("memory alloc failed");
1415 _return_value_to_caller(job->req_id,
1416 g_variant_new("(ii)", PKGMGR_R_ENOMEM, 0));
1419 pdata->cmd = strdup("check");
1420 if (pdata->cmd == NULL) {
1421 ERR("out of memory");
1422 _return_value_to_caller(job->req_id,
1423 g_variant_new("(ii)", PKGMGR_R_ENOMEM, 0));
1427 pdata->uid = job->target_uid;
1428 ret = pkgmgrinfo_appinfo_get_usr_list(handle, PMINFO_ALL_APP,
1429 __pkgcmd_app_cb, pdata, job->target_uid);
1431 _return_value_to_caller(job->req_id,
1432 g_variant_new("(ii)", PKGMGR_R_OK, pdata->pid));
1436 pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
1438 ERR("pkgmgrinfo_appinfo_get_list() failed");
1445 static int __load_drm_library(void)
1450 drm_lib_handle = dlopen(PATH_LIBDRM_SVC_CORE, RTLD_LAZY);
1451 if (!drm_lib_handle) {
1452 DBG("Unable to open %s", PATH_LIBDRM_SVC_CORE);
1456 _drm_tizen_generate_license_request =
1457 dlsym(drm_lib_handle, "drm_tizen_generate_license_request");
1458 if (_drm_tizen_generate_license_request == NULL) {
1459 ERR("_drm_tizen_generate_license_request() failed");
1463 _drm_tizen_register_license =
1464 dlsym(drm_lib_handle, "drm_tizen_register_license");
1465 if (_drm_tizen_register_license == NULL) {
1466 ERR("_register_license() failed");
1470 _drm_tizen_decrypt_package =
1471 dlsym(drm_lib_handle, "drm_tizen_decrypt_package");
1472 if (_drm_tizen_decrypt_package == NULL) {
1473 ERR("_drm_tizen_decrypt_package() failed");
1479 if (drm_lib_handle) {
1480 dlclose(drm_lib_handle);
1481 drm_lib_handle = NULL;
1486 static void __unload_drm_library(void)
1488 if (drm_lib_handle) {
1489 dlclose(drm_lib_handle);
1490 drm_lib_handle = NULL;
1494 static int __process_generate_license_request(struct backend_job *job)
1497 char req_data[MAX_PKG_ARGS_LEN];
1498 unsigned int req_data_len;
1499 char license_url[MAX_PKG_ARGS_LEN];
1500 unsigned int license_url_len;
1503 resp_data = job->args;
1504 req_data_len = sizeof(req_data);
1505 license_url_len = sizeof(license_url);
1507 if (__load_drm_library() != 0) {
1508 ERR("Failed to load library");
1512 ret = _drm_tizen_generate_license_request(resp_data, strlen(resp_data),
1513 req_data, &req_data_len,
1514 license_url, &license_url_len);
1516 ERR("drm_tizen_generate_license_request failed");
1519 _return_value_to_caller(job->req_id,
1520 g_variant_new("(iss)", PKGMGR_R_OK, req_data,
1526 _return_value_to_caller(job->req_id, g_variant_new("(iss)",
1527 PKGMGR_R_ESYSTEM, "", ""));
1528 is_drm_busy = false;
1529 __unload_drm_library();
1533 static int __process_register_license(struct backend_job *job)
1538 resp_data = job->args;
1539 if (!_drm_tizen_register_license) {
1540 ERR("_drm_tizen_register_license is not loaded");
1543 ret = _drm_tizen_register_license(resp_data, strlen(resp_data));
1545 ERR("drm_tizen_register_license failed: %d", ret);
1548 _return_value_to_caller(job->req_id,
1549 g_variant_new("(i)", PKGMGR_R_OK));
1553 _return_value_to_caller(job->req_id,
1554 g_variant_new("(i)", PKGMGR_R_ESYSTEM));
1555 is_drm_busy = false;
1556 __unload_drm_library();
1561 static int __process_decrypt_package(struct backend_job *job)
1564 char *drm_file_path;
1565 char *decrypted_file_path;
1567 drm_file_path = job->pkgid;
1568 decrypted_file_path = job->args;
1570 /* TODO: check ownership of decrypted file */
1571 if (!_drm_tizen_decrypt_package) {
1572 ERR("drm_tizen_decrypt_package is not loaded");
1576 ret = _drm_tizen_decrypt_package(drm_file_path, strlen(drm_file_path),
1577 decrypted_file_path, strlen(decrypted_file_path));
1579 ERR("drm_tizen_decrypt_package failed: %d", ret);
1582 _return_value_to_caller(job->req_id,
1583 g_variant_new("(i)", PKGMGR_R_OK));
1587 _return_value_to_caller(job->req_id,
1588 g_variant_new("(i)", PKGMGR_R_ESYSTEM));
1589 is_drm_busy = false;
1590 __unload_drm_library();
1595 static int __process_update_app_splash_screen(struct backend_job *job, int flag)
1598 bool is_global = false;
1601 ret = __change_job_info(job, job->target_uid, &is_global);
1602 if (ret != PMINFO_R_OK || strlen(job->appid) == 0)
1605 val = flag ? PKGMGR_INSTALLER_APP_ENABLE_SPLASH_SCREEN_EVENT_STR :
1606 PKGMGR_INSTALLER_APP_DISABLE_SPLASH_SCREEN_EVENT_STR;
1607 _send_app_signal(job->target_uid, job->req_id, job->pkgid, job->appid,
1608 PKGMGR_INSTALLER_START_KEY_STR, val, job->req_type);
1611 ret = pkgmgr_parser_update_global_app_splash_screen_display_info_in_usr_db(job->appid, job->target_uid, flag);
1613 ret = pkgmgr_parser_update_app_splash_screen_display_info_in_usr_db(
1614 job->appid, job->target_uid, flag);
1615 if (ret != PMINFO_R_OK)
1616 _send_app_signal(job->target_uid, job->req_id, job->pkgid,
1617 job->appid, PKGMGR_INSTALLER_END_KEY_STR,
1618 PKGMGR_INSTALLER_FAIL_EVENT_STR,
1621 _send_app_signal(job->target_uid, job->req_id, job->pkgid,
1622 job->appid, PKGMGR_INSTALLER_END_KEY_STR,
1623 PKGMGR_INSTALLER_OK_EVENT_STR,
1629 static int __process_set_restriction_mode(struct backend_job *job)
1634 mode = atoi(job->args);
1635 ret = _set_restriction_mode(job->target_uid, job->pkgid, mode);
1637 _return_value_to_caller(job->req_id,
1638 g_variant_new("(i)", ret));
1643 static int __process_unset_restriction_mode(struct backend_job *job)
1648 mode = atoi(job->args);
1649 ret = _unset_restriction_mode(job->target_uid, job->pkgid, mode);
1651 _return_value_to_caller(job->req_id,
1652 g_variant_new("(i)", ret));
1657 static int __process_get_restriction_mode(struct backend_job *job)
1662 ret = _get_restriction_mode(job->target_uid, job->pkgid, &mode);
1664 _return_value_to_caller(job->req_id,
1665 g_variant_new("(ii)", mode, ret));
1670 static int __process_set_app_label(struct backend_job *job)
1674 ret = pkgmgr_parser_update_app_label_info_in_usr_db(job->pkgid,
1675 job->target_uid, job->args);
1676 _return_value_to_caller(job->req_id, g_variant_new("(i)", ret));
1681 static int __process_migrate_external_image(struct backend_job *job)
1685 char args[MAX_PKG_ARGS_LEN];
1688 backend_cmd = job->backend_path;
1689 if (backend_cmd == NULL)
1692 snprintf(args, sizeof(args), "%s -k %s --migrate-extimg %s -u %d %s",
1693 backend_cmd, job->req_id, job->pkgid,
1694 (int)job->target_uid, job->args);
1696 argv = __generate_argv(args);
1698 pid = __fork_and_exec_with_args(argv, APPFW_UID);
1704 static int __post_process(int ret, int x, struct backend_job *job)
1707 __set_backend_free(x);
1708 _free_backend_job(job);
1710 g_hash_table_insert(backend_info_table, (gpointer)ret,
1716 gboolean queue_job(void *data)
1718 struct backend_job *job = NULL;
1722 /* Pop a job from queue */
1723 for (x = 0; x < num_of_backends; x++) {
1724 if (__is_backend_busy(x))
1727 job = _pop_queue(x);
1732 /* all backend messages queue are empty or busy */
1733 if (x == num_of_backends || job == NULL) {
1734 DBG("no job available");
1738 /* set current backend job */
1739 DBG("handle request type [%d]", job->req_type);
1741 if (job->req_type == REQUEST_TYPE_INSTALL ||
1742 job->req_type == REQUEST_TYPE_MOUNT_INSTALL ||
1743 job->req_type == REQUEST_TYPE_REINSTALL) {
1744 ret = __check_csr(job->pkgid);
1747 _send_fail_signal(job);
1748 _free_backend_job(job);
1753 switch (job->req_type) {
1754 case REQUEST_TYPE_INSTALL:
1755 __set_backend_busy(x);
1757 ret = __process_install(job);
1758 __post_process(ret, x, job);
1760 case REQUEST_TYPE_MOUNT_INSTALL:
1761 __set_backend_busy(x);
1763 ret = __process_mount_install(job);
1764 __post_process(ret, x, job);
1766 case REQUEST_TYPE_REINSTALL:
1767 __set_backend_busy(x);
1769 ret = __process_reinstall(job);
1770 __post_process(ret, x, job);
1772 case REQUEST_TYPE_UNINSTALL:
1773 __set_backend_busy(x);
1775 ret = __process_uninstall(job);
1776 __post_process(ret, x, job);
1778 case REQUEST_TYPE_MOVE:
1779 __set_backend_busy(x);
1781 ret = __process_move(job);
1782 __post_process(ret, x, job);
1784 case REQUEST_TYPE_ENABLE_PKG:
1785 __set_backend_busy(x);
1787 ret = __process_enable_pkg(job);
1789 _send_fail_signal(job);
1790 __post_process(ret, x, job);
1792 case REQUEST_TYPE_DISABLE_PKG:
1793 __set_backend_busy(x);
1795 ret = __process_disable_pkg(job);
1797 _send_fail_signal(job);
1798 __post_process(ret, x, job);
1800 case REQUEST_TYPE_REGISTER_PKG_UPDATE_INFO:
1801 ret = __process_register_pkg_update_info(job);
1802 __free_extra_info(job);
1803 _free_backend_job(job);
1805 case REQUEST_TYPE_UNREGISTER_PKG_UPDATE_INFO:
1806 ret = __process_unregister_pkg_update_info(job);
1807 _free_backend_job(job);
1809 case REQUEST_TYPE_UNREGISTER_ALL_PKG_UPDATE_INFO:
1810 ret = __process_unregister_all_pkg_update_info(job);
1811 _free_backend_job(job);
1813 case REQUEST_TYPE_ENABLE_APP:
1814 ret = __process_enable_app(job);
1815 _free_backend_job(job);
1817 case REQUEST_TYPE_DISABLE_APP:
1818 ret = __process_disable_app(job);
1819 _free_backend_job(job);
1821 case REQUEST_TYPE_GETSIZE:
1822 __set_backend_busy(x);
1823 ret = __process_getsize(job);
1824 __post_process(ret, x, job);
1826 case REQUEST_TYPE_GETSIZE_SYNC:
1827 __set_backend_busy(x);
1828 ret = __process_getsize_sync(job);
1830 __free_extra_info(job);
1831 __post_process(ret, x, job);
1833 case REQUEST_TYPE_CLEARDATA:
1834 __set_backend_busy(x);
1836 ret = __process_cleardata(job);
1837 __post_process(ret, x, job);
1839 case REQUEST_TYPE_CLEARCACHE:
1840 __set_backend_busy(x);
1842 ret = __process_clearcache(job);
1843 __post_process(ret, x, job);
1845 case REQUEST_TYPE_ENABLE_GLOBAL_APP_FOR_UID:
1846 ret = __process_enable_global_app_for_uid(job);
1847 _free_backend_job(job);
1849 case REQUEST_TYPE_DISABLE_GLOBAL_APP_FOR_UID:
1850 ret = __process_disable_global_app_for_uid(job);
1851 _free_backend_job(job);
1853 case REQUEST_TYPE_KILL:
1854 ret = __process_kill(job);
1855 _free_backend_job(job);
1857 case REQUEST_TYPE_CHECK:
1858 ret = __process_check(job);
1859 _free_backend_job(job);
1861 case REQUEST_TYPE_GENERATE_LICENSE_REQUEST:
1862 ret = __process_generate_license_request(job);
1863 _free_backend_job(job);
1865 case REQUEST_TYPE_REGISTER_LICENSE:
1866 ret = __process_register_license(job);
1867 _free_backend_job(job);
1869 case REQUEST_TYPE_DECRYPT_PACKAGE:
1870 ret = __process_decrypt_package(job);
1871 _free_backend_job(job);
1873 case REQUEST_TYPE_ENABLE_APP_SPLASH_SCREEN:
1874 ret = __process_update_app_splash_screen(job, 1);
1875 _free_backend_job(job);
1877 case REQUEST_TYPE_DISABLE_APP_SPLASH_SCREEN:
1878 ret = __process_update_app_splash_screen(job, 0);
1879 _free_backend_job(job);
1881 case REQUEST_TYPE_SET_RESTRICTION_MODE:
1882 ret = __process_set_restriction_mode(job);
1883 _free_backend_job(job);
1885 case REQUEST_TYPE_UNSET_RESTRICTION_MODE:
1886 ret = __process_unset_restriction_mode(job);
1887 _free_backend_job(job);
1889 case REQUEST_TYPE_GET_RESTRICTION_MODE:
1890 ret = __process_get_restriction_mode(job);
1891 _free_backend_job(job);
1893 case REQUEST_TYPE_SET_APP_LABEL:
1894 ret = __process_set_app_label(job);
1895 _free_backend_job(job);
1897 case REQUEST_TYPE_MIGRATE_EXTERNAL_IMAGE:
1898 __set_backend_busy(x);
1900 ret = __process_migrate_external_image(job);
1901 __post_process(ret, x, job);
1911 int main(int argc, char *argv[])
1915 DBG("server start");
1917 if (__register_signal_handler()) {
1918 ERR("failed to register signal handler");
1922 r = _init_backend_queue();
1924 ERR("Queue Initialization Failed");
1928 r = __init_backend_info();
1930 ERR("backend info init failed");
1934 r = _init_request_handler();
1936 ERR("dbus init failed");
1940 #if !GLIB_CHECK_VERSION(2, 35, 0)
1943 mainloop = g_main_loop_new(NULL, FALSE);
1945 ERR("g_main_loop_new failed");
1949 DBG("Main loop is created.");
1951 g_main_loop_run(mainloop);
1953 DBG("Quit main loop.");
1954 _fini_request_handler();
1955 __fini_backend_info();
1956 _fini_backend_queue();
1958 g_source_remove(swid);
1959 g_io_channel_unref(sio);
1961 DBG("package manager server terminated.");