| Index: runtime/bin/file_fuchsia.cc
|
| diff --git a/runtime/bin/file_macos.cc b/runtime/bin/file_fuchsia.cc
|
| similarity index 75%
|
| copy from runtime/bin/file_macos.cc
|
| copy to runtime/bin/file_fuchsia.cc
|
| index a43b14eaada0245797ae855c2abde869b97e682c..fdc26238821b7d017e80de5cb75e070df6947362 100644
|
| --- a/runtime/bin/file_macos.cc
|
| +++ b/runtime/bin/file_fuchsia.cc
|
| @@ -1,25 +1,22 @@
|
| -// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
|
| +// Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
|
| // for details. All rights reserved. Use of this source code is governed by a
|
| // BSD-style license that can be found in the LICENSE file.
|
|
|
| #include "platform/globals.h"
|
| -#if defined(TARGET_OS_MACOS)
|
| +#if defined(TARGET_OS_FUCHSIA)
|
|
|
| #include "bin/file.h"
|
|
|
| -#include <copyfile.h> // NOLINT
|
| #include <errno.h> // NOLINT
|
| #include <fcntl.h> // NOLINT
|
| #include <libgen.h> // NOLINT
|
| -#include <limits.h> // NOLINT
|
| #include <sys/mman.h> // NOLINT
|
| #include <sys/stat.h> // NOLINT
|
| +#include <sys/types.h> // NOLINT
|
| #include <unistd.h> // NOLINT
|
|
|
| #include "bin/builtin.h"
|
| -#include "bin/fdutils.h"
|
| #include "bin/log.h"
|
| -
|
| #include "platform/signal_blocker.h"
|
| #include "platform/utils.h"
|
|
|
| @@ -52,17 +49,16 @@ void File::Close() {
|
| ASSERT(handle_->fd() >= 0);
|
| if (handle_->fd() == STDOUT_FILENO) {
|
| // If stdout, redirect fd to /dev/null.
|
| - intptr_t null_fd = TEMP_FAILURE_RETRY(open("/dev/null", O_WRONLY));
|
| + int null_fd = NO_RETRY_EXPECTED(open("/dev/null", O_WRONLY));
|
| ASSERT(null_fd >= 0);
|
| - VOID_TEMP_FAILURE_RETRY(dup2(null_fd, handle_->fd()));
|
| - VOID_TEMP_FAILURE_RETRY(close(null_fd));
|
| + VOID_NO_RETRY_EXPECTED(dup2(null_fd, handle_->fd()));
|
| + VOID_NO_RETRY_EXPECTED(close(null_fd));
|
| } else {
|
| - intptr_t err = TEMP_FAILURE_RETRY(close(handle_->fd()));
|
| + int err = NO_RETRY_EXPECTED(close(handle_->fd()));
|
| if (err != 0) {
|
| const int kBufferSize = 1024;
|
| - char error_message[kBufferSize];
|
| - Utils::StrError(errno, error_message, kBufferSize);
|
| - Log::PrintErr("%s\n", error_message);
|
| + char error_buf[kBufferSize];
|
| + Log::PrintErr("%s\n", Utils::StrError(errno, error_buf, kBufferSize));
|
| }
|
| }
|
| handle_->set_fd(kClosedFd);
|
| @@ -80,47 +76,38 @@ bool File::IsClosed() {
|
|
|
|
|
| void* File::MapExecutable(intptr_t* len) {
|
| - ASSERT(handle_->fd() >= 0);
|
| - intptr_t length = Length();
|
| - void* addr = mmap(0, length,
|
| - PROT_READ | PROT_EXEC, MAP_PRIVATE,
|
| - handle_->fd(), 0);
|
| - if (addr == MAP_FAILED) {
|
| - *len = -1;
|
| - } else {
|
| - *len = length;
|
| - }
|
| - return addr;
|
| + UNIMPLEMENTED();
|
| + return NULL;
|
| }
|
|
|
|
|
| int64_t File::Read(void* buffer, int64_t num_bytes) {
|
| ASSERT(handle_->fd() >= 0);
|
| - return TEMP_FAILURE_RETRY(read(handle_->fd(), buffer, num_bytes));
|
| + return NO_RETRY_EXPECTED(read(handle_->fd(), buffer, num_bytes));
|
| }
|
|
|
|
|
| int64_t File::Write(const void* buffer, int64_t num_bytes) {
|
| ASSERT(handle_->fd() >= 0);
|
| - return TEMP_FAILURE_RETRY(write(handle_->fd(), buffer, num_bytes));
|
| + return NO_RETRY_EXPECTED(write(handle_->fd(), buffer, num_bytes));
|
| }
|
|
|
|
|
| int64_t File::Position() {
|
| ASSERT(handle_->fd() >= 0);
|
| - return lseek(handle_->fd(), 0, SEEK_CUR);
|
| + return NO_RETRY_EXPECTED(lseek(handle_->fd(), 0, SEEK_CUR));
|
| }
|
|
|
|
|
| bool File::SetPosition(int64_t position) {
|
| ASSERT(handle_->fd() >= 0);
|
| - return lseek(handle_->fd(), position, SEEK_SET) >= 0;
|
| + return NO_RETRY_EXPECTED(lseek(handle_->fd(), position, SEEK_SET)) >= 0;
|
| }
|
|
|
|
|
| bool File::Truncate(int64_t length) {
|
| ASSERT(handle_->fd() >= 0);
|
| - return TEMP_FAILURE_RETRY(ftruncate(handle_->fd(), length)) != -1;
|
| + return NO_RETRY_EXPECTED(ftruncate(handle_->fd(), length) != -1);
|
| }
|
|
|
|
|
| @@ -157,7 +144,7 @@ bool File::Lock(File::LockType lock, int64_t start, int64_t end) {
|
| (lock == File::kLockBlockingExclusive)) {
|
| cmd = F_SETLKW;
|
| }
|
| - return TEMP_FAILURE_RETRY(fcntl(handle_->fd(), cmd, &fl)) != -1;
|
| + return NO_RETRY_EXPECTED(fcntl(handle_->fd(), cmd, &fl)) != -1;
|
| }
|
|
|
|
|
| @@ -181,8 +168,7 @@ File* File::ScopedOpen(const char* name, FileOpenMode mode) {
|
| // Report errors for non-regular files.
|
| struct stat st;
|
| if (NO_RETRY_EXPECTED(stat(name, &st)) == 0) {
|
| - // Only accept regular files, character devices, and pipes.
|
| - if (!S_ISREG(st.st_mode) && !S_ISCHR(st.st_mode) && !S_ISFIFO(st.st_mode)) {
|
| + if (!S_ISREG(st.st_mode)) {
|
| errno = (S_ISDIR(st.st_mode)) ? EISDIR : ENOENT;
|
| return NULL;
|
| }
|
| @@ -199,11 +185,11 @@ File* File::ScopedOpen(const char* name, FileOpenMode mode) {
|
| if ((mode & kTruncate) != 0) {
|
| flags = flags | O_TRUNC;
|
| }
|
| - int fd = TEMP_FAILURE_RETRY(open(name, flags, 0666));
|
| + flags |= O_CLOEXEC;
|
| + int fd = NO_RETRY_EXPECTED(open(name, flags, 0666));
|
| if (fd < 0) {
|
| return NULL;
|
| }
|
| - FDUtils::SetCloseOnExec(fd);
|
| if ((((mode & kWrite) != 0) && ((mode & kTruncate) == 0)) ||
|
| (((mode & kWriteOnly) != 0) && ((mode & kTruncate) == 0))) {
|
| int64_t position = lseek(fd, 0, SEEK_END);
|
| @@ -237,7 +223,7 @@ bool File::Exists(const char* name) {
|
|
|
|
|
| bool File::Create(const char* name) {
|
| - int fd = TEMP_FAILURE_RETRY(open(name, O_RDONLY | O_CREAT, 0666));
|
| + int fd = NO_RETRY_EXPECTED(open(name, O_RDONLY | O_CREAT | O_CLOEXEC, 0666));
|
| if (fd < 0) {
|
| return false;
|
| }
|
| @@ -246,8 +232,7 @@ bool File::Create(const char* name) {
|
|
|
|
|
| bool File::CreateLink(const char* name, const char* target) {
|
| - int status = NO_RETRY_EXPECTED(symlink(target, name));
|
| - return (status == 0);
|
| + return NO_RETRY_EXPECTED(symlink(target, name)) == 0;
|
| }
|
|
|
|
|
| @@ -301,14 +286,7 @@ bool File::RenameLink(const char* old_path, const char* new_path) {
|
|
|
|
|
| bool File::Copy(const char* old_path, const char* new_path) {
|
| - File::Type type = File::GetType(old_path, true);
|
| - if (type == kIsFile) {
|
| - return copyfile(old_path, new_path, NULL, COPYFILE_ALL) == 0;
|
| - } else if (type == kIsDirectory) {
|
| - errno = EISDIR;
|
| - } else {
|
| - errno = ENOENT;
|
| - }
|
| + UNIMPLEMENTED();
|
| return false;
|
| }
|
|
|
| @@ -322,12 +300,6 @@ int64_t File::LengthFromPath(const char* name) {
|
| }
|
|
|
|
|
| -static int64_t TimespecToMilliseconds(const struct timespec& t) {
|
| - return static_cast<int64_t>(t.tv_sec) * 1000L +
|
| - static_cast<int64_t>(t.tv_nsec) / 1000000L;
|
| -}
|
| -
|
| -
|
| void File::Stat(const char* name, int64_t* data) {
|
| struct stat st;
|
| if (NO_RETRY_EXPECTED(stat(name, &st)) == 0) {
|
| @@ -340,12 +312,9 @@ void File::Stat(const char* name, int64_t* data) {
|
| } else {
|
| data[kType] = kDoesNotExist;
|
| }
|
| - data[kCreatedTime] = st.st_ctime;
|
| - data[kModifiedTime] = st.st_mtime;
|
| - data[kAccessedTime] = st.st_atime;
|
| - data[kCreatedTime] = TimespecToMilliseconds(st.st_ctimespec);
|
| - data[kModifiedTime] = TimespecToMilliseconds(st.st_mtimespec);
|
| - data[kAccessedTime] = TimespecToMilliseconds(st.st_atimespec);
|
| + data[kCreatedTime] = static_cast<int64_t>(st.st_ctime) * 1000;
|
| + data[kModifiedTime] = static_cast<int64_t>(st.st_mtime) * 1000;
|
| + data[kAccessedTime] = static_cast<int64_t>(st.st_atime) * 1000;
|
| data[kMode] = st.st_mode;
|
| data[kSize] = st.st_size;
|
| } else {
|
| @@ -372,34 +341,26 @@ const char* File::LinkTarget(const char* pathname) {
|
| errno = ENOENT;
|
| return NULL;
|
| }
|
| - // Don't rely on the link_stats.st_size for the size of the link
|
| - // target. The link might have changed before the readlink call.
|
| - const int kBufferSize = 1024;
|
| - char target[kBufferSize];
|
| - size_t target_size = TEMP_FAILURE_RETRY(
|
| - readlink(pathname, target, kBufferSize));
|
| - if (target_size <= 0) {
|
| - return NULL;
|
| - }
|
| + size_t target_size = link_stats.st_size;
|
| char* target_name = DartUtils::ScopedCString(target_size + 1);
|
| ASSERT(target_name != NULL);
|
| - memmove(target_name, target, target_size);
|
| + size_t read_size = readlink(pathname, target_name, target_size + 1);
|
| + if (read_size != target_size) {
|
| + return NULL;
|
| + }
|
| target_name[target_size] = '\0';
|
| return target_name;
|
| }
|
|
|
|
|
| bool File::IsAbsolutePath(const char* pathname) {
|
| - return (pathname != NULL && pathname[0] == '/');
|
| + return ((pathname != NULL) && (pathname[0] == '/'));
|
| }
|
|
|
|
|
| const char* File::GetCanonicalPath(const char* pathname) {
|
| char* abs_path = NULL;
|
| if (pathname != NULL) {
|
| - // On some older MacOs versions the default behaviour of realpath allocating
|
| - // space for the resolved_path when a NULL is passed in does not seem to
|
| - // work, so we explicitly allocate space.
|
| char* resolved_path = DartUtils::ScopedCString(PATH_MAX + 1);
|
| ASSERT(resolved_path != NULL);
|
| do {
|
| @@ -488,4 +449,4 @@ File::Identical File::AreIdentical(const char* file_1, const char* file_2) {
|
| } // namespace bin
|
| } // namespace dart
|
|
|
| -#endif // defined(TARGET_OS_MACOS)
|
| +#endif // defined(TARGET_OS_FUCHSIA)
|
|
|