1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#![allow(non_camel_case_types)]

use std::os::fd::RawFd;
use std::ffi::{CStr, OsString};
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 name_vec = libc::malloc(128);
        libc::memset(name_vec, 0, 128);
        let date_vec = libc::malloc(128);
        libc::memset(date_vec, 0, 128);
        let desc_vec = libc::malloc(128);
        libc::memset(desc_vec, 0, 128);
        
        let mut version = native::drm_version { 
            version_major: 0,
            version_minor: 0,
            version_patchlevel: 0,
            name: name_vec as *mut i8,
            date: date_vec as *mut i8,
            desc: desc_vec 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 {
            let name = CStr::from_ptr(version.name).to_str().expect("Failed to convert name");
            let date = CStr::from_ptr(version.date).to_str().expect("Failed to convert date");
            let desc = CStr::from_ptr(version.desc).to_str().expect("Failed to convert desc");
            let drm_version = DrmVersion {
                version_major: version.version_major,
                version_minor: version.version_minor,
                version_patchlevel: version.version_patchlevel,
                name: OsString::from(name.to_string()),
                date: OsString::from(date.to_string()),
                desc: OsString::from(desc.to_string()),
            };
            Some(drm_version)
        } else {None};
        res
    }
}