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

Andreas Fuchs anduchs at gmail.com
Sat Feb 22 02:55:27 PST 2014


Ok, I'll try my luck with git send-email then. I was unaware of this
gmail-oddity. Sorry about that.

Any ideas, why lubudev consideres so many things as attributes ?

Cheers,
Andreas


2014-02-14 1:07 GMT+01:00 Lennart Poettering <lennart at poettering.net>:

> 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
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/systemd-devel/attachments/20140222/2073ee38/attachment.html>


More information about the systemd-devel mailing list