]> xenbits.xensource.com Git - libvirt.git/commitdiff
conf: add virDomainDefAddController()
authorLaine Stump <laine@laine.org>
Fri, 6 Nov 2015 18:01:29 +0000 (13:01 -0500)
committerLaine Stump <laine@laine.org>
Mon, 11 Jan 2016 18:08:26 +0000 (13:08 -0500)
We need a virDomainDefAddController() that doesn't check for an
existing controller at the same index (since USB2 controllers must be
added in sets of 4 that are all at the same index), so rather than
duplicating the code in virDomainDefMaybeAddController(), split it
into two functions, in the process eliminating existing duplicated
code that loops through the controller list by calling
virDomainControllerFind(), which does the same thing).

src/conf/domain_conf.c

index a9b424960291a4e6ca0f927a32e61e33443b4e82..56d596531e70c6616eef83cf8b58eab4446739fc 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * domain_conf.c: domain XML processing
  *
- * Copyright (C) 2006-2015 Red Hat, Inc.
+ * Copyright (C) 2006-2016 Red Hat, Inc.
  * Copyright (C) 2006-2008 Daniel P. Berrange
  * Copyright (c) 2015 SUSE LINUX Products GmbH, Nuernberg, Germany.
  *
@@ -13336,6 +13336,18 @@ virDomainControllerFind(virDomainDefPtr def,
 }
 
 
+static int
+virDomainControllerFindUnusedIndex(virDomainDefPtr def, int type)
+{
+    int idx = 0;
+
+    while (virDomainControllerFind(def, type, idx) >= 0)
+        idx++;
+
+    return idx;
+}
+
+
 const char *
 virDomainControllerAliasFind(virDomainDefPtr def,
                              int type, int idx)
@@ -14255,33 +14267,44 @@ virDomainEmulatorPinDefParseXML(xmlNodePtr node)
 }
 
 
-int
-virDomainDefMaybeAddController(virDomainDefPtr def,
-                               int type,
-                               int idx,
-                               int model)
+static virDomainControllerDefPtr
+virDomainDefAddController(virDomainDefPtr def, int type, int idx, int model)
 {
-    size_t i;
     virDomainControllerDefPtr cont;
 
-    for (i = 0; i < def->ncontrollers; i++) {
-        if (def->controllers[i]->type == type &&
-            def->controllers[i]->idx == idx)
-            return 0;
-    }
-
     if (!(cont = virDomainControllerDefNew(type)))
-        return -1;
+        return NULL;
+
+    if (idx < 0)
+        idx = virDomainControllerFindUnusedIndex(def, type);
 
     cont->idx = idx;
     cont->model = model;
 
-    if (VIR_APPEND_ELEMENT(def->controllers, def->ncontrollers, cont) < 0) {
+    if (VIR_APPEND_ELEMENT_COPY(def->controllers, def->ncontrollers, cont) < 0) {
         VIR_FREE(cont);
-        return -1;
+        return NULL;
     }
 
-    return 1;
+    return cont;
+}
+
+
+int
+virDomainDefMaybeAddController(virDomainDefPtr def,
+                               int type,
+                               int idx,
+                               int model)
+{
+    /* skip if a specific index was given and it is already
+     * in use for that type of controller
+     */
+    if (idx >= 0 && virDomainControllerFind(def, type, idx) >= 0)
+        return 0;
+
+    if (virDomainDefAddController(def, type, idx, model))
+        return 1;
+    return -1;
 }