1 // Copyright (c) 2016 The WebM project authors. All Rights Reserved. 2 // 3 // Use of this source code is governed by a BSD-style license 4 // that can be found in the LICENSE file in the root of the source 5 // tree. An additional intellectual property rights grant can be found 6 // in the file PATENTS. All contributing project authors may 7 // be found in the AUTHORS file in the root of the source tree. 8 #include "common/file_util.h" 9 10 #include <sys/stat.h> 11 #ifndef _MSC_VER 12 #include <unistd.h> // close() 13 #endif 14 15 #include <cstdio> 16 #include <cstdlib> 17 #include <cstring> 18 #include <fstream> 19 #include <ios> 20 #include <string> 21 22 namespace libwebm { 23 GetTempFileName()24std::string GetTempFileName() { 25 #if !defined _MSC_VER && !defined __MINGW32__ 26 std::string temp_file_name_template_str = 27 std::string(std::getenv("TEST_TMPDIR") ? std::getenv("TEST_TMPDIR") 28 : ".") + 29 "/libwebm_temp.XXXXXX"; 30 char* temp_file_name_template = 31 new char[temp_file_name_template_str.length() + 1]; 32 memset(temp_file_name_template, 0, temp_file_name_template_str.length() + 1); 33 temp_file_name_template_str.copy(temp_file_name_template, 34 temp_file_name_template_str.length(), 0); 35 int fd = mkstemp(temp_file_name_template); 36 std::string temp_file_name = 37 (fd != -1) ? std::string(temp_file_name_template) : std::string(); 38 delete[] temp_file_name_template; 39 if (fd != -1) { 40 close(fd); 41 } 42 return temp_file_name; 43 #else 44 char tmp_file_name[_MAX_PATH]; 45 #if defined _MSC_VER || defined MINGW_HAS_SECURE_API 46 errno_t err = tmpnam_s(tmp_file_name); 47 #else 48 char* fname_pointer = tmpnam(tmp_file_name); 49 int err = (fname_pointer == &tmp_file_name[0]) ? 0 : -1; 50 #endif 51 if (err == 0) { 52 return std::string(tmp_file_name); 53 } 54 return std::string(); 55 #endif 56 } 57 GetFileSize(const std::string & file_name)58uint64_t GetFileSize(const std::string& file_name) { 59 uint64_t file_size = 0; 60 #ifndef _MSC_VER 61 struct stat st; 62 st.st_size = 0; 63 if (stat(file_name.c_str(), &st) == 0) { 64 #else 65 struct _stat st; 66 st.st_size = 0; 67 if (_stat(file_name.c_str(), &st) == 0) { 68 #endif 69 file_size = st.st_size; 70 } 71 return file_size; 72 } 73 74 bool GetFileContents(const std::string& file_name, std::string* contents) { 75 std::ifstream file(file_name.c_str()); 76 *contents = std::string(static_cast<size_t>(GetFileSize(file_name)), 0); 77 if (file.good() && contents->size()) { 78 file.read(&(*contents)[0], contents->size()); 79 } 80 return !file.fail(); 81 } 82 83 TempFileDeleter::TempFileDeleter() { file_name_ = GetTempFileName(); } 84 85 TempFileDeleter::~TempFileDeleter() { 86 std::ifstream file(file_name_.c_str()); 87 if (file.good()) { 88 file.close(); 89 std::remove(file_name_.c_str()); 90 } 91 } 92 93 } // namespace libwebm 94