On Wed, May 13, 2009 at 03:38:57PM +0100, Daniel P. Berrange wrote:
This patches provides an implenmentation of the new APIs for Xen
which
can convert to/from both XM config format (/etc/xen files), and the
SEXPR format used by XenD. The former is most useful to end users, but
it was easy to add the latter too, so I did. It can be a useful debugging
aid sometimes. For QEMU, it implemnets export of domain XML into the
QEMU argv format.
qemu_conf.c | 25 +++++-------
qemu_conf.h | 3 +
qemu_driver.c | 119 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
xen_unified.c | 95 +++++++++++++++++++++++++++++++++++++++++++++-
xen_unified.h | 3 +
5 files changed, 228 insertions(+), 17 deletions(-)
Daniel
diff -r f55fa9b69d85 src/qemu_conf.c
--- a/src/qemu_conf.c Wed May 13 13:13:18 2009 +0100
+++ b/src/qemu_conf.c Wed May 13 13:16:50 2009 +0100
@@ -1248,21 +1248,18 @@ int qemudBuildCommandLine(virConnectPtr
case VIR_DOMAIN_NET_TYPE_ETHERNET:
{
- char arg[PATH_MAX];
- if (net->ifname) {
- if (snprintf(arg, PATH_MAX-1,
"tap,ifname=%s,script=%s,vlan=%d",
- net->ifname,
- net->data.ethernet.script,
- vlan) >= (PATH_MAX-1))
- goto error;
- } else {
- if (snprintf(arg, PATH_MAX-1,
"tap,script=%s,vlan=%d",
- net->data.ethernet.script,
- vlan) >= (PATH_MAX-1))
- goto error;
- }
+ virBuffer buf = VIR_BUFFER_INITIALIZER;
- ADD_ARG_LIT(arg);
+ virBufferAddLit(&buf, "tap");
+ if (net->ifname)
+ virBufferVSprintf(&buf, ",ifname=%s",
net->ifname);
+ if (net->data.ethernet.script)
+ virBufferVSprintf(&buf, ",script=%s",
net->data.ethernet.script);
+ virBufferVSprintf(&buf, ",vlan=%d", vlan);
+ if (virBufferError(&buf))
+ goto error;
+
+ ADD_ARG(virBufferContentAndReset(&buf));
}
break;
Hum, that part looks a bit orthogonal to the patch itself, isn't it ?
[...]
+ /* Since we're just exporting args, we can't do
bridge/network
+ * setups, since libvirt will normally create TAP devices
+ * directly. We convert those configs into generic 'ethernet'
+ * config and assume the user has suitable 'ifup-qemu' scripts
+ */
+ for (i = 0 ; i < def->nnets ; i++) {
+ virDomainNetDefPtr net = def->nets[i];
+ if (net->type == VIR_DOMAIN_NET_TYPE_NETWORK) {
+ VIR_FREE(net->data.network.name);
+ net->type = VIR_DOMAIN_NET_TYPE_ETHERNET;
+ net->data.ethernet.dev = NULL;
+ net->data.ethernet.script = NULL;
+ net->data.ethernet.ipaddr = NULL;
+ } else if (net->type == VIR_DOMAIN_NET_TYPE_BRIDGE) {
+ net->type = VIR_DOMAIN_NET_TYPE_ETHERNET;
+ /* Rely on fact that the 'ethernet' and 'bridge'
+ * union structs have members in same place */
Hum, it's a bit fishy... why not play safe, shaving a couple
microseconds here is probably not worth it.
[...]
+cleanup:
+ for (tmp = retargv ; tmp && *tmp ; tmp++)
weird, we use a static string just for "" ?
+ VIR_FREE(*tmp);
+ VIR_FREE(retargv);
+
+ for (tmp = retenv ; tmp && *tmp ; tmp++)
same
+ VIR_FREE(*tmp);
+ VIR_FREE(retenv);
[...]
--- a/src/xen_unified.h Wed May 13 13:13:18 2009 +0100
+++ b/src/xen_unified.h Wed May 13 13:16:50 2009 +0100
@@ -46,6 +46,9 @@ extern int xenRegister (void);
#define MIN_XEN_GUEST_SIZE 64 /* 64 megabytes */
+#define XEN_CONFIG_FORMAT_XM "xen-xm"
+#define XEN_CONFIG_FORMAT_SEXPR "xen-sxpr"
Actually, shouldn't those be part of the public headers instead
I'm afraid I'm missing something here ...
Daniel
--
Daniel Veillard | libxml Gnome XML XSLT toolkit
http://xmlsoft.org/
daniel(a)veillard.com | Rpmfind RPM search engine
http://rpmfind.net/
http://veillard.com/ | virtualization library
http://libvirt.org/