doRemoteOpenExtractURIArgs(virConnectPtr conn,
char **name,
char **command,
+ GPtrArray **extArgs,
char **sockname,
char **authtype,
char **sshauth,
EXTRACT_URI_ARG_STR("name", *name);
EXTRACT_URI_ARG_STR("command", *command);
+ if (STRCASEEQ(var->name, "argv")) {
+ if (!*extArgs)
+ *extArgs = g_ptr_array_new_with_free_func(g_free);
+ g_ptr_array_add(*extArgs, g_strdup(var->value));
+ var->ignore = 1;
+ continue;
+ }
EXTRACT_URI_ARG_STR("socket", *sockname);
EXTRACT_URI_ARG_STR("auth", *authtype);
EXTRACT_URI_ARG_STR("sshauth", *sshauth);
g_autofree char *tls_priority = NULL;
g_autofree char *name = NULL;
g_autofree char *command = NULL;
+ g_autoptr(GPtrArray) extArgs = NULL;
g_autofree char *sockname = NULL;
g_autofree char *netcat = NULL;
g_autofree char *port = NULL;
if (doRemoteOpenExtractURIArgs(conn,
&name,
&command,
+ &extArgs,
&sockname,
&authtype,
&sshauth,
break;
case REMOTE_DRIVER_TRANSPORT_EXT: {
- char const *cmd_argv[] = { command, NULL };
+ size_t nExtArgs = extArgs ? extArgs->len : 0;
+ g_autofree const char **cmd_argv = NULL;
+ size_t idx;
+
+ if (!(cmd_argv = g_new0(const char *, nExtArgs + 2)))
+ goto error;
+
+ cmd_argv[0] = command;
+
+ for (idx = 0; idx < nExtArgs; idx++)
+ cmd_argv[idx + 1] = g_ptr_array_index(extArgs, idx);
+
if (!(priv->client = virNetClientNewExternal(cmd_argv)))
goto error;