This allows you to specify a path to a custom binary that will be spawned by SpiceUsbAclHelper to obtain permission for a particular USB device. This will be used for testing so that we can use a mock acl helper binary that can be manipulated to return arbitary responses. This makes it easier to verify that the SpiceUsbAclHelper class handles those responses appropriately. --- src/usb-acl-helper.c | 58 +++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 57 insertions(+), 1 deletion(-) diff --git a/src/usb-acl-helper.c b/src/usb-acl-helper.c index 3145b68..c9d384b 100644 --- a/src/usb-acl-helper.c +++ b/src/usb-acl-helper.c @@ -40,10 +40,16 @@ struct _SpiceUsbAclHelperPrivate { GIOChannel *out_ch; GCancellable *cancellable; gulong cancellable_id; + char *acl_helper_path; }; G_DEFINE_TYPE(SpiceUsbAclHelper, spice_usb_acl_helper, G_TYPE_OBJECT); +enum { + PROP_0, + PROP_ACL_HELPER_PATH +}; + static void spice_usb_acl_helper_init(SpiceUsbAclHelper *self) { self->priv = SPICE_USB_ACL_HELPER_GET_PRIVATE(self); @@ -68,6 +74,11 @@ static void spice_usb_acl_helper_cleanup(SpiceUsbAclHelper *self) g_io_channel_unref(priv->out_ch); priv->out_ch = NULL; } + + if (priv->acl_helper_path) { + g_free(priv->acl_helper_path); + priv->acl_helper_path = NULL; + } } static void spice_usb_acl_helper_finalize(GObject *gobject) @@ -78,13 +89,58 @@ static void spice_usb_acl_helper_finalize(GObject *gobject) G_OBJECT_CLASS(spice_usb_acl_helper_parent_class)->finalize(gobject); } +static void spice_usb_acl_helper_get_property(GObject *object, + guint prop_id, + GValue *value, + GParamSpec *pspec) +{ + SpiceUsbAclHelper *self = SPICE_USB_ACL_HELPER(object); + + switch (prop_id) { + case PROP_ACL_HELPER_PATH: + g_value_set_string(value, self->priv->acl_helper_path); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); + break; + } +} + +static void spice_usb_acl_helper_set_property(GObject *gobject, guint prop_id, + const GValue *value, GParamSpec *pspec) +{ + SpiceUsbAclHelper *self = SPICE_USB_ACL_HELPER(gobject); + + switch (prop_id) { + case PROP_ACL_HELPER_PATH: + g_free(self->priv->acl_helper_path); + self->priv->acl_helper_path = g_value_dup_string(value); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID(gobject, prop_id, pspec); + break; + } +} + static void spice_usb_acl_helper_class_init(SpiceUsbAclHelperClass *klass) { GObjectClass *gobject_class = G_OBJECT_CLASS (klass); gobject_class->finalize = spice_usb_acl_helper_finalize; + gobject_class->get_property = spice_usb_acl_helper_get_property; + gobject_class->set_property = spice_usb_acl_helper_set_property; g_type_class_add_private(klass, sizeof(SpiceUsbAclHelperPrivate)); + + g_object_class_install_property(gobject_class, PROP_ACL_HELPER_PATH, + g_param_spec_string("acl-helper-path", + "acl-helper-path", + "acl-helper-path", + ACL_HELPER_PATH "/spice-client-glib-usb-acl-helper", + G_PARAM_STATIC_STRINGS + | G_PARAM_READWRITE | + G_PARAM_CONSTRUCT)); + } /* ------------------------------------------------------------------ */ @@ -198,7 +254,7 @@ void spice_usb_acl_helper_open_acl(SpiceUsbAclHelper *self, GIOStatus status; GPid helper_pid; gsize bytes_written; - gchar *argv[] = { (char*) ACL_HELPER_PATH"/spice-client-glib-usb-acl-helper", NULL }; + gchar *argv[] = { priv->acl_helper_path, NULL }; gint in, out; gchar buf[128]; -- 2.4.3 _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/spice-devel