On 09/11/2014 07:43 AM, Ján Tomko wrote:
Instead of checking upfront if the <driver> element will be
needed
in a big condition, just format all the attributes into a string
and output the <driver> element if the string is not empty.
---
src/conf/domain_conf.c | 68 ++++++++++++++++++++++++++++++++------------------
1 file changed, 44 insertions(+), 24 deletions(-)
ACK
I left some thoughts below, but I think I convinced myself that this was
the way to go - just figured I'd keep the thoughts there though.
John
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index a2a7d92..fcf7fb6 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -16401,6 +16401,41 @@ virDomainActualNetDefFormat(virBufferPtr buf,
return 0;
}
+
+static int
+virDomainVirtioNetDriverFormat(char **outstr,
+ virDomainNetDefPtr def)
Could perhaps have been:
static char *
virDomainVirtioNetDriverFormat(virDomainNetDefPtr def)
+{
+ virBuffer buf = VIR_BUFFER_INITIALIZER;
+ if (def->driver.virtio.name) {
+ virBufferAsprintf(&buf, "name='%s' ",
+ virDomainNetBackendTypeToString(def->driver.virtio.name));
+ }
+ if (def->driver.virtio.txmode) {
+ virBufferAsprintf(&buf, "txmode='%s' ",
+
virDomainNetVirtioTxModeTypeToString(def->driver.virtio.txmode));
+ }
+ if (def->driver.virtio.ioeventfd) {
+ virBufferAsprintf(&buf, "ioeventfd='%s' ",
+
virTristateSwitchTypeToString(def->driver.virtio.ioeventfd));
+ }
+ if (def->driver.virtio.event_idx) {
+ virBufferAsprintf(&buf, "event_idx='%s' ",
+
virTristateSwitchTypeToString(def->driver.virtio.event_idx));
+ }
+ if (def->driver.virtio.queues)
+ virBufferAsprintf(&buf, "queues='%u' ",
def->driver.virtio.queues);
+
+ virBufferTrim(&buf, " ", -1);
+
+ if (virBufferCheckError(&buf) < 0)
+ return -1;
So an 'error' here is more than likely a memory one (similar to old
code), but the only difference here is you're checking and failing
because of that; whereas, the old code didn't fail right away... Or at
least until the similar error checking was done on the buffer.
Hmm. so I guess this is why you took the approach of passing a string
address to return your string buffer into. This will just cause a bit
faster failure (more than likely) from the
+
+ *outstr = virBufferContentAndReset(&buf);
and return virBufferContentAndReset(&buf);
+ return 0;
+}
+
+
int
virDomainNetDefFormat(virBufferPtr buf,
virDomainNetDefPtr def,
@@ -16576,30 +16611,15 @@ virDomainNetDefFormat(virBufferPtr buf,
if (def->model) {
virBufferEscapeString(buf, "<model type='%s'/>\n",
def->model);
- if (STREQ(def->model, "virtio") &&
- (def->driver.virtio.name || def->driver.virtio.txmode ||
- def->driver.virtio.ioeventfd || def->driver.virtio.event_idx ||
- def->driver.virtio.queues)) {
- virBufferAddLit(buf, "<driver");
- if (def->driver.virtio.name) {
- virBufferAsprintf(buf, " name='%s'",
-
virDomainNetBackendTypeToString(def->driver.virtio.name));
- }
- if (def->driver.virtio.txmode) {
- virBufferAsprintf(buf, " txmode='%s'",
-
virDomainNetVirtioTxModeTypeToString(def->driver.virtio.txmode));
- }
- if (def->driver.virtio.ioeventfd) {
- virBufferAsprintf(buf, " ioeventfd='%s'",
-
virTristateSwitchTypeToString(def->driver.virtio.ioeventfd));
- }
- if (def->driver.virtio.event_idx) {
- virBufferAsprintf(buf, " event_idx='%s'",
-
virTristateSwitchTypeToString(def->driver.virtio.event_idx));
- }
- if (def->driver.virtio.queues)
- virBufferAsprintf(buf, " queues='%u'",
def->driver.virtio.queues);
- virBufferAddLit(buf, "/>\n");
+ if (STREQ(def->model, "virtio")) {
+ char *str;
+
+ if (virDomainVirtioNetDriverFormat(&str, def) < 0)
+ return -1;
+
+ if (str)
+ virBufferAsprintf(buf, "<driver %s/>\n", str);
Of course if you went with return char * option, it'd be
if ((str = virDomainVirtioNetDriverFormat(def)))
virBufferAsprintf(buf, "<driver %s/>\n", str);
+ VIR_FREE(str);
}
}
if (def->filter) {