[libvirt] [PATCH 11/16] remote: Convert SSH tunnel to virCommand

Daniel P. Berrange berrange at redhat.com
Wed May 11 10:34:24 UTC 2011


On Tue, May 10, 2011 at 04:07:50PM -0400, Cole Robinson wrote:
> 
> Signed-off-by: Cole Robinson <crobinso at redhat.com>
> ---
>  src/remote/remote_driver.c |   65 ++++++++++++-------------------------------
>  1 files changed, 18 insertions(+), 47 deletions(-)
> 
> diff --git a/src/remote/remote_driver.c b/src/remote/remote_driver.c
> index 1072f9f..15f9941 100644
> --- a/src/remote/remote_driver.c
> +++ b/src/remote/remote_driver.c
> @@ -433,8 +433,8 @@ doRemoteOpen (virConnectPtr conn,
>      char *name = NULL, *command = NULL, *sockname = NULL, *netcat = NULL;
>      char *port = NULL, *authtype = NULL, *username = NULL;
>      int no_verify = 0, no_tty = 0;
> -    char **cmd_argv = NULL;
>      char *pkipath = NULL;
> +    virCommandPtr cmd = NULL;
>  
>      /* Return code from this function, and the private data. */
>      int retcode = VIR_DRV_OPEN_ERROR;
> @@ -748,50 +748,26 @@ doRemoteOpen (virConnectPtr conn,
>      }
>  
>      case trans_ssh: {
> -        int j, nr_args = 6;
> -
> -        if (username) nr_args += 2; /* For -l username */
> -        if (no_tty) nr_args += 5;   /* For -T -o BatchMode=yes -e none */
> -        if (port) nr_args += 2;     /* For -p port */
> -
> -        command = command ? command : strdup ("ssh");
> -        if (command == NULL)
> -            goto out_of_memory;
> +        cmd = virCommandNew(command ? command : "ssh");
>  
>          /* Generate the final command argv[] array.
> -         *   ssh [-p $port] [-l $username] $hostname $netcat -U $sockname [NULL] */
> -        if (VIR_ALLOC_N(cmd_argv, nr_args) < 0)
> -            goto out_of_memory;
> +         *   ssh [-p $port] [-l $username] $hostname $netcat -U $sockname */
>  
> -        j = 0;
> -        cmd_argv[j++] = strdup (command);
>          if (port) {
> -            cmd_argv[j++] = strdup ("-p");
> -            cmd_argv[j++] = strdup (port);
> +            virCommandAddArgList(cmd, "-p", port, NULL);
>          }
>          if (username) {
> -            cmd_argv[j++] = strdup ("-l");
> -            cmd_argv[j++] = strdup (username);
> +            virCommandAddArgList(cmd, "-l", username, NULL);
>          }
>          if (no_tty) {
> -            cmd_argv[j++] = strdup ("-T");
> -            cmd_argv[j++] = strdup ("-o");
> -            cmd_argv[j++] = strdup ("BatchMode=yes");
> -            cmd_argv[j++] = strdup ("-e");
> -            cmd_argv[j++] = strdup ("none");
> +            virCommandAddArgList(cmd, "-T", "-o", "BatchMode=yes", "-e",
> +                                 "none", NULL);
>          }
> -        cmd_argv[j++] = strdup (priv->hostname);
> -        cmd_argv[j++] = strdup (netcat ? netcat : "nc");
> -        cmd_argv[j++] = strdup ("-U");
> -        cmd_argv[j++] = strdup (sockname ? sockname :
> -                                (flags & VIR_CONNECT_RO
> -                                 ? LIBVIRTD_PRIV_UNIX_SOCKET_RO
> -                                 : LIBVIRTD_PRIV_UNIX_SOCKET));
> -        cmd_argv[j++] = 0;
> -        assert (j == nr_args);
> -        for (j = 0; j < (nr_args-1); j++)
> -            if (cmd_argv[j] == NULL)
> -                goto out_of_memory;
> +        virCommandAddArgList(cmd, priv->hostname, netcat ? netcat : "nc",
> +                             "-U", (sockname ? sockname :
> +                                    (flags & VIR_CONNECT_RO
> +                                     ? LIBVIRTD_PRIV_UNIX_SOCKET_RO
> +                                     : LIBVIRTD_PRIV_UNIX_SOCKET)), NULL);
>  
>          priv->is_secure = 1;
>      }
> @@ -818,9 +794,11 @@ doRemoteOpen (virConnectPtr conn,
>              goto failed;
>          }
>  
> -        if (virExec((const char**)cmd_argv, NULL, NULL,
> -                    &pid, sv[1], &(sv[1]), &(errfd[1]),
> -                    VIR_EXEC_CLEAR_CAPS) < 0)
> +        virCommandSetInputFD(cmd, sv[1]);
> +        virCommandSetOutputFD(cmd, &(sv[1]));
> +        virCommandSetErrorFD(cmd, &(errfd[1]));
> +        virCommandClearCaps(cmd);
> +        if (virCommandRunAsync(cmd, &pid) < 0)
>              goto failed;
>  
>          /* Parent continues here. */
> @@ -957,14 +935,7 @@ doRemoteOpen (virConnectPtr conn,
>      VIR_FREE(netcat);
>      VIR_FREE(username);
>      VIR_FREE(port);
> -    if (cmd_argv) {
> -        char **cmd_argv_ptr = cmd_argv;
> -        while (*cmd_argv_ptr) {
> -            VIR_FREE(*cmd_argv_ptr);
> -            cmd_argv_ptr++;
> -        }
> -        VIR_FREE(cmd_argv);
> -    }
> +    virCommandFree(cmd);
>      VIR_FREE(pkipath);
>  
>      return retcode;


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