X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=udevinfo.c;h=a4c17da3f09069bded7b65c3d3b97a86c6f6ce9b;hp=9ba302cbdc2c5e6afda8e0102822efe423a54a2c;hb=f385ff6512012a75b8381938dd3f55f991b53e9a;hpb=0d1ecb44a0b8c00b0fc6314d19e1bc8efd0f32bb diff --git a/udevinfo.c b/udevinfo.c index 9ba302cbd..a4c17da3f 100644 --- a/udevinfo.c +++ b/udevinfo.c @@ -30,7 +30,7 @@ #include "libsysfs/sysfs/libsysfs.h" #include "libsysfs/dlist.h" #include "udev.h" -#include "udev_lib.h" +#include "udev_utils.h" #include "udev_version.h" #include "udev_db.h" #include "logging.h" @@ -39,7 +39,6 @@ #define SYSFS_VALUE_SIZE 256 #ifdef LOG -unsigned char logname[LOGNAME_SIZE]; void log_message (int level, const char *format, ...) { va_list args; @@ -50,26 +49,13 @@ void log_message (int level, const char *format, ...) } #endif -static int print_all_attributes(const char *path) +static void print_all_attributes(struct dlist *attr_list) { - struct dlist *attributes; struct sysfs_attribute *attr; - struct sysfs_directory *sysfs_dir; char value[SYSFS_VALUE_SIZE]; int len; - int retval = 0; - - sysfs_dir = sysfs_open_directory(path); - if (sysfs_dir == NULL) - return -1; - - attributes = sysfs_get_dir_attributes(sysfs_dir); - if (attributes == NULL) { - retval = -1; - goto exit; - } - dlist_for_each_data(attributes, attr, struct sysfs_attribute) { + dlist_for_each_data(attr_list, attr, struct sysfs_attribute) { if (attr->value != NULL) { strfieldcpy(value, attr->value); len = strlen(value); @@ -93,11 +79,6 @@ static int print_all_attributes(const char *path) } } printf("\n"); - -exit: - sysfs_close_directory(sysfs_dir); - - return retval; } static int print_record(struct udevice *udev) @@ -124,6 +105,7 @@ static int print_device_chain(const char *path) struct sysfs_attribute *attr; struct sysfs_device *sysfs_dev; struct sysfs_device *sysfs_dev_parent; + struct dlist *attr_list; int retval = 0; /* get the class dev */ @@ -147,11 +129,15 @@ static int print_device_chain(const char *path) /* open sysfs class device directory and print all attributes */ printf(" looking at class device '%s':\n", class_dev->path); - if (print_all_attributes(class_dev->path) != 0) { + printf(" SUBSYSTEM=\"%s\"\n", class_dev->classname); + + attr_list = sysfs_get_classdev_attributes(class_dev); + if (attr_list == NULL) { printf("couldn't open class device directory\n"); retval = -1; goto exit; } + print_all_attributes(attr_list); /* get the device link (if parent exists look here) */ class_dev_parent = sysfs_get_classdev_parent(class_dev); @@ -165,12 +151,20 @@ static int print_device_chain(const char *path) /* look the device chain upwards */ while (sysfs_dev != NULL) { + attr_list = sysfs_get_device_attributes(sysfs_dev); + if (attr_list == NULL) { + printf("couldn't open device directory\n"); + retval = -1; + goto exit; + } + printf(" looking at the device chain at '%s':\n", sysfs_dev->path); printf(" BUS=\"%s\"\n", sysfs_dev->bus); printf(" ID=\"%s\"\n", sysfs_dev->bus_id); + printf(" DRIVER=\"%s\"\n", sysfs_dev->driver_name); /* open sysfs device directory and print all attributes */ - print_all_attributes(sysfs_dev->path); + print_all_attributes(attr_list); sysfs_dev_parent = sysfs_get_device_parent(sysfs_dev); if (sysfs_dev_parent == NULL) @@ -184,65 +178,9 @@ exit: return retval; } -/* print all class/main block devices with major/minor, physical device, driver and bus */ -static int print_sysfs_devices(void) -{ - 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; - unsigned int major, minor; - - 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) { - sscanf(attr->value, "%u:%u", &major, &minor); - printf("MAJOR %u\n", minor); - printf("MINOR %u\n", major); - } - - 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); - - if (phys_dev->driver_name[0] != '\0') - printf("PHYSDEVDRIVER '%s'\n", phys_dev->driver_name); - } - } - 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"; + static const char short_options[] = "an:p:q:rVh"; int option; int retval = 1; struct udevice udev; @@ -303,10 +241,6 @@ static int process_options(int argc, char *argv[]) root = 1; break; - case 's': - print_sysfs_devices(); - exit(0); - case 'a': attributes = 1; break; @@ -340,8 +274,7 @@ static int process_options(int argc, char *argv[]) } } memset(&udev, 0x00, sizeof(struct udevice)); - strfieldcpy(udev.devpath, pos); - retval = udev_db_get_device(&udev); + retval = udev_db_get_device_by_devpath(&udev, pos); if (retval != 0) { printf("device not found in database\n"); goto exit; @@ -439,7 +372,7 @@ exit: } help: - printf("Usage: [-anpqrdVh]\n" + printf("Usage: udevinfo [-anpqrVh]\n" " -q TYPE query database for the specified value:\n" " 'name' name of device node\n" " 'symlink' pointing to node\n"