[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