2728. status(p).permissions() and symlink_status(p).permissions() are not specified

Section: 30.11.14.35 [fs.op.status], 30.11.14.37 [fs.op.symlink_status] Status: C++17 Submitter: Eric Fiselier Opened: 2016-06-19 Last modified: 2017-07-30

Priority: 0

View all other issues in [fs.op.status].

View all issues with C++17 status.

Discussion:

The current specification for status(p) and symlink_status(p) omits any mention on setting permissions() on the returned file_status. Obviously they should be set, but as currently specified the permissions() will always be perms::unknown.

[2016-06, Oulu]

2720 is a related issue.

[2016-06 Oulu]

Moved to P0/Ready during issues prioritization.

Friday: status to Immediate

Proposed resolution:

This wording is relative to N4594.

  1. Change 30.11.14.35 [fs.op.status] as indicated:

    file_status status(const path& p, error_code& ec) noexcept;
    

    -4- Effects: If possible, determines the attributes of the file p resolves to, as if by POSIX stat().using POSIX stat() to obtain a POSIX struct stat.. […]

    -?- Let prms denote the result of (m & perms::mask), where m is determined as if by converting the st_mode member of the obtained struct stat to the type perms.

    -5- Returns:

    • If ec != error_code():

      • […]

    • Otherwise

      • If the attributes indicate a regular file, as if by POSIX S_ISREG, returns file_status(file_type::regular, prms). […]

      • Otherwise, if the attributes indicate a directory, as if by POSIX S_ISDIR, returns file_status(file_type::directory, prms). […]

      • Otherwise, if the attributes indicate a block special file, as if by POSIX S_ISBLK, returns file_status(file_type::block, prms).

      • Otherwise, if the attributes indicate a character special file, as if by POSIX S_ISCHR, returns file_status(file_type::character, prms).

      • Otherwise, if the attributes indicate a fifo or pipe file, as if by POSIX S_ISFIFO, returns file_status(file_type::fifo, prms).

      • Otherwise, if the attributes indicate a socket, as if by POSIX S_ISSOCK, returns file_status(file_type::socket, prms).

      • Otherwise, returns file_status(file_type::unknown, prms).

  2. Change 30.11.14.37 [fs.op.symlink_status] as indicated:

    file_status symlink_status(const path& p);
    file_status symlink_status(const path& p, error_code& ec) noexcept;
    

    -1- Effects: Same as status(), above, except that the attributes of p are determined as if by POSIX lstat() using POSIX lstat() to obtain a POSIX struct stat.

    -?- Let prms denote the result of (m & perms::mask), where m is determined as if by converting the st_mode member of the obtained struct stat to the type perms.

    -2- Returns: Same as status(), above, except that if the attributes indicate a symbolic link, as if by POSIX S_ISLNK, returns file_status(file_type::symlink, prms). The signature with argument ec returns file_status(file_type::none) if an error occurs.