#[derive(Debug, Clone, Copy)]
pub enum InitError {
Env,
WolfTpm(i32),
}
static SWTPM_INIT_LOCK: std::sync::Mutex<()> = std::sync::Mutex::new(());
pub fn init_swtpm(
host: &std::ffi::CStr,
port: &std::ffi::CStr,
) -> Result<Box<crate::WOLFTPM2_DEV>, InitError> {
let _guard = SWTPM_INIT_LOCK.lock().unwrap();
let rc = unsafe { libc_setenv(b"SWTPM_SERVER_NAME\0".as_ptr(), host.as_ptr()) };
if rc != 0 {
return Err(InitError::Env);
}
let rc = unsafe { libc_setenv(b"SWTPM_SERVER_PORT\0".as_ptr(), port.as_ptr()) };
if rc != 0 {
unsafe { let _ = libc_unsetenv(b"SWTPM_SERVER_NAME\0".as_ptr()); }
return Err(InitError::Env);
}
let mut dev = Box::new(unsafe { std::mem::zeroed::<crate::WOLFTPM2_DEV>() });
let rc = unsafe {
crate::wolfTPM2_Init(dev.as_mut() as *mut _, None, std::ptr::null_mut())
};
unsafe {
let _ = libc_unsetenv(b"SWTPM_SERVER_NAME\0".as_ptr());
let _ = libc_unsetenv(b"SWTPM_SERVER_PORT\0".as_ptr());
}
if rc != 0 {
return Err(InitError::WolfTpm(rc));
}
Ok(dev)
}
unsafe fn libc_setenv(name: *const u8, value: *const std::ffi::c_char) -> std::ffi::c_int {
unsafe { libc::setenv(name as *const _, value, 1) }
}
unsafe fn libc_unsetenv(name: *const u8) -> std::ffi::c_int {
unsafe { libc::unsetenv(name as *const _) }
}