mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-01-22 04:25:18 +00:00
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:
parent
b50edcd894
commit
eb46575a95
@ -1768,6 +1768,7 @@ virFileActivateDirOverride;
|
||||
virFileBindMountDevice;
|
||||
virFileBuildPath;
|
||||
virFileCanonicalizePath;
|
||||
virFileChownFiles;
|
||||
virFileClose;
|
||||
virFileComparePaths;
|
||||
virFileCopyACLs;
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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),
|
||||
|
Loading…
x
Reference in New Issue
Block a user