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>
30 #include <sys/socket.h>
35 #include <tzplatform_config.h>
37 #include "package-manager.h"
38 #include "pkgmgr_installer.h"
39 #include "pkgmgr_installer_config.h"
40 #include "pkgmgr_installer_debug.h"
41 #include "pkgmgr_installer_info.h"
42 #include "pkgmgr_installer_error.h"
44 #include <pkgmgr-info.h>
46 /* API export macro */
48 #define API __attribute__ ((visibility("default")))
51 #define MAX_STRLEN 1024
52 #define MAX_QUERY_LEN 4096
54 #define CHK_PI_RET(r) \
55 do { if (NULL == pi) return (r); } while (0)
57 #define OPTVAL_PRELOAD 1000
58 #define OPTVAL_FORCE_REMOVAL 1001
59 #define OPTVAL_PRELOAD_RW 1002
60 #define OPTVAL_NO_REMOVAL 1003
61 #define OPTVAL_KEEP_RWDATA 1004
62 #define OPTVAL_PARTIAL_RW 1005
63 #define OPTVAL_MIGRATE_EXTIMG 1006
64 #define OPTVAL_SKIP_CHECK_REFERENCE 1007
65 #define OPTVAL_RECOVER_DB 1008
66 #define OPTVAL_RECOVERY_CLEANUP 1009
68 /* Supported options */
69 const char *short_opts = "k:l:i:d:c:m:t:o:r:p:s:b:e:M:y:u:w:D:A:qGS";
70 const struct option long_opts[] = {
71 { "session-id", 1, NULL, 'k' },
72 { "license-path", 1, NULL, 'l' },
73 { "install", 1, NULL, 'i' },
74 { "uninstall", 1, NULL, 'd' },
75 { "clear", 1, NULL, 'c' },
76 { "move", 1, NULL, 'm' },
77 { "move-type", 1, NULL, 't' },
78 { "optional-data", 0, NULL, 'o' },
79 { "reinstall", 0, NULL, 'r' },
80 { "caller-pkgid", 1, NULL, 'p' },
81 { "tep-path", 1, NULL, 'e' },
82 { "tep-move", 1, NULL, 'M' },
83 { "smack", 1, NULL, 's' },
84 { "manifest-direct-install", 1, NULL, 'y' },
85 { "mount-install", 1, NULL, 'w' },
86 { "recovery", 1, NULL, 'b' },
87 { "debug-mode", 0, NULL, 'G' },
88 { "skip-optimization", 0, NULL, 'S' },
89 { "preload", 0, NULL, OPTVAL_PRELOAD }, /* for preload RO */
90 { "force-remove", 0, NULL, OPTVAL_FORCE_REMOVAL }, /* for preload RO/RW */
91 { "preload-rw", 0, NULL, OPTVAL_PRELOAD_RW }, /* for preload RW */
92 { "no-remove", 0, NULL, OPTVAL_NO_REMOVAL }, /* for preload RW */
93 { "keep-rwdata", 0, NULL, OPTVAL_KEEP_RWDATA }, /* for preload RW */
94 { "partial-rw", 0, NULL, OPTVAL_PARTIAL_RW }, /* for preload RO */
95 { "migrate-extimg", 1, NULL, OPTVAL_MIGRATE_EXTIMG },
96 { "skip-check-reference", 0, NULL, OPTVAL_SKIP_CHECK_REFERENCE },
97 { "recover-db", 1, NULL, OPTVAL_RECOVER_DB },
98 { "recovery-cleanup", 0, NULL, OPTVAL_RECOVERY_CLEANUP },
99 { 0, 0, 0, 0 } /* sentinel */
102 struct pkgmgr_installer {
122 int skip_check_reference;
123 int skip_optimization;
124 int recovery_cleanup;
125 GDBusConnection *conn;
126 GHashTable *pkg_list;
130 typedef struct pkg_signal_info {
135 static uid_t g_target_uid;
136 static int g_debug_mode;
137 static int g_skip_optimization;
138 static pkgmgr_privilege_level g_privilege_level = PM_PRIVILEGE_UNKNOWN;
140 static const char *__get_signal_name(pkgmgr_installer *pi, const char *key,
141 const char *pkg_type)
143 if (strcmp(key, PKGMGR_INSTALLER_INSTALL_PERCENT_KEY_STR) == 0)
145 else if (strcmp(key, PKGMGR_INSTALLER_GET_SIZE_KEY_STR) == 0)
147 else if (strcmp(key, PKGMGR_INSTALLER_APPID_KEY_STR) == 0)
148 return PKGMGR_INSTALLER_UNINSTALL_EVENT_STR;
149 else if (strcmp(pkg_type, PKGMGR_INSTALLER_CLEAR_CACHE_KEY_STR) == 0)
151 else if (pi->is_upgrade)
152 return PKGMGR_INSTALLER_UPGRADE_EVENT_STR;
155 switch (pi->request_type) {
156 case PKGMGR_REQ_INSTALL:
157 case PKGMGR_REQ_MANIFEST_DIRECT_INSTALL:
158 case PKGMGR_REQ_MOUNT_INSTALL:
159 case PKGMGR_REQ_REINSTALL:
160 case PKGMGR_REQ_ENABLE_PKG:
161 case PKGMGR_REQ_RECOVER:
162 return PKGMGR_INSTALLER_INSTALL_EVENT_STR;
163 case PKGMGR_REQ_UNINSTALL:
164 case PKGMGR_REQ_DISABLE_PKG:
165 return PKGMGR_INSTALLER_UNINSTALL_EVENT_STR;
166 case PKGMGR_REQ_UPGRADE:
167 return PKGMGR_INSTALLER_UPGRADE_EVENT_STR;
168 case PKGMGR_REQ_MOVE:
169 return PKGMGR_INSTALLER_MOVE_EVENT_STR;
170 case PKGMGR_REQ_ENABLE_APP:
171 return PKGMGR_INSTALLER_APP_ENABLE_EVENT_STR;
172 case PKGMGR_REQ_DISABLE_APP:
173 return PKGMGR_INSTALLER_APP_DISABLE_EVENT_STR;
174 case PKGMGR_REQ_ENABLE_APP_SPLASH_SCREEN:
175 return PKGMGR_INSTALLER_APP_ENABLE_SPLASH_SCREEN_EVENT_STR;
176 case PKGMGR_REQ_DISABLE_APP_SPLASH_SCREEN:
177 return PKGMGR_INSTALLER_APP_DISABLE_SPLASH_SCREEN_EVENT_STR;
178 case PKGMGR_REQ_CLEAR:
179 return PKGMGR_INSTALLER_CLEAR_EVENT_STR;
180 case PKGMGR_REQ_GETSIZE:
181 return PKGMGR_INSTALLER_GET_SIZE_KEY_STR;
182 case PKGMGR_REQ_RES_COPY:
183 return PKGMGR_INSTALLER_RES_COPY_EVENT_STR;
184 case PKGMGR_REQ_RES_REMOVE:
185 return PKGMGR_INSTALLER_RES_REMOVE_EVENT_STR;
186 case PKGMGR_REQ_RES_UNINSTALL:
187 return PKGMGR_INSTALLER_RES_UNINSTALL_EVENT_STR;
190 ERR("cannot find type");
195 static int __send_signal_for_event(pkgmgr_installer *pi, const char *pkg_type,
196 const char *pkgid, const char *appid, const char *key,
200 const char *tmp_appid = appid;
201 const char *signal_name;
203 GVariantBuilder *builder;
206 if (!pi || pi->conn == NULL)
209 sid = pi->session_id;
213 signal_name = __get_signal_name(pi, key, pkg_type);
215 ERR("unknown signal type");
219 builder = g_variant_builder_new(G_VARIANT_TYPE("a(sss)"));
220 g_variant_builder_add(builder, "(sss)", pkgid,
221 (tmp_appid ? tmp_appid : ""), pkg_type);
222 v = g_variant_new("(usa(sss)ss)",
223 pi->target_uid, sid, builder, key, val);
224 g_variant_builder_unref(builder);
225 if (g_dbus_connection_emit_signal(pi->conn, NULL,
226 PKGMGR_INSTALLER_DBUS_OBJECT_PATH,
227 PKGMGR_INSTALLER_DBUS_INTERFACE, signal_name,
229 ERR("failed to send dbus signal");
231 ERR("err: %s", err->message);
240 static int __send_signal_to_agent(uid_t uid, void *data, size_t len)
243 struct sockaddr_un sa;
246 fd = socket(AF_UNIX, SOCK_STREAM | SOCK_NONBLOCK, 0);
248 ERR("failed to create socket: %d", errno);
252 sa.sun_family = AF_UNIX;
253 snprintf(sa.sun_path, sizeof(sa.sun_path), "/run/pkgmgr/agent/%d", uid);
255 r = connect(fd, (struct sockaddr *)&sa, sizeof(sa));
257 ERR("failed to connect socket(%s): %d", sa.sun_path, errno);
262 r = send(fd, data, len, MSG_NOSIGNAL);
264 ERR("failed to send data: %d", errno);
274 static int __send_signal_for_event_for_uid(pkgmgr_installer *pi, uid_t uid,
275 const char *pkg_type, const char *pkgid, const char *appid,
276 const char *key, const char *val)
279 const char *signal_name;
280 const char *tmp_appid = appid;
282 GVariantBuilder *builder;
290 if (!pi || pi->conn == NULL)
293 sid = pi->session_id;
297 data_len = sizeof(size_t) + sizeof(gsize);
299 signal_name = __get_signal_name(pi, key, pkg_type);
301 ERR("unknown signal name");
305 /* including null byte */
306 name_size = strlen(signal_name) + 1;
307 data_len += name_size;
309 builder = g_variant_builder_new(G_VARIANT_TYPE("a(sss)"));
310 g_variant_builder_add(builder, "(sss)", pkgid,
311 (tmp_appid ? tmp_appid : ""), pkg_type);
312 gv = g_variant_new("(usa(sss)ss)", pi->target_uid, sid,
314 g_variant_builder_unref(builder);
316 ERR("failed to create GVariant instance");
319 gv_len = g_variant_get_size(gv);
320 gv_data = g_malloc(gv_len);
321 g_variant_store(gv, gv_data);
325 data = malloc(data_len);
327 ERR("out of memory");
332 memcpy(ptr, &name_size, sizeof(size_t));
333 ptr += sizeof(size_t);
334 memcpy(ptr, &gv_len, sizeof(gsize));
335 ptr += sizeof(gsize);
336 memcpy(ptr, signal_name, name_size);
338 memcpy(ptr, gv_data, gv_len);
341 if (__send_signal_to_agent(uid, data, data_len)) {
342 ERR("failed to send signal to agent");
352 static void __free_pkg_list(gpointer data)
354 pkg_signal_info *info = (pkg_signal_info *)data;
356 free(info->pkg_type);
360 API pkgmgr_installer *pkgmgr_installer_new(void)
362 pkgmgr_installer *pi;
365 pi = calloc(1, sizeof(struct pkgmgr_installer));
369 pi->conn = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &err);
370 if (pi->conn == NULL) {
371 ERR("failed to get bus: %s", err->message);
379 pi->request_type = PKGMGR_REQ_INVALID;
380 pi->pkg_list = g_hash_table_new_full(
381 g_str_hash, g_str_equal, NULL, __free_pkg_list);
385 API pkgmgr_installer *pkgmgr_installer_offline_new(void)
387 pkgmgr_installer *pi;
389 pi = calloc(1, sizeof(struct pkgmgr_installer));
395 pi->request_type = PKGMGR_REQ_INVALID;
400 API int pkgmgr_installer_free(pkgmgr_installer *pi)
406 free(pi->pkgmgr_info);
408 free(pi->session_id);
409 if (pi->optional_data)
410 free(pi->optional_data);
411 if (pi->caller_pkgid)
412 free(pi->caller_pkgid);
417 g_dbus_connection_flush_sync(pi->conn, NULL, NULL);
418 g_object_unref(pi->conn);
422 g_list_free_full(pi->pkgs, free);
425 g_hash_table_destroy(pi->pkg_list);
432 static void __parse_multiple_pkgs(pkgmgr_installer *pi, int argc, char **argv)
434 while ((optind <= argc) && (*argv[optind - 1] != '-')) {
435 pi->pkgs = g_list_append(pi->pkgs, strdup(argv[optind - 1]));
442 pkgmgr_installer_receive_request(pkgmgr_installer *pi,
443 const int argc, char **argv)
450 optind = 1; /* Initialize optind to clear prev. index */
455 pi->target_uid = getuid();
456 g_target_uid = pi->target_uid;
458 g_skip_optimization = 0;
461 g_list_free_full(pi->pkgs, free);
466 c = getopt_long(argc, argv, short_opts, long_opts, &opt_idx);
467 /* printf("c=%d %c\n", c, c); //debug */
469 break; /* Parse is end */
471 case OPTVAL_PRELOAD: /* request for preload app */
473 DBG("preload request [%d]", pi->is_preload);
475 case OPTVAL_FORCE_REMOVAL: /* request for force-remove */
476 pi->force_removal = 1;
477 DBG("force-remove request [%d]", pi->force_removal);
479 case OPTVAL_PRELOAD_RW: /* request for preload-rw app */
480 pi->is_preload_rw = 1;
481 DBG("preload-rw request [%d]", pi->is_preload_rw);
483 case OPTVAL_NO_REMOVAL: /* request for no-remove */
485 DBG("no-remove request [%d]", pi->no_removal);
487 case OPTVAL_KEEP_RWDATA: /* request for keep-rwdata */
489 DBG("keep-rwdata request [%d]", pi->keep_rwdata);
491 case OPTVAL_PARTIAL_RW: /* request for partial-rw */
493 DBG("partial-rw request [%d]", pi->partial_rw);
495 case OPTVAL_MIGRATE_EXTIMG:
496 /* request for legacy extimg migration */
501 mode = OPTVAL_MIGRATE_EXTIMG;
502 pi->request_type = PKGMGR_REQ_MIGRATE_EXTIMG;
504 free(pi->pkgmgr_info);
505 pi->pkgmgr_info = strndup(optarg, MAX_STRLEN);
506 __parse_multiple_pkgs(pi, argc, argv);
507 DBG("legacy extimg migration requested");
509 case OPTVAL_SKIP_CHECK_REFERENCE:
510 pi->skip_check_reference = 1;
512 case OPTVAL_RECOVER_DB:
513 pi->request_type = PKGMGR_REQ_RECOVER_DB;
514 pi->pkgmgr_info = strndup(optarg, MAX_STRLEN);
515 __parse_multiple_pkgs(pi, argc, argv);
517 case OPTVAL_RECOVERY_CLEANUP:
518 pi->recovery_cleanup = 1;
520 case 'k': /* session id */
522 free(pi->session_id);
523 pi->session_id = strndup(optarg, MAX_STRLEN);
526 case 'l': /* license path */
527 if (pi->license_path)
528 free(pi->license_path);
529 pi->license_path = strndup(optarg, MAX_STRLEN);
532 case 'i': /* install */
538 pi->request_type = PKGMGR_REQ_INSTALL;
540 free(pi->pkgmgr_info);
541 pi->pkgmgr_info = strndup(optarg, MAX_STRLEN);
542 __parse_multiple_pkgs(pi, argc, argv);
543 DBG("option is [i] pkgid[%s]", pi->pkgmgr_info);
544 if (pi->pkgmgr_info && strlen(pi->pkgmgr_info) == 0) {
545 free(pi->pkgmgr_info);
546 pi->pkgmgr_info = NULL;
552 case 'e': /* install */
555 pi->tep_path = strndup(optarg, MAX_STRLEN);
556 pi->is_tep_included = 1;
557 DBG("option is [e] tep_path[%s]", pi->tep_path);
560 case 'M': /* install */
561 if (strcmp(optarg, "tep_move") == 0)
565 DBG("option is [M] tep_move[%d]", pi->tep_move);
568 case 'd': /* uninstall */
574 pi->request_type = PKGMGR_REQ_UNINSTALL;
576 free(pi->pkgmgr_info);
577 pi->pkgmgr_info = strndup(optarg, MAX_STRLEN);
578 __parse_multiple_pkgs(pi, argc, argv);
582 case 'c': /* clear */
588 pi->request_type = PKGMGR_REQ_CLEAR;
590 free(pi->pkgmgr_info);
591 pi->pkgmgr_info = strndup(optarg, MAX_STRLEN);
592 __parse_multiple_pkgs(pi, argc, argv);
601 pi->request_type = PKGMGR_REQ_MOVE;
603 free(pi->pkgmgr_info);
604 pi->pkgmgr_info = strndup(optarg, MAX_STRLEN);
605 __parse_multiple_pkgs(pi, argc, argv);
608 case 'r': /* reinstall */
614 pi->request_type = PKGMGR_REQ_REINSTALL;
616 free(pi->pkgmgr_info);
617 pi->pkgmgr_info = strndup(optarg, MAX_STRLEN);
618 __parse_multiple_pkgs(pi, argc, argv);
621 case 't': /* move type*/
622 pi->move_type = atoi(optarg);
625 case 'p': /* caller pkgid*/
626 if (pi->caller_pkgid)
627 free(pi->caller_pkgid);
628 pi->caller_pkgid = strndup(optarg, MAX_STRLEN);
632 case 's': /* smack */
638 pi->request_type = PKGMGR_REQ_SMACK;
640 free(pi->pkgmgr_info);
641 pi->pkgmgr_info = strndup(optarg, MAX_STRLEN);
642 __parse_multiple_pkgs(pi, argc, argv);
645 case 'o': /* optional data*/
646 pi->optional_data = strndup(optarg, MAX_STRLEN);
649 case 'y': /* pkgid for direct manifest installation */
651 pi->request_type = PKGMGR_REQ_MANIFEST_DIRECT_INSTALL;
652 pi->pkgmgr_info = strndup(optarg, MAX_STRLEN);
653 __parse_multiple_pkgs(pi, argc, argv);
656 case 'w': /* pkgid for mount installation */
658 pi->request_type = PKGMGR_REQ_MOUNT_INSTALL;
659 pi->pkgmgr_info = strndup(optarg, MAX_STRLEN);
660 __parse_multiple_pkgs(pi, argc, argv);
663 case 'b': /* recovery */
669 pi->request_type = PKGMGR_REQ_RECOVER;
671 free(pi->pkgmgr_info);
672 pi->pkgmgr_info = strndup(optarg, MAX_STRLEN);
673 __parse_multiple_pkgs(pi, argc, argv);
676 case 'D': /* disable pkg */
677 pi->request_type = PKGMGR_REQ_DISABLE_PKG;
679 free(pi->pkgmgr_info);
680 pi->pkgmgr_info = strndup(optarg, MAX_STRLEN);
681 __parse_multiple_pkgs(pi, argc, argv);
684 case 'A': /* enable pkg */
685 pi->request_type = PKGMGR_REQ_ENABLE_PKG;
687 free(pi->pkgmgr_info);
688 pi->pkgmgr_info = strndup(optarg, MAX_STRLEN);
689 __parse_multiple_pkgs(pi, argc, argv);
693 g_target_uid = (uid_t)atoi(optarg);
694 pi->target_uid = (uid_t)atoi(optarg);
697 case 'G': /* debug mode */
702 case 'S': /* skip optimization */
703 pi->skip_optimization = 1;
704 g_skip_optimization = 1;
708 case '?': /* Not an option */
717 /* if target user is not set, set as tizenglobalapp user */
718 if (pi->target_uid == 0) {
719 pi->target_uid = tzplatform_getuid(TZ_SYS_GLOBALAPP_USER);
720 g_target_uid = pi->target_uid;
726 API int pkgmgr_installer_get_request_type(pkgmgr_installer *pi)
728 CHK_PI_RET(PKGMGR_REQ_INVALID);
729 return pi->request_type;
732 API uid_t pkgmgr_installer_get_uid(pkgmgr_installer *pi)
734 CHK_PI_RET(PKGMGR_REQ_INVALID);
735 return pi->target_uid;
738 API const char *pkgmgr_installer_get_request_info(pkgmgr_installer *pi)
740 CHK_PI_RET(PKGMGR_REQ_INVALID);
741 return pi->pkgmgr_info;
744 API const char *pkgmgr_installer_get_request_info_at(pkgmgr_installer *pi,
747 CHK_PI_RET(PKGMGR_REQ_INVALID);
748 return (const char *)g_list_nth_data(pi->pkgs, at);
751 API int pkgmgr_installer_get_request_info_count(pkgmgr_installer *pi)
753 CHK_PI_RET(PKGMGR_REQ_INVALID);
754 return g_list_length(pi->pkgs);
757 API const char *pkgmgr_installer_get_tep_path(pkgmgr_installer *pi)
759 CHK_PI_RET(PKGMGR_REQ_INVALID);
763 API int pkgmgr_installer_get_tep_move_type(pkgmgr_installer *pi)
765 CHK_PI_RET(PKGMGR_REQ_INVALID);
769 API const char *pkgmgr_installer_get_session_id(pkgmgr_installer *pi)
771 CHK_PI_RET(PKGMGR_REQ_INVALID);
772 return pi->session_id;
775 API const char *pkgmgr_installer_get_license_path(pkgmgr_installer *pi)
777 CHK_PI_RET(PKGMGR_REQ_INVALID);
778 return pi->license_path;
781 API const char *pkgmgr_installer_get_optional_data(pkgmgr_installer *pi)
783 CHK_PI_RET(PKGMGR_REQ_INVALID);
784 return pi->optional_data;
787 API int pkgmgr_installer_is_quiet(pkgmgr_installer *pi)
792 API int pkgmgr_installer_get_move_type(pkgmgr_installer *pi)
794 CHK_PI_RET(PKGMGR_REQ_INVALID);
795 return pi->move_type;
798 API const char *pkgmgr_installer_get_caller_pkgid(pkgmgr_installer *pi)
800 CHK_PI_RET(PKGMGR_REQ_INVALID);
801 return pi->caller_pkgid;
804 API int pkgmgr_installer_get_is_preload(pkgmgr_installer *pi)
806 CHK_PI_RET(PKGMGR_REQ_INVALID);
807 return pi->is_preload;
810 API int pkgmgr_installer_get_force_removal(pkgmgr_installer *pi)
812 CHK_PI_RET(PKGMGR_REQ_INVALID);
813 return pi->force_removal;
816 API int pkgmgr_installer_get_is_preload_rw(pkgmgr_installer *pi)
818 CHK_PI_RET(PKGMGR_REQ_INVALID);
819 return pi->is_preload_rw;
822 API int pkgmgr_installer_get_no_removal(pkgmgr_installer *pi)
824 CHK_PI_RET(PKGMGR_REQ_INVALID);
825 return pi->no_removal;
828 API int pkgmgr_installer_get_keep_rwdata(pkgmgr_installer *pi)
830 CHK_PI_RET(PKGMGR_REQ_INVALID);
831 return pi->keep_rwdata;
834 API int pkgmgr_installer_get_partial_rw(pkgmgr_installer *pi)
836 CHK_PI_RET(PKGMGR_REQ_INVALID);
837 return pi->partial_rw;
840 API int pkgmgr_installer_get_debug_mode(pkgmgr_installer *pi)
842 CHK_PI_RET(PKGMGR_REQ_INVALID);
843 return pi->debug_mode;
846 API int pkgmgr_installer_get_skip_check_reference(pkgmgr_installer *pi)
848 CHK_PI_RET(PKGMGR_REQ_INVALID);
849 return pi->skip_check_reference;
852 API int pkgmgr_installer_get_skip_optimization(pkgmgr_installer *pi)
854 CHK_PI_RET(PKGMGR_REQ_INVALID);
855 return pi->skip_optimization;
858 API int pkgmgr_installer_get_recovery_cleanup(pkgmgr_installer *pi)
860 CHK_PI_RET(PKGMGR_REQ_INVALID);
861 return pi->recovery_cleanup;
864 API int pkgmgr_installer_send_app_uninstall_signal(pkgmgr_installer *pi,
865 const char *pkg_type,
870 ret = __send_signal_for_event(pi, pkg_type, pkgid, NULL,
871 PKGMGR_INSTALLER_APPID_KEY_STR, val);
875 API int pkgmgr_installer_send_app_uninstall_signal_for_uid(
876 pkgmgr_installer *pi, uid_t uid, const char *pkg_type,
877 const char *pkgid, const char *val)
880 ret = __send_signal_for_event_for_uid(pi, uid, pkg_type, pkgid, NULL,
881 PKGMGR_INSTALLER_APPID_KEY_STR, val);
885 API int pkgmgr_installer_set_uid(pkgmgr_installer *pi, uid_t uid)
890 pi->target_uid = uid;
891 g_target_uid = pi->target_uid;
897 pkgmgr_installer_send_app_signal(pkgmgr_installer *pi,
898 const char *pkg_type,
901 const char *key, const char *val)
906 ERR("connection is NULL");
910 r = __send_signal_for_event(pi, pkg_type, pkgid, appid, key, val);
916 pkgmgr_installer_send_signal(pkgmgr_installer *pi,
917 const char *pkg_type,
919 const char *key, const char *val)
924 ERR("connection is NULL");
928 r = __send_signal_for_event(pi, pkg_type, pkgid, NULL, key, val);
933 API int pkgmgr_installer_send_app_signal_for_uid(pkgmgr_installer *pi,
934 uid_t uid, const char *pkg_type, const char *pkgid,
935 const char *appid, const char *key, const char *val)
940 ERR("connection is NULL");
944 r = __send_signal_for_event_for_uid(pi, uid, pkg_type, pkgid, appid,
950 API int pkgmgr_installer_send_signal_for_uid(pkgmgr_installer *pi,
951 uid_t uid, const char *pkg_type, const char *pkgid,
952 const char *key, const char *val)
957 ERR("connection is NULL");
961 r = __send_signal_for_event_for_uid(pi, uid, pkg_type, pkgid, NULL,
967 API int pkgmgr_installer_set_request_type(pkgmgr_installer *pi, int request_type)
972 pi->request_type = request_type;
976 API int pkgmgr_installer_set_session_id(pkgmgr_installer *pi, const char *session_id)
978 if (pi == NULL || session_id == NULL)
981 pi->session_id = strndup(session_id, MAX_STRLEN);
985 API int pkgmgr_installer_create_certinfo_set_handle(pkgmgr_instcertinfo_h *handle)
988 ret = pkgmgrinfo_create_certinfo_set_handle(handle);
992 API int pkgmgr_installer_set_cert_value(pkgmgr_instcertinfo_h handle, pkgmgr_instcert_type cert_type, char *cert_value)
995 ret = pkgmgrinfo_set_cert_value(handle, cert_type, cert_value);
999 API int pkgmgr_installer_save_certinfo(const char *pkgid, pkgmgr_instcertinfo_h handle, uid_t uid)
1002 ret = pkgmgrinfo_save_certinfo(pkgid, handle, uid);
1006 API int pkgmgr_installer_destroy_certinfo_set_handle(pkgmgr_instcertinfo_h handle)
1009 ret = pkgmgrinfo_destroy_certinfo_set_handle(handle);
1013 API int pkgmgr_installer_delete_certinfo(const char *pkgid)
1016 ret = pkgmgrinfo_delete_certinfo(pkgid);
1020 API int pkgmgr_installer_set_privilege_level(pkgmgr_privilege_level level)
1022 g_privilege_level = level;
1027 API int pkgmgr_installer_info_get_target_uid(uid_t *uid)
1029 *uid = g_target_uid;
1034 API int pkgmgr_installer_info_get_privilege_level(pkgmgr_privilege_level *level)
1036 *level = g_privilege_level;
1041 API int pkgmgr_installer_info_get_debug_mode(int *debug_mode)
1043 *debug_mode = g_debug_mode;
1047 API int pkgmgr_installer_info_get_skip_optimization(int *skip_optimization)
1049 *skip_optimization = g_skip_optimization;
1053 #define CASE_TO_STR(ERRCODE) case ERRCODE: return ERRCODE##_STR
1054 API const char *pkgmgr_installer_error_to_string(int error_code)
1056 switch (error_code) {
1057 CASE_TO_STR(PKGMGR_INSTALLER_ERRCODE_UNDEFINED_ERROR);
1058 CASE_TO_STR(PKGMGR_INSTALLER_ERRCODE_GLOBALSYMLINK_ERROR);
1059 CASE_TO_STR(PKGMGR_INSTALLER_ERRCODE_GRANT_PERMISSION_ERROR);
1060 CASE_TO_STR(PKGMGR_INSTALLER_ERRCODE_IMAGE_ERROR);
1061 CASE_TO_STR(PKGMGR_INSTALLER_ERRCODE_UNZIP_ERROR);
1062 CASE_TO_STR(PKGMGR_INSTALLER_ERRCODE_SECURITY_ERROR);
1063 CASE_TO_STR(PKGMGR_INSTALLER_ERRCODE_REGISTER_ERROR);
1064 CASE_TO_STR(PKGMGR_INSTALLER_ERRCODE_PRIVILEGE_ERROR);
1065 CASE_TO_STR(PKGMGR_INSTALLER_ERRCODE_PARSE_ERROR);
1066 CASE_TO_STR(PKGMGR_INSTALLER_ERRCODE_RECOVERY_ERROR);
1067 CASE_TO_STR(PKGMGR_INSTALLER_ERRCODE_DELTA_ERROR);
1068 CASE_TO_STR(PKGMGR_INSTALLER_ERRCODE_APP_DIR_ERROR);
1069 CASE_TO_STR(PKGMGR_INSTALLER_ERRCODE_CONFIG_ERROR);
1070 CASE_TO_STR(PKGMGR_INSTALLER_ERRCODE_SIGNATURE_ERROR);
1071 CASE_TO_STR(PKGMGR_INSTALLER_ERRCODE_SIGNATURE_INVALID);
1072 CASE_TO_STR(PKGMGR_INSTALLER_ERRCODE_CERT_ERROR);
1073 CASE_TO_STR(PKGMGR_INSTALLER_ERRCODE_AUTHOR_CERT_NOT_MATCH);
1074 CASE_TO_STR(PKGMGR_INSTALLER_ERRCODE_AUTHOR_CERT_NOT_FOUND);
1075 CASE_TO_STR(PKGMGR_INSTALLER_ERRCODE_ICON_ERROR);
1076 CASE_TO_STR(PKGMGR_INSTALLER_ERRCODE_ICON_NOT_FOUND);
1077 CASE_TO_STR(PKGMGR_INSTALLER_ERRCODE_MANIFEST_ERROR);
1078 CASE_TO_STR(PKGMGR_INSTALLER_ERRCODE_MANIFEST_NOT_FOUND);
1079 CASE_TO_STR(PKGMGR_INSTALLER_ERRCODE_PACKAGE_NOT_FOUND);
1080 CASE_TO_STR(PKGMGR_INSTALLER_ERRCODE_OPERATION_NOT_ALLOWED);
1081 CASE_TO_STR(PKGMGR_INSTALLER_ERRCODE_OUT_OF_SPACE);
1082 CASE_TO_STR(PKGMGR_INSTALLER_ERRCODE_INVALID_VALUE);
1083 CASE_TO_STR(PKGMGR_INSTALLER_ERRCODE_ERROR);
1084 CASE_TO_STR(PKGMGR_INSTALLER_ERRCODE_OK);
1086 return PKGMGR_INSTALLER_ERRCODE_UNDEFINED_ERROR_STR;
1090 API int pkgmgr_installer_add_pkg(pkgmgr_installer *pi,
1091 const char *pkgid, const char *pkg_type)
1093 pkg_signal_info *info;
1094 if (!pi || !pkgid || !pkg_type) {
1095 ERR("invalid argument");
1099 info = calloc(1, sizeof(pkg_signal_info));
1101 ERR("out of memory");
1105 info->pkgid = strdup(pkgid);
1106 info->pkg_type = strdup(pkg_type);
1107 if (!info->pkgid || !info->pkg_type) {
1108 ERR("out of memory");
1110 free(info->pkg_type);
1114 g_hash_table_insert(pi->pkg_list, (gpointer)info->pkgid, (gpointer)info);
1119 static void __build_multi_signal(gpointer key, gpointer value,
1122 GVariantBuilder *builder = (GVariantBuilder *)user_data;
1123 pkg_signal_info *info = (pkg_signal_info *)value;
1125 g_variant_builder_add(builder, "(sss)", info->pkgid, "", info->pkg_type);
1128 API int pkgmgr_installer_send_signals(pkgmgr_installer *pi,
1129 const char *key, const char *val)
1132 const char *signal_name;
1134 GVariantBuilder *builder;
1136 if (!pi || !key || !val) {
1137 ERR("invalid argument");
1141 sid = pi->session_id;
1145 signal_name = __get_signal_name(pi, key, "");
1147 ERR("unknown signal type");
1151 builder = g_variant_builder_new(G_VARIANT_TYPE("a(sss)"));
1152 g_hash_table_foreach(pi->pkg_list, __build_multi_signal, builder);
1153 if (g_dbus_connection_emit_signal(pi->conn, NULL,
1154 PKGMGR_INSTALLER_DBUS_OBJECT_PATH,
1155 PKGMGR_INSTALLER_DBUS_INTERFACE, signal_name,
1156 g_variant_new("(usa(sss)ss)",
1157 pi->target_uid, sid, builder, key,
1158 val), &err) != TRUE) {
1159 ERR("failed to send dbus signal");
1161 ERR("err: %s", err->message);
1164 g_variant_builder_unref(builder);
1167 g_variant_builder_unref(builder);
1172 API int pkgmgr_installer_send_signals_for_uid(pkgmgr_installer *pi, uid_t uid,
1173 const char *key, const char *val)
1179 GVariantBuilder *builder;
1184 const char *signal_name;
1186 if (!pi || !pi->conn) {
1187 ERR("connection is NULL");
1191 sid = pi->session_id;
1195 data_len = sizeof(size_t) + sizeof(gsize);
1197 /* including null byte */
1198 signal_name = __get_signal_name(pi, key, "");
1200 ERR("unknown signal type");
1203 name_size = strlen(signal_name) + 1;
1204 data_len += name_size;
1206 builder = g_variant_builder_new(G_VARIANT_TYPE("a(sss)"));
1207 g_hash_table_foreach(pi->pkg_list, __build_multi_signal, builder);
1209 gv = g_variant_new("(usa(sss)ss)", uid, sid, builder, key, val);
1210 g_variant_builder_unref(builder);
1212 ERR("failed to create GVariant instance");
1216 gv_len = g_variant_get_size(gv);
1217 gv_data = g_malloc(gv_len);
1218 g_variant_store(gv, gv_data);
1219 g_variant_unref(gv);
1222 data = malloc(data_len);
1224 ERR("out of memory");
1229 memcpy(ptr, &name_size, sizeof(size_t));
1230 ptr += sizeof(size_t);
1231 memcpy(ptr, &gv_len, sizeof(gsize));
1232 ptr += sizeof(gsize);
1233 memcpy(ptr, signal_name, name_size);
1235 memcpy(ptr, gv_data, gv_len);
1238 if (__send_signal_to_agent(uid, data, data_len)) {
1239 ERR("failed to send signal to agent");
1249 API int pkgmgr_installer_set_is_upgrade(pkgmgr_installer *pi, int is_upgrade) {
1253 pi->is_upgrade = is_upgrade;
1257 API int pkgmgr_installer_send_res_copy_signal(pkgmgr_installer *pi,
1258 const char *pkgid, const char *status,
1259 pkgmgr_res_event_info_h event_info)
1262 const char *signal_name;
1265 if (!pi || !pkgid || !status) {
1266 ERR("invalid argument");
1270 sid = pi->session_id;
1274 signal_name = __get_signal_name(pi, "", "");
1276 ERR("unknown signal type");
1280 if (g_dbus_connection_emit_signal(pi->conn, NULL,
1281 PKGMGR_INSTALLER_DBUS_OBJECT_PATH,
1282 PKGMGR_INSTALLER_DBUS_INTERFACE, signal_name,
1283 g_variant_new("(usss)", pi->target_uid, sid,
1284 pkgid, status), &err) != TRUE) {
1285 ERR("failed to send dbus signal");
1287 ERR("err: %s", err->message);
1296 API int pkgmgr_installer_send_res_copy_signal_for_uid(pkgmgr_installer *pi,
1297 uid_t uid, const char *pkgid, const char *status,
1298 pkgmgr_res_event_info_h event_info)
1308 const char *signal_name;
1310 if (!pi || !pi->conn) {
1311 ERR("connection is NULL");
1315 sid = pi->session_id;
1319 data_len = sizeof(size_t) + sizeof(gsize);
1321 /* including null byte */
1322 signal_name = __get_signal_name(pi, "", "");
1324 ERR("unknown signal type");
1327 name_size = strlen(signal_name) + 1;
1328 data_len += name_size;
1330 gv = g_variant_new("(usss)", pi->target_uid, sid, pkgid, status);
1332 ERR("failed to create GVariant instance");
1336 gv_len = g_variant_get_size(gv);
1337 gv_data = g_malloc(gv_len);
1338 g_variant_store(gv, gv_data);
1339 g_variant_unref(gv);
1342 data = malloc(data_len);
1344 ERR("out of memory");
1349 memcpy(ptr, &name_size, sizeof(size_t));
1350 ptr += sizeof(size_t);
1351 memcpy(ptr, &gv_len, sizeof(gsize));
1352 ptr += sizeof(gsize);
1353 memcpy(ptr, signal_name, name_size);
1355 memcpy(ptr, gv_data, gv_len);
1358 if (__send_signal_to_agent(uid, data, data_len)) {
1359 ERR("failed to send signal to agent");