OpenIPMI-2.0.29/0000755000175000017500000000000013670707046010177 500000000000000OpenIPMI-2.0.29/OpenIPMI.pc.in0000644000175000017500000000036012002623311012403 00000000000000prefix=@prefix@ exec_prefix=@prefix@ libdir=@libdir@ includedir=@includedir@ Name: OpenIPMI Description: Library to make using IPMI easier Version: @VERSION@ Requires: Libs: -L${libdir} -lOpenIPMIutils -lOpenIPMI Cflags: -I${includedir} OpenIPMI-2.0.29/ui/0000755000175000017500000000000013670707037010614 500000000000000OpenIPMI-2.0.29/ui/Makefile.in0000644000175000017500000006274113670706700012607 00000000000000# Makefile.in generated by automake 1.15.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2017 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@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : build_triplet = @build@ host_triplet = @host@ target_triplet = @target@ bin_PROGRAMS = ipmi_ui$(EXEEXT) subdir = ui ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_compare_version.m4 \ $(top_srcdir)/m4/ax_config_feature.m4 \ $(top_srcdir)/m4/ax_have_epoll.m4 \ $(top_srcdir)/m4/ax_pkg_swig.m4 \ $(top_srcdir)/m4/ax_prog_python_version.m4 \ $(top_srcdir)/m4/ax_python_devel.m4 \ $(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \ $(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \ $(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/acinclude.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(noinst_HEADERS) \ $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ *) f=$$p;; \ esac; am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`; am__install_max = 40 am__nobase_strip_setup = \ srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'` am__nobase_strip = \ for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||" am__nobase_list = $(am__nobase_strip_setup); \ for p in $$list; do echo "$$p $$p"; done | \ sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \ $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \ if (++n[$$2] == $(am__install_max)) \ { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \ END { for (dir in files) print dir, files[dir] }' am__base_list = \ sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \ sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g' am__uninstall_files_from_dir = { \ test -z "$$files" \ || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ $(am__cd) "$$dir" && rm -f $$files; }; \ } am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)" LTLIBRARIES = $(lib_LTLIBRARIES) libOpenIPMIui_la_DEPENDENCIES = am_libOpenIPMIui_la_OBJECTS = ui.lo ui_os.lo ui_keypad.lo \ ui_command.lo libOpenIPMIui_la_OBJECTS = $(am_libOpenIPMIui_la_OBJECTS) AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = libOpenIPMIui_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ $(AM_CFLAGS) $(CFLAGS) $(libOpenIPMIui_la_LDFLAGS) $(LDFLAGS) \ -o $@ PROGRAMS = $(bin_PROGRAMS) am_ipmi_ui_OBJECTS = basic_ui.$(OBJEXT) ipmi_ui_OBJECTS = $(am_ipmi_ui_OBJECTS) am__DEPENDENCIES_1 = ipmi_ui_DEPENDENCIES = libOpenIPMIui.la \ $(top_builddir)/utils/libOpenIPMIutils.la \ $(top_builddir)/lib/libOpenIPMI.la \ $(top_builddir)/unix/libOpenIPMIposix.la $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \ $(am__DEPENDENCIES_1) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__depfiles_maybe = depfiles am__mv = mv -f COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libOpenIPMIui_la_SOURCES) $(ipmi_ui_SOURCES) DIST_SOURCES = $(libOpenIPMIui_la_SOURCES) $(ipmi_ui_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac HEADERS = $(noinst_HEADERS) am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AR = @AR@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BIBTEX = @BIBTEX@ BUILD_CC = @BUILD_CC@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ DIA = @DIA@ DIA_FILTER_NAME = @DIA_FILTER_NAME@ DLLTOOL = @DLLTOOL@ DSYMUTIL = @DSYMUTIL@ DUMPBIN = @DUMPBIN@ DVIPDF = @DVIPDF@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ FGREP = @FGREP@ GDBM_LIB = @GDBM_LIB@ GLIB_CFLAGS = @GLIB_CFLAGS@ GLIB_DIR = @GLIB_DIR@ GLIB_LIB = @GLIB_LIB@ GLIB_LIBS = @GLIB_LIBS@ GLIB_PKGCONF = @GLIB_PKGCONF@ GLIB_SO = @GLIB_SO@ GLIB_TARGET = @GLIB_TARGET@ GLIB_VERSION = @GLIB_VERSION@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ LATEX = @LATEX@ LD = @LD@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LIBTOOL = @LIBTOOL@ LIPO = @LIPO@ LN_S = @LN_S@ LTLIBOBJS = @LTLIBOBJS@ LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@ MAKEINFO = @MAKEINFO@ MANIFEST_TOOL = @MANIFEST_TOOL@ MARVELL_BMC_DIR = @MARVELL_BMC_DIR@ MKDIR_P = @MKDIR_P@ NM = @NM@ NMEDIT = @NMEDIT@ OBJDUMP = @OBJDUMP@ OBJEXT = @OBJEXT@ OPENIPMI_SWIG_LIBS = @OPENIPMI_SWIG_LIBS@ OPENIPMI_SWIG_SO = @OPENIPMI_SWIG_SO@ OPENIPMI_VERSION_EXTRA = @OPENIPMI_VERSION_EXTRA@ OPENIPMI_VERSION_MAJOR = @OPENIPMI_VERSION_MAJOR@ OPENIPMI_VERSION_MINOR = @OPENIPMI_VERSION_MINOR@ OPENIPMI_VERSION_RELEASE = @OPENIPMI_VERSION_RELEASE@ OPENSSLINCS = @OPENSSLINCS@ OPENSSLLIBS = @OPENSSLLIBS@ OTOOL = @OTOOL@ OTOOL64 = @OTOOL64@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ PERL_CFLAGS = @PERL_CFLAGS@ PERL_DIR = @PERL_DIR@ PERL_HAS_POSIX_THREADS = @PERL_HAS_POSIX_THREADS@ PERL_INSTALL_DIR = @PERL_INSTALL_DIR@ PERL_POSIX_LIB = @PERL_POSIX_LIB@ PERL_POSIX_SO = @PERL_POSIX_SO@ POPTLIBS = @POPTLIBS@ PYTHON = @PYTHON@ PYTHON_CPPFLAGS = @PYTHON_CPPFLAGS@ PYTHON_DIR = @PYTHON_DIR@ PYTHON_EXTRA_LDFLAGS = @PYTHON_EXTRA_LDFLAGS@ PYTHON_EXTRA_LIBS = @PYTHON_EXTRA_LIBS@ PYTHON_GUI_DIR = @PYTHON_GUI_DIR@ PYTHON_HAS_POSIX_THREADS = @PYTHON_HAS_POSIX_THREADS@ PYTHON_INSTALL_DIR = @PYTHON_INSTALL_DIR@ PYTHON_INSTALL_LIB_DIR = @PYTHON_INSTALL_LIB_DIR@ PYTHON_LIBS = @PYTHON_LIBS@ PYTHON_POSIX_LIB = @PYTHON_POSIX_LIB@ PYTHON_POSIX_SO = @PYTHON_POSIX_SO@ PYTHON_SITE_PKG = @PYTHON_SITE_PKG@ PYTHON_SWIG_FLAGS = @PYTHON_SWIG_FLAGS@ PYTHON_VERSION = @PYTHON_VERSION@ RANLIB = @RANLIB@ RT_LIB = @RT_LIB@ SED = @SED@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ SNMPLIBS = @SNMPLIBS@ SOCKETLIB = @SOCKETLIB@ STRIP = @STRIP@ SWIG = @SWIG@ SWIG_DIR = @SWIG_DIR@ SWIG_LIB = @SWIG_LIB@ TCL_CFLAGS = @TCL_CFLAGS@ TCL_DIR = @TCL_DIR@ TCL_LIB = @TCL_LIB@ TCL_LIBS = @TCL_LIBS@ TCL_PKGCONF = @TCL_PKGCONF@ TCL_SO = @TCL_SO@ TCL_TARGET = @TCL_TARGET@ TERM_LIBS = @TERM_LIBS@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_AR = @ac_ct_AR@ ac_ct_CC = @ac_ct_CC@ ac_ct_DUMPBIN = @ac_ct_DUMPBIN@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build = @build@ build_alias = @build_alias@ build_cpu = @build_cpu@ build_os = @build_os@ build_vendor = @build_vendor@ builddir = @builddir@ datadir = @datadir@ datarootdir = @datarootdir@ diaprog = @diaprog@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host = @host@ host_alias = @host_alias@ host_cpu = @host_cpu@ host_os = @host_os@ host_vendor = @host_vendor@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ perlprog = @perlprog@ pkgprog = @pkgprog@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ runstatedir = @runstatedir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target = @target@ target_alias = @target_alias@ target_cpu = @target_cpu@ target_os = @target_os@ target_vendor = @target_vendor@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ LIB_VERSION = 1.0.1 LD_VERSION = 1:1:0 AM_CFLAGS = -Wall -Wsign-compare -I$(top_builddir)/include \ -I$(top_srcdir)/include -DIPMI_CHECK_LOCKS noinst_HEADERS = ui_keypad.h ui_command.h lib_LTLIBRARIES = libOpenIPMIui.la libOpenIPMIui_la_SOURCES = ui.c ui_os.c ui_keypad.c ui_command.c libOpenIPMIui_la_LIBADD = libOpenIPMIui_la_LDFLAGS = -version-info $(LD_VERSION) ipmi_ui_SOURCES = basic_ui.c ipmi_ui_LDADD = libOpenIPMIui.la $(top_builddir)/utils/libOpenIPMIutils.la $(top_builddir)/lib/libOpenIPMI.la $(top_builddir)/unix/libOpenIPMIposix.la $(TERM_LIBS) $(SNMPLIBS) $(OPENSSLLIBS) $(GDBM_LIB) all: all-am .SUFFIXES: .SUFFIXES: .c .lo .o .obj $(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu ui/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu ui/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-libLTLIBRARIES: $(lib_LTLIBRARIES) @$(NORMAL_INSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ list2=; for p in $$list; do \ if test -f $$p; then \ list2="$$list2 $$p"; \ else :; fi; \ done; \ test -z "$$list2" || { \ echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \ $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \ } uninstall-libLTLIBRARIES: @$(NORMAL_UNINSTALL) @list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \ for p in $$list; do \ $(am__strip_dir) \ echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \ $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \ done clean-libLTLIBRARIES: -test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES) @list='$(lib_LTLIBRARIES)'; \ locs=`for p in $$list; do echo $$p; done | \ sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ sort -u`; \ test -z "$$locs" || { \ echo rm -f $${locs}; \ rm -f $${locs}; \ } libOpenIPMIui.la: $(libOpenIPMIui_la_OBJECTS) $(libOpenIPMIui_la_DEPENDENCIES) $(EXTRA_libOpenIPMIui_la_DEPENDENCIES) $(AM_V_CCLD)$(libOpenIPMIui_la_LINK) -rpath $(libdir) $(libOpenIPMIui_la_OBJECTS) $(libOpenIPMIui_la_LIBADD) $(LIBS) install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p \ || test -f $$p1 \ ; then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' \ -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' \ `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files clean-binPROGRAMS: @list='$(bin_PROGRAMS)'; test -n "$$list" || exit 0; \ echo " rm -f" $$list; \ rm -f $$list || exit $$?; \ test -n "$(EXEEXT)" || exit 0; \ list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \ echo " rm -f" $$list; \ rm -f $$list ipmi_ui$(EXEEXT): $(ipmi_ui_OBJECTS) $(ipmi_ui_DEPENDENCIES) $(EXTRA_ipmi_ui_DEPENDENCIES) @rm -f ipmi_ui$(EXEEXT) $(AM_V_CCLD)$(LINK) $(ipmi_ui_OBJECTS) $(ipmi_ui_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/basic_ui.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ui.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ui_command.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ui_keypad.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ui_os.Plo@am__quote@ .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` .c.lo: @am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Plo @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $< mostlyclean-libtool: -rm -f *.lo clean-libtool: -rm -rf .libs _libs ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$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 $(LTLIBRARIES) $(PROGRAMS) $(HEADERS) install-binPROGRAMS: install-libLTLIBRARIES installdirs: for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(bindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done 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: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_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-libLTLIBRARIES \ clean-libtool mostlyclean-am distclean: distclean-am -rm -rf ./$(DEPDIR) -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-binPROGRAMS install-libLTLIBRARIES install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -rf ./$(DEPDIR) -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic \ mostlyclean-libtool pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binPROGRAMS uninstall-libLTLIBRARIES .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \ clean-binPROGRAMS clean-generic clean-libLTLIBRARIES \ clean-libtool cscopelist-am ctags ctags-am distclean \ distclean-compile distclean-generic distclean-libtool \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-binPROGRAMS install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-libLTLIBRARIES install-man install-pdf \ install-pdf-am install-ps install-ps-am install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \ tags tags-am uninstall uninstall-am uninstall-binPROGRAMS \ uninstall-libLTLIBRARIES .PRECIOUS: Makefile # 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: OpenIPMI-2.0.29/ui/ui_os.c0000644000175000017500000003161413137654414012021 00000000000000/* * ui_os.c * * MontaVista IPMI code, a simple curses UI, the OS interface portion * * Author: MontaVista Software, Inc. * Corey Minyard * source@mvista.com * * Copyright 2002,2003 MontaVista Software Inc. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License * as published by the Free Software Foundation; either version 2 of * the License, or (at your option) any later version. * * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * You should have received a copy of the GNU Lesser 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 struct selector_s *ui_sel; #ifdef IPMI_CHECK_LOCKS static void check_no_locks(os_handler_t *handler); #define CHECK_NO_LOCKS(handler) check_no_locks(handler) #else #define CHECK_NO_LOCKS(handler) do {} while(0) #endif struct os_hnd_fd_id_s { int fd; void *cb_data; os_data_ready_t data_ready; os_handler_t *handler; os_fd_data_freed_t freed; }; static void fd_handler(int fd, void *data) { os_hnd_fd_id_t *fd_data = (os_hnd_fd_id_t *) data; CHECK_NO_LOCKS(fd_data->handler); fd_data->data_ready(fd, fd_data->cb_data, fd_data); CHECK_NO_LOCKS(fd_data->handler); } static void free_fd_data(int fd, void *data) { os_hnd_fd_id_t *fd_data = data; if (fd_data->freed) fd_data->freed(fd, fd_data->cb_data); free(data); } static int add_fd(os_handler_t *handler, int fd, os_data_ready_t data_ready, void *cb_data, os_fd_data_freed_t freed, os_hnd_fd_id_t **id) { os_hnd_fd_id_t *fd_data; int rv; fd_data = malloc(sizeof(*fd_data)); if (!fd_data) return ENOMEM; fd_data->fd = fd; fd_data->cb_data = cb_data; fd_data->data_ready = data_ready; fd_data->handler = handler; fd_data->freed = freed; rv = sel_set_fd_handlers(ui_sel, fd, fd_data, fd_handler, NULL, NULL, free_fd_data); if (rv) { free(fd_data); return rv; } sel_set_fd_read_handler(ui_sel, fd, SEL_FD_HANDLER_ENABLED); sel_set_fd_write_handler(ui_sel, fd, SEL_FD_HANDLER_DISABLED); sel_set_fd_except_handler(ui_sel, fd, SEL_FD_HANDLER_DISABLED); *id = fd_data; return 0; } static int remove_fd(os_handler_t *handler, os_hnd_fd_id_t *fd_data) { sel_set_fd_read_handler(ui_sel, fd_data->fd, SEL_FD_HANDLER_DISABLED); sel_clear_fd_handlers(ui_sel, fd_data->fd); /* fd_data gets freed in the free_fd_data callback registered at set time. */ return 0; } struct os_hnd_timer_id_s { void *cb_data; os_timed_out_t timed_out; sel_timer_t *timer; int running; os_handler_t *handler; }; static void timer_handler(struct selector_s *sel, sel_timer_t *timer, void *data) { os_hnd_timer_id_t *timer_data = (os_hnd_timer_id_t *) data; /* Make a copy of this, because the handler may delete the timer data. */ os_handler_t *os_handler = timer_data->handler; void *cb_data; os_timed_out_t timed_out; CHECK_NO_LOCKS(os_handler); timed_out = timer_data->timed_out; cb_data = timer_data->cb_data; timer_data->running = 0; timed_out(cb_data, timer_data); CHECK_NO_LOCKS(os_handler); } static int start_timer(os_handler_t *handler, os_hnd_timer_id_t *id, struct timeval *timeout, os_timed_out_t timed_out, void *cb_data) { struct timeval now; if (id->running) return EBUSY; id->running = 1; id->cb_data = cb_data; id->timed_out = timed_out; handler->get_monotonic_time(handler, &now); now.tv_sec += timeout->tv_sec; now.tv_usec += timeout->tv_usec; while (now.tv_usec >= 1000000) { now.tv_usec -= 1000000; now.tv_sec += 1; } return sel_start_timer(id->timer, &now); } static int stop_timer(os_handler_t *handler, os_hnd_timer_id_t *timer_data) { return sel_stop_timer(timer_data->timer); } static int alloc_timer(os_handler_t *handler, os_hnd_timer_id_t **id) { os_hnd_timer_id_t *timer_data; int rv; timer_data = malloc(sizeof(*timer_data)); if (!timer_data) return ENOMEM; timer_data->running = 0; timer_data->timed_out = NULL; timer_data->handler = handler; rv = sel_alloc_timer(ui_sel, timer_handler, timer_data, &(timer_data->timer)); if (rv) { free(timer_data); return rv; } *id = timer_data; return 0; } static int free_timer(os_handler_t *handler, os_hnd_timer_id_t *timer_data) { sel_free_timer(timer_data->timer); free(timer_data); return 0; } static int get_random(os_handler_t *handler, void *data, unsigned int len) { int fd = open("/dev/urandom", O_RDONLY); int rv; if (fd == -1) return errno; while (len > 0) { rv = read(fd, data, len); if (rv < 0) { rv = errno; goto out; } len -= rv; } rv = 0; out: close(fd); return rv; } extern void ui_vlog(const char *format, enum ipmi_log_type_e log_type, va_list ap); static void sui_log(os_handler_t *handler, enum ipmi_log_type_e log_type, const char *format, ...) { va_list ap; va_start(ap, format); #if 1 ui_vlog(format, log_type, ap); #else vfprintf(stderr, format, ap); #endif va_end(ap); } static void sui_vlog(os_handler_t *handler, enum ipmi_log_type_e log_type, const char *format, va_list ap) { #if 1 ui_vlog(format, log_type, ap); #else vfprintf(stderr, format, ap); #endif } #ifdef IPMI_CHECK_LOCKS struct os_hnd_lock_s { os_hnd_lock_t *next, *prev; int lock_count; }; static os_hnd_lock_t locks = { &locks, &locks, 0 }; static int create_lock(os_handler_t *handler, os_hnd_lock_t **id) { os_hnd_lock_t *lock; lock = malloc(sizeof(*lock)); if (!lock) return ENOMEM; lock->lock_count = 0; lock->next = NULL; lock->prev = NULL; *id = lock; return 0; } static int destroy_lock(os_handler_t *handler, os_hnd_lock_t *id) { if (id->lock_count != 0) { IPMI_REPORT_LOCK_ERROR(handler, "Release of lock when count is not zero\n"); id->next->prev = id->prev; id->prev->next = id->next; } free(id); return 0; } static int lock(os_handler_t *handler, os_hnd_lock_t *id) { if (id->lock_count == 0) { id->next = locks.next; id->prev = &locks; id->next->prev = id; locks.next = id; } id->lock_count++; return 0; } static int unlock(os_handler_t *handler, os_hnd_lock_t *id) { if (id->lock_count <= 0) IPMI_REPORT_LOCK_ERROR(handler, "lock count went negative\n"); id->lock_count--; if (id->lock_count == 0) { id->next->prev = id->prev; id->prev->next = id->next; id->next = NULL; id->prev = NULL; } return 0; } static int is_locked(os_handler_t *handler, os_hnd_lock_t *id) { return id->lock_count != 0; } struct os_hnd_rwlock_s { os_hnd_rwlock_t *next, *prev; int read_lock_count; int write_lock_count; }; static os_hnd_rwlock_t rwlocks = { &rwlocks, &rwlocks, 0 }; static int create_rwlock(os_handler_t *handler, os_hnd_rwlock_t **id) { os_hnd_rwlock_t *lock; lock = malloc(sizeof(*lock)); if (!lock) return ENOMEM; lock->read_lock_count = 0; lock->write_lock_count = 0; lock->next = NULL; lock->prev = NULL; *id = lock; return 0; } static int destroy_rwlock(os_handler_t *handler, os_hnd_rwlock_t *id) { if ((id->read_lock_count != 0) || (id->write_lock_count != 0)) { IPMI_REPORT_LOCK_ERROR(handler, "Release of rwlock when count is not zero\n"); id->next->prev = id->prev; id->prev->next = id->next; } free(id); return 0; } static int read_lock(os_handler_t *handler, os_hnd_rwlock_t *id) { if ((id->read_lock_count == 0) && (id->write_lock_count == 0)) { id->next = rwlocks.next; id->prev = &rwlocks; id->next->prev = id; rwlocks.next = id; } id->read_lock_count++; return 0; } static int read_unlock(os_handler_t *handler, os_hnd_rwlock_t *id) { if (id->read_lock_count <= 0) IPMI_REPORT_LOCK_ERROR(handler, "read lock count went negative\n"); id->read_lock_count--; if ((id->read_lock_count == 0) && (id->write_lock_count == 0)) { id->next->prev = id->prev; id->prev->next = id->next; id->next = NULL; id->prev = NULL; } return 0; } static int write_lock(os_handler_t *handler, os_hnd_rwlock_t *id) { if ((id->read_lock_count == 0) && (id->write_lock_count == 0)) { id->next = rwlocks.next; id->prev = &rwlocks; id->next->prev = id; rwlocks.next = id; } if (id->read_lock_count != 0) IPMI_REPORT_LOCK_ERROR(handler, "Write lock attempted when read lock held\n"); id->write_lock_count++; return 0; } static int write_unlock(os_handler_t *handler, os_hnd_rwlock_t *id) { if (id->write_lock_count <= 0) IPMI_REPORT_LOCK_ERROR(handler, "write lock count went negative\n"); id->write_lock_count--; if ((id->read_lock_count == 0) && (id->write_lock_count == 0)) { id->next->prev = id->prev; id->prev->next = id->next; id->next = NULL; id->prev = NULL; } return 0; } static int is_readlocked(os_handler_t *handler, os_hnd_rwlock_t *id) { return ((id->write_lock_count != 0) || (id->read_lock_count != 0)); } static int is_writelocked(os_handler_t *handler, os_hnd_rwlock_t *id) { return (id->write_lock_count != 0); } static void check_no_locks(os_handler_t *handler) { if ((locks.next != &locks) || (rwlocks.next != &rwlocks)) IPMI_REPORT_LOCK_ERROR(handler, "Locks held when all should be free\n"); } #endif static void * ui_malloc(int size) { return malloc(size); } static void ui_free(void *data) { free(data); } static int get_posix_time(clockid_t clock, struct timeval *tv) { struct timespec ts; int rv; rv = clock_gettime(clock, &ts); if (rv) return rv; tv->tv_sec = ts.tv_sec; tv->tv_usec = (ts.tv_nsec + 500) / 1000; return 0; } static int get_monotonic_time(os_handler_t *handler, struct timeval *tv) { return get_posix_time(CLOCK_MONOTONIC, tv); } static int get_real_time(os_handler_t *handler, struct timeval *tv) { return get_posix_time(CLOCK_REALTIME, tv); } static void free_os_handler(os_handler_t *handler) { sel_free_selector(ui_sel); } static int perform_one_op(os_handler_t *os_hnd, struct timeval *timeout) { int rv; rv = sel_select(ui_sel, NULL, 0, NULL, timeout); if (rv == -1) return errno; return 0; } os_handler_t ipmi_ui_cb_handlers = { .mem_alloc = ui_malloc, .mem_free = ui_free, .add_fd_to_wait_for = add_fd, .remove_fd_to_wait_for = remove_fd, .start_timer = start_timer, .stop_timer = stop_timer, .alloc_timer = alloc_timer, .free_timer = free_timer, .free_os_handler = free_os_handler, .perform_one_op = perform_one_op, #ifdef IPMI_CHECK_LOCKS .create_lock = create_lock, .destroy_lock = destroy_lock, .is_locked = is_locked, .lock = lock, .unlock = unlock, .create_rwlock = create_rwlock, .destroy_rwlock = destroy_rwlock, .read_lock = read_lock, .write_lock = write_lock, .read_unlock = read_unlock, .write_unlock = write_unlock, .is_readlocked = is_readlocked, .is_writelocked = is_writelocked, #else .create_lock = NULL, .destroy_lock = NULL, .is_locked = NULL, .lock = NULL, .unlock = NULL, .create_rwlock = NULL, .destroy_rwlock = NULL, .read_lock = NULL, .write_lock = NULL, .read_unlock = NULL, .write_unlock = NULL, .is_readlocked = NULL, .is_writelocked = NULL, #endif .get_random = get_random, .log = sui_log, .vlog = sui_vlog, .get_monotonic_time = get_monotonic_time, .get_real_time = get_real_time }; OpenIPMI-2.0.29/ui/ui_command.h0000644000175000017500000000374312002623311013003 00000000000000/* * ui_command.h * * MontaVista IPMI code, a simple curses UI command handler * * Author: MontaVista Software, Inc. * Corey Minyard * source@mvista.com * * Copyright 2002 MontaVista Software Inc. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License * as published by the Free Software Foundation; either version 2 of * the License, or (at your option) any later version. * * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef UI_COMMAND_H #define UI_COMMAND_H #include typedef int (*cmd_handler_t)(char *cmd, char **toks, void *cb_data); struct cmd_entry { char *name; cmd_handler_t handler; }; typedef struct { ilist_t *cmds; } *command_t; int command_handle(command_t command, char *line, void *cb_data); int command_bind(command_t command, char *name, cmd_handler_t handler); int command_unbind(command_t command, char *name); command_t command_alloc(void); void command_free(command_t command); #endif /* UI_COMMAND_H */ OpenIPMI-2.0.29/ui/ui_keypad.c0000644000175000017500000000731012002623311012627 00000000000000/* * ui_keypad.c * * MontaVista IPMI code, a simple curses UI keypad handler * * Author: MontaVista Software, Inc. * Corey Minyard * source@mvista.com * * Copyright 2002,2003 MontaVista Software Inc. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License * as published by the Free Software Foundation; either version 2 of * the License, or (at your option) any later version. * * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * You should have received a copy of the GNU Lesser 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 "ui_keypad.h" #include #include static int search_key(void *item, void *cb_data) { struct key_entry *entry = item; int *val = cb_data; return (entry->key == *val); } static struct key_entry * find_key(ilist_iter_t *iter, keypad_t keypad, int key) { int hash = ((unsigned int) key) % NUM_KEY_ENTRIES; struct key_entry *entry; ilist_init_iter(iter, keypad->keys[hash]); ilist_unpositioned(iter); entry = ilist_search_iter(iter, search_key, &key); return entry; } int keypad_handle_key(keypad_t keypad, int key, void *cb_data) { ilist_iter_t iter; struct key_entry *entry; entry = find_key(&iter, keypad, key); if (!entry) return ENOENT; return entry->handler(key, cb_data); } int keypad_bind_key(keypad_t keypad, int key, key_handler_t handler) { int hash = ((unsigned int) key) % NUM_KEY_ENTRIES; ilist_iter_t iter; struct key_entry *entry; if (find_key(&iter, keypad, key)) return EEXIST; entry = ipmi_mem_alloc(sizeof(*entry)); if (!entry) return ENOMEM; entry->key = key; entry->handler = handler; if (!ilist_add_tail(keypad->keys[hash], entry, NULL)) { ipmi_mem_free(entry); return ENOMEM; } return 0; } int keypad_unbind_key(keypad_t keypad, int key) { ilist_iter_t iter; struct key_entry *entry; entry = find_key(&iter, keypad, key); if (!entry) return ENOENT; ilist_delete(&iter); ipmi_mem_free(entry); return 0; } static void del_key_entry(ilist_iter_t *iter, void *item, void *cb_data) { ilist_delete(iter); ipmi_mem_free(item); } void keypad_free(keypad_t keypad) { int i; for (i=0; ikeys[i]) { ilist_iter(keypad->keys[i], del_key_entry, NULL); free_ilist(keypad->keys[i]); } } ipmi_mem_free(keypad); } keypad_t keypad_alloc(void) { keypad_t nv = ipmi_mem_alloc(sizeof(*nv)); int i; if (nv) { memset(nv, 0, sizeof(*nv)); for (i=0; ikeys[i] = alloc_ilist(); if (!nv->keys[i]) goto out_err; } } return nv; out_err: keypad_free(nv); return NULL; } OpenIPMI-2.0.29/ui/ui_keypad.h0000644000175000017500000000375512002623311012645 00000000000000/* * ui_keypad.h * * MontaVista IPMI code, a simple curses UI keypad handler * * Author: MontaVista Software, Inc. * Corey Minyard * source@mvista.com * * Copyright 2002 MontaVista Software Inc. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License * as published by the Free Software Foundation; either version 2 of * the License, or (at your option) any later version. * * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * You should have received a copy of the GNU Lesser General Public * License along with this program; if not, write to the Free * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifndef UI_KEYPAD_H #define UI_KEYPAD_H #include typedef int (*key_handler_t)(int key, void *cb_data); struct key_entry { int key; key_handler_t handler; }; #define NUM_KEY_ENTRIES 128 typedef struct { ilist_t *keys[NUM_KEY_ENTRIES]; } *keypad_t; int keypad_handle_key(keypad_t keypad, int key, void *cb_data); int keypad_bind_key(keypad_t keypad, int key, key_handler_t handler); int keypad_unbind_key(keypad_t keypad, int key); keypad_t keypad_alloc(void); void keypad_free(keypad_t keypad); #endif /* UI_KEYPAD_H */ OpenIPMI-2.0.29/ui/basic_ui.c0000664000175000017500000002325113137654427012465 00000000000000/* * basic_ui.c * * MontaVista IPMI basic UI to use the main UI code. * * Author: MontaVista Software, Inc. * Corey Minyard * source@mvista.com * * Copyright 2002,2003 MontaVista Software Inc. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License * as published by the Free Software Foundation; either version 2 of * the License, or (at your option) any later version. * * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * You should have received a copy of the GNU Lesser 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 #include #ifdef HAVE_UCDSNMP # ifdef HAVE_NETSNMP # include # include # elif defined(HAVE_ALT_UCDSNMP_DIR) # include # include # include # else # include # include # include # endif #endif extern struct selector_s *ui_sel; /* This is here because the POSIX library requires it, but we only pull the posix library to get the selector code, so this is not used. */ void posix_vlog(char *format, enum ipmi_log_type_e log_type, va_list ap) { } #ifdef HAVE_UCDSNMP #define IPMI_OID_SIZE 9 static oid ipmi_oid[IPMI_OID_SIZE] = {1,3,6,1,4,1,3183,1,1}; int snmp_input(int op, struct snmp_session *session, int reqid, struct snmp_pdu *pdu, void *magic) { struct sockaddr_in *src_ip; uint32_t specific; struct variable_list *var; #ifdef HAVE_NETSNMP if (op != NETSNMP_CALLBACK_OP_RECEIVED_MESSAGE) goto out; #else if (op != RECEIVED_MESSAGE) goto out; #endif if (pdu->command != SNMP_MSG_TRAP) goto out; if (snmp_oid_compare(ipmi_oid, IPMI_OID_SIZE, pdu->enterprise, pdu->enterprise_length) != 0) { goto out; } if (pdu->trap_type != SNMP_TRAP_ENTERPRISESPECIFIC) goto out; src_ip = (struct sockaddr_in *) &pdu->agent_addr; specific = pdu->specific_type; var = pdu->variables; if (var == NULL) goto out; if (var->type != ASN_OCTET_STR) goto out; if (snmp_oid_compare(ipmi_oid, IPMI_OID_SIZE, var->name, var->name_length) != 0) { goto out; } if (var->val_len < 46) goto out; ipmi_handle_snmp_trap_data(src_ip, sizeof(*src_ip), IPMI_EXTERN_ADDR_IP, specific, var->val.string, var->val_len); out: return 1; } #ifdef HAVE_NETSNMP static int snmp_pre_parse(netsnmp_session * session, netsnmp_transport *transport, void *transport_data, int transport_data_length) { return 1; } #else static int snmp_pre_parse(struct snmp_session *session, snmp_ipaddr from) { return 1; } #endif struct snmp_session *snmp_session; struct snmp_fd_data { int fd; os_hnd_fd_id_t *id; struct snmp_fd_data *next; }; static struct snmp_fd_data *snmpfd = NULL; os_hnd_timer_id_t *snmp_timer = NULL; static void snmp_check_read_fds(int fd, void *cb_data, os_hnd_fd_id_t *id) { fd_set fdset; FD_ZERO(&fdset); FD_SET(fd, &fdset); snmp_read(&fdset); } static void snmp_check_timeout(void *cb_data, os_hnd_timer_id_t *id) { snmp_timeout(); } static void snmp_setup_fds(os_handler_t *os_hnd) { int nfds = 0, block = 0, i, rv; fd_set fdset; struct timeval tv; struct snmp_fd_data *fdd, *nfdd, *prev = NULL; FD_ZERO(&fdset); tv.tv_sec = 0; tv.tv_usec = 0; snmp_select_info(&nfds, &fdset, &tv, &block); /* Run through the list. Since the list is kept sorted, we only need one pass. */ fdd = snmpfd; for (i = 0; i < nfds; i++) { if (!FD_ISSET(i, &fdset)) continue; if (fdd) { if (fdd->fd == i) { /* Didn't change. */ prev = fdd; fdd = fdd->next; continue; } if (fdd->fd < i) { /* Current one was deleted. */ os_hnd->remove_fd_to_wait_for(os_hnd, fdd->id); if (prev) prev->next = fdd->next; else snmpfd = fdd->next; os_hnd->mem_free(fdd); continue; } } /* New one to add. */ nfdd = os_hnd->mem_alloc(sizeof(*fdd)); if (!nfdd) { rv = ENOMEM; goto err; } nfdd->fd = i; rv = os_hnd->add_fd_to_wait_for(os_hnd, i, snmp_check_read_fds, NULL, NULL, &nfdd->id); if (rv) goto err; /* Insert after */ if (fdd) { nfdd->next = fdd->next; fdd->next = nfdd; } else { nfdd->next = NULL; snmpfd = fdd; } } if (!block) { os_hnd->stop_timer(os_hnd, snmp_timer); } else { os_hnd->stop_timer(os_hnd, snmp_timer); os_hnd->start_timer(os_hnd, snmp_timer, &tv, snmp_check_timeout, NULL); } return; err: fprintf(stderr, "Error handling SNMP fd data: %s\n", strerror(rv)); exit(1); } int snmp_init(os_handler_t *os_hnd) { struct snmp_session session; #ifdef HAVE_NETSNMP netsnmp_transport *transport = NULL; static char *snmp_default_port = "udp:162"; int rv; rv = os_hnd->alloc_timer(os_hnd, &snmp_timer); if (rv) { fprintf(stderr, "Could not allocate SNMP timer\n"); return -1; } netsnmp_ds_set_boolean(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_MIB_ERRORS, 0); init_snmp("ipmi_ui"); transport = netsnmp_tdomain_transport(snmp_default_port, 1, "udp"); if (!transport) { snmp_sess_perror("ipmi_ui", &session); return -1; } #else void *transport = NULL; #endif snmp_sess_init(&session); session.peername = SNMP_DEFAULT_PEERNAME; session.version = SNMP_DEFAULT_VERSION; session.community_len = SNMP_DEFAULT_COMMUNITY_LEN; session.retries = SNMP_DEFAULT_RETRIES; session.timeout = SNMP_DEFAULT_TIMEOUT; session.local_port = SNMP_TRAP_PORT; session.callback = snmp_input; session.callback_magic = transport; session.authenticator = NULL; session.isAuthoritative = SNMP_SESS_UNKNOWNAUTH; #ifdef HAVE_NETSNMP snmp_session = snmp_add(&session, transport, snmp_pre_parse, NULL); #else snmp_session = snmp_open_ex(&session, snmp_pre_parse, NULL, NULL, NULL, NULL); #endif if (snmp_session == NULL) { snmp_sess_perror("ipmi_ui", &session); return -1; } return 0; } #else static void snmp_setup_fds(os_handler_t *os_hnd) { } #endif /* HAVE_UCDSNMP */ int main(int argc, char *argv[]) { int rv; int curr_arg = 1; const char *arg; int full_screen = 1; ipmi_domain_id_t domain_id; int i; #ifdef HAVE_UCDSNMP int init_snmp = 0; #endif ipmi_args_t *con_parms[2]; ipmi_con_t *con[2]; int last_con = 0; while ((curr_arg < argc) && (argv[curr_arg][0] == '-')) { arg = argv[curr_arg]; curr_arg++; if (strcmp(arg, "--") == 0) { break; } else if (strcmp(arg, "-c") == 0) { full_screen = 0; } else if (strcmp(arg, "-dlock") == 0) { DEBUG_LOCKS_ENABLE(); } else if (strcmp(arg, "-dmem") == 0) { DEBUG_MALLOC_ENABLE(); } else if (strcmp(arg, "-drawmsg") == 0) { DEBUG_RAWMSG_ENABLE(); } else if (strcmp(arg, "-dmsg") == 0) { DEBUG_MSG_ENABLE(); #ifdef HAVE_UCDSNMP } else if (strcmp(arg, "-snmp") == 0) { init_snmp = 1; #endif } else { fprintf(stderr, "Unknown option: %s\n", arg); return 1; } } rv = sel_alloc_selector_nothread(&ui_sel); if (rv) { fprintf(stderr, "Could not allocate selector\n"); exit(1); } rv = ipmi_ui_init(&ipmi_ui_cb_handlers, full_screen); #ifdef HAVE_UCDSNMP if (init_snmp) { if (snmp_init(&ipmi_ui_cb_handlers) < 0) goto out; } #endif next_con: rv = ipmi_parse_args2(&curr_arg, argc, argv, &con_parms[last_con]); if (rv) { fprintf(stderr, "Error parsing command arguments, argument %d: %s\n", curr_arg, strerror(rv)); exit(1); } last_con++; if (curr_arg < argc) { if (last_con == 2) { fprintf(stderr, "Too many connections\n"); rv = EINVAL; goto out; } goto next_con; } for (i=0; i * source@mvista.com * * Copyright 2002,2003 MontaVista Software Inc. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License * as published by the Free Software Foundation; either version 2 of * the License, or (at your option) any later version. * * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * You should have received a copy of the GNU Lesser 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 "ui_command.h" #include static int search_cmd(void *item, void *cb_data) { struct cmd_entry *entry = item; char *val = cb_data; return (strcmp(entry->name, val) == 0); } static struct cmd_entry * find_cmd(ilist_iter_t *iter, command_t command, char *name) { struct cmd_entry *entry; ilist_init_iter(iter, command->cmds); ilist_unpositioned(iter); entry = ilist_search_iter(iter, search_cmd, name); return entry; } int command_handle(command_t command, char *line, void *cb_data) { ilist_iter_t iter; struct cmd_entry *entry; char *name; char *tok; name = strtok_r(line, " \t\n", &tok); if (!name) return 0; entry = find_cmd(&iter, command, name); if (!entry) return ENOENT; return entry->handler(name, &tok, cb_data); } int command_bind(command_t command, char *name, cmd_handler_t handler) { ilist_iter_t iter; struct cmd_entry *entry; if (find_cmd(&iter, command, name)) return EEXIST; entry = ipmi_mem_alloc(sizeof(*entry)); if (!entry) return ENOMEM; entry->name = ipmi_mem_alloc(strlen(name)+1); if (!entry->name) { ipmi_mem_free(entry); return ENOMEM; } strcpy(entry->name, name); entry->handler = handler; if (!ilist_add_tail(command->cmds, entry, NULL)) { ipmi_mem_free(entry->name); ipmi_mem_free(entry); return ENOMEM; } return 0; } int command_unbind(command_t command, char *name) { ilist_iter_t iter; struct cmd_entry *entry; entry = find_cmd(&iter, command, name); if (!entry) return ENOENT; ilist_delete(&iter); ipmi_mem_free(entry->name); ipmi_mem_free(entry); return 0; } command_t command_alloc(void) { command_t command = ipmi_mem_alloc(sizeof(*command)); if (command) { command->cmds = alloc_ilist(); if (!command->cmds) { ipmi_mem_free(command); command = NULL; } } return command; } static void free_cmd_entry(ilist_iter_t *iter, void *item, void *cb_data) { struct cmd_entry *entry = item; ilist_delete(iter); ipmi_mem_free(entry->name); ipmi_mem_free(entry); } void command_free(command_t command) { ilist_iter(command->cmds, free_cmd_entry, NULL); free_ilist(command->cmds); ipmi_mem_free(command); } OpenIPMI-2.0.29/ui/ui.c0000644000175000017500000054207413414041474011321 00000000000000/* * ui.c * * MontaVista IPMI code, a simple curses UI for IPMI * * Author: MontaVista Software, Inc. * Corey Minyard * source@mvista.com * * Copyright 2002,2003,2004 MontaVista Software Inc. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public License * as published by the Free Software Foundation; either version 2 of * the License, or (at your option) any later version. * * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * You should have received a copy of the GNU Lesser 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 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "ui_keypad.h" #include "ui_command.h" /* X/Open curses deprecates SVr4 vwprintw/vwscanw, but some still have it. */ #ifndef HAVE_VW_PRINTW #define vw_printw vwprintw #endif WINDOW *main_win; WINDOW *cmd_win; WINDOW *stat_win; WINDOW *log_pad; WINDOW *dummy_pad; WINDOW *display_pad; int log_pad_top_line; int display_pad_top_line; keypad_t keymap; command_t commands; ipmi_domain_id_t domain_id; os_handler_t *ipmi_ui_os_hnd; ipmi_pef_t *pef; ipmi_pef_config_t *pef_config; ipmi_lanparm_t *lanparm; ipmi_lan_config_t *lanparm_config; static int full_screen; struct termios old_termios; int old_flags; #define STATUS_WIN_LINES 2 #define STATUS_WIN_COLS COLS #define STATUS_WIN_TOP 0 #define STATUS_WIN_LEFT 0 #define CMD_WIN_LINES 3 #define CMD_WIN_COLS COLS #define CMD_WIN_LEFT 0 #define CMD_WIN_TOP (LINES-CMD_WIN_LINES) #define DISPLAY_WIN_LINES (LINES - STATUS_WIN_LINES - CMD_WIN_LINES - 2) #define DISPLAY_WIN_COLS (COLS/2-1) #define DISPLAY_WIN_TOP (STATUS_WIN_LINES+1) #define DISPLAY_WIN_LEFT 0 #define DISPLAY_WIN_RIGHT (COLS/2-2) #define DISPLAY_WIN_BOTTOM (CMD_WIN_TOP-2) #define NUM_DISPLAY_LINES 1024 #define LOG_WIN_LINES (LINES - STATUS_WIN_LINES - CMD_WIN_LINES - 2) #define LOG_WIN_COLS (COLS-(COLS/2)) #define LOG_WIN_LEFT (COLS/2) #define LOG_WIN_RIGHT (COLS-1) #define LOG_WIN_TOP (STATUS_WIN_LINES+1) #define LOG_WIN_BOTTOM (CMD_WIN_TOP-2) #define NUM_LOG_LINES 1024 #define TOP_LINE STATUS_WIN_LINES #define BOTTOM_LINE (LINES-CMD_WIN_LINES-1) #define MID_COL (COLS/2-1) #define MID_LINES (LINES - STATUS_WIN_LINES - CMD_WIN_LINES - 2) enum scroll_wins_e { LOG_WIN_SCROLL, DISPLAY_WIN_SCROLL }; enum scroll_wins_e curr_win = LOG_WIN_SCROLL; /* The current thing display in the display pad. */ enum { DISPLAY_NONE, DISPLAY_SENSOR, DISPLAY_SENSORS, DISPLAY_CONTROLS, DISPLAY_CONTROL, DISPLAY_ENTITIES, DISPLAY_MCS, DISPLAY_MC, DISPLAY_RSP, DISPLAY_SDRS, HELP, EVENTS, DISPLAY_ENTITY, DISPLAY_FRU } curr_display_type; ipmi_sensor_id_t curr_sensor_id; ipmi_control_id_t curr_control_id; typedef struct pos_s {int y; int x; } pos_t; typedef struct thr_pos_s { int set; pos_t value; pos_t enabled; pos_t oor; } thr_pos_t; thr_pos_t threshold_positions[6]; pos_t value_pos; pos_t enabled_pos; pos_t scanning_pos; pos_t discr_assert_enab; pos_t discr_deassert_enab; ipmi_entity_id_t curr_entity_id; static char *line_buffer = NULL; static int line_buffer_max = 0; static int line_buffer_pos = 0; os_hnd_timer_id_t *redisplay_timer; static void conv_from_spaces(char *name) { while (*name) { if (*name == ' ') *name = '~'; name++; } } static void conv_to_spaces(char *name) { while (*name) { if (*name == '~') *name = ' '; name++; } } void log_pad_refresh(int newlines) { if (full_screen) { if (log_pad_top_line < 0) log_pad_top_line = 0; if (log_pad_top_line > (NUM_LOG_LINES - LOG_WIN_LINES)) log_pad_top_line = NUM_LOG_LINES - LOG_WIN_LINES; if (log_pad_top_line != (NUM_LOG_LINES - LOG_WIN_LINES)) { /* We are not at the bottom, so hold the same position. */ log_pad_top_line -= newlines; } prefresh(log_pad, log_pad_top_line, 0, LOG_WIN_TOP, LOG_WIN_LEFT, LOG_WIN_BOTTOM, LOG_WIN_RIGHT); wrefresh(cmd_win); } } void vlog_pad_out(const char *format, va_list ap) { if (full_screen) vw_printw(log_pad, format, ap); else vprintf(format, ap); } void log_pad_out(char *format, ...) { va_list ap; va_start(ap, format); vlog_pad_out(format, ap); va_end(ap); } void display_pad_refresh(void) { if (full_screen) { if (display_pad_top_line >= NUM_DISPLAY_LINES) display_pad_top_line = NUM_DISPLAY_LINES; if (display_pad_top_line < 0) display_pad_top_line = 0; prefresh(display_pad, display_pad_top_line, 0, DISPLAY_WIN_TOP, DISPLAY_WIN_LEFT, DISPLAY_WIN_BOTTOM, DISPLAY_WIN_RIGHT); wrefresh(cmd_win); } } void display_pad_clear(void) { display_pad_top_line = 0; if (full_screen) { werase(display_pad); wmove(display_pad, 0, 0); } } void display_pad_clear_nomove(void) { if (full_screen) { werase(display_pad); wmove(display_pad, 0, 0); } } void display_pad_out(char *format, ...) { va_list ap; va_start(ap, format); if (full_screen) vw_printw(display_pad, format, ap); else vprintf(format, ap); va_end(ap); } void cmd_win_out(char *format, ...) { va_list ap; va_start(ap, format); if (full_screen) vw_printw(cmd_win, format, ap); else vprintf(format, ap); va_end(ap); } void cmd_win_refresh(void) { if (full_screen) wrefresh(cmd_win); else fflush(stdout); } static int get_uchar(char **toks, unsigned char *val, char *errstr) { char *str, *tmpstr; str = strtok_r(NULL, " \t\n", toks); if (!str) { if (errstr) cmd_win_out("No %s given\n", errstr); return EINVAL; } *val = strtoul(str, &tmpstr, 16); if (*tmpstr != '\0') { if (errstr) cmd_win_out("Invalid %s given\n", errstr); return EINVAL; } return 0; } static int get_uint(char **toks, unsigned int *val, char *errstr) { char *str, *tmpstr; str = strtok_r(NULL, " \t\n", toks); if (!str) { if (errstr) cmd_win_out("No %s given\n", errstr); return EINVAL; } *val = strtoul(str, &tmpstr, 16); if (*tmpstr != '\0') { if (errstr) cmd_win_out("Invalid %s given\n", errstr); return EINVAL; } return 0; } static int get_ip_addr(char **toks, struct in_addr *ip_addr, char *errstr) { uint32_t addr; unsigned char val; char *str, *tmpstr, *istr; char *ntok; int i; str = strtok_r(NULL, " \t\n", toks); if (!str) { if (errstr) cmd_win_out("No %s given\n", errstr); return EINVAL; } addr = 0; for (i=0; i<4; i++) { istr = strtok_r(str, ".", &ntok); str = NULL; if (!istr) { if (errstr) cmd_win_out("%s: invalid IP address\n", errstr); return EINVAL; } val = strtoul(istr, &tmpstr, 10); if (*tmpstr != '\0') { if (errstr) cmd_win_out("%s: Invalid IP address\n", errstr); return EINVAL; } addr = (addr << 8) | val; } ip_addr->s_addr = htonl(addr); return 0; } static int get_mac_addr(char **toks, unsigned char *mac_addr, char *errstr) { char *str, *tmpstr, *istr; char *ntok; int i; str = strtok_r(NULL, " \t\n", toks); if (!str) { if (errstr) cmd_win_out("No %s given\n", errstr); return EINVAL; } for (i=0; i<6; i++) { istr = strtok_r(str, ":", &ntok); str = NULL; if (!istr) { if (errstr) cmd_win_out("%s: invalid IP address\n", errstr); return EINVAL; } mac_addr[i] = strtoul(istr, &tmpstr, 16); if (*tmpstr != '\0') { if (errstr) cmd_win_out("%s: Invalid IP address\n", errstr); return EINVAL; } } return 0; } void draw_lines() { werase(main_win); wmove(main_win, TOP_LINE, 0); whline(main_win, 0, COLS); wmove(main_win, BOTTOM_LINE, 0); whline(main_win, 0, COLS); wmove(main_win, TOP_LINE, MID_COL); wvline(main_win, ACS_TTEE, 1); wmove(main_win, TOP_LINE+1, MID_COL); wvline(main_win, 0, MID_LINES); wmove(main_win, TOP_LINE+1+MID_LINES, MID_COL); wvline(main_win, ACS_BTEE, 1); wrefresh(main_win); } void ui_vlog(const char *format, enum ipmi_log_type_e log_type, va_list ap) { int do_nl = 1; struct timeval now; ipmi_ui_os_hnd->get_real_time(ipmi_ui_os_hnd, &now); if (full_screen) { int x = 0, y = 0, old_x = 0, old_y = 0; int max_x, max_y, i, j; /* Generate the output to the dummy pad to see how many lines we will use. */ getyx(dummy_pad, old_y, old_x); switch(log_type) { case IPMI_LOG_INFO: wprintw(dummy_pad, "%d.%6.6d: ", now.tv_sec, now.tv_usec); wprintw(dummy_pad, "INFO: "); break; case IPMI_LOG_WARNING: wprintw(dummy_pad, "%d.%6.6d: ", now.tv_sec, now.tv_usec); wprintw(dummy_pad, "WARN: "); break; case IPMI_LOG_SEVERE: wprintw(dummy_pad, "%d.%6.6d: ", now.tv_sec, now.tv_usec); wprintw(dummy_pad, "SEVR: "); break; case IPMI_LOG_FATAL: wprintw(dummy_pad, "%d.%6.6d: ", now.tv_sec, now.tv_usec); wprintw(dummy_pad, "FATL: "); break; case IPMI_LOG_ERR_INFO: wprintw(dummy_pad, "%d.%6.6d: ", now.tv_sec, now.tv_usec); wprintw(dummy_pad, "EINF: "); break; case IPMI_LOG_DEBUG_START: do_nl = 0; /* FALLTHROUGH */ case IPMI_LOG_DEBUG: wprintw(dummy_pad, "%d.%6.6d: ", now.tv_sec, now.tv_usec); wprintw(dummy_pad, "DEBG: "); break; case IPMI_LOG_DEBUG_CONT: do_nl = 0; /* FALLTHROUGH */ case IPMI_LOG_DEBUG_END: break; } vw_printw(dummy_pad, format, ap); if (do_nl) wprintw(dummy_pad, "\n"); getyx(dummy_pad, y, x); if (old_y == y) { for (j=old_x; jget_real_time(ipmi_ui_os_hnd, &now); va_start(ap, format); if (full_screen) { /* Generate the output to the dummy pad to see how many lines we will use. */ wprintw(dummy_pad, "%d.%6.6d: ", now.tv_sec, now.tv_usec); vw_printw(dummy_pad, format, ap); getyx(dummy_pad, y, x); wmove(dummy_pad, 0, x); va_end(ap); va_start(ap, format); } log_pad_out("%ld.%6.6ld: ", now.tv_sec, now.tv_usec); vlog_pad_out(format, ap); log_pad_refresh(y); cmd_win_refresh(); va_end(ap); } void leave(int rv, char *format, ...) { va_list ap; ipmi_shutdown(); ipmi_ui_os_hnd->stop_timer(ipmi_ui_os_hnd, redisplay_timer); ipmi_ui_os_hnd->free_timer(ipmi_ui_os_hnd, redisplay_timer); if (full_screen) { endwin(); full_screen = 0; } else { tcsetattr(0, TCSADRAIN, &old_termios); fcntl(0, F_SETFL, old_flags); tcdrain(0); } if (pef_config) { ipmi_pef_free_config(pef_config); pef_config = NULL; } if (pef) { ipmi_pef_destroy(pef, NULL, NULL); pef = NULL; } if (lanparm_config) { ipmi_lan_free_config(lanparm_config); lanparm_config = NULL; } if (lanparm) { ipmi_lanparm_destroy(lanparm, NULL, NULL); lanparm = NULL; } if (line_buffer) { ipmi_mem_free(line_buffer); } command_free(commands); keypad_free(keymap); ipmi_ui_os_hnd->free_os_handler(ipmi_ui_os_hnd); va_start(ap, format); vfprintf(stderr, format, ap); va_end(ap); ipmi_debug_malloc_cleanup(); exit(rv); } void leave_err(int err, char *format, ...) { va_list ap; if (full_screen) endwin(); else { tcsetattr(0, TCSADRAIN, &old_termios); fcntl(0, F_SETFL, old_flags); tcdrain(0); } ipmi_ui_os_hnd->free_os_handler(ipmi_ui_os_hnd); va_start(ap, format); vfprintf(stderr, format, ap); va_end(ap); if (IPMI_IS_OS_ERR(err)) { fprintf(stderr, ": %s\n", strerror(IPMI_GET_OS_ERR(err))); } else { fprintf(stderr, ": IPMI Error %2.2x\n", IPMI_GET_IPMI_ERR(err)); } ipmi_debug_malloc_cleanup(); exit(1); } #ifdef HAVE_WRESIZE void recalc_windows(void) { draw_lines(); mvwin(stat_win, STATUS_WIN_TOP, STATUS_WIN_LEFT); wresize(stat_win, STATUS_WIN_LINES, STATUS_WIN_COLS); wrefresh(stat_win); touchwin(stat_win); wresize(display_pad, DISPLAY_WIN_LINES, DISPLAY_WIN_COLS); mvwin(cmd_win, CMD_WIN_TOP, CMD_WIN_LEFT); wresize(cmd_win, CMD_WIN_LINES, CMD_WIN_COLS); wrefresh(cmd_win); touchwin(cmd_win); wresize(log_pad, NUM_LOG_LINES, LOG_WIN_COLS); wresize(dummy_pad, NUM_LOG_LINES, LOG_WIN_COLS); doupdate(); log_pad_refresh(0); display_pad_refresh(); } #endif static void handle_user_char(int c) { int err = keypad_handle_key(keymap, c, NULL); if (err) ui_log("Got error on char 0x%x 0%o %d\n", c, c, c); } void user_input_ready(int fd, void *data, os_hnd_fd_id_t *id) { int c; if (full_screen) { c = wgetch(cmd_win); while (c != ERR) { handle_user_char(c); c = wgetch(cmd_win); } } else { char rc; int count; count = read(0, &rc, 1); if (count > 0) handle_user_char(rc); } } static int normal_char(int key, void *cb_data) { char out[2]; if (line_buffer_pos >= line_buffer_max) { char *new_line = ipmi_mem_alloc(line_buffer_max+10+1); if (!new_line) return ENOMEM; line_buffer_max += 10; if (line_buffer) { memcpy(new_line, line_buffer, line_buffer_pos); ipmi_mem_free(line_buffer); } line_buffer = new_line; } line_buffer[line_buffer_pos] = key; line_buffer_pos++; out[0] = key; out[1] = '\0'; cmd_win_out(out); cmd_win_refresh(); return 0; } static int end_of_line(int key, void *cb_data) { int err; if (!line_buffer) return 0; line_buffer[line_buffer_pos] = '\0'; cmd_win_out("\n"); err = command_handle(commands, line_buffer, NULL); if (err) cmd_win_out("Invalid command: %s\n> ", line_buffer); else cmd_win_out("> "); line_buffer_pos = 0; cmd_win_refresh(); return 0; } static int backspace(int key, void *cb_data) { if (line_buffer_pos == 0) return 0; line_buffer_pos--; cmd_win_out("\b \b"); cmd_win_refresh(); return 0; } static int key_up(int key, void *cb_data) { return 0; } static int key_down(int key, void *cb_data) { return 0; } static int key_right(int key, void *cb_data) { return 0; } static int key_left(int key, void *cb_data) { return 0; } static int key_ppage(int key, void *cb_data) { if (curr_win == LOG_WIN_SCROLL) { log_pad_top_line -= (LOG_WIN_LINES-1); log_pad_refresh(0); } else if (curr_win == DISPLAY_WIN_SCROLL) { display_pad_top_line -= (DISPLAY_WIN_LINES-1); display_pad_refresh(); } return 0; } static int key_npage(int key, void *cb_data) { if (curr_win == LOG_WIN_SCROLL) { log_pad_top_line += (LOG_WIN_LINES-1); log_pad_refresh(0); } else if (curr_win == DISPLAY_WIN_SCROLL) { display_pad_top_line += (DISPLAY_WIN_LINES-1); display_pad_refresh(); } return 0; } static int leave_count = 0; static void final_leave(void *cb_data) { leave_count--; if (leave_count == 0) leave(0, ""); } static void leave_cmder(ipmi_domain_t *domain, void *cb_data) { int rv; rv = ipmi_domain_close(domain, final_leave, NULL); if (!rv) leave_count++; } static int key_leave(int key, void *cb_data) { ipmi_domain_iterate_domains(leave_cmder, NULL); if (leave_count == 0) leave(0, ""); return 0; } #ifdef HAVE_WRESIZE static int key_resize(int key, void *cb_data) { recalc_windows(); return 0; } #endif static int key_set_display(int key, void *cb_data) { curr_win = DISPLAY_WIN_SCROLL; return 0; } static int key_set_log(int key, void *cb_data) { curr_win = LOG_WIN_SCROLL; return 0; } /* Includes 3 3-byte fields (entity id, entity instance, and slave address) and 1 2-byte field (channel) and three periods and the nil char at the end and possible a leading "r" for device-relative. */ #define MAX_ENTITY_LOC_SIZE 16 /* Convert an entity to a locator for the entity. This is either: . for an absolute entity, or r... for a device-relative entity. */ static char * get_entity_loc(ipmi_entity_t *entity, char *str, int strlen) { ipmi_entity_id_t id; id = ipmi_entity_convert_to_id(entity); if (id.entity_instance >= 0x60) snprintf(str, strlen, "r%d.%d.%d.%d", id.channel, id.address, id.entity_id, id.entity_instance - 0x60); else snprintf(str, strlen, "%d.%d", id.entity_id, id.entity_instance); return str; } static void entities_handler(ipmi_entity_t *entity, void *cb_data) { char *present; char loc[MAX_ENTITY_LOC_SIZE]; char name[33]; enum ipmi_dlr_type_e type; static char *ent_types[] = { "unknown", "mc", "fru", "generic", "invalid" }; type = ipmi_entity_get_type(entity); if (type > IPMI_ENTITY_GENERIC) type = IPMI_ENTITY_GENERIC + 1; curr_entity_id = ipmi_entity_convert_to_id(entity); ipmi_entity_get_id(entity, name, 32); if (strlen(name) == 0) { strncpy(name, ipmi_entity_get_entity_id_string(entity), 32); name[32] = '\0'; } if (ipmi_entity_is_present(entity)) present = "present"; else present = "not present"; display_pad_out(" %s (%s) %s %s\n", get_entity_loc(entity, loc, sizeof(loc)), name, ent_types[type], present); } static void entities_cmder(ipmi_domain_t *domain, void *cb_data) { if (cb_data) display_pad_clear_nomove(); else display_pad_clear(); display_pad_out("Entities:\n"); ipmi_domain_iterate_entities(domain, entities_handler, NULL); display_pad_refresh(); } static int entities_cmd(char *cmd, char **toks, void *cb_data) { int rv; rv = ipmi_domain_pointer_cb(domain_id, entities_cmder, NULL); if (rv) { cmd_win_out("Unable to convert domain id to a pointer\n"); return 0; } curr_display_type = DISPLAY_ENTITIES; return 0; } typedef void (*entity_handler_cb)(ipmi_entity_t *entity, char **toks, char **toks2, void *cb_data); struct ent_rec { int id, instance, found; int channel, address; entity_handler_cb handler; char **toks, **toks2; void *cb_data; }; static void entity_searcher(ipmi_entity_t *entity, void *cb_data) { struct ent_rec *info = cb_data; ipmi_entity_id_t id; id = ipmi_entity_convert_to_id(entity); if ((info->id == id.entity_id) && (info->instance == id.entity_instance) && (info->address == id.address) && (info->channel == id.channel)) { info->found = 1; info->handler(entity, info->toks, info->toks2, info->cb_data); } } static void entity_finder_d(ipmi_domain_t *domain, void *cb_data) { ipmi_domain_iterate_entities(domain, entity_searcher, cb_data); } int entity_finder(char *cmd, char **toks, entity_handler_cb handler, void *cb_data) { struct ent_rec info; char *ent_name; char *id_name, *instance_name, *toks2, *estr; ent_name = strtok_r(NULL, " \t\n", toks); if (!ent_name) { cmd_win_out("No entity given\n"); return EINVAL; } if (ent_name[0] == 'r') { /* Device-relative address. */ char *name; name = strtok_r(ent_name+1, ".", &toks2); info.channel = strtoul(name, &estr, 0); if (*estr != '\0') { cmd_win_out("Invalid entity channel given\n"); return EINVAL; } name = strtok_r(NULL, ".", &toks2); info.address = strtoul(name, &estr, 0); if (*estr != '\0') { cmd_win_out("Invalid entity address given\n"); return EINVAL; } id_name = strtok_r(NULL, ".", &toks2); } else { info.address = 0; info.channel = 0; id_name = strtok_r(ent_name, ".", &toks2); } instance_name = strtok_r(NULL, ".", &toks2); if (!instance_name) { cmd_win_out("Invalid entity given\n"); return EINVAL; } info.id = strtoul(id_name, &estr, 0); if (*estr != '\0') { cmd_win_out("Invalid entity id given\n"); return EINVAL; } info.instance = strtoul(instance_name, &estr, 0); if (*estr != '\0') { cmd_win_out("Invalid entity instance given\n"); return EINVAL; } if (ent_name[0] == 'r') info.instance += 0x60; info.found = 0; info.handler = handler; info.cb_data = cb_data; info.toks = toks; info.toks2 = &toks2; ipmi_domain_pointer_cb(domain_id, entity_finder_d, &info); if (!info.found) { if (ent_name[0] == 'r') cmd_win_out("Entity r%d.%d.%d.%d not found\n", info.channel, info.address, info.id, info.instance-0x60); else cmd_win_out("Entity %d.%d not found\n", info.id, info.instance); return EINVAL; } return 0; } static void entity_iterate_handler(ipmi_entity_t *o, ipmi_entity_t *entity, void *cb_data) { char name[33]; char loc[MAX_ENTITY_LOC_SIZE]; ipmi_entity_get_id(entity, name, 32); display_pad_out(" %s (%s)\n", get_entity_loc(entity, loc, sizeof(loc)), name); } static void entity_handler(ipmi_entity_t *entity, char **toks, char **toks2, void *cb_data) { char *present; char name[33]; char ename[IPMI_ENTITY_NAME_LEN]; char loc[MAX_ENTITY_LOC_SIZE]; enum ipmi_dlr_type_e type; static char *ent_types[] = { "unknown", "mc", "fru", "generic", "invalid" }; display_pad_clear(); type = ipmi_entity_get_type(entity); if (type > IPMI_ENTITY_GENERIC) type = IPMI_ENTITY_GENERIC + 1; curr_entity_id = ipmi_entity_convert_to_id(entity); ipmi_entity_get_id(entity, name, 32); if (ipmi_entity_is_present(entity)) present = "present"; else present = "not present"; display_pad_out("Entity %s (%s) %s\n", get_entity_loc(entity, loc, sizeof(loc)), name, present); ipmi_entity_get_name(entity, ename, sizeof(ename)); display_pad_out(" name = %s\n", ename); display_pad_out(" type = %s\n", ent_types[type]); display_pad_out(" entity id string = %s\n", ipmi_entity_get_entity_id_string(entity)); display_pad_out(" is%s fru\n", ipmi_entity_get_is_fru(entity) ? "" : " not"); display_pad_out(" present sensor%s always there\n", ipmi_entity_get_presence_sensor_always_there(entity) ? "" : " not"); if (ipmi_entity_get_is_child(entity)) { display_pad_out(" Parents:\n"); ipmi_entity_iterate_parents(entity, entity_iterate_handler, NULL); } if (ipmi_entity_get_is_parent(entity)) { display_pad_out(" Children:\n"); ipmi_entity_iterate_children(entity, entity_iterate_handler, NULL); } switch (type) { case IPMI_ENTITY_MC: display_pad_out(" channel = 0x%x\n", ipmi_entity_get_channel(entity)); display_pad_out(" lun = 0x%x\n", ipmi_entity_get_lun(entity)); display_pad_out(" oem = 0x%x\n", ipmi_entity_get_oem(entity)); display_pad_out(" slave_address = 0x%x\n", ipmi_entity_get_slave_address(entity)); display_pad_out(" ACPI_system_power_notify_required = 0x%x\n", ipmi_entity_get_ACPI_system_power_notify_required(entity)); display_pad_out(" ACPI_device_power_notify_required = 0x%x\n", ipmi_entity_get_ACPI_device_power_notify_required(entity)); display_pad_out(" controller_logs_init_agent_errors = 0x%x\n", ipmi_entity_get_controller_logs_init_agent_errors(entity)); display_pad_out(" log_init_agent_errors_accessing = 0x%x\n", ipmi_entity_get_log_init_agent_errors_accessing(entity)); display_pad_out(" global_init = 0x%x\n", ipmi_entity_get_global_init(entity)); display_pad_out(" chassis_device = 0x%x\n", ipmi_entity_get_chassis_device(entity)); display_pad_out(" bridge = 0x%x\n", ipmi_entity_get_bridge(entity)); display_pad_out(" IPMB_event_generator = 0x%x\n", ipmi_entity_get_IPMB_event_generator(entity)); display_pad_out(" IPMB_event_receiver = 0x%x\n", ipmi_entity_get_IPMB_event_receiver(entity)); display_pad_out(" FRU_inventory_device = 0x%x\n", ipmi_entity_get_FRU_inventory_device(entity)); display_pad_out(" SEL_device = 0x%x\n", ipmi_entity_get_SEL_device(entity)); display_pad_out(" SDR_repository_device = 0x%x\n", ipmi_entity_get_SDR_repository_device(entity)); display_pad_out(" sensor_device = 0x%x\n", ipmi_entity_get_sensor_device(entity)); break; case IPMI_ENTITY_FRU: display_pad_out(" channel = 0x%x\n", ipmi_entity_get_channel(entity)); display_pad_out(" lun = 0x%x\n", ipmi_entity_get_lun(entity)); display_pad_out(" oem = 0x%x\n", ipmi_entity_get_oem(entity)); display_pad_out(" access_address = 0x%x\n", ipmi_entity_get_access_address(entity)); display_pad_out(" private_bus_id = 0x%x\n", ipmi_entity_get_private_bus_id(entity)); display_pad_out(" device_type = 0x%x\n", ipmi_entity_get_device_type(entity)); display_pad_out(" device_modifier = 0x%x\n", ipmi_entity_get_device_modifier(entity)); display_pad_out(" is_logical_fru = 0x%x\n", ipmi_entity_get_is_logical_fru(entity)); display_pad_out(" fru_device_id = 0x%x\n", ipmi_entity_get_fru_device_id(entity)); break; case IPMI_ENTITY_GENERIC: display_pad_out(" channel = 0x%x\n", ipmi_entity_get_channel(entity)); display_pad_out(" lun = 0x%x\n", ipmi_entity_get_lun(entity)); display_pad_out(" oem = 0x%x\n", ipmi_entity_get_oem(entity)); display_pad_out(" access_address = 0x%x\n", ipmi_entity_get_access_address(entity)); display_pad_out(" private_bus_id = 0x%x\n", ipmi_entity_get_private_bus_id(entity)); display_pad_out(" device_type = 0x%x\n", ipmi_entity_get_device_type(entity)); display_pad_out(" device_modifier = 0x%x\n", ipmi_entity_get_device_modifier(entity)); display_pad_out(" slave_address = 0x%x\n", ipmi_entity_get_slave_address(entity)); display_pad_out(" address_span = 0x%x\n", ipmi_entity_get_address_span(entity)); break; default: break; } display_pad_refresh(); } int entity_cmd(char *cmd, char **toks, void *cb_data) { entity_finder(cmd, toks, entity_handler, NULL); curr_display_type = DISPLAY_ENTITY; return 0; } static void hs_get_act_time_cb(ipmi_entity_t *ent, int err, ipmi_timeout_t val, void *cb_data) { char loc[MAX_ENTITY_LOC_SIZE]; if (err) { ui_log("Could not get hot-swap act time: error 0x%x\n", err); return; } ui_log("Hot-swap activate time for %s is %lld\n", get_entity_loc(ent, loc, sizeof(loc)), val); } static void hs_get_act_time_handler(ipmi_entity_t *entity, char **toks, char **toks2, void *cb_data) { int rv; rv = ipmi_entity_get_auto_activate_time(entity, hs_get_act_time_cb, NULL); if (rv) cmd_win_out("Could not get auto-activate: error 0x%x\n", rv); } int hs_get_act_time(char *cmd, char **toks, void *cb_data) { entity_finder(cmd, toks, hs_get_act_time_handler, NULL); return 0; } static void hs_set_act_time_cb(ipmi_entity_t *ent, int err, void *cb_data) { if (err) ui_log("Could not get hot-swap act time: error 0x%x\n", err); else ui_log("hot-swap act time set\n"); } static void hs_set_act_time_handler(ipmi_entity_t *entity, char **toks, char **toks2, void *cb_data) { int rv; unsigned int timeout; if (get_uint(toks, &timeout, "Hot swap activate time")) return; rv = ipmi_entity_set_auto_activate_time(entity, timeout, hs_set_act_time_cb, NULL); if (rv) cmd_win_out("Could not set auto-activate: error 0x%x\n", rv); } int hs_set_act_time(char *cmd, char **toks, void *cb_data) { entity_finder(cmd, toks, hs_set_act_time_handler, NULL); return 0; } static void hs_get_deact_time_cb(ipmi_entity_t *ent, int err, ipmi_timeout_t val, void *cb_data) { char loc[MAX_ENTITY_LOC_SIZE]; if (err) { ui_log("Could not get hot-swap deact time: error 0x%x\n", err); return; } ui_log("Hot-swap deactivate time for %s is %lld\n", get_entity_loc(ent, loc, sizeof(loc)), val); } static void hs_get_deact_time_handler(ipmi_entity_t *entity, char **toks, char **toks2, void *cb_data) { int rv; rv = ipmi_entity_get_auto_deactivate_time(entity, hs_get_deact_time_cb, NULL); if (rv) cmd_win_out("Could not get auto-deactivate: error 0x%x\n", rv); } int hs_get_deact_time(char *cmd, char **toks, void *cb_data) { entity_finder(cmd, toks, hs_get_deact_time_handler, NULL); return 0; } static void hs_set_deact_time_cb(ipmi_entity_t *ent, int err, void *cb_data) { if (err) ui_log("Could not get hot-swap deact time: error 0x%x\n", err); else ui_log("hot-swap deact time set\n"); } static void hs_set_deact_time_handler(ipmi_entity_t *entity, char **toks, char **toks2, void *cb_data) { int rv; unsigned int timeout; if (get_uint(toks, &timeout, "Hot swap deactivate time")) return; rv = ipmi_entity_set_auto_deactivate_time(entity, timeout, hs_set_deact_time_cb, NULL); if (rv) cmd_win_out("Could not set auto-deactivate: error 0x%x\n", rv); } int hs_set_deact_time(char *cmd, char **toks, void *cb_data) { entity_finder(cmd, toks, hs_set_deact_time_handler, NULL); return 0; } static void hs_activation_request_cb(ipmi_entity_t *ent, int err, void *cb_data) { if (err) ui_log("Could not activate entity: error 0x%x\n", err); else ui_log("entity activated\n"); } static void hs_activation_request_handler(ipmi_entity_t *entity, char **toks, char **toks2, void *cb_data) { int rv; rv = ipmi_entity_set_activation_requested(entity, hs_activation_request_cb, NULL); if (rv) cmd_win_out("Could not set activation requested: error 0x%x\n", rv); } static int hs_activation_request(char *cmd, char **toks, void *cb_data) { entity_finder(cmd, toks, hs_activation_request_handler, NULL); return 0; } static void hs_activate_cb(ipmi_entity_t *ent, int err, void *cb_data) { if (err) ui_log("Could not activate entity: error 0x%x\n", err); else ui_log("entity activated\n"); } static void hs_activate_handler(ipmi_entity_t *entity, char **toks, char **toks2, void *cb_data) { int rv; rv = ipmi_entity_activate(entity, hs_activate_cb, NULL); if (rv) cmd_win_out("Could not activate entity: error 0x%x\n", rv); } int hs_activate(char *cmd, char **toks, void *cb_data) { entity_finder(cmd, toks, hs_activate_handler, NULL); return 0; } static void hs_deactivate_cb(ipmi_entity_t *ent, int err, void *cb_data) { if (err) ui_log("Could not deactivate entity: error 0x%x\n", err); else ui_log("entity deactivated\n"); } static void hs_deactivate_handler(ipmi_entity_t *entity, char **toks, char **toks2, void *cb_data) { int rv; rv = ipmi_entity_deactivate(entity, hs_deactivate_cb, NULL); if (rv) cmd_win_out("Could not deactivate entity: error 0x%x\n", rv); } int hs_deactivate(char *cmd, char **toks, void *cb_data) { entity_finder(cmd, toks, hs_deactivate_handler, NULL); return 0; } static void hs_state_cb(ipmi_entity_t *ent, int err, enum ipmi_hot_swap_states state, void *cb_data) { if (err) ui_log("Could not get hot-swap state: error 0x%x\n", err); else ui_log("Hot-swap state is %s\n", ipmi_hot_swap_state_name(state)); } static void hs_state_handler(ipmi_entity_t *entity, char **toks, char **toks2, void *cb_data) { int rv; rv = ipmi_entity_get_hot_swap_state(entity, hs_state_cb, NULL); if (rv) cmd_win_out("Could not get entity state: error 0x%x\n", rv); } int hs_state(char *cmd, char **toks, void *cb_data) { entity_finder(cmd, toks, hs_state_handler, NULL); return 0; } static void hs_check_ent(ipmi_entity_t *entity, void *cb_data) { ipmi_entity_check_hot_swap_state(entity); } static void hs_check_cmder(ipmi_domain_t *domain, void *cb_data) { ipmi_domain_iterate_entities(domain, hs_check_ent, NULL); } int hs_check_cmd(char *cmd, char **toks, void *cb_data) { int rv; rv = ipmi_domain_pointer_cb(domain_id, hs_check_cmder, NULL); if (rv) { cmd_win_out("Unable to convert domain id to a pointer\n"); return 0; } return 0; } static void sensors_handler(ipmi_entity_t *entity, ipmi_sensor_t *sensor, void *cb_data) { char name[33]; char name2[33]; char loc[MAX_ENTITY_LOC_SIZE]; ipmi_sensor_get_id(sensor, name, 33); strcpy(name2, name); conv_from_spaces(name2); display_pad_out(" %s.%s - %s\n", get_entity_loc(entity, loc, sizeof(loc)), name2, name); } static void found_entity_for_sensors(ipmi_entity_t *entity, char **toks, char **toks2, void *cb_data) { char loc[MAX_ENTITY_LOC_SIZE]; curr_display_type = DISPLAY_SENSORS; display_pad_clear(); display_pad_out("Sensors for entity %s:\n", get_entity_loc(entity, loc, sizeof(loc))); ipmi_entity_iterate_sensors(entity, sensors_handler, NULL); display_pad_refresh(); } int sensors_cmd(char *cmd, char **toks, void *cb_data) { entity_finder(cmd, toks, found_entity_for_sensors, NULL); return 0; } struct sensor_info { int found; char *name; }; /* Has this sensor been displayed yet? */ int sensor_displayed; /* Decrement whenever the sensor is not displayed and data is recevied, when this hits zero it's time to display. */ int sensor_ops_to_read_count; /* Return value from ipmi_states_get or ipmi_reading_get. */ int sensor_read_err; /* Values from ipmi_reading_get. */ enum ipmi_value_present_e sensor_value_present; unsigned int sensor_raw_val; double sensor_val; /* Values from ipmi_states_get and ipmi_reading_get. */ ipmi_states_t *sensor_states; /* Values from ipmi_sensor_event_enables_get. */ int sensor_event_states_err; ipmi_event_state_t *sensor_event_states; /* Values from ipmi_thresholds_get */ int sensor_read_thresh_err; ipmi_thresholds_t *sensor_thresholds; static void display_sensor(ipmi_entity_t *entity, ipmi_sensor_t *sensor) { char loc[MAX_ENTITY_LOC_SIZE]; char name[33]; char sname[IPMI_SENSOR_NAME_LEN]; int rv; if (sensor_displayed) return; sensor_ops_to_read_count--; if (sensor_ops_to_read_count > 0) return; sensor_displayed = 1; ipmi_sensor_get_name(sensor, sname, sizeof(sname)); ipmi_sensor_get_id(sensor, name, 33); display_pad_clear(); conv_from_spaces(name); display_pad_out("Sensor %s.%s:\n", get_entity_loc(entity, loc, sizeof(loc)), name); if (ipmi_sensor_get_ignore_if_no_entity(sensor)) display_pad_out(" ignore if entity not present\n"); else display_pad_out(" still there if entity not present\n"); display_pad_out(" name = %s\n", sname); display_pad_out(" value = "); getyx(display_pad, value_pos.y, value_pos.x); if (!ipmi_entity_is_present(entity) && ipmi_sensor_get_ignore_if_no_entity(sensor)) { display_pad_out("not present"); } else { if (sensor_read_err) { display_pad_out("unreadable"); } else if (ipmi_sensor_get_event_reading_type(sensor) == IPMI_EVENT_READING_TYPE_THRESHOLD) { if (sensor_value_present == IPMI_BOTH_VALUES_PRESENT) display_pad_out("%f (%2.2x)", sensor_val, sensor_raw_val); else if (sensor_value_present == IPMI_RAW_VALUE_PRESENT) display_pad_out("0x%x (RAW)", sensor_raw_val); else display_pad_out("unreadable"); } else { int i; for (i=0; i<15; i++) { int val; val = ipmi_is_state_set(sensor_states, i); display_pad_out("%d", val != 0); } } } display_pad_out("\n Events = "); getyx(display_pad, enabled_pos.y, enabled_pos.x); if (sensor_event_states_err) display_pad_out("? "); else { int global_enable; global_enable = ipmi_event_state_get_events_enabled (sensor_event_states); if (global_enable) display_pad_out("enabled"); else display_pad_out("disabled"); } display_pad_out("\n Scanning = "); getyx(display_pad, scanning_pos.y, scanning_pos.x); if (sensor_event_states_err) display_pad_out("? "); else { int scanning_enable; scanning_enable = ipmi_event_state_get_scanning_enabled (sensor_event_states); if (scanning_enable) display_pad_out("enabled"); else display_pad_out("disabled"); } display_pad_out("\n Hysteresis = "); switch (ipmi_sensor_get_hysteresis_support(sensor)) { case IPMI_HYSTERESIS_SUPPORT_NONE: display_pad_out("none"); break; case IPMI_HYSTERESIS_SUPPORT_READABLE: display_pad_out("readable"); break; case IPMI_HYSTERESIS_SUPPORT_SETTABLE: display_pad_out("settable"); break; case IPMI_HYSTERESIS_SUPPORT_FIXED: display_pad_out("fixed"); break; default: display_pad_out("invalid"); break; } display_pad_out("\n"); display_pad_out(" sensor type = %s (0x%2.2x)\n", ipmi_sensor_get_sensor_type_string(sensor), ipmi_sensor_get_sensor_type(sensor)); display_pad_out(" event/reading type = %s (0x%2.2x)\n", ipmi_sensor_get_event_reading_type_string(sensor), ipmi_sensor_get_event_reading_type(sensor)); if (ipmi_sensor_get_event_reading_type(sensor) == IPMI_EVENT_READING_TYPE_THRESHOLD) { enum ipmi_thresh_e t; double val; display_pad_out(" units = %s%s", ipmi_sensor_get_base_unit_string(sensor), ipmi_sensor_get_rate_unit_string(sensor)); switch(ipmi_sensor_get_modifier_unit_use(sensor)) { case IPMI_MODIFIER_UNIT_BASE_DIV_MOD: display_pad_out("/%s", ipmi_sensor_get_modifier_unit_string(sensor)); break; case IPMI_MODIFIER_UNIT_BASE_MULT_MOD: display_pad_out("*%s", ipmi_sensor_get_modifier_unit_string(sensor)); break; case IPMI_MODIFIER_UNIT_NONE: break; } display_pad_out("\n"); rv = ipmi_sensor_get_nominal_reading(sensor, &val); if (!rv) display_pad_out(" nominal = %f\n", val); rv = ipmi_sensor_get_normal_min(sensor, &val); if (!rv) display_pad_out(" normal_min = %f\n", val); rv = ipmi_sensor_get_normal_max(sensor, &val); if (!rv) display_pad_out(" normal_max = %f\n", val); rv = ipmi_sensor_get_sensor_min(sensor, &val); if (!rv) display_pad_out(" sensor_min = %f\n", val); rv = ipmi_sensor_get_sensor_max(sensor, &val); if (!rv) display_pad_out(" sensor_max = %f\n", val); display_pad_out("Thresholds:\n"); for (t=IPMI_LOWER_NON_CRITICAL; t<=IPMI_UPPER_NON_RECOVERABLE; t++){ int settable, readable; int i; int assert_sup[2], deassert_sup[2]; int anything_set = 0; ipmi_sensor_threshold_settable(sensor, t, &settable); anything_set |= settable; ipmi_sensor_threshold_readable(sensor, t, &readable); anything_set |= readable; for (i=0; i<=1; i++) { ipmi_sensor_threshold_event_supported( sensor, t, i, IPMI_ASSERTION, &(assert_sup[i])); anything_set |= assert_sup[i]; ipmi_sensor_threshold_event_supported( sensor, t, i, IPMI_DEASSERTION, &(deassert_sup[i])); anything_set |= deassert_sup[i]; } if (anything_set) { display_pad_out(" %s:", ipmi_get_threshold_string(t)); threshold_positions[t].set = 1; display_pad_out("\n available: "); if (readable) display_pad_out("R"); else display_pad_out(" "); if (settable) display_pad_out("W"); else display_pad_out(" "); if (assert_sup[0]) display_pad_out("L^"); else display_pad_out(" "); if (deassert_sup[0]) display_pad_out("Lv"); else display_pad_out(" "); if (assert_sup[1]) display_pad_out("H^"); else display_pad_out(" "); if (deassert_sup[1]) display_pad_out("Hv"); else display_pad_out(" "); display_pad_out("\n enabled: "); getyx(display_pad, threshold_positions[t].enabled.y, threshold_positions[t].enabled.x); if (sensor_event_states_err) display_pad_out("? "); else { if (ipmi_is_threshold_event_set(sensor_event_states, t, IPMI_GOING_LOW, IPMI_ASSERTION)) display_pad_out("L^"); else display_pad_out(" "); if (ipmi_is_threshold_event_set(sensor_event_states, t, IPMI_GOING_LOW, IPMI_DEASSERTION)) display_pad_out("Lv"); else display_pad_out(" "); if (ipmi_is_threshold_event_set(sensor_event_states, t, IPMI_GOING_HIGH, IPMI_ASSERTION)) display_pad_out("H^"); else display_pad_out(" "); if (ipmi_is_threshold_event_set(sensor_event_states, t, IPMI_GOING_HIGH, IPMI_DEASSERTION)) display_pad_out("HV"); else display_pad_out(" "); } display_pad_out("\n value: "); getyx(display_pad, threshold_positions[t].value.y, threshold_positions[t].value.x); if (sensor_read_thresh_err) display_pad_out("?"); else { double val; rv = ipmi_threshold_get(sensor_thresholds, t, &val); if (rv) display_pad_out("?", val); else display_pad_out("%f", val); } display_pad_out("\n out of range: "); getyx(display_pad, threshold_positions[t].oor.y, threshold_positions[t].oor.x); if (!sensor_read_err) { if (ipmi_is_threshold_out_of_range(sensor_states, t)) display_pad_out("true "); else display_pad_out("false"); } display_pad_out("\n"); } else { threshold_positions[t].set = 0; } } } else { int val; int i; /* A discrete sensor. */ display_pad_out("\n Assertion: "); display_pad_out("\n available: "); for (i=0; i<15; i++) { ipmi_sensor_discrete_event_supported(sensor, i, IPMI_ASSERTION, &val); display_pad_out("%d", val != 0); } display_pad_out("\n enabled: "); getyx(display_pad, discr_assert_enab.y, discr_assert_enab.x); if (sensor_event_states_err) display_pad_out("?"); else { for (i=0; i<15; i++) { val = ipmi_is_discrete_event_set(sensor_event_states, i, IPMI_ASSERTION); display_pad_out("%d", val != 0); } } display_pad_out("\n Deasertion: "); display_pad_out("\n available: "); for (i=0; i<15; i++) { ipmi_sensor_discrete_event_supported(sensor, i, IPMI_DEASSERTION, &val); display_pad_out("%d", val != 0); } display_pad_out("\n enabled: "); getyx(display_pad, discr_deassert_enab.y, discr_deassert_enab.x); if (sensor_event_states_err) display_pad_out("?"); else { for (i=0; i<15; i++) { val = ipmi_is_discrete_event_set(sensor_event_states, i, IPMI_DEASSERTION); display_pad_out("%d", val != 0); } } display_pad_out("\n"); } display_pad_refresh(); } static void read_sensor(ipmi_sensor_t *sensor, int err, enum ipmi_value_present_e value_present, unsigned int raw_val, double val, ipmi_states_t *states, void *cb_data) { ipmi_sensor_id_t sensor_id; enum ipmi_thresh_e t; if (err) { if (sensor_displayed) { wmove(display_pad, value_pos.y, value_pos.x); display_pad_out("unreadable: %x", err); display_pad_refresh(); } else { curr_display_type = DISPLAY_NONE; } return; } sensor_id = ipmi_sensor_convert_to_id(sensor); if (!((curr_display_type == DISPLAY_SENSOR) && (ipmi_cmp_sensor_id(sensor_id, curr_sensor_id) == 0))) return; if (sensor_displayed) { wmove(display_pad, value_pos.y, value_pos.x); if (value_present == IPMI_BOTH_VALUES_PRESENT) display_pad_out("%f (%2.2x)", val, raw_val); else if (value_present == IPMI_RAW_VALUE_PRESENT) display_pad_out("0x%x (RAW)", raw_val); else display_pad_out("unreadable"); for (t=IPMI_LOWER_NON_CRITICAL; t<=IPMI_UPPER_NON_RECOVERABLE; t++) { if (threshold_positions[t].set) { wmove(display_pad, threshold_positions[t].oor.y, threshold_positions[t].oor.x); if (ipmi_is_threshold_out_of_range(states, t)) display_pad_out("true "); else display_pad_out("false"); } } display_pad_refresh(); } else { sensor_read_err = err; sensor_value_present = value_present; sensor_raw_val = raw_val; sensor_val = val; if (states) ipmi_copy_states(sensor_states, states); display_sensor(ipmi_sensor_get_entity(sensor), sensor); } } static void read_thresholds(ipmi_sensor_t *sensor, int err, ipmi_thresholds_t *th, void *cb_data) { ipmi_sensor_id_t sensor_id; enum ipmi_thresh_e t; double val; int rv; sensor_id = ipmi_sensor_convert_to_id(sensor); if (!((curr_display_type == DISPLAY_SENSOR) && (ipmi_cmp_sensor_id(sensor_id, curr_sensor_id) == 0))) return; if (sensor_displayed) { if (err) { for (t=IPMI_LOWER_NON_CRITICAL; t<=IPMI_UPPER_NON_RECOVERABLE; t++) { if (threshold_positions[t].set) { wmove(display_pad, threshold_positions[t].value.y, threshold_positions[t].value.x); display_pad_out("?"); } } } else { for (t=IPMI_LOWER_NON_CRITICAL; t<=IPMI_UPPER_NON_RECOVERABLE; t++) { if (threshold_positions[t].set) { rv = ipmi_threshold_get(th, t, &val); wmove(display_pad, threshold_positions[t].value.y, threshold_positions[t].value.x); if (rv) display_pad_out("?", val); else display_pad_out("%f", val); } } } display_pad_refresh(); } else { sensor_read_thresh_err = err; if (th) ipmi_copy_thresholds(sensor_thresholds, th); display_sensor(ipmi_sensor_get_entity(sensor), sensor); } } static void read_thresh_event_enables(ipmi_sensor_t *sensor, int err, ipmi_event_state_t *states, void *cb_data) { ipmi_sensor_id_t sensor_id; enum ipmi_thresh_e t; int global_enable; int scanning_enable; sensor_id = ipmi_sensor_convert_to_id(sensor); if (!((curr_display_type == DISPLAY_SENSOR) && (ipmi_cmp_sensor_id(sensor_id, curr_sensor_id) == 0))) return; if (sensor_displayed) { if (err) return; global_enable = ipmi_event_state_get_events_enabled(states); scanning_enable = ipmi_event_state_get_scanning_enabled(states); wmove(display_pad, enabled_pos.y, enabled_pos.x); if (err) display_pad_out("? "); else if (global_enable) display_pad_out("enabled"); else display_pad_out("disabled"); wmove(display_pad, scanning_pos.y, scanning_pos.x); if (err) display_pad_out("? "); else if (scanning_enable) display_pad_out("enabled"); else display_pad_out("disabled"); if (ipmi_sensor_get_event_support(sensor) != IPMI_EVENT_SUPPORT_PER_STATE) goto out; for (t=IPMI_LOWER_NON_CRITICAL; t<=IPMI_UPPER_NON_RECOVERABLE; t++) { if (threshold_positions[t].set) { wmove(display_pad, threshold_positions[t].enabled.y, threshold_positions[t].enabled.x); if (err) { display_pad_out("? "); continue; } display_pad_out(" "); if (ipmi_is_threshold_event_set(states, t, IPMI_GOING_LOW, IPMI_ASSERTION)) display_pad_out("L^"); else display_pad_out(" "); if (ipmi_is_threshold_event_set(states, t, IPMI_GOING_LOW, IPMI_DEASSERTION)) display_pad_out("Lv"); else display_pad_out(" "); if (ipmi_is_threshold_event_set(states, t, IPMI_GOING_HIGH, IPMI_ASSERTION)) display_pad_out("H^"); else display_pad_out(" "); if (ipmi_is_threshold_event_set(states, t, IPMI_GOING_HIGH, IPMI_DEASSERTION)) display_pad_out("HV"); else display_pad_out(" "); } } out: display_pad_refresh(); } else { sensor_event_states_err = err; if (states) ipmi_copy_event_state(sensor_event_states, states); display_sensor(ipmi_sensor_get_entity(sensor), sensor); } } static void read_discrete_event_enables(ipmi_sensor_t *sensor, int err, ipmi_event_state_t *states, void *cb_data) { ipmi_sensor_id_t sensor_id; int i; int val; int global_enable; int scanning_enable; sensor_id = ipmi_sensor_convert_to_id(sensor); if (!((curr_display_type == DISPLAY_SENSOR) && (ipmi_cmp_sensor_id(sensor_id, curr_sensor_id) == 0))) return; if (sensor_displayed) { global_enable = ipmi_event_state_get_events_enabled(states); scanning_enable = ipmi_event_state_get_scanning_enabled(states); wmove(display_pad, enabled_pos.y, enabled_pos.x); if (err) display_pad_out("? "); else if (global_enable) display_pad_out("enabled"); else display_pad_out("disabled"); wmove(display_pad, scanning_pos.y, scanning_pos.x); if (err) display_pad_out("? "); else if (scanning_enable) display_pad_out("enabled"); else display_pad_out("disabled"); if (ipmi_sensor_get_event_support(sensor) != IPMI_EVENT_SUPPORT_PER_STATE) goto out; if (err) { wmove(display_pad, discr_assert_enab.y, discr_assert_enab.x); display_pad_out("?"); wmove(display_pad, discr_deassert_enab.y, discr_deassert_enab.x); display_pad_out("?"); } else { wmove(display_pad, discr_assert_enab.y, discr_assert_enab.x); for (i=0; i<15; i++) { val = ipmi_is_discrete_event_set(states, i, IPMI_ASSERTION); display_pad_out("%d", val != 0); } wmove(display_pad, discr_deassert_enab.y, discr_deassert_enab.x); for (i=0; i<15; i++) { val = ipmi_is_discrete_event_set(states, i, IPMI_DEASSERTION); display_pad_out("%d", val != 0); } } out: display_pad_refresh(); } else { sensor_event_states_err = err; if (states) ipmi_copy_event_state(sensor_event_states, states); display_sensor(ipmi_sensor_get_entity(sensor), sensor); } } static void read_states(ipmi_sensor_t *sensor, int err, ipmi_states_t *states, void *cb_data) { ipmi_sensor_id_t sensor_id; int i; int val; sensor_id = ipmi_sensor_convert_to_id(sensor); if (!((curr_display_type == DISPLAY_SENSOR) && (ipmi_cmp_sensor_id(sensor_id, curr_sensor_id) == 0))) return; if (sensor_displayed) { wmove(display_pad, value_pos.y, value_pos.x); if (err) { display_pad_out("?"); } else { for (i=0; i<15; i++) { val = ipmi_is_state_set(states, i); display_pad_out("%d", val != 0); } } display_pad_refresh(); } else { sensor_read_err = err; if (states) ipmi_copy_states(sensor_states, states); display_sensor(ipmi_sensor_get_entity(sensor), sensor); } } static void redisplay_sensor(ipmi_sensor_t *sensor, void *cb_data) { int rv; ipmi_entity_t *entity; entity = ipmi_sensor_get_entity(sensor); if (!entity) return; if (!ipmi_entity_is_present(entity) && ipmi_sensor_get_ignore_if_no_entity(sensor)) { wmove(display_pad, value_pos.y, value_pos.x); display_pad_out("not present"); return; } if (ipmi_sensor_get_event_reading_type(sensor) == IPMI_EVENT_READING_TYPE_THRESHOLD) { rv = ipmi_sensor_get_reading(sensor, read_sensor, NULL); if (rv) ui_log("redisplay_sensor: Unable to get sensor reading: 0x%x\n", rv); switch (ipmi_sensor_get_threshold_access(sensor)) { case IPMI_THRESHOLD_ACCESS_SUPPORT_READABLE: case IPMI_THRESHOLD_ACCESS_SUPPORT_SETTABLE: rv = ipmi_sensor_get_thresholds(sensor, read_thresholds, NULL); if (rv) ui_log("Unable to get threshold values: 0x%x\n", rv); break; default: break; } switch (ipmi_sensor_get_event_support(sensor)) { case IPMI_EVENT_SUPPORT_PER_STATE: case IPMI_EVENT_SUPPORT_ENTIRE_SENSOR: rv = ipmi_sensor_get_event_enables(sensor, read_thresh_event_enables, NULL); if (rv) ui_log("Unable to get event values: 0x%x\n", rv); break; default: break; } } else { rv = ipmi_sensor_get_states(sensor, read_states, NULL); if (rv) ui_log("Unable to get sensor reading: 0x%x\n", rv); switch (ipmi_sensor_get_event_support(sensor)) { case IPMI_EVENT_SUPPORT_PER_STATE: case IPMI_EVENT_SUPPORT_ENTIRE_SENSOR: rv = ipmi_sensor_get_event_enables(sensor, read_discrete_event_enables, NULL); if (rv) ui_log("Unable to get event values: 0x%x\n", rv); break; default: break; } } } static void sensor_handler(ipmi_entity_t *entity, ipmi_sensor_t *sensor, void *cb_data) { char name[33]; struct sensor_info *sinfo = cb_data; int rv; int present = 1; ipmi_sensor_get_id(sensor, name, 33); if (strcmp(name, sinfo->name) == 0) { sinfo->found = 1; curr_display_type = DISPLAY_SENSOR; curr_sensor_id = ipmi_sensor_convert_to_id(sensor); sensor_displayed = 0; sensor_ops_to_read_count = 1; if (! ipmi_entity_is_present(entity) && ipmi_sensor_get_ignore_if_no_entity(sensor)) { present = 0; } if (ipmi_sensor_get_event_reading_type(sensor) == IPMI_EVENT_READING_TYPE_THRESHOLD) { if (present) { sensor_ops_to_read_count++; rv = ipmi_sensor_get_reading(sensor, read_sensor, NULL); if (rv) ui_log("Unable to get sensor reading: 0x%x\n", rv); switch (ipmi_sensor_get_threshold_access(sensor)) { case IPMI_THRESHOLD_ACCESS_SUPPORT_READABLE: case IPMI_THRESHOLD_ACCESS_SUPPORT_SETTABLE: sensor_ops_to_read_count++; rv = ipmi_sensor_get_thresholds(sensor, read_thresholds, NULL); if (rv) ui_log("Unable to get threshold values: 0x%x\n", rv); break; default: break; } switch (ipmi_sensor_get_event_support(sensor)) { case IPMI_EVENT_SUPPORT_PER_STATE: case IPMI_EVENT_SUPPORT_ENTIRE_SENSOR: sensor_ops_to_read_count++; rv = ipmi_sensor_get_event_enables (sensor, read_thresh_event_enables, NULL); if (rv) ui_log("Unable to get event values: 0x%x\n", rv); break; default: break; } } } else { if (present) { sensor_ops_to_read_count++; rv = ipmi_sensor_get_states(sensor, read_states, NULL); if (rv) ui_log("Unable to get sensor reading: 0x%x\n", rv); switch (ipmi_sensor_get_event_support(sensor)) { case IPMI_EVENT_SUPPORT_PER_STATE: case IPMI_EVENT_SUPPORT_ENTIRE_SENSOR: sensor_ops_to_read_count++; rv = ipmi_sensor_get_event_enables (sensor, read_discrete_event_enables, NULL); if (rv) ui_log("Unable to get event values: 0x%x\n", rv); break; default: break; } } } display_sensor(entity, sensor); display_pad_refresh(); } } static void found_entity_for_sensor(ipmi_entity_t *entity, char **toks, char **toks2, void *cb_data) { struct sensor_info sinfo; sinfo.name = strtok_r(NULL, "", toks2); if (!sinfo.name) { cmd_win_out("Invalid sensor given\n"); return; } conv_to_spaces(sinfo.name); sinfo.found = 0; ipmi_entity_iterate_sensors(entity, sensor_handler, &sinfo); if (!sinfo.found) { char loc[MAX_ENTITY_LOC_SIZE]; conv_from_spaces(sinfo.name); cmd_win_out("Sensor %s.%s not found\n", get_entity_loc(entity, loc, sizeof(loc)), sinfo.name); return; } } int sensor_cmd(char *cmd, char **toks, void *cb_data) { entity_finder(cmd, toks, found_entity_for_sensor, NULL); return 0; } typedef struct events_enable_info_s { ipmi_event_state_t *states; } events_enable_info_t; void events_enable_done(ipmi_sensor_t *sensor, int err, void *cb_data) { if (err) ui_log("Error setting events enable: 0x%x", err); } static void events_enable(ipmi_sensor_t *sensor, void *cb_data) { events_enable_info_t *info = cb_data; int rv; rv = ipmi_sensor_set_event_enables(sensor, info->states, events_enable_done, NULL); if (rv) ui_log("Error sending events enable: 0x%x", rv); ipmi_mem_free(info); } static int events_enable_cmd(char *cmd, char **toks, void *cb_data) { events_enable_info_t *info; unsigned char enable; int i; char *enptr; int rv; info = ipmi_mem_alloc(sizeof(*info)); if (!info) { cmd_win_out("Out of memory\n"); return 0; } info->states = ipmi_mem_alloc(ipmi_event_state_size()); if (!info->states) { ipmi_mem_free(info); cmd_win_out("Out of memory\n"); return 0; } ipmi_event_state_init(info->states); if (get_uchar(toks, &enable, "events")) return 0; ipmi_event_state_set_events_enabled(info->states, enable); if (get_uchar(toks, &enable, "scanning")) return 0; ipmi_event_state_set_scanning_enabled(info->states, enable); enptr = strtok_r(NULL, " \t\n", toks); if (!enptr) { cmd_win_out("No assertion mask given\n"); return 0; } for (i=0; enptr[i]!='\0'; i++) { if (enptr[i] == '1') ipmi_discrete_event_set(info->states, i, IPMI_ASSERTION); else if (enptr[i] == '0') ipmi_discrete_event_clear(info->states, i, IPMI_ASSERTION); else { cmd_win_out("Invalid assertion value\n"); return 0; } } enptr = strtok_r(NULL, " \t\n", toks); if (!enptr) { cmd_win_out("No deassertion mask given\n"); return 0; } for (i=0; enptr[i]!='\0'; i++) { if (enptr[i] == '1') ipmi_discrete_event_set(info->states, i, IPMI_DEASSERTION); else if (enptr[i] == '0') ipmi_discrete_event_clear(info->states, i, IPMI_DEASSERTION); else { cmd_win_out("Invalid deassertion value\n"); return 0; } } rv = ipmi_sensor_pointer_cb(curr_sensor_id, events_enable, info); if (rv) { cmd_win_out("Unable to get sensor pointer: 0x%x\n", rv); ipmi_mem_free(info); } return 0; } static void controls_handler(ipmi_entity_t *entity, ipmi_control_t *control, void *cb_data) { char loc[MAX_ENTITY_LOC_SIZE]; char name[33]; char name2[33]; ipmi_control_get_id(control, name, 33); strcpy(name2, name); conv_from_spaces(name2); display_pad_out(" %s.%s - %s\n", get_entity_loc(entity, loc, sizeof(loc)), name2, name); } static void found_entity_for_controls(ipmi_entity_t *entity, char **toks, char **toks2, void *cb_data) { char loc[MAX_ENTITY_LOC_SIZE]; curr_display_type = DISPLAY_CONTROLS; display_pad_clear(); display_pad_out("Controls for entity %s:\n", get_entity_loc(entity, loc, sizeof(loc))); ipmi_entity_iterate_controls(entity, controls_handler, NULL); display_pad_refresh(); } static int controls_cmd(char *cmd, char **toks, void *cb_data) { entity_finder(cmd, toks, found_entity_for_controls, NULL); return 0; } int control_displayed; int control_ops_to_read_count; int control_read_err; int *normal_control_vals; ipmi_light_setting_t *light_control_val; int id_control_length; unsigned char *id_control_vals; static void display_control(ipmi_entity_t *entity, ipmi_control_t *control) { char loc[MAX_ENTITY_LOC_SIZE]; int control_type; char name[33]; char cname[IPMI_CONTROL_NAME_LEN]; int i; int num_vals; if (control_displayed) return; control_ops_to_read_count--; if (control_ops_to_read_count > 0) return; control_displayed = 1; ipmi_control_get_id(control, name, 33); curr_control_id = ipmi_control_convert_to_id(control); display_pad_clear(); conv_from_spaces(name); display_pad_out("Control %s.%s:\n", get_entity_loc(entity, loc, sizeof(loc)), name); if (ipmi_control_get_ignore_if_no_entity(control)) display_pad_out(" ignore if entity not present\n"); else display_pad_out(" still there if entity not present\n"); ipmi_control_get_name(control, cname, sizeof(cname)); display_pad_out(" name = %s\n", cname); control_type = ipmi_control_get_type(control); display_pad_out(" type = %s (%d)\n", ipmi_control_get_type_string(control), control_type); num_vals = ipmi_control_get_num_vals(control); switch (control_type) { case IPMI_CONTROL_LIGHT: case IPMI_CONTROL_RELAY: case IPMI_CONTROL_ALARM: case IPMI_CONTROL_RESET: case IPMI_CONTROL_ONE_SHOT_RESET: case IPMI_CONTROL_POWER: case IPMI_CONTROL_FAN_SPEED: case IPMI_CONTROL_OUTPUT: case IPMI_CONTROL_ONE_SHOT_OUTPUT: display_pad_out(" num entities = %d\n", num_vals); break; case IPMI_CONTROL_DISPLAY: case IPMI_CONTROL_IDENTIFIER: break; } display_pad_out(" value = "); getyx(display_pad, value_pos.y, value_pos.x); if (! ipmi_control_is_readable(control)) { display_pad_out("not readable"); } else if (control_read_err) { /* Nothing to do. */ } else { switch (control_type) { case IPMI_CONTROL_LIGHT: if (ipmi_control_light_set_with_setting(control)) { if (light_control_val) { ipmi_light_setting_t *setting = light_control_val; for (i=0; iname) == 0) { iinfo->found = 1; curr_display_type = DISPLAY_CONTROL; curr_control_id = ipmi_control_convert_to_id(control); control_ops_to_read_count = 1; control_displayed = 0; if (! ipmi_control_is_readable(control)) { /* If the control can't be read, then just display it now. */ display_control(entity, control); return; } control_type = ipmi_control_get_type(control); switch (control_type) { case IPMI_CONTROL_LIGHT: if (ipmi_control_light_set_with_setting(control)) { control_ops_to_read_count++; rv = ipmi_control_get_light(control, light_control_val_read, NULL); if (rv) { ui_log("Unable to read light control val: 0x%x\n", rv); } break; } /* FALLTHRU */ case IPMI_CONTROL_RELAY: case IPMI_CONTROL_ALARM: case IPMI_CONTROL_RESET: case IPMI_CONTROL_ONE_SHOT_RESET: case IPMI_CONTROL_POWER: case IPMI_CONTROL_FAN_SPEED: case IPMI_CONTROL_OUTPUT: case IPMI_CONTROL_ONE_SHOT_OUTPUT: control_ops_to_read_count++; rv = ipmi_control_get_val(control, normal_control_val_read, NULL); if (rv) { ui_log("Unable to read control val: 0x%x\n", rv); } break; case IPMI_CONTROL_DISPLAY: break; case IPMI_CONTROL_IDENTIFIER: control_ops_to_read_count++; rv = ipmi_control_identifier_get_val(control, identifier_control_val_read, NULL); if (rv) { ui_log("Unable to read control val: 0x%x\n", rv); } break; } display_control(entity, control); } } static void found_entity_for_control(ipmi_entity_t *entity, char **toks, char **toks2, void *cb_data) { struct control_info iinfo; iinfo.name = strtok_r(NULL, "", toks2); if (!iinfo.name) { cmd_win_out("Invalid control given\n"); return; } conv_to_spaces(iinfo.name); iinfo.found = 0; ipmi_entity_iterate_controls(entity, control_handler, &iinfo); if (!iinfo.found) { char loc[MAX_ENTITY_LOC_SIZE]; conv_from_spaces(iinfo.name); cmd_win_out("Control %s.%s not found\n", get_entity_loc(entity, loc, sizeof(loc)), iinfo.name); return; } } int control_cmd(char *cmd, char **toks, void *cb_data) { entity_finder(cmd, toks, found_entity_for_control, NULL); return 0; } typedef struct rearm_info_s { int global; ipmi_event_state_t *states; } rearm_info_t; void rearm_done(ipmi_sensor_t *sensor, int err, void *cb_data) { if (err) ui_log("Error rearming sensor: 0x%x", err); } static void rearm(ipmi_sensor_t *sensor, void *cb_data) { rearm_info_t *info = cb_data; int rv; rv = ipmi_sensor_rearm(sensor, info->global, info->states, rearm_done, NULL); if (rv) ui_log("Error sending rearm: 0x%x", rv); if (info->states) ipmi_mem_free(info->states); ipmi_mem_free(info); } static int rearm_cmd(char *cmd, char **toks, void *cb_data) { rearm_info_t *info; unsigned char global; int i; char *enptr; int rv; info = ipmi_mem_alloc(sizeof(*info)); if (!info) { cmd_win_out("Out of memory\n"); return 0; } info->states = NULL; if (get_uchar(toks, &global, "global rearm")) goto out_err; info->global = global; if (!global) { info->states = ipmi_mem_alloc(ipmi_event_state_size()); if (!info->states) { ipmi_mem_free(info); cmd_win_out("Out of memory\n"); goto out_err; } ipmi_event_state_init(info->states); enptr = strtok_r(NULL, " \t\n", toks); if (!enptr) { cmd_win_out("No assertion mask given\n"); goto out_err; } for (i=0; enptr[i]!='\0'; i++) { if (enptr[i] == '1') ipmi_discrete_event_set(info->states, i, IPMI_ASSERTION); else if (enptr[i] == '0') ipmi_discrete_event_clear(info->states, i, IPMI_ASSERTION); else { cmd_win_out("Invalid assertion value\n"); goto out_err; } } enptr = strtok_r(NULL, " \t\n", toks); if (!enptr) { cmd_win_out("No deassertion mask given\n"); return 0; } for (i=0; enptr[i]!='\0'; i++) { if (enptr[i] == '1') ipmi_discrete_event_set(info->states, i, IPMI_DEASSERTION); else if (enptr[i] == '0') ipmi_discrete_event_clear(info->states, i, IPMI_DEASSERTION); else { cmd_win_out("Invalid deassertion value\n"); goto out_err; } } } rv = ipmi_sensor_pointer_cb(curr_sensor_id, rearm, info); if (rv) { cmd_win_out("Unable to get sensor pointer: 0x%x\n", rv); goto out_err; } return 0; out_err: if (info) { if (info->states) ipmi_mem_free(info->states); ipmi_mem_free(info); } return 0; } void set_hysteresis_done(ipmi_sensor_t *sensor, int err, void *cb_data) { if (err) ui_log("Error setting hysteresis: 0x%x", err); else ui_log("Hysteresis set"); } static int set_hysteresis_cmd(char *cmd, char **toks, void *cb_data) { unsigned char physt, nhyst; int rv; if (get_uchar(toks, &physt, "positive hysteresis value")) goto out_err; if (get_uchar(toks, &nhyst, "negative hysteresis value")) goto out_err; rv = ipmi_sensor_id_set_hysteresis(curr_sensor_id, physt, nhyst, set_hysteresis_done, NULL); if (rv) { cmd_win_out("Unable to set hysteresis: 0x%x\n", rv); goto out_err; } out_err: return 0; } void get_hysteresis_done(ipmi_sensor_t *sensor, int err, unsigned int positive_hysteresis, unsigned int negative_hysteresis, void *cb_data) { if (err) ui_log("Error setting hysteresis: 0x%x", err); else ui_log("Hysteresis values: positive = 0x%x, negative = 0x%x", positive_hysteresis, negative_hysteresis); } static int get_hysteresis_cmd(char *cmd, char **toks, void *cb_data) { int rv; rv = ipmi_sensor_id_get_hysteresis(curr_sensor_id, get_hysteresis_done, NULL); if (rv) { cmd_win_out("Unable to get hysteresis: 0x%x\n", rv); goto out_err; } out_err: return 0; } static int dump_fru_str(ipmi_fru_t *fru, char *str, int (*glen)(ipmi_fru_t *fru, unsigned int *length), int (*gtype)(ipmi_fru_t *fru, enum ipmi_str_type_e *type), int (*gstr)(ipmi_fru_t *fru, char *str, unsigned int *strlen)) { enum ipmi_str_type_e type; int rv; char buf[128]; unsigned int len; rv = gtype(fru, &type); if (rv) { if (rv != ENOSYS) display_pad_out(" Error fetching type for %s: %x\n", str, rv); return rv; } if (type == IPMI_BINARY_STR) { display_pad_out(" %s is in binary\n", str); return 0; } else if (type == IPMI_UNICODE_STR) { display_pad_out(" %s is in unicode\n", str); return 0; } else if (type != IPMI_ASCII_STR) { display_pad_out(" %s is in unknown format\n", str); return 0; } len = sizeof(buf); rv = gstr(fru, buf, &len); if (rv) { display_pad_out(" Error fetching string for %s: %x\n", str, rv); return rv; } display_pad_out(" %s: %s\n", str, buf); return 0; } static int dump_fru_custom_str(ipmi_fru_t *fru, char *str, int num, int (*glen)(ipmi_fru_t *fru, unsigned int num, unsigned int *length), int (*gtype)(ipmi_fru_t *fru, unsigned int num, enum ipmi_str_type_e *type), int (*gstr)(ipmi_fru_t *fru, unsigned int num, char *str, unsigned int *strlen)) { enum ipmi_str_type_e type; int rv; char buf[128]; unsigned int len; rv = gtype(fru, num, &type); if (rv) return rv; if (type == IPMI_BINARY_STR) { display_pad_out(" %s custom %d is in binary\n", str, num); return 0; } else if (type == IPMI_UNICODE_STR) { display_pad_out(" %s custom %d is in unicode\n", str, num); return 0; } else if (type != IPMI_ASCII_STR) { display_pad_out(" %s custom %d is in unknown format\n", str, num); return 0; } len = sizeof(buf); rv = gstr(fru, num, buf, &len); if (rv) { display_pad_out(" Error fetching string for %s custom %d: %x\n", str, num, rv); return rv; } display_pad_out(" %s custom %d: %s\n", str, num, buf); return 0; } #define DUMP_FRU_STR(name, str) \ dump_fru_str(fru, str, ipmi_fru_get_ ## name ## _len, \ ipmi_fru_get_ ## name ## _type, \ ipmi_fru_get_ ## name) #define DUMP_FRU_CUSTOM_STR(name, str) \ do { \ int i, _rv; \ for (i=0; ; i++) { \ _rv = dump_fru_custom_str(fru, str, i, \ ipmi_fru_get_ ## name ## _custom_len, \ ipmi_fru_get_ ## name ## _custom_type, \ ipmi_fru_get_ ## name ## _custom); \ if (_rv) \ break; \ } \ } while (0) static int traverse_fru_multi_record_tree(ipmi_fru_node_t *node, int indent) { const char *name; unsigned int i, k; enum ipmi_fru_data_type_e dtype; int intval, rv; double floatval; time_t time; char *data; unsigned int data_len; ipmi_fru_node_t *sub_node; for (i=0; ; i++) { rv = ipmi_fru_node_get_field(node, i, &name, &dtype, &intval, &time, &floatval, &data, &data_len, &sub_node); if ((rv == EINVAL) || (rv == ENOSYS)) break; else if (rv) continue; if (name) display_pad_out("%*sName: %s \n", indent, "", name); else /* An array index. */ display_pad_out("%*%d: \n", indent, "", i); switch (dtype) { case IPMI_FRU_DATA_INT: display_pad_out("%*sType: integer\n", indent, ""); display_pad_out("%*sData: %d\n", indent, "", intval); break; case IPMI_FRU_DATA_TIME: display_pad_out("%*sType: time\n", indent, ""); display_pad_out("%*sData: %ld\n", indent, "", (long)time); break; case IPMI_FRU_DATA_BOOLEAN: display_pad_out("%*sType: boolean\n", indent, ""); display_pad_out("%*sData: %ls\n", indent, "", intval ? "true" : "false"); break; case IPMI_FRU_DATA_FLOAT: display_pad_out("%*sType: float\n", indent, ""); display_pad_out("%*sData: %lf\n", indent, "", floatval); break; case IPMI_FRU_DATA_BINARY: display_pad_out("%*sType: binary\n", indent, ""); display_pad_out("%*sData:", indent, ""); for(k=0; k 0) && ((j % 16) == 0)) display_pad_out("\n "); display_pad_out(" %2.2x", data[j]); } display_pad_out("\n"); rv = ipmi_fru_multi_record_get_root_node(fru, i, &name, &node); if ( !rv ) { display_pad_out("Multi-record decode: %s", name); traverse_fru_multi_record_tree(node, 2); } else if ((rv != ENOSYS) && (rv != EINVAL)) { display_pad_out(" multi-record %d, error get root obj: %x\n ", i, rv); } } ipmi_mem_free(data); } } static void found_entity_for_fru(ipmi_entity_t *entity, char **toks, char **toks2, void *cb_data) { char loc[MAX_ENTITY_LOC_SIZE]; ipmi_fru_t *fru = ipmi_entity_get_fru(entity); display_pad_clear(); if (!fru) { cmd_win_out("No FRU for entity %s\n", get_entity_loc(entity, loc, sizeof(loc))); return; } display_pad_out("FRU for entity %s\n", get_entity_loc(entity, loc, sizeof(loc))); dump_fru_info(fru); display_pad_refresh(); } static int fru_cmd(char *cmd, char **toks, void *cb_data) { entity_finder(cmd, toks, found_entity_for_fru, NULL); curr_display_type = DISPLAY_ENTITY; return 0; } static void fru_fetched(ipmi_fru_t *fru, int err, void *cb_data) { display_pad_clear(); if (err) display_pad_out("Error fetching fru: %x\n", err); else dump_fru_info(fru); display_pad_refresh(); if (err != ECANCELED) ipmi_fru_destroy(fru, NULL, NULL); } typedef struct fru_rec_s { unsigned char is_logical; unsigned char device_address; unsigned char device_id; unsigned char lun; unsigned char private_bus; unsigned char channel; } fru_rec_t; static void dump_fru_cmder(ipmi_domain_t *domain, void *cb_data) { fru_rec_t *info = cb_data; int rv; rv = ipmi_fru_alloc(domain, info->is_logical, info->device_address, info->device_id, info->lun, info->private_bus, info->channel, fru_fetched, NULL, NULL); if (rv) cmd_win_out("Unable to allocate fru: %x\n", rv); } static int dump_fru_cmd(char *cmd, char **toks, void *cb_data) { int rv; fru_rec_t info; if (get_uchar(toks, &info.is_logical, "is_logical")) return 0; if (get_uchar(toks, &info.device_address, "device_address")) return 0; if (get_uchar(toks, &info.device_id, "device_id")) return 0; if (get_uchar(toks, &info.lun, "lun")) return 0; if (get_uchar(toks, &info.private_bus, "private_bus")) return 0; if (get_uchar(toks, &info.channel, "channel")) return 0; rv = ipmi_domain_pointer_cb(domain_id, dump_fru_cmder, &info); if (rv) cmd_win_out("Unable to convert domain id to a pointer\n"); else curr_display_type = DISPLAY_ENTITY; return 0; } static char y_or_n(int val) { if (val) return 'y'; else return 'n'; } #define MCCMD_DATA_SIZE 30 typedef struct mccmd_info_s { ipmi_mcid_t mc_id; unsigned char lun; ipmi_msg_t msg; int found; unsigned char val; } mccmd_info_t; void mc_handler(ipmi_mc_t *mc, void *cb_data) { unsigned char vals[4]; mccmd_info_t *info = cb_data; curr_display_type = DISPLAY_MC; info->found = 1; display_pad_clear(); display_pad_out("MC (%x %x) - %s\n", ipmi_mc_get_channel(mc), ipmi_mc_get_address(mc), ipmi_mc_is_active(mc) ? "active" : "inactive"); display_pad_out(" provides_device_sdrs: %c\n", y_or_n(ipmi_mc_provides_device_sdrs(mc))); display_pad_out(" device_available: %c\n", y_or_n(ipmi_mc_device_available(mc))); display_pad_out(" chassis_support: %c\n", y_or_n(ipmi_mc_chassis_support(mc))); display_pad_out(" bridge_support: %c\n", y_or_n(ipmi_mc_bridge_support(mc))); display_pad_out(" ipmb_event_generator: %c\n", y_or_n(ipmi_mc_ipmb_event_generator_support(mc))); display_pad_out(" ipmb_event_receiver: %c\n", y_or_n(ipmi_mc_ipmb_event_receiver_support(mc))); display_pad_out(" fru_inventory_support: %c\n", y_or_n(ipmi_mc_fru_inventory_support(mc))); display_pad_out(" sel_device_support: %c\n", y_or_n(ipmi_mc_sel_device_support(mc))); display_pad_out(" sdr_repository_support: %c\n", y_or_n(ipmi_mc_sdr_repository_support(mc))); display_pad_out(" sensor_device_support: %c\n", y_or_n(ipmi_mc_sensor_device_support(mc))); display_pad_out(" device_id: %2.2x\n", ipmi_mc_device_id(mc)); display_pad_out(" device_revision: %1.1x\n", ipmi_mc_device_revision(mc)); display_pad_out(" fw_revision: %d.%d%d\n", ipmi_mc_major_fw_revision(mc), ipmi_mc_minor_fw_revision(mc)>>4, ipmi_mc_minor_fw_revision(mc)&0xf); display_pad_out(" version: %d.%d\n", ipmi_mc_major_version(mc), ipmi_mc_minor_version(mc)); display_pad_out(" manufacturer_id: %6.6x\n", ipmi_mc_manufacturer_id(mc)); display_pad_out(" product_id: %4.4x\n", ipmi_mc_product_id(mc)); ipmi_mc_aux_fw_revision(mc, vals); display_pad_out(" aux_fw_revision: %2.2x %2.2x %2.2x %2.2x\n", vals[0], vals[1], vals[2], vals[3]); display_pad_out(" SEL count: %d entries, %d slots used\n", ipmi_mc_sel_count(mc), ipmi_mc_sel_entries_used(mc)); } int get_mc_id(char **toks, ipmi_mcid_t *mc_id) { unsigned char val; if (get_uchar(toks, &val, "mc channel")) return 1; mc_id->channel = val; if (get_uchar(toks, &val, "MC num")) return 1; mc_id->mc_num = val; mc_id->domain_id = domain_id; return 0; } int mc_cmd(char *cmd, char **toks, void *cb_data) { mccmd_info_t info; int rv; if (get_mc_id(toks, &info.mc_id)) return 0; info.found = 0; rv = ipmi_mc_pointer_noseq_cb(info.mc_id, mc_handler, &info); if (rv) { cmd_win_out("Unable to find MC\n"); return 0; } if (!info.found) { cmd_win_out("Unable to find MC (%d %x)\n", info.mc_id.channel, info.mc_id.mc_num); } display_pad_refresh(); return 0; } void mcs_handler(ipmi_domain_t *domain, ipmi_mc_t *mc, void *cb_data) { int addr; int channel; addr = ipmi_mc_get_address(mc); channel = ipmi_mc_get_channel(mc); display_pad_out(" (%x %x) - %s\n", channel, addr, ipmi_mc_is_active(mc) ? "active" : "inactive"); } static void mcs_cmder(ipmi_domain_t *domain, void *cb_data) { ipmi_domain_iterate_mcs(domain, mcs_handler, NULL); } int mcs_cmd(char *cmd, char **toks, void *cb_data) { int rv; display_pad_clear(); curr_display_type = DISPLAY_MCS; display_pad_out("MCs:\n"); rv = ipmi_domain_pointer_cb(domain_id, mcs_cmder, NULL); if (rv) { cmd_win_out("Unable to convert domain id to a pointer\n"); return 0; } display_pad_refresh(); return 0; } static void mccmd_rsp_handler(ipmi_mc_t *src, ipmi_msg_t *msg, void *rsp_data) { unsigned int i; unsigned char *data; display_pad_clear(); curr_display_type = DISPLAY_RSP; display_pad_out("Response:\n"); display_pad_out(" NetFN = 0x%2.2x\n", msg->netfn); display_pad_out(" Command = 0x%2.2x\n", msg->cmd); display_pad_out(" Completion code = 0x%2.2x\n", msg->data[0]); display_pad_out(" data ="); data = msg->data + 1; for (i=0; i+1data_len; i++) { if ((i != 0) && ((i % 8) == 0)) display_pad_out("\n "); display_pad_out(" %2.2x", data[i]); } display_pad_out("\n"); display_pad_refresh(); } void mccmd_handler(ipmi_mc_t *mc, void *cb_data) { mccmd_info_t *info = cb_data; int rv; info->found = 1; rv = ipmi_mc_send_command(mc, info->lun, &(info->msg), mccmd_rsp_handler, NULL); if (rv) cmd_win_out("Send command failure: %x\n", rv); } int mccmd_cmd(char *cmd, char **toks, void *cb_data) { mccmd_info_t info; unsigned char data[MCCMD_DATA_SIZE]; unsigned int data_len; int rv; if (get_mc_id(toks, &info.mc_id)) return 0; if (get_uchar(toks, &info.lun, "LUN")) return 0; if (get_uchar(toks, &info.msg.netfn, "NetFN")) return 0; if (get_uchar(toks, &info.msg.cmd, "command")) return 0; for (data_len=0; ; data_len++) { if (get_uchar(toks, data+data_len, NULL)) break; } info.msg.data_len = data_len; info.msg.data = data; info.found = 0; rv = ipmi_mc_pointer_noseq_cb(info.mc_id, mccmd_handler, &info); if (rv) { cmd_win_out("Unable to convert MC id to a pointer\n"); return 0; } if (!info.found) { cmd_win_out("Unable to find MC (%d %x)\n", info.mc_id.channel, info.mc_id.mc_num); } display_pad_refresh(); return 0; } void mc_events_enable_cb(ipmi_mc_t *mc, int err, void *cb_data) { if (err) ui_log("Error setting events enable: 0x%x\n", err); else ui_log("Events enable set\n"); } void mc_events_enable_handler(ipmi_mc_t *mc, void *cb_data) { mccmd_info_t *info = cb_data; int rv; info->found = 1; rv = ipmi_mc_set_events_enable(mc, info->val, mc_events_enable_cb, NULL); if (rv) cmd_win_out("Set events enable failure: %x\n", rv); } int mc_events_enable_cmd(char *cmd, char **toks, void *cb_data) { mccmd_info_t info; int rv; if (get_mc_id(toks, &info.mc_id)) return 0; if (get_uchar(toks, &info.val, "enabled")) return 0; info.found = 0; rv = ipmi_mc_pointer_noseq_cb(info.mc_id, mc_events_enable_handler, &info); if (rv) { cmd_win_out("Unable to convert MC id to a pointer\n"); return 0; } if (!info.found) { cmd_win_out("Unable to find MC (%d %x)\n", info.mc_id.channel, info.mc_id.mc_num); } display_pad_refresh(); return 0; } void mc_events_enabled_handler(ipmi_mc_t *mc, void *cb_data) { mccmd_info_t *info = cb_data; info->found = 1; if (ipmi_mc_get_events_enable(mc)) cmd_win_out("Events enabled\n"); else cmd_win_out("Events not enabled\n"); } int mc_events_enabled_cmd(char *cmd, char **toks, void *cb_data) { mccmd_info_t info; int rv; if (get_mc_id(toks, &info.mc_id)) return 0; info.found = 0; rv = ipmi_mc_pointer_noseq_cb(info.mc_id, mc_events_enabled_handler, &info); if (rv) { cmd_win_out("Unable to convert MC id to a pointer\n"); return 0; } if (!info.found) { cmd_win_out("Unable to find MC (%d %x)\n", info.mc_id.channel, info.mc_id.mc_num); } display_pad_refresh(); return 0; } void display_pef(void) { if (!pef) { display_pad_out("No PEF read, use readpef to fetch one\n"); return; } display_pad_out("PEF\n"); display_pad_out(" Version: %d.%d", ipmi_pef_major_version(pef), ipmi_pef_minor_version(pef)); display_pad_out(" Supports:"); if (ipmi_pef_supports_diagnostic_interrupt(pef)) display_pad_out(" diagnostic_interrupt"); if (ipmi_pef_supports_oem_action(pef)) display_pad_out(" oem_action"); if (ipmi_pef_supports_power_cycle(pef)) display_pad_out(" power_cycle"); if (ipmi_pef_supports_reset(pef)) display_pad_out(" reset"); if (ipmi_pef_supports_power_down(pef)) display_pad_out(" power_down"); if (ipmi_pef_supports_alert(pef)) display_pad_out(" alert"); display_pad_out("\n"); display_pad_out(" Num event filter table entries: %d\n", num_event_filter_table_entries(pef)); } typedef struct pef_table_s { char *name; int (*get)(ipmi_pef_config_t *pefc, unsigned int sel, unsigned int *val); char *fmt; } pef_table_t; #define X(n, f) { #n, ipmi_pefconfig_get_##n, f } static pef_table_t eft_table[] = { X(enable_filter, "%d"), X(filter_type, "%d"), X(diagnostic_interrupt, "%d"), X(oem_action, "%d"), X(power_cycle, "%d"), X(reset, "%d"), X(power_down, "%d"), X(alert, "%d"), X(alert_policy_number, "%d"), X(event_severity, "0x%x"), X(generator_id_addr, "0x%x"), X(generator_id_channel_lun, "0x%x"), X(sensor_type, "0x%x"), X(sensor_number, "0x%x"), X(event_trigger, "%d"), X(data1_offset_mask, "0x%x"), X(data1_mask, "%d"), X(data1_compare1, "%d"), X(data1_compare2, "%d"), X(data2_mask, "%d"), X(data2_compare1, "%d"), X(data2_compare2, "%d"), X(data3_mask, "%d"), X(data3_compare1, "%d"), X(data3_compare2, "%d"), { NULL } }; static pef_table_t apt_table[] = { X(policy_num, "%d"), X(enabled, "%d"), X(policy, "%d"), X(channel, "0x%x"), X(destination_selector, "%d"), X(alert_string_event_specific, "%d"), X(alert_string_selector, "%d"), { NULL } }; static pef_table_t ask_table[] = { X(event_filter, "%d"), X(alert_string_set, "%d"), { NULL } }; void display_pef_config(void) { unsigned int i, j; unsigned int val; unsigned int len; unsigned char data[128]; int rv; unsigned int count; if (!pef_config) { display_pad_out("No PEF config read, use readpef to fetch one\n"); return; } display_pad_out(" alert_startup_delay_enabled: %d\n", ipmi_pefconfig_get_alert_startup_delay_enabled(pef_config)); display_pad_out(" startup_delay_enabled: %d\n", ipmi_pefconfig_get_startup_delay_enabled(pef_config)); display_pad_out(" event_messages_enabled: %d\n", ipmi_pefconfig_get_event_messages_enabled(pef_config)); display_pad_out(" pef_enabled: %d\n", ipmi_pefconfig_get_pef_enabled(pef_config)); display_pad_out(" diagnostic_interrupt_enabled: %d\n", ipmi_pefconfig_get_diagnostic_interrupt_enabled(pef_config)); display_pad_out(" oem_action_enabled: %d\n", ipmi_pefconfig_get_oem_action_enabled(pef_config)); display_pad_out(" power_cycle_enabled: %d\n", ipmi_pefconfig_get_power_cycle_enabled(pef_config)); display_pad_out(" reset_enabled: %d\n", ipmi_pefconfig_get_reset_enabled(pef_config)); display_pad_out(" power_down_enabled: %d\n", ipmi_pefconfig_get_power_down_enabled(pef_config)); display_pad_out(" alert_enabled: %d\n", ipmi_pefconfig_get_alert_enabled(pef_config)); if (ipmi_pefconfig_get_startup_delay(pef_config, &val) == 0) display_pad_out(" startup_delay: %d\n", val); if (ipmi_pefconfig_get_alert_startup_delay(pef_config, &val) == 0) display_pad_out(" alert_startup_delay: %d\n", val); len = sizeof(data); rv = ipmi_pefconfig_get_guid(pef_config, &val, data, &len); if (!rv) { display_pad_out(" guid_enabled: %d\n", val); display_pad_out(" guid:", val); for (i=0; ifound = 1; if (pef) { ipmi_pef_destroy(pef, NULL, NULL); pef = NULL; } if (pef_config) { ipmi_pef_free_config(pef_config); pef_config = NULL; } rv = ipmi_pef_alloc(mc, readpef_alloc_handler, NULL, NULL); if (rv) cmd_win_out("Error allocating PEF"); } int readpef_cmd(char *cmd, char **toks, void *cb_data) { mccmd_info_t info; int rv; if (get_mc_id(toks, &info.mc_id)) return 0; info.found = 0; rv = ipmi_mc_pointer_noseq_cb(info.mc_id, readpef_mc_handler, &info); if (rv) { cmd_win_out("Unable to find MC\n"); return 0; } if (!info.found) { cmd_win_out("Unable to find MC (%d %x)\n", info.mc_id.channel, info.mc_id.mc_num); } display_pad_refresh(); return 0; } int viewpef_cmd(char *cmd, char **toks, void *cb_data) { display_pad_clear(); display_pef(); display_pef_config(); display_pad_refresh(); return 0; } void writepef_done(ipmi_pef_t *pef, int err, void *cb_data) { if (err) ui_log("Error writing PEF: %x\n", err); else ui_log("PEF written\n"); } int writepef_cmd(char *cmd, char **toks, void *cb_data) { int rv; if (!pef) { cmd_win_out("No PEF to write\n"); return 0; } if (!pef_config) { cmd_win_out("No PEF config to write\n"); return 0; } rv = ipmi_pef_set_config(pef, pef_config, writepef_done, NULL); if (rv) { cmd_win_out("Error writing pef parms: %x\n", rv); } return 0; } void clearpeflock_done(ipmi_pef_t *pef, int err, void *cb_data) { if (err) ui_log("Error clearing PEF lock: %x\n", err); else ui_log("PEF lock cleared\n"); } static void clearpeflock_rsp_handler(ipmi_mc_t *src, ipmi_msg_t *msg, void *rsp_data) { if (msg->data[0]) ui_log("Error clearing PEF lock: %x\n", IPMI_IPMI_ERR_VAL(msg->data[0])); else ui_log("PEF lock cleared\n"); } void clearpeflock_mc_handler(ipmi_mc_t *mc, void *cb_data) { mccmd_info_t *info = cb_data; unsigned char data[2]; ipmi_msg_t msg; int rv; info->found = 1; data[0] = 0; data[1] = 0; msg.netfn = IPMI_SENSOR_EVENT_NETFN; msg.cmd = IPMI_SET_PEF_CONFIG_PARMS_CMD; msg.data = data; msg.data_len = 2; rv = ipmi_mc_send_command(mc, 0, &msg, clearpeflock_rsp_handler, NULL); if (rv) cmd_win_out("Send PEF clear lock failure: %x\n", rv); } int clearpeflock_cmd(char *cmd, char **toks, void *cb_data) { mccmd_info_t info; int rv; char *mc_toks; char buf[100]; char *ntoks; mc_toks = strtok_r(NULL, "", toks); if (mc_toks) { strncpy(buf+2, mc_toks, sizeof(buf)-2); buf[0] = 'a'; buf[1] = ' '; strtok_r(buf, " ", &ntoks); if (get_mc_id(&ntoks, &info.mc_id)) return 0; info.found = 0; rv = ipmi_mc_pointer_noseq_cb(info.mc_id, clearpeflock_mc_handler, &info); if (rv) { cmd_win_out("Unable to find MC\n"); return 0; } if (!info.found) { cmd_win_out("Unable to find MC (%d %x)\n", info.mc_id.channel, info.mc_id.mc_num); } display_pad_refresh(); } else { if (!pef) { ui_log("No PEF to write\n"); return 0; } ipmi_pef_clear_lock(pef, pef_config, clearpeflock_done, NULL); } return 0; } typedef struct setpef_parm_s { char *name; int (*set_val)(ipmi_pef_config_t *, unsigned int); int (*set_data)(ipmi_pef_config_t *, unsigned char *, unsigned int); int (*set_val_sel)(ipmi_pef_config_t *, unsigned int, unsigned int); int (*set_data_sel)(ipmi_pef_config_t *, unsigned int, unsigned char *, unsigned int); } setpef_parm_t; #define N NULL #define D(x) #x #define C(x) D(x) #define H(x) ipmi_pefconfig_set_ ## x #define G(x) H(x) static setpef_parm_t pef_conf[] = { #undef V #define V startup_delay_enabled { C(V), G(V), N, N, N }, #undef V #define V alert_startup_delay_enabled { C(V), G(V), N, N, N }, #undef V #define V event_messages_enabled { C(V), G(V), N, N, N }, #undef V #define V pef_enabled { C(V), G(V), N, N, N }, #undef V #define V diagnostic_interrupt_enabled { C(V), G(V), N, N, N }, #undef V #define V oem_action_enabled { C(V), G(V), N, N, N }, #undef V #define V power_cycle_enabled { C(V), G(V), N, N, N }, #undef V #define V reset_enabled { C(V), G(V), N, N, N }, #undef V #define V power_down_enabled { C(V), G(V), N, N, N }, #undef V #define V alert_enabled { C(V), G(V), N, N, N }, #undef V #define V startup_delay { C(V), G(V), N, N, N }, #undef V #define V alert_startup_delay { C(V), G(V), N, N, N }, #undef V #define V enable_filter { C(V), N, N, G(V), N }, #undef V #define V filter_type { C(V), N, N, G(V), N }, #undef V #define V diagnostic_interrupt { C(V), N, N, G(V), N }, #undef V #define V oem_action { C(V), N, N, G(V), N }, #undef V #define V power_cycle { C(V), N, N, G(V), N }, #undef V #define V reset { C(V), N, N, G(V), N }, #undef V #define V power_down { C(V), N, N, G(V), N }, #undef V #define V alert { C(V), N, N, G(V), N }, #undef V #define V alert_policy_number { C(V), N, N, G(V), N }, #undef V #define V event_severity { C(V), N, N, G(V), N }, #undef V #define V generator_id_addr { C(V), N, N, G(V), N }, #undef V #define V generator_id_channel_lun { C(V), N, N, G(V), N }, #undef V #define V sensor_type { C(V), N, N, G(V), N }, #undef V #define V sensor_number { C(V), N, N, G(V), N }, #undef V #define V event_trigger { C(V), N, N, G(V), N }, #undef V #define V data1_offset_mask { C(V), N, N, G(V), N }, #undef V #define V data1_mask { C(V), N, N, G(V), N }, #undef V #define V data1_compare1 { C(V), N, N, G(V), N }, #undef V #define V data1_compare2 { C(V), N, N, G(V), N }, #undef V #define V data2_mask { C(V), N, N, G(V), N }, #undef V #define V data2_compare1 { C(V), N, N, G(V), N }, #undef V #define V data2_compare2 { C(V), N, N, G(V), N }, #undef V #define V data3_mask { C(V), N, N, G(V), N }, #undef V #define V data3_compare1 { C(V), N, N, G(V), N }, #undef V #define V data3_compare2 { C(V), N, N, G(V), N }, #undef V #define V policy_num { C(V), N, N, G(V), N }, #undef V #define V enabled { C(V), N, N, G(V), N }, #undef V #define V channel { C(V), N, N, G(V), N }, #undef V #define V destination_selector { C(V), N, N, G(V), N }, #undef V #define V alert_string_event_specific { C(V), N, N, G(V), N }, #undef V #define V alert_string_selector { C(V), N, N, G(V), N }, #undef V #define V event_filter { C(V), N, N, G(V), N }, #undef V #define V alert_string_set { C(V), N, N, G(V), N }, { NULL } }; static int setpef_cmd(char *cmd, char **toks, void *cb_data) { unsigned int sel; unsigned int val; unsigned char data[30]; char *name; char *str; unsigned int i; int rv = 0; if (!pef_config) { cmd_win_out("No PEF config read, use readpef to fetch one\n"); return 0; } name = strtok_r(NULL, " \t\n", toks); if (!name) { cmd_win_out("No PEF config name given\n"); return 0; } for (i=0; pef_conf[i].name != NULL; i++) { if (strcmp(pef_conf[i].name, name) == 0) break; } if (pef_conf[i].name == NULL) { if (strcmp(name, "guid") == 0) { for (i=0; ifound = 1; if (lanparm) { ipmi_lanparm_destroy(lanparm, NULL, NULL); lanparm = NULL; } if (lanparm_config) { ipmi_lan_free_config(lanparm_config); lanparm_config = NULL; } rv = ipmi_lanparm_alloc(mc, info->channel, &lanparm); if (rv) { cmd_win_out("failed lanparm allocation: %x\n", rv); return; } rv = ipmi_lan_get_config(lanparm, readlanparm_getconf_handler, NULL); } int readlanparm_cmd(char *cmd, char **toks, void *cb_data) { lanparm_info_t info; int rv; unsigned char val; if (get_mc_id(toks, &info.mc_id)) return 0; if (get_uchar(toks, &val, "lanparm channel")) return 0; info.channel = val; info.found = 0; rv = ipmi_mc_pointer_noseq_cb(info.mc_id, readlanparm_mc_handler, &info); if (rv) { cmd_win_out("Unable to find MC\n"); return 0; } if (!info.found) { cmd_win_out("Unable to find MC (%d %x)\n", info.mc_id.channel, info.mc_id.mc_num); } display_pad_refresh(); return 0; } int viewlanparm_cmd(char *cmd, char **toks, void *cb_data) { display_pad_clear(); display_lanparm_config(); display_pad_refresh(); return 0; } void writelanparm_done(ipmi_lanparm_t *lanparm, int err, void *cb_data) { if (err) ui_log("Error writing LANPARM: %x\n", err); else ui_log("LANPARM written\n"); } int writelanparm_cmd(char *cmd, char **toks, void *cb_data) { int rv; if (!lanparm) { cmd_win_out("No LANPARM to write\n"); return 0; } if (!lanparm_config) { cmd_win_out("No LANPARM config to write\n"); return 0; } rv = ipmi_lan_set_config(lanparm, lanparm_config, writelanparm_done, NULL); if (rv) { cmd_win_out("Error writing lan parms: %x\n", rv); } return 0; } void clearlanparmlock_done(ipmi_lanparm_t *lanparm, int err, void *cb_data) { if (err) ui_log("Error clearing LANPARM lock: %x\n", err); else ui_log("LANPARM lock cleared\n"); } static void clearlanparmlock_rsp_handler(ipmi_mc_t *src, ipmi_msg_t *msg, void *rsp_data) { if (msg->data[0]) ui_log("Error clearing LANPARM lock: %x\n", IPMI_IPMI_ERR_VAL(msg->data[0])); else ui_log("LANPARM lock cleared\n"); } void clearlanparmlock_mc_handler(ipmi_mc_t *mc, void *cb_data) { lanparm_info_t *info = cb_data; unsigned char data[3]; ipmi_msg_t msg; int rv; info->found = 1; data[0] = info->channel; data[1] = 0; data[2] = 0; msg.netfn = IPMI_TRANSPORT_NETFN; msg.cmd = IPMI_SET_LAN_CONFIG_PARMS_CMD; msg.data = data; msg.data_len = 3; rv = ipmi_mc_send_command(mc, 0, &msg, clearlanparmlock_rsp_handler, NULL); if (rv) cmd_win_out("Send LANPARM clear lock failure: %x\n", rv); } int clearlanparmlock_cmd(char *cmd, char **toks, void *cb_data) { lanparm_info_t info; int rv; char *mc_toks; char buf[100]; char *ntoks; unsigned char val; mc_toks = strtok_r(NULL, "", toks); if (mc_toks) { strncpy(buf+2, mc_toks, sizeof(buf)-2); buf[0] = 'a'; buf[1] = ' '; strtok_r(buf, " ", &ntoks); if (get_mc_id(&ntoks, &info.mc_id)) return 0; if (get_uchar(&ntoks, &val, "lanparm channel")) return 0; info.channel = val; info.found = 0; rv = ipmi_mc_pointer_noseq_cb(info.mc_id, clearlanparmlock_mc_handler, &info); if (rv) { cmd_win_out("Unable to find MC\n"); return 0; } if (!info.found) { cmd_win_out("Unable to find MC (%d %x)\n", info.mc_id.channel, info.mc_id.mc_num); } display_pad_refresh(); } else { if (!lanparm) { ui_log("No LANPARM to write\n"); return 0; } ipmi_lan_clear_lock(lanparm, lanparm_config, clearlanparmlock_done, NULL); } return 0; } typedef struct setlan_parm_s { char *name; int (*set_val)(ipmi_lan_config_t *, unsigned int); int (*set_data)(ipmi_lan_config_t *, unsigned char *, unsigned int); int (*set_val_sel)(ipmi_lan_config_t *, unsigned int, unsigned int); int (*set_data_sel)(ipmi_lan_config_t *, unsigned int, unsigned char *, unsigned int); } setlan_parm_t; #undef N #define N NULL #undef D #define D(x) #x #undef C #define C(x) D(x) #undef H #define H(x) ipmi_lanconfig_set_ ## x #undef G #define G(x) H(x) static setlan_parm_t lan_conf[] = { #undef V #define V ip_addr_source { C(V), G(V), N, N, N }, #undef V #define V ipv4_ttl { C(V), G(V), N, N, N }, #undef V #define V ipv4_flags { C(V), G(V), N, N, N }, #undef V #define V ipv4_precedence { C(V), G(V), N, N, N }, #undef V #define V ipv4_tos { C(V), G(V), N, N, N }, #undef V #define V enable_auth_oem { C(V), N, N, G(V), N }, #undef V #define V enable_auth_straight { C(V), N, N, G(V), N }, #undef V #define V enable_auth_md5 { C(V), N, N, G(V), N }, #undef V #define V enable_auth_md2 { C(V), N, N, G(V), N }, #undef V #define V enable_auth_none { C(V), N, N, G(V), N }, #undef V #define V ip_addr { C(V), N, G(V), N, N }, #undef V #define V mac_addr { C(V), N, G(V), N, N }, #undef V #define V subnet_mask { C(V), N, G(V), N, N }, #undef V #define V primary_rmcp_port { C(V), N, G(V), N, N }, #undef V #define V secondary_rmcp_port { C(V), N, G(V), N, N }, #undef V #define V bmc_generated_arps { C(V), G(V), N, N, N }, #undef V #define V bmc_generated_garps { C(V), G(V), N, N, N }, #undef V #define V garp_interval { C(V), G(V), N, N, N }, #undef V #define V default_gateway_ip_addr { C(V), N, G(V), N, N }, #undef V #define V default_gateway_mac_addr { C(V), N, G(V), N, N }, #undef V #define V backup_gateway_ip_addr { C(V), N, G(V), N, N }, #undef V #define V backup_gateway_mac_addr { C(V), N, G(V), N, N }, #undef V #define V alert_ack { C(V), N, N, G(V), N }, #undef V #define V dest_type { C(V), N, N, G(V), N }, #undef V #define V alert_retry_interval { C(V), N, N, G(V), N }, #undef V #define V max_alert_retries { C(V), N, N, G(V), N }, #undef V #define V dest_format { C(V), N, N, G(V), N }, #undef V #define V gw_to_use { C(V), N, N, G(V), N }, #undef V #define V dest_ip_addr { C(V), N, N, N, G(V) }, #undef V #define V dest_mac_addr { C(V), N, N, N, G(V) }, }; static int setlanparm_cmd(char *cmd, char **toks, void *cb_data) { unsigned int sel; unsigned int val; unsigned char data[30]; char *name; char *str; unsigned int i, j; int rv = 0; if (!lanparm_config) { cmd_win_out("No LAN config read, use readlan to fetch one\n"); return 0; } name = strtok_r(NULL, " \t\n", toks); if (!name) { cmd_win_out("No LAN config name given\n"); return 0; } for (i=0; lan_conf[i].name != NULL; i++) { if (strcmp(lan_conf[i].name, name) == 0) break; } if (lan_conf[i].name == NULL) { if (strcmp(name, "community_string") == 0) { if (get_uint(toks, &sel, "selector")) return 0; str = strtok_r(NULL, "", toks); rv = ipmi_lanconfig_set_community_string(lanparm_config, (unsigned char *) str, strlen(str)); } else { cmd_win_out("Invalid LAN config name: '%s'\n", name); return 0; } } else if (lan_conf[i].set_val) { if (get_uint(toks, &val, "value")) return 0; rv = lan_conf[i].set_val(lanparm_config, val); } else if (lan_conf[i].set_data) { for (j=0; jconnection, info->channel, info->ip_addr, info->mac_addr, info->eft_sel, info->policy_num, info->apt_sel, info->lan_dest_sel, pet_done, NULL, &pet); if (rv) cmd_win_out("Error creating PET: %x\n", rv); } static int pet_cmd(char *cmd, char **toks, void *cb_data) { pet_info_t info; int rv; if (pet) { ipmi_pet_destroy(pet, NULL, NULL); pet = NULL; } if (get_uint(toks, &info.connection, "connection")) return 0; if (get_uint(toks, &info.channel, "channel")) return 0; if (get_ip_addr(toks, &info.ip_addr, "IP address")) return 0; if (get_mac_addr(toks, info.mac_addr, "MAC address")) return 0; if (get_uint(toks, &info.eft_sel, "eft selector")) return 0; if (get_uint(toks, &info.policy_num, "policy_num")) return 0; if (get_uint(toks, &info.apt_sel, "apt selector")) return 0; if (get_uint(toks, &info.lan_dest_sel, "LAN dest selector")) return 0; rv = ipmi_domain_pointer_cb(domain_id, pet_domain_cb, &info); if (rv) cmd_win_out("Error converting domain"); return 0; } typedef struct msg_cmd_data_s { unsigned char data[MCCMD_DATA_SIZE]; unsigned int data_len; ipmi_ipmb_addr_t addr; ipmi_msg_t msg; } msg_cmd_data_t; static int mccmd_addr_rsp_handler(ipmi_domain_t *domain, ipmi_msgi_t *rspi) { ipmi_msg_t *msg = &rspi->msg; unsigned int i; unsigned char *data; display_pad_clear(); curr_display_type = DISPLAY_RSP; display_pad_out("Response:\n"); display_pad_out(" NetFN = 0x%2.2x\n", msg->netfn); display_pad_out(" Command = 0x%2.2x\n", msg->cmd); display_pad_out(" Completion code = 0x%2.2x\n", msg->data[0]); display_pad_out(" data ="); data = msg->data + 1; for (i=0; i+1data_len; i++) { if ((i != 0) && ((i % 8) == 0)) display_pad_out("\n "); display_pad_out(" %2.2x", data[i]); } display_pad_out("\n"); display_pad_refresh(); return IPMI_MSG_ITEM_NOT_USED; } static void msg_cmder(ipmi_domain_t *domain, void *cb_data) { msg_cmd_data_t *info = cb_data; int rv; rv = ipmi_send_command_addr(domain, (ipmi_addr_t *) &(info->addr), sizeof(info->addr), &info->msg, mccmd_addr_rsp_handler, NULL, NULL); if (rv) cmd_win_out("Send command failure: %x\n", rv); } static int msg_cmd(char *cmd, char **toks, void *cb_data) { msg_cmd_data_t info; unsigned int channel; int rv; info.addr.addr_type = IPMI_IPMB_ADDR_TYPE; if (get_uint(toks, &channel, "channel")) return 0; info.addr.channel = channel; if (get_uchar(toks, &info.addr.slave_addr, "slave address")) return 0; if (info.addr.slave_addr == 0) { info.addr.addr_type = IPMI_IPMB_BROADCAST_ADDR_TYPE; if (get_uchar(toks, &info.addr.slave_addr, "slave address")) return 0; } if (get_uchar(toks, &info.addr.lun, "LUN")) return 0; if (get_uchar(toks, &info.msg.netfn, "NetFN")) return 0; if (get_uchar(toks, &info.msg.cmd, "command")) return 0; for (info.data_len=0; ; info.data_len++) { if (get_uchar(toks, info.data+info.data_len, NULL)) break; } info.msg.data_len = info.data_len; info.msg.data = info.data; rv = ipmi_domain_pointer_cb(domain_id, msg_cmder, &info); if (rv) { cmd_win_out("Unable to convert domain id to a pointer\n"); return 0; } display_pad_refresh(); return 0; } static void set_control(ipmi_control_t *control, void *cb_data) { char **toks = cb_data; int num_vals; int i; int *vals = NULL; unsigned char *cvals = NULL; char *tok; char *estr; int rv; int control_type; control_type = ipmi_control_get_type(control); switch (control_type) { case IPMI_CONTROL_LIGHT: if (ipmi_control_light_set_with_setting(control)) { ipmi_light_setting_t *setting; num_vals = ipmi_control_get_num_vals(control); setting = ipmi_alloc_light_settings(num_vals); if (!setting) { cmd_win_out("set_control: out of memory\n"); goto out; } for (i=0; imc_id.domain_id = domain_id; event = ipmi_domain_first_event(domain); while (event) { if ((ipmi_cmp_mc_id_noseq(ipmi_event_get_mcid(event),info->mc_id) == 0) && (ipmi_event_get_record_id(event) == info->record_id)) { rv = ipmi_domain_del_event(domain, event, delevent_cb, NULL); if (rv) cmd_win_out("error deleting log: %x\n", rv); ipmi_event_free(event); found = 1; break; } else { n = ipmi_domain_next_event(domain, event); ipmi_event_free(event); event = n; } } if (!found) cmd_win_out("log not found\n"); } static int delevent_cmd(char *cmd, char **toks, void *cb_data) { delevent_info_t info; int rv; if (get_mc_id(toks, &info.mc_id)) return 0; if (get_uint(toks, &info.record_id, "record id")) return 0; rv = ipmi_domain_pointer_cb(domain_id, delevent_cmder, &info); if (rv) { cmd_win_out("Unable to convert domain id to a pointer\n"); return 0; } return 0; } static void addevent_cb(ipmi_mc_t *mc, unsigned int record_id, int err, void *cb_data) { if (err) ui_log("Error adding event: %x\n", err); else ui_log("event 0x%4.4x added\n", record_id); } typedef struct addevent_info_s { ipmi_mcid_t mc_id; unsigned int record_id; unsigned int type; ipmi_time_t timestamp; unsigned char data[13]; } addevent_info_t; static void addevent_cmder(ipmi_mc_t *mc, void *cb_data) { int rv; addevent_info_t *info = cb_data; ipmi_event_t *event; event = ipmi_event_alloc(ipmi_mc_convert_to_id(mc), info->record_id, info->type, info->timestamp, info->data, 13); if (!event) { cmd_win_out("Could not allocate event\n"); return; } rv = ipmi_mc_add_event_to_sel(mc, event, addevent_cb, NULL); if (rv) cmd_win_out("Unable to send add event: %x\n", rv); ipmi_event_free(event); } static int addevent_cmd(char *cmd, char **toks, void *cb_data) { addevent_info_t info; int rv; int i; struct timeval time; if (get_mc_id(toks, &info.mc_id)) return 0; if (get_uint(toks, &info.record_id, "record id")) return 0; if (get_uint(toks, &info.type, "record type")) return 0; for (i=0; i<13; i++) { if (get_uchar(toks, &info.data[i], "data")) return 0; } ipmi_ui_os_hnd->get_monotonic_time(ipmi_ui_os_hnd, &time); info.timestamp = time.tv_sec * 1000000000; rv = ipmi_mc_pointer_noseq_cb(info.mc_id, addevent_cmder, &info); if (rv) { cmd_win_out("Unable to convert domain id to a pointer\n"); return 0; } return 0; } static int debug_cmd(char *cmd, char **toks, void *cb_data) { char *type; char *on_off; int val; type = strtok_r(NULL, " \t\n", toks); if (!type) { cmd_win_out("No debug type specified\n"); goto out; } on_off = strtok_r(NULL, " \t\n", toks); if (!on_off) { cmd_win_out("on or off not specified\n"); goto out; } else if (strcmp(on_off, "on") == 0) { val = 1; } else if (strcmp(on_off, "off") == 0) { val = 0; } else { cmd_win_out("on or off not specified, got '%s'\n", on_off); goto out; } if (strcmp(type, "msg") == 0) { if (val) DEBUG_MSG_ENABLE(); else DEBUG_MSG_DISABLE(); } else if (strcmp(type, "rawmsg") == 0) { if (val) DEBUG_RAWMSG_ENABLE(); else DEBUG_RAWMSG_DISABLE(); } else if (strcmp(type, "locks") == 0) { if (val) DEBUG_LOCKS_ENABLE(); else DEBUG_LOCKS_DISABLE(); } else if (strcmp(type, "events") == 0) { if (val) DEBUG_EVENTS_ENABLE(); else DEBUG_EVENTS_DISABLE(); } else if (strcmp(type, "con0") == 0) { if (val) DEBUG_CON_FAIL_ENABLE(0); else DEBUG_CON_FAIL_DISABLE(0); } else if (strcmp(type, "con1") == 0) { if (val) DEBUG_CON_FAIL_ENABLE(1); else DEBUG_CON_FAIL_DISABLE(1); } else if (strcmp(type, "con2") == 0) { if (val) DEBUG_CON_FAIL_ENABLE(2); else DEBUG_CON_FAIL_DISABLE(2); } else if (strcmp(type, "con3") == 0) { if (val) DEBUG_CON_FAIL_ENABLE(3); else DEBUG_CON_FAIL_DISABLE(3); } else { cmd_win_out("Invalid debug type specified: '%s'\n", type); goto out; } out: return 0; } static void clear_sel_cmder(ipmi_domain_t *domain, void *cb_data) { ipmi_event_t *event, *event2; event = ipmi_domain_first_event(domain); while (event) { event2 = event; event = ipmi_domain_next_event(domain, event2); ipmi_domain_del_event(domain, event2, NULL, NULL); ipmi_event_free(event2); } } static int clear_sel_cmd(char *cmd, char **toks, void *cb_data) { int rv; rv = ipmi_domain_pointer_cb(domain_id, clear_sel_cmder, NULL); if (rv) { cmd_win_out("Unable to convert domain id to a pointer\n"); return 0; } return 0; } static void list_sel_cmder(ipmi_domain_t *domain, void *cb_data) { int rv; ipmi_event_t *event, *event2; unsigned int count1, count2; curr_display_type = EVENTS; display_pad_clear(); rv = ipmi_domain_sel_count(domain, &count1); if (rv) count1 = -1; rv = ipmi_domain_sel_entries_used(domain, &count2); if (rv) count2 = -1; display_pad_out("Event counts: %d entries, %d slots used\n", count1, count2); display_pad_out("Events:\n"); event = ipmi_domain_first_event(domain); while (event) { ipmi_mcid_t mcid = ipmi_event_get_mcid(event); unsigned int record_id = ipmi_event_get_record_id(event); unsigned int type = ipmi_event_get_type(event); ipmi_time_t timestamp = ipmi_event_get_timestamp(event); unsigned int data_len = ipmi_event_get_data_len(event); const unsigned char *data = ipmi_event_get_data_ptr(event); unsigned int i; display_pad_out(" (%x %x) %4.4x:%2.2x %lld:", mcid.channel, mcid.mc_num, record_id, type, timestamp); for (i=0; ifound = 1; rv = ipmi_mc_get_current_sel_time(mc, sel_time_fetched, NULL); if (rv) cmd_win_out("Error sending SEL time fetch: %x\n", rv); } int get_sel_time_cmd(char *cmd, char **toks, void *cb_data) { mccmd_info_t info; int rv; if (get_mc_id(toks, &info.mc_id)) return 0; info.found = 0; rv = ipmi_mc_pointer_noseq_cb(info.mc_id, get_sel_time_handler, &info); if (rv) { cmd_win_out("Unable to find MC\n"); return 0; } if (!info.found) { cmd_win_out("Unable to find MC (%d %x)\n", info.mc_id.channel, info.mc_id.mc_num); } display_pad_refresh(); return 0; } static void mc_reset_done(ipmi_mc_t *mc, int err, void *cb_data) { if (err) ui_log("Error resetting mc: %x", err); else ui_log("MC reset"); } static void mc_reset_handler(ipmi_mc_t *mc, void *cb_data) { mccmd_info_t *info = cb_data; int rv; info->found = 1; rv = ipmi_mc_reset(mc, info->msg.cmd, mc_reset_done, NULL); if (rv) cmd_win_out("Error sending MC reset: %x\n", rv); } static int mc_reset_cmd(char *cmd, char **toks, void *cb_data) { mccmd_info_t info; int rv; char *type; if (get_mc_id(toks, &info.mc_id)) return 0; type = strtok_r(NULL, " \n\t", toks); if (!type) { cmd_win_out("No reset type given, must be 'cold' or 'warm'\n"); return 0; } if (strcmp(type, "warm") == 0) { info.msg.cmd = IPMI_MC_RESET_WARM; } else if (strcmp(type, "cold") == 0) { info.msg.cmd = IPMI_MC_RESET_COLD; } else { cmd_win_out("Invalid reset type given, must be 'cold' or 'warm'\n"); return 0; } info.found = 0; rv = ipmi_mc_pointer_noseq_cb(info.mc_id, mc_reset_handler, &info); if (rv) { cmd_win_out("Unable to find MC\n"); return 0; } if (!info.found) { cmd_win_out("Unable to find MC (%d %x)\n", info.mc_id.channel, info.mc_id.mc_num); } display_pad_refresh(); return 0; } typedef struct sdrs_info_s { int found; ipmi_mcid_t mc_id; unsigned char do_sensors; } sdrs_info_t; void sdrs_fetched(ipmi_sdr_info_t *sdrs, int err, int changed, unsigned int count, void *cb_data) { sdrs_info_t *info = cb_data; unsigned int i; int rv; int total_size = 0; if (err) { ui_log("Error fetching sdrs: %x\n", err); goto out; } if (!sdrs) { ui_log("sdrs went away during fetch\n"); goto out; } display_pad_clear(); curr_display_type = DISPLAY_SDRS; display_pad_out("%s SDRs for MC (%x %x)\n", info->do_sensors ? "device" : "main", info->mc_id.channel, info->mc_id.mc_num); for (i=0; ido_sensors, &sdrs); if (rv) { cmd_win_out("Unable to alloc sdr info: %x\n", rv); ipmi_mem_free(info); return; } rv = ipmi_sdr_fetch(sdrs, sdrs_fetched, info); if (rv) { cmd_win_out("Unable to start SDR fetch: %x\n", rv); ipmi_sdr_info_destroy(sdrs, NULL, NULL); ipmi_mem_free(info); return; } } void sdrs_mcs_handler(ipmi_mc_t *mc, void *cb_data) { sdrs_info_t *info = cb_data; info->found = 1; start_sdr_dump(mc, info); } static int sdrs_cmd(char *cmd, char **toks, void *cb_data) { int rv; sdrs_info_t *info; info = ipmi_mem_alloc(sizeof(*info)); if (!info) { ui_log("Could not allocate memory for SDR fetch\n"); return 0; } if (get_mc_id(toks, &info->mc_id)) { ipmi_mem_free(info); return 0; } if (get_uchar(toks, &info->do_sensors, "do_sensors")) { ipmi_mem_free(info); return 0; } info->found = 0; rv = ipmi_mc_pointer_noseq_cb(info->mc_id, sdrs_mcs_handler, info); if (rv) { cmd_win_out("Unable to find MC\n"); ipmi_mem_free(info); } else { if (!info->found) { cmd_win_out("Unable to find that mc\n"); ipmi_mem_free(info); } } return 0; } typedef struct scan_cmd_info_s { unsigned char addr; unsigned char channel; } scan_cmd_info_t; void scan_done(ipmi_domain_t *domain, int err, void *cb_data) { log_pad_out("Bus scan done\n"); } static void scan_cmder(ipmi_domain_t *domain, void *cb_data) { scan_cmd_info_t *info = cb_data; ipmi_start_ipmb_mc_scan(domain, info->channel, info->addr, info->addr, scan_done, NULL); } static int scan_cmd(char *cmd, char **toks, void *cb_data) { int rv; scan_cmd_info_t info; if (get_uchar(toks, &info.channel, "channel")) return 0; if (get_uchar(toks, &info.addr, "IPMB address")) return 0; rv = ipmi_domain_pointer_cb(domain_id, scan_cmder, &info); if (rv) { cmd_win_out("Unable to convert domain id to a pointer\n"); } return 0; } static void presence_cmder(ipmi_domain_t *domain, void *cb_data) { int rv; rv = ipmi_detect_domain_presence_changes(domain, 1); if (rv) cmd_win_out("domain presence detect error: %x\n", rv); } int presence_cmd(char *cmd, char **toks, void *cb_data) { int rv; rv = ipmi_domain_pointer_cb(domain_id, presence_cmder, NULL); if (rv) { cmd_win_out("Unable to convert domain id to a pointer\n"); return 0; } return 0; } static void is_con_active_cmder(ipmi_domain_t *domain, void *cb_data) { int rv; unsigned int *connection = cb_data; unsigned int val; rv = ipmi_domain_is_connection_active(domain, *connection, &val); if (rv) cmd_win_out("Invalid connection number %d: %x\n", *connection, rv); else cmd_win_out("Connection %d is%s active\n", *connection, val ? "" : " not"); } static int is_con_active_cmd(char *cmd, char **toks, void *cb_data) { int rv; unsigned int connection; if (get_uint(toks, &connection, "connection")) return 0; rv = ipmi_domain_pointer_cb(domain_id, is_con_active_cmder, &connection); if (rv) { cmd_win_out("Unable to convert domain id to a pointer\n"); return 0; } return 0; } static void activate_con_cmder(ipmi_domain_t *domain, void *cb_data) { int rv; unsigned int *connection = cb_data; rv = ipmi_domain_activate_connection(domain, *connection); if (rv) cmd_win_out("Invalid connection number %d: %x\n", *connection, rv); } static int activate_con_cmd(char *cmd, char **toks, void *cb_data) { int rv; unsigned int connection; if (get_uint(toks, &connection, "connection")) return 0; rv = ipmi_domain_pointer_cb(domain_id, activate_con_cmder, &connection); if (rv) { cmd_win_out("Unable to convert domain id to a pointer\n"); return 0; } return 0; } static int quit_cmd(char *cmd, char **toks, void *cb_data) { int rv; rv = ipmi_domain_pointer_cb(domain_id, leave_cmder, NULL); if (rv) { leave(0, ""); } return 0; } static int display_win_cmd(char *cmd, char **toks, void *cb_data) { curr_win = DISPLAY_WIN_SCROLL; return 0; } static int log_win_cmd(char *cmd, char **toks, void *cb_data) { curr_win = LOG_WIN_SCROLL; return 0; } static int new_domain_cmd(char *cmd, char **toks, void *cb_data) { char *parms[30]; int num_parms; int curr_parm; ipmi_args_t *con_parms[2]; int set = 0; int i; ipmi_con_t *con[2]; int rv; for (num_parms=0; num_parms<30; num_parms++) { parms[num_parms] = strtok_r(NULL, " \t\n", toks); if (!parms[num_parms]) break; /* Remove surrounding quotes, if any. */ if (parms[num_parms][0] == '"') { (parms[num_parms])++; if (parms[num_parms][0]) parms[num_parms][strlen(parms[num_parms])-1] = '\0'; } } if (num_parms < 2) { cmd_win_out("Not enough parms given\n"); return 0; } curr_parm = 1; rv = ipmi_parse_args(&curr_parm, num_parms, parms, &con_parms[set]); if (rv) { cmd_win_out("First connection parms are invalid\n"); return 0; } set++; if (curr_parm > num_parms) { rv = ipmi_parse_args(&curr_parm, num_parms, parms, &con_parms[set]); if (rv) { ipmi_free_args(con_parms[0]); cmd_win_out("Second connection parms are invalid\n"); goto out; } set++; } for (i=0; iclose_connection(con[i]); goto out; } cmd_win_out("Domain started\n"); out: for (i=0; iname) == 0) { /* Found it. */ info->err = ipmi_domain_close(domain, final_close, NULL); if (info->err) cmd_win_out("Could not close connection\n"); } } static int close_domain_cmd(char *cmd, char **toks, void *cb_data) { domain_scan_t info; info.err = ENODEV; info.name = strtok_r(NULL, " \t\n", toks); if (!info.name) { cmd_win_out("No domain given\n"); return 0; } ipmi_domain_iterate_domains(close_domain_handler, &info); return 0; } static void set_domain_handler(ipmi_domain_t *domain, void *cb_data) { domain_scan_t *info = cb_data; char name[IPMI_DOMAIN_NAME_LEN]; ipmi_domain_get_name(domain, name, sizeof(name)); if (strcmp(name, info->name) == 0) { /* Found it. */ info->err = 0; domain_id = ipmi_domain_convert_to_id(domain); } } static int set_domain_cmd(char *cmd, char **toks, void *cb_data) { domain_scan_t info; info.err = ENODEV; info.name = strtok_r(NULL, " \t\n", toks); if (!info.name) { cmd_win_out("No domain given\n"); return 0; } ipmi_domain_iterate_domains(set_domain_handler, &info); if (info.err) cmd_win_out("Error setting domain: 0x%x\n", info.err); return 0; } static void domains_handler(ipmi_domain_t *domain, void *cb_data) { char name[IPMI_DOMAIN_NAME_LEN]; ipmi_domain_get_name(domain, name, sizeof(name)); display_pad_out(" %s\n", name); } static int domains_cmd(char *cmd, char **toks, void *cb_data) { display_pad_clear(); display_pad_out("Domains:\n"); ipmi_domain_iterate_domains(domains_handler, NULL); display_pad_refresh(); return 0; } static int help_cmd(char *cmd, char **toks, void *cb_data); static struct { char *name; cmd_handler_t handler; char *help; } cmd_list[] = { { "display_win", display_win_cmd, " - Sets the display window (left window) for scrolling" }, { "log_win", log_win_cmd, " - Sets the log window (right window) for scrolling" }, { "entities", entities_cmd, " - list all the entities the UI knows about" }, { "entity", entity_cmd, " - list all the info about an entity" }, { "hs_get_act_time", hs_get_act_time, " " " - Get the host-swap auto-activate time" }, { "hs_set_act_time", hs_set_act_time, "