You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

62 lines
1.9 KiB

#![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<DrmVersion> {
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
}
}