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 "pkgmgr_installer.h"
38 #include "pkgmgr_installer_config.h"
39 #include "pkgmgr_installer_debug.h"
40 #include "pkgmgr_installer_info.h"
41 #include "pkgmgr_installer_error.h"
43 #include <pkgmgr-info.h>
45 /* API export macro */
47 #define API __attribute__ ((visibility("default")))
50 #define MAX_STRLEN 1024
51 #define MAX_QUERY_LEN 4096
53 #define CHK_PI_RET(r) \
54 do { if (NULL == pi) return (r); } while (0)
56 #define OPTVAL_PRELOAD 1000
57 #define OPTVAL_FORCE_REMOVAL 1001
58 #define OPTVAL_PRELOAD_RW 1002
59 #define OPTVAL_NO_REMOVAL 1003
60 #define OPTVAL_KEEP_RWDATA 1004
61 #define OPTVAL_PARTIAL_RW 1005
62 #define OPTVAL_MIGRATE_EXTIMG 1006
63 #define OPTVAL_SKIP_CHECK_REFERENCE 1007
64 #define OPTVAL_RECOVER_DB 1008
65 #define OPTVAL_RECOVERY_CLEANUP 1009
67 /* Supported options */
68 const char *short_opts = "k:l:i:d:c:m:t:o:r:p:s:b:e:M:y:u:w:D:A:qGS";
69 const struct option long_opts[] = {
70 { "session-id", 1, NULL, 'k' },
71 { "license-path", 1, NULL, 'l' },
72 { "install", 1, NULL, 'i' },
73 { "uninstall", 1, NULL, 'd' },
74 { "clear", 1, NULL, 'c' },
75 { "move", 1, NULL, 'm' },
76 { "move-type", 1, NULL, 't' },
77 { "optional-data", 0, NULL, 'o' },
78 { "reinstall", 0, NULL, 'r' },
79 { "caller-pkgid", 1, NULL, 'p' },
80 { "tep-path", 1, NULL, 'e' },
81 { "tep-move", 1, NULL, 'M' },
82 { "smack", 1, NULL, 's' },
83 { "manifest-direct-install", 1, NULL, 'y' },
84 { "mount-install", 1, NULL, 'w' },
85 { "recovery", 1, NULL, 'b' },
86 { "debug-mode", 0, NULL, 'G' },
87 { "skip-optimization", 0, NULL, 'S' },
88 { "preload", 0, NULL, OPTVAL_PRELOAD }, /* for preload RO */
89 { "force-remove", 0, NULL, OPTVAL_FORCE_REMOVAL }, /* for preload RO/RW */
90 { "preload-rw", 0, NULL, OPTVAL_PRELOAD_RW }, /* for preload RW */
91 { "no-remove", 0, NULL, OPTVAL_NO_REMOVAL }, /* for preload RW */
92 { "keep-rwdata", 0, NULL, OPTVAL_KEEP_RWDATA }, /* for preload RW */
93 { "partial-rw", 0, NULL, OPTVAL_PARTIAL_RW }, /* for preload RO */
94 { "migrate-extimg", 1, NULL, OPTVAL_MIGRATE_EXTIMG },
95 { "skip-check-reference", 0, NULL, OPTVAL_SKIP_CHECK_REFERENCE },
96 { "recover-db", 1, NULL, OPTVAL_RECOVER_DB },
97 { "recovery-cleanup", 0, NULL, OPTVAL_RECOVERY_CLEANUP },
98 { 0, 0, 0, 0 } /* sentinel */
101 struct pkgmgr_installer {
121 int skip_check_reference;
122 int skip_optimization;
123 int recovery_cleanup;
124 GDBusConnection *conn;
125 GHashTable *pkg_list;
129 typedef struct pkg_signal_info {
134 static uid_t g_target_uid;
135 static int g_debug_mode;
136 static int g_skip_optimization;
137 static pkgmgr_privilege_level g_privilege_level = PM_PRIVILEGE_UNKNOWN;
139 static const char *__get_signal_name(pkgmgr_installer *pi, const char *key,
140 const char *pkg_type)
142 if (strcmp(key, PKGMGR_INSTALLER_INSTALL_PERCENT_KEY_STR) == 0)
144 else if (strcmp(key, PKGMGR_INSTALLER_GET_SIZE_KEY_STR) == 0)
146 else if (strcmp(key, PKGMGR_INSTALLER_APPID_KEY_STR) == 0)
147 return PKGMGR_INSTALLER_UNINSTALL_EVENT_STR;
148 else if (strcmp(pkg_type, PKGMGR_INSTALLER_CLEAR_CACHE_KEY_STR) == 0)
150 else if (pi->is_upgrade)
151 return PKGMGR_INSTALLER_UPGRADE_EVENT_STR;
154 switch (pi->request_type) {
155 case PKGMGR_REQ_INSTALL:
156 case PKGMGR_REQ_MANIFEST_DIRECT_INSTALL:
157 case PKGMGR_REQ_MOUNT_INSTALL:
158 case PKGMGR_REQ_REINSTALL:
159 case PKGMGR_REQ_ENABLE_PKG:
160 case PKGMGR_REQ_RECOVER:
161 return PKGMGR_INSTALLER_INSTALL_EVENT_STR;
162 case PKGMGR_REQ_UNINSTALL:
163 case PKGMGR_REQ_DISABLE_PKG:
164 return PKGMGR_INSTALLER_UNINSTALL_EVENT_STR;
165 case PKGMGR_REQ_UPGRADE:
166 return PKGMGR_INSTALLER_UPGRADE_EVENT_STR;
167 case PKGMGR_REQ_MOVE:
168 return PKGMGR_INSTALLER_MOVE_EVENT_STR;
169 case PKGMGR_REQ_ENABLE_APP:
170 return PKGMGR_INSTALLER_APP_ENABLE_EVENT_STR;
171 case PKGMGR_REQ_DISABLE_APP:
172 return PKGMGR_INSTALLER_APP_DISABLE_EVENT_STR;
173 case PKGMGR_REQ_ENABLE_APP_SPLASH_SCREEN:
174 return PKGMGR_INSTALLER_APP_ENABLE_SPLASH_SCREEN_EVENT_STR;
175 case PKGMGR_REQ_DISABLE_APP_SPLASH_SCREEN:
176 return PKGMGR_INSTALLER_APP_DISABLE_SPLASH_SCREEN_EVENT_STR;
177 case PKGMGR_REQ_CLEAR:
178 return PKGMGR_INSTALLER_CLEAR_EVENT_STR;
179 case PKGMGR_REQ_GETSIZE:
180 return PKGMGR_INSTALLER_GET_SIZE_KEY_STR;
183 ERR("cannot find type");
188 static int __send_signal_for_event(pkgmgr_installer *pi, const char *pkg_type,
189 const char *pkgid, const char *appid, const char *key,
193 const char *tmp_appid = appid;
194 const char *signal_name;
196 GVariantBuilder *builder;
199 if (!pi || pi->conn == NULL)
202 sid = pi->session_id;
206 signal_name = __get_signal_name(pi, key, pkg_type);
208 ERR("unknown signal type");
212 builder = g_variant_builder_new(G_VARIANT_TYPE("a(sss)"));
213 g_variant_builder_add(builder, "(sss)", pkgid,
214 (tmp_appid ? tmp_appid : ""), pkg_type);
215 v = g_variant_new("(usa(sss)ss)",
216 pi->target_uid, sid, builder, key, val);
217 g_variant_builder_unref(builder);
218 if (g_dbus_connection_emit_signal(pi->conn, NULL,
219 PKGMGR_INSTALLER_DBUS_OBJECT_PATH,
220 PKGMGR_INSTALLER_DBUS_INTERFACE, signal_name,
222 ERR("failed to send dbus signal");
224 ERR("err: %s", err->message);
233 static int __send_signal_to_agent(uid_t uid, void *data, size_t len)
236 struct sockaddr_un sa;
239 fd = socket(AF_UNIX, SOCK_STREAM | SOCK_NONBLOCK, 0);
241 ERR("failed to create socket: %d", errno);
245 sa.sun_family = AF_UNIX;
246 snprintf(sa.sun_path, sizeof(sa.sun_path), "/run/pkgmgr/agent/%d", uid);
248 r = connect(fd, (struct sockaddr *)&sa, sizeof(sa));
250 ERR("failed to connect socket(%s): %d", sa.sun_path, errno);
255 r = send(fd, data, len, MSG_NOSIGNAL);
257 ERR("failed to send data: %d", errno);
267 static int __send_signal_for_event_for_uid(pkgmgr_installer *pi, uid_t uid,
268 const char *pkg_type, const char *pkgid, const char *appid,
269 const char *key, const char *val)
272 const char *signal_name;
273 const char *tmp_appid = appid;
275 GVariantBuilder *builder;
283 if (!pi || pi->conn == NULL)
286 sid = pi->session_id;
290 data_len = sizeof(size_t) + sizeof(gsize);
292 signal_name = __get_signal_name(pi, key, pkg_type);
294 ERR("unknown signal name");
298 /* including null byte */
299 name_size = strlen(signal_name) + 1;
300 data_len += name_size;
302 builder = g_variant_builder_new(G_VARIANT_TYPE("a(sss)"));
303 g_variant_builder_add(builder, "(sss)", pkgid,
304 (tmp_appid ? tmp_appid : ""), pkg_type);
305 gv = g_variant_new("(usa(sss)ss)", pi->target_uid, sid,
307 g_variant_builder_unref(builder);
309 ERR("failed to create GVariant instance");
312 gv_len = g_variant_get_size(gv);
313 gv_data = g_malloc(gv_len);
314 g_variant_store(gv, gv_data);
318 data = malloc(data_len);
320 ERR("out of memory");
325 memcpy(ptr, &name_size, sizeof(size_t));
326 ptr += sizeof(size_t);
327 memcpy(ptr, &gv_len, sizeof(gsize));
328 ptr += sizeof(gsize);
329 memcpy(ptr, signal_name, name_size);
331 memcpy(ptr, gv_data, gv_len);
334 if (__send_signal_to_agent(uid, data, data_len)) {
335 ERR("failed to send signal to agent");
345 static void __free_pkg_list(gpointer data)
347 pkg_signal_info *info = (pkg_signal_info *)data;
349 free(info->pkg_type);
353 API pkgmgr_installer *pkgmgr_installer_new(void)
355 pkgmgr_installer *pi;
358 pi = calloc(1, sizeof(struct pkgmgr_installer));
362 pi->conn = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, &err);
363 if (pi->conn == NULL) {
364 ERR("failed to get bus: %s", err->message);
372 pi->request_type = PKGMGR_REQ_INVALID;
373 pi->pkg_list = g_hash_table_new_full(
374 g_str_hash, g_str_equal, NULL, __free_pkg_list);
378 API pkgmgr_installer *pkgmgr_installer_offline_new(void)
380 pkgmgr_installer *pi;
382 pi = calloc(1, sizeof(struct pkgmgr_installer));
388 pi->request_type = PKGMGR_REQ_INVALID;
393 API int pkgmgr_installer_free(pkgmgr_installer *pi)
399 free(pi->pkgmgr_info);
401 free(pi->session_id);
402 if (pi->optional_data)
403 free(pi->optional_data);
404 if (pi->caller_pkgid)
405 free(pi->caller_pkgid);
410 g_dbus_connection_flush_sync(pi->conn, NULL, NULL);
411 g_object_unref(pi->conn);
415 g_list_free_full(pi->pkgs, free);
418 g_hash_table_destroy(pi->pkg_list);
425 static void __parse_multiple_pkgs(pkgmgr_installer *pi, int argc, char **argv)
427 while ((optind <= argc) && (*argv[optind - 1] != '-')) {
428 pi->pkgs = g_list_append(pi->pkgs, strdup(argv[optind - 1]));
435 pkgmgr_installer_receive_request(pkgmgr_installer *pi,
436 const int argc, char **argv)
443 optind = 1; /* Initialize optind to clear prev. index */
448 pi->target_uid = getuid();
449 g_target_uid = pi->target_uid;
451 g_skip_optimization = 0;
454 g_list_free_full(pi->pkgs, free);
459 c = getopt_long(argc, argv, short_opts, long_opts, &opt_idx);
460 /* printf("c=%d %c\n", c, c); //debug */
462 break; /* Parse is end */
464 case OPTVAL_PRELOAD: /* request for preload app */
466 DBG("preload request [%d]", pi->is_preload);
468 case OPTVAL_FORCE_REMOVAL: /* request for force-remove */
469 pi->force_removal = 1;
470 DBG("force-remove request [%d]", pi->force_removal);
472 case OPTVAL_PRELOAD_RW: /* request for preload-rw app */
473 pi->is_preload_rw = 1;
474 DBG("preload-rw request [%d]", pi->is_preload_rw);
476 case OPTVAL_NO_REMOVAL: /* request for no-remove */
478 DBG("no-remove request [%d]", pi->no_removal);
480 case OPTVAL_KEEP_RWDATA: /* request for keep-rwdata */
482 DBG("keep-rwdata request [%d]", pi->keep_rwdata);
484 case OPTVAL_PARTIAL_RW: /* request for partial-rw */
486 DBG("partial-rw request [%d]", pi->partial_rw);
488 case OPTVAL_MIGRATE_EXTIMG:
489 /* request for legacy extimg migration */
494 mode = OPTVAL_MIGRATE_EXTIMG;
495 pi->request_type = PKGMGR_REQ_MIGRATE_EXTIMG;
497 free(pi->pkgmgr_info);
498 pi->pkgmgr_info = strndup(optarg, MAX_STRLEN);
499 __parse_multiple_pkgs(pi, argc, argv);
500 DBG("legacy extimg migration requested");
502 case OPTVAL_SKIP_CHECK_REFERENCE:
503 pi->skip_check_reference = 1;
505 case OPTVAL_RECOVER_DB:
506 pi->request_type = PKGMGR_REQ_RECOVER_DB;
507 pi->pkgmgr_info = strndup(optarg, MAX_STRLEN);
508 __parse_multiple_pkgs(pi, argc, argv);
510 case OPTVAL_RECOVERY_CLEANUP:
511 pi->recovery_cleanup = 1;
513 case 'k': /* session id */
515 free(pi->session_id);
516 pi->session_id = strndup(optarg, MAX_STRLEN);
519 case 'l': /* license path */
520 if (pi->license_path)
521 free(pi->license_path);
522 pi->license_path = strndup(optarg, MAX_STRLEN);
525 case 'i': /* install */
531 pi->request_type = PKGMGR_REQ_INSTALL;
533 free(pi->pkgmgr_info);
534 pi->pkgmgr_info = strndup(optarg, MAX_STRLEN);
535 __parse_multiple_pkgs(pi, argc, argv);
536 DBG("option is [i] pkgid[%s]", pi->pkgmgr_info);
537 if (pi->pkgmgr_info && strlen(pi->pkgmgr_info) == 0) {
538 free(pi->pkgmgr_info);
539 pi->pkgmgr_info = NULL;
545 case 'e': /* install */
548 pi->tep_path = strndup(optarg, MAX_STRLEN);
549 pi->is_tep_included = 1;
550 DBG("option is [e] tep_path[%s]", pi->tep_path);
553 case 'M': /* install */
554 if (strcmp(optarg, "tep_move") == 0)
558 DBG("option is [M] tep_move[%d]", pi->tep_move);
561 case 'd': /* uninstall */
567 pi->request_type = PKGMGR_REQ_UNINSTALL;
569 free(pi->pkgmgr_info);
570 pi->pkgmgr_info = strndup(optarg, MAX_STRLEN);
571 __parse_multiple_pkgs(pi, argc, argv);
575 case 'c': /* clear */
581 pi->request_type = PKGMGR_REQ_CLEAR;
583 free(pi->pkgmgr_info);
584 pi->pkgmgr_info = strndup(optarg, MAX_STRLEN);
585 __parse_multiple_pkgs(pi, argc, argv);
594 pi->request_type = PKGMGR_REQ_MOVE;
596 free(pi->pkgmgr_info);
597 pi->pkgmgr_info = strndup(optarg, MAX_STRLEN);
598 __parse_multiple_pkgs(pi, argc, argv);
601 case 'r': /* reinstall */
607 pi->request_type = PKGMGR_REQ_REINSTALL;
609 free(pi->pkgmgr_info);
610 pi->pkgmgr_info = strndup(optarg, MAX_STRLEN);
611 __parse_multiple_pkgs(pi, argc, argv);
614 case 't': /* move type*/
615 pi->move_type = atoi(optarg);
618 case 'p': /* caller pkgid*/
619 if (pi->caller_pkgid)
620 free(pi->caller_pkgid);
621 pi->caller_pkgid = strndup(optarg, MAX_STRLEN);
625 case 's': /* smack */
631 pi->request_type = PKGMGR_REQ_SMACK;
633 free(pi->pkgmgr_info);
634 pi->pkgmgr_info = strndup(optarg, MAX_STRLEN);
635 __parse_multiple_pkgs(pi, argc, argv);
638 case 'o': /* optional data*/
639 pi->optional_data = strndup(optarg, MAX_STRLEN);
642 case 'y': /* pkgid for direct manifest installation */
644 pi->request_type = PKGMGR_REQ_MANIFEST_DIRECT_INSTALL;
645 pi->pkgmgr_info = strndup(optarg, MAX_STRLEN);
646 __parse_multiple_pkgs(pi, argc, argv);
649 case 'w': /* pkgid for mount installation */
651 pi->request_type = PKGMGR_REQ_MOUNT_INSTALL;
652 pi->pkgmgr_info = strndup(optarg, MAX_STRLEN);
653 __parse_multiple_pkgs(pi, argc, argv);
656 case 'b': /* recovery */
662 pi->request_type = PKGMGR_REQ_RECOVER;
664 free(pi->pkgmgr_info);
665 pi->pkgmgr_info = strndup(optarg, MAX_STRLEN);
666 __parse_multiple_pkgs(pi, argc, argv);
669 case 'D': /* disable pkg */
670 pi->request_type = PKGMGR_REQ_DISABLE_PKG;
672 free(pi->pkgmgr_info);
673 pi->pkgmgr_info = strndup(optarg, MAX_STRLEN);
674 __parse_multiple_pkgs(pi, argc, argv);
677 case 'A': /* enable pkg */
678 pi->request_type = PKGMGR_REQ_ENABLE_PKG;
680 free(pi->pkgmgr_info);
681 pi->pkgmgr_info = strndup(optarg, MAX_STRLEN);
682 __parse_multiple_pkgs(pi, argc, argv);
686 g_target_uid = (uid_t)atoi(optarg);
687 pi->target_uid = (uid_t)atoi(optarg);
690 case 'G': /* debug mode */
695 case 'S': /* skip optimization */
696 pi->skip_optimization = 1;
697 g_skip_optimization = 1;
701 case '?': /* Not an option */
710 /* if target user is not set, set as tizenglobalapp user */
711 if (pi->target_uid == 0) {
712 pi->target_uid = tzplatform_getuid(TZ_SYS_GLOBALAPP_USER);
713 g_target_uid = pi->target_uid;
719 API int pkgmgr_installer_get_request_type(pkgmgr_installer *pi)
721 CHK_PI_RET(PKGMGR_REQ_INVALID);
722 return pi->request_type;
725 API uid_t pkgmgr_installer_get_uid(pkgmgr_installer *pi)
727 CHK_PI_RET(PKGMGR_REQ_INVALID);
728 return pi->target_uid;
731 API const char *pkgmgr_installer_get_request_info(pkgmgr_installer *pi)
733 CHK_PI_RET(PKGMGR_REQ_INVALID);
734 return pi->pkgmgr_info;
737 API const char *pkgmgr_installer_get_request_info_at(pkgmgr_installer *pi,
740 CHK_PI_RET(PKGMGR_REQ_INVALID);
741 return (const char *)g_list_nth_data(pi->pkgs, at);
744 API int pkgmgr_installer_get_request_info_count(pkgmgr_installer *pi)
746 CHK_PI_RET(PKGMGR_REQ_INVALID);
747 return g_list_length(pi->pkgs);
750 API const char *pkgmgr_installer_get_tep_path(pkgmgr_installer *pi)
752 CHK_PI_RET(PKGMGR_REQ_INVALID);
756 API int pkgmgr_installer_get_tep_move_type(pkgmgr_installer *pi)
758 CHK_PI_RET(PKGMGR_REQ_INVALID);
762 API const char *pkgmgr_installer_get_session_id(pkgmgr_installer *pi)
764 CHK_PI_RET(PKGMGR_REQ_INVALID);
765 return pi->session_id;
768 API const char *pkgmgr_installer_get_license_path(pkgmgr_installer *pi)
770 CHK_PI_RET(PKGMGR_REQ_INVALID);
771 return pi->license_path;
774 API const char *pkgmgr_installer_get_optional_data(pkgmgr_installer *pi)
776 CHK_PI_RET(PKGMGR_REQ_INVALID);
777 return pi->optional_data;
780 API int pkgmgr_installer_is_quiet(pkgmgr_installer *pi)
785 API int pkgmgr_installer_get_move_type(pkgmgr_installer *pi)
787 CHK_PI_RET(PKGMGR_REQ_INVALID);
788 return pi->move_type;
791 API const char *pkgmgr_installer_get_caller_pkgid(pkgmgr_installer *pi)
793 CHK_PI_RET(PKGMGR_REQ_INVALID);
794 return pi->caller_pkgid;
797 API int pkgmgr_installer_get_is_preload(pkgmgr_installer *pi)
799 CHK_PI_RET(PKGMGR_REQ_INVALID);
800 return pi->is_preload;
803 API int pkgmgr_installer_get_force_removal(pkgmgr_installer *pi)
805 CHK_PI_RET(PKGMGR_REQ_INVALID);
806 return pi->force_removal;
809 API int pkgmgr_installer_get_is_preload_rw(pkgmgr_installer *pi)
811 CHK_PI_RET(PKGMGR_REQ_INVALID);
812 return pi->is_preload_rw;
815 API int pkgmgr_installer_get_no_removal(pkgmgr_installer *pi)
817 CHK_PI_RET(PKGMGR_REQ_INVALID);
818 return pi->no_removal;
821 API int pkgmgr_installer_get_keep_rwdata(pkgmgr_installer *pi)
823 CHK_PI_RET(PKGMGR_REQ_INVALID);
824 return pi->keep_rwdata;
827 API int pkgmgr_installer_get_partial_rw(pkgmgr_installer *pi)
829 CHK_PI_RET(PKGMGR_REQ_INVALID);
830 return pi->partial_rw;
833 API int pkgmgr_installer_get_debug_mode(pkgmgr_installer *pi)
835 CHK_PI_RET(PKGMGR_REQ_INVALID);
836 return pi->debug_mode;
839 API int pkgmgr_installer_get_skip_check_reference(pkgmgr_installer *pi)
841 CHK_PI_RET(PKGMGR_REQ_INVALID);
842 return pi->skip_check_reference;
845 API int pkgmgr_installer_get_skip_optimization(pkgmgr_installer *pi)
847 CHK_PI_RET(PKGMGR_REQ_INVALID);
848 return pi->skip_optimization;
851 API int pkgmgr_installer_get_recovery_cleanup(pkgmgr_installer *pi)
853 CHK_PI_RET(PKGMGR_REQ_INVALID);
854 return pi->recovery_cleanup;
857 API int pkgmgr_installer_send_app_uninstall_signal(pkgmgr_installer *pi,
858 const char *pkg_type,
863 ret = __send_signal_for_event(pi, pkg_type, pkgid, NULL,
864 PKGMGR_INSTALLER_APPID_KEY_STR, val);
868 API int pkgmgr_installer_send_app_uninstall_signal_for_uid(
869 pkgmgr_installer *pi, uid_t uid, const char *pkg_type,
870 const char *pkgid, const char *val)
873 ret = __send_signal_for_event_for_uid(pi, uid, pkg_type, pkgid, NULL,
874 PKGMGR_INSTALLER_APPID_KEY_STR, val);
878 API int pkgmgr_installer_set_uid(pkgmgr_installer *pi, uid_t uid)
883 pi->target_uid = uid;
884 g_target_uid = pi->target_uid;
890 pkgmgr_installer_send_app_signal(pkgmgr_installer *pi,
891 const char *pkg_type,
894 const char *key, const char *val)
899 ERR("connection is NULL");
903 r = __send_signal_for_event(pi, pkg_type, pkgid, appid, key, val);
909 pkgmgr_installer_send_signal(pkgmgr_installer *pi,
910 const char *pkg_type,
912 const char *key, const char *val)
917 ERR("connection is NULL");
921 r = __send_signal_for_event(pi, pkg_type, pkgid, NULL, key, val);
926 API int pkgmgr_installer_send_app_signal_for_uid(pkgmgr_installer *pi,
927 uid_t uid, const char *pkg_type, const char *pkgid,
928 const char *appid, const char *key, const char *val)
933 ERR("connection is NULL");
937 r = __send_signal_for_event_for_uid(pi, uid, pkg_type, pkgid, appid,
943 API int pkgmgr_installer_send_signal_for_uid(pkgmgr_installer *pi,
944 uid_t uid, const char *pkg_type, const char *pkgid,
945 const char *key, const char *val)
950 ERR("connection is NULL");
954 r = __send_signal_for_event_for_uid(pi, uid, pkg_type, pkgid, NULL,
960 API int pkgmgr_installer_set_request_type(pkgmgr_installer *pi, int request_type)
965 pi->request_type = request_type;
969 API int pkgmgr_installer_set_session_id(pkgmgr_installer *pi, const char *session_id)
971 if (pi == NULL || session_id == NULL)
974 pi->session_id = strndup(session_id, MAX_STRLEN);
978 API int pkgmgr_installer_create_certinfo_set_handle(pkgmgr_instcertinfo_h *handle)
981 ret = pkgmgrinfo_create_certinfo_set_handle(handle);
985 API int pkgmgr_installer_set_cert_value(pkgmgr_instcertinfo_h handle, pkgmgr_instcert_type cert_type, char *cert_value)
988 ret = pkgmgrinfo_set_cert_value(handle, cert_type, cert_value);
992 API int pkgmgr_installer_save_certinfo(const char *pkgid, pkgmgr_instcertinfo_h handle, uid_t uid)
995 ret = pkgmgrinfo_save_certinfo(pkgid, handle, uid);
999 API int pkgmgr_installer_destroy_certinfo_set_handle(pkgmgr_instcertinfo_h handle)
1002 ret = pkgmgrinfo_destroy_certinfo_set_handle(handle);
1006 API int pkgmgr_installer_delete_certinfo(const char *pkgid)
1009 ret = pkgmgrinfo_delete_certinfo(pkgid);
1013 API int pkgmgr_installer_set_privilege_level(pkgmgr_privilege_level level)
1015 g_privilege_level = level;
1020 API int pkgmgr_installer_info_get_target_uid(uid_t *uid)
1022 *uid = g_target_uid;
1027 API int pkgmgr_installer_info_get_privilege_level(pkgmgr_privilege_level *level)
1029 *level = g_privilege_level;
1034 API int pkgmgr_installer_info_get_debug_mode(int *debug_mode)
1036 *debug_mode = g_debug_mode;
1040 API int pkgmgr_installer_info_get_skip_optimization(int *skip_optimization)
1042 *skip_optimization = g_skip_optimization;
1046 #define CASE_TO_STR(ERRCODE) case ERRCODE: return ERRCODE##_STR
1047 API const char *pkgmgr_installer_error_to_string(int error_code)
1049 switch (error_code) {
1050 CASE_TO_STR(PKGMGR_INSTALLER_ERRCODE_UNDEFINED_ERROR);
1051 CASE_TO_STR(PKGMGR_INSTALLER_ERRCODE_GLOBALSYMLINK_ERROR);
1052 CASE_TO_STR(PKGMGR_INSTALLER_ERRCODE_GRANT_PERMISSION_ERROR);
1053 CASE_TO_STR(PKGMGR_INSTALLER_ERRCODE_IMAGE_ERROR);
1054 CASE_TO_STR(PKGMGR_INSTALLER_ERRCODE_UNZIP_ERROR);
1055 CASE_TO_STR(PKGMGR_INSTALLER_ERRCODE_SECURITY_ERROR);
1056 CASE_TO_STR(PKGMGR_INSTALLER_ERRCODE_REGISTER_ERROR);
1057 CASE_TO_STR(PKGMGR_INSTALLER_ERRCODE_PRIVILEGE_ERROR);
1058 CASE_TO_STR(PKGMGR_INSTALLER_ERRCODE_PARSE_ERROR);
1059 CASE_TO_STR(PKGMGR_INSTALLER_ERRCODE_RECOVERY_ERROR);
1060 CASE_TO_STR(PKGMGR_INSTALLER_ERRCODE_DELTA_ERROR);
1061 CASE_TO_STR(PKGMGR_INSTALLER_ERRCODE_APP_DIR_ERROR);
1062 CASE_TO_STR(PKGMGR_INSTALLER_ERRCODE_CONFIG_ERROR);
1063 CASE_TO_STR(PKGMGR_INSTALLER_ERRCODE_SIGNATURE_ERROR);
1064 CASE_TO_STR(PKGMGR_INSTALLER_ERRCODE_SIGNATURE_INVALID);
1065 CASE_TO_STR(PKGMGR_INSTALLER_ERRCODE_CERT_ERROR);
1066 CASE_TO_STR(PKGMGR_INSTALLER_ERRCODE_AUTHOR_CERT_NOT_MATCH);
1067 CASE_TO_STR(PKGMGR_INSTALLER_ERRCODE_AUTHOR_CERT_NOT_FOUND);
1068 CASE_TO_STR(PKGMGR_INSTALLER_ERRCODE_ICON_ERROR);
1069 CASE_TO_STR(PKGMGR_INSTALLER_ERRCODE_ICON_NOT_FOUND);
1070 CASE_TO_STR(PKGMGR_INSTALLER_ERRCODE_MANIFEST_ERROR);
1071 CASE_TO_STR(PKGMGR_INSTALLER_ERRCODE_MANIFEST_NOT_FOUND);
1072 CASE_TO_STR(PKGMGR_INSTALLER_ERRCODE_PACKAGE_NOT_FOUND);
1073 CASE_TO_STR(PKGMGR_INSTALLER_ERRCODE_OPERATION_NOT_ALLOWED);
1074 CASE_TO_STR(PKGMGR_INSTALLER_ERRCODE_OUT_OF_SPACE);
1075 CASE_TO_STR(PKGMGR_INSTALLER_ERRCODE_INVALID_VALUE);
1076 CASE_TO_STR(PKGMGR_INSTALLER_ERRCODE_ERROR);
1077 CASE_TO_STR(PKGMGR_INSTALLER_ERRCODE_OK);
1079 return PKGMGR_INSTALLER_ERRCODE_UNDEFINED_ERROR_STR;
1083 API int pkgmgr_installer_add_pkg(pkgmgr_installer *pi,
1084 const char *pkgid, const char *pkg_type)
1086 pkg_signal_info *info;
1087 if (!pi || !pkgid || !pkg_type) {
1088 ERR("invalid argument");
1092 info = calloc(1, sizeof(pkg_signal_info));
1094 ERR("out of memory");
1098 info->pkgid = strdup(pkgid);
1099 info->pkg_type = strdup(pkg_type);
1100 if (!info->pkgid || !info->pkg_type) {
1101 ERR("out of memory");
1103 free(info->pkg_type);
1107 g_hash_table_insert(pi->pkg_list, (gpointer)info->pkgid, (gpointer)info);
1112 static void __build_multi_signal(gpointer key, gpointer value,
1115 GVariantBuilder *builder = (GVariantBuilder *)user_data;
1116 pkg_signal_info *info = (pkg_signal_info *)value;
1118 g_variant_builder_add(builder, "(sss)", info->pkgid, "", info->pkg_type);
1121 API int pkgmgr_installer_send_signals(pkgmgr_installer *pi,
1122 const char *key, const char *val)
1125 const char *signal_name;
1127 GVariantBuilder *builder;
1129 if (!pi || !key || !val) {
1130 ERR("invalid argument");
1134 sid = pi->session_id;
1138 signal_name = __get_signal_name(pi, key, "");
1140 ERR("unknown signal type");
1144 builder = g_variant_builder_new(G_VARIANT_TYPE("a(sss)"));
1145 g_hash_table_foreach(pi->pkg_list, __build_multi_signal, builder);
1146 if (g_dbus_connection_emit_signal(pi->conn, NULL,
1147 PKGMGR_INSTALLER_DBUS_OBJECT_PATH,
1148 PKGMGR_INSTALLER_DBUS_INTERFACE, signal_name,
1149 g_variant_new("(usa(sss)ss)",
1150 pi->target_uid, sid, builder, key,
1151 val), &err) != TRUE) {
1152 ERR("failed to send dbus signal");
1154 ERR("err: %s", err->message);
1157 g_variant_builder_unref(builder);
1160 g_variant_builder_unref(builder);
1165 API int pkgmgr_installer_send_signals_for_uid(pkgmgr_installer *pi, uid_t uid,
1166 const char *key, const char *val)
1172 GVariantBuilder *builder;
1177 const char *signal_name;
1179 if (!pi || !pi->conn) {
1180 ERR("connection is NULL");
1184 sid = pi->session_id;
1188 data_len = sizeof(size_t) + sizeof(gsize);
1190 /* including null byte */
1191 signal_name = __get_signal_name(pi, key, "");
1193 ERR("unknown signal type");
1196 name_size = strlen(signal_name) + 1;
1197 data_len += name_size;
1199 builder = g_variant_builder_new(G_VARIANT_TYPE("a(sss)"));
1200 g_hash_table_foreach(pi->pkg_list, __build_multi_signal, builder);
1202 gv = g_variant_new("(usa(sss)ss)", uid, sid, builder, key, val);
1203 g_variant_builder_unref(builder);
1205 ERR("failed to create GVariant instance");
1209 gv_len = g_variant_get_size(gv);
1210 gv_data = g_malloc(gv_len);
1211 g_variant_store(gv, gv_data);
1212 g_variant_unref(gv);
1215 data = malloc(data_len);
1217 ERR("out of memory");
1222 memcpy(ptr, &name_size, sizeof(size_t));
1223 ptr += sizeof(size_t);
1224 memcpy(ptr, &gv_len, sizeof(gsize));
1225 ptr += sizeof(gsize);
1226 memcpy(ptr, signal_name, name_size);
1228 memcpy(ptr, gv_data, gv_len);
1231 if (__send_signal_to_agent(uid, data, data_len)) {
1232 ERR("failed to send signal to agent");
1242 API int pkgmgr_installer_set_is_upgrade(pkgmgr_installer *pi, int is_upgrade) {
1246 pi->is_upgrade = is_upgrade;