7 #include <gum/gum-user.h>
8 #include <gum/common/gum-user-types.h>
11 #include "pkgmgr-server.h"
12 #include "package-manager.h"
15 #define RETRY_WAIT_USEC (1000000 / 2) /* 0.5 sec */
16 #define PKGMGR_DBUS_SERVICE "org.tizen.pkgmgr"
17 #define PKGMGR_DBUS_OBJECT_PATH "/org/tizen/pkgmgr"
19 static const char instropection_xml[] =
21 " <interface name='org.tizen.pkgmgr'>"
22 " <method name='install'>"
23 " <arg type='u' name='uid' direction='in'/>"
24 " <arg type='s' name='pkgtype' direction='in'/>"
25 " <arg type='s' name='pkgpath' direction='in'/>"
26 " <arg type='as' name='args' direction='in'/>"
27 " <arg type='i' name='ret' direction='out'/>"
28 " <arg type='s' name='reqkey' direction='out'/>"
30 " <method name='reinstall'>"
31 " <arg type='u' name='uid' direction='in'/>"
32 " <arg type='s' name='pkgid' direction='in'/>"
33 " <arg type='i' name='ret' direction='out'/>"
34 " <arg type='s' name='reqkey' direction='out'/>"
36 " <method name='mount_install'>"
37 " <arg type='u' name='uid' direction='in'/>"
38 " <arg type='s' name='pkgtype' direction='in'/>"
39 " <arg type='s' name='pkgpath' direction='in'/>"
40 " <arg type='as' name='args' direction='in'/>"
41 " <arg type='i' name='ret' direction='out'/>"
42 " <arg type='s' name='reqkey' direction='out'/>"
44 " <method name='uninstall'>"
45 " <arg type='u' name='uid' direction='in'/>"
46 " <arg type='s' name='pkgid' direction='in'/>"
47 " <arg type='i' name='ret' direction='out'/>"
48 " <arg type='s' name='reqkey' direction='out'/>"
50 " <method name='move'>"
51 " <arg type='u' name='uid' direction='in'/>"
52 " <arg type='s' name='pkgid' direction='in'/>"
53 " <arg type='i' name='movetype' direction='in'/>"
54 " <arg type='i' name='ret' direction='out'/>"
55 " <arg type='s' name='reqkey' direction='out'/>"
57 " <method name='enable_pkgs'>"
58 " <arg type='u' name='uid' direction='in'/>"
59 " <arg type='as' name='pkgids' direction='in'/>"
60 " <arg type='i' name='ret' direction='out'/>"
61 " <arg type='s' name='reqkey' direction='out'/>"
63 " <method name='disable_pkgs'>"
64 " <arg type='u' name='uid' direction='in'/>"
65 " <arg type='as' name='pkgids' direction='in'/>"
66 " <arg type='i' name='ret' direction='out'/>"
67 " <arg type='s' name='reqkey' direction='out'/>"
69 " <method name='enable_app'>"
70 " <arg type='u' name='uid' direction='in'/>"
71 " <arg type='s' name='appid' direction='in'/>"
72 " <arg type='i' name='ret' direction='out'/>"
73 " <arg type='s' name='reqkey' direction='out'/>"
75 " <method name='disable_app'>"
76 " <arg type='u' name='uid' direction='in'/>"
77 " <arg type='s' name='appid' direction='in'/>"
78 " <arg type='i' name='ret' direction='out'/>"
79 " <arg type='s' name='reqkey' direction='out'/>"
81 " <method name='enable_global_app_for_uid'>"
82 " <arg type='u' name='uid' direction='in'/>"
83 " <arg type='s' name='appid' direction='in'/>"
84 " <arg type='i' name='ret' direction='out'/>"
85 " <arg type='s' name='reqkey' direction='out'/>"
87 " <method name='disable_global_app_for_uid'>"
88 " <arg type='u' name='uid' direction='in'/>"
89 " <arg type='s' name='appid' direction='in'/>"
90 " <arg type='i' name='ret' direction='out'/>"
91 " <arg type='s' name='reqkey' direction='out'/>"
93 " <method name='getsize'>"
94 " <arg type='u' name='uid' direction='in'/>"
95 " <arg type='s' name='pkgid' direction='in'/>"
96 " <arg type='i' name='get_type' direction='in'/>"
97 " <arg type='i' name='ret' direction='out'/>"
98 " <arg type='s' name='reqkey' direction='out'/>"
100 " <method name='getsize_sync'>"
101 " <arg type='u' name='uid' direction='in'/>"
102 " <arg type='s' name='pkgid' direction='in'/>"
103 " <arg type='i' name='get_type' direction='in'/>"
104 " <arg type='i' name='ret' direction='out'/>"
105 " <arg type='x' name='size_info' direction='out'/>"
107 " <method name='cleardata'>"
108 " <arg type='u' name='uid' direction='in'/>"
109 " <arg type='s' name='pkgid' direction='in'/>"
110 " <arg type='i' name='ret' direction='out'/>"
112 " <method name='clearcache'>"
113 " <arg type='u' name='uid' direction='in'/>"
114 " <arg type='s' name='pkgid' direction='in'/>"
115 " <arg type='i' name='ret' direction='out'/>"
117 " <method name='kill'>"
118 " <arg type='u' name='uid' direction='in'/>"
119 " <arg type='s' name='pkgid' direction='in'/>"
120 " <arg type='i' name='ret' direction='out'/>"
121 " <arg type='i' name='pid' direction='out'/>"
123 " <method name='check'>"
124 " <arg type='u' name='uid' direction='in'/>"
125 " <arg type='s' name='pkgid' direction='in'/>"
126 " <arg type='i' name='ret' direction='out'/>"
127 " <arg type='i' name='pid' direction='out'/>"
129 " <method name='generate_license_request'>"
130 " <arg type='s' name='resp_data' direction='in'/>"
131 " <arg type='i' name='ret' direction='out'/>"
132 " <arg type='s' name='req_data' direction='out'/>"
133 " <arg type='s' name='license_url' direction='out'/>"
135 " <method name='register_license'>"
136 " <arg type='s' name='resp_data' direction='in'/>"
137 " <arg type='i' name='ret' direction='out'/>"
139 " <method name='decrypt_package'>"
140 " <arg type='s' name='drm_file_path' direction='in'/>"
141 " <arg type='s' name='decrypted_file_path' direction='in'/>"
142 " <arg type='i' name='ret' direction='out'/>"
144 " <method name='enable_app_splash_screen'>"
145 " <arg type='u' name='uid' direction='in'/>"
146 " <arg type='s' name='appid' direction='in'/>"
147 " <arg type='i' name='ret' direction='out'/>"
149 " <method name='disable_app_splash_screen'>"
150 " <arg type='u' name='uid' direction='in'/>"
151 " <arg type='s' name='appid' direction='in'/>"
152 " <arg type='i' name='ret' direction='out'/>"
154 " <method name='set_restriction_mode'>"
155 " <arg type='u' name='uid' direction='in'/>"
156 " <arg type='s' name='pkgid' direction='in'/>"
157 " <arg type='i' name='mode' direction='in'/>"
158 " <arg type='i' name='ret' direction='out'/>"
160 " <method name='unset_restriction_mode'>"
161 " <arg type='u' name='uid' direction='in'/>"
162 " <arg type='s' name='pkgid' direction='in'/>"
163 " <arg type='i' name='mode' direction='in'/>"
164 " <arg type='i' name='ret' direction='out'/>"
166 " <method name='get_restriction_mode'>"
167 " <arg type='u' name='uid' direction='in'/>"
168 " <arg type='s' name='pkgid' direction='in'/>"
169 " <arg type='i' name='result' direction='out'/>"
170 " <arg type='i' name='ret' direction='out'/>"
172 " <method name='set_app_label'>"
173 " <arg type='u' name='uid' direction='in'/>"
174 " <arg type='s' name='appid' direction='in'/>"
175 " <arg type='s' name='label' direction='in'/>"
176 " <arg type='i' name='ret' direction='out'/>"
180 static GDBusNodeInfo *instropection_data;
182 static guint owner_id;
183 static GHashTable *req_table;
185 static char *__generate_reqkey(const char *pkgid)
189 char timestr[MAX_PKG_ARGS_LEN];
193 gettimeofday(&tv, NULL);
194 curtime = tv.tv_sec * 1000000 + tv.tv_usec;
195 snprintf(timestr, sizeof(timestr), "%ld", curtime);
197 size = strlen(pkgid) + strlen(timestr) + 2;
198 str_req_key = (char *)calloc(size, sizeof(char));
199 if (str_req_key == NULL) {
200 DBG("calloc failed");
203 snprintf(str_req_key, size, "%s_%s", pkgid, timestr);
208 static int __is_admin_user(uid_t uid)
211 GumUserType ut = GUM_USERTYPE_NONE;
215 guser = gum_user_get_sync(uid, FALSE);
217 ERR("cannot get user information from gumd, retry");
219 usleep(RETRY_WAIT_USEC);
223 } while (retry_cnt <= RETRY_MAX);
226 ERR("cannot get user information from gumd, failed");
230 g_object_get(G_OBJECT(guser), "usertype", &ut, NULL);
231 if (ut == GUM_USERTYPE_NONE) {
232 ERR("cannot get user type");
233 g_object_unref(guser);
235 } else if (ut != GUM_USERTYPE_ADMIN) {
236 g_object_unref(guser);
240 g_object_unref(guser);
245 static int __check_caller_permission(uid_t uid,
246 GDBusMethodInvocation *invocation, GVariant *parameters)
252 if (uid < REGULAR_USER)
255 v = g_variant_get_child_value(parameters, 0);
257 g_dbus_method_invocation_return_error_literal(invocation,
258 G_DBUS_ERROR, G_DBUS_ERROR_FAILED,
263 target_uid = g_variant_get_uint32(v);
265 if (uid == target_uid)
268 is_admin = __is_admin_user(uid);
269 if (is_admin == -1) {
270 g_dbus_method_invocation_return_error_literal(invocation,
271 G_DBUS_ERROR, G_DBUS_ERROR_FAILED,
274 } else if (is_admin == 0) {
275 g_dbus_method_invocation_return_error_literal(invocation,
276 G_DBUS_ERROR, G_DBUS_ERROR_ACCESS_DENIED,
277 "Non-admin user cannot request operation to "
285 static int __handle_request_install(uid_t caller_uid,
286 GDBusMethodInvocation *invocation, GVariant *parameters)
288 uid_t target_uid = (uid_t)-1;
289 char *arg_pkgtype = NULL;
291 char *pkgpath = NULL;
294 gchar **tmp_args = NULL;
301 g_variant_get(parameters, "(u&s&s@as)", &target_uid, &arg_pkgtype,
303 tmp_args = (gchar **)g_variant_get_strv(value, &args_count);
305 for (i = 0; i < args_count; i++)
306 len = len + strlen(tmp_args[i]) + 1;
308 args = (char *)calloc(len, sizeof(char));
310 ERR("calloc failed");
311 g_dbus_method_invocation_return_value(invocation,
312 g_variant_new("(is)", PKGMGR_R_ENOMEM, ""));
317 for (i = 0; i < args_count; i++) {
318 strncat(args, tmp_args[i], strlen(tmp_args[i]));
319 if (i != args_count - 1)
320 strncat(args, " ", strlen(" "));
323 if (target_uid == (uid_t)-1 || pkgpath == NULL) {
324 g_dbus_method_invocation_return_value(invocation,
325 g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
330 pkgtype = _get_pkgtype_from_file(pkgpath, caller_uid);
331 if (!pkgtype && arg_pkgtype && strlen(arg_pkgtype))
332 pkgtype = (const char *)arg_pkgtype;
333 if (pkgtype == NULL) {
334 g_dbus_method_invocation_return_value(invocation,
335 g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
340 reqkey = __generate_reqkey(pkgpath);
341 if (reqkey == NULL) {
342 g_dbus_method_invocation_return_value(invocation,
343 g_variant_new("(is)", PKGMGR_R_ENOMEM, ""));
348 if (_push_queue(target_uid, caller_uid, reqkey, REQUEST_TYPE_INSTALL,
349 pkgtype, pkgpath, args)) {
350 g_dbus_method_invocation_return_value(invocation,
351 g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
356 g_dbus_method_invocation_return_value(invocation,
357 g_variant_new("(is)", PKGMGR_R_OK, reqkey));
374 static int __handle_request_mount_install(uid_t caller_uid,
375 GDBusMethodInvocation *invocation, GVariant *parameters)
377 uid_t target_uid = (uid_t)-1;
378 char *arg_pkgtype = NULL;
380 char *pkgpath = NULL;
383 gchar **tmp_args = NULL;
390 g_variant_get(parameters, "(u&s&s@as)", &target_uid, &arg_pkgtype,
392 tmp_args = (gchar **)g_variant_get_strv(value, &args_count);
394 for (i = 0; i < args_count; i++)
395 len = len + strlen(tmp_args[i]) + 1;
397 args = (char *)calloc(len, sizeof(char));
399 ERR("calloc failed");
400 g_dbus_method_invocation_return_value(invocation,
401 g_variant_new("(is)", PKGMGR_R_ENOMEM, ""));
406 for (i = 0; i < args_count; i++) {
407 strncat(args, tmp_args[i], strlen(tmp_args[i]));
408 if (i != args_count - 1)
409 strncat(args, " ", strlen(" "));
412 if (target_uid == (uid_t)-1 || pkgpath == NULL) {
413 g_dbus_method_invocation_return_value(invocation,
414 g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
419 pkgtype = _get_pkgtype_from_file(pkgpath, caller_uid);
420 if (!pkgtype && arg_pkgtype && strlen(arg_pkgtype))
421 pkgtype = (const char *)arg_pkgtype;
422 if (pkgtype == NULL) {
423 g_dbus_method_invocation_return_value(invocation,
424 g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
429 reqkey = __generate_reqkey(pkgpath);
430 if (reqkey == NULL) {
431 g_dbus_method_invocation_return_value(invocation,
432 g_variant_new("(is)", PKGMGR_R_ENOMEM, ""));
437 if (_push_queue(target_uid, caller_uid, reqkey,
438 REQUEST_TYPE_MOUNT_INSTALL,
439 pkgtype, pkgpath, args)) {
440 g_dbus_method_invocation_return_value(invocation,
441 g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
446 g_dbus_method_invocation_return_value(invocation,
447 g_variant_new("(is)", PKGMGR_R_OK, reqkey));
463 static int __handle_request_reinstall(uid_t caller_uid,
464 GDBusMethodInvocation *invocation, GVariant *parameters)
466 uid_t target_uid = (uid_t)-1;
471 g_variant_get(parameters, "(u&s)", &target_uid, &pkgid);
472 if (target_uid == (uid_t)-1 || pkgid == NULL) {
473 g_dbus_method_invocation_return_value(invocation,
474 g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
478 pkgtype = _get_pkgtype_from_pkgid(pkgid, target_uid);
479 if (pkgtype == NULL) {
480 g_dbus_method_invocation_return_value(invocation,
481 g_variant_new("(is)", PKGMGR_R_ENOPKG, ""));
485 reqkey = __generate_reqkey(pkgid);
486 if (reqkey == NULL) {
487 g_dbus_method_invocation_return_value(invocation,
488 g_variant_new("(is)", PKGMGR_R_ENOMEM, ""));
492 if (_push_queue(target_uid, caller_uid, reqkey, REQUEST_TYPE_REINSTALL,
493 pkgtype, pkgid, NULL)) {
494 g_dbus_method_invocation_return_value(invocation,
495 g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
501 g_dbus_method_invocation_return_value(invocation,
502 g_variant_new("(is)", PKGMGR_R_OK, reqkey));
509 static int __handle_request_uninstall(uid_t caller_uid,
510 GDBusMethodInvocation *invocation, GVariant *parameters)
512 uid_t target_uid = (uid_t)-1;
517 g_variant_get(parameters, "(u&s)", &target_uid, &pkgid);
518 if (target_uid == (uid_t)-1 || pkgid == NULL) {
519 g_dbus_method_invocation_return_value(invocation,
520 g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
524 pkgtype = _get_pkgtype_from_pkgid(pkgid, target_uid);
525 if (pkgtype == NULL) {
526 g_dbus_method_invocation_return_value(invocation,
527 g_variant_new("(is)", PKGMGR_R_ENOPKG, ""));
531 reqkey = __generate_reqkey(pkgid);
532 if (reqkey == NULL) {
533 g_dbus_method_invocation_return_value(invocation,
534 g_variant_new("(is)", PKGMGR_R_ENOMEM, ""));
538 if (_push_queue(target_uid, caller_uid, reqkey, REQUEST_TYPE_UNINSTALL,
539 pkgtype, pkgid, NULL)) {
540 g_dbus_method_invocation_return_value(invocation,
541 g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
547 g_dbus_method_invocation_return_value(invocation,
548 g_variant_new("(is)", PKGMGR_R_OK, reqkey));
555 static int __handle_request_move(uid_t caller_uid,
556 GDBusMethodInvocation *invocation, GVariant *parameters)
558 uid_t target_uid = (uid_t)-1;
563 char buf[4] = { '\0' };
565 g_variant_get(parameters, "(u&si)", &target_uid, &pkgid, &move_type);
566 if (target_uid == (uid_t)-1 || pkgid == NULL) {
567 g_dbus_method_invocation_return_value(invocation,
568 g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
572 pkgtype = _get_pkgtype_from_pkgid(pkgid, target_uid);
573 if (pkgtype == NULL) {
574 g_dbus_method_invocation_return_value(invocation,
575 g_variant_new("(is)", PKGMGR_R_ENOPKG, ""));
579 reqkey = __generate_reqkey(pkgid);
580 if (reqkey == NULL) {
581 g_dbus_method_invocation_return_value(invocation,
582 g_variant_new("(is)", PKGMGR_R_ENOMEM, ""));
587 snprintf(buf, sizeof(buf), "%d", move_type);
588 if (_push_queue(target_uid, caller_uid, reqkey, REQUEST_TYPE_MOVE,
589 pkgtype, pkgid, buf)) {
590 g_dbus_method_invocation_return_value(invocation,
591 g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
597 g_dbus_method_invocation_return_value(invocation,
598 g_variant_new("(is)", PKGMGR_R_OK, reqkey));
605 static int __handle_request_enable_pkgs(uid_t caller_uid,
606 GDBusMethodInvocation *invocation, GVariant *parameters)
608 uid_t target_uid = (uid_t)-1;
614 g_variant_get(parameters, "(uas)", &target_uid, &iter);
615 if (target_uid == (uid_t)-1 || iter == NULL) {
616 g_dbus_method_invocation_return_value(invocation,
617 g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
621 reqkey = __generate_reqkey("enable_pkgs");
622 if (reqkey == NULL) {
623 g_dbus_method_invocation_return_value(invocation,
624 g_variant_new("(is)", PKGMGR_R_ENOMEM, ""));
628 while (g_variant_iter_next(iter, "&s", &pkgid)) {
629 pkgtype = _get_pkgtype_from_pkgid(pkgid, target_uid);
630 if (pkgtype == NULL) {
631 g_dbus_method_invocation_return_value(invocation,
632 g_variant_new("(is)",
633 PKGMGR_R_ENOPKG, ""));
637 if (_push_queue(target_uid, caller_uid, reqkey,
638 REQUEST_TYPE_ENABLE_PKG,
639 pkgtype, pkgid, NULL)) {
640 g_dbus_method_invocation_return_value(invocation,
641 g_variant_new("(is)",
642 PKGMGR_R_ESYSTEM, ""));
650 g_dbus_method_invocation_return_value(invocation,
651 g_variant_new("(is)", PKGMGR_R_OK, reqkey));
657 static int __handle_request_disable_pkgs(uid_t caller_uid,
658 GDBusMethodInvocation *invocation, GVariant *parameters)
660 uid_t target_uid = (uid_t)-1;
666 g_variant_get(parameters, "(uas)", &target_uid, &iter);
667 if (target_uid == (uid_t)-1 || iter == NULL) {
668 g_dbus_method_invocation_return_value(invocation,
669 g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
673 reqkey = __generate_reqkey("disable_pkgs");
674 if (reqkey == NULL) {
675 g_dbus_method_invocation_return_value(invocation,
676 g_variant_new("(is)", PKGMGR_R_ENOMEM, ""));
680 while (g_variant_iter_next(iter, "&s", &pkgid)) {
681 pkgtype = _get_pkgtype_from_pkgid(pkgid, target_uid);
682 if (pkgtype == NULL) {
683 g_dbus_method_invocation_return_value(invocation,
684 g_variant_new("(is)",
685 PKGMGR_R_ENOPKG, ""));
689 if (_push_queue(target_uid, caller_uid, reqkey,
690 REQUEST_TYPE_DISABLE_PKG,
691 pkgtype, pkgid, NULL)) {
692 g_dbus_method_invocation_return_value(invocation,
693 g_variant_new("(is)",
694 PKGMGR_R_ESYSTEM, ""));
702 g_dbus_method_invocation_return_value(invocation,
703 g_variant_new("(is)", PKGMGR_R_OK, reqkey));
709 static int __handle_request_enable_app(uid_t caller_uid,
710 GDBusMethodInvocation *invocation, GVariant *parameters)
712 uid_t target_uid = (uid_t)-1;
717 g_variant_get(parameters, "(u&s)", &target_uid, &appid);
718 if (target_uid == (uid_t)-1 || appid == NULL) {
719 g_dbus_method_invocation_return_value(invocation,
720 g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
724 reqkey = __generate_reqkey(appid);
725 if (reqkey == NULL) {
726 g_dbus_method_invocation_return_value(invocation,
727 g_variant_new("(is)", PKGMGR_R_ENOMEM, ""));
732 if (_push_queue(target_uid, caller_uid, reqkey,
733 REQUEST_TYPE_ENABLE_APP, "default",
735 g_dbus_method_invocation_return_value(invocation,
736 g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
741 g_dbus_method_invocation_return_value(invocation,
742 g_variant_new("(is)", PKGMGR_R_OK, reqkey));
753 static int __handle_request_disable_app(uid_t caller_uid,
754 GDBusMethodInvocation *invocation, GVariant *parameters)
756 uid_t target_uid = (uid_t)-1;
761 g_variant_get(parameters, "(u&s)", &target_uid, &appid);
762 if (target_uid == (uid_t)-1 || appid == NULL) {
763 g_dbus_method_invocation_return_value(invocation,
764 g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
768 reqkey = __generate_reqkey(appid);
769 if (reqkey == NULL) {
770 g_dbus_method_invocation_return_value(invocation,
771 g_variant_new("(is)", PKGMGR_R_ENOMEM, ""));
776 if (_push_queue(target_uid, caller_uid, reqkey,
777 REQUEST_TYPE_DISABLE_APP, "default",
779 g_dbus_method_invocation_return_value(invocation,
780 g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
785 g_dbus_method_invocation_return_value(invocation,
786 g_variant_new("(is)", PKGMGR_R_OK, reqkey));
797 static int __handle_request_enable_global_app_for_uid(uid_t caller_uid,
798 GDBusMethodInvocation *invocation, GVariant *parameters)
800 uid_t target_uid = (uid_t)-1;
805 g_variant_get(parameters, "(u&s)", &target_uid, &appid);
806 if (target_uid == (uid_t)-1 || appid == NULL) {
807 g_dbus_method_invocation_return_value(invocation,
808 g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
812 reqkey = __generate_reqkey(appid);
813 if (reqkey == NULL) {
814 g_dbus_method_invocation_return_value(invocation,
815 g_variant_new("(is)", PKGMGR_R_ENOMEM, ""));
820 if (_push_queue(target_uid, caller_uid, reqkey,
821 REQUEST_TYPE_ENABLE_GLOBAL_APP_FOR_UID,
822 "default", appid, NULL)) {
823 g_dbus_method_invocation_return_value(invocation,
824 g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
829 g_dbus_method_invocation_return_value(invocation,
830 g_variant_new("(is)", PKGMGR_R_OK, reqkey));
841 static int __handle_request_disable_global_app_for_uid(uid_t caller_uid,
842 GDBusMethodInvocation *invocation, GVariant *parameters)
844 uid_t target_uid = (uid_t)-1;
849 g_variant_get(parameters, "(u&s)", &target_uid, &appid);
850 if (target_uid == (uid_t)-1 || appid == NULL) {
851 g_dbus_method_invocation_return_value(invocation,
852 g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
856 reqkey = __generate_reqkey(appid);
857 if (reqkey == NULL) {
858 g_dbus_method_invocation_return_value(invocation,
859 g_variant_new("(is)", PKGMGR_R_ENOMEM, ""));
864 if (_push_queue(target_uid, caller_uid, reqkey,
865 REQUEST_TYPE_DISABLE_GLOBAL_APP_FOR_UID,
866 "default", appid, NULL)) {
867 g_dbus_method_invocation_return_value(invocation,
868 g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
873 g_dbus_method_invocation_return_value(invocation,
874 g_variant_new("(is)", PKGMGR_R_OK, reqkey));
885 static int __handle_request_getsize(uid_t caller_uid,
886 GDBusMethodInvocation *invocation, GVariant *parameters)
888 uid_t target_uid = (uid_t)-1;
894 g_variant_get(parameters, "(u&si)", &target_uid, &pkgid, &get_type);
895 if (target_uid == (uid_t)-1 || pkgid == NULL || get_type == -1) {
896 g_dbus_method_invocation_return_value(invocation,
897 g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
901 reqkey = __generate_reqkey(pkgid);
902 if (reqkey == NULL) {
903 g_dbus_method_invocation_return_value(invocation,
904 g_variant_new("(is)", PKGMGR_R_ENOMEM, ""));
908 snprintf(buf, sizeof(buf), "%d", get_type);
909 if (_push_queue(target_uid, caller_uid, reqkey, REQUEST_TYPE_GETSIZE,
910 "pkgtool", pkgid, buf)) {
911 g_dbus_method_invocation_return_value(invocation,
912 g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
917 g_dbus_method_invocation_return_value(invocation,
918 g_variant_new("(is)", PKGMGR_R_OK, reqkey));
924 static int __handle_request_getsize_sync(uid_t caller_uid,
925 GDBusMethodInvocation *invocation, GVariant *parameters)
927 uid_t target_uid = (uid_t)-1;
933 g_variant_get(parameters, "(u&si)", &target_uid, &pkgid, &get_type);
934 if (target_uid == (uid_t)-1 || pkgid == NULL || get_type == -1) {
935 g_dbus_method_invocation_return_value(invocation,
936 g_variant_new("(is)", PKGMGR_R_ECOMM, ""));
940 reqkey = __generate_reqkey(pkgid);
941 if (reqkey == NULL) {
942 g_dbus_method_invocation_return_value(invocation,
943 g_variant_new("(is)", PKGMGR_R_ENOMEM, ""));
947 snprintf(buf, sizeof(buf), "%d", get_type);
948 if (_push_queue(target_uid, caller_uid, reqkey, REQUEST_TYPE_GETSIZE_SYNC,
949 "pkgtool", pkgid, buf)) {
950 g_dbus_method_invocation_return_value(invocation,
951 g_variant_new("(is)", PKGMGR_R_ESYSTEM, ""));
956 if (!g_hash_table_insert(req_table, (gpointer)reqkey,
957 (gpointer)invocation))
958 ERR("reqkey already exists");
963 static int __handle_request_cleardata(uid_t caller_uid,
964 GDBusMethodInvocation *invocation, GVariant *parameters)
966 uid_t target_uid = (uid_t)-1;
971 g_variant_get(parameters, "(u&s)", &target_uid, &pkgid);
972 if (target_uid == (uid_t)-1 || pkgid == NULL) {
973 g_dbus_method_invocation_return_value(invocation,
974 g_variant_new("(i)", PKGMGR_R_ECOMM));
978 pkgtype = _get_pkgtype_from_pkgid(pkgid, target_uid);
979 if (pkgtype == NULL) {
980 g_dbus_method_invocation_return_value(invocation,
981 g_variant_new("(i)", PKGMGR_R_ENOPKG));
985 reqkey = __generate_reqkey(pkgid);
986 if (reqkey == NULL) {
987 g_dbus_method_invocation_return_value(invocation,
988 g_variant_new("(i)", PKGMGR_R_ENOMEM));
993 if (_push_queue(target_uid, caller_uid, reqkey, REQUEST_TYPE_CLEARDATA,
994 pkgtype, pkgid, NULL)) {
995 g_dbus_method_invocation_return_value(invocation,
996 g_variant_new("(i)", PKGMGR_R_ESYSTEM));
1002 g_dbus_method_invocation_return_value(invocation,
1003 g_variant_new("(i)", PKGMGR_R_OK));
1011 static int __handle_request_clearcache(uid_t caller_uid,
1012 GDBusMethodInvocation *invocation, GVariant *parameters)
1014 uid_t target_uid = (uid_t)-1;
1017 g_variant_get(parameters, "(u&s)", &target_uid, &pkgid);
1018 if (target_uid == (uid_t)-1 || pkgid == NULL) {
1019 g_dbus_method_invocation_return_value(invocation,
1020 g_variant_new("(i)", PKGMGR_R_ECOMM));
1024 if (_push_queue(target_uid, caller_uid, NULL, REQUEST_TYPE_CLEARCACHE,
1025 "pkgtool", pkgid, NULL)) {
1026 g_dbus_method_invocation_return_value(invocation,
1027 g_variant_new("(i)", PKGMGR_R_ESYSTEM));
1031 g_dbus_method_invocation_return_value(invocation,
1032 g_variant_new("(i)", PKGMGR_R_OK));
1037 static int __handle_request_kill(uid_t caller_uid,
1038 GDBusMethodInvocation *invocation, GVariant *parameters)
1040 uid_t target_uid = (uid_t)-1;
1042 char *reqkey = NULL;
1044 g_variant_get(parameters, "(u&s)", &target_uid, &pkgid);
1045 if (target_uid == (uid_t)-1 || pkgid == NULL) {
1046 g_dbus_method_invocation_return_value(invocation,
1047 g_variant_new("(ii)", PKGMGR_R_ECOMM, 0));
1051 reqkey = __generate_reqkey(pkgid);
1052 if (reqkey == NULL) {
1053 g_dbus_method_invocation_return_value(invocation,
1054 g_variant_new("(ii)", PKGMGR_R_ENOMEM, 0));
1058 if (_push_queue(target_uid, caller_uid, reqkey, REQUEST_TYPE_KILL,
1059 "default", pkgid, NULL)) {
1060 g_dbus_method_invocation_return_value(invocation,
1061 g_variant_new("(ii)", PKGMGR_R_ESYSTEM, 0));
1066 if (!g_hash_table_insert(req_table, (gpointer)reqkey,
1067 (gpointer)invocation))
1068 ERR("reqkey already exists");
1073 static int __handle_request_check(uid_t caller_uid,
1074 GDBusMethodInvocation *invocation, GVariant *parameters)
1076 uid_t target_uid = (uid_t)-1;
1078 char *reqkey = NULL;
1080 g_variant_get(parameters, "(u&s)", &target_uid, &pkgid);
1081 if (target_uid == (uid_t)-1 || pkgid == NULL) {
1082 g_dbus_method_invocation_return_value(invocation,
1083 g_variant_new("(ii)", PKGMGR_R_ECOMM, 0));
1087 reqkey = __generate_reqkey(pkgid);
1088 if (reqkey == NULL) {
1089 g_dbus_method_invocation_return_value(invocation,
1090 g_variant_new("(ii)", PKGMGR_R_ENOMEM, 0));
1094 if (_push_queue(target_uid, caller_uid, reqkey, REQUEST_TYPE_CHECK,
1095 "default", pkgid, NULL)) {
1096 g_dbus_method_invocation_return_value(invocation,
1097 g_variant_new("(ii)", PKGMGR_R_ESYSTEM, 0));
1102 if (!g_hash_table_insert(req_table, (gpointer)reqkey,
1103 (gpointer)invocation))
1104 ERR("reqkey already exists");
1109 static int __handle_request_generate_license_request(uid_t caller_uid,
1110 GDBusMethodInvocation *invocation, GVariant *parameters)
1113 char *resp_data = NULL;
1115 g_variant_get(parameters, "(&s)", &resp_data);
1116 if (resp_data == NULL) {
1117 g_dbus_method_invocation_return_value(invocation,
1118 g_variant_new("(iss)", PKGMGR_R_ECOMM, "", ""));
1122 reqkey = __generate_reqkey("drm");
1123 if (reqkey == NULL) {
1124 g_dbus_method_invocation_return_value(invocation,
1125 g_variant_new("(iss)", PKGMGR_R_ENOMEM, "",
1130 if (_push_queue(caller_uid, caller_uid, reqkey,
1131 REQUEST_TYPE_GENERATE_LICENSE_REQUEST,
1132 "default", NULL, resp_data)) {
1133 g_dbus_method_invocation_return_value(invocation,
1134 g_variant_new("(iss)", PKGMGR_R_ESYSTEM, "",
1140 if (!g_hash_table_insert(req_table, (gpointer)reqkey,
1141 (gpointer)invocation))
1142 ERR("reqkey already exists");
1147 static int __handle_request_register_license(uid_t caller_uid,
1148 GDBusMethodInvocation *invocation, GVariant *parameters)
1151 char *resp_data = NULL;
1153 g_variant_get(parameters, "(&s)", &resp_data);
1154 if (resp_data == NULL) {
1155 g_dbus_method_invocation_return_value(invocation,
1156 g_variant_new("(i)", PKGMGR_R_ECOMM));
1160 reqkey = __generate_reqkey("drm");
1161 if (reqkey == NULL) {
1162 g_dbus_method_invocation_return_value(invocation,
1163 g_variant_new("(i)", PKGMGR_R_ENOMEM));
1167 if (_push_queue(caller_uid, caller_uid, reqkey,
1168 REQUEST_TYPE_REGISTER_LICENSE,
1169 "default", NULL, resp_data)) {
1170 g_dbus_method_invocation_return_value(invocation,
1171 g_variant_new("(i)", PKGMGR_R_ESYSTEM));
1176 if (!g_hash_table_insert(req_table, (gpointer)reqkey,
1177 (gpointer)invocation))
1178 ERR("reqkey already exists");
1183 static int __handle_request_decrypt_package(uid_t caller_uid,
1184 GDBusMethodInvocation *invocation, GVariant *parameters)
1187 char *drm_file_path = NULL;
1188 char *decrypted_file_path = NULL;
1190 g_variant_get(parameters, "(&s&s)", &drm_file_path,
1191 &decrypted_file_path);
1192 if (drm_file_path == NULL || decrypted_file_path == NULL) {
1193 g_dbus_method_invocation_return_value(invocation,
1194 g_variant_new("(i)", PKGMGR_R_ECOMM));
1198 reqkey = __generate_reqkey("drm");
1199 if (reqkey == NULL) {
1200 g_dbus_method_invocation_return_value(invocation,
1201 g_variant_new("(i)", PKGMGR_R_ENOMEM));
1205 if (_push_queue(caller_uid, caller_uid, reqkey,
1206 REQUEST_TYPE_DECRYPT_PACKAGE,
1207 "default", drm_file_path,
1208 decrypted_file_path)) {
1209 g_dbus_method_invocation_return_value(invocation,
1210 g_variant_new("(i)", PKGMGR_R_ESYSTEM));
1215 if (!g_hash_table_insert(req_table, (gpointer)reqkey,
1216 (gpointer)invocation))
1217 ERR("reqkey already exists");
1222 static int __update_app_splash_screen(uid_t caller_uid,
1223 GDBusMethodInvocation *invocation, GVariant *parameters,
1226 uid_t target_uid = (uid_t)-1;
1230 g_variant_get(parameters, "(u&s)", &target_uid, &appid);
1231 if (target_uid == (uid_t)-1 || appid == NULL) {
1232 ERR("target_uid: %d, appid: %s", target_uid, appid);
1233 g_dbus_method_invocation_return_value(invocation,
1234 g_variant_new("(i)", PKGMGR_R_ECOMM));
1238 reqkey = __generate_reqkey(appid);
1239 if (reqkey == NULL) {
1240 ERR("Failed to generate request key");
1241 g_dbus_method_invocation_return_value(invocation,
1242 g_variant_new("(i)", PKGMGR_R_ENOMEM));
1246 if (_push_queue(target_uid, caller_uid, reqkey, req_type, "default",
1248 ERR("Failed to push request");
1249 g_dbus_method_invocation_return_value(invocation,
1250 g_variant_new("(i)", PKGMGR_R_ESYSTEM));
1255 g_dbus_method_invocation_return_value(invocation,
1256 g_variant_new("(i)", PKGMGR_R_OK));
1264 static int __handle_request_enable_app_splash_screen(uid_t caller_uid,
1265 GDBusMethodInvocation *invocation, GVariant *parameters)
1267 return __update_app_splash_screen(caller_uid, invocation, parameters,
1268 REQUEST_TYPE_ENABLE_APP_SPLASH_SCREEN);
1271 static int __handle_request_disable_app_splash_screen(uid_t caller_uid,
1272 GDBusMethodInvocation *invocation, GVariant *parameters)
1274 return __update_app_splash_screen(caller_uid, invocation, parameters,
1275 REQUEST_TYPE_DISABLE_APP_SPLASH_SCREEN);
1278 static int __handle_request_set_restriction_mode(uid_t caller_uid,
1279 GDBusMethodInvocation *invocation, GVariant *parameters)
1281 uid_t target_uid = (uid_t)-1;
1287 g_variant_get(parameters, "(usi)", &target_uid, &pkgid, &mode);
1288 if (target_uid == (uid_t)-1 || pkgid == NULL || mode < 0) {
1289 g_dbus_method_invocation_return_value(invocation,
1290 g_variant_new("(i)", PKGMGR_R_ECOMM));
1294 reqkey = __generate_reqkey("restriction");
1295 if (reqkey == NULL) {
1296 g_dbus_method_invocation_return_value(invocation,
1297 g_variant_new("(i)", PKGMGR_R_ENOMEM));
1301 snprintf(buf, sizeof(buf), "%d", mode);
1302 if (_push_queue(target_uid, caller_uid, reqkey,
1303 REQUEST_TYPE_SET_RESTRICTION_MODE,
1304 "default", pkgid, buf)) {
1305 g_dbus_method_invocation_return_value(invocation,
1306 g_variant_new("(i)", PKGMGR_R_ESYSTEM));
1311 if (!g_hash_table_insert(req_table, (gpointer)reqkey,
1312 (gpointer)invocation))
1313 ERR("reqkey already exists");
1318 static int __handle_request_unset_restriction_mode(uid_t caller_uid,
1319 GDBusMethodInvocation *invocation, GVariant *parameters)
1321 uid_t target_uid = (uid_t)-1;
1327 g_variant_get(parameters, "(usi)", &target_uid, &pkgid, &mode);
1328 if (target_uid == (uid_t)-1 || pkgid == NULL || mode < 0) {
1329 g_dbus_method_invocation_return_value(invocation,
1330 g_variant_new("(i)", PKGMGR_R_ECOMM));
1334 reqkey = __generate_reqkey("restriction");
1335 if (reqkey == NULL) {
1336 g_dbus_method_invocation_return_value(invocation,
1337 g_variant_new("(i)", PKGMGR_R_ENOMEM));
1341 snprintf(buf, sizeof(buf), "%d", mode);
1342 if (_push_queue(target_uid, caller_uid, reqkey,
1343 REQUEST_TYPE_UNSET_RESTRICTION_MODE,
1344 "default", pkgid, buf)) {
1345 g_dbus_method_invocation_return_value(invocation,
1346 g_variant_new("(i)", PKGMGR_R_ESYSTEM));
1351 if (!g_hash_table_insert(req_table, (gpointer)reqkey,
1352 (gpointer)invocation))
1353 ERR("reqkey already exists");
1358 static int __handle_request_get_restriction_mode(uid_t caller_uid,
1359 GDBusMethodInvocation *invocation, GVariant *parameters)
1361 uid_t target_uid = (uid_t)-1;
1365 g_variant_get(parameters, "(us)", &target_uid, &pkgid);
1366 if (target_uid == (uid_t)-1 || pkgid == NULL) {
1367 g_dbus_method_invocation_return_value(invocation,
1368 g_variant_new("(i)", PKGMGR_R_ECOMM));
1372 reqkey = __generate_reqkey("restriction");
1373 if (reqkey == NULL) {
1374 g_dbus_method_invocation_return_value(invocation,
1375 g_variant_new("(ii)", -1, PKGMGR_R_ENOMEM));
1379 if (_push_queue(target_uid, caller_uid, reqkey,
1380 REQUEST_TYPE_GET_RESTRICTION_MODE,
1381 "default", pkgid, NULL)) {
1382 g_dbus_method_invocation_return_value(invocation,
1383 g_variant_new("(ii)", -1, PKGMGR_R_ESYSTEM));
1388 if (!g_hash_table_insert(req_table, (gpointer)reqkey,
1389 (gpointer)invocation))
1390 ERR("reqkey already exists");
1395 static int __handle_request_set_app_label(uid_t uid,
1396 GDBusMethodInvocation *invocation, GVariant *parameters)
1398 uid_t target_uid = (uid_t)-1;
1403 g_variant_get(parameters, "(uss)", &target_uid, &appid, &label);
1404 if (target_uid == (uid_t)-1 || appid == NULL || label == NULL) {
1405 g_dbus_method_invocation_return_value(invocation,
1406 g_variant_new("(i)", PKGMGR_R_ECOMM));
1410 reqkey = __generate_reqkey("appid");
1411 if (reqkey == NULL) {
1412 g_dbus_method_invocation_return_value(invocation,
1413 g_variant_new("(i)", PKGMGR_R_ENOMEM));
1417 if (_push_queue(target_uid, uid, reqkey,
1418 REQUEST_TYPE_SET_APP_LABEL,
1419 "default", appid, label)) {
1420 g_dbus_method_invocation_return_value(invocation,
1421 g_variant_new("(i)", PKGMGR_R_ESYSTEM));
1426 if (!g_hash_table_insert(req_table, (gpointer)reqkey,
1427 (gpointer)invocation))
1428 ERR("reqkey already exists");
1433 static uid_t __get_caller_uid(GDBusConnection *connection, const char *name)
1439 result = g_dbus_connection_call_sync(connection,
1440 "org.freedesktop.DBus", "/org/freedesktop/DBus",
1441 "org.freedesktop.DBus", "GetConnectionUnixUser",
1442 g_variant_new("(s)", name), NULL,
1443 G_DBUS_CALL_FLAGS_NONE, -1, NULL, &err);
1444 if (result == NULL) {
1445 ERR("failed to get caller uid: %s", err->message);
1450 g_variant_get(result, "(u)", &uid);
1455 static void __handle_method_call(GDBusConnection *connection,
1456 const gchar *sender, const gchar *object_path,
1457 const gchar *interface_name, const gchar *method_name,
1458 GVariant *parameters, GDBusMethodInvocation *invocation,
1464 uid = __get_caller_uid(connection,
1465 g_dbus_method_invocation_get_sender(invocation));
1466 if (uid == (uid_t)-1)
1469 if (__check_caller_permission(uid, invocation, parameters))
1472 if (g_strcmp0(method_name, "install") == 0)
1473 ret = __handle_request_install(uid, invocation, parameters);
1474 else if (g_strcmp0(method_name, "mount_install") == 0)
1475 ret = __handle_request_mount_install(uid, invocation,
1477 else if (g_strcmp0(method_name, "reinstall") == 0)
1478 ret = __handle_request_reinstall(uid, invocation, parameters);
1479 else if (g_strcmp0(method_name, "uninstall") == 0)
1480 ret = __handle_request_uninstall(uid, invocation, parameters);
1481 else if (g_strcmp0(method_name, "cleardata") == 0)
1482 ret = __handle_request_cleardata(uid, invocation, parameters);
1483 else if (g_strcmp0(method_name, "move") == 0)
1484 ret = __handle_request_move(uid, invocation, parameters);
1485 else if (g_strcmp0(method_name, "enable_pkgs") == 0)
1486 ret = __handle_request_enable_pkgs(uid, invocation, parameters);
1487 else if (g_strcmp0(method_name, "disable_pkgs") == 0)
1488 ret = __handle_request_disable_pkgs(uid, invocation, parameters);
1489 else if (g_strcmp0(method_name, "getsize") == 0)
1490 ret = __handle_request_getsize(uid, invocation, parameters);
1491 else if (g_strcmp0(method_name, "getsize_sync") == 0)
1492 ret = __handle_request_getsize_sync(uid, invocation, parameters);
1493 else if (g_strcmp0(method_name, "clearcache") == 0)
1494 ret = __handle_request_clearcache(uid, invocation, parameters);
1495 else if (g_strcmp0(method_name, "enable_app") == 0)
1496 ret = __handle_request_enable_app(uid, invocation, parameters);
1497 else if (g_strcmp0(method_name, "disable_app") == 0)
1498 ret = __handle_request_disable_app(uid, invocation, parameters);
1499 else if (g_strcmp0(method_name, "enable_global_app_for_uid") == 0)
1500 ret = __handle_request_enable_global_app_for_uid(uid,
1501 invocation, parameters);
1502 else if (g_strcmp0(method_name, "disable_global_app_for_uid") == 0)
1503 ret = __handle_request_disable_global_app_for_uid(uid,
1504 invocation, parameters);
1505 else if (g_strcmp0(method_name, "kill") == 0)
1506 ret = __handle_request_kill(uid, invocation, parameters);
1507 else if (g_strcmp0(method_name, "check") == 0)
1508 ret = __handle_request_check(uid, invocation, parameters);
1509 else if (g_strcmp0(method_name, "generate_license_request") == 0)
1510 ret = __handle_request_generate_license_request(uid, invocation,
1512 else if (g_strcmp0(method_name, "register_license") == 0)
1513 ret = __handle_request_register_license(uid, invocation,
1515 else if (g_strcmp0(method_name, "decrypt_package") == 0)
1516 ret = __handle_request_decrypt_package(uid, invocation,
1518 else if (g_strcmp0(method_name, "disable_app_splash_screen") == 0)
1519 ret = __handle_request_disable_app_splash_screen(uid,
1520 invocation, parameters);
1521 else if (g_strcmp0(method_name, "enable_app_splash_screen") == 0)
1522 ret = __handle_request_enable_app_splash_screen(uid,
1523 invocation, parameters);
1524 else if (g_strcmp0(method_name, "set_restriction_mode") == 0)
1525 ret = __handle_request_set_restriction_mode(uid, invocation,
1527 else if (g_strcmp0(method_name, "unset_restriction_mode") == 0)
1528 ret = __handle_request_unset_restriction_mode(uid, invocation,
1530 else if (g_strcmp0(method_name, "get_restriction_mode") == 0)
1531 ret = __handle_request_get_restriction_mode(uid, invocation,
1533 else if (g_strcmp0(method_name, "set_app_label") == 0)
1534 ret = __handle_request_set_app_label(uid, invocation, parameters);
1539 g_idle_add(queue_job, NULL);
1542 int _return_value_to_caller(const char *req_key, GVariant *result)
1544 GDBusMethodInvocation *invocation;
1546 invocation = (GDBusMethodInvocation *)g_hash_table_lookup(req_table,
1548 if (invocation == NULL) {
1549 ERR("no such request id");
1553 g_dbus_method_invocation_return_value(invocation, result);
1554 g_hash_table_remove(req_table, (gpointer)req_key);
1559 static const GDBusInterfaceVTable interface_vtable = {
1560 __handle_method_call,
1565 static void __on_bus_acquired(GDBusConnection *connection, const gchar *name,
1570 DBG("on bus acquired");
1572 reg_id = g_dbus_connection_register_object(connection,
1573 PKGMGR_DBUS_OBJECT_PATH,
1574 instropection_data->interfaces[0],
1575 &interface_vtable, NULL, NULL, &err);
1578 ERR("failed to register object: %s", err->message);
1583 static void __on_name_acquired(GDBusConnection *connection, const gchar *name,
1586 DBG("on name acquired: %s", name);
1589 static void __on_name_lost(GDBusConnection *connection, const gchar *name,
1592 DBG("on name lost: %s", name);
1595 int _init_request_handler(void)
1597 instropection_data = g_dbus_node_info_new_for_xml(instropection_xml,
1600 owner_id = g_bus_own_name(G_BUS_TYPE_SYSTEM, PKGMGR_DBUS_SERVICE,
1601 G_BUS_NAME_OWNER_FLAGS_NONE, __on_bus_acquired,
1602 __on_name_acquired, __on_name_lost, NULL, NULL);
1604 req_table = g_hash_table_new_full(g_str_hash, g_str_equal,
1606 if (req_table == NULL)
1612 void _fini_request_handler(void)
1614 g_hash_table_destroy(req_table);
1615 g_bus_unown_name(owner_id);
1616 g_dbus_node_info_unref(instropection_data);