From 384497475a5e0002d2af6a80cd75ee6d3cd69644 Mon Sep 17 00:00:00 2001 From: Scott Graham Date: Fri, 19 Dec 2014 10:45:22 -0800 Subject: [PATCH] Add LoggingSeekFile As the whence values are "helpfully" available in windows.h as well ( http://msdn.microsoft.com/en-us/library/windows/desktop/dd757336(v=vs.85).aspx ) don't bother inventing a new enum. Add implementations for POSIX and Win32. R=mark@chromium.org BUG=crashpad:1 Review URL: https://codereview.chromium.org/812593005 --- util/file/file_io.h | 19 +++++++++++++++++++ util/file/file_io_posix.cc | 6 ++++++ util/file/file_io_win.cc | 28 ++++++++++++++++++++++++++++ 3 files changed, 53 insertions(+) diff --git a/util/file/file_io.h b/util/file/file_io.h index 5e00601a..2c59f598 100644 --- a/util/file/file_io.h +++ b/util/file/file_io.h @@ -30,10 +30,18 @@ class FilePath; namespace crashpad { #if defined(OS_POSIX) || DOXYGEN + //! \brief Platform-specific alias for a low-level file handle. using FileHandle = int; + +//! \brief Platform-specific alias for a position in an open file. +using FileOffset = off_t; + #elif defined(OS_WIN) + using FileHandle = HANDLE; +using FileOffset = LONGLONG; + #endif //! \brief Determines the mode that LoggingOpenFileForWrite() uses. @@ -166,6 +174,17 @@ FileHandle LoggingOpenFileForWrite(const base::FilePath& path, FileWriteMode write_mode, bool world_readable); +//! \brief Wraps `lseek()` or `SetFilePointerEx()`. Logs an error if the +//! operation fails. +//! +//! Repositions the offset of the open \a file to the specified \a offset, +//! relative to \a whence. \a whence must be one of `SEEK_SET`, `SEEK_CUR`, or +//! `SEEK_END`, and is interpreted in the usual way. +//! +//! \return The resulting offset in bytes from the beginning of the file, or +//! `-1` on failure. +FileOffset LoggingSeekFile(FileHandle file, FileOffset offset, int whence); + //! \brief Wraps `close()` or `CloseHandle()`, logging an error if the operation //! fails. //! diff --git a/util/file/file_io_posix.cc b/util/file/file_io_posix.cc index 8681ad8d..fbfdad08 100644 --- a/util/file/file_io_posix.cc +++ b/util/file/file_io_posix.cc @@ -98,6 +98,12 @@ FileHandle LoggingOpenFileForWrite(const base::FilePath& path, return fd; } +FileOffset LoggingSeekFile(FileHandle file, FileOffset offset, int whence) { + off_t rv = lseek(file, offset, whence); + PLOG_IF(ERROR, rv < 0) << "lseek"; + return rv; +} + bool LoggingCloseFile(FileHandle file) { int rv = IGNORE_EINTR(close(file)); PLOG_IF(ERROR, rv != 0) << "close"; diff --git a/util/file/file_io_win.cc b/util/file/file_io_win.cc index 7426737d..9106ab0b 100644 --- a/util/file/file_io_win.cc +++ b/util/file/file_io_win.cc @@ -103,6 +103,34 @@ FileHandle LoggingOpenFileForWrite(const base::FilePath& path, return file; } +FileOffset LoggingSeekFile(FileHandle file, FileOffset offset, int whence) { + DWORD method = 0; + switch (whence) { + case SEEK_SET: + method = FILE_BEGIN; + break; + case SEEK_CUR: + method = FILE_CURRENT; + break; + case SEEK_END: + method = FILE_END; + break; + default: + NOTREACHED(); + break; + } + + LARGE_INTEGER distance_to_move; + distance_to_move.QuadPart = offset; + LARGE_INTEGER new_offset; + BOOL result = SetFilePointerEx(file, distance_to_move, &new_offset, method); + if (!result) { + PLOG(ERROR) << "SetFilePointerEx"; + return -1; + } + return new_offset.QuadPart; +} + bool LoggingCloseFile(FileHandle file) { BOOL rv = CloseHandle(file); PLOG_IF(ERROR, !rv) << "CloseHandle";