am 357df19b: Merge "Exclude subdirectories when pruning the dex cache."

* commit '357df19b14b8387a480ed68dd6ea92eeb1aa4edc':
  Exclude subdirectories when pruning the dex cache.
This commit is contained in:
Narayan Kamath 2014-06-24 12:13:30 +00:00 committed by Android Git Automerger
commit 9bc8c62ea4
3 changed files with 29 additions and 8 deletions

View File

@ -1384,10 +1384,11 @@ int restorecon_data(const char* pkgName, const char* seinfo, uid_t uid)
static int prune_dex_exclusion_predicate(const char *file_name, const int is_dir) static int prune_dex_exclusion_predicate(const char *file_name, const int is_dir)
{ {
// Don't exclude any directories, we want to inspect them // Exclude all directories. The top level command will be
// recusively for files. // given a list of ISA specific directories that are assumed
// to be flat.
if (is_dir) { if (is_dir) {
return 0; return 1;
} }
@ -1405,6 +1406,26 @@ static int prune_dex_exclusion_predicate(const char *file_name, const int is_dir
return 1; return 1;
} }
int prune_dex_cache() { int prune_dex_cache(const char* subdir) {
return delete_dir_contents(DALVIK_CACHE_PREFIX, 0, &prune_dex_exclusion_predicate); // "." is handled as a special case, and refers to
// DALVIK_CACHE_PREFIX (usually /data/dalvik-cache).
const bool is_dalvik_cache_root = !strcmp(subdir, ".");
// Don't allow the path to contain "." or ".." except for the
// special case above. This is much stricter than we need to be,
// but there's no good reason to support them.
if (strchr(subdir, '.' ) != NULL && !is_dalvik_cache_root) {
return -1;
}
if (!is_dalvik_cache_root) {
char full_path[PKG_PATH_MAX];
snprintf(full_path, sizeof(full_path), "%s%s", DALVIK_CACHE_PREFIX, subdir);
return delete_dir_contents(full_path, 0, &prune_dex_exclusion_predicate);
}
// When subdir == ".", clean the contents of the top level
// dalvik-cache directory.
return delete_dir_contents(DALVIK_CACHE_PREFIX, 0, &prune_dex_exclusion_predicate);
} }

View File

@ -143,7 +143,7 @@ static int do_restorecon_data(char **arg, char reply[REPLY_MAX] __attribute__((u
static int do_prune_dex_cache(char **arg __attribute__((unused)), static int do_prune_dex_cache(char **arg __attribute__((unused)),
char reply[REPLY_MAX] __attribute__((unused))) char reply[REPLY_MAX] __attribute__((unused)))
{ {
return prune_dex_cache(); return prune_dex_cache(arg[0] /* subdirectory name */);
} }
struct cmdinfo { struct cmdinfo {
@ -172,7 +172,7 @@ struct cmdinfo cmds[] = {
{ "rmuser", 1, do_rm_user }, { "rmuser", 1, do_rm_user },
{ "idmap", 3, do_idmap }, { "idmap", 3, do_idmap },
{ "restorecondata", 3, do_restorecon_data }, { "restorecondata", 3, do_restorecon_data },
{ "prunedexcache", 0, do_prune_dex_cache }, { "prunedexcache", 1, do_prune_dex_cache },
}; };
static int readx(int s, void *_buf, int count) static int readx(int s, void *_buf, int count)

View File

@ -220,4 +220,4 @@ int movefiles();
int linklib(const char* target, const char* source, int userId); int linklib(const char* target, const char* source, int userId);
int idmap(const char *target_path, const char *overlay_path, uid_t uid); int idmap(const char *target_path, const char *overlay_path, uid_t uid);
int restorecon_data(); int restorecon_data();
int prune_dex_cache(); int prune_dex_cache(const char* subdir);