Skip to content

Commit 0b823cb

Browse files
kraxelpm215
authored andcommitted
util/drm: make portable by avoiding struct dirent d_type
Given this isn't perforance critical at all lets avoid the non-portable d_type and use fstat instead to check whenever the file is a chardev. Signed-off-by: Gerd Hoffmann <[email protected]> Reported-by: David Carlier <[email protected]> Reviewed-by: Philippe Mathieu-Daudé <[email protected]> Reviewed-by: Peter Maydell <[email protected]> Signed-off-by: Peter Maydell <[email protected]> Message-id: [email protected] Message-id: [email protected] [PMM: fixed comment style; tweaked subject line] Reviewed-by: Peter Maydell <[email protected]> Signed-off-by: Peter Maydell <[email protected]>
1 parent 2b9b9e7 commit 0b823cb

File tree

1 file changed

+14
-5
lines changed

1 file changed

+14
-5
lines changed

util/drm.c

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,8 @@ int qemu_drm_rendernode_open(const char *rendernode)
2424
{
2525
DIR *dir;
2626
struct dirent *e;
27-
int r, fd;
27+
struct stat st;
28+
int r, fd, ret;
2829
char *p;
2930

3031
if (rendernode) {
@@ -38,10 +39,6 @@ int qemu_drm_rendernode_open(const char *rendernode)
3839

3940
fd = -1;
4041
while ((e = readdir(dir))) {
41-
if (e->d_type != DT_CHR) {
42-
continue;
43-
}
44-
4542
if (strncmp(e->d_name, "renderD", 7)) {
4643
continue;
4744
}
@@ -53,6 +50,18 @@ int qemu_drm_rendernode_open(const char *rendernode)
5350
g_free(p);
5451
continue;
5552
}
53+
54+
/*
55+
* prefer fstat() over checking e->d_type == DT_CHR for
56+
* portability reasons
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+
5665
fd = r;
5766
g_free(p);
5867
break;

0 commit comments

Comments
 (0)