c1c534
From 155bc6e4428d2a01a1b63f0a4221211c2116e893 Mon Sep 17 00:00:00 2001
c1c534
Message-Id: <155bc6e4428d2a01a1b63f0a4221211c2116e893@dist-git>
c1c534
From: Martin Kletzander <mkletzan@redhat.com>
c1c534
Date: Wed, 31 Jan 2018 16:32:09 +0100
c1c534
Subject: [PATCH] util: Introduce virFormatIntPretty
c1c534
c1c534
https://bugzilla.redhat.com/show_bug.cgi?id=1289368
c1c534
c1c534
We can't output better memory sizes if we want to be compatible with libvirt
c1c534
older than the one which introduced /memory/unit, but for new things we can just
c1c534
output nicer capacity to the user if available.  And this function enables that.
c1c534
c1c534
Signed-off-by: Martin Kletzander <mkletzan@redhat.com>
c1c534
Reviewed-by: John Ferlan <jferlan@redhat.com>
c1c534
(cherry picked from commit 87a8a30d613dd2061377aa46fa6e9a05e12aa1b4)
c1c534
Signed-off-by: Martin Kletzander <mkletzan@redhat.com>
c1c534
---
c1c534
 src/libvirt_private.syms |  1 +
c1c534
 src/util/virutil.c       | 51 ++++++++++++++++++++++++++++++++++++++++++++++++
c1c534
 src/util/virutil.h       |  4 ++++
c1c534
 3 files changed, 56 insertions(+)
c1c534
c1c534
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
c1c534
index 57999e77b0..5a87276a2e 100644
c1c534
--- a/src/libvirt_private.syms
c1c534
+++ b/src/libvirt_private.syms
c1c534
@@ -2938,6 +2938,7 @@ virDoubleToStr;
c1c534
 virEnumFromString;
c1c534
 virEnumToString;
c1c534
 virFormatIntDecimal;
c1c534
+virFormatIntPretty;
c1c534
 virGetDeviceID;
c1c534
 virGetDeviceUnprivSGIO;
c1c534
 virGetEnvAllowSUID;
c1c534
diff --git a/src/util/virutil.c b/src/util/virutil.c
c1c534
index 170e921920..2379cf019d 100644
c1c534
--- a/src/util/virutil.c
c1c534
+++ b/src/util/virutil.c
c1c534
@@ -485,6 +485,57 @@ virFormatIntDecimal(char *buf, size_t buflen, int val)
c1c534
 }
c1c534
 
c1c534
 
c1c534
+/**
c1c534
+ * virFormatIntPretty
c1c534
+ *
c1c534
+ * @val: Value in bytes to be shortened
c1c534
+ * @unit: unit to be used
c1c534
+ *
c1c534
+ * Similar to vshPrettyCapacity, but operates on integers and not doubles
c1c534
+ *
c1c534
+ * Returns shortened value that can be used with @unit.
c1c534
+ */
c1c534
+unsigned long long
c1c534
+virFormatIntPretty(unsigned long long val,
c1c534
+                   const char **unit)
c1c534
+{
c1c534
+    unsigned long long limit = 1024;
c1c534
+
c1c534
+    if (val % limit || val == 0) {
c1c534
+        *unit = "B";
c1c534
+        return val;
c1c534
+    }
c1c534
+    limit *= 1024;
c1c534
+    if (val % limit) {
c1c534
+        *unit = "KiB";
c1c534
+        return val / (limit / 1024);
c1c534
+    }
c1c534
+    limit *= 1024;
c1c534
+    if (val % limit) {
c1c534
+        *unit = "MiB";
c1c534
+        return val / (limit / 1024);
c1c534
+    }
c1c534
+    limit *= 1024;
c1c534
+    if (val % limit) {
c1c534
+        *unit = "GiB";
c1c534
+        return val / (limit / 1024);
c1c534
+    }
c1c534
+    limit *= 1024;
c1c534
+    if (val % limit) {
c1c534
+        *unit = "TiB";
c1c534
+        return val / (limit / 1024);
c1c534
+    }
c1c534
+    limit *= 1024;
c1c534
+    if (val % limit) {
c1c534
+        *unit = "PiB";
c1c534
+        return val / (limit / 1024);
c1c534
+    }
c1c534
+    limit *= 1024;
c1c534
+    *unit = "EiB";
c1c534
+    return val / (limit / 1024);
c1c534
+}
c1c534
+
c1c534
+
c1c534
 const char *virEnumToString(const char *const*types,
c1c534
                             unsigned int ntypes,
c1c534
                             int type)
c1c534
diff --git a/src/util/virutil.h b/src/util/virutil.h
c1c534
index a862a8a637..9ee728235f 100644
c1c534
--- a/src/util/virutil.h
c1c534
+++ b/src/util/virutil.h
c1c534
@@ -66,6 +66,10 @@ int virParseVersionString(const char *str, unsigned long *version,
c1c534
 char *virFormatIntDecimal(char *buf, size_t buflen, int val)
c1c534
     ATTRIBUTE_NONNULL(1) ATTRIBUTE_RETURN_CHECK;
c1c534
 
c1c534
+unsigned long long
c1c534
+virFormatIntPretty(unsigned long long val,
c1c534
+                   const char **unit);
c1c534
+
c1c534
 int virDiskNameParse(const char *name, int *disk, int *partition);
c1c534
 int virDiskNameToIndex(const char* str);
c1c534
 char *virIndexToDiskName(int idx, const char *prefix);
c1c534
-- 
c1c534
2.16.1
c1c534