openvmm_helpers/
shared_memory.rs1use anyhow::Context;
7use openvmm_defs::worker::SharedMemoryFd;
8
9pub fn open_memory_backing_file(
15 path: &std::path::Path,
16 size: u64,
17) -> anyhow::Result<SharedMemoryFd> {
18 let file = fs_err::OpenOptions::new()
19 .read(true)
20 .write(true)
21 .create(true)
22 .truncate(false)
23 .open(path)?;
24
25 let existing_len = file.metadata()?.len();
26 if existing_len == 0 {
27 file.set_len(size)
28 .context("failed to set memory backing file size")?;
29 } else if existing_len != size {
30 anyhow::bail!(
31 "memory backing file {} has size {} bytes, expected {} bytes",
32 path.display(),
33 existing_len,
34 size,
35 );
36 }
37
38 file_to_shared_memory_fd(file.into())
39}
40
41pub fn file_to_shared_memory_fd(file: std::fs::File) -> anyhow::Result<SharedMemoryFd> {
43 #[cfg(unix)]
44 {
45 use std::os::unix::io::OwnedFd;
46 Ok(OwnedFd::from(file))
47 }
48 #[cfg(windows)]
49 {
50 Ok(sparse_mmap::new_mappable_from_file(&file, true, false)?)
53 }
54}