[libvirt] [PATCH 06/21] util: Don't output too many zeros from virBitmapToString

Martin Kletzander mkletzan at redhat.com
Mon Nov 13 08:50:21 UTC 2017


Truncate the output so that it is only as big as is needed to fit all
the bits, not all the units from the map.  This will be needed in the
future in order to properly format bitmaps for kernel's sysfs files.

Signed-off-by: Martin Kletzander <mkletzan at redhat.com>
---
 src/qemu/qemu_capabilities.c |  4 ++--
 src/util/virbitmap.c         | 29 +++++++++++++++++++++++++++--
 src/util/virbitmap.h         |  2 +-
 3 files changed, 30 insertions(+), 5 deletions(-)

diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
index 60ca8ee9ef84..232f88af0fb8 100644
--- a/src/qemu/qemu_capabilities.c
+++ b/src/qemu/qemu_capabilities.c
@@ -1509,7 +1509,7 @@ int virQEMUCapsParseHelpStr(const char *qemu,
                                    qemuCaps, check_yajl) < 0)
         goto cleanup;
 
-    strflags = virBitmapToString(qemuCaps->flags, true);
+    strflags = virBitmapToString(qemuCaps->flags, true, false);
     VIR_DEBUG("Version %u.%u.%u, cooked version %u, flags %s",
               major, minor, micro, *version, NULLSTR(strflags));
     VIR_FREE(strflags);
@@ -2376,7 +2376,7 @@ virQEMUCapsClear(virQEMUCapsPtr qemuCaps,
 
 char *virQEMUCapsFlagsString(virQEMUCapsPtr qemuCaps)
 {
-    return virBitmapToString(qemuCaps->flags, true);
+    return virBitmapToString(qemuCaps->flags, true, false);
 }
 
 
diff --git a/src/util/virbitmap.c b/src/util/virbitmap.c
index 3d160aa4d50a..0a7d3452b90c 100644
--- a/src/util/virbitmap.c
+++ b/src/util/virbitmap.c
@@ -313,15 +313,19 @@ int virBitmapGetBit(virBitmapPtr bitmap, size_t b, bool *result)
  * virBitmapToString:
  * @bitmap: Pointer to bitmap
  * @prefix: Whether to prepend "0x"
+ * @trim: Whether to output only the minimum required characters
  *
  * Convert @bitmap to printable string.
  *
  * Returns pointer to the string or NULL on error.
  */
-char *virBitmapToString(virBitmapPtr bitmap, bool prefix)
+char *virBitmapToString(virBitmapPtr bitmap, bool prefix, bool trim)
 {
     virBuffer buf = VIR_BUFFER_INITIALIZER;
     size_t sz;
+    size_t len;
+    size_t diff;
+    char *ret = NULL;
 
     if (prefix)
         virBufferAddLit(&buf, "0x");
@@ -335,7 +339,28 @@ char *virBitmapToString(virBitmapPtr bitmap, bool prefix)
     }
 
     virBufferCheckError(&buf);
-    return virBufferContentAndReset(&buf);
+    ret = virBufferContentAndReset(&buf);
+    if (!ret)
+        return NULL;
+
+    if (!trim)
+        return ret;
+
+    if (bitmap->max_bit != bitmap->map_len * VIR_BITMAP_BITS_PER_UNIT) {
+        char *tmp = ret;
+
+        if (prefix)
+            tmp += 2;
+
+        len = strlen(tmp);
+        sz = VIR_DIV_UP(bitmap->max_bit, 4);
+        diff = len - sz;
+
+        if (diff)
+            memmove(tmp, tmp + diff, sz + 1);
+    }
+
+    return ret;
 }
 
 /**
diff --git a/src/util/virbitmap.h b/src/util/virbitmap.h
index 720b389cfe52..02acb7519d37 100644
--- a/src/util/virbitmap.h
+++ b/src/util/virbitmap.h
@@ -80,7 +80,7 @@ bool virBitmapIsBitSet(virBitmapPtr bitmap, size_t b)
 int virBitmapGetBit(virBitmapPtr bitmap, size_t b, bool *result)
     ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(3) ATTRIBUTE_RETURN_CHECK;
 
-char *virBitmapToString(virBitmapPtr bitmap, bool prefix)
+char *virBitmapToString(virBitmapPtr bitmap, bool prefix, bool trim)
     ATTRIBUTE_NONNULL(1) ATTRIBUTE_RETURN_CHECK;
 
 char *virBitmapFormat(virBitmapPtr bitmap);
-- 
2.15.0




More information about the libvir-list mailing list