diff --git a/legacy/eeze/ChangeLog b/legacy/eeze/ChangeLog index 08c42e2386..135860f1fa 100644 --- a/legacy/eeze/ChangeLog +++ b/legacy/eeze/ChangeLog @@ -1,3 +1,10 @@ +2011-05-15 Mike Blumenkrantz (discomfitor/zmike) ++eeze_disk_udev_get_property ++eeze_disk_udev_get_sysattr ++eeze_disk_udev_walk_check_sysattr ++eeze_disk_udev_walk_get_sysattr +New functions to perform udev lookups directly on disk devices without wasting unnecessary function calls + 2011-03-12 Mike Blumenkrantz (discomfitor/zmike) +eeze_udev_syspath_get_devname, added from patch sent by Clement Battin diff --git a/legacy/eeze/src/lib/Eeze_Disk.h b/legacy/eeze/src/lib/Eeze_Disk.h index 836db7f838..631bfa2ea9 100644 --- a/legacy/eeze/src/lib/Eeze_Disk.h +++ b/legacy/eeze/src/lib/Eeze_Disk.h @@ -368,6 +368,49 @@ EAPI Eina_Bool eeze_mount_mtab_scan(void); */ EAPI Eina_Bool eeze_mount_fstab_scan(void); +/** + * @brief Get the property value of a disk + * + * @param disk The disk + * @param property The property to get; full list of these is a FIXME + * @return A stringshared char* with the property or NULL on failure + */ + +EAPI const char *eeze_disk_udev_get_property(Eeze_Disk *disk, const char *property); + +/** + * @brief Get the sysattr value of a disk. + * + * @param disk The disk + * @param sysattr The sysattr to get; full list of these is a FIXME + * @return A stringshared char* with the sysattr or NULL on failure + */ + +EAPI const char *eeze_disk_udev_get_sysattr(Eeze_Disk *disk, const char *sysattr); + +/** + * Walks up the device chain using the device from @p disk, + * checking each device for @p sysattr with (optional) @p value. + * + * @param disk The disk to walk + * @param sysattr The attribute to find + * @param value OPTIONAL: The value that @p sysattr should have, or NULL + * + * @return If the sysattr (with value) is found, returns TRUE. Else, false. + */ +EAPI Eina_Bool eeze_disk_udev_walk_check_sysattr(Eeze_Disk *disk, const char *sysattr, const char *value); + +/** + * @brief Walks up the device chain of @p disk + * checking each device for @p sysattr and returns the value if found. + * + * @param disk The disk + * @param sysattr The attribute to find + * + * @return The stringshared value of @p sysattr if found, or NULL + */ +EAPI const char *eeze_disk_udev_walk_get_sysattr(Eeze_Disk *disk, const char *sysattr); + #ifdef __cplusplus } #endif diff --git a/legacy/eeze/src/lib/Makefile.am b/legacy/eeze/src/lib/Makefile.am index d3e3beb37e..f742564321 100644 --- a/legacy/eeze/src/lib/Makefile.am +++ b/legacy/eeze/src/lib/Makefile.am @@ -4,7 +4,7 @@ AM_CPPFLAGS = @EEZE_CFLAGS@ if HAVE_EEZE_MOUNT AM_CFLAGS = @EEZE_CFLAGS@ @LIBMOUNT_CFLAGS@ @ECORE_FILE_CFLAGS@ - MOUNT_FILES = eeze_disk.c eeze_disk_mount.c + MOUNT_FILES = eeze_disk.c eeze_disk_udev.c eeze_disk_mount.c if OLD_LIBMOUNT MOUNT_FILES += eeze_disk_libmount_old.c else diff --git a/legacy/eeze/src/lib/eeze_disk_udev.c b/legacy/eeze/src/lib/eeze_disk_udev.c new file mode 100644 index 0000000000..89bcbf7cf9 --- /dev/null +++ b/legacy/eeze/src/lib/eeze_disk_udev.c @@ -0,0 +1,82 @@ +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include + +#include "eeze_udev_private.h" +#include "eeze_disk_private.h" + +EAPI const char * +eeze_disk_udev_get_property(Eeze_Disk *disk, const char *property) +{ + const char *ret; + EINA_SAFETY_ON_NULL_RETURN_VAL(disk, NULL); + EINA_SAFETY_ON_NULL_RETURN_VAL(property, NULL); + EINA_SAFETY_ON_TRUE_RETURN_VAL(*property, NULL); + + ret = udev_device_get_property_value(disk->device, property); + return eina_stringshare_add(ret); +} + +EAPI const char * +eeze_disk_udev_get_sysattr(Eeze_Disk *disk, const char *sysattr) +{ + const char *ret; + EINA_SAFETY_ON_NULL_RETURN_VAL(disk, NULL); + EINA_SAFETY_ON_NULL_RETURN_VAL(sysattr, NULL); + EINA_SAFETY_ON_TRUE_RETURN_VAL(*sysattr, NULL); + + ret = udev_device_get_sysattr_value(disk->device, sysattr); + return eina_stringshare_add(ret); +} + +EAPI Eina_Bool +eeze_disk_udev_walk_check_sysattr(Eeze_Disk *disk, + const char *sysattr, + const char *value) +{ + + _udev_device *child, *parent; + const char *test = NULL; + + EINA_SAFETY_ON_NULL_RETURN_VAL(disk, EINA_FALSE); + EINA_SAFETY_ON_NULL_RETURN_VAL(sysattr, EINA_FALSE); + EINA_SAFETY_ON_TRUE_RETURN_VAL(*sysattr, EINA_FALSE); + + for (parent = disk->device; parent; + child = parent, parent = udev_device_get_parent(child)) + { + if (!(test = udev_device_get_sysattr_value(parent, sysattr))) + continue; + if ((value && (!strcmp(test, value))) || (!value)) + { + return EINA_TRUE; + break; + } + } + return EINA_FALSE; +} + +EAPI const char * +eeze_disk_udev_walk_get_sysattr(Eeze_Disk *disk, + const char *sysattr) +{ + + _udev_device *child, *parent; + const char *test = NULL; + + EINA_SAFETY_ON_NULL_RETURN_VAL(disk, NULL); + EINA_SAFETY_ON_NULL_RETURN_VAL(sysattr, NULL); + EINA_SAFETY_ON_TRUE_RETURN_VAL(*sysattr, NULL); + + for (parent = disk->device; parent; + child = parent, parent = udev_device_get_parent(child)) + { + test = udev_device_get_sysattr_value(parent, sysattr); + if (test) return eina_stringshare_add(test); + } + return EINA_FALSE; +}