Signed-off-by: Nikolay Shirokovskiy <nshirokovskiy(a)virtuozzo.com>
---
src/libvirt_private.syms | 1 +
src/util/virfile.c | 24 ++++++++++++++++++++++++
src/util/virfile.h | 2 ++
src/util/viruuid.c | 11 ++---------
4 files changed, 29 insertions(+), 9 deletions(-)
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index 0de35ef..ecd169b 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -1510,6 +1510,7 @@ virFileOpenTty;
virFilePrintf;
virFileReadAll;
virFileReadAllQuiet;
+virFileReadBufQuiet;
virFileReadHeaderFD;
virFileReadLimFD;
virFileRelLinkPointsTo;
diff --git a/src/util/virfile.c b/src/util/virfile.c
index 730c08d..4d7b510 100644
--- a/src/util/virfile.c
+++ b/src/util/virfile.c
@@ -1401,6 +1401,30 @@ virFileReadAllQuiet(const char *path, int maxlen, char **buf)
return len;
}
+/* Read @file into preallocated buffer @buf of size @len.
+ * Return value is -errno in case of errors and size
+ * of data read (no trailing zero) in case of success.
+ * If there is more data then @len - 1 then data will be
+ * truncated. */
+int
+virFileReadBufQuiet(const char *file, char *buf, int len)
+{
+ int fd;
+ ssize_t sz;
+
+ fd = open(file, O_RDONLY);
+ if (fd < 0)
+ return -errno;
+
+ sz = saferead(fd, buf, len - 1);
+ VIR_FORCE_CLOSE(fd);
+ if (sz < 0)
+ return -errno;
+
+ buf[sz] = '\0';
+ return sz;
+}
+
/* Truncate @path and write @str to it. If @mode is 0, ensure that
@path exists; otherwise, use @mode if @path must be created.
Return 0 for success, nonzero for failure.
diff --git a/src/util/virfile.h b/src/util/virfile.h
index 312f226..dc62eab 100644
--- a/src/util/virfile.h
+++ b/src/util/virfile.h
@@ -131,6 +131,8 @@ int virFileReadAll(const char *path, int maxlen, char **buf)
ATTRIBUTE_RETURN_CHECK ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(3);
int virFileReadAllQuiet(const char *path, int maxlen, char **buf)
ATTRIBUTE_RETURN_CHECK ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(3);
+int virFileReadBufQuiet(const char *file, char *buf, int len)
+ ATTRIBUTE_RETURN_CHECK ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
int virFileWriteStr(const char *path, const char *str, mode_t mode)
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_RETURN_CHECK;
diff --git a/src/util/viruuid.c b/src/util/viruuid.c
index 16e57db..3cbaae0 100644
--- a/src/util/viruuid.c
+++ b/src/util/viruuid.c
@@ -231,15 +231,8 @@ getDMISystemUUID(char *uuid, int len)
};
while (paths[i]) {
- int fd = open(paths[i], O_RDONLY);
- if (fd >= 0) {
- if (saferead(fd, uuid, len - 1) == len - 1) {
- uuid[len - 1] = '\0';
- VIR_FORCE_CLOSE(fd);
- return 0;
- }
- VIR_FORCE_CLOSE(fd);
- }
+ if (virFileReadBufQuiet(paths[i], uuid, len) == len - 1)
+ return 0;
i++;
}
--
1.8.3.1