From 7cf0fde672e6b0eb6c48fc5ab533da948b1ab74a Mon Sep 17 00:00:00 2001 From: Ray Strode Date: Wed, 19 Oct 2016 10:01:45 -0400 Subject: [PATCH] enumerator: Ensure client subsystems are implicitly matched g_udev_client_new takes an optional list of subsystems (and device types) to filter the udev event stream on. These subsystems aren't automatically matched for device enumeration, though, which is unexpected. This commit changes gudevenumerator to get its udev_enumerate object from gudevclient with the appropriate subsystem and device matches already set up. https://bugzilla.gnome.org/show_bug.cgi?id=773224 --- gudev/gudevclient.c | 39 +++++++++++++++++++++++++++++++++++---- gudev/gudevenumerator.c | 2 +- gudev/gudevprivate.h | 2 +- 3 files changed, 37 insertions(+), 6 deletions(-) diff --git a/gudev/gudevclient.c b/gudev/gudevclient.c index 587b57a..39a8040 100644 --- a/gudev/gudevclient.c +++ b/gudev/gudevclient.c @@ -524,9 +524,40 @@ g_udev_client_query_by_subsystem_and_name (GUdevClient *client, return device; } -struct udev * -_g_udev_client_get_udev (GUdevClient *client) +struct udev_enumerate * +_g_udev_client_new_enumerate (GUdevClient *client) { - g_return_val_if_fail (G_UDEV_IS_CLIENT (client), NULL); - return client->priv->udev; + struct udev_enumerate *enumerate; + + enumerate = udev_enumerate_new (client->priv->udev); + + if (client->priv->subsystems != NULL) + { + guint n; + for (n = 0; client->priv->subsystems[n] != NULL; n++) + { + gchar *subsystem; + gchar *devtype; + gchar *s; + + subsystem = g_strdup (client->priv->subsystems[n]); + devtype = NULL; + + s = strstr (subsystem, "/"); + if (s != NULL) + { + devtype = s + 1; + *s = '\0'; + } + + udev_enumerate_add_match_subsystem (enumerate, subsystem); + + if (devtype != NULL) + udev_enumerate_add_match_property (enumerate, "DEVTYPE", devtype); + + g_free (subsystem); + } + } + + return enumerate; } diff --git a/gudev/gudevenumerator.c b/gudev/gudevenumerator.c index e6cdc67..1c70049 100644 --- a/gudev/gudevenumerator.c +++ b/gudev/gudevenumerator.c @@ -124,7 +124,7 @@ g_udev_enumerator_constructed (GObject *object) g_assert (G_UDEV_IS_CLIENT (enumerator->priv->client)); - enumerator->priv->e = udev_enumerate_new (_g_udev_client_get_udev (enumerator->priv->client)); + enumerator->priv->e = _g_udev_client_new_enumerate (enumerator->priv->client); if (G_OBJECT_CLASS (g_udev_enumerator_parent_class)->constructed != NULL) G_OBJECT_CLASS (g_udev_enumerator_parent_class)->constructed (object); diff --git a/gudev/gudevprivate.h b/gudev/gudevprivate.h index 52e272b..1861d8d 100644 --- a/gudev/gudevprivate.h +++ b/gudev/gudevprivate.h @@ -33,7 +33,7 @@ G_BEGIN_DECLS GUdevDevice * _g_udev_device_new (struct udev_device *udevice); -struct udev *_g_udev_client_get_udev (GUdevClient *client); +struct udev_enumerate *_g_udev_client_new_enumerate (GUdevClient *client); G_END_DECLS -- 2.7.4