starnix_uapi/
mount_flags.rs1use crate::uapi;
6use atomic_bitflags::atomic_bitflags;
7
8atomic_bitflags! {
9 #[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
10 pub struct MountFlags: u32 {
11 const RDONLY = uapi::MS_RDONLY;
13 const NOEXEC = uapi::MS_NOEXEC;
14 const NOSUID = uapi::MS_NOSUID;
15 const NODEV = uapi::MS_NODEV;
16 const NOATIME = uapi::MS_NOATIME;
17 const NODIRATIME = uapi::MS_NODIRATIME;
18 const RELATIME = uapi::MS_RELATIME;
19 const STRICTATIME = uapi::MS_STRICTATIME;
20
21 const SILENT = uapi::MS_SILENT;
23 const LAZYTIME = uapi::MS_LAZYTIME;
24 const SYNCHRONOUS = uapi::MS_SYNCHRONOUS;
25 const DIRSYNC = uapi::MS_DIRSYNC;
26 const MANDLOCK = uapi::MS_MANDLOCK;
27
28 const REMOUNT = uapi::MS_REMOUNT;
30 const BIND = uapi::MS_BIND;
31 const MOVE = uapi::MS_MOVE;
32 const REC = uapi::MS_REC;
33 const DOWNSTREAM = uapi::MS_SLAVE;
34 const SHARED = uapi::MS_SHARED;
35 const PRIVATE = uapi::MS_PRIVATE;
36
37 const CHANGEABLE_WITH_REMOUNT = MountpointFlags::all().bits() |
41 Self::MANDLOCK.bits() | Self::LAZYTIME.bits() | Self::SYNCHRONOUS.bits();
42 }
43}
44
45atomic_bitflags! {
46 #[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
50 pub struct MountpointFlags: u32 {
51 const RDONLY = MountFlags::RDONLY.bits();
53 const NOEXEC = MountFlags::NOEXEC.bits();
54 const NOSUID = MountFlags::NOSUID.bits();
55 const NODEV = MountFlags::NODEV.bits();
56 const NOATIME = MountFlags::NOATIME.bits();
57 const NODIRATIME = MountFlags::NODIRATIME.bits();
58 const RELATIME = MountFlags::RELATIME.bits();
59
60 const STORED_ON_MOUNT = Self::RDONLY.bits() | Self::NOEXEC.bits() | Self::NOSUID.bits() |
61 Self::NODEV.bits() | Self::NOATIME.bits() | Self::NODIRATIME.bits() | Self::RELATIME.bits();
62
63 const STRICTATIME = MountFlags::STRICTATIME.bits();
65 const REC = MountFlags::REC.bits();
66
67 const ATIME_MODE_FLAGS = Self::NOATIME.bits() | Self::RELATIME.bits() |Self::STRICTATIME.bits();
70 const ATIME_FLAGS = Self::ATIME_MODE_FLAGS.bits() | Self::NODIRATIME.bits();
71 }
72}
73
74impl MountpointFlags {
75 pub fn default_atime_from(&mut self, existing: MountpointFlags) {
81 if !self.intersects(Self::ATIME_FLAGS) {
82 *self |= existing & Self::ATIME_FLAGS;
84 } else if !self.intersects(Self::ATIME_MODE_FLAGS) {
85 *self |= Self::RELATIME;
87 }
88 }
89}
90
91impl From<MountpointFlags> for MountFlags {
92 fn from(flags: MountpointFlags) -> Self {
93 Self::from_bits_retain(flags.bits())
95 }
96}
97
98atomic_bitflags! {
99 #[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
101 pub struct FileSystemFlags: u32 {
102 const RDONLY = MountFlags::RDONLY.bits();
103 const DIRSYNC = MountFlags::DIRSYNC.bits();
104 const LAZYTIME = MountFlags::LAZYTIME.bits();
105 const MANDLOCK = MountFlags::MANDLOCK.bits();
106 const SILENT = MountFlags::SILENT.bits();
107 const SYNCHRONOUS = MountFlags::SYNCHRONOUS.bits();
108 }
109}
110
111impl From<FileSystemFlags> for MountFlags {
112 fn from(flags: FileSystemFlags) -> Self {
113 Self::from_bits_retain(flags.bits())
115 }
116}
117
118impl MountFlags {
119 pub fn mountpoint_flags(&self) -> MountpointFlags {
120 MountpointFlags::from_bits_truncate(self.bits())
121 }
122
123 pub fn file_system_flags(&self) -> FileSystemFlags {
124 FileSystemFlags::from_bits_truncate(self.bits())
125 }
126}
127
128impl std::fmt::Display for MountpointFlags {
129 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
130 MountFlags::from(*self).fmt(f)
131 }
132}
133
134impl std::fmt::Display for FileSystemFlags {
135 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
136 MountFlags::from(*self).fmt(f)
137 }
138}
139
140impl std::fmt::Display for MountFlags {
142 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
143 write!(f, "{}", if self.contains(Self::RDONLY) { "ro" } else { "rw" })?;
145
146 if self.contains(Self::NOEXEC) {
148 write!(f, ",noexec")?;
149 }
150 if self.contains(Self::NOSUID) {
151 write!(f, ",nosuid")?;
152 }
153 if self.contains(Self::NODEV) {
154 write!(f, ",nodev")?
155 }
156 if self.contains(Self::NOATIME) {
157 write!(f, ",noatime")?;
158 }
159 if self.contains(Self::NODIRATIME) {
160 write!(f, ",nodiratime")?;
161 }
162 if self.contains(Self::RELATIME) {
163 write!(f, ",relatime")?;
164 }
165
166 if self.contains(Self::DIRSYNC) {
168 write!(f, ",dirsync")?;
169 }
170 if self.contains(Self::LAZYTIME) {
171 write!(f, ",lazytime")?;
172 }
173 if self.contains(Self::MANDLOCK) {
174 write!(f, ",mand")?;
175 }
176 if self.contains(Self::SYNCHRONOUS) {
178 write!(f, ",sync")?;
179 }
180
181 Ok(())
182 }
183}