By checking transient interfaces, It obtains the live information of attached interfaces to see if the bridge is in use. Signed-off-by: Lin Ma <lma@xxxxxxxx> --- tools/virsh-interface.c | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/tools/virsh-interface.c b/tools/virsh-interface.c index 5f848b6..ff40be0 100644 --- a/tools/virsh-interface.c +++ b/tools/virsh-interface.c @@ -1040,11 +1040,11 @@ cmdInterfaceUnbridge(vshControl *ctl, const vshCmd *cmd) const char *br_name; char *if_type = NULL, *if_name = NULL; bool nostart = false; - char *br_xml = NULL; + char *br_xml = NULL, *br_xml_transient_if = NULL; xmlChar *if_xml = NULL; int if_xml_size; - xmlDocPtr xml_doc = NULL; - xmlXPathContextPtr ctxt = NULL; + xmlDocPtr xml_doc = NULL, xml_doc_transient_if = NULL; + xmlXPathContextPtr ctxt = NULL, ctxt_transient_if = NULL; xmlNodePtr top_node, if_node, cur; /* Get a handle to the original device */ @@ -1103,6 +1103,22 @@ cmdInterfaceUnbridge(vshControl *ctl, const vshCmd *cmd) goto cleanup; } + /* verify whether there is any transient interface attached to bridge. */ + if (!(br_xml_transient_if = virInterfaceGetXMLDesc(br_handle, 0))) + goto cleanup; + + if (!(xml_doc_transient_if = virXMLParseStringCtxt(br_xml_transient_if, + _("(bridge interface definition)"), + &ctxt_transient_if))) { + vshError(ctl, _("Failed to parse configuration of %s"), br_name); + goto cleanup; + } + + if (virXPathNode("./bridge/interface[2]", ctxt_transient_if) != NULL) { + vshError(ctl, "%s", _("The bridge is in use by transient interfaces")); + goto cleanup; + } + /* Change the type and name of the outer/master interface to * the type/name of the attached slave interface. */ @@ -1198,10 +1214,13 @@ cmdInterfaceUnbridge(vshControl *ctl, const vshCmd *cmd) virInterfaceFree(br_handle); VIR_FREE(if_xml); VIR_FREE(br_xml); + VIR_FREE(br_xml_transient_if); VIR_FREE(if_type); VIR_FREE(if_name); xmlXPathFreeContext(ctxt); + xmlXPathFreeContext(ctxt_transient_if); xmlFreeDoc(xml_doc); + xmlFreeDoc(xml_doc_transient_if); return ret; } -- 1.8.4 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list