use std::io;
use std::os::fd::RawFd;
const FUSE_DEV_IOC_MAGIC: u32 = 229;
#[repr(C)]
struct FuseBackingMap {
fd: i32,
flags: u32,
padding: u64,
}
const BACKING_MAP_SIZE: u32 = std::mem::size_of::<FuseBackingMap>() as u32;
const FUSE_DEV_IOC_BACKING_OPEN: libc::c_ulong = 0xC000_0000
| ((BACKING_MAP_SIZE as libc::c_ulong) << 16)
| ((FUSE_DEV_IOC_MAGIC as libc::c_ulong) << 8)
| 1;
const FUSE_DEV_IOC_BACKING_CLOSE: libc::c_ulong = 0x4000_0000
| ((BACKING_MAP_SIZE as libc::c_ulong) << 16)
| ((FUSE_DEV_IOC_MAGIC as libc::c_ulong) << 8)
| 2;
pub fn fuse_backing_open(fuse_dev_fd: RawFd, backing_fd: RawFd) -> io::Result<i32> {
let mut map = FuseBackingMap {
fd: backing_fd,
flags: 0,
padding: 0,
};
let ret = unsafe {
libc::ioctl(
fuse_dev_fd,
FUSE_DEV_IOC_BACKING_OPEN,
&mut map as *mut FuseBackingMap,
)
};
if ret < 0 {
Err(io::Error::last_os_error())
} else {
Ok(ret)
}
}
pub fn fuse_backing_close(fuse_dev_fd: RawFd, backing_id: i32) -> io::Result<()> {
let mut map = FuseBackingMap {
fd: backing_id,
flags: 0,
padding: 0,
};
let ret = unsafe {
libc::ioctl(
fuse_dev_fd,
FUSE_DEV_IOC_BACKING_CLOSE,
&mut map as *mut FuseBackingMap,
)
};
if ret < 0 {
Err(io::Error::last_os_error())
} else {
Ok(())
}
}