[libvirt] [PATCH v3 1/2] util: factor out reading file into preallocated buffer

Nikolay Shirokovskiy nshirokovskiy at virtuozzo.com
Tue May 3 09:12:40 UTC 2016


Signed-off-by: Nikolay Shirokovskiy <nshirokovskiy at 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




More information about the libvir-list mailing list