| Index: runtime/bin/directory_android.cc
|
| diff --git a/runtime/bin/directory_android.cc b/runtime/bin/directory_android.cc
|
| index 40bcde3f64f431c80f2b4bc12f79243371c7ee00..6571f18f86008e0e87e1cb40731747a58439fe92 100644
|
| --- a/runtime/bin/directory_android.cc
|
| +++ b/runtime/bin/directory_android.cc
|
| @@ -14,34 +14,46 @@
|
| #include <sys/stat.h> // NOLINT
|
| #include <unistd.h> // NOLINT
|
|
|
| +#include "bin/dartutils.h"
|
| #include "bin/file.h"
|
| #include "bin/platform.h"
|
| -
|
| #include "platform/signal_blocker.h"
|
|
|
| -
|
| namespace dart {
|
| namespace bin {
|
|
|
| -
|
| PathBuffer::PathBuffer() : length_(0) {
|
| - data_ = calloc(PATH_MAX + 1, sizeof(char)); // NOLINT
|
| + data_ = calloc(PATH_MAX + 1, sizeof(char)); // NOLINT
|
| }
|
|
|
| +
|
| +PathBuffer::~PathBuffer() {
|
| + free(data_);
|
| +}
|
| +
|
| +
|
| bool PathBuffer::AddW(const wchar_t* name) {
|
| UNREACHABLE();
|
| return false;
|
| }
|
|
|
| +
|
| char* PathBuffer::AsString() const {
|
| return reinterpret_cast<char*>(data_);
|
| }
|
|
|
| +
|
| wchar_t* PathBuffer::AsStringW() const {
|
| UNREACHABLE();
|
| return NULL;
|
| }
|
|
|
| +
|
| +const char* PathBuffer::AsScopedString() const {
|
| + return DartUtils::ScopedCopyCString(AsString());
|
| +}
|
| +
|
| +
|
| bool PathBuffer::Add(const char* name) {
|
| char* data = AsString();
|
| int written = snprintf(data + length_,
|
| @@ -49,9 +61,9 @@ bool PathBuffer::Add(const char* name) {
|
| "%s",
|
| name);
|
| data[PATH_MAX] = '\0';
|
| - if (written <= PATH_MAX - length_ &&
|
| - written >= 0 &&
|
| - static_cast<size_t>(written) == strnlen(name, PATH_MAX + 1)) {
|
| + if ((written <= PATH_MAX - length_) &&
|
| + (written >= 0) &&
|
| + (static_cast<size_t>(written) == strnlen(name, PATH_MAX + 1))) {
|
| length_ += written;
|
| return true;
|
| } else {
|
| @@ -60,7 +72,8 @@ bool PathBuffer::Add(const char* name) {
|
| }
|
| }
|
|
|
| -void PathBuffer::Reset(int new_length) {
|
| +
|
| +void PathBuffer::Reset(intptr_t new_length) {
|
| length_ = new_length;
|
| AsString()[length_] = '\0';
|
| }
|
| @@ -84,7 +97,7 @@ ListType DirectoryListingEntry::Next(DirectoryListing* listing) {
|
| do {
|
| lister_ = reinterpret_cast<intptr_t>(
|
| opendir(listing->path_buffer().AsString()));
|
| - } while (lister_ == 0 && errno == EINTR);
|
| + } while ((lister_ == 0) && (errno == EINTR));
|
|
|
| if (lister_ == 0) {
|
| done_ = true;
|
| @@ -106,18 +119,19 @@ ListType DirectoryListingEntry::Next(DirectoryListing* listing) {
|
| int status = 0;
|
| dirent entry;
|
| dirent* result;
|
| - if ((status = NO_RETRY_EXPECTED(readdir_r(reinterpret_cast<DIR*>(lister_),
|
| - &entry,
|
| - &result))) == 0 &&
|
| - result != NULL) {
|
| + status = NO_RETRY_EXPECTED(readdir_r(
|
| + reinterpret_cast<DIR*>(lister_), &entry, &result));
|
| + if ((status == 0) && (result != NULL)) {
|
| if (!listing->path_buffer().Add(entry.d_name)) {
|
| done_ = true;
|
| return kListError;
|
| }
|
| switch (entry.d_type) {
|
| case DT_DIR:
|
| - if (strcmp(entry.d_name, ".") == 0) return Next(listing);
|
| - if (strcmp(entry.d_name, "..") == 0) return Next(listing);
|
| + if ((strcmp(entry.d_name, ".") == 0) ||
|
| + (strcmp(entry.d_name, "..") == 0)) {
|
| + return Next(listing);
|
| + }
|
| return kListDirectory;
|
| case DT_REG:
|
| return kListFile;
|
| @@ -146,8 +160,8 @@ ListType DirectoryListingEntry::Next(DirectoryListing* listing) {
|
| link_ };
|
| LinkList* previous = link_;
|
| while (previous != NULL) {
|
| - if (previous->dev == current_link.dev &&
|
| - previous->ino == current_link.ino) {
|
| + if ((previous->dev == current_link.dev) &&
|
| + (previous->ino == current_link.ino)) {
|
| // Report the looping link as a link, rather than following it.
|
| return kListLink;
|
| }
|
| @@ -163,14 +177,18 @@ ListType DirectoryListingEntry::Next(DirectoryListing* listing) {
|
| // Recurse into the subdirectory with current_link added to the
|
| // linked list of seen file system links.
|
| link_ = new LinkList(current_link);
|
| - if (strcmp(entry.d_name, ".") == 0) return Next(listing);
|
| - if (strcmp(entry.d_name, "..") == 0) return Next(listing);
|
| + if ((strcmp(entry.d_name, ".") == 0) ||
|
| + (strcmp(entry.d_name, "..") == 0)) {
|
| + return Next(listing);
|
| + }
|
| return kListDirectory;
|
| }
|
| }
|
| if (S_ISDIR(entry_info.st_mode)) {
|
| - if (strcmp(entry.d_name, ".") == 0) return Next(listing);
|
| - if (strcmp(entry.d_name, "..") == 0) return Next(listing);
|
| + if ((strcmp(entry.d_name, ".") == 0) ||
|
| + (strcmp(entry.d_name, "..") == 0)) {
|
| + return Next(listing);
|
| + }
|
| return kListDirectory;
|
| } else if (S_ISREG(entry_info.st_mode)) {
|
| return kListFile;
|
| @@ -203,7 +221,7 @@ DirectoryListingEntry::~DirectoryListingEntry() {
|
|
|
|
|
| void DirectoryListingEntry::ResetLink() {
|
| - if (link_ != NULL && (parent_ == NULL || parent_->link_ != link_)) {
|
| + if ((link_ != NULL) && ((parent_ == NULL) || (parent_->link_ != link_))) {
|
| delete link_;
|
| link_ = NULL;
|
| }
|
| @@ -218,14 +236,15 @@ static bool DeleteRecursively(PathBuffer* path);
|
|
|
| static bool DeleteFile(char* file_name,
|
| PathBuffer* path) {
|
| - return path->Add(file_name) && unlink(path->AsString()) == 0;
|
| + return path->Add(file_name) && (unlink(path->AsString()) == 0);
|
| }
|
|
|
|
|
| static bool DeleteDir(char* dir_name,
|
| PathBuffer* path) {
|
| - if (strcmp(dir_name, ".") == 0) return true;
|
| - if (strcmp(dir_name, "..") == 0) return true;
|
| + if ((strcmp(dir_name, ".") == 0) || (strcmp(dir_name, "..") == 0)) {
|
| + return true;
|
| + }
|
| return path->Add(dir_name) && DeleteRecursively(path);
|
| }
|
|
|
| @@ -240,14 +259,16 @@ static bool DeleteRecursively(PathBuffer* path) {
|
| return (unlink(path->AsString()) == 0);
|
| }
|
|
|
| - if (!path->Add(File::PathSeparator())) return false;
|
| + if (!path->Add(File::PathSeparator())) {
|
| + return false;
|
| + }
|
|
|
| // Not a link. Attempt to open as a directory and recurse into the
|
| // directory.
|
| DIR* dir_pointer;
|
| do {
|
| dir_pointer = opendir(path->AsString());
|
| - } while (dir_pointer == NULL && errno == EINTR);
|
| + } while ((dir_pointer == NULL) && (errno == EINTR));
|
| if (dir_pointer == NULL) {
|
| return false;
|
| }
|
| @@ -323,26 +344,26 @@ Directory::ExistsResult Directory::Exists(const char* dir_name) {
|
| return DOES_NOT_EXIST;
|
| }
|
| } else {
|
| - if (errno == EACCES ||
|
| - errno == EBADF ||
|
| - errno == EFAULT ||
|
| - errno == ENOMEM ||
|
| - errno == EOVERFLOW) {
|
| + if ((errno == EACCES) ||
|
| + (errno == EBADF) ||
|
| + (errno == EFAULT) ||
|
| + (errno == ENOMEM) ||
|
| + (errno == EOVERFLOW)) {
|
| // Search permissions denied for one of the directories in the
|
| // path or a low level error occured. We do not know if the
|
| // directory exists.
|
| return UNKNOWN;
|
| }
|
| - ASSERT(errno == ELOOP ||
|
| - errno == ENAMETOOLONG ||
|
| - errno == ENOENT ||
|
| - errno == ENOTDIR);
|
| + ASSERT((errno == ELOOP) ||
|
| + (errno == ENAMETOOLONG) ||
|
| + (errno == ENOENT) ||
|
| + (errno == ENOTDIR));
|
| return DOES_NOT_EXIST;
|
| }
|
| }
|
|
|
|
|
| -char* Directory::Current() {
|
| +char* Directory::CurrentNoScope() {
|
| // Android's getcwd adheres closely to the POSIX standard. It won't
|
| // allocate memory. We need to make our own copy.
|
|
|
| @@ -355,6 +376,13 @@ char* Directory::Current() {
|
| }
|
|
|
|
|
| +const char* Directory::Current() {
|
| + char* result = DartUtils::ScopedCString(PATH_MAX);
|
| + ASSERT(result != NULL);
|
| + return getcwd(result, PATH_MAX);
|
| +}
|
| +
|
| +
|
| bool Directory::SetCurrent(const char* path) {
|
| int result = NO_RETRY_EXPECTED(chdir(path));
|
| return result == 0;
|
| @@ -366,14 +394,14 @@ bool Directory::Create(const char* dir_name) {
|
| // process umask.
|
| int result = NO_RETRY_EXPECTED(mkdir(dir_name, 0777));
|
| // If the directory already exists, treat it as a success.
|
| - if (result == -1 && errno == EEXIST) {
|
| + if ((result == -1) && (errno == EEXIST)) {
|
| return (Exists(dir_name) == EXISTS);
|
| }
|
| return (result == 0);
|
| }
|
|
|
|
|
| -char* Directory::SystemTemp() {
|
| +const char* Directory::SystemTemp() {
|
| // Android does not have a /tmp directory. A partial substitute,
|
| // suitable for bring-up work and tests, is to create a tmp
|
| // directory in /data/local/tmp.
|
| @@ -386,17 +414,19 @@ char* Directory::SystemTemp() {
|
| if (stat(ANDROID_TEMP_DIR, &st) != 0) {
|
| mkdir(ANDROID_TEMP_DIR, 0777);
|
| }
|
| - return strdup(ANDROID_TEMP_DIR);
|
| + return ANDROID_TEMP_DIR;
|
| }
|
|
|
|
|
| -char* Directory::CreateTemp(const char* prefix) {
|
| +const char* Directory::CreateTemp(const char* prefix) {
|
| // Returns a new, unused directory name, adding characters to the end
|
| // of prefix. Creates the directory with the permissions specified
|
| // by the process umask.
|
| - // The return value must be freed by the caller.
|
| + // The return value is Dart_ScopeAllocated.
|
| PathBuffer path;
|
| - path.Add(prefix);
|
| + if (!path.Add(prefix)) {
|
| + return NULL;
|
| + }
|
| if (!path.Add("XXXXXX")) {
|
| // Pattern has overflowed.
|
| return NULL;
|
| @@ -404,18 +434,18 @@ char* Directory::CreateTemp(const char* prefix) {
|
| char* result;
|
| do {
|
| result = mkdtemp(path.AsString());
|
| - } while (result == NULL && errno == EINTR);
|
| + } while ((result == NULL) && (errno == EINTR));
|
| if (result == NULL) {
|
| return NULL;
|
| }
|
| - return strdup(result);
|
| + return path.AsScopedString();
|
| }
|
|
|
|
|
| bool Directory::Delete(const char* dir_name, bool recursive) {
|
| if (!recursive) {
|
| - if (File::GetType(dir_name, false) == File::kIsLink &&
|
| - File::GetType(dir_name, true) == File::kIsDirectory) {
|
| + if ((File::GetType(dir_name, false) == File::kIsLink) &&
|
| + (File::GetType(dir_name, true) == File::kIsDirectory)) {
|
| return (NO_RETRY_EXPECTED(unlink(dir_name)) == 0);
|
| }
|
| return (NO_RETRY_EXPECTED(rmdir(dir_name)) == 0);
|
| @@ -431,7 +461,9 @@ bool Directory::Delete(const char* dir_name, bool recursive) {
|
|
|
| bool Directory::Rename(const char* path, const char* new_path) {
|
| ExistsResult exists = Exists(path);
|
| - if (exists != EXISTS) return false;
|
| + if (exists != EXISTS) {
|
| + return false;
|
| + }
|
| return (NO_RETRY_EXPECTED(rename(path, new_path)) == 0);
|
| }
|
|
|
|
|