From: Thomas Egerer Date: Fri, 4 Mar 2011 16:06:43 +0000 (+0100) Subject: libudev: use sysfs attr ilist interface for attribute walk X-Git-Tag: 174~245 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=commitdiff_plain;h=95ce1875d79162324a5eb67f6a0ffbbdd5d29921 libudev: use sysfs attr ilist interface for attribute walk Signed-off-by: Thomas Egerer --- diff --git a/libudev/docs/libudev-sections.txt b/libudev/docs/libudev-sections.txt index 7db9c1bba..918344d94 100644 --- a/libudev/docs/libudev-sections.txt +++ b/libudev/docs/libudev-sections.txt @@ -54,6 +54,7 @@ udev_device_get_driver udev_device_get_devnum udev_device_get_action udev_device_get_sysattr_value +udev_device_get_sysattr_list_entry udev_device_get_seqnum udev_device_get_usec_since_initialized diff --git a/udev/udevadm-info.c b/udev/udevadm-info.c index 4510f4aa9..f60ad2c45 100644 --- a/udev/udevadm-info.c +++ b/udev/udevadm-info.c @@ -33,47 +33,39 @@ static void print_all_attributes(struct udev_device *device, const char *key) { - struct udev *udev = udev_device_get_udev(device); - DIR *dir; - struct dirent *dent; - - dir = opendir(udev_device_get_syspath(device)); - if (dir != NULL) { - for (dent = readdir(dir); dent != NULL; dent = readdir(dir)) { - struct stat statbuf; - const char *value; - size_t len; - - if (dent->d_name[0] == '.') - continue; - - if (strcmp(dent->d_name, "uevent") == 0) - continue; - if (strcmp(dent->d_name, "dev") == 0) - continue; - - if (fstatat(dirfd(dir), dent->d_name, &statbuf, AT_SYMLINK_NOFOLLOW) != 0) - continue; - if (S_ISLNK(statbuf.st_mode)) - continue; - - value = udev_device_get_sysattr_value(device, dent->d_name); - if (value == NULL) - continue; - dbg(udev, "attr '%s'='%s'\n", dent->d_name, value); - - /* skip nonprintable attributes */ - len = strlen(value); - while (len > 0 && isprint(value[len-1])) - len--; - if (len > 0) { - dbg(udev, "attribute value of '%s' non-printable, skip\n", dent->d_name); - continue; - } - - printf(" %s{%s}==\"%s\"\n", key, dent->d_name, value); + struct udev_list_entry *sysattr; + + udev_list_entry_foreach(sysattr, udev_device_get_sysattr_list_entry(device)) { + const char *name; + const char *value; + size_t len; + + /* skip symlinks */ + if (0 == strcmp("s", udev_list_entry_get_value(sysattr))) + continue; + + name = udev_list_entry_get_name(sysattr); + if (strcmp(name, "uevent") == 0) + continue; + if (strcmp(name, "dev") == 0) + continue; + + value = udev_device_get_sysattr_value(device, name); + if (value == NULL) + continue; + dbg(udev_device_get_udev(device), "attr '%s'='%s'\n", name, value); + + /* skip nonprintable attributes */ + len = strlen(value); + while (len > 0 && isprint(value[len-1])) + len--; + if (len > 0) { + dbg(udev_device_get_udev(device), + "attribute value of '%s' non-printable, skip\n", name); + continue; } - closedir(dir); + + printf(" %s{%s}==\"%s\"\n", key, name, value); } printf("\n"); }