[libvirt] [PATCH v2 2/4] util: Introduce virGenerateRandomBytes

John Ferlan jferlan at redhat.com
Tue Mar 29 23:11:34 UTC 2016


Using the existing virUUIDGenerateRandomBytes, move API to virutil.c
and add it to libvirt_private.syms.

This will be used as a fallback for generating a domain master key.

Signed-off-by: John Ferlan <jferlan at redhat.com>
---
 src/libvirt_private.syms |  1 +
 src/util/virutil.c       | 36 ++++++++++++++++++++++++++++++++++++
 src/util/virutil.h       |  3 +++
 src/util/viruuid.c       | 30 +-----------------------------
 4 files changed, 41 insertions(+), 29 deletions(-)

diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index 7c44047..3d54c39 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -2422,6 +2422,7 @@ virEnumToString;
 virFindFCHostCapableVport;
 virFindSCSIHostByPCI;
 virFormatIntDecimal;
+virGenerateRandomBytes;
 virGetDeviceID;
 virGetDeviceUnprivSGIO;
 virGetEnvAllowSUID;
diff --git a/src/util/virutil.c b/src/util/virutil.c
index b401f8d..c55f6f6 100644
--- a/src/util/virutil.c
+++ b/src/util/virutil.c
@@ -2669,3 +2669,39 @@ virMemoryMaxValue(bool capped)
     else
         return LLONG_MAX;
 }
+
+
+/**
+ * virGenerateRandomBytes
+ * @buf: Pointer to location to store bytes
+ * @buflen: Number of bytes to store
+ *
+ * Generate a stream of random bytes into @buf of size @buflen
+ */
+int
+virGenerateRandomBytes(unsigned char *buf,
+                       size_t buflen)
+{
+    int fd;
+
+    if ((fd = open("/dev/urandom", O_RDONLY)) < 0)
+        return errno;
+
+    while (buflen > 0) {
+        ssize_t n;
+
+        if ((n = read(fd, buf, buflen)) <= 0) {
+            if (errno == EINTR)
+                continue;
+            VIR_FORCE_CLOSE(fd);
+            return n < 0 ? errno : ENODATA;
+        }
+
+        buf += n;
+        buflen -= n;
+    }
+
+    VIR_FORCE_CLOSE(fd);
+
+    return 0;
+}
diff --git a/src/util/virutil.h b/src/util/virutil.h
index b121de0..a398b38 100644
--- a/src/util/virutil.h
+++ b/src/util/virutil.h
@@ -254,6 +254,9 @@ unsigned long long virMemoryLimitTruncate(unsigned long long value);
 bool virMemoryLimitIsSet(unsigned long long value);
 unsigned long long virMemoryMaxValue(bool ulong);
 
+int virGenerateRandomBytes(unsigned char *buf, size_t buflen)
+    ATTRIBUTE_NONNULL(1) ATTRIBUTE_RETURN_CHECK;
+
 /**
  * VIR_ASSIGN_IS_OVERFLOW:
  * @rvalue: value that is checked (evaluated twice)
diff --git a/src/util/viruuid.c b/src/util/viruuid.c
index 615d419..e2d9fbf 100644
--- a/src/util/viruuid.c
+++ b/src/util/viruuid.c
@@ -53,34 +53,6 @@ VIR_LOG_INIT("util.uuid");
 static unsigned char host_uuid[VIR_UUID_BUFLEN];
 
 static int
-virUUIDGenerateRandomBytes(unsigned char *buf,
-                           int buflen)
-{
-    int fd;
-
-    if ((fd = open("/dev/urandom", O_RDONLY)) < 0)
-        return errno;
-
-    while (buflen > 0) {
-        int n;
-
-        if ((n = read(fd, buf, buflen)) <= 0) {
-            if (errno == EINTR)
-                continue;
-            VIR_FORCE_CLOSE(fd);
-            return n < 0 ? errno : ENODATA;
-        }
-
-        buf += n;
-        buflen -= n;
-    }
-
-    VIR_FORCE_CLOSE(fd);
-
-    return 0;
-}
-
-static int
 virUUIDGeneratePseudoRandomBytes(unsigned char *buf,
                                  int buflen)
 {
@@ -108,7 +80,7 @@ virUUIDGenerate(unsigned char *uuid)
     if (uuid == NULL)
         return -1;
 
-    if ((err = virUUIDGenerateRandomBytes(uuid, VIR_UUID_BUFLEN))) {
+    if ((err = virGenerateRandomBytes(uuid, VIR_UUID_BUFLEN))) {
         char ebuf[1024];
         VIR_WARN("Falling back to pseudorandom UUID,"
                  " failed to generate random bytes: %s",
-- 
2.5.5




More information about the libvir-list mailing list