Crates.io | readable-perms |
lib.rs | readable-perms |
version | 0.1.3 |
source | src |
created_at | 2020-08-05 05:32:06.961939 |
updated_at | 2020-08-05 06:40:21.591822 |
description | More usable UNIX file permissions interface |
homepage | https://git.flanchan.moe/flanchan/readable-perms |
repository | https://git.flanchan.moe/flanchan/readable-perms |
max_upload_size | |
id | 273106 |
size | 110,817 |
Data types for the UNIX file permissions model. Convertable to and from mode_t
.
Crate is designed to give finer and more sane control over mode_t
, so there are multiple ways of using the Permissions
struct.
All the below functions are const fn
on nightly.
let perms = Permissions::from_mask(0o644); // Any value above 0u777 is truncated.
You can add masks with add_mask()
let perms = Permissions::new()
.add_mask(User::Owner, Bit::Read | Bit::Write)
.add_mask(User::Group, Bit::Read);
And remove them with remove_mask()
let perms = Permissions::from_mask(0o777)
.remove_mask(User::Other, Bit::Write | Bit::Execute)
.remove_mask(User::Group, Bit::Write);
You can check which modes are set with has_mask()
.
let perms = Permissions::from_mask(0o754);
assert!(perms.has_mask(User::Owner, Bit::Mask));
assert!(perms.has_mask(User::Group, Bit::Read | Bit::Execute));
assert!(perms.has_mask(User::Other, Bit::Read));
We also derive PartialEq<u32>
, to compare with mode_t
directly.
let perms = Permissions::from_mask(0o644);
assert_eq!(perms, 0o644);
We also define an extension trait on target family unix
that follows std::os::unix::fs::PermissionsExt
.
See ext.rs for details.
use readable_perms::PermissionsExt as UnixPermsExt;
use std::os::unix::fs::PermissionsExt;
fn do_thing(file: &mut std::fs::File)
{
let perms = file.metadata().unwrap().permissions().unix();
println!("Perms are {}", perms);
}
With default feature chmod
enabled, also define extension traits for modifying permissions on types that implement AsRawFd
(like std::fs::File
), and AsRef<Path>
.
use readable_perms::{FChmodExt,ChmodExt};
fn mod_path<P: AsRef<Path>>(path: P)
{
path.chmod(Permissions::from_mask(0o644)).expect("Uh oh")
}
fn mod_file(file: &mut std::fs::File)
{
file.chmod(Permissinos::from_mask(0u777)).expect("Uh oh")
}
On nightly, most functions are const fn
incuring no runtime cost for constant definitions. On stable, not so. Either way, we define a global const
lookup table, so that conversions are as fast as a memory lookup.
Adding and removing the masks is usually 1 or two bitwise operations. TODO: Benchmark these?
Type | Value |
---|---|
Conversions from mode | 159 ns/iter (+/- 15) |
Conversions to mode | 162 ns/iter (+/- 15) |
GPL'd with <3