Loading base/file.cpp +97 −0 Original line number Diff line number Diff line Loading @@ -19,6 +19,8 @@ #include <errno.h> #include <fcntl.h> #include <libgen.h> #include <stdio.h> #include <stdlib.h> #include <sys/stat.h> #include <sys/types.h> #include <unistd.h> Loading @@ -37,10 +39,105 @@ #include <mach-o/dyld.h> #endif #if defined(_WIN32) #include <direct.h> #include <windows.h> #define O_NOFOLLOW 0 #define OS_PATH_SEPARATOR '\\' #else #define OS_PATH_SEPARATOR '/' #endif #ifdef _WIN32 int mkstemp(char* template_name) { if (_mktemp(template_name) == nullptr) { return -1; } // Use open() to match the close() that TemporaryFile's destructor does. // Use O_BINARY to match base file APIs. return open(template_name, O_CREAT | O_EXCL | O_RDWR | O_BINARY, S_IRUSR | S_IWUSR); } char* mkdtemp(char* template_name) { if (_mktemp(template_name) == nullptr) { return nullptr; } if (_mkdir(template_name) == -1) { return nullptr; } return template_name; } #endif namespace { std::string GetSystemTempDir() { #if defined(__ANDROID__) const char* tmpdir = "/data/local/tmp"; if (access(tmpdir, R_OK | W_OK | X_OK) == 0) { return tmpdir; } // Tests running in app context can't access /data/local/tmp, // so try current directory if /data/local/tmp is not accessible. return "."; #elif defined(_WIN32) char tmp_dir[MAX_PATH]; DWORD result = GetTempPathA(sizeof(tmp_dir), tmp_dir); CHECK_NE(result, 0ul) << "GetTempPathA failed, error: " << GetLastError(); CHECK_LT(result, sizeof(tmp_dir)) << "path truncated to: " << result; // GetTempPath() returns a path with a trailing slash, but init() // does not expect that, so remove it. CHECK_EQ(tmp_dir[result - 1], '\\'); tmp_dir[result - 1] = '\0'; return tmp_dir; #else return "/tmp"; #endif } } // namespace TemporaryFile::TemporaryFile() { init(GetSystemTempDir()); } TemporaryFile::TemporaryFile(const std::string& tmp_dir) { init(tmp_dir); } TemporaryFile::~TemporaryFile() { if (fd != -1) { close(fd); } if (remove_file_) { unlink(path); } } int TemporaryFile::release() { int result = fd; fd = -1; return result; } void TemporaryFile::init(const std::string& tmp_dir) { snprintf(path, sizeof(path), "%s%cTemporaryFile-XXXXXX", tmp_dir.c_str(), OS_PATH_SEPARATOR); fd = mkstemp(path); } TemporaryDir::TemporaryDir() { init(GetSystemTempDir()); } TemporaryDir::~TemporaryDir() { rmdir(path); } bool TemporaryDir::init(const std::string& tmp_dir) { snprintf(path, sizeof(path), "%s%cTemporaryDir-XXXXXX", tmp_dir.c_str(), OS_PATH_SEPARATOR); return (mkdtemp(path) != nullptr); } namespace android { namespace base { Loading base/include/android-base/file.h +38 −0 Original line number Diff line number Diff line Loading @@ -18,8 +18,10 @@ #include <sys/stat.h> #include <sys/types.h> #include <string> #include <android-base/macros.h> #include "android-base/off64_t.h" #if !defined(_WIN32) && !defined(O_BINARY) Loading @@ -32,6 +34,42 @@ #define O_CLOEXEC O_NOINHERIT #endif class TemporaryFile { public: TemporaryFile(); explicit TemporaryFile(const std::string& tmp_dir); ~TemporaryFile(); // Release the ownership of fd, caller is reponsible for closing the // fd or stream properly. int release(); // Don't remove the temporary file in the destructor. void DoNotRemove() { remove_file_ = false; } int fd; char path[1024]; private: void init(const std::string& tmp_dir); bool remove_file_ = true; DISALLOW_COPY_AND_ASSIGN(TemporaryFile); }; class TemporaryDir { public: TemporaryDir(); ~TemporaryDir(); char path[1024]; private: bool init(const std::string& tmp_dir); DISALLOW_COPY_AND_ASSIGN(TemporaryDir); }; namespace android { namespace base { Loading base/include/android-base/test_utils.h +1 −36 Original line number Diff line number Diff line Loading @@ -19,44 +19,9 @@ #include <regex> #include <string> #include <android-base/file.h> #include <android-base/macros.h> class TemporaryFile { public: TemporaryFile(); explicit TemporaryFile(const std::string& tmp_dir); ~TemporaryFile(); // Release the ownership of fd, caller is reponsible for closing the // fd or stream properly. int release(); // Don't remove the temporary file in the destructor. void DoNotRemove() { remove_file_ = false; } int fd; char path[1024]; private: void init(const std::string& tmp_dir); bool remove_file_ = true; DISALLOW_COPY_AND_ASSIGN(TemporaryFile); }; class TemporaryDir { public: TemporaryDir(); ~TemporaryDir(); char path[1024]; private: bool init(const std::string& tmp_dir); DISALLOW_COPY_AND_ASSIGN(TemporaryDir); }; class CapturedStdFd { public: CapturedStdFd(int std_fd); Loading base/test_utils.cpp +0 −98 Original line number Diff line number Diff line Loading @@ -22,109 +22,11 @@ #include <sys/stat.h> #include <unistd.h> #if defined(_WIN32) #include <windows.h> #include <direct.h> #define OS_PATH_SEPARATOR '\\' #else #define OS_PATH_SEPARATOR '/' #endif #include <string> #include <android-base/file.h> #include <android-base/logging.h> #ifdef _WIN32 int mkstemp(char* template_name) { if (_mktemp(template_name) == nullptr) { return -1; } // Use open() to match the close() that TemporaryFile's destructor does. // Use O_BINARY to match base file APIs. return open(template_name, O_CREAT | O_EXCL | O_RDWR | O_BINARY, S_IRUSR | S_IWUSR); } char* mkdtemp(char* template_name) { if (_mktemp(template_name) == nullptr) { return nullptr; } if (_mkdir(template_name) == -1) { return nullptr; } return template_name; } #endif static std::string GetSystemTempDir() { #if defined(__ANDROID__) const char* tmpdir = "/data/local/tmp"; if (access(tmpdir, R_OK | W_OK | X_OK) == 0) { return tmpdir; } // Tests running in app context can't access /data/local/tmp, // so try current directory if /data/local/tmp is not accessible. return "."; #elif defined(_WIN32) char tmp_dir[MAX_PATH]; DWORD result = GetTempPathA(sizeof(tmp_dir), tmp_dir); CHECK_NE(result, 0ul) << "GetTempPathA failed, error: " << GetLastError(); CHECK_LT(result, sizeof(tmp_dir)) << "path truncated to: " << result; // GetTempPath() returns a path with a trailing slash, but init() // does not expect that, so remove it. CHECK_EQ(tmp_dir[result - 1], '\\'); tmp_dir[result - 1] = '\0'; return tmp_dir; #else return "/tmp"; #endif } TemporaryFile::TemporaryFile() { init(GetSystemTempDir()); } TemporaryFile::TemporaryFile(const std::string& tmp_dir) { init(tmp_dir); } TemporaryFile::~TemporaryFile() { if (fd != -1) { close(fd); } if (remove_file_) { unlink(path); } } int TemporaryFile::release() { int result = fd; fd = -1; return result; } void TemporaryFile::init(const std::string& tmp_dir) { snprintf(path, sizeof(path), "%s%cTemporaryFile-XXXXXX", tmp_dir.c_str(), OS_PATH_SEPARATOR); fd = mkstemp(path); } TemporaryDir::TemporaryDir() { init(GetSystemTempDir()); } TemporaryDir::~TemporaryDir() { rmdir(path); } bool TemporaryDir::init(const std::string& tmp_dir) { snprintf(path, sizeof(path), "%s%cTemporaryDir-XXXXXX", tmp_dir.c_str(), OS_PATH_SEPARATOR); return (mkdtemp(path) != nullptr); } CapturedStdFd::CapturedStdFd(int std_fd) : std_fd_(std_fd), old_fd_(-1) { Start(); } Loading Loading
base/file.cpp +97 −0 Original line number Diff line number Diff line Loading @@ -19,6 +19,8 @@ #include <errno.h> #include <fcntl.h> #include <libgen.h> #include <stdio.h> #include <stdlib.h> #include <sys/stat.h> #include <sys/types.h> #include <unistd.h> Loading @@ -37,10 +39,105 @@ #include <mach-o/dyld.h> #endif #if defined(_WIN32) #include <direct.h> #include <windows.h> #define O_NOFOLLOW 0 #define OS_PATH_SEPARATOR '\\' #else #define OS_PATH_SEPARATOR '/' #endif #ifdef _WIN32 int mkstemp(char* template_name) { if (_mktemp(template_name) == nullptr) { return -1; } // Use open() to match the close() that TemporaryFile's destructor does. // Use O_BINARY to match base file APIs. return open(template_name, O_CREAT | O_EXCL | O_RDWR | O_BINARY, S_IRUSR | S_IWUSR); } char* mkdtemp(char* template_name) { if (_mktemp(template_name) == nullptr) { return nullptr; } if (_mkdir(template_name) == -1) { return nullptr; } return template_name; } #endif namespace { std::string GetSystemTempDir() { #if defined(__ANDROID__) const char* tmpdir = "/data/local/tmp"; if (access(tmpdir, R_OK | W_OK | X_OK) == 0) { return tmpdir; } // Tests running in app context can't access /data/local/tmp, // so try current directory if /data/local/tmp is not accessible. return "."; #elif defined(_WIN32) char tmp_dir[MAX_PATH]; DWORD result = GetTempPathA(sizeof(tmp_dir), tmp_dir); CHECK_NE(result, 0ul) << "GetTempPathA failed, error: " << GetLastError(); CHECK_LT(result, sizeof(tmp_dir)) << "path truncated to: " << result; // GetTempPath() returns a path with a trailing slash, but init() // does not expect that, so remove it. CHECK_EQ(tmp_dir[result - 1], '\\'); tmp_dir[result - 1] = '\0'; return tmp_dir; #else return "/tmp"; #endif } } // namespace TemporaryFile::TemporaryFile() { init(GetSystemTempDir()); } TemporaryFile::TemporaryFile(const std::string& tmp_dir) { init(tmp_dir); } TemporaryFile::~TemporaryFile() { if (fd != -1) { close(fd); } if (remove_file_) { unlink(path); } } int TemporaryFile::release() { int result = fd; fd = -1; return result; } void TemporaryFile::init(const std::string& tmp_dir) { snprintf(path, sizeof(path), "%s%cTemporaryFile-XXXXXX", tmp_dir.c_str(), OS_PATH_SEPARATOR); fd = mkstemp(path); } TemporaryDir::TemporaryDir() { init(GetSystemTempDir()); } TemporaryDir::~TemporaryDir() { rmdir(path); } bool TemporaryDir::init(const std::string& tmp_dir) { snprintf(path, sizeof(path), "%s%cTemporaryDir-XXXXXX", tmp_dir.c_str(), OS_PATH_SEPARATOR); return (mkdtemp(path) != nullptr); } namespace android { namespace base { Loading
base/include/android-base/file.h +38 −0 Original line number Diff line number Diff line Loading @@ -18,8 +18,10 @@ #include <sys/stat.h> #include <sys/types.h> #include <string> #include <android-base/macros.h> #include "android-base/off64_t.h" #if !defined(_WIN32) && !defined(O_BINARY) Loading @@ -32,6 +34,42 @@ #define O_CLOEXEC O_NOINHERIT #endif class TemporaryFile { public: TemporaryFile(); explicit TemporaryFile(const std::string& tmp_dir); ~TemporaryFile(); // Release the ownership of fd, caller is reponsible for closing the // fd or stream properly. int release(); // Don't remove the temporary file in the destructor. void DoNotRemove() { remove_file_ = false; } int fd; char path[1024]; private: void init(const std::string& tmp_dir); bool remove_file_ = true; DISALLOW_COPY_AND_ASSIGN(TemporaryFile); }; class TemporaryDir { public: TemporaryDir(); ~TemporaryDir(); char path[1024]; private: bool init(const std::string& tmp_dir); DISALLOW_COPY_AND_ASSIGN(TemporaryDir); }; namespace android { namespace base { Loading
base/include/android-base/test_utils.h +1 −36 Original line number Diff line number Diff line Loading @@ -19,44 +19,9 @@ #include <regex> #include <string> #include <android-base/file.h> #include <android-base/macros.h> class TemporaryFile { public: TemporaryFile(); explicit TemporaryFile(const std::string& tmp_dir); ~TemporaryFile(); // Release the ownership of fd, caller is reponsible for closing the // fd or stream properly. int release(); // Don't remove the temporary file in the destructor. void DoNotRemove() { remove_file_ = false; } int fd; char path[1024]; private: void init(const std::string& tmp_dir); bool remove_file_ = true; DISALLOW_COPY_AND_ASSIGN(TemporaryFile); }; class TemporaryDir { public: TemporaryDir(); ~TemporaryDir(); char path[1024]; private: bool init(const std::string& tmp_dir); DISALLOW_COPY_AND_ASSIGN(TemporaryDir); }; class CapturedStdFd { public: CapturedStdFd(int std_fd); Loading
base/test_utils.cpp +0 −98 Original line number Diff line number Diff line Loading @@ -22,109 +22,11 @@ #include <sys/stat.h> #include <unistd.h> #if defined(_WIN32) #include <windows.h> #include <direct.h> #define OS_PATH_SEPARATOR '\\' #else #define OS_PATH_SEPARATOR '/' #endif #include <string> #include <android-base/file.h> #include <android-base/logging.h> #ifdef _WIN32 int mkstemp(char* template_name) { if (_mktemp(template_name) == nullptr) { return -1; } // Use open() to match the close() that TemporaryFile's destructor does. // Use O_BINARY to match base file APIs. return open(template_name, O_CREAT | O_EXCL | O_RDWR | O_BINARY, S_IRUSR | S_IWUSR); } char* mkdtemp(char* template_name) { if (_mktemp(template_name) == nullptr) { return nullptr; } if (_mkdir(template_name) == -1) { return nullptr; } return template_name; } #endif static std::string GetSystemTempDir() { #if defined(__ANDROID__) const char* tmpdir = "/data/local/tmp"; if (access(tmpdir, R_OK | W_OK | X_OK) == 0) { return tmpdir; } // Tests running in app context can't access /data/local/tmp, // so try current directory if /data/local/tmp is not accessible. return "."; #elif defined(_WIN32) char tmp_dir[MAX_PATH]; DWORD result = GetTempPathA(sizeof(tmp_dir), tmp_dir); CHECK_NE(result, 0ul) << "GetTempPathA failed, error: " << GetLastError(); CHECK_LT(result, sizeof(tmp_dir)) << "path truncated to: " << result; // GetTempPath() returns a path with a trailing slash, but init() // does not expect that, so remove it. CHECK_EQ(tmp_dir[result - 1], '\\'); tmp_dir[result - 1] = '\0'; return tmp_dir; #else return "/tmp"; #endif } TemporaryFile::TemporaryFile() { init(GetSystemTempDir()); } TemporaryFile::TemporaryFile(const std::string& tmp_dir) { init(tmp_dir); } TemporaryFile::~TemporaryFile() { if (fd != -1) { close(fd); } if (remove_file_) { unlink(path); } } int TemporaryFile::release() { int result = fd; fd = -1; return result; } void TemporaryFile::init(const std::string& tmp_dir) { snprintf(path, sizeof(path), "%s%cTemporaryFile-XXXXXX", tmp_dir.c_str(), OS_PATH_SEPARATOR); fd = mkstemp(path); } TemporaryDir::TemporaryDir() { init(GetSystemTempDir()); } TemporaryDir::~TemporaryDir() { rmdir(path); } bool TemporaryDir::init(const std::string& tmp_dir) { snprintf(path, sizeof(path), "%s%cTemporaryDir-XXXXXX", tmp_dir.c_str(), OS_PATH_SEPARATOR); return (mkdtemp(path) != nullptr); } CapturedStdFd::CapturedStdFd(int std_fd) : std_fd_(std_fd), old_fd_(-1) { Start(); } Loading