mod.rs 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. use crate::kernel::constants::{S_IFBLK, S_IFCHR, S_IFDIR, S_IFLNK, S_IFMT, S_IFREG};
  2. use crate::prelude::*;
  3. use alloc::sync::Arc;
  4. use dentry::Dentry;
  5. use eonix_sync::LazyLock;
  6. use inode::Mode;
  7. pub mod dentry;
  8. pub mod file;
  9. pub mod filearray;
  10. pub mod inode;
  11. pub mod mount;
  12. pub mod vfs;
  13. pub type DevId = u32;
  14. pub fn s_isreg(mode: Mode) -> bool {
  15. (mode & S_IFMT) == S_IFREG
  16. }
  17. pub fn s_isdir(mode: Mode) -> bool {
  18. (mode & S_IFMT) == S_IFDIR
  19. }
  20. pub fn s_ischr(mode: Mode) -> bool {
  21. (mode & S_IFMT) == S_IFCHR
  22. }
  23. pub fn s_isblk(mode: Mode) -> bool {
  24. (mode & S_IFMT) == S_IFBLK
  25. }
  26. pub fn s_islnk(mode: Mode) -> bool {
  27. (mode & S_IFMT) == S_IFLNK
  28. }
  29. pub struct FsContext {
  30. pub fsroot: Arc<Dentry>,
  31. pub cwd: Spin<Arc<Dentry>>,
  32. pub umask: Spin<Mode>,
  33. }
  34. static GLOBAL_FS_CONTEXT: LazyLock<Arc<FsContext>> = LazyLock::new(|| {
  35. Arc::new(FsContext {
  36. fsroot: Dentry::root().clone(),
  37. cwd: Spin::new(Dentry::root().clone()),
  38. umask: Spin::new(0o022),
  39. })
  40. });
  41. impl FsContext {
  42. pub fn global() -> &'static Arc<Self> {
  43. &GLOBAL_FS_CONTEXT
  44. }
  45. pub fn new_cloned(other: &Self) -> Arc<Self> {
  46. Arc::new(Self {
  47. fsroot: other.fsroot.clone(),
  48. cwd: Spin::new(other.cwd.lock().clone()),
  49. umask: Spin::new(other.umask.lock().clone()),
  50. })
  51. }
  52. #[allow(dead_code)]
  53. pub fn new_shared(other: &Arc<Self>) -> Arc<Self> {
  54. other.clone()
  55. }
  56. }