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
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
|
|
}
|
|
} |