|
16 | 16 | #include <fstream>
|
17 | 17 | #include <map>
|
18 | 18 | #include <memory>
|
| 19 | +#include <optional> |
19 | 20 | #include <string>
|
20 | 21 | #include <system_error>
|
21 | 22 | #include <utility>
|
@@ -269,3 +270,42 @@ bool TryCreateDirectories(const fs::path& p)
|
269 | 270 | // create_directories didn't create the directory, it had to have existed already
|
270 | 271 | return false;
|
271 | 272 | }
|
| 273 | + |
| 274 | +std::string PermsToSymbolicString(fs::perms p) |
| 275 | +{ |
| 276 | + std::string perm_str(9, '-'); |
| 277 | + |
| 278 | + auto set_perm = [&](size_t pos, fs::perms required_perm, char letter) { |
| 279 | + if ((p & required_perm) != fs::perms::none) { |
| 280 | + perm_str[pos] = letter; |
| 281 | + } |
| 282 | + }; |
| 283 | + |
| 284 | + set_perm(0, fs::perms::owner_read, 'r'); |
| 285 | + set_perm(1, fs::perms::owner_write, 'w'); |
| 286 | + set_perm(2, fs::perms::owner_exec, 'x'); |
| 287 | + set_perm(3, fs::perms::group_read, 'r'); |
| 288 | + set_perm(4, fs::perms::group_write, 'w'); |
| 289 | + set_perm(5, fs::perms::group_exec, 'x'); |
| 290 | + set_perm(6, fs::perms::others_read, 'r'); |
| 291 | + set_perm(7, fs::perms::others_write, 'w'); |
| 292 | + set_perm(8, fs::perms::others_exec, 'x'); |
| 293 | + |
| 294 | + return perm_str; |
| 295 | +} |
| 296 | + |
| 297 | +std::optional<fs::perms> InterpretPermString(const std::string& s) |
| 298 | +{ |
| 299 | + if (s == "owner") { |
| 300 | + return fs::perms::owner_read | fs::perms::owner_write; |
| 301 | + } else if (s == "group") { |
| 302 | + return fs::perms::owner_read | fs::perms::owner_write | |
| 303 | + fs::perms::group_read; |
| 304 | + } else if (s == "all") { |
| 305 | + return fs::perms::owner_read | fs::perms::owner_write | |
| 306 | + fs::perms::group_read | |
| 307 | + fs::perms::others_read; |
| 308 | + } else { |
| 309 | + return std::nullopt; |
| 310 | + } |
| 311 | +} |
0 commit comments