1
0
mirror of https://github.com/systemd/systemd.git synced 2025-03-19 22:50:17 +03:00

[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'

...
This commit is contained in:
kay.sievers@vrfy.org 2004-11-09 12:11:46 +01:00 committed by Greg KH
parent 4a231017ff
commit f156b6d203
2 changed files with 68 additions and 1 deletions

View File

@ -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"

View File

@ -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");