mirror of
https://github.com/RGBCube/uutils-coreutils
synced 2026-01-19 03:31:06 +00:00
38 lines
1.2 KiB
Rust
38 lines
1.2 KiB
Rust
use std::fs;
|
|
use std::path::Path;
|
|
#[cfg(not(windows))]
|
|
use uucore::mode;
|
|
|
|
/// Takes a user-supplied string and tries to parse to u16 mode bitmask.
|
|
pub fn parse(mode_string: &str, considering_dir: bool) -> Result<u32, String> {
|
|
let numbers: &[char] = &['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'];
|
|
|
|
// Passing 000 as the existing permissions seems to mirror GNU behavior.
|
|
if mode_string.contains(numbers) {
|
|
mode::parse_numeric(0, mode_string)
|
|
} else {
|
|
mode::parse_symbolic(0, mode_string, considering_dir)
|
|
}
|
|
}
|
|
|
|
/// chmod a file or directory on UNIX.
|
|
///
|
|
/// Adapted from mkdir.rs. Handles own error printing.
|
|
///
|
|
#[cfg(any(unix, target_os = "redox"))]
|
|
pub fn chmod(path: &Path, mode: u32) -> Result<(), ()> {
|
|
use std::os::unix::fs::PermissionsExt;
|
|
fs::set_permissions(path, fs::Permissions::from_mode(mode)).map_err(|err| {
|
|
show_error!("{}: chmod failed with error {}", path.display(), err);
|
|
})
|
|
}
|
|
|
|
/// chmod a file or directory on Windows.
|
|
///
|
|
/// Adapted from mkdir.rs.
|
|
///
|
|
#[cfg(windows)]
|
|
pub fn chmod(path: &Path, mode: u32) -> Result<(), ()> {
|
|
// chmod on Windows only sets the readonly flag, which isn't even honored on directories
|
|
Ok(())
|
|
}
|