summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--udevinfo.84
-rw-r--r--udevinfo.c65
2 files changed, 68 insertions, 1 deletions
diff --git a/udevinfo.8 b/udevinfo.8
index a04e6df463..599a0033f8 100644
--- a/udevinfo.8
+++ b/udevinfo.8
@@ -46,6 +46,10 @@ attributes along the device chain. Useful for finding
unique attributes to compose a rule.
.RB Needs " \-p " specified.
.TP
+.B \-s
+Print all sysfs devices with the major/minor number, the physical device and
+the bus value.
+.TP
.B \-h
Print help text.
.SH "FILES"
diff --git a/udevinfo.c b/udevinfo.c
index a90bbe1138..f1b74fc8f6 100644
--- a/udevinfo.c
+++ b/udevinfo.c
@@ -197,9 +197,67 @@ exit:
return retval;
}
+/* print all class/block devices with major/minor, physical device and bus*/
+static void print_sysfs_devices(void)
+{
+ struct dlist *subsyslist;
+ char *class;
+
+ subsyslist = sysfs_open_subsystem_list("class");
+ if (!subsyslist)
+ exit(1);
+
+ dlist_for_each_data(subsyslist, class, char) {
+ struct sysfs_class *cls;
+ struct dlist *class_devices;
+ struct sysfs_class_device *class_dev;
+ struct sysfs_device *phys_dev;
+
+ cls = sysfs_open_class(class);
+ if (!cls)
+ continue;
+
+ class_devices = sysfs_get_class_devices(cls);
+ if (!class_devices)
+ continue;
+
+ dlist_for_each_data(class_devices, class_dev, struct sysfs_class_device) {
+ struct sysfs_attribute *attr;
+
+ printf("\n");
+ printf("DEVPATH '%s'\n", class_dev->path);
+ printf("SUBSYSTEM '%s'\n", class_dev->classname);
+ printf("NAME '%s'\n", class_dev->name);
+
+ attr = sysfs_get_classdev_attr(class_dev, "dev");
+ if (attr) {
+ char *pos = &(attr->value[strlen(attr->value)-1]);
+
+ if (pos[0] == '\n')
+ pos[0] = '\0';
+
+ printf("MAJORMINOR '%s'\n", attr->value);
+ }
+
+ phys_dev = sysfs_get_classdev_device(class_dev);
+ if (phys_dev) {
+ printf("PHYSDEVPATH '%s'\n", phys_dev->path);
+ if (phys_dev->bus[0] != '\0')
+ printf("PHYSDEVPATHBUS '%s'\n", phys_dev->bus);
+ if (phys_dev->driver_name[0] != '\0')
+ printf("DRIVER '%s'\n", phys_dev->driver_name);
+ }
+ }
+
+ sysfs_close_class(cls);
+ }
+
+ sysfs_close_list(subsyslist);
+}
+
static int process_options(void)
{
- static const char short_options[] = "adn:p:q:rVh";
+ static const char short_options[] = "adn:p:q:rsVh";
int option;
int retval = 1;
struct udevice udev;
@@ -260,6 +318,10 @@ static int process_options(void)
root = 1;
break;
+ case 's':
+ print_sysfs_devices();
+ exit(0);
+
case 'a':
attributes = 1;
break;
@@ -391,6 +453,7 @@ help:
"\n"
" -r print udev root\n"
" -a print all SYSFS_attributes along the device chain\n"
+ " -s print all sysfs devices with major/minor, physical device and bus\n"
" -V print udev version\n"
" -h print this help text\n"
"\n");