summaryrefslogtreecommitdiff
path: root/cmd
diff options
context:
space:
mode:
authorstekloff <stekloff>2005-04-06 20:57:01 +0000
committerstekloff <stekloff>2005-04-06 20:57:01 +0000
commitdd8c511d725f816bc64592028ff178616fcde607 (patch)
tree55250e02ac67ceeb3c2bac3b1e29a78c22be1ac2 /cmd
parent855a337e54321d9aa2b97c38ffa4787d3105257c (diff)
downloadsysfsutils-dd8c511d725f816bc64592028ff178616fcde607.tar.gz
Merging tag sysfsutils-1_3_0 with main trunk.HEADoriginmaster
Diffstat (limited to 'cmd')
-rw-r--r--cmd/Makefile20
-rw-r--r--cmd/Makefile.am6
-rw-r--r--cmd/Makefile.in350
-rw-r--r--cmd/lsbus.c492
-rw-r--r--cmd/names.c358
-rw-r--r--cmd/names.h36
-rw-r--r--cmd/systool.c652
7 files changed, 1118 insertions, 796 deletions
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 <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <string.h>
-#include <mntent.h>
-#include <dirent.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <errno.h>
-#include <ctype.h>
-
-#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 [<options> 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 <attribute_name>\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 <mj@ucw.cz>
+ *
+ * Can be freely distributed and used under the terms of the GNU GPL.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <sys/stat.h>
+#include <errno.h>
+
+#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 "<pci_lookup_name: invalid request>";
+ }
+ if (res == size)
+ return "<too-large>";
+ 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 <mj@ucw.cz>
+ *
+ * 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 <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);
}