5#include "flutter/fml/file.h"
17#include "flutter/fml/eintr_wrapper.h"
18#include "flutter/fml/logging.h"
19#include "flutter/fml/mapping.h"
20#include "flutter/fml/trace_event.h"
21#include "flutter/fml/unique_fd.h"
26 char directory_name[] =
"/tmp/flutter_XXXXXXXX";
27 auto*
result = ::mkdtemp(directory_name);
60 mode |= S_IRUSR | S_IWUSR;
67 bool create_if_necessary,
75 bool create_if_necessary,
78 if (path ==
nullptr) {
85 if (create_if_necessary && !
FileExists(base_directory, path)) {
98 bool create_if_necessary,
106 bool create_if_necessary,
108 if (path ==
nullptr) {
112 if (create_if_necessary && !
FileExists(base_directory, path)) {
113 if (::mkdirat(base_directory.
get(), path,
120 ::openat(base_directory.
get(), path, O_RDONLY | O_DIRECTORY))};
132 struct stat stat_result = {};
134 if (::fstat(directory.
get(), &stat_result) != 0) {
138 return S_ISDIR(stat_result.st_mode);
148 if (stat(path.c_str(), &buf) != 0) {
152 return S_ISREG(buf.st_mode);
156 if (!file.is_valid()) {
160 return ::ftruncate(file.get(),
size) == 0;
168 return ::unlinkat(base_directory.
get(), path, AT_REMOVEDIR) == 0;
176 int code = ::unlinkat(base_directory.
get(), path, 0);
188 return ::faccessat(base_directory.
get(), path, F_OK, 0) == 0;
192 const char* file_name,
194 if (file_name ==
nullptr || data.GetMapping() ==
nullptr) {
198 std::stringstream stream;
199 stream << file_name <<
".temp";
200 const auto temp_file_name = stream.str();
202 auto temp_file =
OpenFile(base_directory, temp_file_name.c_str(),
true,
204 if (!temp_file.is_valid()) {
212 ssize_t remaining = data.GetSize();
216 while (remaining > 0) {
218 ::write(temp_file.get(), data.GetMapping() +
offset, remaining));
224 remaining -= written;
228 if (::fsync(temp_file.get()) != 0) {
232 return ::renameat(base_directory.
get(), temp_file_name.c_str(),
233 base_directory.
get(), file_name) == 0;
239 FML_DLOG(
ERROR) <<
"Can't dup the directory fd. Error: " << strerror(errno);
244 if (!dir.is_valid()) {
245 FML_DLOG(
ERROR) <<
"Can't open the directory. Error: " << strerror(errno);
255 rewinddir(dir.get());
256 while (dirent* ent = readdir(dir.get())) {
257 std::string filename = ent->d_name;
258 if (filename !=
"." && filename !=
"..") {
259 if (!visitor(directory, filename)) {
FlutterSemanticsFlag flags
#define FML_HANDLE_EINTR(x)
#define FML_DLOG(severity)
fml::UniqueFD OpenFileReadOnly(const fml::UniqueFD &base_directory, const char *path)
bool VisitFiles(const fml::UniqueFD &directory, const FileVisitor &visitor)
static int ToPosixCreateModeFlags(FilePermission permission)
constexpr std::size_t size(T(&array)[N])
bool WriteAtomically(const fml::UniqueFD &base_directory, const char *file_name, const Mapping &mapping)
fml::UniqueFD Duplicate(fml::UniqueFD::element_type descriptor)
fml::UniqueFD OpenDirectory(const char *path, bool create_if_necessary, FilePermission permission)
bool IsFile(const std::string &path)
static int ToPosixAccessFlags(FilePermission permission)
std::string CreateTemporaryDirectory()
bool UnlinkDirectory(const char *path)
bool TruncateFile(const fml::UniqueFD &file, size_t size)
bool FileExists(const fml::UniqueFD &base_directory, const char *path)
bool UnlinkFile(const char *path)
fml::UniqueFD OpenFile(const char *path, bool create_if_necessary, FilePermission permission)
This can open a directory on POSIX, but not on Windows.
std::function< bool(const fml::UniqueFD &directory, const std::string &filename)> FileVisitor
bool IsDirectory(const fml::UniqueFD &directory)
void write(SkWStream *wStream, const T &text)
#define TRACE_EVENT0(category_group, name)