qemu: don't rely on the non-portable d_type field in dirent

d_type is a non-portable extension to the struct dirent and even if it
exists, its value may be DT_UNKNOWN if the filesystem doesn't support
it. This is common with older versions of XFS which have ftype=0
feature.

Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
This commit is contained in:
Daniel P. Berrangé 2019-04-02 13:27:44 +01:00
parent ff376c6283
commit ebe9c6eab7

View File

@ -924,9 +924,7 @@ qemuFirmwareBuildFileList(virHashTablePtr files, const char *dir)
while ((rc = virDirRead(dirp, &ent, dir)) > 0) {
VIR_AUTOFREE(char *) filename = NULL;
VIR_AUTOFREE(char *) path = NULL;
if (ent->d_type != DT_REG && ent->d_type != DT_LNK)
continue;
struct stat sb;
if (STRPREFIX(ent->d_name, "."))
continue;
@ -937,6 +935,14 @@ qemuFirmwareBuildFileList(virHashTablePtr files, const char *dir)
if (virAsprintf(&path, "%s/%s", dir, filename) < 0)
goto cleanup;
if (stat(path, &sb) < 0) {
virReportSystemError(errno, _("Unable to access %s"), path);
goto cleanup;
}
if (!S_ISREG(sb.st_mode) && !S_ISLNK(sb.st_mode))
continue;
if (virHashUpdateEntry(files, filename, path) < 0)
goto cleanup;