122 lines
2.6 KiB
Rust
122 lines
2.6 KiB
Rust
// SPDX-License-Identifier: MPL-2.0
|
|
|
|
use core::time::Duration;
|
|
|
|
pub(super) use self::{
|
|
builder::{ProcDirBuilder, ProcFileBuilder, ProcSymBuilder},
|
|
dir::{lookup_child_from_table, populate_children_from_table, DirOps, ProcDir},
|
|
file::{FileOps, ProcFile},
|
|
sym::{ProcSym, SymOps},
|
|
};
|
|
use super::{ProcFs, BLOCK_SIZE};
|
|
use crate::{
|
|
fs::{
|
|
notify::FsEventPublisher,
|
|
utils::{FileSystem, InodeMode, InodeType, Metadata},
|
|
},
|
|
prelude::*,
|
|
process::{Gid, Uid},
|
|
};
|
|
|
|
mod builder;
|
|
mod dir;
|
|
mod file;
|
|
mod sym;
|
|
|
|
struct Common {
|
|
metadata: RwLock<Metadata>,
|
|
fs_event_publisher: FsEventPublisher,
|
|
fs: Weak<dyn FileSystem>,
|
|
is_volatile: bool,
|
|
}
|
|
|
|
impl Common {
|
|
pub fn new(metadata: Metadata, fs: Weak<dyn FileSystem>, is_volatile: bool) -> Self {
|
|
Self {
|
|
metadata: RwLock::new(metadata),
|
|
fs_event_publisher: FsEventPublisher::new(),
|
|
fs,
|
|
is_volatile,
|
|
}
|
|
}
|
|
|
|
pub fn fs(&self) -> Arc<dyn FileSystem> {
|
|
self.fs.upgrade().unwrap()
|
|
}
|
|
|
|
pub fn metadata(&self) -> Metadata {
|
|
*self.metadata.read()
|
|
}
|
|
|
|
pub fn ino(&self) -> u64 {
|
|
self.metadata.read().ino
|
|
}
|
|
|
|
pub fn type_(&self) -> InodeType {
|
|
self.metadata.read().type_
|
|
}
|
|
|
|
pub fn size(&self) -> usize {
|
|
self.metadata.read().size
|
|
}
|
|
|
|
pub fn atime(&self) -> Duration {
|
|
self.metadata.read().atime
|
|
}
|
|
|
|
pub fn set_atime(&self, time: Duration) {
|
|
self.metadata.write().atime = time;
|
|
}
|
|
|
|
pub fn mtime(&self) -> Duration {
|
|
self.metadata.read().mtime
|
|
}
|
|
|
|
pub fn set_mtime(&self, time: Duration) {
|
|
self.metadata.write().mtime = time;
|
|
}
|
|
|
|
pub fn ctime(&self) -> Duration {
|
|
self.metadata.read().ctime
|
|
}
|
|
|
|
pub fn set_ctime(&self, time: Duration) {
|
|
self.metadata.write().ctime = time;
|
|
}
|
|
|
|
pub fn mode(&self) -> Result<InodeMode> {
|
|
Ok(self.metadata.read().mode)
|
|
}
|
|
|
|
pub fn set_mode(&self, mode: InodeMode) -> Result<()> {
|
|
self.metadata.write().mode = mode;
|
|
Ok(())
|
|
}
|
|
|
|
pub fn owner(&self) -> Result<Uid> {
|
|
Ok(self.metadata.read().uid)
|
|
}
|
|
|
|
pub fn set_owner(&self, uid: Uid) -> Result<()> {
|
|
self.metadata.write().uid = uid;
|
|
Ok(())
|
|
}
|
|
|
|
pub fn group(&self) -> Result<Gid> {
|
|
Ok(self.metadata.read().gid)
|
|
}
|
|
|
|
pub fn set_group(&self, gid: Gid) -> Result<()> {
|
|
self.metadata.write().gid = gid;
|
|
Ok(())
|
|
}
|
|
|
|
pub fn is_volatile(&self) -> bool {
|
|
self.is_volatile
|
|
}
|
|
|
|
pub fn fs_event_publisher(&self) -> &FsEventPublisher {
|
|
&self.fs_event_publisher
|
|
}
|
|
}
|