mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-10-30 09:53:10 +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;
|
virFileBindMountDevice;
|
||||||
virFileBuildPath;
|
virFileBuildPath;
|
||||||
virFileCanonicalizePath;
|
virFileCanonicalizePath;
|
||||||
|
virFileChownFiles;
|
||||||
virFileClose;
|
virFileClose;
|
||||||
virFileComparePaths;
|
virFileComparePaths;
|
||||||
virFileCopyACLs;
|
virFileCopyACLs;
|
||||||
|
@ -2980,6 +2980,61 @@ void virDirClose(DIR **dirp)
|
|||||||
*dirp = NULL;
|
*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
|
static int
|
||||||
virFileMakePathHelper(char *path, mode_t mode)
|
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;
|
ATTRIBUTE_NONNULL(1) ATTRIBUTE_RETURN_CHECK;
|
||||||
int virFileRemove(const char *path, uid_t uid, gid_t gid);
|
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 {
|
enum {
|
||||||
VIR_DIR_CREATE_NONE = 0,
|
VIR_DIR_CREATE_NONE = 0,
|
||||||
VIR_DIR_CREATE_AS_UID = (1 << 0),
|
VIR_DIR_CREATE_AS_UID = (1 << 0),
|
||||||
|
Loading…
Reference in New Issue
Block a user