Re: [libvirt] [PATCH v2 4/7] bandwidth: Create format functions

2011-07-18 Thread Jiri Denemark
On Tue, Jul 12, 2011 at 13:57:10 +0200, Michal Privoznik wrote:
 ---
  src/conf/domain_conf.c   |3 +
  src/conf/network_conf.c  |3 +
  src/libvirt_private.syms |3 +
  src/util/network.c   |  153 
 ++
  src/util/network.h   |7 ++
  5 files changed, 169 insertions(+), 0 deletions(-)

Removing units makes this simpler as well.

Jirka

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


[libvirt] [PATCH v2 4/7] bandwidth: Create format functions

2011-07-12 Thread Michal Privoznik
---
 src/conf/domain_conf.c   |3 +
 src/conf/network_conf.c  |3 +
 src/libvirt_private.syms |3 +
 src/util/network.c   |  153 ++
 src/util/network.h   |7 ++
 5 files changed, 169 insertions(+), 0 deletions(-)

diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index c109153..740630f 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -8844,6 +8844,9 @@ virDomainNetDefFormat(virBufferPtr buf,
 virBufferAddLit(buf, /tune\n);
 }
 
+if (virBandwidrhDefFormat(buf, def-bandwidth,   )  0)
+return -1;
+
 if (virDomainDeviceInfoFormat(buf, def-info, flags)  0)
 return -1;
 
diff --git a/src/conf/network_conf.c b/src/conf/network_conf.c
index c9929e2..43145b1 100644
--- a/src/conf/network_conf.c
+++ b/src/conf/network_conf.c
@@ -1093,6 +1093,9 @@ char *virNetworkDefFormat(const virNetworkDefPtr def)
 if (virNetworkDNSDefFormat(buf, def-dns)  0)
 goto error;
 
+if (virBandwidrhDefFormat(buf, def-bandwidth,   )  0)
+goto error;
+
 for (ii = 0; ii  def-nips; ii++) {
 if (virNetworkIpDefFormat(buf, def-ips[ii])  0)
 goto error;
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index c0e1bfa..2131108 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -682,7 +682,10 @@ nlComm;
 
 
 # network.h
+virBandwidrhDefFormat;
 virBandwidthDefParseNode;
+virBpsToRate;
+virBtoSize;
 virSocketAddrBroadcast;
 virSocketAddrBroadcastByPrefix;
 virSocketAddrIsNetmask;
diff --git a/src/util/network.c b/src/util/network.c
index 476ecde..b24f977 100644
--- a/src/util/network.c
+++ b/src/util/network.c
@@ -877,3 +877,156 @@ virBandwidthDefParseNode(xmlNodePtr node, virBandwidthPtr 
def)
 cleanup:
 return ret;
 }
+
+/**
+ * virBpsToRate:
+ * @buf: output
+ * @rate: input
+ *
+ * Format rate, take bps as input. Do pretty formating.
+ * Caller MUST free @buf after use.
+ *
+ * Return 0 on success, -1 otherwise.
+ */
+int virBpsToRate(char **buf, unsigned long rate) {
+int ret = -1;
+double tmp = (double)rate*8;
+
+if (tmp = 1000.*1000.*1000.) {
+if (virAsprintf(buf, %.0fmbit, tmp/1000./1000.)  0)
+goto cleanup;
+} else if (tmp = 1000.*1000.) {
+if (virAsprintf(buf, %.0fkbit, tmp/1000.)  0)
+goto cleanup;
+} else {
+if (virAsprintf(buf, %.0fbit, tmp)  0)
+goto cleanup;
+}
+
+ret = 0;
+
+cleanup:
+return ret;
+}
+
+/**
+ * virBtoSize:
+ * @buf: output
+ * @size: input
+ *
+ * Format size, take size in bytes, produce prettier format.
+ * Caller MUST free @buf after use.
+ *
+ * Return 0 on success, -1 otherwise.
+ */
+int virBtoSize(char **buf, unsigned long size) {
+int ret = -1;
+double tmp = (double)size;
+
+if (size = 1024*1024 
+fabs(1024*1024 * rint(tmp/(1024*1024)) - size)  1024) {
+if (virAsprintf(buf, %gmb, rint(tmp/(1024*1024)))  0)
+goto cleanup;
+} else if (size = 1024 
+   fabs(1024*rint(tmp/1024) - size)  16) {
+if (virAsprintf(buf, %gkb, rint(tmp/1024))  0)
+goto cleanup;
+} else {
+if (virAsprintf(buf, %lub, size)  0)
+goto cleanup;
+}
+
+ret = 0;
+
+cleanup:
+return ret;
+}
+
+static int
+virBandwidthChildDefFormat(virBufferPtr buf,
+   virRatePtr def,
+   const char *elem_name)
+{
+int ret = -1;
+char *tmp = NULL;
+
+if (!buf || !def || !elem_name)
+return -1;
+
+if (def-average) {
+if (virBpsToRate(tmp, def-average)  0)
+goto cleanup;
+virBufferAsprintf(buf, %s average='%s', elem_name, tmp);
+VIR_FREE(tmp);
+
+if (def-peak) {
+if (virBpsToRate(tmp, def-peak)  0)
+goto cleanup;
+virBufferAsprintf(buf,  peak='%s', tmp);
+VIR_FREE(tmp);
+}
+
+if (def-burst) {
+if (virBtoSize(tmp, def-burst))
+goto cleanup;
+virBufferAsprintf(buf,  burst='%s', tmp);
+VIR_FREE(tmp);
+}
+virBufferAddLit(buf, /\n);
+}
+
+ret = 0;
+
+cleanup:
+return ret;
+}
+
+/**
+ * virBandwidrhDefFormat:
+ * @buf: Buffer to print to
+ * @def: Data source
+ * @indent: prepend all lines printed with this
+ *
+ * Formats bandwidth and prepend each line with @indent.
+ * Passing NULL to @indent is equivalent passing .
+ *
+ * Returns 0 on success, else -1.
+ */
+int
+virBandwidrhDefFormat(virBufferPtr buf,
+  virBandwidthPtr def,
+  const char *indent)
+{
+int ret = -1;
+
+if (!buf || !def)
+goto cleanup;
+
+if (!indent)
+indent = ;
+
+if (!def-in.average  !def-out.average) {
+ret = 0;
+goto cleanup;
+}
+
+virBufferAsprintf(buf, %sbandwidth\n, indent);
+if (def-in.average) {
+