pipette/
mount.rs

1// Copyright (c) Microsoft Corporation.
2// Licensed under the MIT License.
3
4//! Handler for the mount request (Linux only).
5
6// UNSAFETY: Required for libc::mount() syscall.
7#![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    // SAFETY: calling libc::mount with valid C strings and null data pointer.
29    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}