From eb46575a95d3834c6b178dc4d2dac7dd5db19230 Mon Sep 17 00:00:00 2001 From: Stefan Berger Date: Tue, 4 Apr 2017 12:22:31 -0400 Subject: [PATCH] util: Implement virFileChownFiles() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Implement virFileChownFiles() which changes file ownership of all files in a given directory. Signed-off-by: Stefan Berger Reviewed-by: John Ferlan Reviewed-by: Ján Tomko --- src/libvirt_private.syms | 1 + src/util/virfile.c | 55 ++++++++++++++++++++++++++++++++++++++++ src/util/virfile.h | 3 +++ 3 files changed, 59 insertions(+) diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index 5540391fe8..e2ca00df85 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -1768,6 +1768,7 @@ virFileActivateDirOverride; virFileBindMountDevice; virFileBuildPath; virFileCanonicalizePath; +virFileChownFiles; virFileClose; virFileComparePaths; virFileCopyACLs; diff --git a/src/util/virfile.c b/src/util/virfile.c index a2c4cebb56..e41881f6c9 100644 --- a/src/util/virfile.c +++ b/src/util/virfile.c @@ -2980,6 +2980,61 @@ void virDirClose(DIR **dirp) *dirp = NULL; } + +/* + * virFileChownFiles: + * @name: name of the directory + * @uid: uid + * @gid: gid + * + * Change ownership of all regular files in a directory. + * + * Returns -1 on error, with error already reported, 0 on success. + */ +int virFileChownFiles(const char *name, + uid_t uid, + gid_t gid) +{ + struct dirent *ent; + int ret = -1; + int direrr; + DIR *dir; + char *path = NULL; + + if (virDirOpen(&dir, name) < 0) + return -1; + + while ((direrr = virDirRead(dir, &ent, name)) > 0) { + if (ent->d_type != DT_REG) + continue; + + if (virAsprintf(&path, "%s/%s", name, ent->d_name) < 0) + goto cleanup; + + if (chown(path, uid, gid) < 0) { + virReportSystemError(errno, + _("cannot chown '%s' to (%u, %u)"), + ent->d_name, (unsigned int) uid, + (unsigned int) gid); + goto cleanup; + } + VIR_FREE(path); + } + + if (direrr < 0) + goto cleanup; + + ret = 0; + + cleanup: + VIR_FREE(path); + + virDirClose(&dir); + + return ret; +} + + static int virFileMakePathHelper(char *path, mode_t mode) { diff --git a/src/util/virfile.h b/src/util/virfile.h index 6b0cbad4d1..c7a32c30a8 100644 --- a/src/util/virfile.h +++ b/src/util/virfile.h @@ -238,6 +238,9 @@ int virFileOpenAs(const char *path, int openflags, mode_t mode, ATTRIBUTE_NONNULL(1) ATTRIBUTE_RETURN_CHECK; int virFileRemove(const char *path, uid_t uid, gid_t gid); +int virFileChownFiles(const char *name, uid_t uid, gid_t gid) + ATTRIBUTE_NONNULL(1) ATTRIBUTE_RETURN_CHECK; + enum { VIR_DIR_CREATE_NONE = 0, VIR_DIR_CREATE_AS_UID = (1 << 0),