[libvirt] [PATCH 07/18] Add virDirOpenIfExists

John Ferlan jferlan at redhat.com
Thu Jun 23 12:35:55 UTC 2016



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




More information about the libvir-list mailing list