
On Wed, May 13, 2009 at 05:59:38PM +0200, Daniel Veillard wrote:
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.
--- 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 ?
Sort of. The problem was that the original code assumed 'script' was non-NULL. With the way we call it now, it is not guarenteed to be non-NULL. Actually it was never really guarenteed non-NULL ever.
[...]
+ /* 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
I'm not sure what you mean here ? What is happening is that qemudBuildCommandLine() gives us back 2 arrays of strings, char **retargv, and char **retenv. Normally these are passed straight to execve() as is. In this case though, we just concatentation all the strings in the 2 arrays together into one big string, and return this to the caller. So these few lines are just free'ing the 2 arrays we no longer need.
--- 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 ...
You'd pass these kind of values into the 'char *nativeFormat' parameter but I wasn't really considering them part of the stable ABI/API. The config formats each driver supports are specific to particular backends and particular HV versions. So I decided it was better not to expose them directly. Perhaps we could add them to the capabilities XML format though, as dynamically exported data, so they're not ABI.
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 :|