[libvirt] [PATCH 07/18] Add virDirOpenIfExists

Ján Tomko jtomko at redhat.com
Tue Jun 21 16:05:30 UTC 2016


Just like virDirOpen, but it returns 0 without reporting an error
on ENOENT.
---
 src/libvirt_private.syms |  1 +
 src/util/virfile.c       | 21 +++++++++++++++++++--
 src/util/virfile.h       |  2 ++
 3 files changed, 22 insertions(+), 2 deletions(-)

diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index 457fe19..2bb1d95 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -1496,6 +1496,7 @@ virBuildPathInternal;
 virDirClose;
 virDirCreate;
 virDirOpen;
+virDirOpenIfExists;
 virDirRead;
 virFileAbsPath;
 virFileAccessibleAs;
diff --git a/src/util/virfile.c b/src/util/virfile.c
index 7dee3d9..efdb98b 100644
--- a/src/util/virfile.c
+++ b/src/util/virfile.c
@@ -2727,10 +2727,12 @@ virFileRemove(const char *path,
 #endif /* WIN32 */
 
 static int
-virDirOpenInternal(DIR **dirp, const char *name)
+virDirOpenInternal(DIR **dirp, const char *name, bool ignoreENOENT)
 {
     *dirp = opendir(name);
     if (!*dirp) {
+        if (ignoreENOENT && errno == ENOENT)
+            return 0;
         virReportSystemError(errno, _("cannot open directory '%s'"), name);
         return -1;
     }
@@ -2748,7 +2750,22 @@ virDirOpenInternal(DIR **dirp, const char *name)
 int
 virDirOpen(DIR **dirp, const char *name)
 {
-    return virDirOpenInternal(dirp, name);
+    return virDirOpenInternal(dirp, name, false);
+}
+
+/**
+ * virDirOpenIfExists
+ * @dirp: directory stream
+ * @name: path of the directory
+ *
+ * Returns 1 on success.
+ * If opendir returns ENOENT, 0 is returned without reporting an error.
+ * On other errors, -1 is returned and an error is reported.
+ */
+int
+virDirOpenIfExists(DIR **dirp, const char *name)
+{
+    return virDirOpenInternal(dirp, name, true);
 }
 
 /**
diff --git a/src/util/virfile.h b/src/util/virfile.h
index c618842..42c65f2 100644
--- a/src/util/virfile.h
+++ b/src/util/virfile.h
@@ -232,6 +232,8 @@ 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 virDirOpenIfExists(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




More information about the libvir-list mailing list