| Index: mojo/services/files/public/c/lib/file_fd_impl.cc
|
| diff --git a/mojo/services/files/public/c/lib/file_fd_impl.cc b/mojo/services/files/public/c/lib/file_fd_impl.cc
|
| deleted file mode 100644
|
| index 1feabddf8aca160827779bae07605c98a8ed5f30..0000000000000000000000000000000000000000
|
| --- a/mojo/services/files/public/c/lib/file_fd_impl.cc
|
| +++ /dev/null
|
| @@ -1,284 +0,0 @@
|
| -// Copyright 2015 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "files/public/c/lib/file_fd_impl.h"
|
| -
|
| -#include <errno.h>
|
| -#include <string.h>
|
| -
|
| -#include <limits>
|
| -
|
| -#include "files/public/c/lib/errno_impl.h"
|
| -#include "files/public/c/lib/template_util.h"
|
| -#include "files/public/c/lib/util.h"
|
| -#include "files/public/c/mojio_unistd.h"
|
| -#include "files/public/interfaces/types.mojom.h"
|
| -#include "mojo/public/cpp/bindings/interface_request.h"
|
| -#include "mojo/public/cpp/environment/logging.h"
|
| -
|
| -namespace mojio {
|
| -
|
| -FileFDImpl::FileFDImpl(ErrnoImpl* errno_impl, mojo::files::FilePtr file)
|
| - : FDImpl(errno_impl), file_(file.Pass()) {
|
| - MOJO_DCHECK(file_);
|
| -}
|
| -
|
| -FileFDImpl::~FileFDImpl() {
|
| -}
|
| -
|
| -bool FileFDImpl::Close() {
|
| - ErrnoImpl::Setter errno_setter(errno_impl());
|
| - MOJO_DCHECK(file_);
|
| -
|
| - mojo::files::Error error = mojo::files::Error::INTERNAL;
|
| - file_->Close(Capture(&error));
|
| - if (!file_.WaitForIncomingResponse())
|
| - return errno_setter.Set(ESTALE);
|
| - return errno_setter.Set(ErrorToErrno(error));
|
| -}
|
| -
|
| -std::unique_ptr<FDImpl> FileFDImpl::Dup() {
|
| - ErrnoImpl::Setter errno_setter(errno_impl());
|
| - MOJO_DCHECK(file_);
|
| -
|
| - mojo::files::FilePtr new_file;
|
| - mojo::files::Error error = mojo::files::Error::INTERNAL;
|
| - file_->Dup(mojo::GetProxy(&new_file), Capture(&error));
|
| - if (!file_.WaitForIncomingResponse()) {
|
| - errno_setter.Set(ESTALE);
|
| - return nullptr;
|
| - }
|
| - if (!errno_setter.Set(ErrorToErrno(error)))
|
| - return nullptr;
|
| - // C++11, why don't you have make_unique?
|
| - return std::unique_ptr<FDImpl>(new FileFDImpl(errno_impl(), new_file.Pass()));
|
| -}
|
| -
|
| -bool FileFDImpl::Ftruncate(mojio_off_t length) {
|
| - ErrnoImpl::Setter errno_setter(errno_impl());
|
| - MOJO_DCHECK(file_);
|
| -
|
| - if (length < 0)
|
| - return errno_setter.Set(EINVAL);
|
| -
|
| - mojo::files::Error error = mojo::files::Error::INTERNAL;
|
| - file_->Truncate(static_cast<int64_t>(length), Capture(&error));
|
| - if (!file_.WaitForIncomingResponse())
|
| - return errno_setter.Set(ESTALE);
|
| - return errno_setter.Set(ErrorToErrno(error));
|
| -}
|
| -
|
| -mojio_off_t FileFDImpl::Lseek(mojio_off_t offset, int whence) {
|
| - ErrnoImpl::Setter errno_setter(errno_impl());
|
| - MOJO_DCHECK(file_);
|
| -
|
| - mojo::files::Whence mojo_whence;
|
| - switch (whence) {
|
| - case MOJIO_SEEK_SET:
|
| - mojo_whence = mojo::files::Whence::FROM_START;
|
| - break;
|
| - case MOJIO_SEEK_CUR:
|
| - mojo_whence = mojo::files::Whence::FROM_CURRENT;
|
| - break;
|
| - case MOJIO_SEEK_END:
|
| - mojo_whence = mojo::files::Whence::FROM_END;
|
| - break;
|
| - default:
|
| - errno_setter.Set(EINVAL);
|
| - return -1;
|
| - }
|
| -
|
| - mojo::files::Error error = mojo::files::Error::INTERNAL;
|
| - int64_t position = -1;
|
| - file_->Seek(static_cast<int64_t>(offset), mojo_whence,
|
| - Capture(&error, &position));
|
| - if (!file_.WaitForIncomingResponse()) {
|
| - errno_setter.Set(ESTALE);
|
| - return -1;
|
| - }
|
| - if (!errno_setter.Set(ErrorToErrno(error)))
|
| - return -1;
|
| -
|
| - if (position < 0) {
|
| - // Service misbehaved.
|
| - MOJO_LOG(ERROR) << "Write() wrote more than requested";
|
| - // TODO(vtl): Is there a better error code for this?
|
| - errno_setter.Set(EIO);
|
| - return -1;
|
| - }
|
| -
|
| - // TODO(vtl): The comparison should actually be against MOJIO_SSIZE_MAX.
|
| - if (position >
|
| - static_cast<int64_t>(std::numeric_limits<mojio_off_t>::max())) {
|
| - errno_setter.Set(EOVERFLOW); // Wow, this is defined by POSIX.
|
| - return -1;
|
| - }
|
| -
|
| - return static_cast<mojio_off_t>(position);
|
| -}
|
| -
|
| -mojio_ssize_t FileFDImpl::Read(void* buf, size_t count) {
|
| - ErrnoImpl::Setter errno_setter(errno_impl());
|
| - MOJO_DCHECK(file_);
|
| -
|
| - // TODO(vtl): The comparison should actually be against MOJIO_SSIZE_MAX.
|
| - if (count > static_cast<size_t>(std::numeric_limits<mojio_ssize_t>::max()) ||
|
| - count > std::numeric_limits<uint32_t>::max()) {
|
| - // POSIX leaves the behavior undefined in this case. We'll return EINVAL.
|
| - // (EDOM also seems plausible, but its description implies that it's for
|
| - // mathematical functions. ERANGE is for return values.)
|
| - errno_setter.Set(EINVAL);
|
| - return -1;
|
| - }
|
| -
|
| - if (!buf && count > 0) {
|
| - errno_setter.Set(EFAULT);
|
| - return -1;
|
| - }
|
| -
|
| - mojo::files::Error error = mojo::files::Error::INTERNAL;
|
| - mojo::Array<uint8_t> bytes_read;
|
| - file_->Read(static_cast<uint32_t>(count), 0,
|
| - mojo::files::Whence::FROM_CURRENT,
|
| - Capture(&error, &bytes_read));
|
| - if (!file_.WaitForIncomingResponse()) {
|
| - errno_setter.Set(ESTALE);
|
| - return -1;
|
| - }
|
| - if (!errno_setter.Set(ErrorToErrno(error)))
|
| - return -1;
|
| - if (bytes_read.size() > count) {
|
| - // Service misbehaved.
|
| - MOJO_LOG(ERROR) << "Read() read more than requested";
|
| - // TODO(vtl): Is there a better error code for this?
|
| - errno_setter.Set(EIO);
|
| - return -1;
|
| - }
|
| -
|
| - if (bytes_read.size() > 0)
|
| - memcpy(buf, &bytes_read[0], bytes_read.size());
|
| - return static_cast<mojio_ssize_t>(bytes_read.size());
|
| -}
|
| -
|
| -mojio_ssize_t FileFDImpl::Write(const void* buf, size_t count) {
|
| - ErrnoImpl::Setter errno_setter(errno_impl());
|
| - MOJO_DCHECK(file_);
|
| -
|
| - // TODO(vtl): The comparison should actually be against MOJIO_SSIZE_MAX.
|
| - if (count > static_cast<size_t>(std::numeric_limits<mojio_ssize_t>::max()) ||
|
| - count > std::numeric_limits<uint32_t>::max()) {
|
| - // POSIX leaves the behavior undefined in this case. We'll return EINVAL.
|
| - // (EDOM also seems plausible, but its description implies that it's for
|
| - // mathematical functions. ERANGE is for return values.)
|
| - errno_setter.Set(EINVAL);
|
| - return -1;
|
| - }
|
| -
|
| - if (!buf && count > 0) {
|
| - errno_setter.Set(EFAULT);
|
| - return -1;
|
| - }
|
| -
|
| - // TODO(vtl): Is there a more natural (or efficient) way to do this?
|
| - mojo::Array<uint8_t> bytes_to_write(count);
|
| - if (count > 0)
|
| - memcpy(&bytes_to_write[0], buf, count);
|
| -
|
| - mojo::files::Error error = mojo::files::Error::INTERNAL;
|
| - uint32_t num_bytes_written = 0;
|
| - file_->Write(bytes_to_write.Pass(), 0, mojo::files::Whence::FROM_CURRENT,
|
| - Capture(&error, &num_bytes_written));
|
| - if (!file_.WaitForIncomingResponse()) {
|
| - errno_setter.Set(ESTALE);
|
| - return -1;
|
| - }
|
| - if (!errno_setter.Set(ErrorToErrno(error)))
|
| - return -1;
|
| -
|
| - if (num_bytes_written > count) {
|
| - // Service misbehaved.
|
| - MOJO_LOG(ERROR) << "Write() wrote than requested";
|
| - // TODO(vtl): Is there a better error code for this?
|
| - errno_setter.Set(EIO);
|
| - return -1;
|
| - }
|
| -
|
| - return static_cast<mojio_ssize_t>(num_bytes_written);
|
| -}
|
| -
|
| -bool FileFDImpl::Fstat(struct mojio_stat* buf) {
|
| - ErrnoImpl::Setter errno_setter(errno_impl());
|
| - MOJO_DCHECK(file_);
|
| -
|
| - if (!buf) {
|
| - errno_setter.Set(EFAULT);
|
| - return false;
|
| - }
|
| -
|
| - mojo::files::FileInformationPtr file_info;
|
| - mojo::files::Error error = mojo::files::Error::INTERNAL;
|
| - file_->Stat(Capture(&error, &file_info));
|
| - if (!file_.WaitForIncomingResponse()) {
|
| - errno_setter.Set(ESTALE);
|
| - return false;
|
| - }
|
| - if (!errno_setter.Set(ErrorToErrno(error)))
|
| - return false;
|
| -
|
| - if (!file_info) {
|
| - // Service misbehaved.
|
| - MOJO_LOG(ERROR) << "Stat() didn't provide FileInformation";
|
| - // TODO(vtl): Is there a better error code for this?
|
| - errno_setter.Set(EIO);
|
| - return false;
|
| - }
|
| -
|
| - // Zero everything first.
|
| - memset(buf, 0, sizeof(*buf));
|
| - // Leave |st_dev| zero.
|
| - // Leave |st_ino| zero.
|
| - buf->st_mode = MOJIO_S_IRWXU;
|
| - switch (file_info->type) {
|
| - case mojo::files::FileType::UNKNOWN:
|
| - break;
|
| - case mojo::files::FileType::REGULAR_FILE:
|
| - buf->st_mode |= MOJIO_S_IFREG;
|
| - break;
|
| - case mojo::files::FileType::DIRECTORY:
|
| - buf->st_mode |= MOJIO_S_IFDIR;
|
| - break;
|
| - default:
|
| - MOJO_LOG(WARNING) << "Unknown FileType: " << file_info->type;
|
| - break;
|
| - }
|
| - // The most likely value (it'll be wrong if |file_| has been deleted).
|
| - // TODO(vtl): Ponder this. Maybe |FileInformation| should have nlink?
|
| - buf->st_nlink = 1;
|
| - // Leave |st_uid| zero.
|
| - // Leave |st_gid| zero.
|
| - // Leave |st_rdev| zero.
|
| - // TODO(vtl): Should we validate size?
|
| - buf->st_size = static_cast<mojio_off_t>(file_info->size);
|
| - if (file_info->atime) {
|
| - buf->st_atim.tv_sec = static_cast<mojio_time_t>(file_info->atime->seconds);
|
| - buf->st_atim.tv_nsec = static_cast<long>(file_info->atime->nanoseconds);
|
| - } // Else leave |st_atim| zero.
|
| - if (file_info->mtime) {
|
| - buf->st_mtim.tv_sec = static_cast<mojio_time_t>(file_info->mtime->seconds);
|
| - buf->st_mtim.tv_nsec = static_cast<long>(file_info->mtime->nanoseconds);
|
| - } // Else leave |st_mtim| zero.
|
| - // Don't have |ctime|, so just use the |mtime| value instead.
|
| - buf->st_ctim = buf->st_mtim;
|
| - // TODO(vtl): Maybe |FileInformation| should have ctime?
|
| - buf->st_blksize = 1024; // Made-up value.
|
| - // Make up a value based on size. (Note: Despite the above "block size", this
|
| - // block count is for 512-byte blocks!)
|
| - if (file_info->size > 0)
|
| - buf->st_blocks = (static_cast<mojio_blkcnt_t>(file_info->size) + 511) / 512;
|
| - // Else leave |st_blocks| zero.
|
| -
|
| - return true;
|
| -}
|
| -
|
| -} // namespace mojio
|
|
|