+ struct dlist *subsyslist;
+ char *class;
+
+ subsyslist = sysfs_open_subsystem_list("class");
+ if (!subsyslist)
+ return -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;
+ struct sysfs_driver *driver;
+
+ 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);
+
+ 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("DEVMAJORMINOR '%s'\n", attr->value);
+ }
+
+ driver = sysfs_get_classdev_driver(class_dev);
+ if (driver)
+ printf("DEVDRIVER '%s'\n", driver->name);
+
+ 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("PHYSDEVBUS '%s'\n", phys_dev->bus);
+ }
+ }
+ sysfs_close_class(cls);
+ }
+ sysfs_close_list(subsyslist);
+
+ return 0;
+}
+
+static int process_options(int argc, char *argv[])
+{
+ static const char short_options[] = "adn:p:q:rsVh";