1 | //! linux_raw syscalls supporting `rustix::mount`. |
2 | //! |
3 | //! # Safety |
4 | //! |
5 | //! See the `rustix::backend` module documentation for details. |
6 | #![allow (unsafe_code)] |
7 | #![allow (clippy::undocumented_unsafe_blocks)] |
8 | |
9 | use crate::backend::conv::ret; |
10 | #[cfg (feature = "mount" )] |
11 | use crate::backend::conv::{ret_owned_fd, slice, zero}; |
12 | #[cfg (feature = "mount" )] |
13 | use crate::fd::{BorrowedFd, OwnedFd}; |
14 | use crate::ffi::CStr; |
15 | use crate::io; |
16 | |
17 | #[inline ] |
18 | pub(crate) fn mount( |
19 | source: Option<&CStr>, |
20 | target: &CStr, |
21 | file_system_type: Option<&CStr>, |
22 | flags: super::types::MountFlagsArg, |
23 | data: Option<&CStr>, |
24 | ) -> io::Result<()> { |
25 | unsafe { |
26 | ret(raw:syscall_readonly!( |
27 | __NR_mount, |
28 | source, |
29 | target, |
30 | file_system_type, |
31 | flags, |
32 | data |
33 | )) |
34 | } |
35 | } |
36 | |
37 | #[inline ] |
38 | pub(crate) fn unmount(target: &CStr, flags: super::types::UnmountFlags) -> io::Result<()> { |
39 | unsafe { ret(raw:syscall_readonly!(__NR_umount2, target, flags)) } |
40 | } |
41 | |
42 | #[cfg (feature = "mount" )] |
43 | #[inline ] |
44 | pub(crate) fn fsopen(fs_name: &CStr, flags: super::types::FsOpenFlags) -> io::Result<OwnedFd> { |
45 | unsafe { ret_owned_fd(syscall_readonly!(__NR_fsopen, fs_name, flags)) } |
46 | } |
47 | |
48 | #[cfg (feature = "mount" )] |
49 | #[inline ] |
50 | pub(crate) fn fsmount( |
51 | fs_fd: BorrowedFd<'_>, |
52 | flags: super::types::FsMountFlags, |
53 | attr_flags: super::types::MountAttrFlags, |
54 | ) -> io::Result<()> { |
55 | unsafe { ret(syscall_readonly!(__NR_fsmount, fs_fd, flags, attr_flags)) } |
56 | } |
57 | |
58 | #[cfg (feature = "mount" )] |
59 | #[inline ] |
60 | pub(crate) fn move_mount( |
61 | from_dfd: BorrowedFd<'_>, |
62 | from_pathname: &CStr, |
63 | to_dfd: BorrowedFd<'_>, |
64 | to_pathname: &CStr, |
65 | flags: super::types::MoveMountFlags, |
66 | ) -> io::Result<()> { |
67 | unsafe { |
68 | ret(syscall_readonly!( |
69 | __NR_move_mount, |
70 | from_dfd, |
71 | from_pathname, |
72 | to_dfd, |
73 | to_pathname, |
74 | flags |
75 | )) |
76 | } |
77 | } |
78 | |
79 | #[cfg (feature = "mount" )] |
80 | #[inline ] |
81 | pub(crate) fn open_tree( |
82 | dfd: BorrowedFd<'_>, |
83 | filename: &CStr, |
84 | flags: super::types::OpenTreeFlags, |
85 | ) -> io::Result<OwnedFd> { |
86 | unsafe { ret_owned_fd(syscall_readonly!(__NR_open_tree, dfd, filename, flags)) } |
87 | } |
88 | |
89 | #[cfg (feature = "mount" )] |
90 | #[inline ] |
91 | pub(crate) fn fspick( |
92 | dfd: BorrowedFd<'_>, |
93 | path: &CStr, |
94 | flags: super::types::FsPickFlags, |
95 | ) -> io::Result<OwnedFd> { |
96 | unsafe { ret_owned_fd(syscall_readonly!(__NR_fspick, dfd, path, flags)) } |
97 | } |
98 | |
99 | #[cfg (feature = "mount" )] |
100 | #[inline ] |
101 | pub(crate) fn fsconfig_set_flag(fs_fd: BorrowedFd<'_>, key: &CStr) -> io::Result<()> { |
102 | unsafe { |
103 | ret(syscall_readonly!( |
104 | __NR_fsconfig, |
105 | fs_fd, |
106 | super::types::FsConfigCmd::SetFlag, |
107 | key, |
108 | zero(), |
109 | zero() |
110 | )) |
111 | } |
112 | } |
113 | |
114 | #[cfg (feature = "mount" )] |
115 | #[inline ] |
116 | pub(crate) fn fsconfig_set_string( |
117 | fs_fd: BorrowedFd<'_>, |
118 | key: &CStr, |
119 | value: &CStr, |
120 | ) -> io::Result<()> { |
121 | unsafe { |
122 | ret(syscall_readonly!( |
123 | __NR_fsconfig, |
124 | fs_fd, |
125 | super::types::FsConfigCmd::SetString, |
126 | key, |
127 | value, |
128 | zero() |
129 | )) |
130 | } |
131 | } |
132 | |
133 | #[cfg (feature = "mount" )] |
134 | #[inline ] |
135 | pub(crate) fn fsconfig_set_binary( |
136 | fs_fd: BorrowedFd<'_>, |
137 | key: &CStr, |
138 | value: &[u8], |
139 | ) -> io::Result<()> { |
140 | let (value_addr, value_len) = slice(value); |
141 | unsafe { |
142 | ret(syscall_readonly!( |
143 | __NR_fsconfig, |
144 | fs_fd, |
145 | super::types::FsConfigCmd::SetBinary, |
146 | key, |
147 | value_addr, |
148 | value_len |
149 | )) |
150 | } |
151 | } |
152 | |
153 | #[cfg (feature = "mount" )] |
154 | #[inline ] |
155 | pub(crate) fn fsconfig_set_fd( |
156 | fs_fd: BorrowedFd<'_>, |
157 | key: &CStr, |
158 | fd: BorrowedFd<'_>, |
159 | ) -> io::Result<()> { |
160 | unsafe { |
161 | ret(syscall_readonly!( |
162 | __NR_fsconfig, |
163 | fs_fd, |
164 | super::types::FsConfigCmd::SetFd, |
165 | key, |
166 | zero(), |
167 | fd |
168 | )) |
169 | } |
170 | } |
171 | |
172 | #[cfg (feature = "mount" )] |
173 | #[inline ] |
174 | pub(crate) fn fsconfig_set_path( |
175 | fs_fd: BorrowedFd<'_>, |
176 | key: &CStr, |
177 | path: &CStr, |
178 | fd: BorrowedFd<'_>, |
179 | ) -> io::Result<()> { |
180 | unsafe { |
181 | ret(syscall_readonly!( |
182 | __NR_fsconfig, |
183 | fs_fd, |
184 | super::types::FsConfigCmd::SetPath, |
185 | key, |
186 | path, |
187 | fd |
188 | )) |
189 | } |
190 | } |
191 | |
192 | #[cfg (feature = "mount" )] |
193 | #[inline ] |
194 | pub(crate) fn fsconfig_set_path_empty( |
195 | fs_fd: BorrowedFd<'_>, |
196 | key: &CStr, |
197 | fd: BorrowedFd<'_>, |
198 | ) -> io::Result<()> { |
199 | unsafe { |
200 | ret(syscall_readonly!( |
201 | __NR_fsconfig, |
202 | fs_fd, |
203 | super::types::FsConfigCmd::SetPathEmpty, |
204 | key, |
205 | cstr!("" ), |
206 | fd |
207 | )) |
208 | } |
209 | } |
210 | |
211 | #[cfg (feature = "mount" )] |
212 | #[inline ] |
213 | pub(crate) fn fsconfig_create(fs_fd: BorrowedFd<'_>) -> io::Result<()> { |
214 | unsafe { |
215 | ret(syscall_readonly!( |
216 | __NR_fsconfig, |
217 | fs_fd, |
218 | super::types::FsConfigCmd::Create, |
219 | zero(), |
220 | zero(), |
221 | zero() |
222 | )) |
223 | } |
224 | } |
225 | |
226 | #[cfg (feature = "mount" )] |
227 | #[inline ] |
228 | pub(crate) fn fsconfig_reconfigure(fs_fd: BorrowedFd<'_>) -> io::Result<()> { |
229 | unsafe { |
230 | ret(syscall_readonly!( |
231 | __NR_fsconfig, |
232 | fs_fd, |
233 | super::types::FsConfigCmd::Reconfigure, |
234 | zero(), |
235 | zero(), |
236 | zero() |
237 | )) |
238 | } |
239 | } |
240 | |