1 //! Linux `mount`.
2 
3 use crate::backend::mount::types::{
4     InternalMountFlags, MountFlags, MountFlagsArg, MountPropagationFlags, UnmountFlags,
5 };
6 use crate::{backend, io, path};
7 
8 /// `mount(source, target, filesystemtype, mountflags, data)`
9 ///
10 /// # References
11 ///  - [Linux]
12 ///
13 /// [Linux]: https://man7.org/linux/man-pages/man2/mount.2.html
14 #[inline]
mount<Source: path::Arg, Target: path::Arg, Fs: path::Arg, Data: path::Arg>( source: Source, target: Target, file_system_type: Fs, flags: MountFlags, data: Data, ) -> io::Result<()>15 pub fn mount<Source: path::Arg, Target: path::Arg, Fs: path::Arg, Data: path::Arg>(
16     source: Source,
17     target: Target,
18     file_system_type: Fs,
19     flags: MountFlags,
20     data: Data,
21 ) -> io::Result<()> {
22     source.into_with_c_str(|source| {
23         target.into_with_c_str(|target| {
24             file_system_type.into_with_c_str(|file_system_type| {
25                 data.into_with_c_str(|data| {
26                     backend::mount::syscalls::mount(
27                         Some(source),
28                         target,
29                         Some(file_system_type),
30                         MountFlagsArg(flags.bits()),
31                         Some(data),
32                     )
33                 })
34             })
35         })
36     })
37 }
38 
39 /// `mount(NULL, target, NULL, MS_REMOUNT | mountflags, data)`
40 ///
41 /// # References
42 ///  - [Linux]
43 ///
44 /// [Linux]: https://man7.org/linux/man-pages/man2/mount.2.html
45 #[inline]
46 #[doc(alias = "mount")]
47 #[doc(alias = "MS_REMOUNT")]
mount_remount<Target: path::Arg, Data: path::Arg>( target: Target, flags: MountFlags, data: Data, ) -> io::Result<()>48 pub fn mount_remount<Target: path::Arg, Data: path::Arg>(
49     target: Target,
50     flags: MountFlags,
51     data: Data,
52 ) -> io::Result<()> {
53     target.into_with_c_str(|target| {
54         data.into_with_c_str(|data| {
55             backend::mount::syscalls::mount(
56                 None,
57                 target,
58                 None,
59                 MountFlagsArg(InternalMountFlags::REMOUNT.bits() | flags.bits()),
60                 Some(data),
61             )
62         })
63     })
64 }
65 
66 /// `mount(source, target, NULL, MS_BIND, NULL)`
67 ///
68 /// # References
69 ///  - [Linux]
70 ///
71 /// [Linux]: https://man7.org/linux/man-pages/man2/mount.2.html
72 #[inline]
73 #[doc(alias = "mount")]
74 #[doc(alias = "MS_BIND")]
mount_bind<Source: path::Arg, Target: path::Arg>( source: Source, target: Target, ) -> io::Result<()>75 pub fn mount_bind<Source: path::Arg, Target: path::Arg>(
76     source: Source,
77     target: Target,
78 ) -> io::Result<()> {
79     source.into_with_c_str(|source| {
80         target.into_with_c_str(|target| {
81             backend::mount::syscalls::mount(
82                 Some(source),
83                 target,
84                 None,
85                 MountFlagsArg(MountFlags::BIND.bits()),
86                 None,
87             )
88         })
89     })
90 }
91 
92 /// `mount(source, target, NULL, MS_BIND | MS_REC, NULL)`
93 ///
94 /// # References
95 ///  - [Linux]
96 ///
97 /// [Linux]: https://man7.org/linux/man-pages/man2/mount.2.html
98 #[inline]
99 #[doc(alias = "mount")]
100 #[doc(alias = "MS_REC")]
mount_recursive_bind<Source: path::Arg, Target: path::Arg>( source: Source, target: Target, ) -> io::Result<()>101 pub fn mount_recursive_bind<Source: path::Arg, Target: path::Arg>(
102     source: Source,
103     target: Target,
104 ) -> io::Result<()> {
105     source.into_with_c_str(|source| {
106         target.into_with_c_str(|target| {
107             backend::mount::syscalls::mount(
108                 Some(source),
109                 target,
110                 None,
111                 MountFlagsArg(MountFlags::BIND.bits() | MountPropagationFlags::REC.bits()),
112                 None,
113             )
114         })
115     })
116 }
117 
118 /// `mount(NULL, target, NULL, mountflags, NULL)`
119 ///
120 /// # References
121 ///  - [Linux]
122 ///
123 /// [Linux]: https://man7.org/linux/man-pages/man2/mount.2.html
124 #[inline]
125 #[doc(alias = "mount")]
mount_change<Target: path::Arg>( target: Target, flags: MountPropagationFlags, ) -> io::Result<()>126 pub fn mount_change<Target: path::Arg>(
127     target: Target,
128     flags: MountPropagationFlags,
129 ) -> io::Result<()> {
130     target.into_with_c_str(|target| {
131         backend::mount::syscalls::mount(None, target, None, MountFlagsArg(flags.bits()), None)
132     })
133 }
134 
135 /// `mount(source, target, NULL, MS_MOVE, NULL)`
136 ///
137 /// This is not the same as the `move_mount` syscall. If you want to use that,
138 /// use [`move_mount`] instead.
139 ///
140 /// # References
141 ///  - [Linux]
142 ///
143 /// [`move_mount`]: crate::mount::move_mount
144 /// [Linux]: https://man7.org/linux/man-pages/man2/mount.2.html
145 #[inline]
146 #[doc(alias = "mount")]
147 #[doc(alias = "MS_MOVE")]
mount_move<Source: path::Arg, Target: path::Arg>( source: Source, target: Target, ) -> io::Result<()>148 pub fn mount_move<Source: path::Arg, Target: path::Arg>(
149     source: Source,
150     target: Target,
151 ) -> io::Result<()> {
152     source.into_with_c_str(|source| {
153         target.into_with_c_str(|target| {
154             backend::mount::syscalls::mount(
155                 Some(source),
156                 target,
157                 None,
158                 MountFlagsArg(InternalMountFlags::MOVE.bits()),
159                 None,
160             )
161         })
162     })
163 }
164 
165 /// `umount2(target, flags)`
166 ///
167 /// # References
168 ///  - [Linux]
169 ///
170 /// [Linux]: https://man7.org/linux/man-pages/man2/umount.2.html
171 #[inline]
172 #[doc(alias = "umount", alias = "umount2")]
unmount<Target: path::Arg>(target: Target, flags: UnmountFlags) -> io::Result<()>173 pub fn unmount<Target: path::Arg>(target: Target, flags: UnmountFlags) -> io::Result<()> {
174     target.into_with_c_str(|target| backend::mount::syscalls::unmount(target, flags))
175 }
176