1 use drm_ffi as ffi;
2 
3 use std::fs::{File, OpenOptions};
4 use std::os::unix::io::{AsFd, BorrowedFd};
5 
6 #[derive(Debug)]
7 // This is our customized struct that implements the traits in drm.
8 struct Card(File);
9 
10 // Need to implement AsRawFd before we can implement drm::Device
11 impl AsFd for Card {
as_fd(&self) -> BorrowedFd<'_>12     fn as_fd(&self) -> BorrowedFd<'_> {
13         self.0.as_fd()
14     }
15 }
16 
17 impl Card {
open(path: &str) -> Self18     fn open(path: &str) -> Self {
19         let mut options = OpenOptions::new();
20         options.read(true);
21         options.write(true);
22         Card(options.open(path).unwrap())
23     }
24 
open_global() -> Self25     fn open_global() -> Self {
26         Self::open("/dev/dri/card0")
27     }
28 }
29 
print_busid(fd: BorrowedFd<'_>)30 fn print_busid(fd: BorrowedFd<'_>) {
31     let mut buffer = Vec::new();
32     let busid = ffi::get_bus_id(fd, Some(&mut buffer));
33     println!("{:#?}", busid);
34 }
35 
print_client(fd: BorrowedFd<'_>)36 fn print_client(fd: BorrowedFd<'_>) {
37     let client = ffi::get_client(fd, 0);
38     println!("{:#?}", client);
39 }
40 
print_version(fd: BorrowedFd<'_>)41 fn print_version(fd: BorrowedFd<'_>) {
42     let mut name = Vec::new();
43     let mut date = Vec::new();
44     let mut desc = Vec::new();
45 
46     let version = ffi::get_version(fd, Some(&mut name), Some(&mut date), Some(&mut desc));
47 
48     println!("{:#?}", version);
49 }
50 
print_capabilities(fd: BorrowedFd<'_>)51 fn print_capabilities(fd: BorrowedFd<'_>) {
52     for cty in 1.. {
53         let cap = ffi::get_capability(fd, cty);
54         match cap {
55             Ok(_) => println!("{:#?}", cap),
56             Err(_) => break,
57         }
58     }
59 }
60 
print_token(fd: BorrowedFd<'_>)61 fn print_token(fd: BorrowedFd<'_>) {
62     let token = ffi::auth::get_magic_token(fd);
63     println!("{:#?}", token);
64 }
65 
main()66 fn main() {
67     let card = Card::open_global();
68     let fd = card.as_fd();
69 
70     print_busid(fd);
71     print_client(fd);
72     print_version(fd);
73     print_capabilities(fd);
74     print_token(fd);
75     //print_stats(fd);
76 }
77