[systemd-devel] [PATCH/RFC] gudev: add device::get_sysfs_attr_keys() and device::has_sysfs_attr()

Andreas Fuchs anduchs at gmail.com
Mon Jan 13 12:19:27 PST 2014


For gudev -> gudevdevice:
- Add support for get_sysfs_attr_keys()
- Add support for has_sysfs_attr()

Note: Only tested against systemd-204 on Ubuntu 13.10's patch-set...
RFC1: For some reason libudev cosiders every link or file as sysfs
attribute (opposed to udevadm). Is this intended ?
RFC2: Since this is my first patch, please comment on any changes it needs
and I'll iterate. Thank you...

Signed-off-by: Andreas Fuchs <anduchs at gmail.com>
---
 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 6c9e0f5..2c768b7 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)
@@ -699,6 +703,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.
  * @name: Name of the sysfs attribute.
diff --git a/src/gudev/gudevdevice.h b/src/gudev/gudevdevice.h
index 457b961..72ec180 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,
-- 
1.8.3.2
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/systemd-devel/attachments/20140113/04fd3906/attachment.html>


More information about the systemd-devel mailing list