Replace pkg_clearcache into pkg_cleardata 85/106485/4 accepted/tizen_3.0.m2_mobile accepted/tizen_3.0.m2_tv accepted/tizen_3.0.m2_wearable tizen_3.0.m2 accepted/tizen/3.0.m2/mobile/20170104.121709 accepted/tizen/3.0.m2/tv/20170104.122515 accepted/tizen/3.0.m2/wearable/20170104.122859 accepted/tizen/3.0/common/20161228.071555 accepted/tizen/3.0/ivi/20161226.030312 accepted/tizen/3.0/mobile/20161226.030150 accepted/tizen/3.0/tv/20161226.030217 accepted/tizen/3.0/wearable/20161226.030244 submit/tizen_3.0.m2/20170104.093749 submit/tizen_3.0/20161223.043050
authorJunghyun Yeon <jungh.yeon@samsung.com>
Thu, 22 Dec 2016 01:20:10 +0000 (10:20 +0900)
committerjongmyeong ko <jongmyeong.ko@samsung.com>
Fri, 23 Dec 2016 04:33:14 +0000 (20:33 -0800)
- 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 <jungh.yeon@samsung.com>
CMakeLists.txt
packaging/pkgmgr-tool.manifest
packaging/pkgmgr-tool.spec
src/pkg_clearcache.c [deleted file]
src/pkg_cleardata.c [new file with mode: 0644]

index 055b22260d2fb43ee75fa8f296c81d75e81445b9..78edcbe309b0c9b05861cabd6e351793dfd0f15f 100644 (file)
@@ -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})
index 7f2bbf11d62268fa5ff6999d339e16ec4806e8b4..64f527a638ceeacc1519890e016b1e5a6cc24387 100644 (file)
@@ -5,7 +5,7 @@
        <assign>
                <filesystem path="/usr/bin/install_preload_pkg" label="System" exec_label="none" />
                <filesystem path="/usr/bin/pkgcmd" label="User::Shell" exec_label="none" />
-               <filesystem path="/usr/bin/pkg_clearcache" label="System" exec_label="none" />
+               <filesystem path="/usr/bin/pkg_cleardata" label="System" exec_label="none" />
                <filesystem path="/usr/bin/pkg_getsize" label="System" exec_label="none" />
                <filesystem path="/usr/bin/pkginfo" label="User::Shell" exec_label="none" />
        </assign>
index 842b8fff472774a380ec6114eb31d343af1cce5e..3d8fcedb915ea9322f1b3796a88c85a215c081a8 100644 (file)
@@ -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 (file)
index 2352ec4..0000000
+++ /dev/null
@@ -1,241 +0,0 @@
-/*
- * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * Contact: Jayoun Lee <airjany@samsung.com>, Sewook Park <sewook7.park@samsung.com>,
- * Jaeho Lee <jaeho81.lee@samsung.com>, Shobhit Srivastava <shobhit.s@samsung.com>
- *
- * 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 <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <errno.h>
-#include <dirent.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-
-#include <dlog.h>
-#include <tzplatform_config.h>
-#include <pkgmgr-info.h>
-#include <package-manager.h>
-
-#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 (file)
index 0000000..ebeb8c3
--- /dev/null
@@ -0,0 +1,365 @@
+/*
+ * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Contact: Jayoun Lee <airjany@samsung.com>, Sewook Park <sewook7.park@samsung.com>,
+ * Jaeho Lee <jaeho81.lee@samsung.com>, Shobhit Srivastava <shobhit.s@samsung.com>
+ *
+ * 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 <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <errno.h>
+#include <dirent.h>
+#include <getopt.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+
+#include <dlog.h>
+#include <tzplatform_config.h>
+#include <pkgmgr-info.h>
+#include <pkgmgr_installer.h>
+#include <package-manager.h>
+
+#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 <pkgid> \n");
+       printf("pkg_cleardata -d <pkgid> \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;
+}