summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRay Strode <rstrode@redhat.com>2016-10-19 10:01:45 -0400
committerBastien Nocera <hadess@hadess.net>2016-11-02 18:32:22 +0100
commit7cf0fde672e6b0eb6c48fc5ab533da948b1ab74a (patch)
tree4930f1f2deac5a7d253a0ff45969cae61e3e3d84
parent177ea07f3411353d9eb964b4d9c0812685d71738 (diff)
downloadlibgudev-7cf0fde672e6b0eb6c48fc5ab533da948b1ab74a.tar.gz
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
-rw-r--r--gudev/gudevclient.c39
-rw-r--r--gudev/gudevenumerator.c2
-rw-r--r--gudev/gudevprivate.h2
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