From: Junghyun Yeon Date: Thu, 22 Dec 2016 01:20:10 +0000 (+0900) Subject: Replace pkg_clearcache into pkg_cleardata X-Git-Tag: submit/tizen_3.0/20161223.043050^0 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=refs%2Fheads%2Ftizen_3.0.m2;p=platform%2Fcore%2Fappfw%2Fpkgmgr-tool.git Replace pkg_clearcache into pkg_cleardata - Replae pkg_clearcache into pkg_cleardata and it performs clearing pkg's data, either. Related changes: [pkgmgr-server] : https://review.tizen.org/gerrit/106486 [app-installers] : https://review.tizen.org/gerrit/105691 [tpk-backend] : https://review.tizen.org/gerrit/106603 [wgt-backend] : https://review.tizen.org/gerrit/106601 Change-Id: I3db03e74edf659851e62e2412d2f6002809bd631 Signed-off-by: Junghyun Yeon --- diff --git a/CMakeLists.txt b/CMakeLists.txt index 055b222..78edcbe 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -50,9 +50,9 @@ ADD_EXECUTABLE(pkg_getsize src/pkg_getsize.c) TARGET_LINK_LIBRARIES(pkg_getsize ${pkgs_test_LDFLAGS}) INSTALL(TARGETS pkg_getsize DESTINATION bin) -ADD_EXECUTABLE(pkg_clearcache src/pkg_clearcache.c) -TARGET_LINK_LIBRARIES(pkg_clearcache ${pkgs_test_LDFLAGS}) -INSTALL(TARGETS pkg_clearcache DESTINATION bin) +ADD_EXECUTABLE(pkg_cleardata src/pkg_cleardata.c) +TARGET_LINK_LIBRARIES(pkg_cleardata ${pkgs_test_LDFLAGS}) +INSTALL(TARGETS pkg_cleardata DESTINATION bin) ADD_EXECUTABLE(install_preload_pkg src/install_preload_pkg.c) TARGET_LINK_LIBRARIES(install_preload_pkg ${pkgs_test_LDFLAGS}) diff --git a/packaging/pkgmgr-tool.manifest b/packaging/pkgmgr-tool.manifest index 7f2bbf1..64f527a 100644 --- a/packaging/pkgmgr-tool.manifest +++ b/packaging/pkgmgr-tool.manifest @@ -5,7 +5,7 @@ - + diff --git a/packaging/pkgmgr-tool.spec b/packaging/pkgmgr-tool.spec index 842b8ff..3d8fced 100644 --- a/packaging/pkgmgr-tool.spec +++ b/packaging/pkgmgr-tool.spec @@ -78,7 +78,7 @@ fi %dir %{_sysconfdir}/opt/upgrade %{_bindir}/pkgcmd %{_bindir}/pkg_getsize -%{_bindir}/pkg_clearcache +%{_bindir}/pkg_cleardata %{_bindir}/pkginfo %{_bindir}/rsc-slice %{_bindir}/pkg_upgrade diff --git a/src/pkg_clearcache.c b/src/pkg_clearcache.c deleted file mode 100644 index 2352ec4..0000000 --- a/src/pkg_clearcache.c +++ /dev/null @@ -1,241 +0,0 @@ -/* - * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. - * - * Contact: Jayoun Lee , Sewook Park , - * Jaeho Lee , Shobhit Srivastava - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * - */ - -#define _GNU_SOURCE - -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -#define MAX_PKG_NAME_LEN 256 -#define INTERNAL_CACHE_PATH_PREFIX tzplatform_getenv(TZ_USER_APP) -#define EXTERNAL_CACHE_PATH_PREFIX tzplatform_mkpath(TZ_SYS_MEDIA, "SDCardA1/apps") -#define CACHE_PATH_POSTFIX "/cache" -#define SHARED_PATH_POSTFIX "/shared/cache" - - -#undef LOG_TAG -#ifndef LOG_TAG -#define LOG_TAG "PKGMGR_CLEARCACHE" -#endif /* LOG_TAG */ - -static int __clear_dir(const char *dirname) -{ - int ret = 0; - DIR *dp = NULL; - char buf[1024] = {0, }; - struct dirent ep, *result; - char *abs_filename = NULL; - struct stat stFileInfo; - - LOGD("Cache directory name to clear [%s]\n", dirname); - - abs_filename = (char *)malloc(sizeof(char) * PATH_MAX); - if (abs_filename == NULL) { - LOGE("Memory allocation failed\n"); - goto err; - } - - dp = opendir(dirname); - if (dp == NULL) { - if (errno == ENOENT) { - LOGD("no entry, path(%s)", dirname); - free(abs_filename); - return 0; - } - LOGE("Couldn't open the directory. errno : %d (%s)\n", errno, - strerror_r(errno, buf, sizeof(buf))); - goto err; - } - - for (ret = readdir_r(dp, &ep, &result); - ret == 0 && result != NULL; - ret = readdir_r(dp, &ep, &result)) { - snprintf(abs_filename, PATH_MAX - 1, "%s/%s", dirname, - ep.d_name); - if (lstat(abs_filename, &stFileInfo) < 0) - perror(abs_filename); - - if (S_ISDIR(stFileInfo.st_mode)) { - if (strcmp(ep.d_name, ".") && - strcmp(ep.d_name, "..")) { - ret = __clear_dir(abs_filename); - if (ret != 0) - LOGE("Couldn't remove the directory. " - "errno : %d (%s)\n", - errno, strerror_r(errno, buf, sizeof(buf))); - - ret = remove(abs_filename); - if (ret != 0) { - LOGE("Couldn't remove the directory. " - "errno : %d (%s)\n", - errno, strerror_r(errno, buf, sizeof(buf))); - goto err; - } - } - } else { - ret = remove(abs_filename); - if (ret != 0) { - LOGE("Couldn't remove the directory. errno : " - "%d (%s)\n", errno, - strerror_r(errno, buf, sizeof(buf))); - goto err; - } - } - } - closedir(dp); - free(abs_filename); - - return 0; - -err: - if (abs_filename) - free(abs_filename); - if (dp) - closedir(dp); - - return -1; -} - -static int __clear_cache_dir(const char *pkgid) -{ - int ret = 0; - uid_t uid = getuid(); - char dirname[PATH_MAX] = {0,}; - - if (pkgid == NULL) { - LOGE("pkgid is NULL\n"); - return -1; - } - - /* cache internal */ - snprintf(dirname, sizeof(dirname), "%s/%s%s", - INTERNAL_CACHE_PATH_PREFIX, pkgid, CACHE_PATH_POSTFIX); - - ret = __clear_dir(dirname); - if (ret < 0) - LOGE("Failed to clear internal cache dir."); - - /* shared/cache internal */ - snprintf(dirname, sizeof(dirname), "%s/%s%s", - INTERNAL_CACHE_PATH_PREFIX, pkgid, SHARED_PATH_POSTFIX); - - ret = __clear_dir(dirname); - if (ret < 0) - LOGE("Failed to clear internal shared cache dir."); - - /* cache external */ - tzplatform_set_user(uid); - - snprintf(dirname, sizeof(dirname), "%s%s%s", - EXTERNAL_CACHE_PATH_PREFIX, - tzplatform_mkpath(TZ_USER_NAME, pkgid), - CACHE_PATH_POSTFIX); - - ret = __clear_dir(dirname); - if (ret < 0) - LOGE("Failed to clear external cache dir."); - - /* shared/cache external */ - snprintf(dirname, sizeof(dirname), "%s%s%s", - EXTERNAL_CACHE_PATH_PREFIX, - tzplatform_mkpath(TZ_USER_NAME, pkgid), - SHARED_PATH_POSTFIX); - - tzplatform_reset_user(); - - ret = __clear_dir(dirname); - if (ret < 0) - LOGE("Failed to clear external shared cache dir."); - - return 0; -} - -static int __clear_all_cache_dir_cb(const pkgmgrinfo_pkginfo_h handle, - void *user_data) -{ - int res = 0; - char *pkgid; - int *err_cnt = (int *)user_data; - - res = pkgmgrinfo_pkginfo_get_pkgid(handle, &pkgid); - if (res != PMINFO_R_OK) { - LOGE("pkgmgr_pkginfo_get_pkgid() failed"); - --(*err_cnt); - return 0; - } - - res = __clear_cache_dir(pkgid); - if (res != 0) { - LOGE("Failed to clear cache dir of %s", pkgid); - --(*err_cnt); - return 0; - } - - return 0; -} - -static int __clear_all_cache_dir(void) -{ - int err_cnt = 0; - int res; - - res = pkgmgrinfo_pkginfo_get_usr_list(__clear_all_cache_dir_cb, - &err_cnt, getuid()); - if (res != PMINFO_R_OK) { - LOGE("Failed to get pkg list. (%d)", res); - return -1; - } else if (err_cnt != 0) { - LOGE("Error occured in %d packages.", err_cnt); - return -1; - } - - return 0; -} - -int main(int argc, char *argv[]) -{ - int ret; - char pkgid[MAX_PKG_NAME_LEN]; - - if (argc < 2) { - LOGE("pkgid is NULL\n"); - return -1; - } - - snprintf(pkgid, sizeof(pkgid), "%s", argv[1]); - - if (strcmp(pkgid, PKG_CLEAR_ALL_CACHE) == 0) - ret = __clear_all_cache_dir(); - else - ret = __clear_cache_dir(pkgid); - - return ret; -} diff --git a/src/pkg_cleardata.c b/src/pkg_cleardata.c new file mode 100644 index 0000000..ebeb8c3 --- /dev/null +++ b/src/pkg_cleardata.c @@ -0,0 +1,365 @@ +/* + * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved. + * + * Contact: Jayoun Lee , Sewook Park , + * Jaeho Lee , Shobhit Srivastava + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + */ + +#define _GNU_SOURCE + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#define MAX_PKG_NAME_LEN 256 +#define INTERNAL_CACHE_PATH_PREFIX tzplatform_getenv(TZ_USER_APP) +#define EXTERNAL_CACHE_PATH_PREFIX tzplatform_mkpath(TZ_SYS_MEDIA, "SDCardA1/apps") +#define CACHE_PATH_POSTFIX "/cache" +#define SHARED_PATH_POSTFIX "/shared/cache" +#define REGULAR_USER 5000 + +#undef LOG_TAG +#ifndef LOG_TAG +#define LOG_TAG "PKGMGR_CLEARDATA" +#endif /* LOG_TAG */ + +const char *short_options = "c:d:h"; + +const struct option long_options[] = { + {"cache", 1, NULL, 'c'}, + {"data", 1, NULL, 'd'}, + {"help", 0, NULL, 'h'}, + {0, 0, 0, 0} /* sentinel */ +}; + + +static int __clear_dir(const char *dirname) +{ + int ret = 0; + DIR *dp = NULL; + char buf[1024] = {0, }; + struct dirent ep, *result; + char *abs_filename = NULL; + struct stat stFileInfo; + + LOGD("Directory name to clear [%s]\n", dirname); + + abs_filename = (char *)malloc(sizeof(char) * PATH_MAX); + if (abs_filename == NULL) { + LOGE("Memory allocation failed\n"); + goto err; + } + + dp = opendir(dirname); + if (dp == NULL) { + if (errno == ENOENT) { + LOGD("no entry, path(%s)", dirname); + free(abs_filename); + return 0; + } + LOGE("Couldn't open the directory. errno : %d (%s)\n", errno, + strerror_r(errno, buf, sizeof(buf))); + goto err; + } + + for (ret = readdir_r(dp, &ep, &result); + ret == 0 && result != NULL; + ret = readdir_r(dp, &ep, &result)) { + snprintf(abs_filename, PATH_MAX - 1, "%s/%s", dirname, + ep.d_name); + if (lstat(abs_filename, &stFileInfo) < 0) + perror(abs_filename); + + if (S_ISDIR(stFileInfo.st_mode)) { + if (strcmp(ep.d_name, ".") && + strcmp(ep.d_name, "..")) { + ret = __clear_dir(abs_filename); + if (ret != 0) + LOGE("Couldn't remove the directory. " + "errno : %d (%s)\n", + errno, strerror_r(errno, buf, sizeof(buf))); + + ret = remove(abs_filename); + if (ret != 0) { + LOGE("Couldn't remove the directory. " + "errno : %d (%s)\n", + errno, strerror_r(errno, buf, sizeof(buf))); + goto err; + } + } + } else { + ret = remove(abs_filename); + if (ret != 0) { + LOGE("Couldn't remove the directory. errno : " + "%d (%s)\n", errno, + strerror_r(errno, buf, sizeof(buf))); + goto err; + } + } + } + closedir(dp); + free(abs_filename); + + return 0; + +err: + if (abs_filename) + free(abs_filename); + if (dp) + closedir(dp); + + return -1; +} + +static int __clear_cache_dir(const char *pkgid) +{ + int ret = 0; + uid_t uid = getuid(); + char dirname[PATH_MAX] = {0,}; + + if (pkgid == NULL) { + LOGE("pkgid is NULL\n"); + return -1; + } + + /* cache internal */ + snprintf(dirname, sizeof(dirname), "%s/%s%s", + INTERNAL_CACHE_PATH_PREFIX, pkgid, CACHE_PATH_POSTFIX); + + ret = __clear_dir(dirname); + if (ret < 0) + LOGE("Failed to clear internal cache dir."); + + /* shared/cache internal */ + snprintf(dirname, sizeof(dirname), "%s/%s%s", + INTERNAL_CACHE_PATH_PREFIX, pkgid, SHARED_PATH_POSTFIX); + + ret = __clear_dir(dirname); + if (ret < 0) + LOGE("Failed to clear internal shared cache dir."); + + /* cache external */ + tzplatform_set_user(uid); + + snprintf(dirname, sizeof(dirname), "%s%s%s", + EXTERNAL_CACHE_PATH_PREFIX, + tzplatform_mkpath(TZ_USER_NAME, pkgid), + CACHE_PATH_POSTFIX); + + ret = __clear_dir(dirname); + if (ret < 0) + LOGE("Failed to clear external cache dir."); + + /* shared/cache external */ + snprintf(dirname, sizeof(dirname), "%s%s%s", + EXTERNAL_CACHE_PATH_PREFIX, + tzplatform_mkpath(TZ_USER_NAME, pkgid), + SHARED_PATH_POSTFIX); + + tzplatform_reset_user(); + + ret = __clear_dir(dirname); + if (ret < 0) + LOGE("Failed to clear external shared cache dir."); + + return 0; +} + +static int __clear_data_dir(const char *pkgid) +{ + int ret = 0; + char dirname[PATH_MAX] = {0,}; + const char *rootpath = tzplatform_getenv(TZ_USER_APP); + pkgmgr_installer *pi = NULL; + pkgmgrinfo_pkginfo_h pkg_handle = NULL; + char *pkg_type = NULL; + + if (pkgid == NULL) { + LOGE("pkgid is NULL\n"); + return -1; + } + + pi = pkgmgr_installer_new(); + if (pi == NULL) { + LOGE("Failed to create installer"); + return -1; + } + pkgmgr_installer_set_request_type(pi, PKGMGR_REQ_CLEAR); + + ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(pkgid, getuid(), &pkg_handle); + if (ret != PMINFO_R_OK) { + LOGE("Failed to get pkginfo"); + ret = -1; + goto catch; + } + + ret = pkgmgrinfo_pkginfo_get_type(pkg_handle, &pkg_type); + if (ret != PMINFO_R_OK) { + LOGE("Failed to get type"); + ret = -1; + goto catch; + } + + snprintf(dirname, sizeof(dirname), "%s/%s/data", rootpath, pkgid); + pkgmgr_installer_send_signal(pi, pkg_type, pkgid, + PKGMGR_INSTALLER_START_KEY_STR, + PKGMGR_INSTALLER_CLEAR_EVENT_STR); + + ret = __clear_dir(dirname); + if (ret != 0) { + LOGE("Failed to clear data for pkg %s", pkgid); + pkgmgr_installer_send_signal(pi, pkg_type, pkgid, + PKGMGR_INSTALLER_END_KEY_STR, + PKGMGR_INSTALLER_FAIL_EVENT_STR); + } else { + pkgmgr_installer_send_signal(pi, pkg_type, pkgid, + PKGMGR_INSTALLER_END_KEY_STR, + PKGMGR_INSTALLER_OK_EVENT_STR); + } + +catch: + if (pkg_handle) + pkgmgrinfo_pkginfo_destroy_pkginfo(pkg_handle); + pkgmgr_installer_free(pi); + return ret; +} + +static int __clear_all_cache_dir_cb(const pkgmgrinfo_pkginfo_h handle, + void *user_data) +{ + int res = 0; + char *pkgid; + int *err_cnt = (int *)user_data; + + res = pkgmgrinfo_pkginfo_get_pkgid(handle, &pkgid); + if (res != PMINFO_R_OK) { + LOGE("pkgmgr_pkginfo_get_pkgid() failed"); + --(*err_cnt); + return 0; + } + + res = __clear_cache_dir(pkgid); + if (res != 0) { + LOGE("Failed to clear cache dir of %s", pkgid); + --(*err_cnt); + return 0; + } + + return 0; +} + +static int __clear_all_cache_dir(void) +{ + int err_cnt = 0; + int res; + + res = pkgmgrinfo_pkginfo_get_usr_list(__clear_all_cache_dir_cb, + &err_cnt, getuid()); + if (res != PMINFO_R_OK) { + LOGE("Failed to get pkg list. (%d)", res); + return -1; + } else if (err_cnt != 0) { + LOGE("Error occured in %d packages.", err_cnt); + return -1; + } + + return 0; +} + +static void print_usage(void) +{ + printf("pkg data/cache clear tool \n"); + + printf("\n"); + printf("-c --clear-cache clear pkg's cache\n"); + printf("-c --clear-data clear pkg's data\n"); + printf("-h, --help print this help\n"); + + printf("\n"); + printf("Usage: pkg_cleardata [options]\n"); + printf("pkg_cleardata -c \n"); + printf("pkg_cleardata -d \n"); + printf("\n"); +} + +int main(int argc, char *argv[]) +{ + int ret = -1; + int c = -1; + int opt_idx = 0; + char pkgid[MAX_PKG_NAME_LEN]; + + if (argc < 3) { + print_usage(); + return -1; + } + + if (getuid() < REGULAR_USER) { + LOGE("Should be run by regular user\n"); + return -1; + } + + while (1) { + c = getopt_long(argc, argv, short_options, long_options, + &opt_idx); + if (c == -1) + break; /* Parse end */ + switch (c) { + case 'c': /* cache */ + if (optarg) { + snprintf(pkgid, sizeof(pkgid), "%s", optarg); + } else { + print_usage(); + break; + } + + if (strcmp(pkgid, PKG_CLEAR_ALL_CACHE) == 0) + ret = __clear_all_cache_dir(); + else + ret = __clear_cache_dir(pkgid); + break; + case 'd': /* data */ + if (optarg) { + snprintf(pkgid, sizeof(pkgid), "%s", optarg); + } else { + print_usage(); + break; + } + + ret = __clear_data_dir(pkgid); + break; + case 'h': /* help */ + print_usage(); + ret = 0; + break; + default: + break; + } + } + return ret; +}