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é <berrange@redhat.com> Signed-off-by: Sergey Dyasli <sergey.dyasli@nutanix.com>
--- 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