summaryrefslogtreecommitdiff
path: root/udev_sysfs.c
diff options
context:
space:
mode:
authorKay Sievers <kay.sievers@suse.de>2006-09-05 13:54:08 +0200
committerKay Sievers <kay.sievers@suse.de>2006-09-05 13:54:08 +0200
commit492e76c9c1108a28eae356cc8bd7955ccf234980 (patch)
treee4a0c08a9a9c866be5609f72ef810ac7bed2348f /udev_sysfs.c
parente136a3360b9a0b746e585b9c3b2403e6dd1e7f7c (diff)
udevinfo: do not show symlinks as attributes in --attribute-walk
Diffstat (limited to 'udev_sysfs.c')
-rw-r--r--udev_sysfs.c49
1 files changed, 29 insertions, 20 deletions
diff --git a/udev_sysfs.c b/udev_sysfs.c
index e733d417c5..0b7561f0eb 100644
--- a/udev_sysfs.c
+++ b/udev_sysfs.c
@@ -397,27 +397,36 @@ char *sysfs_attr_get_value(const char *devpath, const char *attr_name)
attr->value = attr->value_local;
}
}
- } else {
- /* read attribute value */
- fd = open(path_full, O_RDONLY);
- if (fd < 0) {
- dbg("attribute '%s' does not exist", path_full);
- goto out;
- }
- size = read(fd, value, sizeof(value));
- close(fd);
- if (size < 0)
- goto out;
- if (size == sizeof(value))
- goto out;
-
- /* got a valid value, store and return it */
- value[size] = '\0';
- remove_trailing_chars(value, '\n');
- dbg("cache '%s' with attribute value '%s'", path_full, value);
- strlcpy(attr->value_local, value, sizeof(attr->value_local));
- attr->value = attr->value_local;
+ goto out;
+ }
+
+ /* skip directories */
+ if (S_ISDIR(statbuf.st_mode))
+ goto out;
+
+ /* skip non-readable files */
+ if ((statbuf.st_mode & S_IRUSR) == 0)
+ goto out;
+
+ /* read attribute value */
+ fd = open(path_full, O_RDONLY);
+ if (fd < 0) {
+ dbg("attribute '%s' does not exist", path_full);
+ goto out;
}
+ size = read(fd, value, sizeof(value));
+ close(fd);
+ if (size < 0)
+ goto out;
+ if (size == sizeof(value))
+ goto out;
+
+ /* got a valid value, store and return it */
+ value[size] = '\0';
+ remove_trailing_chars(value, '\n');
+ dbg("cache '%s' with attribute value '%s'", path_full, value);
+ strlcpy(attr->value_local, value, sizeof(attr->value_local));
+ attr->value = attr->value_local;
out:
return attr->value;