Signed-off-by: Cole Robinson <crobinso(a)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;
--
1.7.4.4