Utils: add IsDotOrDotDot() and use it in the appropriate places

Change-Id: I704522b26acfb3e7c423d9a14d69ede513b50482
This commit is contained in:
Eric Biggers 2020-11-02 15:31:56 -08:00
parent 4a969dba60
commit 7bcf427369
3 changed files with 9 additions and 11 deletions

View file

@ -70,9 +70,7 @@ static bool pushBackContents(const std::string& path, std::vector<std::string>&
bool found = false; bool found = false;
struct dirent* ent; struct dirent* ent;
while ((ent = readdir(dirp.get())) != NULL) { while ((ent = readdir(dirp.get())) != NULL) {
if ((!strcmp(ent->d_name, ".")) || (!strcmp(ent->d_name, ".."))) { if (IsDotOrDotDot(*ent)) continue;
continue;
}
auto subdir = path + "/" + ent->d_name; auto subdir = path + "/" + ent->d_name;
found |= pushBackContents(subdir, cmd, searchLevels - 1); found |= pushBackContents(subdir, cmd, searchLevels - 1);
} }

View file

@ -956,10 +956,7 @@ int64_t calculate_dir_size(int dfd) {
int subfd; int subfd;
/* always skip "." and ".." */ /* always skip "." and ".." */
if (name[0] == '.') { if (IsDotOrDotDot(*de)) continue;
if (name[1] == 0) continue;
if ((name[1] == '.') && (name[2] == 0)) continue;
}
subfd = openat(dfd, name, O_RDONLY | O_DIRECTORY | O_CLOEXEC); subfd = openat(dfd, name, O_RDONLY | O_DIRECTORY | O_CLOEXEC);
if (subfd >= 0) { if (subfd >= 0) {
@ -1256,6 +1253,10 @@ status_t UnmountTree(const std::string& mountPoint) {
return OK; return OK;
} }
bool IsDotOrDotDot(const struct dirent& ent) {
return strcmp(ent.d_name, ".") == 0 || strcmp(ent.d_name, "..") == 0;
}
static status_t delete_dir_contents(DIR* dir) { static status_t delete_dir_contents(DIR* dir) {
// Shamelessly borrowed from android::installd // Shamelessly borrowed from android::installd
int dfd = dirfd(dir); int dfd = dirfd(dir);
@ -1269,10 +1270,7 @@ static status_t delete_dir_contents(DIR* dir) {
const char* name = de->d_name; const char* name = de->d_name;
if (de->d_type == DT_DIR) { if (de->d_type == DT_DIR) {
/* always skip "." and ".." */ /* always skip "." and ".." */
if (name[0] == '.') { if (IsDotOrDotDot(*de)) continue;
if (name[1] == 0) continue;
if ((name[1] == '.') && (name[2] == 0)) continue;
}
android::base::unique_fd subfd( android::base::unique_fd subfd(
openat(dfd, name, O_RDONLY | O_DIRECTORY | O_NOFOLLOW | O_CLOEXEC)); openat(dfd, name, O_RDONLY | O_DIRECTORY | O_NOFOLLOW | O_CLOEXEC));

View file

@ -168,6 +168,8 @@ bool IsVirtioBlkDevice(unsigned int major);
status_t UnmountTreeWithPrefix(const std::string& prefix); status_t UnmountTreeWithPrefix(const std::string& prefix);
status_t UnmountTree(const std::string& mountPoint); status_t UnmountTree(const std::string& mountPoint);
bool IsDotOrDotDot(const struct dirent& ent);
status_t DeleteDirContentsAndDir(const std::string& pathname); status_t DeleteDirContentsAndDir(const std::string& pathname);
status_t DeleteDirContents(const std::string& pathname); status_t DeleteDirContents(const std::string& pathname);