#![deny(warnings)]
#![deny(missing_docs)]
extern crate libc;
use std::ffi::CString;
use std::io;
mod ffi;
pub const ZONENAME_MAX: usize = 64;
pub fn getzoneid() -> io::Result<i32> {
let zoneid = unsafe { ffi::getzoneid() };
match zoneid {
-1 => Err(io::Error::last_os_error()),
_ => Ok(zoneid),
}
}
pub fn getzoneidbyname(zonename: &str) -> io::Result<i32> {
let c_zonename = CString::new(zonename)?;
let zoneid = unsafe { ffi::getzoneidbyname(c_zonename.as_ptr()) };
match zoneid {
-1 => Err(io::Error::last_os_error()),
_ => Ok(zoneid),
}
}
pub fn getzonenamebyid(id: i32) -> io::Result<String> {
let c_string = CString::new(" ".repeat(ZONENAME_MAX)).unwrap();
let ptr = c_string.into_raw();
let len = unsafe { ffi::getzonenamebyid(id, ptr, ZONENAME_MAX) };
if len < 0 {
return Err(io::Error::last_os_error());
}
assert!(len >= 0);
let cstring = unsafe {
CString::from_raw(ptr)
.into_string()
.expect("found invalid UTF-8 converting from CString to String")
};
Ok(cstring)
}
pub fn getzonename() -> io::Result<String> {
let id = getzoneid()?;
getzonenamebyid(id)
}