On 05/10/2011 05:49 AM, Daniel P. Berrange wrote: > 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 >
Thanks, pushed the series. - Cole -- libvir-list mailing list libvir-list@redhat.com https://www.redhat.com/mailman/listinfo/libvir-list