xen/ctrl/
handle.rs

1use xen_sys::{xc_interface, xc_interface_close, xc_interface_open, xentoollog_logger};
2
3use crate::XenError;
4
5#[derive(Debug, Clone)]
6pub struct XenInterfaceHandle(pub(crate) *mut xc_interface);
7
8impl XenInterfaceHandle {
9    pub fn new() -> Result<Self, XenError> {
10        Self::new_with_options(None, None, 0)
11    }
12
13    pub fn new_with_options(
14        logger: Option<&mut xentoollog_logger>,
15        dombuild_logger: Option<&mut xentoollog_logger>,
16        flags: u32,
17    ) -> Result<Self, XenError> {
18        let handle = unsafe {
19            xc_interface_open(
20                logger.map_or_else(std::ptr::null_mut, |p| p as *mut _),
21                dombuild_logger.map_or_else(std::ptr::null_mut, |p| p as *mut _),
22                flags,
23            )
24        };
25
26        if handle.is_null() {
27            return Err(XenError::Other("Failed to open Xen control interface"));
28        }
29
30        Ok(Self(handle))
31    }
32}
33
34impl Drop for XenInterfaceHandle {
35    fn drop(&mut self) {
36        tracing::trace!("closing Xen control interface");
37        unsafe {
38            xc_interface_close(self.0);
39        }
40    }
41}