On Fri, May 06, 2011 at 01:26:11PM -0400, Cole Robinson wrote: > That way we can log the 'init' argv for debugging. > > Signed-off-by: Cole Robinson <crobi...@redhat.com> > --- > src/lxc/lxc_container.c | 41 +++++++++++++++++++++++++---------------- > 1 files changed, 25 insertions(+), 16 deletions(-) > > diff --git a/src/lxc/lxc_container.c b/src/lxc/lxc_container.c > index 4b31479..8b229ed 100644 > --- a/src/lxc/lxc_container.c > +++ b/src/lxc/lxc_container.c > @@ -94,15 +94,14 @@ struct __lxc_child_argv { > > > /** > - * lxcContainerExecInit: > + * lxcContainerBuildInitCmd: > * @vmDef: pointer to vm definition structure > * > - * Exec the container init string. The container init will replace then > - * be running in the current process > + * Build a virCommandPtr for launching the container 'init' process > * > - * Does not return > + * Returns a virCommandPtr > */ > -static int lxcContainerExecInit(virDomainDefPtr vmDef) > +static virCommandPtr lxcContainerBuildInitCmd(virDomainDefPtr vmDef) > { > char uuidstr[VIR_UUID_STRING_BUFLEN]; > virCommandPtr cmd; > @@ -116,7 +115,7 @@ static int lxcContainerExecInit(virDomainDefPtr vmDef) > virCommandAddEnvPair(cmd, "LIBVIRT_LXC_UUID", uuidstr); > virCommandAddEnvPair(cmd, "LIBVIRT_LXC_NAME", vmDef->name); > > - return virCommandExec(cmd); > + return cmd; > } > > /** > @@ -753,28 +752,34 @@ static int lxcContainerChild( void *data ) > lxc_child_argv_t *argv = data; > virDomainDefPtr vmDef = argv->config; > int ttyfd; > + int ret = -1; > char *ttyPath; > virDomainFSDefPtr root; > + virCommandPtr cmd = NULL; > > if (NULL == vmDef) { > lxcError(VIR_ERR_INTERNAL_ERROR, > "%s", _("lxcChild() passed invalid vm definition")); > - return -1; > + goto cleanup; > } > > + cmd = lxcContainerBuildInitCmd(vmDef); > + virCommandWriteArgLog(cmd, 1); > + > root = virDomainGetRootFilesystem(vmDef); > > if (root) { > if (virAsprintf(&ttyPath, "%s%s", root->src, argv->ttyPath) < 0) { > virReportOOMError(); > - return -1; > + goto cleanup; > } > } else { > if (!(ttyPath = strdup(argv->ttyPath))) { > virReportOOMError(); > - return -1; > + goto cleanup; > } > } > + VIR_DEBUG("Container TTY path: %s", ttyPath); > > ttyfd = open(ttyPath, O_RDWR|O_NOCTTY); > if (ttyfd < 0) { > @@ -782,34 +787,38 @@ static int lxcContainerChild( void *data ) > _("Failed to open tty %s"), > ttyPath); > VIR_FREE(ttyPath); > - return -1; > + goto cleanup; > } > VIR_FREE(ttyPath); > > if (lxcContainerSetStdio(argv->monitor, ttyfd) < 0) { > VIR_FORCE_CLOSE(ttyfd); > - return -1; > + goto cleanup; > } > VIR_FORCE_CLOSE(ttyfd); > > if (lxcContainerSetupMounts(vmDef, root) < 0) > - return -1; > + goto cleanup; > > /* Wait for interface devices to show up */ > if (lxcContainerWaitForContinue(argv->monitor) < 0) > - return -1; > + goto cleanup; > > /* rename and enable interfaces */ > if (lxcContainerRenameAndEnableInterfaces(argv->nveths, > argv->veths) < 0) > - return -1; > + goto cleanup; > > /* drop a set of root capabilities */ > if (lxcContainerDropCapabilities() < 0) > - return -1; > + goto cleanup; > > /* this function will only return if an error occured */ > - return lxcContainerExecInit(vmDef); > + ret = virCommandExec(cmd); > + > +cleanup: > + virCommandFree(cmd); > + return ret; > }
ACK Daniel -- |: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :| |: http://libvirt.org -o- http://virt-manager.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :| -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list