A helper that calls opendir and reports an error if it fails.
---
src/libvirt_private.syms | 1 +
src/util/virfile.c | 33 +++++++++++++++++++++++++++++----
src/util/virfile.h | 2 ++
3 files changed, 32 insertions(+), 4 deletions(-)
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index f4dc88d..457fe19 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -1495,6 +1495,7 @@ safezero;
virBuildPathInternal;
virDirClose;
virDirCreate;
+virDirOpen;
virDirRead;
virFileAbsPath;
virFileAccessibleAs;
diff --git a/src/util/virfile.c b/src/util/virfile.c
index ce8f7fd..aac0324 100644
--- a/src/util/virfile.c
+++ b/src/util/virfile.c
@@ -2736,6 +2736,31 @@ virFileRemove(const char *path,
}
#endif /* WIN32 */
+static int
+virDirOpenInternal(DIR **dirp, const char *name)
+{
+ *dirp = opendir(name);
+ if (!*dirp) {
+ virReportSystemError(errno, _("cannot open directory '%s'"),
name);
+ return -1;
+ }
+ return 1;
+}
+
+/**
+ * virDirOpen
+ * @dirp: directory stream
+ * @name: path of the directory
+ *
+ * Returns 1 on success.
+ * On failure, -1 is returned and an error is reported.
+ */
+int
+virDirOpen(DIR **dirp, const char *name)
+{
+ return virDirOpenInternal(dirp, name);
+}
+
/**
* virDirRead:
* @dirp: directory to read
@@ -2744,13 +2769,13 @@ virFileRemove(const char *path,
*
* Wrapper around readdir. Typical usage:
* struct dirent ent;
- * int value;
+ * int rc;
* DIR *dir;
- * if (!(dir = opendir(name)))
+ * if (virDirOpen(&dir, name) < 0)
* goto error;
- * while ((value = virDirRead(dir, &ent, name)) > 0)
+ * while ((rc = virDirRead(dir, &ent, name)) > 0)
* process ent;
- * if (value < 0)
+ * if (rc < 0)
* goto error;
*
* Returns -1 on error, with error already reported if @name was
diff --git a/src/util/virfile.h b/src/util/virfile.h
index ab9eeba..c618842 100644
--- a/src/util/virfile.h
+++ b/src/util/virfile.h
@@ -230,6 +230,8 @@ enum {
};
int virDirCreate(const char *path, mode_t mode, uid_t uid, gid_t gid,
unsigned int flags) ATTRIBUTE_RETURN_CHECK;
+int virDirOpen(DIR **dirp, const char *dirname)
+ ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_RETURN_CHECK;
int virDirRead(DIR *dirp, struct dirent **ent, const char *dirname)
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_RETURN_CHECK;
void virDirClose(DIR **dirp)
--
2.7.3