On 10/29/25 16:30, Sergey Dyasli wrote:
> Allow passing arguments to the ext program via the query parameters. The
> name of each argument is "argv" and it can be repeated multiple times to
> pass several arguments.
>
> URI example:
>
> qemu+ext:///system?command=/bin/prog&argv=192.168.0.10&argv=8080
>
> Suggested-by: Daniel P. Berrangé <[email protected]>
> Signed-off-by: Sergey Dyasli <[email protected]>
>
> ---
> v1 --> v2:
> - Renamed the parameters to argv which are gathered into an array now
>
> ---
> src/remote/remote_driver.c | 23 ++++++++++++++++++++++-
> 1 file changed, 22 insertions(+), 1 deletion(-)
This introduces new parameters and therefore MUST be paired with
documentation change. There's a section in docs/uri.rst that covers the
'ext' transport.
>
> diff --git a/src/remote/remote_driver.c b/src/remote/remote_driver.c
> index ec71eaed8762..70ec3dee4443 100644
> --- a/src/remote/remote_driver.c
> +++ b/src/remote/remote_driver.c
> @@ -805,6 +805,7 @@ static int
> doRemoteOpenExtractURIArgs(virConnectPtr conn,
> char **name,
> char **command,
> + GPtrArray *extArgs,
> char **sockname,
> char **authtype,
> char **sshauth,
> @@ -829,6 +830,13 @@ doRemoteOpenExtractURIArgs(virConnectPtr conn,
>
> 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;
> + }
This doesn't do what you'd wish it did. It modifies a local variable,
but caller doesn't see the change, i.e. parsed arguments.
> EXTRACT_URI_ARG_STR("socket", *sockname);
> EXTRACT_URI_ARG_STR("auth", *authtype);
> EXTRACT_URI_ARG_STR("sshauth", *sshauth);
> @@ -895,6 +903,7 @@ doRemoteOpen(virConnectPtr conn,
> 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;
> @@ -945,6 +954,7 @@ doRemoteOpen(virConnectPtr conn,
> if (doRemoteOpenExtractURIArgs(conn,
> &name,
> &command,
> + extArgs,
> &sockname,
> &authtype,
> &sshauth,
> @@ -1195,7 +1205,18 @@ doRemoteOpen(virConnectPtr conn,
> break;
>
> case REMOTE_DRIVER_TRANSPORT_EXT: {
> - char const *cmd_argv[] = { command, NULL };
> + size_t nExtArgs = extArgs ? extArgs->len : 0;
We tend to get rid of ternary operators instead of introducing new ones.
> + 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;
>
Please squash in the following:
diff --git i/src/remote/remote_driver.c w/src/remote/remote_driver.c
index 768cbe67f7..c74fd1e64f 100644
--- i/src/remote/remote_driver.c
+++ w/src/remote/remote_driver.c
@@ -805,7 +805,7 @@ static int
doRemoteOpenExtractURIArgs(virConnectPtr conn,
char **name,
char **command,
- GPtrArray *extArgs,
+ GPtrArray **extArgs,
char **sockname,
char **authtype,
char **sshauth,
@@ -831,9 +831,9 @@ doRemoteOpenExtractURIArgs(virConnectPtr conn,
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));
+ 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;
}
@@ -954,7 +954,7 @@ doRemoteOpen(virConnectPtr conn,
if (doRemoteOpenExtractURIArgs(conn,
&name,
&command,
- extArgs,
+ &extArgs,
&sockname,
&authtype,
&sshauth,
@@ -1205,17 +1205,18 @@ doRemoteOpen(virConnectPtr conn,
break;
case REMOTE_DRIVER_TRANSPORT_EXT: {
- size_t nExtArgs = extArgs ? extArgs->len : 0;
g_autofree const char **cmd_argv = NULL;
- size_t idx;
+ size_t nExtArgs = 0;
+ size_t i;
- if (!(cmd_argv = g_new0(const char *, nExtArgs + 2)))
- goto error;
+ if (extArgs)
+ nExtArgs = extArgs->len;
+ cmd_argv = g_new0(const char *, nExtArgs + 2);
cmd_argv[0] = command;
- for (idx = 0; idx < nExtArgs; idx++)
- cmd_argv[idx + 1] = g_ptr_array_index(extArgs, idx);
+ for (i = 0; i < nExtArgs; i++)
+ cmd_argv[i + 1] = g_ptr_array_index(extArgs, i);
if (!(priv->client = virNetClientNewExternal(cmd_argv)))
goto error;
Michal