| Index: native_client_sdk/src/libraries/nacl_io/kernel_handle.cc
|
| diff --git a/native_client_sdk/src/libraries/nacl_io/kernel_handle.cc b/native_client_sdk/src/libraries/nacl_io/kernel_handle.cc
|
| index dcf42fb8c6efa5a23692d7de4265f252cfaad5c3..a943894595e1904e393ffe0e4162480c459272bb 100644
|
| --- a/native_client_sdk/src/libraries/nacl_io/kernel_handle.cc
|
| +++ b/native_client_sdk/src/libraries/nacl_io/kernel_handle.cc
|
| @@ -17,40 +17,57 @@
|
| #include "nacl_io/mount_node.h"
|
|
|
| // It is only legal to construct a handle while the kernel lock is held.
|
| -KernelHandle::KernelHandle(Mount* mnt, MountNode* node, int mode)
|
| - : mount_(mnt),
|
| - node_(node),
|
| - mode_(mode),
|
| - offs_(0) {
|
| - if (mode & O_APPEND) offs_ = node->GetSize();
|
| +KernelHandle::KernelHandle(Mount* mnt, MountNode* node)
|
| + : mount_(mnt), node_(node), offs_(0) {}
|
| +
|
| +Error KernelHandle::Init(int open_mode) {
|
| + if (open_mode & O_APPEND) {
|
| + size_t node_size;
|
| + Error error = node_->GetSize(&offs_);
|
| + if (error)
|
| + return error;
|
| + }
|
| +
|
| + return 0;
|
| }
|
|
|
| -off_t KernelHandle::Seek(off_t offset, int whence) {
|
| +Error KernelHandle::Seek(off_t offset, int whence, off_t* out_offset) {
|
| + // By default, don't move the offset.
|
| + *out_offset = offset;
|
| +
|
| size_t base;
|
| - size_t node_size = node_->GetSize();
|
| + size_t node_size;
|
| + Error error = node_->GetSize(&node_size);
|
| + if (error)
|
| + return error;
|
|
|
| switch (whence) {
|
| - default: return -1;
|
| - case SEEK_SET: base = 0; break;
|
| - case SEEK_CUR: base = offs_; break;
|
| - case SEEK_END: base = node_size; break;
|
| + default:
|
| + return -1;
|
| + case SEEK_SET:
|
| + base = 0;
|
| + break;
|
| + case SEEK_CUR:
|
| + base = offs_;
|
| + break;
|
| + case SEEK_END:
|
| + base = node_size;
|
| + break;
|
| }
|
|
|
| - if (base + offset < 0) {
|
| - errno = EINVAL;
|
| - return -1;
|
| - }
|
| + if (base + offset < 0)
|
| + return EINVAL;
|
|
|
| - offs_ = base + offset;
|
| + off_t new_offset = base + offset;
|
|
|
| // Seeking past the end of the file will zero out the space between the old
|
| // end and the new end.
|
| - if (offs_ > node_size) {
|
| - if (node_->FTruncate(offs_) < 0) {
|
| - errno = EINVAL;
|
| - return -1;
|
| - }
|
| + if (new_offset > node_size) {
|
| + error = node_->FTruncate(new_offset);
|
| + if (error)
|
| + return EINVAL;
|
| }
|
|
|
| - return offs_;
|
| + *out_offset = offs_ = new_offset;
|
| + return 0;
|
| }
|
|
|