1 //! `fsopen` and related functions in Linux's `mount` API.
2 
3 use crate::backend::mount::types::{
4     FsMountFlags, FsOpenFlags, FsPickFlags, MountAttrFlags, MoveMountFlags, OpenTreeFlags,
5 };
6 use crate::fd::{BorrowedFd, OwnedFd};
7 use crate::{backend, io, path};
8 
9 /// `fsopen(fs_name, flags)`
10 ///
11 /// # References
12 ///  - [Unfinished draft]
13 ///
14 /// [Unfinished draft]: https://github.com/sunfishcode/linux-mount-api-documentation/blob/main/fsopen.md
15 #[inline]
fsopen<Fs: path::Arg>(fs_name: Fs, flags: FsOpenFlags) -> io::Result<OwnedFd>16 pub fn fsopen<Fs: path::Arg>(fs_name: Fs, flags: FsOpenFlags) -> io::Result<OwnedFd> {
17     fs_name.into_with_c_str(|fs_name| backend::mount::syscalls::fsopen(fs_name, flags))
18 }
19 
20 /// `fsmount(fs_fd, flags, attr_flags)`
21 ///
22 /// # References
23 ///  - [Unfinished draft]
24 ///
25 /// [Unfinished draft]: https://github.com/sunfishcode/linux-mount-api-documentation/blob/main/fsmount.md
26 #[inline]
fsmount( fs_fd: BorrowedFd<'_>, flags: FsMountFlags, attr_flags: MountAttrFlags, ) -> io::Result<OwnedFd>27 pub fn fsmount(
28     fs_fd: BorrowedFd<'_>,
29     flags: FsMountFlags,
30     attr_flags: MountAttrFlags,
31 ) -> io::Result<OwnedFd> {
32     backend::mount::syscalls::fsmount(fs_fd, flags, attr_flags)
33 }
34 
35 /// `move_mount(from_dfd, from_pathname, to_dfd, to_pathname, flags)`
36 ///
37 /// This is not the same as `mount` with the `MS_MOVE` flag. If you want to
38 /// use that, use [`mount_move`] instead.
39 ///
40 /// # References
41 ///  - [Unfinished draft]
42 ///
43 /// [`mount_move`]: crate::mount::mount_move
44 /// [Unfinished draft]: https://github.com/sunfishcode/linux-mount-api-documentation/blob/main/move_mount.md
45 #[inline]
move_mount<From: path::Arg, To: path::Arg>( from_dfd: BorrowedFd<'_>, from_pathname: From, to_dfd: BorrowedFd<'_>, to_pathname: To, flags: MoveMountFlags, ) -> io::Result<()>46 pub fn move_mount<From: path::Arg, To: path::Arg>(
47     from_dfd: BorrowedFd<'_>,
48     from_pathname: From,
49     to_dfd: BorrowedFd<'_>,
50     to_pathname: To,
51     flags: MoveMountFlags,
52 ) -> io::Result<()> {
53     from_pathname.into_with_c_str(|from_pathname| {
54         to_pathname.into_with_c_str(|to_pathname| {
55             backend::mount::syscalls::move_mount(
56                 from_dfd,
57                 from_pathname,
58                 to_dfd,
59                 to_pathname,
60                 flags,
61             )
62         })
63     })
64 }
65 
66 /// `open_tree(dfd, filename, flags)`
67 ///
68 /// # References
69 ///  - [Unfinished draft]
70 ///
71 /// [Unfinished draft]: https://github.com/sunfishcode/linux-mount-api-documentation/blob/main/open_tree.md
72 #[inline]
open_tree<Path: path::Arg>( dfd: BorrowedFd<'_>, filename: Path, flags: OpenTreeFlags, ) -> io::Result<OwnedFd>73 pub fn open_tree<Path: path::Arg>(
74     dfd: BorrowedFd<'_>,
75     filename: Path,
76     flags: OpenTreeFlags,
77 ) -> io::Result<OwnedFd> {
78     filename.into_with_c_str(|filename| backend::mount::syscalls::open_tree(dfd, filename, flags))
79 }
80 
81 /// `fspick(dfd, path, flags)`
82 ///
83 /// # References
84 ///  - [Unfinished draft]
85 ///
86 /// [Unfinished draft]: https://github.com/sunfishcode/linux-mount-api-documentation/blob/main/fspick.md
87 #[inline]
fspick<Path: path::Arg>( dfd: BorrowedFd<'_>, path: Path, flags: FsPickFlags, ) -> io::Result<OwnedFd>88 pub fn fspick<Path: path::Arg>(
89     dfd: BorrowedFd<'_>,
90     path: Path,
91     flags: FsPickFlags,
92 ) -> io::Result<OwnedFd> {
93     path.into_with_c_str(|path| backend::mount::syscalls::fspick(dfd, path, flags))
94 }
95 
96 /// `fsconfig(fs_fd, FSCONFIG_SET_FLAG, key, NULL, 0)`
97 ///
98 /// # References
99 ///  - [Unfinished draft]
100 ///
101 /// [Unfinished draft]: https://github.com/sunfishcode/linux-mount-api-documentation/blob/main/fsconfig.md
102 #[inline]
103 #[doc(alias = "fsconfig")]
fsconfig_set_flag<Key: path::Arg>(fs_fd: BorrowedFd<'_>, key: Key) -> io::Result<()>104 pub fn fsconfig_set_flag<Key: path::Arg>(fs_fd: BorrowedFd<'_>, key: Key) -> io::Result<()> {
105     key.into_with_c_str(|key| backend::mount::syscalls::fsconfig_set_flag(fs_fd, key))
106 }
107 
108 /// `fsconfig(fs_fd, FSCONFIG_SET_STRING, key, value, 0)`
109 ///
110 /// # References
111 ///  - [Unfinished draft]
112 ///
113 /// [Unfinished draft]: https://github.com/sunfishcode/linux-mount-api-documentation/blob/main/fsconfig.md
114 #[inline]
115 #[doc(alias = "fsconfig")]
fsconfig_set_string<Key: path::Arg, Value: path::Arg>( fs_fd: BorrowedFd<'_>, key: Key, value: Value, ) -> io::Result<()>116 pub fn fsconfig_set_string<Key: path::Arg, Value: path::Arg>(
117     fs_fd: BorrowedFd<'_>,
118     key: Key,
119     value: Value,
120 ) -> io::Result<()> {
121     key.into_with_c_str(|key| {
122         value.into_with_c_str(|value| {
123             backend::mount::syscalls::fsconfig_set_string(fs_fd, key, value)
124         })
125     })
126 }
127 
128 /// `fsconfig(fs_fd, FSCONFIG_SET_BINARY, key, value, value.len())`
129 ///
130 /// # References
131 ///  - [Unfinished draft]
132 ///
133 /// [Unfinished draft]: https://github.com/sunfishcode/linux-mount-api-documentation/blob/main/fsconfig.md
134 #[inline]
135 #[doc(alias = "fsconfig")]
fsconfig_set_binary<Key: path::Arg>( fs_fd: BorrowedFd<'_>, key: Key, value: &[u8], ) -> io::Result<()>136 pub fn fsconfig_set_binary<Key: path::Arg>(
137     fs_fd: BorrowedFd<'_>,
138     key: Key,
139     value: &[u8],
140 ) -> io::Result<()> {
141     key.into_with_c_str(|key| backend::mount::syscalls::fsconfig_set_binary(fs_fd, key, value))
142 }
143 
144 /// `fsconfig(fs_fd, FSCONFIG_SET_PATH, key, path, fd)`
145 ///
146 /// # References
147 ///  - [Unfinished draft]
148 ///
149 /// [Unfinished draft]: https://github.com/sunfishcode/linux-mount-api-documentation/blob/main/fsconfig.md
150 #[inline]
151 #[doc(alias = "fsconfig")]
fsconfig_set_path<Key: path::Arg, Path: path::Arg>( fs_fd: BorrowedFd<'_>, key: Key, path: Path, fd: BorrowedFd<'_>, ) -> io::Result<()>152 pub fn fsconfig_set_path<Key: path::Arg, Path: path::Arg>(
153     fs_fd: BorrowedFd<'_>,
154     key: Key,
155     path: Path,
156     fd: BorrowedFd<'_>,
157 ) -> io::Result<()> {
158     key.into_with_c_str(|key| {
159         path.into_with_c_str(|path| {
160             backend::mount::syscalls::fsconfig_set_path(fs_fd, key, path, fd)
161         })
162     })
163 }
164 
165 /// `fsconfig(fs_fd, FSCONFIG_SET_PATH_EMPTY, key, "", fd)`
166 ///
167 /// # References
168 ///  - [Unfinished draft]
169 ///
170 /// [Unfinished draft]: https://github.com/sunfishcode/linux-mount-api-documentation/blob/main/fsconfig.md
171 #[inline]
172 #[doc(alias = "fsconfig")]
fsconfig_set_path_empty<Key: path::Arg>( fs_fd: BorrowedFd<'_>, key: Key, fd: BorrowedFd<'_>, ) -> io::Result<()>173 pub fn fsconfig_set_path_empty<Key: path::Arg>(
174     fs_fd: BorrowedFd<'_>,
175     key: Key,
176     fd: BorrowedFd<'_>,
177 ) -> io::Result<()> {
178     key.into_with_c_str(|key| backend::mount::syscalls::fsconfig_set_path_empty(fs_fd, key, fd))
179 }
180 
181 /// `fsconfig(fs_fd, FSCONFIG_SET_FD, key, NULL, fd)`
182 ///
183 /// # References
184 ///  - [Unfinished draft]
185 ///
186 /// [Unfinished draft]: https://github.com/sunfishcode/linux-mount-api-documentation/blob/main/fsconfig.md
187 #[inline]
188 #[doc(alias = "fsconfig")]
fsconfig_set_fd<Key: path::Arg>( fs_fd: BorrowedFd<'_>, key: Key, fd: BorrowedFd<'_>, ) -> io::Result<()>189 pub fn fsconfig_set_fd<Key: path::Arg>(
190     fs_fd: BorrowedFd<'_>,
191     key: Key,
192     fd: BorrowedFd<'_>,
193 ) -> io::Result<()> {
194     key.into_with_c_str(|key| backend::mount::syscalls::fsconfig_set_fd(fs_fd, key, fd))
195 }
196 
197 /// `fsconfig(fs_fd, FSCONFIG_CMD_CREATE, key, NULL, 0)`
198 ///
199 /// # References
200 ///  - [Unfinished draft]
201 ///
202 /// [Unfinished draft]: https://github.com/sunfishcode/linux-mount-api-documentation/blob/main/fsconfig.md
203 #[inline]
204 #[doc(alias = "fsconfig")]
fsconfig_create(fs_fd: BorrowedFd<'_>) -> io::Result<()>205 pub fn fsconfig_create(fs_fd: BorrowedFd<'_>) -> io::Result<()> {
206     backend::mount::syscalls::fsconfig_create(fs_fd)
207 }
208 
209 /// `fsconfig(fs_fd, FSCONFIG_CMD_RECONFIGURE, key, NULL, 0)`
210 ///
211 /// # References
212 ///  - [Unfinished draft]
213 ///
214 /// [Unfinished draft]: https://github.com/sunfishcode/linux-mount-api-documentation/blob/main/fsconfig.md
215 #[inline]
216 #[doc(alias = "fsconfig")]
fsconfig_reconfigure(fs_fd: BorrowedFd<'_>) -> io::Result<()>217 pub fn fsconfig_reconfigure(fs_fd: BorrowedFd<'_>) -> io::Result<()> {
218     backend::mount::syscalls::fsconfig_reconfigure(fs_fd)
219 }
220