enumerator: Ensure client subsystems are implicitly matched
authorRay Strode <rstrode@redhat.com>
Wed, 19 Oct 2016 14:01:45 +0000 (10:01 -0400)
committerBastien Nocera <hadess@hadess.net>
Wed, 2 Nov 2016 17:32:22 +0000 (18:32 +0100)
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
gudev/gudevenumerator.c
gudev/gudevprivate.h

index 587b57a0440738fd1bbf6059c45bee688ecc9fa8..39a80401452a7151732bd35e7903c5a093f379c1 100644 (file)
@@ -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;
 }
index e6cdc67246fd3904a3748440d25106cf34c0978b..1c70049d12e23bd2b8791d3d18e84ee442617817 100644 (file)
@@ -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);
index 52e272be3ddc0fe05d9638ad6c83b8aea877ad55..1861d8d5e0fa83c8672305efa4e1ecbd062101bd 100644 (file)
@@ -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