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.
35 #include <pkgmgr-info.h>
36 #include <iniparser.h>
37 /* For multi-user support */
38 #include <tzplatform_config.h>
40 #include "package-manager.h"
41 #include "pkgmgr-internal.h"
42 #include "pkgmgr-debug.h"
43 #include "comm_client.h"
45 /* API export macro */
47 #define API __attribute__ ((visibility("default")))
50 #define PKG_TMP_PATH tzplatform_mkpath(TZ_USER_APP, "tmp")
52 #define BINSH_NAME "/bin/sh"
55 #define GLOBAL_USER tzplatform_getuid(TZ_SYS_GLOBALAPP_USER)
56 #define REGULAR_USER 5000
58 static inline uid_t _getuid(void)
62 if (uid < REGULAR_USER)
68 static int _get_request_id()
70 static int internal_req_id = 1;
72 return internal_req_id++;
75 typedef struct _req_cb_info {
78 pkgmgr_handler event_cb;
79 pkgmgr_app_handler app_event_cb;
81 struct _req_cb_info *next;
84 typedef struct _listen_cb_info {
86 pkgmgr_handler event_cb;
87 pkgmgr_app_handler app_event_cb;
89 struct _listen_cb_info *next;
92 typedef struct _pkgmgr_client_t {
102 listen_cb_info *lhead;
110 typedef struct _iter_data {
111 pkgmgr_iter_fn iter_fn;
115 static int __xsystem(const char *argv[])
122 perror("fork failed");
126 execvp(argv[0], (char *const *)argv);
132 if (waitpid(pid, &status, 0) == -1) {
133 perror("waitpid failed");
136 if (WIFSIGNALED(status)) {
140 if (!WIFEXITED(status)) {
141 /* shouldn't happen */
142 perror("should not happen");
145 return WEXITSTATUS(status);
148 static void __error_to_string(int errnumber, char **errstr)
153 case PKGCMD_ERR_PACKAGE_NOT_FOUND:
154 *errstr = PKGCMD_ERR_PACKAGE_NOT_FOUND_STR;
156 case PKGCMD_ERR_PACKAGE_INVALID:
157 *errstr = PKGCMD_ERR_PACKAGE_INVALID_STR;
159 case PKGCMD_ERR_PACKAGE_LOWER_VERSION:
160 *errstr = PKGCMD_ERR_PACKAGE_LOWER_VERSION_STR;
162 case PKGCMD_ERR_PACKAGE_EXECUTABLE_NOT_FOUND:
163 *errstr = PKGCMD_ERR_PACKAGE_EXECUTABLE_NOT_FOUND_STR;
165 case PKGCMD_ERR_MANIFEST_INVALID:
166 *errstr = PKGCMD_ERR_MANIFEST_INVALID_STR;
168 case PKGCMD_ERR_CONFIG_NOT_FOUND:
169 *errstr = PKGCMD_ERR_CONFIG_NOT_FOUND_STR;
171 case PKGCMD_ERR_CONFIG_INVALID:
172 *errstr = PKGCMD_ERR_CONFIG_INVALID_STR;
174 case PKGCMD_ERR_SIGNATURE_NOT_FOUND:
175 *errstr = PKGCMD_ERR_SIGNATURE_NOT_FOUND_STR;
177 case PKGCMD_ERR_SIGNATURE_INVALID:
178 *errstr = PKGCMD_ERR_SIGNATURE_INVALID_STR;
180 case PKGCMD_ERR_SIGNATURE_VERIFICATION_FAILED:
181 *errstr = PKGCMD_ERR_SIGNATURE_VERIFICATION_FAILED_STR;
183 case PKGCMD_ERR_ROOT_CERTIFICATE_NOT_FOUND:
184 *errstr = PKGCMD_ERR_ROOT_CERTIFICATE_NOT_FOUND_STR;
186 case PKGCMD_ERR_CERTIFICATE_INVALID:
187 *errstr = PKGCMD_ERR_CERTIFICATE_INVALID_STR;
189 case PKGCMD_ERR_CERTIFICATE_CHAIN_VERIFICATION_FAILED:
190 *errstr = PKGCMD_ERR_CERTIFICATE_CHAIN_VERIFICATION_FAILED_STR;
192 case PKGCMD_ERR_CERTIFICATE_EXPIRED:
193 *errstr = PKGCMD_ERR_CERTIFICATE_EXPIRED_STR;
195 case PKGCMD_ERR_INVALID_PRIVILEGE:
196 *errstr = PKGCMD_ERR_INVALID_PRIVILEGE_STR;
198 case PKGCMD_ERR_MENU_ICON_NOT_FOUND:
199 *errstr = PKGCMD_ERR_MENU_ICON_NOT_FOUND_STR;
201 case PKGCMD_ERR_FATAL_ERROR:
202 *errstr = PKGCMD_ERR_FATAL_ERROR_STR;
204 case PKGCMD_ERR_OUT_OF_STORAGE:
205 *errstr = PKGCMD_ERR_OUT_OF_STORAGE_STR;
207 case PKGCMD_ERR_OUT_OF_MEMORY:
208 *errstr = PKGCMD_ERR_OUT_OF_MEMORY_STR;
210 case PKGCMD_ERR_ARGUMENT_INVALID:
211 *errstr = PKGCMD_ERR_ARGUMENT_INVALID_STR;
214 *errstr = PKGCMD_ERR_UNKNOWN_STR;
219 static void __add_op_cbinfo(pkgmgr_client_t *pc, int request_id,
220 const char *req_key, pkgmgr_handler event_cb, void *new_event_cb,
223 req_cb_info *cb_info;
224 req_cb_info *current;
227 cb_info = (req_cb_info *) calloc(1, sizeof(req_cb_info));
228 if (cb_info == NULL) {
229 DBG("calloc failed");
232 cb_info->request_id = request_id;
233 cb_info->req_key = strdup(req_key);
234 cb_info->event_cb = event_cb;
235 cb_info->data = data;
236 cb_info->next = NULL;
237 cb_info->app_event_cb = NULL;
238 pc->new_event_cb = new_event_cb;
240 if (pc->info.request.rhead == NULL)
241 pc->info.request.rhead = cb_info;
243 current = prev = pc->info.request.rhead;
246 current = current->next;
249 prev->next = cb_info;
253 static void __add_op_app_cbinfo(pkgmgr_client_t *pc, int request_id,
254 const char *req_key, pkgmgr_app_handler app_event_cb, void *data)
256 req_cb_info *cb_info;
257 req_cb_info *current;
260 cb_info = (req_cb_info *) calloc(1, sizeof(req_cb_info));
261 if (cb_info == NULL) {
262 DBG("calloc failed");
265 cb_info->request_id = request_id;
266 cb_info->req_key = strdup(req_key);
267 cb_info->event_cb = NULL;
268 cb_info->app_event_cb = app_event_cb;
269 cb_info->data = data;
270 cb_info->next = NULL;
271 pc->new_event_cb = NULL;
273 if (pc->info.request.rhead == NULL)
274 pc->info.request.rhead = cb_info;
276 current = prev = pc->info.request.rhead;
279 current = current->next;
282 prev->next = cb_info;
286 static req_cb_info *__find_op_cbinfo(pkgmgr_client_t *pc, const char *req_key)
290 tmp = pc->info.request.rhead;
297 DBG("tmp->req_key %s, req_key %s", tmp->req_key, req_key);
300 if (strncmp(tmp->req_key, req_key, strlen(tmp->req_key)) == 0)
307 static int __remove_stat_cbinfo(pkgmgr_client_t *pc)
309 listen_cb_info *info = pc->info.listening.lhead;
310 listen_cb_info *next = NULL;
312 while (info != NULL) {
318 pc->info.listening.lhead = NULL;
322 static void __add_app_stat_cbinfo(pkgmgr_client_t *pc, int request_id,
323 pkgmgr_app_handler event_cb, void *data)
325 listen_cb_info *cb_info;
326 listen_cb_info *current;
327 listen_cb_info *prev;
329 cb_info = (listen_cb_info *) calloc(1, sizeof(listen_cb_info));
330 if (cb_info == NULL) {
331 DBG("calloc failed");
334 cb_info->request_id = request_id;
335 cb_info->app_event_cb = event_cb;
336 cb_info->data = data;
337 cb_info->next = NULL;
339 if (pc->info.listening.lhead == NULL)
340 pc->info.listening.lhead = cb_info;
342 current = prev = pc->info.listening.lhead;
345 current = current->next;
348 prev->next = cb_info;
352 static void __add_stat_cbinfo(pkgmgr_client_t *pc, int request_id,
353 pkgmgr_handler event_cb, void *data)
355 listen_cb_info *cb_info;
356 listen_cb_info *current;
357 listen_cb_info *prev;
359 cb_info = (listen_cb_info *) calloc(1, sizeof(listen_cb_info));
360 if (cb_info == NULL) {
361 DBG("calloc failed");
364 cb_info->request_id = request_id;
365 cb_info->event_cb = event_cb;
366 cb_info->data = data;
367 cb_info->next = NULL;
369 /* TODO - check the order of callback - FIFO or LIFO => Should be changed to LIFO */
370 if (pc->info.listening.lhead == NULL)
371 pc->info.listening.lhead = cb_info;
373 current = prev = pc->info.listening.lhead;
376 current = current->next;
379 prev->next = cb_info;
383 static void __operation_callback(void *cb_data, uid_t target_uid,
384 const char *req_id, const char *pkg_type,
385 const char *pkgid, const char *appid,
386 const char *key, const char *val)
389 req_cb_info *cb_info;
391 pc = (pkgmgr_client_t *) cb_data;
393 /* find callback info */
394 cb_info = __find_op_cbinfo(pc, req_id);
395 if (cb_info == NULL) {
396 ERR("cannot find cb_info for req_id:%s", req_id);
401 if (appid != NULL && strlen(appid) != 0 && cb_info->app_event_cb) {
402 /* run app callback */
403 if (pc->new_event_cb)
404 cb_info->app_event_cb(target_uid, cb_info->request_id,
405 pkg_type, pkgid, appid, key, val, pc,
408 cb_info->app_event_cb(target_uid, cb_info->request_id,
409 pkg_type, pkgid, appid, key, val, NULL,
411 } else if (cb_info->event_cb) {
412 /* run pkg callback */
413 if (pc->new_event_cb)
414 cb_info->event_cb(target_uid, cb_info->request_id,
415 pkg_type, pkgid, key, val, pc,
418 cb_info->event_cb(target_uid, cb_info->request_id,
419 pkg_type, pkgid, key, val, NULL,
426 static void __status_callback(void *cb_data, uid_t target_uid,
427 const char *req_id, const char *pkg_type,
428 const char *pkgid, const char *appid,
429 const char *key, const char *val)
434 pc = (pkgmgr_client_t *) cb_data;
436 tmp = pc->info.listening.lhead;
438 if (appid != NULL && strlen(appid) != 0) {
439 /* run app callback */
440 if (tmp->app_event_cb && tmp->app_event_cb(
441 target_uid, tmp->request_id, pkg_type, pkgid,
442 appid, key, val, NULL, tmp->data) != 0)
445 /* run pkg callback */
446 if (tmp->event_cb && tmp->event_cb(
447 target_uid, tmp->request_id, pkg_type, pkgid,
448 key, val, NULL, tmp->data) != 0)
457 static inline int __read_proc(const char *path, char *buf, int size)
462 if (buf == NULL || path == NULL)
465 fd = open(path, O_RDONLY);
469 ret = read(fd, buf, size - 1);
481 char *__proc_get_cmdline_bypid(int pid)
483 char buf[PKG_STRING_LEN_MAX] = {'\0', };
486 snprintf(buf, sizeof(buf), "/proc/%d/cmdline", pid);
487 ret = __read_proc(buf, buf, sizeof(buf));
491 /* support app launched by shell script*/
492 if (strncmp(buf, BINSH_NAME, BINSH_SIZE) == 0)
493 return strdup(&buf[BINSH_SIZE + 1]);
498 static inline int __pkgmgr_read_proc(const char *path, char *buf, int size)
503 if (buf == NULL || path == NULL)
506 fd = open(path, O_RDONLY);
510 ret = read(fd, buf, size - 1);
522 static int __sync_process(const char *req_key)
525 char info_file[PKG_STRING_LEN_MAX] = {'\0', };
529 char buf[PKG_STRING_LEN_MAX] = {0, };
531 snprintf(info_file, PKG_STRING_LEN_MAX, "%s/%s", PKG_SIZE_INFO_PATH, req_key);
535 if (access(info_file, F_OK) == 0) {
536 fp = fopen(info_file, "r");
538 DBG("file is not generated yet.... wait\n");
539 usleep(100 * 1000); /* 100ms sleep*/
543 if (fgets(buf, PKG_STRING_LEN_MAX, fp) == NULL) {
544 ERR("failed to read info file");
550 DBG("info_file file is generated, result = %s. \n", buf);
555 DBG("file is not generated yet.... wait\n");
556 usleep(100 * 1000); /* 100ms sleep*/
558 if (check_cnt > 6000) { /* 60s * 10 time over*/
559 ERR("wait time over!!\n");
564 ret = remove(info_file);
566 ERR("file is can not remove[%s, %d]\n", info_file, ret);
571 static int __get_size_process(pkgmgr_client *pc, const char *pkgid, uid_t uid,
572 pkgmgr_getsize_type get_type, pkgmgr_handler event_cb,
576 int ret = PKGMGR_R_ECOMM;
577 char *req_key = NULL;
578 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
580 if (pc == NULL || pkgid == NULL) {
581 ERR("invalid parameter");
582 return PKGMGR_R_EINVAL;
585 if (mpc->ctype != PC_REQUEST) {
586 ERR("mpc->ctype is not PC_REQUEST");
587 return PKGMGR_R_EINVAL;
590 ret = comm_client_request(mpc->info.request.cc, "getsize",
591 g_variant_new("(usi)", uid, pkgid, get_type), &result);
592 if (ret != PKGMGR_R_OK) {
593 ERR("request failed: %d", ret);
597 g_variant_get(result, "(i&s)", &ret, &req_key);
598 if (req_key == NULL) {
599 g_variant_unref(result);
600 return PKGMGR_R_ECOMM;
602 if (ret != PKGMGR_R_OK) {
603 g_variant_unref(result);
607 ret = __sync_process(req_key);
609 ERR("get size failed, ret=%d\n", ret);
611 g_variant_unref(result);
616 static int __move_pkg_process(pkgmgr_client *pc, const char *pkgid,
617 const char *pkg_type, uid_t uid, pkgmgr_move_type move_type,
618 pkgmgr_handler event_cb, void *data)
622 ret = pkgmgr_client_usr_move(pc, pkg_type, pkgid, move_type, event_cb, data, uid);
624 ERR("move request failed");
631 static int __check_app_process(pkgmgr_request_service_type service_type,
632 pkgmgr_client *pc, const char *pkgid, uid_t uid, void *data)
635 int ret = PKGMGR_R_ECOMM;
636 pkgmgrinfo_pkginfo_h handle;
638 pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc;
640 retvm_if(mpc->ctype != PC_REQUEST, PKGMGR_R_EINVAL, "mpc->ctype is not PC_REQUEST\n");
642 if (uid != GLOBAL_USER)
643 ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(pkgid, uid, &handle);
645 ret = pkgmgrinfo_pkginfo_get_pkginfo(pkgid, &handle);
646 retvm_if(ret < 0, PKGMGR_R_ERROR, "pkgmgrinfo_pkginfo_get_pkginfo failed");
648 if (service_type == PM_REQUEST_KILL_APP)
649 ret = comm_client_request(mpc->info.request.cc, "kill",
650 g_variant_new("(us)", uid, pkgid), &result);
651 else if (service_type == PM_REQUEST_CHECK_APP)
652 ret = comm_client_request(mpc->info.request.cc, "check",
653 g_variant_new("(us)", uid, pkgid), &result);
654 if (ret != PKGMGR_R_OK) {
655 ERR("request failed: %d", ret);
659 g_variant_get(result, "(i)", &ret);
660 g_variant_unref(result);
661 if (ret != PKGMGR_R_OK) {
662 ERR("request failed, ret=%d", ret);
667 pid = __sync_process(pkgid);
670 pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
676 static int __request_size_info(pkgmgr_client *pc, uid_t uid)
679 int ret = PKGMGR_R_ECOMM;
680 char *req_key = NULL;
681 pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc;
684 ERR("invalid parameter");
685 return PKGMGR_R_EINVAL;
688 if (mpc->ctype != PC_REQUEST) {
689 ERR("mpc->ctype is not PC_REQUEST");
690 return PKGMGR_R_EINVAL;
693 ret = comm_client_request(mpc->info.request.cc, "getsize",
694 g_variant_new("(usi)", uid, "size_info",
697 if (ret != PKGMGR_R_OK) {
698 ERR("request failed: %d", ret);
702 g_variant_get(result, "(i&s)", &ret, &req_key);
703 if (req_key == NULL) {
704 g_variant_unref(result);
705 return PKGMGR_R_ECOMM;
708 g_variant_unref(result);
713 static int __change_op_cb_for_getsize(pkgmgr_client *pc)
717 retvm_if(pc == NULL, PKGMGR_R_EINVAL, "package manager client pc is NULL");
718 pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc;
720 /* free listening head */
721 req_cb_info *tmp = NULL;
722 req_cb_info *prev = NULL;
723 for (tmp = mpc->info.request.rhead; tmp;) {
729 /* free dbus connection */
730 ret = comm_client_free(mpc->info.request.cc);
731 retvm_if(ret < 0, PKGMGR_R_ERROR, "comm_client_free() failed - %d", ret);
733 /* Manage pc for seperated event */
734 mpc->ctype = PC_REQUEST;
735 mpc->status_type = PKGMGR_CLIENT_STATUS_GET_SIZE;
738 mpc->info.request.cc = comm_client_new(PC_REQUEST);
739 retvm_if(mpc->info.request.cc == NULL, PKGMGR_R_ERROR, "client creation failed");
741 ret = comm_client_set_status_callback(PKGMGR_CLIENT_STATUS_GET_SIZE, mpc->info.request.cc, __operation_callback, pc);
742 retvm_if(ret < 0, PKGMGR_R_ERROR, "set_status_callback() failed - %d", ret);
747 static int __change_op_cb_for_enable_disable(pkgmgr_client *pc, bool is_disable)
751 retvm_if(pc == NULL, PKGMGR_R_EINVAL, "package manager client pc is NULL");
752 pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc;
754 /* free listening head */
755 req_cb_info *tmp = NULL;
756 req_cb_info *prev = NULL;
757 for (tmp = mpc->info.request.rhead; tmp;) {
763 /* free dbus connection */
764 ret = comm_client_free(mpc->info.request.cc);
765 retvm_if(ret < 0, PKGMGR_R_ERROR, "comm_client_free() failed - %d", ret);
767 /* Manage pc for seperated event */
768 mpc->ctype = PC_REQUEST;
770 mpc->status_type = PKGMGR_CLIENT_STATUS_DISABLE_APP;
772 mpc->status_type = PKGMGR_CLIENT_STATUS_ENABLE_APP;
775 mpc->info.request.cc = comm_client_new(PC_REQUEST);
776 retvm_if(mpc->info.request.cc == NULL, PKGMGR_R_ERROR, "client creation failed");
778 ret = comm_client_set_status_callback(mpc->status_type, mpc->info.request.cc, __operation_callback, pc);
779 retvm_if(ret < 0, PKGMGR_R_ERROR, "set_status_callback() failed - %d", ret);
784 static int __get_pkg_size_info_cb(uid_t target_uid, int req_id, const char *req_type,
785 const char *pkgid, const char *key,
786 const char *value, const void *pc, void *user_data)
789 DBG("target_uid: %u, reqid: %d, req type: %s, pkgid: %s, unused key: %s, size info: %s",
790 target_uid, req_id, req_type, pkgid, key, value);
792 pkg_size_info_t *size_info = (pkg_size_info_t *)malloc(sizeof(pkg_size_info_t));
793 retvm_if(size_info == NULL, -1, "The memory is insufficient.");
795 char *save_ptr = NULL;
796 char *token = strtok_r((char *)value, ":", &save_ptr);
797 tryvm_if(token == NULL, ret = -1, "failed to parse sizeinfo");
798 size_info->data_size = atoll(token);
799 token = strtok_r(NULL, ":", &save_ptr);
800 tryvm_if(token == NULL, ret = -1, "failed to parse sizeinfo");
801 size_info->cache_size = atoll(token);
802 token = strtok_r(NULL, ":", &save_ptr);
803 tryvm_if(token == NULL, ret = -1, "failed to parse sizeinfo");
804 size_info->app_size = atoll(token);
805 token = strtok_r(NULL, ":", &save_ptr);
806 tryvm_if(token == NULL, ret = -1, "failed to parse sizeinfo");
807 size_info->ext_data_size = atoll(token);
808 token = strtok_r(NULL, ":", &save_ptr);
809 tryvm_if(token == NULL, ret = -1, "failed to parse sizeinfo");
810 size_info->ext_cache_size = atoll(token);
811 token = strtok_r(NULL, ":", &save_ptr);
812 tryvm_if(token == NULL, ret = -1, "failed to parse sizeinfo");
813 size_info->ext_app_size = atoll(token);
815 DBG("data: %lld, cache: %lld, app: %lld, ext_data: %lld, ext_cache: %lld, ext_app: %lld",
816 size_info->data_size, size_info->cache_size, size_info->app_size,
817 size_info->ext_data_size, size_info->ext_cache_size, size_info->ext_app_size);
819 pkgmgr_client_t *pmc = (pkgmgr_client_t *)pc;
820 tryvm_if(pmc == NULL, ret = -1, "pkgmgr_client instance is null.");
822 if (strcmp(pkgid, PKG_SIZE_INFO_TOTAL) == 0) { /* total package size info */
823 pkgmgr_total_pkg_size_info_receive_cb callback = (pkgmgr_total_pkg_size_info_receive_cb)(pmc->new_event_cb);
824 callback((pkgmgr_client *)pc, size_info, user_data);
826 pkgmgr_pkg_size_info_receive_cb callback = (pkgmgr_pkg_size_info_receive_cb)(pmc->new_event_cb);
827 callback((pkgmgr_client *)pc, pkgid, size_info, user_data);
839 API pkgmgr_client *pkgmgr_client_new(client_type ctype)
841 pkgmgr_client_t *pc = NULL;
844 retvm_if(ctype == PC_BROADCAST, NULL, "broadcast type is not supported");
845 retvm_if(ctype != PC_REQUEST && ctype != PC_LISTENING, NULL, "ctype is not client_type");
847 /* Allocate memory for ADT:pkgmgr_client */
848 pc = calloc(1, sizeof(pkgmgr_client_t));
849 retvm_if(pc == NULL, NULL, "No memory");
853 pc->status_type = PKGMGR_CLIENT_STATUS_ALL;
856 if (pc->ctype == PC_REQUEST) {
857 pc->info.request.cc = comm_client_new(PC_REQUEST);
858 trym_if(pc->info.request.cc == NULL, "client creation failed");
860 ret = comm_client_set_status_callback(PKGMGR_CLIENT_STATUS_ALL, pc->info.request.cc, __operation_callback, pc);
861 trym_if(ret < 0L, "comm_client_set_status_callback() failed - %d", ret);
862 } else if (pc->ctype == PC_LISTENING) {
863 pc->info.listening.cc = comm_client_new(PC_LISTENING);
864 trym_if(pc->info.listening.cc == NULL, "client creation failed");
866 ret = comm_client_set_status_callback(PKGMGR_CLIENT_STATUS_ALL, pc->info.listening.cc, __status_callback, pc);
867 trym_if(ret < 0L, "comm_client_set_status_callback() failed - %d", ret);
870 return (pkgmgr_client *)pc;
878 API int pkgmgr_client_free(pkgmgr_client *pc)
881 pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc;
882 retvm_if(mpc == NULL, PKGMGR_R_EINVAL, "Invalid argument");
884 if (mpc->ctype == PC_REQUEST) {
887 for (tmp = mpc->info.request.rhead; tmp;) {
893 ret = comm_client_free(mpc->info.request.cc);
894 tryvm_if(ret < 0, ret = PKGMGR_R_ERROR, "comm_client_free() failed");
895 } else if (mpc->ctype == PC_LISTENING) {
897 listen_cb_info *prev;
898 for (tmp = mpc->info.listening.lhead; tmp;) {
904 ret = comm_client_free(mpc->info.listening.cc);
905 tryvm_if(ret < 0, ret = PKGMGR_R_ERROR, "comm_client_free() failed");
906 } else if (mpc->ctype == PC_BROADCAST) {
909 ERR("Invalid client type\n");
910 return PKGMGR_R_EINVAL;
915 mpc->tep_path = NULL;
927 return PKGMGR_R_ERROR;
930 static char *__get_type_from_path(const char *pkg_path)
933 char mimetype[255] = { '\0', };
934 char extlist[256] = { '\0', };
937 ret = _get_mime_from_file(pkg_path, mimetype, sizeof(mimetype));
939 ERR("_get_mime_from_file() failed - error code[%d]\n", ret);
943 ret = _get_mime_extension(mimetype, extlist, sizeof(extlist));
945 ERR("_get_mime_extension() failed - error code[%d]\n", ret);
949 if (strlen(extlist) == 0)
952 if (strchr(extlist, ','))
953 extlist[strlen(extlist) - strlen(strchr(extlist, ','))] = '\0';
955 pkg_type = strchr(extlist, '.') + 1;
956 return strdup(pkg_type);
959 static int __change_op_cb_for_enable_disable_splash_screen(pkgmgr_client *pc,
963 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
968 ERR("package mananger client pc is NULL");
969 return PKGMGR_R_EINVAL;
972 for (tmp = mpc->info.request.rhead; tmp;) {
978 ret = comm_client_free(mpc->info.request.cc);
980 ERR("comm_client_free() failed - %d", ret);
981 return PKGMGR_R_ERROR;
984 mpc->ctype = PC_REQUEST;
986 mpc->status_type = PKGMGR_CLIENT_STATUS_ENABLE_APP_SPLASH_SCREEN;
988 mpc->status_type = PKGMGR_CLIENT_STATUS_DISABLE_APP_SPLASH_SCREEN;
990 mpc->info.request.cc = comm_client_new(PC_REQUEST);
991 if (mpc->info.request.cc == NULL) {
992 ERR("client creation failed");
993 return PKGMGR_R_ENOMEM;
996 ret = comm_client_set_status_callback(mpc->status_type,
997 mpc->info.request.cc, __operation_callback, pc);
999 ERR("set_status_callback() failed - %d", ret);
1000 return PKGMGR_R_ERROR;
1006 API int pkgmgr_client_set_tep_path(pkgmgr_client *pc, char *tep_path, bool tep_move)
1008 retvm_if(pc == NULL, PKGMGR_R_EINVAL, "package manager client pc is NULL");
1009 retvm_if(tep_path == NULL, PKGMGR_R_EINVAL, "tep path is NULL");
1010 pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc;
1013 free(mpc->tep_path);
1015 mpc->tep_path = strdup(tep_path);
1016 mpc->tep_move = tep_move;
1021 API int pkgmgr_client_usr_install(pkgmgr_client *pc, const char *pkg_type,
1022 const char *descriptor_path, const char *pkg_path,
1023 const char *optional_data, pkgmgr_mode mode,
1024 pkgmgr_handler event_cb, void *data, uid_t uid)
1027 int ret = PKGMGR_R_ECOMM;
1028 char *req_key = NULL;
1029 GVariantBuilder *builder = NULL;
1030 GVariant *args = NULL;
1032 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
1035 if (pc == NULL || pkg_path == NULL) {
1036 ERR("invalid parameter");
1037 return PKGMGR_R_EINVAL;
1040 if (mpc->ctype != PC_REQUEST) {
1041 ERR("mpc->ctype is not PC_REQUEST");
1042 return PKGMGR_R_EINVAL;
1045 if (access(pkg_path, F_OK) != 0) {
1046 ERR("failed to access: %s", pkg_path);
1047 return PKGMGR_R_EINVAL;
1050 if (mpc->tep_path != NULL && access(mpc->tep_path, F_OK) != 0) {
1051 ERR("failed to access: %s", mpc->tep_path);
1052 return PKGMGR_R_EINVAL;
1055 /* TODO: check pkg's type on server-side */
1056 if (pkg_type == NULL)
1057 pkgtype = __get_type_from_path(pkg_path);
1059 pkgtype = strdup(pkg_type);
1061 /* build arguments */
1062 builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
1063 if (mpc->tep_path) {
1064 g_variant_builder_add(builder, "s", "-e");
1065 g_variant_builder_add(builder, "s", mpc->tep_path);
1066 g_variant_builder_add(builder, "s", "-M");
1067 /* TODO: revise tep_move */
1068 g_variant_builder_add(builder, "s",
1069 mpc->tep_move ? "tep_move" : "tep_copy");
1072 args = g_variant_new("as", builder);
1073 g_variant_builder_unref(builder);
1075 ret = comm_client_request(mpc->info.request.cc, "install",
1076 g_variant_new("(uss@as)", uid, pkgtype, pkg_path, args),
1078 if (ret != PKGMGR_R_OK) {
1079 ERR("request failed: %d", ret);
1083 g_variant_get(result, "(i&s)", &ret, &req_key);
1084 if (req_key == NULL) {
1085 g_variant_unref(result);
1086 return PKGMGR_R_ECOMM;
1088 if (ret != PKGMGR_R_OK) {
1089 g_variant_unref(result);
1093 req_id = _get_request_id();
1094 __add_op_cbinfo(mpc, req_id, req_key, event_cb, NULL, data);
1096 g_variant_unref(result);
1101 API int pkgmgr_client_install(pkgmgr_client *pc, const char *pkg_type,
1102 const char *descriptor_path, const char *pkg_path,
1103 const char *optional_data, pkgmgr_mode mode,
1104 pkgmgr_handler event_cb, void *data)
1106 return pkgmgr_client_usr_install(pc, pkg_type, descriptor_path,
1107 pkg_path, optional_data, mode, event_cb, data,
1111 API int pkgmgr_client_reinstall(pkgmgr_client *pc, const char *pkg_type,
1112 const char *pkgid, const char *optional_data, pkgmgr_mode mode,
1113 pkgmgr_handler event_cb, void *data)
1115 return pkgmgr_client_usr_reinstall(pc, pkg_type, pkgid, optional_data,
1116 mode, event_cb, data, _getuid());
1119 API int pkgmgr_client_usr_reinstall(pkgmgr_client *pc, const char *pkg_type,
1120 const char *pkgid, const char *optional_data, pkgmgr_mode mode,
1121 pkgmgr_handler event_cb, void *data, uid_t uid)
1124 int ret = PKGMGR_R_ECOMM;
1125 char *req_key = NULL;
1127 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
1129 pkgmgrinfo_pkginfo_h handle;
1131 if (pc == NULL || pkgid == NULL) {
1132 ERR("invalid parameter");
1133 return PKGMGR_R_EINVAL;
1136 if (mpc->ctype != PC_REQUEST) {
1137 ERR("mpc->ctype is not PC_REQUEST");
1138 return PKGMGR_R_EINVAL;
1141 ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(pkgid, uid, &handle);
1143 return PKGMGR_R_EINVAL;
1145 ret = pkgmgrinfo_pkginfo_get_type(handle, &pkgtype);
1147 pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
1148 return PKGMGR_R_ERROR;
1151 ret = comm_client_request(mpc->info.request.cc, "reinstall",
1152 g_variant_new("(uss)", uid, pkgtype, pkgid), &result);
1153 pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
1154 if (ret != PKGMGR_R_OK) {
1155 ERR("request failed: %d", ret);
1159 g_variant_get(result, "(i&s)", &ret, &req_key);
1160 if (req_key == NULL) {
1161 g_variant_unref(result);
1162 return PKGMGR_R_ECOMM;
1164 if (ret != PKGMGR_R_OK) {
1165 g_variant_unref(result);
1169 req_id = _get_request_id();
1170 __add_op_cbinfo(mpc, req_id, req_key, event_cb, NULL, data);
1172 g_variant_unref(result);
1177 API int pkgmgr_client_usr_mount_install(pkgmgr_client *pc, const char *pkg_type,
1178 const char *descriptor_path, const char *pkg_path,
1179 const char *optional_data, pkgmgr_mode mode,
1180 pkgmgr_handler event_cb, void *data, uid_t uid)
1183 int ret = PKGMGR_R_ECOMM;
1184 char *req_key = NULL;
1185 GVariantBuilder *builder = NULL;
1186 GVariant *args = NULL;
1188 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
1191 if (pc == NULL || pkg_path == NULL) {
1192 ERR("invalid parameter");
1193 return PKGMGR_R_EINVAL;
1196 if (mpc->ctype != PC_REQUEST) {
1197 ERR("mpc->ctype is not PC_REQUEST");
1198 return PKGMGR_R_EINVAL;
1201 if (access(pkg_path, F_OK) != 0) {
1202 ERR("failed to access: %s", pkg_path);
1203 return PKGMGR_R_EINVAL;
1206 if (mpc->tep_path != NULL && access(mpc->tep_path, F_OK) != 0) {
1207 ERR("failed to access: %s", mpc->tep_path);
1208 return PKGMGR_R_EINVAL;
1211 /* TODO: check pkg's type on server-side */
1212 if (pkg_type == NULL)
1213 pkgtype = __get_type_from_path(pkg_path);
1215 pkgtype = strdup(pkg_type);
1217 /* build arguments */
1218 builder = g_variant_builder_new(G_VARIANT_TYPE("as"));
1219 if (mpc->tep_path) {
1220 g_variant_builder_add(builder, "s", "-e");
1221 g_variant_builder_add(builder, "s", mpc->tep_path);
1222 g_variant_builder_add(builder, "s", "-M");
1223 /* TODO: revise tep_move */
1224 g_variant_builder_add(builder, "s",
1225 mpc->tep_move ? "tep_move" : "tep_copy");
1228 args = g_variant_new("as", builder);
1229 g_variant_builder_unref(builder);
1231 ret = comm_client_request(mpc->info.request.cc, "mount_install",
1232 g_variant_new("(uss@as)", uid, pkgtype, pkg_path, args),
1234 if (ret != PKGMGR_R_OK) {
1235 ERR("request failed: %d", ret);
1239 g_variant_get(result, "(i&s)", &ret, &req_key);
1240 if (req_key == NULL) {
1241 g_variant_unref(result);
1242 return PKGMGR_R_ECOMM;
1244 if (ret != PKGMGR_R_OK) {
1245 g_variant_unref(result);
1249 req_id = _get_request_id();
1250 __add_op_cbinfo(mpc, req_id, req_key, event_cb, NULL, data);
1252 g_variant_unref(result);
1257 API int pkgmgr_client_mount_install(pkgmgr_client *pc, const char *pkg_type,
1258 const char *descriptor_path, const char *pkg_path,
1259 const char *optional_data, pkgmgr_mode mode,
1260 pkgmgr_handler event_cb, void *data)
1262 return pkgmgr_client_usr_mount_install(pc, pkg_type, descriptor_path,
1263 pkg_path, optional_data, mode, event_cb, data,
1267 API int pkgmgr_client_uninstall(pkgmgr_client *pc, const char *pkg_type,
1268 const char *pkgid, pkgmgr_mode mode, pkgmgr_handler event_cb,
1271 return pkgmgr_client_usr_uninstall(pc, pkg_type, pkgid, mode, event_cb,
1275 API int pkgmgr_client_usr_uninstall(pkgmgr_client *pc, const char *pkg_type,
1276 const char *pkgid, pkgmgr_mode mode, pkgmgr_handler event_cb,
1277 void *data, uid_t uid)
1280 int ret = PKGMGR_R_ECOMM;
1281 char *req_key = NULL;
1283 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
1285 pkgmgrinfo_pkginfo_h handle;
1287 if (pc == NULL || pkgid == NULL) {
1288 ERR("invalid parameter");
1289 return PKGMGR_R_EINVAL;
1292 if (mpc->ctype != PC_REQUEST) {
1293 ERR("mpc->ctype is not PC_REQUEST");
1294 return PKGMGR_R_EINVAL;
1297 ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(pkgid, uid, &handle);
1299 return PKGMGR_R_EINVAL;
1301 ret = pkgmgrinfo_pkginfo_get_type(handle, &pkgtype);
1303 pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
1304 return PKGMGR_R_ERROR;
1307 ret = comm_client_request(mpc->info.request.cc, "uninstall",
1308 g_variant_new("(uss)", uid, pkgtype, pkgid), &result);
1309 if (ret != PKGMGR_R_OK) {
1310 ERR("request failed: %d", ret);
1311 pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
1315 g_variant_get(result, "(i&s)", &ret, &req_key);
1316 if (req_key == NULL) {
1317 g_variant_unref(result);
1318 pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
1319 return PKGMGR_R_ECOMM;
1321 if (ret != PKGMGR_R_OK) {
1322 g_variant_unref(result);
1323 pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
1327 req_id = _get_request_id();
1328 __add_op_cbinfo(mpc, req_id, req_key, event_cb, NULL, data);
1330 g_variant_unref(result);
1331 pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
1336 API int pkgmgr_client_move(pkgmgr_client *pc, const char *pkg_type,
1337 const char *pkgid, pkgmgr_move_type move_type,
1338 pkgmgr_handler event_cb, void *data)
1340 return pkgmgr_client_usr_move(pc, pkg_type, pkgid, move_type,
1341 event_cb, data, _getuid());
1343 API int pkgmgr_client_usr_move(pkgmgr_client *pc, const char *pkg_type,
1344 const char *pkgid, pkgmgr_move_type move_type,
1345 pkgmgr_handler event_cb, void *data, uid_t uid)
1348 int ret = PKGMGR_R_ECOMM;
1350 char *req_key = NULL;
1351 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
1353 if (pc == NULL || pkg_type == NULL || pkgid == NULL) {
1354 ERR("invalid parameter");
1355 return PKGMGR_R_EINVAL;
1358 if ((move_type < PM_MOVE_TO_INTERNAL) || (move_type > PM_MOVE_TO_SDCARD))
1359 return PKGMGR_R_EINVAL;
1361 if (mpc->ctype != PC_REQUEST) {
1362 ERR("mpc->ctype is not PC_REQUEST");
1363 return PKGMGR_R_EINVAL;
1366 ret = comm_client_request(mpc->info.request.cc, "move",
1367 g_variant_new("(ussi)", uid, pkg_type, pkgid, move_type), &result);
1368 if (ret != PKGMGR_R_OK) {
1369 ERR("request failed: %d", ret);
1373 g_variant_get(result, "(i&s)", &ret, &req_key);
1374 if (req_key == NULL) {
1375 g_variant_unref(result);
1376 return PKGMGR_R_ECOMM;
1378 if (ret != PKGMGR_R_OK) {
1379 g_variant_unref(result);
1383 req_id = _get_request_id();
1384 __add_op_cbinfo(mpc, req_id, req_key, event_cb, NULL, data);
1385 g_variant_unref(result);
1390 API int pkgmgr_client_usr_activate(pkgmgr_client *pc, const char *pkg_type,
1391 const char *pkgid, uid_t uid)
1394 int ret = PKGMGR_R_ECOMM;
1395 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
1397 if (pc == NULL || pkgid == NULL || pkg_type == NULL) {
1398 ERR("invalid parameter");
1399 return PKGMGR_R_EINVAL;
1402 ret = comm_client_request(mpc->info.request.cc, "enable_pkg",
1403 g_variant_new("(uss)", uid, pkg_type, pkgid), &result);
1404 if (ret != PKGMGR_R_OK) {
1405 ERR("request failed: %d", ret);
1409 g_variant_get(result, "(i)", &ret);
1410 g_variant_unref(result);
1415 API int pkgmgr_client_activate(pkgmgr_client *pc, const char *pkg_type,
1418 return pkgmgr_client_usr_activate(pc, pkg_type, pkgid, _getuid());
1421 API int pkgmgr_client_usr_deactivate(pkgmgr_client *pc, const char *pkg_type,
1422 const char *pkgid, uid_t uid)
1425 int ret = PKGMGR_R_ECOMM;
1426 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
1428 if (pc == NULL || pkgid == NULL || pkg_type == NULL) {
1429 ERR("invalid parameter");
1430 return PKGMGR_R_EINVAL;
1433 ret = comm_client_request(mpc->info.request.cc, "disable_pkg",
1434 g_variant_new("(uss)", uid, pkg_type, pkgid), &result);
1435 if (ret != PKGMGR_R_OK) {
1436 ERR("request failed: %d", ret);
1440 g_variant_get(result, "(i)", &ret);
1441 g_variant_unref(result);
1446 API int pkgmgr_client_deactivate(pkgmgr_client *pc, const char *pkg_type,
1449 return pkgmgr_client_usr_deactivate(pc, pkg_type, pkgid, _getuid());
1452 API int pkgmgr_client_usr_activate_app(pkgmgr_client *pc, const char *appid,
1453 pkgmgr_app_handler app_event_cb, uid_t uid)
1456 int ret = PKGMGR_R_ECOMM;
1458 char *req_key = NULL;
1459 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
1461 if (pc == NULL || appid == NULL) {
1462 ERR("invalid parameter");
1463 return PKGMGR_R_EINVAL;
1466 if (__change_op_cb_for_enable_disable(mpc, false) < 0) {
1467 ERR("__change_op_cb_for_enable_disable failed");
1468 return PKGMGR_R_ESYSTEM;
1471 ret = comm_client_request(mpc->info.request.cc, "enable_app",
1472 g_variant_new("(us)", uid, appid), &result);
1473 if (ret != PKGMGR_R_OK) {
1474 ERR("request failed: %d", ret);
1478 g_variant_get(result, "(i&s)", &ret, &req_key);
1479 if (req_key == NULL) {
1480 g_variant_unref(result);
1481 return PKGMGR_R_ECOMM;
1483 if (ret != PKGMGR_R_OK) {
1484 g_variant_unref(result);
1488 req_id = _get_request_id();
1489 __add_op_app_cbinfo(pc, req_id, req_key, app_event_cb, NULL);
1490 g_variant_unref(result);
1494 API int pkgmgr_client_activate_app(pkgmgr_client *pc, const char *appid, pkgmgr_app_handler app_event_cb)
1496 return pkgmgr_client_usr_activate_app(pc, appid, app_event_cb, _getuid());
1499 API int pkgmgr_client_activate_global_app_for_uid(pkgmgr_client *pc,
1500 const char *appid, pkgmgr_app_handler app_event_cb, uid_t uid)
1503 int ret = PKGMGR_R_ECOMM;
1505 char *req_key = NULL;
1506 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
1508 if (pc == NULL || appid == NULL) {
1509 ERR("invalid parameter");
1510 return PKGMGR_R_EINVAL;
1513 if (__change_op_cb_for_enable_disable(mpc, false) < 0) {
1514 ERR("__change_op_cb_for_enable_disable failed");
1515 return PKGMGR_R_ESYSTEM;
1518 ret = comm_client_request(mpc->info.request.cc, "enable_global_app_for_uid",
1519 g_variant_new("(us)", uid, appid), &result);
1520 if (ret != PKGMGR_R_OK) {
1521 ERR("request failed: %d", ret);
1525 g_variant_get(result, "(i&s)", &ret, &req_key);
1526 if (req_key == NULL) {
1527 g_variant_unref(result);
1528 return PKGMGR_R_ECOMM;
1530 if (ret != PKGMGR_R_OK) {
1531 g_variant_unref(result);
1535 req_id = _get_request_id();
1536 __add_op_app_cbinfo(pc, req_id, req_key, app_event_cb, NULL);
1541 API int pkgmgr_client_usr_deactivate_app(pkgmgr_client *pc, const char *appid,
1542 pkgmgr_app_handler app_event_cb, uid_t uid)
1545 int ret = PKGMGR_R_ECOMM;
1546 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
1548 char *req_key = NULL;
1550 if (pc == NULL || appid == NULL) {
1551 ERR("invalid parameter");
1552 return PKGMGR_R_EINVAL;
1556 if (__change_op_cb_for_enable_disable(mpc, true) < 0) {
1557 ERR("__change_op_cb_for_enable_disable failed");
1558 return PKGMGR_R_ESYSTEM;
1561 ret = comm_client_request(mpc->info.request.cc, "disable_app",
1562 g_variant_new("(us)", uid, appid), &result);
1563 if (ret != PKGMGR_R_OK) {
1564 ERR("request failed: %d", ret);
1568 g_variant_get(result, "(i&s)", &ret, &req_key);
1569 if (req_key == NULL) {
1570 g_variant_unref(result);
1571 return PKGMGR_R_ECOMM;
1573 if (ret != PKGMGR_R_OK) {
1574 g_variant_unref(result);
1578 req_id = _get_request_id();
1579 __add_op_app_cbinfo(pc, req_id, req_key, app_event_cb, NULL);
1581 g_variant_unref(result);
1585 API int pkgmgr_client_deactivate_app(pkgmgr_client *pc, const char *appid, pkgmgr_app_handler app_event_cb)
1587 return pkgmgr_client_usr_deactivate_app(pc, appid, app_event_cb, _getuid());
1590 API int pkgmgr_client_deactivate_global_app_for_uid(pkgmgr_client *pc,
1591 const char *appid, pkgmgr_app_handler app_event_cb, uid_t uid)
1594 int ret = PKGMGR_R_ECOMM;
1596 char *req_key = NULL;
1597 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
1599 if (pc == NULL || appid == NULL) {
1600 ERR("invalid parameter");
1601 return PKGMGR_R_EINVAL;
1604 if (__change_op_cb_for_enable_disable(mpc, true) < 0) {
1605 ERR("__change_op_cb_for_enable_disable failed");
1606 return PKGMGR_R_ESYSTEM;
1609 ret = comm_client_request(mpc->info.request.cc, "disable_global_app_for_uid",
1610 g_variant_new("(us)", uid, appid), &result);
1611 if (ret != PKGMGR_R_OK) {
1612 ERR("request failed: %d", ret);
1616 g_variant_get(result, "(i&s)", &ret, &req_key);
1617 if (req_key == NULL) {
1618 g_variant_unref(result);
1619 return PKGMGR_R_ECOMM;
1621 if (ret != PKGMGR_R_OK) {
1622 g_variant_unref(result);
1626 req_id = _get_request_id();
1627 __add_op_app_cbinfo(pc, req_id, req_key, app_event_cb, NULL);
1631 API int pkgmgr_client_usr_clear_user_data(pkgmgr_client *pc,
1632 const char *pkg_type, const char *appid, pkgmgr_mode mode,
1636 int ret = PKGMGR_R_ECOMM;
1637 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
1639 if (pc == NULL || pkg_type == NULL || appid == NULL) {
1640 ERR("invalid parameter");
1641 return PKGMGR_R_EINVAL;
1644 if (mpc->ctype != PC_REQUEST) {
1645 ERR("mpc->ctype is not PC_REQUEST");
1646 return PKGMGR_R_EINVAL;
1649 ret = comm_client_request(mpc->info.request.cc, "cleardata",
1650 g_variant_new("(uss)", uid, pkg_type, appid), &result);
1651 if (ret == PKGMGR_R_OK) {
1652 ERR("request failed: %d", ret);
1656 g_variant_get(result, "(i)", &ret);
1657 g_variant_unref(result);
1662 API int pkgmgr_client_clear_user_data(pkgmgr_client *pc, const char *pkg_type,
1663 const char *appid, pkgmgr_mode mode)
1665 return pkgmgr_client_usr_clear_user_data(pc, pkg_type, appid, mode,
1669 API int pkgmgr_client_set_status_type(pkgmgr_client *pc, int status_type)
1673 retvm_if(pc == NULL, PKGMGR_R_EINVAL, "package manager client pc is NULL");
1674 retvm_if(status_type == PKGMGR_CLIENT_STATUS_ALL, PKGMGR_R_OK, "status_type is PKGMGR_CLIENT_STATUS_ALL");
1675 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
1677 /* free listening head */
1678 listen_cb_info *tmp = NULL;
1679 listen_cb_info *prev = NULL;
1680 for (tmp = mpc->info.listening.lhead; tmp;) {
1686 /* free dbus connection */
1687 ret = comm_client_free(mpc->info.listening.cc);
1688 retvm_if(ret < 0, PKGMGR_R_ERROR, "comm_client_free() failed - %d", ret);
1690 /* Manage pc for seperated event */
1691 mpc->ctype = PC_LISTENING;
1692 mpc->status_type = status_type;
1694 mpc->info.listening.cc = comm_client_new(PC_LISTENING);
1695 retvm_if(mpc->info.listening.cc == NULL, PKGMGR_R_EINVAL, "client creation failed");
1697 ret = comm_client_set_status_callback(status_type, mpc->info.listening.cc, __status_callback, pc);
1698 retvm_if(ret < 0, PKGMGR_R_ECOMM, "comm_client_set_status_callback failed - %d", ret);
1703 API int pkgmgr_client_listen_status(pkgmgr_client *pc, pkgmgr_handler event_cb,
1707 /* Check for NULL value of pc */
1708 retvm_if(pc == NULL, PKGMGR_R_EINVAL, "package manager client pc is NULL");
1709 pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc;
1711 /* 0. check input */
1712 retvm_if(mpc->ctype != PC_LISTENING, PKGMGR_R_EINVAL, "ctype is not PC_LISTENING");
1713 retvm_if(event_cb == NULL, PKGMGR_R_EINVAL, "event_cb is NULL");
1716 req_id = _get_request_id();
1718 /* 2. add callback info to pkgmgr_client */
1719 __add_stat_cbinfo(mpc, req_id, event_cb, data);
1723 API int pkgmgr_client_listen_app_status(pkgmgr_client *pc, pkgmgr_app_handler event_cb,
1727 /* Check for NULL value of pc */
1728 retvm_if(pc == NULL, PKGMGR_R_EINVAL, "package manager client pc is NULL");
1729 pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc;
1731 /* 0. check input */
1732 retvm_if(mpc->ctype != PC_LISTENING, PKGMGR_R_EINVAL, "ctype is not PC_LISTENING");
1733 retvm_if(event_cb == NULL, PKGMGR_R_EINVAL, "event_cb is NULL");
1736 req_id = _get_request_id();
1738 /* 2. add app callback info to pkgmgr_client */
1739 __add_app_stat_cbinfo(mpc, req_id, event_cb, data);
1743 API int pkgmgr_client_remove_listen_status(pkgmgr_client *pc)
1747 retvm_if(pc == NULL, PKGMGR_R_EINVAL, "package manager client pc is NULL");
1748 pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc;
1750 ret = __remove_stat_cbinfo(mpc);
1752 ERR("failed to remove status callback");
1753 return PKGMGR_R_ERROR;
1759 API int pkgmgr_client_broadcast_status(pkgmgr_client *pc, const char *pkg_type,
1760 const char *pkgid, const char *key,
1763 /* client cannot broadcast signal */
1767 API int pkgmgr_client_request_service(pkgmgr_request_service_type service_type, int service_mode,
1768 pkgmgr_client *pc, const char *pkg_type, const char *pkgid,
1769 const char *custom_info, pkgmgr_handler event_cb, void *data)
1771 return pkgmgr_client_usr_request_service(service_type, service_mode, pc, pkg_type, pkgid, _getuid(), custom_info, event_cb, data);
1774 API int pkgmgr_client_usr_request_service(pkgmgr_request_service_type service_type, int service_mode,
1775 pkgmgr_client *pc, const char *pkg_type, const char *pkgid, uid_t uid,
1776 const char *custom_info, pkgmgr_handler event_cb, void *data)
1780 /* Check for NULL value of service type */
1781 retvm_if(service_type > PM_REQUEST_MAX, PKGMGR_R_EINVAL, "service type is not defined\n");
1782 retvm_if(service_type < 0, PKGMGR_R_EINVAL, "service type is error\n");
1784 switch (service_type) {
1785 case PM_REQUEST_MOVE:
1786 tryvm_if(pkgid == NULL, ret = PKGMGR_R_EINVAL, "pkgid is NULL\n");
1787 tryvm_if(pc == NULL, ret = PKGMGR_R_EINVAL, "pc is NULL\n");
1788 tryvm_if((service_mode < PM_MOVE_TO_INTERNAL) || (service_mode > PM_MOVE_TO_SDCARD), ret = PKGMGR_R_EINVAL, "service_mode is wrong\n");
1790 ret = __move_pkg_process(pc, pkgid, pkg_type, uid, (pkgmgr_move_type)service_mode, event_cb, data);
1793 case PM_REQUEST_GET_SIZE:
1794 tryvm_if(pkgid == NULL, ret = PKGMGR_R_EINVAL, "pkgid is NULL\n");
1795 tryvm_if(pc == NULL, ret = PKGMGR_R_EINVAL, "pc is NULL\n");
1796 tryvm_if((service_mode < PM_GET_TOTAL_SIZE) || (service_mode >= PM_GET_MAX), ret = PKGMGR_R_EINVAL, "service_mode is wrong\n");
1798 ret = __get_size_process(pc, pkgid, uid, (pkgmgr_getsize_type)service_mode, event_cb, data);
1801 case PM_REQUEST_KILL_APP:
1802 case PM_REQUEST_CHECK_APP:
1803 tryvm_if(pkgid == NULL, ret = PKGMGR_R_EINVAL, "pkgid is NULL\n");
1804 tryvm_if(pc == NULL, ret = PKGMGR_R_EINVAL, "pc is NULL\n");
1806 ret = __check_app_process(service_type, pc, pkgid, uid, data);
1808 ERR("__check_app_process fail \n");
1815 ERR("Wrong Request\n");
1826 API int pkgmgr_client_usr_request_size_info(uid_t uid)
1829 pkgmgr_client *pc = NULL;
1831 pc = pkgmgr_client_new(PC_REQUEST);
1832 retvm_if(pc == NULL, PKGMGR_R_EINVAL, "request pc is null\n");
1834 ret = __request_size_info(pc, uid);
1836 ERR("__request_size_info fail \n");
1838 pkgmgr_client_free(pc);
1842 API int pkgmgr_client_request_size_info(void) /* get all package size (data, total) */
1844 return pkgmgr_client_usr_request_size_info(_getuid());
1847 API int pkgmgr_client_usr_clear_cache_dir(const char *pkgid, uid_t uid)
1850 int ret = PKGMGR_R_ECOMM;
1851 pkgmgr_client_t *pc;
1853 if (pkgid == NULL) {
1854 ERR("invalid parameter");
1855 return PKGMGR_R_EINVAL;
1858 pc = pkgmgr_client_new(PC_REQUEST);
1860 ERR("out of memory");
1861 return PKGMGR_R_ESYSTEM;
1864 ret = comm_client_request(pc->info.request.cc, "clearcache",
1865 g_variant_new("(us)", uid, pkgid), &result);
1866 if (ret != PKGMGR_R_OK) {
1867 ERR("request failed: %d", ret);
1871 g_variant_get(result, "(i)", &ret);
1872 g_variant_unref(result);
1877 API int pkgmgr_client_clear_cache_dir(const char *pkgid)
1879 return pkgmgr_client_usr_clear_cache_dir(pkgid, _getuid());
1882 API int pkgmgr_client_clear_usr_all_cache_dir(uid_t uid)
1884 return pkgmgr_client_usr_clear_cache_dir(PKG_CLEAR_ALL_CACHE, uid);
1887 API int pkgmgr_client_clear_all_cache_dir(void)
1889 return pkgmgr_client_usr_clear_cache_dir(PKG_CLEAR_ALL_CACHE, _getuid());
1892 API int pkgmgr_client_get_size(pkgmgr_client *pc, const char *pkgid,
1893 pkgmgr_getsize_type get_type, pkgmgr_handler event_cb,
1896 return pkgmgr_client_usr_get_size(pc, pkgid, get_type, event_cb, data,
1900 API int pkgmgr_client_usr_get_size(pkgmgr_client *pc, const char *pkgid,
1901 pkgmgr_getsize_type get_type, pkgmgr_handler event_cb,
1902 void *data, uid_t uid)
1905 int ret = PKGMGR_R_ECOMM;
1906 char *req_key = NULL;
1908 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
1910 if (pc == NULL || pkgid == NULL || event_cb == NULL) {
1911 ERR("invalid parameter");
1912 return PKGMGR_R_EINVAL;
1915 if (mpc->ctype != PC_REQUEST) {
1916 ERR("mpc->ctype is not PC_REQUEST");
1917 return PKGMGR_R_EINVAL;
1921 if (strcmp(pkgid, PKG_SIZE_INFO_TOTAL) == 0)
1922 get_type = PM_GET_TOTAL_PKG_SIZE_INFO;
1924 get_type = PM_GET_PKG_SIZE_INFO;
1926 ret = comm_client_request(mpc->info.request.cc, "getsize",
1927 g_variant_new("(usi)", uid, pkgid, get_type), &result);
1928 if (ret != PKGMGR_R_OK) {
1929 ERR("request failed: %d", ret);
1933 g_variant_get(result, "(i&s)", &ret, &req_key);
1934 if (req_key == NULL) {
1935 g_variant_unref(result);
1936 return PKGMGR_R_ECOMM;
1938 if (ret != PKGMGR_R_OK) {
1939 g_variant_unref(result);
1943 req_id = _get_request_id();
1944 __add_op_cbinfo(mpc, req_id, req_key, event_cb, NULL, data);
1946 g_variant_unref(result);
1951 API int pkgmgr_client_usr_get_package_size_info(pkgmgr_client *pc,
1952 const char *pkgid, pkgmgr_pkg_size_info_receive_cb event_cb,
1953 void *user_data, uid_t uid)
1956 int ret = PKGMGR_R_ECOMM;
1957 char *req_key = NULL;
1960 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
1962 if (pc == NULL || pkgid == NULL || event_cb == NULL) {
1963 ERR("invalid parameter");
1964 return PKGMGR_R_EINVAL;
1967 if (mpc->ctype != PC_REQUEST) {
1968 ERR("mpc->ctype is not PC_REQUEST");
1969 return PKGMGR_R_EINVAL;
1973 if (__change_op_cb_for_getsize(mpc) < 0) {
1974 ERR("__change_op_cb_for_getsize failed");
1975 return PKGMGR_R_ESYSTEM;
1978 if (strcmp(pkgid, PKG_SIZE_INFO_TOTAL) == 0)
1979 get_type = PM_GET_TOTAL_PKG_SIZE_INFO;
1981 get_type = PM_GET_PKG_SIZE_INFO;
1983 ret = comm_client_request(mpc->info.request.cc, "getsize",
1984 g_variant_new("(usi)", uid, pkgid, get_type), &result);
1985 if (ret != PKGMGR_R_OK) {
1986 ERR("request failed: %d", ret);
1990 g_variant_get(result, "(i&s)", &ret, &req_key);
1991 if (req_key == NULL) {
1992 g_variant_unref(result);
1993 return PKGMGR_R_ECOMM;
1995 if (ret != PKGMGR_R_OK) {
1996 g_variant_unref(result);
2000 req_id = _get_request_id();
2001 __add_op_cbinfo(mpc, req_id, req_key, __get_pkg_size_info_cb, event_cb,
2004 g_variant_unref(result);
2009 API int pkgmgr_client_get_package_size_info(pkgmgr_client *pc, const char *pkgid, pkgmgr_pkg_size_info_receive_cb event_cb, void *user_data)
2011 return pkgmgr_client_usr_get_package_size_info(pc, pkgid, event_cb, user_data, _getuid());
2014 API int pkgmgr_client_usr_get_total_package_size_info(pkgmgr_client *pc, pkgmgr_total_pkg_size_info_receive_cb event_cb, void *user_data, uid_t uid)
2015 { /* total package size info */
2016 return pkgmgr_client_usr_get_package_size_info(pc, PKG_SIZE_INFO_TOTAL, (pkgmgr_pkg_size_info_receive_cb)event_cb, user_data, uid);
2019 API int pkgmgr_client_get_total_package_size_info(pkgmgr_client *pc, pkgmgr_total_pkg_size_info_receive_cb event_cb, void *user_data)
2021 return pkgmgr_client_usr_get_package_size_info(pc, PKG_SIZE_INFO_TOTAL, (pkgmgr_pkg_size_info_receive_cb)event_cb, user_data, _getuid());
2024 API int pkgmgr_client_generate_license_request(pkgmgr_client *pc,
2025 const char *resp_data, char **req_data, char **license_url)
2031 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
2033 if (pc == NULL || resp_data == NULL || req_data == NULL ||
2034 license_url == NULL) {
2035 ERR("invalid parameter");
2036 return PKGMGR_R_EINVAL;
2039 if (mpc->ctype != PC_REQUEST) {
2040 ERR("mpc->ctype is not PC_REQUEST");
2041 return PKGMGR_R_EINVAL;
2044 ret = comm_client_request(mpc->info.request.cc,
2045 "generate_license_request",
2046 g_variant_new("(s)", resp_data), &result);
2047 if (ret != PKGMGR_R_OK) {
2048 ERR("request failed: %d", ret);
2052 g_variant_get(result, "(i&s&s)", &ret, &data, &url);
2053 if (ret != PKGMGR_R_OK) {
2054 ERR("generate_license_request failed: %d", ret);
2055 g_variant_unref(result);
2059 *req_data = strdup(data);
2060 *license_url = strdup(url);
2062 g_variant_unref(result);
2067 API int pkgmgr_client_register_license(pkgmgr_client *pc, const char *resp_data)
2071 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
2073 if (pc == NULL || resp_data == NULL) {
2074 ERR("invalid parameter");
2075 return PKGMGR_R_EINVAL;
2078 if (mpc->ctype != PC_REQUEST) {
2079 ERR("mpc->ctype is not PC_REQUEST");
2080 return PKGMGR_R_EINVAL;
2083 ret = comm_client_request(mpc->info.request.cc,
2084 "register_license", g_variant_new("(s)", resp_data),
2086 if (ret != PKGMGR_R_OK) {
2087 ERR("request failed: %d", ret);
2091 g_variant_get(result, "(i)", &ret);
2092 g_variant_unref(result);
2093 if (ret != PKGMGR_R_OK) {
2094 ERR("register license failed: %d", ret);
2101 API int pkgmgr_client_decrypt_package(pkgmgr_client *pc,
2102 const char *drm_file_path, const char *decrypted_file_path)
2106 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
2108 if (pc == NULL || drm_file_path == NULL ||
2109 decrypted_file_path == NULL) {
2110 ERR("invalid parameter");
2111 return PKGMGR_R_EINVAL;
2114 if (mpc->ctype != PC_REQUEST) {
2115 ERR("mpc->ctype is not PC_REQUEST");
2116 return PKGMGR_R_EINVAL;
2119 ret = comm_client_request(mpc->info.request.cc,
2121 g_variant_new("(ss)", drm_file_path,
2122 decrypted_file_path),
2124 if (ret != PKGMGR_R_OK) {
2125 ERR("request failed: %d", ret);
2129 g_variant_get(result, "(i)", &ret);
2130 g_variant_unref(result);
2131 if (ret != PKGMGR_R_OK) {
2132 ERR("decrypt_package failed: %d", ret);
2139 API int pkgmgr_client_enable_splash_screen(pkgmgr_client *pc, const char *appid)
2141 return pkgmgr_client_usr_enable_splash_screen(pc, appid, _getuid());
2144 API int pkgmgr_client_usr_enable_splash_screen(pkgmgr_client *pc,
2145 const char *appid, uid_t uid)
2149 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
2151 if (pc == NULL || appid == NULL) {
2152 ERR("Invalid parameter");
2153 return PKGMGR_R_EINVAL;
2156 ret = __change_op_cb_for_enable_disable_splash_screen(mpc, true);
2158 ERR("__change_op_cb_for_enable_disable_splash_screen failed");
2159 return PKGMGR_R_ESYSTEM;
2162 ret = comm_client_request(mpc->info.request.cc,
2163 "enable_app_splash_screen",
2164 g_variant_new("(us)", uid, appid), &result);
2165 if (ret != PKGMGR_R_OK) {
2166 ERR("request failed: %d", ret);
2170 g_variant_get(result, "(i)", &ret);
2171 if (ret != PKGMGR_R_OK) {
2172 g_variant_unref(result);
2176 g_variant_unref(result);
2181 API int pkgmgr_client_disable_splash_screen(pkgmgr_client *pc,
2184 return pkgmgr_client_usr_disable_splash_screen(pc, appid,
2188 API int pkgmgr_client_usr_disable_splash_screen(pkgmgr_client *pc,
2189 const char *appid, uid_t uid)
2193 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
2195 if (pc == NULL || appid == NULL) {
2196 ERR("Invalid parameter");
2197 return PKGMGR_R_EINVAL;
2200 ret = __change_op_cb_for_enable_disable_splash_screen(mpc, false);
2202 ERR("__change_op_cb_for_enable_disable_splash_screen failed");
2206 ret = comm_client_request(mpc->info.request.cc,
2207 "disable_app_splash_screen",
2208 g_variant_new("(us)", uid, appid), &result);
2209 if (ret != PKGMGR_R_OK) {
2210 ERR("request failed: %d", ret);
2214 g_variant_get(result, "(i)", &ret);
2215 if (ret != PKGMGR_R_OK) {
2216 g_variant_unref(result);
2220 g_variant_unref(result);
2225 static int __set_pkg_restriction_mode(pkgmgr_client *pc, const char *pkgid, int mode, uid_t uid)
2228 int ret = PKGMGR_R_ECOMM;
2229 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
2231 if (pc == NULL || pkgid == NULL || strlen(pkgid) == 0 || mode <= 0) {
2232 ERR("invalid parameter");
2233 return PKGMGR_R_EINVAL;
2236 ret = comm_client_request(mpc->info.request.cc, "set_restriction_mode",
2237 g_variant_new("(usi)", uid, pkgid, mode), &result);
2238 if (ret != PKGMGR_R_OK) {
2239 ERR("request failed: %d", ret);
2243 g_variant_get(result, "(i)", &ret);
2244 g_variant_unref(result);
2249 API int pkgmgr_client_usr_set_pkg_restriction_mode(pkgmgr_client *pc, const char *pkgid, int mode, uid_t uid)
2251 return __set_pkg_restriction_mode(pc, pkgid, mode, uid);
2254 API int pkgmgr_client_set_pkg_restriction_mode(pkgmgr_client *pc, const char *pkgid, int mode)
2256 return pkgmgr_client_usr_set_pkg_restriction_mode(pc, pkgid, mode, _getuid());
2259 static int __unset_pkg_restriction_mode(pkgmgr_client *pc, const char *pkgid, int mode, uid_t uid)
2262 int ret = PKGMGR_R_ECOMM;
2263 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
2265 if (pc == NULL || pkgid == NULL || strlen(pkgid) == 0 || mode <= 0) {
2266 ERR("invalid parameter");
2267 return PKGMGR_R_EINVAL;
2270 ret = comm_client_request(mpc->info.request.cc,
2271 "unset_restriction_mode",
2272 g_variant_new("(usi)", uid, pkgid, mode), &result);
2273 if (ret != PKGMGR_R_OK) {
2274 ERR("request failed: %d", ret);
2278 g_variant_get(result, "(i)", &ret);
2279 g_variant_unref(result);
2285 API int pkgmgr_client_usr_unset_pkg_restriction_mode(pkgmgr_client *pc, const char *pkgid, int mode, uid_t uid)
2287 return __unset_pkg_restriction_mode(pc, pkgid, mode, uid);
2290 API int pkgmgr_client_unset_pkg_restriction_mode(pkgmgr_client *pc, const char *pkgid, int mode)
2292 return pkgmgr_client_usr_unset_pkg_restriction_mode(pc, pkgid, mode, _getuid());
2295 static int __get_pkg_restriction_mode(pkgmgr_client *pc, const char *pkgid, int *mode, uid_t uid)
2298 int ret = PKGMGR_R_ECOMM;
2300 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
2302 if (pc == NULL || pkgid == NULL || strlen(pkgid) == 0) {
2303 ERR("invalid parameter");
2304 return PKGMGR_R_EINVAL;
2307 ret = comm_client_request(mpc->info.request.cc,
2308 "get_restriction_mode",
2309 g_variant_new("(us)", uid, pkgid), &result);
2310 if (ret != PKGMGR_R_OK) {
2311 ERR("request failed: %d", ret);
2315 g_variant_get(result, "(ii)", &m, &ret);
2316 g_variant_unref(result);
2317 if (ret != PKGMGR_R_OK)
2325 API int pkgmgr_client_usr_get_pkg_restriction_mode(pkgmgr_client *pc, const char *pkgid, int *mode, uid_t uid)
2327 return __get_pkg_restriction_mode(pc, pkgid, mode, uid);
2330 API int pkgmgr_client_get_pkg_restriction_mode(pkgmgr_client *pc, const char *pkgid, int *mode)
2332 return pkgmgr_client_usr_get_pkg_restriction_mode(pc, pkgid, mode, _getuid());
2335 API int pkgmgr_client_usr_set_restriction_mode(pkgmgr_client *pc, int mode,
2339 int ret = PKGMGR_R_ECOMM;
2340 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
2343 ERR("invalid parameter");
2344 return PKGMGR_R_EINVAL;
2347 ret = comm_client_request(mpc->info.request.cc, "set_restriction_mode",
2348 g_variant_new("(usi)", uid, "", mode), &result);
2349 if (ret != PKGMGR_R_OK) {
2350 ERR("request failed: %d", ret);
2354 g_variant_get(result, "(i)", &ret);
2355 g_variant_unref(result);
2360 API int pkgmgr_client_set_restriction_mode(pkgmgr_client *pc, int mode)
2362 return pkgmgr_client_usr_set_restriction_mode(pc, mode, _getuid());
2365 API int pkgmgr_client_usr_unset_restriction_mode(pkgmgr_client *pc, int mode,
2369 int ret = PKGMGR_R_ECOMM;
2370 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
2373 ERR("invalid parameter");
2374 return PKGMGR_R_EINVAL;
2377 ret = comm_client_request(mpc->info.request.cc,
2378 "unset_restriction_mode",
2379 g_variant_new("(usi)", uid, "", mode), &result);
2380 if (ret != PKGMGR_R_OK) {
2381 ERR("request failed: %d", ret);
2385 g_variant_get(result, "(i)", &ret);
2386 g_variant_unref(result);
2391 API int pkgmgr_client_unset_restriction_mode(pkgmgr_client *pc, int mode)
2393 return pkgmgr_client_usr_unset_restriction_mode(pc, mode, _getuid());
2396 API int pkgmgr_client_usr_get_restriction_mode(pkgmgr_client *pc,
2397 int *mode, uid_t uid)
2400 int ret = PKGMGR_R_ECOMM;
2402 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
2405 ERR("invalid parameter");
2406 return PKGMGR_R_EINVAL;
2409 ret = comm_client_request(mpc->info.request.cc,
2410 "get_restriction_mode",
2411 g_variant_new("(us)", uid, ""), &result);
2412 if (ret != PKGMGR_R_OK) {
2413 ERR("request failed: %d", ret);
2417 g_variant_get(result, "(ii)", &m, &ret);
2418 g_variant_unref(result);
2419 if (ret != PKGMGR_R_OK)
2427 API int pkgmgr_client_get_restriction_mode(pkgmgr_client *pc,
2430 return pkgmgr_client_usr_get_restriction_mode(pc, mode, _getuid());