Index: third_party/crashpad/crashpad/util/file/file_io.h |
diff --git a/third_party/crashpad/crashpad/util/file/file_io.h b/third_party/crashpad/crashpad/util/file/file_io.h |
index ff20488da1d02fb120c33c096445cb37fff8d08f..87c40702a8bade21b8f92123a431b2e2271d30a7 100644 |
--- a/third_party/crashpad/crashpad/util/file/file_io.h |
+++ b/third_party/crashpad/crashpad/util/file/file_io.h |
@@ -26,27 +26,6 @@ |
#include "util/win/scoped_handle.h" |
#endif |
-//! \file |
- |
-#if defined(OS_POSIX) || DOXYGEN |
- |
-//! \brief A `PLOG()` macro usable for standard input/output error conditions. |
-//! |
-//! The `PLOG()` macro uses `errno` on POSIX and is appropriate to report |
-//! errors from standard input/output functions. On Windows, `PLOG()` uses |
-//! `GetLastError()`, and cannot be used to report errors from standard |
-//! input/output functions. This macro uses `PLOG()` when appropriate for |
-//! standard I/O functions, and `LOG()` otherwise. |
-#define STDIO_PLOG(x) PLOG(x) |
- |
-#else |
- |
-#define STDIO_PLOG(x) LOG(x) |
-#define fseeko(file, offset, whence) _fseeki64(file, offset, whence) |
-#define ftello(file) _ftelli64(file) |
- |
-#endif |
- |
namespace base { |
class FilePath; |
} // namespace base |
@@ -114,82 +93,205 @@ enum class FileLocking : bool { |
kExclusive, |
}; |
-//! \brief Reads from a file, retrying when interrupted on POSIX or following a |
-//! short read. |
+//! \brief Determines the FileHandle that StdioFileHandle() returns. |
+enum class StdioStream { |
+ //! \brief Standard input, or `stdin`. |
+ kStandardInput, |
+ |
+ //! \brief Standard output, or `stdout`. |
+ kStandardOutput, |
+ |
+ //! \brief Standard error, or `stderr`. |
+ kStandardError, |
+}; |
+ |
+namespace internal { |
+ |
+//! \brief The name of the native read function used by ReadFile(). |
+//! |
+//! This value may be useful for logging. |
+//! |
+//! \sa kNativeWriteFunctionName |
+extern const char kNativeReadFunctionName[]; |
+ |
+//! \brief The name of the native write function used by WriteFile(). |
+//! |
+//! This value may be useful for logging. |
//! |
-//! This function reads into \a buffer, stopping only when \a size bytes have |
-//! been read or when end-of-file has been reached. On Windows, reading from |
-//! sockets is not currently supported. |
+//! \sa kNativeReadFunctionName |
+extern const char kNativeWriteFunctionName[]; |
+ |
+//! \brief The internal implementation of ReadFileExactly() and its wrappers. |
+//! |
+//! The logic is exposed so that it may be reused by FileReaderInterface, and |
+//! so that it may be tested without requiring large files to be read. It is not |
+//! intended to be used more generally. Use ReadFileExactly(), |
+//! LoggingReadFileExactly(), CheckedReadFileExactly(), or |
+//! FileReaderInterface::ReadExactly() instead. |
+class ReadExactlyInternal { |
+ public: |
+ //! \brief Calls Read(), retrying following a short read, ensuring that |
+ //! exactly \a size bytes are read. |
+ //! |
+ //! \return `true` on success. `false` if the underlying Read() fails or if |
+ //! fewer than \a size bytes were read. When returning `false`, if \a |
+ //! can_log is `true`, logs a message. |
+ bool ReadExactly(void* buffer, size_t size, bool can_log); |
+ |
+ protected: |
+ ReadExactlyInternal() {} |
+ ~ReadExactlyInternal() {} |
+ |
+ private: |
+ //! \brief Wraps a read operation, such as ReadFile(). |
+ //! |
+ //! \return The number of bytes read and placed into \a buffer, or `-1` on |
+ //! error. When returning `-1`, if \a can_log is `true`, logs a message. |
+ virtual FileOperationResult Read(void* buffer, size_t size, bool can_log) = 0; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(ReadExactlyInternal); |
+}; |
+ |
+//! \brief The internal implementation of WriteFile() and its wrappers. |
+//! |
+//! The logic is exposed so that it may be tested without requiring large files |
+//! to be written. It is not intended to be used more generally. Use |
+//! WriteFile(), LoggingWriteFile(), CheckedWriteFile(), or |
+//! FileWriterInterface::Write() instead. |
+class WriteAllInternal { |
+ public: |
+ //! \brief Calls Write(), retrying following a short write, ensuring that |
+ //! exactly \a size bytes are written. |
+ //! |
+ //! \return `true` on success. `false` if the underlying Write() fails or if |
+ //! fewer than \a size bytes were written. |
+ bool WriteAll(const void* buffer, size_t size); |
+ |
+ protected: |
+ WriteAllInternal() {} |
+ ~WriteAllInternal() {} |
+ |
+ private: |
+ //! \brief Wraps a write operation, such as NativeWriteFile(). |
+ //! |
+ //! \return The number of bytes written from \a buffer, or `-1` on error. |
+ virtual FileOperationResult Write(const void* buffer, size_t size) = 0; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(WriteAllInternal); |
+}; |
+ |
+//! \brief Writes to a file, retrying when interrupted on POSIX. |
+//! |
+//! Fewer than \a size bytes may be written to \a file. This can happen if the |
+//! underlying write operation returns before writing the entire buffer, or if |
+//! the buffer is too large to write in a single operation, possibly due to a |
+//! limitation of a data type used to express the number of bytes written. |
+//! |
+//! This function adapts native write operations for uniform use by WriteFile(). |
+//! This function should only be called by WriteFile(). Other code should call |
+//! WriteFile() or another function that wraps WriteFile(). |
+//! |
+//! \param[in] file The file to write to. |
+//! \param[in] buffer A buffer containing data to be written. |
+//! \param[in] size The number of bytes from \a buffer to write. |
+//! |
+//! \return The number of bytes actually written from \a buffer to \a file on |
+//! success. `-1` on error, with `errno` or `GetLastError()` set |
+//! appropriately. |
+FileOperationResult NativeWriteFile(FileHandle file, |
+ const void* buffer, |
+ size_t size); |
+ |
+} // namespace internal |
+ |
+//! \brief Reads from a file, retrying when interrupted before reading any data |
+//! on POSIX. |
+//! |
+//! This function reads into \a buffer. Fewer than \a size bytes may be read. |
+//! On Windows, reading from sockets is not currently supported. |
//! |
//! \return The number of bytes read and placed into \a buffer, or `-1` on |
//! error, with `errno` or `GetLastError()` set appropriately. On error, a |
//! portion of \a file may have been read into \a buffer. |
//! |
//! \sa WriteFile |
-//! \sa LoggingReadFile |
-//! \sa CheckedReadFile |
+//! \sa ReadFileExactly |
+//! \sa LoggingReadFileExactly |
+//! \sa CheckedReadFileExactly |
//! \sa CheckedReadFileAtEOF |
FileOperationResult ReadFile(FileHandle file, void* buffer, size_t size); |
-//! \brief Writes to a file, retrying when interrupted or following a short |
-//! write on POSIX. |
+//! \brief Writes to a file, retrying when interrupted on POSIX or following a |
+//! short write. |
//! |
//! This function writes to \a file, stopping only when \a size bytes have been |
//! written. |
//! |
-//! \return The number of bytes written from \a buffer, or `-1` on error, with |
-//! `errno` or `GetLastError()` set appropriately. On error, a portion of |
-//! \a buffer may have been written to \a file. |
+//! \return `true` on success. `false` on error, with `errno` or |
+//! `GetLastError()` set appropriately. On error, a portion of \a buffer may |
+//! have been written to \a file. |
//! |
//! \sa ReadFile |
//! \sa LoggingWriteFile |
//! \sa CheckedWriteFile |
-FileOperationResult WriteFile(FileHandle file, const void* buffer, size_t size); |
+bool WriteFile(FileHandle file, const void* buffer, size_t size); |
-//! \brief Wraps ReadFile(), ensuring that exactly \a size bytes are read. |
+//! \brief Wraps ReadFile(), retrying following a short read, ensuring that |
+//! exactly \a size bytes are read. |
//! |
-//! \return `true` on success. If \a size is out of the range of possible |
-//! ReadFile() return values, if the underlying ReadFile() fails, or if |
-//! other than \a size bytes were read, this function logs a message and |
+//! \return `true` on success. If the underlying ReadFile() fails, or if fewer |
+//! than \a size bytes were read, this function logs a message and |
//! returns `false`. |
//! |
//! \sa LoggingWriteFile |
//! \sa ReadFile |
-//! \sa CheckedReadFile |
+//! \sa LoggingReadFileExactly |
+//! \sa CheckedReadFileExactly |
//! \sa CheckedReadFileAtEOF |
-bool LoggingReadFile(FileHandle file, void* buffer, size_t size); |
+bool ReadFileExactly(FileHandle file, void* buffer, size_t size); |
+ |
+//! \brief Wraps ReadFile(), retrying following a short read, ensuring that |
+//! exactly \a size bytes are read. |
+//! |
+//! \return `true` on success. If the underlying ReadFile() fails, or if fewer |
+//! than \a size bytes were read, this function logs a message and |
+//! returns `false`. |
+//! |
+//! \sa LoggingWriteFile |
+//! \sa ReadFile |
+//! \sa ReadFileExactly |
+//! \sa CheckedReadFileExactly |
+//! \sa CheckedReadFileAtEOF |
+bool LoggingReadFileExactly(FileHandle file, void* buffer, size_t size); |
//! \brief Wraps WriteFile(), ensuring that exactly \a size bytes are written. |
//! |
-//! \return `true` on success. If \a size is out of the range of possible |
-//! WriteFile() return values, if the underlying WriteFile() fails, or if |
-//! other than \a size bytes were written, this function logs a message and |
+//! \return `true` on success. If the underlying WriteFile() fails, or if fewer |
+//! than \a size bytes were written, this function logs a message and |
//! returns `false`. |
//! |
-//! \sa LoggingReadFile |
+//! \sa LoggingReadFileExactly |
//! \sa WriteFile |
//! \sa CheckedWriteFile |
bool LoggingWriteFile(FileHandle file, const void* buffer, size_t size); |
//! \brief Wraps ReadFile(), ensuring that exactly \a size bytes are read. |
//! |
-//! If \a size is out of the range of possible ReadFile() return values, if the |
-//! underlying ReadFile() fails, or if other than \a size bytes were read, this |
-//! function causes execution to terminate without returning. |
+//! If the underlying ReadFile() fails, or if fewer than \a size bytes were |
+//! read, this function causes execution to terminate without returning. |
//! |
//! \sa CheckedWriteFile |
//! \sa ReadFile |
-//! \sa LoggingReadFile |
+//! \sa LoggingReadFileExactly |
//! \sa CheckedReadFileAtEOF |
-void CheckedReadFile(FileHandle file, void* buffer, size_t size); |
+void CheckedReadFileExactly(FileHandle file, void* buffer, size_t size); |
//! \brief Wraps WriteFile(), ensuring that exactly \a size bytes are written. |
//! |
-//! If \a size is out of the range of possible WriteFile() return values, if the |
-//! underlying WriteFile() fails, or if other than \a size bytes were written, |
-//! this function causes execution to terminate without returning. |
+//! if the underlying WriteFile() fails, or if fewer than \a size bytes were |
+//! written, this function causes execution to terminate without returning. |
//! |
-//! \sa CheckedReadFile |
+//! \sa CheckedReadFileExactly |
//! \sa WriteFile |
//! \sa LoggingWriteFile |
void CheckedWriteFile(FileHandle file, const void* buffer, size_t size); |
@@ -200,7 +302,7 @@ void CheckedWriteFile(FileHandle file, const void* buffer, size_t size); |
//! If the underlying ReadFile() fails, or if a byte actually is read, this |
//! function causes execution to terminate without returning. |
//! |
-//! \sa CheckedReadFile |
+//! \sa CheckedReadFileExactly |
//! \sa ReadFile |
void CheckedReadFileAtEOF(FileHandle file); |
@@ -345,12 +447,27 @@ void CheckedCloseFile(FileHandle file); |
//! \brief Determines the size of a file. |
//! |
//! \param[in] file The handle to the file for which the size should be |
-//! retrived. |
+//! retrieved. |
//! |
//! \return The size of the file. If an error occurs when attempting to |
//! determine its size, returns `-1` with an error logged. |
FileOffset LoggingFileSizeByHandle(FileHandle file); |
+//! \brief Returns a FileHandle corresponding to the requested standard I/O |
+//! stream. |
+//! |
+//! The returned FileHandle should not be closed on POSIX, where it is |
+//! important to maintain valid file descriptors occupying the slots reserved |
+//! for these streams. If a need to close such a stream arises on POSIX, |
+//! `dup2()` should instead be used to replace the existing file descriptor with |
+//! one opened to `/dev/null`. See CloseStdinAndStdout(). |
+//! |
+//! \param[in] stdio_stream The requested standard I/O stream. |
+//! |
+//! \return A corresponding FileHandle on success. kInvalidFileHandle on error, |
+//! with a message logged. |
+FileHandle StdioFileHandle(StdioStream stdio_stream); |
+ |
} // namespace crashpad |
#endif // CRASHPAD_UTIL_FILE_FILE_IO_H_ |