]> xenbits.xensource.com Git - libvirt.git/commitdiff
util: Implement and use virFileIsRegular() rather than d_type
authorStefan Berger <stefanb@linux.vnet.ibm.com>
Wed, 6 Jun 2018 16:24:12 +0000 (12:24 -0400)
committerStefan Berger <stefanb@linux.vnet.ibm.com>
Wed, 6 Jun 2018 16:51:18 +0000 (12:51 -0400)
The dirent's d_type field is not portable to all platforms. So we have
to use stat() to determine the type of file for the functions that need
to be cross-platform. Fix virFileChownFiles() by calling the new
virFileIsRegular() function.

Signed-off-by: Stefan Berger <stefanb@linux.vnet.ibm.com>
Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
src/libvirt_private.syms
src/util/virfile.c
src/util/virfile.h

index 43bbdef8f1e11b1ac3d5ac46f9947b040fc0347b..b4ab1f36290c6d3e795cdafa1ad5d94a60f02803 100644 (file)
@@ -1796,6 +1796,7 @@ virFileIsDir;
 virFileIsExecutable;
 virFileIsLink;
 virFileIsMountPoint;
+virFileIsRegular;
 virFileIsSharedFS;
 virFileIsSharedFSType;
 virFileLength;
index e41881f6c91b32cb9cf01d3507d54e656dc519fe..12b41a64e030482b4eeba16a95cb78cca29240ac 100644 (file)
@@ -1851,6 +1851,15 @@ virFileIsDir(const char *path)
     return (stat(path, &s) == 0) && S_ISDIR(s.st_mode);
 }
 
+
+bool
+virFileIsRegular(const char *path)
+{
+    struct stat s;
+    return (stat(path, &s) == 0) && S_ISREG(s.st_mode);
+}
+
+
 /**
  * virFileExists: Check for presence of file
  * @path: Path of file to check
@@ -3005,12 +3014,13 @@ int virFileChownFiles(const char *name,
         return -1;
 
     while ((direrr = virDirRead(dir, &ent, name)) > 0) {
-        if (ent->d_type != DT_REG)
-            continue;
-
+        VIR_FREE(path);
         if (virAsprintf(&path, "%s/%s", name, ent->d_name) < 0)
             goto cleanup;
 
+        if (!virFileIsRegular(path))
+            continue;
+
         if (chown(path, uid, gid) < 0) {
             virReportSystemError(errno,
                                  _("cannot chown '%s' to (%u, %u)"),
@@ -3018,7 +3028,6 @@ int virFileChownFiles(const char *name,
                                  (unsigned int) gid);
             goto cleanup;
         }
-        VIR_FREE(path);
     }
 
     if (direrr < 0)
index c7a32c30a829bebda0d7e87bad286a7ee784f8a6..59c14b97a6ac8beca07047836c3e05586c573507 100644 (file)
@@ -194,6 +194,7 @@ off_t virFileLength(const char *path, int fd) ATTRIBUTE_NONNULL(1);
 bool virFileIsDir (const char *file) ATTRIBUTE_NONNULL(1);
 bool virFileExists(const char *file) ATTRIBUTE_NONNULL(1) ATTRIBUTE_NOINLINE;
 bool virFileIsExecutable(const char *file) ATTRIBUTE_NONNULL(1);
+bool virFileIsRegular(const char *file) ATTRIBUTE_NONNULL(1);
 
 enum {
     VIR_FILE_SHFS_NFS = (1 << 0),