util: Implement virFileChownFiles()

Implement virFileChownFiles() which changes file ownership of all
files in a given directory.

Signed-off-by: Stefan Berger <stefanb@linux.vnet.ibm.com>
Reviewed-by: John Ferlan <jferlan@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
This commit is contained in:
Stefan Berger 2017-04-04 12:22:31 -04:00
parent b50edcd894
commit eb46575a95
3 changed files with 59 additions and 0 deletions

View File

@ -1768,6 +1768,7 @@ virFileActivateDirOverride;
virFileBindMountDevice;
virFileBuildPath;
virFileCanonicalizePath;
virFileChownFiles;
virFileClose;
virFileComparePaths;
virFileCopyACLs;

View File

@ -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)
{

View File

@ -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),