From fcc70b92f44788e89252011a4c87151961fd8999 Mon Sep 17 00:00:00 2001 From: Andreas Fuchs Date: Sat, 22 Feb 2014 12:02:35 +0100 Subject: [PATCH] gudev: add device::get_sysfs_attr_keys and device::has_sysfs_attr For gudev -> gudevdevice: - Add support for get_sysfs_attr_keys() - Add support for has_sysfs_attr() --- src/gudev/gudevdevice.c | 53 +++++++++++++++++++++++++++++++++++++++++ src/gudev/gudevdevice.h | 3 +++ 2 files changed, 56 insertions(+) diff --git a/src/gudev/gudevdevice.c b/src/gudev/gudevdevice.c index 6c9e0f56c..2c768b7db 100644 --- a/src/gudev/gudevdevice.c +++ b/src/gudev/gudevdevice.c @@ -59,6 +59,8 @@ * g_udev_device_get_property_as_strv(). * * To access sysfs attributes for the device, use + * g_udev_device_get_sysfs_attr_keys(), + * g_udev_device_has_sysfs_attr(), * g_udev_device_get_sysfs_attr(), * g_udev_device_get_sysfs_attr_as_int(), * g_udev_device_get_sysfs_attr_as_uint64(), @@ -84,6 +86,7 @@ struct _GUdevDevicePrivate /* computed ondemand and cached */ gchar **device_file_symlinks; gchar **property_keys; + gchar **sysfs_attr_keys; gchar **tags; GHashTable *prop_strvs; GHashTable *sysfs_attr_strvs; @@ -98,6 +101,7 @@ g_udev_device_finalize (GObject *object) g_strfreev (device->priv->device_file_symlinks); g_strfreev (device->priv->property_keys); + g_strfreev (device->priv->sysfs_attr_keys); g_strfreev (device->priv->tags); if (device->priv->udevice != NULL) @@ -698,6 +702,55 @@ out: /* ---------------------------------------------------------------------------------------------------- */ +/** + * g_udev_device_get_sysfs_attr_keys: + * @device: A #GUdevDevice. + * + * Gets all keys for sysfs attributes on @device. + * + * Returns: (transfer none) (array zero-terminated=1) (element-type utf8): A %NULL terminated string array of sysfs attribute keys. This array is owned by @device and should not be freed by the caller. + */ +const gchar * const * +g_udev_device_get_sysfs_attr_keys (GUdevDevice *device) +{ + struct udev_list_entry *l; + GPtrArray *p; + + g_return_val_if_fail (G_UDEV_IS_DEVICE (device), NULL); + + if (device->priv->sysfs_attr_keys != NULL) + goto out; + + p = g_ptr_array_new (); + for (l = udev_device_get_sysattr_list_entry (device->priv->udevice); l != NULL; l = udev_list_entry_get_next (l)) + { + g_ptr_array_add (p, g_strdup (udev_list_entry_get_name (l))); + } + g_ptr_array_add (p, NULL); + device->priv->sysfs_attr_keys = (gchar **) g_ptr_array_free (p, FALSE); + + out: + return (const gchar * const *) device->priv->sysfs_attr_keys; +} + +/** + * g_udev_device_has_sysfs_attr: + * @device: A #GUdevDevice. + * @key: Name of sysfs attribute. + * + * Check if a the sysfs attribute with the given key exists. + * + * Returns: %TRUE only if the value for @key exist. + */ +gboolean +g_udev_device_has_sysfs_attr (GUdevDevice *device, + const gchar *key) +{ + g_return_val_if_fail (G_UDEV_IS_DEVICE (device), FALSE); + g_return_val_if_fail (key != NULL, FALSE); + return udev_device_get_sysattr_value (device->priv->udevice, key) != NULL; +} + /** * g_udev_device_get_sysfs_attr: * @device: A #GUdevDevice. diff --git a/src/gudev/gudevdevice.h b/src/gudev/gudevdevice.h index 457b961c5..72ec180f5 100644 --- a/src/gudev/gudevdevice.h +++ b/src/gudev/gudevdevice.h @@ -108,6 +108,9 @@ gboolean g_udev_device_get_property_as_boolean (GUdevDevice *devic const gchar* const *g_udev_device_get_property_as_strv (GUdevDevice *device, const gchar *key); +const gchar* const *g_udev_device_get_sysfs_attr_keys (GUdevDevice *device); +gboolean g_udev_device_has_sysfs_attr (GUdevDevice *device, + const gchar *key); const gchar *g_udev_device_get_sysfs_attr (GUdevDevice *device, const gchar *name); gint g_udev_device_get_sysfs_attr_as_int (GUdevDevice *device, -- 2.30.2