chiark / gitweb /
udevinfo: do not show symlinks as attributes in --attribute-walk
authorKay Sievers <kay.sievers@suse.de>
Tue, 5 Sep 2006 11:54:08 +0000 (13:54 +0200)
committerKay Sievers <kay.sievers@suse.de>
Tue, 5 Sep 2006 11:54:08 +0000 (13:54 +0200)
udev_sysfs.c
udevinfo.c

index e733d417c5628854ee5f1d4f06b463873a1d0944..0b7561f0eba7beb3db5e484cd9376b83e3320f05 100644 (file)
@@ -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;
index e7225c883108ed609e9b69ffb6448f1628822969..5445b0fcc13e0ad1e6463a9b8439490e0afada35 100644 (file)
@@ -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;