On 05/04/2018 04:21 PM, Stefan Berger wrote: > Implement virFileChownFiles() which changes file ownership of all > files in a given directory. > > Signed-off-by: Stefan Berger <stefanb@xxxxxxxxxxxxxxxxxx> > --- > src/libvirt_private.syms | 1 + > src/util/virfile.c | 49 ++++++++++++++++++++++++++++++++++++++++++++++++ > src/util/virfile.h | 3 +++ > 3 files changed, 53 insertions(+) > > diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms > index f2a4921..33fe75b 100644 > --- a/src/libvirt_private.syms > +++ b/src/libvirt_private.syms > @@ -1761,6 +1761,7 @@ virFileActivateDirOverride; > virFileBindMountDevice; > virFileBuildPath; > virFileCanonicalizePath; > +virFileChownFiles; > virFileClose; > virFileComparePaths; > virFileCopyACLs; > diff --git a/src/util/virfile.c b/src/util/virfile.c > index 526b9ad..b6aaf2c 100644 > --- a/src/util/virfile.c > +++ b/src/util/virfile.c > @@ -38,6 +38,7 @@ > #include <unistd.h> > #include <dirent.h> > #include <dirname.h> > +#include <ftw.h> I take it we don't need ftw.h any more... > #if defined HAVE_MNTENT_H && defined HAVE_GETMNTENT_R > # include <mntent.h> > #endif > @@ -2949,6 +2950,54 @@ void virDirClose(DIR **dirp) > *dirp = NULL; > } > Two empty lines > +/* > + * 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) One arg per line. > +{ > + struct dirent *ent; > + int ret; s/ret;/ret = -1;/ int direrr; > + DIR *dir; > + char *path; path = NULL; > + > + if (virDirOpen(&dir, name) < 0) > + return -1; > + > + while ((ret = virDirRead(dir, &ent, name)) > 0) { s/ret/direrr > + if (ent->d_type != DT_REG) > + continue; > + > + if (virAsprintf(&path, "%s/%s", name, ent->d_name) < 0) { > + ret = -1; > + break; > + } Replace {...} w/ goto cleanup; > + if (chown(path, uid, gid) < 0) { > + ret = -1; Unnecessary. > + virReportSystemError(errno, > + _("cannot chown '%s' to (%u, %u)"), > + ent->d_name, (unsigned int) uid, > + (unsigned int) gid); goto cleanup; > + } > + VIR_FREE(path); > + if (ret < 0) > + break; Unnecessary > + } > + if (direrr < 0) goto cleanup; ret = 0; cleanup: VIR_FREE(path); > + virDirClose(&dir); return ret; Skip the rest. > + > + if (ret < 0) > + return -1; > + > + return 0; > +} > + Two empty lines With the adjustments, Reviewed-by: John Ferlan <jferlan@xxxxxxxxxx> John > static int > virFileMakePathHelper(char *path, mode_t mode) > { > diff --git a/src/util/virfile.h b/src/util/virfile.h > index 13d3cf6..f0d99a0 100644 > --- a/src/util/virfile.h > +++ b/src/util/virfile.h > @@ -239,6 +239,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), > -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list