From: kay.sievers@vrfy.org Date: Tue, 9 Nov 2004 11:11:46 +0000 (+0100) Subject: [PATCH] add sysfs info walk to udevinfo X-Git-Tag: 046~21 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=commitdiff_plain;h=f156b6d2037ff09f7218e11d5326c05488356ea1;hp=4a231017ff6e9f66a685b0d1e4e49dc46645bb40 [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' ... --- diff --git a/udevinfo.8 b/udevinfo.8 index a04e6df46..599a0033f 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 a90bbe113..f1b74fc8f 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");