From: Ray Strode Date: Wed, 19 Oct 2016 14:01:45 +0000 (-0400) Subject: enumerator: Ensure client subsystems are implicitly matched X-Git-Tag: upstream/231~2 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=7cf0fde672e6b0eb6c48fc5ab533da948b1ab74a;p=platform%2Fupstream%2Flibgudev.git 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 --- 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