47 lines
1.1 KiB
Rust
47 lines
1.1 KiB
Rust
use std::{fmt, io, os::fd::RawFd, path::Path};
|
|
|
|
use bitflags::bitflags;
|
|
|
|
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
|
pub enum FileModeUpdate {
|
|
Set(FileMode),
|
|
Modify { set: FileMode, clear: FileMode },
|
|
}
|
|
|
|
bitflags! {
|
|
#[derive(Clone, Copy, PartialEq, Eq)]
|
|
pub struct FileMode: u32 {
|
|
const OTHER_EXEC = 1 << 0;
|
|
const OTHER_WRITE = 1 << 1;
|
|
const OTHER_READ = 1 << 2;
|
|
const GROUP_EXEC = 1 << 3;
|
|
const GROUP_WRITE = 1 << 4;
|
|
const GROUP_READ = 1 << 5;
|
|
const USER_EXEC = 1 << 6;
|
|
const USER_WRITE = 1 << 7;
|
|
const USER_READ = 1 << 8;
|
|
}
|
|
}
|
|
|
|
impl FileMode {
|
|
const MASK: u32 = 0o777;
|
|
}
|
|
|
|
impl From<u32> for FileMode {
|
|
fn from(value: u32) -> Self {
|
|
Self::from_bits_retain(value & Self::MASK)
|
|
}
|
|
}
|
|
|
|
pub use crate::sys::fs::update_file_mode;
|
|
|
|
pub fn set_file_mode<P: AsRef<Path>>(at: Option<RawFd>, path: P, mode: FileMode) -> io::Result<()> {
|
|
update_file_mode(at, path, FileModeUpdate::Set(mode))
|
|
}
|
|
|
|
impl fmt::Debug for FileMode {
|
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
|
write!(f, "{:#03o}", self.bits())
|
|
}
|
|
}
|