summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBastien Nocera <hadess@hadess.net>2021-11-15 17:30:41 +0100
committerBastien Nocera <hadess@hadess.net>2021-11-15 17:39:14 +0100
commit62909cae9a36d20875c135719d7819fb9d7340b1 (patch)
treef50f80cb7b85c57abf22461f44795e4a008ba188
parentf6ec5ecb6ef68272392a7e950b3f60194c42f1ee (diff)
downloadlibgudev-wip/hadess/sub-device-file.tar.gz
gudev: Add g_udev_client_query_by_subsystem_and_device_file()wip/hadess/sub-device-file
Looks up a device for a device file for a particular subsystem. In contrast to g_udev_client_query_device_file() this function does not make blocking I/O through stat()'ing a device file, and relies solely on the udev database making it a better fit for mocked sysfs hierarchies.
-rw-r--r--gudev/gudevclient.c33
-rw-r--r--gudev/gudevclient.h3
2 files changed, 36 insertions, 0 deletions
diff --git a/gudev/gudevclient.c b/gudev/gudevclient.c
index cfd8baa..d96283a 100644
--- a/gudev/gudevclient.c
+++ b/gudev/gudevclient.c
@@ -515,6 +515,39 @@ g_udev_client_query_by_subsystem_and_name (GUdevClient *client,
return device;
}
+/**
+ * g_udev_client_query_by_subsystem_and_device_file:
+ * @client: A #GUdevClient.
+ * @subsystem: A subsystem name.
+ * @device_file: A device file.
+ *
+ * Looks up a device for a device file for a particular subsystem. In contrast to
+ * g_udev_client_query_device_file() this function does not make blocking I/O
+ * through stat()'ing a device file, and relies solely on the udev database making
+ * it a better fit for mocked sysfs hierarchies.
+ *
+ * Returns: (nullable) (transfer full): A #GUdevDevice object or %NULL
+ * if the device was not found. Free with g_object_unref().
+ */
+GUdevDevice *
+g_udev_client_query_by_subsystem_and_device_file (GUdevClient *client,
+ const char *subsystem,
+ const gchar *device_file)
+{
+ GList *l;
+ g_autolist(GUdevDevice) devices = NULL;
+
+ g_return_val_if_fail (G_UDEV_IS_CLIENT (client), NULL);
+ g_return_val_if_fail (device_file != NULL, NULL);
+
+ devices = g_udev_client_query_by_subsystem (client, subsystem);
+ for (l = devices; l != NULL; l = l->next) {
+ if (g_strcmp0 (g_udev_device_get_device_file (l->data), device_file) == 0)
+ return g_object_ref (l->data);
+ }
+ return NULL;
+}
+
struct udev_enumerate *
_g_udev_client_new_enumerate (GUdevClient *client)
{
diff --git a/gudev/gudevclient.h b/gudev/gudevclient.h
index 329f22d..c3e4df2 100644
--- a/gudev/gudevclient.h
+++ b/gudev/gudevclient.h
@@ -84,6 +84,9 @@ GUdevDevice *g_udev_client_query_by_sysfs_path (GUdevClient *clie
GUdevDevice *g_udev_client_query_by_subsystem_and_name (GUdevClient *client,
const gchar *subsystem,
const gchar *name);
+GUdevDevice *g_udev_client_query_by_subsystem_and_device_file (GUdevClient *client,
+ const char *subsystem,
+ const gchar *device_file);
G_END_DECLS