#![allow(non_camel_case_types)] use std::os::fd::RawFd; use std::ffi::{CStr, OsString}; use std::os::unix::ffi::OsStringExt; use std::vec; use libc; use super::native; pub mod i915; #[derive(Debug)] pub struct DrmVersion { pub version_major: i32, pub version_minor: i32, pub version_patchlevel: i32, pub name: OsString, pub date: OsString, pub desc: OsString, } pub fn get_drm_version(fd: RawFd) -> Option { unsafe { let mut name_vec = vec![0 as u8; 128]; let mut date_vec = vec![0 as u8; 128]; let mut desc_vec = vec![0 as u8; 128]; let mut version = native::drm_version { version_major: 0, version_minor: 0, version_patchlevel: 0, name: name_vec.as_mut_ptr() as *mut i8, date: date_vec.as_mut_ptr() as *mut i8, desc: desc_vec.as_mut_ptr() as *mut i8, name_len: 128, date_len: 128, desc_len: 128, }; let res_val = libc::ioctl(fd, native::DRM_IOCTL_VERSION, &mut version) == 0; let res = if res_val { name_vec.resize(CStr::from_bytes_until_nul(name_vec.as_slice()).unwrap().to_bytes().len(), 0); date_vec.resize(CStr::from_bytes_until_nul(date_vec.as_slice()).unwrap().to_bytes().len(), 0); desc_vec.resize(CStr::from_bytes_until_nul(desc_vec.as_slice()).unwrap().to_bytes().len(), 0); let name = OsString::from_vec(name_vec); let date = OsString::from_vec(date_vec); let desc = OsString::from_vec(desc_vec); let drm_version = DrmVersion { version_major: version.version_major, version_minor: version.version_minor, version_patchlevel: version.version_patchlevel, name: name, date: date, desc: desc, }; Some(drm_version) } else {None}; res } }