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@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list