On Fri, Oct 16, 2009 at 10:56:18AM -0400, laine@xxxxxxxxx wrote: > From: Laine Stump <laine@xxxxxxxxx> > > This patch adds the flag VIR_INTERFACE_XML_INACTIVE to > virInterfaceGetXMLDesc's flags. When it is*not* set (the default), the > live interface info will be returned in the XML (in particular, the IP > address(es) and netmask(s) will be retrieved by querying the interface > directly, rather than reporting what's in the config file). The > backend of this is in netcf's ncf_if_xml_state() function. > > Note that after this patch is applied, netcf support will be omitted > from the build unless you have netcf-devel-0.1.3 or better installed. > --- > configure.in | 2 +- > include/libvirt/libvirt.h.in | 4 +++ > libvirt.spec.in | 2 +- > src/conf/interface_conf.c | 53 +++++++++++++++++++----------------------- > src/interface/netcf_driver.c | 8 ++++- > src/libvirt.c | 15 ++++++++--- > tools/virsh.c | 10 ++++++- > 7 files changed, 55 insertions(+), 39 deletions(-) > > diff --git a/configure.in b/configure.in > index 2f9db72..3402b4f 100644 > --- a/configure.in > +++ b/configure.in > @@ -33,7 +33,7 @@ GNUTLS_REQUIRED="1.0.25" > AVAHI_REQUIRED="0.6.0" > POLKIT_REQUIRED="0.6" > PARTED_REQUIRED="1.8.0" > -NETCF_REQUIRED="0.0.1" > +NETCF_REQUIRED="0.1.3" > > dnl Checks for C compiler. > AC_PROG_CC > diff --git a/include/libvirt/libvirt.h.in b/include/libvirt/libvirt.h.in > index 6186d4e..7e75bee 100644 > --- a/include/libvirt/libvirt.h.in > +++ b/include/libvirt/libvirt.h.in > @@ -930,6 +930,10 @@ virInterfacePtr virInterfaceLookupByMACString (virConnectPtr conn, > const char* virInterfaceGetName (virInterfacePtr iface); > const char* virInterfaceGetMACString (virInterfacePtr iface); > > +typedef enum { > + VIR_INTERFACE_XML_INACTIVE = 1 /* dump inactive interface information */ > +} virInterfaceXMLFlags; > + > char * virInterfaceGetXMLDesc (virInterfacePtr iface, > unsigned int flags); > virInterfacePtr virInterfaceDefineXML (virConnectPtr conn, > diff --git a/libvirt.spec.in b/libvirt.spec.in > index 6cd0888..32596d4 100644 > --- a/libvirt.spec.in > +++ b/libvirt.spec.in > @@ -308,7 +308,7 @@ BuildRequires: libcap-ng-devel >= 0.5.0 > BuildRequires: libssh2-devel > %endif > %if %{with_netcf} > -BuildRequires: netcf-devel > +BuildRequires: netcf-devel >= 0.1.3 > %endif > > # Fedora build root suckage > diff --git a/src/conf/interface_conf.c b/src/conf/interface_conf.c > index 540c931..d46f7ac 100644 > --- a/src/conf/interface_conf.c > +++ b/src/conf/interface_conf.c > @@ -279,22 +279,19 @@ virInterfaceDefParseIp(virConnectPtr conn, virInterfaceDefPtr def, > static int > virInterfaceDefParseProtoIPv4(virConnectPtr conn, virInterfaceDefPtr def, > xmlXPathContextPtr ctxt) { > - xmlNodePtr cur; > - int ret; > + xmlNodePtr dhcp, ip; > + int ret = 0; > > - cur = virXPathNode(conn, "./dhcp", ctxt); > - if (cur != NULL) > - ret = virInterfaceDefParseDhcp(conn, def, cur, ctxt); > - else { > - cur = virXPathNode(conn, "./ip", ctxt); > - if (cur != NULL) > - ret = virInterfaceDefParseIp(conn, def, cur, ctxt); > - else { > - virInterfaceReportError(conn, VIR_ERR_XML_ERROR, > - "%s", _("interface miss dhcp or ip adressing")); > - ret = -1; > - } > - } > + dhcp = virXPathNode(conn, "./dhcp", ctxt); > + if (dhcp != NULL) > + ret = virInterfaceDefParseDhcp(conn, def, dhcp, ctxt); > + > + if (ret != 0) > + return(ret); > + > + ip = virXPathNode(conn, "./ip", ctxt); > + if (ip != NULL) > + ret = virInterfaceDefParseIp(conn, def, ip, ctxt); > return(ret); > } > > @@ -1012,20 +1009,18 @@ virInterfaceProtocolDefFormat(virConnectPtr conn ATTRIBUTE_UNUSED, > virBufferAddLit(buf, " <dhcp peerdns='yes'/>\n"); > else > virBufferAddLit(buf, " <dhcp/>\n"); > - } else { > - /* theorically if we don't have dhcp we should have an address */ > - if (def->proto.address != NULL) { > - if (def->proto.prefix != 0) > - virBufferVSprintf(buf, " <ip address='%s' prefix='%d'/>\n", > - def->proto.address, def->proto.prefix); > - else > - virBufferVSprintf(buf, " <ip address='%s'/>\n", > - def->proto.address); > - } > - if (def->proto.gateway != NULL) { > - virBufferVSprintf(buf, " <route gateway='%s'/>\n", > - def->proto.gateway); > - } > + } > + if (def->proto.address != NULL) { > + if (def->proto.prefix != 0) > + virBufferVSprintf(buf, " <ip address='%s' prefix='%d'/>\n", > + def->proto.address, def->proto.prefix); > + else > + virBufferVSprintf(buf, " <ip address='%s'/>\n", > + def->proto.address); > + } > + if (def->proto.gateway != NULL) { > + virBufferVSprintf(buf, " <route gateway='%s'/>\n", > + def->proto.gateway); > } > virBufferAddLit(buf, " </protocol>\n"); > return(0); > diff --git a/src/interface/netcf_driver.c b/src/interface/netcf_driver.c > index ca14fb0..b5c3664 100644 > --- a/src/interface/netcf_driver.c > +++ b/src/interface/netcf_driver.c > @@ -326,7 +326,7 @@ cleanup: > } > > static char *interfaceGetXMLDesc(virInterfacePtr ifinfo, > - unsigned int flags ATTRIBUTE_UNUSED) > + unsigned int flags) > { > struct interface_driver *driver = ifinfo->conn->interfacePrivateData; > struct netcf_if *iface = NULL; > @@ -342,7 +342,11 @@ static char *interfaceGetXMLDesc(virInterfacePtr ifinfo, > goto cleanup; > } > > - xmlstr = ncf_if_xml_desc(iface); > + if ((flags & VIR_INTERFACE_XML_INACTIVE)) { > + xmlstr = ncf_if_xml_desc(iface); > + } else { > + xmlstr = ncf_if_xml_state(iface); > + } > if (!xmlstr) { > const char *errmsg, *details; > int errcode = ncf_error(driver->netcf, &errmsg, &details); > diff --git a/src/libvirt.c b/src/libvirt.c > index 92a1eaa..c7d6bcc 100644 > --- a/src/libvirt.c > +++ b/src/libvirt.c > @@ -6198,10 +6198,17 @@ virInterfaceGetMACString(virInterfacePtr iface) > /** > * virInterfaceGetXMLDesc: > * @iface: an interface object > - * @flags: an OR'ed set of extraction flags, not used yet > + * @flags: an OR'ed set of extraction flags. Current valid bits: > + * > + * VIR_INTERFACE_XML_INACTIVE - return the static configuration, > + * suitable for use redefining the > + * interface via virInterfaceDefineXML() > * > - * Provide an XML description of the interface. The description may be reused > - * later to redefine the interface with virInterfaceDefineXML(). > + * Provide an XML description of the interface. If > + * VIR_INTERFACE_XML_INACTIVE is set, the description may be reused > + * later to redefine the interface with virInterfaceDefineXML(). If it > + * is not set, the ip address and netmask will be the current live > + * setting of the interface, not the settings from the config files. > * > * Returns a 0 terminated UTF-8 encoded XML instance, or NULL in case of error. > * the caller must free() the returned value. > @@ -6218,7 +6225,7 @@ virInterfaceGetXMLDesc(virInterfacePtr iface, unsigned int flags) > virLibInterfaceError(NULL, VIR_ERR_INVALID_INTERFACE, __FUNCTION__); > return (NULL); > } > - if (flags != 0) { > + if ((flags & ~VIR_INTERFACE_XML_INACTIVE) != 0) { > virLibInterfaceError(iface, VIR_ERR_INVALID_ARG, __FUNCTION__); > goto error; > } > diff --git a/tools/virsh.c b/tools/virsh.c > index 47122d5..322de30 100644 > --- a/tools/virsh.c > +++ b/tools/virsh.c > @@ -2792,7 +2792,7 @@ cmdInterfaceEdit (vshControl *ctl, const vshCmd *cmd) > char *doc = NULL; > char *doc_edited = NULL; > char *doc_reread = NULL; > - int flags = 0; > + int flags = VIR_INTERFACE_XML_INACTIVE; > > if (!vshConnectionUsability(ctl, ctl->conn, TRUE)) > goto cleanup; > @@ -3326,6 +3326,7 @@ static const vshCmdInfo info_interface_dumpxml[] = { > > static const vshCmdOptDef opts_interface_dumpxml[] = { > {"interface", VSH_OT_DATA, VSH_OFLAG_REQ, gettext_noop("interface name or MAC address")}, > + {"inactive", VSH_OT_BOOL, 0, gettext_noop("show inactive defined XML")}, > {NULL, 0, 0, NULL} > }; > > @@ -3335,6 +3336,11 @@ cmdInterfaceDumpXML(vshControl *ctl, const vshCmd *cmd) > virInterfacePtr iface; > int ret = TRUE; > char *dump; > + int flags = 0; > + int inactive = vshCommandOptBool(cmd, "inactive"); > + > + if (inactive) > + flags |= VIR_INTERFACE_XML_INACTIVE; > > if (!vshConnectionUsability(ctl, ctl->conn, TRUE)) > return FALSE; > @@ -3342,7 +3348,7 @@ cmdInterfaceDumpXML(vshControl *ctl, const vshCmd *cmd) > if (!(iface = vshCommandOptInterface(ctl, cmd, NULL))) > return FALSE; > > - dump = virInterfaceGetXMLDesc(iface, 0); > + dump = virInterfaceGetXMLDesc(iface, flags); > if (dump != NULL) { > printf("%s", dump); > free(dump); > -- ACK Daniel -- |: Red Hat, Engineering, London -o- http://people.redhat.com/berrange/ :| |: http://libvirt.org -o- http://virt-manager.org -o- http://ovirt.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: GnuPG: 7D3B9505 -o- F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :| -- Libvir-list mailing list Libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list