On 06/21/2016 12:05 PM, Ján Tomko wrote:
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;
Why not pass "ignore_errno" as an int and compare errno against it... I
would think passing 0 otherwise would work unless open
What you have works and is fine and ENOENT is the errno du jour to
check, but just trying to future proof adding yet another argument.
ACK to what's here - this is only a suggestion...
John
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)