mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-02-22 03:12:22 +00:00
util: Implement and use virFileIsRegular() rather than d_type
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>
This commit is contained in:
parent
ed29219f21
commit
6d21d9bccb
@ -1796,6 +1796,7 @@ virFileIsDir;
|
||||
virFileIsExecutable;
|
||||
virFileIsLink;
|
||||
virFileIsMountPoint;
|
||||
virFileIsRegular;
|
||||
virFileIsSharedFS;
|
||||
virFileIsSharedFSType;
|
||||
virFileLength;
|
||||
|
@ -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)
|
||||
|
@ -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),
|
||||
|
Loading…
x
Reference in New Issue
Block a user