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

Lennart Poettering lennart at poettering.net
Thu Feb 13 16:07:27 PST 2014


On Mon, 13.01.14 21:19, Andreas Fuchs (anduchs at gmail.com) wrote:

> 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...

Hmm, so this certainly looks useful, given that the low-level libudev
API supports something like this.

Your patch is broken though, it got line-wrapper by your mailer?

Kay, what's the deal with patches for gudev? Are you looking after this?
I wonder if David is still maintaining it?

> 
> 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,

> _______________________________________________
> systemd-devel mailing list
> systemd-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/systemd-devel



Lennart

-- 
Lennart Poettering, Red Hat


More information about the systemd-devel mailing list