diff options
author | Bastien Nocera <hadess@hadess.net> | 2021-11-15 17:30:41 +0100 |
---|---|---|
committer | Bastien Nocera <hadess@hadess.net> | 2021-11-15 17:39:14 +0100 |
commit | 62909cae9a36d20875c135719d7819fb9d7340b1 (patch) | |
tree | f50f80cb7b85c57abf22461f44795e4a008ba188 | |
parent | f6ec5ecb6ef68272392a7e950b3f60194c42f1ee (diff) | |
download | libgudev-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.c | 33 | ||||
-rw-r--r-- | gudev/gudevclient.h | 3 |
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 |