1#![expect(unsafe_code)]
8
9use std::ffi::CString;
10
11pub fn handle_mount(request: pipette_protocol::MountRequest) -> anyhow::Result<()> {
12 tracing::debug!(
13 source = request.source,
14 target = request.target,
15 fstype = request.fstype,
16 flags = request.flags,
17 "mount request"
18 );
19
20 if request.mkdir_target {
21 std::fs::create_dir_all(&request.target)?;
22 }
23
24 let source = CString::new(request.source)?;
25 let target = CString::new(request.target)?;
26 let fstype = CString::new(request.fstype)?;
27
28 let ret = unsafe {
30 libc::mount(
31 source.as_ptr(),
32 target.as_ptr(),
33 fstype.as_ptr(),
34 request.flags,
35 std::ptr::null(),
36 )
37 };
38
39 if ret != 0 {
40 anyhow::bail!("mount failed: {}", std::io::Error::last_os_error());
41 }
42
43 Ok(())
44}