#define LOG_TAG "PKGMGR_CLEARDATA"
#endif /* LOG_TAG */
-const char short_options[] = "cdhn:";
+const char short_options[] = "cdhn:u:";
const struct option long_options[] = {
{"cache", 0, NULL, 'c'},
{"data", 0, NULL, 'd'},
{"help", 0, NULL, 'h'},
{"pkgid", 1, NULL, 'n'},
+ {"uid", 1, NULL, 'u'},
{0, 0, 0, 0} /* sentinel */
};
+static uid_t uid;
+
+static pkgmgr_installer *pi;
+
+static void __send_signal(const char *pkgid, const char *event_type,
+ const char *key, const char *val)
+{
+ pkgmgr_installer_send_signal(pi, event_type, pkgid, key, val);
+ pkgmgr_installer_send_signal_for_uid(pi, uid, event_type, pkgid, key,
+ val);
+}
static int __clear_dir(const char *dirname)
{
static int __clear_cache_dir(const char *pkgid)
{
int ret = 0;
- uid_t uid = getuid();
char dirname[PATH_MAX] = {0,};
if (pkgid == NULL) {
return -1;
}
+ tzplatform_set_user(uid);
+
/* cache internal */
snprintf(dirname, sizeof(dirname), "%s/%s%s",
INTERNAL_CACHE_PATH_PREFIX, pkgid, CACHE_PATH_POSTFIX);
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,
{
int ret = 0;
char dirname[PATH_MAX] = {0,};
- const char *rootpath = tzplatform_getenv(TZ_USER_APP);
- pkgmgr_installer *pi = NULL;
+ const char *rootpath;
pkgmgrinfo_pkginfo_h pkg_handle = NULL;
char *pkg_type = NULL;
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);
+ ret = pkgmgrinfo_pkginfo_get_usr_pkginfo(pkgid, uid, &pkg_handle);
if (ret != PMINFO_R_OK) {
LOGE("Failed to get pkginfo");
ret = -1;
goto catch;
}
+ tzplatform_set_user(uid);
+ rootpath = tzplatform_getenv(TZ_USER_APP);
+ tzplatform_reset_user();
+
snprintf(dirname, sizeof(dirname), "%s/%s/data", rootpath, pkgid);
- pkgmgr_installer_send_signal(pi, pkg_type, pkgid,
+ __send_signal(pkgid, pkg_type,
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,
+ __send_signal(pkgid, pkg_type,
PKGMGR_INSTALLER_END_KEY_STR,
PKGMGR_INSTALLER_FAIL_EVENT_STR);
+
} else {
- pkgmgr_installer_send_signal(pi, pkg_type, pkgid,
+ __send_signal(pkgid, pkg_type,
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;
}
int res;
res = pkgmgrinfo_pkginfo_get_usr_list(__clear_all_cache_dir_cb,
- &err_cnt, getuid());
+ &err_cnt, uid);
if (res != PMINFO_R_OK) {
LOGE("Failed to get pkg list. (%d)", res);
return -1;
return -1;
}
- if (getuid() < REGULAR_USER) {
- LOGE("Should be run by regular user\n");
+ if (getuid() >= REGULAR_USER) {
+ LOGE("Regular user cannot run this tool");
return -1;
}
return -1;
}
break;
+ case 'u': /* uid */
+ if (optarg) {
+ uid = atoi(optarg);
+ } else {
+ print_usage();
+ return -1;
+ }
default:
break;
}
}
- if ((!clear_cache && !clear_data) || (pkgid[0] == '\0')) {
+ if ((!clear_cache && !clear_data) || (pkgid[0] == '\0') || uid == 0) {
print_usage();
return -1;
}
+ pi = pkgmgr_installer_new();
+ if (pi == NULL) {
+ LOGE("Failed to create installer");
+ return -1;
+ }
+
if (clear_cache) {
if (strcmp(pkgid, PKG_CLEAR_ALL_CACHE) == 0)
ret = __clear_all_cache_dir();
ret = __clear_cache_dir(pkgid);
}
- if (clear_data)
+ if (clear_data) {
+ pkgmgr_installer_set_request_type(pi, PKGMGR_REQ_CLEAR);
ret = __clear_data_dir(pkgid);
+ }
+
+ pkgmgr_installer_free(pi);
return ret;
}