From 9194a2a9343a60f545a22a6c2f6e5cfd33d82c54 Mon Sep 17 00:00:00 2001 From: Sangyoon Jang Date: Tue, 19 Apr 2016 09:48:44 +0900 Subject: [PATCH 01/16] Fix build issue, cleanup dependency Change-Id: I8dfcfcfa1b0bd17f8e7098f291e9638bfdc0da0e Signed-off-by: Sangyoon Jang --- CMakeLists.txt | 10 ++-- packaging/pkgmgr-tool.spec | 3 +- src/pkg_getsize.c | 115 ++++++++++++++++++++++----------------------- src/pkg_initdb.c | 1 - 4 files changed, 64 insertions(+), 65 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 4661309..9fbd38e 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -24,12 +24,12 @@ INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/client/include) INCLUDE(FindPkgConfig) -pkg_check_modules(pkgs_initdb REQUIRED libsmack libxml-2.0 bundle pkgmgr-parser pkgmgr-info libtzplatform-config pkgmgr) +pkg_check_modules(pkgs_initdb REQUIRED bundle pkgmgr-parser pkgmgr-info libtzplatform-config pkgmgr) FOREACH(flag ${pkgs_initdb_CFLAGS}) SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}") ENDFOREACH(flag) -pkg_check_modules(pkgs_test REQUIRED dlog glib-2.0 libxml-2.0 bundle pkgmgr-parser pkgmgr-info libtzplatform-config) +pkg_check_modules(pkgs_test REQUIRED dlog glib-2.0 bundle pkgmgr pkgmgr-parser pkgmgr-info pkgmgr-installer libtzplatform-config) FOREACH(flag ${pkgs_test_CFLAGS}) SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}") ENDFOREACH(flag) @@ -43,15 +43,15 @@ SET(CMAKE_C_FLAGS_DEBUG "-O0 -g -fPIE") SET(CMAKE_C_FLAGS_RELEASE "-O2 -fPIE") ADD_EXECUTABLE(pkgcmd src/pkg_cmd.c src/delta.c) -TARGET_LINK_LIBRARIES(pkgcmd pkgmgr-client ${pkgs_test_LDFLAGS}) +TARGET_LINK_LIBRARIES(pkgcmd ${pkgs_test_LDFLAGS}) INSTALL(TARGETS pkgcmd DESTINATION bin) ADD_EXECUTABLE(pkginfo src/pkg_info.c) -TARGET_LINK_LIBRARIES(pkginfo pkgmgr-client pkgmgr_installer ${pkgs_test_LDFLAGS}) +TARGET_LINK_LIBRARIES(pkginfo ${pkgs_test_LDFLAGS}) INSTALL(TARGETS pkginfo DESTINATION bin) ADD_EXECUTABLE(pkg_getsize src/pkg_getsize.c) -TARGET_LINK_LIBRARIES(pkg_getsize pkgmgr-client pkgmgr_installer ${pkgs_test_LDFLAGS}) +TARGET_LINK_LIBRARIES(pkg_getsize ${pkgs_test_LDFLAGS}) INSTALL(TARGETS pkg_getsize DESTINATION bin) ADD_EXECUTABLE(pkg_clearcache src/pkg_clearcache.c) diff --git a/packaging/pkgmgr-tool.spec b/packaging/pkgmgr-tool.spec index 89ca00f..7ba949f 100644 --- a/packaging/pkgmgr-tool.spec +++ b/packaging/pkgmgr-tool.spec @@ -21,11 +21,12 @@ BuildRequires: pkgconfig(iniparser) BuildRequires: pkgconfig(libtzplatform-config) BuildRequires: pkgconfig(xdgmime) BuildRequires: pkgconfig(db-util) -BuildRequires: pkgconfig(libsmack) BuildRequires: pkgconfig(pkgmgr) +BuildRequires: pkgconfig(pkgmgr-installer) BuildRequires: pkgmgr-info-parser-devel BuildRequires: pkgmgr-info-parser BuildRequires: fdupes +Requires: chsmack %description Packager Manager Tool for packaging diff --git a/src/pkg_getsize.c b/src/pkg_getsize.c index 9ab2056..0cd90d7 100644 --- a/src/pkg_getsize.c +++ b/src/pkg_getsize.c @@ -35,10 +35,9 @@ /* For multi-user support */ #include +#include #include -#include #include -#include #undef LOG_TAG #ifndef LOG_TAG @@ -89,7 +88,7 @@ static long long __calculate_directory_size(int dfd, bool include_itself) if (include_itself) { ret = fstat(dfd, &st); if (ret < 0) { - ERR("fstat() failed, file_info: ., errno: %d (%s)", errno, + LOGE("fstat() failed, file_info: ., errno: %d (%s)", errno, strerror_r(errno, buf, sizeof(buf))); return -1; } @@ -98,7 +97,7 @@ static long long __calculate_directory_size(int dfd, bool include_itself) dir = fdopendir(dfd); if (dir == NULL) { - ERR("fdopendir() failed, errno: %d (%s)", errno, + LOGE("fdopendir() failed, errno: %d (%s)", errno, strerror_r(errno, buf, sizeof(buf))); return -1; } @@ -117,18 +116,18 @@ static long long __calculate_directory_size(int dfd, bool include_itself) if (dent.d_type == DT_DIR) { subfd = openat(dfd, file_info, O_RDONLY | O_DIRECTORY); if (subfd < 0) { - ERR("openat() failed, file_info:%s, errno: %d(%s)", + LOGE("openat() failed, file_info:%s, errno: %d(%s)", file_info, errno, strerror_r(errno, buf, sizeof(buf))); goto error; } - DBG("traverse file_info: %s", file_info); + LOGD("traverse file_info: %s", file_info); size += __calculate_directory_size(subfd, true); close(subfd); } else { ret = fstatat(dfd, file_info, &st, AT_SYMLINK_NOFOLLOW); if (ret < 0) { - ERR("fstatat() failed, file_info:%s, errno: %d(%s)", + LOGE("fstatat() failed, file_info:%s, errno: %d(%s)", file_info, errno, strerror_r(errno, buf, sizeof(buf))); goto error; } @@ -154,92 +153,92 @@ static long long __calculate_shared_dir_size(int dfd, const char *app_root_dir, int ret; char buf[1024] = {0, }; - DBG("traverse path: %s/shared", app_root_dir); + LOGD("traverse path: %s/shared", app_root_dir); fd = openat(dfd, "shared", O_RDONLY | O_DIRECTORY); if (fd < 0) { - ERR("openat() failed, path: %s/shared, errno: %d (%s)", + LOGE("openat() failed, path: %s/shared, errno: %d (%s)", app_root_dir, errno, strerror_r(errno, buf, sizeof(buf))); return -1; } ret = fstat(fd, &st); if (ret < 0) { - ERR("fstat() failed, path: %s/shared, errno: %d (%s)", + LOGE("fstat() failed, path: %s/shared, errno: %d (%s)", app_root_dir, errno, strerror_r(errno, buf, sizeof(buf))); goto error; } *app_size += __stat_size(&st); /* shared directory */ - DBG("app_size: %lld", *app_size); + LOGD("app_size: %lld", *app_size); - DBG("traverse path: %s/shared/data", app_root_dir); + LOGD("traverse path: %s/shared/data", app_root_dir); subfd = openat(fd, "data", O_RDONLY | O_DIRECTORY); if (subfd >= 0) { size = __calculate_directory_size(subfd, false); if (size < 0) { - ERR("Calculating shared/data directory failed."); + LOGE("Calculating shared/data directory failed."); goto error; } *data_size += size; - DBG("data_size: %lld", *data_size); + LOGD("data_size: %lld", *data_size); close(subfd); } else if (subfd < 0 && errno != ENOENT) { - ERR("openat() failed, file_info: data, errno: %d (%s)", + LOGE("openat() failed, file_info: data, errno: %d (%s)", errno, strerror_r(errno, buf, sizeof(buf))); goto error; } - DBG("traverse path: %s/shared/trusted", app_root_dir); + LOGD("traverse path: %s/shared/trusted", app_root_dir); subfd = openat(fd, "trusted", O_RDONLY | O_DIRECTORY); if (subfd >= 0) { size = __calculate_directory_size(subfd, false); if (size < 0) { - ERR("Calculating shared/trusted directory failed."); + LOGE("Calculating shared/trusted directory failed."); goto error; } *data_size += size; - DBG("data_size: %lld", *data_size); + LOGD("data_size: %lld", *data_size); close(subfd); } else if (subfd < 0 && errno != ENOENT) { - DBG("openat() failed, file_info: trusted, errno: %d (%s)", + LOGD("openat() failed, file_info: trusted, errno: %d (%s)", errno, strerror_r(errno, buf, sizeof(buf))); goto error; } - DBG("traverse path: %s/shared/res", app_root_dir); + LOGD("traverse path: %s/shared/res", app_root_dir); subfd = openat(fd, "res", O_RDONLY | O_DIRECTORY); if (subfd >= 0) { size = __calculate_directory_size(subfd, true); if (size < 0) { - ERR("Calculating shared/res directory failed."); + LOGE("Calculating shared/res directory failed."); goto error; } *app_size += size; - DBG("app_size: %lld", *app_size); + LOGD("app_size: %lld", *app_size); close(subfd); } else if (subfd < 0 && errno != ENOENT) { - ERR("openat() failed, file_info: res, errno: %d (%s)", + LOGE("openat() failed, file_info: res, errno: %d (%s)", errno, strerror_r(errno, buf, sizeof(buf))); goto error; } - DBG("traverse path: %s/shared/cache", app_root_dir); + LOGD("traverse path: %s/shared/cache", app_root_dir); subfd = openat(fd, "cache", O_RDONLY | O_DIRECTORY); if (subfd >= 0) { size = __calculate_directory_size(subfd, false); if (size < 0) { - ERR("Calculating shared/cache directory failed."); + LOGE("Calculating shared/cache directory failed."); goto error; } *data_size += size; - DBG("data_size: %lld", *data_size); + LOGD("data_size: %lld", *data_size); close(subfd); } else if (subfd < 0 && errno != ENOENT) { - ERR("openat() failed, file_info: data, errno: %d (%s)", + LOGE("openat() failed, file_info: data, errno: %d (%s)", errno, strerror_r(errno, buf, sizeof(buf))); goto error; } @@ -289,13 +288,13 @@ static int __calculate_pkg_size_info(STORAGE_TYPE type, const char *pkgid, APP_BASE_EXTERNAL_PATH, pkgid); #endif } else { - ERR("Invalid STORAGE_TYPE"); + LOGE("Invalid STORAGE_TYPE"); return -1; } dir = opendir(app_root_dir); if (dir == NULL) { - ERR("opendir() failed, path: %s, errno: %d (%s)", + LOGE("opendir() failed, path: %s, errno: %d (%s)", app_root_dir, errno, strerror_r(errno, buf, sizeof(buf))); return -1; } @@ -303,7 +302,7 @@ static int __calculate_pkg_size_info(STORAGE_TYPE type, const char *pkgid, dfd = dirfd(dir); ret = fstat(dfd, &st); if (ret < 0) { - ERR("fstat() failed, path: %s, errno: %d (%s)", app_root_dir, + LOGE("fstat() failed, path: %s, errno: %d (%s)", app_root_dir, errno, strerror_r(errno, buf, sizeof(buf))); goto error; } @@ -325,48 +324,48 @@ static int __calculate_pkg_size_info(STORAGE_TYPE type, const char *pkgid, subfd = openat(dfd, name, O_RDONLY | O_DIRECTORY); if (subfd < 0) { if (errno != ENOENT) { - ERR("openat() failed, errno: %d (%s)", + LOGE("openat() failed, errno: %d (%s)", errno, strerror_r(errno, buf, sizeof(buf))); goto error; } continue; } if (strncmp(name, "data", strlen("data")) == 0) { - DBG("traverse path: %s/%s", app_root_dir, name); + LOGD("traverse path: %s/%s", app_root_dir, name); size = __calculate_directory_size(subfd, false); if (size < 0) { - ERR("Calculating data directory failed."); + LOGE("Calculating data directory failed."); goto error; } *data_size += size; - DBG("data_size: %lld", *data_size); + LOGD("data_size: %lld", *data_size); } else if (strncmp(name, "cache", strlen("cache")) == 0) { - DBG("traverse path: %s/%s", app_root_dir, name); + LOGD("traverse path: %s/%s", app_root_dir, name); size = __calculate_directory_size(subfd, false); if (size < 0) { - ERR("Calculating cache directory failed."); + LOGE("Calculating cache directory failed."); goto error; } *cache_size += size; - DBG("cache_size: %lld", *cache_size); + LOGD("cache_size: %lld", *cache_size); } else if (strncmp(name, "shared", strlen("shared")) == 0) { size = __calculate_shared_dir_size(dfd, app_root_dir, data_size, app_size); if (size < 0) { - ERR("Calculating shared directory failed."); + LOGE("Calculating shared directory failed."); goto error; } *app_size += size; - DBG("app_size: %lld", *app_size); + LOGD("app_size: %lld", *app_size); } else { - DBG("traverse path: %s/%s", app_root_dir, name); + LOGD("traverse path: %s/%s", app_root_dir, name); size = __calculate_directory_size(subfd, true); if (size < 0) { - ERR("Calculating %s directory failed.", name); + LOGE("Calculating %s directory failed.", name); goto error; } *app_size += size; - DBG("app_size: %lld", *app_size); + LOGD("app_size: %lld", *app_size); } close(subfd); } @@ -388,7 +387,7 @@ static char *__get_pkg_size_info_str(const pkg_size_info_t* pkg_size_info) size_info_str = (char *)malloc(MAX_SIZE_INFO_SIZE); if (size_info_str == NULL) { - ERR("Out of memory."); + LOGE("Out of memory."); return NULL; } @@ -411,7 +410,7 @@ static char *__get_pkg_size_info_str(const pkg_size_info_t* pkg_size_info) "%lld", pkg_size_info->ext_app_size); strncat(size_info_str, ":", MAX_SIZE_INFO_SIZE - strlen(size_info_str) - 1); - DBG("size_info_str: %s", size_info_str); + LOGD("size_info_str: %s", size_info_str); return size_info_str; } @@ -425,8 +424,8 @@ static int __get_pkg_size_info(const char *pkgid, &pkg_size_info->data_size, &pkg_size_info->cache_size, &pkg_size_info->app_size); if (ret < 0) - DBG("Calculating internal package size info failed: %d", ret); - DBG("size_info: %lld %lld %lld", pkg_size_info->data_size, + LOGD("Calculating internal package size info failed: %d", ret); + LOGD("size_info: %lld %lld %lld", pkg_size_info->data_size, pkg_size_info->cache_size, pkg_size_info->app_size); #if 0 @@ -435,8 +434,8 @@ static int __get_pkg_size_info(const char *pkgid, &pkg_size_info->ext_cache_size, &pkg_size_info->ext_app_size); if (ret < 0) - DBG("Calculating external package size info failed: %d", ret); - DBG("size_info(external): %lld %lld %lld", pkg_size_info->ext_data_size, + LOGD("Calculating external package size info failed: %d", ret); + LOGD("size_info(external): %lld %lld %lld", pkg_size_info->ext_data_size, pkg_size_info->ext_cache_size, pkg_size_info->ext_app_size); #endif @@ -453,7 +452,7 @@ static int __get_total_pkg_size_info_cb(const pkgmgrinfo_pkginfo_h handle, ret = pkgmgrinfo_pkginfo_get_pkgid(handle, &pkgid); if (ret != PMINFO_R_OK) { - ERR("pkgmgrinfo_pkginfo_get_pkgid() failed"); + LOGE("pkgmgrinfo_pkginfo_get_pkgid() failed"); return -1; } @@ -481,11 +480,11 @@ int __make_size_info_file(char *req_key, long long size) snprintf(info_file, sizeof(info_file), "%s/%s", PKG_SIZE_INFO_PATH, req_key); - ERR("File path = %s", info_file); + LOGE("File path = %s", info_file); file = fopen(info_file, "w"); if (file == NULL) { - ERR("Couldn't open the file %s", info_file); + LOGE("Couldn't open the file %s", info_file); return -1; } @@ -515,7 +514,7 @@ static int __send_sizeinfo_cb(const pkgmgrinfo_pkginfo_h handle, ret = pkgmgrinfo_pkginfo_get_pkgid(handle, &pkgid); if (ret != PMINFO_R_OK) { - ERR("pkgmgrinfo_pkginfo_get_pkgid() failed"); + LOGE("pkgmgrinfo_pkginfo_get_pkgid() failed"); return -1; } @@ -569,7 +568,7 @@ int main(int argc, char *argv[]) /* argv[4] = req_key */ if (argv[1] == NULL) { - ERR("pkgid is NULL"); + LOGE("pkgid is NULL"); return -1; } @@ -577,11 +576,11 @@ int main(int argc, char *argv[]) get_type = atoi(argv[2]); req_key = argv[4]; - DBG("start get size : [pkgid=%s, request type=%d]", pkgid, get_type); + LOGD("start get size : [pkgid=%s, request type=%d]", pkgid, get_type); pi = pkgmgr_installer_new(); if (pi == NULL) { - ERR("failed to create installer"); + LOGE("failed to create installer"); return -1; } pkgmgr_installer_receive_request(pi, argc, argv); @@ -634,16 +633,16 @@ int main(int argc, char *argv[]) break; default: ret = -1; - ERR("unsupported or depreated type"); + LOGE("unsupported or depreated type"); break; } if (pkgmgr_installer_send_signal(pi, PKGMGR_INSTALLER_GET_SIZE_KEY_STR, pkgid, PKGMGR_INSTALLER_GET_SIZE_KEY_STR, PKGMGR_INSTALLER_END_KEY_STR)) - ERR("failed to send finished signal"); + LOGE("failed to send finished signal"); - DBG("get size result = %d", ret); + LOGD("get size result = %d", ret); pkgmgr_installer_free(pi); return ret; diff --git a/src/pkg_initdb.c b/src/pkg_initdb.c index b61abbb..8baa5f1 100644 --- a/src/pkg_initdb.c +++ b/src/pkg_initdb.c @@ -34,7 +34,6 @@ #include #include -#include /* For multi-user support */ #include -- 2.7.4 From 52e2e51172de74ecb04698103ab419eedef3d3df Mon Sep 17 00:00:00 2001 From: Sangyoon Jang Date: Tue, 19 Apr 2016 18:51:34 +0900 Subject: [PATCH 02/16] Remove setuid bit from pkg_initdb setuid bit is no more needed. Change-Id: I7619a7d6869abf27b64c669a6939be46d904fa46 Signed-off-by: Sangyoon Jang --- packaging/pkgmgr-tool.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/pkgmgr-tool.spec b/packaging/pkgmgr-tool.spec index 7ba949f..c6cdbe9 100644 --- a/packaging/pkgmgr-tool.spec +++ b/packaging/pkgmgr-tool.spec @@ -74,7 +74,7 @@ fi %dir %{_sysconfdir}/opt/upgrade %{_sysconfdir}/opt/upgrade/pkgmgr.patch.sh %{_bindir}/pkgcmd -%attr(06755,root,root) %{_bindir}/pkg_initdb +%attr(0755,root,root) %{_bindir}/pkg_initdb %attr(755,root,root) %{_sysconfdir}/gumd/useradd.d/10_package-manager-add.post %{_bindir}/pkg_getsize %{_bindir}/pkg_clearcache -- 2.7.4 From b7368a9950d13826bfc1343b85c1dba526479758 Mon Sep 17 00:00:00 2001 From: Junghyun Yeon Date: Thu, 21 Apr 2016 14:36:25 +0900 Subject: [PATCH 03/16] Fix dependency issue Change-Id: Iea14887ebe7a58705fc1c37ba7e5be252f52b4e1 Signed-off-by: Junghyun Yeon --- packaging/pkgmgr-tool.spec | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packaging/pkgmgr-tool.spec b/packaging/pkgmgr-tool.spec index c6cdbe9..22f9a1a 100644 --- a/packaging/pkgmgr-tool.spec +++ b/packaging/pkgmgr-tool.spec @@ -8,6 +8,7 @@ Source0: %{name}-%{version}.tar.gz Source1001: %{name}.manifest Requires: unzip +Requires: smack BuildRequires: cmake BuildRequires: gettext-tools @@ -26,7 +27,6 @@ BuildRequires: pkgconfig(pkgmgr-installer) BuildRequires: pkgmgr-info-parser-devel BuildRequires: pkgmgr-info-parser BuildRequires: fdupes -Requires: chsmack %description Packager Manager Tool for packaging -- 2.7.4 From ba6e642b918f4dec485620c0f09a5a59fa73563e Mon Sep 17 00:00:00 2001 From: Tomasz Iwanek Date: Mon, 18 Apr 2016 16:38:25 +0200 Subject: [PATCH 04/16] Mount install option for pkgcmd To verify, check that pkgcmd can run mount install request: $ pkgcmd -t wgt -w -p $package_path $ pkgcmd -t tpk -w -p $package_path Requires: - https://review.tizen.org/gerrit/#/c/66569/ Change-Id: Iabcbe842a722fd042d96f04a1ed3cadd6dbd7f02 --- src/pkg_cmd.c | 46 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 45 insertions(+), 1 deletion(-) diff --git a/src/pkg_cmd.c b/src/pkg_cmd.c index 7d9e67f..55c6023 100644 --- a/src/pkg_cmd.c +++ b/src/pkg_cmd.c @@ -67,11 +67,12 @@ static int __convert_to_absolute_path(char *path); /* Supported options */ /* Note: 'G' is reserved */ -const char *short_options = "iurmcgCkaADL:lsd:p:t:n:T:S:e:M:X:Y:Z:qhG"; +const char *short_options = "iurwmcgCkaADL:lsd:p:t:n:T:S:e:M:X:Y:Z:qhG"; const struct option long_options[] = { {"install", 0, NULL, 'i'}, {"uninstall", 0, NULL, 'u'}, {"reinstall", 0, NULL, 'r'}, + {"mount-install", 0, NULL, 'w'}, {"move", 0, NULL, 'm'}, {"clear", 0, NULL, 'c'}, {"getsize", 0, NULL, 'g'}, @@ -109,6 +110,7 @@ enum pm_tool_request_e { INSTALL_REQ = 1, UNINSTALL_REQ, REINSTALL_REQ, + MOUNT_INSTALL_REQ, CSC_REQ, GETSIZE_REQ, CLEAR_REQ, @@ -384,6 +386,7 @@ static void __print_usage() printf("-i, --install install the package\n"); printf("-u, --uninstall uninstall the package\n"); printf("-r, --reinstall reinstall the package\n"); + printf("-w, --mount-install mount install the package\n"); printf("-c, --clear clear user data\n"); printf("-m, --move move package\n"); printf("-g, --getsize get size of given package\n"); @@ -411,6 +414,7 @@ static void __print_usage() printf("pkgcmd -i -t (-d ) -p (--global)\n"); printf("pkgcmd -u -n (--global)\n"); printf("pkgcmd -r -t -n (--global) \n"); + printf("pkgcmd -w -t (-d ) -p (--global)\n"); printf("pkgcmd -l (-t ) \n"); printf("pkgcmd -s -t -p \n"); printf("pkgcmd -s -t -n \n"); @@ -424,6 +428,7 @@ static void __print_usage() printf("pkgcmd -u -n org.example.hello\n"); printf("pkgcmd -i -t tpk -p /tmp/org.example.hello-1.0.0-arm.tpk\n"); printf("pkgcmd -r -t tpk -n org.example.hello\n"); + printf("pkgcmd -w -t tpk -p /tmp/org.example.hello-1.0.0-arm.tpk\n"); printf("pkgcmd -c -t tpk -n org.example.hello\n"); printf("pkgcmd -m -t tpk -T 1 -n org.example.hello\n"); printf("pkgcmd -C -n org.example.hello\n"); @@ -659,7 +664,42 @@ static int __process_request(uid_t uid) g_main_loop_run(main_loop); ret = data.result; break; + case MOUNT_INSTALL_REQ: + if (data.pkg_type[0] == '\0' || data.pkg_path[0] == '\0') { + printf("Please provide the arguments.\n"); + printf("use -h option to see usage\n"); + data.result = PKGCMD_ERRCODE_INVALID_VALUE; + break; + } + main_loop = g_main_loop_new(NULL, FALSE); + pc = pkgmgr_client_new(PC_REQUEST); + if (pc == NULL) { + printf("PkgMgr Client Creation Failed\n"); + data.result = PKGCMD_ERRCODE_ERROR; + break; + } + + if (data.tep_path[0] != '\0') + pkgmgr_client_set_tep_path(pc, data.tep_path, data.tep_move); + + if (data.des_path[0] == '\0') + ret = pkgmgr_client_usr_mount_install(pc, data.pkg_type, NULL, + data.pkg_path, NULL, PM_QUIET, + __return_cb, pc, uid); + else + ret = pkgmgr_client_usr_mount_install(pc, data.pkg_type, + data.des_path, data.pkg_path, + NULL, PM_QUIET, __return_cb, pc, uid); + if (ret < 0) { + data.result = PKGCMD_ERRCODE_ERROR; + if (access(data.pkg_path, F_OK) != 0) + data.result = PKGCMD_ERRCODE_PACKAGE_NOT_FOUND; + break; + } + g_main_loop_run(main_loop); + ret = data.result; + break; case CLEAR_REQ: if (data.pkg_type[0] == '\0' || data.pkgid[0] == '\0') { printf("Please provide the arguments.\n"); @@ -1101,6 +1141,10 @@ int main(int argc, char *argv[]) data.request = REINSTALL_REQ; break; + case 'w': /* mount install */ + data.request = MOUNT_INSTALL_REQ; + break; + case 'c': /* clear */ data.request = CLEAR_REQ; break; -- 2.7.4 From b71a184817f11812e5ad7db8ce078cf467046405 Mon Sep 17 00:00:00 2001 From: Tomasz Iwanek Date: Mon, 9 May 2016 17:41:21 +0200 Subject: [PATCH 05/16] Fix pkgmgr-create-delta.sh.in To verify, generated delta file from two version of widget: $ pkgcmd -X v1 -Y v2 and check that delta includes removed and added files. Change-Id: Ic6d90018214f7b689d70b1cfb30fbdd3bc792cc2 --- data/pkgmgr-create-delta.sh.in | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/data/pkgmgr-create-delta.sh.in b/data/pkgmgr-create-delta.sh.in index b22963e..aa643a8 100644 --- a/data/pkgmgr-create-delta.sh.in +++ b/data/pkgmgr-create-delta.sh.in @@ -147,6 +147,8 @@ while read line action="only" elif [ $count -eq 2 ]; then file1=$word; + elif [ $count -eq 3 ]; then + file=$word; elif [ $count -eq 4 ]; then file2=$word; elif [ $count -eq 5 ]; then @@ -216,7 +218,7 @@ while read line `echo "" >> $sample_delta/modified.xml` fi - elif [[ "$action" == "only" && "$file1" =~ "$old_pkg_unzip_path" ]]; then + elif [[ "$action" == "only" && "$file" =~ "$old_pkg_unzip_path" ]]; then parent_path=${line##*$old_pkg_unzip_path} #echo "removed " $parent_path string_to_replace_with="/" @@ -232,7 +234,7 @@ while read line dirpath="$dirpath/" fi `echo "" >> $sample_delta/removed.xml` - elif [[ "$action" == "only" && "$file1" =~ "$new_pkg_unzip_path" ]]; then + elif [[ "$action" == "only" && "$file" =~ "$new_pkg_unzip_path" ]]; then parent_path=${line##*$new_pkg_unzip_path} #echo "added " $parent_path string_to_replace_with="/" -- 2.7.4 From f684647fd1d290eda6c91aaac8f0f4bc44d820ae Mon Sep 17 00:00:00 2001 From: jongmyeongko Date: Tue, 10 May 2016 11:51:16 +0900 Subject: [PATCH 06/16] Remove preload tpk files after installation. And, skip pkg_initdb if there is old db file. Change-Id: Ie7f004bc30d3d5ee8d3ecd432e77f34056025cd7 Signed-off-by: jongmyeongko --- packaging/pkgmgr-tool.spec | 5 +++- src/install_preload_tpk.c | 72 ++++++++++++++++++++++++++++++++++------------ 2 files changed, 57 insertions(+), 20 deletions(-) diff --git a/packaging/pkgmgr-tool.spec b/packaging/pkgmgr-tool.spec index 22f9a1a..687bb36 100644 --- a/packaging/pkgmgr-tool.spec +++ b/packaging/pkgmgr-tool.spec @@ -57,7 +57,10 @@ update-mime-database %{_datadir}/mime chsmack -a '*' %{TZ_SYS_RW_PACKAGES} %posttrans -pkg_initdb +if [ ! -f %{TZ_SYS_DB}/.pkgmgr_parser.db ] +then + pkg_initdb +fi install_preload_tpk if [ -f /tmp/.preload_install_error ] then diff --git a/src/install_preload_tpk.c b/src/install_preload_tpk.c index 3694f6b..b270b55 100644 --- a/src/install_preload_tpk.c +++ b/src/install_preload_tpk.c @@ -26,6 +26,7 @@ #include #include #include +#include #include @@ -36,27 +37,35 @@ #ifdef _E #undef _E #endif -#define _E(fmt, arg...) fprintf(stderr, "[TPK_PRELOAD_INSTALL][E][%s,%d] "fmt"\n", __FUNCTION__, __LINE__, ##arg); +#define _E(fmt, arg...) fprintf(stderr, "[TPK_PRELOAD_INSTALL][E][%s,%d] \ + "fmt"\n", __FUNCTION__, __LINE__, ##arg); #ifdef _D #undef _D #endif -#define _D(fmt, arg...) fprintf(stderr, "[TPK_PRELOAD_INSTALL][D][%s,%d] "fmt"\n", __FUNCTION__, __LINE__, ##arg); +#define _D(fmt, arg...) fprintf(stderr, "[TPK_PRELOAD_INSTALL][D][%s,%d] \ + "fmt"\n", __FUNCTION__, __LINE__, ##arg); #define BACKEND_CMD "/usr/bin/tpk-backend" -static int _install_preload_tpk(uid_t uid, const char *directory) +static int _install_preload_tpk(const char *directory) { DIR *dir; struct dirent file_info, *result; int ret; - char buf[BUFSZE]; + char file_path[BUFSZE]; + char err_buf[BUFSZE]; dir = opendir(directory); if (!dir) { - _E("Failed to access the [%s] because %s", directory, - strerror_r(errno, buf, sizeof(buf))); - return -1; + if (errno == ENOENT) { + _D("The directory for preloaded tpks doesn't exist"); + return 0; + } else { + _E("Failed to access the [%s] because [%s]", directory, + strerror_r(errno, err_buf, sizeof(err_buf))); + return -1; + } } _D("Loading tpk files from %s", directory); @@ -67,27 +76,34 @@ static int _install_preload_tpk(uid_t uid, const char *directory) if (file_info.d_name[0] == '.') continue; - snprintf(buf, sizeof(buf), "%s/%s", directory, file_info.d_name); - _D("tpk file %s", buf); + snprintf(file_path, sizeof(file_path), "%s/%s", directory, + file_info.d_name); + _D("tpk file %s", file_path); pid_t pid = fork(); if (pid == 0) { - if (setuid(uid) != 0) { - _E("failed to set uid"); - closedir(dir); - return -1; - } - execl(BACKEND_CMD, BACKEND_CMD, "-i", buf, "--preload", - (char *)NULL); + execl(BACKEND_CMD, BACKEND_CMD, "-i", file_path, + "--preload", (char *)NULL); } else if (pid < 0) { _E("failed to fork and execute %s!", BACKEND_CMD); closedir(dir); return -1; } + if (pid > 0) { int status = 0; waitpid(pid, &status, 0); } + + /* remove a file after installation */ + ret = remove(file_path); + if (ret < 0) { + _E("Failed to remove the file [%s] because [%s]", + file_path, strerror_r(errno, err_buf, + sizeof(err_buf))); + closedir(dir); + return -1; + } } closedir(dir); @@ -106,13 +122,31 @@ static int _is_authorized(uid_t uid) int main(int argc, char *argv[]) { + char err_msg[BUFSZE]; const char *dir = tzplatform_mkpath(TZ_SYS_RO_APP, ".preload-tpk"); - uid_t uid = getuid(); + int handle = -1; + int ret = 0; - if (!_is_authorized(uid)) { + if (!_is_authorized(getuid())) { _E("You are not an authorized user!"); return -1; } - return _install_preload_tpk(uid, dir); + if (_install_preload_tpk(dir) < 0) { + handle = open("/tmp/.preload_install_error", + O_WRONLY | O_CREAT | O_APPEND | O_TRUNC, 0644); + if (handle == -1) { + _E("Failed to open error file"); + return -1; + } + snprintf(err_msg, sizeof(err_msg), + "install_preload_tpk error!\n"); + ret = write(handle, err_msg, strlen(err_msg)); + if (ret == -1) + _E("Failed to write an error message. (%d)", errno); + close(handle); + return -1; + } + + return 0; } -- 2.7.4 From a889e6f3d1143ca438e4802b7a972124a0152211 Mon Sep 17 00:00:00 2001 From: Tomasz Iwanek Date: Wed, 30 Mar 2016 13:57:42 +0200 Subject: [PATCH 07/16] Remove pkg_initdb binary This binary is moved to app-installers with name "pkg_initdb". Requires to be submitted with: - https://review.tizen.org/gerrit/64204 Change-Id: I4b2d6c2291ca3753492eede9c2ebdecb1dd5416f --- CMakeLists.txt | 4 ---- data/10_package-manager-add.post | 2 +- packaging/pkgmgr-tool.spec | 2 +- 3 files changed, 2 insertions(+), 6 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 9fbd38e..f816b98 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -58,10 +58,6 @@ 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_initdb src/pkg_initdb.c) -TARGET_LINK_LIBRARIES(pkg_initdb ${pkgs_initdb_LDFLAGS}) -INSTALL(TARGETS pkg_initdb DESTINATION bin) - ADD_EXECUTABLE(install_preload_tpk src/install_preload_tpk.c) TARGET_LINK_LIBRARIES(install_preload_tpk ${pkgs_test_LDFLAGS}) INSTALL(TARGETS install_preload_tpk DESTINATION bin) diff --git a/data/10_package-manager-add.post b/data/10_package-manager-add.post index 337a4c9..aa13d61 100644 --- a/data/10_package-manager-add.post +++ b/data/10_package-manager-add.post @@ -1 +1 @@ -pkg_initdb $2 +pkg_initdb --uid $2 diff --git a/packaging/pkgmgr-tool.spec b/packaging/pkgmgr-tool.spec index 687bb36..8e1685e 100644 --- a/packaging/pkgmgr-tool.spec +++ b/packaging/pkgmgr-tool.spec @@ -27,6 +27,7 @@ BuildRequires: pkgconfig(pkgmgr-installer) BuildRequires: pkgmgr-info-parser-devel BuildRequires: pkgmgr-info-parser BuildRequires: fdupes +Requires(posttrans): /usr/bin/pkg_initdb %description Packager Manager Tool for packaging @@ -77,7 +78,6 @@ fi %dir %{_sysconfdir}/opt/upgrade %{_sysconfdir}/opt/upgrade/pkgmgr.patch.sh %{_bindir}/pkgcmd -%attr(0755,root,root) %{_bindir}/pkg_initdb %attr(755,root,root) %{_sysconfdir}/gumd/useradd.d/10_package-manager-add.post %{_bindir}/pkg_getsize %{_bindir}/pkg_clearcache -- 2.7.4 From cf258e527d8b2e054c4e9b1e91c624cfa15fc4d8 Mon Sep 17 00:00:00 2001 From: Junghyun Yeon Date: Tue, 17 May 2016 16:11:05 +0900 Subject: [PATCH 08/16] Remove features regarding blacklist Change-Id: I22e28c980854146dd8957d7e2fb4685e6a77d619 Signed-off-by: Junghyun Yeon --- src/pkg_cmd.c | 111 ---------------------------------------------------------- 1 file changed, 111 deletions(-) diff --git a/src/pkg_cmd.c b/src/pkg_cmd.c index 55c6023..bafde0d 100644 --- a/src/pkg_cmd.c +++ b/src/pkg_cmd.c @@ -53,9 +53,6 @@ #define GLOBAL_USER tzplatform_getuid(TZ_SYS_GLOBALAPP_USER) #define OPTVAL_GLOBAL 1000 -#define OPTVAL_ADD_BLACKLIST 1001 -#define OPTVAL_REMOVE_BLACKLIST 1002 -#define OPTVAL_CHECK_BLACKLIST 1003 static int __process_request(uid_t uid); static void __print_usage(); @@ -99,9 +96,6 @@ const struct option long_options[] = { {"global", 0, NULL, OPTVAL_GLOBAL}, {"quiet", 0, NULL, 'q'}, {"help", 0, NULL, 'h'}, - {"add-blacklist", 1, NULL, OPTVAL_ADD_BLACKLIST}, - {"remove-blacklist", 1, NULL, OPTVAL_REMOVE_BLACKLIST}, - {"check-blacklist", 1, NULL, OPTVAL_CHECK_BLACKLIST}, {"debug-mode", 0, NULL, 'G'}, {0, 0, 0, 0} /* sentinel */ }; @@ -124,9 +118,6 @@ enum pm_tool_request_e { SHOW_REQ, HELP_REQ, CREATE_DELTA, - ADD_BLACKLIST_REQ, - REMOVE_BLACKLIST_REQ, - CHECK_BLACKLIST_REQ, }; typedef enum pm_tool_request_e req_type; @@ -404,9 +395,6 @@ static void __print_usage() printf("--global Global Mode [Warning user should be privilegied to use this mode] \n"); printf("-e, --tep-path provide TEP package path\n"); printf("-M, --tep-move decide move/copy of TEP package[0:copy TEP package /1 : move TEP package, \n"); - printf("--add-blacklist add a package to blacklist\n"); - printf("--remove-blacklist remove a package from blacklist\n"); - printf("--check-blacklist check if the given package is blacklisted\n"); printf("-G, --debug-mode install the package with debug mode for sdk\n"); printf("-h, --help . print this help\n\n"); @@ -516,7 +504,6 @@ static int __process_request(uid_t uid) int pid = -1; char pkg_old[PATH_MAX] = {0, }; char pkg_new[PATH_MAX] = {0, }; - bool blacklist; #if !GLIB_CHECK_VERSION(2, 35, 0) g_type_init(); @@ -993,83 +980,6 @@ static int __process_request(uid_t uid) ret = 0; break; - case ADD_BLACKLIST_REQ: - if (data.pkgid[0] == '\0') { - printf("Please provide the arguments.\n"); - printf("use -h option to see usage\n"); - ret = -1; - break; - } - - pc = pkgmgr_client_new(PC_REQUEST); - if (pc == NULL) { - printf("PkgMgr Client Creation Failed\n"); - data.result = PKGCMD_ERRCODE_ERROR; - break; - } - - ret = pkgmgr_client_usr_add_blacklist(pc, data.pkgid, uid); - if (ret < 0) { - data.result = PKGCMD_ERRCODE_ERROR; - break; - } - - printf("%d\n", ret); - ret = data.result; - break; - case REMOVE_BLACKLIST_REQ: - if (data.pkgid[0] == '\0') { - printf("Please provide the arguments.\n"); - printf("use -h option to see usage\n"); - ret = -1; - break; - } - - pc = pkgmgr_client_new(PC_REQUEST); - if (pc == NULL) { - printf("PkgMgr Client Creation Failed\n"); - data.result = PKGCMD_ERRCODE_ERROR; - break; - } - - ret = pkgmgr_client_usr_remove_blacklist(pc, data.pkgid, uid); - if (ret < 0) { - data.result = PKGCMD_ERRCODE_ERROR; - break; - } - - printf("%d\n", ret); - ret = data.result; - break; - case CHECK_BLACKLIST_REQ: - if (data.pkgid[0] == '\0') { - printf("Please provide the arguments.\n"); - printf("use -h option to see usage\n"); - ret = -1; - break; - } - - pc = pkgmgr_client_new(PC_REQUEST); - if (pc == NULL) { - printf("PkgMgr Client Creation Failed\n"); - data.result = PKGCMD_ERRCODE_ERROR; - break; - } - - ret = pkgmgr_client_usr_check_blacklist(pc, data.pkgid, &blacklist, uid); - if (ret < 0) { - data.result = PKGCMD_ERRCODE_ERROR; - break; - } - - if (blacklist) - printf("%s is blacklisted\n", data.pkgid); - else - printf("%s is not blacklisted\n", data.pkgid); - - ret = data.result; - break; - default: printf("Wrong Request\n"); ret = -1; @@ -1297,27 +1207,6 @@ int main(int argc, char *argv[]) case 'G': /* debug mode */ break; - case OPTVAL_ADD_BLACKLIST: - data.request = ADD_BLACKLIST_REQ; - if (optarg) - snprintf(data.pkgid, sizeof(data.pkgid), - "%s", optarg); - break; - - case OPTVAL_REMOVE_BLACKLIST: - data.request = REMOVE_BLACKLIST_REQ; - if (optarg) - snprintf(data.pkgid, sizeof(data.pkgid), - "%s", optarg); - break; - - case OPTVAL_CHECK_BLACKLIST: - data.request = CHECK_BLACKLIST_REQ; - if (optarg) - snprintf(data.pkgid, sizeof(data.pkgid), - "%s", optarg); - break; - /* Otherwise */ case '?': /* Not an option */ __print_usage(); -- 2.7.4 From 261152c17765662edb39e3a0a8b05947cbfec97d Mon Sep 17 00:00:00 2001 From: Junghyun Yeon Date: Wed, 18 May 2016 14:45:01 +0900 Subject: [PATCH 09/16] Add pkg rsc slice tool from tizen_2.4 Migrate rsc-slice tool from tizen_2.4 Change-Id: Ibd4c2e335109086032ad41260f71fe9b122b6b57 Signed-off-by: Junghyun Yeon --- CMakeLists.txt | 7 +- packaging/pkgmgr-tool.spec | 2 + src/pkg_rsc_slice.c | 275 +++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 283 insertions(+), 1 deletion(-) create mode 100755 src/pkg_rsc_slice.c diff --git a/CMakeLists.txt b/CMakeLists.txt index f816b98..f5612bb 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -29,7 +29,8 @@ FOREACH(flag ${pkgs_initdb_CFLAGS}) SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}") ENDFOREACH(flag) -pkg_check_modules(pkgs_test REQUIRED dlog glib-2.0 bundle pkgmgr pkgmgr-parser pkgmgr-info pkgmgr-installer libtzplatform-config) +pkg_check_modules(pkgs_test REQUIRED dlog glib-2.0 bundle pkgmgr pkgmgr-parser pkgmgr-info pkgmgr-installer +libtzplatform-config aul) FOREACH(flag ${pkgs_test_CFLAGS}) SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}") ENDFOREACH(flag) @@ -62,6 +63,10 @@ ADD_EXECUTABLE(install_preload_tpk src/install_preload_tpk.c) TARGET_LINK_LIBRARIES(install_preload_tpk ${pkgs_test_LDFLAGS}) INSTALL(TARGETS install_preload_tpk DESTINATION bin) +ADD_EXECUTABLE(rsc-slice src/pkg_rsc_slice.c) +TARGET_LINK_LIBRARIES(rsc-slice ${pkgs_test_LDFLAGS}) +INSTALL(TARGETS rsc-slice DESTINATION bin) + INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/data/10_package-manager-add.post DESTINATION ${SYSCONF_INSTALL_DIR}/gumd/useradd.d/) INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/data/mime.wac.xml DESTINATION /usr/share/mime/packages/) diff --git a/packaging/pkgmgr-tool.spec b/packaging/pkgmgr-tool.spec index 8e1685e..6de46e9 100644 --- a/packaging/pkgmgr-tool.spec +++ b/packaging/pkgmgr-tool.spec @@ -24,6 +24,7 @@ BuildRequires: pkgconfig(xdgmime) BuildRequires: pkgconfig(db-util) BuildRequires: pkgconfig(pkgmgr) BuildRequires: pkgconfig(pkgmgr-installer) +BuildRequires: pkgconfig(aul) BuildRequires: pkgmgr-info-parser-devel BuildRequires: pkgmgr-info-parser BuildRequires: fdupes @@ -82,6 +83,7 @@ fi %{_bindir}/pkg_getsize %{_bindir}/pkg_clearcache %{_bindir}/pkginfo +%{_bindir}/rsc-slice %attr(0755,root,root) %{_bindir}/install_preload_tpk %{_datadir}/mime/packages/mime.wac.xml %{_datadir}/mime/packages/mime.tpk.xml diff --git a/src/pkg_rsc_slice.c b/src/pkg_rsc_slice.c new file mode 100755 index 0000000..275420d --- /dev/null +++ b/src/pkg_rsc_slice.c @@ -0,0 +1,275 @@ + +/* + * pkgmgr-tool + * + * Copyright (c) 2015-2016 Samsung Electronics Co., Ltd. All rights reserved. + * + * 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 +#include +#include +#include "aul_rsc_mgr.h" + +#define RSC_TOOL_VERSION "0.1" +#define BUF_SIZE 1024 + +static int __process_slice(void); +static void __print_usage(); +//static int __is_authorized(); + +struct rsc_tool_args_t { + char res_path[PATH_MAX]; + int dpi; + int bpp; + char dpi_range[BUF_SIZE]; + char width_range[BUF_SIZE]; + char screen_large[BUF_SIZE]; + char platform_version[BUF_SIZE]; +}; + +typedef struct rsc_tool_args_t rsc_tool_args; +rsc_tool_args data; +GHashTable *valid_file_list; + +const char *short_options = "p:d:"; + +const struct option long_options[] = { + {"path", 1, NULL, 'p'}, + {"screen-dpi", 1, NULL, 'd'}, + {0, 0, 0, 0} /* sentinel */ +}; + + +static int __convert_to_abs_path(char *path) +{ + char abs[BUF_SIZE] = {'\0'}; + char cwd[BUF_SIZE] = {'\0'}; + char *buf = NULL; + int ret = -1; + + if (path == NULL) { + printf("invalid path\n"); + return -1; + } + + buf = getcwd(cwd, BUF_SIZE - 1); + if (buf == NULL) { + printf("failed to get cwd\n"); + return -1; + } + + ret = chdir(path); + if (ret < 0) { + printf("failed to change dir[%s]\n", path); + return -1; + } + + buf = getcwd(abs, BUF_SIZE - 1); + if (buf == NULL) { + printf("failed to get cwd\n"); + return -1; + } + + memset(data.res_path, '\0', BUF_SIZE); + snprintf(data.res_path, BUF_SIZE - 1, "%s/", abs); + ret = chdir(cwd); + if (ret < 0) { + printf("failed to change dir[%s]\n", path); + return -1; + } + + return 0; +} + +static void __print_usage() +{ + printf("\nResource Slicing Tool Version: %s\n\n", RSC_TOOL_VERSION); + printf("-p, --path set resource path\n"); + printf("-d, --screen-dpi set screen dpi value\n"); + + printf("Usage: rscslice [options] \n"); + printf("rsc-slice -p [res path] \n"); + printf("rsc-slice -p [res_path] -d [dpi value] \n"); + + printf("Example:\n"); + printf("rsc-slice -p /home/userid/workspace/testapp/res/ \n"); + printf("rsc-slice -p /home/userid/workspace/testapp/res/ -d 300 \n"); + + exit(0); +} + +static void __del_file(char *path) +{ + struct dirent **items; + struct stat fstat; + char abs_path[1024] = {0, }; + char cwd[1024] = {0, }; + char *tmp = NULL; + int nitems, i; + + if (chdir(path) < 0) { + printf("failed to chdir[%s]\n", path); + return; + } + + tmp = getcwd(cwd, 1024 - 1); + nitems = scandir("./", &items, NULL, alphasort); + + for (i = 0; i < nitems; i++) { + if (items[i]->d_name[0] == '.') + continue; + + snprintf(abs_path, 1024 - 1, "%s/%s", cwd, items[i]->d_name); + if (g_lstat(abs_path, &fstat) != 0) { + printf("failed to get info[%s]\n", abs_path); + return; + } + if ((fstat.st_mode & S_IFDIR) == S_IFDIR) { + __del_file(abs_path); + } else { + tmp = g_hash_table_lookup(valid_file_list, abs_path); + if (tmp == NULL) { + printf("deleting [%s]\n", abs_path); + remove(abs_path); + } + } + } +} + +static int __process_slice(void) +{ + int ret = -1; + bundle *b = NULL; + char dpi_value[1024] = {0, }; + + if (data.res_path[0] == '\0') + return -1; + + b = bundle_create(); + if (data.dpi != 0) { + snprintf(dpi_value, 1024 - 1, "%d", data.dpi); + bundle_add_str(b, "screen-dpi", dpi_value); + } + + /* other attributes will be added here*/ + + ret = aul_resource_manager_init_slice(data.res_path, b); + if (ret < 0) { + printf("failed to init rsc manager\n"); + goto catch; + } + + ret = aul_resource_manager_get_path_list(&valid_file_list); + if (ret < 0) { + printf("failed to init rsc manager\n"); + goto catch; + } + + /* remove useless resources and empty directories */ + __del_file(data.res_path); + + +catch: + if (aul_resource_manager_release() < 0) + printf("failed to release resource manager\n"); + + bundle_free(b); + return ret; +} + +int main(int argc, char *argv[]) +{ + optind = 1; + int opt_idx = 0; + int c = -1; + int ret = 0; + long starttime; + long endtime; + int i = 0; + struct timeval tv; + + if (argc == 1) + __print_usage(); + + gettimeofday(&tv, NULL); + starttime = tv.tv_sec * 1000l + tv.tv_usec / 1000l; + + /* initialization of global structure */ + data.dpi = 0; + data.bpp = 0; + memset(data.dpi_range, '\0', BUF_SIZE); + memset(data.width_range, '\0', BUF_SIZE); + memset(data.screen_large, '\0', BUF_SIZE); + memset(data.platform_version, '\0', BUF_SIZE); + + while (1) { + i++; + c = getopt_long(argc, argv, short_options, long_options, &opt_idx); + if (c == -1) + break; /* Parse end */ + switch (c) { + case 'p': /* resource path */ + if (optarg) + strncpy(data.res_path, optarg, PATH_MAX - 1); + + ret = __convert_to_abs_path(data.res_path); + if (ret == -1) { + printf("conversion of relative path to absolute path failed\n"); + return -1; + } + printf("path is [%s]\n", data.res_path); + break; + + case 'd': /* set dpi */ + if (optarg) + data.dpi = atoi(optarg); + + if (data.dpi == 0) { + printf("failed to get dpi value\n"); + return -1; + } + printf("dpi value is [%d]\n", data.dpi); + break; + + default: + break; + + } + } + + ret = __process_slice(); + + gettimeofday(&tv, NULL); + endtime = tv.tv_sec * 1000l + tv.tv_usec / 1000l; + printf("spend time for rsc-slice is [%d]ms\n", (int)(endtime - starttime)); + + return 0; +} -- 2.7.4 From 7f9eff4cabc9f8455111841217bb08d341a243ce Mon Sep 17 00:00:00 2001 From: jongmyeongko Date: Fri, 27 May 2016 10:32:54 +0900 Subject: [PATCH 10/16] add new option to get pkgsize for pkgcmd new option calls api which is called by application. fix the problem that the value of result_file for some request is always 0. Change-Id: I30c0a0cc697a86e75bd8e3b88f56f1db43b2ada8 Signed-off-by: jongmyeongko --- src/pkg_cmd.c | 63 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- src/pkg_getsize.c | 40 +++++++++++++++++++++++------------ 2 files changed, 89 insertions(+), 14 deletions(-) diff --git a/src/pkg_cmd.c b/src/pkg_cmd.c index bafde0d..ea086ac 100644 --- a/src/pkg_cmd.c +++ b/src/pkg_cmd.c @@ -64,7 +64,7 @@ static int __convert_to_absolute_path(char *path); /* Supported options */ /* Note: 'G' is reserved */ -const char *short_options = "iurwmcgCkaADL:lsd:p:t:n:T:S:e:M:X:Y:Z:qhG"; +const char *short_options = "iurwmcgxCkaADL:lsd:p:t:n:T:S:e:M:X:Y:Z:qhG"; const struct option long_options[] = { {"install", 0, NULL, 'i'}, {"uninstall", 0, NULL, 'u'}, @@ -97,6 +97,7 @@ const struct option long_options[] = { {"quiet", 0, NULL, 'q'}, {"help", 0, NULL, 'h'}, {"debug-mode", 0, NULL, 'G'}, + {"getsizeinfo", 0, NULL, 'x'}, {0, 0, 0, 0} /* sentinel */ }; @@ -118,6 +119,7 @@ enum pm_tool_request_e { SHOW_REQ, HELP_REQ, CREATE_DELTA, + GET_PKG_SIZE_INFO_REQ }; typedef enum pm_tool_request_e req_type; @@ -496,6 +498,28 @@ static int __pkg_list_cb(const pkgmgrinfo_pkginfo_h handle, void *user_data) return 0; } +static void __pkg_size_info_recv_cb(pkgmgr_client *pc, const char *pkgid, const pkg_size_info_t *size_info, void *user_data) +{ + printf("Called sizeinfo callback for pkgid(%s)\n", pkgid); + printf("Internal > data size: %lld, cache size: %lld, app size: %lld\n", + size_info->data_size, size_info->cache_size, size_info->app_size); + printf("External > data size: %lld, cache size: %lld, app size: %lld\n", + size_info->ext_data_size, size_info->ext_cache_size, size_info->ext_app_size); + + g_main_loop_quit(main_loop); +} + +static void __total_pkg_size_info_recv_cb(pkgmgr_client *pc, const pkg_size_info_t *size_info, void *user_data) +{ + printf("Called sizeinfo callback for total packages\n"); + printf("Internal > data size: %lld, cache size: %lld, app size: %lld\n", + size_info->data_size, size_info->cache_size, size_info->app_size); + printf("External > data size: %lld, cache size: %lld, app size: %lld\n", + size_info->ext_data_size, size_info->ext_cache_size, size_info->ext_app_size); + + g_main_loop_quit(main_loop); +} + static int __process_request(uid_t uid) { int ret = -1; @@ -975,6 +999,39 @@ static int __process_request(uid_t uid) ret = data.result; break; + case GET_PKG_SIZE_INFO_REQ: + if (data.pkgid[0] == '\0') { + printf("Please provide the arguments.\n"); + printf("use -h option to see usage\n"); + ret = -1; + break; + } + + main_loop = g_main_loop_new(NULL, FALSE); + pc = pkgmgr_client_new(PC_REQUEST); + if (pc == NULL) { + printf("PkgMgr Client Creation Failed\n"); + data.result = PKGCMD_ERR_FATAL_ERROR; + break; + } + + if (strcmp(data.pkgid, PKG_SIZE_INFO_TOTAL) == 0) { + ret = pkgmgr_client_get_total_package_size_info(pc, __total_pkg_size_info_recv_cb, NULL); + + } else { + ret = pkgmgr_client_get_package_size_info(pc, data.pkgid, __pkg_size_info_recv_cb, NULL); + } + if (ret < 0) { + data.result = PKGCMD_ERR_FATAL_ERROR; + break; + } + + printf("pkg[%s] ret: %d\n", data.pkgid, ret); + ret = data.result; + + g_main_loop_run(main_loop); + break; + case HELP_REQ: __print_usage(); ret = 0; @@ -1063,6 +1120,10 @@ int main(int argc, char *argv[]) data.request = GETSIZE_REQ; break; + case 'x': /* get pkg size info */ + data.request = GET_PKG_SIZE_INFO_REQ; + break; + case 'm': /* move */ data.request = MOVE_REQ; break; diff --git a/src/pkg_getsize.c b/src/pkg_getsize.c index 0cd90d7..c0106de 100644 --- a/src/pkg_getsize.c +++ b/src/pkg_getsize.c @@ -53,7 +53,7 @@ #define OWNER_ROOT 0 #define GLOBAL_USER tzplatform_getuid(TZ_SYS_GLOBALAPP_USER) -#if 0 /* installed at external storage is not supported yet */ +#if 0 /* TODO: installed at external storage is not supported yet */ #define APP_BASE_EXTERNAL_PATH "" #endif @@ -282,7 +282,7 @@ static int __calculate_pkg_size_info(STORAGE_TYPE type, const char *pkgid, tzplatform_mkpath(__is_global(uid) ? TZ_SYS_RW_APP : TZ_USER_APP, pkgid)); tzplatform_reset_user(); -#if 0 /* installed at external storage is not supported yet */ +#if 0 /* TODO: installed at external storage is not supported yet */ } else if (type == STORAGE_TYPE_EXTERNAL) { snprintf(app_root_dir, MAX_PATH_LENGTH, "%s%s/", APP_BASE_EXTERNAL_PATH, pkgid); @@ -423,12 +423,14 @@ static int __get_pkg_size_info(const char *pkgid, ret = __calculate_pkg_size_info(STORAGE_TYPE_INTERNAL, pkgid, &pkg_size_info->data_size, &pkg_size_info->cache_size, &pkg_size_info->app_size); - if (ret < 0) - LOGD("Calculating internal package size info failed: %d", ret); - LOGD("size_info: %lld %lld %lld", pkg_size_info->data_size, + if (ret < 0) { + LOGE("Calculating internal package size info failed: %d", ret); + } else { + LOGD("size_info: %lld %lld %lld", pkg_size_info->data_size, pkg_size_info->cache_size, pkg_size_info->app_size); + } -#if 0 +#if 0 /* TODO */ ret = __calculate_pkg_size_info(STORAGE_TYPE_EXTERNAL, pkgid, &pkg_size_info->ext_data_size, &pkg_size_info->ext_cache_size, @@ -456,7 +458,11 @@ static int __get_total_pkg_size_info_cb(const pkgmgrinfo_pkginfo_h handle, return -1; } - __get_pkg_size_info(pkgid, &temp_pkg_size_info); + ret = __get_pkg_size_info(pkgid, &temp_pkg_size_info); + if (ret < 0) { + LOGE("failed to get size"); + return -1; + } pkg_size_info->app_size += temp_pkg_size_info.app_size; pkg_size_info->data_size += temp_pkg_size_info.data_size; @@ -480,7 +486,7 @@ int __make_size_info_file(char *req_key, long long size) snprintf(info_file, sizeof(info_file), "%s/%s", PKG_SIZE_INFO_PATH, req_key); - LOGE("File path = %s", info_file); + LOGD("File path = (%s), size = (%lld)", info_file, size); file = fopen(info_file, "w"); if (file == NULL) { @@ -518,7 +524,11 @@ static int __send_sizeinfo_cb(const pkgmgrinfo_pkginfo_h handle, return -1; } - __get_pkg_size_info(pkgid, &temp_pkg_size_info); + ret = __get_pkg_size_info(pkgid, &temp_pkg_size_info); + if (ret < 0) { + LOGE("failed to get size"); + return -1; + } total_size = temp_pkg_size_info.app_size + temp_pkg_size_info.data_size + temp_pkg_size_info.cache_size; @@ -617,19 +627,23 @@ int main(int argc, char *argv[]) case PM_GET_PKG_SIZE_INFO: /* send result to signal */ ret = __get_pkg_size_info(pkgid, &info); - if (ret == 0) + if (ret == 0) { ret = __send_result_to_signal(pi, req_key, pkgid, &info); - ret = __make_size_info_file(req_key, 0); + size = info.app_size + info.data_size + info.cache_size; + } + ret = __make_size_info_file(req_key, size); break; case PM_GET_TOTAL_PKG_SIZE_INFO: /* send result to signal */ ret = pkgmgrinfo_pkginfo_get_usr_list( __get_total_pkg_size_info_cb, &info, getuid()); - if (ret == 0) + if (ret == 0) { ret = __send_result_to_signal(pi, req_key, PKG_SIZE_INFO_TOTAL, &info); - ret = __make_size_info_file(req_key, 0); + size = info.app_size + info.data_size + info.cache_size; + } + ret = __make_size_info_file(req_key, size); break; default: ret = -1; -- 2.7.4 From bcbe8d128781f3564d0a748c6d8af70df883baf0 Mon Sep 17 00:00:00 2001 From: jongmyeongko Date: Fri, 27 May 2016 15:22:47 +0900 Subject: [PATCH 11/16] add getting pkg size of external storage. fix 'get_size' event signaling. Change-Id: Idebb0f4e37c89828206e290a499615ca72cd7706 Signed-off-by: jongmyeongko --- src/pkg_getsize.c | 199 +++++++++++++++++++++++++++++++----------------------- 1 file changed, 116 insertions(+), 83 deletions(-) diff --git a/src/pkg_getsize.c b/src/pkg_getsize.c index c0106de..64013dd 100644 --- a/src/pkg_getsize.c +++ b/src/pkg_getsize.c @@ -53,13 +53,12 @@ #define OWNER_ROOT 0 #define GLOBAL_USER tzplatform_getuid(TZ_SYS_GLOBALAPP_USER) -#if 0 /* TODO: installed at external storage is not supported yet */ -#define APP_BASE_EXTERNAL_PATH "" -#endif +#define APP_BASE_EXTERNAL_PATH tzplatform_mkpath(TZ_SYS_MEDIA, "SDCardA1/apps") typedef enum { - STORAGE_TYPE_INTERNAL, - STORAGE_TYPE_EXTERNAL, + STORAGE_TYPE_INTERNAL_GLOBAL_PATH, + STORAGE_TYPE_INTERNAL_USER_PATH, + STORAGE_TYPE_EXTERNAL_USER_PATH, STORAGE_TYPE_MAX = 255, } STORAGE_TYPE; @@ -89,7 +88,7 @@ static long long __calculate_directory_size(int dfd, bool include_itself) ret = fstat(dfd, &st); if (ret < 0) { LOGE("fstat() failed, file_info: ., errno: %d (%s)", errno, - strerror_r(errno, buf, sizeof(buf))); + strerror_r(errno, buf, sizeof(buf))); return -1; } size += __stat_size(&st); @@ -98,13 +97,13 @@ static long long __calculate_directory_size(int dfd, bool include_itself) dir = fdopendir(dfd); if (dir == NULL) { LOGE("fdopendir() failed, errno: %d (%s)", errno, - strerror_r(errno, buf, sizeof(buf))); + strerror_r(errno, buf, sizeof(buf))); return -1; } for (ret = readdir_r(dir, &dent, &result); - ret == 0 && result != NULL; - ret = readdir_r(dir, &dent, &result)) { + ret == 0 && result != NULL; + ret = readdir_r(dir, &dent, &result)) { file_info = dent.d_name; if (file_info[0] == '.') { if (file_info[1] == '\0') @@ -117,7 +116,7 @@ static long long __calculate_directory_size(int dfd, bool include_itself) subfd = openat(dfd, file_info, O_RDONLY | O_DIRECTORY); if (subfd < 0) { LOGE("openat() failed, file_info:%s, errno: %d(%s)", - file_info, errno, strerror_r(errno, buf, sizeof(buf))); + file_info, errno, strerror_r(errno, buf, sizeof(buf))); goto error; } @@ -128,7 +127,7 @@ static long long __calculate_directory_size(int dfd, bool include_itself) ret = fstatat(dfd, file_info, &st, AT_SYMLINK_NOFOLLOW); if (ret < 0) { LOGE("fstatat() failed, file_info:%s, errno: %d(%s)", - file_info, errno, strerror_r(errno, buf, sizeof(buf))); + file_info, errno, strerror_r(errno, buf, sizeof(buf))); goto error; } size += __stat_size(&st); @@ -158,14 +157,14 @@ static long long __calculate_shared_dir_size(int dfd, const char *app_root_dir, fd = openat(dfd, "shared", O_RDONLY | O_DIRECTORY); if (fd < 0) { LOGE("openat() failed, path: %s/shared, errno: %d (%s)", - app_root_dir, errno, strerror_r(errno, buf, sizeof(buf))); + app_root_dir, errno, strerror_r(errno, buf, sizeof(buf))); return -1; } ret = fstat(fd, &st); if (ret < 0) { LOGE("fstat() failed, path: %s/shared, errno: %d (%s)", - app_root_dir, errno, strerror_r(errno, buf, sizeof(buf))); + app_root_dir, errno, strerror_r(errno, buf, sizeof(buf))); goto error; } *app_size += __stat_size(&st); /* shared directory */ @@ -185,7 +184,7 @@ static long long __calculate_shared_dir_size(int dfd, const char *app_root_dir, close(subfd); } else if (subfd < 0 && errno != ENOENT) { LOGE("openat() failed, file_info: data, errno: %d (%s)", - errno, strerror_r(errno, buf, sizeof(buf))); + errno, strerror_r(errno, buf, sizeof(buf))); goto error; } @@ -203,7 +202,7 @@ static long long __calculate_shared_dir_size(int dfd, const char *app_root_dir, close(subfd); } else if (subfd < 0 && errno != ENOENT) { LOGD("openat() failed, file_info: trusted, errno: %d (%s)", - errno, strerror_r(errno, buf, sizeof(buf))); + errno, strerror_r(errno, buf, sizeof(buf))); goto error; } @@ -221,7 +220,7 @@ static long long __calculate_shared_dir_size(int dfd, const char *app_root_dir, close(subfd); } else if (subfd < 0 && errno != ENOENT) { LOGE("openat() failed, file_info: res, errno: %d (%s)", - errno, strerror_r(errno, buf, sizeof(buf))); + errno, strerror_r(errno, buf, sizeof(buf))); goto error; } @@ -239,7 +238,7 @@ static long long __calculate_shared_dir_size(int dfd, const char *app_root_dir, close(subfd); } else if (subfd < 0 && errno != ENOENT) { LOGE("openat() failed, file_info: data, errno: %d (%s)", - errno, strerror_r(errno, buf, sizeof(buf))); + errno, strerror_r(errno, buf, sizeof(buf))); goto error; } @@ -255,11 +254,6 @@ error: return -1; } -static int __is_global(uid_t uid) -{ - return (uid == OWNER_ROOT || uid == GLOBAL_USER) ? 1 : 0; -} - static int __calculate_pkg_size_info(STORAGE_TYPE type, const char *pkgid, long long *data_size, long long *cache_size, long long *app_size) @@ -275,18 +269,20 @@ static int __calculate_pkg_size_info(STORAGE_TYPE type, const char *pkgid, struct dirent ent, *result; long long size = 0; - if (type == STORAGE_TYPE_INTERNAL) { - if (!__is_global(uid)) - tzplatform_set_user(uid); + if (type == STORAGE_TYPE_INTERNAL_GLOBAL_PATH) { + snprintf(app_root_dir, sizeof(app_root_dir), "%s", + tzplatform_mkpath(TZ_SYS_RW_APP, pkgid)); + } else if (type == STORAGE_TYPE_INTERNAL_USER_PATH) { + tzplatform_set_user(uid); snprintf(app_root_dir, sizeof(app_root_dir), "%s", - tzplatform_mkpath(__is_global(uid) - ? TZ_SYS_RW_APP : TZ_USER_APP, pkgid)); + tzplatform_mkpath(TZ_USER_APP, pkgid)); + tzplatform_reset_user(); + } else if (type == STORAGE_TYPE_EXTERNAL_USER_PATH) { + tzplatform_set_user(uid); + snprintf(app_root_dir, MAX_PATH_LENGTH, "%s%s", + APP_BASE_EXTERNAL_PATH, + tzplatform_mkpath(TZ_USER_NAME, pkgid)); tzplatform_reset_user(); -#if 0 /* TODO: installed at external storage is not supported yet */ - } else if (type == STORAGE_TYPE_EXTERNAL) { - snprintf(app_root_dir, MAX_PATH_LENGTH, "%s%s/", - APP_BASE_EXTERNAL_PATH, pkgid); -#endif } else { LOGE("Invalid STORAGE_TYPE"); return -1; @@ -294,8 +290,14 @@ static int __calculate_pkg_size_info(STORAGE_TYPE type, const char *pkgid, dir = opendir(app_root_dir); if (dir == NULL) { + if (errno == ENOENT) { + LOGD("no entry, path(%s)", app_root_dir); + return 0; + } + LOGE("opendir() failed, path: %s, errno: %d (%s)", - app_root_dir, errno, strerror_r(errno, buf, sizeof(buf))); + app_root_dir, errno, strerror_r(errno, buf, sizeof(buf))); + return -1; } @@ -303,7 +305,7 @@ static int __calculate_pkg_size_info(STORAGE_TYPE type, const char *pkgid, ret = fstat(dfd, &st); if (ret < 0) { LOGE("fstat() failed, path: %s, errno: %d (%s)", app_root_dir, - errno, strerror_r(errno, buf, sizeof(buf))); + errno, strerror_r(errno, buf, sizeof(buf))); goto error; } *app_size += __stat_size(&st); @@ -325,7 +327,7 @@ static int __calculate_pkg_size_info(STORAGE_TYPE type, const char *pkgid, if (subfd < 0) { if (errno != ENOENT) { LOGE("openat() failed, errno: %d (%s)", - errno, strerror_r(errno, buf, sizeof(buf))); + errno, strerror_r(errno, buf, sizeof(buf))); goto error; } continue; @@ -420,27 +422,43 @@ static int __get_pkg_size_info(const char *pkgid, { int ret; - ret = __calculate_pkg_size_info(STORAGE_TYPE_INTERNAL, pkgid, - &pkg_size_info->data_size, &pkg_size_info->cache_size, - &pkg_size_info->app_size); + ret = __calculate_pkg_size_info(STORAGE_TYPE_INTERNAL_GLOBAL_PATH, + pkgid, &pkg_size_info->data_size, + &pkg_size_info->cache_size, &pkg_size_info->app_size); if (ret < 0) { - LOGE("Calculating internal package size info failed: %d", ret); + LOGE("failed to calculate interal(global) size " \ + "for pkgid(%s)", pkgid); } else { - LOGD("size_info: %lld %lld %lld", pkg_size_info->data_size, + LOGD("size_info(upto global), (%lld %lld %lld)", + pkg_size_info->data_size, pkg_size_info->cache_size, pkg_size_info->app_size); } -#if 0 /* TODO */ - ret = __calculate_pkg_size_info(STORAGE_TYPE_EXTERNAL, pkgid, - &pkg_size_info->ext_data_size, - &pkg_size_info->ext_cache_size, - &pkg_size_info->ext_app_size); - if (ret < 0) - LOGD("Calculating external package size info failed: %d", ret); - LOGD("size_info(external): %lld %lld %lld", pkg_size_info->ext_data_size, + ret = __calculate_pkg_size_info(STORAGE_TYPE_INTERNAL_USER_PATH, + pkgid, &pkg_size_info->data_size, + &pkg_size_info->cache_size, &pkg_size_info->app_size); + if (ret < 0) { + LOGE("failed to calculate interal(user) size " \ + "for pkgid(%s)", pkgid); + } else { + LOGD("size_info(upto user), (%lld %lld %lld)", + pkg_size_info->data_size, + pkg_size_info->cache_size, pkg_size_info->app_size); + } + + ret = __calculate_pkg_size_info(STORAGE_TYPE_EXTERNAL_USER_PATH, + pkgid, &pkg_size_info->ext_data_size, + &pkg_size_info->ext_cache_size, &pkg_size_info->ext_app_size); + if (ret < 0) { + LOGE("failed to calculate external(user) size " \ + "for pkgid(%s)", pkgid); + } else { + LOGD("size_info(external, upto user), (%lld %lld %lld)", + pkg_size_info->ext_data_size, pkg_size_info->ext_cache_size, pkg_size_info->ext_app_size); -#endif + } + return ret; } @@ -459,10 +477,9 @@ static int __get_total_pkg_size_info_cb(const pkgmgrinfo_pkginfo_h handle, } ret = __get_pkg_size_info(pkgid, &temp_pkg_size_info); - if (ret < 0) { - LOGE("failed to get size"); - return -1; - } + if (ret < 0) + LOGW("failed to get size of some path"); + /* even if it's an error, store all the valid result */ pkg_size_info->app_size += temp_pkg_size_info.app_size; pkg_size_info->data_size += temp_pkg_size_info.data_size; @@ -485,7 +502,7 @@ int __make_size_info_file(char *req_key, long long size) return -1; snprintf(info_file, sizeof(info_file), "%s/%s", PKG_SIZE_INFO_PATH, - req_key); + req_key); LOGD("File path = (%s), size = (%lld)", info_file, size); file = fopen(info_file, "w"); @@ -525,10 +542,9 @@ static int __send_sizeinfo_cb(const pkgmgrinfo_pkginfo_h handle, } ret = __get_pkg_size_info(pkgid, &temp_pkg_size_info); - if (ret < 0) { - LOGE("failed to get size"); - return -1; - } + if (ret < 0) + LOGW("failed to get size of some path"); + /* even if it's an error, store all the valid result */ total_size = temp_pkg_size_info.app_size + temp_pkg_size_info.data_size + temp_pkg_size_info.cache_size; @@ -540,8 +556,8 @@ static int __send_sizeinfo_cb(const pkgmgrinfo_pkginfo_h handle, snprintf(data_buf, sizeof(data_buf), "%d", data_size); return pkgmgr_installer_send_signal(pi, - PKGMGR_INSTALLER_GET_SIZE_KEY_STR, - pkgid, data_buf, total_buf); + PKGMGR_INSTALLER_GET_SIZE_KEY_STR, + pkgid, data_buf, total_buf); } static int __send_result_to_signal(pkgmgr_installer *pi, const char *req_key, @@ -555,8 +571,8 @@ static int __send_result_to_signal(pkgmgr_installer *pi, const char *req_key, return -1; ret = pkgmgr_installer_send_signal(pi, - PKGMGR_INSTALLER_GET_SIZE_KEY_STR, - pkgid, PKGMGR_INSTALLER_GET_SIZE_KEY_STR, info_str); + PKGMGR_INSTALLER_GET_SIZE_KEY_STR, + pkgid, PKGMGR_INSTALLER_GET_SIZE_KEY_STR, info_str); free(info_str); return ret; @@ -599,50 +615,59 @@ int main(int argc, char *argv[]) case PM_GET_TOTAL_SIZE: /* send result to file */ ret = __get_pkg_size_info(pkgid, &info); - if (ret == 0) - size = info.app_size + info.data_size + info.cache_size; + if (ret < 0) + LOGW("failed to get size of some path"); + size = info.app_size + info.data_size + info.cache_size; ret = __make_size_info_file(req_key, size); break; case PM_GET_DATA_SIZE: /* send result to file */ ret = __get_pkg_size_info(pkgid, &info); - if (ret == 0) - size = info.data_size + info.cache_size; + if (ret < 0) + LOGW("failed to get size of some path"); + size = info.data_size + info.cache_size; ret = __make_size_info_file(req_key, size); break; case PM_GET_ALL_PKGS: /* send result to file */ ret = pkgmgrinfo_pkginfo_get_usr_list( - __get_total_pkg_size_info_cb, &info, getuid()); - if (ret == 0) + __get_total_pkg_size_info_cb, &info, getuid()); + if (ret < 0) + LOGE("failed to get all packages"); + else size = info.app_size + info.data_size + info.cache_size; ret = __make_size_info_file(req_key, size); break; case PM_GET_SIZE_INFO: /* send each result to signal */ - ret = pkgmgrinfo_pkginfo_get_usr_list(__send_sizeinfo_cb, pi, - getuid()); + ret = pkgmgrinfo_pkginfo_get_usr_list(__send_sizeinfo_cb, + pi, getuid()); + if (ret < 0) + LOGE("failed to get all packages"); ret = __make_size_info_file(req_key, 0); break; case PM_GET_PKG_SIZE_INFO: /* send result to signal */ ret = __get_pkg_size_info(pkgid, &info); - if (ret == 0) { - ret = __send_result_to_signal(pi, req_key, - pkgid, &info); - size = info.app_size + info.data_size + info.cache_size; - } + if (ret < 0) + LOGW("failed to get size of some path"); + size = info.app_size + info.data_size + info.cache_size; + /* always send a result */ + ret = __send_result_to_signal(pi, req_key, + pkgid, &info); ret = __make_size_info_file(req_key, size); break; case PM_GET_TOTAL_PKG_SIZE_INFO: /* send result to signal */ ret = pkgmgrinfo_pkginfo_get_usr_list( - __get_total_pkg_size_info_cb, &info, getuid()); - if (ret == 0) { - ret = __send_result_to_signal(pi, req_key, - PKG_SIZE_INFO_TOTAL, &info); + __get_total_pkg_size_info_cb, &info, getuid()); + if (ret < 0) + LOGE("failed to get all packages"); + else size = info.app_size + info.data_size + info.cache_size; - } + /* always send a result */ + ret = __send_result_to_signal(pi, req_key, + PKG_SIZE_INFO_TOTAL, &info); ret = __make_size_info_file(req_key, size); break; default: @@ -651,10 +676,18 @@ int main(int argc, char *argv[]) break; } - if (pkgmgr_installer_send_signal(pi, PKGMGR_INSTALLER_GET_SIZE_KEY_STR, - pkgid, PKGMGR_INSTALLER_GET_SIZE_KEY_STR, - PKGMGR_INSTALLER_END_KEY_STR)) + /* Only PM_GET_SIZE_INFO type needs 'end' signal, + * because the result is sent on each package's calculation. + * So, the callback needs to know the end of results. + * This is common operation since previous tizen version. + * Related API : pkgmgr_client_request_size_info + */ + if (get_type == PM_GET_SIZE_INFO) { + if (pkgmgr_installer_send_signal(pi, PKGMGR_INSTALLER_GET_SIZE_KEY_STR, + pkgid, PKGMGR_INSTALLER_GET_SIZE_KEY_STR, + PKGMGR_INSTALLER_END_KEY_STR)) LOGE("failed to send finished signal"); + } LOGD("get size result = %d", ret); pkgmgr_installer_free(pi); -- 2.7.4 From 2a45ad6ba9b270c2b3de61d7b19ffbacd567a4ca Mon Sep 17 00:00:00 2001 From: jongmyeongko Date: Fri, 27 May 2016 17:34:15 +0900 Subject: [PATCH 12/16] add clearing cache for external storage. Change-Id: I2f798d7f4b08d3e16f721dba61620b7e2b3d2541 Signed-off-by: jongmyeongko --- src/pkg_clearcache.c | 59 +++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 45 insertions(+), 14 deletions(-) diff --git a/src/pkg_clearcache.c b/src/pkg_clearcache.c index ba7f110..2352ec4 100644 --- a/src/pkg_clearcache.c +++ b/src/pkg_clearcache.c @@ -36,6 +36,7 @@ #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" @@ -64,33 +65,38 @@ static int __clear_dir(const char *dirname) 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))); + 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)) { + ret == 0 && result != NULL; + ret = readdir_r(dp, &ep, &result)) { snprintf(abs_filename, PATH_MAX - 1, "%s/%s", dirname, - ep.d_name); + 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, "..")) { + 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))); + "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))); + "errno : %d (%s)\n", + errno, strerror_r(errno, buf, sizeof(buf))); goto err; } } @@ -98,8 +104,8 @@ static int __clear_dir(const char *dirname) ret = remove(abs_filename); if (ret != 0) { LOGE("Couldn't remove the directory. errno : " - "%d (%s)\n", errno, - strerror_r(errno, buf, sizeof(buf))); + "%d (%s)\n", errno, + strerror_r(errno, buf, sizeof(buf))); goto err; } } @@ -121,6 +127,7 @@ err: static int __clear_cache_dir(const char *pkgid) { int ret = 0; + uid_t uid = getuid(); char dirname[PATH_MAX] = {0,}; if (pkgid == NULL) { @@ -130,7 +137,7 @@ static int __clear_cache_dir(const char *pkgid) /* cache internal */ snprintf(dirname, sizeof(dirname), "%s/%s%s", - INTERNAL_CACHE_PATH_PREFIX, pkgid, CACHE_PATH_POSTFIX); + INTERNAL_CACHE_PATH_PREFIX, pkgid, CACHE_PATH_POSTFIX); ret = __clear_dir(dirname); if (ret < 0) @@ -138,7 +145,31 @@ static int __clear_cache_dir(const char *pkgid) /* shared/cache internal */ snprintf(dirname, sizeof(dirname), "%s/%s%s", - INTERNAL_CACHE_PATH_PREFIX, pkgid, SHARED_PATH_POSTFIX); + 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) @@ -177,7 +208,7 @@ static int __clear_all_cache_dir(void) int res; res = pkgmgrinfo_pkginfo_get_usr_list(__clear_all_cache_dir_cb, - &err_cnt, getuid()); + &err_cnt, getuid()); if (res != PMINFO_R_OK) { LOGE("Failed to get pkg list. (%d)", res); return -1; -- 2.7.4 From e52e30663db1a138b437eb61e533a1e6966a292f Mon Sep 17 00:00:00 2001 From: Junghyun Yeon Date: Mon, 30 May 2016 16:06:33 +0900 Subject: [PATCH 13/16] change process of move request to wait return value Change-Id: I782e6fad4d4586538f46c4671818b03a5e740ab2 Signed-off-by: Junghyun Yeon --- src/pkg_cmd.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/pkg_cmd.c b/src/pkg_cmd.c index ea086ac..2b118eb 100644 --- a/src/pkg_cmd.c +++ b/src/pkg_cmd.c @@ -826,6 +826,8 @@ static int __process_request(uid_t uid) ret = -1; break; } + + main_loop = g_main_loop_new(NULL, FALSE); pc = pkgmgr_client_new(PC_REQUEST); if (pc == NULL) { printf("PkgMgr Client Creation Failed\n"); @@ -838,12 +840,12 @@ static int __process_request(uid_t uid) break; } ret = pkgmgr_client_usr_request_service(PM_REQUEST_MOVE, data.type, pc, - data.pkg_type, data.pkgid, uid, NULL, NULL, NULL); - - printf("pkg[%s] move result = %d\n", data.pkgid, ret); + data.pkg_type, data.pkgid, uid, NULL, __return_cb, NULL); if (ret < 0) break; + + g_main_loop_run(main_loop); ret = data.result; break; -- 2.7.4 From 852be7e00d5b82200237fa346dd350b95b0fe184 Mon Sep 17 00:00:00 2001 From: jongmyeongko Date: Fri, 10 Jun 2016 15:50:15 +0900 Subject: [PATCH 14/16] set label to prevent execution by non-system application. Change-Id: Ia071ef3b93043a9d0e868c8597152b85c9e5fd9e Signed-off-by: jongmyeongko --- packaging/pkgmgr-tool.manifest | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packaging/pkgmgr-tool.manifest b/packaging/pkgmgr-tool.manifest index 02dc527..b33b4cc 100644 --- a/packaging/pkgmgr-tool.manifest +++ b/packaging/pkgmgr-tool.manifest @@ -3,6 +3,10 @@ - + + + + + -- 2.7.4 From 46677e293f9e069fd922678f97625d3c57227ea8 Mon Sep 17 00:00:00 2001 From: Sangyoon Jang Date: Fri, 17 Jun 2016 16:00:14 +0900 Subject: [PATCH 15/16] Fix pkgcmd pkgtype is not a mandatory option for install request Change-Id: I1b41754ace0b6946df03a53c4a03c44d6725d820 Signed-off-by: Sangyoon Jang --- src/pkg_cmd.c | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/src/pkg_cmd.c b/src/pkg_cmd.c index 2b118eb..6e1a70b 100644 --- a/src/pkg_cmd.c +++ b/src/pkg_cmd.c @@ -534,7 +534,7 @@ static int __process_request(uid_t uid) #endif switch (data.request) { case INSTALL_REQ: - if (data.pkg_type[0] == '\0' || data.pkg_path[0] == '\0') { + if (data.pkg_path[0] == '\0') { printf("Please provide the arguments.\n"); printf("use -h option to see usage\n"); data.result = PKGCMD_ERRCODE_INVALID_VALUE; @@ -552,11 +552,13 @@ static int __process_request(uid_t uid) pkgmgr_client_set_tep_path(pc, data.tep_path, data.tep_move); if (data.des_path[0] == '\0') - ret = pkgmgr_client_usr_install(pc, data.pkg_type, NULL, - data.pkg_path, NULL, PM_QUIET, + ret = pkgmgr_client_usr_install(pc, + data.pkg_type[0] != '\0' ? data.pkg_type : NULL, + NULL, data.pkg_path, NULL, PM_QUIET, __return_cb, pc, uid); else - ret = pkgmgr_client_usr_install(pc, data.pkg_type, + ret = pkgmgr_client_usr_install(pc, + data.pkg_type[0] != '\0' ? data.pkg_type : NULL, data.des_path, data.pkg_path, NULL, PM_QUIET, __return_cb, pc, uid); @@ -651,7 +653,7 @@ static int __process_request(uid_t uid) break; case REINSTALL_REQ: - if (data.pkg_type[0] == '\0' || data.pkgid[0] == '\0') { + if (data.pkgid[0] == '\0') { printf("Please provide the arguments.\n"); printf("use -h option to see usage\n"); data.result = PKGCMD_ERRCODE_INVALID_VALUE; @@ -665,7 +667,7 @@ static int __process_request(uid_t uid) break; } - ret = pkgmgr_client_usr_reinstall(pc, data.pkg_type, data.pkgid, NULL, PM_QUIET, __return_cb, pc, uid); + ret = pkgmgr_client_usr_reinstall(pc, NULL, data.pkgid, NULL, PM_QUIET, __return_cb, pc, uid); if (ret < 0) { data.result = PKGCMD_ERRCODE_ERROR; if (access(data.pkg_path, F_OK) != 0) @@ -676,7 +678,7 @@ static int __process_request(uid_t uid) ret = data.result; break; case MOUNT_INSTALL_REQ: - if (data.pkg_type[0] == '\0' || data.pkg_path[0] == '\0') { + if (data.pkg_path[0] == '\0') { printf("Please provide the arguments.\n"); printf("use -h option to see usage\n"); data.result = PKGCMD_ERRCODE_INVALID_VALUE; @@ -694,11 +696,13 @@ static int __process_request(uid_t uid) pkgmgr_client_set_tep_path(pc, data.tep_path, data.tep_move); if (data.des_path[0] == '\0') - ret = pkgmgr_client_usr_mount_install(pc, data.pkg_type, NULL, - data.pkg_path, NULL, PM_QUIET, + ret = pkgmgr_client_usr_mount_install(pc, + data.pkg_type[0] != '\0' ? data.pkg_type : NULL, + NULL, data.pkg_path, NULL, PM_QUIET, __return_cb, pc, uid); else - ret = pkgmgr_client_usr_mount_install(pc, data.pkg_type, + ret = pkgmgr_client_usr_mount_install(pc, + data.pkg_type[0] != '\0' ? data.pkg_type : NULL, data.des_path, data.pkg_path, NULL, PM_QUIET, __return_cb, pc, uid); -- 2.7.4 From f811437fde3068afc0d11846122aad921aaa4f6a Mon Sep 17 00:00:00 2001 From: Sangyoon Jang Date: Mon, 27 Jun 2016 14:25:51 +0900 Subject: [PATCH 16/16] Clean up repository Remove unused files. (pkg_initdb) Remove excutable bit from source file. Change-Id: I6ee19dc01abc79c99606c3be782906add45401b9 Signed-off-by: Sangyoon Jang --- CMakeLists.txt | 7 -- data/10_package-manager-add.post | 1 - packaging/pkgmgr-tool.spec | 1 - src/pkg_initdb.c | 207 --------------------------------------- src/pkg_rsc_slice.c | 0 5 files changed, 216 deletions(-) delete mode 100644 data/10_package-manager-add.post delete mode 100644 src/pkg_initdb.c mode change 100755 => 100644 src/pkg_rsc_slice.c diff --git a/CMakeLists.txt b/CMakeLists.txt index f5612bb..b7a96db 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -24,11 +24,6 @@ INCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/client/include) INCLUDE(FindPkgConfig) -pkg_check_modules(pkgs_initdb REQUIRED bundle pkgmgr-parser pkgmgr-info libtzplatform-config pkgmgr) -FOREACH(flag ${pkgs_initdb_CFLAGS}) - SET(EXTRA_CFLAGS "${EXTRA_CFLAGS} ${flag}") -ENDFOREACH(flag) - pkg_check_modules(pkgs_test REQUIRED dlog glib-2.0 bundle pkgmgr pkgmgr-parser pkgmgr-info pkgmgr-installer libtzplatform-config aul) FOREACH(flag ${pkgs_test_CFLAGS}) @@ -67,8 +62,6 @@ ADD_EXECUTABLE(rsc-slice src/pkg_rsc_slice.c) TARGET_LINK_LIBRARIES(rsc-slice ${pkgs_test_LDFLAGS}) INSTALL(TARGETS rsc-slice DESTINATION bin) -INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/data/10_package-manager-add.post DESTINATION ${SYSCONF_INSTALL_DIR}/gumd/useradd.d/) - INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/data/mime.wac.xml DESTINATION /usr/share/mime/packages/) INSTALL(FILES ${CMAKE_CURRENT_SOURCE_DIR}/data/mime.tpk.xml DESTINATION /usr/share/mime/packages/) diff --git a/data/10_package-manager-add.post b/data/10_package-manager-add.post deleted file mode 100644 index aa13d61..0000000 --- a/data/10_package-manager-add.post +++ /dev/null @@ -1 +0,0 @@ -pkg_initdb --uid $2 diff --git a/packaging/pkgmgr-tool.spec b/packaging/pkgmgr-tool.spec index 6de46e9..7b9b010 100644 --- a/packaging/pkgmgr-tool.spec +++ b/packaging/pkgmgr-tool.spec @@ -79,7 +79,6 @@ fi %dir %{_sysconfdir}/opt/upgrade %{_sysconfdir}/opt/upgrade/pkgmgr.patch.sh %{_bindir}/pkgcmd -%attr(755,root,root) %{_sysconfdir}/gumd/useradd.d/10_package-manager-add.post %{_bindir}/pkg_getsize %{_bindir}/pkg_clearcache %{_bindir}/pkginfo diff --git a/src/pkg_initdb.c b/src/pkg_initdb.c deleted file mode 100644 index 8baa5f1..0000000 --- a/src/pkg_initdb.c +++ /dev/null @@ -1,207 +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 - -/* For multi-user support */ -#include - -#define OWNER_ROOT 0 -#define GLOBAL_USER tzplatform_getuid(TZ_SYS_GLOBALAPP_USER) -#define BUFSZE 4096 - -#ifdef _E -#undef _E -#endif -#define _E(fmt, arg...) fprintf(stderr, "[PKG_INITDB][E][%s,%d] "fmt"\n", \ - __FUNCTION__, __LINE__, ##arg); - -#ifdef _D -#undef _D -#endif -#define _D(fmt, arg...) fprintf(stderr, "[PKG_INITDB][D][%s,%d] "fmt"\n", \ - __FUNCTION__, __LINE__, ##arg); - -#define PKGINSTALLMANIFEST_CMD "/usr/bin/pkg-install-manifest" - -static int _is_global(uid_t uid) -{ - return (uid == OWNER_ROOT || uid == GLOBAL_USER) ? 1 : 0; -} - -static int _initdb_load_directory(uid_t uid, const char *directory) -{ - DIR *dir; - struct dirent file_info; - struct dirent *result; - char buf[BUFSZE]; - pid_t pid; - int status; - - dir = opendir(directory); - if (!dir) { - _E("Failed to access the [%s] because %s", directory, - strerror_r(errno, buf, sizeof(buf))); - return -1; - } - - _D("Loading manifest files from %s", directory); - - while (readdir_r(dir, &file_info, &result) == 0) { - if (result == NULL) - break; - if (file_info.d_type != DT_REG) - continue; - - snprintf(buf, sizeof(buf), "%s/%s", directory, - file_info.d_name); - _D("manifest file %s", buf); - - pid = fork(); - if (pid == 0) { - if (setuid(uid) != 0) { - _E("failed to set uid"); - closedir(dir); - return -1; - } - - execl(PKGINSTALLMANIFEST_CMD, PKGINSTALLMANIFEST_CMD, - "-x", buf, (char *)NULL); - _E("failed to execute: %s", - strerror_r(errno, buf, sizeof(buf))); - exit(EXIT_FAILURE); - } else if (pid < 0) { - _E("failed to fork and execute %s!", - PKGINSTALLMANIFEST_CMD); - closedir(dir); - return -1; - } else { - waitpid(pid, &status, 0); - } - } - - closedir(dir); - - return 0; -} - -static int _is_authorized() -{ - /* pkg_init db should be called by as root privilege. */ - uid_t uid = getuid(); - - if ((uid_t) OWNER_ROOT == uid) - return 1; - else - return 0; -} - -static void _remove_old_dbs(uid) -{ - const char *info_db_path; - const char *info_db_journal_path; - const char *cert_db_path; - const char *cert_db_journal_path; - - if (!_is_global(uid)) - tzplatform_set_user(uid); - - info_db_path = tzplatform_mkpath( - _is_global(uid) ? TZ_SYS_DB : TZ_USER_DB, - ".pkgmgr_parser.db"); - info_db_journal_path = tzplatform_mkpath( - _is_global(uid) ? TZ_SYS_DB : TZ_USER_DB, - ".pkgmgr_parser.db-journal"); - cert_db_path = tzplatform_mkpath( - _is_global(uid) ? TZ_SYS_DB : TZ_USER_DB, - ".pkgmgr_cert.db"); - cert_db_journal_path = tzplatform_mkpath( - _is_global(uid) ? TZ_SYS_DB : TZ_USER_DB, - ".pkgmgr_cert.db-journal"); - - if (remove(info_db_path)) - _E(" %s is not removed", info_db_path); - if (remove(info_db_journal_path)) - _E(" %s is not removed", info_db_journal_path); - if (remove(cert_db_path)) - _E(" %s is not removed", cert_db_path); - if (remove(cert_db_journal_path)) - _E(" %s is not removed", cert_db_journal_path); - - tzplatform_reset_user(); -} - -int main(int argc, char *argv[]) -{ - int ret; - const char *dir; - const char *dir_rw; - uid_t uid = 0; - - if (!_is_authorized()) { - _E("You are not an authorized user!"); - return -1; - } - - if (argc > 1) - uid = (uid_t)atoi(argv[1]); - - _remove_old_dbs(uid); - - ret = pkgmgr_parser_create_and_initialize_db(uid); - if (ret < 0) { - _E("cannot create db"); - return -1; - } - - if (_is_global(uid)) { - /* first, RO location */ - dir = tzplatform_getenv(TZ_SYS_RO_PACKAGES); - ret = _initdb_load_directory(uid, dir); - - /* second, RW location */ - dir_rw = tzplatform_getenv(TZ_SYS_RW_PACKAGES); - if (dir && dir_rw) - if (strcmp(dir, dir_rw)) - ret = _initdb_load_directory(uid, dir_rw); - } else { - /* specified user location */ - tzplatform_set_user(uid); - dir = tzplatform_getenv(TZ_USER_PACKAGES); - ret = _initdb_load_directory(uid, dir); - tzplatform_reset_user(); - } - - return ret; -} diff --git a/src/pkg_rsc_slice.c b/src/pkg_rsc_slice.c old mode 100755 new mode 100644 -- 2.7.4