Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(358)

Side by Side Diff: native_client_sdk/src/libraries/nacl_io/fusefs/fuse_fs.cc

Issue 549353003: [NaCl SDK] nacl_io: Fix FuseFs.{read,write} (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | native_client_sdk/src/tests/nacl_io_test/fuse_fs_test.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "nacl_io/fusefs/fuse_fs.h" 5 #include "nacl_io/fusefs/fuse_fs.h"
6 6
7 #include <errno.h> 7 #include <errno.h>
8 #include <fcntl.h> 8 #include <fcntl.h>
9 #include <string.h> 9 #include <string.h>
10 10
(...skipping 323 matching lines...) Expand 10 before | Expand all | Expand 10 after
334 LOG_ERROR("fuse_ops_->read is NULL."); 334 LOG_ERROR("fuse_ops_->read is NULL.");
335 return ENOSYS; 335 return ENOSYS;
336 } 336 }
337 337
338 char* cbuf = static_cast<char*>(buf); 338 char* cbuf = static_cast<char*>(buf);
339 339
340 int result = fuse_ops_->read(path_.c_str(), cbuf, count, attr.offs, &info_); 340 int result = fuse_ops_->read(path_.c_str(), cbuf, count, attr.offs, &info_);
341 if (result < 0) 341 if (result < 0)
342 return -result; 342 return -result;
343 343
344 // Fuse docs say that a read() call will always completely fill the buffer
345 // (padding with zeroes) unless the direct_io filesystem flag is set.
346 // TODO(binji): support the direct_io flag 344 // TODO(binji): support the direct_io flag
347 if (static_cast<size_t>(result) < count) 345 if (static_cast<size_t>(result) < count)
348 memset(&cbuf[result], 0, count - result); 346 memset(&cbuf[result], 0, count - result);
349 347
350 *out_bytes = count; 348 *out_bytes = result;
351 return 0; 349 return 0;
352 } 350 }
353 351
354 Error FileFuseFsNode::Write(const HandleAttr& attr, 352 Error FileFuseFsNode::Write(const HandleAttr& attr,
355 const void* buf, 353 const void* buf,
356 size_t count, 354 size_t count,
357 int* out_bytes) { 355 int* out_bytes) {
358 if (!fuse_ops_->write) { 356 if (!fuse_ops_->write) {
359 LOG_ERROR("fuse_ops_->write is NULL."); 357 LOG_ERROR("fuse_ops_->write is NULL.");
360 return ENOSYS; 358 return ENOSYS;
361 } 359 }
362 360
363 int result = fuse_ops_->write( 361 int result = fuse_ops_->write(
364 path_.c_str(), static_cast<const char*>(buf), count, attr.offs, &info_); 362 path_.c_str(), static_cast<const char*>(buf), count, attr.offs, &info_);
365 if (result < 0) 363 if (result < 0)
366 return -result; 364 return -result;
367 365
368 // Fuse docs say that a write() call will always write the entire buffer
369 // unless the direct_io filesystem flag is set.
370 // TODO(binji): What should we do if the user breaks this contract? Warn?
371 // TODO(binji): support the direct_io flag 366 // TODO(binji): support the direct_io flag
372 *out_bytes = result; 367 *out_bytes = result;
373 return 0; 368 return 0;
374 } 369 }
375 370
376 DirFuseFsNode::DirFuseFsNode(Filesystem* filesystem, 371 DirFuseFsNode::DirFuseFsNode(Filesystem* filesystem,
377 struct fuse_operations* fuse_ops, 372 struct fuse_operations* fuse_ops,
378 struct fuse_file_info& info, 373 struct fuse_file_info& info,
379 const std::string& path) 374 const std::string& path)
380 : FuseFsNode(filesystem, fuse_ops, info, path) { 375 : FuseFsNode(filesystem, fuse_ops, info, path) {
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after
477 } else { 472 } else {
478 fill_info->getdents->AddDirent(ino, name, strlen(name)); 473 fill_info->getdents->AddDirent(ino, name, strlen(name));
479 fill_info->num_bytes -= sizeof(dirent); 474 fill_info->num_bytes -= sizeof(dirent);
480 // According to the docs, we can never return 1 (buffer full) when the 475 // According to the docs, we can never return 1 (buffer full) when the
481 // offset is zero (the user is probably ignoring the result anyway). 476 // offset is zero (the user is probably ignoring the result anyway).
482 return 0; 477 return 0;
483 } 478 }
484 } 479 }
485 480
486 } // namespace nacl_io 481 } // namespace nacl_io
OLDNEW
« no previous file with comments | « no previous file | native_client_sdk/src/tests/nacl_io_test/fuse_fs_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698