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

Reply via email to