]> xenbits.xensource.com Git - libvirt.git/commitdiff
util: introduce virDirRead wrapper for readdir
authorNatanael Copa <ncopa@alpinelinux.org>
Sun, 20 Apr 2014 11:53:45 +0000 (13:53 +0200)
committerEric Blake <eblake@redhat.com>
Mon, 28 Apr 2014 23:52:45 +0000 (17:52 -0600)
Introduce a wrapper for readdir. This helps us make sure that we always
set errno before calling readdir and it will make sure errors are
properly logged.

Signed-off-by: Natanael Copa <ncopa@alpinelinux.org>
Signed-off-by: Eric Blake <eblake@redhat.com>
src/libvirt_private.syms
src/util/virfile.c
src/util/virfile.h

index 5788468721358643fdeffc8cf9f5be7244c88839..8bbe6e76defd3de75e8011ca38b25fb978251e85 100644 (file)
@@ -1222,6 +1222,7 @@ safewrite;
 safezero;
 virBuildPathInternal;
 virDirCreate;
+virDirRead;
 virFileAbsPath;
 virFileAccessibleAs;
 virFileActivateDirOverride;
index da4e0a0c51150949a9887152c875285eac1c3f0d..34811243c892b58bacd719dbfc491c9e08b88604 100644 (file)
@@ -2391,6 +2391,39 @@ virDirCreate(const char *path ATTRIBUTE_UNUSED,
 }
 #endif /* WIN32 */
 
+/**
+ * virDirRead:
+ * @dirp: directory to read
+ * @end: output one entry
+ * @name: if non-NULL, the name related to @dirp for use in error reporting
+ *
+ * Wrapper around readdir. Typical usage:
+ *   struct dirent ent;
+ *   int value;
+ *   DIR *dir;
+ *   if (!(dir = opendir(name)))
+ *       goto error;
+ *   while ((value = virDirRead(dir, &ent, name)) > 0)
+ *       process ent;
+ *   if (value < 0)
+ *       goto error;
+ *
+ * Returns -1 on error, with error already reported if @name was
+ * supplied.  On success, returns 1 for entry read, 0 for end-of-dir.
+ */
+int virDirRead(DIR *dirp, struct dirent **ent, const char *name)
+{
+    errno = 0;
+    *ent = readdir(dirp);
+    if (!*ent && errno) {
+        if (name)
+            virReportSystemError(errno, _("Unable to read directory '%s'"),
+                                 name);
+        return -1;
+    }
+    return !!*ent;
+}
+
 static int
 virFileMakePathHelper(char *path, mode_t mode)
 {
index 5d0d6995d244a5f23fff2ed30a3571ab18b2e8af..12bcb227bfba6b1dd2aeb1723d95825939e24a9c 100644 (file)
@@ -27,6 +27,7 @@
 # define __VIR_FILE_H_
 
 # include <stdio.h>
+# include <dirent.h>
 
 # include "internal.h"
 # include "virstoragefile.h"
@@ -225,6 +226,9 @@ enum {
 };
 int virDirCreate(const char *path, mode_t mode, uid_t uid, gid_t gid,
                  unsigned int flags) ATTRIBUTE_RETURN_CHECK;
+int virDirRead(DIR *dirp, struct dirent **ent, const char *dirname)
+    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_RETURN_CHECK;
+
 int virFileMakePath(const char *path) ATTRIBUTE_RETURN_CHECK;
 int virFileMakePathWithMode(const char *path,
                             mode_t mode) ATTRIBUTE_RETURN_CHECK;