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}