summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--udev_sysfs.c49
-rw-r--r--udevinfo.c15
2 files changed, 44 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;
diff --git a/udevinfo.c b/udevinfo.c
index e7225c8831..5445b0fcc1 100644
--- a/udevinfo.c
+++ b/udevinfo.c
@@ -26,6 +26,8 @@
#include <dirent.h>
#include <errno.h>
#include <getopt.h>
+#include <sys/stat.h>
+#include <sys/types.h>
#include "udev.h"
@@ -56,10 +58,23 @@ static void print_all_attributes(const char *devpath, const char *key)
dir = opendir(path);
if (dir != NULL) {
for (dent = readdir(dir); dent != NULL; dent = readdir(dir)) {
+ struct stat statbuf;
+ char filename[PATH_SIZE];
char *attr_value;
char value[NAME_SIZE];
size_t len;
+ if (dent->d_name[0] == '.')
+ continue;
+
+ strlcpy(filename, path, sizeof(filename));
+ strlcat(filename, "/", sizeof(filename));
+ strlcat(filename, dent->d_name, sizeof(filename));
+ if (lstat(filename, &statbuf) != 0)
+ continue;
+ if (S_ISLNK(statbuf.st_mode))
+ continue;
+
attr_value = sysfs_attr_get_value(devpath, dent->d_name);
if (attr_value == NULL)
continue;