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

Unified Diff: net/base/file_stream_context_posix.cc

Issue 12320003: Fix net::FileStream to handle POSIX errors correctly. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 10 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 side-by-side diff with in-line comments
Download patch
Index: net/base/file_stream_context_posix.cc
diff --git a/net/base/file_stream_context_posix.cc b/net/base/file_stream_context_posix.cc
index 0c16ef4160bee5a8a73991ee72574bf384cfe40d..1bc1640c4bd5faa3ca353d8998dfcaf1762c7c68 100644
--- a/net/base/file_stream_context_posix.cc
+++ b/net/base/file_stream_context_posix.cc
@@ -68,8 +68,11 @@ FileStream::Context::~Context() {
int64 FileStream::Context::GetFileSize() const {
struct stat info;
- if (fstat(file_, &info) != 0)
- return RecordAndMapError(errno, FILE_ERROR_SOURCE_GET_SIZE);
+ if (fstat(file_, &info) != 0) {
+ IOResult result = IOResult::FromOSError(errno);
+ RecordError(result, FILE_ERROR_SOURCE_GET_SIZE);
+ return result.result;
+ }
return static_cast<int64>(info.st_size);
}
@@ -96,9 +99,9 @@ int FileStream::Context::ReadAsync(IOBuffer* in_buf,
int FileStream::Context::ReadSync(char* in_buf, int buf_len) {
scoped_refptr<IOBuffer> buf = new WrappedIOBuffer(in_buf);
- int64 result = ReadFileImpl(buf, buf_len);
- CheckForIOError(&result, FILE_ERROR_SOURCE_READ);
- return result;
+ IOResult result = ReadFileImpl(buf, buf_len);
+ RecordError(result, FILE_ERROR_SOURCE_READ);
+ return result.result;
}
int FileStream::Context::WriteAsync(IOBuffer* in_buf,
@@ -123,54 +126,59 @@ int FileStream::Context::WriteAsync(IOBuffer* in_buf,
int FileStream::Context::WriteSync(const char* in_buf, int buf_len) {
scoped_refptr<IOBuffer> buf = new WrappedIOBuffer(in_buf);
- int64 result = WriteFileImpl(buf, buf_len);
- CheckForIOError(&result, FILE_ERROR_SOURCE_WRITE);
- return result;
+ IOResult result = WriteFileImpl(buf, buf_len);
+ RecordError(result, FILE_ERROR_SOURCE_WRITE);
+ return result.result;
}
int FileStream::Context::Truncate(int64 bytes) {
- int result = ftruncate(file_, bytes);
- if (result == 0)
- return bytes;
+ if (ftruncate(file_, bytes) != 0) {
+ IOResult result = IOResult::FromOSError(errno);
+ RecordError(result, FILE_ERROR_SOURCE_SET_EOF);
+ return result.result;
+ }
- return RecordAndMapError(errno, FILE_ERROR_SOURCE_SET_EOF);
+ return bytes;
}
-int64 FileStream::Context::SeekFileImpl(Whence whence, int64 offset) {
+FileStream::Context::IOResult FileStream::Context::SeekFileImpl(Whence whence,
+ int64 offset) {
off_t res = lseek(file_, static_cast<off_t>(offset),
static_cast<int>(whence));
if (res == static_cast<off_t>(-1))
- return errno;
+ return IOResult::FromOSError(errno);
- return res;
+ return IOResult(res, 0);
}
-int64 FileStream::Context::FlushFileImpl() {
+FileStream::Context::IOResult FileStream::Context::FlushFileImpl() {
ssize_t res = HANDLE_EINTR(fsync(file_));
if (res == -1)
- return errno;
+ return IOResult::FromOSError(errno);
- return res;
+ return IOResult(res, 0);
}
-int64 FileStream::Context::ReadFileImpl(scoped_refptr<IOBuffer> buf,
- int buf_len) {
+FileStream::Context::IOResult FileStream::Context::ReadFileImpl(
+ scoped_refptr<IOBuffer> buf,
+ int buf_len) {
// Loop in the case of getting interrupted by a signal.
ssize_t res = HANDLE_EINTR(read(file_, buf->data(),
static_cast<size_t>(buf_len)));
if (res == -1)
- return errno;
+ return IOResult::FromOSError(errno);
- return res;
+ return IOResult(res, 0);
}
-int64 FileStream::Context::WriteFileImpl(scoped_refptr<IOBuffer> buf,
- int buf_len) {
+FileStream::Context::IOResult FileStream::Context::WriteFileImpl(
+ scoped_refptr<IOBuffer> buf,
+ int buf_len) {
ssize_t res = HANDLE_EINTR(write(file_, buf->data(), buf_len));
if (res == -1)
- return errno;
+ return IOResult::FromOSError(errno);
- return res;
+ return IOResult(res, 0);
}
} // namespace net

Powered by Google App Engine
This is Rietveld 408576698