[Spice-devel] [spice-gtk v1 1/4] usb-acl-helper: move exec of binary to its own function

Frediano Ziglio fziglio at redhat.com
Fri May 17 09:38:07 UTC 2019


> 
> From: Victor Toso <me at victortoso.com>
> 
> Create helper exec_usb_acl_helper_bin() to handle the execution of
> spice-client-glib-usb-acl-helper binary. This bin is only compiled in
> spice-gtk if Polkit is enabled.
> 
> This is a preparation patch for enabling the build of usb-acl-helper.c
> when Polkit is disabled.

I don't know if this last sentence is useful, also I don't agree on
other patches but I consider this good.

> 
> Signed-off-by: Victor Toso <victortoso at redhat.com>
> ---
>  src/usb-acl-helper.c | 88 +++++++++++++++++++++++++-------------------
>  1 file changed, 50 insertions(+), 38 deletions(-)
> 
> diff --git a/src/usb-acl-helper.c b/src/usb-acl-helper.c
> index 186b86e..3145597 100644
> --- a/src/usb-acl-helper.c
> +++ b/src/usb-acl-helper.c
> @@ -154,6 +154,54 @@ static void helper_child_watch_cb(GPid pid, gint status,
> gpointer user_data)
>      /* Nothing to do, but we need the child watch to avoid zombies */
>  }
>  
> +static gboolean
> +exec_usb_acl_helper_bin(SpiceUsbAclHelper *self,
> +                        const gchar *buf,
> +                        GError **err)
> +{
> +    GIOStatus status;
> +    GPid helper_pid;
> +    gsize bytes_written;
> +    const gchar *acl_helper = g_getenv("SPICE_USB_ACL_BINARY");
> +    if (acl_helper == NULL)
> +        acl_helper = ACL_HELPER_PATH"/spice-client-glib-usb-acl-helper";

style here is weird. Looks like the statements between the declarations are
hidden to make the observer think are just declarations.

I would change to

   GIOStatus status;
   GPid helper_pid;
   gsize bytes_written;
   gint in, out;
   SpiceUsbAclHelperPrivate *priv = self->priv;
   const gchar *acl_helper = g_getenv("SPICE_USB_ACL_BINARY");

   if (acl_helper == NULL) {
       acl_helper = ACL_HELPER_PATH"/spice-client-glib-usb-acl-helper";
   }

   gchar *argv[] = { (char*)acl_helper, NULL };


> +    gchar *argv[] = { (char*)acl_helper, NULL };
> +    gint in, out;
> +    SpiceUsbAclHelperPrivate *priv = self->priv;
> +
> +    if (!g_spawn_async_with_pipes(NULL, argv, NULL,
> +                           G_SPAWN_DO_NOT_REAP_CHILD | G_SPAWN_SEARCH_PATH,
> +                           NULL, NULL, &helper_pid, &in, &out, NULL, err)) {

I would fix the indentation here

> +        return FALSE;
> +    }
> +
> +    g_child_watch_add(helper_pid, helper_child_watch_cb, NULL);
> +
> +    priv->in_ch = g_io_channel_unix_new(in);

Not a regression, here you are assuming in_ch and out_ch are NULLs.
>From API prospective you cannot call spice_usb_acl_helper_open_acl_async
twice on the same object.

> +    g_io_channel_set_close_on_unref(priv->in_ch, TRUE);
> +
> +    priv->out_ch = g_io_channel_unix_new(out);
> +    g_io_channel_set_close_on_unref(priv->out_ch, TRUE);
> +    status = g_io_channel_set_flags(priv->out_ch, G_IO_FLAG_NONBLOCK, err);
> +    if (status != G_IO_STATUS_NORMAL) {
> +        return FALSE;
> +    }
> +
> +    status = g_io_channel_write_chars(priv->in_ch, buf, -1,
> +                                      &bytes_written, err);
> +    if (status != G_IO_STATUS_NORMAL) {
> +        return FALSE;
> +    }
> +    status = g_io_channel_flush(priv->in_ch, err);
> +    if (status != G_IO_STATUS_NORMAL) {
> +        return FALSE;
> +    }
> +
> +    g_io_add_watch(priv->out_ch, G_IO_IN|G_IO_HUP,
> +                   (GIOFunc)cb_out_watch, g_object_ref(self));
> +    return TRUE;
> +}
> +
>  /* ------------------------------------------------------------------ */
>  /* private api                                                        */
>  
> @@ -179,15 +227,6 @@ void
> spice_usb_acl_helper_open_acl_async(SpiceUsbAclHelper *self,
>      SpiceUsbAclHelperPrivate *priv = self->priv;
>      GTask *task;
>      GError *err = NULL;
> -    GIOStatus status;
> -    GPid helper_pid;
> -    gsize bytes_written;
> -    const gchar *acl_helper = g_getenv("SPICE_USB_ACL_BINARY");
> -    if (acl_helper == NULL)
> -        acl_helper = ACL_HELPER_PATH"/spice-client-glib-usb-acl-helper";
> -    gchar *argv[] = { (char*)acl_helper, NULL };
> -    gint in, out;
> -    gchar buf[128];
>  
>      task = g_task_new(self, cancellable, callback, user_data);
>  
> @@ -203,34 +242,9 @@ void
> spice_usb_acl_helper_open_acl_async(SpiceUsbAclHelper *self,
>          goto done;
>      }
>  
> -    if (!g_spawn_async_with_pipes(NULL, argv, NULL,
> -                           G_SPAWN_DO_NOT_REAP_CHILD | G_SPAWN_SEARCH_PATH,
> -                           NULL, NULL, &helper_pid, &in, &out, NULL, &err))
> {
> -        g_task_return_error(task, err);
> -        goto done;
> -    }
> -    g_child_watch_add(helper_pid, helper_child_watch_cb, NULL);
> -
> -    priv->in_ch = g_io_channel_unix_new(in);
> -    g_io_channel_set_close_on_unref(priv->in_ch, TRUE);
> -
> -    priv->out_ch = g_io_channel_unix_new(out);
> -    g_io_channel_set_close_on_unref(priv->out_ch, TRUE);
> -    status = g_io_channel_set_flags(priv->out_ch, G_IO_FLAG_NONBLOCK, &err);
> -    if (status != G_IO_STATUS_NORMAL) {
> -        g_task_return_error(task, err);
> -        goto done;
> -    }
> -
> +    gchar buf[128];
>      snprintf(buf, sizeof(buf), "%d %d\n", busnum, devnum);
> -    status = g_io_channel_write_chars(priv->in_ch, buf, -1,
> -                                      &bytes_written, &err);
> -    if (status != G_IO_STATUS_NORMAL) {
> -        g_task_return_error(task, err);
> -        goto done;
> -    }
> -    status = g_io_channel_flush(priv->in_ch, &err);
> -    if (status != G_IO_STATUS_NORMAL) {
> +    if (!exec_usb_acl_helper_bin(self, buf, &err)) {
>          g_task_return_error(task, err);
>          goto done;
>      }
> @@ -242,8 +256,6 @@ void
> spice_usb_acl_helper_open_acl_async(SpiceUsbAclHelper *self,
>                                                       G_CALLBACK(cancelled_cb),
>                                                       self, NULL);
>      }
> -    g_io_add_watch(priv->out_ch, G_IO_IN|G_IO_HUP,
> -                   (GIOFunc)cb_out_watch, g_object_ref(self));
>      return;
>  
>  done:

Other part looks good

Frediano


More information about the Spice-devel mailing list