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>
48 #include "pkgmgr_installer.h"
49 #include "pkgmgr-server.h"
51 #include "package-manager.h"
53 #define USRLIB "/usr/lib"
55 #define PATH_LIBDRM_SVC_CORE \
56 "/usr/lib/libdrm-service-core-tizen.so.0"
57 #define PATH_LIBCSR_CLIENT \
58 "/usr/lib/libcsr-client.so.2"
60 #define GLOBAL_USER tzplatform_getuid(TZ_SYS_GLOBALAPP_USER)
64 #define EXT_STORAGE_GROUP 10001
65 #define EXT_STORAGE_APPDATA_GROUP 10002
66 #define MEDIA_STORAGE_GROUP 10502
67 #define ARRAY_SIZE(array) (sizeof(array) / sizeof(array[0]))
68 #define MAX_LONGLONG_LENGTH 32
83 8 bit value to represent maximum 8 backends.
84 Each bit position corresponds to a queue slot which
85 is dynamically determined.
87 static char backend_busy = 0;
88 extern int num_of_backends;
89 bool is_drm_busy = false;
90 static bool is_lock_set = false;
92 static GIOChannel *sio;
94 static GHashTable *backend_info_table;
95 static GMainLoop *mainloop;
96 static GDBusConnection *system_conn;
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 GDBusConnection *_get_system_conn(void)
140 system_conn = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &err);
141 if (system_conn == NULL) {
142 ERR("Failed to get system bus: %s", err->message);
150 #define DEVICED_DBUS_PATH "org.tizen.system.deviced"
151 #define DEVICED_DBUS_OBJECT_PATH "/Org/Tizen/System/DeviceD/Display"
152 #define DEVICED_DBUS_INTERFACE_NAME "org.tizen.system.deviced.display"
154 static void __set_power_lock(void)
156 GDBusConnection *conn;
164 conn = _get_system_conn();
168 msg = g_dbus_message_new_method_call(DEVICED_DBUS_PATH,
169 DEVICED_DBUS_OBJECT_PATH,
170 DEVICED_DBUS_INTERFACE_NAME,
173 ERR("g_dbus_message_new_method_call() has failed");
177 g_dbus_message_set_body(msg, g_variant_new("(sssi)", "lcdoff",
178 "staycurstate", "NULL", 0));
179 if (!g_dbus_connection_send_message(conn, msg,
180 G_DBUS_SEND_MESSAGE_FLAGS_NONE, NULL, &err)) {
181 ERR("Unable to send dbus message for acquring lock as %s",
189 g_dbus_connection_flush_sync(conn, NULL, NULL);
193 static void __release_power_lock(void)
196 GDBusConnection *conn;
203 conn = _get_system_conn();
207 msg = g_dbus_message_new_method_call(DEVICED_DBUS_PATH,
208 DEVICED_DBUS_OBJECT_PATH,
209 DEVICED_DBUS_INTERFACE_NAME,
212 ERR("g_dbus_message_new_method_call() is failed");
216 g_dbus_message_set_body(msg, g_variant_new("(ss)", "lcdoff",
218 if (!g_dbus_connection_send_message(conn, msg,
219 G_DBUS_SEND_MESSAGE_FLAGS_NONE, NULL, &err)) {
220 ERR("Unable to send dbus message for releasing lock as %s",
228 g_dbus_connection_flush_sync(conn, NULL, NULL);
234 static gboolean getsize_io_handler(GIOChannel *io, GIOCondition cond,
240 char buf[MAX_LONGLONG_LENGTH];
241 long long result = 0;
242 struct backend_job *job = (struct backend_job *)data;
243 struct getsize_sync_extra_info *extra_getsize_info =
244 (struct getsize_sync_extra_info *)job->extra_data;
246 s = g_io_channel_read_chars(io, (gchar *)buf, sizeof(buf), &len, &err);
247 if (s != G_IO_STATUS_NORMAL) {
248 ERR("getsize fd read failed: %s", err->message);
252 if (strlen(buf) == 0) {
260 _return_value_to_caller(job->req_id, g_variant_new("(ix)",
261 (result < 0) ? PKGMGR_R_ERROR : PKGMGR_R_OK, result));
263 unlink(extra_getsize_info->getsize_fifo);
264 free(extra_getsize_info->getsize_fifo);
265 extra_getsize_info->getsize_fifo = NULL;
270 static int __setup_size_info_io(struct backend_job *job)
273 struct getsize_sync_extra_info *extra_getsize_info =
274 (struct getsize_sync_extra_info *)job->extra_data;
276 extra_getsize_info->getsize_fd = open(extra_getsize_info->getsize_fifo,
277 O_RDONLY | O_NONBLOCK);
278 if (extra_getsize_info->getsize_fd < 0) {
279 ERR("failed to open the fifo(%s), errno(%d)",
280 extra_getsize_info->getsize_fifo, errno);
284 extra_getsize_info->getsize_io =
285 g_io_channel_unix_new(extra_getsize_info->getsize_fd);
286 if (!extra_getsize_info->getsize_io)
288 g_io_channel_set_encoding(extra_getsize_info->getsize_io, NULL, NULL);
289 g_io_channel_set_buffered(extra_getsize_info->getsize_io, FALSE);
290 getsize_wid = g_io_add_watch_full(extra_getsize_info->getsize_io,
291 G_PRIORITY_HIGH, G_IO_IN, getsize_io_handler, job, NULL);
293 ERR("failed to add io watch");
300 static gboolean __signal_handler(GIOChannel *io, GIOCondition cond,
306 struct signalfd_siginfo fdsi;
307 struct backend_job *job;
308 struct getsize_sync_extra_info *extra_getsize_info;
312 s = g_io_channel_read_chars(io, (gchar *)&fdsi,
313 sizeof(struct signalfd_siginfo), &len, &err);
314 if (s != G_IO_STATUS_NORMAL || len != sizeof(struct signalfd_siginfo)) {
315 ERR("Signal read failed");
320 while ((pid = waitpid(-1, &status, WNOHANG)) > 0) {
321 job = (struct backend_job *)g_hash_table_lookup(
322 backend_info_table, (gconstpointer)pid);
324 ERR("Unknown child exit");
328 __set_backend_free(job->backend_slot);
329 if (WIFSIGNALED(status)) {
330 _send_fail_signal(job);
331 INFO("backend[%s][%d] exit with signal[%d]",
332 job->backend_type, pid, WTERMSIG(status));
333 } else if (WEXITSTATUS(status)) {
334 INFO("backend[%s][%d] exit with error",
335 job->backend_type, pid);
337 INFO("backend[%s][%d] exit", job->backend_type, pid);
340 if (job->req_type == REQUEST_TYPE_GETSIZE_SYNC &&
343 (struct getsize_sync_extra_info *)job->extra_data;
344 if (extra_getsize_info->getsize_fifo) {
345 ERR("invalid backend close");
346 _return_value_to_caller(job->req_id,
347 g_variant_new("(ix)",
348 PKGMGR_R_ERROR, -1));
351 g_hash_table_remove(backend_info_table, (gconstpointer)pid);
353 g_idle_add(queue_job, NULL);
358 static int __init_backend_info(void)
360 backend_info_table = g_hash_table_new_full(g_direct_hash,
361 g_direct_equal, NULL,
362 (GDestroyNotify)_free_backend_job);
367 static void __fini_backend_info(void)
369 /*Free backend info */
370 g_hash_table_destroy(backend_info_table);
373 static int __register_signal_handler(void)
379 sigaddset(&mask, SIGCHLD);
381 if (sigprocmask(SIG_BLOCK, &mask, NULL) == -1) {
382 ERR("sigprocmask failed");
386 sfd = signalfd(-1, &mask, SFD_NONBLOCK);
388 ERR("signalfd failed");
392 sio = g_io_channel_unix_new(sfd);
393 g_io_channel_set_close_on_unref(sio, TRUE);
394 g_io_channel_set_encoding(sio, NULL, NULL);
395 g_io_channel_set_buffered(sio, FALSE);
396 swid = g_io_add_watch(sio, G_IO_IN, __signal_handler, NULL);
398 g_timeout_add_seconds_full(G_PRIORITY_LOW, 2, exit_server, NULL, NULL);
403 static int __check_backend_status_for_exit(void)
406 for (i = 0; i < num_of_backends; i++) {
407 if (__is_backend_busy(i))
413 static int __check_queue_status_for_exit(void)
416 for (i = 0; i < num_of_backends; i++) {
417 if (_is_queue_empty(i) == 0)
423 gboolean exit_server(void *data)
425 DBG("exit_server Start");
426 if (__check_backend_status_for_exit() &&
427 __check_queue_status_for_exit() && !is_drm_busy) {
428 g_main_loop_quit(mainloop);
430 __release_power_lock();
436 static int __check_csr(const char *path)
440 void *malware = NULL;
442 int (*_csr_cs_context_create)(void **handle);
443 int (*_csr_cs_scan_file)(void *handle, const char *file_path, void **malware);
444 int (*_csr_cs_context_destroy)(void *handle);
446 lib_handle = dlopen(PATH_LIBCSR_CLIENT, RTLD_LAZY);
448 DBG("Unable to open %s", PATH_LIBCSR_CLIENT);
452 _csr_cs_context_create = dlsym(lib_handle, "csr_cs_context_create");
453 _csr_cs_scan_file = dlsym(lib_handle, "csr_cs_scan_file");
454 _csr_cs_context_destroy = dlsym(lib_handle, "csr_cs_context_destroy");
456 if (!_csr_cs_context_create || !_csr_cs_scan_file ||
457 !_csr_cs_context_destroy) {
458 ERR("Failed to load CSR symbols");
463 ret = _csr_cs_context_create(&context);
465 ERR("Failed to create context");
470 ret = _csr_cs_scan_file(context, path, &malware);
471 /* the csr engine may not exist */
473 DBG("CSR result[%d]", ret);
475 ret = _csr_cs_context_destroy(context);
477 ERR("Failed to destroy context");
481 if (malware != NULL) {
482 ERR("CSR detected malware from [%s]", path);
489 static int __kill_app(char *appid, uid_t uid)
495 is_running = aul_app_is_running_for_uid(appid, uid);
496 /* app is not running */
500 pid = aul_app_get_pid_for_uid(appid, uid);
504 ret = aul_terminate_pid_for_uid(pid, uid);
505 if (ret != AUL_R_OK) {
506 ERR("failed to terminate app(%s)", appid);
513 static int __check_app(char *appid, uid_t uid)
518 is_running = aul_app_is_running_for_uid(appid, uid);
522 pid = aul_app_get_pid_for_uid(appid, uid);
527 static int __pkgcmd_app_cb(const pkgmgrinfo_appinfo_h handle, void *user_data)
533 pkgcmd_data *pdata = (pkgcmd_data *)user_data;
535 if (handle == NULL) {
536 perror("appinfo handle is NULL\n");
539 ret = pkgmgrinfo_appinfo_get_exec(handle, &exec);
541 perror("Failed to get app exec path\n");
544 ret = pkgmgrinfo_appinfo_get_appid(handle, &appid);
546 perror("Failed to get appid\n");
549 ret = pkgmgrinfo_appinfo_get_pkgid(handle, &pkgid);
551 perror("Failed to get pkgid\n");
555 if (strcmp(pdata->cmd, "kill") == 0) {
556 pdata->pid = __check_app(appid, pdata->uid);
558 ret = __kill_app(appid, pdata->uid);
559 } else if (strcmp(pdata->cmd, "check") == 0) {
560 pdata->pid = __check_app(appid, pdata->uid);
566 void free_user_context(user_ctx *ctx)
573 /* env variable ends by NULL element */
583 int set_environement(user_ctx *ctx)
594 if (ctx->uid != APPFW_UID) {
595 if (setuid(ctx->uid)) {
596 ERR("setuid failed: %d", errno);
600 if (setgid(ctx->gid)) {
601 ERR("setgid failed: %d", errno);
606 n = getgroups(0, NULL);
608 ERR("Failed to get the number of supplementary group IDs");
612 groups = (gid_t *)calloc(1, sizeof(gid_t) * (n + 3));
613 if (groups == NULL) {
614 ERR("out of memory");
618 n = getgroups(n, groups);
620 ERR("Failed to get list of supplementary group IDs");
625 groups[n++] = EXT_STORAGE_GROUP;
626 groups[n++] = EXT_STORAGE_APPDATA_GROUP;
627 groups[n++] = MEDIA_STORAGE_GROUP;
629 if (setgroups(n, groups) < 0) {
630 ERR("setgroups failed: %d", errno);
637 /* env variable ends by NULL element */
639 if (putenv(env[i]) != 0)
646 user_ctx *get_user_context(uid_t uid)
648 /* we can use getpwnam because this is used only after a
649 * fork and just before an execv
650 * No concurrencial call can corrupt the data
651 * returned by getpwuid
653 user_ctx *context_res;
655 char buf[1024] = {0, };
656 struct passwd pwd, *result;
661 ret = getpwuid_r(uid, &pwd, buf, sizeof(buf), &result);
662 if (ret != 0 || result == NULL)
666 context_res = (user_ctx *)malloc(sizeof(user_ctx));
671 env = (char **)malloc(3 * sizeof(char *));
676 /* Build environment context */
677 len = snprintf(NULL, 0, "HOME=%s", pwd.pw_dir);
678 env[0] = (char *)malloc((len + 1) * sizeof(char));
679 if (env[0] == NULL) {
683 snprintf(env[0], len + 1, "HOME=%s", pwd.pw_dir);
684 len = snprintf(NULL, 0, "USER=%s", pwd.pw_name);
685 env[1] = (char *)malloc((len + 1) * sizeof(char));
686 if (env[1] == NULL) {
690 snprintf(env[1], len + 1, "USER=%s", pwd.pw_name);
698 /* env variable ends by NULL element */
699 while (env && env[i]) {
706 context_res->env = env;
707 context_res->uid = uid;
708 context_res->gid = pwd.pw_gid;
713 static char **__generate_argv(const char *args)
715 /* Create args vector
716 * req_id + pkgid + args
718 * vector size = # of args +
719 *(req_id + pkgid + NULL termination = 3)
720 * Last value must be NULL for execv.
728 ret_parse = g_shell_parse_argv(args, &argcp, &argvp, &gerr);
729 if (FALSE == ret_parse) {
730 ERR("Failed to split args: %s", args);
731 ERR("messsage: %s", gerr->message);
736 for (i = 0; i < argcp; i++)
737 DBG(">>>>>> argsv[%d]=%s", i, argvp[i]);
742 void __set_environment(gpointer user_data)
744 user_ctx *ctx = (user_ctx *)user_data;
746 if (set_environement(ctx))
747 ERR("Failed to set env for the user : %d", ctx->uid);
750 static int __fork_and_exec_with_args(char **argv, uid_t uid)
752 user_ctx *user_context;
753 GError *error = NULL;
757 user_context = get_user_context(uid);
759 ERR("Failed to getenv");
763 ret = g_spawn_async(NULL, argv, NULL, G_SPAWN_DO_NOT_REAP_CHILD,
764 __set_environment, (gpointer)user_context, &pid,
767 ERR("Failed to excute backend: %s", error->message);
769 free_user_context(user_context);
773 free_user_context(user_context);
778 static int __change_job_info(struct backend_job *job, uid_t uid,
783 pkgmgrinfo_appinfo_h handle = NULL;
784 if (job->req_type != REQUEST_TYPE_DISABLE_APP &&
785 job->req_type != REQUEST_TYPE_DISABLE_GLOBAL_APP_FOR_UID &&
786 job->req_type != REQUEST_TYPE_ENABLE_APP_SPLASH_SCREEN &&
787 job->req_type != REQUEST_TYPE_DISABLE_APP_SPLASH_SCREEN &&
788 job->req_type != REQUEST_TYPE_ENABLE_APP &&
789 job->req_type != REQUEST_TYPE_ENABLE_GLOBAL_APP_FOR_UID)
790 return PMINFO_R_ERROR;
792 ret = pkgmgrinfo_appinfo_get_usr_all_appinfo(job->pkgid, uid, &handle);
793 if (ret != PMINFO_R_OK)
794 return PMINFO_R_ERROR;
796 ret = pkgmgrinfo_appinfo_is_global(handle, is_global);
797 if (ret != PMINFO_R_OK)
800 if ((job->req_type == REQUEST_TYPE_DISABLE_GLOBAL_APP_FOR_UID ||
802 REQUEST_TYPE_ENABLE_GLOBAL_APP_FOR_UID) &&
804 ret = PMINFO_R_ERROR;
808 ret = pkgmgrinfo_appinfo_get_pkgid(handle, &pkgid);
809 if (ret != PMINFO_R_OK)
813 job->appid = strdup(job->pkgid);
815 job->pkgid = strdup(pkgid);
818 pkgmgrinfo_appinfo_destroy_appinfo(handle);
823 static int __process_install(struct backend_job *job)
827 char args[MAX_PKG_ARGS_LEN];
832 backend_cmd = job->backend_path;
833 if (backend_cmd == NULL)
836 req_id = g_shell_quote(job->req_id);
839 pkgid = g_shell_quote(job->pkgid);
845 snprintf(args, sizeof(args), "%s -k %s -i %s -u %d %s", backend_cmd,
846 req_id, pkgid, (int)job->target_uid, job->args);
848 argv = __generate_argv(args);
850 pid = __fork_and_exec_with_args(argv, APPFW_UID);
858 static int __process_mount_install(struct backend_job *job)
862 char args[MAX_PKG_ARGS_LEN];
867 backend_cmd = job->backend_path;
868 if (backend_cmd == NULL)
871 req_id = g_shell_quote(job->req_id);
874 pkgid = g_shell_quote(job->pkgid);
879 snprintf(args, sizeof(args), "%s -k %s -w %s -u %d %s", backend_cmd,
880 req_id, pkgid, (int)job->target_uid, job->args);
882 argv = __generate_argv(args);
884 pid = __fork_and_exec_with_args(argv, APPFW_UID);
892 static int __process_reinstall(struct backend_job *job)
896 char args[MAX_PKG_ARGS_LEN];
901 backend_cmd = job->backend_path;
902 if (backend_cmd == NULL)
905 req_id = g_shell_quote(job->req_id);
908 pkgid = g_shell_quote(job->pkgid);
914 snprintf(args, sizeof(args), "%s -k %s -r %s -u %d", backend_cmd,
915 req_id, pkgid, (int)job->target_uid);
916 argv = __generate_argv(args);
918 pid = __fork_and_exec_with_args(argv, APPFW_UID);
927 static int __process_uninstall(struct backend_job *job)
931 char args[MAX_PKG_ARGS_LEN];
934 backend_cmd = job->backend_path;
935 if (backend_cmd == NULL)
938 snprintf(args, sizeof(args), "%s -k %s -d %s -u %d", backend_cmd,
939 job->req_id, job->pkgid, (int)job->target_uid);
940 argv = __generate_argv(args);
942 pid = __fork_and_exec_with_args(argv, APPFW_UID);
949 static int __process_move(struct backend_job *job)
953 char args[MAX_PKG_ARGS_LEN];
956 backend_cmd = job->backend_path;
957 if (backend_cmd == NULL)
960 snprintf(args, sizeof(args), "%s -k %s -m %s -u %d -t %s", backend_cmd,
961 job->req_id, job->pkgid, (int)job->target_uid, job->args);
962 argv = __generate_argv(args);
964 pid = __fork_and_exec_with_args(argv, APPFW_UID);
971 static int __process_enable_pkg(struct backend_job *job)
975 char args[MAX_PKG_ARGS_LEN];
976 pkgmgrinfo_pkginfo_h pkginfo_h;
982 backend_cmd = job->backend_path;
983 if (backend_cmd == NULL)
986 ret = pkgmgrinfo_pkginfo_get_usr_disabled_pkginfo(
987 job->pkgid, job->target_uid, &pkginfo_h);
988 if (ret != PMINFO_R_OK) {
989 ERR("Failed to get appinfo");
993 ret = pkgmgrinfo_pkginfo_is_global(pkginfo_h, &is_global);
994 if (ret != PMINFO_R_OK) {
995 ERR("Failed to get global value");
996 pkgmgrinfo_pkginfo_destroy_pkginfo(pkginfo_h);
1000 if ((is_global && job->target_uid != GLOBAL_USER) ||
1001 (!is_global && job->target_uid == GLOBAL_USER)) {
1002 ERR("Invalid attempt to enable pkg");
1003 pkgmgrinfo_pkginfo_destroy_pkginfo(pkginfo_h);
1007 ret = pkgmgrinfo_pkginfo_is_readonly(pkginfo_h, &is_readonly);
1008 if (ret != PMINFO_R_OK) {
1009 ERR("Failed to get readonly value");
1010 pkgmgrinfo_pkginfo_destroy_pkginfo(pkginfo_h);
1014 snprintf(args, sizeof(args), "%s -k %s -u %d -A %s %s",
1015 backend_cmd, job->req_id, (int)job->target_uid,
1016 job->pkgid, (is_readonly) ? "--preload" : "");
1017 argv = __generate_argv(args);
1018 pid = __fork_and_exec_with_args(argv, APPFW_UID);
1021 pkgmgrinfo_pkginfo_destroy_pkginfo(pkginfo_h);
1026 static int __process_disable_pkg(struct backend_job *job)
1030 char args[MAX_PKG_ARGS_LEN];
1031 pkgmgrinfo_pkginfo_h pkginfo_h;
1037 backend_cmd = job->backend_path;
1038 if (backend_cmd == NULL)
1041 ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(
1042 job->pkgid, job->target_uid, &pkginfo_h);
1043 if (ret != PMINFO_R_OK) {
1044 ERR("Failed to get appinfo");
1048 ret = pkgmgrinfo_pkginfo_is_global(pkginfo_h, &is_global);
1049 if (ret != PMINFO_R_OK) {
1050 ERR("Failed to get global value");
1051 pkgmgrinfo_pkginfo_destroy_pkginfo(pkginfo_h);
1055 if ((is_global && job->target_uid != GLOBAL_USER) ||
1056 (!is_global && job->target_uid == GLOBAL_USER)) {
1057 ERR("Invalid attempt to disable pkg");
1058 pkgmgrinfo_pkginfo_destroy_pkginfo(pkginfo_h);
1062 ret = pkgmgrinfo_pkginfo_is_readonly(pkginfo_h, &is_readonly);
1063 if (ret != PMINFO_R_OK) {
1064 ERR("Failed to get readonly value");
1065 pkgmgrinfo_pkginfo_destroy_pkginfo(pkginfo_h);
1069 snprintf(args, sizeof(args), "%s -k %s -u %d -D %s %s",
1070 backend_cmd, job->req_id, (int)job->target_uid,
1071 job->pkgid, (is_readonly) ? "--preload" : "");
1072 argv = __generate_argv(args);
1074 pid = __fork_and_exec_with_args(argv, APPFW_UID);
1078 pkgmgrinfo_pkginfo_destroy_pkginfo(pkginfo_h);
1082 static int __process_register_pkg_update_info(struct backend_job *job)
1086 if (!job->extra_data) {
1087 _return_value_to_caller(job->req_id,
1088 g_variant_new("(i)", PKGMGR_R_ESYSTEM));
1092 ret = pkgmgr_parser_register_pkg_update_info_in_usr_db(
1093 (pkgmgrinfo_updateinfo_h)job->extra_data, job->target_uid);
1094 if (ret == PMINFO_R_OK)
1095 _return_value_to_caller(job->req_id,
1096 g_variant_new("(i)", PKGMGR_R_OK));
1098 _return_value_to_caller(job->req_id,
1099 g_variant_new("(i)", PKGMGR_R_ESYSTEM));
1101 pkgmgrinfo_updateinfo_destroy(job->extra_data);
1102 job->extra_data = NULL;
1107 static int __process_unregister_pkg_update_info(struct backend_job *job)
1109 int ret = pkgmgr_parser_unregister_pkg_update_info_in_usr_db
1110 (job->pkgid, job->target_uid);
1112 if (ret == PMINFO_R_OK)
1113 _return_value_to_caller(job->req_id,
1114 g_variant_new("(i)", PKGMGR_R_OK));
1116 _return_value_to_caller(job->req_id,
1117 g_variant_new("(i)", PKGMGR_R_ESYSTEM));
1121 static int __process_unregister_all_pkg_update_info(struct backend_job *job)
1123 int ret = pkgmgr_parser_unregister_all_pkg_update_info_in_usr_db(
1126 if (ret != PMINFO_R_OK) {
1127 _return_value_to_caller(job->req_id,
1128 g_variant_new("(i)", PKGMGR_R_ESYSTEM));
1132 if (__is_admin_user(job->caller_uid)) {
1133 ret = pkgmgr_parser_unregister_all_pkg_update_info_in_usr_db(
1135 if (ret != PMINFO_R_OK) {
1136 _return_value_to_caller(job->req_id,
1137 g_variant_new("(i)", PKGMGR_R_ESYSTEM));
1141 _return_value_to_caller(job->req_id,
1142 g_variant_new("(i)", PKGMGR_R_OK));
1147 static int __process_enable_app(struct backend_job *job)
1150 bool is_global = false;
1152 /* get actual pkgid and replace it to appid which is currently stored
1155 ret = __change_job_info(job, job->target_uid, &is_global);
1156 if (ret != PMINFO_R_OK || strlen(job->appid) == 0) {
1157 _send_app_signal(job->target_uid, job->req_id, job->pkgid, job->pkgid,
1158 PKGMGR_INSTALLER_START_KEY_STR,
1159 PKGMGR_INSTALLER_APP_ENABLE_EVENT_STR,
1161 _send_app_signal(job->target_uid, job->req_id, job->pkgid, job->pkgid,
1162 PKGMGR_INSTALLER_END_KEY_STR,
1163 PKGMGR_INSTALLER_FAIL_EVENT_STR,
1168 _send_app_signal(job->target_uid, job->req_id, job->pkgid, job->appid,
1169 PKGMGR_INSTALLER_START_KEY_STR,
1170 PKGMGR_INSTALLER_APP_ENABLE_EVENT_STR, job->req_type);
1172 ret = pkgmgr_parser_update_app_disable_info_in_usr_db(job->appid,
1173 job->target_uid, 0);
1174 if (ret != PMINFO_R_OK)
1175 _send_app_signal(job->target_uid, job->req_id, job->pkgid, job->appid,
1176 PKGMGR_INSTALLER_END_KEY_STR,
1177 PKGMGR_INSTALLER_FAIL_EVENT_STR,
1180 _send_app_signal(job->target_uid, job->req_id, job->pkgid, job->appid,
1181 PKGMGR_INSTALLER_END_KEY_STR,
1182 PKGMGR_INSTALLER_OK_EVENT_STR,
1188 static int __process_disable_app(struct backend_job *job)
1191 bool is_global = false;
1193 /* get actual pkgid and replace it to appid which is currently stored
1196 ret = __change_job_info(job, job->target_uid, &is_global);
1197 if (ret != PMINFO_R_OK || strlen(job->appid) == 0) {
1198 _send_app_signal(job->target_uid, job->req_id, job->pkgid, job->pkgid,
1199 PKGMGR_INSTALLER_START_KEY_STR,
1200 PKGMGR_INSTALLER_APP_DISABLE_EVENT_STR,
1202 _send_app_signal(job->target_uid, job->req_id, job->pkgid, job->pkgid,
1203 PKGMGR_INSTALLER_END_KEY_STR,
1204 PKGMGR_INSTALLER_FAIL_EVENT_STR,
1209 _send_app_signal(job->target_uid, job->req_id, job->pkgid, job->appid,
1210 PKGMGR_INSTALLER_START_KEY_STR,
1211 PKGMGR_INSTALLER_APP_DISABLE_EVENT_STR, job->req_type);
1213 ret = __kill_app(job->appid, job->target_uid);
1215 _send_app_signal(job->target_uid, job->req_id, job->pkgid, job->appid,
1216 PKGMGR_INSTALLER_END_KEY_STR,
1217 PKGMGR_INSTALLER_FAIL_EVENT_STR,
1221 ret = pkgmgr_parser_update_app_disable_info_in_usr_db(job->appid,
1222 job->target_uid, 1);
1223 if (ret != PMINFO_R_OK)
1224 _send_app_signal(job->target_uid, job->req_id, job->pkgid, job->appid,
1225 PKGMGR_INSTALLER_END_KEY_STR,
1226 PKGMGR_INSTALLER_FAIL_EVENT_STR,
1229 _send_app_signal(job->target_uid, job->req_id, job->pkgid, job->appid,
1230 PKGMGR_INSTALLER_END_KEY_STR,
1231 PKGMGR_INSTALLER_OK_EVENT_STR,
1237 static int __process_enable_global_app_for_uid(struct backend_job *job)
1240 bool is_global = true;
1242 /* get actual pkgid and replace it to appid which is currently stored
1245 ret = __change_job_info(job, job->target_uid, &is_global);
1246 if (ret != PMINFO_R_OK || strlen(job->appid) == 0) {
1247 _send_app_signal(job->target_uid, job->req_id, job->pkgid, job->pkgid,
1248 PKGMGR_INSTALLER_START_KEY_STR,
1249 PKGMGR_INSTALLER_APP_ENABLE_EVENT_STR,
1251 _send_app_signal(job->target_uid, job->req_id, job->pkgid, job->pkgid,
1252 PKGMGR_INSTALLER_END_KEY_STR,
1253 PKGMGR_INSTALLER_FAIL_EVENT_STR,
1258 _send_app_signal(job->target_uid, job->req_id, job->pkgid, job->appid,
1259 PKGMGR_INSTALLER_START_KEY_STR,
1260 PKGMGR_INSTALLER_APP_ENABLE_EVENT_STR,
1263 ret = pkgmgr_parser_update_global_app_disable_for_uid_info_in_db(
1264 job->appid, job->target_uid, 0);
1265 if (ret != PMINFO_R_OK)
1266 _send_app_signal(job->target_uid, job->req_id, job->pkgid, job->appid,
1267 PKGMGR_INSTALLER_END_KEY_STR,
1268 PKGMGR_INSTALLER_FAIL_EVENT_STR,
1271 _send_app_signal(job->target_uid, job->req_id, job->pkgid, job->appid,
1272 PKGMGR_INSTALLER_END_KEY_STR,
1273 PKGMGR_INSTALLER_OK_EVENT_STR,
1279 static int __process_disable_global_app_for_uid(struct backend_job *job)
1282 bool is_global = true;
1284 /* get actual pkgid and replace it to appid which is currently stored
1287 ret = __change_job_info(job, GLOBAL_USER, &is_global);
1288 if (ret != PMINFO_R_OK || strlen(job->appid) == 0) {
1289 _send_app_signal(job->target_uid, job->req_id,
1290 job->pkgid, job->pkgid,
1291 PKGMGR_INSTALLER_START_KEY_STR,
1292 PKGMGR_INSTALLER_APP_DISABLE_EVENT_STR,
1294 _send_app_signal(job->target_uid, job->req_id, job->pkgid, job->pkgid,
1295 PKGMGR_INSTALLER_END_KEY_STR,
1296 PKGMGR_INSTALLER_FAIL_EVENT_STR,
1301 _send_app_signal(job->target_uid, job->req_id,
1302 job->pkgid, job->appid,
1303 PKGMGR_INSTALLER_START_KEY_STR,
1304 PKGMGR_INSTALLER_APP_DISABLE_EVENT_STR,
1307 ret = __kill_app(job->appid, job->target_uid);
1308 ret = pkgmgr_parser_update_global_app_disable_for_uid_info_in_db(
1309 job->appid, job->target_uid, 1);
1311 if (ret != PMINFO_R_OK)
1312 _send_app_signal(job->target_uid, job->req_id, job->pkgid, job->appid,
1313 PKGMGR_INSTALLER_END_KEY_STR,
1314 PKGMGR_INSTALLER_FAIL_EVENT_STR,
1317 _send_app_signal(job->target_uid, job->req_id, job->pkgid, job->appid,
1318 PKGMGR_INSTALLER_END_KEY_STR,
1319 PKGMGR_INSTALLER_OK_EVENT_STR,
1325 static int __process_getsize(struct backend_job *job)
1327 static const char backend_cmd[] = "/usr/bin/pkg_getsize";
1329 char args[MAX_PKG_ARGS_LEN];
1332 snprintf(args, sizeof(args), "%s %s %s %d -k %s -u %d",
1333 backend_cmd, job->pkgid, job->args, job->caller_uid,
1334 job->req_id, job->target_uid);
1335 argv = __generate_argv(args);
1336 pid = __fork_and_exec_with_args(argv, APPFW_UID);
1343 static int __process_getsize_sync(struct backend_job *job)
1345 static const char backend_cmd[] = "/usr/bin/pkg_getsize";
1347 char args[MAX_PKG_ARGS_LEN];
1348 char fifo_path[PATH_MAX];
1349 struct getsize_sync_extra_info *extra_getsize_info;
1352 snprintf(fifo_path, sizeof(fifo_path), "/tmp/pkgmgr/%s",
1355 extra_getsize_info = calloc(1, sizeof(struct getsize_sync_extra_info));
1356 if (!extra_getsize_info) {
1357 ERR("memory alloc failed");
1361 job->extra_data = extra_getsize_info;
1362 extra_getsize_info->getsize_fifo = strdup(fifo_path);
1363 if (!extra_getsize_info->getsize_fifo) {
1364 ERR("out of memory");
1368 if (mkfifo(extra_getsize_info->getsize_fifo, 0600) < 0) {
1369 ERR("failed to mkfifo");
1373 snprintf(args, sizeof(args), "%s %s %s %d -k %s -u %d --sync",
1374 backend_cmd, job->pkgid, job->args, job->caller_uid,
1375 job->req_id, job->target_uid);
1376 argv = __generate_argv(args);
1377 pid = __fork_and_exec_with_args(argv, APPFW_UID);
1382 ERR("failed to execute backend");
1385 if (__setup_size_info_io(job) < 0) {
1386 ERR("failed to setup io handler");
1393 _return_value_to_caller(job->req_id,
1394 g_variant_new("(ix)", PKGMGR_R_ERROR, -1));
1398 static int __process_cleardata(struct backend_job *job)
1400 static const char *backend_cmd = "/usr/bin/pkg_cleardata";
1402 char args[MAX_PKG_ARGS_LEN];
1405 if ((int)job->target_uid < REGULAR_USER)
1408 snprintf(args, sizeof(args), "%s -d -n %s -u %d",
1409 backend_cmd, job->pkgid, job->target_uid);
1410 argv = __generate_argv(args);
1411 pid = __fork_and_exec_with_args(argv, APPFW_UID);
1417 static int __process_clearcache(struct backend_job *job)
1419 static const char *backend_cmd = "/usr/bin/pkg_cleardata";
1421 char args[MAX_PKG_ARGS_LEN];
1424 if ((int)job->target_uid < REGULAR_USER)
1427 snprintf(args, sizeof(args), "%s -c -n %s -u %d",
1428 backend_cmd, job->pkgid, job->target_uid);
1429 argv = __generate_argv(args);
1430 pid = __fork_and_exec_with_args(argv, APPFW_UID);
1436 static int __process_kill(struct backend_job *job)
1439 pkgmgrinfo_pkginfo_h handle;
1442 ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(job->pkgid, job->target_uid,
1445 ERR("Failed to get handle");
1446 _return_value_to_caller(job->req_id,
1447 g_variant_new("(ii)", PKGMGR_R_ERROR, 0));
1451 pdata = calloc(1, sizeof(pkgcmd_data));
1452 if (pdata == NULL) {
1453 ERR("memory alloc failed");
1454 _return_value_to_caller(job->req_id,
1455 g_variant_new("(ii)", PKGMGR_R_ENOMEM, 0));
1458 pdata->cmd = strdup("kill");
1459 if (pdata->cmd == NULL) {
1460 ERR("out of memory");
1461 _return_value_to_caller(job->req_id,
1462 g_variant_new("(ii)", PKGMGR_R_ENOMEM, 0));
1466 pdata->uid = job->target_uid;
1467 ret = pkgmgrinfo_appinfo_get_usr_list(handle, PMINFO_ALL_APP,
1468 __pkgcmd_app_cb, pdata, job->target_uid);
1470 _return_value_to_caller(job->req_id,
1471 g_variant_new("(ii)", PKGMGR_R_OK, pdata->pid));
1475 pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
1477 ERR("pkgmgrinfo_appinfo_get_list() failed");
1484 static int __process_check(struct backend_job *job)
1487 pkgmgrinfo_pkginfo_h handle;
1490 ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(job->pkgid, job->target_uid,
1493 ERR("Failed to get handle");
1494 _return_value_to_caller(job->req_id,
1495 g_variant_new("(ii)", PKGMGR_R_ERROR, 0));
1499 pdata = calloc(1, sizeof(pkgcmd_data));
1500 if (pdata == NULL) {
1501 ERR("memory alloc failed");
1502 _return_value_to_caller(job->req_id,
1503 g_variant_new("(ii)", PKGMGR_R_ENOMEM, 0));
1506 pdata->cmd = strdup("check");
1507 if (pdata->cmd == NULL) {
1508 ERR("out of memory");
1509 _return_value_to_caller(job->req_id,
1510 g_variant_new("(ii)", PKGMGR_R_ENOMEM, 0));
1514 pdata->uid = job->target_uid;
1515 ret = pkgmgrinfo_appinfo_get_usr_list(handle, PMINFO_ALL_APP,
1516 __pkgcmd_app_cb, pdata, job->target_uid);
1518 _return_value_to_caller(job->req_id,
1519 g_variant_new("(ii)", PKGMGR_R_OK, pdata->pid));
1523 pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
1525 ERR("pkgmgrinfo_appinfo_get_list() failed");
1532 static int __load_drm_library(void)
1537 drm_lib_handle = dlopen(PATH_LIBDRM_SVC_CORE, RTLD_LAZY);
1538 if (!drm_lib_handle) {
1539 DBG("Unable to open %s", PATH_LIBDRM_SVC_CORE);
1543 _drm_tizen_generate_license_request =
1544 dlsym(drm_lib_handle, "drm_tizen_generate_license_request");
1545 if (_drm_tizen_generate_license_request == NULL) {
1546 ERR("_drm_tizen_generate_license_request() failed");
1550 _drm_tizen_register_license =
1551 dlsym(drm_lib_handle, "drm_tizen_register_license");
1552 if (_drm_tizen_register_license == NULL) {
1553 ERR("_register_license() failed");
1557 _drm_tizen_decrypt_package =
1558 dlsym(drm_lib_handle, "drm_tizen_decrypt_package");
1559 if (_drm_tizen_decrypt_package == NULL) {
1560 ERR("_drm_tizen_decrypt_package() failed");
1566 if (drm_lib_handle) {
1567 dlclose(drm_lib_handle);
1568 drm_lib_handle = NULL;
1573 static void __unload_drm_library(void)
1575 if (drm_lib_handle) {
1576 dlclose(drm_lib_handle);
1577 drm_lib_handle = NULL;
1581 static int __process_generate_license_request(struct backend_job *job)
1584 char req_data[MAX_PKG_ARGS_LEN];
1585 unsigned int req_data_len;
1586 char license_url[MAX_PKG_ARGS_LEN];
1587 unsigned int license_url_len;
1590 resp_data = job->args;
1591 req_data_len = sizeof(req_data);
1592 license_url_len = sizeof(license_url);
1594 if (__load_drm_library() != 0) {
1595 ERR("Failed to load library");
1599 ret = _drm_tizen_generate_license_request(resp_data, strlen(resp_data),
1600 req_data, &req_data_len,
1601 license_url, &license_url_len);
1603 ERR("drm_tizen_generate_license_request failed");
1606 _return_value_to_caller(job->req_id,
1607 g_variant_new("(iss)", PKGMGR_R_OK, req_data,
1613 _return_value_to_caller(job->req_id, g_variant_new("(iss)",
1614 PKGMGR_R_ESYSTEM, "", ""));
1615 is_drm_busy = false;
1616 __unload_drm_library();
1620 static int __process_register_license(struct backend_job *job)
1625 resp_data = job->args;
1626 if (!_drm_tizen_register_license) {
1627 ERR("_drm_tizen_register_license is not loaded");
1630 ret = _drm_tizen_register_license(resp_data, strlen(resp_data));
1632 ERR("drm_tizen_register_license failed: %d", ret);
1635 _return_value_to_caller(job->req_id,
1636 g_variant_new("(i)", PKGMGR_R_OK));
1640 _return_value_to_caller(job->req_id,
1641 g_variant_new("(i)", PKGMGR_R_ESYSTEM));
1642 is_drm_busy = false;
1643 __unload_drm_library();
1648 static int __process_decrypt_package(struct backend_job *job)
1651 char *drm_file_path;
1652 char *decrypted_file_path;
1654 drm_file_path = job->pkgid;
1655 decrypted_file_path = job->args;
1657 /* TODO: check ownership of decrypted file */
1658 if (!_drm_tizen_decrypt_package) {
1659 ERR("drm_tizen_decrypt_package is not loaded");
1663 ret = _drm_tizen_decrypt_package(drm_file_path, strlen(drm_file_path),
1664 decrypted_file_path, strlen(decrypted_file_path));
1666 ERR("drm_tizen_decrypt_package failed: %d", ret);
1669 _return_value_to_caller(job->req_id,
1670 g_variant_new("(i)", PKGMGR_R_OK));
1674 _return_value_to_caller(job->req_id,
1675 g_variant_new("(i)", PKGMGR_R_ESYSTEM));
1676 is_drm_busy = false;
1677 __unload_drm_library();
1682 static int __process_update_app_splash_screen(struct backend_job *job, int flag)
1685 bool is_global = false;
1688 ret = __change_job_info(job, job->target_uid, &is_global);
1689 if (ret != PMINFO_R_OK || strlen(job->appid) == 0)
1692 val = flag ? PKGMGR_INSTALLER_APP_ENABLE_SPLASH_SCREEN_EVENT_STR :
1693 PKGMGR_INSTALLER_APP_DISABLE_SPLASH_SCREEN_EVENT_STR;
1694 _send_app_signal(job->target_uid, job->req_id, job->pkgid, job->appid,
1695 PKGMGR_INSTALLER_START_KEY_STR, val, job->req_type);
1698 ret = pkgmgr_parser_update_global_app_splash_screen_display_info_in_usr_db(job->appid, job->target_uid, flag);
1700 ret = pkgmgr_parser_update_app_splash_screen_display_info_in_usr_db(
1701 job->appid, job->target_uid, flag);
1702 if (ret != PMINFO_R_OK)
1703 _send_app_signal(job->target_uid, job->req_id, job->pkgid,
1704 job->appid, PKGMGR_INSTALLER_END_KEY_STR,
1705 PKGMGR_INSTALLER_FAIL_EVENT_STR,
1708 _send_app_signal(job->target_uid, job->req_id, job->pkgid,
1709 job->appid, PKGMGR_INSTALLER_END_KEY_STR,
1710 PKGMGR_INSTALLER_OK_EVENT_STR,
1716 static int __process_set_restriction_mode(struct backend_job *job)
1721 mode = atoi(job->args);
1722 ret = _set_restriction_mode(job->target_uid, job->pkgid, mode);
1724 _return_value_to_caller(job->req_id,
1725 g_variant_new("(i)", ret));
1730 static int __process_unset_restriction_mode(struct backend_job *job)
1735 mode = atoi(job->args);
1736 ret = _unset_restriction_mode(job->target_uid, job->pkgid, mode);
1738 _return_value_to_caller(job->req_id,
1739 g_variant_new("(i)", ret));
1744 static int __process_get_restriction_mode(struct backend_job *job)
1749 ret = _get_restriction_mode(job->target_uid, job->pkgid, &mode);
1751 _return_value_to_caller(job->req_id,
1752 g_variant_new("(ii)", mode, ret));
1757 static int __process_set_app_label(struct backend_job *job)
1761 ret = pkgmgr_parser_update_app_label_info_in_usr_db(job->pkgid,
1762 job->target_uid, job->args);
1763 _return_value_to_caller(job->req_id, g_variant_new("(i)", ret));
1768 static int __process_set_app_icon(struct backend_job *job)
1771 pkgmgrinfo_appinfo_h handle = NULL;
1772 char *app_root_path = NULL;
1774 ret = pkgmgrinfo_appinfo_get_usr_appinfo(job->pkgid, job->target_uid, &handle);
1775 if (ret != PMINFO_R_OK) {
1776 _return_value_to_caller(job->req_id, g_variant_new("(i)", ret));
1777 return PKGMGR_R_ENOPKG;
1780 ret = pkgmgrinfo_appinfo_get_root_path(handle, &app_root_path);
1781 if (ret != PMINFO_R_OK || !app_root_path) {
1782 _return_value_to_caller(job->req_id, g_variant_new("(i)", ret));
1783 pkgmgrinfo_appinfo_destroy_appinfo(handle);
1784 return PKGMGR_R_ESYSTEM;
1787 if (strncasecmp(job->args, app_root_path, strlen(app_root_path)) != 0 ||
1788 strstr(job->args, "..") != NULL ||
1789 access(job->args, F_OK) != 0) {
1790 ERR("invalid path[%s]", job->args);
1791 _return_value_to_caller(job->req_id, g_variant_new("(i)", ret));
1792 pkgmgrinfo_appinfo_destroy_appinfo(handle);
1793 return PKGMGR_R_EINVAL;
1796 pkgmgrinfo_appinfo_destroy_appinfo(handle);
1797 ret = pkgmgr_parser_update_app_icon_info_in_usr_db(job->pkgid,
1798 job->target_uid, job->args);
1799 _return_value_to_caller(job->req_id, g_variant_new("(i)", ret));
1804 static int __process_migrate_external_image(struct backend_job *job)
1808 char args[MAX_PKG_ARGS_LEN];
1811 backend_cmd = job->backend_path;
1812 if (backend_cmd == NULL)
1815 snprintf(args, sizeof(args), "%s -k %s --migrate-extimg %s -u %d %s",
1816 backend_cmd, job->req_id, job->pkgid,
1817 (int)job->target_uid, job->args);
1819 argv = __generate_argv(args);
1821 pid = __fork_and_exec_with_args(argv, APPFW_UID);
1827 static int __post_process(int ret, int x, struct backend_job *job)
1830 __set_backend_free(x);
1831 _free_backend_job(job);
1833 g_hash_table_insert(backend_info_table, (gpointer)ret,
1839 gboolean queue_job(void *data)
1841 struct backend_job *job = NULL;
1845 /* Pop a job from queue */
1846 for (x = 0; x < num_of_backends; x++) {
1847 if (__is_backend_busy(x))
1850 job = _pop_queue(x);
1855 /* all backend messages queue are empty or busy */
1856 if (x == num_of_backends || job == NULL) {
1857 DBG("no job available");
1861 /* set current backend job */
1862 DBG("handle request type [%d]", job->req_type);
1864 if (job->req_type == REQUEST_TYPE_INSTALL ||
1865 job->req_type == REQUEST_TYPE_MOUNT_INSTALL ||
1866 job->req_type == REQUEST_TYPE_REINSTALL) {
1867 ret = __check_csr(job->pkgid);
1870 _send_fail_signal(job);
1871 _free_backend_job(job);
1876 switch (job->req_type) {
1877 case REQUEST_TYPE_INSTALL:
1878 __set_backend_busy(x);
1880 ret = __process_install(job);
1881 __post_process(ret, x, job);
1883 case REQUEST_TYPE_MOUNT_INSTALL:
1884 __set_backend_busy(x);
1886 ret = __process_mount_install(job);
1887 __post_process(ret, x, job);
1889 case REQUEST_TYPE_REINSTALL:
1890 __set_backend_busy(x);
1892 ret = __process_reinstall(job);
1893 __post_process(ret, x, job);
1895 case REQUEST_TYPE_UNINSTALL:
1896 __set_backend_busy(x);
1898 ret = __process_uninstall(job);
1899 __post_process(ret, x, job);
1901 case REQUEST_TYPE_MOVE:
1902 __set_backend_busy(x);
1904 ret = __process_move(job);
1905 __post_process(ret, x, job);
1907 case REQUEST_TYPE_ENABLE_PKG:
1908 __set_backend_busy(x);
1910 ret = __process_enable_pkg(job);
1912 _send_fail_signal(job);
1913 __post_process(ret, x, job);
1915 case REQUEST_TYPE_DISABLE_PKG:
1916 __set_backend_busy(x);
1918 ret = __process_disable_pkg(job);
1920 _send_fail_signal(job);
1921 __post_process(ret, x, job);
1923 case REQUEST_TYPE_REGISTER_PKG_UPDATE_INFO:
1924 ret = __process_register_pkg_update_info(job);
1925 __free_extra_info(job);
1926 _free_backend_job(job);
1928 case REQUEST_TYPE_UNREGISTER_PKG_UPDATE_INFO:
1929 ret = __process_unregister_pkg_update_info(job);
1930 _free_backend_job(job);
1932 case REQUEST_TYPE_UNREGISTER_ALL_PKG_UPDATE_INFO:
1933 ret = __process_unregister_all_pkg_update_info(job);
1934 _free_backend_job(job);
1936 case REQUEST_TYPE_ENABLE_APP:
1937 ret = __process_enable_app(job);
1938 _free_backend_job(job);
1940 case REQUEST_TYPE_DISABLE_APP:
1941 ret = __process_disable_app(job);
1942 _free_backend_job(job);
1944 case REQUEST_TYPE_GETSIZE:
1945 __set_backend_busy(x);
1946 ret = __process_getsize(job);
1947 __post_process(ret, x, job);
1949 case REQUEST_TYPE_GETSIZE_SYNC:
1950 __set_backend_busy(x);
1951 ret = __process_getsize_sync(job);
1953 __free_extra_info(job);
1954 __post_process(ret, x, job);
1956 case REQUEST_TYPE_CLEARDATA:
1957 __set_backend_busy(x);
1959 ret = __process_cleardata(job);
1960 __post_process(ret, x, job);
1962 case REQUEST_TYPE_CLEARCACHE:
1963 __set_backend_busy(x);
1965 ret = __process_clearcache(job);
1966 __post_process(ret, x, job);
1968 case REQUEST_TYPE_ENABLE_GLOBAL_APP_FOR_UID:
1969 ret = __process_enable_global_app_for_uid(job);
1970 _free_backend_job(job);
1972 case REQUEST_TYPE_DISABLE_GLOBAL_APP_FOR_UID:
1973 ret = __process_disable_global_app_for_uid(job);
1974 _free_backend_job(job);
1976 case REQUEST_TYPE_KILL:
1977 ret = __process_kill(job);
1978 _free_backend_job(job);
1980 case REQUEST_TYPE_CHECK:
1981 ret = __process_check(job);
1982 _free_backend_job(job);
1984 case REQUEST_TYPE_GENERATE_LICENSE_REQUEST:
1985 ret = __process_generate_license_request(job);
1986 _free_backend_job(job);
1988 case REQUEST_TYPE_REGISTER_LICENSE:
1989 ret = __process_register_license(job);
1990 _free_backend_job(job);
1992 case REQUEST_TYPE_DECRYPT_PACKAGE:
1993 ret = __process_decrypt_package(job);
1994 _free_backend_job(job);
1996 case REQUEST_TYPE_ENABLE_APP_SPLASH_SCREEN:
1997 ret = __process_update_app_splash_screen(job, 1);
1998 _free_backend_job(job);
2000 case REQUEST_TYPE_DISABLE_APP_SPLASH_SCREEN:
2001 ret = __process_update_app_splash_screen(job, 0);
2002 _free_backend_job(job);
2004 case REQUEST_TYPE_SET_RESTRICTION_MODE:
2005 ret = __process_set_restriction_mode(job);
2006 _free_backend_job(job);
2008 case REQUEST_TYPE_UNSET_RESTRICTION_MODE:
2009 ret = __process_unset_restriction_mode(job);
2010 _free_backend_job(job);
2012 case REQUEST_TYPE_GET_RESTRICTION_MODE:
2013 ret = __process_get_restriction_mode(job);
2014 _free_backend_job(job);
2016 case REQUEST_TYPE_SET_APP_LABEL:
2017 ret = __process_set_app_label(job);
2018 _free_backend_job(job);
2020 case REQUEST_TYPE_SET_APP_ICON:
2021 ret = __process_set_app_icon(job);
2022 _free_backend_job(job);
2024 case REQUEST_TYPE_MIGRATE_EXTERNAL_IMAGE:
2025 __set_backend_busy(x);
2027 ret = __process_migrate_external_image(job);
2028 __post_process(ret, x, job);
2038 int main(int argc, char *argv[])
2042 DBG("server start");
2044 if (__register_signal_handler()) {
2045 ERR("failed to register signal handler");
2049 r = _init_backend_queue();
2051 ERR("Queue Initialization Failed");
2055 r = __init_backend_info();
2057 ERR("backend info init failed");
2061 r = _init_request_handler();
2063 ERR("dbus init failed");
2067 #if !GLIB_CHECK_VERSION(2, 35, 0)
2070 mainloop = g_main_loop_new(NULL, FALSE);
2072 ERR("g_main_loop_new failed");
2076 DBG("Main loop is created.");
2078 g_main_loop_run(mainloop);
2080 DBG("Quit main loop.");
2081 _fini_request_handler();
2082 __fini_backend_info();
2083 _fini_backend_queue();
2085 g_source_remove(swid);
2086 g_io_channel_unref(sio);
2088 DBG("package manager server terminated.");