[libvirt] [PATCH 6/6] lxc: container: Build init cmd before we close stdout

Daniel P. Berrange berrange at redhat.com
Tue May 10 09:49:02 UTC 2011


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 <crobinso at 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 :|




More information about the libvir-list mailing list