1 // Copyright 2022 Google LLC 2 // 3 // Redistribution and use in source and binary forms, with or without 4 // modification, are permitted provided that the following conditions are 5 // met: 6 // 7 // * Redistributions of source code must retain the above copyright 8 // notice, this list of conditions and the following disclaimer. 9 // * Redistributions in binary form must reproduce the above 10 // copyright notice, this list of conditions and the following disclaimer 11 // in the documentation and/or other materials provided with the 12 // distribution. 13 // * Neither the name of Google LLC nor the names of its 14 // contributors may be used to endorse or promote products derived from 15 // this software without specific prior written permission. 16 // 17 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 18 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 19 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 20 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 21 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 22 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 23 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 24 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 25 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 27 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 29 // Utility class for creating a temporary file for that is deleted in the 30 // destructor. 31 32 #ifndef COMMON_LINUX_SCOPED_TMPFILE_H_ 33 #define COMMON_LINUX_SCOPED_TMPFILE_H_ 34 35 #include <string> 36 37 namespace google_breakpad { 38 39 // Small RAII wrapper for temporary files. 40 // 41 // Example: 42 // ScopedTmpFile tmp; 43 // if (tmp.Init("Some file contents")) { 44 // ... 45 // } 46 class ScopedTmpFile { 47 public: 48 // Initialize the ScopedTmpFile object - this does not create the temporary 49 // file until Init is called. 50 ScopedTmpFile(); 51 52 // Destroy temporary file on scope exit. 53 ~ScopedTmpFile(); 54 55 // Creates the empty temporary file - returns true iff the temporary file was 56 // created successfully. Should always be checked before using the file. 57 bool InitEmpty(); 58 59 // Creates the temporary file with the provided C string. The terminating null 60 // is not written. Returns true iff the temporary file was created 61 // successfully and the contents were written successfully. 62 bool InitString(const char* text); 63 64 // Creates the temporary file with the provided data. Returns true iff the 65 // temporary file was created successfully and the contents were written 66 // successfully. 67 bool InitData(const void* data, size_t data_len); 68 69 // Returns the Posix file descriptor for the test file, or -1 if Init() 70 // returned false. Note: on Windows, this always returns -1. GetFd()71 int GetFd() const { 72 return fd_; 73 } 74 75 private: 76 // Set the contents of the temporary file, and seek back to the start of the 77 // file. On failure, returns false. 78 bool SetContents(const void* data, size_t data_len); 79 80 int fd_ = -1; 81 }; 82 83 } // namespace google_breakpad 84 85 #endif // COMMON_LINUX_SCOPED_TMPFILE_H_ 86