Re: [libvirt] [PATCH 07/18] Add virDirOpenIfExists

2016-06-23 Thread John Ferlan


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)
> 

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


[libvirt] [PATCH 07/18] Add virDirOpenIfExists

2016-06-21 Thread Ján Tomko
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

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list