[libgudev] enumerator: Ensure client subsystems are implicitly matched
- From: Bastien Nocera <hadess src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [libgudev] enumerator: Ensure client subsystems are implicitly matched
- Date: Wed, 2 Nov 2016 17:36:20 +0000 (UTC)
commit 7cf0fde672e6b0eb6c48fc5ab533da948b1ab74a
Author: Ray Strode <rstrode redhat com>
Date: Wed Oct 19 10:01:45 2016 -0400
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
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]