1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17#include "qemu/osdep.h"
18#include "qemu/drm.h"
19
20#include <glob.h>
21#include <dirent.h>
22
23int qemu_drm_rendernode_open(const char *rendernode)
24{
25 DIR *dir;
26 struct dirent *e;
27 struct stat st;
28 int r, fd, ret;
29 char *p;
30
31 if (rendernode) {
32 return open(rendernode, O_RDWR | O_CLOEXEC | O_NOCTTY | O_NONBLOCK);
33 }
34
35 dir = opendir("/dev/dri");
36 if (!dir) {
37 return -1;
38 }
39
40 fd = -1;
41 while ((e = readdir(dir))) {
42 if (strncmp(e->d_name, "renderD", 7)) {
43 continue;
44 }
45
46 p = g_strdup_printf("/dev/dri/%s", e->d_name);
47
48 r = open(p, O_RDWR | O_CLOEXEC | O_NOCTTY | O_NONBLOCK);
49 if (r < 0) {
50 g_free(p);
51 continue;
52 }
53
54
55
56
57
58 ret = fstat(r, &st);
59 if (ret < 0 || (st.st_mode & S_IFMT) != S_IFCHR) {
60 close(r);
61 g_free(p);
62 continue;
63 }
64
65 fd = r;
66 g_free(p);
67 break;
68 }
69
70 closedir(dir);
71 if (fd < 0) {
72 return -1;
73 }
74 return fd;
75}
76