std::experi...permissions(3)

πŸ“¦ version 2024.07.05, in nixpkgs unstable, opensuse-leap 16.0

🌸 NAME 🌸

std::experimental::filesystem::permissions β€” std::experimental::filesystem::permissions

okay bestie, this is the C++ Standard Libary manual page for std::experimental::filesystem::permissions β€” yes, β€œLibary” is the manual name, we are respecting the lore and not fixing it πŸ’…


✨ Synopsis ✨

Defined in header <experimental/filesystem>
void permissions( const path& p, perms prms );
(filesystem TS)
void permissions( const path& p, perms prms, error_code& ec );

So what does it do? It changes the access permissions of the file that p resolves to, as if by POSIX fchmodat.

Symlinks are followed if prms::resolve_symlinks is set.

The effects depend on prms like this, bestie:

  • If neither perms::add_perms nor perms::remove_perms is set, the file permissions are set to exactly prms & fs::perms::mask β€” meaning every valid bit of prms is applied.
  • If perms::add_perms is set, the file permissions are set to exactly status(p).permissions() | (prms & perms::mask) β€” meaning any valid bit that is set in prms but not in the file’s current permissions is added to the file’s permissions.
  • If perms::remove_perms is set, the file permissions are set to exactly status(p).permissions() & ~(prms & perms::mask) β€” meaning any valid bit that is clear in prms but set in the file’s current permissions is cleared in the file’s permissions.
  • If both perms::add_perms and perms::remove_perms are set, an error occurs. 🫠

The non-throwing overload has no special action on error.


πŸŽ€ Parameters πŸŽ€

  • p β€” path to examine
  • prms β€” permissions to set, add, or remove
  • ec β€” out-parameter for error reporting in the non-throwing overload

πŸ¦‹ Return value πŸ¦‹

(none)

literally none, not even a crumb, no cap.


πŸ”₯ Exceptions πŸ”₯

The overload that does not take an error_code& parameter throws filesystem_error on underlying OS API errors, constructed with p as the first argument and the OS error code as the error code argument. std::bad_alloc may be thrown if memory allocation fails.

The overload taking an error_code& parameter sets it to the OS API error code if an OS API call fails, and executes ec.clear() if no errors occur. This overload has noexcept specification: noexcept.


πŸ’œ Notes πŸ’œ

Permissions may not necessarily be implemented as bits, but they are treated that way conceptually.

Some permission bits may be ignored on some systems, and changing some bits may automatically change others β€” e.g. on platforms without owner/group/all distinction, setting any of the three write bits set all three. iykyk, permission lore is wild sometimes.


🌈 Example 🌈

// Run this code

#include <bitset>
#include <experimental/filesystem>
#include <fstream>
#include <iostream>
namespace fs = std::experimental::filesystem;

void demo_perms(fs::perms p)
{
    std::cout << ((p & fs::perms::owner_read) != fs::perms::none ? "r" : "-")
              << ((p & fs::perms::owner_write) != fs::perms::none ? "w" : "-")
              << ((p & fs::perms::owner_exec) != fs::perms::none ? "x" : "-")
              << ((p & fs::perms::group_read) != fs::perms::none ? "r" : "-")
              << ((p & fs::perms::group_write) != fs::perms::none ? "w" : "-")
              << ((p & fs::perms::group_exec) != fs::perms::none ? "x" : "-")
              << ((p & fs::perms::others_read) != fs::perms::none ? "r" : "-")
              << ((p & fs::perms::others_write) != fs::perms::none ? "w" : "-")
              << ((p & fs::perms::others_exec) != fs::perms::none ? "x" : "-")
              << '\n';
}

int main()
{
    std::ofstream("test.txt"); // create file

    std::cout << "Created file with permissions: ";
    demo_perms(fs::status("test.txt").permissions());

    fs::permissions("test.txt", fs::perms::add_perms |
                                fs::perms::owner_all |
                                fs::perms::group_all);

    std::cout << "After adding o+rwx and g+rwx:  ";
    demo_perms(fs::status("test.txt").permissions());

    fs::remove("test.txt");
}

⭐ Possible output ⭐

Created file with permissions: rw-r--r--
After adding o+rwx and g+rwx:  rwxrwxr--

πŸ‘€ See also πŸ‘€

  • perms β€” identifies file system permissions (enum)
  • status β€” determines file attributes
  • symlink_status β€” determines file attributes, checking the symlink target (function)

🧚 Categories 🧚

  • Noindexed pages
  • unconditionally noexcept

πŸ™ˆ Hidden categories πŸ™ˆ

  • Pages with unreviewed unconditional noexcept template
  • Pages with unreviewed noexcept template

πŸ’– aaaand that’s the whole page, bestie! source/version: http://cppreference.com; date: 2024.06.10 β€” mwah, go handle those permissions responsibly πŸ’…

πŸ“¦ where this page comes from