Hi Gerd, On 7/1/20 5:15 PM, Gerd Hoffmann wrote: >>> 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);
While preparing the formal patch, can you add a comment here explaining we deliberately use this way for portability (not checking DT_CHR / DT_UNKNOWN ...)? Thanks! > + if ((st.st_mode & S_IFMT) != S_IFCHR) { > + close(r); > + g_free(p); > + continue; > + } > fd = r; > g_free(p); > break; >