virfile: Introduce virDirIsEmpty()

There might be cases where we want to know whether given
directory is empty or not. Introduce a helper for that:
virDirIsEmpty().

Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
This commit is contained in:
Michal Privoznik 2023-07-21 10:41:35 +02:00
parent ac9c9b621f
commit 1b33578854
3 changed files with 43 additions and 0 deletions

View File

@ -2271,6 +2271,7 @@ safezero;
virBuildPathInternal;
virDirClose;
virDirCreate;
virDirIsEmpty;
virDirOpen;
virDirOpenIfExists;
virDirOpenQuiet;

View File

@ -3036,6 +3036,45 @@ void virDirClose(DIR *dirp)
closedir(dirp); /* exempt from syntax-check */
}
/**
* virDirIsEmpty:
* @path: path to the directory
* @hidden: whether hidden files matter
*
* Check whether given directory (@path) is empty, i.e. it
* contains just the usual entries '.' and '..'. Hidden files are
* ignored unless @hidden is true. IOW, a directory containing
* nothing but hidden files is considered empty if @hidden is
* false and not empty if @hidden is true.
*
* Returns: 1 if the directory is empty,
* 0 if the directory is not empty,
* -1 otherwise (no error reported).
*/
int virDirIsEmpty(const char *path,
bool hidden)
{
g_autoptr(DIR) dir = NULL;
struct dirent *ent;
int direrr;
if (virDirOpenQuiet(&dir, path) < 0)
return -1;
while ((direrr = virDirRead(dir, &ent, NULL)) > 0) {
/* virDirRead() skips over '.' and '..' so here we have
* actual directory entry. */
if (!hidden ||
(hidden && ent->d_name[0] != '.'))
return 0;
}
if (direrr < 0)
return -1;
return 1;
}
/*
* virFileChownFiles:

View File

@ -283,6 +283,9 @@ int virDirRead(DIR *dirp, struct dirent **ent, const char *dirname)
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) G_GNUC_WARN_UNUSED_RESULT;
void virDirClose(DIR *dirp);
G_DEFINE_AUTOPTR_CLEANUP_FUNC(DIR, virDirClose);
int virDirIsEmpty(const char *path,
bool hidden)
ATTRIBUTE_NONNULL(1) G_GNUC_WARN_UNUSED_RESULT;
int virFileMakeParentPath(const char *path) G_GNUC_WARN_UNUSED_RESULT;