cmdDetachInterface function checks for live config flags and then passes the live/config domain xml to virshDomainDetachInterface accordingly. Signed-off-by: Nitesh Konkar <nitkon12@xxxxxxxxxxxxxxxxxx> --- tools/virsh-domain.c | 114 +++++++++------------------------------------------ 1 file changed, 19 insertions(+), 95 deletions(-) diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c index 7cb042b..271e229 100644 --- a/tools/virsh-domain.c +++ b/tools/virsh-domain.c @@ -11127,10 +11127,10 @@ virshDomainDetachInterface(char *doc, unsigned int flags, virDomainPtr dom, vshC const char *mac = NULL, *type = NULL; char *detach_xml = NULL, buf[64]; bool current = vshCommandOptBool(cmd, "current"); - int diff_mac,ret; + int diff_mac, ret; size_t i; bool functionReturn = false; - + if (vshCommandOptStringReq(ctl, cmd, "type", &type) < 0) goto cleanup; @@ -11220,23 +11220,13 @@ static bool cmdDetachInterface(vshControl *ctl, const vshCmd *cmd) { virDomainPtr dom = NULL; - xmlDocPtr xml = NULL; - xmlXPathObjectPtr obj = NULL; - xmlXPathContextPtr ctxt = NULL; - xmlNodePtr cur = NULL, matchNode = NULL; - char *detach_xml = NULL; - const char *mac = NULL, *type = NULL; - char *doc = NULL; - char buf[64]; - int diff_mac; - size_t i; - int ret; - bool functionReturn = false; unsigned int flags = VIR_DOMAIN_AFFECT_CURRENT; bool current = vshCommandOptBool(cmd, "current"); bool config = vshCommandOptBool(cmd, "config"); bool live = vshCommandOptBool(cmd, "live"); bool persistent = vshCommandOptBool(cmd, "persistent"); + char *doc_live = NULL, *doc_config = NULL; + bool functionReturn = false; VSH_EXCLUSIVE_OPTIONS_VAR(persistent, current); @@ -11245,108 +11235,42 @@ cmdDetachInterface(vshControl *ctl, const vshCmd *cmd) if (config || persistent) flags |= VIR_DOMAIN_AFFECT_CONFIG; - if (live) - flags |= VIR_DOMAIN_AFFECT_LIVE; if (!(dom = virshCommandOptDomain(ctl, cmd, NULL))) return false; - if (vshCommandOptStringReq(ctl, cmd, "type", &type) < 0) - goto cleanup; - - if (vshCommandOptStringReq(ctl, cmd, "mac", &mac) < 0) - goto cleanup; - if (persistent && virDomainIsActive(dom) == 1) flags |= VIR_DOMAIN_AFFECT_LIVE; - if (flags & VIR_DOMAIN_AFFECT_CONFIG) - doc = virDomainGetXMLDesc(dom, VIR_DOMAIN_XML_INACTIVE); - else - doc = virDomainGetXMLDesc(dom, 0); - - if (!doc) - goto cleanup; - - if (!(xml = virXMLParseStringCtxt(doc, _("(domain_definition)"), &ctxt))) { - vshError(ctl, "%s", _("Failed to get interface information")); - goto cleanup; - } - - snprintf(buf, sizeof(buf), "/domain/devices/interface[@type='%s']", type); - obj = xmlXPathEval(BAD_CAST buf, ctxt); - if (obj == NULL || obj->type != XPATH_NODESET || - obj->nodesetval == NULL || obj->nodesetval->nodeNr == 0) { - vshError(ctl, _("No interface found whose type is %s"), type); - goto cleanup; + if (flags & VIR_DOMAIN_AFFECT_CONFIG) { + doc_config = virDomainGetXMLDesc(dom, VIR_DOMAIN_XML_INACTIVE); + if (!(functionReturn = virshDomainDetachInterface(doc_config, flags, dom, ctl, cmd))) + goto cleanup; } - if (!mac && obj->nodesetval->nodeNr > 1) { - vshError(ctl, _("Domain has %d interfaces. Please specify which one " - "to detach using --mac"), obj->nodesetval->nodeNr); - goto cleanup; - } + if (live || (!live && !config)) + flags |= VIR_DOMAIN_AFFECT_LIVE; - if (!mac) { - matchNode = obj->nodesetval->nodeTab[0]; - goto hit; - } + if (flags & VIR_DOMAIN_AFFECT_LIVE) { + doc_live = virDomainGetXMLDesc(dom, 0); - /* multiple possibilities, so search for matching mac */ - for (i = 0; i < obj->nodesetval->nodeNr; i++) { - cur = obj->nodesetval->nodeTab[i]->children; - while (cur != NULL) { - if (cur->type == XML_ELEMENT_NODE && - xmlStrEqual(cur->name, BAD_CAST "mac")) { - char *tmp_mac = virXMLPropString(cur, "address"); - diff_mac = virMacAddrCompare(tmp_mac, mac); - VIR_FREE(tmp_mac); - if (!diff_mac) { - if (matchNode) { - /* this is the 2nd match, so it's ambiguous */ - vshError(ctl, _("Domain has multiple interfaces matching " - "MAC address %s. You must use detach-device and " - "specify the device pci address to remove it."), - mac); - goto cleanup; - } - matchNode = obj->nodesetval->nodeTab[i]; - } - } - cur = cur->next; - } - } - if (!matchNode) { - vshError(ctl, _("No interface with MAC address %s was found"), mac); - goto cleanup; - } + if (flags & VIR_DOMAIN_AFFECT_CONFIG) + flags &= (~VIR_DOMAIN_AFFECT_CONFIG); - hit: - if (!(detach_xml = virXMLNodeToString(xml, matchNode))) { - vshSaveLibvirtError(); - goto cleanup; + functionReturn = virshDomainDetachInterface(doc_live, flags, dom, ctl, cmd); } - if (flags != 0 || current) - ret = virDomainDetachDeviceFlags(dom, detach_xml, flags); - else - ret = virDomainDetachDevice(dom, detach_xml); - - if (ret != 0) { + cleanup: + if (functionReturn == false) { vshError(ctl, "%s", _("Failed to detach interface")); } else { vshPrint(ctl, "%s", _("Interface detached successfully\n")); functionReturn = true; } - - cleanup: - VIR_FREE(doc); - VIR_FREE(detach_xml); + VIR_FREE(doc_live); + VIR_FREE(doc_config); virDomainFree(dom); - xmlXPathFreeObject(obj); - xmlXPathFreeContext(ctxt); - xmlFreeDoc(xml); return functionReturn; } -- 1.8.3.1 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list