xref: /aosp_15_r20/external/libwebm/common/file_util.cc (revision 103e46e4cd4b6efcf6001f23fa8665fb110abf8d)
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 Mahendrakar std::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 Mahendrakar uint64_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