[libvirt] [PATCH 3/2] Make type & startmode optional in toplevel interface definitions.

Laine Stump laine at laine.org
Wed Oct 7 21:04:40 UTC 2009


(Yes, you read the subject correctly - 3 of 2!)

The minimal XML returned from ncf_if_xml_state() doesn't contain these
attributes, and it was preventing it from passing through the
parse/format step (making my patches from earlier today unusable).

Because adding an "UNSPECIFIED" value to the enums for type and
startmode would have made it possible for someone to send xml with,
eg, type="unspecified" (which we don't want), I've followed the
convention already used for the dhcp "peerdns" attribute - if it isn't
specified, the value is -1.

If anyone dislikes this use of an absolute, non-self-documenting
value, I'll figure out a more elegant way. This at least makes the
previous set of patches usable, though ;-)
---
 src/conf/interface_conf.c |   38 ++++++++++++++------------------------
 1 files changed, 14 insertions(+), 24 deletions(-)

diff --git a/src/conf/interface_conf.c b/src/conf/interface_conf.c
index b1926c1..a5aa395 100644
--- a/src/conf/interface_conf.c
+++ b/src/conf/interface_conf.c
@@ -152,11 +152,9 @@ virInterfaceDefParseStartMode(virConnectPtr conn, virInterfaceDefPtr def,
 
     tmp = virXPathString(conn, "string(./start/@mode)", ctxt);
     if (tmp == NULL) {
-        virInterfaceReportError(conn, VIR_ERR_XML_ERROR,
-                        "%s", _("interface misses the start mode attribute"));
-        return(-1);
+        def->startmode = -1; /* not specified */
     }
-    if (STREQ(tmp, "onboot"))
+    else if (STREQ(tmp, "onboot"))
         def->startmode = VIR_INTERFACE_START_ONBOOT;
     else if (STREQ(tmp, "hotplug"))
         def->startmode = VIR_INTERFACE_START_HOTPLUG;
@@ -741,18 +739,7 @@ virInterfaceDefParseXML(virConnectPtr conn, xmlXPathContextPtr ctxt) {
 
     /* check @type */
     tmp = virXPathString(conn, "string(./@type)", ctxt);
-    if (tmp == NULL) {
-        virInterfaceReportError(conn, VIR_ERR_XML_ERROR,
-                                "%s", _("interface misses the type attribute"));
-        return(NULL);
-    }
     type = virInterfaceTypeFromString(tmp);
-    if (type == -1) {
-        virInterfaceReportError(conn, VIR_ERR_XML_ERROR,
-                                _("unknown interface type %s"), tmp);
-        VIR_FREE(tmp);
-        return(NULL);
-    }
     VIR_FREE(tmp);
 
     if (VIR_ALLOC(def) < 0) {
@@ -761,6 +748,7 @@ virInterfaceDefParseXML(virConnectPtr conn, xmlXPathContextPtr ctxt) {
     }
     def->type = type;
     switch (type) {
+        case -1:
         case VIR_INTERFACE_TYPE_ETHERNET:
             if (virInterfaceDefParseBasicAttrs(conn, def, ctxt) < 0)
                 goto error;
@@ -1202,9 +1190,7 @@ virInterfaceStartmodeDefFormat(virConnectPtr conn, virBufferPtr buf,
             mode = "hotplug";
             break;
         default:
-            virInterfaceReportError(conn, VIR_ERR_INTERNAL_ERROR,
-                        "%s", _("virInterfaceDefFormat unknown startmode"));
-            return -1;
+            return 0;
     }
     virBufferVSprintf(buf, "  <start mode='%s'/>\n", mode);
     return(0);
@@ -1223,18 +1209,22 @@ char *virInterfaceDefFormat(virConnectPtr conn,
         goto cleanup;
     }
 
-    if (!(type = virInterfaceTypeToString(def->type))) {
-        virInterfaceReportError(conn, VIR_ERR_INTERNAL_ERROR,
-                        _("unexpected interface type %d"), def->type);
-        goto cleanup;
+    if (def->type == -1) {
+        virBufferAddLit(&buf, "<interface ");
+    } else {
+        if (!(type = virInterfaceTypeToString(def->type))) {
+            virInterfaceReportError(conn, VIR_ERR_INTERNAL_ERROR,
+                                    _("unexpected interface type %d"), def->type);
+            goto cleanup;
+        }
+        virBufferVSprintf(&buf, "<interface type='%s' ", type);
     }
-
-    virBufferVSprintf(&buf, "<interface type='%s' ", type);
     if (def->name != NULL)
         virBufferEscapeString(&buf, "name='%s'", def->name);
     virBufferAddLit(&buf, ">\n");
 
     switch (def->type) {
+        case -1:
         case VIR_INTERFACE_TYPE_ETHERNET:
             virInterfaceStartmodeDefFormat(conn, &buf, def->startmode);
             if (def->mac != NULL)
-- 
1.6.2.5




More information about the libvir-list mailing list