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