diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index a91b87d09a..99452a2634 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -2927,6 +2927,7 @@ virDoubleToStr; virEnumFromString; virEnumToString; virFormatIntDecimal; +virFormatIntPretty; virGetDeviceID; virGetDeviceUnprivSGIO; virGetEnvAllowSUID; diff --git a/src/util/virutil.c b/src/util/virutil.c index 8bdcb02fd5..e9dbaf3d7a 100644 --- a/src/util/virutil.c +++ b/src/util/virutil.c @@ -485,6 +485,57 @@ virFormatIntDecimal(char *buf, size_t buflen, int val) } +/** + * virFormatIntPretty + * + * @val: Value in bytes to be shortened + * @unit: unit to be used + * + * Similar to vshPrettyCapacity, but operates on integers and not doubles + * + * Returns shortened value that can be used with @unit. + */ +unsigned long long +virFormatIntPretty(unsigned long long val, + const char **unit) +{ + unsigned long long limit = 1024; + + if (val % limit || val == 0) { + *unit = "B"; + return val; + } + limit *= 1024; + if (val % limit) { + *unit = "KiB"; + return val / (limit / 1024); + } + limit *= 1024; + if (val % limit) { + *unit = "MiB"; + return val / (limit / 1024); + } + limit *= 1024; + if (val % limit) { + *unit = "GiB"; + return val / (limit / 1024); + } + limit *= 1024; + if (val % limit) { + *unit = "TiB"; + return val / (limit / 1024); + } + limit *= 1024; + if (val % limit) { + *unit = "PiB"; + return val / (limit / 1024); + } + limit *= 1024; + *unit = "EiB"; + return val / (limit / 1024); +} + + const char *virEnumToString(const char *const*types, unsigned int ntypes, int type) diff --git a/src/util/virutil.h b/src/util/virutil.h index ff89d1aaaa..9381ad5682 100644 --- a/src/util/virutil.h +++ b/src/util/virutil.h @@ -66,6 +66,10 @@ int virParseVersionString(const char *str, unsigned long *version, char *virFormatIntDecimal(char *buf, size_t buflen, int val) ATTRIBUTE_NONNULL(1) ATTRIBUTE_RETURN_CHECK; +unsigned long long +virFormatIntPretty(unsigned long long val, + const char **unit); + int virDiskNameParse(const char *name, int *disk, int *partition); int virDiskNameToIndex(const char* str); char *virIndexToDiskName(int idx, const char *prefix);