Struct cap_primitives::fs::Permissions
source · pub struct Permissions { /* private fields */ }
Expand description
Representation of the various permissions on a file.
This corresponds to std::fs::Permissions
.
We need to define our own version because the libstd `Permissions` doesn't
have a public constructor that we can use.
Implementations§
source§impl Permissions
impl Permissions
sourcepub fn from_std(std: Permissions) -> Self
pub fn from_std(std: Permissions) -> Self
Constructs a new instance of Self
from the given
std::fs::Permissions
.
sourcepub fn into_std(self, file: &File) -> Result<Permissions>
pub fn into_std(self, file: &File) -> Result<Permissions>
Consumes self
and produces a new instance of std::fs::Permissions
.
The `file` parameter works around the fact that we can't construct a
`Permissions` object ourselves on Windows.
Examples found in repository?
src/rustix/linux/fs/set_permissions_impl.rs (line 13)
8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
pub(crate) fn set_permissions_impl(
start: &fs::File,
path: &Path,
perm: Permissions,
) -> io::Result<()> {
let std_perm = perm.into_std(start)?;
// First try using `O_PATH` and doing a chmod on `/proc/self/fd/{}`
// (`fchmod` doesn't work on `O_PATH` file descriptors).
//
// This may fail, due to older Linux versions not supporting `O_PATH`, or
// due to procfs being unavailable, but if it does work, go with it, as
// `O_PATH` tells Linux that we don't actually need to read or write the
// file, which may avoid side effects associated with opening device files.
let result = set_permissions_through_proc_self_fd(start, path, std_perm.clone());
if let Ok(()) = result {
return Ok(());
}
// Then try `fchmod` with a normal handle. Normal handles need some kind of
// access, so first try read.
match open(start, path, OpenOptions::new().read(true)) {
Ok(file) => return set_file_permissions(&file, std_perm),
Err(err) => match rustix::io::Errno::from_io_error(&err) {
Some(rustix::io::Errno::ACCESS) => (),
_ => return Err(err),
},
}
// Next try write.
match open(start, path, OpenOptions::new().write(true)) {
Ok(file) => return set_file_permissions(&file, std_perm),
Err(err) => match rustix::io::Errno::from_io_error(&err) {
Some(rustix::io::Errno::ACCESS) | Some(rustix::io::Errno::ISDIR) => (),
_ => return Err(err),
},
}
// Nothing worked, so just return the original error.
result
}
sourcepub const fn readonly(&self) -> bool
pub const fn readonly(&self) -> bool
Returns true
if these permissions describe a readonly (unwritable)
file.
This corresponds to std::fs::Permissions::readonly
.
sourcepub fn set_readonly(&mut self, readonly: bool)
pub fn set_readonly(&mut self, readonly: bool)
Modifies the readonly flag for this set of permissions.
This corresponds to std::fs::Permissions::set_readonly
.
Trait Implementations§
source§impl Clone for Permissions
impl Clone for Permissions
source§fn clone(&self) -> Permissions
fn clone(&self) -> Permissions
Returns a copy of the value. Read more
1.0.0 · source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
Performs copy-assignment from
source
. Read moresource§impl Debug for Permissions
impl Debug for Permissions
source§impl PartialEq<Permissions> for Permissions
impl PartialEq<Permissions> for Permissions
source§fn eq(&self, other: &Permissions) -> bool
fn eq(&self, other: &Permissions) -> bool
This method tests for
self
and other
values to be equal, and is used
by ==
.