On 02.02.2015 15:08, Lin Ma wrote: > 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(-) Technically, this is a v2 to a previous patch (I mildly recall seeing something like this in the past). > > 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; > } > > ACK. I'll merge this tomorrow (unless somebody beats me). Michal -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list