v31.1-roots.1 · Commit 6: [PATCH 06/17] feat(wallet): preserve Roots signing and spend controls on v31
src/util/fs_helpers.cpp
Before: src/util/fs_helpers.cpp · After: src/util/fs_helpers.cpp
File metadata
index e7780d743c191e9207263fe352ff2978ea0fdb01..a4d5e40d5f6660a656edc06148e80a154866664c 100644
Download original patch · Release notes
Diff rows 1–41 of 41. Line numbers refer to the original before/after files.
+ Added− RemovedUnmarked lines are context.
Scroll the code area horizontally to read long lines. The two line-number columns refer to before and after.
src/util/fs_helpers.cpp
CHANGED
|
@@ -7,7 +7,9 @@
|
|
|
7
7
|
|
|
8
8
|
#include <util/fs_helpers.h>
|
|
9
9
|
|
|
10
|
+
#include <random.h>
|
|
10
11
|
#include <sync.h>
|
|
12
|
+
#include <tinyformat.h>
|
|
11
13
|
#include <util/fs.h>
|
|
12
14
|
#include <util/log.h>
|
|
13
15
|
#include <util/syserror.h>
|
|
@@ -315,3 +317,32 @@ FSType GetFilesystemType(const fs::path& path)
|
|
|
315
317
|
return FSType::OTHER;
|
|
316
318
|
}
|
|
317
319
|
#endif
|
|
320
|
+
|
|
321
|
+
bool IsDirWritable(const fs::path& dir_path)
|
|
322
|
+
{
|
|
323
|
+
// Attempt to create a tmp file in the directory
|
|
324
|
+
if (!fs::is_directory(dir_path)) throw std::runtime_error(strprintf("Path %s is not a directory", fs::PathToString(dir_path)));
|
|
325
|
+
FastRandomContext rng;
|
|
326
|
+
const auto tmp = dir_path / fs::PathFromString(strprintf(".tmp_%d", rng.rand64()));
|
|
327
|
+
|
|
328
|
+
if (const auto created{fsbridge::fopen(tmp, "wbx")}) {
|
|
329
|
+
std::fclose(created);
|
|
330
|
+
std::error_code ec;
|
|
331
|
+
fs::remove(tmp, ec); // clean up, ignore errors
|
|
332
|
+
return true;
|
|
333
|
+
}
|
|
334
|
+
return false;
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
bool IsSymlink(const fs::path& path)
|
|
338
|
+
{
|
|
339
|
+
#ifdef WIN32
|
|
340
|
+
DWORD file_attrs = GetFileAttributesW(path.wstring().c_str());
|
|
341
|
+
if (file_attrs == INVALID_FILE_ATTRIBUTES) {
|
|
342
|
+
throw fs::filesystem_error("Unable to get file attributes", fs::PathToString(path), std::make_error_code(std::errc::invalid_argument));
|
|
343
|
+
}
|
|
344
|
+
return (file_attrs & FILE_ATTRIBUTE_REPARSE_POINT) != 0;
|
|
345
|
+
#else
|
|
346
|
+
return fs::is_symlink(path);
|
|
347
|
+
#endif
|
|
348
|
+
}
|