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.
33 #include <dbus/dbus.h>
34 #include <dbus/dbus-glib-lowlevel.h>
38 #include <pkgmgr-info.h>
39 #include <iniparser.h>
40 /* For multi-user support */
41 #include <tzplatform_config.h>
43 #include "package-manager.h"
44 #include "pkgmgr-internal.h"
45 #include "pkgmgr-debug.h"
46 #include "pkgmgr-api.h"
47 #include "comm_client.h"
48 #include "comm_status_broadcast_server.h"
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)
57 static int _get_request_id()
59 static int internal_req_id = 1;
61 return internal_req_id++;
64 typedef struct _req_cb_info {
67 pkgmgr_handler event_cb;
69 struct _req_cb_info *next;
72 typedef struct _listen_cb_info {
74 pkgmgr_handler event_cb;
76 struct _listen_cb_info *next;
79 typedef struct _pkgmgr_client_t {
89 listen_cb_info *lhead;
98 typedef struct _iter_data {
99 pkgmgr_iter_fn iter_fn;
103 static int __xsystem(const char *argv[])
110 perror("fork failed");
114 execvp(argv[0], (char *const *)argv);
120 if (waitpid(pid, &status, 0) == -1) {
121 perror("waitpid failed");
124 if (WIFSIGNALED(status)) {
128 if (!WIFEXITED(status)) {
129 /* shouldn't happen */
130 perror("should not happen");
133 return WEXITSTATUS(status);
136 static void __error_to_string(int errnumber, char **errstr)
141 case PKGCMD_ERR_PACKAGE_NOT_FOUND:
142 *errstr = PKGCMD_ERR_PACKAGE_NOT_FOUND_STR;
144 case PKGCMD_ERR_PACKAGE_INVALID:
145 *errstr = PKGCMD_ERR_PACKAGE_INVALID_STR;
147 case PKGCMD_ERR_PACKAGE_LOWER_VERSION:
148 *errstr = PKGCMD_ERR_PACKAGE_LOWER_VERSION_STR;
150 case PKGCMD_ERR_PACKAGE_EXECUTABLE_NOT_FOUND:
151 *errstr = PKGCMD_ERR_PACKAGE_EXECUTABLE_NOT_FOUND_STR;
153 case PKGCMD_ERR_MANIFEST_INVALID:
154 *errstr = PKGCMD_ERR_MANIFEST_INVALID_STR;
156 case PKGCMD_ERR_CONFIG_NOT_FOUND:
157 *errstr = PKGCMD_ERR_CONFIG_NOT_FOUND_STR;
159 case PKGCMD_ERR_CONFIG_INVALID:
160 *errstr = PKGCMD_ERR_CONFIG_INVALID_STR;
162 case PKGCMD_ERR_SIGNATURE_NOT_FOUND:
163 *errstr = PKGCMD_ERR_SIGNATURE_NOT_FOUND_STR;
165 case PKGCMD_ERR_SIGNATURE_INVALID:
166 *errstr = PKGCMD_ERR_SIGNATURE_INVALID_STR;
168 case PKGCMD_ERR_SIGNATURE_VERIFICATION_FAILED:
169 *errstr = PKGCMD_ERR_SIGNATURE_VERIFICATION_FAILED_STR;
171 case PKGCMD_ERR_ROOT_CERTIFICATE_NOT_FOUND:
172 *errstr = PKGCMD_ERR_ROOT_CERTIFICATE_NOT_FOUND_STR;
174 case PKGCMD_ERR_CERTIFICATE_INVALID:
175 *errstr = PKGCMD_ERR_CERTIFICATE_INVALID_STR;
177 case PKGCMD_ERR_CERTIFICATE_CHAIN_VERIFICATION_FAILED:
178 *errstr = PKGCMD_ERR_CERTIFICATE_CHAIN_VERIFICATION_FAILED_STR;
180 case PKGCMD_ERR_CERTIFICATE_EXPIRED:
181 *errstr = PKGCMD_ERR_CERTIFICATE_EXPIRED_STR;
183 case PKGCMD_ERR_INVALID_PRIVILEGE:
184 *errstr = PKGCMD_ERR_INVALID_PRIVILEGE_STR;
186 case PKGCMD_ERR_MENU_ICON_NOT_FOUND:
187 *errstr = PKGCMD_ERR_MENU_ICON_NOT_FOUND_STR;
189 case PKGCMD_ERR_FATAL_ERROR:
190 *errstr = PKGCMD_ERR_FATAL_ERROR_STR;
192 case PKGCMD_ERR_OUT_OF_STORAGE:
193 *errstr = PKGCMD_ERR_OUT_OF_STORAGE_STR;
195 case PKGCMD_ERR_OUT_OF_MEMORY:
196 *errstr = PKGCMD_ERR_OUT_OF_MEMORY_STR;
198 case PKGCMD_ERR_ARGUMENT_INVALID:
199 *errstr = PKGCMD_ERR_ARGUMENT_INVALID_STR;
202 *errstr = PKGCMD_ERR_UNKNOWN_STR;
207 static void __add_op_cbinfo(pkgmgr_client_t * pc, int request_id,
208 const char *req_key, pkgmgr_handler event_cb, void *new_event_cb,
211 req_cb_info *cb_info;
212 req_cb_info *current;
215 cb_info = (req_cb_info *) calloc(1, sizeof(req_cb_info));
216 if (cb_info == NULL) {
217 DBG("calloc failed");
220 cb_info->request_id = request_id;
221 cb_info->req_key = strdup(req_key);
222 cb_info->event_cb = event_cb;
223 cb_info->data = data;
224 cb_info->next = NULL;
225 pc->new_event_cb = new_event_cb;
227 if (pc->info.request.rhead == NULL)
228 pc->info.request.rhead = cb_info;
230 current = prev = pc->info.request.rhead;
233 current = current->next;
236 prev->next = cb_info;
240 static req_cb_info *__find_op_cbinfo(pkgmgr_client_t *pc, const char *req_key)
244 tmp = pc->info.request.rhead;
251 DBG("tmp->req_key %s, req_key %s", tmp->req_key, req_key);
254 if (strncmp(tmp->req_key, req_key, strlen(tmp->req_key)) == 0)
261 static void __remove_op_cbinfo(pkgmgr_client_t *pc, req_cb_info *info)
265 if (pc == NULL || pc->info.request.rhead == NULL || info == NULL)
268 tmp = pc->info.request.rhead;
270 if (tmp->next == info) {
271 tmp->next = info->next;
280 static void __add_stat_cbinfo(pkgmgr_client_t *pc, int request_id,
281 pkgmgr_handler event_cb, void *data)
283 listen_cb_info *cb_info;
284 listen_cb_info *current;
285 listen_cb_info *prev;
287 cb_info = (listen_cb_info *) calloc(1, sizeof(listen_cb_info));
288 if (cb_info == NULL) {
289 DBG("calloc failed");
292 cb_info->request_id = request_id;
293 cb_info->event_cb = event_cb;
294 cb_info->data = data;
295 cb_info->next = NULL;
297 /* TODO - check the order of callback - FIFO or LIFO => Should be changed to LIFO */
298 if (pc->info.listening.lhead == NULL)
299 pc->info.listening.lhead = cb_info;
301 current = prev = pc->info.listening.lhead;
304 current = current->next;
307 prev->next = cb_info;
311 static void __operation_callback(void *cb_data, uid_t target_uid,
312 const char *req_id, const char *pkg_type,
313 const char *pkgid, const char *key,
317 req_cb_info *cb_info;
319 pc = (pkgmgr_client_t *) cb_data;
321 /* find callback info */
322 cb_info = __find_op_cbinfo(pc, req_id);
323 if (cb_info == NULL) {
324 ERR("cannot fint cb_info for req_id:%d", req_id);
329 if (cb_info->event_cb) {
330 if (pc->new_event_cb)
331 cb_info->event_cb(target_uid, cb_info->request_id,
332 pkg_type, pkgid, key, val, pc,
335 cb_info->event_cb(target_uid, cb_info->request_id,
336 pkg_type, pkgid, key, val, NULL,
340 /*remove callback for last call
341 if (strcmp(key, "end") == 0) {
342 __remove_op_cbinfo(pc, cb_info);
343 DBG("__remove_op_cbinfo");
350 static void __status_callback(void *cb_data, uid_t target_uid,
351 const char *req_id, const char *pkg_type,
352 const char *pkgid, const char *key,
358 pc = (pkgmgr_client_t *) cb_data;
360 tmp = pc->info.listening.lhead;
362 if (tmp->event_cb(target_uid, tmp->request_id, pkg_type, pkgid,
363 key, val, NULL, tmp->data) != 0)
371 static char *__get_req_key(const char *pkg_path)
375 char timestr[PKG_STRING_LEN_MAX];
379 gettimeofday(&tv, NULL);
380 curtime = tv.tv_sec * 1000000 + tv.tv_usec;
381 snprintf(timestr, sizeof(timestr), "%ld", curtime);
383 size = strlen(pkg_path) + strlen(timestr) + 2;
384 str_req_key = (char *)calloc(size, sizeof(char));
385 if (str_req_key == NULL) {
386 DBG("calloc failed");
389 snprintf(str_req_key, size, "%s_%s", pkg_path, timestr);
394 static char *__get_type_from_path(const char *pkg_path)
397 char mimetype[255] = { '\0', };
398 char extlist[256] = { '\0', };
401 ret = _get_mime_from_file(pkg_path, mimetype, sizeof(mimetype));
403 ERR("_get_mime_from_file() failed - error code[%d]\n",
408 ret = _get_mime_extension(mimetype, extlist, sizeof(extlist));
410 ERR("_get_mime_extension() failed - error code[%d]\n",
415 if (strlen(extlist) == 0)
418 if (strchr(extlist, ',')) {
419 extlist[strlen(extlist) - strlen(strchr(extlist, ','))] = '\0';
421 pkg_type = strchr(extlist, '.') + 1;
422 return strdup(pkg_type);
425 static int __get_pkgid_by_appid(const char *appid, char **pkgid)
427 pkgmgrinfo_appinfo_h pkgmgrinfo_appinfo = NULL;
430 char *pkg_id_dup = NULL;
432 if (pkgmgrinfo_appinfo_get_appinfo(appid, &pkgmgrinfo_appinfo) != PMINFO_R_OK)
435 if (pkgmgrinfo_appinfo_get_pkgname(pkgmgrinfo_appinfo, &pkg_id) != PMINFO_R_OK)
438 pkg_id_dup = strdup(pkg_id);
439 if (pkg_id_dup == NULL)
446 pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo);
451 static inline ail_cb_ret_e __appinfo_cb(const ail_appinfo_h appinfo, void *user_data)
454 ail_cb_ret_e ret = AIL_CB_RET_CONTINUE;
456 ail_appinfo_get_str(appinfo, AIL_PROP_PACKAGE_STR, &package);
459 (* (char **) user_data) = strdup(package);
460 ret = AIL_CB_RET_CANCEL;
466 static char *__get_app_info_from_db_by_apppath(const char *apppath, uid_t uid)
468 char *caller_appid = NULL;
476 ret = ail_filter_new(&filter);
477 if (ret != AIL_ERROR_OK) {
481 ret = ail_filter_add_str(filter, AIL_PROP_X_SLP_EXE_PATH, apppath);
482 if (ret != AIL_ERROR_OK) {
483 ail_filter_destroy(filter);
487 if(uid != GLOBAL_USER)
488 ret = ail_filter_count_usr_appinfo(filter, &count, uid);
490 ret = ail_filter_count_appinfo(filter, &count);
492 if (ret != AIL_ERROR_OK) {
493 ail_filter_destroy(filter);
497 ail_filter_destroy(filter);
500 if(uid != GLOBAL_USER)
501 ail_filter_list_usr_appinfo_foreach(filter, __appinfo_cb, &caller_appid,uid);
503 ail_filter_list_appinfo_foreach(filter, __appinfo_cb, &caller_appid);
505 ail_filter_destroy(filter);
510 static inline int __read_proc(const char *path, char *buf, int size)
515 if (buf == NULL || path == NULL)
518 fd = open(path, O_RDONLY);
522 ret = read(fd, buf, size - 1);
534 char *__proc_get_cmdline_bypid(int pid)
536 char buf[PKG_STRING_LEN_MAX] = {'\0', };
539 snprintf(buf, sizeof(buf), "/proc/%d/cmdline", pid);
540 ret = __read_proc(buf, buf, sizeof(buf));
544 /* support app launched by shell script*/
545 if (strncmp(buf, BINSH_NAME, BINSH_SIZE) == 0)
546 return strdup(&buf[BINSH_SIZE + 1]);
551 static int __get_appid_bypid(int pid, char *pkgname, int len, uid_t uid)
553 char *cmdline = NULL;
554 char *caller_appid = NULL;
556 cmdline = __proc_get_cmdline_bypid(pid);
560 caller_appid = __get_app_info_from_db_by_apppath(cmdline, uid);
561 snprintf(pkgname, len, "%s", caller_appid);
569 static char *__get_caller_pkgid(uid_t uid)
571 char *caller_appid[PKG_STRING_LEN_MAX] = {0, };
572 char *caller_pkgid = NULL;
574 if (__get_appid_bypid(getpid(), caller_appid, sizeof(caller_appid), uid) < 0) {
575 ERR("get appid fail!!!\n");
578 if (__get_pkgid_by_appid(caller_appid, &caller_pkgid) < 0){
579 ERR("get pkgid fail!!!\n");
586 static inline int __pkgmgr_read_proc(const char *path, char *buf, int size)
591 if (buf == NULL || path == NULL)
594 fd = open(path, O_RDONLY);
598 ret = read(fd, buf, size - 1);
610 static inline int __pkgmgr_find_pid_by_cmdline(const char *dname,
611 const char *cmdline, const char *apppath)
615 if (strncmp(cmdline, apppath, PKG_STRING_LEN_MAX-1) == 0) {
617 if (pid != getpgid(pid))
625 static int __pkgmgr_proc_iter_kill_cmdline(const char *apppath)
628 struct dirent *dentry;
631 char buf[PKG_STRING_LEN_MAX];
633 dp = opendir("/proc");
638 while ((dentry = readdir(dp)) != NULL) {
639 if (!isdigit(dentry->d_name[0]))
642 snprintf(buf, sizeof(buf), "/proc/%s/cmdline", dentry->d_name);
643 ret = __pkgmgr_read_proc(buf, buf, sizeof(buf));
647 pid = __pkgmgr_find_pid_by_cmdline(dentry->d_name, buf, apppath);
658 if (killpg(pgid, SIGKILL) < 0) {
670 static int __app_list_cb (const pkgmgrinfo_appinfo_h handle,
674 pkgmgrinfo_appinfo_get_exec(handle, &exec);
676 __pkgmgr_proc_iter_kill_cmdline(exec);
681 static int __sync_process(char *req_key)
684 char info_file[PKG_STRING_LEN_MAX] = {'\0', };
688 char buf[PKG_STRING_LEN_MAX] = {0, };
690 snprintf(info_file, PKG_STRING_LEN_MAX, "%s/%s", PKG_SIZE_INFO_PATH, req_key);
695 if (access(info_file, F_OK) == 0) {
696 fp = fopen(info_file, "r");
698 DBG("file is not generated yet.... wait\n");
699 usleep(100 * 1000); /* 100ms sleep*/
703 fgets(buf, PKG_STRING_LEN_MAX, fp);
706 DBG("info_file file is generated, result = %s. \n", buf);
711 DBG("file is not generated yet.... wait\n");
712 usleep(100 * 1000); /* 100ms sleep*/
714 if (check_cnt > 6000) { /* 60s * 10 time over*/
715 ERR("wait time over!!\n");
720 ret = remove(info_file);
722 ERR("file is can not remove[%s, %d]\n", info_file, ret);
726 static int __csc_process(const char *csc_path, char *result_path)
733 char *pkgtype = NULL;
735 char buf[PKG_STRING_LEN_MAX] = {0,};
736 char type_buf[1024] = { 0 };
737 char des_buf[1024] = { 0 };
738 dictionary *csc = NULL;
741 csc = iniparser_load(csc_path);
742 retvm_if(csc == NULL, PKGMGR_R_EINVAL, "cannot open parse file [%s]", csc_path);
744 file = fopen(result_path, "w");
745 tryvm_if(file == NULL, ret = PKGMGR_R_EINVAL, "cannot open result file [%s]", result_path);
747 count = iniparser_getint(csc, "csc packages:count", -1);
748 tryvm_if(count == 0, ret = PKGMGR_R_ERROR, "csc [%s] dont have packages", csc_path);
750 snprintf(buf, PKG_STRING_LEN_MAX, "[result]\n");
751 fwrite(buf, 1, strlen(buf), file);
752 snprintf(buf, PKG_STRING_LEN_MAX, "count = %d\n", count);
753 fwrite(buf, 1, strlen(buf), file);
755 for(cnt = 1 ; cnt <= count ; cnt++)
757 snprintf(type_buf, PKG_STRING_LEN_MAX - 1, "csc packages:type_%03d", cnt);
758 snprintf(des_buf, PKG_STRING_LEN_MAX - 1, "csc packages:description_%03d", cnt);
760 pkgtype = iniparser_getstring(csc, type_buf, NULL);
761 des = iniparser_getstring(csc, des_buf, NULL);
764 if (pkgtype == NULL) {
766 snprintf(buf, PKG_STRING_LEN_MAX, "%s = Fail to get pkgtype\n", type_buf);
767 fwrite(buf, 1, strlen(buf), file);
769 } else if (des == NULL) {
771 snprintf(buf, PKG_STRING_LEN_MAX, "%s = Fail to get description\n", des_buf);
772 fwrite(buf, 1, strlen(buf), file);
776 snprintf(buf, PKG_STRING_LEN_MAX, "type_%03d = %s\n", cnt, pkgtype);
777 fwrite(buf, 1, strlen(buf), file);
778 snprintf(buf, PKG_STRING_LEN_MAX, "description_%03d = %s\n", cnt, des);
779 fwrite(buf, 1, strlen(buf), file);
781 if (strcmp(pkgtype, "tpk") == 0) {
782 const char *ospinstaller_argv[] = { "/usr/bin/osp-installer", "-c", des, NULL };
783 ret = __xsystem(ospinstaller_argv);
784 } else if (strcmp(pkgtype, "wgt")== 0) {
785 const char *wrtinstaller_argv[] = { "/usr/bin/wrt-installer", "-c", des, NULL };
786 ret = __xsystem(wrtinstaller_argv);
794 __error_to_string(ret, &errstr);
795 snprintf(buf, PKG_STRING_LEN_MAX, "result_%03d = fail[%s]\n", cnt, errstr);
798 snprintf(buf, PKG_STRING_LEN_MAX, "result_%03d = success\n", cnt);
800 fwrite(buf, 1, strlen(buf), file);
804 iniparser_freedict(csc);
814 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)
816 char *req_key = NULL;
818 char *pkgtype = "rpm";
819 char *argv[PKG_ARGC_MAX] = { NULL, };
825 char buf[128] = {'\0'};
827 pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc;
828 retvm_if(mpc->ctype != PC_REQUEST, PKGMGR_R_EINVAL, "mpc->ctype is not PC_REQUEST\n");
830 req_key = __get_req_key(pkgid);
832 snprintf(buf, 128, "%d", get_type);
833 argv[argcnt++] = strdup(pkgid);
834 argv[argcnt++] = strdup(buf);
835 argv[argcnt++] = strdup(req_key);
837 /*** add quote in all string for special charactor like '\n'*** FIX */
838 for (i = 0; i < argcnt; i++) {
839 temp = g_shell_quote(argv[i]);
840 len += (strlen(temp) + 1);
844 args = (char *)calloc(len, sizeof(char));
845 tryvm_if(args == NULL, ret = PKGMGR_R_EINVAL, "installer_path fail");
847 strncpy(args, argv[0], len - 1);
849 for (i = 1; i < argcnt; i++) {
850 strncat(args, " ", strlen(" "));
851 temp = g_shell_quote(argv[i]);
852 strncat(args, temp, strlen(temp));
855 DBG("[args] %s [len] %d\n", args, len);
858 ret = comm_client_request(mpc->info.request.cc, req_key, COMM_REQ_GET_SIZE, pkgtype, pkgid, args, uid, 1);
860 ERR("comm_client_request failed, ret=%d\n", ret);
862 ret = __sync_process(req_key);
864 ERR("get size failed, ret=%d\n", ret);
867 for (i = 0; i < argcnt; i++)
876 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)
878 char *req_key = NULL;
881 pkgmgrinfo_pkginfo_h handle;
882 char *pkgtype = NULL;
883 char *installer_path = NULL;
884 char *argv[PKG_ARGC_MAX] = { NULL, };
890 char buf[128] = {'\0'};
892 pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc;
893 retvm_if(mpc->ctype != PC_REQUEST, PKGMGR_R_EINVAL, "mpc->ctype is not PC_REQUEST\n");
895 if(uid != GLOBAL_USER)
896 ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(pkgid, uid, &handle);
898 ret = pkgmgrinfo_pkginfo_get_pkginfo(pkgid, &handle);
899 retvm_if(ret < 0, PKGMGR_R_ERROR, "pkgmgrinfo_pkginfo_get_pkginfo failed");
901 ret = pkgmgrinfo_pkginfo_get_type(handle, &pkgtype);
902 tryvm_if(ret < 0, ret = PKGMGR_R_ERROR, "pkgmgrinfo_pkginfo_get_type failed");
904 installer_path = _get_backend_path_with_type(pkgtype);
905 req_key = __get_req_key(pkgid);
906 req_id = _get_request_id();
909 snprintf(buf, 128, "%d", move_type);
910 /* argv[0] installer path */
911 argv[argcnt++] = installer_path;
913 argv[argcnt++] = strdup("-k");
915 argv[argcnt++] = req_key;
917 argv[argcnt++] = strdup("-m");
919 argv[argcnt++] = strdup(pkgid);
921 argv[argcnt++] = strdup("-t");
923 argv[argcnt++] = strdup(buf);
925 /*** add quote in all string for special charactor like '\n'*** FIX */
926 for (i = 0; i < argcnt; i++) {
927 temp = g_shell_quote(argv[i]);
928 len += (strlen(temp) + 1);
932 args = (char *)calloc(len, sizeof(char));
933 tryvm_if(args == NULL, ret = PKGMGR_R_EINVAL, "installer_path fail");
935 strncpy(args, argv[0], len - 1);
937 for (i = 1; i < argcnt; i++) {
938 strncat(args, " ", strlen(" "));
939 temp = g_shell_quote(argv[i]);
940 strncat(args, temp, strlen(temp));
943 DBG("[args] %s [len] %d\n", args, len);
946 ret = comm_client_request(mpc->info.request.cc, req_key, COMM_REQ_TO_MOVER, pkgtype, pkgid, args, uid, 1);
948 ERR("comm_client_request failed, ret=%d\n", ret);
950 ret = __sync_process(pkgid);
952 ERR("move pkg failed, ret=%d\n", ret);
955 for (i = 0; i < argcnt; i++)
961 pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
965 static int __check_app_process(pkgmgr_request_service_type service_type, pkgmgr_client * pc, const char *pkgid, uid_t uid, void *data)
970 pkgmgrinfo_pkginfo_h handle;
973 /* Check for NULL value of pc */
974 pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc;
975 retvm_if(mpc->ctype != PC_REQUEST, PKGMGR_R_EINVAL, "mpc->ctype is not PC_REQUEST\n");
977 if (uid != GLOBAL_USER)
978 ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(pkgid, uid, &handle);
980 ret = pkgmgrinfo_pkginfo_get_pkginfo(pkgid, &handle);
981 retvm_if(ret < 0, PKGMGR_R_ERROR, "pkgmgrinfo_pkginfo_get_pkginfo failed");
983 ret = pkgmgrinfo_pkginfo_get_type(handle, &pkgtype);
984 tryvm_if(ret < 0, ret = PKGMGR_R_ERROR, "pkgmgrinfo_pkginfo_get_type failed");
986 /* 2. generate req_key */
987 req_key = __get_req_key(pkgid);
989 /* 3. request activate */
990 if (service_type == PM_REQUEST_KILL_APP)
991 ret = comm_client_request(mpc->info.request.cc, req_key, COMM_REQ_KILL_APP, pkgtype, pkgid, NULL, uid, 1);
992 else if (service_type == PM_REQUEST_CHECK_APP)
993 ret = comm_client_request(mpc->info.request.cc, req_key, COMM_REQ_CHECK_APP, pkgtype, pkgid, NULL, uid, 1);
996 ERR("request failed, ret=%d\n", ret);
998 pid = __sync_process(pkgid);
999 * (int *) data = pid;
1003 pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
1009 static int __request_size_info(pkgmgr_client *pc, uid_t uid)
1011 char *req_key = NULL;
1013 char *pkgtype = "getsize";
1014 char *pkgid = "size_info";
1015 pkgmgr_getsize_type get_type = PM_GET_SIZE_INFO;
1017 char *argv[PKG_ARGC_MAX] = { NULL, };
1023 char buf[128] = {'\0'};
1025 pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc;
1026 retvm_if(mpc->ctype != PC_REQUEST, PKGMGR_R_EINVAL, "mpc->ctype is not PC_REQUEST\n");
1028 req_key = __get_req_key(pkgid);
1030 snprintf(buf, 128, "%d", get_type);
1031 argv[argcnt++] = strdup(pkgid);
1032 argv[argcnt++] = strdup(buf);
1033 argv[argcnt++] = strdup(buf);
1035 /*** add quote in all string for special charactor like '\n'*** FIX */
1036 for (i = 0; i < argcnt; i++) {
1037 temp = g_shell_quote(argv[i]);
1038 len += (strlen(temp) + 1);
1042 args = (char *)calloc(len, sizeof(char));
1043 tryvm_if(args == NULL, ret = PKGMGR_R_EINVAL, "installer_path fail");
1045 strncpy(args, argv[0], len - 1);
1047 for (i = 1; i < argcnt; i++) {
1048 strncat(args, " ", strlen(" "));
1049 temp = g_shell_quote(argv[i]);
1050 strncat(args, temp, strlen(temp));
1053 DBG("[args] %s [len] %d\n", args, len);
1056 ret = comm_client_request(mpc->info.request.cc, req_key, COMM_REQ_GET_SIZE, pkgtype, pkgid, args, uid, 1);
1058 ERR("COMM_REQ_GET_SIZE failed, ret=%d\n", ret);
1062 for (i = 0; i < argcnt; i++)
1071 static int __change_op_cb_for_getsize(pkgmgr_client *pc)
1075 retvm_if(pc == NULL, PKGMGR_R_EINVAL, "package manager client pc is NULL");
1076 pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc;
1078 /* free listening head */
1079 req_cb_info *tmp = NULL;
1080 req_cb_info *prev = NULL;
1081 for (tmp = mpc->info.request.rhead; tmp;) {
1087 /* free dbus connection */
1088 ret = comm_client_free(mpc->info.request.cc);
1089 retvm_if(ret < 0, PKGMGR_R_ERROR, "comm_client_free() failed - %d", ret);
1091 /* Manage pc for seperated event */
1092 mpc->ctype = PC_REQUEST;
1093 mpc->status_type = PKGMGR_CLIENT_STATUS_GET_SIZE;
1096 mpc->info.request.cc = comm_client_new();
1097 retvm_if(mpc->info.request.cc == NULL, PKGMGR_R_ERROR, "client creation failed");
1099 ret = comm_client_set_status_callback(COMM_STATUS_BROADCAST_GET_SIZE, mpc->info.request.cc, __operation_callback, pc);
1100 retvm_if(ret < 0, PKGMGR_R_ERROR, "set_status_callback() failed - %d", ret);
1105 static int __get_package_size_info(pkgmgr_client_t *mpc, char *req_key, const char *pkgid, pkgmgr_getsize_type get_type, uid_t uid)
1107 char *argv[PKG_ARGC_MAX] = { NULL, };
1110 char *pkgtype = "getsize"; //unused
1111 char buf[128] = { 0, };
1117 snprintf(buf, 128, "%d", get_type);
1118 argv[argcnt++] = strdup(pkgid);
1119 argv[argcnt++] = strdup(buf);
1120 argv[argcnt++] = strdup("-k");
1121 argv[argcnt++] = req_key;
1123 /*** add quote in all string for special charactor like '\n'*** FIX */
1124 for (i = 0; i < argcnt; i++) {
1125 temp = g_shell_quote(argv[i]);
1126 len += (strlen(temp) + 1);
1130 args = (char *)calloc(len, sizeof(char));
1131 tryvm_if(args == NULL, ret = PKGMGR_R_EINVAL, "installer_path fail");
1133 strncpy(args, argv[0], len - 1);
1135 for (i = 1; i < argcnt; i++) {
1136 strncat(args, " ", strlen(" "));
1137 temp = g_shell_quote(argv[i]);
1138 strncat(args, temp, strlen(temp));
1141 DBG("[args] %s [len] %d\n", args, len);
1144 ret = comm_client_request(mpc->info.request.cc, req_key, COMM_REQ_GET_SIZE, pkgtype, pkgid, args, uid, 1);
1146 ERR("COMM_REQ_GET_SIZE failed, ret=%d\n", ret);
1149 for (i = 0; i < argcnt; i++)
1158 static int __get_pkg_size_info_cb(uid_t target_uid, int req_id, const char *req_type,
1159 const char *pkgid, const char *key,
1160 const char *value, const void *pc, void *user_data)
1163 DBG("target_uid: %u, reqid: %d, req type: %s, pkgid: %s, unused key: %s, size info: %s",
1164 target_uid, req_id, req_type, pkgid, key, value);
1166 pkg_size_info_t *size_info = (pkg_size_info_t *)malloc(sizeof(pkg_size_info_t));
1167 retvm_if(size_info == NULL, -1, "The memory is insufficient.");
1169 char *save_ptr = NULL;
1170 char *token = strtok_r((char*)value, ":", &save_ptr);
1171 size_info->data_size = atoll(token);
1172 token = strtok_r(NULL, ":", &save_ptr);
1173 size_info->cache_size = atoll(token);
1174 token = strtok_r(NULL, ":", &save_ptr);
1175 size_info->app_size = atoll(token);
1176 token = strtok_r(NULL, ":", &save_ptr);
1177 size_info->ext_data_size = atoll(token);
1178 token = strtok_r(NULL, ":", &save_ptr);
1179 size_info->ext_cache_size = atoll(token);
1180 token = strtok_r(NULL, ":", &save_ptr);
1181 size_info->ext_app_size = atoll(token);
1183 DBG("data: %lld, cache: %lld, app: %lld, ext_data: %lld, ext_cache: %lld, ext_app: %lld",
1184 size_info->data_size, size_info->cache_size, size_info->app_size,
1185 size_info->ext_data_size, size_info->ext_cache_size, size_info->ext_app_size);
1187 pkgmgr_client_t *pmc = (pkgmgr_client_t *)pc;
1188 tryvm_if(pmc == NULL, ret = -1, "pkgmgr_client instance is null.");
1190 if (strcmp(pkgid, PKG_SIZE_INFO_TOTAL) == 0)
1191 { // total package size info
1192 pkgmgr_total_pkg_size_info_receive_cb callback = (pkgmgr_total_pkg_size_info_receive_cb)(pmc->new_event_cb);
1193 callback((pkgmgr_client *)pc, size_info, user_data);
1197 pkgmgr_pkg_size_info_receive_cb callback = (pkgmgr_pkg_size_info_receive_cb)(pmc->new_event_cb);
1198 callback((pkgmgr_client *)pc, pkgid, size_info, user_data);
1210 API pkgmgr_client *pkgmgr_client_new(client_type ctype)
1212 pkgmgr_client_t *pc = NULL;
1215 retvm_if(ctype != PC_REQUEST && ctype != PC_LISTENING && ctype != PC_BROADCAST, NULL, "ctype is not client_type");
1217 /* Allocate memory for ADT:pkgmgr_client */
1218 pc = calloc(1, sizeof(pkgmgr_client_t));
1219 retvm_if(pc == NULL, NULL, "No memory");
1223 pc->status_type = PKGMGR_CLIENT_STATUS_ALL;
1225 if (pc->ctype == PC_REQUEST) {
1226 pc->info.request.cc = comm_client_new();
1227 trym_if(pc->info.request.cc == NULL, "client creation failed");
1229 ret = comm_client_set_status_callback(COMM_STATUS_BROADCAST_ALL, pc->info.request.cc, __operation_callback, pc);
1230 trym_if(ret < 0L, "comm_client_set_status_callback() failed - %d", ret);
1231 } else if (pc->ctype == PC_LISTENING) {
1232 pc->info.listening.cc = comm_client_new();
1233 trym_if(pc->info.listening.cc == NULL, "client creation failed");
1235 ret = comm_client_set_status_callback(COMM_STATUS_BROADCAST_ALL, pc->info.listening.cc, __status_callback, pc);
1236 trym_if(ret < 0L, "comm_client_set_status_callback() failed - %d", ret);
1237 } else if (pc->ctype == PC_BROADCAST) {
1238 pc->info.broadcast.bc = comm_status_broadcast_server_connect(COMM_STATUS_BROADCAST_ALL);
1239 trym_if(pc->info.broadcast.bc == NULL, "client creation failed");
1242 return (pkgmgr_client *) pc;
1250 API int pkgmgr_client_free(pkgmgr_client *pc)
1253 pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc;
1254 retvm_if(mpc == NULL, PKGMGR_R_EINVAL, "Invalid argument");
1256 if (mpc->ctype == PC_REQUEST) {
1259 for (tmp = mpc->info.request.rhead; tmp;) {
1265 ret = comm_client_free(mpc->info.request.cc);
1266 tryvm_if(ret < 0, ret = PKGMGR_R_ERROR, "comm_client_free() failed");
1267 } else if (mpc->ctype == PC_LISTENING) {
1268 listen_cb_info *tmp;
1269 listen_cb_info *prev;
1270 for (tmp = mpc->info.listening.lhead; tmp;) {
1276 ret = comm_client_free(mpc->info.listening.cc);
1277 tryvm_if(ret < 0, ret = PKGMGR_R_ERROR, "comm_client_free() failed");
1278 } else if (mpc->ctype == PC_BROADCAST) {
1279 comm_status_broadcast_server_disconnect(mpc->info.broadcast.bc);
1282 ERR("Invalid client type\n");
1283 return PKGMGR_R_EINVAL;
1295 return PKGMGR_R_ERROR;
1299 API int pkgmgr_client_usr_install(pkgmgr_client * pc, const char *pkg_type,
1300 const char *descriptor_path, const char *pkg_path,
1301 const char *optional_file, pkgmgr_mode mode,
1302 pkgmgr_handler event_cb, void *data, uid_t uid)
1304 char *pkgtype = NULL;
1305 char *installer_path = NULL;
1306 char *req_key = NULL;
1309 char *argv[PKG_ARGC_MAX] = { NULL, };
1315 char *caller_pkgid = NULL;
1317 caller_pkgid = __get_caller_pkgid(uid);
1318 if (caller_pkgid == NULL)
1319 ERR("caller dont have pkgid..\n");
1321 /* Check for NULL value of pc */
1322 retvm_if(pc == NULL, PKGMGR_R_EINVAL, "package manager client handle is NULL");
1324 /* 0. check the pc type */
1325 pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc;
1326 retvm_if(mpc->ctype != PC_REQUEST, PKGMGR_R_EINVAL, "mpc->ctype is not PC_REQUEST");
1328 /* 1. check argument */
1329 if (descriptor_path) {
1330 retvm_if(strlen(descriptor_path) >= PKG_STRING_LEN_MAX, PKGMGR_R_EINVAL, "descriptor_path over PKG_STRING_LEN_MAX");
1331 retvm_if(access(descriptor_path, F_OK) != 0, PKGMGR_R_EINVAL, "descriptor_path access fail");
1334 retvm_if(pkg_path == NULL, PKGMGR_R_EINVAL, "pkg_path is NULL");
1335 retvm_if(strlen(pkg_path) >= PKG_STRING_LEN_MAX, PKGMGR_R_EINVAL, "pkg_path over PKG_STRING_LEN_MAX");
1336 retvm_if(access(pkg_path, F_OK) != 0, PKGMGR_R_EINVAL, "pkg_path access fail");
1339 retvm_if(strlen(optional_file) >= PKG_STRING_LEN_MAX, PKGMGR_R_EINVAL, "optional_file over PKG_STRING_LEN_MAX");
1341 /* 2. get installer path using pkg_path */
1343 installer_path = _get_backend_path_with_type(pkg_type);
1344 pkgtype = strdup(pkg_type);
1346 installer_path = _get_backend_path(pkg_path);
1347 pkgtype = __get_type_from_path(pkg_path);
1349 if (installer_path == NULL) {
1351 ERR("installer_path is NULL\n");
1352 return PKGMGR_R_EINVAL;
1355 /* 3. generate req_key */
1356 req_key = __get_req_key(pkg_path);
1358 /* 4. add callback info - add callback info to pkgmgr_client */
1359 req_id = _get_request_id();
1360 __add_op_cbinfo(mpc, req_id, req_key, event_cb, NULL, data);
1362 /* 5. generate argv */
1364 /* argv[0] installer path */
1365 argv[argcnt++] = installer_path;
1367 argv[argcnt++] = strdup("-k");
1369 argv[argcnt++] = req_key;
1371 argv[argcnt++] = strdup("-i");
1372 /* argv[(4)] if exists */
1373 if (descriptor_path)
1374 argv[argcnt++] = strdup(descriptor_path);
1376 argv[argcnt++] = strdup(pkg_path);
1377 /* argv[(5)] if exists */
1379 argv[argcnt++] = strdup("-o");
1380 argv[argcnt++] = strdup(optional_file);
1383 argv[argcnt++] = strdup("-p");
1384 argv[argcnt++] = strdup(caller_pkgid);
1387 /*** add quote in all string for special charactor like '\n'*** FIX */
1388 for (i = 0; i < argcnt; i++) {
1389 temp = g_shell_quote(argv[i]);
1390 len += (strlen(temp) + 1);
1394 args = (char *)calloc(len, sizeof(char));
1395 tryvm_if(args == NULL, ret = PKGMGR_R_ERROR, "calloc failed");
1397 strncpy(args, argv[0], len - 1);
1399 for (i = 1; i < argcnt; i++) {
1400 strncat(args, " ", strlen(" "));
1401 temp = g_shell_quote(argv[i]);
1402 strncat(args, temp, strlen(temp));
1405 DBG("[args] %s [len] %d\n", args, len);
1407 /******************* end of quote ************************/
1409 /* 6. request install */
1410 ret = comm_client_request(mpc->info.request.cc, req_key, COMM_REQ_TO_INSTALLER, pkgtype, pkg_path, args, uid, 1);
1411 tryvm_if(ret < 0, ret = PKGMGR_R_ECOMM, "request failed, ret=%d", ret);
1416 for (i = 0; i < argcnt; i++)
1429 API int pkgmgr_client_install(pkgmgr_client * pc, const char *pkg_type,
1430 const char *descriptor_path, const char *pkg_path,
1431 const char *optional_file, pkgmgr_mode mode,
1432 pkgmgr_handler event_cb, void *data)
1436 return pkgmgr_client_usr_install(pc, pkg_type,
1437 descriptor_path, pkg_path, optional_file, mode, event_cb,data, GLOBAL_USER);
1440 API int pkgmgr_client_reinstall(pkgmgr_client * pc, const char *pkg_type, const char *pkgid,
1441 const char *optional_file, pkgmgr_mode mode,
1442 pkgmgr_handler event_cb, void *data)
1444 return pkgmgr_client_usr_reinstall(pc, pkg_type, pkgid, optional_file, mode, event_cb, data,GLOBAL_USER);
1447 API int pkgmgr_client_usr_reinstall(pkgmgr_client * pc, const char *pkg_type, const char *pkgid,
1448 const char *optional_file, pkgmgr_mode mode,
1449 pkgmgr_handler event_cb, void *data, uid_t uid)
1451 char *pkgtype = NULL;
1452 char *installer_path = NULL;
1453 char *req_key = NULL;
1456 char *argv[PKG_ARGC_MAX] = { NULL, };
1463 /* Check for NULL value of pc */
1464 retvm_if(pc == NULL, PKGMGR_R_EINVAL, "package manager client handle is NULL\n");
1466 pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc;
1468 /* 0. check the pc type */
1469 retv_if(mpc->ctype != PC_REQUEST, PKGMGR_R_EINVAL);
1472 /* 1. check argument */
1473 retv_if(pkgid == NULL, PKGMGR_R_EINVAL);
1474 retv_if(strlen(pkgid) >= PKG_STRING_LEN_MAX, PKGMGR_R_EINVAL);
1475 if (optional_file) {
1476 if (strlen(optional_file) >= PKG_STRING_LEN_MAX)
1477 return PKGMGR_R_EINVAL;
1480 /* 2. get installer path using pkg_path */
1481 installer_path = _get_backend_path_with_type(pkg_type);
1482 pkgtype = strdup(pkg_type);
1483 tryvm_if(installer_path == NULL, ret = PKGMGR_R_EINVAL, "installer_path is null");
1485 /* 3. generate req_key */
1486 req_key = __get_req_key(pkgid);
1488 /* 4. add callback info - add callback info to pkgmgr_client */
1489 req_id = _get_request_id();
1490 __add_op_cbinfo(mpc, req_id, req_key, event_cb, NULL, data);
1492 /* 5. generate argv */
1494 /* argv[0] installer path */
1495 argv[argcnt++] = installer_path;
1497 argv[argcnt++] = strdup("-k");
1499 argv[argcnt++] = req_key;
1501 argv[argcnt++] = strdup("-r");
1503 argv[argcnt++] = strdup(pkgid);
1504 /* argv[(5)] if exists */
1506 argv[argcnt++] = strdup("-o");
1507 argv[argcnt++] = strdup(optional_file);
1510 /*** add quote in all string for special charactor like '\n'*** FIX */
1511 for (i = 0; i < argcnt; i++) {
1512 temp = g_shell_quote(argv[i]);
1513 len += (strlen(temp) + 1);
1517 args = (char *)calloc(len, sizeof(char));
1518 tryvm_if(args == NULL, ret = PKGMGR_R_ERROR, "calloc failed");
1520 strncpy(args, argv[0], len - 1);
1522 for (i = 1; i < argcnt; i++) {
1523 strncat(args, " ", strlen(" "));
1524 temp = g_shell_quote(argv[i]);
1525 strncat(args, temp, strlen(temp));
1528 DBG("[args] %s [len] %d\n", args, len);
1530 /******************* end of quote ************************/
1532 /* 6. request install */
1533 ret = comm_client_request(mpc->info.request.cc, req_key, COMM_REQ_TO_INSTALLER, pkgtype, pkgid, args, uid, 1);
1534 tryvm_if(ret < 0, ret = PKGMGR_R_ECOMM, "request failed");
1539 for (i = 0; i < argcnt; i++)
1550 API int pkgmgr_client_uninstall(pkgmgr_client *pc, const char *pkg_type,
1551 const char *pkgid, pkgmgr_mode mode,
1552 pkgmgr_handler event_cb, void *data)
1554 return pkgmgr_client_usr_uninstall(pc, pkg_type,pkgid, mode, event_cb, data, GLOBAL_USER);
1556 API int pkgmgr_client_usr_uninstall(pkgmgr_client *pc, const char *pkg_type,
1557 const char *pkgid, pkgmgr_mode mode,
1558 pkgmgr_handler event_cb, void *data, uid_t uid)
1561 char *installer_path;
1565 char *argv[PKG_ARGC_MAX] = { NULL, };
1571 bool removable = false;
1572 char *caller_pkgid = NULL;
1574 caller_pkgid = __get_caller_pkgid(uid);
1575 if (caller_pkgid == NULL)
1576 DBG("caller dont have pkgid..\n");
1578 /* Check for NULL value of pc */
1579 retvm_if(pc == NULL, PKGMGR_R_EINVAL, "package manager client handle is NULL\n");
1581 pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc;
1583 /* 0. check the pc type */
1584 retv_if(mpc->ctype != PC_REQUEST, PKGMGR_R_EINVAL);
1586 /* 1. check argument */
1587 retv_if(pkgid == NULL, PKGMGR_R_EINVAL);
1589 pkgmgrinfo_pkginfo_h handle;
1590 ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(pkgid, uid, &handle);
1592 /*check package id */
1593 tryvm_if(ret < 0, ret = PKGMGR_R_EINVAL, "pkgmgrinfo_pkginfo_get_pkginfo fail");
1594 tryvm_if(handle == NULL, ret = PKGMGR_R_EINVAL, "Pkgid(%s) can not find in installed pkg DB! \n", pkgid);
1596 if (uid != GLOBAL_USER) {
1597 /*check running app , terminate app if it is running*/
1598 ret = pkgmgrinfo_appinfo_get_usr_list(handle, PMINFO_UI_APP, __app_list_cb, NULL, uid);
1599 tryvm_if(ret < 0, ret = PKGMGR_R_EINVAL, "pkgmgrinfo_appinfo_get_list : PMINFO_UI_APP fail");
1601 /*check running app , terminate app if it is running*/
1602 ret = pkgmgrinfo_appinfo_get_usr_list(handle, PMINFO_SVC_APP, __app_list_cb, NULL, uid);
1603 tryvm_if(ret < 0, ret = PKGMGR_R_EINVAL, "pkgmgrinfo_appinfo_get_list : PMINFO_SVC_APP fail");
1605 /*check running app , terminate app if it is running*/
1606 ret = pkgmgrinfo_appinfo_get_list(handle, PMINFO_UI_APP, __app_list_cb, NULL);
1607 tryvm_if(ret < 0, ret = PKGMGR_R_EINVAL, "pkgmgrinfo_appinfo_get_list : PMINFO_UI_APP fail");
1609 /*check running app , terminate app if it is running*/
1610 ret = pkgmgrinfo_appinfo_get_list(handle, PMINFO_SVC_APP, __app_list_cb, NULL);
1611 tryvm_if(ret < 0, ret = PKGMGR_R_EINVAL, "pkgmgrinfo_appinfo_get_list : PMINFO_SVC_APP fail");
1614 ret = pkgmgrinfo_pkginfo_get_type(handle, &pkgtype);
1615 tryvm_if(ret < 0, ret = PKGMGR_R_EINVAL, "pkgmgrinfo_pkginfo_get_type fail");
1616 tryvm_if(pkgtype == NULL, ret = PKGMGR_R_ERROR, "pkgtype is NULL");
1618 /*check removable, execpt "rpm" type */
1619 if (strcmp(pkgtype, "rpm")) {
1620 pkgmgrinfo_pkginfo_is_removable(handle, &removable);
1621 tryvm_if(removable == false, ret = PKGMGR_R_ERROR, "Pkgid(%s) can not be removed, This is non-removalbe package...\n", pkgid);
1624 /*check pkgid length */
1625 tryvm_if(strlen(pkgid) >= PKG_STRING_LEN_MAX, ret = PKGMGR_R_EINVAL, "pkgid is too long");
1627 /* 2. get installer path using pkgtype */
1628 installer_path = _get_backend_path_with_type(pkgtype);
1629 tryvm_if(installer_path == NULL, ret = PKGMGR_R_EINVAL, "installer_path fail");
1631 /* 3. generate req_key */
1632 req_key = __get_req_key(pkgid);
1634 /* 4. add callback info - add callback info to pkgmgr_client */
1635 req_id = _get_request_id();
1636 __add_op_cbinfo(mpc, req_id, req_key, event_cb, NULL, data);
1638 /* 5. generate argv */
1640 /* argv[0] installer path */
1641 argv[argcnt++] = installer_path;
1643 argv[argcnt++] = strdup("-k");
1645 argv[argcnt++] = req_key;
1647 argv[argcnt++] = strdup("-d");
1649 argv[argcnt++] = strdup(pkgid);
1651 argv[argcnt++] = strdup("-p");
1652 argv[argcnt++] = caller_pkgid;
1655 /*** add quote in all string for special charactor like '\n'*** FIX */
1656 for (i = 0; i < argcnt; i++) {
1657 temp = g_shell_quote(argv[i]);
1658 len += (strlen(temp) + 1);
1662 args = (char *)calloc(len, sizeof(char));
1663 tryvm_if(args == NULL, ret = PKGMGR_R_ERROR, "calloc failed");
1665 strncpy(args, argv[0], len - 1);
1667 for (i = 1; i < argcnt; i++) {
1668 strncat(args, " ", strlen(" "));
1669 temp = g_shell_quote(argv[i]);
1670 strncat(args, temp, strlen(temp));
1673 DBG("[args] %s [len] %d\n", args, len);
1675 /******************* end of quote ************************/
1677 /* 6. request install */
1678 ret = comm_client_request(mpc->info.request.cc, req_key, COMM_REQ_TO_INSTALLER, pkgtype, pkgid, args, uid, 1);
1679 tryvm_if(ret < 0, ret = PKGMGR_R_ECOMM, "calloc failed");
1684 for (i = 0; i < argcnt; i++)
1690 pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
1694 API int pkgmgr_client_move(pkgmgr_client *pc, const char *pkg_type,
1695 const char *pkgid, pkgmgr_move_type move_type, pkgmgr_mode mode)
1697 return pkgmgr_client_usr_move( pc,pkg_type, pkgid, move_type, mode, GLOBAL_USER);
1699 API int pkgmgr_client_usr_move(pkgmgr_client *pc, const char *pkg_type,
1700 const char *pkgid, pkgmgr_move_type move_type, pkgmgr_mode mode, uid_t uid)
1702 const char *pkgtype = NULL;
1703 char *installer_path = NULL;
1704 char *req_key = NULL;
1706 char *argv[PKG_ARGC_MAX] = { NULL, };
1713 char buf[128] = {'\0'};
1715 /* Check for NULL value of pc */
1717 DBG("package manager client handle is NULL\n");
1718 return PKGMGR_R_EINVAL;
1720 pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc;
1721 /*check the pc type */
1722 if (mpc->ctype != PC_REQUEST)
1723 return PKGMGR_R_EINVAL;
1727 return PKGMGR_R_EINVAL;
1729 if (pkg_type == NULL) {
1730 pkgtype = _get_pkg_type_from_desktop_file(pkgid, uid);
1731 if (pkgtype == NULL)
1732 return PKGMGR_R_EINVAL;
1736 if (strlen(pkgid) >= PKG_STRING_LEN_MAX)
1737 return PKGMGR_R_EINVAL;
1739 if ((move_type < PM_MOVE_TO_INTERNAL) || (move_type > PM_MOVE_TO_SDCARD))
1740 return PKGMGR_R_EINVAL;
1742 /* get installer path using pkg_path */
1743 installer_path = _get_backend_path_with_type(pkgtype);
1744 if (installer_path == NULL)
1745 return PKGMGR_R_EINVAL;
1747 /* generate req_key */
1748 req_key = __get_req_key(pkgid);
1749 req_id = _get_request_id();
1752 snprintf(buf, 128, "%d", move_type);
1753 /* argv[0] installer path */
1754 argv[argcnt++] = installer_path;
1756 argv[argcnt++] = strdup("-k");
1758 argv[argcnt++] = req_key;
1760 argv[argcnt++] = strdup("-m");
1762 argv[argcnt++] = strdup(pkgid);
1764 argv[argcnt++] = strdup("-t");
1766 argv[argcnt++] = strdup(buf);
1768 /*** add quote in all string for special charactor like '\n'*** FIX */
1769 for (i = 0; i < argcnt; i++) {
1770 temp = g_shell_quote(argv[i]);
1771 len += (strlen(temp) + 1);
1775 args = (char *)calloc(len, sizeof(char));
1777 DBG("calloc failed");
1779 for (i = 0; i < argcnt; i++)
1782 return PKGMGR_R_ERROR;
1784 strncpy(args, argv[0], len - 1);
1786 for (i = 1; i < argcnt; i++) {
1787 strncat(args, " ", strlen(" "));
1788 temp = g_shell_quote(argv[i]);
1789 strncat(args, temp, strlen(temp));
1792 DBG("[args] %s [len] %d\n", args, len);
1793 /******************* end of quote ************************/
1795 /* 6. request install */
1796 ret = comm_client_request(mpc->info.request.cc, req_key,
1797 COMM_REQ_TO_MOVER, pkgtype, pkgid,
1800 ERR("request failed, ret=%d\n", ret);
1802 for (i = 0; i < argcnt; i++)
1806 return PKGMGR_R_ECOMM;
1809 for (i = 0; i < argcnt; i++)
1818 API int pkgmgr_client_move_pkg(pkgmgr_client *pc, const char *pkg_type,
1819 const char *pkgid, pkgmgr_move_type move_type, pkgmgr_mode mode,
1820 pkgmgr_handler event_cb, void *data)
1822 return pkgmgr_client_move_usr_pkg(pc, pkg_type, pkgid, GLOBAL_USER, move_type, mode, event_cb, data);
1825 API int pkgmgr_client_move_usr_pkg(pkgmgr_client *pc, const char *pkg_type,
1826 const char *pkgid, uid_t uid, pkgmgr_move_type move_type, pkgmgr_mode mode,
1827 pkgmgr_handler event_cb, void *data)
1830 char *installer_path;
1834 char *argv[PKG_ARGC_MAX] = { NULL, };
1840 char buf[128] = {'\0'};
1842 /* Check for NULL value of pc */
1843 retvm_if(pc == NULL, PKGMGR_R_EINVAL, "package manager client handle is NULL\n");
1845 pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc;
1847 /* 0. check the pc type */
1848 retv_if(mpc->ctype != PC_REQUEST, PKGMGR_R_EINVAL);
1850 /* 1. check argument */
1851 retv_if(pkgid == NULL, PKGMGR_R_EINVAL);
1853 pkgmgrinfo_pkginfo_h handle;
1854 if (uid != GLOBAL_USER)
1855 ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(pkgid, uid, &handle);
1857 ret = pkgmgrinfo_pkginfo_get_pkginfo(pkgid, &handle);
1859 /*check package id */
1860 tryvm_if(ret < 0, ret = PKGMGR_R_EINVAL, "pkgmgrinfo_pkginfo_get_pkginfo fail");
1861 tryvm_if(handle == NULL, ret = PKGMGR_R_EINVAL, "Pkgid(%s) can not find in installed pkg DB! \n", pkgid);
1863 if (uid != GLOBAL_USER) {
1864 /*check running app , terminate app if it is running*/
1865 ret = pkgmgrinfo_appinfo_get_usr_list(handle, PMINFO_UI_APP, __app_list_cb, NULL, uid);
1866 tryvm_if(ret < 0, ret = PKGMGR_R_EINVAL, "pkgmgrinfo_appinfo_get_list : PMINFO_UI_APP fail");
1868 /*check running app , terminate app if it is running*/
1869 ret = pkgmgrinfo_appinfo_get_usr_list(handle, PMINFO_SVC_APP, __app_list_cb, NULL, uid);
1870 tryvm_if(ret < 0, ret = PKGMGR_R_EINVAL, "pkgmgrinfo_appinfo_get_list : PMINFO_SVC_APP fail");
1873 /*check running app , terminate app if it is running*/
1874 ret = pkgmgrinfo_appinfo_get_list(handle, PMINFO_UI_APP, __app_list_cb, NULL);
1875 tryvm_if(ret < 0, ret = PKGMGR_R_EINVAL, "pkgmgrinfo_appinfo_get_list : PMINFO_UI_APP fail");
1876 /*check running app , terminate app if it is running*/
1877 ret = pkgmgrinfo_appinfo_get_list(handle, PMINFO_SVC_APP, __app_list_cb, NULL);
1878 tryvm_if(ret < 0, ret = PKGMGR_R_EINVAL, "pkgmgrinfo_appinfo_get_list : PMINFO_SVC_APP fail");
1881 ret = pkgmgrinfo_pkginfo_get_type(handle, &pkgtype);
1882 tryvm_if(ret < 0, ret = PKGMGR_R_EINVAL, "pkgmgrinfo_pkginfo_get_type fail");
1883 tryvm_if(pkgtype == NULL, ret = PKGMGR_R_ERROR, "pkgtype is NULL");
1885 /*check pkgid length */
1886 tryvm_if(strlen(pkgid) >= PKG_STRING_LEN_MAX, ret = PKGMGR_R_EINVAL, "pkgid is too long");
1888 /*check move_type */
1889 tryvm_if((move_type < PM_MOVE_TO_INTERNAL) || (move_type > PM_MOVE_TO_SDCARD), ret = PKGMGR_R_EINVAL, "move_type is not supported");
1891 /* 2. get installer path using pkgtype */
1892 installer_path = _get_backend_path_with_type(pkgtype);
1893 tryvm_if(installer_path == NULL, ret = PKGMGR_R_EINVAL, "installer_path fail");
1895 /* 3. generate req_key */
1896 req_key = __get_req_key(pkgid);
1898 /* 4. add callback info - add callback info to pkgmgr_client */
1899 req_id = _get_request_id();
1900 __add_op_cbinfo(mpc, req_id, req_key, event_cb, NULL, data);
1902 /* 5. generate argv */
1903 snprintf(buf, 128, "%d", move_type);
1904 /* argv[0] installer path */
1905 argv[argcnt++] = installer_path;
1907 argv[argcnt++] = strdup("-k");
1909 argv[argcnt++] = req_key;
1911 argv[argcnt++] = strdup("-m");
1913 argv[argcnt++] = strdup(pkgid);
1915 argv[argcnt++] = strdup("-t");
1917 argv[argcnt++] = strdup(buf);
1919 /*** add quote in all string for special charactor like '\n'*** FIX */
1920 for (i = 0; i < argcnt; i++) {
1921 temp = g_shell_quote(argv[i]);
1922 len += (strlen(temp) + 1);
1926 args = (char *)calloc(len, sizeof(char));
1927 tryvm_if(args == NULL, ret = PKGMGR_R_ERROR, "calloc failed");
1929 strncpy(args, argv[0], len - 1);
1931 for (i = 1; i < argcnt; i++) {
1932 strncat(args, " ", strlen(" "));
1933 temp = g_shell_quote(argv[i]);
1934 strncat(args, temp, strlen(temp));
1937 DBG("[args] %s [len] %d\n", args, len);
1939 /******************* end of quote ************************/
1941 /* 6. request install */
1942 ret = comm_client_request(mpc->info.request.cc, req_key, COMM_REQ_TO_MOVER, pkgtype, pkgid, args, uid, 1);
1943 tryvm_if(ret < 0, ret = PKGMGR_R_ECOMM, "calloc failed");
1948 for (i = 0; i < argcnt; i++)
1954 pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
1958 API int pkgmgr_client_activate(pkgmgr_client * pc, const char *pkg_type,
1961 return pkgmgr_client_usr_activate(pc, pkg_type, pkgid, GLOBAL_USER);
1964 API int pkgmgr_client_usr_activate(pkgmgr_client * pc, const char *pkg_type,
1965 const char *pkgid, uid_t uid)
1967 const char *pkgtype;
1970 /* Check for NULL value of pc */
1971 retvm_if(pc == NULL, PKGMGR_R_EINVAL, "package manager client handle is NULL\n");
1973 pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc;
1975 /* 0. check the pc type */
1976 retvm_if(mpc->ctype != PC_REQUEST, PKGMGR_R_EINVAL, "mpc->ctype is not PC_REQUEST");
1978 /* 1. check argument */
1979 retvm_if(pkgid == NULL, PKGMGR_R_EINVAL, "pkgid is NULL");
1980 retvm_if(strlen(pkgid) >= PKG_STRING_LEN_MAX, PKGMGR_R_EINVAL, "pkgid length over PKG_STRING_LEN_MAX ");
1982 if (pkg_type == NULL) {
1983 pkgtype = _get_pkg_type_from_desktop_file(pkgid, uid);
1984 retvm_if(pkgtype == NULL, PKGMGR_R_EINVAL, "pkgtype is NULL");
1988 /* 2. generate req_key */
1989 req_key = __get_req_key(pkgid);
1990 retvm_if(req_key == NULL, PKGMGR_R_EINVAL, "req_key is NULL");
1992 /* 3. request activate */
1993 ret = comm_client_request(mpc->info.request.cc, req_key, COMM_REQ_TO_ACTIVATOR, pkgtype, pkgid, "1 PKG", uid, 1);
1994 tryvm_if(ret < 0, ret = PKGMGR_R_ECOMM, "request failed, ret=%d", ret);
2003 API int pkgmgr_client_deactivate(pkgmgr_client *pc, const char *pkg_type,
2006 return pkgmgr_client_usr_deactivate(pc, pkg_type, pkgid, GLOBAL_USER);
2009 API int pkgmgr_client_usr_deactivate(pkgmgr_client *pc, const char *pkg_type,
2010 const char *pkgid, uid_t uid)
2012 const char *pkgtype;
2015 /* Check for NULL value of pc */
2016 retvm_if(pc == NULL, PKGMGR_R_EINVAL, "package manager client handle is NULL\n");
2018 pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc;
2020 /* 0. check the pc type */
2021 retvm_if(mpc->ctype != PC_REQUEST, PKGMGR_R_EINVAL, "mpc->ctype is not PC_REQUEST");
2023 /* 1. check argument */
2024 retvm_if(pkgid == NULL, PKGMGR_R_EINVAL, "pkgid is NULL");
2025 retvm_if(strlen(pkgid) >= PKG_STRING_LEN_MAX, PKGMGR_R_EINVAL, "pkgid length over PKG_STRING_LEN_MAX ");
2027 if (pkg_type == NULL) {
2028 pkgtype = _get_pkg_type_from_desktop_file(pkgid, uid);
2029 if (pkgtype == NULL)
2030 return PKGMGR_R_EINVAL;
2034 /* 2. generate req_key */
2035 req_key = __get_req_key(pkgid);
2036 retvm_if(req_key == NULL, PKGMGR_R_EINVAL, "req_key is NULL");
2038 /* 3. request activate */
2039 ret = comm_client_request(mpc->info.request.cc, req_key, COMM_REQ_TO_ACTIVATOR, pkgtype, pkgid, "0 PKG", uid, 1);
2040 tryvm_if(ret < 0, ret = PKGMGR_R_ECOMM, "request failed, ret=%d", ret);
2049 API int pkgmgr_client_activate_app(pkgmgr_client * pc, const char *appid)
2051 return pkgmgr_client_usr_activate_app(pc,appid, GLOBAL_USER);
2054 API int pkgmgr_client_usr_activate_app(pkgmgr_client * pc, const char *appid, uid_t uid)
2056 const char *pkgtype;
2059 /* Check for NULL value of pc */
2060 retvm_if(pc == NULL, PKGMGR_R_EINVAL, "package manager client handle is NULL\n");
2062 pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc;
2064 /* 0. check the pc type */
2065 retvm_if(mpc->ctype != PC_REQUEST, PKGMGR_R_EINVAL, "mpc->ctype is not PC_REQUEST");
2067 /* 1. check argument */
2068 retvm_if(appid == NULL, PKGMGR_R_EINVAL, "pkgid is NULL");
2069 retvm_if(strlen(appid) >= PKG_STRING_LEN_MAX, PKGMGR_R_EINVAL, "pkgid length over PKG_STRING_LEN_MAX ");
2071 pkgtype = _get_pkg_type_from_desktop_file(appid, uid);
2072 retvm_if(pkgtype == NULL, PKGMGR_R_EINVAL, "pkgtype is NULL");
2074 /* 2. generate req_key */
2075 req_key = __get_req_key(appid);
2076 retvm_if(req_key == NULL, PKGMGR_R_EINVAL, "req_key is NULL");
2078 /* 3. request activate */
2079 ret = comm_client_request(mpc->info.request.cc, req_key, COMM_REQ_TO_ACTIVATOR, pkgtype, appid, "1 APP", uid, 1);
2080 tryvm_if(ret < 0, ret = PKGMGR_R_ECOMM, "request failed, ret=%d", ret);
2089 API int pkgmgr_client_activate_appv(pkgmgr_client * pc, const char *appid, char *const argv[])
2091 return pkgmgr_client_usr_activate_appv(pc, appid, argv, GLOBAL_USER);
2094 API int pkgmgr_client_usr_activate_appv(pkgmgr_client * pc, const char *appid, char *const argv[], uid_t uid)
2096 const char *pkgtype;
2105 /* Check for NULL value of pc */
2106 retvm_if(pc == NULL, PKGMGR_R_EINVAL, "package manager client handle is NULL\n");
2108 pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc;
2110 /* 0. check the pc type */
2111 retvm_if(mpc->ctype != PC_REQUEST, PKGMGR_R_EINVAL, "mpc->ctype is not PC_REQUEST");
2113 /* 1. check argument */
2114 retvm_if(appid == NULL, PKGMGR_R_EINVAL, "pkgid is NULL");
2115 retvm_if(strlen(appid) >= PKG_STRING_LEN_MAX, PKGMGR_R_EINVAL, "pkgid length over PKG_STRING_LEN_MAX ");
2117 pkgtype = _get_pkg_type_from_desktop_file(appid, uid);
2118 retvm_if(pkgtype == NULL, PKGMGR_R_EINVAL, "pkgtype is NULL");
2120 /* 2. generate req_key */
2121 req_key = __get_req_key(appid);
2122 retvm_if(req_key == NULL, PKGMGR_R_EINVAL, "req_key is NULL");
2124 /*** add quote in all string for special charactor like '\n'*** FIX */
2126 for (i = 0; argv[i]; i++) {
2127 temp = g_shell_quote(argv[i]);
2128 len += (strlen(temp) + 1);
2134 args = (char *)calloc(len, sizeof(char));
2135 tryvm_if(args == NULL, ret = PKGMGR_R_ERROR, "calloc failed");
2136 strncpy(args, argv[0], len - 1);
2138 for (i = 1; i < argcnt; i++) {
2139 strncat(args, " ", strlen(" "));
2140 temp = g_shell_quote(argv[i]);
2141 strncat(args, temp, strlen(temp));
2147 argsr = (char *)calloc(strlen("1 APP")+2+len, sizeof(char));
2148 tryvm_if(argsr == NULL, ret = PKGMGR_R_ERROR, "calloc failed");
2150 strncpy(argsr, "1 APP", strlen("1 APP"));
2152 strncat(argsr, " ", strlen(" "));
2153 strncat(argsr, args, strlen(args));
2156 DBG("argsr [%s]\n", argsr);
2157 /******************* end of quote ************************/
2159 /* 3. request activate */
2160 ret = comm_client_request(mpc->info.request.cc, req_key, COMM_REQ_TO_ACTIVATOR, pkgtype, appid, argsr, uid, 1);
2161 tryvm_if(ret < 0, ret = PKGMGR_R_ECOMM, "request failed, ret=%d", ret);
2175 API int pkgmgr_client_deactivate_app(pkgmgr_client *pc, const char *appid)
2177 return pkgmgr_client_usr_deactivate_app(pc, appid, GLOBAL_USER);
2180 API int pkgmgr_client_usr_deactivate_app(pkgmgr_client *pc, const char *appid, uid_t uid)
2182 const char *pkgtype;
2185 /* Check for NULL value of pc */
2186 retvm_if(pc == NULL, PKGMGR_R_EINVAL, "package manager client handle is NULL\n");
2188 pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc;
2190 /* 0. check the pc type */
2191 retvm_if(mpc->ctype != PC_REQUEST, PKGMGR_R_EINVAL, "mpc->ctype is not PC_REQUEST");
2193 /* 1. check argument */
2194 retvm_if(appid == NULL, PKGMGR_R_EINVAL, "pkgid is NULL");
2195 retvm_if(strlen(appid) >= PKG_STRING_LEN_MAX, PKGMGR_R_EINVAL, "pkgid length over PKG_STRING_LEN_MAX ");
2197 pkgtype = _get_pkg_type_from_desktop_file(appid, uid);
2198 retvm_if(pkgtype == NULL, PKGMGR_R_EINVAL, "pkgtype is NULL");
2200 /* 2. generate req_key */
2201 req_key = __get_req_key(appid);
2202 retvm_if(req_key == NULL, PKGMGR_R_EINVAL, "req_key is NULL");
2204 /* 3. request activate */
2205 ret = comm_client_request(mpc->info.request.cc, req_key, COMM_REQ_TO_ACTIVATOR, pkgtype, appid, "0 APP", uid, 1);
2206 tryvm_if(ret < 0, ret = PKGMGR_R_ECOMM, "request failed, ret=%d", ret);
2215 API int pkgmgr_client_clear_user_data(pkgmgr_client *pc, const char *pkg_type,
2216 const char *appid, pkgmgr_mode mode)
2218 return pkgmgr_client_usr_clear_user_data(pc, pkg_type, appid,mode, GLOBAL_USER);
2220 API int pkgmgr_client_usr_clear_user_data(pkgmgr_client *pc, const char *pkg_type,
2221 const char *appid, pkgmgr_mode mode, uid_t uid)
2223 const char *pkgtype;
2224 char *installer_path;
2227 char *argv[PKG_ARGC_MAX] = { NULL, };
2234 /* Check for NULL value of pc */
2236 DBG("package manager client handle is NULL\n");
2237 return PKGMGR_R_EINVAL;
2239 pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc;
2241 /* 0. check the pc type */
2242 if (mpc->ctype != PC_REQUEST)
2243 return PKGMGR_R_EINVAL;
2245 /* 1. check argument */
2247 return PKGMGR_R_EINVAL;
2250 if (pkg_type == NULL) {
2251 pkgtype = _get_pkg_type_from_desktop_file(appid, uid);
2252 if (pkgtype == NULL)
2253 return PKGMGR_R_EINVAL;
2257 if (strlen(appid) >= PKG_STRING_LEN_MAX)
2258 return PKGMGR_R_EINVAL;
2260 /* 2. get installer path using pkg_path */
2261 installer_path = _get_backend_path_with_type(pkgtype);
2262 if (installer_path == NULL)
2263 return PKGMGR_R_EINVAL;
2265 /* 3. generate req_key */
2266 req_key = __get_req_key(appid);
2268 /* 4. generate argv */
2270 /* argv[0] installer path */
2271 argv[argcnt++] = installer_path;
2273 argv[argcnt++] = strdup("-k");
2275 argv[argcnt++] = req_key;
2277 argv[argcnt++] = strdup("-c");
2279 argv[argcnt++] = strdup(appid);
2281 /*** add quote in all string for special charactor like '\n'*** FIX */
2282 for (i = 0; i < argcnt; i++) {
2283 temp = g_shell_quote(argv[i]);
2284 len += (strlen(temp) + 1);
2288 args = (char *)calloc(len, sizeof(char));
2290 DBG("calloc failed");
2292 for (i = 0; i < argcnt; i++)
2295 return PKGMGR_R_ERROR;
2297 strncpy(args, argv[0], len - 1);
2299 for (i = 1; i < argcnt; i++) {
2300 strncat(args, " ", strlen(" "));
2301 temp = g_shell_quote(argv[i]);
2302 strncat(args, temp, strlen(temp));
2305 DBG("[args] %s [len] %d\n", args, len);
2306 /******************* end of quote ************************/
2308 /* 6. request clear */
2309 ret = comm_client_request(mpc->info.request.cc, req_key,
2310 COMM_REQ_TO_CLEARER, pkgtype, appid,
2313 ERR("request failed, ret=%d\n", ret);
2315 for (i = 0; i < argcnt; i++)
2319 return PKGMGR_R_ECOMM;
2322 for (i = 0; i < argcnt; i++)
2331 API int pkgmgr_client_set_status_type(pkgmgr_client *pc, int status_type)
2335 retvm_if(pc == NULL, PKGMGR_R_EINVAL, "package manager client pc is NULL");
2336 retvm_if(status_type == PKGMGR_CLIENT_STATUS_ALL, PKGMGR_R_OK, "status_type is PKGMGR_CLIENT_STATUS_ALL");
2337 pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc;
2339 /* free listening head */
2340 listen_cb_info *tmp = NULL;
2341 listen_cb_info *prev = NULL;
2342 for (tmp = mpc->info.listening.lhead; tmp;) {
2348 /* free dbus connection */
2349 ret = comm_client_free(mpc->info.listening.cc);
2350 retvm_if(ret < 0, PKGMGR_R_ERROR, "comm_client_free() failed - %d", ret);
2352 /* Manage pc for seperated event */
2353 mpc->ctype = PC_LISTENING;
2354 mpc->status_type = status_type;
2356 mpc->info.listening.cc = comm_client_new();
2357 retvm_if(mpc->info.listening.cc == NULL, PKGMGR_R_EINVAL, "client creation failed");
2359 if ((mpc->status_type & PKGMGR_CLIENT_STATUS_INSTALL) == PKGMGR_CLIENT_STATUS_INSTALL) {
2360 ret = comm_client_set_status_callback(COMM_STATUS_BROADCAST_INSTALL, mpc->info.listening.cc, __status_callback, pc);
2361 retvm_if(ret < 0, PKGMGR_R_ECOMM, "PKGMGR_CLIENT_STATUS_INSTALL failed - %d", ret);
2364 if ((mpc->status_type & PKGMGR_CLIENT_STATUS_UNINSTALL) == PKGMGR_CLIENT_STATUS_UNINSTALL) {
2365 ret = comm_client_set_status_callback(COMM_STATUS_BROADCAST_UNINSTALL, mpc->info.listening.cc, __status_callback, pc);
2366 retvm_if(ret < 0, PKGMGR_R_ECOMM, "COMM_STATUS_BROADCAST_UNINSTALL failed - %d", ret);
2369 if ((mpc->status_type & PKGMGR_CLIENT_STATUS_MOVE) == PKGMGR_CLIENT_STATUS_MOVE) {
2370 ret = comm_client_set_status_callback(COMM_STATUS_BROADCAST_MOVE, mpc->info.listening.cc, __status_callback, pc);
2371 retvm_if(ret < 0, PKGMGR_R_ECOMM, "COMM_STATUS_BROADCAST_MOVE failed - %d", ret);
2374 if ((mpc->status_type & PKGMGR_CLIENT_STATUS_INSTALL_PROGRESS) == PKGMGR_CLIENT_STATUS_INSTALL_PROGRESS) {
2375 ret = comm_client_set_status_callback(COMM_STATUS_BROADCAST_INSTALL_PROGRESS, mpc->info.listening.cc, __status_callback, pc);
2376 retvm_if(ret < 0, PKGMGR_R_ECOMM, "COMM_STATUS_BROADCAST_INSTALL_PROGRESS failed - %d", ret);
2379 if ((mpc->status_type & PKGMGR_CLIENT_STATUS_UPGRADE) == PKGMGR_CLIENT_STATUS_UPGRADE) {
2380 ret = comm_client_set_status_callback(COMM_STATUS_BROADCAST_UPGRADE, mpc->info.listening.cc, __status_callback, pc);
2381 retvm_if(ret < 0, PKGMGR_R_ECOMM, "COMM_STATUS_BROADCAST_UPGRADE failed - %d", ret);
2387 API int pkgmgr_client_listen_status(pkgmgr_client *pc, pkgmgr_handler event_cb,
2391 /* Check for NULL value of pc */
2392 retvm_if(pc == NULL, PKGMGR_R_EINVAL, "package manager client pc is NULL");
2393 pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc;
2395 /* 0. check input */
2396 retvm_if(mpc->ctype != PC_LISTENING, PKGMGR_R_EINVAL, "ctype is not PC_LISTENING");
2397 retvm_if(event_cb == NULL, PKGMGR_R_EINVAL, "event_cb is NULL");
2400 req_id = _get_request_id();
2402 /* 2. add callback info to pkgmgr_client */
2403 __add_stat_cbinfo(mpc, req_id, event_cb, data);
2407 API int pkgmgr_client_broadcast_status(pkgmgr_client *pc, const char *pkg_type,
2408 const char *pkgid, const char *key,
2411 /* Check for NULL value of pc */
2413 DBG("package manager client handle is NULL\n");
2414 return PKGMGR_R_EINVAL;
2416 /* Check for valid arguments. NULL parameter causes DBUS to abort */
2417 if (pkgid == NULL || pkg_type == NULL || key == NULL || val == NULL) {
2418 DBG("Argument supplied is NULL\n");
2419 return PKGMGR_R_EINVAL;
2421 pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc;
2423 /* 0. check the pc type */
2424 if (mpc->ctype != PC_BROADCAST)
2425 return PKGMGR_R_EINVAL;
2427 comm_status_broadcast_server_send_signal(COMM_STATUS_BROADCAST_ALL, mpc->info.broadcast.bc,
2428 getuid(), PKG_STATUS,
2429 pkg_type, pkgid, key, val);
2434 API pkgmgr_info *pkgmgr_client_check_pkginfo_from_file(const char *pkg_path)
2436 return pkgmgr_info_new_from_file(NULL, pkg_path);
2439 API int pkgmgr_client_free_pkginfo(pkgmgr_info * pkg_info)
2441 if (pkg_info == NULL)
2442 return PKGMGR_R_EINVAL;
2444 package_manager_pkg_detail_info_t *info = (package_manager_pkg_detail_info_t *)pkg_info;
2447 free(info->icon_buf);
2455 API int pkgmgr_client_request_service(pkgmgr_request_service_type service_type, int service_mode,
2456 pkgmgr_client * pc, const char *pkg_type, const char *pkgid,
2457 const char *custom_info, pkgmgr_handler event_cb, void *data)
2459 return pkgmgr_client_usr_request_service(service_type, service_mode, pc, pkg_type, pkgid, GLOBAL_USER, custom_info, event_cb, data);
2462 API int pkgmgr_client_usr_request_service(pkgmgr_request_service_type service_type, int service_mode,
2463 pkgmgr_client * pc, const char *pkg_type, const char *pkgid, uid_t uid,
2464 const char *custom_info, pkgmgr_handler event_cb, void *data)
2468 /* Check for NULL value of service type */
2469 retvm_if(service_type > PM_REQUEST_MAX, PKGMGR_R_EINVAL, "service type is not defined\n");
2470 retvm_if(service_type < 0, PKGMGR_R_EINVAL, "service type is error\n");
2472 switch (service_type) {
2473 case PM_REQUEST_CSC:
2474 tryvm_if(custom_info == NULL, ret = PKGMGR_R_EINVAL, "custom_info is NULL\n");
2475 tryvm_if(strlen(custom_info) >= PKG_STRING_LEN_MAX, ret = PKGMGR_R_EINVAL, "optional_file over PKG_STRING_LEN_MAX");
2476 tryvm_if(data == NULL, ret = PKGMGR_R_EINVAL, "data is NULL\n");
2478 ret = __csc_process(custom_info, (char *)data);
2480 ERR("__csc_process fail \n");
2486 case PM_REQUEST_MOVE:
2487 tryvm_if(pkgid == NULL, ret = PKGMGR_R_EINVAL, "pkgid is NULL\n");
2488 tryvm_if(pc == NULL, ret = PKGMGR_R_EINVAL, "pc is NULL\n");
2489 tryvm_if((service_mode < PM_MOVE_TO_INTERNAL) || (service_mode > PM_MOVE_TO_SDCARD), ret = PKGMGR_R_EINVAL, "service_mode is wrong\n");
2491 ret = __move_pkg_process(pc, pkgid, uid, (pkgmgr_move_type)service_mode, event_cb, data);
2494 case PM_REQUEST_GET_SIZE:
2495 tryvm_if(pkgid == NULL, ret = PKGMGR_R_EINVAL, "pkgid is NULL\n");
2496 tryvm_if(pc == NULL, ret = PKGMGR_R_EINVAL, "pc is NULL\n");
2497 tryvm_if((service_mode < PM_GET_TOTAL_SIZE) || (service_mode >= PM_GET_MAX), ret = PKGMGR_R_EINVAL, "service_mode is wrong\n");
2499 ret = __get_size_process(pc, pkgid, uid, (pkgmgr_getsize_type)service_mode, event_cb, data);
2502 case PM_REQUEST_KILL_APP:
2503 case PM_REQUEST_CHECK_APP:
2504 tryvm_if(pkgid == NULL, ret = PKGMGR_R_EINVAL, "pkgid is NULL\n");
2505 tryvm_if(pc == NULL, ret = PKGMGR_R_EINVAL, "pc is NULL\n");
2507 ret = __check_app_process(service_type, pc, pkgid, uid, data);
2509 ERR("__check_app_process fail \n");
2516 ERR("Wrong Request\n");
2527 API int pkgmgr_client_usr_request_size_info(uid_t uid)
2530 pkgmgr_client *pc = NULL;
2532 pc = pkgmgr_client_new(PC_REQUEST);
2533 retvm_if(pc == NULL, PKGMGR_R_EINVAL, "request pc is null\n");
2535 ret = __request_size_info(pc, uid);
2537 ERR("__request_size_info fail \n");
2540 pkgmgr_client_free(pc);
2544 API int pkgmgr_client_request_size_info(void) // get all package size (data, total)
2546 return pkgmgr_client_usr_request_size_info(GLOBAL_USER);
2549 API int pkgmgr_client_usr_clear_cache_dir(const char *pkgid, uid_t uid)
2551 retvm_if(pkgid == NULL, PKGMGR_R_EINVAL, "package id is null\n");
2554 pkgmgr_client_t *pc = NULL;
2555 char *pkg_type = NULL;
2556 int is_type_malloced = 0;
2558 pkgmgrinfo_pkginfo_h handle = NULL;
2560 pc = pkgmgr_client_new(PC_REQUEST);
2561 retvm_if(pc == NULL, PKGMGR_R_ESYSTEM, "request pc is null\n");
2563 if (strcmp(pkgid, PKG_CLEAR_ALL_CACHE) != 0)
2565 ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(pkgid, uid, &handle);
2566 tryvm_if(ret < 0, ret = PKGMGR_R_ENOPKG, "pkgmgrinfo_pkginfo_get_pkginfo failed");
2568 ret = pkgmgrinfo_pkginfo_get_type(handle, &pkg_type);
2569 tryvm_if(ret < 0, ret = PKGMGR_R_ESYSTEM, "pkgmgrinfo_pkginfo_get_type failed");
2573 pkg_type = (char *)malloc(strlen("rpm") + 1);
2574 strcpy(pkg_type, "rpm");
2575 is_type_malloced = 1;
2578 ret = comm_client_request(pc->info.request.cc, NULL, COMM_REQ_CLEAR_CACHE_DIR, pkg_type, pkgid, NULL, uid, 0);
2579 tryvm_if(ret < 0, ret = PKGMGR_R_ERROR, "COMM_REQ_CLEAR_CACHE_DIR failed, ret=%d\n", ret);
2584 pkgmgr_client_free(pc);
2586 if(is_type_malloced)
2589 pkgmgrinfo_pkginfo_destroy_pkginfo(handle);
2594 API int pkgmgr_client_clear_cache_dir(const char *pkgid)
2596 return pkgmgr_client_usr_clear_cache_dir(pkgid, GLOBAL_USER);
2599 API int pkgmgr_client_clear_usr_all_cache_dir(uid_t uid)
2601 return pkgmgr_client_usr_clear_cache_dir(PKG_CLEAR_ALL_CACHE, uid);
2604 API int pkgmgr_client_clear_all_cache_dir(void)
2607 ret = pkgmgr_client_usr_clear_cache_dir(PKG_CLEAR_ALL_CACHE, GLOBAL_USER);
2611 API int pkgmgr_client_get_size(pkgmgr_client * pc, const char *pkgid, pkgmgr_getsize_type get_type, pkgmgr_handler event_cb, void *data)
2613 return pkgmgr_client_usr_get_size(pc, pkgid, get_type, event_cb, data, GLOBAL_USER);
2616 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)
2618 char *req_key = NULL;
2620 char *pkgtype = "rpm";
2621 char *argv[PKG_ARGC_MAX] = { NULL, };
2627 char buf[128] = {'\0'};
2630 pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc;
2631 retvm_if(mpc->ctype != PC_REQUEST, PKGMGR_R_EINVAL, "mpc->ctype is not PC_REQUEST\n");
2632 retvm_if(event_cb == NULL, PKGMGR_R_EINVAL, "event_cb is NULL\n");
2633 retvm_if(pkgid == NULL, PKGMGR_R_EINVAL, "pkgid is NULL\n");
2635 req_key = __get_req_key(pkgid);
2636 retvm_if(req_key == NULL, PKGMGR_R_EINVAL, "req_key is NULL");
2638 req_id = _get_request_id();
2639 __add_op_cbinfo(mpc, req_id, req_key, event_cb, NULL, data);
2641 snprintf(buf, 128, "%d", get_type);
2642 argv[argcnt++] = strdup(pkgid);
2643 argv[argcnt++] = strdup(buf);
2644 argv[argcnt++] = strdup("-k");
2645 argv[argcnt++] = req_key;
2647 /*** add quote in all string for special charactor like '\n'*** FIX */
2648 for (i = 0; i < argcnt; i++) {
2649 temp = g_shell_quote(argv[i]);
2650 len += (strlen(temp) + 1);
2654 args = (char *)calloc(len, sizeof(char));
2655 tryvm_if(args == NULL, ret = PKGMGR_R_EINVAL, "installer_path fail");
2657 strncpy(args, argv[0], len - 1);
2659 for (i = 1; i < argcnt; i++) {
2660 strncat(args, " ", strlen(" "));
2661 temp = g_shell_quote(argv[i]);
2662 strncat(args, temp, strlen(temp));
2665 DBG("[args] %s [len] %d\n", args, len);
2668 ret = comm_client_request(mpc->info.request.cc, req_key, COMM_REQ_GET_SIZE, pkgtype, pkgid, args, uid, 1);
2670 ERR("comm_client_request failed, ret=%d\n", ret);
2673 for (i = 0; i < argcnt; i++)
2682 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)
2684 pkgmgrinfo_pkginfo_h pkginfo = NULL;
2685 char *req_key = NULL;
2688 int type = PM_GET_PKG_SIZE_INFO;
2690 retvm_if(pc == NULL, PKGMGR_R_EINVAL, "The specified pc is NULL.");
2691 retvm_if(pkgid == NULL, PKGMGR_R_EINVAL, "The package id is NULL.");
2693 if (strcmp(pkgid, PKG_SIZE_INFO_TOTAL) == 0)
2694 { // total package size info
2695 type = PM_GET_TOTAL_PKG_SIZE_INFO;
2699 res = pkgmgrinfo_pkginfo_get_usr_pkginfo(pkgid, uid, &pkginfo);
2700 retvm_if(res != 0, PKGMGR_R_ENOPKG, "The package id is not installed.");
2703 pkgmgrinfo_pkginfo_destroy_pkginfo(pkginfo);
2707 pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc;
2708 retvm_if(mpc->ctype != PC_REQUEST, PKGMGR_R_EINVAL, "mpc->ctype is not PC_REQUEST");
2710 res = __change_op_cb_for_getsize(mpc);
2711 retvm_if(res < 0 , PKGMGR_R_ESYSTEM, "__change_op_cb_for_getsize is fail");
2713 req_key = __get_req_key(pkgid);
2714 retvm_if(req_key == NULL, PKGMGR_R_ESYSTEM, "req_key is NULL");
2716 req_id = _get_request_id();
2717 __add_op_cbinfo(mpc, req_id, req_key, __get_pkg_size_info_cb, event_cb, user_data);
2719 res = __get_package_size_info(mpc, req_key, pkgid, type, uid);
2724 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)
2726 return pkgmgr_client_usr_get_package_size_info(pc, pkgid, event_cb, user_data, GLOBAL_USER);
2729 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)
2730 { // total package size info
2731 return pkgmgr_client_usr_get_package_size_info(pc, PKG_SIZE_INFO_TOTAL, (pkgmgr_pkg_size_info_receive_cb)event_cb, user_data, uid);
2734 API int pkgmgr_client_get_total_package_size_info(pkgmgr_client *pc, pkgmgr_total_pkg_size_info_receive_cb event_cb, void *user_data)
2736 return pkgmgr_client_usr_get_package_size_info(pc, PKG_SIZE_INFO_TOTAL, event_cb, user_data, GLOBAL_USER);
2739 #define __START_OF_OLD_API
2740 ail_cb_ret_e __appinfo_func(const ail_appinfo_h appinfo, void *user_data)
2746 iter_data *udata = (iter_data *) user_data;
2748 ail_appinfo_get_str(appinfo, AIL_PROP_X_SLP_PACKAGETYPE_STR, &type);
2751 ail_appinfo_get_str(appinfo, AIL_PROP_PACKAGE_STR, &package);
2752 if (package == NULL)
2754 ail_appinfo_get_str(appinfo, AIL_PROP_VERSION_STR, &version);
2755 if (version == NULL)
2758 if (udata->iter_fn(type, package, version, udata->data) != 0)
2759 return AIL_CB_RET_CANCEL;
2761 return AIL_CB_RET_CONTINUE;
2764 API int pkgmgr_get_pkg_list(pkgmgr_iter_fn iter_fn, void *data, uid_t uid)
2767 ail_filter_h filter;
2770 if (iter_fn == NULL)
2771 return PKGMGR_R_EINVAL;
2773 ret = ail_filter_new(&filter);
2774 if (ret != AIL_ERROR_OK) {
2775 return PKGMGR_R_ERROR;
2778 ret = ail_filter_add_str(filter, AIL_PROP_TYPE_STR, "Application");
2779 if (ret != AIL_ERROR_OK) {
2780 ail_filter_destroy(filter);
2781 return PKGMGR_R_ERROR;
2784 ret = ail_filter_add_bool(filter, AIL_PROP_X_SLP_REMOVABLE_BOOL, true);
2785 if (ret != AIL_ERROR_OK) {
2786 ail_filter_destroy(filter);
2787 return PKGMGR_R_ERROR;
2790 if(uid != GLOBAL_USER)
2791 ret = ail_filter_count_usr_appinfo(filter, &cnt, uid);
2793 ret = ail_filter_count_appinfo(filter, &cnt);
2794 if (ret != AIL_ERROR_OK) {
2795 ail_filter_destroy(filter);
2796 return PKGMGR_R_ERROR;
2799 iter_data *udata = calloc(1, sizeof(iter_data));
2800 if (udata == NULL) {
2801 ERR("calloc failed");
2802 ail_filter_destroy(filter);
2804 return PKGMGR_R_ERROR;
2806 udata->iter_fn = iter_fn;
2809 if(uid != GLOBAL_USER)
2810 ail_filter_list_usr_appinfo_foreach(filter, __appinfo_func, udata, uid);
2812 ail_filter_list_appinfo_foreach(filter, __appinfo_func, udata);
2815 ret = ail_filter_destroy(filter);
2816 if (ret != AIL_ERROR_OK) {
2817 return PKGMGR_R_ERROR;
2823 API pkgmgr_info *pkgmgr_info_new(const char *pkg_type, const char *pkgid)
2825 return pkgmgr_info_usr_new(pkg_type, pkgid, GLOBAL_USER);
2827 API pkgmgr_info *pkgmgr_info_usr_new(const char *pkg_type, const char *pkgid, uid_t uid)
2829 const char *pkgtype;
2830 pkg_plugin_set *plugin_set = NULL;
2831 package_manager_pkg_detail_info_t *pkg_detail_info = NULL;
2833 /* 1. check argument */
2837 if (pkg_type == NULL) {
2838 pkgtype = _get_pkg_type_from_desktop_file(pkgid, uid);
2839 if (pkgtype == NULL)
2844 if (strlen(pkgid) >= PKG_STRING_LEN_MAX)
2847 pkg_detail_info = calloc(1, sizeof(package_manager_pkg_detail_info_t));
2848 if (pkg_detail_info == NULL) {
2849 ERR("*** Failed to alloc package_handler_info.\n");
2853 plugin_set = _package_manager_load_library(pkgtype);
2854 if (plugin_set == NULL) {
2855 ERR("*** Failed to load library");
2856 free(pkg_detail_info);
2860 if (plugin_set->pkg_is_installed) {
2861 if (plugin_set->pkg_is_installed(pkgid) != 0) {
2862 ERR("*** Failed to call pkg_is_installed()");
2863 free(pkg_detail_info);
2867 if (plugin_set->get_pkg_detail_info) {
2868 if (plugin_set->get_pkg_detail_info(pkgid,
2869 pkg_detail_info) != 0) {
2870 ERR("*** Failed to call get_pkg_detail_info()");
2871 free(pkg_detail_info);
2877 return (pkgmgr_info *) pkg_detail_info;
2880 API char * pkgmgr_info_get_string(pkgmgr_info * pkg_info, const char *key)
2882 package_manager_pkg_detail_info_t *pkg_detail_info;
2884 if (pkg_info == NULL)
2889 pkg_detail_info = (package_manager_pkg_detail_info_t *) pkg_info;
2891 return _get_info_string(key, pkg_detail_info);
2894 API pkgmgr_info *pkgmgr_info_new_from_file(const char *pkg_type,
2895 const char *pkg_path)
2897 pkg_plugin_set *plugin_set = NULL;
2898 package_manager_pkg_detail_info_t *pkg_detail_info = NULL;
2900 if (pkg_path == NULL) {
2901 ERR("pkg_path is NULL\n");
2905 if (strlen(pkg_path) > PKG_URL_STRING_LEN_MAX) {
2906 ERR("length of pkg_path is too long - %d.\n",
2911 pkg_detail_info = calloc(1, sizeof(package_manager_pkg_detail_info_t));
2912 if (pkg_detail_info == NULL) {
2913 ERR("*** Failed to alloc package_handler_info.\n");
2917 if (pkg_type == NULL)
2918 pkgtype = __get_type_from_path(pkg_path);
2920 pkgtype = strdup(pkg_type);
2922 plugin_set = _package_manager_load_library(pkgtype);
2923 if (plugin_set == NULL) {
2924 free(pkg_detail_info);
2929 if (plugin_set->get_pkg_detail_info_from_package) {
2930 if (plugin_set->get_pkg_detail_info_from_package(pkg_path,
2931 pkg_detail_info) != 0) {
2932 free(pkg_detail_info);
2939 return (pkgmgr_info *) pkg_detail_info;
2942 API int pkgmgr_info_free(pkgmgr_info * pkg_info)
2944 if (pkg_info == NULL)
2945 return PKGMGR_R_EINVAL;
2953 #define __END_OF_OLD_API