diff options
author | stekloff <stekloff> | 2005-04-06 20:57:01 +0000 |
---|---|---|
committer | stekloff <stekloff> | 2005-04-06 20:57:01 +0000 |
commit | dd8c511d725f816bc64592028ff178616fcde607 (patch) | |
tree | 55250e02ac67ceeb3c2bac3b1e29a78c22be1ac2 /cmd/systool.c | |
parent | 855a337e54321d9aa2b97c38ffa4787d3105257c (diff) | |
download | sysfsutils-master.tar.gz |
Diffstat (limited to 'cmd/systool.c')
-rw-r--r-- | cmd/systool.c | 652 |
1 files changed, 368 insertions, 284 deletions
diff --git a/cmd/systool.c b/cmd/systool.c index 60c8d67..d3f938a 100644 --- a/cmd/systool.c +++ b/cmd/systool.c @@ -3,7 +3,7 @@ * * Sysfs utility to list buses, classes, and devices * - * Copyright (C) 2003 International Business Machines, Inc. + * Copyright (C) IBM Corp. 2003 * * This program is free software; you can redistribute it and/or modify it * under the terms of the GNU General Public License as published by the @@ -31,21 +31,30 @@ #include <ctype.h> #include "libsysfs.h" +#include "names.h" /* Command Options */ static int show_options = 0; /* bitmask of show options */ static char *attribute_to_show = NULL; /* show value for this attribute */ static char *device_to_show = NULL; /* show only this bus device */ +struct pci_access *pacc = NULL; +char *show_bus = NULL; + +static void show_device(struct sysfs_device *device, int level); +static void show_class_device(struct sysfs_class_device *dev, int level); #define SHOW_ATTRIBUTES 0x01 /* show attributes command option */ #define SHOW_ATTRIBUTE_VALUE 0x02 /* show an attribute value option */ #define SHOW_DEVICES 0x04 /* show only devices option */ #define SHOW_DRIVERS 0x08 /* show only drivers option */ #define SHOW_ALL_ATTRIB_VALUES 0x10 /* show all attributes with values */ +#define SHOW_CHILDREN 0x20 /* show device children */ +#define SHOW_PARENT 0x40 /* show device parent */ +#define SHOW_PATH 0x80 /* show device/driver path */ #define SHOW_ALL 0xff -static char cmd_options[] = "aA:b:c:dDhr:v"; +static char cmd_options[] = "aA:b:c:CdDhpPr:v"; /* * binary_files - defines existing sysfs binary files. These files will be @@ -58,10 +67,17 @@ static char *binary_files[] = { static int binfiles = 2; +static unsigned int get_pciconfig_word(int offset, unsigned char *buf) +{ + unsigned short val = (unsigned char)buf[offset] | + ((unsigned char)buf[offset+1] << 8); + return val; +} + /** * usage: prints utility usage. */ -void usage(void) +static void usage(void) { fprintf(stdout, "Usage: systool [<options> [device]]\n"); fprintf(stdout, "\t-a\t\t\tShow attributes\n"); @@ -69,11 +85,14 @@ void usage(void) fprintf(stdout, "\t-c <class_name>\t\tShow a specific class\n"); fprintf(stdout, "\t-d\t\t\tShow only devices\n"); fprintf(stdout, "\t-h\t\t\tShow usage\n"); + fprintf(stdout, "\t-p\t\t\tShow path to device/driver\n"); fprintf(stdout, "\t-r <root_device>\tShow a specific root device tree\n"); fprintf(stdout, "\t-v\t\t\tShow all attributes with values\n"); fprintf(stdout, "\t-A <attribute_name>\tShow attribute value\n"); + fprintf(stdout, "\t-C\t\t\tShow device's children\n"); fprintf(stdout, "\t-D\t\t\tShow only drivers\n"); + fprintf(stdout, "\t-P\t\t\tShow device's parent\n"); } /** @@ -81,11 +100,11 @@ void usage(void) * level passed in. * @level: number of spaces to indent. */ -void indent(int level) +static void indent(int level) { int i; - for (i = 0; i <= level; i++) + for (i = 0; i < level; i++) fprintf(stdout, " "); } @@ -93,7 +112,7 @@ void indent(int level) * remove_end_newline: removes newline on the end of an attribute value * @value: string to remove newline from */ -void remove_end_newline(char *value) +static void remove_end_newline(char *value) { char *p = value + (strlen(value) - 1); @@ -103,36 +122,31 @@ void remove_end_newline(char *value) /** * show_device_children: prints out device subdirs. - * @sdir: print this directory's subdirectories/children. + * @children: dlist of child devices. */ -void show_device_children(struct sysfs_directory *sdir, int level) +static void show_device_children(struct sysfs_device *device, int level) { - if (sdir != NULL) { - indent(level); - fprintf(stdout, "Children:\n"); - if (sdir->subdirs != NULL) { - char dirname[SYSFS_NAME_LEN]; - struct sysfs_directory *cur = sdir->subdirs; - - while (cur != NULL) { - indent(level+4); - if ((sysfs_get_name_from_path(cur->path, - dirname, SYSFS_NAME_LEN)) == 0) - fprintf(stdout, "%s\n", dirname); - else - fprintf(stdout, "%s\n", cur->path); - cur = cur->next; - } - } - if (sdir->links != NULL) { - struct sysfs_link *curl = sdir->links; - - while (curl != NULL) { - indent(level+4); - fprintf(stdout, "%s\n", curl->name); - curl = curl->next; + struct sysfs_device *temp_device = NULL, *child = NULL; + int flag = 1; + + temp_device = sysfs_open_device_tree(device->path); + if (temp_device) { + if (temp_device->children) { + fprintf(stdout, "\n"); + dlist_for_each_data(temp_device->children, child, + struct sysfs_device) { + if (strncmp(child->name, "power", 5) == 0) + continue; + if (flag) { + flag--; + indent(level); + fprintf(stdout, "Device \"%s\"'s children\n", + temp_device->name); + } + show_device(child, (level+2)); } } + sysfs_close_device_tree(temp_device); } } @@ -141,20 +155,15 @@ void show_device_children(struct sysfs_directory *sdir, int level) * @attr: attribute to check. * returns 1 if binary, 0 if not. */ -int isbinaryvalue(struct sysfs_attribute *attr) +static int isbinaryvalue(struct sysfs_attribute *attr) { - char attrname[SYSFS_NAME_LEN]; int i; if (attr == NULL || attr->value == NULL) return 0; - if ((sysfs_get_name_from_path(attr->path, attrname, SYSFS_NAME_LEN)) - != 0) - return 0; - for (i = 0; i < binfiles; i++) - if ((strcmp(attrname, binary_files[i])) == 0) + if ((strcmp(attr->name, binary_files[i])) == 0) return 1; return 0; @@ -164,7 +173,7 @@ int isbinaryvalue(struct sysfs_attribute *attr) * show_attribute_value: prints out single attribute value. * @attr: attricute to print. */ -void show_attribute_value(struct sysfs_attribute *attr, int level) +static void show_attribute_value(struct sysfs_attribute *attr, int level) { if (attr == NULL) return; @@ -172,25 +181,24 @@ void show_attribute_value(struct sysfs_attribute *attr, int level) if (attr->method & SYSFS_METHOD_SHOW) { if (isbinaryvalue(attr) != 0) { int i; - fprintf(stdout, "\t: "); for (i = 0; i < attr->len; i++) { - if (!(i %16)) { + if (!(i % 16) && (i != 0)) { fprintf(stdout, "\n"); - indent(level+8); - } else if (!(i %8)) + indent(level+22); + } else if (!(i % 8) && (i != 0)) fprintf(stdout, " "); - fprintf(stdout, "%02x ", + fprintf(stdout, " %02x", (unsigned char)attr->value[i]); } fprintf(stdout, "\n"); } else if (attr->value != NULL && strlen(attr->value) > 0) { remove_end_newline(attr->value); - fprintf(stdout, "\t: %s\n", attr->value); + fprintf(stdout, "\"%s\"\n", attr->value); } else fprintf(stdout, "\n"); } else { - fprintf(stdout, "\t: store method only\n"); + fprintf(stdout, "<store method only>\n"); } } @@ -198,135 +206,140 @@ void show_attribute_value(struct sysfs_attribute *attr, int level) * show_attribute: prints out a single attribute * @attr: attribute to print. */ -void show_attribute(struct sysfs_attribute *attr, int level) +static void show_attribute(struct sysfs_attribute *attr, int level) { - char attrname[SYSFS_NAME_LEN]; - if (attr == NULL) return; - if ((sysfs_get_name_from_path(attr->path, attrname, SYSFS_NAME_LEN)) - != 0) - return; - if (show_options & SHOW_ALL_ATTRIB_VALUES) { indent(level); - fprintf(stdout, "%s", attrname); + fprintf(stdout, "%-20s= ", attr->name); show_attribute_value(attr, level); - } else if ((show_options & SHOW_ATTRIBUTES) || ((show_options - & SHOW_ATTRIBUTE_VALUE) && (strcmp(attrname, attribute_to_show) + & SHOW_ATTRIBUTE_VALUE) && (strcmp(attr->name, attribute_to_show) == 0))) { indent(level); - fprintf (stdout, "%s", attrname); + fprintf (stdout, "%-20s", attr->name); if (show_options & SHOW_ATTRIBUTE_VALUE && attr->value - != NULL && (strcmp(attrname, attribute_to_show)) == 0) + != NULL && (strcmp(attr->name, attribute_to_show)) == 0) { + fprintf(stdout, "= "); show_attribute_value(attr, level); - - else + } else fprintf(stdout, "\n"); } } /** - * show_attributes: prints out a directory's attributes. - * @sdir: print this directory's attributes/files. + * show_attributes: prints out a list of attributes. + * @attributes: print this dlist of attributes/files. */ -void show_attributes(struct sysfs_directory *sdir, int level) +static void show_attributes(struct dlist *attributes, int level) { - if (sdir != NULL && sdir->attributes != NULL) { - struct sysfs_attribute *cur = sdir->attributes; - - indent(level); - fprintf (stdout, "Attributes:\n"); - while (cur != NULL) { - show_attribute(cur, (level+4)); - cur = cur->next; + if (attributes != NULL) { + struct sysfs_attribute *cur = NULL; + + dlist_for_each_data(attributes, cur, + struct sysfs_attribute) { + show_attribute(cur, (level)); } } } /** - * show_device: prints out device information. - * @device: device to print. + * show_device_parent: prints device's parent (if present) + * @device: sysfs_device whose parent information is needed */ -void show_device(struct sysfs_device *device, int level) +static void show_device_parent(struct sysfs_device *device, int level) { - if (device != NULL && device->directory != NULL) { + struct sysfs_device *parent = NULL; + + parent = sysfs_get_device_parent(device); + if (parent) { + fprintf(stdout, "\n"); indent(level); - fprintf (stdout, "%s %s\n", device->bus_id, device->name); - if (device->directory->subdirs != NULL - || device->directory->links != NULL) - show_device_children(device->directory, (level+4)); - if (device->directory->attributes != NULL && (show_options - & (SHOW_ATTRIBUTES | SHOW_ATTRIBUTE_VALUE - | SHOW_ALL_ATTRIB_VALUES))) - show_attributes(device->directory, (level+4)); - if (device->driver != NULL) { - indent(level+4); - fprintf (stdout, "Driver: %s\n", - device->driver->name); - } + fprintf(stdout, "Device \"%s\"'s parent\n", device->name); + show_device(parent, (level+2)); } } - + /** - * show_root_device: prints out sys/devices device information. + * show_device: prints out device information. * @device: device to print. */ -void show_root_device(struct sysfs_device *device, int level) +static void show_device(struct sysfs_device *device, int level) { - if (device != NULL && device->directory != NULL) { + struct dlist *attributes = NULL; + unsigned int vendor_id, device_id; + char buf[128], value[256], path[SYSFS_PATH_MAX]; + + if (device != NULL) { indent(level); - fprintf (stdout, "%s %s\n", device->bus_id, device->name); - if (device->directory->attributes != NULL && (show_options - & (SHOW_ATTRIBUTES | SHOW_ATTRIBUTE_VALUE - | SHOW_ALL_ATTRIB_VALUES))) - show_attributes(device->directory, (level+4)); - } -} - -/** - * show_driver_attributes: prints out driver attributes . - * @driver: print this driver's attributes. - */ -void show_driver_attributes(struct sysfs_driver *driver, int level) -{ - if (driver != NULL && driver->directory != NULL) { - struct sysfs_directory *sdir = driver->directory; - - if (sdir->attributes != NULL) { - struct sysfs_attribute *cur = sdir->attributes; - + if (show_bus != NULL && (!(strcmp(show_bus, "pci")))) { + fprintf(stdout, "%s ", device->bus_id); + memset(path, 0, SYSFS_PATH_MAX); + memset(value, 0, SYSFS_PATH_MAX); + safestrcpy(path, device->path); + safestrcat(path, "/config"); + if ((sysfs_read_attribute_value(path, + value, 256)) == 0) { + vendor_id = get_pciconfig_word + (PCI_VENDOR_ID, value); + device_id = get_pciconfig_word + (PCI_DEVICE_ID, value); + fprintf(stdout, "%s\n", + pci_lookup_name(pacc, buf, 128, + PCI_LOOKUP_VENDOR | PCI_LOOKUP_DEVICE, + vendor_id, device_id, 0, 0)); + } else + fprintf(stdout, "\n"); + } else + fprintf(stdout, "Device = \"%s\"\n", device->bus_id); + + if (show_options & (SHOW_PATH | SHOW_ALL_ATTRIB_VALUES)) { indent(level); - fprintf (stdout, "%s Attributes:\n", driver->name); - while (cur != NULL) { - show_attribute(cur, (level+4)); - cur = cur->next; - } + fprintf(stdout, "Device path = \"%s\"\n", + device->path); + } + + if (show_options & (SHOW_ATTRIBUTES | SHOW_ATTRIBUTE_VALUE | + SHOW_ALL_ATTRIB_VALUES)) { + attributes = sysfs_get_device_attributes(device); + if (attributes != NULL) + show_attributes(attributes, (level+2)); + } + if ((device_to_show != NULL) && + (show_options & SHOW_CHILDREN)) { + show_options &= ~SHOW_CHILDREN; + show_device_children(device, (level+2)); } + if ((device_to_show != NULL) && (show_options & SHOW_PARENT)) { + show_options &= ~SHOW_PARENT; + show_device_parent(device, (level+2)); + } + if (show_options ^ SHOW_DEVICES) + if (!(show_options & SHOW_DRIVERS)) + fprintf(stdout, "\n"); } } /** - * show_driver_devices: prints out devices under driver. - * @driver: print devices bound to this driver. + * show_driver_attributes: prints out driver attributes . + * @driver: print this driver's attributes. */ -void show_driver_devices(struct sysfs_driver *driver, int level) +static void show_driver_attributes(struct sysfs_driver *driver, int level) { - if (driver != NULL && driver->directory != NULL) { - struct sysfs_directory *sdir = driver->directory; - - if (sdir->links != NULL) { - struct sysfs_link *cur = sdir->links; - - indent(level); - fprintf (stdout, "Devices:\n"); - while (cur != NULL) { - indent(level+4); - fprintf (stdout, "%s\n", cur->name); - cur = cur->next; + if (driver != NULL) { + struct dlist *attributes = NULL; + + attributes = sysfs_get_driver_attributes(driver); + if (attributes != NULL) { + struct sysfs_attribute *cur = NULL; + + dlist_for_each_data(attributes, cur, + struct sysfs_attribute) { + show_attribute(cur, (level)); } + fprintf(stdout, "\n"); } } } @@ -335,22 +348,40 @@ void show_driver_devices(struct sysfs_driver *driver, int level) * show_driver: prints out driver information. * @driver: driver to print. */ -void show_driver(struct sysfs_driver *driver, int level) +static void show_driver(struct sysfs_driver *driver, int level) { - struct sysfs_directory *sdir = NULL; - + struct dlist *devlist = NULL; + if (driver != NULL) { indent(level); - fprintf (stdout, "%s\n", driver->name); - sdir = driver->directory; - if (sdir != NULL) { - if (sdir->links != NULL) - show_driver_devices(driver, (level+4)); - if(sdir->attributes != NULL && (show_options - & (SHOW_ATTRIBUTES | SHOW_ATTRIBUTE_VALUE - | SHOW_ALL_ATTRIB_VALUES))) - show_driver_attributes(driver, (level+4)); + fprintf (stdout, "Driver = \"%s\"\n", driver->name); + if (show_options & (SHOW_PATH | SHOW_ALL_ATTRIB_VALUES)) { + indent(level); + fprintf(stdout, "Driver path = \"%s\"\n", + driver->path); } + if (show_options & (SHOW_ATTRIBUTES | SHOW_ATTRIBUTE_VALUE + | SHOW_ALL_ATTRIB_VALUES)) + show_driver_attributes(driver, (level+2)); + devlist = sysfs_get_driver_devices(driver); + if (devlist != NULL) { + struct sysfs_device *cur = NULL; + + indent(level+2); + fprintf(stdout, "Devices using \"%s\" are:\n", + driver->name); + dlist_for_each_data(devlist, cur, + struct sysfs_device) { + if (show_options & SHOW_DRIVERS) { + show_device(cur, (level+4)); + fprintf(stdout, "\n"); + } else { + indent(level+4); + fprintf(stdout, "\"%s\"\n", cur->name); + } + } + } + fprintf(stdout, "\n"); } } @@ -358,19 +389,22 @@ void show_driver(struct sysfs_driver *driver, int level) * show_device_tree: prints out device tree. * @root: root device */ -void show_device_tree(struct sysfs_device *root, int level) +static void show_device_tree(struct sysfs_device *root, int level) { if (root != NULL) { struct sysfs_device *cur = NULL; if (device_to_show == NULL || (strcmp(device_to_show, root->bus_id) == 0)) { - show_root_device(root, level); + show_device(root, level); } - cur = root->children; - while (cur != NULL) { - show_device_tree(cur, (level+6)); - cur = cur->next; + if (root->children != NULL) { + dlist_for_each_data(root->children, cur, + struct sysfs_device) { + if (strncmp(cur->name, "power", 5) == 0) + continue; + show_device_tree(cur, (level+2)); + } } } } @@ -380,11 +414,13 @@ void show_device_tree(struct sysfs_device *root, int level) * @busname: bus to print. * returns 0 with success or 1 with error. */ -int show_sysfs_bus(char *busname) +static int show_sysfs_bus(char *busname) { struct sysfs_bus *bus = NULL; struct sysfs_device *curdev = NULL; struct sysfs_driver *curdrv = NULL; + struct dlist *devlist = NULL; + struct dlist *drvlist = NULL; if (busname == NULL) { errno = EINVAL; @@ -396,24 +432,28 @@ int show_sysfs_bus(char *busname) return 1; } - fprintf(stdout, "Bus: %s\n", busname); - if (bus->devices != NULL && (show_options & SHOW_DEVICES)) { - curdev = bus->devices; - if (device_to_show == NULL) - fprintf(stdout, "Devices:\n"); - while (curdev != NULL) { - if (device_to_show == NULL || (strcmp(device_to_show, - curdev->bus_id) == 0)) - show_device(curdev, 2); - curdev = curdev->next; + fprintf(stdout, "Bus = \"%s\"\n", busname); + if (show_options ^ (SHOW_DEVICES | SHOW_DRIVERS)) + fprintf(stdout, "\n"); + if (show_options & SHOW_DEVICES) { + devlist = sysfs_get_bus_devices(bus); + if (devlist != NULL) { + dlist_for_each_data(devlist, curdev, + struct sysfs_device) { + if (device_to_show == NULL || + (strcmp(device_to_show, + curdev->bus_id) == 0)) + show_device(curdev, 2); + } } } - if (bus->drivers != NULL && (show_options & SHOW_DRIVERS)) { - curdrv = bus->drivers; - fprintf(stdout, "Drivers:\n"); - while (curdrv != NULL) { - show_driver(curdrv, 2); - curdrv = curdrv->next; + if (show_options & SHOW_DRIVERS) { + drvlist = sysfs_get_bus_drivers(bus); + if (drvlist != NULL) { + dlist_for_each_data(drvlist, curdrv, + struct sysfs_driver) { + show_driver(curdrv, 2); + } } } sysfs_close_bus(bus); @@ -421,36 +461,67 @@ int show_sysfs_bus(char *busname) } /** + * show_classdev_parent: prints the class device's parent if present + * @dev: class device whose parent is needed + */ +static void show_classdev_parent(struct sysfs_class_device *dev, int level) +{ + struct sysfs_class_device *parent = NULL; + + parent = sysfs_get_classdev_parent(dev); + if (parent) { + fprintf(stdout, "\n"); + indent(level); + fprintf(stdout, "Class device \"%s\"'s parent is\n", + dev->name); + show_class_device(parent, level+2); + } +} + +/** * show_class_device: prints out class device. * @dev: class device to print. */ -void show_class_device(struct sysfs_class_device *dev, int level) +static void show_class_device(struct sysfs_class_device *dev, int level) { - struct sysfs_directory *cur = NULL; - char dirname[SYSFS_NAME_LEN]; - + struct dlist *attributes = NULL; + struct sysfs_device *device = NULL; + struct sysfs_driver *driver = NULL; + if (dev != NULL) { indent(level); - fprintf(stdout, "%s\n", dev->name); - if (dev->directory != NULL && (show_options - & (SHOW_ATTRIBUTES | SHOW_ATTRIBUTE_VALUE - | SHOW_ALL_ATTRIB_VALUES))) { - show_attributes(dev->directory, (level+4)); - cur = dev->directory->subdirs; - while (cur != NULL) { - if ((sysfs_get_name_from_path(cur->path, - dirname, SYSFS_NAME_LEN)) == 0) { - indent(level+4); - fprintf(stdout, "%s\n", dirname); - } - show_attributes(cur, (level+4)); - cur = cur->next; + fprintf(stdout, "Class Device = \"%s\"\n", dev->name); + if (show_options & (SHOW_PATH | SHOW_ALL_ATTRIB_VALUES)) { + indent(level); + fprintf(stdout, "Class Device path = \"%s\"\n", + dev->path); + } + if (show_options & (SHOW_ATTRIBUTES | SHOW_ATTRIBUTE_VALUE + | SHOW_ALL_ATTRIB_VALUES)) { + attributes = sysfs_get_classdev_attributes(dev); + if (attributes != NULL) + show_attributes(attributes, (level+2)); + fprintf(stdout, "\n"); + } + if (show_options & (SHOW_DEVICES | SHOW_ALL_ATTRIB_VALUES)) { + device = sysfs_get_classdev_device(dev); + if (device != NULL) { + show_device(device, (level+2)); } } - if (dev->sysdevice != NULL && (show_options & SHOW_DEVICES)) - show_device(dev->sysdevice, (level+4)); - if (dev->driver != NULL && (show_options & SHOW_DRIVERS)) - show_driver(dev->driver, (level+4)); + if (show_options & (SHOW_DRIVERS | SHOW_ALL_ATTRIB_VALUES)) { + driver = sysfs_get_classdev_driver(dev); + if (driver != NULL) { + show_driver(driver, (level+2)); + } + } + if ((device_to_show != NULL) && (show_options & SHOW_PARENT)) { + show_options &= ~SHOW_PARENT; + show_classdev_parent(dev, level+2); + } + if (show_options & ~(SHOW_ATTRIBUTES | SHOW_ATTRIBUTE_VALUE + | SHOW_ALL_ATTRIB_VALUES)) + fprintf(stdout, "\n"); } } @@ -459,10 +530,11 @@ void show_class_device(struct sysfs_class_device *dev, int level) * @classname: class to print. * returns 0 with success and 1 with error. */ -int show_sysfs_class(char *classname) +static int show_sysfs_class(char *classname) { struct sysfs_class *cls = NULL; struct sysfs_class_device *cur = NULL; + struct dlist *clsdevlist = NULL; if (classname == NULL) { errno = EINVAL; @@ -473,16 +545,14 @@ int show_sysfs_class(char *classname) fprintf(stderr, "Error opening class %s\n", classname); return 1; } - fprintf(stdout, "Class: %s\n", classname); - if (cls->devices != NULL) { - cur = cls->devices; - if (device_to_show == NULL) - fprintf(stdout, "Class Devices:\n"); - while (cur != NULL) { + fprintf(stdout, "Class = \"%s\"\n\n", classname); + clsdevlist = sysfs_get_class_devices(cls); + if (clsdevlist != NULL) { + dlist_for_each_data(clsdevlist, cur, + struct sysfs_class_device) { if (device_to_show == NULL || (strcmp(device_to_show, cur->name) == 0)) show_class_device(cur, 2); - cur = cur->next; } } @@ -495,71 +565,38 @@ int show_sysfs_class(char *classname) * @rootname: device root to print. * returns 0 with success and 1 with error. */ -int show_sysfs_root(char *rootname) +static int show_sysfs_root(char *rootname) { - struct sysfs_device *root = NULL; - char path[SYSFS_PATH_MAX]; + struct sysfs_root_device *root = NULL; + struct sysfs_device *device = NULL; + struct dlist *devlist = NULL; if (rootname == NULL) { errno = EINVAL; return 1; } - if (sysfs_get_mnt_path(path, SYSFS_PATH_MAX) != 0) { - perror("sysfs_get_mnt_path"); - fprintf(stderr, "Error getting sysfs mount point\n"); - exit(1); - } - - strcat(path, SYSFS_DEVICES_DIR); - strcat(path, "/"); - strcat(path, rootname); - root = sysfs_open_device_tree(path); + root = sysfs_open_root_device(rootname); if (root == NULL) { fprintf(stderr, "Error opening root device %s\n", rootname); return 1; } - fprintf(stdout, "Root Device Tree: %s\n", rootname); - show_device_tree(root, 2); - sysfs_close_device_tree(root); - - return 0; -} - -/** - * show_subdirectories: prints all subdirectory names at path - * @path: sysfs path where subdirs are. - * returns 0 with success or 1 with error. - */ -int show_subdirectories(char *path, int level) -{ - struct sysfs_directory *dir = NULL, *current = NULL; - char name[SYSFS_NAME_LEN]; - int ret = 0; - - dir = sysfs_open_directory(path); - if (dir == NULL) { - fprintf(stderr, "Error opening sysfs directory at %s\n", path); - return 1; - } - if ((sysfs_read_directory(dir)) != 0) { - fprintf(stderr, "Error reading sysfs directory at %s\n", path); - sysfs_close_directory(dir); - return 1; - } - current = dir->subdirs; - while (current != NULL) { - if ((sysfs_get_name_from_path(current->path, name, - SYSFS_NAME_LEN)) != 0) { - sysfs_close_directory(dir); - return 1; + devlist = sysfs_get_root_devices(root); + if (devlist != NULL) { + fprintf(stdout, "Root Device = \"%s\"\n\n", rootname); + + if (devlist != NULL) { + dlist_for_each_data(devlist, device, + struct sysfs_device) { + if (strncmp(device->name, "power", 5) == 0) + continue; + show_device_tree(device, 2); + } } - indent(level); - fprintf(stdout, "%s\n", name); - current = current->next; } - sysfs_close_directory(dir); - return ret; + sysfs_close_root_device(root); + + return 0; } /** @@ -567,55 +604,66 @@ int show_subdirectories(char *path, int level) * supported by sysfs. * returns 0 with success or 1 with error. */ -int show_default_info(void) +static int show_default_info(void) { - char sysfs_root[SYSFS_PATH_MAX]; - char path_to_print[SYSFS_PATH_MAX]; + char subsys[SYSFS_NAME_LEN]; + struct dlist *list = NULL; + char *cur = NULL; int retval = 0; - /* get sysfs mount point */ - if (sysfs_get_mnt_path(sysfs_root, SYSFS_PATH_MAX) != 0) { - perror("sysfs_get_mnt_path"); - fprintf(stderr, "Error getting sysfs mount point\n"); - exit(1); + safestrcpy(subsys, SYSFS_BUS_NAME); + list = sysfs_open_subsystem_list(subsys); + if (list != NULL) { + fprintf(stdout, "Supported sysfs buses:\n"); + dlist_for_each_data(list, cur, char) + fprintf(stdout, "\t%s\n", cur); + sysfs_close_list(list); } - strcpy(path_to_print, sysfs_root); - /* print supported buses */ - strcat(path_to_print, SYSFS_BUS_DIR); - fprintf(stdout, "Supported sysfs buses:\n"); - retval = show_subdirectories(path_to_print, 4); - - if (retval == 0) { - /* print supported classes */ - strcpy(path_to_print, sysfs_root); - strcat(path_to_print, SYSFS_CLASS_DIR); + safestrcpy(subsys, SYSFS_CLASS_NAME); + list = sysfs_open_subsystem_list(subsys); + if (list != NULL) { fprintf(stdout, "Supported sysfs classes:\n"); - retval = show_subdirectories(path_to_print, 4); + dlist_for_each_data(list, cur, char) + fprintf(stdout, "\t%s\n", cur); + sysfs_close_list(list); } - if (retval == 0) { - /* print supported root devices */ - strcpy(path_to_print, sysfs_root); - strcat(path_to_print, SYSFS_DEVICES_DIR); - fprintf(stdout, "Supported sysfs root devices:\n"); - retval = show_subdirectories(path_to_print, 4); + safestrcpy(subsys, SYSFS_DEVICES_NAME); + list = sysfs_open_subsystem_list(subsys); + if (list != NULL) { + fprintf(stdout, "Supported sysfs devices:\n"); + dlist_for_each_data(list, cur, char) + fprintf(stdout, "\t%s\n", cur); + sysfs_close_list(list); } - + return retval; } + +/** + * check_sysfs_mounted: Checks to see if sysfs is mounted. + * returns 0 if not and 1 if true. + */ +static int check_sysfs_is_mounted(void) +{ + char path[SYSFS_PATH_MAX]; + + if (sysfs_get_mnt_path(path, SYSFS_PATH_MAX) != 0) + return 0; + return 1; +} /* MAIN */ int main(int argc, char *argv[]) { - char *show_bus = NULL; +/* char *show_bus = NULL;*/ char *show_class = NULL; char *show_root = NULL; int retval = 0; int opt; - extern int optind; - extern char *optarg; - + char *pci_id_file = "/usr/local/share/pci.ids"; + while((opt = getopt(argc, argv, cmd_options)) != EOF) { switch(opt) { case 'a': @@ -637,6 +685,9 @@ int main(int argc, char *argv[]) case 'c': show_class = optarg; break; + case 'C': + show_options |= SHOW_CHILDREN; + break; case 'd': show_options |= SHOW_DEVICES; break; @@ -647,6 +698,12 @@ int main(int argc, char *argv[]) usage(); exit(0); break; + case 'p': + show_options |= SHOW_PATH; + break; + case 'P': + show_options |= SHOW_PARENT; + break; case 'r': show_root = optarg; break; @@ -680,9 +737,15 @@ int main(int argc, char *argv[]) exit(1); } - if ((show_bus == NULL && show_class == NULL && show_root == NULL) - && (show_options & (SHOW_ATTRIBUTES | SHOW_ATTRIBUTE_VALUE - | SHOW_DEVICES | SHOW_DRIVERS | SHOW_ALL_ATTRIB_VALUES))) { + if (check_sysfs_is_mounted() == 0) { + fprintf(stderr, "Unable to find sysfs mount point!\n"); + exit(1); + } + + if ((show_bus == NULL && show_class == NULL && show_root == NULL) && + (show_options & (SHOW_ATTRIBUTES | + SHOW_ATTRIBUTE_VALUE | SHOW_DEVICES | + SHOW_DRIVERS | SHOW_ALL_ATTRIB_VALUES))) { fprintf(stderr, "Please specify a bus, class, or root device\n"); usage(); @@ -692,8 +755,17 @@ int main(int argc, char *argv[]) if (!(show_options & (SHOW_DEVICES | SHOW_DRIVERS))) show_options |= SHOW_DEVICES; - if (show_bus != NULL) + if (show_bus != NULL) { + /* if ((!(strcmp(show_bus, "pci"))) && + (show_options & SHOW_DEVICES)) { */ + if ((!(strcmp(show_bus, "pci")))) { + pacc = (struct pci_access *) + calloc(1, sizeof(struct pci_access)); + pacc->pci_id_file_name = pci_id_file; + pacc->numeric_ids = 0; + } retval = show_sysfs_bus(show_bus); + } if (show_class != NULL) retval = show_sysfs_class(show_class); if (show_root != NULL) @@ -702,5 +774,17 @@ int main(int argc, char *argv[]) if (show_bus == NULL && show_class == NULL && show_root == NULL) retval = show_default_info(); + if (show_bus != NULL) { + /*if ((!(strcmp(show_bus, "pci"))) && + (show_options & SHOW_DEVICES)) { */ + if ((!(strcmp(show_bus, "pci")))) { + pci_free_name_list(pacc); + free (pacc); + pacc = NULL; + } + } + if (!(show_options ^ SHOW_DEVICES)) + fprintf(stdout, "\n"); + exit(retval); } |