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 "pkgmgr-api.h"
44 #include "comm_client.h"
46 #define PKG_TMP_PATH tzplatform_mkpath(TZ_USER_APP, "tmp")
48 #define BINSH_NAME "/bin/sh"
51 #define GLOBAL_USER tzplatform_getuid(TZ_SYS_GLOBALAPP_USER)
53 static int _get_request_id()
55 static int internal_req_id = 1;
57 return internal_req_id++;
60 typedef struct _req_cb_info {
63 pkgmgr_handler event_cb;
65 struct _req_cb_info *next;
68 typedef struct _listen_cb_info {
70 pkgmgr_handler event_cb;
72 struct _listen_cb_info *next;
75 typedef struct _pkgmgr_client_t {
85 listen_cb_info *lhead;
91 typedef struct _iter_data {
92 pkgmgr_iter_fn iter_fn;
96 static int __xsystem(const char *argv[])
103 perror("fork failed");
107 execvp(argv[0], (char *const *)argv);
113 if (waitpid(pid, &status, 0) == -1) {
114 perror("waitpid failed");
117 if (WIFSIGNALED(status)) {
121 if (!WIFEXITED(status)) {
122 /* shouldn't happen */
123 perror("should not happen");
126 return WEXITSTATUS(status);
129 static void __error_to_string(int errnumber, char **errstr)
134 case PKGCMD_ERR_PACKAGE_NOT_FOUND:
135 *errstr = PKGCMD_ERR_PACKAGE_NOT_FOUND_STR;
137 case PKGCMD_ERR_PACKAGE_INVALID:
138 *errstr = PKGCMD_ERR_PACKAGE_INVALID_STR;
140 case PKGCMD_ERR_PACKAGE_LOWER_VERSION:
141 *errstr = PKGCMD_ERR_PACKAGE_LOWER_VERSION_STR;
143 case PKGCMD_ERR_PACKAGE_EXECUTABLE_NOT_FOUND:
144 *errstr = PKGCMD_ERR_PACKAGE_EXECUTABLE_NOT_FOUND_STR;
146 case PKGCMD_ERR_MANIFEST_INVALID:
147 *errstr = PKGCMD_ERR_MANIFEST_INVALID_STR;
149 case PKGCMD_ERR_CONFIG_NOT_FOUND:
150 *errstr = PKGCMD_ERR_CONFIG_NOT_FOUND_STR;
152 case PKGCMD_ERR_CONFIG_INVALID:
153 *errstr = PKGCMD_ERR_CONFIG_INVALID_STR;
155 case PKGCMD_ERR_SIGNATURE_NOT_FOUND:
156 *errstr = PKGCMD_ERR_SIGNATURE_NOT_FOUND_STR;
158 case PKGCMD_ERR_SIGNATURE_INVALID:
159 *errstr = PKGCMD_ERR_SIGNATURE_INVALID_STR;
161 case PKGCMD_ERR_SIGNATURE_VERIFICATION_FAILED:
162 *errstr = PKGCMD_ERR_SIGNATURE_VERIFICATION_FAILED_STR;
164 case PKGCMD_ERR_ROOT_CERTIFICATE_NOT_FOUND:
165 *errstr = PKGCMD_ERR_ROOT_CERTIFICATE_NOT_FOUND_STR;
167 case PKGCMD_ERR_CERTIFICATE_INVALID:
168 *errstr = PKGCMD_ERR_CERTIFICATE_INVALID_STR;
170 case PKGCMD_ERR_CERTIFICATE_CHAIN_VERIFICATION_FAILED:
171 *errstr = PKGCMD_ERR_CERTIFICATE_CHAIN_VERIFICATION_FAILED_STR;
173 case PKGCMD_ERR_CERTIFICATE_EXPIRED:
174 *errstr = PKGCMD_ERR_CERTIFICATE_EXPIRED_STR;
176 case PKGCMD_ERR_INVALID_PRIVILEGE:
177 *errstr = PKGCMD_ERR_INVALID_PRIVILEGE_STR;
179 case PKGCMD_ERR_MENU_ICON_NOT_FOUND:
180 *errstr = PKGCMD_ERR_MENU_ICON_NOT_FOUND_STR;
182 case PKGCMD_ERR_FATAL_ERROR:
183 *errstr = PKGCMD_ERR_FATAL_ERROR_STR;
185 case PKGCMD_ERR_OUT_OF_STORAGE:
186 *errstr = PKGCMD_ERR_OUT_OF_STORAGE_STR;
188 case PKGCMD_ERR_OUT_OF_MEMORY:
189 *errstr = PKGCMD_ERR_OUT_OF_MEMORY_STR;
191 case PKGCMD_ERR_ARGUMENT_INVALID:
192 *errstr = PKGCMD_ERR_ARGUMENT_INVALID_STR;
195 *errstr = PKGCMD_ERR_UNKNOWN_STR;
200 static void __add_op_cbinfo(pkgmgr_client_t * pc, int request_id,
201 const char *req_key, pkgmgr_handler event_cb, void *new_event_cb,
204 req_cb_info *cb_info;
205 req_cb_info *current;
208 cb_info = (req_cb_info *) calloc(1, sizeof(req_cb_info));
209 if (cb_info == NULL) {
210 DBG("calloc failed");
213 cb_info->request_id = request_id;
214 cb_info->req_key = strdup(req_key);
215 cb_info->event_cb = event_cb;
216 cb_info->data = data;
217 cb_info->next = NULL;
218 pc->new_event_cb = new_event_cb;
220 if (pc->info.request.rhead == NULL)
221 pc->info.request.rhead = cb_info;
223 current = prev = pc->info.request.rhead;
226 current = current->next;
229 prev->next = cb_info;
233 static req_cb_info *__find_op_cbinfo(pkgmgr_client_t *pc, const char *req_key)
237 tmp = pc->info.request.rhead;
244 DBG("tmp->req_key %s, req_key %s", tmp->req_key, req_key);
247 if (strncmp(tmp->req_key, req_key, strlen(tmp->req_key)) == 0)
254 static void __add_stat_cbinfo(pkgmgr_client_t *pc, int request_id,
255 pkgmgr_handler event_cb, void *data)
257 listen_cb_info *cb_info;
258 listen_cb_info *current;
259 listen_cb_info *prev;
261 cb_info = (listen_cb_info *) calloc(1, sizeof(listen_cb_info));
262 if (cb_info == NULL) {
263 DBG("calloc failed");
266 cb_info->request_id = request_id;
267 cb_info->event_cb = event_cb;
268 cb_info->data = data;
269 cb_info->next = NULL;
271 /* TODO - check the order of callback - FIFO or LIFO => Should be changed to LIFO */
272 if (pc->info.listening.lhead == NULL)
273 pc->info.listening.lhead = cb_info;
275 current = prev = pc->info.listening.lhead;
278 current = current->next;
281 prev->next = cb_info;
285 static void __operation_callback(void *cb_data, uid_t target_uid,
286 const char *req_id, const char *pkg_type,
287 const char *pkgid, const char *key,
291 req_cb_info *cb_info;
293 pc = (pkgmgr_client_t *) cb_data;
295 /* find callback info */
296 cb_info = __find_op_cbinfo(pc, req_id);
297 if (cb_info == NULL) {
298 ERR("cannot fint cb_info for req_id:%s", req_id);
303 if (cb_info->event_cb) {
304 if (pc->new_event_cb)
305 cb_info->event_cb(target_uid, cb_info->request_id,
306 pkg_type, pkgid, key, val, pc,
309 cb_info->event_cb(target_uid, cb_info->request_id,
310 pkg_type, pkgid, key, val, NULL,
317 static void __status_callback(void *cb_data, uid_t target_uid,
318 const char *req_id, const char *pkg_type,
319 const char *pkgid, const char *key,
325 pc = (pkgmgr_client_t *) cb_data;
327 tmp = pc->info.listening.lhead;
329 if (tmp->event_cb(target_uid, tmp->request_id, pkg_type, pkgid,
330 key, val, NULL, tmp->data) != 0)
338 static char *__get_req_key(const char *pkg_path)
342 char timestr[PKG_STRING_LEN_MAX];
346 gettimeofday(&tv, NULL);
347 curtime = tv.tv_sec * 1000000 + tv.tv_usec;
348 snprintf(timestr, sizeof(timestr), "%ld", curtime);
350 size = strlen(pkg_path) + strlen(timestr) + 2;
351 str_req_key = (char *)calloc(size, sizeof(char));
352 if (str_req_key == NULL) {
353 DBG("calloc failed");
356 snprintf(str_req_key, size, "%s_%s", pkg_path, timestr);
361 static char *__get_type_from_path(const char *pkg_path)
364 char mimetype[255] = { '\0', };
365 char extlist[256] = { '\0', };
368 ret = _get_mime_from_file(pkg_path, mimetype, sizeof(mimetype));
370 ERR("_get_mime_from_file() failed - error code[%d]\n",
375 ret = _get_mime_extension(mimetype, extlist, sizeof(extlist));
377 ERR("_get_mime_extension() failed - error code[%d]\n",
382 if (strlen(extlist) == 0)
385 if (strchr(extlist, ',')) {
386 extlist[strlen(extlist) - strlen(strchr(extlist, ','))] = '\0';
388 pkg_type = strchr(extlist, '.') + 1;
389 return strdup(pkg_type);
392 static int __get_pkgid_by_appid(const char *appid, char **pkgid)
394 pkgmgrinfo_appinfo_h pkgmgrinfo_appinfo = NULL;
397 char *pkg_id_dup = NULL;
399 if (pkgmgrinfo_appinfo_get_appinfo(appid, &pkgmgrinfo_appinfo) != PMINFO_R_OK)
402 if (pkgmgrinfo_appinfo_get_pkgname(pkgmgrinfo_appinfo, &pkg_id) != PMINFO_R_OK)
405 pkg_id_dup = strdup(pkg_id);
406 if (pkg_id_dup == NULL)
413 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
418 static int __appinfo_cb(pkgmgrinfo_appinfo_h handle, void *user_data)
421 char **appid = (char **)user_data;
424 ret = pkgmgrinfo_appinfo_get_appid(handle, &val);
425 if (ret != PMINFO_R_OK)
428 *appid = strdup(val);
433 static char *__get_app_info_from_db_by_apppath(const char *apppath, uid_t uid)
436 char *caller_appid = NULL;
437 pkgmgrinfo_appinfo_filter_h filter;
442 ret = pkgmgrinfo_appinfo_filter_create(&filter) != PMINFO_R_OK;
443 if (ret != PMINFO_R_OK)
446 ret = pkgmgrinfo_appinfo_filter_add_string(filter,
447 PMINFO_APPINFO_PROP_APP_EXEC, apppath);
448 if (ret != PMINFO_R_OK) {
449 pkgmgrinfo_appinfo_filter_destroy(filter);
453 ret = pkgmgrinfo_appinfo_usr_filter_foreach_appinfo(filter,
454 __appinfo_cb, &caller_appid, uid);
455 if (ret != PMINFO_R_OK) {
456 pkgmgrinfo_appinfo_filter_destroy(filter);
460 pkgmgrinfo_appinfo_filter_destroy(filter);
465 static inline int __read_proc(const char *path, char *buf, int size)
470 if (buf == NULL || path == NULL)
473 fd = open(path, O_RDONLY);
477 ret = read(fd, buf, size - 1);
489 char *__proc_get_cmdline_bypid(int pid)
491 char buf[PKG_STRING_LEN_MAX] = {'\0', };
494 snprintf(buf, sizeof(buf), "/proc/%d/cmdline", pid);
495 ret = __read_proc(buf, buf, sizeof(buf));
499 /* support app launched by shell script*/
500 if (strncmp(buf, BINSH_NAME, BINSH_SIZE) == 0)
501 return strdup(&buf[BINSH_SIZE + 1]);
506 static int __get_appid_bypid(int pid, char *pkgname, int len, uid_t uid)
508 char *cmdline = NULL;
509 char *caller_appid = NULL;
511 cmdline = __proc_get_cmdline_bypid(pid);
515 caller_appid = __get_app_info_from_db_by_apppath(cmdline, uid);
516 snprintf(pkgname, len, "%s", caller_appid);
524 static char *__get_caller_pkgid(uid_t uid)
526 char caller_appid[PKG_STRING_LEN_MAX] = {0, };
527 char *caller_pkgid = NULL;
529 if (__get_appid_bypid(getpid(), caller_appid, sizeof(caller_appid), uid) < 0) {
530 ERR("get appid fail!!!\n");
533 if (__get_pkgid_by_appid(caller_appid, &caller_pkgid) < 0){
534 ERR("get pkgid fail!!!\n");
541 static inline int __pkgmgr_read_proc(const char *path, char *buf, int size)
546 if (buf == NULL || path == NULL)
549 fd = open(path, O_RDONLY);
553 ret = read(fd, buf, size - 1);
565 static inline int __pkgmgr_find_pid_by_cmdline(const char *dname,
566 const char *cmdline, const char *apppath)
570 if (strncmp(cmdline, apppath, PKG_STRING_LEN_MAX-1) == 0) {
572 if (pid != getpgid(pid))
579 static int __sync_process(const char *req_key)
582 char info_file[PKG_STRING_LEN_MAX] = {'\0', };
586 char buf[PKG_STRING_LEN_MAX] = {0, };
588 snprintf(info_file, PKG_STRING_LEN_MAX, "%s/%s", PKG_SIZE_INFO_PATH, req_key);
593 if (access(info_file, F_OK) == 0) {
594 fp = fopen(info_file, "r");
596 DBG("file is not generated yet.... wait\n");
597 usleep(100 * 1000); /* 100ms sleep*/
601 if (fgets(buf, PKG_STRING_LEN_MAX, fp) == NULL) {
602 ERR("failed to read info file");
608 DBG("info_file file is generated, result = %s. \n", buf);
613 DBG("file is not generated yet.... wait\n");
614 usleep(100 * 1000); /* 100ms sleep*/
616 if (check_cnt > 6000) { /* 60s * 10 time over*/
617 ERR("wait time over!!\n");
622 ret = remove(info_file);
624 ERR("file is can not remove[%s, %d]\n", info_file, ret);
629 static int __csc_process(const char *csc_path, char *result_path)
636 char *pkgtype = NULL;
638 char buf[PKG_STRING_LEN_MAX] = {0,};
639 char type_buf[1024] = { 0 };
640 char des_buf[1024] = { 0 };
641 dictionary *csc = NULL;
644 csc = iniparser_load(csc_path);
645 retvm_if(csc == NULL, PKGMGR_R_EINVAL, "cannot open parse file [%s]", csc_path);
647 file = fopen(result_path, "w");
648 tryvm_if(file == NULL, ret = PKGMGR_R_EINVAL, "cannot open result file [%s]", result_path);
650 count = iniparser_getint(csc, "csc packages:count", -1);
651 tryvm_if(count == 0, ret = PKGMGR_R_ERROR, "csc [%s] dont have packages", csc_path);
653 snprintf(buf, PKG_STRING_LEN_MAX, "[result]\n");
654 fwrite(buf, 1, strlen(buf), file);
655 snprintf(buf, PKG_STRING_LEN_MAX, "count = %d\n", count);
656 fwrite(buf, 1, strlen(buf), file);
658 for(cnt = 1 ; cnt <= count ; cnt++)
660 snprintf(type_buf, PKG_STRING_LEN_MAX - 1, "csc packages:type_%03d", cnt);
661 snprintf(des_buf, PKG_STRING_LEN_MAX - 1, "csc packages:description_%03d", cnt);
663 pkgtype = iniparser_getstring(csc, type_buf, NULL);
664 des = iniparser_getstring(csc, des_buf, NULL);
667 if (pkgtype == NULL) {
669 snprintf(buf, PKG_STRING_LEN_MAX, "%s = Fail to get pkgtype\n", type_buf);
670 fwrite(buf, 1, strlen(buf), file);
672 } else if (des == NULL) {
674 snprintf(buf, PKG_STRING_LEN_MAX, "%s = Fail to get description\n", des_buf);
675 fwrite(buf, 1, strlen(buf), file);
679 snprintf(buf, PKG_STRING_LEN_MAX, "type_%03d = %s\n", cnt, pkgtype);
680 fwrite(buf, 1, strlen(buf), file);
681 snprintf(buf, PKG_STRING_LEN_MAX, "description_%03d = %s\n", cnt, des);
682 fwrite(buf, 1, strlen(buf), file);
684 if (strcmp(pkgtype, "tpk") == 0) {
685 const char *ospinstaller_argv[] = { "/usr/bin/osp-installer", "-c", des, NULL };
686 ret = __xsystem(ospinstaller_argv);
687 } else if (strcmp(pkgtype, "wgt")== 0) {
688 const char *wrtinstaller_argv[] = { "/usr/bin/wrt-installer", "-c", des, NULL };
689 ret = __xsystem(wrtinstaller_argv);
697 __error_to_string(ret, &errstr);
698 snprintf(buf, PKG_STRING_LEN_MAX, "result_%03d = fail[%s]\n", cnt, errstr);
701 snprintf(buf, PKG_STRING_LEN_MAX, "result_%03d = success\n", cnt);
703 fwrite(buf, 1, strlen(buf), file);
707 iniparser_freedict(csc);
717 static int __get_size_process(pkgmgr_client * pc, const char *pkgid, uid_t uid, pkgmgr_getsize_type get_type, pkgmgr_handler event_cb, void *data)
719 char *req_key = NULL;
721 char *pkgtype = "rpm";
722 char *argv[PKG_ARGC_MAX] = { NULL, };
728 char buf[128] = {'\0'};
730 pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc;
731 retvm_if(mpc->ctype != PC_REQUEST, PKGMGR_R_EINVAL, "mpc->ctype is not PC_REQUEST\n");
733 req_key = __get_req_key(pkgid);
735 snprintf(buf, 128, "%d", get_type);
736 argv[argcnt++] = strdup(pkgid);
737 argv[argcnt++] = strdup(buf);
738 argv[argcnt++] = strdup("-k");
739 argv[argcnt++] = strdup(req_key);
741 /*** add quote in all string for special charactor like '\n'*** FIX */
742 for (i = 0; i < argcnt; i++) {
743 temp = g_shell_quote(argv[i]);
744 len += (strlen(temp) + 1);
748 args = (char *)calloc(len, sizeof(char));
749 tryvm_if(args == NULL, ret = PKGMGR_R_EINVAL, "installer_path fail");
751 strncpy(args, argv[0], len - 1);
753 for (i = 1; i < argcnt; i++) {
754 strncat(args, " ", strlen(" "));
755 temp = g_shell_quote(argv[i]);
756 strncat(args, temp, strlen(temp));
759 DBG("[args] %s [len] %d\n", args, len);
762 ret = comm_client_request(mpc->info.request.cc, "getsize",
763 g_variant_new("(ssss)", req_key, pkgtype, pkgid, args));
765 ERR("comm_client_request failed, ret=%d\n", ret);
767 ret = __sync_process(req_key);
769 ERR("get size failed, ret=%d\n", ret);
772 for (i = 0; i < argcnt; i++)
781 static int __move_pkg_process(pkgmgr_client * pc, const char *pkgid, uid_t uid, pkgmgr_move_type move_type, pkgmgr_handler event_cb, void *data)
783 char *req_key = NULL;
785 pkgmgrinfo_pkginfo_h handle = NULL;
786 char *pkgtype = NULL;
787 char *installer_path = NULL;
788 char *argv[PKG_ARGC_MAX] = { NULL, };
794 char buf[128] = {'\0'};
796 pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc;
797 retvm_if(mpc->ctype != PC_REQUEST, PKGMGR_R_EINVAL, "mpc->ctype is not PC_REQUEST\n");
799 if(uid != GLOBAL_USER)
800 ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(pkgid, uid, &handle);
802 ret = pkgmgrinfo_pkginfo_get_pkginfo(pkgid, &handle);
803 retvm_if(ret < 0, PKGMGR_R_ERROR, "pkgmgrinfo_pkginfo_get_pkginfo failed");
805 ret = pkgmgrinfo_pkginfo_get_type(handle, &pkgtype);
806 tryvm_if(ret < 0, ret = PKGMGR_R_ERROR, "pkgmgrinfo_pkginfo_get_type failed");
808 installer_path = _get_backend_path_with_type(pkgtype);
809 req_key = __get_req_key(pkgid);
812 snprintf(buf, 128, "%d", move_type);
813 /* argv[0] installer path */
814 argv[argcnt++] = installer_path;
816 argv[argcnt++] = strdup("-k");
818 argv[argcnt++] = req_key;
820 argv[argcnt++] = strdup("-m");
822 argv[argcnt++] = strdup(pkgid);
824 argv[argcnt++] = strdup("-t");
826 argv[argcnt++] = strdup(buf);
828 /*** add quote in all string for special charactor like '\n'*** FIX */
829 for (i = 0; i < argcnt; i++) {
830 temp = g_shell_quote(argv[i]);
831 len += (strlen(temp) + 1);
835 args = (char *)calloc(len, sizeof(char));
836 tryvm_if(args == NULL, ret = PKGMGR_R_EINVAL, "installer_path fail");
838 strncpy(args, argv[0], len - 1);
840 for (i = 1; i < argcnt; i++) {
841 strncat(args, " ", strlen(" "));
842 temp = g_shell_quote(argv[i]);
843 strncat(args, temp, strlen(temp));
846 DBG("[args] %s [len] %d\n", args, len);
849 ret = comm_client_request(mpc->info.request.cc, "move",
850 g_variant_new("(ssss)", req_key, pkgtype, pkgid, args));
852 ERR("comm_client_request failed, ret=%d\n", ret);
854 ret = __sync_process(pkgid);
856 ERR("move pkg failed, ret=%d\n", ret);
859 for (i = 0; i < argcnt; i++)
866 pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
870 static int __check_app_process(pkgmgr_request_service_type service_type, pkgmgr_client * pc, const char *pkgid, uid_t uid, void *data)
873 char *req_key = NULL;
875 pkgmgrinfo_pkginfo_h handle = NULL;
878 /* Check for NULL value of pc */
879 pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc;
880 retvm_if(mpc->ctype != PC_REQUEST, PKGMGR_R_EINVAL, "mpc->ctype is not PC_REQUEST\n");
882 if (uid != GLOBAL_USER)
883 ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(pkgid, uid, &handle);
885 ret = pkgmgrinfo_pkginfo_get_pkginfo(pkgid, &handle);
886 retvm_if(ret < 0, PKGMGR_R_ERROR, "pkgmgrinfo_pkginfo_get_pkginfo failed");
888 ret = pkgmgrinfo_pkginfo_get_type(handle, &pkgtype);
889 tryvm_if(ret < 0, ret = PKGMGR_R_ERROR, "pkgmgrinfo_pkginfo_get_type failed");
891 /* 2. generate req_key */
892 req_key = __get_req_key(pkgid);
894 /* 3. request activate */
895 if (service_type == PM_REQUEST_KILL_APP)
896 ret = comm_client_request(mpc->info.request.cc, "kill",
897 g_variant_new("(sss)", req_key, pkgtype, pkgid));
898 else if (service_type == PM_REQUEST_CHECK_APP)
899 ret = comm_client_request(mpc->info.request.cc, "check",
900 g_variant_new("(sss)", req_key, pkgtype, pkgid));
903 ERR("request failed, ret=%d\n", ret);
905 pid = __sync_process(pkgid);
906 * (int *) data = pid;
912 pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
918 static int __request_size_info(pkgmgr_client *pc, uid_t uid)
920 char *req_key = NULL;
922 char *pkgtype = "getsize";
923 char *pkgid = "size_info";
924 pkgmgr_getsize_type get_type = PM_GET_SIZE_INFO;
926 char *argv[PKG_ARGC_MAX] = { NULL, };
932 char buf[128] = {'\0'};
934 pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc;
935 retvm_if(mpc->ctype != PC_REQUEST, PKGMGR_R_EINVAL, "mpc->ctype is not PC_REQUEST\n");
937 req_key = __get_req_key(pkgid);
939 snprintf(buf, 128, "%d", get_type);
940 argv[argcnt++] = strdup(pkgid);
941 argv[argcnt++] = strdup(buf);
942 argv[argcnt++] = strdup("-k");
943 argv[argcnt++] = req_key;
945 /*** add quote in all string for special charactor like '\n'*** FIX */
946 for (i = 0; i < argcnt; i++) {
947 temp = g_shell_quote(argv[i]);
948 len += (strlen(temp) + 1);
952 args = (char *)calloc(len, sizeof(char));
953 tryvm_if(args == NULL, ret = PKGMGR_R_EINVAL, "installer_path fail");
955 strncpy(args, argv[0], len - 1);
957 for (i = 1; i < argcnt; i++) {
958 strncat(args, " ", strlen(" "));
959 temp = g_shell_quote(argv[i]);
960 strncat(args, temp, strlen(temp));
963 DBG("[args] %s [len] %d\n", args, len);
966 ret = comm_client_request(mpc->info.request.cc, "getsize",
967 g_variant_new("(ssss)", req_key, pkgtype, pkgid, args));
969 ERR("COMM_REQ_GET_SIZE failed, ret=%d\n", ret);
973 for (i = 0; i < argcnt; i++)
982 static int __change_op_cb_for_getsize(pkgmgr_client *pc)
986 retvm_if(pc == NULL, PKGMGR_R_EINVAL, "package manager client pc is NULL");
987 pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc;
989 /* free listening head */
990 req_cb_info *tmp = NULL;
991 req_cb_info *prev = NULL;
992 for (tmp = mpc->info.request.rhead; tmp;) {
998 /* free dbus connection */
999 ret = comm_client_free(mpc->info.request.cc);
1000 retvm_if(ret < 0, PKGMGR_R_ERROR, "comm_client_free() failed - %d", ret);
1002 /* Manage pc for seperated event */
1003 mpc->ctype = PC_REQUEST;
1004 mpc->status_type = PKGMGR_CLIENT_STATUS_GET_SIZE;
1007 mpc->info.request.cc = comm_client_new();
1008 retvm_if(mpc->info.request.cc == NULL, PKGMGR_R_ERROR, "client creation failed");
1010 ret = comm_client_set_status_callback(COMM_STATUS_BROADCAST_GET_SIZE, mpc->info.request.cc, __operation_callback, pc);
1011 retvm_if(ret < 0, PKGMGR_R_ERROR, "set_status_callback() failed - %d", ret);
1016 static int __get_package_size_info(pkgmgr_client_t *mpc, char *req_key, const char *pkgid, pkgmgr_getsize_type get_type, uid_t uid)
1018 char *argv[PKG_ARGC_MAX] = { NULL, };
1021 char *pkgtype = "getsize"; //unused
1022 char buf[128] = { 0, };
1028 snprintf(buf, 128, "%d", get_type);
1029 argv[argcnt++] = strdup(pkgid);
1030 argv[argcnt++] = strdup(buf);
1031 argv[argcnt++] = strdup("-k");
1032 argv[argcnt++] = req_key;
1034 /*** add quote in all string for special charactor like '\n'*** FIX */
1035 for (i = 0; i < argcnt; i++) {
1036 temp = g_shell_quote(argv[i]);
1037 len += (strlen(temp) + 1);
1041 args = (char *)calloc(len, sizeof(char));
1042 tryvm_if(args == NULL, ret = PKGMGR_R_EINVAL, "installer_path fail");
1044 strncpy(args, argv[0], len - 1);
1046 for (i = 1; i < argcnt; i++) {
1047 strncat(args, " ", strlen(" "));
1048 temp = g_shell_quote(argv[i]);
1049 strncat(args, temp, strlen(temp));
1052 DBG("[args] %s [len] %d\n", args, len);
1055 ret = comm_client_request(mpc->info.request.cc, "getsize",
1056 g_variant_new("(ssss)", req_key, pkgtype, pkgid, args));
1058 ERR("COMM_REQ_GET_SIZE failed, ret=%d\n", ret);
1061 for (i = 0; i < argcnt; i++)
1070 static int __get_pkg_size_info_cb(uid_t target_uid, int req_id, const char *req_type,
1071 const char *pkgid, const char *key,
1072 const char *value, const void *pc, void *user_data)
1075 DBG("target_uid: %u, reqid: %d, req type: %s, pkgid: %s, unused key: %s, size info: %s",
1076 target_uid, req_id, req_type, pkgid, key, value);
1078 pkg_size_info_t *size_info = (pkg_size_info_t *)malloc(sizeof(pkg_size_info_t));
1079 retvm_if(size_info == NULL, -1, "The memory is insufficient.");
1081 char *save_ptr = NULL;
1082 char *token = strtok_r((char*)value, ":", &save_ptr);
1083 size_info->data_size = atoll(token);
1084 token = strtok_r(NULL, ":", &save_ptr);
1085 size_info->cache_size = atoll(token);
1086 token = strtok_r(NULL, ":", &save_ptr);
1087 size_info->app_size = atoll(token);
1088 token = strtok_r(NULL, ":", &save_ptr);
1089 size_info->ext_data_size = atoll(token);
1090 token = strtok_r(NULL, ":", &save_ptr);
1091 size_info->ext_cache_size = atoll(token);
1092 token = strtok_r(NULL, ":", &save_ptr);
1093 size_info->ext_app_size = atoll(token);
1095 DBG("data: %lld, cache: %lld, app: %lld, ext_data: %lld, ext_cache: %lld, ext_app: %lld",
1096 size_info->data_size, size_info->cache_size, size_info->app_size,
1097 size_info->ext_data_size, size_info->ext_cache_size, size_info->ext_app_size);
1099 pkgmgr_client_t *pmc = (pkgmgr_client_t *)pc;
1100 tryvm_if(pmc == NULL, ret = -1, "pkgmgr_client instance is null.");
1102 if (strcmp(pkgid, PKG_SIZE_INFO_TOTAL) == 0)
1103 { // total package size info
1104 pkgmgr_total_pkg_size_info_receive_cb callback = (pkgmgr_total_pkg_size_info_receive_cb)(pmc->new_event_cb);
1105 callback((pkgmgr_client *)pc, size_info, user_data);
1109 pkgmgr_pkg_size_info_receive_cb callback = (pkgmgr_pkg_size_info_receive_cb)(pmc->new_event_cb);
1110 callback((pkgmgr_client *)pc, pkgid, size_info, user_data);
1122 API pkgmgr_client *pkgmgr_client_new(client_type ctype)
1124 pkgmgr_client_t *pc = NULL;
1127 retvm_if(ctype != PC_REQUEST && ctype != PC_LISTENING && ctype != PC_BROADCAST, NULL, "ctype is not client_type");
1129 /* Allocate memory for ADT:pkgmgr_client */
1130 pc = calloc(1, sizeof(pkgmgr_client_t));
1131 retvm_if(pc == NULL, NULL, "No memory");
1135 pc->status_type = PKGMGR_CLIENT_STATUS_ALL;
1137 if (pc->ctype == PC_REQUEST) {
1138 pc->info.request.cc = comm_client_new();
1139 trym_if(pc->info.request.cc == NULL, "client creation failed");
1141 ret = comm_client_set_status_callback(COMM_STATUS_BROADCAST_ALL, pc->info.request.cc, __operation_callback, pc);
1142 trym_if(ret < 0L, "comm_client_set_status_callback() failed - %d", ret);
1143 } else if (pc->ctype == PC_LISTENING) {
1144 pc->info.listening.cc = comm_client_new();
1145 trym_if(pc->info.listening.cc == NULL, "client creation failed");
1147 ret = comm_client_set_status_callback(COMM_STATUS_BROADCAST_ALL, pc->info.listening.cc, __status_callback, pc);
1148 trym_if(ret < 0L, "comm_client_set_status_callback() failed - %d", ret);
1149 } else if (pc->ctype == PC_BROADCAST) {
1150 /* client cannot broadcast signal */
1154 return (pkgmgr_client *) pc;
1162 API int pkgmgr_client_free(pkgmgr_client *pc)
1165 pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc;
1166 retvm_if(mpc == NULL, PKGMGR_R_EINVAL, "Invalid argument");
1168 if (mpc->ctype == PC_REQUEST) {
1171 for (tmp = mpc->info.request.rhead; tmp;) {
1177 ret = comm_client_free(mpc->info.request.cc);
1178 tryvm_if(ret < 0, ret = PKGMGR_R_ERROR, "comm_client_free() failed");
1179 } else if (mpc->ctype == PC_LISTENING) {
1180 listen_cb_info *tmp;
1181 listen_cb_info *prev;
1182 for (tmp = mpc->info.listening.lhead; tmp;) {
1188 ret = comm_client_free(mpc->info.listening.cc);
1189 tryvm_if(ret < 0, ret = PKGMGR_R_ERROR, "comm_client_free() failed");
1190 } else if (mpc->ctype == PC_BROADCAST) {
1193 ERR("Invalid client type\n");
1194 return PKGMGR_R_EINVAL;
1206 return PKGMGR_R_ERROR;
1210 API int pkgmgr_client_usr_install(pkgmgr_client * pc, const char *pkg_type,
1211 const char *descriptor_path, const char *pkg_path,
1212 const char *optional_file, pkgmgr_mode mode,
1213 pkgmgr_handler event_cb, void *data, uid_t uid)
1215 char *pkgtype = NULL;
1216 char *installer_path = NULL;
1217 char *req_key = NULL;
1220 char *argv[PKG_ARGC_MAX] = { NULL, };
1226 char *caller_pkgid = NULL;
1228 caller_pkgid = __get_caller_pkgid(uid);
1229 if (caller_pkgid == NULL)
1230 ERR("caller dont have pkgid..\n");
1232 /* Check for NULL value of pc */
1233 retvm_if(pc == NULL, PKGMGR_R_EINVAL, "package manager client handle is NULL");
1235 /* 0. check the pc type */
1236 pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc;
1237 retvm_if(mpc->ctype != PC_REQUEST, PKGMGR_R_EINVAL, "mpc->ctype is not PC_REQUEST");
1239 /* 1. check argument */
1240 if (descriptor_path) {
1241 retvm_if(strlen(descriptor_path) >= PKG_STRING_LEN_MAX, PKGMGR_R_EINVAL, "descriptor_path over PKG_STRING_LEN_MAX");
1242 retvm_if(access(descriptor_path, F_OK) != 0, PKGMGR_R_EINVAL, "descriptor_path access fail");
1245 retvm_if(pkg_path == NULL, PKGMGR_R_EINVAL, "pkg_path is NULL");
1246 retvm_if(strlen(pkg_path) >= PKG_STRING_LEN_MAX, PKGMGR_R_EINVAL, "pkg_path over PKG_STRING_LEN_MAX");
1247 retvm_if(access(pkg_path, F_OK) != 0, PKGMGR_R_EINVAL, "pkg_path access fail");
1250 retvm_if(strlen(optional_file) >= PKG_STRING_LEN_MAX, PKGMGR_R_EINVAL, "optional_file over PKG_STRING_LEN_MAX");
1252 /* 2. get installer path using pkg_path */
1254 installer_path = _get_backend_path_with_type(pkg_type);
1255 pkgtype = strdup(pkg_type);
1257 installer_path = _get_backend_path(pkg_path);
1258 pkgtype = __get_type_from_path(pkg_path);
1260 if (installer_path == NULL) {
1262 ERR("installer_path is NULL\n");
1263 return PKGMGR_R_EINVAL;
1266 /* 3. generate req_key */
1267 req_key = __get_req_key(pkg_path);
1269 /* 4. add callback info - add callback info to pkgmgr_client */
1270 req_id = _get_request_id();
1271 __add_op_cbinfo(mpc, req_id, req_key, event_cb, NULL, data);
1273 /* 5. generate argv */
1275 /* argv[0] installer path */
1276 argv[argcnt++] = installer_path;
1278 argv[argcnt++] = strdup("-k");
1280 argv[argcnt++] = req_key;
1282 argv[argcnt++] = strdup("-i");
1283 /* argv[(4)] if exists */
1284 if (descriptor_path)
1285 argv[argcnt++] = strdup(descriptor_path);
1287 argv[argcnt++] = strdup(pkg_path);
1288 /* argv[(5)] if exists */
1290 argv[argcnt++] = strdup("-o");
1291 argv[argcnt++] = strdup(optional_file);
1294 argv[argcnt++] = strdup("-p");
1295 argv[argcnt++] = strdup(caller_pkgid);
1298 /*** add quote in all string for special charactor like '\n'*** FIX */
1299 for (i = 0; i < argcnt; i++) {
1300 temp = g_shell_quote(argv[i]);
1301 len += (strlen(temp) + 1);
1305 args = (char *)calloc(len, sizeof(char));
1306 tryvm_if(args == NULL, ret = PKGMGR_R_ERROR, "calloc failed");
1308 strncpy(args, argv[0], len - 1);
1310 for (i = 1; i < argcnt; i++) {
1311 strncat(args, " ", strlen(" "));
1312 temp = g_shell_quote(argv[i]);
1313 strncat(args, temp, strlen(temp));
1316 DBG("[args] %s [len] %d\n", args, len);
1318 /******************* end of quote ************************/
1320 /* 6. request install */
1321 ret = comm_client_request(mpc->info.request.cc, "install",
1322 g_variant_new("(ssss)", req_key, pkgtype, pkg_path, args));
1323 tryvm_if(ret < 0, ret = PKGMGR_R_ECOMM, "request failed, ret=%d", ret);
1328 for (i = 0; i < argcnt; i++)
1341 API int pkgmgr_client_install(pkgmgr_client * pc, const char *pkg_type,
1342 const char *descriptor_path, const char *pkg_path,
1343 const char *optional_file, pkgmgr_mode mode,
1344 pkgmgr_handler event_cb, void *data)
1348 return pkgmgr_client_usr_install(pc, pkg_type,
1349 descriptor_path, pkg_path, optional_file, mode, event_cb,data, GLOBAL_USER);
1352 API int pkgmgr_client_reinstall(pkgmgr_client * pc, const char *pkg_type, const char *pkgid,
1353 const char *optional_file, pkgmgr_mode mode,
1354 pkgmgr_handler event_cb, void *data)
1356 return pkgmgr_client_usr_reinstall(pc, pkg_type, pkgid, optional_file, mode, event_cb, data,GLOBAL_USER);
1359 API int pkgmgr_client_usr_reinstall(pkgmgr_client * pc, const char *pkg_type, const char *pkgid,
1360 const char *optional_file, pkgmgr_mode mode,
1361 pkgmgr_handler event_cb, void *data, uid_t uid)
1363 char *pkgtype = NULL;
1364 char *installer_path = NULL;
1365 char *req_key = NULL;
1368 char *argv[PKG_ARGC_MAX] = { NULL, };
1375 /* Check for NULL value of pc */
1376 retvm_if(pc == NULL, PKGMGR_R_EINVAL, "package manager client handle is NULL\n");
1378 pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc;
1380 /* 0. check the pc type */
1381 retv_if(mpc->ctype != PC_REQUEST, PKGMGR_R_EINVAL);
1384 /* 1. check argument */
1385 retv_if(pkgid == NULL, PKGMGR_R_EINVAL);
1386 retv_if(strlen(pkgid) >= PKG_STRING_LEN_MAX, PKGMGR_R_EINVAL);
1387 if (optional_file) {
1388 if (strlen(optional_file) >= PKG_STRING_LEN_MAX)
1389 return PKGMGR_R_EINVAL;
1392 /* 2. get installer path using pkg_path */
1393 installer_path = _get_backend_path_with_type(pkg_type);
1394 pkgtype = strdup(pkg_type);
1395 tryvm_if(installer_path == NULL, ret = PKGMGR_R_EINVAL, "installer_path is null");
1397 /* 3. generate req_key */
1398 req_key = __get_req_key(pkgid);
1400 /* 4. add callback info - add callback info to pkgmgr_client */
1401 req_id = _get_request_id();
1402 __add_op_cbinfo(mpc, req_id, req_key, event_cb, NULL, data);
1404 /* 5. generate argv */
1406 /* argv[0] installer path */
1407 argv[argcnt++] = installer_path;
1409 argv[argcnt++] = strdup("-k");
1411 argv[argcnt++] = req_key;
1413 argv[argcnt++] = strdup("-r");
1415 argv[argcnt++] = strdup(pkgid);
1416 /* argv[(5)] if exists */
1418 argv[argcnt++] = strdup("-o");
1419 argv[argcnt++] = strdup(optional_file);
1422 /*** add quote in all string for special charactor like '\n'*** FIX */
1423 for (i = 0; i < argcnt; i++) {
1424 temp = g_shell_quote(argv[i]);
1425 len += (strlen(temp) + 1);
1429 args = (char *)calloc(len, sizeof(char));
1430 tryvm_if(args == NULL, ret = PKGMGR_R_ERROR, "calloc failed");
1432 strncpy(args, argv[0], len - 1);
1434 for (i = 1; i < argcnt; i++) {
1435 strncat(args, " ", strlen(" "));
1436 temp = g_shell_quote(argv[i]);
1437 strncat(args, temp, strlen(temp));
1440 DBG("[args] %s [len] %d\n", args, len);
1442 /******************* end of quote ************************/
1444 /* 6. request install */
1445 ret = comm_client_request(mpc->info.request.cc, "reinstall",
1446 g_variant_new("(ssss)", req_key, pkgtype, pkgid, args));
1447 tryvm_if(ret < 0, ret = PKGMGR_R_ECOMM, "request failed");
1452 for (i = 0; i < argcnt; i++)
1463 API int pkgmgr_client_uninstall(pkgmgr_client *pc, const char *pkg_type,
1464 const char *pkgid, pkgmgr_mode mode,
1465 pkgmgr_handler event_cb, void *data)
1467 return pkgmgr_client_usr_uninstall(pc, pkg_type,pkgid, mode, event_cb, data, GLOBAL_USER);
1469 API int pkgmgr_client_usr_uninstall(pkgmgr_client *pc, const char *pkg_type,
1470 const char *pkgid, pkgmgr_mode mode,
1471 pkgmgr_handler event_cb, void *data, uid_t uid)
1474 char *installer_path;
1478 char *argv[PKG_ARGC_MAX] = { NULL, };
1484 bool removable = false;
1485 char *caller_pkgid = NULL;
1487 caller_pkgid = __get_caller_pkgid(uid);
1488 if (caller_pkgid == NULL)
1489 DBG("caller dont have pkgid..\n");
1491 /* Check for NULL value of pc */
1492 retvm_if(pc == NULL, PKGMGR_R_EINVAL, "package manager client handle is NULL\n");
1494 pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc;
1496 /* 0. check the pc type */
1497 retv_if(mpc->ctype != PC_REQUEST, PKGMGR_R_EINVAL);
1499 /* 1. check argument */
1500 retv_if(pkgid == NULL, PKGMGR_R_EINVAL);
1502 pkgmgrinfo_pkginfo_h handle = NULL;
1503 ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(pkgid, uid, &handle);
1505 /*check package id */
1506 tryvm_if(ret < 0, ret = PKGMGR_R_EINVAL, "pkgmgrinfo_pkginfo_get_pkginfo fail");
1507 tryvm_if(handle == NULL, ret = PKGMGR_R_EINVAL, "Pkgid(%s) can not find in installed pkg DB! \n", pkgid);
1510 ret = pkgmgrinfo_pkginfo_get_type(handle, &pkgtype);
1511 tryvm_if(ret < 0, ret = PKGMGR_R_EINVAL, "pkgmgrinfo_pkginfo_get_type fail");
1512 tryvm_if(pkgtype == NULL, ret = PKGMGR_R_ERROR, "pkgtype is NULL");
1514 /*check removable, execpt "rpm" type */
1515 if (strcmp(pkgtype, "rpm")) {
1516 pkgmgrinfo_pkginfo_is_removable(handle, &removable);
1517 tryvm_if(removable == false, ret = PKGMGR_R_ERROR, "Pkgid(%s) can not be removed, This is non-removalbe package...\n", pkgid);
1520 /*check pkgid length */
1521 tryvm_if(strlen(pkgid) >= PKG_STRING_LEN_MAX, ret = PKGMGR_R_EINVAL, "pkgid is too long");
1523 /* 2. get installer path using pkgtype */
1524 installer_path = _get_backend_path_with_type(pkgtype);
1525 tryvm_if(installer_path == NULL, ret = PKGMGR_R_EINVAL, "installer_path fail");
1527 /* 3. generate req_key */
1528 req_key = __get_req_key(pkgid);
1530 /* 4. add callback info - add callback info to pkgmgr_client */
1531 req_id = _get_request_id();
1532 __add_op_cbinfo(mpc, req_id, req_key, event_cb, NULL, data);
1534 /* 5. generate argv */
1536 /* argv[0] installer path */
1537 argv[argcnt++] = installer_path;
1539 argv[argcnt++] = strdup("-k");
1541 argv[argcnt++] = req_key;
1543 argv[argcnt++] = strdup("-d");
1545 argv[argcnt++] = strdup(pkgid);
1547 argv[argcnt++] = strdup("-p");
1548 argv[argcnt++] = caller_pkgid;
1551 /*** add quote in all string for special charactor like '\n'*** FIX */
1552 for (i = 0; i < argcnt; i++) {
1553 temp = g_shell_quote(argv[i]);
1554 len += (strlen(temp) + 1);
1558 args = (char *)calloc(len, sizeof(char));
1559 tryvm_if(args == NULL, ret = PKGMGR_R_ERROR, "calloc failed");
1561 strncpy(args, argv[0], len - 1);
1563 for (i = 1; i < argcnt; i++) {
1564 strncat(args, " ", strlen(" "));
1565 temp = g_shell_quote(argv[i]);
1566 strncat(args, temp, strlen(temp));
1569 DBG("[args] %s [len] %d\n", args, len);
1571 /******************* end of quote ************************/
1573 /* 6. request install */
1574 ret = comm_client_request(mpc->info.request.cc, "uninstall",
1575 g_variant_new("(ssss)", req_key, pkgtype, pkgid, args));
1576 tryvm_if(ret < 0, ret = PKGMGR_R_ECOMM, "calloc failed");
1581 for (i = 0; i < argcnt; i++)
1588 pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
1592 API int pkgmgr_client_move(pkgmgr_client *pc, const char *pkg_type,
1593 const char *pkgid, pkgmgr_move_type move_type, pkgmgr_mode mode)
1595 return pkgmgr_client_usr_move( pc,pkg_type, pkgid, move_type, mode, GLOBAL_USER);
1597 API int pkgmgr_client_usr_move(pkgmgr_client *pc, const char *pkg_type,
1598 const char *pkgid, pkgmgr_move_type move_type, pkgmgr_mode mode, uid_t uid)
1600 const char *pkgtype = NULL;
1601 char *installer_path = NULL;
1602 char *req_key = NULL;
1604 char *argv[PKG_ARGC_MAX] = { NULL, };
1611 char buf[128] = {'\0'};
1613 /* Check for NULL value of pc */
1615 DBG("package manager client handle is NULL\n");
1616 return PKGMGR_R_EINVAL;
1618 pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc;
1619 /*check the pc type */
1620 if (mpc->ctype != PC_REQUEST)
1621 return PKGMGR_R_EINVAL;
1625 return PKGMGR_R_EINVAL;
1627 if (pkg_type == NULL) {
1628 pkgtype = _get_pkg_type(pkgid, uid);
1629 if (pkgtype == NULL)
1630 return PKGMGR_R_EINVAL;
1634 if (strlen(pkgid) >= PKG_STRING_LEN_MAX)
1635 return PKGMGR_R_EINVAL;
1637 if ((move_type < PM_MOVE_TO_INTERNAL) || (move_type > PM_MOVE_TO_SDCARD))
1638 return PKGMGR_R_EINVAL;
1640 /* get installer path using pkg_path */
1641 installer_path = _get_backend_path_with_type(pkgtype);
1642 if (installer_path == NULL)
1643 return PKGMGR_R_EINVAL;
1645 /* generate req_key */
1646 req_key = __get_req_key(pkgid);
1647 req_id = _get_request_id();
1650 snprintf(buf, 128, "%d", move_type);
1651 /* argv[0] installer path */
1652 argv[argcnt++] = installer_path;
1654 argv[argcnt++] = strdup("-k");
1656 argv[argcnt++] = req_key;
1658 argv[argcnt++] = strdup("-m");
1660 argv[argcnt++] = strdup(pkgid);
1662 argv[argcnt++] = strdup("-t");
1664 argv[argcnt++] = strdup(buf);
1666 /*** add quote in all string for special charactor like '\n'*** FIX */
1667 for (i = 0; i < argcnt; i++) {
1668 temp = g_shell_quote(argv[i]);
1669 len += (strlen(temp) + 1);
1673 args = (char *)calloc(len, sizeof(char));
1675 DBG("calloc failed");
1677 for (i = 0; i < argcnt; i++)
1680 return PKGMGR_R_ERROR;
1682 strncpy(args, argv[0], len - 1);
1684 for (i = 1; i < argcnt; i++) {
1685 strncat(args, " ", strlen(" "));
1686 temp = g_shell_quote(argv[i]);
1687 strncat(args, temp, strlen(temp));
1690 DBG("[args] %s [len] %d\n", args, len);
1691 /******************* end of quote ************************/
1693 /* 6. request install */
1694 ret = comm_client_request(mpc->info.request.cc, "move",
1695 g_variant_new("(ssss)", req_key, pkgtype, pkgid, args));
1697 ERR("request failed, ret=%d\n", ret);
1699 for (i = 0; i < argcnt; i++)
1703 return PKGMGR_R_ECOMM;
1706 for (i = 0; i < argcnt; i++)
1715 API int pkgmgr_client_move_usr_pkg(pkgmgr_client *pc, const char *pkg_type,
1716 const char *pkgid, uid_t uid, pkgmgr_move_type move_type, pkgmgr_mode mode,
1717 pkgmgr_handler event_cb, void *data)
1720 char *installer_path;
1724 char *argv[PKG_ARGC_MAX] = { NULL, };
1730 char buf[128] = {'\0'};
1732 /* Check for NULL value of pc */
1733 retvm_if(pc == NULL, PKGMGR_R_EINVAL, "package manager client handle is NULL\n");
1735 pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc;
1737 /* 0. check the pc type */
1738 retv_if(mpc->ctype != PC_REQUEST, PKGMGR_R_EINVAL);
1740 /* 1. check argument */
1741 retv_if(pkgid == NULL, PKGMGR_R_EINVAL);
1743 pkgmgrinfo_pkginfo_h handle = NULL;
1744 if (uid != GLOBAL_USER)
1745 ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(pkgid, uid, &handle);
1747 ret = pkgmgrinfo_pkginfo_get_pkginfo(pkgid, &handle);
1749 /*check package id */
1750 tryvm_if(ret < 0, ret = PKGMGR_R_EINVAL, "pkgmgrinfo_pkginfo_get_pkginfo fail");
1751 tryvm_if(handle == NULL, ret = PKGMGR_R_EINVAL, "Pkgid(%s) can not find in installed pkg DB! \n", pkgid);
1754 ret = pkgmgrinfo_pkginfo_get_type(handle, &pkgtype);
1755 tryvm_if(ret < 0, ret = PKGMGR_R_EINVAL, "pkgmgrinfo_pkginfo_get_type fail");
1756 tryvm_if(pkgtype == NULL, ret = PKGMGR_R_ERROR, "pkgtype is NULL");
1758 /*check pkgid length */
1759 tryvm_if(strlen(pkgid) >= PKG_STRING_LEN_MAX, ret = PKGMGR_R_EINVAL, "pkgid is too long");
1761 /*check move_type */
1762 tryvm_if((move_type < PM_MOVE_TO_INTERNAL) || (move_type > PM_MOVE_TO_SDCARD), ret = PKGMGR_R_EINVAL, "move_type is not supported");
1764 /* 2. get installer path using pkgtype */
1765 installer_path = _get_backend_path_with_type(pkgtype);
1766 tryvm_if(installer_path == NULL, ret = PKGMGR_R_EINVAL, "installer_path fail");
1768 /* 3. generate req_key */
1769 req_key = __get_req_key(pkgid);
1771 /* 4. add callback info - add callback info to pkgmgr_client */
1772 req_id = _get_request_id();
1773 __add_op_cbinfo(mpc, req_id, req_key, event_cb, NULL, data);
1775 /* 5. generate argv */
1776 snprintf(buf, 128, "%d", move_type);
1777 /* argv[0] installer path */
1778 argv[argcnt++] = installer_path;
1780 argv[argcnt++] = strdup("-k");
1782 argv[argcnt++] = req_key;
1784 argv[argcnt++] = strdup("-m");
1786 argv[argcnt++] = strdup(pkgid);
1788 argv[argcnt++] = strdup("-t");
1790 argv[argcnt++] = strdup(buf);
1792 /*** add quote in all string for special charactor like '\n'*** FIX */
1793 for (i = 0; i < argcnt; i++) {
1794 temp = g_shell_quote(argv[i]);
1795 len += (strlen(temp) + 1);
1799 args = (char *)calloc(len, sizeof(char));
1800 tryvm_if(args == NULL, ret = PKGMGR_R_ERROR, "calloc failed");
1802 strncpy(args, argv[0], len - 1);
1804 for (i = 1; i < argcnt; i++) {
1805 strncat(args, " ", strlen(" "));
1806 temp = g_shell_quote(argv[i]);
1807 strncat(args, temp, strlen(temp));
1810 DBG("[args] %s [len] %d\n", args, len);
1812 /******************* end of quote ************************/
1814 /* 6. request install */
1815 ret = comm_client_request(mpc->info.request.cc, "move",
1816 g_variant_new("(ssss)", req_key, pkgtype, pkgid, args));
1817 tryvm_if(ret < 0, ret = PKGMGR_R_ECOMM, "calloc failed");
1822 for (i = 0; i < argcnt; i++)
1829 pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
1833 API int pkgmgr_client_move_pkg(pkgmgr_client *pc, const char *pkg_type,
1834 const char *pkgid, pkgmgr_move_type move_type, pkgmgr_mode mode,
1835 pkgmgr_handler event_cb, void *data)
1837 return pkgmgr_client_move_usr_pkg(pc, pkg_type, pkgid, GLOBAL_USER, move_type, mode, event_cb, data);
1840 API int pkgmgr_client_usr_activate(pkgmgr_client * pc, const char *pkg_type,
1841 const char *pkgid, uid_t uid)
1843 const char *pkgtype;
1846 /* Check for NULL value of pc */
1847 retvm_if(pc == NULL, PKGMGR_R_EINVAL, "package manager client handle is NULL\n");
1849 pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc;
1851 /* 0. check the pc type */
1852 retvm_if(mpc->ctype != PC_REQUEST, PKGMGR_R_EINVAL, "mpc->ctype is not PC_REQUEST");
1854 /* 1. check argument */
1855 retvm_if(pkgid == NULL, PKGMGR_R_EINVAL, "pkgid is NULL");
1856 retvm_if(strlen(pkgid) >= PKG_STRING_LEN_MAX, PKGMGR_R_EINVAL, "pkgid length over PKG_STRING_LEN_MAX ");
1858 if (pkg_type == NULL) {
1859 pkgtype = _get_pkg_type(pkgid, uid);
1860 retvm_if(pkgtype == NULL, PKGMGR_R_EINVAL, "pkgtype is NULL");
1864 /* 2. generate req_key */
1865 req_key = __get_req_key(pkgid);
1866 retvm_if(req_key == NULL, PKGMGR_R_EINVAL, "req_key is NULL");
1868 /* 3. request activate */
1869 ret = comm_client_request(mpc->info.request.cc, "activate",
1870 g_variant_new("(ssss)", req_key, pkgtype, pkgid, "1 PKG"));
1871 tryvm_if(ret < 0, ret = PKGMGR_R_ECOMM, "request failed, ret=%d", ret);
1880 API int pkgmgr_client_activate(pkgmgr_client * pc, const char *pkg_type,
1883 return pkgmgr_client_usr_activate(pc, pkg_type, pkgid, GLOBAL_USER);
1886 API int pkgmgr_client_usr_deactivate(pkgmgr_client *pc, const char *pkg_type,
1887 const char *pkgid, uid_t uid)
1889 const char *pkgtype;
1892 /* Check for NULL value of pc */
1893 retvm_if(pc == NULL, PKGMGR_R_EINVAL, "package manager client handle is NULL\n");
1895 pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc;
1897 /* 0. check the pc type */
1898 retvm_if(mpc->ctype != PC_REQUEST, PKGMGR_R_EINVAL, "mpc->ctype is not PC_REQUEST");
1900 /* 1. check argument */
1901 retvm_if(pkgid == NULL, PKGMGR_R_EINVAL, "pkgid is NULL");
1902 retvm_if(strlen(pkgid) >= PKG_STRING_LEN_MAX, PKGMGR_R_EINVAL, "pkgid length over PKG_STRING_LEN_MAX ");
1904 if (pkg_type == NULL) {
1905 pkgtype = _get_pkg_type(pkgid, uid);
1906 if (pkgtype == NULL)
1907 return PKGMGR_R_EINVAL;
1911 /* 2. generate req_key */
1912 req_key = __get_req_key(pkgid);
1913 retvm_if(req_key == NULL, PKGMGR_R_EINVAL, "req_key is NULL");
1915 /* 3. request activate */
1916 ret = comm_client_request(mpc->info.request.cc, "deactivate",
1917 g_variant_new("(ssss)", req_key, pkgtype, pkgid, "0 PKG"));
1918 tryvm_if(ret < 0, ret = PKGMGR_R_ECOMM, "request failed, ret=%d", ret);
1927 API int pkgmgr_client_deactivate(pkgmgr_client *pc, const char *pkg_type,
1930 return pkgmgr_client_usr_deactivate(pc, pkg_type, pkgid, GLOBAL_USER);
1933 API int pkgmgr_client_usr_activate_app(pkgmgr_client * pc, const char *appid, uid_t uid)
1935 const char *pkgtype;
1938 /* Check for NULL value of pc */
1939 retvm_if(pc == NULL, PKGMGR_R_EINVAL, "package manager client handle is NULL\n");
1941 pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc;
1943 /* 0. check the pc type */
1944 retvm_if(mpc->ctype != PC_REQUEST, PKGMGR_R_EINVAL, "mpc->ctype is not PC_REQUEST");
1946 /* 1. check argument */
1947 retvm_if(appid == NULL, PKGMGR_R_EINVAL, "pkgid is NULL");
1948 retvm_if(strlen(appid) >= PKG_STRING_LEN_MAX, PKGMGR_R_EINVAL, "pkgid length over PKG_STRING_LEN_MAX ");
1950 pkgtype = _get_pkg_type(appid, uid);
1951 retvm_if(pkgtype == NULL, PKGMGR_R_EINVAL, "pkgtype is NULL");
1953 /* 2. generate req_key */
1954 req_key = __get_req_key(appid);
1955 retvm_if(req_key == NULL, PKGMGR_R_EINVAL, "req_key is NULL");
1957 /* 3. request activate */
1958 ret = comm_client_request(mpc->info.request.cc, "activate",
1959 g_variant_new("(ssss)", req_key, pkgtype, appid, "1 APP"));
1960 tryvm_if(ret < 0, ret = PKGMGR_R_ECOMM, "request failed, ret=%d", ret);
1969 API int pkgmgr_client_activate_app(pkgmgr_client * pc, const char *appid)
1971 return pkgmgr_client_usr_activate_app(pc,appid, GLOBAL_USER);
1974 API int pkgmgr_client_usr_activate_appv(pkgmgr_client * pc, const char *appid, char *const argv[], uid_t uid)
1976 const char *pkgtype;
1985 /* Check for NULL value of pc */
1986 retvm_if(pc == NULL, PKGMGR_R_EINVAL, "package manager client handle is NULL\n");
1988 pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc;
1990 /* 0. check the pc type */
1991 retvm_if(mpc->ctype != PC_REQUEST, PKGMGR_R_EINVAL, "mpc->ctype is not PC_REQUEST");
1993 /* 1. check argument */
1994 retvm_if(appid == NULL, PKGMGR_R_EINVAL, "pkgid is NULL");
1995 retvm_if(strlen(appid) >= PKG_STRING_LEN_MAX, PKGMGR_R_EINVAL, "pkgid length over PKG_STRING_LEN_MAX ");
1997 pkgtype = _get_pkg_type(appid, uid);
1998 retvm_if(pkgtype == NULL, PKGMGR_R_EINVAL, "pkgtype is NULL");
2000 /* 2. generate req_key */
2001 req_key = __get_req_key(appid);
2002 retvm_if(req_key == NULL, PKGMGR_R_EINVAL, "req_key is NULL");
2004 /*** add quote in all string for special charactor like '\n'*** FIX */
2006 for (i = 0; argv[i]; i++) {
2007 temp = g_shell_quote(argv[i]);
2008 len += (strlen(temp) + 1);
2014 args = (char *)calloc(len, sizeof(char));
2015 tryvm_if(args == NULL, ret = PKGMGR_R_ERROR, "calloc failed");
2016 strncpy(args, argv[0], len - 1);
2018 for (i = 1; i < argcnt; i++) {
2019 strncat(args, " ", strlen(" "));
2020 temp = g_shell_quote(argv[i]);
2021 strncat(args, temp, strlen(temp));
2027 argsr = (char *)calloc(strlen("1 APP")+2+len, sizeof(char));
2028 tryvm_if(argsr == NULL, ret = PKGMGR_R_ERROR, "calloc failed");
2030 strncpy(argsr, "1 APP", strlen("1 APP"));
2032 strncat(argsr, " ", strlen(" "));
2033 strncat(argsr, args, strlen(args));
2036 DBG("argsr [%s]\n", argsr);
2037 /******************* end of quote ************************/
2039 /* 3. request activate */
2040 ret = comm_client_request(mpc->info.request.cc, "activate",
2041 g_variant_new("(ssss)", req_key, pkgtype, appid, argsr));
2042 tryvm_if(ret < 0, ret = PKGMGR_R_ECOMM, "request failed, ret=%d", ret);
2055 API int pkgmgr_client_activate_appv(pkgmgr_client * pc, const char *appid, char *const argv[])
2057 return pkgmgr_client_usr_activate_appv(pc, appid, argv, GLOBAL_USER);
2060 API int pkgmgr_client_usr_deactivate_app(pkgmgr_client *pc, const char *appid, uid_t uid)
2062 const char *pkgtype;
2065 /* Check for NULL value of pc */
2066 retvm_if(pc == NULL, PKGMGR_R_EINVAL, "package manager client handle is NULL\n");
2068 pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc;
2070 /* 0. check the pc type */
2071 retvm_if(mpc->ctype != PC_REQUEST, PKGMGR_R_EINVAL, "mpc->ctype is not PC_REQUEST");
2073 /* 1. check argument */
2074 retvm_if(appid == NULL, PKGMGR_R_EINVAL, "pkgid is NULL");
2075 retvm_if(strlen(appid) >= PKG_STRING_LEN_MAX, PKGMGR_R_EINVAL, "pkgid length over PKG_STRING_LEN_MAX ");
2077 pkgtype = _get_pkg_type(appid, uid);
2078 retvm_if(pkgtype == NULL, PKGMGR_R_EINVAL, "pkgtype is NULL");
2080 /* 2. generate req_key */
2081 req_key = __get_req_key(appid);
2082 retvm_if(req_key == NULL, PKGMGR_R_EINVAL, "req_key is NULL");
2084 /* 3. request activate */
2085 ret = comm_client_request(mpc->info.request.cc, "deactivate",
2086 g_variant_new("(ssss)", req_key, pkgtype, appid, "0 APP"));
2087 tryvm_if(ret < 0, ret = PKGMGR_R_ECOMM, "request failed, ret=%d", ret);
2096 API int pkgmgr_client_deactivate_app(pkgmgr_client *pc, const char *appid)
2098 return pkgmgr_client_usr_deactivate_app(pc, appid, GLOBAL_USER);
2101 API int pkgmgr_client_usr_clear_user_data(pkgmgr_client *pc, const char *pkg_type,
2102 const char *appid, pkgmgr_mode mode, uid_t uid)
2104 const char *pkgtype;
2105 char *installer_path;
2108 char *argv[PKG_ARGC_MAX] = { NULL, };
2115 /* Check for NULL value of pc */
2117 DBG("package manager client handle is NULL\n");
2118 return PKGMGR_R_EINVAL;
2120 pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc;
2122 /* 0. check the pc type */
2123 if (mpc->ctype != PC_REQUEST)
2124 return PKGMGR_R_EINVAL;
2126 /* 1. check argument */
2128 return PKGMGR_R_EINVAL;
2131 if (pkg_type == NULL) {
2132 pkgtype = _get_pkg_type(appid, uid);
2133 if (pkgtype == NULL)
2134 return PKGMGR_R_EINVAL;
2138 if (strlen(appid) >= PKG_STRING_LEN_MAX)
2139 return PKGMGR_R_EINVAL;
2141 /* 2. get installer path using pkg_path */
2142 installer_path = _get_backend_path_with_type(pkgtype);
2143 if (installer_path == NULL)
2144 return PKGMGR_R_EINVAL;
2146 /* 3. generate req_key */
2147 req_key = __get_req_key(appid);
2149 /* 4. generate argv */
2151 /* argv[0] installer path */
2152 argv[argcnt++] = installer_path;
2154 argv[argcnt++] = strdup("-k");
2156 argv[argcnt++] = req_key;
2158 argv[argcnt++] = strdup("-c");
2160 argv[argcnt++] = strdup(appid);
2162 /*** add quote in all string for special charactor like '\n'*** FIX */
2163 for (i = 0; i < argcnt; i++) {
2164 temp = g_shell_quote(argv[i]);
2165 len += (strlen(temp) + 1);
2169 args = (char *)calloc(len, sizeof(char));
2171 DBG("calloc failed");
2173 for (i = 0; i < argcnt; i++)
2176 return PKGMGR_R_ERROR;
2178 strncpy(args, argv[0], len - 1);
2180 for (i = 1; i < argcnt; i++) {
2181 strncat(args, " ", strlen(" "));
2182 temp = g_shell_quote(argv[i]);
2183 strncat(args, temp, strlen(temp));
2186 DBG("[args] %s [len] %d\n", args, len);
2187 /******************* end of quote ************************/
2189 /* 6. request clear */
2190 ret = comm_client_request(mpc->info.request.cc, "cleardata",
2191 g_variant_new("(ssss)", req_key, pkgtype, appid, args));
2193 ERR("request failed, ret=%d\n", ret);
2195 for (i = 0; i < argcnt; i++)
2199 return PKGMGR_R_ECOMM;
2202 for (i = 0; i < argcnt; i++)
2210 API int pkgmgr_client_clear_user_data(pkgmgr_client *pc, const char *pkg_type,
2211 const char *appid, pkgmgr_mode mode)
2213 return pkgmgr_client_usr_clear_user_data(pc, pkg_type, appid,mode, GLOBAL_USER);
2216 API int pkgmgr_client_set_status_type(pkgmgr_client *pc, int status_type)
2220 retvm_if(pc == NULL, PKGMGR_R_EINVAL, "package manager client pc is NULL");
2221 retvm_if(status_type == PKGMGR_CLIENT_STATUS_ALL, PKGMGR_R_OK, "status_type is PKGMGR_CLIENT_STATUS_ALL");
2222 pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc;
2224 /* free listening head */
2225 listen_cb_info *tmp = NULL;
2226 listen_cb_info *prev = NULL;
2227 for (tmp = mpc->info.listening.lhead; tmp;) {
2233 /* free dbus connection */
2234 ret = comm_client_free(mpc->info.listening.cc);
2235 retvm_if(ret < 0, PKGMGR_R_ERROR, "comm_client_free() failed - %d", ret);
2237 /* Manage pc for seperated event */
2238 mpc->ctype = PC_LISTENING;
2239 mpc->status_type = status_type;
2241 mpc->info.listening.cc = comm_client_new();
2242 retvm_if(mpc->info.listening.cc == NULL, PKGMGR_R_EINVAL, "client creation failed");
2244 if ((mpc->status_type & PKGMGR_CLIENT_STATUS_INSTALL) == PKGMGR_CLIENT_STATUS_INSTALL) {
2245 ret = comm_client_set_status_callback(COMM_STATUS_BROADCAST_INSTALL, mpc->info.listening.cc, __status_callback, pc);
2246 retvm_if(ret < 0, PKGMGR_R_ECOMM, "PKGMGR_CLIENT_STATUS_INSTALL failed - %d", ret);
2249 if ((mpc->status_type & PKGMGR_CLIENT_STATUS_UNINSTALL) == PKGMGR_CLIENT_STATUS_UNINSTALL) {
2250 ret = comm_client_set_status_callback(COMM_STATUS_BROADCAST_UNINSTALL, mpc->info.listening.cc, __status_callback, pc);
2251 retvm_if(ret < 0, PKGMGR_R_ECOMM, "COMM_STATUS_BROADCAST_UNINSTALL failed - %d", ret);
2254 if ((mpc->status_type & PKGMGR_CLIENT_STATUS_MOVE) == PKGMGR_CLIENT_STATUS_MOVE) {
2255 ret = comm_client_set_status_callback(COMM_STATUS_BROADCAST_MOVE, mpc->info.listening.cc, __status_callback, pc);
2256 retvm_if(ret < 0, PKGMGR_R_ECOMM, "COMM_STATUS_BROADCAST_MOVE failed - %d", ret);
2259 if ((mpc->status_type & PKGMGR_CLIENT_STATUS_INSTALL_PROGRESS) == PKGMGR_CLIENT_STATUS_INSTALL_PROGRESS) {
2260 ret = comm_client_set_status_callback(COMM_STATUS_BROADCAST_INSTALL_PROGRESS, mpc->info.listening.cc, __status_callback, pc);
2261 retvm_if(ret < 0, PKGMGR_R_ECOMM, "COMM_STATUS_BROADCAST_INSTALL_PROGRESS failed - %d", ret);
2264 if ((mpc->status_type & PKGMGR_CLIENT_STATUS_UPGRADE) == PKGMGR_CLIENT_STATUS_UPGRADE) {
2265 ret = comm_client_set_status_callback(COMM_STATUS_BROADCAST_UPGRADE, mpc->info.listening.cc, __status_callback, pc);
2266 retvm_if(ret < 0, PKGMGR_R_ECOMM, "COMM_STATUS_BROADCAST_UPGRADE failed - %d", ret);
2272 API int pkgmgr_client_listen_status(pkgmgr_client *pc, pkgmgr_handler event_cb,
2276 /* Check for NULL value of pc */
2277 retvm_if(pc == NULL, PKGMGR_R_EINVAL, "package manager client pc is NULL");
2278 pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc;
2280 /* 0. check input */
2281 retvm_if(mpc->ctype != PC_LISTENING, PKGMGR_R_EINVAL, "ctype is not PC_LISTENING");
2282 retvm_if(event_cb == NULL, PKGMGR_R_EINVAL, "event_cb is NULL");
2285 req_id = _get_request_id();
2287 /* 2. add callback info to pkgmgr_client */
2288 __add_stat_cbinfo(mpc, req_id, event_cb, data);
2292 API int pkgmgr_client_broadcast_status(pkgmgr_client *pc, const char *pkg_type,
2293 const char *pkgid, const char *key,
2296 /* client cannot broadcast signal */
2300 API int pkgmgr_client_request_service(pkgmgr_request_service_type service_type, int service_mode,
2301 pkgmgr_client * pc, const char *pkg_type, const char *pkgid,
2302 const char *custom_info, pkgmgr_handler event_cb, void *data)
2304 return pkgmgr_client_usr_request_service(service_type, service_mode, pc, pkg_type, pkgid, GLOBAL_USER, custom_info, event_cb, data);
2307 API int pkgmgr_client_usr_request_service(pkgmgr_request_service_type service_type, int service_mode,
2308 pkgmgr_client * pc, const char *pkg_type, const char *pkgid, uid_t uid,
2309 const char *custom_info, pkgmgr_handler event_cb, void *data)
2313 /* Check for NULL value of service type */
2314 retvm_if(service_type > PM_REQUEST_MAX, PKGMGR_R_EINVAL, "service type is not defined\n");
2315 retvm_if(service_type < 0, PKGMGR_R_EINVAL, "service type is error\n");
2317 switch (service_type) {
2318 case PM_REQUEST_CSC:
2319 tryvm_if(custom_info == NULL, ret = PKGMGR_R_EINVAL, "custom_info is NULL\n");
2320 tryvm_if(strlen(custom_info) >= PKG_STRING_LEN_MAX, ret = PKGMGR_R_EINVAL, "optional_file over PKG_STRING_LEN_MAX");
2321 tryvm_if(data == NULL, ret = PKGMGR_R_EINVAL, "data is NULL\n");
2323 ret = __csc_process(custom_info, (char *)data);
2325 ERR("__csc_process fail \n");
2331 case PM_REQUEST_MOVE:
2332 tryvm_if(pkgid == NULL, ret = PKGMGR_R_EINVAL, "pkgid is NULL\n");
2333 tryvm_if(pc == NULL, ret = PKGMGR_R_EINVAL, "pc is NULL\n");
2334 tryvm_if((service_mode < PM_MOVE_TO_INTERNAL) || (service_mode > PM_MOVE_TO_SDCARD), ret = PKGMGR_R_EINVAL, "service_mode is wrong\n");
2336 ret = __move_pkg_process(pc, pkgid, uid, (pkgmgr_move_type)service_mode, event_cb, data);
2339 case PM_REQUEST_GET_SIZE:
2340 tryvm_if(pkgid == NULL, ret = PKGMGR_R_EINVAL, "pkgid is NULL\n");
2341 tryvm_if(pc == NULL, ret = PKGMGR_R_EINVAL, "pc is NULL\n");
2342 tryvm_if((service_mode < PM_GET_TOTAL_SIZE) || (service_mode >= PM_GET_MAX), ret = PKGMGR_R_EINVAL, "service_mode is wrong\n");
2344 ret = __get_size_process(pc, pkgid, uid, (pkgmgr_getsize_type)service_mode, event_cb, data);
2347 case PM_REQUEST_KILL_APP:
2348 case PM_REQUEST_CHECK_APP:
2349 tryvm_if(pkgid == NULL, ret = PKGMGR_R_EINVAL, "pkgid is NULL\n");
2350 tryvm_if(pc == NULL, ret = PKGMGR_R_EINVAL, "pc is NULL\n");
2352 ret = __check_app_process(service_type, pc, pkgid, uid, data);
2354 ERR("__check_app_process fail \n");
2361 ERR("Wrong Request\n");
2372 API int pkgmgr_client_usr_request_size_info(uid_t uid)
2375 pkgmgr_client *pc = NULL;
2377 pc = pkgmgr_client_new(PC_REQUEST);
2378 retvm_if(pc == NULL, PKGMGR_R_EINVAL, "request pc is null\n");
2380 ret = __request_size_info(pc, uid);
2382 ERR("__request_size_info fail \n");
2385 pkgmgr_client_free(pc);
2389 API int pkgmgr_client_request_size_info(void) // get all package size (data, total)
2391 return pkgmgr_client_usr_request_size_info(GLOBAL_USER);
2394 API int pkgmgr_client_usr_clear_cache_dir(const char *pkgid, uid_t uid)
2396 retvm_if(pkgid == NULL, PKGMGR_R_EINVAL, "package id is null\n");
2399 pkgmgr_client_t *pc = NULL;
2400 char *pkg_type = NULL;
2401 int is_type_malloced = 0;
2403 pkgmgrinfo_pkginfo_h handle = NULL;
2405 pc = pkgmgr_client_new(PC_REQUEST);
2406 retvm_if(pc == NULL, PKGMGR_R_ESYSTEM, "request pc is null\n");
2408 if (strcmp(pkgid, PKG_CLEAR_ALL_CACHE) != 0)
2410 ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(pkgid, uid, &handle);
2411 tryvm_if(ret < 0, ret = PKGMGR_R_ENOPKG, "pkgmgrinfo_pkginfo_get_pkginfo failed");
2413 ret = pkgmgrinfo_pkginfo_get_type(handle, &pkg_type);
2414 tryvm_if(ret < 0, ret = PKGMGR_R_ESYSTEM, "pkgmgrinfo_pkginfo_get_type failed");
2418 pkg_type = (char *)malloc(strlen("rpm") + 1);
2419 strcpy(pkg_type, "rpm");
2420 is_type_malloced = 1;
2423 ret = comm_client_request(pc->info.request.cc, "clearcache",
2424 g_variant_new("(sss)", "reqkey", pkg_type, pkgid));
2425 tryvm_if(ret < 0, ret = PKGMGR_R_ERROR, "COMM_REQ_CLEAR_CACHE_DIR failed, ret=%d\n", ret);
2430 pkgmgr_client_free(pc);
2432 if(is_type_malloced)
2435 pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
2440 API int pkgmgr_client_clear_cache_dir(const char *pkgid)
2442 return pkgmgr_client_usr_clear_cache_dir(pkgid, GLOBAL_USER);
2445 API int pkgmgr_client_clear_usr_all_cache_dir(uid_t uid)
2447 return pkgmgr_client_usr_clear_cache_dir(PKG_CLEAR_ALL_CACHE, uid);
2450 API int pkgmgr_client_clear_all_cache_dir(void)
2453 ret = pkgmgr_client_usr_clear_cache_dir(PKG_CLEAR_ALL_CACHE, GLOBAL_USER);
2457 API int pkgmgr_client_get_size(pkgmgr_client * pc, const char *pkgid, pkgmgr_getsize_type get_type, pkgmgr_handler event_cb, void *data)
2459 return pkgmgr_client_usr_get_size(pc, pkgid, get_type, event_cb, data, GLOBAL_USER);
2462 API int pkgmgr_client_usr_get_size(pkgmgr_client * pc, const char *pkgid, pkgmgr_getsize_type get_type, pkgmgr_handler event_cb, void *data, uid_t uid)
2464 char *req_key = NULL;
2466 char *pkgtype = "rpm";
2467 char *argv[PKG_ARGC_MAX] = { NULL, };
2473 char buf[128] = {'\0'};
2476 pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc;
2477 retvm_if(mpc->ctype != PC_REQUEST, PKGMGR_R_EINVAL, "mpc->ctype is not PC_REQUEST\n");
2478 retvm_if(event_cb == NULL, PKGMGR_R_EINVAL, "event_cb is NULL\n");
2479 retvm_if(pkgid == NULL, PKGMGR_R_EINVAL, "pkgid is NULL\n");
2481 req_key = __get_req_key(pkgid);
2482 retvm_if(req_key == NULL, PKGMGR_R_EINVAL, "req_key is NULL");
2484 req_id = _get_request_id();
2485 __add_op_cbinfo(mpc, req_id, req_key, event_cb, NULL, data);
2487 snprintf(buf, 128, "%d", get_type);
2488 argv[argcnt++] = strdup(pkgid);
2489 argv[argcnt++] = strdup(buf);
2490 argv[argcnt++] = strdup("-k");
2491 argv[argcnt++] = req_key;
2493 /*** add quote in all string for special charactor like '\n'*** FIX */
2494 for (i = 0; i < argcnt; i++) {
2495 temp = g_shell_quote(argv[i]);
2496 len += (strlen(temp) + 1);
2500 args = (char *)calloc(len, sizeof(char));
2501 tryvm_if(args == NULL, ret = PKGMGR_R_EINVAL, "installer_path fail");
2503 strncpy(args, argv[0], len - 1);
2505 for (i = 1; i < argcnt; i++) {
2506 strncat(args, " ", strlen(" "));
2507 temp = g_shell_quote(argv[i]);
2508 strncat(args, temp, strlen(temp));
2511 DBG("[args] %s [len] %d\n", args, len);
2514 ret = comm_client_request(mpc->info.request.cc, "getsize",
2515 g_variant_new("(ssss)", req_key, pkgtype, pkgid, args));
2517 ERR("comm_client_request failed, ret=%d\n", ret);
2520 for (i = 0; i < argcnt; i++)
2529 API int pkgmgr_client_usr_get_package_size_info(pkgmgr_client *pc, const char *pkgid, pkgmgr_pkg_size_info_receive_cb event_cb, void *user_data, uid_t uid)
2531 pkgmgrinfo_pkginfo_h pkginfo = NULL;
2532 char *req_key = NULL;
2535 int type = PM_GET_PKG_SIZE_INFO;
2537 retvm_if(pc == NULL, PKGMGR_R_EINVAL, "The specified pc is NULL.");
2538 retvm_if(pkgid == NULL, PKGMGR_R_EINVAL, "The package id is NULL.");
2540 if (strcmp(pkgid, PKG_SIZE_INFO_TOTAL) == 0)
2541 { // total package size info
2542 type = PM_GET_TOTAL_PKG_SIZE_INFO;
2546 res = pkgmgrinfo_pkginfo_get_usr_pkginfo(pkgid, uid, &pkginfo);
2547 retvm_if(res != 0, PKGMGR_R_ENOPKG, "The package id is not installed.");
2550 pkgmgrinfo_pkginfo_destroy_pkginfo(pkginfo);
2554 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
2555 retvm_if(mpc->ctype != PC_REQUEST, PKGMGR_R_EINVAL, "mpc->ctype is not PC_REQUEST");
2557 res = __change_op_cb_for_getsize(mpc);
2558 retvm_if(res < 0 , PKGMGR_R_ESYSTEM, "__change_op_cb_for_getsize is fail");
2560 req_key = __get_req_key(pkgid);
2561 retvm_if(req_key == NULL, PKGMGR_R_ESYSTEM, "req_key is NULL");
2563 req_id = _get_request_id();
2564 __add_op_cbinfo(mpc, req_id, req_key, __get_pkg_size_info_cb, event_cb, user_data);
2566 res = __get_package_size_info(mpc, req_key, pkgid, type, uid);
2571 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)
2573 return pkgmgr_client_usr_get_package_size_info(pc, pkgid, event_cb, user_data, GLOBAL_USER);
2576 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)
2577 { // total package size info
2578 return pkgmgr_client_usr_get_package_size_info(pc, PKG_SIZE_INFO_TOTAL, (pkgmgr_pkg_size_info_receive_cb)event_cb, user_data, uid);
2581 API int pkgmgr_client_get_total_package_size_info(pkgmgr_client *pc, pkgmgr_total_pkg_size_info_receive_cb event_cb, void *user_data)
2583 return pkgmgr_client_usr_get_package_size_info(pc, PKG_SIZE_INFO_TOTAL, (pkgmgr_pkg_size_info_receive_cb)event_cb, user_data, GLOBAL_USER);