[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