> > Ah, that is the problem. Yes, DT_CHR is an non-posix optimization which > > allows to get the file type directly, without another round-trip to the > > kernel. If that isn't available you can stat() the file and check > > ((st_mode & S_IFMT) == S_IFCHR) instead. > > Even when d_type and DT_CHR is available, there are filesystems where the > Linux kernel reports d_type of DT_UNKNOWN, and where you are best having > that code also falling back to an fstat().
Given this isn't perforance critical at all it is probably simplest to avoid non-portable d_type altogether and just to the fstat unconditionally. David, does that work for haiku? take care, Gerd diff --git a/util/drm.c b/util/drm.c index a23ff2453826..a1d3520d00f2 100644 --- a/util/drm.c +++ b/util/drm.c @@ -24,6 +24,7 @@ int qemu_drm_rendernode_open(const char *rendernode) { DIR *dir; struct dirent *e; + struct stat st; int r, fd; char *p; @@ -38,10 +39,6 @@ int qemu_drm_rendernode_open(const char *rendernode) fd = -1; while ((e = readdir(dir))) { - if (e->d_type != DT_CHR) { - continue; - } - if (strncmp(e->d_name, "renderD", 7)) { continue; } @@ -53,6 +50,12 @@ int qemu_drm_rendernode_open(const char *rendernode) g_free(p); continue; } + fstat(r, &st); + if ((st.st_mode & S_IFMT) != S_IFCHR) { + close(r); + g_free(p); + continue; + } fd = r; g_free(p); break;