From dd8c511d725f816bc64592028ff178616fcde607 Mon Sep 17 00:00:00 2001 From: stekloff Date: Wed, 6 Apr 2005 20:57:01 +0000 Subject: Merging tag sysfsutils-1_3_0 with main trunk. --- cmd/Makefile | 20 -- cmd/Makefile.am | 6 + cmd/Makefile.in | 350 ++++++++++++++++++++++++++++++ cmd/lsbus.c | 492 ------------------------------------------ cmd/names.c | 358 +++++++++++++++++++++++++++++++ cmd/names.h | 36 ++++ cmd/systool.c | 652 ++++++++++++++++++++++++++++++++------------------------ 7 files changed, 1118 insertions(+), 796 deletions(-) delete mode 100644 cmd/Makefile create mode 100644 cmd/Makefile.am create mode 100644 cmd/Makefile.in delete mode 100644 cmd/lsbus.c create mode 100644 cmd/names.c create mode 100644 cmd/names.h (limited to 'cmd') diff --git a/cmd/Makefile b/cmd/Makefile deleted file mode 100644 index d53677e..0000000 --- a/cmd/Makefile +++ /dev/null @@ -1,20 +0,0 @@ -# System utilities makefile - -CC=gcc - -CFLAGS=-g -Wall -INCLUDE=../include -LIB=../lib - -RM=rm -f - -all: lsbus systool - -lsbus: lsbus.c - $(CC) $(CFLAGS) -I$(INCLUDE) -o lsbus lsbus.c -lsysfs -L$(LIB) - -systool: systool.c - $(CC) $(CFLAGS) -I$(INCLUDE) -o systool systool.c -lsysfs -L$(LIB) - -clean: - $(RM) *.o *~ lsbus systool diff --git a/cmd/Makefile.am b/cmd/Makefile.am new file mode 100644 index 0000000..4ecf20a --- /dev/null +++ b/cmd/Makefile.am @@ -0,0 +1,6 @@ +bin_PROGRAMS = systool +systool_SOURCES = systool.c names.c names.h +INCLUDES = -I../include +LDADD = ../lib/libsysfs.la +CFLAGS = -Wall -Wshadow -W -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wredundant-decls + diff --git a/cmd/Makefile.in b/cmd/Makefile.in new file mode 100644 index 0000000..25ea859 --- /dev/null +++ b/cmd/Makefile.in @@ -0,0 +1,350 @@ +# Makefile.in generated by automake 1.6.3 from Makefile.am. +# @configure_input@ + +# Copyright 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002 +# Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ +SHELL = @SHELL@ + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +prefix = @prefix@ +exec_prefix = @exec_prefix@ + +bindir = @bindir@ +sbindir = @sbindir@ +libexecdir = @libexecdir@ +datadir = @datadir@ +sysconfdir = @sysconfdir@ +sharedstatedir = @sharedstatedir@ +localstatedir = @localstatedir@ +libdir = @libdir@ +infodir = @infodir@ +mandir = @mandir@ +includedir = @includedir@ +oldincludedir = /usr/include +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = .. + +ACLOCAL = @ACLOCAL@ +AUTOCONF = @AUTOCONF@ +AUTOMAKE = @AUTOMAKE@ +AUTOHEADER = @AUTOHEADER@ + +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_DATA = @INSTALL_DATA@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_HEADER = $(INSTALL_DATA) +transform = @program_transform_name@ +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +host_alias = @host_alias@ +host_triplet = @host@ + +EXEEXT = @EXEEXT@ +OBJEXT = @OBJEXT@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +AMTAR = @AMTAR@ +AS = @AS@ +AWK = @AWK@ +CC = @CC@ +DEPDIR = @DEPDIR@ +DLLTOOL = @DLLTOOL@ +ECHO = @ECHO@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +LIBTOOL = @LIBTOOL@ +LN_S = @LN_S@ +OBJDUMP = @OBJDUMP@ +PACKAGE = @PACKAGE@ +RANLIB = @RANLIB@ +STRIP = @STRIP@ +VERSION = @VERSION@ +am__include = @am__include@ +am__quote = @am__quote@ +install_sh = @install_sh@ +bin_PROGRAMS = systool +systool_SOURCES = systool.c names.c names.h +INCLUDES = -I../include +LDADD = ../lib/libsysfs.la +CFLAGS = -Wall -Wshadow -W -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wredundant-decls +subdir = cmd +mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +bin_PROGRAMS = systool$(EXEEXT) +PROGRAMS = $(bin_PROGRAMS) + +am_systool_OBJECTS = systool.$(OBJEXT) names.$(OBJEXT) +systool_OBJECTS = $(am_systool_OBJECTS) +systool_LDADD = $(LDADD) +systool_DEPENDENCIES = ../lib/libsysfs.la +systool_LDFLAGS = + +DEFS = @DEFS@ +DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) +CPPFLAGS = @CPPFLAGS@ +LDFLAGS = @LDFLAGS@ +LIBS = @LIBS@ +depcomp = $(SHELL) $(top_srcdir)/depcomp +am__depfiles_maybe = depfiles +@AMDEP_TRUE@DEP_FILES = ./$(DEPDIR)/names.Po ./$(DEPDIR)/systool.Po +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) \ + $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(LIBTOOL) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(AM_LDFLAGS) $(LDFLAGS) -o $@ +DIST_SOURCES = $(systool_SOURCES) +DIST_COMMON = Makefile.am Makefile.in +SOURCES = $(systool_SOURCES) + +all: all-am + +.SUFFIXES: +.SUFFIXES: .c .lo .o .obj +$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.ac $(ACLOCAL_M4) + cd $(top_srcdir) && \ + $(AUTOMAKE) --gnu cmd/Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe) +binPROGRAMS_INSTALL = $(INSTALL_PROGRAM) +install-binPROGRAMS: $(bin_PROGRAMS) + @$(NORMAL_INSTALL) + $(mkinstalldirs) $(DESTDIR)$(bindir) + @list='$(bin_PROGRAMS)'; for p in $$list; do \ + p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ + if test -f $$p \ + || test -f $$p1 \ + ; then \ + f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \ + echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) $$p $(DESTDIR)$(bindir)/$$f"; \ + $(INSTALL_PROGRAM_ENV) $(LIBTOOL) --mode=install $(binPROGRAMS_INSTALL) $$p $(DESTDIR)$(bindir)/$$f; \ + else :; fi; \ + done + +uninstall-binPROGRAMS: + @$(NORMAL_UNINSTALL) + @list='$(bin_PROGRAMS)'; for p in $$list; do \ + f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \ + echo " rm -f $(DESTDIR)$(bindir)/$$f"; \ + rm -f $(DESTDIR)$(bindir)/$$f; \ + done + +clean-binPROGRAMS: + @list='$(bin_PROGRAMS)'; for p in $$list; do \ + f=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ + echo " rm -f $$p $$f"; \ + rm -f $$p $$f ; \ + done +systool$(EXEEXT): $(systool_OBJECTS) $(systool_DEPENDENCIES) + @rm -f systool$(EXEEXT) + $(LINK) $(systool_LDFLAGS) $(systool_OBJECTS) $(systool_LDADD) $(LIBS) + +mostlyclean-compile: + -rm -f *.$(OBJEXT) core *.core + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/names.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/systool.Po@am__quote@ + +distclean-depend: + -rm -rf ./$(DEPDIR) + +.c.o: +@AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ +@AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ + $(COMPILE) -c `test -f '$<' || echo '$(srcdir)/'`$< + +.c.obj: +@AMDEP_TRUE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ +@AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ + $(COMPILE) -c `cygpath -w $<` + +.c.lo: +@AMDEP_TRUE@ source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ +@AMDEP_TRUE@ depfile='$(DEPDIR)/$*.Plo' tmpdepfile='$(DEPDIR)/$*.TPlo' @AMDEPBACKSLASH@ +@AMDEP_TRUE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ + $(LTCOMPILE) -c -o $@ `test -f '$<' || echo '$(srcdir)/'`$< +CCDEPMODE = @CCDEPMODE@ + +mostlyclean-libtool: + -rm -f *.lo + +clean-libtool: + -rm -rf .libs _libs + +distclean-libtool: + -rm -f libtool +uninstall-info-am: + +ETAGS = etags +ETAGSFLAGS = + +tags: TAGS + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(ETAGS_ARGS)$$tags$$unique" \ + || $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) + +top_distdir = .. +distdir = $(top_distdir)/$(PACKAGE)-$(VERSION) + +distdir: $(DISTFILES) + @list='$(DISTFILES)'; for file in $$list; do \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkinstalldirs) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(PROGRAMS) + +installdirs: + $(mkinstalldirs) $(DESTDIR)$(bindir) + +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -rm -f Makefile $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am + +distclean: distclean-am + +distclean-am: clean-am distclean-compile distclean-depend \ + distclean-generic distclean-libtool distclean-tags + +dvi: dvi-am + +dvi-am: + +info: info-am + +info-am: + +install-data-am: + +install-exec-am: install-binPROGRAMS + +install-info: install-info-am + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool + +uninstall-am: uninstall-binPROGRAMS uninstall-info-am + +.PHONY: GTAGS all all-am check check-am clean clean-binPROGRAMS \ + clean-generic clean-libtool distclean distclean-compile \ + distclean-depend distclean-generic distclean-libtool \ + distclean-tags distdir dvi dvi-am info info-am install \ + install-am install-binPROGRAMS install-data install-data-am \ + install-exec install-exec-am install-info install-info-am \ + install-man install-strip installcheck installcheck-am \ + installdirs maintainer-clean maintainer-clean-generic \ + mostlyclean mostlyclean-compile mostlyclean-generic \ + mostlyclean-libtool tags uninstall uninstall-am \ + uninstall-binPROGRAMS uninstall-info-am + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/cmd/lsbus.c b/cmd/lsbus.c deleted file mode 100644 index bd4676f..0000000 --- a/cmd/lsbus.c +++ /dev/null @@ -1,492 +0,0 @@ -/* - * lsbus.c - * - * Utility to list bus devices - * - * Copyright (C) 2003 International Business Machines, Inc. - * - * 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 - * Free Software Foundation version 2 of the License. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 675 Mass Ave, Cambridge, MA 02139, USA. - * - */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "libsysfs.h" - -/* Command Options */ -static int show_options = 0; /* bitmask of show options */ -static char *attr_to_show = NULL; /* print value for this attribute */ -static char *bus_device = NULL; /* print only this bus device */ - -#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_ALL 0xff - -static char cmd_options[] = "aA:dDhv"; - -/* - * binary_files - defines existing sysfs binary files that should be printed - * in hex. - */ -static char *binary_files[] = { - "config", - "data" -}; - -static int binfiles = 2; - -/** - * usage: prints utility usage. - */ -void usage(void) -{ - fprintf(stdout, "Usage: lsbus [ bus [device]]\n"); - fprintf(stdout, "\t-a\t\t\tShow attributes\n"); - fprintf(stdout, "\t-d\t\t\tShow only devices\n"); - fprintf(stdout, "\t-h\t\t\tShow usage\n"); - fprintf(stdout, "\t-v\t\t\tShow all attributes with values\n"); - fprintf(stdout, "\t-A \tShow attribute value\n"); - fprintf(stdout, "\t-D\t\t\tShow only drivers\n"); -} - -/** - * remove_end_newline: removes newline on the end of an attribute value - * @value: string to remove newline from - */ -void remove_end_newline(char *value) -{ - char *p = value + (strlen(value) - 1); - - if (p != NULL && *p == '\n') - *p = '\0'; -} - -/** - * print_device_children: prints out device subdirs. - * @sdir: print this directory's subdirectories/children. - */ -void print_device_children(struct sysfs_directory *sdir) -{ - if (sdir != NULL) { - fprintf(stdout, "\tChildren:\n"); - if (sdir->subdirs != NULL) { - char dirname[SYSFS_NAME_LEN]; - struct sysfs_directory *cur = sdir->subdirs; - - while (cur != NULL) { - if ((sysfs_get_name_from_path(cur->path, - dirname, SYSFS_NAME_LEN)) == 0) - fprintf(stdout, "\t\t%s\n", dirname); - else - fprintf(stdout, "\t\t%s\n", cur->path); - cur = cur->next; - } - } - if (sdir->links != NULL) { - struct sysfs_link *curl = sdir->links; - - while(curl != NULL) { - fprintf(stdout, "\t\t%s\n", curl->name); - curl = curl->next; - } - } - } -} - -/** - * isbinaryvalue: checks to see if attribute is binary or not. - * @attr: attribute to check. - * returns 1 if binary or 0 if not. - */ -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) - return 1; - - return 0; -} - -/** - * print_attribute_value: prints out single attribute value. - * @attr: attricute to print. - */ -void print_attribute_value(struct sysfs_attribute *attr) -{ - if (attr == NULL) - return; - - 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)) { - fprintf(stdout, "\n\t\t\t"); - } else if (!(i %8)) - fprintf(stdout, " "); - 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); - } else - fprintf(stdout, "\n"); - } else { - fprintf(stdout, "\t: store method only\n"); - } -} - -/** - * print_attribute: prints out a single attribute - * @attr: attribute to print. - */ -void print_attribute(struct sysfs_attribute *attr) -{ - 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) { - fprintf(stdout, "\t\t%s", attrname); - print_attribute_value(attr); - - } else if ((show_options & SHOW_ATTRIBUTES) || ((show_options - & SHOW_ATTRIBUTE_VALUE) && (strcmp(attrname, attr_to_show) - == 0))) { - fprintf (stdout, "\t\t%s", attrname); - if (show_options & SHOW_ATTRIBUTE_VALUE && attr->value != NULL - && (strcmp(attrname, attr_to_show)) == 0) { - print_attribute_value(attr); - } else { - fprintf(stdout, "\n"); - } - } -} - -/** - * print_device_attributes: prints out device attributes. - * @sdir: print this directory's attributes/files. - */ -void print_device_attributes(struct sysfs_directory *sdir) -{ - if (sdir != NULL && sdir->attributes != NULL) { - struct sysfs_attribute *cur = sdir->attributes; - - fprintf (stdout, "\tAttributes:\n"); - while (cur != NULL) { - print_attribute(cur); - cur = cur->next; - } - } -} - -/** - * print_device: prints out device information. - * @device: device to print. - */ -void print_device(struct sysfs_device *device) -{ - if (device != NULL && device->directory != NULL) { - fprintf (stdout, " %s %s\n", device->bus_id, device->name); - if (device->directory->subdirs != NULL - || device->directory->links != NULL) - print_device_children(device->directory); - if (device->directory->attributes != NULL && (show_options - & (SHOW_ATTRIBUTES | SHOW_ATTRIBUTE_VALUE - | SHOW_ALL_ATTRIB_VALUES))) - print_device_attributes(device->directory); - if (device->driver != NULL) - fprintf (stdout, "\tDriver: %s\n", - device->driver->name); - } -} - -/** - * print_driver_attributes: prints out driver attributes . - * @driver: print this driver's attributes. - */ -void print_driver_attributes(struct sysfs_driver *driver) -{ - if (driver != NULL && driver->directory != NULL) { - struct sysfs_directory *sdir = driver->directory; - - if (sdir->attributes != NULL) { - struct sysfs_attribute *cur = sdir->attributes; - - fprintf (stdout, "\t%s Attributes:\n", driver->name); - while (cur != NULL) { - print_attribute(cur); - cur = cur->next; - } - } - } -} - -/** - * print_driver_devices: prints out devices under driver. - * @driver: print devices bound to this driver. - */ -void print_driver_devices(struct sysfs_driver *driver) -{ - if (driver != NULL && driver->directory != NULL) { - struct sysfs_directory *sdir = driver->directory; - - if (sdir->links != NULL) { - struct sysfs_link *cur = sdir->links; - - fprintf (stdout, "\tDevices:\n"); - while (cur != NULL) { - fprintf(stdout, "\t\t%s\n", cur->name); - cur = cur->next; - } - } - } -} - -/** - * print_driver: prints out driver information. - * @driver: driver to print. - */ -void print_driver(struct sysfs_driver *driver) -{ - struct sysfs_directory *sdir = NULL; - - if (driver != NULL) { - fprintf (stdout, " %s\n", driver->name); - sdir = driver->directory; - if (sdir != NULL) { - if (sdir->links != NULL) - print_driver_devices(driver); - if(sdir->attributes != NULL && (show_options - & (SHOW_ATTRIBUTES | SHOW_ATTRIBUTE_VALUE - | SHOW_ALL_ATTRIB_VALUES))) - print_driver_attributes(driver); - } - } -} - -/** - * print_default_bus: prints out everything on a bus. - * @busname: bus to print. - * returns 0 with success or 1 with error. - */ -int print_sysfs_bus(char *busname) -{ - struct sysfs_bus *bus = NULL; - struct sysfs_device *curdev = NULL; - struct sysfs_driver *curdrv = NULL; - - if (busname == NULL) { - errno = EINVAL; - return 1; - } - bus = sysfs_open_bus(busname); - if (bus == NULL) { - fprintf(stderr, "Error opening bus %s\n", busname); - return 1; - } - - fprintf(stdout, "Bus: %s\n", busname); - if (bus->devices != NULL && (show_options & SHOW_DEVICES)) { - curdev = bus->devices; - if (bus_device == NULL) - fprintf(stdout, "Devices:\n"); - while (curdev != NULL) { - if (bus_device == NULL || (strcmp(bus_device, - curdev->bus_id) == 0)) - print_device(curdev); - curdev = curdev->next; - } - } - if (bus->drivers != NULL && (show_options & SHOW_DRIVERS)) { - curdrv = bus->drivers; - fprintf(stdout, "Drivers:\n"); - while (curdrv != NULL) { - print_driver(curdrv); - curdrv = curdrv->next; - } - } - sysfs_close_bus(bus); - return 0; -} - -/** - * print_sysfs_buses: prints out supported buses. - * @buses: list of supported system buses. - * returns 0 with success or 1 with error. - */ -int print_sysfs_buses(void) -{ - struct sysfs_directory *busdir = NULL, *current = NULL; - char busname[SYSFS_NAME_LEN]; - char buspath[SYSFS_PATH_MAX]; - int ret = 0; - - /* get sysfs mount point */ - if ((sysfs_get_mnt_path(buspath, SYSFS_PATH_MAX) != 0)) { - perror("sysfs_get_mnt_path"); - fprintf(stderr, "Error getting sysfs mount path - exiting\n"); - exit(1); - } - strcat(buspath, SYSFS_BUS_DIR); - busdir = sysfs_open_directory(buspath); - if (busdir == NULL) { - fprintf(stderr, "Error opening sysfs bus directory at %s\n", - buspath); - return 1; - } - if ((sysfs_read_directory(busdir)) != 0) { - fprintf(stderr, "Error reading sysfs bus directory at %s\n", - buspath); - sysfs_close_directory(busdir); - return 1; - } - - fprintf(stdout, "Supported sysfs buses:\n"); - current = busdir->subdirs; - while (current != NULL) { - if ((sysfs_get_name_from_path(current->path, busname, - SYSFS_NAME_LEN)) != 0) { - sysfs_close_directory(busdir); - return 1; - } - fprintf(stdout, "\t%s\n", busname); - current = current->next; - } - sysfs_close_directory(busdir); - return ret; -} - -/* MAIN */ -int main(int argc, char *argv[]) -{ - char *bus_to_print = NULL; - int retval = 0; - int opt; - extern int optind; - extern char *optarg; - - while((opt = getopt(argc, argv, cmd_options)) != EOF) { - switch(opt) { - case 'a': - show_options |= SHOW_ATTRIBUTES; - break; - case 'A': - if ((strlen(optarg) + 1) > SYSFS_NAME_LEN) { - fprintf(stderr, - "Attribute name %s is too long\n", - optarg); - exit(1); - } - attr_to_show = optarg; - show_options |= SHOW_ATTRIBUTE_VALUE; - break; - case 'd': - show_options |= SHOW_DEVICES; - break; - case 'D': - show_options |= SHOW_DRIVERS; - break; - case 'h': - usage(); - exit(0); - break; - case 'v': - show_options |= SHOW_ALL_ATTRIB_VALUES; - break; - default: - usage(); - exit(1); - } - } - argc -= optind; - argv += optind; - - switch(argc) { - case 0: - break; - case 1: - /* get bus to view */ - if ((strlen(*argv)+1) < SYSFS_NAME_LEN) - bus_to_print = *argv; - else - fprintf(stderr, - "Invalid argument: busname too long\n"); - break; - case 2: - /* get bus and device to view */ - if ((strlen(argv[0])) < SYSFS_NAME_LEN && (strlen(argv[1])) - < SYSFS_NAME_LEN) { - bus_to_print = argv[0]; - bus_device = argv[1]; - show_options |= SHOW_DEVICES; - } else { - fprintf(stderr, - "Invalid argument: bus or device name too long\n"); - exit(1); - } - break; - default: - usage(); - exit(1); - } - - if (bus_to_print == NULL && (show_options & (SHOW_ATTRIBUTES - | SHOW_ATTRIBUTE_VALUE | SHOW_DEVICES | SHOW_DRIVERS - | SHOW_ALL_ATTRIB_VALUES))) { - fprintf(stderr, "Please specify a bus\n"); - usage(); - exit(1); - } - /* default is to print devices */ - if (!(show_options & (SHOW_DEVICES | SHOW_DRIVERS))) - show_options |= SHOW_DEVICES; - - if (bus_to_print != NULL) - retval = print_sysfs_bus(bus_to_print); - else - retval = print_sysfs_buses(); - - exit(retval); -} diff --git a/cmd/names.c b/cmd/names.c new file mode 100644 index 0000000..c63116f --- /dev/null +++ b/cmd/names.c @@ -0,0 +1,358 @@ +/* + * $Id: names.c,v 1.2 2005/04/06 20:57:12 stekloff Exp $ + * + * The PCI Library -- ID to Name Translation + * + * Copyright (c) 1997--2002 Martin Mares + * + * Can be freely distributed and used under the terms of the GNU GPL. + */ + +#include +#include +#include +#include +#include +#include +#include + +#include "names.h" + +struct nl_entry { + struct nl_entry *next; + unsigned short id1, id2, id3, id4; + int cat; + unsigned char *name; +}; + +#define NL_VENDOR 0 +#define NL_DEVICE 1 +#define NL_SUBSYSTEM 2 +#define NL_CLASS 3 +#define NL_SUBCLASS 4 +#define NL_PROGIF 5 + +#define HASH_SIZE 1024 + +static inline unsigned int nl_calc_hash(int cat, int id1, int id2, int id3, int id4) +{ + unsigned int h; + + h = id1 ^ id2 ^ id3 ^ id4 ^ (cat << 5); + h += (h >> 6); + return h & (HASH_SIZE-1); +} + +static struct nl_entry *nl_lookup(struct pci_access *a, int num, int cat, int id1, int id2, int id3, int id4) +{ + unsigned int h; + struct nl_entry *n; + + if (num) + return NULL; + h = nl_calc_hash(cat, id1, id2, id3, id4); + n = a->nl_hash[h]; + while (n && (n->id1 != id1 || n->id2 != id2 || n->id3 != id3 || n->id4 != id4 || n->cat != cat)) + n = n->next; + + return n; +} + +static int nl_add(struct pci_access *a, int cat, int id1, int id2, int id3, int id4, unsigned char *text) +{ + unsigned int h = nl_calc_hash(cat, id1, id2, id3, id4); + struct nl_entry *n = a->nl_hash[h]; + + while (n && (n->id1 != id1 || n->id2 != id2 || n->id3 != id3 || n->id4 != id4 || n->cat != cat)) + n = n->next; + if (n) + return 1; + n = malloc(sizeof(struct nl_entry)); + bzero(n, sizeof(struct nl_entry)); + n->id1 = id1; + n->id2 = id2; + n->id3 = id3; + n->id4 = id4; + n->cat = cat; + n->name = text; + n->next = a->nl_hash[h]; + a->nl_hash[h] = n; + return 0; +} + +static void +err_name_list(struct pci_access *a, unsigned char *msg) +{ + fprintf(stderr, "%s: %s: %s\n", a->pci_id_file_name, msg, strerror(errno)); +} + +static void +parse_name_list(struct pci_access *a) +{ + unsigned char *p = a->nl_list; + unsigned char *q, *r; + int lino = 0; + unsigned int id1=0, id2=0, id3=0, id4=0; + int cat = -1; + + while (*p) + { + lino++; + q = p; + while (*p && *p != '\n') + p++; + if (*p == '\n') + *p++ = 0; + if (!*q || *q == '#') + continue; + r = p; + while (r > q && r[-1] == ' ') + *--r = 0; + r = q; + while (*q == '\t') + q++; + if (q == r) + { + if (q[0] == 'C' && q[1] == ' ') + { + if (strlen(q+2) < 3 || + q[4] != ' ' || + sscanf(q+2, "%x", &id1) != 1) + goto parserr; + cat = NL_CLASS; + } + else + { + if (strlen(q) < 5 || + q[4] != ' ' || + sscanf(q, "%x", &id1) != 1) + goto parserr; + cat = NL_VENDOR; + } + id2 = id3 = id4 = 0; + q += 4; + } + else if (q == r+1) + switch (cat) + { + case NL_VENDOR: + case NL_DEVICE: + case NL_SUBSYSTEM: + if (sscanf(q, "%x", &id2) != 1 || q[4] != ' ') + goto parserr; + q += 5; + cat = NL_DEVICE; + id3 = id4 = 0; + break; + case NL_CLASS: + case NL_SUBCLASS: + case NL_PROGIF: + if (sscanf(q, "%x", &id2) != 1 || q[2] != ' ') + goto parserr; + q += 3; + cat = NL_SUBCLASS; + id3 = id4 = 0; + break; + default: + goto parserr; + } + else if (q == r+2) + switch (cat) + { + case NL_DEVICE: + case NL_SUBSYSTEM: + if (sscanf(q, "%x%x", &id3, &id4) != 2 || q[9] != ' ') + goto parserr; + q += 10; + cat = NL_SUBSYSTEM; + break; + case NL_CLASS: + case NL_SUBCLASS: + case NL_PROGIF: + if (sscanf(q, "%x", &id3) != 1 || q[2] != ' ') + goto parserr; + q += 3; + cat = NL_PROGIF; + id4 = 0; + break; + default: + goto parserr; + } + else + goto parserr; + while (*q == ' ') + q++; + if (!*q) + goto parserr; + if (nl_add(a, cat, id1, id2, id3, id4, q)) + fprintf(stderr, "%s, line %d: duplicate entry", a->pci_id_file_name, lino); + } + return; + +parserr: + fprintf(stderr, "%s, line %d: parse error", a->pci_id_file_name, lino); +} + +static void +load_name_list(struct pci_access *a) +{ + int fd; + struct stat st; + + fd = open(a->pci_id_file_name, O_RDONLY); + if (fd < 0) + { + a->numeric_ids = 1; + return; + } + if (fstat(fd, &st) < 0) + err_name_list(a, "stat"); + a->nl_list = malloc(st.st_size + 1); + if (read(fd, a->nl_list, st.st_size) != st.st_size) + err_name_list(a, "read"); + a->nl_list[st.st_size] = 0; + a->nl_hash = malloc(sizeof(struct nl_entry *) * HASH_SIZE); + bzero(a->nl_hash, sizeof(struct nl_entry *) * HASH_SIZE); + parse_name_list(a); + close(fd); +} + +void +pci_free_name_list(struct pci_access *a) +{ + int i = 0; + struct nl_entry *n = NULL, *temp = NULL; + + free(a->nl_list); + a->nl_list = NULL; + if (a->nl_hash != NULL) { + for (i = 0; i < HASH_SIZE; i++) { + if (a->nl_hash[i] != NULL) { + n = a->nl_hash[i]; + do { + temp = n->next; + free (n); + n = temp; + } while (temp != NULL); + } + } + } + free(a->nl_hash); + a->nl_hash = NULL; +} + +unsigned char * +pci_lookup_name(struct pci_access *a, unsigned char *buf, int size, int flags, unsigned int arg1, unsigned int arg2, unsigned int arg3, unsigned int arg4) +{ + int num = a->numeric_ids; + int res; + struct nl_entry *n; + + if (flags & PCI_LOOKUP_NUMERIC) + { + flags &= PCI_LOOKUP_NUMERIC; + num = 1; + } + if (!a->nl_hash && !num) + { + load_name_list(a); + num = a->numeric_ids; + } + switch (flags) + { + case PCI_LOOKUP_VENDOR: + if ((n = nl_lookup(a, num, NL_VENDOR, arg1, 0, 0, 0))) + return n->name; + else + res = snprintf(buf, size, "%04x", arg1); + break; + case PCI_LOOKUP_DEVICE: + if ((n = nl_lookup(a, num, NL_DEVICE, arg1, arg2, 0, 0))) + return n->name; + else + res = snprintf(buf, size, "%04x", arg2); + break; + case PCI_LOOKUP_VENDOR | PCI_LOOKUP_DEVICE: + if (!num) + { + struct nl_entry *e, *e2; + e = nl_lookup(a, 0, NL_VENDOR, arg1, 0, 0, 0); + e2 = nl_lookup(a, 0, NL_DEVICE, arg1, arg2, 0, 0); + if (!e) + res = snprintf(buf, size, "Unknown device %04x:%04x", arg1, arg2); + else if (!e2) + res = snprintf(buf, size, "%s: Unknown device %04x", e->name, arg2); + else + res = snprintf(buf, size, "%s %s", e->name, e2->name); + } + else + res = snprintf(buf, size, "%04x:%04x", arg1, arg2); + break; + case PCI_LOOKUP_VENDOR | PCI_LOOKUP_SUBSYSTEM: + if ((n = nl_lookup(a, num, NL_VENDOR, arg3, 0, 0, 0))) + return n->name; + else + res = snprintf(buf, size, "%04x", arg2); + break; + case PCI_LOOKUP_DEVICE | PCI_LOOKUP_SUBSYSTEM: + if ((n = nl_lookup(a, num, NL_SUBSYSTEM, arg1, arg2, arg3, arg4))) + return n->name; + else if (arg1 == arg3 && arg2 == arg4 && (n = nl_lookup(a, num, NL_DEVICE, arg1, arg2, 0, 0))) + return n->name; + else + res = snprintf(buf, size, "%04x", arg4); + break; + case PCI_LOOKUP_VENDOR | PCI_LOOKUP_DEVICE | PCI_LOOKUP_SUBSYSTEM: + if (!num) + { + struct nl_entry *e, *e2; + e = nl_lookup(a, 0, NL_VENDOR, arg3, 0, 0, 0); + e2 = nl_lookup(a, 0, NL_SUBSYSTEM, arg1, arg2, arg3, arg4); + if (!e2 && arg1 == arg3 && arg2 == arg4) + /* Cheat for vendors blindly setting subsystem ID same as device ID */ + e2 = nl_lookup(a, 0, NL_DEVICE, arg1, arg2, 0, 0); + if (!e) + res = snprintf(buf, size, "Unknown device %04x:%04x", arg3, arg4); + else if (!e2) + res = snprintf(buf, size, "%s: Unknown device %04x", e->name, arg4); + else + res = snprintf(buf, size, "%s %s", e->name, e2->name); + } + else + res = snprintf(buf, size, "%04x:%04x", arg3, arg4); + break; + case PCI_LOOKUP_CLASS: + if ((n = nl_lookup(a, num, NL_SUBCLASS, arg1 >> 8, arg1 & 0xff, 0, 0))) + return n->name; + else if ((n = nl_lookup(a, num, NL_CLASS, arg1, 0, 0, 0))) + res = snprintf(buf, size, "%s [%04x]", n->name, arg1); + else + res = snprintf(buf, size, "Class %04x", arg1); + break; + case PCI_LOOKUP_PROGIF: + if ((n = nl_lookup(a, num, NL_PROGIF, arg1 >> 8, arg1 & 0xff, arg2, 0))) + return n->name; + if (arg1 == 0x0101) + { + /* IDE controllers have complex prog-if semantics */ + if (arg2 & 0x70) + return NULL; + res = snprintf(buf, size, "%s%s%s%s%s", + (arg2 & 0x80) ? "Master " : "", + (arg2 & 0x08) ? "SecP " : "", + (arg2 & 0x04) ? "SecO " : "", + (arg2 & 0x02) ? "PriP " : "", + (arg2 & 0x01) ? "PriO " : ""); + if (res) + buf[--res] = 0; + break; + } + return NULL; + default: + return ""; + } + if (res == size) + return ""; + else + return buf; +} diff --git a/cmd/names.h b/cmd/names.h new file mode 100644 index 0000000..da20938 --- /dev/null +++ b/cmd/names.h @@ -0,0 +1,36 @@ +/* + * $Id: names.h,v 1.2 2005/04/06 20:57:12 stekloff Exp $ + * + * The PCI Library + * + * Copyright (c) 1997--2002 Martin Mares + * + * Can be freely distributed and used under the terms of the GNU GPL. + */ + +#ifndef _NAMES_H_ +#define _NAMES_H_ + +#define PCI_LOOKUP_VENDOR 1 +#define PCI_LOOKUP_DEVICE 2 +#define PCI_LOOKUP_CLASS 4 +#define PCI_LOOKUP_SUBSYSTEM 8 +#define PCI_LOOKUP_PROGIF 16 +#define PCI_LOOKUP_NUMERIC 0x10000 + +#define PCI_VENDOR_ID 0x00 +#define PCI_DEVICE_ID 0x02 + +struct pci_access { + unsigned int numeric_ids; + unsigned char *pci_id_file_name; + unsigned char *nl_list; + struct nl_entry **nl_hash; +}; + +extern unsigned char *pci_lookup_name(struct pci_access *a, unsigned char *buf, + int size, int flags, unsigned int arg1, unsigned int arg2, + unsigned int arg3, unsigned int arg4); +extern void pci_free_name_list(struct pci_access *a); + +#endif /* _NAMES_H_ */ 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 #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 [ [device]]\n"); fprintf(stdout, "\t-a\t\t\tShow attributes\n"); @@ -69,11 +85,14 @@ void usage(void) fprintf(stdout, "\t-c \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 \tShow a specific root device tree\n"); fprintf(stdout, "\t-v\t\t\tShow all attributes with values\n"); fprintf(stdout, "\t-A \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, "\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,61 +432,96 @@ 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); return 0; } +/** + * 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); } -- cgit v1.2.1