diff options
author | kay.sievers@vrfy.org <kay.sievers@vrfy.org> | 2004-11-09 12:11:46 +0100 |
---|---|---|
committer | Greg KH <gregkh@suse.de> | 2005-04-26 22:21:19 -0700 |
commit | f156b6d2037ff09f7218e11d5326c05488356ea1 (patch) | |
tree | 56c7b5669a3d9869b0b527780d0b0379eab11abf | |
parent | 4a231017ff6e9f66a685b0d1e4e49dc46645bb40 (diff) |
[PATCH] add sysfs info walk to udevinfo
The option "-s" will get information about the major/minor,
the physical device, the bus value and the driver from sysfs for
all class and block devices:
kay@pim udev.kay]$ ./udevinfo -s
DEVPATH '/sys/block/sda'
SUBSYSTEM 'block'
NAME 'sda'
MAJORMINOR '8:0'
PHYSDEVPATH '/sys/devices/pci0000:00/0000:00:1d.7/usb1/1-3/1-3:1.0/host2/target2:0:0/2:0:0:0'
PHYSDEVPATHBUS 'scsi'
DRIVER 'sd'
DEVPATH '/sys/class/input/mice'
SUBSYSTEM 'input'
NAME 'mice'
MAJORMINOR '13:63'
DEVPATH '/sys/class/input/mouse0'
SUBSYSTEM 'input'
NAME 'mouse0'
MAJORMINOR '13:32'
...
-rw-r--r-- | udevinfo.8 | 4 | ||||
-rw-r--r-- | udevinfo.c | 65 |
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"); |