OLD | NEW |
1 // Copyright 2014 The Crashpad Authors. All rights reserved. | 1 // Copyright 2014 The Crashpad Authors. All rights reserved. |
2 // | 2 // |
3 // Licensed under the Apache License, Version 2.0 (the "License"); | 3 // Licensed under the Apache License, Version 2.0 (the "License"); |
4 // you may not use this file except in compliance with the License. | 4 // you may not use this file except in compliance with the License. |
5 // You may obtain a copy of the License at | 5 // You may obtain a copy of the License at |
6 // | 6 // |
7 // http://www.apache.org/licenses/LICENSE-2.0 | 7 // http://www.apache.org/licenses/LICENSE-2.0 |
8 // | 8 // |
9 // Unless required by applicable law or agreed to in writing, software | 9 // Unless required by applicable law or agreed to in writing, software |
10 // distributed under the License is distributed on an "AS IS" BASIS, | 10 // distributed under the License is distributed on an "AS IS" BASIS, |
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
12 // See the License for the specific language governing permissions and | 12 // See the License for the specific language governing permissions and |
13 // limitations under the License. | 13 // limitations under the License. |
14 | 14 |
15 #ifndef CRASHPAD_UTIL_FILE_FILE_IO_H_ | 15 #ifndef CRASHPAD_UTIL_FILE_FILE_IO_H_ |
16 #define CRASHPAD_UTIL_FILE_FILE_IO_H_ | 16 #define CRASHPAD_UTIL_FILE_FILE_IO_H_ |
17 | 17 |
18 #include <sys/types.h> | 18 #include <sys/types.h> |
19 | 19 |
20 #include "build/build_config.h" | 20 #include "build/build_config.h" |
21 | 21 |
22 #if defined(OS_POSIX) | 22 #if defined(OS_POSIX) |
23 #include "base/files/scoped_file.h" | 23 #include "base/files/scoped_file.h" |
24 #elif defined(OS_WIN) | 24 #elif defined(OS_WIN) |
25 #include <windows.h> | 25 #include <windows.h> |
26 #include "util/win/scoped_handle.h" | 26 #include "util/win/scoped_handle.h" |
27 #endif | 27 #endif |
28 | 28 |
29 //! \file | |
30 | |
31 #if defined(OS_POSIX) || DOXYGEN | |
32 | |
33 //! \brief A `PLOG()` macro usable for standard input/output error conditions. | |
34 //! | |
35 //! The `PLOG()` macro uses `errno` on POSIX and is appropriate to report | |
36 //! errors from standard input/output functions. On Windows, `PLOG()` uses | |
37 //! `GetLastError()`, and cannot be used to report errors from standard | |
38 //! input/output functions. This macro uses `PLOG()` when appropriate for | |
39 //! standard I/O functions, and `LOG()` otherwise. | |
40 #define STDIO_PLOG(x) PLOG(x) | |
41 | |
42 #else | |
43 | |
44 #define STDIO_PLOG(x) LOG(x) | |
45 #define fseeko(file, offset, whence) _fseeki64(file, offset, whence) | |
46 #define ftello(file) _ftelli64(file) | |
47 | |
48 #endif | |
49 | |
50 namespace base { | 29 namespace base { |
51 class FilePath; | 30 class FilePath; |
52 } // namespace base | 31 } // namespace base |
53 | 32 |
54 namespace crashpad { | 33 namespace crashpad { |
55 | 34 |
56 #if defined(OS_POSIX) || DOXYGEN | 35 #if defined(OS_POSIX) || DOXYGEN |
57 | 36 |
58 //! \brief Platform-specific alias for a low-level file handle. | 37 //! \brief Platform-specific alias for a low-level file handle. |
59 using FileHandle = int; | 38 using FileHandle = int; |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
107 | 86 |
108 //! \brief Determines the locking mode that LoggingLockFile() uses. | 87 //! \brief Determines the locking mode that LoggingLockFile() uses. |
109 enum class FileLocking : bool { | 88 enum class FileLocking : bool { |
110 //! \brief Equivalent to `flock()` with `LOCK_SH`. | 89 //! \brief Equivalent to `flock()` with `LOCK_SH`. |
111 kShared, | 90 kShared, |
112 | 91 |
113 //! \brief Equivalent to `flock()` with `LOCK_EX`. | 92 //! \brief Equivalent to `flock()` with `LOCK_EX`. |
114 kExclusive, | 93 kExclusive, |
115 }; | 94 }; |
116 | 95 |
117 //! \brief Reads from a file, retrying when interrupted on POSIX or following a | 96 //! \brief Determines the FileHandle that StdioFileHandle() returns. |
118 //! short read. | 97 enum class StdioStream { |
119 //! | 98 //! \brief Standard input, or `stdin`. |
120 //! This function reads into \a buffer, stopping only when \a size bytes have | 99 kStandardInput, |
121 //! been read or when end-of-file has been reached. On Windows, reading from | 100 |
122 //! sockets is not currently supported. | 101 //! \brief Standard output, or `stdout`. |
| 102 kStandardOutput, |
| 103 |
| 104 //! \brief Standard error, or `stderr`. |
| 105 kStandardError, |
| 106 }; |
| 107 |
| 108 namespace internal { |
| 109 |
| 110 //! \brief The name of the native read function used by ReadFile(). |
| 111 //! |
| 112 //! This value may be useful for logging. |
| 113 //! |
| 114 //! \sa kNativeWriteFunctionName |
| 115 extern const char kNativeReadFunctionName[]; |
| 116 |
| 117 //! \brief The name of the native write function used by WriteFile(). |
| 118 //! |
| 119 //! This value may be useful for logging. |
| 120 //! |
| 121 //! \sa kNativeReadFunctionName |
| 122 extern const char kNativeWriteFunctionName[]; |
| 123 |
| 124 //! \brief The internal implementation of ReadFileExactly() and its wrappers. |
| 125 //! |
| 126 //! The logic is exposed so that it may be reused by FileReaderInterface, and |
| 127 //! so that it may be tested without requiring large files to be read. It is not |
| 128 //! intended to be used more generally. Use ReadFileExactly(), |
| 129 //! LoggingReadFileExactly(), CheckedReadFileExactly(), or |
| 130 //! FileReaderInterface::ReadExactly() instead. |
| 131 class ReadExactlyInternal { |
| 132 public: |
| 133 //! \brief Calls Read(), retrying following a short read, ensuring that |
| 134 //! exactly \a size bytes are read. |
| 135 //! |
| 136 //! \return `true` on success. `false` if the underlying Read() fails or if |
| 137 //! fewer than \a size bytes were read. When returning `false`, if \a |
| 138 //! can_log is `true`, logs a message. |
| 139 bool ReadExactly(void* buffer, size_t size, bool can_log); |
| 140 |
| 141 protected: |
| 142 ReadExactlyInternal() {} |
| 143 ~ReadExactlyInternal() {} |
| 144 |
| 145 private: |
| 146 //! \brief Wraps a read operation, such as ReadFile(). |
| 147 //! |
| 148 //! \return The number of bytes read and placed into \a buffer, or `-1` on |
| 149 //! error. When returning `-1`, if \a can_log is `true`, logs a message. |
| 150 virtual FileOperationResult Read(void* buffer, size_t size, bool can_log) = 0; |
| 151 |
| 152 DISALLOW_COPY_AND_ASSIGN(ReadExactlyInternal); |
| 153 }; |
| 154 |
| 155 //! \brief The internal implementation of WriteFile() and its wrappers. |
| 156 //! |
| 157 //! The logic is exposed so that it may be tested without requiring large files |
| 158 //! to be written. It is not intended to be used more generally. Use |
| 159 //! WriteFile(), LoggingWriteFile(), CheckedWriteFile(), or |
| 160 //! FileWriterInterface::Write() instead. |
| 161 class WriteAllInternal { |
| 162 public: |
| 163 //! \brief Calls Write(), retrying following a short write, ensuring that |
| 164 //! exactly \a size bytes are written. |
| 165 //! |
| 166 //! \return `true` on success. `false` if the underlying Write() fails or if |
| 167 //! fewer than \a size bytes were written. |
| 168 bool WriteAll(const void* buffer, size_t size); |
| 169 |
| 170 protected: |
| 171 WriteAllInternal() {} |
| 172 ~WriteAllInternal() {} |
| 173 |
| 174 private: |
| 175 //! \brief Wraps a write operation, such as NativeWriteFile(). |
| 176 //! |
| 177 //! \return The number of bytes written from \a buffer, or `-1` on error. |
| 178 virtual FileOperationResult Write(const void* buffer, size_t size) = 0; |
| 179 |
| 180 DISALLOW_COPY_AND_ASSIGN(WriteAllInternal); |
| 181 }; |
| 182 |
| 183 //! \brief Writes to a file, retrying when interrupted on POSIX. |
| 184 //! |
| 185 //! Fewer than \a size bytes may be written to \a file. This can happen if the |
| 186 //! underlying write operation returns before writing the entire buffer, or if |
| 187 //! the buffer is too large to write in a single operation, possibly due to a |
| 188 //! limitation of a data type used to express the number of bytes written. |
| 189 //! |
| 190 //! This function adapts native write operations for uniform use by WriteFile(). |
| 191 //! This function should only be called by WriteFile(). Other code should call |
| 192 //! WriteFile() or another function that wraps WriteFile(). |
| 193 //! |
| 194 //! \param[in] file The file to write to. |
| 195 //! \param[in] buffer A buffer containing data to be written. |
| 196 //! \param[in] size The number of bytes from \a buffer to write. |
| 197 //! |
| 198 //! \return The number of bytes actually written from \a buffer to \a file on |
| 199 //! success. `-1` on error, with `errno` or `GetLastError()` set |
| 200 //! appropriately. |
| 201 FileOperationResult NativeWriteFile(FileHandle file, |
| 202 const void* buffer, |
| 203 size_t size); |
| 204 |
| 205 } // namespace internal |
| 206 |
| 207 //! \brief Reads from a file, retrying when interrupted before reading any data |
| 208 //! on POSIX. |
| 209 //! |
| 210 //! This function reads into \a buffer. Fewer than \a size bytes may be read. |
| 211 //! On Windows, reading from sockets is not currently supported. |
123 //! | 212 //! |
124 //! \return The number of bytes read and placed into \a buffer, or `-1` on | 213 //! \return The number of bytes read and placed into \a buffer, or `-1` on |
125 //! error, with `errno` or `GetLastError()` set appropriately. On error, a | 214 //! error, with `errno` or `GetLastError()` set appropriately. On error, a |
126 //! portion of \a file may have been read into \a buffer. | 215 //! portion of \a file may have been read into \a buffer. |
127 //! | 216 //! |
128 //! \sa WriteFile | 217 //! \sa WriteFile |
129 //! \sa LoggingReadFile | 218 //! \sa ReadFileExactly |
130 //! \sa CheckedReadFile | 219 //! \sa LoggingReadFileExactly |
| 220 //! \sa CheckedReadFileExactly |
131 //! \sa CheckedReadFileAtEOF | 221 //! \sa CheckedReadFileAtEOF |
132 FileOperationResult ReadFile(FileHandle file, void* buffer, size_t size); | 222 FileOperationResult ReadFile(FileHandle file, void* buffer, size_t size); |
133 | 223 |
134 //! \brief Writes to a file, retrying when interrupted or following a short | 224 //! \brief Writes to a file, retrying when interrupted on POSIX or following a |
135 //! write on POSIX. | 225 //! short write. |
136 //! | 226 //! |
137 //! This function writes to \a file, stopping only when \a size bytes have been | 227 //! This function writes to \a file, stopping only when \a size bytes have been |
138 //! written. | 228 //! written. |
139 //! | 229 //! |
140 //! \return The number of bytes written from \a buffer, or `-1` on error, with | 230 //! \return `true` on success. `false` on error, with `errno` or |
141 //! `errno` or `GetLastError()` set appropriately. On error, a portion of | 231 //! `GetLastError()` set appropriately. On error, a portion of \a buffer may |
142 //! \a buffer may have been written to \a file. | 232 //! have been written to \a file. |
143 //! | 233 //! |
144 //! \sa ReadFile | 234 //! \sa ReadFile |
145 //! \sa LoggingWriteFile | 235 //! \sa LoggingWriteFile |
146 //! \sa CheckedWriteFile | 236 //! \sa CheckedWriteFile |
147 FileOperationResult WriteFile(FileHandle file, const void* buffer, size_t size); | 237 bool WriteFile(FileHandle file, const void* buffer, size_t size); |
148 | 238 |
149 //! \brief Wraps ReadFile(), ensuring that exactly \a size bytes are read. | 239 //! \brief Wraps ReadFile(), retrying following a short read, ensuring that |
150 //! | 240 //! exactly \a size bytes are read. |
151 //! \return `true` on success. If \a size is out of the range of possible | 241 //! |
152 //! ReadFile() return values, if the underlying ReadFile() fails, or if | 242 //! \return `true` on success. If the underlying ReadFile() fails, or if fewer |
153 //! other than \a size bytes were read, this function logs a message and | 243 //! than \a size bytes were read, this function logs a message and |
154 //! returns `false`. | 244 //! returns `false`. |
155 //! | 245 //! |
156 //! \sa LoggingWriteFile | 246 //! \sa LoggingWriteFile |
157 //! \sa ReadFile | 247 //! \sa ReadFile |
158 //! \sa CheckedReadFile | 248 //! \sa LoggingReadFileExactly |
159 //! \sa CheckedReadFileAtEOF | 249 //! \sa CheckedReadFileExactly |
160 bool LoggingReadFile(FileHandle file, void* buffer, size_t size); | 250 //! \sa CheckedReadFileAtEOF |
| 251 bool ReadFileExactly(FileHandle file, void* buffer, size_t size); |
| 252 |
| 253 //! \brief Wraps ReadFile(), retrying following a short read, ensuring that |
| 254 //! exactly \a size bytes are read. |
| 255 //! |
| 256 //! \return `true` on success. If the underlying ReadFile() fails, or if fewer |
| 257 //! than \a size bytes were read, this function logs a message and |
| 258 //! returns `false`. |
| 259 //! |
| 260 //! \sa LoggingWriteFile |
| 261 //! \sa ReadFile |
| 262 //! \sa ReadFileExactly |
| 263 //! \sa CheckedReadFileExactly |
| 264 //! \sa CheckedReadFileAtEOF |
| 265 bool LoggingReadFileExactly(FileHandle file, void* buffer, size_t size); |
161 | 266 |
162 //! \brief Wraps WriteFile(), ensuring that exactly \a size bytes are written. | 267 //! \brief Wraps WriteFile(), ensuring that exactly \a size bytes are written. |
163 //! | 268 //! |
164 //! \return `true` on success. If \a size is out of the range of possible | 269 //! \return `true` on success. If the underlying WriteFile() fails, or if fewer |
165 //! WriteFile() return values, if the underlying WriteFile() fails, or if | 270 //! than \a size bytes were written, this function logs a message and |
166 //! other than \a size bytes were written, this function logs a message and | |
167 //! returns `false`. | 271 //! returns `false`. |
168 //! | 272 //! |
169 //! \sa LoggingReadFile | 273 //! \sa LoggingReadFileExactly |
170 //! \sa WriteFile | 274 //! \sa WriteFile |
171 //! \sa CheckedWriteFile | 275 //! \sa CheckedWriteFile |
172 bool LoggingWriteFile(FileHandle file, const void* buffer, size_t size); | 276 bool LoggingWriteFile(FileHandle file, const void* buffer, size_t size); |
173 | 277 |
174 //! \brief Wraps ReadFile(), ensuring that exactly \a size bytes are read. | 278 //! \brief Wraps ReadFile(), ensuring that exactly \a size bytes are read. |
175 //! | 279 //! |
176 //! If \a size is out of the range of possible ReadFile() return values, if the | 280 //! If the underlying ReadFile() fails, or if fewer than \a size bytes were |
177 //! underlying ReadFile() fails, or if other than \a size bytes were read, this | 281 //! read, this function causes execution to terminate without returning. |
178 //! function causes execution to terminate without returning. | |
179 //! | 282 //! |
180 //! \sa CheckedWriteFile | 283 //! \sa CheckedWriteFile |
181 //! \sa ReadFile | 284 //! \sa ReadFile |
182 //! \sa LoggingReadFile | 285 //! \sa LoggingReadFileExactly |
183 //! \sa CheckedReadFileAtEOF | 286 //! \sa CheckedReadFileAtEOF |
184 void CheckedReadFile(FileHandle file, void* buffer, size_t size); | 287 void CheckedReadFileExactly(FileHandle file, void* buffer, size_t size); |
185 | 288 |
186 //! \brief Wraps WriteFile(), ensuring that exactly \a size bytes are written. | 289 //! \brief Wraps WriteFile(), ensuring that exactly \a size bytes are written. |
187 //! | 290 //! |
188 //! If \a size is out of the range of possible WriteFile() return values, if the | 291 //! if the underlying WriteFile() fails, or if fewer than \a size bytes were |
189 //! underlying WriteFile() fails, or if other than \a size bytes were written, | 292 //! written, this function causes execution to terminate without returning. |
190 //! this function causes execution to terminate without returning. | 293 //! |
191 //! | 294 //! \sa CheckedReadFileExactly |
192 //! \sa CheckedReadFile | |
193 //! \sa WriteFile | 295 //! \sa WriteFile |
194 //! \sa LoggingWriteFile | 296 //! \sa LoggingWriteFile |
195 void CheckedWriteFile(FileHandle file, const void* buffer, size_t size); | 297 void CheckedWriteFile(FileHandle file, const void* buffer, size_t size); |
196 | 298 |
197 //! \brief Wraps ReadFile(), ensuring that it indicates end-of-file. | 299 //! \brief Wraps ReadFile(), ensuring that it indicates end-of-file. |
198 //! | 300 //! |
199 //! Attempts to read a single byte from \a file, expecting no data to be read. | 301 //! Attempts to read a single byte from \a file, expecting no data to be read. |
200 //! If the underlying ReadFile() fails, or if a byte actually is read, this | 302 //! If the underlying ReadFile() fails, or if a byte actually is read, this |
201 //! function causes execution to terminate without returning. | 303 //! function causes execution to terminate without returning. |
202 //! | 304 //! |
203 //! \sa CheckedReadFile | 305 //! \sa CheckedReadFileExactly |
204 //! \sa ReadFile | 306 //! \sa ReadFile |
205 void CheckedReadFileAtEOF(FileHandle file); | 307 void CheckedReadFileAtEOF(FileHandle file); |
206 | 308 |
207 //! \brief Wraps `open()` or `CreateFile()`, opening an existing file for | 309 //! \brief Wraps `open()` or `CreateFile()`, opening an existing file for |
208 //! reading. | 310 //! reading. |
209 //! | 311 //! |
210 //! \return The newly opened FileHandle, or an invalid FileHandle on failure. | 312 //! \return The newly opened FileHandle, or an invalid FileHandle on failure. |
211 //! | 313 //! |
212 //! \sa ScopedFileHandle | 314 //! \sa ScopedFileHandle |
213 //! \sa OpenFileForWrite | 315 //! \sa OpenFileForWrite |
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
338 | 440 |
339 //! \brief Wraps `close()` or `CloseHandle()`, ensuring that it succeeds. | 441 //! \brief Wraps `close()` or `CloseHandle()`, ensuring that it succeeds. |
340 //! | 442 //! |
341 //! If the underlying function fails, this function causes execution to | 443 //! If the underlying function fails, this function causes execution to |
342 //! terminate without returning. | 444 //! terminate without returning. |
343 void CheckedCloseFile(FileHandle file); | 445 void CheckedCloseFile(FileHandle file); |
344 | 446 |
345 //! \brief Determines the size of a file. | 447 //! \brief Determines the size of a file. |
346 //! | 448 //! |
347 //! \param[in] file The handle to the file for which the size should be | 449 //! \param[in] file The handle to the file for which the size should be |
348 //! retrived. | 450 //! retrieved. |
349 //! | 451 //! |
350 //! \return The size of the file. If an error occurs when attempting to | 452 //! \return The size of the file. If an error occurs when attempting to |
351 //! determine its size, returns `-1` with an error logged. | 453 //! determine its size, returns `-1` with an error logged. |
352 FileOffset LoggingFileSizeByHandle(FileHandle file); | 454 FileOffset LoggingFileSizeByHandle(FileHandle file); |
353 | 455 |
| 456 //! \brief Returns a FileHandle corresponding to the requested standard I/O |
| 457 //! stream. |
| 458 //! |
| 459 //! The returned FileHandle should not be closed on POSIX, where it is |
| 460 //! important to maintain valid file descriptors occupying the slots reserved |
| 461 //! for these streams. If a need to close such a stream arises on POSIX, |
| 462 //! `dup2()` should instead be used to replace the existing file descriptor with |
| 463 //! one opened to `/dev/null`. See CloseStdinAndStdout(). |
| 464 //! |
| 465 //! \param[in] stdio_stream The requested standard I/O stream. |
| 466 //! |
| 467 //! \return A corresponding FileHandle on success. kInvalidFileHandle on error, |
| 468 //! with a message logged. |
| 469 FileHandle StdioFileHandle(StdioStream stdio_stream); |
| 470 |
354 } // namespace crashpad | 471 } // namespace crashpad |
355 | 472 |
356 #endif // CRASHPAD_UTIL_FILE_FILE_IO_H_ | 473 #endif // CRASHPAD_UTIL_FILE_FILE_IO_H_ |
OLD | NEW |