From 738e9a3c025f9ba04404c5d381423074958ead4b Mon Sep 17 00:00:00 2001 From: Sangyoon Jang Date: Thu, 3 Sep 2015 15:23:42 +0900 Subject: [PATCH] Revise client api get request key from server, do not generate in client side generate arguments for backend in server side refine request type to handle client request by each type Change-Id: Ifd93d5acbeb7a2beb911d8ec01f844bff7a7b6d4 Signed-off-by: Sangyoon Jang --- client/src/pkgmgr.c | 1793 +++++++++------------------------------- comm/comm_client.h | 2 +- comm/comm_client_gdbus.c | 17 +- server/include/pkgmgr-server.h | 23 +- server/include/pm-queue.h | 5 +- server/src/pkgmgr-server.c | 359 ++++---- server/src/pm-queue.c | 54 +- server/src/request.c | 460 ++++++----- 8 files changed, 890 insertions(+), 1823 deletions(-) diff --git a/client/src/pkgmgr.c b/client/src/pkgmgr.c index 5fb70ee..8caabcb 100644 --- a/client/src/pkgmgr.c +++ b/client/src/pkgmgr.c @@ -335,133 +335,6 @@ static void __status_callback(void *cb_data, uid_t target_uid, return; } -static char *__get_req_key(const char *pkg_path) -{ - struct timeval tv; - long curtime; - char timestr[PKG_STRING_LEN_MAX]; - char *str_req_key; - int size; - - gettimeofday(&tv, NULL); - curtime = tv.tv_sec * 1000000 + tv.tv_usec; - snprintf(timestr, sizeof(timestr), "%ld", curtime); - - size = strlen(pkg_path) + strlen(timestr) + 2; - str_req_key = (char *)calloc(size, sizeof(char)); - if (str_req_key == NULL) { - DBG("calloc failed"); - return NULL; - } - snprintf(str_req_key, size, "%s_%s", pkg_path, timestr); - - return str_req_key; -} - -static char *__get_type_from_path(const char *pkg_path) -{ - int ret; - char mimetype[255] = { '\0', }; - char extlist[256] = { '\0', }; - char *pkg_type; - - ret = _get_mime_from_file(pkg_path, mimetype, sizeof(mimetype)); - if (ret) { - ERR("_get_mime_from_file() failed - error code[%d]\n", - ret); - return NULL; - } - - ret = _get_mime_extension(mimetype, extlist, sizeof(extlist)); - if (ret) { - ERR("_get_mime_extension() failed - error code[%d]\n", - ret); - return NULL; - } - - if (strlen(extlist) == 0) - return NULL; - - if (strchr(extlist, ',')) { - extlist[strlen(extlist) - strlen(strchr(extlist, ','))] = '\0'; - } - pkg_type = strchr(extlist, '.') + 1; - return strdup(pkg_type); -} - -static int __get_pkgid_by_appid(const char *appid, char **pkgid) -{ - pkgmgrinfo_appinfo_h pkgmgrinfo_appinfo = NULL; - int ret = -1; - char *pkg_id = NULL; - char *pkg_id_dup = NULL; - - if (pkgmgrinfo_appinfo_get_appinfo(appid, &pkgmgrinfo_appinfo) != PMINFO_R_OK) - return -1; - - if (pkgmgrinfo_appinfo_get_pkgname(pkgmgrinfo_appinfo, &pkg_id) != PMINFO_R_OK) - goto err; - - pkg_id_dup = strdup(pkg_id); - if (pkg_id_dup == NULL) - goto err; - - *pkgid = pkg_id_dup; - ret = PMINFO_R_OK; - -err: - pkgmgrinfo_appinfo_destroy_appinfo(pkgmgrinfo_appinfo); - - return ret; -} - -static int __appinfo_cb(pkgmgrinfo_appinfo_h handle, void *user_data) -{ - int ret; - char **appid = (char **)user_data; - char *val; - - ret = pkgmgrinfo_appinfo_get_appid(handle, &val); - if (ret != PMINFO_R_OK) - return ret; - - *appid = strdup(val); - - return 0; -} - -static char *__get_app_info_from_db_by_apppath(const char *apppath, uid_t uid) -{ - int ret; - char *caller_appid = NULL; - pkgmgrinfo_appinfo_filter_h filter; - - if (apppath == NULL) - return NULL; - - ret = pkgmgrinfo_appinfo_filter_create(&filter) != PMINFO_R_OK; - if (ret != PMINFO_R_OK) - return NULL; - - ret = pkgmgrinfo_appinfo_filter_add_string(filter, - PMINFO_APPINFO_PROP_APP_EXEC, apppath); - if (ret != PMINFO_R_OK) { - pkgmgrinfo_appinfo_filter_destroy(filter); - return NULL; - } - - ret = pkgmgrinfo_appinfo_usr_filter_foreach_appinfo(filter, - __appinfo_cb, &caller_appid, uid); - if (ret != PMINFO_R_OK) { - pkgmgrinfo_appinfo_filter_destroy(filter); - return NULL; - } - - pkgmgrinfo_appinfo_filter_destroy(filter); - - return caller_appid; -} - static inline int __read_proc(const char *path, char *buf, int size) { int fd = 0; @@ -503,41 +376,6 @@ char *__proc_get_cmdline_bypid(int pid) return strdup(buf); } -static int __get_appid_bypid(int pid, char *pkgname, int len, uid_t uid) -{ - char *cmdline = NULL; - char *caller_appid = NULL; - - cmdline = __proc_get_cmdline_bypid(pid); - if (cmdline == NULL) - return -1; - - caller_appid = __get_app_info_from_db_by_apppath(cmdline, uid); - snprintf(pkgname, len, "%s", caller_appid); - - free(cmdline); - free(caller_appid); - - return 0; -} - -static char *__get_caller_pkgid(uid_t uid) -{ - char caller_appid[PKG_STRING_LEN_MAX] = {0, }; - char *caller_pkgid = NULL; - - if (__get_appid_bypid(getpid(), caller_appid, sizeof(caller_appid), uid) < 0) { - ERR("get appid fail!!!\n"); - return NULL; - } - if (__get_pkgid_by_appid(caller_appid, &caller_pkgid) < 0){ - ERR("get pkgid fail!!!\n"); - return NULL; - } - - return caller_pkgid; -} - static inline int __pkgmgr_read_proc(const char *path, char *buf, int size) { int fd; @@ -714,169 +552,77 @@ catch: return ret; } -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) +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) { + GVariant *result; + int ret = PKGMGR_R_ECOMM; char *req_key = NULL; - int ret =0; - char *pkgtype = "rpm"; - char *argv[PKG_ARGC_MAX] = { NULL, }; - char *args = NULL; - int argcnt = 0; - int len = 0; - char *temp = NULL; - int i = 0; - char buf[128] = {'\0'}; - - pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc; - retvm_if(mpc->ctype != PC_REQUEST, PKGMGR_R_EINVAL, "mpc->ctype is not PC_REQUEST\n"); - - req_key = __get_req_key(pkgid); - - snprintf(buf, 128, "%d", get_type); - argv[argcnt++] = strdup(pkgid); - argv[argcnt++] = strdup(buf); - argv[argcnt++] = strdup("-k"); - argv[argcnt++] = strdup(req_key); + pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc; - /*** add quote in all string for special charactor like '\n'*** FIX */ - for (i = 0; i < argcnt; i++) { - temp = g_shell_quote(argv[i]); - len += (strlen(temp) + 1); - g_free(temp); + if (pc == NULL || pkgid == NULL) { + ERR("invalid parameter"); + return PKGMGR_R_EINVAL; } - args = (char *)calloc(len, sizeof(char)); - tryvm_if(args == NULL, ret = PKGMGR_R_EINVAL, "installer_path fail"); - - strncpy(args, argv[0], len - 1); - - for (i = 1; i < argcnt; i++) { - strncat(args, " ", strlen(" ")); - temp = g_shell_quote(argv[i]); - strncat(args, temp, strlen(temp)); - g_free(temp); + if (mpc->ctype != PC_REQUEST) { + ERR("mpc->ctype is not PC_REQUEST"); + return PKGMGR_R_EINVAL; } - DBG("[args] %s [len] %d\n", args, len); + result = comm_client_request(mpc->info.request.cc, "getsize", + g_variant_new("(si)", pkgid, get_type)); + if (result == NULL) + return PKGMGR_R_ECOMM; - /* request */ - ret = comm_client_request(mpc->info.request.cc, "getsize", - g_variant_new("(ssss)", req_key, pkgtype, pkgid, args)); - if (ret < 0) - ERR("comm_client_request failed, ret=%d\n", ret); + g_variant_get(result, "(i&s)", &ret, &req_key); + if (req_key == NULL) { + g_variant_unref(result); + return PKGMGR_R_ECOMM; + } + if (ret != PKGMGR_R_OK) { + g_variant_unref(result); + return ret; + } ret = __sync_process(req_key); if (ret < 0) ERR("get size failed, ret=%d\n", ret); -catch: - for (i = 0; i < argcnt; i++) - free(argv[i]); - - if(args) - free(args); + g_variant_unref(result); return ret; } -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) +static int __move_pkg_process(pkgmgr_client *pc, const char *pkgid, + const char *pkg_type, uid_t uid, pkgmgr_move_type move_type, + pkgmgr_handler event_cb, void *data) { - char *req_key = NULL; - int ret =0; - pkgmgrinfo_pkginfo_h handle = NULL; - char *pkgtype = NULL; - char *installer_path = NULL; - char *argv[PKG_ARGC_MAX] = { NULL, }; - char *args = NULL; - int argcnt = 0; - int len = 0; - char *temp = NULL; - int i = 0; - char buf[128] = {'\0'}; - - pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc; - retvm_if(mpc->ctype != PC_REQUEST, PKGMGR_R_EINVAL, "mpc->ctype is not PC_REQUEST\n"); - - if(uid != GLOBAL_USER) - ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(pkgid, uid, &handle); - else - ret = pkgmgrinfo_pkginfo_get_pkginfo(pkgid, &handle); - retvm_if(ret < 0, PKGMGR_R_ERROR, "pkgmgrinfo_pkginfo_get_pkginfo failed"); + int ret; - ret = pkgmgrinfo_pkginfo_get_type(handle, &pkgtype); - tryvm_if(ret < 0, ret = PKGMGR_R_ERROR, "pkgmgrinfo_pkginfo_get_type failed"); - - installer_path = _get_backend_path_with_type(pkgtype); - req_key = __get_req_key(pkgid); - - /* generate argv */ - snprintf(buf, 128, "%d", move_type); - /* argv[0] installer path */ - argv[argcnt++] = installer_path; - /* argv[1] */ - argv[argcnt++] = strdup("-k"); - /* argv[2] */ - argv[argcnt++] = req_key; - /* argv[3] */ - argv[argcnt++] = strdup("-m"); - /* argv[4] */ - argv[argcnt++] = strdup(pkgid); - /* argv[5] */ - argv[argcnt++] = strdup("-t"); - /* argv[6] */ - argv[argcnt++] = strdup(buf); - - /*** add quote in all string for special charactor like '\n'*** FIX */ - for (i = 0; i < argcnt; i++) { - temp = g_shell_quote(argv[i]); - len += (strlen(temp) + 1); - g_free(temp); - } - - args = (char *)calloc(len, sizeof(char)); - tryvm_if(args == NULL, ret = PKGMGR_R_EINVAL, "installer_path fail"); - - strncpy(args, argv[0], len - 1); - - for (i = 1; i < argcnt; i++) { - strncat(args, " ", strlen(" ")); - temp = g_shell_quote(argv[i]); - strncat(args, temp, strlen(temp)); - g_free(temp); - } - DBG("[args] %s [len] %d\n", args, len); - - /* 6. request */ - ret = comm_client_request(mpc->info.request.cc, "move", - g_variant_new("(ssss)", req_key, pkgtype, pkgid, args)); - if (ret < 0) - ERR("comm_client_request failed, ret=%d\n", ret); + ret = pkgmgr_client_usr_move(pc, pkg_type, pkgid, move_type, 0, uid); + if (ret < 0) { + ERR("move request failed"); + return ret; + } + /* FIXME */ ret = __sync_process(pkgid); if (ret != 0) ERR("move pkg failed, ret=%d\n", ret); -catch: - for (i = 0; i < argcnt; i++) - free(argv[i]); - - if(args) - free(args); - - if (handle) - pkgmgrinfo_pkginfo_destroy_pkginfo(handle); return ret; } -static int __check_app_process(pkgmgr_request_service_type service_type, pkgmgr_client * pc, const char *pkgid, uid_t uid, void *data) +static int __check_app_process(pkgmgr_request_service_type service_type, + pkgmgr_client *pc, const char *pkgid, uid_t uid, void *data) { - char *pkgtype; - char *req_key = NULL; - int ret; - pkgmgrinfo_pkginfo_h handle = NULL; + GVariant *result; + int ret = PKGMGR_R_ECOMM; + pkgmgrinfo_pkginfo_h handle; int pid = -1; - - /* Check for NULL value of pc */ pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc; + retvm_if(mpc->ctype != PC_REQUEST, PKGMGR_R_EINVAL, "mpc->ctype is not PC_REQUEST\n"); if (uid != GLOBAL_USER) @@ -885,31 +631,27 @@ static int __check_app_process(pkgmgr_request_service_type service_type, pkgmgr_ ret = pkgmgrinfo_pkginfo_get_pkginfo(pkgid, &handle); retvm_if(ret < 0, PKGMGR_R_ERROR, "pkgmgrinfo_pkginfo_get_pkginfo failed"); - ret = pkgmgrinfo_pkginfo_get_type(handle, &pkgtype); - tryvm_if(ret < 0, ret = PKGMGR_R_ERROR, "pkgmgrinfo_pkginfo_get_type failed"); - - /* 2. generate req_key */ - req_key = __get_req_key(pkgid); - - /* 3. request activate */ if (service_type == PM_REQUEST_KILL_APP) - ret = comm_client_request(mpc->info.request.cc, "kill", - g_variant_new("(sss)", req_key, pkgtype, pkgid)); + result = comm_client_request(mpc->info.request.cc, "kill", + g_variant_new("(s)", pkgid)); else if (service_type == PM_REQUEST_CHECK_APP) - ret = comm_client_request(mpc->info.request.cc, "check", - g_variant_new("(sss)", req_key, pkgtype, pkgid)); + result = comm_client_request(mpc->info.request.cc, "check", + g_variant_new("(s)", pkgid)); - if (ret < 0) - ERR("request failed, ret=%d\n", ret); + if (result == NULL) + return PKGMGR_R_ECOMM; + g_variant_get(result, "(i)", &ret); + g_variant_unref(result); + if (ret != PKGMGR_R_OK) { + ERR("request failed, ret=%d", ret); + return ret; + } + /* FIXME */ pid = __sync_process(pkgid); - * (int *) data = pid; + *(int *)data = pid; -catch: - if (req_key) - free(req_key); - if (handle) - pkgmgrinfo_pkginfo_destroy_pkginfo(handle); + pkgmgrinfo_pkginfo_destroy_pkginfo(handle); return ret; @@ -917,64 +659,33 @@ catch: static int __request_size_info(pkgmgr_client *pc, uid_t uid) { + GVariant *result; + int ret = PKGMGR_R_ECOMM; char *req_key = NULL; - int ret =0; - char *pkgtype = "getsize"; - char *pkgid = "size_info"; - pkgmgr_getsize_type get_type = PM_GET_SIZE_INFO; - - char *argv[PKG_ARGC_MAX] = { NULL, }; - char *args = NULL; - int argcnt = 0; - int len = 0; - char *temp = NULL; - int i = 0; - char buf[128] = {'\0'}; - pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc; - retvm_if(mpc->ctype != PC_REQUEST, PKGMGR_R_EINVAL, "mpc->ctype is not PC_REQUEST\n"); - req_key = __get_req_key(pkgid); - - snprintf(buf, 128, "%d", get_type); - argv[argcnt++] = strdup(pkgid); - argv[argcnt++] = strdup(buf); - argv[argcnt++] = strdup("-k"); - argv[argcnt++] = req_key; - - /*** add quote in all string for special charactor like '\n'*** FIX */ - for (i = 0; i < argcnt; i++) { - temp = g_shell_quote(argv[i]); - len += (strlen(temp) + 1); - g_free(temp); + if (pc == NULL) { + ERR("invalid parameter"); + return PKGMGR_R_EINVAL; } - args = (char *)calloc(len, sizeof(char)); - tryvm_if(args == NULL, ret = PKGMGR_R_EINVAL, "installer_path fail"); - - strncpy(args, argv[0], len - 1); - - for (i = 1; i < argcnt; i++) { - strncat(args, " ", strlen(" ")); - temp = g_shell_quote(argv[i]); - strncat(args, temp, strlen(temp)); - g_free(temp); + if (mpc->ctype != PC_REQUEST) { + ERR("mpc->ctype is not PC_REQUEST"); + return PKGMGR_R_EINVAL; } - DBG("[args] %s [len] %d\n", args, len); - /* request */ - ret = comm_client_request(mpc->info.request.cc, "getsize", - g_variant_new("(ssss)", req_key, pkgtype, pkgid, args)); - if (ret < 0) { - ERR("COMM_REQ_GET_SIZE failed, ret=%d\n", ret); - } + result = comm_client_request(mpc->info.request.cc, "getsize", + g_variant_new("(si)", "size_info", PM_GET_SIZE_INFO)); + if (result == NULL) + return PKGMGR_R_ECOMM; -catch: - for (i = 0; i < argcnt; i++) - free(argv[i]); + g_variant_get(result, "(i&s)", &ret, &req_key); + if (req_key == NULL) { + g_variant_unref(result); + return PKGMGR_R_ECOMM; + } - if(args) - free(args); + g_variant_unref(result); return ret; } @@ -1013,60 +724,6 @@ static int __change_op_cb_for_getsize(pkgmgr_client *pc) return PKGMGR_R_OK; } -static int __get_package_size_info(pkgmgr_client_t *mpc, char *req_key, const char *pkgid, pkgmgr_getsize_type get_type, uid_t uid) -{ - char *argv[PKG_ARGC_MAX] = { NULL, }; - char *args = NULL; - int argcnt = 0; - char *pkgtype = "getsize"; //unused - char buf[128] = { 0, }; - int len = 0; - char *temp = NULL; - int i = 0; - int ret = 0; - - snprintf(buf, 128, "%d", get_type); - argv[argcnt++] = strdup(pkgid); - argv[argcnt++] = strdup(buf); - argv[argcnt++] = strdup("-k"); - argv[argcnt++] = req_key; - - /*** add quote in all string for special charactor like '\n'*** FIX */ - for (i = 0; i < argcnt; i++) { - temp = g_shell_quote(argv[i]); - len += (strlen(temp) + 1); - g_free(temp); - } - - args = (char *)calloc(len, sizeof(char)); - tryvm_if(args == NULL, ret = PKGMGR_R_EINVAL, "installer_path fail"); - - strncpy(args, argv[0], len - 1); - - for (i = 1; i < argcnt; i++) { - strncat(args, " ", strlen(" ")); - temp = g_shell_quote(argv[i]); - strncat(args, temp, strlen(temp)); - g_free(temp); - } - DBG("[args] %s [len] %d\n", args, len); - - /* request */ - ret = comm_client_request(mpc->info.request.cc, "getsize", - g_variant_new("(ssss)", req_key, pkgtype, pkgid, args)); - if (ret < 0) - ERR("COMM_REQ_GET_SIZE failed, ret=%d\n", ret); - -catch: - for (i = 0; i < argcnt; i++) - free(argv[i]); - - if(args) - free(args); - - return ret; -} - static int __get_pkg_size_info_cb(uid_t target_uid, int req_id, const char *req_type, const char *pkgid, const char *key, const char *value, const void *pc, void *user_data) @@ -1207,678 +864,239 @@ API int pkgmgr_client_free(pkgmgr_client *pc) } -API int pkgmgr_client_usr_install(pkgmgr_client * pc, const char *pkg_type, - const char *descriptor_path, const char *pkg_path, - const char *optional_file, pkgmgr_mode mode, - pkgmgr_handler event_cb, void *data, uid_t uid) +API int pkgmgr_client_usr_install(pkgmgr_client *pc, const char *pkg_type, + const char *descriptor_path, const char *pkg_path, + const char *optional_file, pkgmgr_mode mode, + pkgmgr_handler event_cb, void *data, uid_t uid) { - char *pkgtype = NULL; - char *installer_path = NULL; + GVariant *result; + int ret = PKGMGR_R_ECOMM; char *req_key = NULL; - int req_id = 0; - int i = 0; - char *argv[PKG_ARGC_MAX] = { NULL, }; - char *args = NULL; - int argcnt = 0; - int len = 0; - char *temp = NULL; - int ret = 0; - char *caller_pkgid = NULL; - - caller_pkgid = __get_caller_pkgid(uid); - if (caller_pkgid == NULL) - ERR("caller dont have pkgid..\n"); - - /* Check for NULL value of pc */ - retvm_if(pc == NULL, PKGMGR_R_EINVAL, "package manager client handle is NULL"); - - /* 0. check the pc type */ - pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc; - retvm_if(mpc->ctype != PC_REQUEST, PKGMGR_R_EINVAL, "mpc->ctype is not PC_REQUEST"); - - /* 1. check argument */ - if (descriptor_path) { - retvm_if(strlen(descriptor_path) >= PKG_STRING_LEN_MAX, PKGMGR_R_EINVAL, "descriptor_path over PKG_STRING_LEN_MAX"); - retvm_if(access(descriptor_path, F_OK) != 0, PKGMGR_R_EINVAL, "descriptor_path access fail"); - } - - retvm_if(pkg_path == NULL, PKGMGR_R_EINVAL, "pkg_path is NULL"); - retvm_if(strlen(pkg_path) >= PKG_STRING_LEN_MAX, PKGMGR_R_EINVAL, "pkg_path over PKG_STRING_LEN_MAX"); - retvm_if(access(pkg_path, F_OK) != 0, PKGMGR_R_EINVAL, "pkg_path access fail"); - - if (optional_file) - retvm_if(strlen(optional_file) >= PKG_STRING_LEN_MAX, PKGMGR_R_EINVAL, "optional_file over PKG_STRING_LEN_MAX"); + int req_id; + pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc; - /* 2. get installer path using pkg_path */ - if (pkg_type) { - installer_path = _get_backend_path_with_type(pkg_type); - pkgtype = strdup(pkg_type); - } else { - installer_path = _get_backend_path(pkg_path); - pkgtype = __get_type_from_path(pkg_path); - } - if (installer_path == NULL) { - free(pkgtype); - ERR("installer_path is NULL\n"); + if (pc == NULL || pkg_type == NULL || pkg_path == NULL) { + ERR("invalid parameter"); return PKGMGR_R_EINVAL; } - /* 3. generate req_key */ - req_key = __get_req_key(pkg_path); - - /* 4. add callback info - add callback info to pkgmgr_client */ - req_id = _get_request_id(); - __add_op_cbinfo(mpc, req_id, req_key, event_cb, NULL, data); - - /* 5. generate argv */ - - /* argv[0] installer path */ - argv[argcnt++] = installer_path; - /* argv[1] */ - argv[argcnt++] = strdup("-k"); - /* argv[2] */ - argv[argcnt++] = req_key; - /* argv[3] */ - argv[argcnt++] = strdup("-i"); - /* argv[(4)] if exists */ - if (descriptor_path) - argv[argcnt++] = strdup(descriptor_path); - /* argv[4] */ - argv[argcnt++] = strdup(pkg_path); - /* argv[(5)] if exists */ - if (optional_file){ - argv[argcnt++] = strdup("-o"); - argv[argcnt++] = strdup(optional_file); - } - if (caller_pkgid) { - argv[argcnt++] = strdup("-p"); - argv[argcnt++] = strdup(caller_pkgid); + if (mpc->ctype != PC_REQUEST) { + ERR("mpc->ctype is not PC_REQUEST"); + return PKGMGR_R_EINVAL; } - /*** add quote in all string for special charactor like '\n'*** FIX */ - for (i = 0; i < argcnt; i++) { - temp = g_shell_quote(argv[i]); - len += (strlen(temp) + 1); - g_free(temp); + result = comm_client_request(mpc->info.request.cc, "install", + g_variant_new("(ss)", pkg_type, pkg_path)); + if (result == NULL) + return PKGMGR_R_ECOMM; + g_variant_get(result, "(i&s)", &ret, &req_key); + if (req_key == NULL) { + g_variant_unref(result); + return PKGMGR_R_ECOMM; } - - args = (char *)calloc(len, sizeof(char)); - tryvm_if(args == NULL, ret = PKGMGR_R_ERROR, "calloc failed"); - - strncpy(args, argv[0], len - 1); - - for (i = 1; i < argcnt; i++) { - strncat(args, " ", strlen(" ")); - temp = g_shell_quote(argv[i]); - strncat(args, temp, strlen(temp)); - g_free(temp); + if (ret != PKGMGR_R_OK) { + g_variant_unref(result); + return ret; } - DBG("[args] %s [len] %d\n", args, len); - - /******************* end of quote ************************/ - /* 6. request install */ - ret = comm_client_request(mpc->info.request.cc, "install", - g_variant_new("(ssss)", req_key, pkgtype, pkg_path, args)); - tryvm_if(ret < 0, ret = PKGMGR_R_ECOMM, "request failed, ret=%d", ret); - - ret = req_id; - -catch: - for (i = 0; i < argcnt; i++) - free(argv[i]); + req_id = _get_request_id(); + __add_op_cbinfo(mpc, req_id, req_key, event_cb, NULL, data); - if (args) - free(args); - if (pkgtype) - free(pkgtype); + g_variant_unref(result); - return ret; + return req_id; } - - -API int pkgmgr_client_install(pkgmgr_client * pc, const char *pkg_type, - const char *descriptor_path, const char *pkg_path, - const char *optional_file, pkgmgr_mode mode, - pkgmgr_handler event_cb, void *data) +API int pkgmgr_client_install(pkgmgr_client *pc, const char *pkg_type, + const char *descriptor_path, const char *pkg_path, + const char *optional_file, pkgmgr_mode mode, + pkgmgr_handler event_cb, void *data) { - - - return pkgmgr_client_usr_install(pc, pkg_type, - descriptor_path, pkg_path, optional_file, mode, event_cb,data, GLOBAL_USER); + return pkgmgr_client_usr_install(pc, pkg_type, descriptor_path, + pkg_path, optional_file, mode, event_cb,data, + GLOBAL_USER); } -API int pkgmgr_client_reinstall(pkgmgr_client * pc, const char *pkg_type, const char *pkgid, - const char *optional_file, pkgmgr_mode mode, - pkgmgr_handler event_cb, void *data) +API int pkgmgr_client_reinstall(pkgmgr_client *pc, const char *pkg_type, + const char *pkgid, const char *optional_file, pkgmgr_mode mode, + pkgmgr_handler event_cb, void *data) { - return pkgmgr_client_usr_reinstall(pc, pkg_type, pkgid, optional_file, mode, event_cb, data,GLOBAL_USER); + return pkgmgr_client_usr_reinstall(pc, pkg_type, pkgid, optional_file, + mode, event_cb, data,GLOBAL_USER); } -API int pkgmgr_client_usr_reinstall(pkgmgr_client * pc, const char *pkg_type, const char *pkgid, - const char *optional_file, pkgmgr_mode mode, - pkgmgr_handler event_cb, void *data, uid_t uid) +API int pkgmgr_client_usr_reinstall(pkgmgr_client * pc, const char *pkg_type, + const char *pkgid, const char *optional_file, pkgmgr_mode mode, + pkgmgr_handler event_cb, void *data, uid_t uid) { - char *pkgtype = NULL; - char *installer_path = NULL; + GVariant *result; + int ret = PKGMGR_R_ECOMM; char *req_key = NULL; - int req_id = 0; - int i = 0; - char *argv[PKG_ARGC_MAX] = { NULL, }; - char *args = NULL; - int argcnt = 0; - int len = 0; - char *temp = NULL; - int ret = 0; - - /* Check for NULL value of pc */ - retvm_if(pc == NULL, PKGMGR_R_EINVAL, "package manager client handle is NULL\n"); - - pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc; - - /* 0. check the pc type */ - retv_if(mpc->ctype != PC_REQUEST, PKGMGR_R_EINVAL); - + int req_id; + pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc; - /* 1. check argument */ - retv_if(pkgid == NULL, PKGMGR_R_EINVAL); - retv_if(strlen(pkgid) >= PKG_STRING_LEN_MAX, PKGMGR_R_EINVAL); - if (optional_file) { - if (strlen(optional_file) >= PKG_STRING_LEN_MAX) - return PKGMGR_R_EINVAL; + if (pc == NULL || pkg_type == NULL || pkgid == NULL) { + ERR("invalid parameter"); + return PKGMGR_R_EINVAL; } - /* 2. get installer path using pkg_path */ - installer_path = _get_backend_path_with_type(pkg_type); - pkgtype = strdup(pkg_type); - tryvm_if(installer_path == NULL, ret = PKGMGR_R_EINVAL, "installer_path is null"); - - /* 3. generate req_key */ - req_key = __get_req_key(pkgid); - - /* 4. add callback info - add callback info to pkgmgr_client */ - req_id = _get_request_id(); - __add_op_cbinfo(mpc, req_id, req_key, event_cb, NULL, data); - - /* 5. generate argv */ - - /* argv[0] installer path */ - argv[argcnt++] = installer_path; - /* argv[1] */ - argv[argcnt++] = strdup("-k"); - /* argv[2] */ - argv[argcnt++] = req_key; - /* argv[3] */ - argv[argcnt++] = strdup("-r"); - /* argv[4] */ - argv[argcnt++] = strdup(pkgid); - /* argv[(5)] if exists */ - if (optional_file){ - argv[argcnt++] = strdup("-o"); - argv[argcnt++] = strdup(optional_file); + if (mpc->ctype != PC_REQUEST) { + ERR("mpc->ctype is not PC_REQUEST"); + return PKGMGR_R_EINVAL; } - /*** add quote in all string for special charactor like '\n'*** FIX */ - for (i = 0; i < argcnt; i++) { - temp = g_shell_quote(argv[i]); - len += (strlen(temp) + 1); - g_free(temp); + result = comm_client_request(mpc->info.request.cc, "reinstall", + g_variant_new("(ss)", pkg_type, pkgid)); + if (result == NULL) + return PKGMGR_R_ECOMM; + g_variant_get(result, "(i&s)", &ret, &req_key); + if (req_key == NULL) { + g_variant_unref(result); + return PKGMGR_R_ECOMM; } - - args = (char *)calloc(len, sizeof(char)); - tryvm_if(args == NULL, ret = PKGMGR_R_ERROR, "calloc failed"); - - strncpy(args, argv[0], len - 1); - - for (i = 1; i < argcnt; i++) { - strncat(args, " ", strlen(" ")); - temp = g_shell_quote(argv[i]); - strncat(args, temp, strlen(temp)); - g_free(temp); + if (ret != PKGMGR_R_OK) { + g_variant_unref(result); + return ret; } - DBG("[args] %s [len] %d\n", args, len); - /******************* end of quote ************************/ - - /* 6. request install */ - ret = comm_client_request(mpc->info.request.cc, "reinstall", - g_variant_new("(ssss)", req_key, pkgtype, pkgid, args)); - tryvm_if(ret < 0, ret = PKGMGR_R_ECOMM, "request failed"); - - ret = req_id; - -catch: - for (i = 0; i < argcnt; i++) - free(argv[i]); + req_id = _get_request_id(); + __add_op_cbinfo(mpc, req_id, req_key, event_cb, NULL, data); - if (args) - free(args); - if (pkgtype) - free(pkgtype); + g_variant_unref(result); - return ret; + return req_id; } API int pkgmgr_client_uninstall(pkgmgr_client *pc, const char *pkg_type, - const char *pkgid, pkgmgr_mode mode, - pkgmgr_handler event_cb, void *data) + const char *pkgid, pkgmgr_mode mode, pkgmgr_handler event_cb, + void *data) { - return pkgmgr_client_usr_uninstall(pc, pkg_type,pkgid, mode, event_cb, data, GLOBAL_USER); + return pkgmgr_client_usr_uninstall(pc, pkg_type,pkgid, mode, event_cb, + data, GLOBAL_USER); } + API int pkgmgr_client_usr_uninstall(pkgmgr_client *pc, const char *pkg_type, - const char *pkgid, pkgmgr_mode mode, - pkgmgr_handler event_cb, void *data, uid_t uid) + const char *pkgid, pkgmgr_mode mode, pkgmgr_handler event_cb, + void *data, uid_t uid) { - char *pkgtype; - char *installer_path; - char *req_key; + GVariant *result; + int ret = PKGMGR_R_ECOMM; + char *req_key = NULL; int req_id; - int i = 0; - char *argv[PKG_ARGC_MAX] = { NULL, }; - char *args = NULL; - int argcnt = 0; - int len = 0; - char *temp = NULL; - int ret = -1; - bool removable = false; - char *caller_pkgid = NULL; + pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc; + char *pkgtype; + pkgmgrinfo_pkginfo_h handle; - caller_pkgid = __get_caller_pkgid(uid); - if (caller_pkgid == NULL) - DBG("caller dont have pkgid..\n"); + if (pc == NULL || pkgid == NULL) { + ERR("invalid parameter"); + return PKGMGR_R_EINVAL; + } - /* Check for NULL value of pc */ - retvm_if(pc == NULL, PKGMGR_R_EINVAL, "package manager client handle is NULL\n"); + if (mpc->ctype != PC_REQUEST) { + ERR("mpc->ctype is not PC_REQUEST"); + return PKGMGR_R_EINVAL; + } - pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc; + ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(pkgid, uid, &handle); + if (ret < 0) + return PKGMGR_R_ERROR; - /* 0. check the pc type */ - retv_if(mpc->ctype != PC_REQUEST, PKGMGR_R_EINVAL); + ret = pkgmgrinfo_pkginfo_get_type(handle, &pkgtype); + if (ret < 0) { + pkgmgrinfo_pkginfo_destroy_pkginfo(handle); + return PKGMGR_R_ERROR; + } - /* 1. check argument */ - retv_if(pkgid == NULL, PKGMGR_R_EINVAL); + /* TODO: check removable ? */ - pkgmgrinfo_pkginfo_h handle = NULL; - ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(pkgid, uid, &handle); - - /*check package id */ - tryvm_if(ret < 0, ret = PKGMGR_R_EINVAL, "pkgmgrinfo_pkginfo_get_pkginfo fail"); - tryvm_if(handle == NULL, ret = PKGMGR_R_EINVAL, "Pkgid(%s) can not find in installed pkg DB! \n", pkgid); - - /*check type */ - ret = pkgmgrinfo_pkginfo_get_type(handle, &pkgtype); - tryvm_if(ret < 0, ret = PKGMGR_R_EINVAL, "pkgmgrinfo_pkginfo_get_type fail"); - tryvm_if(pkgtype == NULL, ret = PKGMGR_R_ERROR, "pkgtype is NULL"); - - /*check removable, execpt "rpm" type */ - if (strcmp(pkgtype, "rpm")) { - pkgmgrinfo_pkginfo_is_removable(handle, &removable); - tryvm_if(removable == false, ret = PKGMGR_R_ERROR, "Pkgid(%s) can not be removed, This is non-removalbe package...\n", pkgid); - } - - /*check pkgid length */ - tryvm_if(strlen(pkgid) >= PKG_STRING_LEN_MAX, ret = PKGMGR_R_EINVAL, "pkgid is too long"); - - /* 2. get installer path using pkgtype */ - installer_path = _get_backend_path_with_type(pkgtype); - tryvm_if(installer_path == NULL, ret = PKGMGR_R_EINVAL, "installer_path fail"); - - /* 3. generate req_key */ - req_key = __get_req_key(pkgid); - - /* 4. add callback info - add callback info to pkgmgr_client */ - req_id = _get_request_id(); - __add_op_cbinfo(mpc, req_id, req_key, event_cb, NULL, data); - - /* 5. generate argv */ - - /* argv[0] installer path */ - argv[argcnt++] = installer_path; - /* argv[1] */ - argv[argcnt++] = strdup("-k"); - /* argv[2] */ - argv[argcnt++] = req_key; - /* argv[3] */ - argv[argcnt++] = strdup("-d"); - /* argv[4] */ - argv[argcnt++] = strdup(pkgid); - if (caller_pkgid) { - argv[argcnt++] = strdup("-p"); - argv[argcnt++] = caller_pkgid; + result = comm_client_request(mpc->info.request.cc, "uninstall", + g_variant_new("(ss)", pkgtype, pkgid)); + if (result == NULL) { + pkgmgrinfo_pkginfo_destroy_pkginfo(handle); + return PKGMGR_R_ECOMM; } - - /*** add quote in all string for special charactor like '\n'*** FIX */ - for (i = 0; i < argcnt; i++) { - temp = g_shell_quote(argv[i]); - len += (strlen(temp) + 1); - g_free(temp); + g_variant_get(result, "(i&s)", &ret, &req_key); + if (req_key == NULL) { + g_variant_unref(result); + pkgmgrinfo_pkginfo_destroy_pkginfo(handle); + return PKGMGR_R_ECOMM; } - - args = (char *)calloc(len, sizeof(char)); - tryvm_if(args == NULL, ret = PKGMGR_R_ERROR, "calloc failed"); - - strncpy(args, argv[0], len - 1); - - for (i = 1; i < argcnt; i++) { - strncat(args, " ", strlen(" ")); - temp = g_shell_quote(argv[i]); - strncat(args, temp, strlen(temp)); - g_free(temp); + if (ret != PKGMGR_R_OK) { + g_variant_unref(result); + pkgmgrinfo_pkginfo_destroy_pkginfo(handle); + return ret; } - DBG("[args] %s [len] %d\n", args, len); - - /******************* end of quote ************************/ - /* 6. request install */ - ret = comm_client_request(mpc->info.request.cc, "uninstall", - g_variant_new("(ssss)", req_key, pkgtype, pkgid, args)); - tryvm_if(ret < 0, ret = PKGMGR_R_ECOMM, "calloc failed"); - - ret = req_id; - -catch: - for (i = 0; i < argcnt; i++) - free(argv[i]); + req_id = _get_request_id(); + __add_op_cbinfo(mpc, req_id, req_key, event_cb, NULL, data); - if(args) - free(args); + g_variant_unref(result); + pkgmgrinfo_pkginfo_destroy_pkginfo(handle); - if (handle) - pkgmgrinfo_pkginfo_destroy_pkginfo(handle); - return ret; + return req_id; } API int pkgmgr_client_move(pkgmgr_client *pc, const char *pkg_type, - const char *pkgid, pkgmgr_move_type move_type, pkgmgr_mode mode) + const char *pkgid, pkgmgr_move_type move_type, pkgmgr_mode mode) { - return pkgmgr_client_usr_move( pc,pkg_type, pkgid, move_type, mode, GLOBAL_USER); + return pkgmgr_client_usr_move(pc, pkg_type, pkgid, move_type, mode, + GLOBAL_USER); } API int pkgmgr_client_usr_move(pkgmgr_client *pc, const char *pkg_type, - const char *pkgid, pkgmgr_move_type move_type, pkgmgr_mode mode, uid_t uid) + const char *pkgid, pkgmgr_move_type move_type, + pkgmgr_mode mode, uid_t uid) { - const char *pkgtype = NULL; - char *installer_path = NULL; - char *req_key = NULL; - int i = 0; - char *argv[PKG_ARGC_MAX] = { NULL, }; - char *args = NULL; - int argcnt = 0; - int len = 0; - char *temp = NULL; - int ret = 0; - int req_id = 0; - char buf[128] = {'\0'}; + GVariant *result; + int ret = PKGMGR_R_ECOMM; + pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc; - /* Check for NULL value of pc */ - if (pc == NULL) { - DBG("package manager client handle is NULL\n"); + if (pc == NULL || pkg_type == NULL || pkgid == NULL) { + ERR("invalid parameter"); return PKGMGR_R_EINVAL; } - pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc; - /*check the pc type */ - if (mpc->ctype != PC_REQUEST) - return PKGMGR_R_EINVAL; - - /*check argument */ - if (pkgid == NULL) - return PKGMGR_R_EINVAL; - - if (pkg_type == NULL) { - pkgtype = _get_pkg_type(pkgid, uid); - if (pkgtype == NULL) - return PKGMGR_R_EINVAL; - } else - pkgtype = pkg_type; - - if (strlen(pkgid) >= PKG_STRING_LEN_MAX) - return PKGMGR_R_EINVAL; if ((move_type < PM_MOVE_TO_INTERNAL) || (move_type > PM_MOVE_TO_SDCARD)) return PKGMGR_R_EINVAL; - /* get installer path using pkg_path */ - installer_path = _get_backend_path_with_type(pkgtype); - if (installer_path == NULL) + if (mpc->ctype != PC_REQUEST) { + ERR("mpc->ctype is not PC_REQUEST"); return PKGMGR_R_EINVAL; - - /* generate req_key */ - req_key = __get_req_key(pkgid); - req_id = _get_request_id(); - - /* generate argv */ - snprintf(buf, 128, "%d", move_type); - /* argv[0] installer path */ - argv[argcnt++] = installer_path; - /* argv[1] */ - argv[argcnt++] = strdup("-k"); - /* argv[2] */ - argv[argcnt++] = req_key; - /* argv[3] */ - argv[argcnt++] = strdup("-m"); - /* argv[4] */ - argv[argcnt++] = strdup(pkgid); - /* argv[5] */ - argv[argcnt++] = strdup("-t"); - /* argv[6] */ - argv[argcnt++] = strdup(buf); - - /*** add quote in all string for special charactor like '\n'*** FIX */ - for (i = 0; i < argcnt; i++) { - temp = g_shell_quote(argv[i]); - len += (strlen(temp) + 1); - g_free(temp); - } - - args = (char *)calloc(len, sizeof(char)); - if (args == NULL) { - DBG("calloc failed"); - - for (i = 0; i < argcnt; i++) - free(argv[i]); - - return PKGMGR_R_ERROR; - } - strncpy(args, argv[0], len - 1); - - for (i = 1; i < argcnt; i++) { - strncat(args, " ", strlen(" ")); - temp = g_shell_quote(argv[i]); - strncat(args, temp, strlen(temp)); - g_free(temp); } - DBG("[args] %s [len] %d\n", args, len); - /******************* end of quote ************************/ - /* 6. request install */ - ret = comm_client_request(mpc->info.request.cc, "move", - g_variant_new("(ssss)", req_key, pkgtype, pkgid, args)); - if (ret < 0) { - ERR("request failed, ret=%d\n", ret); - - for (i = 0; i < argcnt; i++) - free(argv[i]); - - free(args); + result = comm_client_request(mpc->info.request.cc, "move", + g_variant_new("(ss)", pkg_type, pkgid)); + if (result == NULL) return PKGMGR_R_ECOMM; - } - - for (i = 0; i < argcnt; i++) - free(argv[i]); - - if (args) - free(args); - - return req_id; -} - -API int pkgmgr_client_move_usr_pkg(pkgmgr_client *pc, const char *pkg_type, - const char *pkgid, uid_t uid, pkgmgr_move_type move_type, pkgmgr_mode mode, - pkgmgr_handler event_cb, void *data) -{ - char *pkgtype; - char *installer_path; - char *req_key; - int req_id; - int i = 0; - char *argv[PKG_ARGC_MAX] = { NULL, }; - char *args = NULL; - int argcnt = 0; - int len = 0; - char *temp = NULL; - int ret = -1; - char buf[128] = {'\0'}; - - /* Check for NULL value of pc */ - retvm_if(pc == NULL, PKGMGR_R_EINVAL, "package manager client handle is NULL\n"); - - pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc; - - /* 0. check the pc type */ - retv_if(mpc->ctype != PC_REQUEST, PKGMGR_R_EINVAL); - - /* 1. check argument */ - retv_if(pkgid == NULL, PKGMGR_R_EINVAL); - - pkgmgrinfo_pkginfo_h handle = NULL; - if (uid != GLOBAL_USER) - ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(pkgid, uid, &handle); - else - ret = pkgmgrinfo_pkginfo_get_pkginfo(pkgid, &handle); - - /*check package id */ - tryvm_if(ret < 0, ret = PKGMGR_R_EINVAL, "pkgmgrinfo_pkginfo_get_pkginfo fail"); - tryvm_if(handle == NULL, ret = PKGMGR_R_EINVAL, "Pkgid(%s) can not find in installed pkg DB! \n", pkgid); - - /*check type */ - ret = pkgmgrinfo_pkginfo_get_type(handle, &pkgtype); - tryvm_if(ret < 0, ret = PKGMGR_R_EINVAL, "pkgmgrinfo_pkginfo_get_type fail"); - tryvm_if(pkgtype == NULL, ret = PKGMGR_R_ERROR, "pkgtype is NULL"); - - /*check pkgid length */ - tryvm_if(strlen(pkgid) >= PKG_STRING_LEN_MAX, ret = PKGMGR_R_EINVAL, "pkgid is too long"); - - /*check move_type */ - tryvm_if((move_type < PM_MOVE_TO_INTERNAL) || (move_type > PM_MOVE_TO_SDCARD), ret = PKGMGR_R_EINVAL, "move_type is not supported"); - - /* 2. get installer path using pkgtype */ - installer_path = _get_backend_path_with_type(pkgtype); - tryvm_if(installer_path == NULL, ret = PKGMGR_R_EINVAL, "installer_path fail"); - - /* 3. generate req_key */ - req_key = __get_req_key(pkgid); - - /* 4. add callback info - add callback info to pkgmgr_client */ - req_id = _get_request_id(); - __add_op_cbinfo(mpc, req_id, req_key, event_cb, NULL, data); - - /* 5. generate argv */ - snprintf(buf, 128, "%d", move_type); - /* argv[0] installer path */ - argv[argcnt++] = installer_path; - /* argv[1] */ - argv[argcnt++] = strdup("-k"); - /* argv[2] */ - argv[argcnt++] = req_key; - /* argv[3] */ - argv[argcnt++] = strdup("-m"); - /* argv[4] */ - argv[argcnt++] = strdup(pkgid); - /* argv[5] */ - argv[argcnt++] = strdup("-t"); - /* argv[6] */ - argv[argcnt++] = strdup(buf); - - /*** add quote in all string for special charactor like '\n'*** FIX */ - for (i = 0; i < argcnt; i++) { - temp = g_shell_quote(argv[i]); - len += (strlen(temp) + 1); - g_free(temp); - } - - args = (char *)calloc(len, sizeof(char)); - tryvm_if(args == NULL, ret = PKGMGR_R_ERROR, "calloc failed"); - - strncpy(args, argv[0], len - 1); + g_variant_get(result, "(i)", &ret); + g_variant_unref(result); - for (i = 1; i < argcnt; i++) { - strncat(args, " ", strlen(" ")); - temp = g_shell_quote(argv[i]); - strncat(args, temp, strlen(temp)); - g_free(temp); - } - DBG("[args] %s [len] %d\n", args, len); - - /******************* end of quote ************************/ - - /* 6. request install */ - ret = comm_client_request(mpc->info.request.cc, "move", - g_variant_new("(ssss)", req_key, pkgtype, pkgid, args)); - tryvm_if(ret < 0, ret = PKGMGR_R_ECOMM, "calloc failed"); - - ret = req_id; - -catch: - for (i = 0; i < argcnt; i++) - free(argv[i]); - - if(args) - free(args); - - if (handle) - pkgmgrinfo_pkginfo_destroy_pkginfo(handle); return ret; } -API int pkgmgr_client_move_pkg(pkgmgr_client *pc, const char *pkg_type, - const char *pkgid, pkgmgr_move_type move_type, pkgmgr_mode mode, - pkgmgr_handler event_cb, void *data) +API int pkgmgr_client_usr_activate(pkgmgr_client *pc, const char *pkg_type, + const char *pkgid, uid_t uid) { - return pkgmgr_client_move_usr_pkg(pc, pkg_type, pkgid, GLOBAL_USER, move_type, mode, event_cb, data); -} - -API int pkgmgr_client_usr_activate(pkgmgr_client * pc, const char *pkg_type, - const char *pkgid, uid_t uid) -{ - const char *pkgtype; - char *req_key; - int ret; - /* Check for NULL value of pc */ - retvm_if(pc == NULL, PKGMGR_R_EINVAL, "package manager client handle is NULL\n"); - - pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc; - - /* 0. check the pc type */ - retvm_if(mpc->ctype != PC_REQUEST, PKGMGR_R_EINVAL, "mpc->ctype is not PC_REQUEST"); - - /* 1. check argument */ - retvm_if(pkgid == NULL, PKGMGR_R_EINVAL, "pkgid is NULL"); - retvm_if(strlen(pkgid) >= PKG_STRING_LEN_MAX, PKGMGR_R_EINVAL, "pkgid length over PKG_STRING_LEN_MAX "); - - if (pkg_type == NULL) { - pkgtype = _get_pkg_type(pkgid, uid); - retvm_if(pkgtype == NULL, PKGMGR_R_EINVAL, "pkgtype is NULL"); - } else - pkgtype = pkg_type; - - /* 2. generate req_key */ - req_key = __get_req_key(pkgid); - retvm_if(req_key == NULL, PKGMGR_R_EINVAL, "req_key is NULL"); + GVariant *result; + int ret = PKGMGR_R_ECOMM; + pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc; - /* 3. request activate */ - ret = comm_client_request(mpc->info.request.cc, "activate", - g_variant_new("(ssss)", req_key, pkgtype, pkgid, "1 PKG")); - tryvm_if(ret < 0, ret = PKGMGR_R_ECOMM, "request failed, ret=%d", ret); + if (pc == NULL || pkgid == NULL) { + ERR("invalid parameter"); + return PKGMGR_R_EINVAL; + } - ret = PKGMGR_R_OK; + result = comm_client_request(mpc->info.request.cc, "enable_pkg", + g_variant_new("(s)", pkgid)); + if (result == NULL) + return PKGMGR_R_ECOMM; + g_variant_get(result, "(i)", &ret); + g_variant_unref(result); -catch: - free(req_key); return ret; } -API int pkgmgr_client_activate(pkgmgr_client * pc, const char *pkg_type, - const char *pkgid) +API int pkgmgr_client_activate(pkgmgr_client *pc, const char *pkg_type, + const char *pkgid) { return pkgmgr_client_usr_activate(pc, pkg_type, pkgid, GLOBAL_USER); } @@ -1886,41 +1104,22 @@ API int pkgmgr_client_activate(pkgmgr_client * pc, const char *pkg_type, API int pkgmgr_client_usr_deactivate(pkgmgr_client *pc, const char *pkg_type, const char *pkgid, uid_t uid) { - const char *pkgtype; - char *req_key; - int ret; - /* Check for NULL value of pc */ - retvm_if(pc == NULL, PKGMGR_R_EINVAL, "package manager client handle is NULL\n"); - - pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc; - - /* 0. check the pc type */ - retvm_if(mpc->ctype != PC_REQUEST, PKGMGR_R_EINVAL, "mpc->ctype is not PC_REQUEST"); - - /* 1. check argument */ - retvm_if(pkgid == NULL, PKGMGR_R_EINVAL, "pkgid is NULL"); - retvm_if(strlen(pkgid) >= PKG_STRING_LEN_MAX, PKGMGR_R_EINVAL, "pkgid length over PKG_STRING_LEN_MAX "); - - if (pkg_type == NULL) { - pkgtype = _get_pkg_type(pkgid, uid); - if (pkgtype == NULL) - return PKGMGR_R_EINVAL; - } else - pkgtype = pkg_type; - - /* 2. generate req_key */ - req_key = __get_req_key(pkgid); - retvm_if(req_key == NULL, PKGMGR_R_EINVAL, "req_key is NULL"); + GVariant *result; + int ret = PKGMGR_R_ECOMM; + pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc; - /* 3. request activate */ - ret = comm_client_request(mpc->info.request.cc, "deactivate", - g_variant_new("(ssss)", req_key, pkgtype, pkgid, "0 PKG")); - tryvm_if(ret < 0, ret = PKGMGR_R_ECOMM, "request failed, ret=%d", ret); + if (pc == NULL || pkgid == NULL) { + ERR("invalid parameter"); + return PKGMGR_R_EINVAL; + } - ret = PKGMGR_R_OK; + result = comm_client_request(mpc->info.request.cc, "disable_pkg", + g_variant_new("(s)", pkgid)); + if (result == NULL) + return PKGMGR_R_ECOMM; + g_variant_get(result, "(i)", &ret); + g_variant_unref(result); -catch: - free(req_key); return ret; } @@ -1930,166 +1129,65 @@ API int pkgmgr_client_deactivate(pkgmgr_client *pc, const char *pkg_type, return pkgmgr_client_usr_deactivate(pc, pkg_type, pkgid, GLOBAL_USER); } -API int pkgmgr_client_usr_activate_app(pkgmgr_client * pc, const char *appid, uid_t uid) +API int pkgmgr_client_usr_activate_app(pkgmgr_client *pc, const char *appid, + uid_t uid) { - const char *pkgtype; - char *req_key; - int ret; - /* Check for NULL value of pc */ - retvm_if(pc == NULL, PKGMGR_R_EINVAL, "package manager client handle is NULL\n"); - - pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc; - - /* 0. check the pc type */ - retvm_if(mpc->ctype != PC_REQUEST, PKGMGR_R_EINVAL, "mpc->ctype is not PC_REQUEST"); - - /* 1. check argument */ - retvm_if(appid == NULL, PKGMGR_R_EINVAL, "pkgid is NULL"); - retvm_if(strlen(appid) >= PKG_STRING_LEN_MAX, PKGMGR_R_EINVAL, "pkgid length over PKG_STRING_LEN_MAX "); - - pkgtype = _get_pkg_type(appid, uid); - retvm_if(pkgtype == NULL, PKGMGR_R_EINVAL, "pkgtype is NULL"); - - /* 2. generate req_key */ - req_key = __get_req_key(appid); - retvm_if(req_key == NULL, PKGMGR_R_EINVAL, "req_key is NULL"); + GVariant *result; + int ret = PKGMGR_R_ECOMM; + pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc; - /* 3. request activate */ - ret = comm_client_request(mpc->info.request.cc, "activate", - g_variant_new("(ssss)", req_key, pkgtype, appid, "1 APP")); - tryvm_if(ret < 0, ret = PKGMGR_R_ECOMM, "request failed, ret=%d", ret); + if (pc == NULL || appid == NULL) { + ERR("invalid parameter"); + return PKGMGR_R_EINVAL; + } - ret = PKGMGR_R_OK; + result = comm_client_request(mpc->info.request.cc, "enable_app", + g_variant_new("(s)", appid)); + if (result == NULL) + return PKGMGR_R_ECOMM; + g_variant_get(result, "(i)", &ret); + g_variant_unref(result); -catch: - free(req_key); return ret; } API int pkgmgr_client_activate_app(pkgmgr_client * pc, const char *appid) { - return pkgmgr_client_usr_activate_app(pc,appid, GLOBAL_USER); + return pkgmgr_client_usr_activate_app(pc, appid, GLOBAL_USER); } -API int pkgmgr_client_usr_activate_appv(pkgmgr_client * pc, const char *appid, char *const argv[], uid_t uid) +/* TODO: deprecate? */ +API int pkgmgr_client_usr_activate_appv(pkgmgr_client *pc, const char *appid, + char *const argv[], uid_t uid) { - const char *pkgtype; - char *req_key; - int ret; - int i = 0; - char *temp = NULL; - int len = 0; - int argcnt = 0; - char *args = NULL; - char *argsr = NULL; - /* Check for NULL value of pc */ - retvm_if(pc == NULL, PKGMGR_R_EINVAL, "package manager client handle is NULL\n"); - - pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc; - - /* 0. check the pc type */ - retvm_if(mpc->ctype != PC_REQUEST, PKGMGR_R_EINVAL, "mpc->ctype is not PC_REQUEST"); - - /* 1. check argument */ - retvm_if(appid == NULL, PKGMGR_R_EINVAL, "pkgid is NULL"); - retvm_if(strlen(appid) >= PKG_STRING_LEN_MAX, PKGMGR_R_EINVAL, "pkgid length over PKG_STRING_LEN_MAX "); - - pkgtype = _get_pkg_type(appid, uid); - retvm_if(pkgtype == NULL, PKGMGR_R_EINVAL, "pkgtype is NULL"); - - /* 2. generate req_key */ - req_key = __get_req_key(appid); - retvm_if(req_key == NULL, PKGMGR_R_EINVAL, "req_key is NULL"); - - /*** add quote in all string for special charactor like '\n'*** FIX */ - if (argv) { - for (i = 0; argv[i]; i++) { - temp = g_shell_quote(argv[i]); - len += (strlen(temp) + 1); - g_free(temp); - argcnt++; - } - - if (argcnt) { - args = (char *)calloc(len, sizeof(char)); - tryvm_if(args == NULL, ret = PKGMGR_R_ERROR, "calloc failed"); - strncpy(args, argv[0], len - 1); - - for (i = 1; i < argcnt; i++) { - strncat(args, " ", strlen(" ")); - temp = g_shell_quote(argv[i]); - strncat(args, temp, strlen(temp)); - g_free(temp); - } - } - } - - argsr = (char *)calloc(strlen("1 APP")+2+len, sizeof(char)); - tryvm_if(argsr == NULL, ret = PKGMGR_R_ERROR, "calloc failed"); - - strncpy(argsr, "1 APP", strlen("1 APP")); - if (argcnt) { - strncat(argsr, " ", strlen(" ")); - strncat(argsr, args, strlen(args)); - } - - DBG("argsr [%s]\n", argsr); - /******************* end of quote ************************/ - - /* 3. request activate */ - ret = comm_client_request(mpc->info.request.cc, "activate", - g_variant_new("(ssss)", req_key, pkgtype, appid, argsr)); - tryvm_if(ret < 0, ret = PKGMGR_R_ECOMM, "request failed, ret=%d", ret); - - ret = PKGMGR_R_OK; - -catch: - - free(req_key); - free(args); - free(argsr); - - return ret; + return pkgmgr_client_usr_activate_app(pc, appid, uid); } -API int pkgmgr_client_activate_appv(pkgmgr_client * pc, const char *appid, char *const argv[]) +API int pkgmgr_client_activate_appv(pkgmgr_client *pc, const char *appid, + char *const argv[]) { - return pkgmgr_client_usr_activate_appv(pc, appid, argv, GLOBAL_USER); + return pkgmgr_client_usr_activate_app(pc, appid, GLOBAL_USER); } -API int pkgmgr_client_usr_deactivate_app(pkgmgr_client *pc, const char *appid, uid_t uid) +API int pkgmgr_client_usr_deactivate_app(pkgmgr_client *pc, const char *appid, + uid_t uid) { - const char *pkgtype; - char *req_key; - int ret; - /* Check for NULL value of pc */ - retvm_if(pc == NULL, PKGMGR_R_EINVAL, "package manager client handle is NULL\n"); - - pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc; - - /* 0. check the pc type */ - retvm_if(mpc->ctype != PC_REQUEST, PKGMGR_R_EINVAL, "mpc->ctype is not PC_REQUEST"); - - /* 1. check argument */ - retvm_if(appid == NULL, PKGMGR_R_EINVAL, "pkgid is NULL"); - retvm_if(strlen(appid) >= PKG_STRING_LEN_MAX, PKGMGR_R_EINVAL, "pkgid length over PKG_STRING_LEN_MAX "); - - pkgtype = _get_pkg_type(appid, uid); - retvm_if(pkgtype == NULL, PKGMGR_R_EINVAL, "pkgtype is NULL"); - - /* 2. generate req_key */ - req_key = __get_req_key(appid); - retvm_if(req_key == NULL, PKGMGR_R_EINVAL, "req_key is NULL"); + GVariant *result; + int ret = PKGMGR_R_ECOMM; + pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc; - /* 3. request activate */ - ret = comm_client_request(mpc->info.request.cc, "deactivate", - g_variant_new("(ssss)", req_key, pkgtype, appid, "0 APP")); - tryvm_if(ret < 0, ret = PKGMGR_R_ECOMM, "request failed, ret=%d", ret); + if (pc == NULL || appid == NULL) { + ERR("invalid parameter"); + return PKGMGR_R_EINVAL; + } - ret = PKGMGR_R_OK; + result = comm_client_request(mpc->info.request.cc, "disable_app", + g_variant_new("(s)", appid)); + if (result == NULL) + return PKGMGR_R_ECOMM; + g_variant_get(result, "(i)", &ret); + g_variant_unref(result); -catch: - free(req_key); return ret; } @@ -2098,119 +1196,40 @@ API int pkgmgr_client_deactivate_app(pkgmgr_client *pc, const char *appid) return pkgmgr_client_usr_deactivate_app(pc, appid, GLOBAL_USER); } -API int pkgmgr_client_usr_clear_user_data(pkgmgr_client *pc, const char *pkg_type, - const char *appid, pkgmgr_mode mode, uid_t uid) +API int pkgmgr_client_usr_clear_user_data(pkgmgr_client *pc, + const char *pkg_type, const char *appid, pkgmgr_mode mode, + uid_t uid) { - const char *pkgtype; - char *installer_path; - char *req_key; - int i = 0; - char *argv[PKG_ARGC_MAX] = { NULL, }; - char *args = NULL; - int argcnt = 0; - int len = 0; - char *temp = NULL; - int ret; + GVariant *result; + int ret = PKGMGR_R_ECOMM; + pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc; - /* Check for NULL value of pc */ - if (pc == NULL) { - DBG("package manager client handle is NULL\n"); + if (pc == NULL || pkg_type == NULL || appid == NULL) { + ERR("invalid parameter"); return PKGMGR_R_EINVAL; } - pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc; - - /* 0. check the pc type */ - if (mpc->ctype != PC_REQUEST) - return PKGMGR_R_EINVAL; - - /* 1. check argument */ - if (appid == NULL) - return PKGMGR_R_EINVAL; - - - if (pkg_type == NULL) { - pkgtype = _get_pkg_type(appid, uid); - if (pkgtype == NULL) - return PKGMGR_R_EINVAL; - } else - pkgtype = pkg_type; - - if (strlen(appid) >= PKG_STRING_LEN_MAX) - return PKGMGR_R_EINVAL; - /* 2. get installer path using pkg_path */ - installer_path = _get_backend_path_with_type(pkgtype); - if (installer_path == NULL) + if (mpc->ctype != PC_REQUEST) { + ERR("mpc->ctype is not PC_REQUEST"); return PKGMGR_R_EINVAL; - - /* 3. generate req_key */ - req_key = __get_req_key(appid); - - /* 4. generate argv */ - - /* argv[0] installer path */ - argv[argcnt++] = installer_path; - /* argv[1] */ - argv[argcnt++] = strdup("-k"); - /* argv[2] */ - argv[argcnt++] = req_key; - /* argv[3] */ - argv[argcnt++] = strdup("-c"); - /* argv[4] */ - argv[argcnt++] = strdup(appid); - - /*** add quote in all string for special charactor like '\n'*** FIX */ - for (i = 0; i < argcnt; i++) { - temp = g_shell_quote(argv[i]); - len += (strlen(temp) + 1); - g_free(temp); - } - - args = (char *)calloc(len, sizeof(char)); - if (args == NULL) { - DBG("calloc failed"); - - for (i = 0; i < argcnt; i++) - free(argv[i]); - - return PKGMGR_R_ERROR; } - strncpy(args, argv[0], len - 1); - - for (i = 1; i < argcnt; i++) { - strncat(args, " ", strlen(" ")); - temp = g_shell_quote(argv[i]); - strncat(args, temp, strlen(temp)); - g_free(temp); - } - DBG("[args] %s [len] %d\n", args, len); - /******************* end of quote ************************/ - - /* 6. request clear */ - ret = comm_client_request(mpc->info.request.cc, "cleardata", - g_variant_new("(ssss)", req_key, pkgtype, appid, args)); - if (ret < 0) { - ERR("request failed, ret=%d\n", ret); - - for (i = 0; i < argcnt; i++) - free(argv[i]); - free(args); + result = comm_client_request(mpc->info.request.cc, "cleardata", + g_variant_new("(ss)", pkg_type, appid)); + if (result == NULL) return PKGMGR_R_ECOMM; - } - - for (i = 0; i < argcnt; i++) - free(argv[i]); - free(args); + g_variant_get(result, "(i)", &ret); + g_variant_unref(result); - return PKGMGR_R_OK; + return ret; } API int pkgmgr_client_clear_user_data(pkgmgr_client *pc, const char *pkg_type, - const char *appid, pkgmgr_mode mode) + const char *appid, pkgmgr_mode mode) { - return pkgmgr_client_usr_clear_user_data(pc, pkg_type, appid,mode, GLOBAL_USER); + return pkgmgr_client_usr_clear_user_data(pc, pkg_type, appid, mode, + GLOBAL_USER); } API int pkgmgr_client_set_status_type(pkgmgr_client *pc, int status_type) @@ -2333,7 +1352,7 @@ API int pkgmgr_client_usr_request_service(pkgmgr_request_service_type service_ty tryvm_if(pc == NULL, ret = PKGMGR_R_EINVAL, "pc is NULL\n"); tryvm_if((service_mode < PM_MOVE_TO_INTERNAL) || (service_mode > PM_MOVE_TO_SDCARD), ret = PKGMGR_R_EINVAL, "service_mode is wrong\n"); - ret = __move_pkg_process(pc, pkgid, uid, (pkgmgr_move_type)service_mode, event_cb, data); + ret = __move_pkg_process(pc, pkgid, pkg_type, uid, (pkgmgr_move_type)service_mode, event_cb, data); break; case PM_REQUEST_GET_SIZE: @@ -2393,46 +1412,27 @@ API int pkgmgr_client_request_size_info(void) // get all package size (data, tot API int pkgmgr_client_usr_clear_cache_dir(const char *pkgid, uid_t uid) { - retvm_if(pkgid == NULL, PKGMGR_R_EINVAL, "package id is null\n"); - - int ret = 0; - pkgmgr_client_t *pc = NULL; - char *pkg_type = NULL; - int is_type_malloced = 0; + GVariant *result; + int ret = PKGMGR_R_ECOMM; + pkgmgr_client_t *pc; - pkgmgrinfo_pkginfo_h handle = NULL; + if (pkgid == NULL) { + ERR("invalid parameter"); + return PMINFO_R_EINVAL; + } pc = pkgmgr_client_new(PC_REQUEST); - retvm_if(pc == NULL, PKGMGR_R_ESYSTEM, "request pc is null\n"); - - if (strcmp(pkgid, PKG_CLEAR_ALL_CACHE) != 0) - { - ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(pkgid, uid, &handle); - tryvm_if(ret < 0, ret = PKGMGR_R_ENOPKG, "pkgmgrinfo_pkginfo_get_pkginfo failed"); - - ret = pkgmgrinfo_pkginfo_get_type(handle, &pkg_type); - tryvm_if(ret < 0, ret = PKGMGR_R_ESYSTEM, "pkgmgrinfo_pkginfo_get_type failed"); - } - else - { - pkg_type = (char *)malloc(strlen("rpm") + 1); - strcpy(pkg_type, "rpm"); - is_type_malloced = 1; + if (pc == NULL) { + ERR("out of memory"); + return PKGMGR_R_ESYSTEM; } - ret = comm_client_request(pc->info.request.cc, "clearcache", - g_variant_new("(sss)", "reqkey", pkg_type, pkgid)); - tryvm_if(ret < 0, ret = PKGMGR_R_ERROR, "COMM_REQ_CLEAR_CACHE_DIR failed, ret=%d\n", ret); - - ret = PKGMGR_R_OK; -catch: - if (pc) - pkgmgr_client_free(pc); - - if(is_type_malloced) - free(pkg_type); - - pkgmgrinfo_pkginfo_destroy_pkginfo(handle); + result = comm_client_request(pc->info.request.cc, "clearcache", + g_variant_new("(s)", pkgid)); + if (result == NULL) + return PKGMGR_R_ECOMM; + g_variant_get(result, "(i)", &ret); + g_variant_unref(result); return ret; } @@ -2449,123 +1449,118 @@ API int pkgmgr_client_clear_usr_all_cache_dir(uid_t uid) API int pkgmgr_client_clear_all_cache_dir(void) { - int ret = 0; - ret = pkgmgr_client_usr_clear_cache_dir(PKG_CLEAR_ALL_CACHE, GLOBAL_USER); - return ret; + return pkgmgr_client_usr_clear_cache_dir(PKG_CLEAR_ALL_CACHE, GLOBAL_USER); } -API int pkgmgr_client_get_size(pkgmgr_client * pc, const char *pkgid, pkgmgr_getsize_type get_type, pkgmgr_handler event_cb, void *data) +API int pkgmgr_client_get_size(pkgmgr_client * pc, const char *pkgid, + pkgmgr_getsize_type get_type, pkgmgr_handler event_cb, + void *data) { - return pkgmgr_client_usr_get_size(pc, pkgid, get_type, event_cb, data, GLOBAL_USER); + return pkgmgr_client_usr_get_size(pc, pkgid, get_type, event_cb, data, + GLOBAL_USER); } -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) +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) { + GVariant *result; + int ret = PKGMGR_R_ECOMM; char *req_key = NULL; - int ret =0; - char *pkgtype = "rpm"; - char *argv[PKG_ARGC_MAX] = { NULL, }; - char *args = NULL; - int argcnt = 0; - int len = 0; - char *temp = NULL; - int i = 0; - char buf[128] = {'\0'}; - int req_id = 0; - - pkgmgr_client_t *mpc = (pkgmgr_client_t *) pc; - retvm_if(mpc->ctype != PC_REQUEST, PKGMGR_R_EINVAL, "mpc->ctype is not PC_REQUEST\n"); - retvm_if(event_cb == NULL, PKGMGR_R_EINVAL, "event_cb is NULL\n"); - retvm_if(pkgid == NULL, PKGMGR_R_EINVAL, "pkgid is NULL\n"); - - req_key = __get_req_key(pkgid); - retvm_if(req_key == NULL, PKGMGR_R_EINVAL, "req_key is NULL"); - - req_id = _get_request_id(); - __add_op_cbinfo(mpc, req_id, req_key, event_cb, NULL, data); - - snprintf(buf, 128, "%d", get_type); - argv[argcnt++] = strdup(pkgid); - argv[argcnt++] = strdup(buf); - argv[argcnt++] = strdup("-k"); - argv[argcnt++] = req_key; + int req_id; + pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc; - /*** add quote in all string for special charactor like '\n'*** FIX */ - for (i = 0; i < argcnt; i++) { - temp = g_shell_quote(argv[i]); - len += (strlen(temp) + 1); - g_free(temp); + if (pc == NULL || pkgid == NULL || event_cb == NULL) { + ERR("invalid parameter"); + return PKGMGR_R_EINVAL; } - args = (char *)calloc(len, sizeof(char)); - tryvm_if(args == NULL, ret = PKGMGR_R_EINVAL, "installer_path fail"); + if (mpc->ctype != PC_REQUEST) { + ERR("mpc->ctype is not PC_REQUEST"); + return PKGMGR_R_EINVAL; + } - strncpy(args, argv[0], len - 1); + /* FIXME */ + if (strcmp(pkgid, PKG_SIZE_INFO_TOTAL) == 0) + get_type = PM_GET_TOTAL_PKG_SIZE_INFO; + else + get_type = PM_GET_PKG_SIZE_INFO; + result = comm_client_request(mpc->info.request.cc, "getsize", + g_variant_new("(si)", pkgid, get_type)); + if (result == NULL) + return PKGMGR_R_ECOMM; - for (i = 1; i < argcnt; i++) { - strncat(args, " ", strlen(" ")); - temp = g_shell_quote(argv[i]); - strncat(args, temp, strlen(temp)); - g_free(temp); + g_variant_get(result, "(i&s)", &ret, &req_key); + if (req_key == NULL) { + g_variant_unref(result); + return PKGMGR_R_ECOMM; + } + if (ret != PKGMGR_R_OK) { + g_variant_unref(result); + return ret; } - DBG("[args] %s [len] %d\n", args, len); - - /* request */ - ret = comm_client_request(mpc->info.request.cc, "getsize", - g_variant_new("(ssss)", req_key, pkgtype, pkgid, args)); - if (ret < 0) - ERR("comm_client_request failed, ret=%d\n", ret); -catch: - for (i = 0; i < argcnt; i++) - free(argv[i]); + req_id = _get_request_id(); + __add_op_cbinfo(mpc, req_id, req_key, event_cb, NULL, data); - if(args) - free(args); + g_variant_unref(result); - return ret; + return req_id; } -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) +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) { - pkgmgrinfo_pkginfo_h pkginfo = NULL; + GVariant *result; + int ret = PKGMGR_R_ECOMM; char *req_key = NULL; - int req_id = 0; - int res = 0; - int type = PM_GET_PKG_SIZE_INFO; - - retvm_if(pc == NULL, PKGMGR_R_EINVAL, "The specified pc is NULL."); - retvm_if(pkgid == NULL, PKGMGR_R_EINVAL, "The package id is NULL."); + int req_id; + int get_type; + pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc; - if (strcmp(pkgid, PKG_SIZE_INFO_TOTAL) == 0) - { // total package size info - type = PM_GET_TOTAL_PKG_SIZE_INFO; + if (pc == NULL || pkgid == NULL || event_cb == NULL) { + ERR("invalid parameter"); + return PKGMGR_R_EINVAL; } - else - { - res = pkgmgrinfo_pkginfo_get_usr_pkginfo(pkgid, uid, &pkginfo); - retvm_if(res != 0, PKGMGR_R_ENOPKG, "The package id is not installed."); - if (pkginfo) { - pkgmgrinfo_pkginfo_destroy_pkginfo(pkginfo); - } + if (mpc->ctype != PC_REQUEST) { + ERR("mpc->ctype is not PC_REQUEST"); + return PKGMGR_R_EINVAL; } - pkgmgr_client_t *mpc = (pkgmgr_client_t *)pc; - retvm_if(mpc->ctype != PC_REQUEST, PKGMGR_R_EINVAL, "mpc->ctype is not PC_REQUEST"); + /* FIXME */ + if (__change_op_cb_for_getsize(mpc) < 0) { + ERR("__change_op_cb_for_getsize failed"); + return PKGMGR_R_ESYSTEM; + } - res = __change_op_cb_for_getsize(mpc); - retvm_if(res < 0 , PKGMGR_R_ESYSTEM, "__change_op_cb_for_getsize is fail"); + if (strcmp(pkgid, PKG_SIZE_INFO_TOTAL) == 0) + get_type = PM_GET_TOTAL_PKG_SIZE_INFO; + else + get_type = PM_GET_PKG_SIZE_INFO; + result = comm_client_request(mpc->info.request.cc, "getsize", + g_variant_new("(si)", pkgid, get_type)); + if (result == NULL) + return PKGMGR_R_ECOMM; - req_key = __get_req_key(pkgid); - retvm_if(req_key == NULL, PKGMGR_R_ESYSTEM, "req_key is NULL"); + g_variant_get(result, "(i&s)", &ret, &req_key); + if (req_key == NULL) { + g_variant_unref(result); + return PKGMGR_R_ECOMM; + } + if (ret != PKGMGR_R_OK) { + g_variant_unref(result); + return ret; + } req_id = _get_request_id(); - __add_op_cbinfo(mpc, req_id, req_key, __get_pkg_size_info_cb, event_cb, user_data); + __add_op_cbinfo(mpc, req_id, req_key, __get_pkg_size_info_cb, event_cb, + user_data); - res = __get_package_size_info(mpc, req_key, pkgid, type, uid); + g_variant_unref(result); - return res; + return req_id; } 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) diff --git a/comm/comm_client.h b/comm/comm_client.h index 731baec..1782e9e 100644 --- a/comm/comm_client.h +++ b/comm/comm_client.h @@ -42,7 +42,7 @@ typedef void (*status_cb) (void *cb_data, uid_t target_uid, const char *req_id, API comm_client *comm_client_new(void); API int comm_client_free(comm_client *cc); -API int comm_client_request(comm_client *cc, const char *method, GVariant *params); +API GVariant *comm_client_request(comm_client *cc, const char *method, GVariant *params); API int comm_client_set_status_callback(int comm_status_type, comm_client *cc, status_cb cb, void *cb_data); #endif /* __COMM_CLIENT_H__ */ diff --git a/comm/comm_client_gdbus.c b/comm/comm_client_gdbus.c index e53dbc7..5e4c164 100644 --- a/comm/comm_client_gdbus.c +++ b/comm/comm_client_gdbus.c @@ -103,7 +103,7 @@ void _on_signal_handle_filter(GDBusConnection *conn, int status_type; /* Values to be received by signal */ uid_t target_uid; - char *req_id = NULL; + char *req_id; char *pkg_type = NULL; char *pkgid = NULL; char *key = NULL; @@ -219,11 +219,9 @@ int comm_client_free(comm_client *cc) /** * Request a message */ -int -comm_client_request(comm_client *cc, const char *method, GVariant *params) +GVariant *comm_client_request(comm_client *cc, const char *method, GVariant *params) { GError *error = NULL; - gint rc = -1; GDBusProxy *proxy; GVariant *result = NULL; int retry_cnt = 0; @@ -254,16 +252,7 @@ comm_client_request(comm_client *cc, const char *method, GVariant *params) retry_cnt++; } while (retry_cnt <= COMM_CLIENT_RETRY_MAX); - if (result == NULL) - return -1; - - g_variant_get(result, "(i)", &rc); - g_variant_unref(result); - - if (rc != 0) - ERR("request return code: %d", rc); - - return rc == 0 ? COMM_RET_OK : COMM_RET_ERROR; + return result; } /** diff --git a/server/include/pkgmgr-server.h b/server/include/pkgmgr-server.h index 517b5b2..69cca87 100644 --- a/server/include/pkgmgr-server.h +++ b/server/include/pkgmgr-server.h @@ -43,6 +43,20 @@ #define MAX_PKG_ARGS_LEN 4096 #define DESKTOP_FILE_DIRS_NUM 1024 +enum request_type { + PKGMGR_REQUEST_TYPE_INSTALL, + PKGMGR_REQUEST_TYPE_REINSTALL, + PKGMGR_REQUEST_TYPE_UNINSTALL, + PKGMGR_REQUEST_TYPE_MOVE, + PKGMGR_REQUEST_TYPE_ENABLE, + PKGMGR_REQUEST_TYPE_DISABLE, + PKGMGR_REQUEST_TYPE_GETSIZE, + PKGMGR_REQUEST_TYPE_CLEARDATA, + PKGMGR_REQUEST_TYPE_CLEARCACHE, + PKGMGR_REQUEST_TYPE_KILL, + PKGMGR_REQUEST_TYPE_CHECK, +}; + typedef struct { char req_id[MAX_REQ_ID_LEN]; int req_type; @@ -60,16 +74,7 @@ typedef struct backend_info_t { char args[MAX_PKG_ARGS_LEN]; } backend_info; -struct pm_inotify_paths_t { - int wd; - char *path; -}; -typedef struct pm_inotify_paths_t pm_inotify_paths; - char *_get_backend_cmd(char *type); -void _pm_desktop_file_monitor_init(); -void _pm_desktop_file_monitor_fini(); -int _pm_desktop_file_dir_search(pm_inotify_paths *paths, int number); gboolean queue_job(void *data); int __init_request_handler(void); diff --git a/server/include/pm-queue.h b/server/include/pm-queue.h index b2592f1..fac45d5 100644 --- a/server/include/pm-queue.h +++ b/server/include/pm-queue.h @@ -47,9 +47,8 @@ typedef struct queue_info_map_t { #define MAX_QUEUE_NUM 128 int _pm_queue_init(void); -pm_dbus_msg *_pm_queue_create_item(uid_t uid, const char *req_id, int req_type, - const char *pkg_type, const char *pkgid, const char *args); -int _pm_queue_push(pm_dbus_msg *item); +int _pm_queue_push(uid_t uid, const char *req_id, int req_type, + const char *pkg_type, const char *pkgid, const char *argv); /*position specifies the queue from which to pop request*/ pm_dbus_msg *_pm_queue_pop(int position); void _pm_queue_final(); diff --git a/server/src/pkgmgr-server.c b/server/src/pkgmgr-server.c index 3f0f4a5..f5b9c23 100644 --- a/server/src/pkgmgr-server.c +++ b/server/src/pkgmgr-server.c @@ -715,13 +715,173 @@ static void __exec_with_arg_vector(const char *cmd, char **argv, uid_t uid) } } +static void __process_install(pm_dbus_msg *item) +{ + char *backend_cmd; + char **args_vector; + char args[MAX_PKG_ARGS_LEN]; + + backend_cmd = _get_backend_cmd(item->pkg_type); + if (backend_cmd == NULL) + return; + + snprintf(args, sizeof(args), "%s -k %s -i %s", backend_cmd, + item->req_id, item->pkgid); + args_vector = __generate_argv(args); + args_vector[0] = backend_cmd; + + __exec_with_arg_vector(backend_cmd, args_vector, item->uid); +} + +static void __process_reinstall(pm_dbus_msg *item) +{ + char *backend_cmd; + char **args_vector; + char args[MAX_PKG_ARGS_LEN]; + + backend_cmd = _get_backend_cmd(item->pkg_type); + if (backend_cmd == NULL) + return; + + snprintf(args, sizeof(args), "%s -k %s -r %s", backend_cmd, + item->req_id, item->pkgid); + args_vector = __generate_argv(args); + args_vector[0] = backend_cmd; + + __exec_with_arg_vector(backend_cmd, args_vector, item->uid); +} + +static void __process_uninstall(pm_dbus_msg *item) +{ + char *backend_cmd; + char **args_vector; + char args[MAX_PKG_ARGS_LEN]; + + backend_cmd = _get_backend_cmd(item->pkg_type); + if (backend_cmd == NULL) + return; + + snprintf(args, sizeof(args), "%s -k %s -d %s", backend_cmd, + item->req_id, item->pkgid); + args_vector = __generate_argv(args); + args_vector[0] = backend_cmd; + + __exec_with_arg_vector(backend_cmd, args_vector, item->uid); +} + +static void __process_move(pm_dbus_msg *item) +{ + char *backend_cmd; + char **args_vector; + char args[MAX_PKG_ARGS_LEN]; + + backend_cmd = _get_backend_cmd(item->pkg_type); + if (backend_cmd == NULL) + return; + + /* TODO: set movetype */ + snprintf(args, sizeof(args), "%s -k %s -m %s -t %s", backend_cmd, + item->req_id, item->pkgid, item->args); + args_vector = __generate_argv(args); + args_vector[0] = backend_cmd; + + __exec_with_arg_vector(backend_cmd, args_vector, item->uid); +} + +static void __process_enable(pm_dbus_msg *item) +{ + /* TODO */ +} + +static void __process_disable(pm_dbus_msg *item) +{ + /* TODO */ +} + +static void __process_getsize(pm_dbus_msg *item) +{ + char **args_vector; + char args[MAX_PKG_ARGS_LEN]; + + snprintf(args, sizeof(args), "%s %s -k %s", item->pkgid, item->args, + item->req_id); + args_vector = __generate_argv(args); + __exec_with_arg_vector("/usr/bin/pkg_getsize", args_vector, item->uid); +} + +static void __process_cleardata(pm_dbus_msg *item) +{ + char *backend_cmd; + char **args_vector; + char args[MAX_PKG_ARGS_LEN]; + + backend_cmd = _get_backend_cmd(item->pkg_type); + if (backend_cmd == NULL) + return; + + /* TODO: set movetype */ + snprintf(args, sizeof(args), "%s -k %s -c %s", backend_cmd, + item->req_id, item->pkgid); + args_vector = __generate_argv(args); + args_vector[0] = backend_cmd; + + __exec_with_arg_vector(backend_cmd, args_vector, item->uid); +} + +static void __process_clearcache(pm_dbus_msg *item) +{ + char **args_vector; + char args[MAX_PKG_ARGS_LEN]; + + snprintf(args, sizeof(args), "%s", item->pkgid); + args_vector = __generate_argv(args); + __exec_with_arg_vector("/usr/bin/pkg_clearcache", args_vector, + item->uid); +} + +static void __process_kill(pm_dbus_msg *item) +{ + int ret; + pkgmgrinfo_pkginfo_h handle; + + ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(item->pkgid, item->uid, + &handle); + if (ret < 0) { + ERR("Failed to get handle"); + return; + } + + ret = pkgmgrinfo_appinfo_get_usr_list(handle, PMINFO_ALL_APP, + __pkgcmd_app_cb, "kill", item->uid); + if (ret < 0) + ERR("pkgmgrinfo_appinfo_get_list() failed"); + pkgmgrinfo_pkginfo_destroy_pkginfo(handle); +} + +static void __process_check(pm_dbus_msg *item) +{ + int ret; + pkgmgrinfo_pkginfo_h handle; + + ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(item->pkgid, item->uid, + &handle); + if (ret < 0) { + ERR("Failed to get handle"); + return; + } + + ret = pkgmgrinfo_appinfo_get_usr_list(handle, PMINFO_ALL_APP, + __pkgcmd_app_cb, "check", item->uid); + if (ret < 0) + ERR("pkgmgrinfo_appinfo_get_list() failed"); + pkgmgrinfo_pkginfo_destroy_pkginfo(handle); +} + gboolean queue_job(void *data) { pm_dbus_msg *item = NULL; backend_info *ptr; int x; - int ret; - char *backend_cmd = NULL; /* Pop a job from queue */ for (x = 0, ptr = begin; x < num_of_backends; x++, ptr++) { @@ -755,179 +915,38 @@ gboolean queue_job(void *data) switch (ptr->pid) { case 0: /* child */ switch (item->req_type) { - case COMM_REQ_TO_INSTALLER: - DBG("before run _get_backend_cmd()"); - /*Check for efl-tpk app*/ - backend_cmd = _get_backend_cmd(item->pkg_type); - if (backend_cmd == NULL) - break; - - DBG("Try to exec [%s][%s]", item->pkg_type, backend_cmd); - fprintf(stdout, "Try to exec [%s][%s]\n", item->pkg_type, backend_cmd); - - char **args_vector = __generate_argv(item->args); - args_vector[0] = backend_cmd; - - /* Execute backend !!! */ - __exec_with_arg_vector(backend_cmd, args_vector, item->uid); - free(backend_cmd); + case PKGMGR_REQUEST_TYPE_INSTALL: + __process_install(item); break; - case COMM_REQ_TO_ACTIVATOR: - DBG("activator start"); - int val = 0; - if (item->args[0] == '1') /* activate */ - val = 1; - else if (item->args[0] == '0') /* deactivate */ - val = 0; - else { - DBG("error in args parameter:[%c]\n", - item->args[0]); - exit(1); - } - - DBG("activated val %d", val); - - gboolean ret_parse; - gint argcp; - gchar **argvp; - GError *gerr = NULL; - char *label = NULL; - user_ctx* user_context = get_user_context(item->uid); - if(!user_context) { - DBG("Failed to getenv for the user : %d", item->uid); - exit(1); - } - if(set_environement(user_context)){ - DBG("Failed to set env for the user : %d", item->uid); - exit(1); - } - free_user_context(user_context); - - ret_parse = g_shell_parse_argv(item->args, - &argcp, &argvp, &gerr); - if (FALSE == ret_parse) { - DBG("Failed to split args: %s", item->args); - DBG("messsage: %s", gerr->message); - exit(1); - } - - if (!strcmp(argvp[1], "APP")) { /* in case of application */ - DBG("(De)activate APP"); - int opt; - while ((opt = getopt(argcp, argvp, "l:")) != -1) { - switch (opt) { - case 'l': - label = strdup(optarg); - DBG("activated label %s", label); - break; - default: /* '?' */ - ERR("Incorrect argument %s\n", item->args); - exit(1); - } - } - - ret = pkgmgrinfo_appinfo_set_usr_state_enabled(item->pkgid, val, item->uid); - if (ret != PMINFO_R_OK) { - perror("fail to activate/deactivte package"); - exit(1); - } - - if (label) { - ret = pkgmgrinfo_appinfo_set_usr_default_label(item->pkgid, label, item->uid); - if (ret != PMINFO_R_OK) { - perror("fail to activate/deactivte package"); - exit(1); - } - free(label); - } - } else { /* in case of package */ - ERR("(De)activate PKG[pkgid=%s, val=%d]", item->pkgid, val); - char *manifest = NULL; - manifest = pkgmgr_parser_get_manifest_file(item->pkgid); - if (manifest == NULL) { - ERR("Failed to fetch package manifest file\n"); - exit(1); - } - ERR("manifest : %s\n", manifest); - - if (val) { - pkgmgrinfo_pkginfo_h handle; - ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(item->pkgid, item->uid, &handle); - if (ret < 0) { - ret = pkgmgr_parser_parse_usr_manifest_for_installation(manifest,item->uid, NULL); - if (ret < 0) { - ERR("insert in db failed\n"); - } - } else { - pkgmgrinfo_pkginfo_destroy_pkginfo(handle); - } - - ret = pkgmgrinfo_appinfo_set_usr_state_enabled(item->pkgid, val, item->uid); - if (ret != PMINFO_R_OK) { - perror("fail to activate/deactivte package"); - exit(1); - } - } - else - ret = pkgmgr_parser_parse_usr_manifest_for_uninstallation(manifest, item->uid, NULL); - - if (ret < 0) { - ERR("insert in db failed\n"); - exit(1); - } - } + case PKGMGR_REQUEST_TYPE_REINSTALL: + __process_reinstall(item); break; - case COMM_REQ_TO_MOVER: - case COMM_REQ_TO_CLEARER: - DBG("cleaner start"); - DBG("before run _get_backend_cmd()"); - backend_cmd = _get_backend_cmd(item->pkg_type); - if (NULL == backend_cmd) - break; - - DBG("Try to exec [%s][%s]", item->pkg_type, backend_cmd); - fprintf(stdout, "Try to exec [%s][%s]\n", item->pkg_type, backend_cmd); - - char **args_vectors = __generate_argv(item->args); - args_vectors[0] = backend_cmd; - - /* Execute backend !!! */ - __exec_with_arg_vector(backend_cmd, args_vectors, item->uid); - free(backend_cmd); + case PKGMGR_REQUEST_TYPE_UNINSTALL: + __process_uninstall(item); break; - case COMM_REQ_GET_SIZE: - DBG("before run _get_backend_cmd()"); - __exec_with_arg_vector("/usr/bin/pkg_getsize", __generate_argv(item->args), item->uid); + case PKGMGR_REQUEST_TYPE_MOVE: + __process_move(item); break; - case COMM_REQ_KILL_APP: - case COMM_REQ_CHECK_APP: - DBG("COMM_REQ_CHECK_APP start"); - pkgmgrinfo_pkginfo_h handle; - ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(item->pkgid, item->uid, &handle); - if (ret < 0) { - DBG("Failed to get handle\n"); - exit(1); - } - - if (item->req_type == COMM_REQ_KILL_APP) { - ret = pkgmgrinfo_appinfo_get_usr_list(handle, PMINFO_ALL_APP, __pkgcmd_app_cb, "kill", item->uid); - if (ret < 0) { - DBG("pkgmgrinfo_appinfo_get_list() failed\n"); - pkgmgrinfo_pkginfo_destroy_pkginfo(handle); - exit(1); - } - } else if (item->req_type == COMM_REQ_CHECK_APP) { - ret = pkgmgrinfo_appinfo_get_usr_list(handle, PMINFO_ALL_APP, __pkgcmd_app_cb, "check", item->uid); - if (ret < 0) { - DBG("pkgmgrinfo_appinfo_get_list() failed\n"); - pkgmgrinfo_pkginfo_destroy_pkginfo(handle); - exit(1); - } - } - pkgmgrinfo_pkginfo_destroy_pkginfo(handle); + case PKGMGR_REQUEST_TYPE_ENABLE: + __process_enable(item); + break; + case PKGMGR_REQUEST_TYPE_DISABLE: + __process_disable(item); + break; + case PKGMGR_REQUEST_TYPE_GETSIZE: + __process_getsize(item); + break; + case PKGMGR_REQUEST_TYPE_CLEARDATA: + __process_cleardata(item); + break; + case PKGMGR_REQUEST_TYPE_CLEARCACHE: + __process_clearcache(item); + break; + case PKGMGR_REQUEST_TYPE_KILL: + __process_kill(item); break; - case COMM_REQ_CLEAR_CACHE_DIR: - __exec_with_arg_vector("/usr/bin/pkg_clearcache", __generate_argv(item->args), item->uid); + case PKGMGR_REQUEST_TYPE_CHECK: + __process_check(item); break; } /* exit child */ diff --git a/server/src/pm-queue.c b/server/src/pm-queue.c index 9addbcd..495f82e 100644 --- a/server/src/pm-queue.c +++ b/server/src/pm-queue.c @@ -33,10 +33,10 @@ #define BACKEND_INFO_DIR "/etc/package-manager/backend" -static pm_queue_data *__get_head_from_pkgtype(pm_dbus_msg *item); +static pm_queue_data *__get_head_from_pkgtype(const char *pkg_type); static void __update_head_from_pkgtype(pm_queue_data *data); static int __entry_exist(char *backend); -static int __is_pkg_supported(char *pkgtype); +static int __is_pkg_supported(const char *pkgtype); queue_info_map *start = NULL; int entries = 0; @@ -48,7 +48,7 @@ is supported or not. It parses the queue info map to get the information. It will prevent the accidental hanging of server. Returns 1 if found.*/ -static int __is_pkg_supported(char *pkgtype) +static int __is_pkg_supported(const char *pkgtype) { queue_info_map *ptr = NULL; ptr = start; @@ -118,14 +118,14 @@ static void __update_head_from_pkgtype(pm_queue_data *data) } /*Gets the queue head based on pkg type*/ -static pm_queue_data *__get_head_from_pkgtype(pm_dbus_msg *item) +static pm_queue_data *__get_head_from_pkgtype(const char *pkg_type) { queue_info_map *ptr = NULL; ptr = start; int i = 0; for(i = 0; i < entries; i++) { - if (!strncmp(ptr->pkgtype, item->pkg_type, MAX_PKG_TYPE_LEN)) + if (!strncmp(ptr->pkgtype, pkg_type, MAX_PKG_TYPE_LEN)) return ptr->head; else { ptr++; @@ -257,53 +257,33 @@ int _pm_queue_init(void) return 0; } -pm_dbus_msg *_pm_queue_create_item(uid_t uid, const char *req_id, - int req_type, const char *pkg_type, const char *pkgid, - const char *args) -{ - pm_dbus_msg *item; - - item = calloc(1, sizeof(pm_dbus_msg)); - if (item == NULL) { - ERR("Fail to allocate memory"); - return NULL; - } - - item->uid = uid; - snprintf(item->req_id, sizeof(item->req_id), "%s", req_id); - item->req_type = req_type; - snprintf(item->pkg_type, sizeof(item->pkg_type), "%s", pkg_type); - snprintf(item->pkgid, sizeof(item->pkgid), "%s", pkgid); - snprintf(item->args, sizeof(item->args), "%s", args); - - return item; -} - -int _pm_queue_push(pm_dbus_msg *item) +int _pm_queue_push(uid_t uid, const char *req_id, int req_type, + const char *pkg_type, const char *pkgid, const char *args) { pm_queue_data *data = NULL; pm_queue_data *cur = NULL; pm_queue_data *tmp = NULL; int ret = 0; - ret = __is_pkg_supported(item->pkg_type); + ret = __is_pkg_supported(pkg_type); if (ret == 0) return -1; - cur = __get_head_from_pkgtype(item); + cur = __get_head_from_pkgtype(pkg_type); tmp = cur; + /* TODO: use glist */ data = _add_node(); if (!data) { /* fail to allocate mem */ ERR("Fail to allocate memory\n"); return -1; } - strncpy(data->msg->req_id, item->req_id, strlen(item->req_id)); - data->msg->req_type = item->req_type; - data->msg->uid = item->uid; - strncpy(data->msg->pkg_type, item->pkg_type, strlen(item->pkg_type)); - strncpy(data->msg->pkgid, item->pkgid, strlen(item->pkgid)); - strncpy(data->msg->args, item->args, strlen(item->args)); + strncpy(data->msg->req_id, req_id, strlen(req_id)); + data->msg->req_type = req_type; + data->msg->uid = uid; + strncpy(data->msg->pkg_type, pkg_type, strlen(pkg_type)); + strncpy(data->msg->pkgid, pkgid, strlen(pkgid)); + strncpy(data->msg->args, args, strlen(args)); data->next = NULL; @@ -470,7 +450,7 @@ void _pm_queue_delete(pm_dbus_msg *item) /* Assume that pacakge name is unique */ pm_queue_data *cur = NULL; pm_queue_data *prev = NULL; - cur = __get_head_from_pkgtype(item); + cur = __get_head_from_pkgtype(item->pkg_type); prev = cur; if (cur) { while (cur->next) { diff --git a/server/src/request.c b/server/src/request.c index 5f94498..c8cce3a 100644 --- a/server/src/request.c +++ b/server/src/request.c @@ -1,4 +1,5 @@ #include +#include #include #include @@ -6,82 +7,73 @@ #include "comm_config.h" #include "pm-queue.h" #include "pkgmgr-server.h" +#include "package-manager.h" #include "package-manager-debug.h" static const char instropection_xml[] = "" " " " " - " " " " " " - " " " " + " " " " " " - " " " " " " - " " " " + " " " " " " - " " " " " " - " " " " + " " " " - " " - " " + " " " " " " - " " " " + " " " " - " " - " " - " " + " " " " - " " " " " " - " " - " " - " " + " " " " - " " " " " " - " " - " " - " " - " " - " " + " " + " " + " " + " " + " " + " " " " " " " " - " " + " " + " " + " " + " " + " " + " " " " " " - " " " " " " " " - " " " " " " " " " " " " - " " - " " " " " " " " " " - " " - " " " " " " " " @@ -91,238 +83,329 @@ static GDBusNodeInfo *instropection_data; static guint reg_id; static guint owner_id; -static int __handle_request_install(uid_t uid, GVariant *parameters) +static char *__generate_reqkey(const char *pkgid) +{ + struct timeval tv; + long curtime; + char timestr[MAX_PKG_ARGS_LEN]; + char *str_req_key; + int size; + + gettimeofday(&tv, NULL); + curtime = tv.tv_sec * 1000000 + tv.tv_usec; + snprintf(timestr, sizeof(timestr), "%ld", curtime); + + size = strlen(pkgid) + strlen(timestr) + 2; + str_req_key = (char *)calloc(size, sizeof(char)); + if (str_req_key == NULL) { + DBG("calloc failed"); + return NULL; + } + snprintf(str_req_key, size, "%s_%s", pkgid, timestr); + + return str_req_key; +} + +static int __handle_request_install(uid_t uid, + GDBusMethodInvocation *invocation, GVariant *parameters) { - gchar *reqid; - gchar *pkgtype; - gchar *pkgpath; - gchar *args; - pm_dbus_msg *item; - - g_variant_get(parameters, "(&s&s&s&s)", &reqid, &pkgtype, &pkgpath, - &args); - - item = _pm_queue_create_item(uid, reqid, COMM_REQ_TO_INSTALLER, - pkgtype, pkgpath, args); - if (item == NULL) + char *pkgtype = NULL; + char *pkgpath = NULL; + char *reqkey; + + g_variant_get(parameters, "(&s&s)", &pkgtype, &pkgpath); + if (pkgtype == NULL || pkgpath == NULL) { + g_dbus_method_invocation_return_value(invocation, + g_variant_new("(is)", PKGMGR_R_ECOMM, "")); return -1; + } - if (_pm_queue_push(item)) + reqkey = __generate_reqkey(pkgpath); + if (_pm_queue_push(uid, reqkey, PKGMGR_REQUEST_TYPE_INSTALL, pkgtype, + pkgpath, "")) { + g_dbus_method_invocation_return_value(invocation, + g_variant_new("(is)", PKGMGR_R_ESYSTEM, "")); + free(reqkey); return -1; + } + + g_dbus_method_invocation_return_value(invocation, + g_variant_new("(is)", PKGMGR_R_OK, reqkey)); + free(reqkey); return 0; } -static int __handle_request_reinstall(uid_t uid, GVariant *parameters) +static int __handle_request_reinstall(uid_t uid, + GDBusMethodInvocation *invocation, GVariant *parameters) { - gchar *reqid; - gchar *pkgtype; - gchar *pkgid; - gchar *args; - pm_dbus_msg *item; - - g_variant_get(parameters, "(&s&s&s&s)", &reqid, &pkgtype, &pkgid, - &args); - - item = _pm_queue_create_item(uid, reqid, COMM_REQ_TO_INSTALLER, - pkgtype, pkgid, args); - if (item == NULL) + char *pkgtype = NULL; + char *pkgid = NULL; + char *reqkey; + + g_variant_get(parameters, "(&s&s)", &pkgtype, &pkgid); + if (pkgtype == NULL || pkgid == NULL) { + g_dbus_method_invocation_return_value(invocation, + g_variant_new("(is)", PKGMGR_R_ECOMM, "")); return -1; + } - if (_pm_queue_push(item)) + reqkey = __generate_reqkey(pkgid); + if (_pm_queue_push(uid, reqkey, PKGMGR_REQUEST_TYPE_REINSTALL, pkgtype, + pkgid, "")) { + g_dbus_method_invocation_return_value(invocation, + g_variant_new("(is)", PKGMGR_R_ESYSTEM, "")); + free(reqkey); return -1; + } + + g_dbus_method_invocation_return_value(invocation, + g_variant_new("(is)", PKGMGR_R_OK, reqkey)); + free(reqkey); return 0; } -static int __handle_request_uninstall(uid_t uid, GVariant *parameters) +static int __handle_request_uninstall(uid_t uid, + GDBusMethodInvocation *invocation, GVariant *parameters) { - gchar *reqid; - gchar *pkgtype; - gchar *pkgid; - gchar *args; - pm_dbus_msg *item; - - g_variant_get(parameters, "(&s&s&s&s)", &reqid, &pkgtype, &pkgid, - &args); - - item = _pm_queue_create_item(uid, reqid, COMM_REQ_TO_INSTALLER, - pkgtype, pkgid, args); - if (item == NULL) + char *pkgtype = NULL; + char *pkgid = NULL; + char *reqkey; + + g_variant_get(parameters, "(&s&s)", &pkgtype, &pkgid); + if (pkgtype == NULL || pkgid == NULL) { + g_dbus_method_invocation_return_value(invocation, + g_variant_new("(is)", PKGMGR_R_ECOMM, "")); return -1; + } - if (_pm_queue_push(item)) + reqkey = __generate_reqkey(pkgid); + if (_pm_queue_push(uid, reqkey, PKGMGR_REQUEST_TYPE_UNINSTALL, pkgtype, + pkgid, "")) { + g_dbus_method_invocation_return_value(invocation, + g_variant_new("(is)", PKGMGR_R_ESYSTEM, "")); + free(reqkey); return -1; + } + + g_dbus_method_invocation_return_value(invocation, + g_variant_new("(is)", PKGMGR_R_OK, reqkey)); + free(reqkey); return 0; } -static int __handle_request_cleardata(uid_t uid, GVariant *parameters) +static int __handle_request_move(uid_t uid, + GDBusMethodInvocation *invocation, GVariant *parameters) { - gchar *reqid; - gchar *pkgtype; - gchar *pkgid; - gchar *args; - pm_dbus_msg *item; - - g_variant_get(parameters, "(&s&s&s&s)", &reqid, &pkgtype, &pkgid, - &args); - - item = _pm_queue_create_item(uid, reqid, COMM_REQ_TO_CLEARER, - pkgtype, pkgid, args); - if (item == NULL) + char *pkgtype = NULL; + char *pkgid = NULL; + char *reqkey; + + g_variant_get(parameters, "(&s&s)", &pkgtype, &pkgid); + if (pkgtype == NULL || pkgid == NULL) { + g_dbus_method_invocation_return_value(invocation, + g_variant_new("(is)", PKGMGR_R_ECOMM, "")); return -1; + } - if (_pm_queue_push(item)) + reqkey = __generate_reqkey(pkgid); + if (_pm_queue_push(uid, reqkey, PKGMGR_REQUEST_TYPE_MOVE, pkgtype, + pkgid, "")) { + g_dbus_method_invocation_return_value(invocation, + g_variant_new("(is)", PKGMGR_R_ESYSTEM, "")); + free(reqkey); return -1; + } + + g_dbus_method_invocation_return_value(invocation, + g_variant_new("(is)", PKGMGR_R_OK, reqkey)); + free(reqkey); return 0; } -static int __handle_request_move(uid_t uid, GVariant *parameters) +static int __handle_request_enable(uid_t uid, + GDBusMethodInvocation *invocation, GVariant *parameters) { - gchar *reqid; - gchar *pkgtype; - gchar *pkgid; - gchar *args; - pm_dbus_msg *item; - - g_variant_get(parameters, "(&s&s&s&s)", &reqid, &pkgtype, &pkgid, - &args); - - item = _pm_queue_create_item(uid, reqid, COMM_REQ_TO_MOVER, - pkgtype, pkgid, args); - if (item == NULL) + char *pkgid = NULL; + + g_variant_get(parameters, "(&s)", &pkgid); + if (pkgid == NULL) { + g_dbus_method_invocation_return_value(invocation, + g_variant_new("(i)", PKGMGR_R_ECOMM)); return -1; + } - if (_pm_queue_push(item)) + if (_pm_queue_push(uid, "", PKGMGR_REQUEST_TYPE_ENABLE, "pkg", + pkgid, "")) { + g_dbus_method_invocation_return_value(invocation, + g_variant_new("(i)", PKGMGR_R_ESYSTEM)); return -1; + } + + g_dbus_method_invocation_return_value(invocation, + g_variant_new("(i)", PKGMGR_R_OK)); return 0; } -static int __handle_request_activate(uid_t uid, GVariant *parameters) +static int __handle_request_disable(uid_t uid, + GDBusMethodInvocation *invocation, GVariant *parameters) { - gchar *reqid; - gchar *pkgtype; - gchar *pkgid; - gchar *args; - pm_dbus_msg *item; - - g_variant_get(parameters, "(&s&s&s&s)", &reqid, &pkgtype, &pkgid, - &args); - - item = _pm_queue_create_item(uid, reqid, COMM_REQ_TO_ACTIVATOR, - pkgtype, pkgid, args); - if (item == NULL) + char *pkgid = NULL; + + g_variant_get(parameters, "(&s)", &pkgid); + if (pkgid == NULL) { + g_dbus_method_invocation_return_value(invocation, + g_variant_new("(i)", PKGMGR_R_ECOMM)); return -1; + } - if (_pm_queue_push(item)) + if (_pm_queue_push(uid, "", PKGMGR_REQUEST_TYPE_DISABLE, "pkg", + pkgid, "")) { + g_dbus_method_invocation_return_value(invocation, + g_variant_new("(i)", PKGMGR_R_ESYSTEM)); return -1; + } + + g_dbus_method_invocation_return_value(invocation, + g_variant_new("(i)", PKGMGR_R_OK)); return 0; } -static int __handle_request_deactivate(uid_t uid, GVariant *parameters) +static int __handle_request_getsize(uid_t uid, + GDBusMethodInvocation *invocation, GVariant *parameters) { - gchar *reqid; - gchar *pkgtype; - gchar *pkgid; - gchar *args; - pm_dbus_msg *item; - - g_variant_get(parameters, "(&s&s&s&s)", &reqid, &pkgtype, &pkgid, - &args); - - item = _pm_queue_create_item(uid, reqid, COMM_REQ_TO_ACTIVATOR, - pkgtype, pkgid, args); - if (item == NULL) + char *pkgid = NULL; + int get_type = -1; + char *reqkey; + char buf[4]; + + g_variant_get(parameters, "(&si)", &pkgid, &get_type); + if (pkgid == NULL || get_type == -1) { + g_dbus_method_invocation_return_value(invocation, + g_variant_new("(is)", PKGMGR_R_ECOMM, "")); return -1; + } - if (_pm_queue_push(item)) + reqkey = __generate_reqkey(pkgid); + snprintf(buf, sizeof(buf), "%d", get_type); + if (_pm_queue_push(uid, reqkey, PKGMGR_REQUEST_TYPE_GETSIZE, "getsize", + pkgid, buf)) { + g_dbus_method_invocation_return_value(invocation, + g_variant_new("(is)", PKGMGR_R_ESYSTEM, "")); + free(reqkey); return -1; + } + + g_dbus_method_invocation_return_value(invocation, + g_variant_new("(is)", PKGMGR_R_OK, reqkey)); + free(reqkey); return 0; } -static int __handle_request_getsize(uid_t uid, GVariant *parameters) +static int __handle_request_cleardata(uid_t uid, + GDBusMethodInvocation *invocation, GVariant *parameters) { - gchar *reqid; - gchar *pkgtype; - gchar *pkgid; - gchar *args; - pm_dbus_msg *item; - - g_variant_get(parameters, "(&s&s&s&s)", &reqid, &pkgtype, &pkgid, - &args); - - item = _pm_queue_create_item(uid, reqid, COMM_REQ_GET_SIZE, - pkgtype, pkgid, args); - if (item == NULL) + char *pkgtype = NULL; + char *pkgid = NULL; + + g_variant_get(parameters, "(&s&s)", &pkgtype, &pkgid); + if (pkgtype == NULL || pkgid == NULL) { + g_dbus_method_invocation_return_value(invocation, + g_variant_new("(i)", PKGMGR_R_ECOMM)); return -1; + } - if (_pm_queue_push(item)) + if (_pm_queue_push(uid, "", PKGMGR_REQUEST_TYPE_CLEARDATA, pkgtype, + pkgid, "")) { + g_dbus_method_invocation_return_value(invocation, + g_variant_new("(i)", PKGMGR_R_ESYSTEM)); return -1; + } + + g_dbus_method_invocation_return_value(invocation, + g_variant_new("(i)", PKGMGR_R_OK)); return 0; } -static int __handle_request_clearcache(uid_t uid, GVariant *parameters) +static int __handle_request_clearcache(uid_t uid, + GDBusMethodInvocation *invocation, GVariant *parameters) { - gchar *reqid; - gchar *pkgtype; - gchar *pkgid; - pm_dbus_msg *item; - - g_variant_get(parameters, "(&s&s&s)", &reqid, &pkgtype, &pkgid); + char *pkgtype; + char *pkgid; - item = _pm_queue_create_item(uid, reqid, COMM_REQ_CLEAR_CACHE_DIR, - pkgtype, pkgid, NULL); - if (item == NULL) + g_variant_get(parameters, "(&s&s)", &pkgtype, &pkgid); + if (pkgtype == NULL || pkgid == NULL) { + g_dbus_method_invocation_return_value(invocation, + g_variant_new("(i)", PKGMGR_R_ECOMM)); return -1; + } - if (_pm_queue_push(item)) + if (_pm_queue_push(uid, "", PKGMGR_REQUEST_TYPE_CLEARCACHE, pkgtype, + pkgid, "")) { + g_dbus_method_invocation_return_value(invocation, + g_variant_new("(i)", PKGMGR_R_ESYSTEM)); return -1; + } + + g_dbus_method_invocation_return_value(invocation, + g_variant_new("(i)", PKGMGR_R_OK)); return 0; } -static int __handle_request_kill(uid_t uid, GVariant *parameters) +static int __handle_request_kill(uid_t uid, + GDBusMethodInvocation *invocation, GVariant *parameters) { - gchar *reqid; - gchar *pkgtype; - gchar *pkgid; - pm_dbus_msg *item; - - g_variant_get(parameters, "(&s&s&s)", &reqid, &pkgtype, &pkgid); + char *pkgid; - item = _pm_queue_create_item(uid, reqid, COMM_REQ_KILL_APP, - pkgtype, pkgid, NULL); - if (item == NULL) + g_variant_get(parameters, "(&s)", &pkgid); + if (pkgid == NULL) { + g_dbus_method_invocation_return_value(invocation, + g_variant_new("(i)", PKGMGR_R_ECOMM)); return -1; + } - if (_pm_queue_push(item)) + if (_pm_queue_push(uid, "", PKGMGR_REQUEST_TYPE_KILL, "pkg", + pkgid, "")) { + g_dbus_method_invocation_return_value(invocation, + g_variant_new("(i)", PKGMGR_R_ESYSTEM)); return -1; + } + + g_dbus_method_invocation_return_value(invocation, + g_variant_new("(i)", PKGMGR_R_OK)); return 0; } -static int __handle_request_check(uid_t uid, GVariant *parameters) +static int __handle_request_check(uid_t uid, + GDBusMethodInvocation *invocation, GVariant *parameters) { - gchar *reqid; - gchar *pkgtype; - gchar *pkgid; - pm_dbus_msg *item; - - g_variant_get(parameters, "(&s&s&s)", &reqid, &pkgtype, &pkgid); + char *pkgid; - item = _pm_queue_create_item(uid, reqid, COMM_REQ_CHECK_APP, - pkgtype, pkgid, NULL); - if (item == NULL) + g_variant_get(parameters, "(&s)", &pkgid); + if (pkgid == NULL) { + g_dbus_method_invocation_return_value(invocation, + g_variant_new("(i)", PKGMGR_R_ECOMM)); return -1; + } - if (_pm_queue_push(item)) + if (_pm_queue_push(uid, "", PKGMGR_REQUEST_TYPE_CHECK, "pkg", + pkgid, "")) { + g_dbus_method_invocation_return_value(invocation, + g_variant_new("(i)", PKGMGR_R_ESYSTEM)); return -1; + } + + g_dbus_method_invocation_return_value(invocation, + g_variant_new("(i)", PKGMGR_R_OK)); return 0; } @@ -364,33 +447,30 @@ static void __handle_method_call(GDBusConnection *connection, return; if (g_strcmp0(method_name, "install") == 0) - ret = __handle_request_install(uid, parameters); + ret = __handle_request_install(uid, invocation, parameters); else if (g_strcmp0(method_name, "reinstall") == 0) - ret = __handle_request_reinstall(uid, parameters); + ret = __handle_request_reinstall(uid, invocation, parameters); else if (g_strcmp0(method_name, "uninstall") == 0) - ret = __handle_request_uninstall(uid, parameters); + ret = __handle_request_uninstall(uid, invocation, parameters); else if (g_strcmp0(method_name, "cleardata") == 0) - ret = __handle_request_cleardata(uid, parameters); + ret = __handle_request_cleardata(uid, invocation, parameters); else if (g_strcmp0(method_name, "move") == 0) - ret = __handle_request_move(uid, parameters); - else if (g_strcmp0(method_name, "activate") == 0) - ret = __handle_request_activate(uid, parameters); - else if (g_strcmp0(method_name, "deactivate") == 0) - ret = __handle_request_deactivate(uid, parameters); + ret = __handle_request_move(uid, invocation, parameters); + else if (g_strcmp0(method_name, "enable") == 0) + ret = __handle_request_enable(uid, invocation, parameters); + else if (g_strcmp0(method_name, "disable") == 0) + ret = __handle_request_disable(uid, invocation, parameters); else if (g_strcmp0(method_name, "getsize") == 0) - ret = __handle_request_getsize(uid, parameters); + ret = __handle_request_getsize(uid, invocation, parameters); else if (g_strcmp0(method_name, "clearcache") == 0) - ret = __handle_request_clearcache(uid, parameters); + ret = __handle_request_clearcache(uid, invocation, parameters); else if (g_strcmp0(method_name, "kill") == 0) - ret = __handle_request_kill(uid, parameters); + ret = __handle_request_kill(uid, invocation, parameters); else if (g_strcmp0(method_name, "check") == 0) - ret = __handle_request_check(uid, parameters); + ret = __handle_request_check(uid, invocation, parameters); else ret = -1; - g_dbus_method_invocation_return_value(invocation, - g_variant_new("(i)", ret)); - if (ret == 0) g_idle_add(queue_job, NULL); } -- 2.7.4