diff options
author | Jörg Frings-Fürst <debian@jff-webhosting.net> | 2022-10-30 18:12:02 +0100 |
---|---|---|
committer | Jörg Frings-Fürst <debian@jff-webhosting.net> | 2022-10-30 18:12:02 +0100 |
commit | 1f3c9b4ae26ce1d46d954d509b83b8684ada5625 (patch) | |
tree | 260b922ec4d5d153cc6db745e27931cfd464472f /lib | |
parent | 8fcf0ba6f182918bd584bb80bf0b8998acad26a8 (diff) | |
parent | 8b758ee941f4c1ffea0532caa74b1fcd8101d1d8 (diff) |
Merge branch 'release/debian/1.8.19-1'debian/1.8.19-1
Diffstat (limited to 'lib')
41 files changed, 8092 insertions, 5250 deletions
diff --git a/lib/Makefile.am b/lib/Makefile.am index cc69a8f..49f5a8a 100644 --- a/lib/Makefile.am +++ b/lib/Makefile.am @@ -41,8 +41,7 @@ libipmitool_la_SOURCES = helper.c ipmi_sdr.c ipmi_sel.c ipmi_sol.c ipmi_pef.c \ ipmi_main.c ipmi_tsol.c ipmi_firewall.c ipmi_kontronoem.c \ ipmi_hpmfwupg.c ipmi_sdradd.c ipmi_ekanalyzer.c ipmi_gendev.c \ ipmi_ime.c ipmi_delloem.c ipmi_dcmi.c hpm2.c ipmi_vita.c \ - ipmi_lanp6.c ipmi_cfgp.c \ - ../src/plugins/lan/md5.c ../src/plugins/lan/md5.h + ipmi_lanp6.c ipmi_cfgp.c ipmi_quantaoem.c ipmi_time.c libipmitool_la_LDFLAGS = -export-dynamic libipmitool_la_LIBADD = -lm diff --git a/lib/Makefile.in b/lib/Makefile.in deleted file mode 100644 index 0e2b6b2..0000000 --- a/lib/Makefile.in +++ /dev/null @@ -1,717 +0,0 @@ -# Makefile.in generated by automake 1.14.1 from Makefile.am. -# @configure_input@ - -# Copyright (C) 1994-2013 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@ - -# Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved. -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions -# are met: -# -# Redistribution of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# -# Redistribution in binary form must reproduce the above copyright -# notice, this list of conditions and the following disclaimer in the -# documentation and/or other materials provided with the distribution. -# -# Neither the name of Sun Microsystems, Inc. or the names of -# contributors may be used to endorse or promote products derived -# from this software without specific prior written permission. -# -# This software is provided "AS IS," without a warranty of any kind. -# ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, -# INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A -# PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. -# SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE -# FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING -# OR DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL -# SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, -# OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR -# PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF -# LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, -# EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. - -VPATH = @srcdir@ -am__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)' -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@ -subdir = lib -DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ - $(top_srcdir)/depcomp -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/configure.ac -am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ - $(ACLOCAL_M4) -mkinstalldirs = $(install_sh) -d -CONFIG_HEADER = $(top_builddir)/config.h -CONFIG_CLEAN_FILES = -CONFIG_CLEAN_VPATH_FILES = -LTLIBRARIES = $(noinst_LTLIBRARIES) -am__dirstamp = $(am__leading_dot)dirstamp -am_libipmitool_la_OBJECTS = helper.lo ipmi_sdr.lo ipmi_sel.lo \ - ipmi_sol.lo ipmi_pef.lo ipmi_lanp.lo ipmi_fru.lo \ - ipmi_chassis.lo ipmi_mc.lo log.lo dimm_spd.lo ipmi_sensor.lo \ - ipmi_channel.lo ipmi_event.lo ipmi_session.lo ipmi_strings.lo \ - ipmi_user.lo ipmi_raw.lo ipmi_oem.lo ipmi_isol.lo \ - ipmi_sunoem.lo ipmi_fwum.lo ipmi_picmg.lo ipmi_main.lo \ - ipmi_tsol.lo ipmi_firewall.lo ipmi_kontronoem.lo \ - ipmi_hpmfwupg.lo ipmi_sdradd.lo ipmi_ekanalyzer.lo \ - ipmi_gendev.lo ipmi_ime.lo ipmi_delloem.lo ipmi_dcmi.lo \ - hpm2.lo ipmi_vita.lo ipmi_lanp6.lo ipmi_cfgp.lo \ - ../src/plugins/lan/md5.lo -libipmitool_la_OBJECTS = $(am_libipmitool_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 = -libipmitool_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \ - $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \ - $(AM_CFLAGS) $(CFLAGS) $(libipmitool_la_LDFLAGS) $(LDFLAGS) -o \ - $@ -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 = $(libipmitool_la_SOURCES) -DIST_SOURCES = $(libipmitool_la_SOURCES) -am__can_run_installinfo = \ - case $$AM_UPDATE_INFO_DIR in \ - n|no|NO) false;; \ - *) (install-info --version) >/dev/null 2>&1;; \ - esac -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 -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -ACLOCAL = @ACLOCAL@ -AMTAR = @AMTAR@ -AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ -AR = @AR@ -ARCH = @ARCH@ -AUTOCONF = @AUTOCONF@ -AUTOHEADER = @AUTOHEADER@ -AUTOMAKE = @AUTOMAKE@ -AWK = @AWK@ -BASEDIR = @BASEDIR@ -CC = @CC@ -CCDEPMODE = @CCDEPMODE@ -CFLAGS = @CFLAGS@ -CPP = @CPP@ -CPPFLAGS = @CPPFLAGS@ -CYGPATH_W = @CYGPATH_W@ -DEFS = @DEFS@ -DEPDIR = @DEPDIR@ -DISTRO = @DISTRO@ -DLLTOOL = @DLLTOOL@ -DSYMUTIL = @DSYMUTIL@ -DUMPBIN = @DUMPBIN@ -ECHO_C = @ECHO_C@ -ECHO_N = @ECHO_N@ -ECHO_T = @ECHO_T@ -EGREP = @EGREP@ -EXEEXT = @EXEEXT@ -FGREP = @FGREP@ -GREP = @GREP@ -INSTALL = @INSTALL@ -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ -INTF_BMC = @INTF_BMC@ -INTF_BMC_LIB = @INTF_BMC_LIB@ -INTF_DUMMY = @INTF_DUMMY@ -INTF_DUMMY_LIB = @INTF_DUMMY_LIB@ -INTF_FREE = @INTF_FREE@ -INTF_FREE_LIB = @INTF_FREE_LIB@ -INTF_IMB = @INTF_IMB@ -INTF_IMB_LIB = @INTF_IMB_LIB@ -INTF_LAN = @INTF_LAN@ -INTF_LANPLUS = @INTF_LANPLUS@ -INTF_LANPLUS_LIB = @INTF_LANPLUS_LIB@ -INTF_LAN_LIB = @INTF_LAN_LIB@ -INTF_LIPMI = @INTF_LIPMI@ -INTF_LIPMI_LIB = @INTF_LIPMI_LIB@ -INTF_OPEN = @INTF_OPEN@ -INTF_OPEN_LIB = @INTF_OPEN_LIB@ -INTF_SERIAL = @INTF_SERIAL@ -INTF_SERIAL_LIB = @INTF_SERIAL_LIB@ -INTF_USB = @INTF_USB@ -INTF_USB_LIB = @INTF_USB_LIB@ -IPMITOOL_INTF_LIB = @IPMITOOL_INTF_LIB@ -LD = @LD@ -LDFLAGS = @LDFLAGS@ -LIBOBJS = @LIBOBJS@ -LIBS = @LIBS@ -LIBTOOL = @LIBTOOL@ -LIPO = @LIPO@ -LN_S = @LN_S@ -LTLIBOBJS = @LTLIBOBJS@ -MAKEINFO = @MAKEINFO@ -MANIFEST_TOOL = @MANIFEST_TOOL@ -MKDIR_P = @MKDIR_P@ -NM = @NM@ -NMEDIT = @NMEDIT@ -OBJDUMP = @OBJDUMP@ -OBJEXT = @OBJEXT@ -OS = @OS@ -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@ -POW_LIB = @POW_LIB@ -PSTAMP = @PSTAMP@ -RANLIB = @RANLIB@ -RPMBUILD = @RPMBUILD@ -RPM_RELEASE = @RPM_RELEASE@ -SED = @SED@ -SET_MAKE = @SET_MAKE@ -SHELL = @SHELL@ -STRIP = @STRIP@ -VERSION = @VERSION@ -abs_builddir = @abs_builddir@ -abs_srcdir = @abs_srcdir@ -abs_top_builddir = @abs_top_builddir@ -abs_top_srcdir = @abs_top_srcdir@ -ac_configure_args = @ac_configure_args@ -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@ -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@ -prefix = @prefix@ -program_transform_name = @program_transform_name@ -psdir = @psdir@ -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@ -AUTOMAKE_OPTIONS = subdir-objects -AM_CPPFLAGS = -I$(top_srcdir)/include -MAINTAINERCLEANFILES = Makefile.in -noinst_LTLIBRARIES = libipmitool.la -libipmitool_la_SOURCES = helper.c ipmi_sdr.c ipmi_sel.c ipmi_sol.c ipmi_pef.c \ - ipmi_lanp.c ipmi_fru.c ipmi_chassis.c ipmi_mc.c log.c \ - dimm_spd.c ipmi_sensor.c ipmi_channel.c ipmi_event.c \ - ipmi_session.c ipmi_strings.c ipmi_user.c ipmi_raw.c \ - ipmi_oem.c ipmi_isol.c ipmi_sunoem.c ipmi_fwum.c ipmi_picmg.c \ - ipmi_main.c ipmi_tsol.c ipmi_firewall.c ipmi_kontronoem.c \ - ipmi_hpmfwupg.c ipmi_sdradd.c ipmi_ekanalyzer.c ipmi_gendev.c \ - ipmi_ime.c ipmi_delloem.c ipmi_dcmi.c hpm2.c ipmi_vita.c \ - ipmi_lanp6.c ipmi_cfgp.c \ - ../src/plugins/lan/md5.c ../src/plugins/lan/md5.h - -libipmitool_la_LDFLAGS = -export-dynamic -libipmitool_la_LIBADD = -lm -libipmitool_la_DEPENDENCIES = -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) --foreign lib/Makefile'; \ - $(am__cd) $(top_srcdir) && \ - $(AUTOMAKE) --foreign lib/Makefile -.PRECIOUS: 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): - -clean-noinstLTLIBRARIES: - -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) - @list='$(noinst_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}; \ - } -../src/plugins/lan/$(am__dirstamp): - @$(MKDIR_P) ../src/plugins/lan - @: > ../src/plugins/lan/$(am__dirstamp) -../src/plugins/lan/$(DEPDIR)/$(am__dirstamp): - @$(MKDIR_P) ../src/plugins/lan/$(DEPDIR) - @: > ../src/plugins/lan/$(DEPDIR)/$(am__dirstamp) -../src/plugins/lan/md5.lo: ../src/plugins/lan/$(am__dirstamp) \ - ../src/plugins/lan/$(DEPDIR)/$(am__dirstamp) - -libipmitool.la: $(libipmitool_la_OBJECTS) $(libipmitool_la_DEPENDENCIES) $(EXTRA_libipmitool_la_DEPENDENCIES) - $(AM_V_CCLD)$(libipmitool_la_LINK) $(libipmitool_la_OBJECTS) $(libipmitool_la_LIBADD) $(LIBS) - -mostlyclean-compile: - -rm -f *.$(OBJEXT) - -rm -f ../src/plugins/lan/*.$(OBJEXT) - -rm -f ../src/plugins/lan/*.lo - -distclean-compile: - -rm -f *.tab.c - -@AMDEP_TRUE@@am__include@ @am__quote@../src/plugins/lan/$(DEPDIR)/md5.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dimm_spd.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/helper.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hpm2.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ipmi_cfgp.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ipmi_channel.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ipmi_chassis.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ipmi_dcmi.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ipmi_delloem.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ipmi_ekanalyzer.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ipmi_event.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ipmi_firewall.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ipmi_fru.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ipmi_fwum.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ipmi_gendev.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ipmi_hpmfwupg.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ipmi_ime.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ipmi_isol.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ipmi_kontronoem.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ipmi_lanp.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ipmi_lanp6.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ipmi_main.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ipmi_mc.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ipmi_oem.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ipmi_pef.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ipmi_picmg.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ipmi_raw.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ipmi_sdr.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ipmi_sdradd.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ipmi_sel.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ipmi_sensor.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ipmi_session.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ipmi_sol.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ipmi_strings.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ipmi_sunoem.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ipmi_tsol.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ipmi_user.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ipmi_vita.Plo@am__quote@ -@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/log.Plo@am__quote@ - -.c.o: -@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ -@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ -@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.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)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ -@am__fastdepCC_TRUE@ $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ -@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.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)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ -@am__fastdepCC_TRUE@ $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ -@am__fastdepCC_TRUE@ $(am__mv) $$depbase.Tpo $$depbase.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 - -rm -rf ../src/plugins/lan/.libs ../src/plugins/lan/_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) -installdirs: -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) - -rm -f ../src/plugins/lan/$(DEPDIR)/$(am__dirstamp) - -rm -f ../src/plugins/lan/$(am__dirstamp) - -maintainer-clean-generic: - @echo "This command is intended for maintainers to use" - @echo "it deletes files that may require special tools to rebuild." - -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) -clean: clean-am - -clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ - mostlyclean-am - -distclean: distclean-am - -rm -rf ../src/plugins/lan/$(DEPDIR) ./$(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-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 ../src/plugins/lan/$(DEPDIR) ./$(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: - -.MAKE: install-am install-strip - -.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ - clean-libtool clean-noinstLTLIBRARIES 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-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-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 - - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/lib/dimm_spd.c b/lib/dimm_spd.c index 41e30db..d496184 100644 --- a/lib/dimm_spd.c +++ b/lib/dimm_spd.c @@ -1620,8 +1620,10 @@ ipmi_spd_print_fru(struct ipmi_intf * intf, uint8_t id) struct ipmi_rs * rsp; struct ipmi_rq req; struct fru_info fru; - uint8_t *spd_data, msg_data[4]; - int len, offset; + uint8_t *spd_data = NULL; + uint8_t msg_data[4]; + uint32_t len, offset; + int rc = -1; msg_data[0] = id; @@ -1632,14 +1634,14 @@ ipmi_spd_print_fru(struct ipmi_intf * intf, uint8_t id) req.msg.data_len = 1; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { printf(" Device not present (No Response)\n"); - return -1; + goto end; } - if (rsp->ccode > 0) { + if (rsp->ccode) { printf(" Device not present (%s)\n", val2str(rsp->ccode, completion_code_vals)); - return -1; + goto end; } fru.size = (rsp->data[1] << 8) | rsp->data[0]; @@ -1651,15 +1653,15 @@ ipmi_spd_print_fru(struct ipmi_intf * intf, uint8_t id) if (fru.size < 1) { lprintf(LOG_ERR, " Invalid FRU size %d", fru.size); - return -1; + goto end; } spd_data = malloc(fru.size); - if (spd_data == NULL) { + if (!spd_data) { printf(" Unable to malloc memory for spd array of size=%d\n", fru.size); - return -1; + goto end; } memset(&req, 0, sizeof(req)); @@ -1677,34 +1679,39 @@ ipmi_spd_print_fru(struct ipmi_intf * intf, uint8_t id) msg_data[3] = FRU_DATA_RQST_SIZE; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { printf(" Device not present (No Response)\n"); - free(spd_data); - spd_data = NULL; - return -1; + goto end; } - if (rsp->ccode > 0) { + if (rsp->ccode) { printf(" Device not present (%s)\n", val2str(rsp->ccode, completion_code_vals)); - free(spd_data); - spd_data = NULL; /* Timeouts are acceptable. No DIMM in the socket */ if (rsp->ccode == 0xc3) - return 1; + rc = 1; - return -1; + goto end; } len = rsp->data[0]; + if(rsp->data_len < 1 + || len > rsp->data_len - 1 + || len > fru.size - offset) + { + printf(" Not enough buffer size"); + goto end; + } memcpy(&spd_data[offset], rsp->data + 1, len); offset += len; } while (offset < fru.size); /* now print spd info */ ipmi_spd_print(spd_data, offset); - free(spd_data); - spd_data = NULL; + rc = 0; - return 0; +end: + free_n(&spd_data); + + return rc; } diff --git a/lib/helper.c b/lib/helper.c index de91438..b547123 100644 --- a/lib/helper.c +++ b/lib/helper.c @@ -29,12 +29,6 @@ * LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, * EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. */ -#define _POSIX_SOURCE -#define /* glibc 2.19 and earlier */ _BSD_SOURCE || \ - /* Since glibc 2.20 */_DEFAULT_SOURCE || \ - _XOPEN_SOURCE >= 500 || \ - _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED || \ - /* Since glibc 2.10: */ _POSIX_C_SOURCE >= 200112L \ #include <sys/types.h> #include <sys/stat.h> @@ -60,7 +54,7 @@ #ifdef HAVE_PATHS_H # include <paths.h> #else -# define _PATH_VARRUN "/var/run/" +# define _PATH_RUN "/run/" #endif #include <ipmitool/ipmi.h> @@ -100,7 +94,7 @@ buf2str_extended(const uint8_t *buf, int len, const char *sep) int left; int sep_len; - if (buf == NULL) { + if (!buf) { snprintf(str, sizeof(str), "<NULL>"); return (const char *)str; } @@ -180,7 +174,7 @@ ipmi_parse_hex(const char *str, uint8_t *out, int size) } len /= 2; /* out bytes */ - if (out == NULL) { + if (!out) { return -2; } @@ -234,6 +228,50 @@ void printbuf(const uint8_t * buf, int len, const char * desc) fprintf(stderr, "\n"); } +/* + * Unconditionally reverse the order of arbitrarily long strings of bytes + */ +uint8_t *array_byteswap(uint8_t *buffer, size_t length) +{ + size_t i; + uint8_t temp; + size_t max = length - 1; + + for (i = 0; i < length / 2; ++i) { + temp = buffer[i]; + buffer[i] = buffer[max - i]; + buffer[max - i] = temp; + } + + return buffer; +} + +/* Convert data array from network (big-endian) to host byte order */ +uint8_t *array_ntoh(uint8_t *buffer, size_t length) +{ +#if WORDS_BIGENDIAN + /* Big-endian host doesn't need conversion from big-endian network */ + (void)length; /* Silence the compiler */ + return buffer; +#else + /* Little-endian host needs conversion from big-endian network */ + return array_byteswap(buffer, length); +#endif +} + +/* Convert data array from little-endian to host byte order */ +uint8_t *array_letoh(uint8_t *buffer, size_t length) +{ +#if WORDS_BIGENDIAN + /* Big-endian host needs conversion from little-endian IPMI */ + return array_byteswap(buffer, length); +#else + /* Little-endian host doesn't need conversion from little-endian IPMI */ + (void)length; /* Silence the compiler */ + return buffer; +#endif +} + /* str2mac - parse-out MAC address from given string and store it * into buffer. * @@ -281,29 +319,77 @@ mac2str(const uint8_t *buf) return buf2str_extended(buf, 6, ":"); } -const char * val2str(uint16_t val, const struct valstr *vs) +/** + * Find the index of value in a valstr array + * + * @param[in] val The value to search for + * @param[in] vs The valstr array to search in + * @return >=0 The index into \p vs + * @return -1 Error: value \p val was not found in \p vs + */ +static +inline +off_t find_val_idx(uint32_t val, const struct valstr *vs) { - static char un_str[32]; - int i; - - for (i = 0; vs[i].str != NULL; i++) { - if (vs[i].val == val) - return vs[i].str; + if (vs) { + for (off_t i = 0; vs[i].str; ++i) { + if (vs[i].val == val) { + return i; + } + } } + return -1; +} + +/** + * Generate a statically allocated 'Unknown' string for the provided value. + * The function is not thread-safe (as most of ipmitool). + * + * @param[in] val The value to put into the string + * @returns A pointer to a statically allocated string + */ +static +inline +const char *unknown_val_str(uint32_t val) +{ + static char un_str[32]; memset(un_str, 0, 32); snprintf(un_str, 32, "Unknown (0x%02X)", val); return un_str; } -const char * oemval2str(uint32_t oem, uint16_t val, - const struct oemvalstr *vs) +const char * +specific_val2str(uint32_t val, + const struct valstr *specific, + const struct valstr *generic) +{ + int i; + + if (0 <= (i = find_val_idx(val, specific))) { + return specific[i].str; + } + + if (0 <= (i = find_val_idx(val, generic))) { + return generic[i].str; + } + + return unknown_val_str(val); +} + +const char *val2str(uint32_t val, const struct valstr *vs) +{ + return specific_val2str(val, NULL, vs); +} + + +const char *oemval2str(uint32_t oem, uint32_t val, + const struct oemvalstr *vs) { - static char un_str[32]; int i; - for (i = 0; vs[i].oem != 0xffffff && vs[i].str != NULL; i++) { + for (i = 0; vs[i].oem != 0xffffff && vs[i].str; i++) { /* FIXME: for now on we assume PICMG capability on all IANAs */ if ( (vs[i].oem == oem || vs[i].oem == IPMI_OEM_PICMG) && vs[i].val == val ) { @@ -311,10 +397,7 @@ const char * oemval2str(uint32_t oem, uint16_t val, } } - memset(un_str, 0, 32); - snprintf(un_str, 32, "Unknown (0x%X)", val); - - return un_str; + return unknown_val_str(val); } /* str2double - safely convert string to double @@ -559,12 +642,12 @@ int str2uchar(const char * str, uint8_t * uchr_ptr) return 0; } /* str2uchar(...) */ -uint16_t str2val(const char *str, const struct valstr *vs) +uint32_t str2val32(const char *str, const struct valstr *vs) { int i; - for (i = 0; vs[i].str != NULL; i++) { - if (strncasecmp(vs[i].str, str, __maxlen(str, vs[i].str)) == 0) + for (i = 0; vs[i].str; i++) { + if (strcasecmp(vs[i].str, str) == 0) return vs[i].val; } @@ -582,10 +665,10 @@ print_valstr(const struct valstr * vs, const char * title, int loglevel) { int i; - if (vs == NULL) + if (!vs) return; - if (title != NULL) { + if (title) { if (loglevel < 0) printf("\n%s:\n\n", title); else @@ -600,7 +683,7 @@ print_valstr(const struct valstr * vs, const char * title, int loglevel) lprintf(loglevel, "=============================================="); } - for (i = 0; vs[i].str != NULL; i++) { + for (i = 0; vs[i].str; i++) { if (loglevel < 0) { if (vs[i].val < 256) printf(" %d\t0x%02x\t%s\n", vs[i].val, vs[i].val, vs[i].str); @@ -631,18 +714,18 @@ print_valstr_2col(const struct valstr * vs, const char * title, int loglevel) { int i; - if (vs == NULL) + if (!vs) return; - if (title != NULL) { + if (title) { if (loglevel < 0) printf("\n%s:\n\n", title); else lprintf(loglevel, "\n%s:\n", title); } - for (i = 0; vs[i].str != NULL; i++) { - if (vs[i+1].str == NULL) { + for (i = 0; vs[i].str; i++) { + if (!vs[i+1].str) { /* last one */ if (loglevel < 0) { printf(" %4d %-32s\n", vs[i].val, vs[i].str); @@ -696,12 +779,12 @@ ipmi_open_file(const char * file, int rw) struct stat st1, st2; FILE * fp; - /* verify existance */ + /* verify existence */ if (lstat(file, &st1) < 0) { if (rw) { /* does not exist, ok to create */ fp = fopen(file, "w"); - if (fp == NULL) { + if (!fp) { lperror(LOG_ERR, "Unable to open file %s " "for write", file); return NULL; @@ -718,7 +801,7 @@ ipmi_open_file(const char * file, int rw) if (!rw) { /* on read skip the extra checks */ fp = fopen(file, "r"); - if (fp == NULL) { + if (!fp) { lperror(LOG_ERR, "Unable to open file %s", file); return NULL; } @@ -741,7 +824,7 @@ ipmi_open_file(const char * file, int rw) } fp = fopen(file, rw ? "w+" : "r"); - if (fp == NULL) { + if (!fp) { lperror(LOG_ERR, "Unable to open file %s", file); return NULL; } @@ -785,6 +868,7 @@ ipmi_start_daemon(struct ipmi_intf *intf) { pid_t pid; int fd; + int ret; #ifdef SIGHUP sigset_t sighup; #endif @@ -828,7 +912,11 @@ ipmi_start_daemon(struct ipmi_intf *intf) exit(0); #endif - chdir("/"); + ret = chdir("/"); + if (ret) { + lprintf(LOG_ERR, "chdir failed: %s (%d)", strerror(errno), errno); + exit(1); + } umask(0); for (fd=0; fd<64; fd++) { @@ -837,9 +925,20 @@ ipmi_start_daemon(struct ipmi_intf *intf) } fd = open("/dev/null", O_RDWR); - assert(0 == fd); - dup(fd); - dup(fd); + if (fd != STDIN_FILENO) { + lprintf(LOG_ERR, "failed to reset stdin: %s (%d)", strerror(errno), errno); + exit(1); + } + ret = dup(fd); + if (ret != STDOUT_FILENO) { + lprintf(LOG_ERR, "failed to reset stdout: %s (%d)", strerror(errno), errno); + exit(1); + } + ret = dup(fd); + if (ret != STDERR_FILENO) { + lprintf(LOG_ERR, "failed to reset stderr: %s (%d)", strerror(errno), errno); + exit(1); + } } /* eval_ccode - evaluate return value of _ipmi_* functions and print error error @@ -852,7 +951,7 @@ ipmi_start_daemon(struct ipmi_intf *intf) int eval_ccode(const int ccode) { - if (ccode == 0) { + if (!ccode) { return 0; } else if (ccode < 0) { switch (ccode) { @@ -1012,11 +1111,11 @@ ipmi_get_oem_id(struct ipmi_intf *intf) req.msg.data_len = 0; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Get Board ID command failed"); return 0; } - if (rsp->ccode > 0) { + if (rsp->ccode) { lprintf(LOG_ERR, "Get Board ID command failed: %#x %s", rsp->ccode, val2str(rsp->ccode, completion_code_vals)); return 0; @@ -1026,3 +1125,35 @@ ipmi_get_oem_id(struct ipmi_intf *intf) return oem_id; } + +/** Parse command line arguments as numeric byte values (dec or hex) + * and store them in a \p len sized buffer \p out. + * + * @param[in] argc Number of arguments + * @param[in] argv Array of arguments + * @param[out] out The output buffer + * @param[in] len Length of the output buffer in bytes (no null-termination + * is assumed, the input data is treated as raw byte values, + * not as a string. + * + * @returns A success status indicator + * @return false Error + * @return true Success + */ +bool +args2buf(int argc, char *argv[], uint8_t *out, size_t len) +{ + size_t i; + + for (i = 0; i < len && i < (size_t)argc; ++i) { + uint8_t byte; + + if (str2uchar(argv[i], &byte)) { + lprintf(LOG_ERR, "Bad byte value: %s", argv[i]); + return false; + } + + out[i] = byte; + } + return true; +} diff --git a/lib/ipmi_cfgp.c b/lib/ipmi_cfgp.c index b8af80d..4131a65 100644 --- a/lib/ipmi_cfgp.c +++ b/lib/ipmi_cfgp.c @@ -30,7 +30,11 @@ * POSSIBILITY OF SUCH DAMAGE. */ -#include <malloc.h> +#ifdef HAVE_MALLOC_H +# include <malloc.h> +#else +# include <stdlib.h> +#endif #include <string.h> #include <ipmitool/helper.h> @@ -49,7 +53,7 @@ ipmi_cfgp_init(struct ipmi_cfgp_ctx *ctx, const struct ipmi_cfgp *set, unsigned int count, const char *cmdname, ipmi_cfgp_handler_t handler, void *priv) { - if (ctx == NULL || set == NULL || handler == NULL || !cmdname) { + if (!ctx || !set || !handler || !cmdname) { return -1; } @@ -74,7 +78,7 @@ ipmi_cfgp_uninit(struct ipmi_cfgp_ctx *ctx) { struct ipmi_cfgp_data *d; - if (ctx == NULL) { + if (!ctx) { return -1; } @@ -123,7 +127,7 @@ ipmi_cfgp_parse_sel(struct ipmi_cfgp_ctx *ctx, { const struct ipmi_cfgp *p; - if (ctx == NULL || argv == NULL || sel == NULL) { + if (!ctx || !argv || !sel) { return -1; } @@ -137,7 +141,7 @@ ipmi_cfgp_parse_sel(struct ipmi_cfgp_ctx *ctx, } p = lookup_cfgp(ctx, argv[0]); - if (p == NULL) { + if (!p) { lprintf(LOG_ERR, "invalid parameter"); return -1; } @@ -201,11 +205,11 @@ cfgp_add_data(struct ipmi_cfgp_ctx *ctx, struct ipmi_cfgp_data *data) static void cfgp_usage(const struct ipmi_cfgp *p, int write) { - if (p->name == NULL) { + if (!p->name) { return; } - if (write && p->format == NULL) { + if (write && !p->format) { return; } @@ -227,7 +231,7 @@ ipmi_cfgp_usage(const struct ipmi_cfgp *set, int count, int write) const struct ipmi_cfgp *p; int i; - if (set == NULL) { + if (!set) { return; } @@ -263,7 +267,7 @@ ipmi_cfgp_parse_data(struct ipmi_cfgp_ctx *ctx, struct ipmi_cfgp_data *data; struct ipmi_cfgp_action action; - if (ctx == NULL || sel == NULL || argv == NULL) { + if (!ctx || !sel || !argv) { return -1; } @@ -290,7 +294,7 @@ ipmi_cfgp_parse_data(struct ipmi_cfgp_ctx *ctx, } data = malloc(sizeof(struct ipmi_cfgp_data) + p->size); - if (data == NULL) { + if (!data) { return -1; } @@ -370,7 +374,7 @@ cfgp_get_param(struct ipmi_cfgp_ctx *ctx, const struct ipmi_cfgp *p, do { data = malloc(sizeof(struct ipmi_cfgp_data) + p->size); - if (data == NULL) { + if (!data) { return -1; } @@ -422,7 +426,7 @@ ipmi_cfgp_get(struct ipmi_cfgp_ctx *ctx, const struct ipmi_cfgp_sel *sel) int i; int ret; - if (ctx == NULL || sel == NULL) { + if (!ctx || !sel) { return -1; } @@ -461,7 +465,7 @@ cfgp_do_action(struct ipmi_cfgp_ctx *ctx, int action_type, struct ipmi_cfgp_action action; int ret; - if (ctx == NULL || sel == NULL) { + if (!ctx || !sel) { return -1; } @@ -470,7 +474,7 @@ cfgp_do_action(struct ipmi_cfgp_ctx *ctx, int action_type, action.argv = NULL; action.file = file; - for (data = ctx->v; data != NULL; data = data->next) { + for (data = ctx->v; data; data = data->next) { if (sel->param != -1 && sel->param != data->sel.param) { continue; } @@ -523,7 +527,7 @@ int ipmi_cfgp_save(struct ipmi_cfgp_ctx *ctx, const struct ipmi_cfgp_sel *sel, FILE *file) { - if (file == NULL) { + if (!file) { return -1; } @@ -534,7 +538,7 @@ int ipmi_cfgp_print(struct ipmi_cfgp_ctx *ctx, const struct ipmi_cfgp_sel *sel, FILE *file) { - if (file == NULL) { + if (!file) { return -1; } diff --git a/lib/ipmi_channel.c b/lib/ipmi_channel.c index fab2e54..bb7e60a 100644 --- a/lib/ipmi_channel.c +++ b/lib/ipmi_channel.c @@ -75,7 +75,7 @@ _ipmi_get_channel_access(struct ipmi_intf *intf, struct ipmi_rq req = {0}; uint8_t data[2]; - if (channel_access == NULL) { + if (!channel_access) { return (-3); } data[0] = channel_access->channel & 0x0F; @@ -87,9 +87,9 @@ _ipmi_get_channel_access(struct ipmi_intf *intf, req.msg.data_len = 2; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { return (-1); - } else if (rsp->ccode != 0) { + } else if (rsp->ccode) { return rsp->ccode; } else if (rsp->data_len != 2) { return (-2); @@ -118,7 +118,7 @@ _ipmi_get_channel_info(struct ipmi_intf *intf, struct ipmi_rq req = {0}; uint8_t data[1]; - if (channel_info == NULL) { + if (!channel_info) { return (-3); } data[0] = channel_info->channel & 0x0F; @@ -128,9 +128,9 @@ _ipmi_get_channel_info(struct ipmi_intf *intf, req.msg.data_len = 1; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { return (-1); - } else if (rsp->ccode != 0) { + } else if (rsp->ccode) { return rsp->ccode; } else if (rsp->data_len != 9) { return (-2); @@ -202,7 +202,7 @@ _ipmi_set_channel_access(struct ipmi_intf *intf, req.msg.data_len = 3; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { return (-1); } return rsp->ccode; @@ -225,7 +225,7 @@ iana_string(uint32_t iana) * ipmi_1_5_authtypes * * Create a string describing the supported authentication types as - * specificed by the parameter n + * specified by the parameter n */ static const char * ipmi_1_5_authtypes(uint8_t n) @@ -244,10 +244,28 @@ ipmi_1_5_authtypes(uint8_t n) return supportedTypes; } -uint8_t -ipmi_current_channel_medium(struct ipmi_intf *intf) +void +ipmi_current_channel_info(struct ipmi_intf *intf, + struct channel_info_t *chinfo) { - return ipmi_get_channel_medium(intf, 0xE); + int ccode = 0; + + chinfo->channel = CH_CURRENT; + ccode = _ipmi_get_channel_info(intf, chinfo); + if (ccode) { + if (ccode != IPMI_CC_INV_DATA_FIELD_IN_REQ) { + if (ccode > 0) { + lprintf(LOG_ERR, "Get Channel Info command failed: %s", + val2str(ccode, completion_code_vals)); + } + else { + eval_ccode(ccode); + } + } + chinfo->channel = CH_UNKNOWN; + chinfo->medium = IPMI_CHANNEL_MEDIUM_RESERVED; + } + return; } /** @@ -276,7 +294,7 @@ ipmi_get_channel_auth_cap(struct ipmi_intf *intf, uint8_t channel, uint8_t priv) rsp = intf->sendrecv(intf, &req); - if ((rsp == NULL) || (rsp->ccode > 0)) { + if (!rsp || rsp->ccode) { /* * It's very possible that this failed because we asked for IPMI v2 data * Ask again, without requesting IPMI v2 data @@ -284,11 +302,11 @@ ipmi_get_channel_auth_cap(struct ipmi_intf *intf, uint8_t channel, uint8_t priv) msg_data[0] &= 0x7F; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Unable to Get Channel Authentication Capabilities"); return (-1); } - if (rsp->ccode > 0) { + if (rsp->ccode) { lprintf(LOG_ERR, "Get Channel Authentication Capabilities failed: %s", val2str(rsp->ccode, completion_code_vals)); return (-1); @@ -342,86 +360,152 @@ ipmi_get_channel_auth_cap(struct ipmi_intf *intf, uint8_t channel, uint8_t priv) return 0; } -static int -ipmi_get_channel_cipher_suites(struct ipmi_intf *intf, const char *payload_type, - uint8_t channel) +static inline size_t parse_cipher_suite(uint8_t *cipher_suite_data, + size_t data_len, + uint32_t *iana, + uint8_t *auth_alg, + uint8_t *integrity_alg, + uint8_t *crypt_alg, + enum cipher_suite_ids *cipher_suite_id) +{ + size_t size = 0; + const char *incomplete = "Incomplete data record in cipher suite data"; + + if (*cipher_suite_data == STANDARD_CIPHER_SUITE) { + struct std_cipher_suite_record_t *record = + (struct std_cipher_suite_record_t*)cipher_suite_data; + + /* Verify that we have at least a full record left; id + 3 algs */ + if (data_len < sizeof(*record)) { + lprintf(LOG_INFO, "%s", incomplete); + goto out; + } + + /* IANA code remains default (0) */ + *cipher_suite_id = record->cipher_suite_id; + *auth_alg = CIPHER_ALG_MASK & record->auth_alg; + *integrity_alg = CIPHER_ALG_MASK & record->integrity_alg; + *crypt_alg = CIPHER_ALG_MASK & record->crypt_alg; + size = sizeof(*record); + } else if (*cipher_suite_data == OEM_CIPHER_SUITE) { + /* OEM record type */ + struct oem_cipher_suite_record_t *record = + (struct oem_cipher_suite_record_t*)cipher_suite_data; + /* Verify that we have at least a full record left + * id + iana + 3 algs + */ + if (data_len < sizeof(*record)) { + lprintf(LOG_INFO, "%s", incomplete); + goto out; + } + + /* Grab the IANA */ + *iana = ipmi24toh(record->iana); + *cipher_suite_id = record->cipher_suite_id; + *auth_alg = CIPHER_ALG_MASK & record->auth_alg; + *integrity_alg = CIPHER_ALG_MASK & record->integrity_alg; + *crypt_alg = CIPHER_ALG_MASK & record->crypt_alg; + size = sizeof(*record); + } else { + lprintf(LOG_INFO, "Bad start of record byte in cipher suite data " + "(value %x)", *cipher_suite_data); + } + +out: + return size; +} + +static size_t +parse_channel_cipher_suite_data(uint8_t *cipher_suite_data, size_t data_len, + struct cipher_suite_info* suites, + size_t nr_suites) +{ + size_t count = 0; + size_t offset = 0; + + /* Default everything to zeroes */ + memset(suites, 0, sizeof(*suites) * nr_suites); + + while (offset < data_len && count < nr_suites) { + size_t suite_size; + + /* Set non-zero defaults */ + suites[count].auth_alg = IPMI_AUTH_RAKP_NONE; + suites[count].integrity_alg = IPMI_INTEGRITY_NONE; + suites[count].crypt_alg = IPMI_CRYPT_NONE; + + /* Update fields from cipher suite data */ + suite_size = parse_cipher_suite(cipher_suite_data + offset, + data_len - offset, + &suites[count].iana, + &suites[count].auth_alg, + &suites[count].integrity_alg, + &suites[count].crypt_alg, + &suites[count].cipher_suite_id); + + if (!suite_size) { + lprintf(LOG_INFO, + "Failed to parse cipher suite data at offset %d", + offset); + break; + } + + offset += suite_size; + count++; + } + return count; +} + +int +ipmi_get_channel_cipher_suites(struct ipmi_intf *intf, + const char *payload_type, + uint8_t channel, + struct cipher_suite_info *suites, + size_t *count) { struct ipmi_rs *rsp; struct ipmi_rq req; uint8_t rqdata[3]; - uint32_t iana; - uint8_t auth_alg, integrity_alg, crypt_alg; - uint8_t cipher_suite_id; uint8_t list_index = 0; /* 0x40 sets * 16 bytes per set */ - uint8_t cipher_suite_data[1024]; - uint16_t offset = 0; - /* how much was returned, total */ - uint16_t cipher_suite_data_length = 0; + uint8_t cipher_suite_data[MAX_CIPHER_SUITE_RECORD_OFFSET * + MAX_CIPHER_SUITE_DATA_LEN]; + size_t offset = 0; + size_t nr_suites = 0; + + if (!suites || !count || !*count) + return -1; + nr_suites = *count; + *count = 0; memset(cipher_suite_data, 0, sizeof(cipher_suite_data)); - + memset(&req, 0, sizeof(req)); req.msg.netfn = IPMI_NETFN_APP; req.msg.cmd = IPMI_GET_CHANNEL_CIPHER_SUITES; req.msg.data = rqdata; - req.msg.data_len = 3; + req.msg.data_len = sizeof(rqdata); rqdata[0] = channel; - rqdata[1] = ((strncmp(payload_type, "ipmi", 4) == 0)? 0: 1); - /* Always ask for cipher suite format */ - rqdata[2] = 0x80; - - rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { - lprintf(LOG_ERR, "Unable to Get Channel Cipher Suites"); - return -1; - } - if (rsp->ccode > 0) { - lprintf(LOG_ERR, "Get Channel Cipher Suites failed: %s", - val2str(rsp->ccode, completion_code_vals)); - return -1; - } - - - /* - * Grab the returned channel number once. We assume it's the same - * in future calls. - */ - if (rsp->data_len >= 1) { - channel = rsp->data[0]; - } - - while ((rsp->data_len > 1) && (rsp->data_len == 17) && (list_index < 0x3F)) { - /* - * We got back cipher suite data -- store it. - * printf("copying data to offset %d\n", offset); - * printbuf(rsp->data + 1, rsp->data_len - 1, "this is the data"); - */ - memcpy(cipher_suite_data + offset, rsp->data + 1, rsp->data_len - 1); - offset += rsp->data_len - 1; - - /* - * Increment our list for the next call - */ - ++list_index; - rqdata[2] = (rqdata[2] & 0x80) + list_index; + rqdata[1] = strcmp(payload_type, "ipmi") ? 1 : 0; + do { + /* Always ask for cipher suite format */ + rqdata[2] = LIST_ALGORITHMS_BY_CIPHER_SUITE | list_index; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Unable to Get Channel Cipher Suites"); return -1; } - if (rsp->ccode > 0) { + if (rsp->ccode + || rsp->data_len < 1 + || rsp->data_len > sizeof(uint8_t) + MAX_CIPHER_SUITE_DATA_LEN) + { lprintf(LOG_ERR, "Get Channel Cipher Suites failed: %s", val2str(rsp->ccode, completion_code_vals)); return -1; } - } - - /* Copy last chunk */ - if(rsp->data_len > 1) { /* * We got back cipher suite data -- store it. * printf("copying data to offset %d\n", offset); @@ -429,88 +513,49 @@ ipmi_get_channel_cipher_suites(struct ipmi_intf *intf, const char *payload_type, */ memcpy(cipher_suite_data + offset, rsp->data + 1, rsp->data_len - 1); offset += rsp->data_len - 1; - } - /* We can chomp on all our data now. */ - cipher_suite_data_length = offset; - offset = 0; + /* + * Increment our list for the next call + */ + ++list_index; + } while ((rsp->data_len == (sizeof(uint8_t) + MAX_CIPHER_SUITE_DATA_LEN)) + && (list_index < MAX_CIPHER_SUITE_RECORD_OFFSET)); - if (! csv_output) { - printf("ID IANA Auth Alg Integrity Alg Confidentiality Alg\n"); - } - while (offset < cipher_suite_data_length) { - if (cipher_suite_data[offset++] == 0xC0) { - /* standard type */ - iana = 0; + *count = parse_channel_cipher_suite_data(cipher_suite_data, offset, suites, + nr_suites); + return 0; +} - /* Verify that we have at least a full record left; id + 3 algs */ - if ((cipher_suite_data_length - offset) < 4) { - lprintf(LOG_ERR, "Incomplete data record in cipher suite data"); - return -1; - } - cipher_suite_id = cipher_suite_data[offset++]; - } else if (cipher_suite_data[offset++] == 0xC1) { - /* OEM record type */ - /* Verify that we have at least a full record left - * id + iana + 3 algs - */ - if ((cipher_suite_data_length - offset) < 4) { - lprintf(LOG_ERR, "Incomplete data record in cipher suite data"); - return -1; - } +static int +ipmi_print_channel_cipher_suites(struct ipmi_intf *intf, + const char *payload_type, + uint8_t channel) +{ + int rc; + size_t i = 0; + struct cipher_suite_info suites[MAX_CIPHER_SUITE_COUNT]; + size_t nr_suites = sizeof(*suites); + const char *header_str = +"ID IANA Auth Alg Integrity Alg Confidentiality Alg"; - cipher_suite_id = cipher_suite_data[offset++]; + rc = ipmi_get_channel_cipher_suites(intf, payload_type, channel, + suites, &nr_suites); - /* Grab the IANA */ - iana = - cipher_suite_data[offset] | - (cipher_suite_data[offset + 1] << 8) | - (cipher_suite_data[offset + 2] << 16); - offset += 3; - } else { - lprintf(LOG_ERR, "Bad start of record byte in cipher suite data"); - return -1; - } + if (rc < 0) + return rc; - /* - * Grab the algorithms for this cipher suite. I guess we can't be - * sure of what order they'll come in. Also, I suppose we default - * to the NONE algorithm if one were absent. This part of the spec is - * poorly written -- I have read the errata document. For now, I'm only - * allowing one algorithm per type (auth, integrity, crypt) because I - * don't I understand how it could be otherwise. - */ - auth_alg = IPMI_AUTH_RAKP_NONE; - integrity_alg = IPMI_INTEGRITY_NONE; - crypt_alg = IPMI_CRYPT_NONE; - - while (((cipher_suite_data[offset] & 0xC0) != 0xC0) && - ((cipher_suite_data_length - offset) > 0)) - { - switch (cipher_suite_data[offset] & 0xC0) - { - case 0x00: - /* Authentication algorithm specifier */ - auth_alg = cipher_suite_data[offset++] & 0x3F; - break; - case 0x40: - /* Interity algorithm specifier */ - integrity_alg = cipher_suite_data[offset++] & 0x3F; - break; - case 0x80: - /* Confidentiality algorithm specifier */ - crypt_alg = cipher_suite_data[offset++] & 0x3F; - break; - } - } + if (!csv_output) { + printf("%s\n", header_str); + } + for (i = 0; i < nr_suites; i++) { /* We have everything we need to spit out a cipher suite record */ - printf((csv_output? "%d,%s,%s,%s,%s\n" : - "%-4d %-7s %-15s %-15s %-15s\n"), - cipher_suite_id, - iana_string(iana), - val2str(auth_alg, ipmi_auth_algorithms), - val2str(integrity_alg, ipmi_integrity_algorithms), - val2str(crypt_alg, ipmi_encryption_algorithms)); + printf(csv_output ? "%d,%s,%s,%s,%s\n" + : "%-4d %-7s %-15s %-15s %-15s\n", + suites[i].cipher_suite_id, + iana_string(suites[i].iana), + val2str(suites[i].auth_alg, ipmi_auth_algorithms), + val2str(suites[i].integrity_alg, ipmi_integrity_algorithms), + val2str(suites[i].crypt_alg, ipmi_encryption_algorithms)); } return 0; } @@ -648,8 +693,9 @@ ipmi_get_channel_info(struct ipmi_intf *intf, uint8_t channel) * * @channel - IPMI Channel * - * returns - IPMI Channel Medium, IPMI_CHANNEL_MEDIUM_RESERVED if ccode > 0, - * 0 on error. + * @returns IPMI Channel Medium + * @retval IPMI_CHANNEL_MEDIUM_RESERVED if ccode was not IPMI_CC_OK + * @retval 0 on error */ uint8_t ipmi_get_channel_medium(struct ipmi_intf *intf, uint8_t channel) @@ -659,13 +705,16 @@ ipmi_get_channel_medium(struct ipmi_intf *intf, uint8_t channel) channel_info.channel = channel; ccode = _ipmi_get_channel_info(intf, &channel_info); - if (ccode == 0xCC) { - return IPMI_CHANNEL_MEDIUM_RESERVED; - } else if (ccode < 0 && eval_ccode(ccode) != 0) { - return 0; - } else if (ccode > 0) { - lprintf(LOG_ERR, "Get Channel Info command failed: %s", - val2str(ccode, completion_code_vals)); + if (ccode) { + if (ccode != IPMI_CC_INV_DATA_FIELD_IN_REQ) { + if (ccode > 0) { + lprintf(LOG_ERR, "Get Channel Info command failed: %s", + val2str(ccode, completion_code_vals)); + } + else { + eval_ccode(ccode); + } + } return IPMI_CHANNEL_MEDIUM_RESERVED; } lprintf(LOG_DEBUG, "Channel type: %s", @@ -754,9 +803,27 @@ ipmi_set_user_access(struct ipmi_intf *intf, int argc, char **argv) int ccode = 0; int i = 0; uint8_t channel = 0; - uint8_t priv = 0; uint8_t user_id = 0; - if (argc > 0 && strncmp(argv[0], "help", 4) == 0) { + struct { + const char *option; + enum { + UA_INTEGER, /* direct integer value */ + UA_BOOLEAN, /* off/disable = false, on/enable = true */ + UA_BOOLEAN_INVERSE /* off/disable = true, on/enable = false */ + } type; + uint8_t *val; + uint8_t min; /* minimum value for UA_INTEGER options */ + uint8_t max; /* maximum value for UA_INTEGER options */ + } options[] = { + { "callin=", UA_BOOLEAN_INVERSE, &user_access.callin_callback, 0, 0}, + { "link=", UA_BOOLEAN, &user_access.link_auth, 0, 0}, + { "ipmi=", UA_BOOLEAN, &user_access.ipmi_messaging, 0, 0}, + { "privilege=", UA_INTEGER, &user_access.privilege_limit + , IPMI_SESSION_PRIV_CALLBACK + , IPMI_SESSION_PRIV_NOACCESS }, + }; + + if (argc > 0 && !strcmp(argv[0], "help")) { printf_channel_usage(); return 0; } else if (argc < 3) { @@ -778,33 +845,46 @@ ipmi_set_user_access(struct ipmi_intf *intf, int argc, char **argv) return (-1); } for (i = 2; i < argc; i ++) { - if (strncmp(argv[i], "callin=", 7) == 0) { - if (strncmp(argv[i] + 7, "off", 3) == 0) { - user_access.callin_callback = 1; - } else { - user_access.callin_callback = 0; - } - } else if (strncmp(argv[i], "link=", 5) == 0) { - if (strncmp(argv[i] + 5, "off", 3) == 0) { - user_access.link_auth = 0; - } else { - user_access.link_auth = 1; - } - } else if (strncmp(argv[i], "ipmi=", 5) == 0) { - if (strncmp(argv[i] + 5, "off", 3) == 0) { - user_access.ipmi_messaging = 0; - } else { - user_access.ipmi_messaging = 1; - } - } else if (strncmp(argv[i], "privilege=", 10) == 0) { - if (str2uchar(argv[i] + 10, &priv) != 0) { - lprintf(LOG_ERR, - "Numeric value expected, but '%s' given.", - argv[i] + 10); - return (-1); + size_t j; + for (j = 0; j < ARRAY_SIZE(options); ++j) { + const char *opt = argv[i]; + const int optlen = strlen(options[j].option); + if (!strncmp(opt, options[j].option, optlen)) { + const char *optval = opt + optlen; + uint16_t val; + + if (UA_INTEGER != options[j].type) { + bool boolval = (UA_BOOLEAN_INVERSE == options[j].type) + ? false + : true; + *options[j].val = boolval; + if (!strcmp(optval, "off") + || !strcmp(optval, "disable") + || !strcmp(optval, "no")) + { + boolval = !boolval; + } + } else if (UINT8_MAX + != (val = str2val(optval, ipmi_privlvl_vals))) + { + *options[j].val = (uint8_t)val; + } else if (str2uchar(optval, options[j].val)) { + lprintf(LOG_ERR + , "Numeric [%hhu-%hhu] value expected, " + "but '%s' given." + , options[j].min + , options[j].max + , optval); + return (-1); + } + lprintf(LOG_DEBUG + , "Option %s=%hhu" + , options[j].option + , *options[j].val); + break; } - user_access.privilege_limit = priv; - } else { + } + if (ARRAY_SIZE(options) == j) { lprintf(LOG_ERR, "Invalid option: %s\n", argv[i]); return (-1); } @@ -831,10 +911,10 @@ ipmi_channel_main(struct ipmi_intf *intf, int argc, char **argv) lprintf(LOG_ERR, "Not enough parameters given."); printf_channel_usage(); return (-1); - } else if (strncmp(argv[0], "help", 4) == 0) { + } else if (!strcmp(argv[0], "help")) { printf_channel_usage(); return 0; - } else if (strncmp(argv[0], "authcap", 7) == 0) { + } else if (!strcmp(argv[0], "authcap")) { if (argc != 3) { printf_channel_usage(); return (-1); @@ -844,7 +924,7 @@ ipmi_channel_main(struct ipmi_intf *intf, int argc, char **argv) return (-1); } retval = ipmi_get_channel_auth_cap(intf, channel, priv); - } else if (strncmp(argv[0], "getaccess", 10) == 0) { + } else if (!strcmp(argv[0], "getaccess")) { uint8_t user_id = 0; if ((argc < 2) || (argc > 3)) { lprintf(LOG_ERR, "Not enough parameters given."); @@ -860,9 +940,9 @@ ipmi_channel_main(struct ipmi_intf *intf, int argc, char **argv) } } retval = ipmi_get_user_access(intf, channel, user_id); - } else if (strncmp(argv[0], "setaccess", 9) == 0) { + } else if (!strcmp(argv[0], "setaccess")) { return ipmi_set_user_access(intf, (argc - 1), &(argv[1])); - } else if (strncmp(argv[0], "info", 4) == 0) { + } else if (!strcmp(argv[0], "info")) { channel = 0xE; if (argc > 2) { printf_channel_usage(); @@ -874,11 +954,11 @@ ipmi_channel_main(struct ipmi_intf *intf, int argc, char **argv) } } retval = ipmi_get_channel_info(intf, channel); - } else if (strncmp(argv[0], "getciphers", 10) == 0) { + } else if (!strcmp(argv[0], "getciphers")) { /* channel getciphers <ipmi|sol> [channel] */ channel = 0xE; if ((argc < 2) || (argc > 3) || - (strncmp(argv[1], "ipmi", 4) && strncmp(argv[1], "sol", 3))) { + (strcmp(argv[1], "ipmi") && strcmp(argv[1], "sol"))) { printf_channel_usage(); return (-1); } @@ -887,9 +967,9 @@ ipmi_channel_main(struct ipmi_intf *intf, int argc, char **argv) return (-1); } } - retval = ipmi_get_channel_cipher_suites(intf, - argv[1], /* ipmi | sol */ - channel); + retval = ipmi_print_channel_cipher_suites(intf, + argv[1], /* ipmi | sol */ + channel); } else { lprintf(LOG_ERR, "Invalid CHANNEL command: %s\n", argv[0]); printf_channel_usage(); diff --git a/lib/ipmi_chassis.c b/lib/ipmi_chassis.c index 7b5c2a8..7ac6770 100644 --- a/lib/ipmi_chassis.c +++ b/lib/ipmi_chassis.c @@ -29,13 +29,13 @@ * LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, * EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. */ -#define _SVID_SOURCE || _BSD_SOURCE || _POSIX_C_SOURCE >= 1 || \ - _XOPEN_SOURCE || _POSIX_SOURCE #include <stdlib.h> #include <string.h> #include <stdio.h> #include <time.h> +#include <errno.h> +#include <limits.h> #include <ipmitool/bswap.h> #include <ipmitool/helper.h> @@ -44,9 +44,132 @@ #include <ipmitool/ipmi_intf.h> #include <ipmitool/ipmi_strings.h> #include <ipmitool/ipmi_chassis.h> +#include <ipmitool/ipmi_time.h> + +#define CHASSIS_BOOT_MBOX_IANA_SZ 3 +#define CHASSIS_BOOT_MBOX_BLOCK_SZ 16 +#define CHASSIS_BOOT_MBOX_BLOCK0_SZ \ + (CHASSIS_BOOT_MBOX_BLOCK_SZ - CHASSIS_BOOT_MBOX_IANA_SZ) +#define CHASSIS_BOOT_MBOX_MAX_BLOCK 0xFF +#define CHASSIS_BOOT_MBOX_MAX_BLOCKS (CHASSIS_BOOT_MBOX_MAX_BLOCK + 1) + +/* Get/Set system boot option boot flags bit definitions */ +/* Boot flags byte 1 bits */ +#define BF1_VALID_SHIFT 7 +#define BF1_INVALID 0 +#define BF1_VALID (1 << BF1_VALID_SHIFT) +#define BF1_VALID_MASK BF1_VALID + +#define BF1_PERSIST_SHIFT 6 +#define BF1_ONCE 0 +#define BF1_PERSIST (1 << BF1_PERSIST_SHIFT) +#define BF1_PERSIST_MASK BF1_PERSIST + +#define BF1_BOOT_TYPE_SHIFT 5 +#define BF1_BOOT_TYPE_LEGACY 0 +#define BF1_BOOT_TYPE_EFI (1 << BF1_BOOT_TYPE_SHIFT) +#define BF1_BOOT_TYPE_MASK BF1_BOOT_TYPE_EFI + +/* Boot flags byte 2 bits */ +#define BF2_CMOS_CLEAR_SHIFT 7 +#define BF2_CMOS_CLEAR (1 << BF2_CMOS_CLEAR_SHIFT) +#define BF2_CMOS_CLEAR_MASK BF2_CMOS_CLEAR + +#define BF2_KEYLOCK_SHIFT 6 +#define BF2_KEYLOCK (1 << BF2_KEYLOCK_SHIFT) +#define BF2_KEYLOCK_MASK BF2_KEYLOCK + +#define BF2_BOOTDEV_SHIFT 2 +#define BF2_BOOTDEV_DEFAULT (0 << BF2_BOOTDEV_SHIFT) +#define BF2_BOOTDEV_PXE (1 << BF2_BOOTDEV_SHIFT) +#define BF2_BOOTDEV_HDD (2 << BF2_BOOTDEV_SHIFT) +#define BF2_BOOTDEV_HDD_SAFE (3 << BF2_BOOTDEV_SHIFT) +#define BF2_BOOTDEV_DIAG_PART (4 << BF2_BOOTDEV_SHIFT) +#define BF2_BOOTDEV_CDROM (5 << BF2_BOOTDEV_SHIFT) +#define BF2_BOOTDEV_SETUP (6 << BF2_BOOTDEV_SHIFT) +#define BF2_BOOTDEV_REMOTE_FDD (7 << BF2_BOOTDEV_SHIFT) +#define BF2_BOOTDEV_REMOTE_CDROM (8 << BF2_BOOTDEV_SHIFT) +#define BF2_BOOTDEV_REMOTE_PRIMARY_MEDIA (9 << BF2_BOOTDEV_SHIFT) +#define BF2_BOOTDEV_REMOTE_HDD (11 << BF2_BOOTDEV_SHIFT) +#define BF2_BOOTDEV_FDD (15 << BF2_BOOTDEV_SHIFT) +#define BF2_BOOTDEV_MASK (0xF << BF2_BOOTDEV_SHIFT) + +#define BF2_BLANK_SCREEN_SHIFT 1 +#define BF2_BLANK_SCREEN (1 << BF2_BLANK_SCREEN_SHIFT) +#define BF2_BLANK_SCREEN_MASK BF2_BLANK_SCREEN + +#define BF2_RESET_LOCKOUT_SHIFT 0 +#define BF2_RESET_LOCKOUT (1 << BF2_RESET_LOCKOUT_SHIFT) +#define BF2_RESET_LOCKOUT_MASK BF2_RESET_LOCKOUT + +/* Boot flags byte 3 bits */ +#define BF3_POWER_LOCKOUT_SHIFT 7 +#define BF3_POWER_LOCKOUT (1 << BF3_POWER_LOCKOUT_SHIFT) +#define BF3_POWER_LOCKOUT_MASK BF3_POWER_LOCKOUT + +#define BF3_VERBOSITY_SHIFT 5 +#define BF3_VERBOSITY_DEFAULT (0 << BF3_VERBOSITY_SHIFT) +#define BF3_VERBOSITY_QUIET (1 << BF3_VERBOSITY_SHIFT) +#define BF3_VERBOSITY_VERBOSE (2 << BF3_VERBOSITY_SHIFT) +#define BF3_VERBOSITY_MASK (3 << BF3_VERBOSITY_SHIFT) + +#define BF3_EVENT_TRAPS_SHIFT 4 +#define BF3_EVENT_TRAPS (1 << BF3_EVENT_TRAPS_SHIFT) +#define BF3_EVENT_TRAPS_MASK BF3_EVENT_TRAPS + +#define BF3_PASSWD_BYPASS_SHIFT 3 +#define BF3_PASSWD_BYPASS (1 << BF3_PASSWD_BYPASS_SHIFT) +#define BF3_PASSWD_BYPASS_MASK BF3_PASSWD_BYPASS + +#define BF3_SLEEP_LOCKOUT_SHIFT 2 +#define BF3_SLEEP_LOCKOUT (1 << BF3_SLEEP_LOCKOUT_SHIFT) +#define BF3_SLEEP_LOCKOUT_MASK BF3_SLEEP_LOCKOUT + +#define BF3_CONSOLE_REDIR_SHIFT 0 +#define BF3_CONSOLE_REDIR_DEFAULT (0 << BF3_CONSOLE_REDIR_SHIFT) +#define BF3_CONSOLE_REDIR_SUPPRESS (1 << BF3_CONSOLE_REDIR_SHIFT) +#define BF3_CONSOLE_REDIR_ENABLE (2 << BF3_CONSOLE_REDIR_SHIFT) +#define BF3_CONSOLE_REDIR_MASK (3 << BF3_CONSOLE_REDIR_SHIFT) + +/* Boot flags byte 4 bits */ +#define BF4_SHARED_MODE_SHIFT 3 +#define BF4_SHARED_MODE (1 << BF4_SHARED_MODE_SHIFT) +#define BF4_SHARED_MODE_MASK BF4_SHARED_MODE + +#define BF4_BIOS_MUX_SHIFT 0 +#define BF4_BIOS_MUX_DEFAULT (0 << BF4_BIOS_MUX_SHIFT) +#define BF4_BIOS_MUX_BMC (1 << BF4_BIOS_MUX_SHIFT) +#define BF4_BIOS_MUX_SYSTEM (2 << BF4_BIOS_MUX_SHIFT) +#define BF4_BIOS_MUX_MASK (7 << BF4_BIOS_MUX_SHIFT) + + +typedef struct { + uint8_t iana[CHASSIS_BOOT_MBOX_IANA_SZ]; + uint8_t data[CHASSIS_BOOT_MBOX_BLOCK0_SZ]; +} mbox_b0_data_t; + +typedef struct { + uint8_t block; + union { + uint8_t data[CHASSIS_BOOT_MBOX_BLOCK_SZ]; + mbox_b0_data_t b0; + }; +} mbox_t; extern int verbose; +static const struct valstr get_bootparam_cc_vals[] = { + { 0x80, "Unsupported parameter" }, + { 0x00, NULL } +}; + +static const struct valstr set_bootparam_cc_vals[] = { + { 0x80, "Unsupported parameter" }, + { 0x81, "Attempt to set 'in progress' while not in 'complete' state" }, + { 0x82, "Parameter is read-only" }, + { 0x00, NULL } +}; + int ipmi_chassis_power_status(struct ipmi_intf * intf) { @@ -59,11 +182,11 @@ ipmi_chassis_power_status(struct ipmi_intf * intf) req.msg.data_len = 0; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Unable to get Chassis Power Status"); return -1; } - if (rsp->ccode > 0) { + if (rsp->ccode) { lprintf(LOG_ERR, "Get Chassis Power Status failed: %s", val2str(rsp->ccode, completion_code_vals)); return -1; @@ -98,12 +221,12 @@ ipmi_chassis_power_control(struct ipmi_intf * intf, uint8_t ctl) req.msg.data_len = 1; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Unable to set Chassis Power Control to %s", val2str(ctl, ipmi_chassis_power_control_vals)); return -1; } - if (rsp->ccode > 0) { + if (rsp->ccode) { lprintf(LOG_ERR, "Set Chassis Power Control to %s failed: %s", val2str(ctl, ipmi_chassis_power_control_vals), val2str(rsp->ccode, completion_code_vals)); @@ -131,8 +254,8 @@ ipmi_chassis_identify(struct ipmi_intf * intf, char * arg) req.msg.netfn = IPMI_NETFN_CHASSIS; req.msg.cmd = 0x4; - if (arg != NULL) { - if (strncmp(arg, "force", 5) == 0) { + if (arg) { + if (!strcmp(arg, "force")) { identify_data.force_on = 1; } else { if ( (rc = str2uchar(arg, &identify_data.interval)) != 0) { @@ -154,11 +277,11 @@ ipmi_chassis_identify(struct ipmi_intf * intf, char * arg) } rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Unable to set Chassis Identify"); return -1; } - if (rsp->ccode > 0) { + if (rsp->ccode) { lprintf(LOG_ERR, "Set Chassis Identify failed: %s", val2str(rsp->ccode, completion_code_vals)); if (identify_data.force_on != 0) { @@ -172,7 +295,7 @@ ipmi_chassis_identify(struct ipmi_intf * intf, char * arg) } printf("Chassis identify interval: "); - if (arg == NULL) { + if (!arg) { printf("default (15 seconds)\n"); } else { if (identify_data.force_on != 0) { @@ -202,11 +325,11 @@ ipmi_chassis_poh(struct ipmi_intf * intf) req.msg.cmd = 0xf; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Unable to get Chassis Power-On-Hours"); return -1; } - if (rsp->ccode > 0) { + if (rsp->ccode) { lprintf(LOG_ERR, "Get Chassis Power-On-Hours failed: %s", val2str(rsp->ccode, completion_code_vals)); return -1; @@ -245,52 +368,18 @@ ipmi_chassis_restart_cause(struct ipmi_intf * intf) req.msg.cmd = 0x7; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Unable to get Chassis Restart Cause"); return -1; } - if (rsp->ccode > 0) { + if (rsp->ccode) { lprintf(LOG_ERR, "Get Chassis Restart Cause failed: %s", val2str(rsp->ccode, completion_code_vals)); return -1; } - printf("System restart cause: "); - - switch (rsp->data[0] & 0xf) { - case 0: - printf("unknown\n"); - break; - case 1: - printf("chassis power control command\n"); - break; - case 2: - printf("reset via pushbutton\n"); - break; - case 3: - printf("power-up via pushbutton\n"); - break; - case 4: - printf("watchdog expired\n"); - break; - case 5: - printf("OEM\n"); - break; - case 6: - printf("power-up due to always-restore power policy\n"); - break; - case 7: - printf("power-up due to restore-previous power policy\n"); - break; - case 8: - printf("reset via PEF\n"); - break; - case 9: - printf("power-cycle via PEF\n"); - break; - default: - printf("invalid\n"); - } + printf("System restart cause: %s\n", + val2str(rsp->data[0] & 0xf, ipmi_chassis_restart_cause_vals)); return 0; } @@ -306,11 +395,11 @@ ipmi_chassis_status(struct ipmi_intf * intf) req.msg.cmd = 0x1; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Error sending Chassis Status command"); return -1; } - if (rsp->ccode > 0) { + if (rsp->ccode) { lprintf(LOG_ERR, "Error sending Chassis Status command: %s", val2str(rsp->ccode, completion_code_vals)); return -1; @@ -389,11 +478,11 @@ ipmi_chassis_selftest(struct ipmi_intf * intf) req.msg.cmd = 0x4; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Error sending Get Self Test command"); return -1; } - if (rsp->ccode > 0) { + if (rsp->ccode) { lprintf(LOG_ERR, "Error sending Get Self Test command: %s", val2str(rsp->ccode, completion_code_vals)); return -1; @@ -447,61 +536,166 @@ ipmi_chassis_selftest(struct ipmi_intf * intf) } static int -ipmi_chassis_set_bootparam(struct ipmi_intf * intf, uint8_t param, uint8_t * data, int len) +ipmi_chassis_set_bootparam(struct ipmi_intf * intf, + uint8_t param, void *data, int len) { struct ipmi_rs * rsp; struct ipmi_rq req; - uint8_t msg_data[16]; + struct { + uint8_t param; + uint8_t data[]; + } *msg_data; + int rc = -1; + size_t msgsize = 1 + len; /* Single-byte parameter plus the data */ + static const uint8_t BOOTPARAM_MASK = 0x7F; + + msg_data = malloc(msgsize); + if (!msg_data) { + goto out; + } + memset(msg_data, 0, msgsize); - memset(msg_data, 0, 16); - msg_data[0] = param & 0x7f; - memcpy(msg_data+1, data, len); + msg_data->param = param & BOOTPARAM_MASK; + memcpy(msg_data->data, data, len); memset(&req, 0, sizeof(req)); req.msg.netfn = IPMI_NETFN_CHASSIS; req.msg.cmd = 0x8; - req.msg.data = msg_data; - req.msg.data_len = len + 1; + req.msg.data = (uint8_t *)msg_data; + req.msg.data_len = msgsize; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Error setting Chassis Boot Parameter %d", param); return -1; } - if (rsp->ccode > 0) { + + rc = rsp->ccode; + if (rc) { if (param != 0) { - lprintf(LOG_ERR, "Set Chassis Boot Parameter %d failed: %s", - param, val2str(rsp->ccode, completion_code_vals)); + lprintf(LOG_ERR, + "Set Chassis Boot Parameter %d failed: %s", + param, + specific_val2str(rsp->ccode, + set_bootparam_cc_vals, + completion_code_vals)); } - return -1; + goto out; } lprintf(LOG_DEBUG, "Chassis Set Boot Parameter %d to %s", param, buf2str(data, len)); - return 0; + +out: + free_n(&msg_data); + return rc; +} + +/* Flags to ipmi_chassis_get_bootparam() */ +typedef enum { + PARAM_NO_GENERIC_INFO, /* Do not print generic boot parameter info */ + PARAM_NO_DATA_DUMP, /* Do not dump parameter data */ + PARAM_NO_RANGE_ERROR, /* Do not report out of range info to user */ + PARAM_SPECIFIC /* Parameter-specific flags start with this */ +} chassis_bootparam_flags_t; + +/* Flags to ipmi_chassis_get_bootparam() for Boot Mailbox parameter (7) */ +typedef enum { + MBOX_PARSE_USE_TEXT = PARAM_SPECIFIC, /* Use text output vs. hex */ + MBOX_PARSE_ALLBLOCKS /* Parse all blocks, not just one */ +} chassis_bootmbox_parse_t; + +#define BP_FLAG(x) (1 << (x)) + +static +void +chassis_bootmailbox_parse(void *buf, size_t len, int flags) +{ + void *blockdata; + size_t datalen; + bool use_text = flags & BP_FLAG(MBOX_PARSE_USE_TEXT); + bool all_blocks = flags & BP_FLAG(MBOX_PARSE_ALLBLOCKS); + + mbox_t *mbox; + + if (!buf || !len) { + return; + } + + mbox = buf; + blockdata = mbox->data; + datalen = len - sizeof(mbox->block); + if (!all_blocks) { + /* Print block selector only if a single block is printed */ + printf(" Selector : %d\n", mbox->block); + } + if (!mbox->block) { + uint32_t iana = ipmi24toh(mbox->b0.iana); + /* For block zero print the IANA Private Enterprise Number */ + printf(" IANA PEN : %" PRIu32 " [%s]\n", + iana, + val2str(iana, ipmi_oem_info)); + blockdata = mbox->b0.data; + datalen -= sizeof(mbox->b0.iana); + } + + printf(" Block "); + if (all_blocks) { + printf("%3" PRIu8 " Data : ", mbox->block); + } + else { + printf("Data : "); + } + if (use_text) { + /* Ensure the data string is null-terminated */ + unsigned char text[CHASSIS_BOOT_MBOX_BLOCK_SZ + 1] = { 0 }; + memcpy(text, blockdata, datalen); + printf("'%s'\n", text); + } + else { + printf("%s\n", buf2str(blockdata, datalen)); + } } static int -ipmi_chassis_get_bootparam(struct ipmi_intf * intf, char * arg) +ipmi_chassis_get_bootparam(struct ipmi_intf * intf, + int argc, char *argv[], int flags) { struct ipmi_rs * rsp; struct ipmi_rq req; uint8_t msg_data[3]; uint8_t param_id = 0; + bool skip_generic = flags & BP_FLAG(PARAM_NO_GENERIC_INFO); + bool skip_data = flags & BP_FLAG(PARAM_NO_DATA_DUMP); + bool skip_range = flags & BP_FLAG(PARAM_NO_RANGE_ERROR); + int rc = -1; - if (arg == NULL) - return -1; + if (argc < 1 || !argv[0]) { + goto out; + } - if (str2uchar(arg, ¶m_id) != 0) { - lprintf(LOG_ERR, "Invalid parameter '%s' given instead of bootparam.", - arg); - return (-1); + if (str2uchar(argv[0], ¶m_id)) { + lprintf(LOG_ERR, + "Invalid parameter '%s' given instead of bootparam.", + argv[0]); + goto out; } + --argc; + ++argv; + memset(msg_data, 0, 3); msg_data[0] = param_id & 0x7f; - msg_data[1] = 0; - msg_data[2] = 0; + + if (argc) { + if (str2uchar(argv[0], &msg_data[1])) { + lprintf(LOG_ERR, + "Invalid argument '%s' given to" + " bootparam %" PRIu8, + argv[0], msg_data[1]); + goto out; + } + } memset(&req, 0, sizeof(req)); req.msg.netfn = IPMI_NETFN_CHASSIS; @@ -510,13 +704,22 @@ ipmi_chassis_get_bootparam(struct ipmi_intf * intf, char * arg) req.msg.data_len = 3; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { - lprintf(LOG_ERR, "Error Getting Chassis Boot Parameter %s", arg); + if (!rsp) { + lprintf(LOG_ERR, + "Error Getting Chassis Boot Parameter %" PRIu8, + msg_data[0]); return -1; } - if (rsp->ccode > 0) { - lprintf(LOG_ERR, "Get Chassis Boot Parameter %s failed: %s", - arg, val2str(rsp->ccode, completion_code_vals)); + if (IPMI_CC_PARAM_OUT_OF_RANGE == rsp->ccode && skip_range) { + return -1; + } + if (rsp->ccode) { + lprintf(LOG_ERR, + "Get Chassis Boot Parameter %" PRIu8 " failed: %s", + msg_data[0], + specific_val2str(rsp->ccode, + get_bootparam_cc_vals, + completion_code_vals)); return -1; } @@ -526,10 +729,17 @@ ipmi_chassis_get_bootparam(struct ipmi_intf * intf, char * arg) param_id = 0; param_id = (rsp->data[1] & 0x7f); - printf("Boot parameter version: %d\n", rsp->data[0]); - printf("Boot parameter %d is %s\n", rsp->data[1] & 0x7f, - (rsp->data[1] & 0x80) ? "invalid/locked" : "valid/unlocked"); - printf("Boot parameter data: %s\n", buf2str(rsp->data+2, rsp->data_len - 2)); + if (!skip_generic) { + printf("Boot parameter version: %d\n", rsp->data[0]); + printf("Boot parameter %d is %s\n", rsp->data[1] & 0x7f, + (rsp->data[1] & 0x80) + ? "invalid/locked" + : "valid/unlocked"); + if (!skip_data) { + printf("Boot parameter data: %s\n", + buf2str(rsp->data+2, rsp->data_len - 2)); + } + } switch(param_id) { @@ -622,132 +832,181 @@ ipmi_chassis_get_bootparam(struct ipmi_intf * intf, char * arg) { printf( " Boot Flags :\n"); - if((rsp->data[2]&0x80) == 0x80) + if(rsp->data[2] & BF1_VALID) printf(" - Boot Flag Valid\n"); else printf(" - Boot Flag Invalid\n"); - if((rsp->data[2]&0x40) == 0x40) + if(rsp->data[2] & BF1_PERSIST) printf(" - Options apply to all future boots\n"); else printf(" - Options apply to only next boot\n"); - if((rsp->data[2]&0x20) == 0x20) + if(rsp->data[2] & BF1_BOOT_TYPE_EFI) printf(" - BIOS EFI boot \n"); else printf(" - BIOS PC Compatible (legacy) boot \n"); - if((rsp->data[3]&0x80) == 0x80) + if(rsp->data[3] & BF2_CMOS_CLEAR) printf(" - CMOS Clear\n"); - if((rsp->data[3]&0x40) == 0x40) + if(rsp->data[3] & BF2_KEYLOCK) printf(" - Lock Keyboard\n"); printf(" - Boot Device Selector : "); - switch( ((rsp->data[3]>>2)&0x0f)) + switch(rsp->data[3] & BF2_BOOTDEV_MASK) { - case 0: printf("No override\n"); break; - case 1: printf("Force PXE\n"); break; - case 2: printf("Force Boot from default Hard-Drive\n"); break; - case 3: printf("Force Boot from default Hard-Drive, request Safe-Mode\n"); break; - case 4: printf("Force Boot from Diagnostic Partition\n"); break; - case 5: printf("Force Boot from CD/DVD\n"); break; - case 6: printf("Force Boot into BIOS Setup\n"); break; - case 15: printf("Force Boot from Floppy/primary removable media\n"); break; - default: printf("Flag error\n"); break; + case BF2_BOOTDEV_DEFAULT: + printf("No override\n"); + break; + case BF2_BOOTDEV_PXE: + printf("Force PXE\n"); + break; + case BF2_BOOTDEV_HDD: + printf("Force Boot from default Hard-Drive\n"); + break; + case BF2_BOOTDEV_HDD_SAFE: + printf("Force Boot from default Hard-Drive, " + "request Safe-Mode\n"); + break; + case BF2_BOOTDEV_DIAG_PART: + printf("Force Boot from Diagnostic Partition\n"); + break; + case BF2_BOOTDEV_CDROM: + printf("Force Boot from CD/DVD\n"); + break; + case BF2_BOOTDEV_SETUP: + printf("Force Boot into BIOS Setup\n"); + break; + case BF2_BOOTDEV_REMOTE_FDD: + printf("Force Boot from remotely connected " + "Floppy/primary removable media\n"); + break; + case BF2_BOOTDEV_REMOTE_CDROM: + printf("Force Boot from remotely connected " + "CD/DVD\n"); + break; + case BF2_BOOTDEV_REMOTE_PRIMARY_MEDIA: + printf("Force Boot from primary remote media\n"); + break; + case BF2_BOOTDEV_REMOTE_HDD: + printf("Force Boot from remotely connected " + "Hard-Drive\n"); + break; + case BF2_BOOTDEV_FDD: + printf("Force Boot from Floppy/primary " + "removable media\n"); + break; + default: + printf("Flag error\n"); + break; } - if((rsp->data[3]&0x02) == 0x02) + if(rsp->data[3] & BF2_BLANK_SCREEN) printf(" - Screen blank\n"); - if((rsp->data[3]&0x01) == 0x01) + if(rsp->data[3] & BF2_RESET_LOCKOUT) printf(" - Lock out Reset buttons\n"); - if((rsp->data[4]&0x80) == 0x80) - printf(" - Lock out (power off/sleep request) vi Power Button\n"); - printf(" - Console Redirection control : "); - switch( ((rsp->data[4]>>5)&0x03)) + if(rsp->data[4] & BF3_POWER_LOCKOUT) + printf(" - Lock out (power off/sleep " + "request) via Power Button\n"); + + printf(" - BIOS verbosity : "); + switch(rsp->data[4] & BF3_VERBOSITY_MASK) { - case 0: printf("System Default\n"); break; - case 1: printf("Request Quiet Display\n"); break; - case 2: printf("Request Verbose Display\n"); break; - default: printf("Flag error\n"); break; + case BF3_VERBOSITY_DEFAULT: + printf("System Default\n"); + break; + case BF3_VERBOSITY_QUIET: + printf("Request Quiet Display\n"); + break; + case BF3_VERBOSITY_VERBOSE: + printf("Request Verbose Display\n"); + break; + default: + printf("Flag error\n"); + break; } - if((rsp->data[4]&0x10) == 0x10) + if(rsp->data[4] & BF3_EVENT_TRAPS) printf(" - Force progress event traps\n"); - if((rsp->data[4]&0x08) == 0x08) + if(rsp->data[4] & BF3_PASSWD_BYPASS) printf(" - User password bypass\n"); - if((rsp->data[4]&0x04) == 0x04) + if(rsp->data[4] & BF3_SLEEP_LOCKOUT) printf(" - Lock Out Sleep Button\n"); - if((rsp->data[4]&0x02) == 0x02) - printf(" - Lock Out Sleep Button\n"); - printf(" - BIOS verbosity : "); - switch( ((rsp->data[4]>>0)&0x03)) + printf(" - Console Redirection control : "); + switch(rsp->data[4] & BF3_CONSOLE_REDIR_MASK) { - case 0: printf("Console redirection occurs per BIOS configuration setting (default)\n"); break; - case 1: printf("Suppress (skip) console redirection if enabled\n"); break; - case 2: printf("Request console redirection be enabled\n"); break; - default: printf("Flag error\n"); break; + case BF3_CONSOLE_REDIR_DEFAULT: + printf( + "Console redirection occurs per BIOS " + "configuration setting (default)\n"); + break; + case BF3_CONSOLE_REDIR_SUPPRESS: + printf("Suppress (skip) console redirection " + "if enabled\n"); + break; + case BF3_CONSOLE_REDIR_ENABLE: + printf("Request console redirection be " + "enabled\n"); + break; + default: + printf("Flag error\n"); + break; } - if((rsp->data[5]&0x08) == 0x08) + if(rsp->data[5] & BF4_SHARED_MODE) printf(" - BIOS Shared Mode Override\n"); printf(" - BIOS Mux Control Override : "); - switch( ((rsp->data[5]>>0)&0x07)) - { - case 0: printf("BIOS uses recommended setting of the mux at the end of POST\n"); break; - case 1: printf("Requests BIOS to force mux to BMC at conclusion of POST/start of OS boot\n"); break; - case 2: printf("Requests BIOS to force mux to system at conclusion of POST/start of OS boot\n"); break; - default: printf("Flag error\n"); break; + switch (rsp->data[5] & BF4_BIOS_MUX_MASK) { + case BF4_BIOS_MUX_DEFAULT: + printf("BIOS uses recommended setting of the " + "mux at the end of POST\n"); + break; + case BF4_BIOS_MUX_BMC: + printf( + "Requests BIOS to force mux to BMC at " + "conclusion of POST/start of OS boot\n"); + break; + case BF4_BIOS_MUX_SYSTEM: + printf( + "Requests BIOS to force mux to system " + "at conclusion of POST/start of " + "OS boot\n"); + break; + default: + printf("Flag error\n"); + break; } } break; case 6: { unsigned long session_id; - unsigned long timestamp; - char time_buf[40]; - time_t out_time; + uint32_t timestamp; session_id = ((unsigned long) rsp->data[3]); session_id |= (((unsigned long) rsp->data[4])<<8); session_id |= (((unsigned long) rsp->data[5])<<16); session_id |= (((unsigned long) rsp->data[6])<<24); - timestamp = ((unsigned long) rsp->data[7]); - timestamp |= (((unsigned long) rsp->data[8])<<8); - timestamp |= (((unsigned long) rsp->data[9])<<16); - timestamp |= (((unsigned long) rsp->data[10])<<24); - - memset(time_buf, 0, 40); - strftime( - time_buf, - sizeof(time_buf), - "%m/%d/%Y %H:%M:%S", localtime(&out_time) - ); + timestamp = ipmi32toh(&rsp->data[7]); printf(" Boot Initiator Info :\n"); printf(" Channel Number : %d\n", (rsp->data[2] & 0x0f)); printf(" Session Id : %08lXh\n",session_id); - if(timestamp != 0) - { - printf(" Timestamp : %08lXh, %s\n",timestamp,time_buf); - } - else - { - printf(" Timestamp : %08lXh, undefined\n",timestamp); - } - + printf(" Timestamp : %s\n", ipmi_timestamp_numeric(timestamp)); } break; case 7: - { - printf(" Selector : %d\n", rsp->data[2] ); - printf(" Block Data : %s\n", buf2str(rsp->data+3, rsp->data_len - 2)); - } - break; + chassis_bootmailbox_parse(rsp->data + 2, + rsp->data_len - 2, + flags); + break; default: - printf(" Undefined byte\n"); + printf(" Unsupported parameter %" PRIu8 "\n", param_id); break; } - return 0; + rc = IPMI_CC_OK; +out: + return rc; } static int @@ -777,24 +1036,25 @@ get_bootparam_options(char *optstring, {NULL} /* End marker */ }, *op; + const char *optkw = "options="; - if (strncmp(optstring, "options=", 8) != 0) { + if (strncmp(optstring, optkw, strlen(optkw))) { lprintf(LOG_ERR, "No options= keyword found \"%s\"", optstring); return -1; } token = strtok_r(optstring + 8, ",", &saveptr); - while (token != NULL) { + while (token) { int setbit = 0; - if (strcmp(token, "help") == 0) { + if (!strcmp(token, "help")) { optionError = 1; break; } - if (strncmp(token, "no-", 3) == 0) { + if (!strcmp(token, "no-")) { setbit = 1; token += 3; } - for (op = options; op->name != NULL; ++op) { - if (strncmp(token, op->name, strlen(op->name)) == 0) { + for (op = options; op->name; ++op) { + if (!strcmp(token, op->name)) { if (setbit) { *set_flag |= op->value; } else { @@ -803,7 +1063,7 @@ get_bootparam_options(char *optstring, break; } } - if (op->name == NULL) { + if (!op->name) { /* Option not found */ optionError = 1; if (setbit) { @@ -816,7 +1076,7 @@ get_bootparam_options(char *optstring, if (optionError) { lprintf(LOG_NOTICE, " Legal options are:"); lprintf(LOG_NOTICE, " %-8s: print this message", "help"); - for (op = options; op->name != NULL; ++op) { + for (op = options; op->name; ++op) { lprintf(LOG_NOTICE, " %-8s: %s", op->name, op->desc); } lprintf(LOG_NOTICE, " Any Option may be prepended with no-" @@ -846,14 +1106,17 @@ ipmi_chassis_get_bootvalid(struct ipmi_intf * intf) req.msg.data_len = 3; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Error Getting Chassis Boot Parameter %d", param_id); return -1; } - if (rsp->ccode > 0) { + if (rsp->ccode) { lprintf(LOG_ERR, "Get Chassis Boot Parameter %d failed: %s", - param_id, val2str(rsp->ccode, completion_code_vals)); + param_id, + specific_val2str(rsp->ccode, + get_bootparam_cc_vals, + completion_code_vals)); return -1; } @@ -863,77 +1126,97 @@ ipmi_chassis_get_bootvalid(struct ipmi_intf * intf) return(rsp->data[2]); } +typedef enum { + SET_COMPLETE, + SET_IN_PROGRESS, + COMMIT_WRITE, + RESERVED +} progress_t; + + +static +void +chassis_bootparam_set_in_progress(struct ipmi_intf *intf, progress_t progress) +{ + /* + * By default try to set/clear set-in-progress parameter before/after + * changing any boot parameters. If setting fails, the code will set + * this flag to false and stop trying to fiddle with it for future + * requests. + */ + static bool use_progress = true; + uint8_t flag = progress; + int rc; + + if (!use_progress) { + return; + } + + rc = ipmi_chassis_set_bootparam(intf, + IPMI_CHASSIS_BOOTPARAM_SET_IN_PROGRESS, + &flag, 1); + + /* + * Only disable future checks if set in progress status setting failed. + * Setting of other statuses may fail legitimately. + */ + if (rc && SET_IN_PROGRESS == progress) { + use_progress = false; + } +} + +typedef enum { + BIOS_POST_ACK = 1 << 0, + OS_LOADER_ACK = 1 << 1, + OS_SERVICE_PARTITION_ACK = 1 << 2, + SMS_ACK = 1 << 3, + OEM_ACK = 1 << 4, + RESERVED_ACK_MASK = 7 << 5 +} bootinfo_ack_t; + +static +int +chassis_bootparam_clear_ack(struct ipmi_intf *intf, bootinfo_ack_t flag) +{ + uint8_t flags[2] = { flag & ~RESERVED_ACK_MASK, + flag & ~RESERVED_ACK_MASK }; + + return ipmi_chassis_set_bootparam(intf, + IPMI_CHASSIS_BOOTPARAM_INFO_ACK, + flags, 2); +} + static int ipmi_chassis_set_bootvalid(struct ipmi_intf *intf, uint8_t set_flag, uint8_t clr_flag) { int bootvalid; - uint8_t flags[5]; - int rc = 0; - int use_progress = 1; - uint8_t param_id = IPMI_CHASSIS_BOOTPARAM_FLAG_VALID; + uint8_t flags[2]; + int rc; - if (use_progress) { - /* set set-in-progress flag */ - memset(flags, 0, 5); - flags[0] = 0x01; - rc = ipmi_chassis_set_bootparam(intf, - IPMI_CHASSIS_BOOTPARAM_SET_IN_PROGRESS, flags, 1); - if (rc < 0) - use_progress = 0; - } - - memset(flags, 0, 5); - flags[0] = 0x01; - flags[1] = 0x01; - rc = ipmi_chassis_set_bootparam(intf, IPMI_CHASSIS_BOOTPARAM_INFO_ACK, - flags, 2); + chassis_bootparam_set_in_progress(intf, SET_IN_PROGRESS); + rc = chassis_bootparam_clear_ack(intf, BIOS_POST_ACK); - if (rc < 0) { - if (use_progress) { - /* set-in-progress = set-complete */ - memset(flags, 0, 5); - ipmi_chassis_set_bootparam(intf, - IPMI_CHASSIS_BOOTPARAM_SET_IN_PROGRESS, - flags, 1); - } - return -1; + if (rc) { + goto out; } bootvalid = ipmi_chassis_get_bootvalid(intf); - if (bootvalid < 0) { - if (use_progress) { - /* set-in-progress = set-complete */ - memset(flags, 0, 5); - ipmi_chassis_set_bootparam(intf, - IPMI_CHASSIS_BOOTPARAM_SET_IN_PROGRESS, - flags, 1); - } - return -1; - } - flags[0] = (bootvalid & ~clr_flag) | set_flag; - - rc = ipmi_chassis_set_bootparam(intf, param_id, flags, 1); - - if (rc == 0) { - if (use_progress) { - /* set-in-progress = commit-write */ - memset(flags, 0, 5); - flags[0] = 0x02; - ipmi_chassis_set_bootparam(intf, - IPMI_CHASSIS_BOOTPARAM_SET_IN_PROGRESS, - flags, 1); - } + lprintf(LOG_ERR, "Failed to read boot valid flag"); + rc = bootvalid; + goto out; } - if (use_progress) { - /* set-in-progress = set-complete */ - memset(flags, 0, 5); - ipmi_chassis_set_bootparam(intf, - IPMI_CHASSIS_BOOTPARAM_SET_IN_PROGRESS, - flags, 1); + flags[0] = (bootvalid & ~clr_flag) | set_flag; + rc = ipmi_chassis_set_bootparam(intf, + IPMI_CHASSIS_BOOTPARAM_FLAG_VALID, + flags, 1); + if (IPMI_CC_OK == rc) { + chassis_bootparam_set_in_progress(intf, COMMIT_WRITE); } +out: + chassis_bootparam_set_in_progress(intf, SET_COMPLETE); return rc; } @@ -941,107 +1224,372 @@ static int ipmi_chassis_set_bootdev(struct ipmi_intf * intf, char * arg, uint8_t *iflags) { uint8_t flags[5]; - int rc = 0; - int use_progress = 1; + int rc; - if (use_progress) { - /* set set-in-progress flag */ - memset(flags, 0, 5); - flags[0] = 0x01; - rc = ipmi_chassis_set_bootparam(intf, - IPMI_CHASSIS_BOOTPARAM_SET_IN_PROGRESS, flags, 1); - if (rc < 0) - use_progress = 0; - } - - memset(flags, 0, 5); - flags[0] = 0x01; - flags[1] = 0x01; - rc = ipmi_chassis_set_bootparam(intf, IPMI_CHASSIS_BOOTPARAM_INFO_ACK, - flags, 2); + chassis_bootparam_set_in_progress(intf, SET_IN_PROGRESS); + rc = chassis_bootparam_clear_ack(intf, BIOS_POST_ACK); if (rc < 0) { - if (use_progress) { - /* set-in-progress = set-complete */ - memset(flags, 0, 5); - ipmi_chassis_set_bootparam(intf, - IPMI_CHASSIS_BOOTPARAM_SET_IN_PROGRESS, - flags, 1); - } - return -1; + goto out; } - if (iflags == NULL) - memset(flags, 0, 5); + if (!iflags) + memset(flags, 0, sizeof(flags)); else memcpy(flags, iflags, sizeof (flags)); - if (arg == NULL) + if (!arg) flags[1] |= 0x00; - else if (strncmp(arg, "none", 4) == 0) + else if (!strcmp(arg, "none")) flags[1] |= 0x00; - else if (strncmp(arg, "pxe", 3) == 0 || - strncmp(arg, "force_pxe", 9) == 0) + else if (!strcmp(arg, "pxe") || + !strcmp(arg, "force_pxe")) + { flags[1] |= 0x04; - else if (strncmp(arg, "disk", 4) == 0 || - strncmp(arg, "force_disk", 10) == 0) + } + else if (!strcmp(arg, "disk") || + !strcmp(arg, "force_disk")) + { flags[1] |= 0x08; - else if (strncmp(arg, "safe", 4) == 0 || - strncmp(arg, "force_safe", 10) == 0) + } + else if (!strcmp(arg, "safe") || + !strcmp(arg, "force_safe")) + { flags[1] |= 0x0c; - else if (strncmp(arg, "diag", 4) == 0 || - strncmp(arg, "force_diag", 10) == 0) + } + else if (!strcmp(arg, "diag") || + !strcmp(arg, "force_diag")) + { flags[1] |= 0x10; - else if (strncmp(arg, "cdrom", 5) == 0 || - strncmp(arg, "force_cdrom", 11) == 0) + } + else if (!strcmp(arg, "cdrom") || + !strcmp(arg, "force_cdrom")) + { flags[1] |= 0x14; - else if (strncmp(arg, "floppy", 6) == 0 || - strncmp(arg, "force_floppy", 12) == 0) + } + else if (!strcmp(arg, "floppy") || + !strcmp(arg, "force_floppy")) + { flags[1] |= 0x3c; - else if (strncmp(arg, "bios", 4) == 0 || - strncmp(arg, "force_bios", 10) == 0) + } + else if (!strcmp(arg, "bios") || + !strcmp(arg, "force_bios")) + { flags[1] |= 0x18; + } else { lprintf(LOG_ERR, "Invalid argument: %s", arg); - if (use_progress) { - /* set-in-progress = set-complete */ - memset(flags, 0, 5); - ipmi_chassis_set_bootparam(intf, - IPMI_CHASSIS_BOOTPARAM_SET_IN_PROGRESS, - flags, 1); - } - return -1; + rc = -1; + goto out; } /* set flag valid bit */ flags[0] |= 0x80; - rc = ipmi_chassis_set_bootparam(intf, IPMI_CHASSIS_BOOTPARAM_BOOT_FLAGS, - flags, 5); - if (rc == 0) { - if (use_progress) { - /* set-in-progress = commit-write */ - memset(flags, 0, 5); - flags[0] = 0x02; - ipmi_chassis_set_bootparam(intf, - IPMI_CHASSIS_BOOTPARAM_SET_IN_PROGRESS, - flags, 1); + rc = ipmi_chassis_set_bootparam(intf, + IPMI_CHASSIS_BOOTPARAM_BOOT_FLAGS, + flags, 5); + if (IPMI_CC_OK == rc) { + chassis_bootparam_set_in_progress(intf, COMMIT_WRITE); + printf("Set Boot Device to %s\n", arg); + } + +out: + chassis_bootparam_set_in_progress(intf, SET_COMPLETE); + return rc; +} + +static void chassis_bootmailbox_help() +{ + lprintf(LOG_NOTICE, +"bootmbox get [text] [block <block>]\n" +" Read the entire Boot Initiator Mailbox or the specified <block>.\n" +" If 'text' option is specified, the data is output as plain text, otherwise\n" +" hex dump mode is used.\n" +"\n" +"bootmbox set text [block <block>] <IANA_PEN> \"<data_string>\"\n" +"bootmbox set [block <block>] <IANA_PEN> <data_byte> [<data_byte> ...]\n" +" Write the specified <block> or the entire Boot Initiator Mailbox.\n" +" It is required to specify a decimal IANA Enterprise Number recognized\n" +" by the boot initiator on the target system. Refer to your target system\n" +" manufacturer for details. The rest of the arguments are either separate\n" +" data byte values separated by spaces, or a single text string argument.\n" +"\n" +" When single block write is requested, the total length of <data> may not\n" +" exceed 13 bytes for block 0, or 16 bytes otherwise.\n" +"\n" +"bootmbox help\n" +" Show this help."); +} + +static +int +chassis_set_bootmailbox(struct ipmi_intf *intf, int16_t block, bool use_text, + int argc, char *argv[]) +{ + int rc = -1; + int32_t iana = 0; + size_t blocks = 0; + size_t datasize = 0; + off_t string_offset = 0; + + lprintf(LOG_INFO, "Writing Boot Mailbox..."); + + if (argc < 1 || str2int(argv[0], &iana)) { + lprintf(LOG_ERR, + "No valid IANA PEN specified!\n"); + chassis_bootmailbox_help(); + goto out; + } + ++argv; + --argc; + + if (argc < 1) { + lprintf(LOG_ERR, + "No data provided!\n"); + chassis_bootmailbox_help(); + goto out; + } + + /* + * Initialize the data size. For text mode it is just the + * single argument string length plus one byte for \0 termination. + * For byte mode the length is the number of byte arguments without + * any additional termination. + */ + if (!use_text) { + datasize = argc; + } + else { + datasize = strlen(argv[0]) + 1; /* Include the terminator */ + } + + lprintf(LOG_INFO, "Data size: %u", datasize); + + /* Decide how many blocks we will be writing */ + if (block >= 0) { + blocks = 1; + } + else { + /* + * We need to write all data, so calculate the data + * size in blocks and set the starting block to zero. + */ + blocks = CHASSIS_BOOT_MBOX_IANA_SZ; + blocks += datasize; + blocks += CHASSIS_BOOT_MBOX_BLOCK_SZ - 1; + blocks /= CHASSIS_BOOT_MBOX_BLOCK_SZ; + + block = 0; + } + + lprintf(LOG_INFO, "Blocks to write: %d", blocks); + + if (blocks > CHASSIS_BOOT_MBOX_MAX_BLOCKS) { + lprintf(LOG_ERR, + "Data size %zu exceeds maximum (%d)", + datasize, + (CHASSIS_BOOT_MBOX_BLOCK_SZ + * CHASSIS_BOOT_MBOX_MAX_BLOCKS) + - CHASSIS_BOOT_MBOX_IANA_SZ); + goto out; + } + + /* Indicate that we're touching the boot parameters */ + chassis_bootparam_set_in_progress(intf, SET_IN_PROGRESS); + + for (size_t bindex = 0; + datasize > 0 && bindex < blocks; + ++bindex, ++block) + { + /* The request data structure */ + mbox_t mbox = { .block = block, {{0}} }; + + /* Destination for input data */ + uint8_t *data = mbox.data; + + /* The maximum amount of data this block may hold */ + size_t maxblocksize = sizeof(mbox.data); + + /* The actual amount of data in this block */ + size_t blocksize; + off_t unused = 0; + + /* Block 0 needs special care as it has IANA PEN specifier */ + if (!block) { + data = mbox.b0.data; + maxblocksize = sizeof(mbox.b0.data); + htoipmi24(iana, mbox.b0.iana); } - printf("Set Boot Device to %s\n", arg); + /* + * Find out how many bytes we are going to write to this + * block. + */ + if (datasize > maxblocksize) { + blocksize = maxblocksize; + } + else { + blocksize = datasize; + } + + /* Remember how much data remains */ + datasize -= blocksize; + + if (!use_text) { + args2buf(argc, argv, data, blocksize); + argc -= blocksize; + argv += blocksize; + } + else { + memcpy(data, argv[0] + string_offset, blocksize); + string_offset += blocksize; + } + + lprintf(LOG_INFO, "Block %3" PRId16 ": %s", block, + buf2str_extended(data, blocksize, " ")); + + unused = maxblocksize - blocksize; + rc = ipmi_chassis_set_bootparam(intf, + IPMI_CHASSIS_BOOTPARAM_INIT_MBOX, + &mbox, + sizeof(mbox) - unused); + if (IPMI_CC_PARAM_OUT_OF_RANGE == rc) { + lprintf(LOG_ERR, + "Hit end of mailbox writing block %" PRId16, + block); + } + if (rc) { + goto complete; + } } - if (use_progress) { - /* set-in-progress = set-complete */ - memset(flags, 0, 5); - ipmi_chassis_set_bootparam(intf, - IPMI_CHASSIS_BOOTPARAM_SET_IN_PROGRESS, - flags, 1); + lprintf(LOG_INFO, + "Wrote %zu blocks of Boot Initiator Mailbox", + blocks); + chassis_bootparam_set_in_progress(intf, COMMIT_WRITE); + + rc = chassis_bootparam_clear_ack(intf, BIOS_POST_ACK | OS_LOADER_ACK); + +complete: + chassis_bootparam_set_in_progress(intf, SET_COMPLETE); +out: + return rc; +} + +static +int +chassis_get_bootmailbox(struct ipmi_intf *intf, + int16_t block, bool use_text) +{ + int rc = IPMI_CC_UNSPECIFIED_ERROR; + char param_str[2]; /* Max "7" */ + char block_str[4]; /* Max "255" */ + char *bpargv[] = { param_str, block_str }; + int flags; + + flags = use_text ? BP_FLAG(MBOX_PARSE_USE_TEXT) : 0; + + snprintf(param_str, sizeof(param_str), + "%" PRIu8, IPMI_CHASSIS_BOOTPARAM_INIT_MBOX); + + if (block >= 0) { + snprintf(block_str, sizeof(block_str), + "%" PRIu8, (uint8_t)block); + + rc = ipmi_chassis_get_bootparam(intf, + ARRAY_SIZE(bpargv), + bpargv, + flags); + } + else { + int currblk; + + flags |= BP_FLAG(MBOX_PARSE_ALLBLOCKS); + for (currblk = 0; currblk <= UCHAR_MAX; ++currblk) { + snprintf(block_str, sizeof(block_str), + "%" PRIu8, (uint8_t)currblk); + + if (currblk) { + /* + * If block 0 succeeded, we don't want to + * print generic info for each next block, + * and we don't want range error to be + * reported when we hit the end of blocks. + */ + flags |= BP_FLAG(PARAM_NO_GENERIC_INFO); + flags |= BP_FLAG(PARAM_NO_RANGE_ERROR); + } + + rc = ipmi_chassis_get_bootparam(intf, + ARRAY_SIZE(bpargv), + bpargv, + flags); + + if (rc) { + if (currblk) { + rc = IPMI_CC_OK; + } + break; + } + } } return rc; } +static +int +chassis_bootmailbox(struct ipmi_intf *intf, int argc, char *argv[]) +{ + int rc = IPMI_CC_UNSPECIFIED_ERROR; + bool use_text = false; /* Default to data dump I/O mode */ + int16_t block = -1; /* By default print all blocks */ + const char *cmd; + + if ((argc < 1) || !strcmp(argv[0], "help")) { + chassis_bootmailbox_help(); + goto out; + } else { + cmd = argv[0]; + ++argv; + --argc; + + if (argc > 0 && !strcmp(argv[0], "text")) { + use_text = true; + ++argv; + --argc; + } + + if (argc > 0 && !strcmp(argv[0], "block")) { + if (argc < 2) { + chassis_bootmailbox_help(); + goto out; + } + if(str2short(argv[1], &block)) { + lprintf(LOG_ERR, + "Invalid block %s", argv[1]); + goto out; + } + argv += 2; + argc -= 2; + + } + + if (!strcmp(cmd, "get")) { + rc = chassis_get_bootmailbox(intf, block, use_text); + } + else if (!strcmp(cmd, "set")) { + rc = chassis_set_bootmailbox(intf, block, use_text, + argc, argv); + } + } + +out: + return rc; +} + + static int ipmi_chassis_power_policy(struct ipmi_intf * intf, uint8_t policy) { @@ -1055,11 +1603,11 @@ ipmi_chassis_power_policy(struct ipmi_intf * intf, uint8_t policy) req.msg.data_len = 1; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Error in Power Restore Policy command"); return -1; } - if (rsp->ccode > 0) { + if (rsp->ccode) { lprintf(LOG_ERR, "Power Restore Policy command failed: %s", val2str(rsp->ccode, completion_code_vals)); return -1; @@ -1100,25 +1648,25 @@ ipmi_power_main(struct ipmi_intf * intf, int argc, char ** argv) int rc = 0; uint8_t ctl = 0; - if ((argc < 1) || (strncmp(argv[0], "help", 4) == 0)) { + if (argc < 1 || !strcmp(argv[0], "help")) { lprintf(LOG_NOTICE, "chassis power Commands: status, on, off, cycle, reset, diag, soft"); return 0; } - if (strncmp(argv[0], "status", 6) == 0) { + if (!strcmp(argv[0], "status")) { rc = ipmi_chassis_print_power_status(intf); return rc; } - if ((strncmp(argv[0], "up", 2) == 0) || (strncmp(argv[0], "on", 2) == 0)) + if (!strcmp(argv[0], "up") || !strcmp(argv[0], "on")) ctl = IPMI_CHASSIS_CTL_POWER_UP; - else if ((strncmp(argv[0], "down", 4) == 0) || (strncmp(argv[0], "off", 3) == 0)) + else if (!strcmp(argv[0], "down") || !strcmp(argv[0], "off")) ctl = IPMI_CHASSIS_CTL_POWER_DOWN; - else if (strncmp(argv[0], "cycle", 5) == 0) + else if (!strcmp(argv[0], "cycle")) ctl = IPMI_CHASSIS_CTL_POWER_CYCLE; - else if (strncmp(argv[0], "reset", 5) == 0) + else if (!strcmp(argv[0], "reset")) ctl = IPMI_CHASSIS_CTL_HARD_RESET; - else if (strncmp(argv[0], "diag", 4) == 0) + else if (!strcmp(argv[0], "diag")) ctl = IPMI_CHASSIS_CTL_PULSE_DIAG; - else if ((strncmp(argv[0], "acpi", 4) == 0) || (strncmp(argv[0], "soft", 4) == 0)) + else if (!strcmp(argv[0], "acpi") || !strcmp(argv[0], "soft")) ctl = IPMI_CHASSIS_CTL_ACPI_SOFT; else { lprintf(LOG_ERR, "Invalid chassis power command: %s", argv[0]); @@ -1146,55 +1694,270 @@ ipmi_chassis_set_bootflag_help() get_bootparam_options("options=help", &set_flag, &clr_flag); } +/* + * Sugar. Macros for internal use by bootdev_parse_options() to make + * the structure initialization look better. Can't use scope-limited + * static consts for initializers with gcc5, alas. + */ +#define BF1_OFFSET 0 +#define BF2_OFFSET 1 +#define BF3_OFFSET 2 +#define BF4_OFFSET 3 +#define BF_BYTE_COUNT 5 + +/* A helper for ipmi_chassis_main() to parse bootdev options */ +static +bool +bootdev_parse_options(char *optstring, uint8_t flags[]) +{ + char *token; + char *saveptr = NULL; + int optionError = 0; + + static const struct bootdev_opt_s { + char *name; + off_t offset; + unsigned char mask; + unsigned char value; + char *desc; + } *op; + static const struct bootdev_opt_s options[] = { + /* data 1 */ + { + "valid", + BF1_OFFSET, + BF1_VALID_MASK, + BF1_VALID, + "Boot flags valid" + }, + { + "persistent", + BF1_OFFSET, + BF1_PERSIST_MASK, + BF1_PERSIST, + "Changes are persistent for " + "all future boots" + }, + { + "efiboot", + BF1_OFFSET, + BF1_BOOT_TYPE_MASK, + BF1_BOOT_TYPE_EFI, + "Extensible Firmware Interface " + "Boot (EFI)" + }, + /* data 2 */ + { + "clear-cmos", + BF2_OFFSET, + BF2_CMOS_CLEAR_MASK, + BF2_CMOS_CLEAR, + "CMOS clear" + }, + { + "lockkbd", + BF2_OFFSET, + BF2_KEYLOCK_MASK, + BF2_KEYLOCK, + "Lock Keyboard" + }, + /* data2[5:2] is parsed elsewhere */ + { + "screenblank", + BF2_OFFSET, + BF2_BLANK_SCREEN_MASK, + BF2_BLANK_SCREEN, + "Screen Blank" + }, + { + "lockoutreset", + BF2_OFFSET, + BF2_RESET_LOCKOUT_MASK, + BF2_RESET_LOCKOUT, + "Lock out Reset buttons" + }, + /* data 3 */ + { + "lockout_power", + BF3_OFFSET, + BF3_POWER_LOCKOUT_MASK, + BF3_POWER_LOCKOUT, + "Lock out (power off/sleep " + "request) via Power Button" + }, + { + "verbose=default", + BF3_OFFSET, + BF3_VERBOSITY_MASK, + BF3_VERBOSITY_DEFAULT, + "Request quiet BIOS display" + }, + { + "verbose=no", + BF3_OFFSET, + BF3_VERBOSITY_MASK, + BF3_VERBOSITY_QUIET, + "Request quiet BIOS display" + }, + { + "verbose=yes", + BF3_OFFSET, + BF3_VERBOSITY_MASK, + BF3_VERBOSITY_VERBOSE, + "Request verbose BIOS display" + }, + { + "force_pet", + BF3_OFFSET, + BF3_EVENT_TRAPS_MASK, + BF3_EVENT_TRAPS, + "Force progress event traps" + }, + { + "upw_bypass", + BF3_OFFSET, + BF3_PASSWD_BYPASS_MASK, + BF3_PASSWD_BYPASS, + "User password bypass" + }, + { + "lockout_sleep", + BF3_OFFSET, + BF3_SLEEP_LOCKOUT_MASK, + BF3_SLEEP_LOCKOUT, + "Lock out the Sleep button" + }, + { + "cons_redirect=default", + BF3_OFFSET, + BF3_CONSOLE_REDIR_MASK, + BF3_CONSOLE_REDIR_DEFAULT, + "Console redirection occurs per " + "BIOS configuration setting" + }, + { + "cons_redirect=skip", + BF3_OFFSET, + BF3_CONSOLE_REDIR_MASK, + BF3_CONSOLE_REDIR_SUPPRESS, + "Suppress (skip) console " + "redirection if enabled" + }, + { + "cons_redirect=enable", + BF3_OFFSET, + BF3_CONSOLE_REDIR_MASK, + BF3_CONSOLE_REDIR_ENABLE, + "Request console redirection " + "be enabled" + }, + /* data 4 */ + /* data4[7:4] reserved */ + /* data4[3] BIOS Shared Mode Override, not implemented here */ + /* data4[2:0] BIOS Mux Control Override, not implemented here */ + + /* data5 reserved */ + + {NULL} /* End marker */ + }; + + memset(&flags[0], 0, BF_BYTE_COUNT); + token = strtok_r(optstring, ",", &saveptr); + while (token) { + if (!strcmp(token, "help")) { + optionError = 1; + break; + } + for (op = options; op->name; ++op) { + if (!strcmp(token, op->name)) { + flags[op->offset] &= ~(op->mask); + flags[op->offset] |= op->value; + break; + } + } + if (!op->name) { + /* Option not found */ + optionError = 1; + lprintf(LOG_ERR, "Invalid option: %s", token); + } + token = strtok_r(NULL, ",", &saveptr); + } + if (optionError) { + lprintf(LOG_NOTICE, "Legal options settings are:"); + lprintf(LOG_NOTICE, " %-22s: %s", + "help", + "print this message"); + for (op = options; op->name; ++op) { + lprintf(LOG_NOTICE, " %-22s: %s", op->name, op->desc); + } + return false; + } + + return true; +} + int ipmi_chassis_main(struct ipmi_intf * intf, int argc, char ** argv) { - int rc = 0; + int rc = -1; - if ((argc == 0) || (strncmp(argv[0], "help", 4) == 0)) { - lprintf(LOG_NOTICE, "Chassis Commands: status, power, identify, policy, restart_cause, poh, bootdev, bootparam, selftest"); + if (!argc || !strcmp(argv[0], "help")) { + lprintf(LOG_NOTICE, "Chassis Commands:\n" + " status, power, policy, restart_cause\n" + " poh, identify, selftest,\n" + " bootdev, bootparam, bootmbox"); } - else if (strncmp(argv[0], "status", 6) == 0) { + else if (!strcmp(argv[0], "status")) { rc = ipmi_chassis_status(intf); } - else if (strncmp(argv[0], "selftest", 8) == 0) { + else if (!strcmp(argv[0], "selftest")) { rc = ipmi_chassis_selftest(intf); } - else if (strncmp(argv[0], "power", 5) == 0) { + else if (!strcmp(argv[0], "power")) { uint8_t ctl = 0; - if ((argc < 2) || (strncmp(argv[1], "help", 4) == 0)) { + if (argc < 2 || !strcmp(argv[1], "help")) { lprintf(LOG_NOTICE, "chassis power Commands: status, on, off, cycle, reset, diag, soft"); - return 0; + rc = 0; + goto out; } - if (strncmp(argv[1], "status", 6) == 0) { + if (!strcmp(argv[1], "status")) { rc = ipmi_chassis_print_power_status(intf); - return rc; + goto out; } - if ((strncmp(argv[1], "up", 2) == 0) || (strncmp(argv[1], "on", 2) == 0)) + if (!strcmp(argv[1], "up") || + !strcmp(argv[1], "on")) + { ctl = IPMI_CHASSIS_CTL_POWER_UP; - else if ((strncmp(argv[1], "down", 4) == 0) || (strncmp(argv[1], "off", 3) == 0)) + } + else if (!strcmp(argv[1], "down") || + !strcmp(argv[1], "off")) + { ctl = IPMI_CHASSIS_CTL_POWER_DOWN; - else if (strncmp(argv[1], "cycle", 5) == 0) + } + else if (!strcmp(argv[1], "cycle")) ctl = IPMI_CHASSIS_CTL_POWER_CYCLE; - else if (strncmp(argv[1], "reset", 5) == 0) + else if (!strcmp(argv[1], "reset")) ctl = IPMI_CHASSIS_CTL_HARD_RESET; - else if (strncmp(argv[1], "diag", 4) == 0) + else if (!strcmp(argv[1], "diag")) ctl = IPMI_CHASSIS_CTL_PULSE_DIAG; - else if ((strncmp(argv[1], "acpi", 4) == 0) || (strncmp(argv[1], "soft", 4) == 0)) + else if (!strcmp(argv[1], "acpi") || + !strcmp(argv[1], "soft")) + { ctl = IPMI_CHASSIS_CTL_ACPI_SOFT; + } else { lprintf(LOG_ERR, "Invalid chassis power command: %s", argv[1]); - return -1; + goto out; } rc = ipmi_chassis_power_control(intf, ctl); } - else if (strncmp(argv[0], "identify", 8) == 0) { + else if (!strcmp(argv[0], "identify")) { if (argc < 2) { rc = ipmi_chassis_identify(intf, NULL); } - else if (strncmp(argv[1], "help", 4) == 0) { + else if (!strcmp(argv[1], "help")) { lprintf(LOG_NOTICE, "chassis identify <interval>"); lprintf(LOG_NOTICE, " default is 15 seconds"); lprintf(LOG_NOTICE, " 0 to turn off"); @@ -1203,14 +1966,14 @@ ipmi_chassis_main(struct ipmi_intf * intf, int argc, char ** argv) rc = ipmi_chassis_identify(intf, argv[1]); } } - else if (strncmp(argv[0], "poh", 3) == 0) { + else if (!strcmp(argv[0], "poh")) { rc = ipmi_chassis_poh(intf); } - else if (strncmp(argv[0], "restart_cause", 13) == 0) { + else if (!strcmp(argv[0], "restart_cause")) { rc = ipmi_chassis_restart_cause(intf); } - else if (strncmp(argv[0], "policy", 4) == 0) { - if ((argc < 2) || (strncmp(argv[1], "help", 4) == 0)) { + else if (!strcmp(argv[0], "policy")) { + if (argc < 2 || !strcmp(argv[1], "help")) { lprintf(LOG_NOTICE, "chassis policy <state>"); lprintf(LOG_NOTICE, " list : return supported policies"); lprintf(LOG_NOTICE, " always-on : turn on when power is restored"); @@ -1218,13 +1981,13 @@ ipmi_chassis_main(struct ipmi_intf * intf, int argc, char ** argv) lprintf(LOG_NOTICE, " always-off : stay off after power is restored"); } else { uint8_t ctl; - if (strncmp(argv[1], "list", 4) == 0) + if (!strcmp(argv[1], "list")) ctl = IPMI_CHASSIS_POLICY_NO_CHANGE; - else if (strncmp(argv[1], "always-on", 9) == 0) + else if (!strcmp(argv[1], "always-on")) ctl = IPMI_CHASSIS_POLICY_ALWAYS_ON; - else if (strncmp(argv[1], "previous", 8) == 0) + else if (!strcmp(argv[1], "previous")) ctl = IPMI_CHASSIS_POLICY_PREVIOUS; - else if (strncmp(argv[1], "always-off", 10) == 0) + else if (!strcmp(argv[1], "always-off")) ctl = IPMI_CHASSIS_POLICY_ALWAYS_OFF; else { lprintf(LOG_ERR, "Invalid chassis policy: %s", argv[1]); @@ -1233,21 +1996,26 @@ ipmi_chassis_main(struct ipmi_intf * intf, int argc, char ** argv) rc = ipmi_chassis_power_policy(intf, ctl); } } - else if (strncmp(argv[0], "bootparam", 9) == 0) { - if ((argc < 3) || (strncmp(argv[1], "help", 4) == 0)) { + else if (!strcmp(argv[0], "bootparam")) { + if (argc < 3 || !strcmp(argv[1], "help")) { lprintf(LOG_NOTICE, "bootparam get <param #>"); ipmi_chassis_set_bootflag_help(); } else { - if (strncmp(argv[1], "get", 3) == 0) { - rc = ipmi_chassis_get_bootparam(intf, argv[2]); + if (!strcmp(argv[1], "get")) { + rc = ipmi_chassis_get_bootparam(intf, + argc - 2, + argv + 2, + 0); } - else if (strncmp(argv[1], "set", 3) == 0) { + else if (!strcmp(argv[1], "set")) { unsigned char set_flag=0; unsigned char clr_flag=0; - if (strncmp(argv[2], "help", 4) == 0 || - argc < 4 || (argc >= 4 && - strncmp(argv[2], "bootflag", 8) != 0)) { + if (!strcmp(argv[2], "help") + || argc < 4 + || (argc >= 4 + && strcmp(argv[2], "bootflag"))) + { ipmi_chassis_set_bootflag_help(); } else { if (argc == 5) { @@ -1263,8 +2031,8 @@ ipmi_chassis_main(struct ipmi_intf * intf, int argc, char ** argv) lprintf(LOG_NOTICE, "bootparam get|set <option> [value ...]"); } } - else if (strncmp(argv[0], "bootdev", 7) == 0) { - if ((argc < 2) || (strncmp(argv[1], "help", 4) == 0)) { + else if (!strcmp(argv[0], "bootdev")) { + if (argc < 2 || !strcmp(argv[1], "help")) { lprintf(LOG_NOTICE, "bootdev <device> [clear-cmos=yes|no]"); lprintf(LOG_NOTICE, "bootdev <device> [options=help,...]"); lprintf(LOG_NOTICE, " none : Do not change boot device order"); @@ -1276,114 +2044,39 @@ ipmi_chassis_main(struct ipmi_intf * intf, int argc, char ** argv) lprintf(LOG_NOTICE, " bios : Force boot into BIOS Setup"); lprintf(LOG_NOTICE, " floppy: Force boot from Floppy/primary removable media"); } else { - if (argc < 3) - rc = ipmi_chassis_set_bootdev(intf, argv[1], NULL); - else if (strncmp(argv[2], "clear-cmos=", 11) == 0) { - if (strncmp(argv[2]+11, "yes", 3) == 0) { - uint8_t flags[5] = {0, (1<<7), 0, 0, 0}; - rc = ipmi_chassis_set_bootdev(intf, argv[1], flags); - } else - rc = ipmi_chassis_set_bootdev(intf, argv[1], NULL); - } - else if (strncmp(argv[2], "options=", 8) == 0) { - char *token; - char *saveptr = NULL; - int optionError = 0; - unsigned char flags[5]; - static struct { - char *name; - int i; - unsigned char mask; - unsigned char value; - char *desc; - } options[] = { - /* data 1 */ - {"valid", 0, (1<<7), (1<<7), - "Boot flags valid"}, - {"persistent", 0, (1<<6), (1<<6), - "Changes are persistent for all future boots"}, - {"efiboot", 0, (1<<5), (1<<5), - "Extensible Firmware Interface Boot (EFI)"}, - /* data 2 */ - {"clear-cmos", 1, (1<<7), (1<<7), - "CMOS clear"}, - {"lockkbd", 1, (1<<6), (1<<6), - "Lock Keyboard"}, - /* data2[5:2] is parsed elsewhere */ - {"screenblank", 1, (1<<1), (1<<1), - "Screen Blank"}, - {"lockoutreset", 1, (1<<0), (1<<0), - "Lock out Resetbuttons"}, - /* data 3 */ - {"lockout_power", 2, (1<<7), (1<<7), - "Lock out (power off/sleep request) via Power Button"}, - {"verbose=default", 2, (3<<5), (0<<5), - "Request quiet BIOS display"}, - {"verbose=no", 2, (3<<5), (1<<5), - "Request quiet BIOS display"}, - {"verbose=yes", 2, (3<<5), (2<<5), - "Request verbose BIOS display"}, - {"force_pet", 2, (1<<4), (1<<4), - "Force progress event traps"}, - {"upw_bypass", 2, (1<<3), (1<<3), - "User password bypass"}, - {"lockout_sleep", 2, (1<<2), (1<<2), - "Log Out Sleep Button"}, - {"cons_redirect=default", 2, (3<<0), (0<<0), - "Console redirection occurs per BIOS configuration setting"}, - {"cons_redirect=skip", 2, (3<<0), (1<<0), - "Suppress (skip) console redirection if enabled"}, - {"cons_redirect=enable", 2, (3<<0), (2<<0), - "Suppress (skip) console redirection if enabled"}, - /* data 4 */ - /* data4[7:4] reserved */ - /* data4[3] BIOS Shared Mode Override, not implemented here */ - /* data4[2:0] BIOS Mux Control Override, not implemented here */ - - /* data5 reserved */ - - {NULL} /* End marker */ - }, *op; - - memset(&flags[0], 0, sizeof(flags)); - token = strtok_r(argv[2] + 8, ",", &saveptr); - while (token != NULL) { - if (strcmp(token, "help") == 0) { - optionError = 1; - break; - } - for (op = options; op->name != NULL; ++op) { - if (strcmp(token, op->name) == 0) { - flags[op->i] &= op->mask; - flags[op->i] |= op->value; - break; - } + static const char *kw = "options="; + char *optstr = NULL; + uint8_t flags[BF_BYTE_COUNT]; + bool use_flags = false; + + if (argc >= 3) { + if (!strcmp(argv[2], "clear-cmos=yes")) { + /* Exclusive clear-cmos, no other flags */ + optstr = "clear-cmos"; } - if (op->name == NULL) { - /* Option not found */ - optionError = 1; - lprintf(LOG_ERR, "Invalid option: %s", token); + else if (!strncmp(argv[2], kw, strlen(kw))) { + optstr = argv[2] + strlen(kw); } - token = strtok_r(NULL, ",", &saveptr); } - if (optionError) { - lprintf(LOG_NOTICE, "Legal options settings are:"); - lprintf(LOG_NOTICE, "\thelp:\tprint this message"); - for (op = options; op->name != NULL; ++op) { - lprintf(LOG_NOTICE, "\t%s:\t%s", op->name, op->desc); - } - return (-1); + if (optstr) { + if (!bootdev_parse_options(optstr, flags)) + goto out; + + use_flags = true; } - rc = ipmi_chassis_set_bootdev(intf, argv[1], flags); - } - else - rc = ipmi_chassis_set_bootdev(intf, argv[1], NULL); + rc = ipmi_chassis_set_bootdev(intf, argv[1], + use_flags + ? flags + : NULL); } } + else if (!strcmp(argv[0], "bootmbox")) { + rc = chassis_bootmailbox(intf, argc -1, argv + 1); + } else { lprintf(LOG_ERR, "Invalid chassis command: %s", argv[0]); - return -1; } +out: return rc; } diff --git a/lib/ipmi_dcmi.c b/lib/ipmi_dcmi.c index 2cfe48f..8ed87a9 100755..100644 --- a/lib/ipmi_dcmi.c +++ b/lib/ipmi_dcmi.c @@ -36,7 +36,6 @@ * This code conforms to the 1.0 DCMI Specification * released by Hari Ramachandran of the Intel Corporation */ -#define _BSD_SOURCE #include <stdlib.h> #include <string.h> @@ -57,6 +56,7 @@ #include <ipmitool/ipmi_entity.h> #include <ipmitool/ipmi_constants.h> #include <ipmitool/ipmi_sensor.h> +#include <ipmitool/ipmi_time.h> #include "../src/plugins/lanplus/lanplus.h" @@ -74,31 +74,40 @@ static int ipmi_print_sensor_info(struct ipmi_intf *intf, uint16_t rec_id); * to change a lot of the code in the main(). * ******************************************************************************/ +/* + * This is a termination macro for all struct dcmi_cmd arrays, + * def argument is the default value returned by str2val2() + * when string is not found in the array + */ +#define DCMI_CMD_END(def) { (def), NULL, NULL } + /* Main set of DCMI commands */ const struct dcmi_cmd dcmi_cmd_vals[] = { - { 0x00, "discover", " Used to discover supported DCMI capabilities" }, - { 0x01, "power", " Platform power limit command options" }, - { 0x02, "sensors", " Prints the available DCMI sensors" }, - { 0x03, "asset_tag", " Prints the platform's asset tag" }, - { 0x04, "set_asset_tag", " Sets the platform's asset tag" }, - { 0x05, "get_mc_id_string", " Get management controller ID string" }, - { 0x06, "set_mc_id_string", " Set management controller ID string" }, - { 0x07, "thermalpolicy", " Thermal policy get/set" }, - { 0x08, "get_temp_reading", " Get Temperature Readings" }, - { 0x09, "get_conf_param", " Get DCMI Config Parameters" }, - { 0x0A, "set_conf_param", " Set DCMI Config Parameters" }, - { 0x0B, "oob_discover", " Ping/Pong Message for DCMI Discovery" }, - { 0xFF, NULL, NULL } + { 0x00, "discover", "Used to discover supported DCMI capabilities" }, + { 0x01, "power", "Platform power limit command options" }, + { 0x02, "sensors", "Prints the available DCMI sensors" }, + { 0x03, "asset_tag", "Prints the platform's asset tag" }, + { 0x04, "set_asset_tag", "Sets the platform's asset tag" }, + { 0x05, "get_mc_id_string", "Get management controller ID string" }, + { 0x06, "set_mc_id_string", "Set management controller ID string" }, + { 0x07, "thermalpolicy", "Thermal policy get/set" }, + { 0x08, "get_temp_reading", "Get Temperature Readings" }, + { 0x09, "get_conf_param", "Get DCMI Config Parameters" }, + { 0x0A, "set_conf_param", "Set DCMI Config Parameters" }, + { 0x0B, "oob_discover", "Ping/Pong Message for DCMI Discovery" }, + + DCMI_CMD_END(0xFF) }; -/* get capabilites */ +/* get capabilities */ const struct dcmi_cmd dcmi_capable_vals[] = { - { 0x01, "platform", " Lists the system capabilities" }, + { 0x01, "platform", "Lists the system capabilities" }, { 0x02, "mandatory_attributes", "Lists SEL, identification and" - "temperature attributes" }, - { 0x03, "optional_attributes", " Lists power capabilities" }, - { 0x04, "managebility access", " Lists OOB channel information" }, - { 0xFF, NULL, NULL } + "temperature attributes" }, + { 0x03, "optional_attributes", "Lists power capabilities" }, + { 0x04, "managebility access", "Lists OOB channel information" }, + + DCMI_CMD_END(0xFF) }; /* platform capabilities @@ -107,54 +116,60 @@ const struct dcmi_cmd dcmi_capable_vals[] = { */ const struct dcmi_cmd dcmi_mandatory_platform_capabilities[] = { { 0x01, "Identification support available", "" }, - { 0x02, "SEL logging available", "" }, - { 0x03, "Chassis power available", "" }, - { 0x04, "Temperature monitor available", "" }, - { 0xFF, NULL, NULL } + { 0x02, "SEL logging available", "" }, + { 0x03, "Chassis power available", "" }, + { 0x04, "Temperature monitor available", "" }, + + DCMI_CMD_END(0xFF) }; /* optional capabilities */ const struct dcmi_cmd dcmi_optional_platform_capabilities[] = { - { 0x01, "Power management available", "" }, - { 0xFF, NULL, NULL } + { 0x01, "Power management available", "" }, + + DCMI_CMD_END(0xFF) }; -/* access capabilties */ +/* access capabilities */ const struct dcmi_cmd dcmi_management_access_capabilities[] = { - { 0x01, "In-band KCS channel available", "" }, - { 0x02, "Out-of-band serial TMODE available", "" }, + { 0x01, "In-band KCS channel available", "" }, + { 0x02, "Out-of-band serial TMODE available", "" }, { 0x03, "Out-of-band secondary LAN channel available", "" }, - { 0x04, "Out-of-band primary LAN channel available", "" }, - { 0x05, "SOL enabled", "" }, - { 0x06, "VLAN capable", "" }, - { 0xFF, NULL, NULL } + { 0x04, "Out-of-band primary LAN channel available", "" }, + { 0x05, "SOL enabled", "" }, + { 0x06, "VLAN capable", "" }, + + DCMI_CMD_END(0xFF) }; /* identification capabilities */ const struct dcmi_cmd dcmi_id_capabilities_vals[] = { - { 0x01, "GUID", "" }, + { 0x01, "GUID", "" }, { 0x02, "DHCP hostname", "" }, - { 0x03, "Asset tag", "" }, - { 0xFF, NULL, NULL } + { 0x03, "Asset tag", "" }, + + DCMI_CMD_END(0xFF) }; /* Configuration parameters*/ const struct dcmi_cmd dcmi_conf_param_vals[] = { - { 0x01, "activate_dhcp", "\tActivate DHCP"}, - { 0x02, "dhcp_config", "\tDHCP Configuration" }, - { 0x03, "init", "\t\tInitial timeout interval" }, - { 0x04, "timeout", "\t\tServer contact timeout interval" }, - { 0x05, "retry", "\t\tServer contact retry interval" }, - { 0xFF, NULL, NULL } + { 0x01, "activate_dhcp", "\tActivate DHCP" }, + { 0x02, "dhcp_config", "\tDHCP Configuration" }, + { 0x03, "init", "\t\tInitial timeout interval" }, + { 0x04, "timeout", "\t\tServer contact timeout interval" }, + { 0x05, "retry", "\t\tServer contact retry interval" }, + + DCMI_CMD_END(0xFF) }; /* temperature monitoring capabilities */ const struct dcmi_cmd dcmi_temp_monitoring_vals[] = { - { 0x01, "inlet", " Inlet air temperature sensors" }, - { 0x02, "cpu", " CPU temperature sensors" }, - { 0x03, "baseboard", "Baseboard temperature sensors" }, - { 0xff, NULL, NULL } + { 0x01, "inlet", "Inlet air temperature sensors" }, + { 0x02, "cpu", "CPU temperature sensors" }, + { 0x03, "baseboard", "Baseboard temperature sensors" }, + + DCMI_CMD_END(0xFF) }; /* These are not comands. These are the DCMI temp sensors and their numbers @@ -162,113 +177,121 @@ const struct dcmi_cmd dcmi_temp_monitoring_vals[] = { * sensor number */ const struct dcmi_cmd dcmi_discvry_snsr_vals[] = { - { 0x40, "Inlet", " Inlet air temperature sensors" }, - { 0x41, "CPU", " CPU temperature sensors" }, - { 0x42, "Baseboard", "Baseboard temperature sensors" }, - { 0xff, NULL, NULL } + { 0x40, "Inlet", "Inlet air temperature sensors" }, + { 0x41, "CPU", "CPU temperature sensors" }, + { 0x42, "Baseboard", "Baseboard temperature sensors" }, + + DCMI_CMD_END(0xFF) }; /* Temperature Readings */ const struct dcmi_cmd dcmi_temp_read_vals[] = { - { 0x40, "Inlet", "Inlet air temperature(40h) " }, - { 0x41, "CPU", "CPU temperature sensors(41h) " }, - { 0x42, "Baseboard", "Baseboard temperature sensors(42h) " }, - { 0xff, NULL, NULL } + { 0x40, "Inlet", "Inlet air temperature(40h)" }, + { 0x41, "CPU", "CPU temperature sensors(41h)" }, + { 0x42, "Baseboard", "Baseboard temperature sensors(42h)" }, + + DCMI_CMD_END(0xFF) }; /* power management/control commands */ const struct dcmi_cmd dcmi_pwrmgmt_vals[] = { - { 0x00, "reading", " Get power related readings from the system" }, - { 0x01, "get_limit", " Get the configured power limits" }, - { 0x02, "set_limit", " Set a power limit option" }, - { 0x03, "activate", " Activate the set power limit" }, - { 0x04, "deactivate", "Deactivate the set power limit" }, - { 0xFF, NULL, NULL } + { 0x00, "reading", "Get power related readings from the system" }, + { 0x01, "get_limit", "Get the configured power limits" }, + { 0x02, "set_limit", "Set a power limit option" }, + { 0x03, "activate", "Activate the set power limit" }, + { 0x04, "deactivate", "Deactivate the set power limit" }, + + DCMI_CMD_END(0xFF) }; /* set power limit commands */ const struct dcmi_cmd dcmi_pwrmgmt_set_usage_vals[] = { - { 0x00, "action", " <no_action | sel_logging | power_off>" }, - { 0x01, "limit", " <number in Watts>" }, + { 0x00, "action", "<no_action | sel_logging | power_off>" }, + { 0x01, "limit", "<number in Watts>" }, { 0x02, "correction", "<number in milliseconds>" }, - { 0x03, "sample", " <number in seconds>" }, - { 0xFF, NULL, NULL } + { 0x03, "sample", "<number in seconds>" }, + + DCMI_CMD_END(0xFF) }; /* power management/get action commands */ const struct dcmi_cmd dcmi_pwrmgmt_get_action_vals[] = { - { 0x00, "No Action", ""}, - { 0x01, "Hard Power Off & Log Event to SEL", ""}, - - { 0x02, "OEM reserved (02h)", ""}, - { 0x03, "OEM reserved (03h)", ""}, - { 0x04, "OEM reserved (04h)", ""}, - { 0x05, "OEM reserved (05h)", ""}, - { 0x06, "OEM reserved (06h)", ""}, - { 0x07, "OEM reserved (07h)", ""}, - { 0x08, "OEM reserved (08h)", ""}, - { 0x09, "OEM reserved (09h)", ""}, - { 0x0a, "OEM reserved (0ah)", ""}, - { 0x0b, "OEM reserved (0bh)", ""}, - { 0x0c, "OEM reserved (0ch)", ""}, - { 0x0d, "OEM reserved (0dh)", ""}, - { 0x0e, "OEM reserved (0eh)", ""}, - { 0x0f, "OEM reserved (0fh)", ""}, - { 0x10, "OEM reserved (10h)", ""}, - - { 0x11, "Log Event to SEL", ""}, - { 0xFF, NULL, NULL } + { 0x00, "No Action", "" }, + { 0x01, "Hard Power Off & Log Event to SEL", "" }, + + { 0x02, "OEM reserved (02h)", "" }, + { 0x03, "OEM reserved (03h)", "" }, + { 0x04, "OEM reserved (04h)", "" }, + { 0x05, "OEM reserved (05h)", "" }, + { 0x06, "OEM reserved (06h)", "" }, + { 0x07, "OEM reserved (07h)", "" }, + { 0x08, "OEM reserved (08h)", "" }, + { 0x09, "OEM reserved (09h)", "" }, + { 0x0a, "OEM reserved (0ah)", "" }, + { 0x0b, "OEM reserved (0bh)", "" }, + { 0x0c, "OEM reserved (0ch)", "" }, + { 0x0d, "OEM reserved (0dh)", "" }, + { 0x0e, "OEM reserved (0eh)", "" }, + { 0x0f, "OEM reserved (0fh)", "" }, + { 0x10, "OEM reserved (10h)", "" }, + + { 0x11, "Log Event to SEL", "" }, + + DCMI_CMD_END(0xFF) }; /* power management/set action commands */ const struct dcmi_cmd dcmi_pwrmgmt_action_vals[] = { - { 0x00, "no_action", "No Action"}, - { 0x01, "power_off", "Hard Power Off & Log Event to SEL"}, - { 0x11, "sel_logging", "Log Event to SEL"}, - - { 0x02, "oem_02", "OEM reserved (02h)"}, - { 0x03, "oem_03", "OEM reserved (03h)"}, - { 0x04, "oem_04", "OEM reserved (04h)"}, - { 0x05, "oem_05", "OEM reserved (05h)"}, - { 0x06, "oem_06", "OEM reserved (06h)"}, - { 0x07, "oem_07", "OEM reserved (07h)"}, - { 0x08, "oem_08", "OEM reserved (08h)"}, - { 0x09, "oem_09", "OEM reserved (09h)"}, - { 0x0a, "oem_0a", "OEM reserved (0ah)"}, - { 0x0b, "oem_0b", "OEM reserved (0bh)"}, - { 0x0c, "oem_0c", "OEM reserved (0ch)"}, - { 0x0d, "oem_0d", "OEM reserved (0dh)"}, - { 0x0e, "oem_0e", "OEM reserved (0eh)"}, - { 0x0f, "oem_0f", "OEM reserved (0fh)"}, - { 0x10, "oem_10", "OEM reserved (10h)"}, - - { 0xFF, NULL, NULL } + { 0x00, "no_action", "No Action" }, + { 0x01, "power_off", "Hard Power Off & Log Event to SEL" }, + { 0x11, "sel_logging", "Log Event to SEL" }, + + { 0x02, "oem_02", "OEM reserved (02h)" }, + { 0x03, "oem_03", "OEM reserved (03h)" }, + { 0x04, "oem_04", "OEM reserved (04h)" }, + { 0x05, "oem_05", "OEM reserved (05h)" }, + { 0x06, "oem_06", "OEM reserved (06h)" }, + { 0x07, "oem_07", "OEM reserved (07h)" }, + { 0x08, "oem_08", "OEM reserved (08h)" }, + { 0x09, "oem_09", "OEM reserved (09h)" }, + { 0x0a, "oem_0a", "OEM reserved (0ah)" }, + { 0x0b, "oem_0b", "OEM reserved (0bh)" }, + { 0x0c, "oem_0c", "OEM reserved (0ch)" }, + { 0x0d, "oem_0d", "OEM reserved (0dh)" }, + { 0x0e, "oem_0e", "OEM reserved (0eh)" }, + { 0x0f, "oem_0f", "OEM reserved (0fh)" }, + { 0x10, "oem_10", "OEM reserved (10h)" }, + + DCMI_CMD_END(0xFF) }; /* thermal policy action commands */ const struct dcmi_cmd dcmi_thermalpolicy_vals[] = { - { 0x00, "get", "Get thermal policy" }, - { 0x01, "set", "Set thermal policy" }, - { 0xFF, NULL, NULL } + { 0x00, "get", "Get thermal policy" }, + { 0x01, "set", "Set thermal policy" }, + + DCMI_CMD_END(0xFF) }; /* thermal policy action commands */ const struct dcmi_cmd dcmi_confparameters_vals[] = { - { 0x00, "get", "Get configuration parameters" }, - { 0x01, "set", "Set configuration parameters" }, - { 0xFF, NULL, NULL } + { 0x00, "get", "Get configuration parameters" }, + { 0x01, "set", "Set configuration parameters" }, + + DCMI_CMD_END(0xFF) }; /* entityIDs used in thermap policy */ const struct dcmi_cmd dcmi_thermalpolicy_set_parameters_vals[] = { - { 0x00, "volatile", " Current Power Cycle" }, - { 0x01, "nonvolatile", "Set across power cycles" }, - { 0x01, "poweroff", " Hard Power Off system" }, - { 0x00, "nopoweroff", " No 'Hard Power Off' action" }, - { 0x01, "sel", " Log event to SEL" }, - { 0x00, "nosel", " No 'Log event to SEL' action" }, - { 0x00, "disabled", " Disabled" }, - { 0x00, NULL, NULL } + { 0x00, "volatile", "Current Power Cycle" }, + { 0x01, "nonvolatile", "Set across power cycles" }, + { 0x01, "poweroff", "Hard Power Off system" }, + { 0x00, "nopoweroff", "No 'Hard Power Off' action" }, + { 0x01, "sel", "Log event to SEL" }, + { 0x00, "nosel", "No 'Log event to SEL' action" }, + { 0x00, "disabled", "Disabled" }, + + DCMI_CMD_END(0) }; @@ -301,54 +324,59 @@ const struct valstr dcmi_ccode_vals[] = { */ const struct dcmi_cmd dcmi_sampling_vals[] = { - { 0x05, "5_sec", "" }, + { 0x05, "5_sec", "" }, { 0x0f, "15_sec", "" }, { 0x1E, "30_sec", "" }, - { 0x41, "1_min", "" }, - { 0x43, "3_min", "" }, - { 0x47, "7_min", "" }, + { 0x41, "1_min", "" }, + { 0x43, "3_min", "" }, + { 0x47, "7_min", "" }, { 0x4F, "15_min", "" }, { 0x5E, "30_min", "" }, - { 0x81, "1_hour", ""}, - { 0x00, NULL, NULL }, + { 0x81, "1_hour", "" }, + + DCMI_CMD_END(0) }; /* Primary Node Manager commands */ const struct dcmi_cmd nm_cmd_vals[] = { - { 0x00, "discover", "Discover Node Manager " }, + { 0x00, "discover", "Discover Node Manager" }, { 0x01, "capability", "Get Node Manager Capabilities" }, - { 0x02, "control", "Enable/Disable Policy Control" }, - { 0x03, "policy", "Add/Remove Policies" }, + { 0x02, "control", "Enable/Disable Policy Control" }, + { 0x03, "policy", "Add/Remove Policies" }, { 0x04, "statistics", "Get Statistics" }, - { 0x05, "power", "Set Power Draw Range" }, - { 0x06, "suspend", "Set/Get Policy suspend periods" }, - { 0x07, "reset", "Reset Statistics" }, - { 0x08, "alert", "Set/Get/Clear Alert destination" }, - { 0x09, "threshold", "Set/Get Alert Thresholds" }, - { 0xFF, NULL, NULL }, + { 0x05, "power", "Set Power Draw Range" }, + { 0x06, "suspend", "Set/Get Policy suspend periods" }, + { 0x07, "reset", "Reset Statistics" }, + { 0x08, "alert", "Set/Get/Clear Alert destination" }, + { 0x09, "threshold", "Set/Get Alert Thresholds" }, + + DCMI_CMD_END(0xFF), }; const struct dcmi_cmd nm_ctl_cmds[] = { - { 0x01, "enable", " <control scope>" }, - { 0x00, "disable", "<control scope>"}, - { 0xFF, NULL, NULL }, + { 0x01, "enable", "<control scope>" }, + { 0x00, "disable", "<control scope>" }, + + DCMI_CMD_END(0xFF), }; const struct dcmi_cmd nm_ctl_domain[] = { - { 0x00, "global", "" }, + { 0x00, "global", "" }, { 0x02, "per_domain", "<platform|CPU|Memory> (default is platform)" }, - { 0x04, "per_policy", "<0-7>" }, - { 0xFF, NULL, NULL }, + { 0x04, "per_policy", "<0-255>" }, + + DCMI_CMD_END(0xFF), }; /* Node Manager Domain codes */ const struct dcmi_cmd nm_domain_vals[] = { - { 0x00, "platform", "" }, - { 0x01, "CPU", "" }, - { 0x02, "Memory", "" }, + { 0x00, "platform", "" }, + { 0x01, "CPU", "" }, + { 0x02, "Memory", "" }, { 0x03, "protection", "" }, - { 0x04, "I/O", "" }, - { 0xFF, NULL, NULL }, + { 0x04, "I/O", "" }, + + DCMI_CMD_END(0xFF), }; const struct dcmi_cmd nm_version_vals[] = { @@ -357,76 +385,90 @@ const struct dcmi_cmd nm_version_vals[] = { { 0x03, "2.0", "" }, { 0x04, "2.5", "" }, { 0x05, "3.0", "" }, - { 0xFF, NULL, NULL }, + + DCMI_CMD_END(0xFF), }; const struct dcmi_cmd nm_capability_opts[] = { - { 0x01, "domain", "<platform|CPU|Memory> (default is platform)" }, - { 0x02, "inlet", "Inlet temp trigger" }, + { 0x01, "domain", "<platform|CPU|Memory> (default is platform)" }, + { 0x02, "inlet", "Inlet temp trigger" }, { 0x03, "missing", "Missing Power reading trigger" }, - { 0x04, "reset", "Time after Host reset trigger" }, - { 0x05, "boot", "Boot time policy" }, - { 0xFF, NULL, NULL }, + { 0x04, "reset", "Time after Host reset trigger" }, + { 0x05, "boot", "Boot time policy" }, + + DCMI_CMD_END(0xFF), }; const struct dcmi_cmd nm_policy_type_vals[] = { - { 0x00, "No trigger, use Power Limit", "" }, - { 0x01, "Inlet temp trigger", "" }, - { 0x02, "Missing Power reading trigger", "" }, - { 0x03, "Time after Host reset trigger", "" }, + { 0x00, "No trigger, use Power Limit", "" }, + { 0x01, "Inlet temp trigger", "" }, + { 0x02, "Missing Power reading trigger", "" }, + { 0x03, "Time after Host reset trigger", "" }, { 0x04, "number of cores to disable at boot time", "" }, - { 0xFF, NULL, NULL }, + + DCMI_CMD_END(0xFF), }; const struct dcmi_cmd nm_stats_opts[] = { - { 0x01, "domain", "<platform|CPU|Memory> (default is platform)" }, - { 0x02, "policy_id", "<0-7>" }, - { 0xFF, NULL, NULL }, + { 0x01, "domain", "<platform|CPU|Memory> (default is platform)" }, + { 0x02, "policy_id", "<0-255>" }, + + DCMI_CMD_END(0xFF), }; const struct dcmi_cmd nm_stats_mode[] = { - { 0x01, "power", "global power" }, - { 0x02, "temps", "inlet temperature" }, - { 0x11, "policy_power", "per policy power" }, - { 0x12, "policy_temps", "per policy inlet temp" }, - { 0x13, "policy_throt", "per policy throttling stats" }, - { 0x1B, "requests", "unhandled requests" }, - { 0x1C, "response", "response time" }, + { 0x01, "power", "global power" }, + { 0x02, "temps", "inlet temperature" }, + { 0x11, "policy_power", "per policy power" }, + { 0x12, "policy_temps", "per policy inlet temp" }, + { 0x13, "policy_throt", "per policy throttling stats" }, + { 0x1B, "requests", "unhandled requests" }, + { 0x1C, "response", "response time" }, { 0x1D, "cpu_throttling", "CPU throttling" }, { 0x1E, "mem_throttling", "memory throttling" }, - { 0x1F, "comm_fail", "host communication failures" }, - { 0xFF, NULL, NULL }, + { 0x1F, "comm_fail", "host communication failures" }, + + DCMI_CMD_END(0xFF), }; const struct dcmi_cmd nm_policy_action[] = { - { 0x00, "get", "nm policy get policy_id <0-7> [domain <platform|CPU|Memory>]" }, - { 0x04, "add", "nm policy add policy_id <0-7> [domain <platform|CPU|Memory>] correction auto|soft|hard power <watts>|inlet <temp> trig_lim <param> stats <seconds> enable|disable" }, - { 0x05, "remove", "nm policy remove policy_id <0-7> [domain <platform|CPU|Memory>]" }, + { 0x00, "get", "nm policy get policy_id <0-255> " + "[domain <platform|CPU|Memory>]" }, + { 0x04, "add", "nm policy add policy_id <0-255> " + "[domain <platform|CPU|Memory>] " + "correction auto|soft|hard power <watts> | " + "inlet <temp> trig_lim <param> " + "stats <seconds> enable|disable" }, + { 0x05, "remove", "nm policy remove policy_id <0-255> " + "[domain <platform|CPU|Memory>]" }, { 0x06, "limiting", "nm policy limiting [domain <platform|CPU|Memory>]" }, - { 0xFF, NULL, NULL }, + + DCMI_CMD_END(0xFF), }; const struct dcmi_cmd nm_policy_options[] = { - { 0x01, "enable", "" }, - { 0x02, "disable", "" }, - { 0x03, "domain", "" }, - { 0x04, "inlet", "inlet air temp full limiting (SCRAM)"}, - { 0x06, "correction", "auto, soft, hard" }, - { 0x08, "power", "power limit in watts" }, - { 0x09, "trig_lim", "time to send alert" }, - { 0x0A, "stats", "moving window averaging time" }, + { 0x01, "enable", "" }, + { 0x02, "disable", "" }, + { 0x03, "domain", "" }, + { 0x04, "inlet", "inlet air temp full limiting (SCRAM)" }, + { 0x06, "correction","auto, soft, hard" }, + { 0x08, "power", "power limit in watts" }, + { 0x09, "trig_lim", "time to send alert" }, + { 0x0A, "stats", "moving window averaging time" }, { 0x0B, "policy_id", "policy number" }, - { 0x0C, "volatile", "save policy in volatiel memory" }, + { 0x0C, "volatile", "save policy in volatiel memory" }, { 0x0D, "cores_off", "at boot time, disable N cores" }, - { 0xFF, NULL, NULL }, + + DCMI_CMD_END(0xFF), }; /* if "trigger" command used from nm_policy_options */ const struct dcmi_cmd nm_trigger[] = { - { 0x00, "none", "" }, - { 0x01, "temp", "" }, + { 0x00, "none", "" }, + { 0x01, "temp", "" }, { 0x02, "reset", "" }, - { 0x03, "boot", "" }, - { 0xFF, NULL, NULL }, + { 0x03, "boot", "" }, + + DCMI_CMD_END(0xFF), }; /* if "correction" used from nm_policy_options */ @@ -434,86 +476,105 @@ const struct dcmi_cmd nm_correction[] = { { 0x00, "auto", "" }, { 0x01, "soft", "" }, { 0x02, "hard", "" }, - { 0xFF, NULL, NULL }, + + DCMI_CMD_END(0xFF), }; /* returned codes from get policy */ const struct dcmi_cmd nm_correction_vals[] = { { 0x00, "no T-state use", "" }, { 0x01, "no T-state use", "" }, - { 0x02, "use T-states", "" }, - { 0xFF, NULL, NULL }, + { 0x02, "use T-states", "" }, + + DCMI_CMD_END(0xFF), }; /* if "exception" used from nm_policy_options */ const struct dcmi_cmd nm_exception[] = { - { 0x00, "none", "" }, - { 0x01, "alert", "" }, + { 0x00, "none", "" }, + { 0x01, "alert", "" }, { 0x02, "shutdown", "" }, - { 0xFF, NULL, NULL }, + + DCMI_CMD_END(0xFF), }; const struct dcmi_cmd nm_reset_mode[] = { - { 0x00, "global", "" }, + { 0x00, "global", "" }, { 0x01, "per_policy", "" }, - { 0x1B, "requests", "" }, - { 0x1C, "response", "" }, + { 0x1B, "requests", "" }, + { 0x1C, "response", "" }, { 0x1D, "throttling", "" }, - { 0x1E, "memory", "", }, - { 0x1F, "comm", "" }, - { 0xFF, NULL, NULL }, + { 0x1E, "memory", "" }, + { 0x1F, "comm", "" }, + + DCMI_CMD_END(0xFF), }; const struct dcmi_cmd nm_power_range[] = { { 0x01, "domain", "domain <platform|CPU|Memory> (default is platform)" }, - { 0x02, "min", " min <integer value>" }, - { 0x03, "max", "max <integer value>" }, - { 0xFF, NULL, NULL }, + { 0x02, "min", "min <integer value>" }, + { 0x03, "max", "max <integer value>" }, + + DCMI_CMD_END(0xFF), }; const struct dcmi_cmd nm_alert_opts[] = { - { 0x01, "set", "nm alert set chan <chan> dest <dest> string <string>" }, - { 0x02, "get", "nm alert get" }, + { 0x01, "set", "nm alert set chan <chan> dest <dest> string <string>" }, + { 0x02, "get", "nm alert get" }, { 0x03, "clear", "nm alert clear dest <dest>" }, + + DCMI_CMD_END(0xFF), }; const struct dcmi_cmd nm_set_alert_param[] = { - { 0x01, "chan", "chan <channel>" }, - { 0x02, "dest", "dest <destination>" }, + { 0x01, "chan", "chan <channel>" }, + { 0x02, "dest", "dest <destination>" }, { 0x03, "string", "string <string>" }, + + DCMI_CMD_END(0xFF), }; const struct dcmi_cmd nm_thresh_cmds[] = { - { 0x01, "set", "nm thresh set [domain <platform|CPU|Memory>] policy_id <policy> thresh_array" }, - { 0x02, "get", "nm thresh get [domain <platform|CPU|Memory>] policy_id <policy>" }, + { 0x01, "set", "nm thresh set [domain <platform|CPU|Memory>] " + "policy_id <policy> thresh_array" }, + { 0x02, "get", "nm thresh get [domain <platform|CPU|Memory>] " + "policy_id <policy>" }, + + DCMI_CMD_END(0xFF), }; const struct dcmi_cmd nm_thresh_param[] = { - { 0x01, "domain", "<platform|CPU|Memory> (default is platform)" }, - { 0x02, "policy_id", "<0-7>" }, - { 0xFF, NULL, NULL }, + { 0x01, "domain", "<platform|CPU|Memory> (default is platform)" }, + { 0x02, "policy_id", "<0-255>" }, + + DCMI_CMD_END(0xFF), }; const struct dcmi_cmd nm_suspend_cmds[] = { - { 0x01, "set", "nm suspend set [domain <platform|CPU|Memory]> policy_id <policy> <start> <stop> <pattern>" }, - { 0x02, "get", "nm suspend get [domain <platform|CPU|Memory]> policy_id <policy>" }, + { 0x01, "set", "nm suspend set [domain <platform|CPU|Memory]> " + "policy_id <policy> <start> " + "<stop> <pattern>" }, + { 0x02, "get", "nm suspend get [domain <platform|CPU|Memory]> " + "policy_id <policy>" }, + + DCMI_CMD_END(0xFF), }; const struct valstr nm_ccode_vals[] = { - { 0x80, "Policy ID Invalid"}, - { 0x81, "Domain ID Invalid"}, - { 0x82, "Unknown policy trigger type"}, - { 0x84, "Power Limit out of range"}, - { 0x85, "Correction Time out of range"}, - { 0x86, "Policy Trigger value out of range"}, - { 0x88, "Invalid Mode"}, - { 0x89, "Statistics Reporting Period out of range"}, - { 0x8B, "Invalid value for Aggressive CPU correction field"}, - { 0xA1, "No policy is currently limiting for the specified domain ID"}, - { 0xC4, "No space available"}, - { 0xD4, "Insufficient privledge level due wrong responder LUN"}, - { 0xD5, "Policy exists and param unchangeable while enabled"}, - { 0xD6, "Command subfunction disabled or unavailable"}, + { 0x80, "Policy ID Invalid" }, + { 0x81, "Domain ID Invalid" }, + { 0x82, "Unknown policy trigger type" }, + { 0x84, "Power Limit out of range" }, + { 0x85, "Correction Time out of range" }, + { 0x86, "Policy Trigger value out of range" }, + { 0x88, "Invalid Mode" }, + { 0x89, "Statistics Reporting Period out of range" }, + { 0x8B, "Invalid value for Aggressive CPU correction field" }, + { 0xA1, "No policy is currently limiting for the specified domain ID" }, + { 0xC4, "No space available" }, + { 0xD4, "Insufficient privilege level due wrong responder LUN" }, + { 0xD5, "Policy exists and param unchangeable while enabled" }, + { 0xD6, "Command subfunction disabled or unavailable" }, { 0xFF, NULL }, }; @@ -533,20 +594,20 @@ const struct valstr nm_ccode_vals[] = { */ void print_strs(const struct dcmi_cmd * vs, const char * title, int loglevel, - int verthorz) + int verthorz) { int i; - if (vs == NULL) + if (!vs) return; - if (title != NULL) { + if (title) { if (loglevel < 0) printf("\n%s\n", title); else lprintf(loglevel, "\n%s", title); } - for (i = 0; vs[i].str != NULL; i++) { + for (i = 0; vs[i].str; i++) { if (loglevel < 0) { if (vs[i].val < 256) if (verthorz == 0) @@ -566,7 +627,7 @@ print_strs(const struct dcmi_cmd * vs, const char * title, int loglevel, /* Check to see if this is NOT the last element in vs.str if true * print the | else don't print anything. */ - if ((verthorz == 1) && (vs[i+1].str != NULL)) + if (verthorz == 1 && vs[i+1].str) printf(" | "); } if (verthorz == 0) { @@ -590,14 +651,12 @@ uint16_t str2val2(const char *str, const struct dcmi_cmd *vs) { int i; - if (vs == NULL || str == NULL) { + if (!vs || !str) { return 0; } - for (i = 0; vs[i].str != NULL; i++) { - if (strncasecmp(vs[i].str, str, - __maxlen(str, vs[i].str)) == 0) { + for (i = 0; vs[i].str; i++) { + if (strcasecmp(vs[i].str, str) == 0) return vs[i].val; - } } return vs[i].val; } @@ -616,10 +675,10 @@ val2str2(uint16_t val, const struct dcmi_cmd *vs) static char un_str[32]; int i; - if (vs == NULL) + if (!vs) return NULL; - for (i = 0; vs[i].str != NULL; i++) { + for (i = 0; vs[i].str; i++) { if (vs[i].val == val) return vs[i].str; } @@ -637,7 +696,7 @@ chk_rsp(struct ipmi_rs * rsp) /* if the response from the intf is NULL then the BMC is experiencing * some issue and cannot complete the command */ - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "\n Unable to get DCMI information"); return 1; } @@ -647,16 +706,17 @@ chk_rsp(struct ipmi_rs * rsp) */ if ((rsp->ccode >= 0x80) && (rsp->ccode <= 0x8F)) { lprintf(LOG_ERR, "\n DCMI request failed because: %s (%x)", - val2str(rsp->ccode, dcmi_ccode_vals), rsp->ccode); + val2str(rsp->ccode, dcmi_ccode_vals), rsp->ccode); return 1; - } else if (rsp->ccode > 0) { + } else if (rsp->ccode) { lprintf(LOG_ERR, "\n DCMI request failed because: %s (%x)", - val2str(rsp->ccode, completion_code_vals), rsp->ccode); + val2str(rsp->ccode, completion_code_vals), rsp->ccode); return 1; } /* check to make sure this is a DCMI firmware */ if(rsp->data[0] != IPMI_DCMI) { - printf("\n A valid DCMI command was not returned! (%x)", rsp->data[0]); + printf("\n A valid DCMI command was not returned! (%x)", + rsp->data[0]); return 1; } return 0; @@ -671,7 +731,7 @@ chk_nm_rsp(struct ipmi_rs * rsp) /* if the response from the intf is NULL then the BMC is experiencing * some issue and cannot complete the command */ - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "\n No response to NM request"); return 1; } @@ -683,7 +743,7 @@ chk_nm_rsp(struct ipmi_rs * rsp) lprintf(LOG_ERR, "\n NM request failed because: %s (%x)", val2str(rsp->ccode, nm_ccode_vals), rsp->ccode); return 1; - } else if (rsp->ccode > 0) { + } else if (rsp->ccode) { lprintf(LOG_ERR, "\n NM request failed because: %s (%x)", val2str(rsp->ccode, completion_code_vals), rsp->ccode); return 1; @@ -753,11 +813,11 @@ ipmi_dcmi_prnt_oobDiscover(struct ipmi_intf * intf) # else struct ipmi_session_params *p; - if (intf->opened == 0 && intf->open != NULL) { + if (intf->opened == 0 && intf->open) { if (intf->open(intf) < 0) return (-1); } - if (intf == NULL || intf->session == NULL) + if (!intf || !intf->session) return -1; p = &intf->ssn_params; @@ -771,7 +831,7 @@ ipmi_dcmi_prnt_oobDiscover(struct ipmi_intf * intf) if (p->retry == 0) p->retry = IPMI_LAN_RETRY; - if (p->hostname == NULL || strlen((const char *)p->hostname) == 0) { + if (!p->hostname || strlen((const char *)p->hostname) == 0) { lprintf(LOG_ERR, "No hostname specified!"); return -1; } @@ -786,7 +846,7 @@ ipmi_dcmi_prnt_oobDiscover(struct ipmi_intf * intf) if (intf->fd < 0) { lperror(LOG_ERR, "Connect to %s failed", - p->hostname); + p->hostname); intf->close(intf); return -1; } @@ -822,16 +882,17 @@ ipmi_dcmi_prnt_getcapabilities(struct ipmi_intf * intf, uint8_t selector) memcpy(&reply, rsp->data, sizeof (reply)); /* check to make sure that this is a 1.0/1.1/1.5 command */ if ((cape.conformance != IPMI_DCMI_CONFORM) - && (cape.conformance != IPMI_DCMI_1_1_CONFORM) - && (cape.conformance != IPMI_DCMI_1_5_CONFORM)) { + && (cape.conformance != IPMI_DCMI_1_1_CONFORM) + && (cape.conformance != IPMI_DCMI_1_5_CONFORM)) + { lprintf(LOG_ERR, - "ERROR! This command is not available on this platform"); + "ERROR! This command is not available on this platform"); return -1; } /* check to make sure that this is a rev .01 or .02 */ if (cape.revision != 0x01 && cape.revision != 0x02) { lprintf(LOG_ERR, - "ERROR! This command is not compatible with this version"); + "ERROR! This command is not compatible with this version"); return -1; } /* 0x01 - platform capabilities @@ -847,21 +908,21 @@ ipmi_dcmi_prnt_getcapabilities(struct ipmi_intf * intf, uint8_t selector) /* loop through each of the entries in the first byte from the * struct */ - printf("\n Mandatory platform capabilties\n"); - display_capabilities_attributes( - dcmi_mandatory_platform_capabilities, cape.data_byte1); + printf("\n Mandatory platform capabilities\n"); + display_capabilities_attributes(dcmi_mandatory_platform_capabilities, + cape.data_byte1); /* loop through each of the entries in the second byte from the * struct */ - printf("\n Optional platform capabilties\n"); - display_capabilities_attributes( - dcmi_optional_platform_capabilities, cape.data_byte2); + printf("\n Optional platform capabilities\n"); + display_capabilities_attributes(dcmi_optional_platform_capabilities, + cape.data_byte2); /* loop through each of the entries in the third byte from the * struct */ - printf("\n Managebility access capabilties\n"); - display_capabilities_attributes( - dcmi_management_access_capabilities, cape.data_byte3); + printf("\n Managebility access capabilities\n"); + display_capabilities_attributes(dcmi_management_access_capabilities, + cape.data_byte3); break; case 0x02: printf("\n Mandatory platform attributes:\n"); @@ -885,12 +946,12 @@ ipmi_dcmi_prnt_getcapabilities(struct ipmi_intf * intf, uint8_t selector) printf("\n %d SEL entries\n", sel_entries & 0xFFF); /* byte 3 data */ printf("\n Identification Attributes: \n"); - display_capabilities_attributes( - dcmi_id_capabilities_vals, cape.data_byte3); + display_capabilities_attributes(dcmi_id_capabilities_vals, + cape.data_byte3); /* byte 4 data */ printf("\n Temperature Monitoring Attributes: \n"); display_capabilities_attributes(dcmi_temp_monitoring_vals, - cape.data_byte4); + cape.data_byte4); break; case 0x03: printf("\n Optional Platform Attributes: \n"); @@ -900,19 +961,19 @@ ipmi_dcmi_prnt_getcapabilities(struct ipmi_intf * intf, uint8_t selector) printf(" Slave address of device: 20h (BMC)\n" ); } else { printf(" Slave address of device: %xh (8bits)" - "(Satellite/External controller)\n", - cape.data_byte1); + "(Satellite/External controller)\n", + cape.data_byte1); } /* Controller channel number (4-7) bits */ if ((cape.data_byte2>>4) == 0x00) { printf(" Channel number is 0h (Primary BMC)\n"); } else { printf(" Channel number is %xh \n", - (cape.data_byte2>>4)); + (cape.data_byte2 >> 4)); } /* Device revision (0-3) */ printf(" Device revision is %d \n", - cape.data_byte2 &0xf); + cape.data_byte2 & 0xf); break; case 0x04: /* LAN */ @@ -921,20 +982,20 @@ ipmi_dcmi_prnt_getcapabilities(struct ipmi_intf * intf, uint8_t selector) printf(" Primary LAN channel is not available for OOB\n"); } else { printf(" Primary LAN channel number: %d is available\n", - cape.data_byte1); + cape.data_byte1); } if (cape.data_byte2 == 0xFF) { printf(" Secondary LAN channel is not available for OOB\n"); } else { printf(" Secondary LAN channel number: %d is available\n", - cape.data_byte2); + cape.data_byte2); } /* serial */ if (cape.data_byte3 == 0xFF) { printf(" No serial channel is available\n"); } else { printf(" Serial channel number: %d is available\n", - cape.data_byte3); + cape.data_byte3); } break; case 0x05: @@ -943,7 +1004,7 @@ ipmi_dcmi_prnt_getcapabilities(struct ipmi_intf * intf, uint8_t selector) printf(" DCMI Specification %d.%d\n", reply[1], reply[2]); printf(" Rolling average time period options: %d\n", reply[4]); printf(" Sample time options: "); - for (j = 1; dcmi_sampling_vals[j-1].str != NULL; j++) + for (j = 1; dcmi_sampling_vals[j-1].str; j++) printf(" %s ", val2str2(reply[4+j],dcmi_sampling_vals)); printf("\n"); break; @@ -1008,13 +1069,14 @@ ipmi_dcmi_prnt_getassettag(struct ipmi_intf * intf) taglength = rsp->data[1]; printf("\n Asset tag: "); while (taglength) { - getlength = taglength / DCMI_MAX_BYTE_SIZE ? - DCMI_MAX_BYTE_SIZE : taglength%DCMI_MAX_BYTE_SIZE; + /* TODO: Add parentheses for clarity */ + getlength = taglength / DCMI_MAX_BYTE_SIZE ? DCMI_MAX_BYTE_SIZE + : taglength % DCMI_MAX_BYTE_SIZE; rsp = ipmi_dcmi_getassettag(intf, offset, getlength); /* macro has no effect here where can generate sig segv * if rsp occurs with null */ - if (rsp != NULL) { + if (rsp) { GOOD_ASSET_TAG_CCODE(rsp->ccode); } if (chk_rsp(rsp)) { @@ -1081,8 +1143,9 @@ ipmi_dcmi_prnt_setassettag(struct ipmi_intf * intf, uint8_t * data) } printf("\n Set Asset Tag: "); while (taglength) { - getlength = taglength / DCMI_MAX_BYTE_SIZE ? - DCMI_MAX_BYTE_SIZE : taglength%DCMI_MAX_BYTE_SIZE; + /* TODO: Use a macro or an inline for this repeating calculation */ + getlength = taglength / DCMI_MAX_BYTE_SIZE ? DCMI_MAX_BYTE_SIZE + : taglength % DCMI_MAX_BYTE_SIZE; memcpy(tmpData, data + offset, getlength); rsp = ipmi_dcmi_setassettag(intf, offset, getlength, tmpData); if (chk_rsp(rsp)) { @@ -1146,8 +1209,9 @@ ipmi_dcmi_prnt_getmngctrlids(struct ipmi_intf * intf) printf("\n Get Management Controller Identifier String: "); while (taglength) { - getlength = taglength / DCMI_MAX_BYTE_SIZE ? - DCMI_MAX_BYTE_SIZE : taglength%DCMI_MAX_BYTE_SIZE; + /* TODO: Use a macro or an inline for this repeating calculation */ + getlength = taglength / DCMI_MAX_BYTE_SIZE ? DCMI_MAX_BYTE_SIZE + : taglength % DCMI_MAX_BYTE_SIZE; rsp = ipmi_dcmi_getmngctrlids(intf, offset, getlength); if (chk_rsp(rsp)) { @@ -1223,14 +1287,15 @@ ipmi_dcmi_prnt_setmngctrlids(struct ipmi_intf * intf, uint8_t * data) printf("\n Set Management Controller Identifier String Command: "); while (taglength) { - getlength = taglength / DCMI_MAX_BYTE_SIZE ? - DCMI_MAX_BYTE_SIZE : taglength%DCMI_MAX_BYTE_SIZE; + /* TODO: Use a macro or an inline for this repeating calculation */ + getlength = taglength / DCMI_MAX_BYTE_SIZE ? DCMI_MAX_BYTE_SIZE + : taglength % DCMI_MAX_BYTE_SIZE; memcpy(tmpData, data + offset, getlength); rsp = ipmi_dcmi_setmngctrlids(intf, offset, getlength, tmpData); /* because after call "Set mc id string" RMCP+ will go down * we have no "rsp" */ - if (strncmp(intf->name, "lanplus", 7)) { + if (strcmp(intf->name, "lanplus")) { if (chk_rsp(rsp)) { return -1; } @@ -1250,7 +1315,7 @@ ipmi_dcmi_prnt_setmngctrlids(struct ipmi_intf * intf, uint8_t * data) * * @intf: ipmi interface handler * @isnsr: entity ID - * @offset: offset (Entity instace start) + * @offset: offset (Entity instance start) * * returns ipmi_rs structure */ @@ -1264,7 +1329,7 @@ ipmi_dcmi_discvry_snsr(struct ipmi_intf * intf, uint8_t isnsr, uint8_t offset) msg_data[1] = 0x01; /* Senser Type = Temp (01h) */ msg_data[2] = isnsr; /* Sensor Number */ msg_data[3] = 0x00; /* Entity Instance, set to read all instances */ - msg_data[4] = offset; /* Entity instace start */ + msg_data[4] = offset; /* Entity instance start */ memset(&req, 0, sizeof(req)); req.msg.netfn = IPMI_NETFN_DCGRP; @@ -1299,9 +1364,9 @@ ipmi_dcmi_prnt_discvry_snsr(struct ipmi_intf * intf, uint8_t isnsr) } instances = rsp->data[1]; printf("\n%s: %d temperature sensor%s found:\n", - val2str2(isnsr, dcmi_discvry_snsr_vals), - instances, - (instances > 1) ? "s" : ""); + val2str2(isnsr, dcmi_discvry_snsr_vals), + instances, + (instances > 1) ? "s" : ""); while(instances > 0) { ipmi_dcmi_discvry_snsr(intf, isnsr, offset); if (chk_rsp(rsp)) { @@ -1335,11 +1400,7 @@ ipmi_dcmi_pwr_rd(struct ipmi_intf * intf, uint8_t sample_time) struct ipmi_rs * rsp; struct ipmi_rq req; struct power_reading val; - struct tm tm_t; - time_t t; uint8_t msg_data[4]; /* number of request data bytes */ - memset(&tm_t, 0, sizeof(tm_t)); - memset(&t, 0, sizeof(t)); msg_data[0] = IPMI_DCMI; /* Group Extension Identification */ if (sample_time) { @@ -1365,19 +1426,17 @@ ipmi_dcmi_pwr_rd(struct ipmi_intf * intf, uint8_t sample_time) /* rsp->data[0] is equal to response data byte 2 in spec */ /* printf("Group Extension Identification: %02x\n", rsp->data[0]); */ memcpy(&val, rsp->data, sizeof (val)); - t = val.time_stamp; - gmtime_r(&t, &tm_t); printf("\n"); printf(" Instantaneous power reading: %8d Watts\n", - val.curr_pwr); + val.curr_pwr); printf(" Minimum during sampling period: %8d Watts\n", - val.min_sample); + val.min_sample); printf(" Maximum during sampling period: %8d Watts\n", - val.max_sample); + val.max_sample); printf(" Average power reading over sample period: %8d Watts\n", - val.avg_pwr); + val.avg_pwr); printf(" IPMI timestamp: %s", - asctime(&tm_t)); + ipmi_timestamp_numeric(ipmi32toh(&val.time_stamp))); printf(" Sampling period: "); if (sample_time) printf("%s \n", val2str2(val.sample,dcmi_sampling_vals)); @@ -1428,16 +1487,16 @@ ipmi_dcmi_getthermalpolicy(struct ipmi_intf * intf, uint8_t entityID, memcpy(&val, rsp->data, sizeof (val)); printf("\n"); printf(" Persistence flag is: %s\n", - ((val.exceptionActions & 0x80) ? "set" : "notset")); + ((val.exceptionActions & 0x80) ? "set" : "notset")); printf(" Exception Actions, taken if the Temperature Limit exceeded:\n"); printf(" Hard Power Off system and log event: %s\n", - ((val.exceptionActions & 0x40) ? "active":"inactive")); + ((val.exceptionActions & 0x40) ? "active":"inactive")); printf(" Log event to SEL only: %s\n", - ((val.exceptionActions & 0x20) ? "active":"inactive")); + ((val.exceptionActions & 0x20) ? "active":"inactive")); printf(" Temperature Limit %d degrees\n", - val.tempLimit); + val.tempLimit); printf(" Exception Time %d seconds\n", - val.exceptionTime); + val.exceptionTime); printf("\n\n"); return 0; } @@ -1448,14 +1507,14 @@ ipmi_dcmi_getthermalpolicy(struct ipmi_intf * intf, uint8_t entityID, */ int ipmi_dcmi_setthermalpolicy(struct ipmi_intf * intf, - uint8_t entityID, - uint8_t entityInst, - uint8_t persistanceFlag, - uint8_t actionHardPowerOff, - uint8_t actionLogToSEL, - uint8_t tempLimit, - uint8_t samplingTimeLSB, - uint8_t samplingTimeMSB) + uint8_t entityID, + uint8_t entityInst, + uint8_t persistanceFlag, + uint8_t actionHardPowerOff, + uint8_t actionLogToSEL, + uint8_t tempLimit, + uint8_t samplingTimeLSB, + uint8_t samplingTimeMSB) { struct ipmi_rs * rsp; struct ipmi_rq req; @@ -1464,10 +1523,10 @@ ipmi_dcmi_setthermalpolicy(struct ipmi_intf * intf, msg_data[0] = IPMI_DCMI; /* Group Extension Identification */ msg_data[1] = entityID; /* Inlet Temperature DCMI ID*/ msg_data[2] = entityInst; /* Entity Instance */ - /* persistance and actions or disabled if no actions */ + /* persistence and actions or disabled if no actions */ msg_data[3] = (((persistanceFlag ? 1 : 0) << 7) | - ((actionHardPowerOff? 1 : 0) << 6) | - ((actionLogToSEL ? 1 : 0) << 5)); + ((actionHardPowerOff? 1 : 0) << 6) | + ((actionLogToSEL ? 1 : 0) << 5)); msg_data[4] = tempLimit; msg_data[5] = samplingTimeLSB; msg_data[6] = samplingTimeMSB; @@ -1486,7 +1545,7 @@ ipmi_dcmi_setthermalpolicy(struct ipmi_intf * intf, } /* rsp->data[0] is equal to response data byte 2 in spec */ printf("\nThermal policy %d for %0Xh entity successfully set.\n\n", - entityInst, entityID); + entityInst, entityID); return 0; } @@ -1498,9 +1557,9 @@ ipmi_dcmi_setthermalpolicy(struct ipmi_intf * intf, */ struct ipmi_rs * ipmi_dcmi_get_temp_readings(struct ipmi_intf * intf, - uint8_t entityID, - uint8_t entityInst, - uint8_t entityInstStart) + uint8_t entityID, + uint8_t entityInst, + uint8_t entityInstStart) { struct ipmi_rq req; uint8_t msg_data[5]; /* number of request data bytes */ @@ -1527,10 +1586,11 @@ ipmi_dcmi_prnt_get_temp_readings(struct ipmi_intf * intf) int i,j, tota_inst, get_inst, offset = 0; /* Print sensor description */ printf("\n\tEntity ID\t\t\tEntity Instance\t Temp. Readings"); - for (i = 0; dcmi_temp_read_vals[i].str != NULL; i++) { + for (i = 0; dcmi_temp_read_vals[i].str; i++) { /* get all of the information about this sensor */ rsp = ipmi_dcmi_get_temp_readings(intf, - dcmi_temp_read_vals[i].val, 0, 0); + dcmi_temp_read_vals[i].val, + 0, 0); if (chk_rsp(rsp)) { continue; } @@ -1539,10 +1599,11 @@ ipmi_dcmi_prnt_get_temp_readings(struct ipmi_intf * intf) tota_inst = rsp->data[1]; while (tota_inst > 0) { get_inst = ((tota_inst / DCMI_MAX_BYTE_TEMP_READ_SIZE) ? - DCMI_MAX_BYTE_TEMP_READ_SIZE : - (tota_inst % DCMI_MAX_BYTE_TEMP_READ_SIZE)); + DCMI_MAX_BYTE_TEMP_READ_SIZE : + (tota_inst % DCMI_MAX_BYTE_TEMP_READ_SIZE)); rsp = ipmi_dcmi_get_temp_readings(intf, - dcmi_temp_read_vals[i].val, offset, 0); + dcmi_temp_read_vals[i].val, + offset, 0); if (chk_rsp(rsp)) { continue; } @@ -1553,8 +1614,9 @@ ipmi_dcmi_prnt_get_temp_readings(struct ipmi_intf * intf) /* Print Instance temperature info */ printf("\n%s",dcmi_temp_read_vals[i].desc); printf("\t\t%i\t\t%c%i C", rsp->data[j+4], - ((rsp->data[j+3]) >> 7) ? - '-' : '+', (rsp->data[j+3] & 127)); + ((rsp->data[j+3]) >> 7) ? '-' + : '+', + (rsp->data[j+3] & 127)); } offset += get_inst; tota_inst -= get_inst; @@ -1599,8 +1661,10 @@ ipmi_dcmi_prnt_getconfparam(struct ipmi_intf * intf) int param_selector; uint16_t tmp_value = 0; /* We are not interested in parameter 1 which always will return 0 */ - for (param_selector = 2 ; param_selector <= dcmi_conf_params; - param_selector++) { + for (param_selector = 2; + param_selector <= dcmi_conf_params; + param_selector++) + { rsp = ipmi_dcmi_getconfparam(intf, param_selector); if (chk_rsp(rsp)) { return -1; @@ -1611,9 +1675,10 @@ ipmi_dcmi_prnt_getconfparam(struct ipmi_intf * intf) tmp_value = (rsp->data[4])& 1; printf("\n\tDHCP Discovery method\t: "); printf("\n\t\tManagement Controller ID String is %s", - tmp_value ? "enabled" : "disabled"); - printf("\n\t\tVendor class identifier DCMI IANA and Vendor class-specific Informationa are %s", - ((rsp->data[4])& 2) ? "enabled" : "disabled" ); + tmp_value ? "enabled" : "disabled"); + printf("\n\t\tVendor class identifier DCMI IANA and Vendor " + "class-specific Informationa are %s", + ((rsp->data[4])& 2) ? "enabled" : "disabled" ); break; case 3: printf("\n\tInitial timeout interval\t: %i seconds", @@ -1621,11 +1686,11 @@ ipmi_dcmi_prnt_getconfparam(struct ipmi_intf * intf) break; case 4: printf("\n\tServer contact timeout interval\t: %i seconds", - rsp->data[4] + (rsp->data[5]<<8)); + rsp->data[4] + (rsp->data[5]<<8)); break; case 5: printf("\n\tServer contact retry interval\t: %i seconds", - rsp->data[4] + (rsp->data[5] << 8)); + rsp->data[4] + (rsp->data[5] << 8)); break; default: printf("\n\tConfiguration Parameter not supported."); @@ -1724,7 +1789,7 @@ ipmi_dcmi_pwr_prnt_glimit(struct ipmi_intf * intf) /* rsp can be a null so check response before any operation * on it to avoid sig segv */ - if (rsp != NULL) { + if (rsp) { realCc = rsp->ccode; GOOD_PWR_GLIMIT_CCODE(rsp->ccode); } @@ -1735,10 +1800,10 @@ ipmi_dcmi_pwr_prnt_glimit(struct ipmi_intf * intf) /* printf("Group Extension Identification: %02x\n", rsp->data[0]); */ memcpy(&val, rsp->data, sizeof (val)); printf("\n Current Limit State: %s\n", - (realCc == 0) ? - "Power Limit Active" : "No Active Power Limit"); + (realCc == 0) ? + "Power Limit Active" : "No Active Power Limit"); printf(" Exception actions: %s\n", - val2str2(val.action, dcmi_pwrmgmt_get_action_vals)); + val2str2(val.action, dcmi_pwrmgmt_get_action_vals)); printf(" Power Limit: %i Watts\n", val.limit); printf(" Correction time: %i milliseconds\n", val.correction); printf(" Sampling period: %i seconds\n", val.sample); @@ -1772,7 +1837,7 @@ ipmi_dcmi_pwr_slimit(struct ipmi_intf * intf, const char * option, /* rsp can be a null so check response before any operation on it to * avoid sig segv */ - if (rsp != NULL) { + if (rsp) { GOOD_PWR_GLIMIT_CCODE(rsp->ccode); } if (chk_rsp(rsp)) { @@ -1796,8 +1861,8 @@ ipmi_dcmi_pwr_slimit(struct ipmi_intf * intf, const char * option, * val.sample = *(uint16_t*)(&rsp->data[12]); */ lprintf(LOG_INFO, - "DCMI IN Limit=%d Correction=%d Action=%d Sample=%d\n", - val.limit, val.correction, val.action, val.sample); + "DCMI IN Limit=%d Correction=%d Action=%d Sample=%d\n", + val.limit, val.correction, val.action, val.sample); switch (str2val2(option, dcmi_pwrmgmt_set_usage_vals)) { case 0x00: /* action */ @@ -1877,7 +1942,7 @@ ipmi_dcmi_pwr_slimit(struct ipmi_intf * intf, const char * option, case 0xFF: /* error - not a string we knew what to do with */ lprintf(LOG_ERR, "Given %s '%s' is invalid.", - option, value); + option, value); return -1; } break; @@ -1885,7 +1950,7 @@ ipmi_dcmi_pwr_slimit(struct ipmi_intf * intf, const char * option, /* limit */ if (str2uint(value, &lvalue) != 0) { lprintf(LOG_ERR, "Given %s '%s' is invalid.", - option, value); + option, value); return (-1); } val.limit = *(uint16_t*)(&lvalue); @@ -1894,7 +1959,7 @@ ipmi_dcmi_pwr_slimit(struct ipmi_intf * intf, const char * option, /* correction */ if (str2uint(value, &lvalue) != 0) { lprintf(LOG_ERR, "Given %s '%s' is invalid.", - option, value); + option, value); return (-1); } val.correction = *(uint32_t*)(&lvalue); @@ -1903,7 +1968,7 @@ ipmi_dcmi_pwr_slimit(struct ipmi_intf * intf, const char * option, /* sample */ if (str2uint(value, &lvalue) != 0) { lprintf(LOG_ERR, "Given %s '%s' is invalid.", - option, value); + option, value); return (-1); } val.sample = *(uint16_t*)(&lvalue); @@ -2024,7 +2089,8 @@ _ipmi_nm_discover(struct ipmi_intf * intf, struct nm_discover *disc) * @caps: fills in capability struct */ static int -_ipmi_nm_getcapabilities(struct ipmi_intf * intf, uint8_t domain, uint8_t trigger, struct nm_capability *caps) +_ipmi_nm_getcapabilities(struct ipmi_intf * intf, uint8_t domain, + uint8_t trigger, struct nm_capability *caps) { struct ipmi_rq req; /* request data to send to the BMC */ struct ipmi_rs *rsp; @@ -2049,7 +2115,8 @@ _ipmi_nm_getcapabilities(struct ipmi_intf * intf, uint8_t domain, uint8_t trigge } static int -_ipmi_nm_get_policy(struct ipmi_intf * intf, uint8_t domain, uint8_t policy_id, struct nm_get_policy *policy) +_ipmi_nm_get_policy(struct ipmi_intf * intf, uint8_t domain, + uint8_t policy_id, struct nm_get_policy *policy) { struct ipmi_rq req; /* request data to send to the BMC */ struct ipmi_rs *rsp; @@ -2083,7 +2150,9 @@ _ipmi_nm_set_policy(struct ipmi_intf * intf, struct nm_policy *policy) req.msg.cmd = IPMI_NM_SET_POLICY; req.msg.data = (uint8_t *)policy; req.msg.data_len = sizeof(struct nm_policy); - policy->intel_id[0] = 0x57; policy->intel_id[1] =1; policy->intel_id[2] =0; + policy->intel_id[0] = 0x57; + policy->intel_id[1] = 1; + policy->intel_id[2] = 0; rsp = intf->sendrecv(intf, &req); if (chk_nm_rsp(rsp)) { return -1; @@ -2117,7 +2186,8 @@ _ipmi_nm_policy_limiting(struct ipmi_intf * intf, uint8_t domain) } static int -_ipmi_nm_control(struct ipmi_intf * intf, uint8_t scope, uint8_t domain, uint8_t policy_id) +_ipmi_nm_control(struct ipmi_intf * intf, uint8_t scope, + uint8_t domain, uint8_t policy_id) { struct ipmi_rq req; /* request data to send to the BMC */ struct ipmi_rs *rsp; @@ -2151,7 +2221,8 @@ _ipmi_nm_control(struct ipmi_intf * intf, uint8_t scope, uint8_t domain, uint8_t * @selector: Parameter selector */ static int -_ipmi_nm_statistics(struct ipmi_intf * intf, uint8_t mode, uint8_t domain, uint8_t policy_id, struct nm_statistics *caps) +_ipmi_nm_statistics(struct ipmi_intf * intf, uint8_t mode, uint8_t domain, + uint8_t policy_id, struct nm_statistics *caps) { struct ipmi_rq req; /* request data to send to the BMC */ struct ipmi_rs *rsp; @@ -2177,7 +2248,8 @@ _ipmi_nm_statistics(struct ipmi_intf * intf, uint8_t mode, uint8_t domain, uint8 } static int -_ipmi_nm_reset_stats(struct ipmi_intf * intf, uint8_t mode, uint8_t domain, uint8_t policy_id) +_ipmi_nm_reset_stats(struct ipmi_intf * intf, uint8_t mode, + uint8_t domain, uint8_t policy_id) { struct ipmi_rq req; /* request data to send to the BMC */ struct ipmi_rs *rsp; @@ -2202,7 +2274,8 @@ _ipmi_nm_reset_stats(struct ipmi_intf * intf, uint8_t mode, uint8_t domain, uint } static int -_nm_set_range(struct ipmi_intf * intf, uint8_t domain, uint16_t minimum, uint16_t maximum) +_nm_set_range(struct ipmi_intf * intf, uint8_t domain, + uint16_t minimum, uint16_t maximum) { struct ipmi_rq req; /* request data to send to the BMC */ struct ipmi_rs *rsp; @@ -2284,7 +2357,8 @@ _ipmi_nm_set_alert(struct ipmi_intf * intf, struct nm_set_alert *alert) * This array is filled in for valid thresholds returned. */ static int -_ipmi_nm_get_thresh(struct ipmi_intf * intf, uint8_t domain, uint8_t policy_id, uint16_t *list) +_ipmi_nm_get_thresh(struct ipmi_intf * intf, uint8_t domain, + uint8_t policy_id, uint16_t *list) { struct ipmi_rq req; /* request data to send to the BMC */ struct ipmi_rs *rsp; @@ -2357,7 +2431,8 @@ _ipmi_nm_set_thresh(struct ipmi_intf * intf, struct nm_thresh * thresh) * */ static int -_ipmi_nm_get_suspend(struct ipmi_intf * intf, uint8_t domain, uint8_t policy_id, int *count, struct nm_period *periods) +_ipmi_nm_get_suspend(struct ipmi_intf * intf, uint8_t domain, + uint8_t policy_id, int *count, struct nm_period *periods) { struct ipmi_rq req; /* request data to send to the BMC */ struct ipmi_rs *rsp; @@ -2400,9 +2475,12 @@ _ipmi_nm_set_suspend(struct ipmi_intf * intf, struct nm_suspend *suspend) msg_data[1] = 1; msg_data[2] = 0; msg_data[3] = suspend->domain; - msg_data[4] = suspend->policy_id; + msg_data[4] = suspend->policy_id; msg_data[5] = suspend->count; - for (i = 0, periods = &suspend->period[0]; i < (suspend->count*3); i += 3, periods++) { + for (i = 0, periods = &suspend->period[0]; + i < (suspend->count*3); + i += 3, periods++) + { msg_data[6+i] = periods->start; msg_data[7+i] = periods->stop; msg_data[8+i] = periods->repeat; @@ -2412,8 +2490,8 @@ _ipmi_nm_set_suspend(struct ipmi_intf * intf, struct nm_suspend *suspend) req.msg.netfn = IPMI_NETFN_OEM; req.msg.cmd = IPMI_NM_SET_SUSPEND; req.msg.data = msg_data; - rsp = intf->sendrecv(intf, &req); - if (chk_nm_rsp(rsp)) { + rsp = intf->sendrecv(intf, &req); + if (chk_nm_rsp(rsp)) { return -1; } return 0; @@ -2427,9 +2505,9 @@ ipmi_nm_getcapabilities(struct ipmi_intf * intf, int argc, char **argv) uint8_t trigger = 0; /* default power policy (no trigger) */ struct nm_capability caps; - while (--argc > 0) { + while (--argc > 0) { argv++; - if (argv[0] == NULL) break; + if (!argv[0]) break; if ((option = str2val2(argv[0], nm_capability_opts)) == 0xFF) { print_strs(nm_capability_opts, "Capability commands", LOG_ERR, 0); return -1; @@ -2465,35 +2543,35 @@ ipmi_nm_getcapabilities(struct ipmi_intf * intf, int argc, char **argv) return -1; if (csv_output) { printf("%d,%u,%u,%u,%u,%u,%u,%s\n", - caps.max_settings, caps.max_value,caps.min_value, - caps.min_corr/1000, caps.max_corr/1000, - caps.min_stats, caps.max_stats, - val2str2(caps.scope&0xF, nm_domain_vals)); + caps.max_settings, caps.max_value,caps.min_value, + caps.min_corr/1000, caps.max_corr/1000, + caps.min_stats, caps.max_stats, + val2str2(caps.scope&0xF, nm_domain_vals)); return 0; } printf(" power policies:\t\t%d\n", caps.max_settings); switch (trigger&0xF) { case 0: /* power */ printf(" max_power\t\t%7u Watts\n min_power\t\t%7u Watts\n", - caps.max_value, caps.min_value); + caps.max_value, caps.min_value); break; case 1: /* Inlet */ printf(" max_temp\t\t%7u C\n min_temp\t\t%7u C\n", - caps.max_value, caps.min_value); + caps.max_value, caps.min_value); break; case 2: /* Missing reading time */ case 3: /* Time after host reset */ printf(" max_time\t\t%7u Secs\n min_time\t\t%7u Secs\n", - caps.max_value/10, caps.min_value/10); + caps.max_value/10, caps.min_value/10); break; case 4: /* boot time policy does not use these values */ default: break; } printf(" min_corr\t\t%7u secs\n max_corr\t\t%7u secs\n", - caps.min_corr/1000, caps.max_corr/1000); + caps.min_corr/1000, caps.max_corr/1000); printf(" min_stats\t\t%7u secs\n max_stats\t\t%7u secs\n", - caps.min_stats, caps.max_stats); + caps.min_stats, caps.max_stats); printf(" domain scope:\t%s\n", val2str2(caps.scope&0xF, nm_domain_vals)); return 0; } @@ -2504,13 +2582,14 @@ ipmi_nm_get_policy(struct ipmi_intf * intf, int argc, char **argv) uint8_t option; uint8_t domain = 0; /* default domain of platform */ uint8_t policy_id = -1; + uint8_t have_policy_id = FALSE; struct nm_get_policy policy; memset(&policy, 0, sizeof(policy)); while (--argc) { argv++; - if (argv[0] == NULL) break; + if (!argv[0]) break; if ((option = str2val2(argv[0], nm_policy_options)) == 0xFF) { print_strs(nm_policy_options, "Get Policy commands", LOG_ERR, 0); return -1; @@ -2525,9 +2604,10 @@ ipmi_nm_get_policy(struct ipmi_intf * intf, int argc, char **argv) break; case 0x0B: /* policy id */ if (str2uchar(argv[1], &policy_id) < 0) { - lprintf(LOG_ERR," Policy ID must be a positive integer 0-7.\n"); + lprintf(LOG_ERR," Policy ID must be a positive integer (0-255)\n"); return -1; } + have_policy_id = TRUE; break; default: printf(" Unknown command 0x%x, skipping.\n", option); @@ -2536,53 +2616,54 @@ ipmi_nm_get_policy(struct ipmi_intf * intf, int argc, char **argv) argc--; argv++; } - if (policy_id == 0xFF) { + if (!have_policy_id) { print_strs(nm_stats_opts, "Missing policy_id parameter:", LOG_ERR, 0); - return -1; - } + return -1; + } if (_ipmi_nm_get_policy(intf, policy.domain, policy_id, &policy)) return -1; if (csv_output) { printf("%s,0x%x,%s,%s,%s,%u,%u,%u,%u,%s\n", - val2str2(policy.domain&0xF, nm_domain_vals), - policy.domain, - (policy.policy_type & 0x10) ? "power" : "nopower ", - val2str2(policy.policy_type & 0xF, nm_policy_type_vals), - val2str2(policy.policy_exception, nm_exception), - policy.policy_limits, - policy.corr_time, - policy.trigger_limit, - policy.stats_period, - policy.policy_type & 0x80 ? "volatile" : "non-volatile"); + val2str2(policy.domain&0xF, nm_domain_vals), + policy.domain, + (policy.policy_type & 0x10) ? "power" : "nopower ", + val2str2(policy.policy_type & 0xF, nm_policy_type_vals), + val2str2(policy.policy_exception, nm_exception), + policy.policy_limits, + policy.corr_time, + policy.trigger_limit, + policy.stats_period, + policy.policy_type & 0x80 ? "volatile" : "non-volatile"); return 0; } printf(" Power domain: %s\n", - val2str2(policy.domain&0xF, nm_domain_vals)); + val2str2(policy.domain&0xF, nm_domain_vals)); printf(" Policy is %s %s%s%s\n", - policy.domain&0x10 ? "enabled" : "not enabled", - policy.domain&0x20 ? "per Domain " : "", - policy.domain&0x40 ? "Globally " : "", - policy.domain&0x80 ? "via DCMI api " : ""); - printf(" Policy is %sa power control type.\n", (policy.policy_type & 0x10) ? "" : "not "); + policy.domain&0x10 ? "enabled" : "not enabled", + policy.domain&0x20 ? "per Domain " : "", + policy.domain&0x40 ? "Globally " : "", + policy.domain&0x80 ? "via DCMI api " : ""); + printf(" Policy is %sa power control type.\n", + (policy.policy_type & 0x10) ? "" : "not "); printf(" Policy Trigger Type: %s\n", - val2str2(policy.policy_type & 0xF, nm_policy_type_vals)); + val2str2(policy.policy_type & 0xF, nm_policy_type_vals)); printf(" Correction Aggressiveness: %s\n", - val2str2((policy.policy_type>> 5) & 0x3, nm_correction_vals)); + val2str2((policy.policy_type>> 5) & 0x3, nm_correction_vals)); printf(" Policy Exception Actions: %s\n", - val2str2(policy.policy_exception, nm_exception)); + val2str2(policy.policy_exception, nm_exception)); printf(" Power Limit: %u Watts\n", - policy.policy_limits); + policy.policy_limits); printf(" Correction Time Limit: %u milliseconds\n", - policy.corr_time); + policy.corr_time); printf(" Trigger Limit: %u units\n", - policy.trigger_limit); + policy.trigger_limit); printf(" Statistics Reporting Period: %u seconds\n", - policy.stats_period); + policy.stats_period); printf(" Policy retention: %s\n", - policy.policy_type & 0x80 ? "volatile" : "non-volatile"); + policy.policy_type & 0x80 ? "volatile" : "non-volatile"); if ( (policy_id == 0) && ((policy.domain & 0xf) == 0x3) ) printf(" HW Prot Power domain: %s\n", - policy.policy_type & 0x80 ? "Secondary" : "Primary"); + policy.policy_type & 0x80 ? "Secondary" : "Primary"); return 0; } @@ -2594,6 +2675,7 @@ ipmi_nm_policy(struct ipmi_intf * intf, int argc, char **argv) uint8_t correction; uint8_t domain = 0; /* default domain of platform */ uint8_t policy_id = -1; + uint8_t have_policy_id = FALSE; uint16_t power, period, inlet; uint16_t cores; uint32_t limit; @@ -2601,8 +2683,9 @@ ipmi_nm_policy(struct ipmi_intf * intf, int argc, char **argv) argv++; argc--; - if ((argv[0] == NULL) || - ((action = str2val2(argv[0], nm_policy_action)) == 0xFF)) { + if (!argv[0] || + 0xFF == (action = str2val2(argv[0], nm_policy_action))) + { print_strs(nm_policy_action, "Policy commands", LOG_ERR, 0); return -1; } @@ -2610,13 +2693,15 @@ ipmi_nm_policy(struct ipmi_intf * intf, int argc, char **argv) return (ipmi_nm_get_policy(intf, argc, argv)); memset(&policy, 0, sizeof(policy)); /* - * nm policy add [domain <param>] enable|disable policy_id <param> correction <opt> power <watts> limit <param> period <param> + * nm policy add [domain <param>] enable|disable policy_id <param> + * correction <opt> power <watts> limit <param> + * period <param> * nm policy remove [domain <param>] policy_id <param> * nm policy limiting {domain <param>] */ while (--argc > 0) { argv++; - if (argv[0] == NULL) break; + if (!argv[0]) break; if ((option = str2val2(argv[0], nm_policy_options)) == 0xFF) { print_strs(nm_policy_options, "Policy options", LOG_ERR, 0); return -1; @@ -2676,10 +2761,11 @@ ipmi_nm_policy(struct ipmi_intf * intf, int argc, char **argv) break; case 0x0B: /* policy ID */ if (str2uchar(argv[1], &policy_id) < 0) { - printf("Policy ID must be a positive integer 0-7.\n"); + printf("Policy ID must be a positive integer (0-255)\n"); return -1; } policy.policy_id = policy_id; + have_policy_id = TRUE; break; case 0x0C: /* volatile */ policy.policy_type |= 0x80; @@ -2709,7 +2795,7 @@ ipmi_nm_policy(struct ipmi_intf * intf, int argc, char **argv) printf("limit %x\n", limit); return 0; } - if (policy_id == 0xFF) { + if (!have_policy_id) { print_strs(nm_stats_opts, "Missing policy_id parameter:", LOG_ERR, 0); return -1; } @@ -2728,12 +2814,14 @@ ipmi_nm_control(struct ipmi_intf * intf, int argc, char **argv) uint8_t scope = 0; /* default control scope of global */ uint8_t domain = 0; /* default domain of platform */ uint8_t policy_id = -1; + uint8_t have_policy_id = FALSE; argv++; argc--; /* nm_ctl_cmds returns 0 for disable, 1 for enable */ - if ((argv[0] == NULL) || - ((action = str2val2(argv[0], nm_ctl_cmds)) == 0xFF)) { + if (!argv[0] || + 0xFF == (action = str2val2(argv[0], nm_ctl_cmds))) + { print_strs(nm_ctl_cmds, "Control parameters:", LOG_ERR, 0); print_strs(nm_ctl_domain, "control Scope (required):", LOG_ERR, 0); return -1; @@ -2741,30 +2829,31 @@ ipmi_nm_control(struct ipmi_intf * intf, int argc, char **argv) argv++; while (--argc) { /* nm_ctl_domain returns correct bit field except for action */ - if ((argv[0] == NULL) || - ((scope = str2val2(argv[0], nm_ctl_domain)) == 0xFF)) { + if (!argv[0] || + 0xFF == (scope = str2val2(argv[0], nm_ctl_domain))) + { print_strs(nm_ctl_domain, "Control Scope (required):", LOG_ERR, 0); return -1; } argv++; - if (argv[0] == NULL) break; + if (!argv[0]) break; if (scope == 0x02) { /* domain */ if ((domain = str2val2(argv[0], nm_domain_vals)) == 0xFF) { print_strs(nm_domain_vals, "Domain Scope:", LOG_ERR, 0); return -1; } } else if (scope == 0x04) { /* per_policy */ - if (str2uchar(argv[0], &policy_id) < 0) { - lprintf(LOG_ERR,"Policy ID must be a positive integer.\n"); + lprintf(LOG_ERR,"Policy ID must be a positive integer (0-255)\n"); return -1; } + have_policy_id = TRUE; break; } argc--; argv++; } - if ((scope == 0x04) && (policy_id == 0xFF)) { + if ((scope == 0x04) && !have_policy_id) { print_strs(nm_stats_opts, "Missing policy_id parameter:", LOG_ERR, 0); return -1; } @@ -2780,25 +2869,23 @@ ipmi_nm_get_statistics(struct ipmi_intf * intf, int argc, char **argv) uint8_t option; uint8_t domain = 0; /* default domain of platform */ uint8_t policy_id = -1; + uint8_t have_policy_id = FALSE; int policy_mode = 0; - int cut; char *units = ""; - char datebuf[27]; struct nm_statistics stats; - struct tm tm_t; - time_t t; argv++; - if ((argv[0] == NULL) || - ((mode = str2val2(argv[0], nm_stats_mode)) == 0xFF)) { + if (!argv[0] || + 0xFF == (mode = str2val2(argv[0], nm_stats_mode))) + { print_strs(nm_stats_mode, "Statistics commands", LOG_ERR, 0); return -1; } while (--argc) { argv++; - if (argv[0] == NULL) break; + if (!argv[0]) break; if ((option = str2val2(argv[0], nm_stats_opts)) == 0xFF) { - print_strs(nm_stats_opts, "Control Scope options", LOG_ERR, 0); + print_strs(nm_stats_opts, "Control Scope options", LOG_ERR, 0); return -1; } switch (option) { @@ -2810,9 +2897,10 @@ ipmi_nm_get_statistics(struct ipmi_intf * intf, int argc, char **argv) break; case 0x02: /* policy ID */ if (str2uchar(argv[1], &policy_id) < 0) { - lprintf(LOG_ERR,"Policy ID must be a positive integer.\n"); + lprintf(LOG_ERR,"Policy ID must be a positive integer (0-255)\n"); return -1; } + have_policy_id = TRUE; break; default: break; @@ -2836,7 +2924,7 @@ ipmi_nm_get_statistics(struct ipmi_intf * intf, int argc, char **argv) case 0x13: policy_mode = 1; units = (mode == 0x11) ? "Watts" : (mode == 0x12) ? "Celsius" : " %"; - if (policy_id == 0xFF) { + if (!have_policy_id) { print_strs(nm_stats_opts, "Missing policy_id parameter:", LOG_ERR, 0); return -1; } @@ -2846,47 +2934,53 @@ ipmi_nm_get_statistics(struct ipmi_intf * intf, int argc, char **argv) } if (_ipmi_nm_statistics(intf, mode, domain, policy_id, &stats)) return -1; - t = stats.time_stamp; - gmtime_r(&t, &tm_t); - sprintf(datebuf, "%s", asctime(&tm_t)); - cut = strlen(datebuf) -1; - datebuf[cut] = 0; if (csv_output) { printf("%s,%s,%s,%s,%s,%d,%d,%d,%d,%s,%d\n", - val2str2(stats.id_state & 0xF, nm_domain_vals), - ((stats.id_state >> 4) & 1) ? (policy_mode ? "Policy Enabled" : "Globally Enabled") : "Disabled" , - ((stats.id_state >> 5) & 1) ? "active" : "suspended", - ((stats.id_state >> 6) & 1) ? "in progress" : "suspended", - ((stats.id_state >> 7) & 1) ? "triggered" : "not triggered", - stats.curr_value, - stats.min_value, - stats.max_value, - stats.ave_value, - datebuf, - stats.stat_period); + val2str2(stats.id_state & 0xF, nm_domain_vals), + ((stats.id_state >> 4) & 1) ? (policy_mode ? "Policy Enabled" + : "Globally Enabled") + : "Disabled" , + ((stats.id_state >> 5) & 1) ? "active" + : "suspended", + ((stats.id_state >> 6) & 1) ? "in progress" + : "suspended", + ((stats.id_state >> 7) & 1) ? "triggered" + : "not triggered", + stats.curr_value, + stats.min_value, + stats.max_value, + stats.ave_value, + ipmi_timestamp_numeric(ipmi32toh(&stats.time_stamp)), + stats.stat_period); return 0; } printf(" Power domain: %s\n", - val2str2(stats.id_state & 0xF, nm_domain_vals)); + val2str2(stats.id_state & 0xF, nm_domain_vals)); printf(" Policy/Global Admin state %s\n", - ((stats.id_state >> 4) & 1) ? (policy_mode ? "Policy Enabled" : "Globally Enabled") : "Disabled" ); + ((stats.id_state >> 4) & 1) ? (policy_mode ? "Policy Enabled" + : "Globally Enabled") + : "Disabled" ); printf(" Policy/Global Operational state %s\n", - ((stats.id_state >> 5) & 1) ? "active" : "suspended"); + ((stats.id_state >> 5) & 1) ? "active" + : "suspended"); printf(" Policy/Global Measurement state %s\n", - ((stats.id_state >> 6) & 1) ? "in progress" : "suspended"); + ((stats.id_state >> 6) & 1) ? "in progress" + : "suspended"); printf(" Policy Activation state %s\n", - ((stats.id_state >> 7) & 1) ? "triggered" : "not triggered"); + ((stats.id_state >> 7) & 1) ? "triggered" + : "not triggered"); printf(" Instantaneous reading: %8d %s\n", - stats.curr_value, units); + stats.curr_value, units); printf(" Minimum during sampling period: %8d %s\n", - stats.min_value, units); + stats.min_value, units); printf(" Maximum during sampling period: %8d %s\n", - stats.max_value, units); + stats.max_value, units); printf(" Average reading over sample period: %8d %s\n", - stats.ave_value, units); + stats.ave_value, units); printf(" IPMI timestamp: %s\n", - datebuf); - printf(" Sampling period: %08d Seconds.\n", stats.stat_period); + ipmi_timestamp_numeric(ipmi32toh(&stats.time_stamp))); + printf(" Sampling period: %08d Seconds.\n", + stats.stat_period); printf("\n"); return 0; } @@ -2898,16 +2992,18 @@ ipmi_nm_reset_statistics(struct ipmi_intf * intf, int argc, char **argv) uint8_t option; uint8_t domain = 0; /* default domain of platform */ uint8_t policy_id = -1; + uint8_t have_policy_id = FALSE; argv++; - if ((argv[0] == NULL) || - ((mode = str2val2(argv[0], nm_reset_mode)) == 0xFF)) { + if (!argv[0] || + 0xFF == (mode = str2val2(argv[0], nm_reset_mode))) + { print_strs(nm_reset_mode, "Reset Statistics Modes:", LOG_ERR, 0); return -1; } while (--argc) { argv++; - if (argv[0] == NULL) break; + if (!argv[0]) break; if ((option = str2val2(argv[0], nm_stats_opts)) == 0xFF) { print_strs(nm_stats_opts, "Reset Scope options", LOG_ERR, 0); return -1; @@ -2921,9 +3017,10 @@ ipmi_nm_reset_statistics(struct ipmi_intf * intf, int argc, char **argv) break; case 0x02: /* policy ID */ if (str2uchar(argv[1], &policy_id) < 0) { - lprintf(LOG_ERR,"Policy ID must be a positive integer.\n"); + lprintf(LOG_ERR,"Policy ID must be a positive integer (0-255)\n"); return -1; } + have_policy_id = TRUE; break; default: break; @@ -2931,7 +3028,7 @@ ipmi_nm_reset_statistics(struct ipmi_intf * intf, int argc, char **argv) argc--; argv++; } - if (mode && (policy_id == 0xFF)) { + if (mode && !have_policy_id) { print_strs(nm_stats_opts, "Missing policy_id parameter:", LOG_ERR, 0); return -1; } @@ -2950,7 +3047,7 @@ ipmi_nm_set_range(struct ipmi_intf * intf, int argc, char **argv) while (--argc) { argv++; - if (argv[0] == NULL) break; + if (!argv[0]) break; if ((param = str2val2(argv[0], nm_power_range)) == 0xFF) { print_strs(nm_power_range, "power range parameters:", LOG_ERR, 0); return -1; @@ -2981,7 +3078,8 @@ ipmi_nm_set_range(struct ipmi_intf * intf, int argc, char **argv) argv++; } if ((minimum == 0xFFFF) || (maximum == 0xFFFF)) { - lprintf(LOG_ERR,"Missing parameters: nm power range min <minimum> max <maximum>.\n"); + lprintf(LOG_ERR,"Missing parameters: nm power range min <minimum> " + "max <maximum>.\n"); return -1; } if (_nm_set_range(intf, domain, minimum, maximum) < 0) @@ -2999,23 +3097,25 @@ ipmi_nm_get_alert(struct ipmi_intf * intf) return -1; if (csv_output) { printf("%d,%s,0x%x,%s,0x%x\n", - alert.chan&0xF, - (alert.chan >> 7) ? "not registered" : "registered", - alert.dest, - (alert.string >> 7) ? "yes" : "no", - alert.string & 0x7F); + alert.chan & 0xF, + (alert.chan >> 7) ? "not registered" + : "registered", + alert.dest, + (alert.string >> 7) ? "yes" + : "no", + alert.string & 0x7F); return 0; } printf(" Alert Chan: %d\n", - alert.chan&0xF); + alert.chan & 0xF); printf(" Alert Receiver: %s\n", - (alert.chan >> 7) ? "not registered" : "registered"); + (alert.chan >> 7) ? "not registered" : "registered"); printf(" Alert Lan Destination: 0x%x\n", - alert.dest); + alert.dest); printf(" Use Alert String: %s\n", - (alert.string >> 7) ? "yes" : "no"); + (alert.string >> 7) ? "yes" : "no"); printf(" Alert String Selector: 0x%x\n", - alert.string & 0x7F); + alert.string & 0x7F); return 0; } @@ -3031,8 +3131,9 @@ ipmi_nm_alert(struct ipmi_intf * intf, int argc, char **argv) argv++; argc--; - if ((argv[0] == NULL) || - ((action = str2val2(argv[0], nm_alert_opts)) == 0xFF)) { + if (!argv[0] || + 0xFF == (action = str2val2(argv[0], nm_alert_opts))) + { print_strs(nm_alert_opts, "Alert commands", LOG_ERR, 0); return -1; } @@ -3042,19 +3143,19 @@ ipmi_nm_alert(struct ipmi_intf * intf, int argc, char **argv) memset(&alert, 0, sizeof(alert)); while (--argc) { argv++; - if (argv[0] == NULL) break; + if (!argv[0]) break; if ((param = str2val2(argv[0], nm_set_alert_param)) == 0xFF) { print_strs(nm_set_alert_param, "Set alert Parameters:", LOG_ERR, 0); return -1; } switch (param) { - case 0x01: /* channnel */ + case 0x01: /* channel */ if (str2uchar(argv[1], &chan) < 0) { lprintf(LOG_ERR,"Alert Lan chan must be a positive integer.\n"); return -1; } if (action == 0x03) /* Clear */ - chan |= 0x80; /* deactivate alert reciever */ + chan |= 0x80; /* deactivate alert receiver */ break; case 0x02: /* dest */ if (str2uchar(argv[1], &dest) < 0) { @@ -3096,15 +3197,15 @@ ipmi_nm_get_thresh(struct ipmi_intf *intf, uint8_t domain, uint8_t policy_id) return -1; printf(" Alert Threshold domain: %s\n", - val2str2(domain, nm_domain_vals)); + val2str2(domain, nm_domain_vals)); printf(" Alert Threshold Policy ID: %d\n", - policy_id); + policy_id); printf(" Alert Threshold 1: %d\n", - list[0]); + list[0]); printf(" Alert Threshold 2: %d\n", - list[1]); + list[1]); printf(" Alert Threshold 3: %d\n", - list[2]); + list[2]); return 0; } @@ -3115,21 +3216,23 @@ ipmi_nm_thresh(struct ipmi_intf * intf, int argc, char **argv) uint8_t action; uint8_t domain = 0; /* default domain of platform */ uint8_t policy_id = -1; + uint8_t have_policy_id = FALSE; struct nm_thresh thresh; int i = 0; argv++; argc--; /* set or get */ - if ((argv[0] == NULL) || (argc < 3) || - ((action = str2val2(argv[0], nm_thresh_cmds)) == 0xFF)) { - print_strs(nm_thresh_cmds, "Theshold commands", LOG_ERR, 0); + if (!argv[0] || argc < 3 + || 0xFF == (action = str2val2(argv[0], nm_thresh_cmds))) + { + print_strs(nm_thresh_cmds, "Threshold commands", LOG_ERR, 0); return -1; } memset(&thresh, 0, sizeof(thresh)); while (--argc) { argv++; - if (argv[0] == NULL) break; + if (!argv[0]) break; option = str2val2(argv[0], nm_thresh_param); switch (option) { case 0x01: /* get domain scope */ @@ -3142,9 +3245,10 @@ ipmi_nm_thresh(struct ipmi_intf * intf, int argc, char **argv) break; case 0x02: /* policy ID */ if (str2uchar(argv[1], &policy_id) < 0) { - lprintf(LOG_ERR,"Policy ID must be a positive integer.\n"); + lprintf(LOG_ERR,"Policy ID must be a positive integer (0-255)\n"); return -1; } + have_policy_id = TRUE; argc--; argv++; break; @@ -3161,7 +3265,7 @@ ipmi_nm_thresh(struct ipmi_intf * intf, int argc, char **argv) break; } } - if (policy_id == 0xFF) { + if (!have_policy_id) { print_strs(nm_stats_opts, "Missing policy_id parameter:", LOG_ERR, 0); return -1; } @@ -3213,9 +3317,10 @@ ipmi_nm_get_suspend(struct ipmi_intf *intf, uint8_t domain, uint8_t policy_id) } for (i = 0; i < count; i++) { printf(" Suspend Period %d: %02d:%02d to %02d:%02d", - i, click2hour(periods[i].start), click2min(periods[i].start), - click2hour(periods[i].stop), click2min(periods[i].stop)); - if (periods[i].repeat) printf(", "); + i, click2hour(periods[i].start), click2min(periods[i].start), + click2hour(periods[i].stop), click2min(periods[i].stop)); + if (periods[i].repeat) + printf(", "); for (j = 0; j < 7; j++) printf("%s", (periods[i].repeat >> j)&1 ? days[j] : ""); printf("\n"); @@ -3230,6 +3335,7 @@ ipmi_nm_suspend(struct ipmi_intf * intf, int argc, char **argv) uint8_t action; uint8_t domain = 0; /* default domain of platform */ uint8_t policy_id = -1; + uint8_t have_policy_id = FALSE; uint8_t count = 0; struct nm_suspend suspend; int i; @@ -3237,15 +3343,16 @@ ipmi_nm_suspend(struct ipmi_intf * intf, int argc, char **argv) argv++; argc--; /* set or get */ - if ((argv[0] == NULL) || (argc < 3) || - ((action = str2val2(argv[0], nm_suspend_cmds)) == 0xFF)) { + if (!argv[0] || argc < 3 || + 0xFF == (action = str2val2(argv[0], nm_suspend_cmds))) + { print_strs(nm_suspend_cmds, "Suspend commands", LOG_ERR, 0); return -1; } memset(&suspend, 0, sizeof(suspend)); while (--argc > 0) { argv++; - if (argv[0] == NULL) break; + if (!argv[0]) break; option = str2val2(argv[0], nm_thresh_param); switch (option) { case 0x01: /* get domain scope */ @@ -3258,13 +3365,14 @@ ipmi_nm_suspend(struct ipmi_intf * intf, int argc, char **argv) break; case 0x02: /* policy ID */ if (str2uchar(argv[1], &policy_id) < 0) { - lprintf(LOG_ERR,"Policy ID must be a positive integer.\n"); + lprintf(LOG_ERR,"Policy ID must be a positive integer (0-255)\n"); return -1; } + have_policy_id = TRUE; argc--; argv++; break; - case 0xFF: /* process periods */ + case 0xFF: /* process periods */ for (i = 0; count < IPMI_NM_SUSPEND_PERIOD_MAX; i += 3, count++) { if (argc < 3) { lprintf(LOG_ERR,"Error: suspend period requires a start, stop, and repeat values.\n"); @@ -3289,10 +3397,16 @@ ipmi_nm_suspend(struct ipmi_intf * intf, int argc, char **argv) if (argc <= 0) break; break; - default: - break; - } - } + default: + break; + } + } + + if (!have_policy_id) { + print_strs(nm_stats_opts, "Missing policy_id parameter:", LOG_ERR, 0); + return -1; + } + if (action == 0x02) /* get */ return (ipmi_nm_get_suspend(intf, domain, policy_id)); @@ -3349,7 +3463,7 @@ ipmi_dcmi_set_limit(struct ipmi_intf * intf, int argc, char **argv) case 0xFF: /* error - not a string we knew what to do with */ lprintf(LOG_ERR, "Given Action '%s' is invalid.", - argv[2]); + argv[2]); return -1; } /* limit */ @@ -3364,8 +3478,8 @@ ipmi_dcmi_set_limit(struct ipmi_intf * intf, int argc, char **argv) /* correction */ if (str2uint(argv[6], &correction) != 0) { lprintf(LOG_ERR, - "Given Correction '%s' is invalid.", - argv[6]); + "Given Correction '%s' is invalid.", + argv[6]); return (-1); } data[7] = correction >> 0; @@ -3377,8 +3491,8 @@ ipmi_dcmi_set_limit(struct ipmi_intf * intf, int argc, char **argv) /* sample */ if (str2ushort(argv[8], &sample) != 0) { lprintf(LOG_ERR, - "Given Sample '%s' is invalid.", - argv[8]); + "Given Sample '%s' is invalid.", + argv[8]); return (-1); } data[13] = sample >> 0; @@ -3390,12 +3504,12 @@ ipmi_dcmi_set_limit(struct ipmi_intf * intf, int argc, char **argv) } } else { /* loop through each parameter and value until we have neither */ - while ((argv[1] != NULL) && (argv[2] != NULL)) { + while (argv[1] && argv[2]) { rc = ipmi_dcmi_pwr_slimit(intf, argv[1], argv[2]); /* catch any error that the set limit function returned */ if (rc > 0) { print_strs(dcmi_pwrmgmt_set_usage_vals, - "set_limit <parameter> <value>", LOG_ERR, 0); + "set_limit <parameter> <value>", LOG_ERR, 0); return -1; } /* the first argument is the command and the second is the @@ -3416,11 +3530,11 @@ ipmi_dcmi_parse_power(struct ipmi_intf * intf, int argc, char **argv) switch (str2val2(argv[0], dcmi_pwrmgmt_vals)) { case 0x00: /* get reading */ - if (argv[1] != NULL) { + if (argv[1]) { if (!(sample_time = str2val2(argv[1], dcmi_sampling_vals))) { print_strs(dcmi_sampling_vals, - "Invalid sample time. Valid times are: ", - LOG_ERR, 1); + "Invalid sample time. Valid times are: ", + LOG_ERR, 1); printf("\n"); return -1; } @@ -3439,8 +3553,8 @@ ipmi_dcmi_parse_power(struct ipmi_intf * intf, int argc, char **argv) /* set limit */ if (argc < 4) { print_strs(dcmi_pwrmgmt_set_usage_vals, - "set_limit <parameter> <value>", - LOG_ERR, 0); + "set_limit <parameter> <value>", + LOG_ERR, 0); return -1; } if (ipmi_dcmi_set_limit(intf, argc, argv) < 0) @@ -3458,7 +3572,7 @@ ipmi_dcmi_parse_power(struct ipmi_intf * intf, int argc, char **argv) default: /* no valid options */ print_strs(dcmi_pwrmgmt_vals, - "power <command>", LOG_ERR, 0); + "power <command>", LOG_ERR, 0); break; } return rc; @@ -3488,14 +3602,14 @@ ipmi_dcmi_thermalpolicy(struct ipmi_intf * intf, int argc, char **argv) } if (str2uchar(argv[2], &entityID) != 0) { lprintf(LOG_ERR, - "Given Entity ID '%s' is invalid.", - argv[2]); + "Given Entity ID '%s' is invalid.", + argv[2]); return (-1); } if (str2uchar(argv[3], &entityInst) != 0) { lprintf(LOG_ERR, - "Given Instance ID '%s' is invalid.", - argv[3]); + "Given Instance ID '%s' is invalid.", + argv[3]); return (-1); } rc = ipmi_dcmi_getthermalpolicy(intf, entityID, entityInst); @@ -3505,24 +3619,24 @@ ipmi_dcmi_thermalpolicy(struct ipmi_intf * intf, int argc, char **argv) lprintf(LOG_NOTICE, "Set <entityID> <instanceID>"); return -1; } else if (argc < 9) { - print_strs(dcmi_thermalpolicy_set_parameters_vals, - "Set thermalpolicy instance parameters: " - "<volatile/nonvolatile/disabled> " - "<poweroff/nopoweroff/disabled> " - "<sel/nosel/disabled> <templimitByte> <exceptionTime>", - LOG_ERR, 0); + print_strs(dcmi_thermalpolicy_set_parameters_vals, + "Set thermalpolicy instance parameters: " + "<volatile/nonvolatile/disabled> " + "<poweroff/nopoweroff/disabled> " + "<sel/nosel/disabled> <templimitByte> <exceptionTime>", + LOG_ERR, 0); return -1; } if (str2uchar(argv[2], &entityID) != 0) { lprintf(LOG_ERR, - "Given Entity ID '%s' is invalid.", - argv[2]); + "Given Entity ID '%s' is invalid.", + argv[2]); return (-1); } if (str2uchar(argv[3], &entityInst) != 0) { lprintf(LOG_ERR, - "Given Instance ID '%s' is invalid.", - argv[3]); + "Given Instance ID '%s' is invalid.", + argv[3]); return (-1); } persistanceFlag = (uint8_t) str2val2(argv[4], dcmi_thermalpolicy_set_parameters_vals); @@ -3530,14 +3644,14 @@ ipmi_dcmi_thermalpolicy(struct ipmi_intf * intf, int argc, char **argv) actionLogToSEL = (uint8_t) str2val2(argv[6], dcmi_thermalpolicy_set_parameters_vals); if (str2uchar(argv[7], &tempLimit) != 0) { lprintf(LOG_ERR, - "Given Temp Limit '%s' is invalid.", - argv[7]); + "Given Temp Limit '%s' is invalid.", + argv[7]); return (-1); } if (str2ushort(argv[8], &samplingTime) != 0) { lprintf(LOG_ERR, - "Given Sampling Time '%s' is invalid.", - argv[8]); + "Given Sampling Time '%s' is invalid.", + argv[8]); return (-1); } samplingTimeLSB = (samplingTime & 0xFF); @@ -3556,8 +3670,8 @@ ipmi_dcmi_thermalpolicy(struct ipmi_intf * intf, int argc, char **argv) break; default: print_strs(dcmi_thermalpolicy_vals, - "thermalpolicy <command>", - LOG_ERR, 0); + "thermalpolicy <command>", + LOG_ERR, 0); return -1; } return rc; @@ -3576,20 +3690,20 @@ ipmi_dcmi_main(struct ipmi_intf * intf, int argc, char **argv) int i; struct ipmi_rs *rsp; - if ((argc == 0) || (strncmp(argv[0], "help", 4) == 0)) { + if (!argc || !strcmp(argv[0], "help")) { print_strs(dcmi_cmd_vals, - "Data Center Management Interface commands", - LOG_ERR, 0); + "Data Center Management Interface commands", + LOG_ERR, 0); return -1; } /* start the cmd requested */ switch (str2val2(argv[0], dcmi_cmd_vals)) { case 0x00: /* discover capabilities*/ - for (i = 1; dcmi_capable_vals[i-1].str != NULL; i++) { + for (i = 1; dcmi_capable_vals[i-1].str; i++) { if (ipmi_dcmi_prnt_getcapabilities(intf, i) < 0) { lprintf(LOG_ERR,"Error discovering %s capabilities!\n", - val2str2(i, dcmi_capable_vals)); + val2str2(i, dcmi_capable_vals)); return -1; } } @@ -3597,9 +3711,9 @@ ipmi_dcmi_main(struct ipmi_intf * intf, int argc, char **argv) case 0x01: /* power */ argv++; - if (argv[0] == NULL) { + if (!argv[0]) { print_strs(dcmi_pwrmgmt_vals, "power <command>", - LOG_ERR, 0); + LOG_ERR, 0); return -1; } rc = ipmi_dcmi_parse_power(intf, argc, argv); @@ -3611,10 +3725,10 @@ ipmi_dcmi_main(struct ipmi_intf * intf, int argc, char **argv) * and if it exists, print the sdr record id(s) for it. * Use the val from each one as the sensor number. */ - for (i = 0; dcmi_discvry_snsr_vals[i].str != NULL; i++) { + for (i = 0; dcmi_discvry_snsr_vals[i].str; i++) { /* get all of the information about this sensor */ rc = ipmi_dcmi_prnt_discvry_snsr(intf, - dcmi_discvry_snsr_vals[i].val); + dcmi_discvry_snsr_vals[i].val); } break; /* end sensor print */ @@ -3631,8 +3745,8 @@ ipmi_dcmi_main(struct ipmi_intf * intf, int argc, char **argv) /* set asset tag */ if (argc == 1 ) { print_strs(dcmi_cmd_vals, - "Data Center Management Interface commands", - LOG_ERR, 0); + "Data Center Management Interface commands", + LOG_ERR, 0); return -1; } if (ipmi_dcmi_prnt_setassettag(intf, (uint8_t *)argv[1]) < 0) { @@ -3646,7 +3760,7 @@ ipmi_dcmi_main(struct ipmi_intf * intf, int argc, char **argv) /* get management controller identifier string */ if (ipmi_dcmi_prnt_getmngctrlids(intf) < 0) { lprintf(LOG_ERR, - "Error getting management controller identifier string!"); + "Error getting management controller identifier string!"); return -1; } break; @@ -3656,13 +3770,13 @@ ipmi_dcmi_main(struct ipmi_intf * intf, int argc, char **argv) /* set management controller identifier string */ if (argc == 1 ) { print_strs(dcmi_cmd_vals, - "Data Center Management Interface commands", - LOG_ERR, 0); + "Data Center Management Interface commands", + LOG_ERR, 0); return -1; } if (ipmi_dcmi_prnt_setmngctrlids(intf, (uint8_t *)argv[1]) < 0) { lprintf(LOG_ERR, - "Error setting management controller identifier string!"); + "Error setting management controller identifier string!"); return -1; } break; @@ -3675,14 +3789,14 @@ ipmi_dcmi_main(struct ipmi_intf * intf, int argc, char **argv) case 0x08: if(ipmi_dcmi_prnt_get_temp_readings(intf) < 0 ) { lprintf(LOG_ERR, - "Error get temperature readings!"); + "Error get temperature readings!"); return -1; } break; case 0x09: if(ipmi_dcmi_prnt_getconfparam(intf) < 0 ) { lprintf(LOG_ERR, - "Error Get DCMI Configuration Parameters!"); + "Error Get DCMI Configuration Parameters!"); return -1; }; break; @@ -3690,46 +3804,44 @@ ipmi_dcmi_main(struct ipmi_intf * intf, int argc, char **argv) { switch (argc) { case 2: - if (strncmp(argv[1], "activate_dhcp", 13) != 0) { + if (strcmp(argv[1], "activate_dhcp")) { print_strs( dcmi_conf_param_vals, - "DCMI Configuration Parameters", - LOG_ERR, 0); + "DCMI Configuration Parameters", + LOG_ERR, 0); return -1; } break; default: - if (argc != 3 || strncmp(argv[1], "help", 4) == 0) { + if (argc != 3 || !strcmp(argv[1], "help")) { print_strs(dcmi_conf_param_vals, - "DCMI Configuration Parameters", - LOG_ERR, 0); + "DCMI Configuration Parameters", + LOG_ERR, 0); return -1; } } - if (strncmp(argv[1], "activate_dhcp", 13) == 0) { + if (!strcmp(argv[1], "activate_dhcp")) { rsp = ipmi_dcmi_setconfparam(intf, 1, 1); } else { uint16_t tmp_val = 0; if (str2ushort(argv[2], &tmp_val) != 0) { - lprintf(LOG_ERR, - "Given %s '%s' is invalid.", - argv[1], argv[2]); + lprintf(LOG_ERR, "Given %s '%s' is invalid.", + argv[1], argv[2]); return (-1); } rsp = ipmi_dcmi_setconfparam(intf, - str2val2(argv[1], dcmi_conf_param_vals), - tmp_val); + str2val2(argv[1], dcmi_conf_param_vals), + tmp_val); } if (chk_rsp(rsp)) { - lprintf(LOG_ERR, - "Error Set DCMI Configuration Parameters!"); + lprintf(LOG_ERR, "Error Set DCMI Configuration Parameters!"); } break; } case 0x0B: { - if (intf->session == NULL) { + if (!intf->session) { lprintf(LOG_ERR, - "\nOOB discovery is available only via RMCP interface."); + "\nOOB discovery is available only via RMCP interface."); return -1; } if(ipmi_dcmi_prnt_oobDiscover(intf) < 0) { @@ -3741,8 +3853,8 @@ ipmi_dcmi_main(struct ipmi_intf * intf, int argc, char **argv) default: /* couldn't detect what the user entered */ print_strs(dcmi_cmd_vals, - "Data Center Management Interface commands", - LOG_ERR, 0); + "Data Center Management Interface commands", + LOG_ERR, 0); return -1; break; } @@ -3761,10 +3873,10 @@ ipmi_nm_main(struct ipmi_intf * intf, int argc, char **argv) { struct nm_discover disc; - if ((argc == 0) || (strncmp(argv[0], "help", 4) == 0)) { + if (!argc || !strcmp(argv[0], "help")) { print_strs(nm_cmd_vals, - "Node Manager Interface commands", - LOG_ERR, 0); + "Node Manager Interface commands", + LOG_ERR, 0); return -1; } @@ -3775,7 +3887,7 @@ ipmi_nm_main(struct ipmi_intf * intf, int argc, char **argv) return -1; printf(" Node Manager Version %s\n", val2str2(disc.nm_version, nm_version_vals)); printf(" revision %d.%d%d patch version %d\n", disc.major_rev, - disc.minor_rev>>4, disc.minor_rev&0xf, disc.patch_version); + disc.minor_rev>>4, disc.minor_rev&0xf, disc.patch_version); break; /* capability */ case 0x01: @@ -3846,37 +3958,38 @@ ipmi_print_sensor_info(struct ipmi_intf *intf, uint16_t rec_id) uint8_t *rec = NULL; itr = ipmi_sdr_start(intf, 0); - if (itr == NULL) { + if (!itr) { lprintf(LOG_ERR, "Unable to open SDR for reading"); return (-1); } - while ((header = ipmi_sdr_get_next_header(intf, itr)) != NULL) { + while ((header = ipmi_sdr_get_next_header(intf, itr))) { if (header->id == rec_id) { break; } } - if (header == NULL) { + if (!header) { lprintf(LOG_DEBUG, "header == NULL"); - ipmi_sdr_end(intf, itr); + ipmi_sdr_end(itr); return (-1); } /* yes, we found the SDR for this record ID, now get full record */ rec = ipmi_sdr_get_record(intf, header, itr); - if (rec == NULL) { + if (!rec) { lprintf(LOG_DEBUG, "rec == NULL"); - ipmi_sdr_end(intf, itr); + ipmi_sdr_end(itr); return (-1); } if ((header->type == SDR_RECORD_TYPE_FULL_SENSOR) || - (header->type == SDR_RECORD_TYPE_COMPACT_SENSOR)) { + (header->type == SDR_RECORD_TYPE_COMPACT_SENSOR)) + { rc = ipmi_sdr_print_rawentry(intf, header->type, - rec, header->length); + rec, header->length); } else { rc = (-1); } free(rec); rec = NULL; - ipmi_sdr_end(intf, itr); + ipmi_sdr_end(itr); return rc; } diff --git a/lib/ipmi_delloem.c b/lib/ipmi_delloem.c index bc78c1d..e868913 100644 --- a/lib/ipmi_delloem.c +++ b/lib/ipmi_delloem.c @@ -62,6 +62,7 @@ #include <ipmitool/ipmi_entity.h> #include <ipmitool/ipmi_fru.h> #include <ipmitool/ipmi_sensor.h> +#include <ipmitool/ipmi_time.h> #define DELL_OEM_NETFN (uint8_t)(0x30) #define GET_IDRAC_VIRTUAL_MAC (uint8_t)(0xC9) @@ -170,12 +171,10 @@ static int ipmi_lcd_get_status(struct ipmi_intf *intf); static int ipmi_lcd_set_kvm(struct ipmi_intf *intf, char status); static int ipmi_lcd_set_lock(struct ipmi_intf *intf, char lock); static int ipmi_lcd_set_single_line_text(struct ipmi_intf *intf, char *text); -static int ipmi_lcd_set_text(struct ipmi_intf *intf, char *text, - int line_number); +static int ipmi_lcd_set_text(struct ipmi_intf *intf, char *text); static int ipmi_lcd_configure_wh(struct ipmi_intf *intf, uint32_t mode, - uint16_t lcdquallifier, uint8_t errordisp, int8_t line_number, char *text); -static int ipmi_lcd_configure(struct ipmi_intf *intf, int command, - int8_t line_number, char *text); + uint16_t lcdquallifier, uint8_t errordisp, char *text); +static int ipmi_lcd_configure(struct ipmi_intf *intf, int command, char *text); static void ipmi_lcd_usage(void); /* MAC Function prototypes */ static int ipmi_delloem_mac_main(struct ipmi_intf *intf, int argc, char **argv); @@ -201,7 +200,6 @@ static int ipmi_lan_set_nic_selection_12g(struct ipmi_intf *intf, /* Power monitor Function prototypes */ static int ipmi_delloem_powermonitor_main(struct ipmi_intf *intf, int argc, char **argv); -static void ipmi_time_to_str(time_t rawTime, char *strTime); static int ipmi_get_sensor_reading(struct ipmi_intf *intf, unsigned char sensorNumber, SensorReadingType *pSensorReadingData); static int ipmi_get_power_capstatus_command(struct ipmi_intf *intf); @@ -271,25 +269,25 @@ ipmi_delloem_main(struct ipmi_intf * intf, int argc, char ** argv) { int rc = 0; current_arg = 0; - if (argc == 0 || strncmp(argv[0], "help\0", 5) == 0) { + if (!argc || !strcmp(argv[0], "help")) { usage(); return 0; } - if (0 ==strncmp(argv[current_arg], "lcd\0", 4)) { + if (0 ==strcmp(argv[current_arg], "lcd")) { rc = ipmi_delloem_lcd_main(intf,argc,argv); - } else if (strncmp(argv[current_arg], "mac\0", 4) == 0) { + } else if (!strcmp(argv[current_arg], "mac")) { /* mac address*/ rc = ipmi_delloem_mac_main(intf,argc,argv); - } else if (strncmp(argv[current_arg], "lan\0", 4) == 0) { + } else if (!strcmp(argv[current_arg], "lan")) { /* lan address*/ rc = ipmi_delloem_lan_main(intf,argc,argv); - } else if (strncmp(argv[current_arg], "setled\0", 7) == 0) { + } else if (!strcmp(argv[current_arg], "setled")) { /* SetLED support */ rc = ipmi_delloem_setled_main(intf,argc,argv); - } else if (strncmp(argv[current_arg], "powermonitor\0", 13) == 0) { + } else if (!strcmp(argv[current_arg], "powermonitor")) { /*Powermanagement report processing*/ rc = ipmi_delloem_powermonitor_main(intf,argc,argv); - } else if (strncmp(argv[current_arg], "vFlash\0", 7) == 0) { + } else if (!strcmp(argv[current_arg], "vFlash")) { /* vFlash Support */ rc = ipmi_delloem_vFlash_main(intf,argc,argv); } else { @@ -361,7 +359,7 @@ ipmi_delloem_lcd_main(struct ipmi_intf * intf, int argc, char ** argv) return -1; } /* ipmitool delloem lcd info*/ - if (argc == 1 || strcmp(argv[current_arg], "help") == 0) { + if (argc == 1 || !strcmp(argv[current_arg], "help")) { ipmi_lcd_usage(); return 0; } @@ -370,15 +368,15 @@ ipmi_delloem_lcd_main(struct ipmi_intf * intf, int argc, char ** argv) if (!IsLCDSupported()) { lprintf(LOG_ERR, "lcd is not supported on this system."); return -1; - } else if (strncmp(argv[current_arg], "info\0", 5) == 0) { + } else if (!strcmp(argv[current_arg], "info")) { if (iDRAC_FLAG_ALL) { rc = ipmi_lcd_get_info_wh(intf); } else { rc = ipmi_lcd_get_info(intf); } - } else if (strncmp(argv[current_arg], "status\0", 7) == 0) { + } else if (!strcmp(argv[current_arg], "status")) { rc = ipmi_lcd_get_status(intf); - } else if (strncmp(argv[current_arg], "set\0", 4) == 0) { + } else if (!strcmp(argv[current_arg], "set")) { /* ipmitool delloem lcd set*/ uint8_t line_number = 0; current_arg++; @@ -386,7 +384,7 @@ ipmi_delloem_lcd_main(struct ipmi_intf * intf, int argc, char ** argv) ipmi_lcd_usage(); return -1; } - if (strncmp(argv[current_arg], "line\0", 5) == 0) { + if (!strcmp(argv[current_arg], "line")) { current_arg++; if (argc <= current_arg) { usage(); @@ -404,164 +402,170 @@ ipmi_delloem_lcd_main(struct ipmi_intf * intf, int argc, char ** argv) return -1; } } - if ((strncmp(argv[current_arg], "mode\0", 5) == 0) - && (iDRAC_FLAG_ALL)) { + if (!strcmp(argv[current_arg], "mode") + && iDRAC_FLAG_ALL) + { current_arg++; if (argc <= current_arg) { ipmi_lcd_usage(); return -1; } - if (argv[current_arg] == NULL) { + if (!argv[current_arg]) { ipmi_lcd_usage(); return -1; } - if (strncmp(argv[current_arg], "none\0", 5) == 0) { + if (!strcmp(argv[current_arg], "none")) { rc = ipmi_lcd_configure_wh(intf, IPMI_DELL_LCD_CONFIG_NONE, 0xFF, - 0XFF, 0, NULL); - } else if (strncmp(argv[current_arg], "modelname\0", 10) == 0) { + 0XFF, NULL); + } else if (!strcmp(argv[current_arg], "modelname")) { rc = ipmi_lcd_configure_wh(intf, IPMI_DELL_LCD_CONFIG_DEFAULT, 0xFF, - 0XFF, 0, NULL); - } else if (strncmp(argv[current_arg], "userdefined\0", 12) == 0) { + 0XFF, NULL); + } else if (!strcmp(argv[current_arg], "userdefined")) { current_arg++; if (argc <= current_arg) { ipmi_lcd_usage(); return -1; } rc = ipmi_lcd_configure_wh(intf, IPMI_DELL_LCD_CONFIG_USER_DEFINED, - 0xFF, 0XFF, line_number, argv[current_arg]); - } else if (strncmp(argv[current_arg], "ipv4address\0", 12) == 0) { + 0xFF, 0XFF, argv[current_arg]); + } else if (!strcmp(argv[current_arg], "ipv4address")) { rc = ipmi_lcd_configure_wh(intf, IPMI_DELL_LCD_iDRAC_IPV4ADRESS, - 0xFF, 0XFF, 0, NULL); - } else if (strncmp(argv[current_arg], "macaddress\0", 11) == 0) { + 0xFF, 0XFF, NULL); + } else if (!strcmp(argv[current_arg], "macaddress")) { rc = ipmi_lcd_configure_wh(intf, IPMI_DELL_LCD_IDRAC_MAC_ADDRESS, - 0xFF, 0XFF, 0, NULL); - } else if (strncmp(argv[current_arg], "systemname\0", 11) == 0) { + 0xFF, 0XFF, NULL); + } else if (!strcmp(argv[current_arg], "systemname")) { rc = ipmi_lcd_configure_wh(intf, IPMI_DELL_LCD_OS_SYSTEM_NAME, 0xFF, - 0XFF, 0, NULL); - } else if (strncmp(argv[current_arg], "servicetag\0", 11) == 0) { + 0XFF, NULL); + } else if (!strcmp(argv[current_arg], "servicetag")) { rc = ipmi_lcd_configure_wh(intf, IPMI_DELL_LCD_SERVICE_TAG, 0xFF, - 0XFF, 0, NULL); - } else if (strncmp(argv[current_arg], "ipv6address\0", 12) == 0) { + 0XFF, NULL); + } else if (!strcmp(argv[current_arg], "ipv6address")) { rc = ipmi_lcd_configure_wh(intf, IPMI_DELL_LCD_iDRAC_IPV6ADRESS, - 0xFF, 0XFF, 0, NULL); - } else if (strncmp(argv[current_arg], "ambienttemp\0", 12) == 0) { + 0xFF, 0XFF, NULL); + } else if (!strcmp(argv[current_arg], "ambienttemp")) { rc = ipmi_lcd_configure_wh(intf, IPMI_DELL_LCD_AMBEINT_TEMP, 0xFF, - 0XFF, 0, NULL); - } else if (strncmp(argv[current_arg], "systemwatt\0", 11) == 0) { + 0XFF, NULL); + } else if (!strcmp(argv[current_arg], "systemwatt")) { rc = ipmi_lcd_configure_wh(intf, IPMI_DELL_LCD_SYSTEM_WATTS, 0xFF, - 0XFF, 0, NULL); - } else if (strncmp(argv[current_arg], "assettag\0", 9) == 0) { + 0XFF, NULL); + } else if (!strcmp(argv[current_arg], "assettag")) { rc = ipmi_lcd_configure_wh(intf, IPMI_DELL_LCD_ASSET_TAG, 0xFF, - 0XFF, 0, NULL); - } else if (strncmp(argv[current_arg], "help\0", 5) == 0) { + 0XFF, NULL); + } else if (!strcmp(argv[current_arg], "help")) { ipmi_lcd_usage(); } else { lprintf(LOG_ERR, "Invalid DellOEM command: %s", argv[current_arg]); ipmi_lcd_usage(); } - } else if ((strncmp(argv[current_arg], "lcdqualifier\0", 13) == 0) - && (iDRAC_FLAG_ALL)) { + } else if (!strcmp(argv[current_arg], "lcdqualifier") + && iDRAC_FLAG_ALL) + { current_arg++; if (argc <= current_arg) { ipmi_lcd_usage(); return -1; } - if (argv[current_arg] == NULL) { + if (!argv[current_arg]) { ipmi_lcd_usage(); return -1; } - if (strncmp(argv[current_arg], "watt\0", 5) == 0) { - rc = ipmi_lcd_configure_wh(intf, 0xFF, 0x00, 0XFF, 0, NULL); - } else if (strncmp(argv[current_arg], "btuphr\0",7) == 0) { - rc = ipmi_lcd_configure_wh(intf, 0xFF, 0x01, 0XFF, 0, NULL); - } else if (strncmp(argv[current_arg], "celsius\0", 8) == 0) { - rc = ipmi_lcd_configure_wh(intf, 0xFF, 0x02, 0xFF, 0, NULL); - } else if (strncmp(argv[current_arg], "fahrenheit", 11) == 0) { - rc = ipmi_lcd_configure_wh(intf, 0xFF, 0x03, 0xFF, 0, NULL); - } else if (strncmp(argv[current_arg], "help\0", 5) == 0) { + if (!strcmp(argv[current_arg], "watt")) { + rc = ipmi_lcd_configure_wh(intf, 0xFF, 0x00, 0XFF, NULL); + } else if (!strcmp(argv[current_arg], "btuphr")) { + rc = ipmi_lcd_configure_wh(intf, 0xFF, 0x01, 0XFF, NULL); + } else if (!strcmp(argv[current_arg], "celsius")) { + rc = ipmi_lcd_configure_wh(intf, 0xFF, 0x02, 0xFF, NULL); + } else if (!strcmp(argv[current_arg], "fahrenheit")) { + rc = ipmi_lcd_configure_wh(intf, 0xFF, 0x03, 0xFF, NULL); + } else if (!strcmp(argv[current_arg], "help")) { ipmi_lcd_usage(); } else { lprintf(LOG_ERR, "Invalid DellOEM command: %s", argv[current_arg]); ipmi_lcd_usage(); } - } else if ((strncmp(argv[current_arg], "errordisplay\0", 13) == 0) - && (iDRAC_FLAG_ALL)) { + } else if (!strcmp(argv[current_arg], "errordisplay") + && iDRAC_FLAG_ALL) + { current_arg++; if (argc <= current_arg) { ipmi_lcd_usage(); return -1; } - if (argv[current_arg] == NULL) { + if (!argv[current_arg]) { ipmi_lcd_usage(); return -1; } - if (strncmp(argv[current_arg], "sel\0", 4) == 0) { + if (!strcmp(argv[current_arg], "sel")) { rc = ipmi_lcd_configure_wh(intf, 0xFF, 0xFF, - IPMI_DELL_LCD_ERROR_DISP_SEL, 0, NULL); - } else if (strncmp(argv[current_arg], "simple\0", 7) == 0) { + IPMI_DELL_LCD_ERROR_DISP_SEL, NULL); + } else if (!strcmp(argv[current_arg], "simple")) { rc = ipmi_lcd_configure_wh(intf, 0xFF, 0xFF, - IPMI_DELL_LCD_ERROR_DISP_VERBOSE, 0, NULL); - } else if (strncmp(argv[current_arg], "help\0", 5) == 0) { + IPMI_DELL_LCD_ERROR_DISP_VERBOSE, NULL); + } else if (!strcmp(argv[current_arg], "help")) { ipmi_lcd_usage(); } else { lprintf(LOG_ERR, "Invalid DellOEM command: %s", argv[current_arg]); ipmi_lcd_usage(); } - } else if ((strncmp(argv[current_arg], "none\0", 5) == 0) - && (iDRAC_FLAG==0)) { - rc = ipmi_lcd_configure(intf, IPMI_DELL_LCD_CONFIG_NONE, 0, NULL); - } else if ((strncmp(argv[current_arg], "default\0", 8) == 0) - && (iDRAC_FLAG==0)) { - rc = ipmi_lcd_configure(intf, IPMI_DELL_LCD_CONFIG_DEFAULT, 0, NULL); - } else if ((strncmp(argv[current_arg], "custom\0", 7) == 0) - && (iDRAC_FLAG==0)) { + } else if (!strcmp(argv[current_arg], "none") + && iDRAC_FLAG==0) + { + rc = ipmi_lcd_configure(intf, IPMI_DELL_LCD_CONFIG_NONE, NULL); + } else if (!strcmp(argv[current_arg], "default") + && iDRAC_FLAG==0) + { + rc = ipmi_lcd_configure(intf, IPMI_DELL_LCD_CONFIG_DEFAULT, NULL); + } else if (!strcmp(argv[current_arg], "custom") + && iDRAC_FLAG==0) + { current_arg++; if (argc <= current_arg) { ipmi_lcd_usage(); return -1; } rc = ipmi_lcd_configure(intf, IPMI_DELL_LCD_CONFIG_USER_DEFINED, - line_number, argv[current_arg]); - } else if (strncmp(argv[current_arg], "vkvm\0", 5) == 0) { + argv[current_arg]); + } else if (!strcmp(argv[current_arg], "vkvm")) { current_arg++; if (argc <= current_arg) { ipmi_lcd_usage(); return -1; } - if (strncmp(argv[current_arg], "active\0", 7) == 0) { + if (!strcmp(argv[current_arg], "active")) { rc = ipmi_lcd_set_kvm(intf, 1); - } else if (strncmp(argv[current_arg], "inactive\0", 9) == 0) { + } else if (!strcmp(argv[current_arg], "inactive")) { rc = ipmi_lcd_set_kvm(intf, 0); - } else if (strncmp(argv[current_arg], "help\0", 5) == 0) { + } else if (!strcmp(argv[current_arg], "help")) { ipmi_lcd_usage(); } else { lprintf(LOG_ERR, "Invalid DellOEM command: %s", argv[current_arg]); ipmi_lcd_usage(); } - } else if (strncmp(argv[current_arg], "frontpanelaccess\0", 17) == 0) { + } else if (!strcmp(argv[current_arg], "frontpanelaccess")) { current_arg++; if (argc <= current_arg) { ipmi_lcd_usage(); return -1; } - if (strncmp(argv[current_arg], "viewandmodify\0", 14) == 0) { + if (!strcmp(argv[current_arg], "viewandmodify")) { rc = ipmi_lcd_set_lock(intf, 0); - } else if (strncmp(argv[current_arg], "viewonly\0", 9)==0) { + } else if (strcmp(argv[current_arg], "viewonly")==0) { rc = ipmi_lcd_set_lock(intf, 1); - } else if (strncmp(argv[current_arg], "disabled\0", 9)==0) { + } else if (strcmp(argv[current_arg], "disabled")==0) { rc = ipmi_lcd_set_lock(intf, 2); - } else if (strncmp(argv[current_arg], "help\0", 5) == 0) { + } else if (!strcmp(argv[current_arg], "help")) { ipmi_lcd_usage(); } else { lprintf(LOG_ERR, "Invalid DellOEM command: %s", argv[current_arg]); ipmi_lcd_usage(); } - } else if( (strncmp(argv[current_arg], "help\0", 5) == 0) + } else if( (!strcmp(argv[current_arg], "help")) && (iDRAC_FLAG==0)) { ipmi_lcd_usage(); } else { @@ -1201,17 +1205,17 @@ ipmi_lcd_set_kvm(struct ipmi_intf * intf, char status) req.msg.data_len = 5; req.msg.data = data; data[0] = IPMI_DELL_LCD_STATUS_SELECTOR; - data[1] = status; /* active- incative*/ + data[1] = status; /* active- inactive */ data[2] = lcdstatus.lock_status; /* full-veiw-locked */ rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Error setting LCD status"); rc= -1; } else if ((rsp->ccode == 0xc1) || (rsp->ccode == 0xcb)) { lprintf(LOG_ERR, "Error getting LCD status: " "Command not supported on this system."); return -1; - } else if (rsp->ccode > 0) { + } else if (rsp->ccode) { lprintf(LOG_ERR, "Error setting LCD status: %s", val2str(rsp->ccode, completion_code_vals)); rc= -1; @@ -1223,7 +1227,7 @@ ipmi_lcd_set_kvm(struct ipmi_intf * intf, char status) * * Description: This function sets lcd access mode * Input: intf - ipmi interface - * lock - View and modify / View only / Diabled + * lock - View and modify / View only / Disabled * Output: * Return: -1 on error * 0 if successful @@ -1247,17 +1251,17 @@ ipmi_lcd_set_lock(struct ipmi_intf * intf, char lock) req.msg.data_len = 5; req.msg.data = data; data[0] = IPMI_DELL_LCD_STATUS_SELECTOR; - data[1] = lcdstatus.vKVM_status; /* active- incative */ + data[1] = lcdstatus.vKVM_status; /* active- inactive */ data[2] = lock; /* full- veiw-locked */ rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Error setting LCD status"); rc = -1; } else if ((rsp->ccode == 0xc1) || (rsp->ccode == 0xcb)) { lprintf(LOG_ERR, "Error getting LCD status: " "Command not supported on this system."); rc = -1; - } else if (rsp->ccode > 0) { + } else if (rsp->ccode) { lprintf(LOG_ERR, "Error setting LCD status: %s", val2str(rsp->ccode, completion_code_vals)); rc= -1; @@ -1332,13 +1336,12 @@ ipmi_lcd_set_single_line_text(struct ipmi_intf * intf, char * text) * Description: This function sets lcd line text * Input: intf - ipmi interface * text - lcd string - * line_number- line number * Output: * Return: -1 on error * 0 if successful */ static int -ipmi_lcd_set_text(struct ipmi_intf * intf, char * text, int line_number) +ipmi_lcd_set_text(struct ipmi_intf * intf, char * text) { int rc = 0; IPMI_DELL_LCD_CAPS lcd_caps; @@ -1367,7 +1370,6 @@ ipmi_lcd_set_text(struct ipmi_intf * intf, char * text, int line_number) * Input: intf - ipmi interface * lcdquallifier- lcd quallifier * errordisp - error number - * line_number-line number * text - lcd string * Output: * Return: -1 on error @@ -1375,12 +1377,12 @@ ipmi_lcd_set_text(struct ipmi_intf * intf, char * text, int line_number) */ static int ipmi_lcd_configure_wh(struct ipmi_intf * intf, uint32_t mode, - uint16_t lcdquallifier, uint8_t errordisp, int8_t line_number, char * text) + uint16_t lcdquallifier, uint8_t errordisp, char * text) { int rc = 0; if (IPMI_DELL_LCD_CONFIG_USER_DEFINED == mode) { /* Any error was reported earlier. */ - rc = ipmi_lcd_set_text(intf, text, line_number); + rc = ipmi_lcd_set_text(intf, text); } if (rc == 0) { rc = ipmi_lcd_set_configure_command_wh(intf, mode ,lcdquallifier,errordisp); @@ -1393,19 +1395,17 @@ ipmi_lcd_configure_wh(struct ipmi_intf * intf, uint32_t mode, * Description: This function updates the current lcd configuration * Input: intf - ipmi interface * command- lcd command - * line_number-line number * text - lcd string * Output: * Return: -1 on error * 0 if successful */ static int -ipmi_lcd_configure(struct ipmi_intf * intf, int command, - int8_t line_number, char * text) +ipmi_lcd_configure(struct ipmi_intf * intf, int command, char * text) { int rc = 0; if (IPMI_DELL_LCD_CONFIG_USER_DEFINED == command) { - rc = ipmi_lcd_set_text(intf, text, line_number); + rc = ipmi_lcd_set_text(intf, text); } if (rc == 0) { rc = ipmi_lcd_set_configure_command(intf, command); @@ -1515,18 +1515,18 @@ ipmi_delloem_mac_main(struct ipmi_intf * intf, int argc, char ** argv) int rc = 0; int currIdInt = -1; current_arg++; - if (argc > 1 && strcmp(argv[current_arg], "help") == 0) { + if (argc > 1 && !strcmp(argv[current_arg], "help")) { ipmi_mac_usage(); return 0; } ipmi_idracvalidator_command(intf); if (argc == 1) { rc = ipmi_macinfo(intf, 0xff); - } else if (strncmp(argv[current_arg], "list\0", 5) == 0) { + } else if (!strcmp(argv[current_arg], "list")) { rc = ipmi_macinfo(intf, 0xff); - } else if (strncmp(argv[current_arg], "get\0", 4) == 0) { + } else if (!strcmp(argv[current_arg], "get")) { current_arg++; - if (argv[current_arg] == NULL) { + if (!argv[current_arg]) { ipmi_mac_usage(); return -1; } @@ -1595,24 +1595,22 @@ ipmi_macinfo_drac_idrac_virtual_mac(struct ipmi_intf* intf,uint8_t NicNum) req.msg.data_len = input_length; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { - return -1; - } - if (rsp->ccode > 0) { + if (!rsp || rsp->ccode) { return -1; } + if ((IMC_IDRAC_12G_MODULAR == IMC_Type) || (IMC_IDRAC_12G_MONOLITHIC== IMC_Type) || (IMC_IDRAC_13G_MODULAR == IMC_Type) || (IMC_IDRAC_13G_MONOLITHIC== IMC_Type)) { - /* Get the Chasiss Assigned MAC Addresss for 12g Only */ + /* Get the Chasiss Assigned MAC Address for 12g Only */ memcpy(VirtualMacAddress, ((rsp->data) + 1), MACADDRESSLENGH); for (i = 0; i < MACADDRESSLENGH; i++) { if (VirtualMacAddress[i] != 0) { UseVirtualMacAddress = 1; } } - /* Get the Server Assigned MAC Addresss for 12g Only */ + /* Get the Server Assigned MAC Address for 12g Only */ if (!UseVirtualMacAddress) { memcpy(VirtualMacAddress, ((rsp->data) + 1 + MACADDRESSLENGH), MACADDRESSLENGH); @@ -1690,11 +1688,11 @@ ipmi_macinfo_drac_idrac_mac(struct ipmi_intf* intf,uint8_t NicNum) req.msg.data_len = input_length; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Error in getting MAC Address"); return -1; } - if (rsp->ccode > 0) { + if (rsp->ccode) { lprintf(LOG_ERR, "Error in getting MAC Address (%s)", val2str(rsp->ccode, completion_code_vals)); return -1; @@ -1756,11 +1754,11 @@ ipmi_macinfo_10g(struct ipmi_intf* intf, uint8_t NicNum) req.msg.data = msg_data; req.msg.data_len = input_length; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Error in getting MAC Address"); return -1; } - if (rsp->ccode > 0) { + if (rsp->ccode) { lprintf(LOG_ERR, "Error in getting MAC Address (%s)", val2str(rsp->ccode, completion_code_vals)); return -1; @@ -1830,11 +1828,11 @@ ipmi_macinfo_11g(struct ipmi_intf* intf, uint8_t NicNum) req.msg.data_len = input_length; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Error in getting MAC Address"); return -1; } - if (rsp->ccode > 0) { + if (rsp->ccode) { lprintf(LOG_ERR, "Error in getting MAC Address (%s)", val2str(rsp->ccode, completion_code_vals)); return -1; @@ -1861,11 +1859,11 @@ ipmi_macinfo_11g(struct ipmi_intf* intf, uint8_t NicNum) req.msg.data_len = input_length; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Error in getting MAC Address"); return -1; } - if (rsp->ccode > 0) { + if (rsp->ccode) { lprintf(LOG_ERR, "Error in getting MAC Address (%s)", val2str(rsp->ccode, completion_code_vals)); return -1; @@ -1950,7 +1948,7 @@ ipmi_mac_usage(void) * * Description: This function processes the delloem lan command * Input: intf - ipmi interface - * argc - no of arguments + * argc - no of arguments (unused, left in for calling consistency) * argv - argument string array * Output: * @@ -1958,13 +1956,13 @@ ipmi_mac_usage(void) * -1 - failure */ static int -ipmi_delloem_lan_main(struct ipmi_intf * intf, int argc, char ** argv) +ipmi_delloem_lan_main(struct ipmi_intf * intf, int __UNUSED__(argc), char ** argv) { int rc = 0; int nic_selection = 0; char nic_set[2] = {0}; current_arg++; - if (argv[current_arg] == NULL || strcmp(argv[current_arg], "help") == 0) { + if (!argv[current_arg] || !strcmp(argv[current_arg], "help")) { ipmi_lan_usage(); return 0; } @@ -1972,9 +1970,9 @@ ipmi_delloem_lan_main(struct ipmi_intf * intf, int argc, char ** argv) if (!IsLANSupported()) { lprintf(LOG_ERR, "lan is not supported on this system."); return -1; - } else if (strncmp(argv[current_arg], "set\0", 4) == 0) { + } else if (!strcmp(argv[current_arg], "set")) { current_arg++; - if (argv[current_arg] == NULL) { + if (!argv[current_arg]) { ipmi_lan_usage(); return -1; } @@ -2008,12 +2006,12 @@ ipmi_delloem_lan_main(struct ipmi_intf * intf, int argc, char ** argv) rc = ipmi_lan_set_nic_selection(intf,nic_selection); } return 0; - } else if (strncmp(argv[current_arg], "get\0", 4) == 0) { + } else if (!strcmp(argv[current_arg], "get")) { current_arg++; - if (argv[current_arg] == NULL) { + if (!argv[current_arg]) { rc = ipmi_lan_get_nic_selection(intf); return rc; - } else if (strncmp(argv[current_arg], "active\0", 7) == 0) { + } else if (!strcmp(argv[current_arg], "active")) { rc = ipmi_lan_get_active_nic(intf); return rc; } else { @@ -2053,47 +2051,47 @@ get_nic_selection_mode_12g(struct ipmi_intf* intf,int current_arg, req.msg.data = msg_data; req.msg.data_len = input_length; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Error in getting nic selection"); return -1; - } else if (rsp->ccode > 0) { + } else if (rsp->ccode) { lprintf(LOG_ERR, "Error in getting nic selection (%s)", val2str(rsp->ccode, completion_code_vals)); return -1; } nic_set[0] = rsp->data[0]; nic_set[1] = rsp->data[1]; - if (argv[current_arg] != NULL - && strncmp(argv[current_arg], "dedicated\0", 10) == 0) { + if (argv[current_arg] + && !strcmp(argv[current_arg], "dedicated")) { nic_set[0] = 1; nic_set[1] = 0; return 0; } - if (argv[current_arg] != NULL - && strncmp(argv[current_arg], "shared\0", 7) == 0) { + if (argv[current_arg] + && !strcmp(argv[current_arg], "shared")) { /* placeholder */ } else { return INVALID; } current_arg++; - if (argv[current_arg] != NULL - && strncmp(argv[current_arg], "with\0", 5) == 0) { + if (argv[current_arg] + && !strcmp(argv[current_arg], "with")) { /* placeholder */ } else { return INVALID; } current_arg++; - if (argv[current_arg] != NULL - && strncmp(argv[current_arg], "failover\0", 9) == 0) { + if (argv[current_arg] + && !strcmp(argv[current_arg], "failover")) { failover = 1; } if (failover) { current_arg++; } - if (argv[current_arg] != NULL - && strncmp(argv[current_arg], "lom1\0", 5) == 0) { + if (argv[current_arg] + && !strcmp(argv[current_arg], "lom1")) { if ((IMC_IDRAC_12G_MODULAR == IMC_Type) || (IMC_IDRAC_13G_MODULAR == IMC_Type)) { return INVAILD_SHARED_MODE; } @@ -2111,8 +2109,8 @@ get_nic_selection_mode_12g(struct ipmi_intf* intf,int current_arg, } } return 0; - } else if (argv[current_arg] != NULL - && strncmp(argv[current_arg], "lom2\0", 5) == 0) { + } else if (argv[current_arg] + && !strcmp(argv[current_arg], "lom2")) { if ((IMC_IDRAC_12G_MODULAR == IMC_Type) || (IMC_IDRAC_13G_MODULAR == IMC_Type)) { return INVAILD_SHARED_MODE; } @@ -2130,8 +2128,8 @@ get_nic_selection_mode_12g(struct ipmi_intf* intf,int current_arg, } } return 0; - } else if (argv[current_arg] != NULL - && strncmp(argv[current_arg], "lom3\0", 5) == 0) { + } else if (argv[current_arg] + && !strcmp(argv[current_arg], "lom3")) { if ((IMC_IDRAC_12G_MODULAR == IMC_Type) || (IMC_IDRAC_13G_MODULAR == IMC_Type)) { return INVAILD_SHARED_MODE; } @@ -2149,8 +2147,8 @@ get_nic_selection_mode_12g(struct ipmi_intf* intf,int current_arg, } } return 0; - } else if (argv[current_arg] != NULL - && strncmp(argv[current_arg], "lom4\0", 5) == 0) { + } else if (argv[current_arg] + && !strcmp(argv[current_arg], "lom4")) { if ((IMC_IDRAC_12G_MODULAR == IMC_Type) || (IMC_IDRAC_13G_MODULAR == IMC_Type)) { return INVAILD_SHARED_MODE; } @@ -2168,8 +2166,8 @@ get_nic_selection_mode_12g(struct ipmi_intf* intf,int current_arg, } } return 0; - } else if (failover && argv[current_arg] != NULL - && strncmp(argv[current_arg], "none\0", 5) == 0) { + } else if (failover && argv[current_arg] + && !strcmp(argv[current_arg], "none")) { if ((IMC_IDRAC_12G_MODULAR == IMC_Type) || (IMC_IDRAC_13G_MODULAR == IMC_Type) ) { return INVAILD_SHARED_MODE; } @@ -2180,16 +2178,16 @@ get_nic_selection_mode_12g(struct ipmi_intf* intf,int current_arg, nic_set[1] = 0; } return 0; - } else if (failover && argv[current_arg] != NULL - && strncmp(argv[current_arg], "all\0", 4) == 0) { + } else if (failover && argv[current_arg] + && !strcmp(argv[current_arg], "all")) { /* placeholder */ } else { return INVALID; } current_arg++; - if (failover && argv[current_arg] != NULL - && strncmp(argv[current_arg], "loms\0", 5) == 0) { + if (failover && argv[current_arg] + && !strcmp(argv[current_arg], "loms")) { if ((IMC_IDRAC_12G_MODULAR == IMC_Type) || (IMC_IDRAC_13G_MODULAR == IMC_Type)) { return INVAILD_SHARED_MODE; } @@ -2205,47 +2203,47 @@ get_nic_selection_mode_12g(struct ipmi_intf* intf,int current_arg, static int get_nic_selection_mode(int current_arg, char ** argv) { - if (argv[current_arg] != NULL - && strncmp(argv[current_arg], "dedicated\0", 10) == 0) { + if (argv[current_arg] + && !strcmp(argv[current_arg], "dedicated")) { return DEDICATED; } - if (argv[current_arg] != NULL - && strncmp(argv[current_arg], "shared\0", 7) == 0) { - if (argv[current_arg+1] == NULL) { + if (argv[current_arg] + && !strcmp(argv[current_arg], "shared")) { + if (!argv[current_arg+1]) { return SHARED; } } current_arg++; - if (argv[current_arg] != NULL - && strncmp(argv[current_arg], "with\0", 5) == 0) { + if (argv[current_arg] + && !strcmp(argv[current_arg], "with")) { /* place holder */ } else { return INVALID; } current_arg++; - if (argv[current_arg] != NULL - && strncmp(argv[current_arg], "failover\0", 9) == 0) { + if (argv[current_arg] + && !strcmp(argv[current_arg], "failover")) { /* place holder */ } else { return INVALID; } current_arg++; - if (argv[current_arg] != NULL - && strncmp(argv[current_arg], "lom2\0", 5) == 0) { + if (argv[current_arg] + && !strcmp(argv[current_arg], "lom2")) { return SHARED_WITH_FAILOVER_LOM2; - } else if (argv[current_arg] != NULL - && strncmp(argv[current_arg], "all\0", 4) == 0) { + } else if (argv[current_arg] + && !strcmp(argv[current_arg], "all")) { /* place holder */ } else { return INVALID; } current_arg++; - if (argv[current_arg] != NULL - && strncmp(argv[current_arg], "loms\0", 5) == 0) { + if (argv[current_arg] + && !strcmp(argv[current_arg], "loms")) { return SHARED_WITH_FAILOVER_ALL_LOMS; } return INVALID; @@ -2268,7 +2266,7 @@ ipmi_lan_set_nic_selection_12g(struct ipmi_intf * intf, uint8_t * nic_selection) req.msg.data = msg_data; req.msg.data_len = input_length; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Error in setting nic selection"); return -1; } else if( (nic_selection[0] == 1) @@ -2278,7 +2276,7 @@ ipmi_lan_set_nic_selection_12g(struct ipmi_intf * intf, uint8_t * nic_selection) lprintf(LOG_ERR, "FM001 : A required license is missing or expired"); return -1; - } else if (rsp->ccode > 0) { + } else if (rsp->ccode) { lprintf(LOG_ERR, "Error in setting nic selection (%s)", val2str(rsp->ccode, completion_code_vals)); return -1; @@ -2303,10 +2301,10 @@ ipmi_lan_set_nic_selection(struct ipmi_intf * intf, uint8_t nic_selection) req.msg.data = msg_data; req.msg.data_len = input_length; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Error in setting nic selection"); return -1; - } else if (rsp->ccode > 0) { + } else if (rsp->ccode) { lprintf(LOG_ERR, "Error in setting nic selection (%s)", val2str(rsp->ccode, completion_code_vals)); return -1; @@ -2336,10 +2334,10 @@ ipmi_lan_get_nic_selection(struct ipmi_intf * intf) req.msg.data = msg_data; req.msg.data_len = input_length; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Error in getting nic selection"); return -1; - } else if (rsp->ccode > 0) { + } else if (rsp->ccode) { lprintf(LOG_ERR, "Error in getting nic selection (%s)", val2str(rsp->ccode, completion_code_vals)); return -1; @@ -2392,10 +2390,10 @@ ipmi_lan_get_active_nic(struct ipmi_intf * intf) req.msg.data = msg_data; req.msg.data_len = input_length; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Error in getting Active LOM Status"); return -1; - } else if (rsp->ccode > 0) { + } else if (rsp->ccode) { lprintf(LOG_ERR, "Error in getting Active LOM Status (%s)", val2str(rsp->ccode, completion_code_vals)); return -1; @@ -2411,10 +2409,10 @@ ipmi_lan_get_active_nic(struct ipmi_intf * intf) req.msg.data = msg_data; req.msg.data_len = input_length; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Error in getting Active LOM Status"); return -1; - } else if (rsp->ccode > 0) { + } else if (rsp->ccode) { lprintf(LOG_ERR, "Error in getting Active LOM Status (%s)", val2str(rsp->ccode, completion_code_vals)); return -1; @@ -2505,68 +2503,68 @@ ipmi_delloem_powermonitor_main(struct ipmi_intf * intf, int argc, char ** argv) { int rc = 0; current_arg++; - if (argc > 1 && strcmp(argv[current_arg], "help") == 0) { + if (argc > 1 && !strcmp(argv[current_arg], "help")) { ipmi_powermonitor_usage(); return 0; } ipmi_idracvalidator_command(intf); if (argc == 1) { rc = ipmi_powermgmt(intf); - } else if (strncmp(argv[current_arg], "status\0", 7) == 0) { + } else if (!strcmp(argv[current_arg], "status")) { rc = ipmi_powermgmt(intf); - } else if (strncmp(argv[current_arg], "clear\0", 6) == 0) { + } else if (!strcmp(argv[current_arg], "clear")) { current_arg++; - if (argv[current_arg] == NULL) { + if (!argv[current_arg]) { ipmi_powermonitor_usage(); return -1; - } else if (strncmp(argv[current_arg], "peakpower\0", 10) == 0) { + } else if (!strcmp(argv[current_arg], "peakpower")) { rc = ipmi_powermgmt_clear(intf, 1); - } else if (strncmp(argv[current_arg], "cumulativepower\0", 16) == 0) { + } else if (!strcmp(argv[current_arg], "cumulativepower")) { rc = ipmi_powermgmt_clear(intf, 0); } else { ipmi_powermonitor_usage(); return -1; } - } else if (strncmp(argv[current_arg], "powerconsumption\0", 17) == 0) { + } else if (!strcmp(argv[current_arg], "powerconsumption")) { current_arg++; - if (argv[current_arg] == NULL) { + if (!argv[current_arg]) { rc = ipmi_print_get_power_consmpt_data(intf,watt); - } else if (strncmp(argv[current_arg], "watt\0", 5) == 0) { + } else if (!strcmp(argv[current_arg], "watt")) { rc = ipmi_print_get_power_consmpt_data(intf, watt); - } else if (strncmp(argv[current_arg], "btuphr\0", 7) == 0) { + } else if (!strcmp(argv[current_arg], "btuphr")) { rc = ipmi_print_get_power_consmpt_data(intf, btuphr); } else { ipmi_powermonitor_usage(); return -1; } - } else if (strncmp(argv[current_arg], "powerconsumptionhistory\0", 23) == 0) { + } else if (!strcmp(argv[current_arg], "powerconsumptionhistory")) { current_arg++; - if (argv[current_arg] == NULL) { + if (!argv[current_arg]) { rc = ipmi_print_power_consmpt_history(intf,watt); - } else if (strncmp(argv[current_arg], "watt\0", 5) == 0) { + } else if (!strcmp(argv[current_arg], "watt")) { rc = ipmi_print_power_consmpt_history(intf, watt); - } else if (strncmp(argv[current_arg], "btuphr\0", 7) == 0) { + } else if (!strcmp(argv[current_arg], "btuphr")) { rc = ipmi_print_power_consmpt_history(intf, btuphr); } else { ipmi_powermonitor_usage(); return -1; } - } else if (strncmp(argv[current_arg], "getpowerbudget\0", 15) == 0) { + } else if (!strcmp(argv[current_arg], "getpowerbudget")) { current_arg++; - if (argv[current_arg] == NULL) { + if (!argv[current_arg]) { rc=ipmi_print_power_cap(intf,watt); - } else if (strncmp(argv[current_arg], "watt\0", 5) == 0) { + } else if (!strcmp(argv[current_arg], "watt")) { rc = ipmi_print_power_cap(intf, watt); - } else if (strncmp(argv[current_arg], "btuphr\0", 7) == 0) { + } else if (!strcmp(argv[current_arg], "btuphr")) { rc = ipmi_print_power_cap(intf, btuphr); } else { ipmi_powermonitor_usage(); return -1; } - } else if (strncmp(argv[current_arg], "setpowerbudget\0", 15) == 0) { + } else if (!strcmp(argv[current_arg], "setpowerbudget")) { int val; current_arg++; - if (argv[current_arg] == NULL) { + if (!argv[current_arg]) { ipmi_powermonitor_usage(); return -1; } @@ -2581,21 +2579,21 @@ ipmi_delloem_powermonitor_main(struct ipmi_intf * intf, int argc, char ** argv) return (-1); } current_arg++; - if (argv[current_arg] == NULL) { + if (!argv[current_arg]) { ipmi_powermonitor_usage(); - } else if (strncmp(argv[current_arg], "watt\0", 5) == 0) { + } else if (!strcmp(argv[current_arg], "watt")) { rc = ipmi_set_power_cap(intf,watt,val); - } else if (strncmp(argv[current_arg], "btuphr\0", 7) == 0) { + } else if (!strcmp(argv[current_arg], "btuphr")) { rc = ipmi_set_power_cap(intf, btuphr,val); - } else if (strncmp(argv[current_arg], "percent\0", 8) == 0) { + } else if (!strcmp(argv[current_arg], "percent")) { rc = ipmi_set_power_cap(intf,percent,val); } else { ipmi_powermonitor_usage(); return -1; } - } else if (strncmp(argv[current_arg], "enablepowercap\0", 15) == 0) { + } else if (!strcmp(argv[current_arg], "enablepowercap")) { ipmi_set_power_capstatus_command(intf,1); - } else if (strncmp(argv[current_arg], "disablepowercap\0", 16) == 0) { + } else if (!strcmp(argv[current_arg], "disablepowercap")) { ipmi_set_power_capstatus_command(intf,0); } else { ipmi_powermonitor_usage(); @@ -2603,24 +2601,7 @@ ipmi_delloem_powermonitor_main(struct ipmi_intf * intf, int argc, char ** argv) } return rc; } -/* - * Function Name: ipmi_time_to_str - * - * Description: This function converts ipmi time format into gmtime format - * Input: rawTime - ipmi time format - * Output: strTime - gmtime format - * - * Return: - */ -static void -ipmi_time_to_str(time_t rawTime, char * strTime) -{ - struct tm *tm; - char *temp; - tm = gmtime(&rawTime); - temp = asctime(tm); - strcpy(strTime,temp); -} + /* * Function Name: ipmi_get_sensor_reading * @@ -2645,19 +2626,19 @@ ipmi_get_sensor_reading(struct ipmi_intf *intf, unsigned char sensorNumber, req.msg.cmd = GET_SENSOR_READING; req.msg.data = &sensorNumber; req.msg.data_len = 1; - if (pSensorReadingData == NULL) { + if (!pSensorReadingData) { return -1; } memset(pSensorReadingData, 0, sizeof(SensorReadingType)); rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { return 1; - } else if (rsp->ccode > 0) { + } else if (rsp->ccode) { return 1; } memcpy(pSensorReadingData, rsp->data, sizeof(SensorReadingType)); /* if there is an error transmitting ipmi command, return error */ - if (rsp->ccode != 0) { + if (rsp->ccode) { rc = 1; } /* if sensor messages are disabled, return error*/ @@ -2690,14 +2671,14 @@ ipmi_get_power_capstatus_command(struct ipmi_intf * intf) data[0] = 01; data[1] = 0xFF; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Error getting powercap status"); return -1; } else if (( iDRAC_FLAG_12_13 ) && (rsp->ccode == LICENSE_NOT_SUPPORTED)) { lprintf(LOG_ERR, "FM001 : A required license is missing or expired"); return -1; /* Return Error as unlicensed */ - } else if (rsp->ccode > 0) { + } else if (rsp->ccode) { lprintf(LOG_ERR, "Error getting powercap statusr: %s", val2str(rsp->ccode, completion_code_vals)); return -1; @@ -2741,14 +2722,14 @@ ipmi_set_power_capstatus_command(struct ipmi_intf * intf, uint8_t val) data[0] = 00; data[1] = val; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Error setting powercap status"); return -1; } else if ((iDRAC_FLAG_12_13) && (rsp->ccode == LICENSE_NOT_SUPPORTED)) { lprintf(LOG_ERR, "FM001 : A required license is missing or expired"); return -1; /* return unlicensed Error code */ - } else if (rsp->ccode > 0) { + } else if (rsp->ccode) { lprintf(LOG_ERR, "Error setting powercap statusr: %s", val2str(rsp->ccode, completion_code_vals)); return -1; @@ -2770,24 +2751,15 @@ ipmi_powermgmt(struct ipmi_intf * intf) struct ipmi_rs * rsp; struct ipmi_rq req; uint8_t msg_data[2]; - uint32_t cumStartTimeConv; - uint32_t cumReadingConv; - uint32_t maxPeakStartTimeConv; - uint32_t ampPeakTimeConv; - uint16_t ampReadingConv; - uint32_t wattPeakTimeConv; - uint32_t wattReadingConv; - uint32_t bmctimeconv; - uint32_t * bmctimeconvval; + uint32_t cumStartTime; + uint32_t cumReading; + uint32_t maxPeakStartTime; + uint32_t ampPeakTime; + uint32_t wattPeakTime; + uint32_t bmctime; IPMI_POWER_MONITOR * pwrMonitorInfo; - char cumStartTime[26]; - char maxPeakStartTime[26]; - char ampPeakTime[26]; - char wattPeakTime[26]; - char bmctime[26]; - int ampReading; int ampReadingRemainder; int remainder; @@ -2799,22 +2771,17 @@ ipmi_powermgmt(struct ipmi_intf * intf) req.msg.cmd = IPMI_CMD_GET_SEL_TIME; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Error getting BMC time info."); return -1; } - if (rsp->ccode != 0) { + if (rsp->ccode) { lprintf(LOG_ERR, "Error getting power management information, return code %x", rsp->ccode); return -1; } - bmctimeconvval=(uint32_t*)rsp->data; -# if WORDS_BIGENDIAN - bmctimeconv=BSWAP_32(*bmctimeconvval); -# else - bmctimeconv=*bmctimeconvval; -# endif + bmctime = ipmi32toh(rsp->data); /* get powermanagement info*/ req.msg.netfn = DELL_OEM_NETFN; @@ -2828,7 +2795,7 @@ ipmi_powermgmt(struct ipmi_intf * intf) msg_data[1] = 0x01; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Error getting power management information."); return -1; } @@ -2841,7 +2808,7 @@ ipmi_powermgmt(struct ipmi_intf * intf) lprintf(LOG_ERR, "Error getting power management information: " "Command not supported on this system."); return -1; - }else if (rsp->ccode != 0) { + }else if (rsp->ccode) { lprintf(LOG_ERR, "Error getting power management information, return code %x", rsp->ccode); @@ -2849,54 +2816,35 @@ ipmi_powermgmt(struct ipmi_intf * intf) } pwrMonitorInfo = (IPMI_POWER_MONITOR*)rsp->data; -# if WORDS_BIGENDIAN - cumStartTimeConv = BSWAP_32(pwrMonitorInfo->cumStartTime); - cumReadingConv = BSWAP_32(pwrMonitorInfo->cumReading); - maxPeakStartTimeConv = BSWAP_32(pwrMonitorInfo->maxPeakStartTime); - ampPeakTimeConv = BSWAP_32(pwrMonitorInfo->ampPeakTime); - ampReadingConv = BSWAP_16(pwrMonitorInfo->ampReading); - wattPeakTimeConv = BSWAP_32(pwrMonitorInfo->wattPeakTime); - wattReadingConv = BSWAP_16(pwrMonitorInfo->wattReading); -# else - cumStartTimeConv = pwrMonitorInfo->cumStartTime; - cumReadingConv = pwrMonitorInfo->cumReading; - maxPeakStartTimeConv = pwrMonitorInfo->maxPeakStartTime; - ampPeakTimeConv = pwrMonitorInfo->ampPeakTime; - ampReadingConv = pwrMonitorInfo->ampReading; - wattPeakTimeConv = pwrMonitorInfo->wattPeakTime; - wattReadingConv = pwrMonitorInfo->wattReading; -# endif - - ipmi_time_to_str(cumStartTimeConv, cumStartTime); - ipmi_time_to_str(maxPeakStartTimeConv, maxPeakStartTime); - ipmi_time_to_str(ampPeakTimeConv, ampPeakTime); - ipmi_time_to_str(wattPeakTimeConv, wattPeakTime); - ipmi_time_to_str(bmctimeconv, bmctime); + cumStartTime = ipmi32toh(&pwrMonitorInfo->cumStartTime); + cumReading = ipmi32toh(&pwrMonitorInfo->cumReading); + maxPeakStartTime = ipmi32toh(&pwrMonitorInfo->maxPeakStartTime); + ampPeakTime = ipmi32toh(&pwrMonitorInfo->ampPeakTime); + ampReading = ipmi16toh(&pwrMonitorInfo->ampReading); + wattPeakTime = ipmi32toh(&pwrMonitorInfo->wattPeakTime); + wattReading = ipmi16toh(&pwrMonitorInfo->wattReading); - remainder = (cumReadingConv % 1000); - cumReadingConv = cumReadingConv / 1000; + remainder = (cumReading % 1000); + cumReading = cumReading / 1000; remainder = (remainder + 50) / 100; - ampReading = ampReadingConv; - ampReadingRemainder = ampReading%10; - ampReading = ampReading/10; - - wattReading = wattReadingConv; + ampReadingRemainder = ampReading % 10; + ampReading = ampReading / 10; printf("Power Tracking Statistics\n"); printf("Statistic : Cumulative Energy Consumption\n"); - printf("Start Time : %s", cumStartTime); - printf("Finish Time : %s", bmctime); - printf("Reading : %d.%d kWh\n\n", cumReadingConv, remainder); + printf("Start Time : %s", ipmi_timestamp_numeric(cumStartTime)); + printf("Finish Time : %s", ipmi_timestamp_numeric(bmctime)); + printf("Reading : %d.%d kWh\n\n", cumReading, remainder); printf("Statistic : System Peak Power\n"); - printf("Start Time : %s", maxPeakStartTime); - printf("Peak Time : %s", wattPeakTime); + printf("Start Time : %s", ipmi_timestamp_numeric(maxPeakStartTime)); + printf("Peak Time : %s", ipmi_timestamp_numeric(wattPeakTime)); printf("Peak Reading : %d W\n\n", wattReading); printf("Statistic : System Peak Amperage\n"); - printf("Start Time : %s", maxPeakStartTime); - printf("Peak Time : %s", ampPeakTime); + printf("Start Time : %s", ipmi_timestamp_numeric(maxPeakStartTime)); + printf("Peak Time : %s", ipmi_timestamp_numeric(ampPeakTime)); printf("Peak Reading : %d.%d A\n", ampReading, ampReadingRemainder); return 0; } @@ -2932,7 +2880,7 @@ ipmi_powermgmt_clear(struct ipmi_intf * intf, uint8_t clearValue) msg_data[2] = clearType; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Error clearing power values."); return -1; } else if ((iDRAC_FLAG_12_13) @@ -2944,7 +2892,7 @@ ipmi_powermgmt_clear(struct ipmi_intf * intf, uint8_t clearValue) lprintf(LOG_ERR, "Error clearing power values, command not supported on this system."); return -1; - } else if (rsp->ccode != 0) { + } else if (rsp->ccode) { lprintf(LOG_ERR, "Error clearing power values: %s", val2str(rsp->ccode, completion_code_vals)); return -1; @@ -3010,7 +2958,7 @@ ipmi_get_power_headroom_command(struct ipmi_intf * intf,uint8_t unit) req.msg.data_len = 0; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Error getting power headroom status"); return -1; } else if ((iDRAC_FLAG_12_13) @@ -3022,7 +2970,7 @@ ipmi_get_power_headroom_command(struct ipmi_intf * intf,uint8_t unit) lprintf(LOG_ERR, "Error getting power headroom status: " "Command not supported on this system "); return -1; - } else if (rsp->ccode > 0) { + } else if (rsp->ccode) { lprintf(LOG_ERR, "Error getting power headroom status: %s", val2str(rsp->ccode, completion_code_vals)); return -1; @@ -3077,7 +3025,7 @@ ipmi_get_power_consumption_data(struct ipmi_intf * intf,uint8_t unit) int status = 0; int sensor_number = 0; sdr = ipmi_sdr_find_sdr_byid(intf, "System Level"); - if (sdr == NULL) { + if (!sdr) { lprintf(LOG_ERR, "Error : Can not access the System Level sensor data"); return -1; @@ -3089,7 +3037,7 @@ ipmi_get_power_consumption_data(struct ipmi_intf * intf,uint8_t unit) sdr->record.common->keys.owner_id, sdr->record.common->keys.lun, sdr->record.common->keys.channel); - if (rsp == NULL || rsp->ccode != 0) { + if (!rsp || rsp->ccode) { lprintf(LOG_ERR, "Error : Can not access the System Level sensor data"); return -1; @@ -3144,7 +3092,7 @@ ipmi_get_instan_power_consmpt_data(struct ipmi_intf * intf, msg_data[1] = 0x00; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Error getting instantaneous power consumption data ."); return -1; } else if ((iDRAC_FLAG_12_13) @@ -3156,7 +3104,7 @@ ipmi_get_instan_power_consmpt_data(struct ipmi_intf * intf, lprintf(LOG_ERR, "Error getting instantaneous power consumption data: " "Command not supported on this system."); return -1; - } else if (rsp->ccode != 0) { + } else if (rsp->ccode) { lprintf(LOG_ERR, "Error getting instantaneous power consumption data: %s", val2str(rsp->ccode, completion_code_vals)); return -1; @@ -3396,12 +3344,7 @@ ipmi_get_minpower_consmpt_history(struct ipmi_intf * intf, static int ipmi_print_power_consmpt_history(struct ipmi_intf * intf, int unit) { - char timestr[30]; - uint32_t lastminutepeakpower; - uint32_t lasthourpeakpower; - uint32_t lastdaypeakpower; - uint32_t lastweekpeakpower; - uint64_t tempbtuphrconv; + uint64_t tmp; int rc = 0; IPMI_AVGPOWER_CONSUMP_HISTORY avgpower; @@ -3426,101 +3369,91 @@ ipmi_print_power_consmpt_history(struct ipmi_intf * intf, int unit) return rc; } printf("Power Consumption History\n\n"); - /* The fields are alligned manually changing the spaces will alter + /* The fields are aligned manually changing the spaces will alter * the alignment*/ printf("Statistic Last Minute Last Hour " "Last Day Last Week\n\n"); if (unit == btuphr) { printf("Average Power Consumption "); - tempbtuphrconv = watt_to_btuphr_conversion(avgpower.lastminutepower); - printf("%4" PRId64 " BTU/hr ", tempbtuphrconv); - tempbtuphrconv = watt_to_btuphr_conversion(avgpower.lasthourpower); - printf("%4" PRId64 " BTU/hr ", tempbtuphrconv); - tempbtuphrconv = watt_to_btuphr_conversion(avgpower.lastdaypower); - printf("%4" PRId64 " BTU/hr ", tempbtuphrconv); - tempbtuphrconv = watt_to_btuphr_conversion(avgpower.lastweakpower); - printf("%4" PRId64 " BTU/hr\n", tempbtuphrconv); + tmp = watt_to_btuphr_conversion(avgpower.lastminutepower); + printf("%4" PRId64 " BTU/hr ", tmp); + tmp = watt_to_btuphr_conversion(avgpower.lasthourpower); + printf("%4" PRId64 " BTU/hr ", tmp); + tmp = watt_to_btuphr_conversion(avgpower.lastdaypower); + printf("%4" PRId64 " BTU/hr ", tmp); + tmp = watt_to_btuphr_conversion(avgpower.lastweakpower); + printf("%4" PRId64 " BTU/hr\n", tmp); printf("Max Power Consumption "); - tempbtuphrconv = watt_to_btuphr_conversion(stPeakpower.lastminutepower); - printf("%4" PRId64 " BTU/hr ", tempbtuphrconv); - tempbtuphrconv = watt_to_btuphr_conversion(stPeakpower.lasthourpower); - printf("%4" PRId64 " BTU/hr ", tempbtuphrconv); - tempbtuphrconv = watt_to_btuphr_conversion(stPeakpower.lastdaypower); - printf("%4" PRId64 " BTU/hr ", tempbtuphrconv); - tempbtuphrconv = watt_to_btuphr_conversion(stPeakpower.lastweakpower); - printf("%4" PRId64 " BTU/hr\n", tempbtuphrconv); + tmp = watt_to_btuphr_conversion(stPeakpower.lastminutepower); + printf("%4" PRId64 " BTU/hr ", tmp); + tmp = watt_to_btuphr_conversion(stPeakpower.lasthourpower); + printf("%4" PRId64 " BTU/hr ", tmp); + tmp = watt_to_btuphr_conversion(stPeakpower.lastdaypower); + printf("%4" PRId64 " BTU/hr ", tmp); + tmp = watt_to_btuphr_conversion(stPeakpower.lastweakpower); + printf("%4" PRId64 " BTU/hr\n", tmp); printf("Min Power Consumption "); - tempbtuphrconv = watt_to_btuphr_conversion(stMinpower.lastminutepower); - printf("%4" PRId64 " BTU/hr ", tempbtuphrconv); - tempbtuphrconv = watt_to_btuphr_conversion(stMinpower.lasthourpower); - printf("%4" PRId64 " BTU/hr ", tempbtuphrconv); - tempbtuphrconv = watt_to_btuphr_conversion(stMinpower.lastdaypower); - printf("%4" PRId64 " BTU/hr ", tempbtuphrconv); - tempbtuphrconv = watt_to_btuphr_conversion(stMinpower.lastweakpower); - printf("%4" PRId64 " BTU/hr\n\n", tempbtuphrconv); + tmp = watt_to_btuphr_conversion(stMinpower.lastminutepower); + printf("%4" PRId64 " BTU/hr ", tmp); + tmp = watt_to_btuphr_conversion(stMinpower.lasthourpower); + printf("%4" PRId64 " BTU/hr ", tmp); + tmp = watt_to_btuphr_conversion(stMinpower.lastdaypower); + printf("%4" PRId64 " BTU/hr ", tmp); + tmp = watt_to_btuphr_conversion(stMinpower.lastweakpower); + printf("%4" PRId64 " BTU/hr\n\n", tmp); } else { printf("Average Power Consumption "); - tempbtuphrconv = (avgpower.lastminutepower); - printf("%4" PRId64 " W ", tempbtuphrconv); - tempbtuphrconv = (avgpower.lasthourpower); - printf("%4" PRId64 " W ", tempbtuphrconv); - tempbtuphrconv = (avgpower.lastdaypower); - printf("%4" PRId64 " W ", tempbtuphrconv); - tempbtuphrconv=(avgpower.lastweakpower); - printf("%4" PRId64 " W \n", tempbtuphrconv); + tmp = avgpower.lastminutepower; + printf("%4" PRId64 " W ", tmp); + tmp = avgpower.lasthourpower; + printf("%4" PRId64 " W ", tmp); + tmp = avgpower.lastdaypower; + printf("%4" PRId64 " W ", tmp); + tmp = avgpower.lastweakpower; + printf("%4" PRId64 " W \n", tmp); printf("Max Power Consumption "); - tempbtuphrconv = (stPeakpower.lastminutepower); - printf("%4" PRId64 " W ", tempbtuphrconv); - tempbtuphrconv = (stPeakpower.lasthourpower); - printf("%4" PRId64 " W ", tempbtuphrconv); - tempbtuphrconv = (stPeakpower.lastdaypower); - printf("%4" PRId64 " W ", tempbtuphrconv); - tempbtuphrconv = (stPeakpower.lastweakpower); - printf("%4" PRId64 " W \n", tempbtuphrconv); + tmp = stPeakpower.lastminutepower; + printf("%4" PRId64 " W ", tmp); + tmp = stPeakpower.lasthourpower; + printf("%4" PRId64 " W ", tmp); + tmp = stPeakpower.lastdaypower; + printf("%4" PRId64 " W ", tmp); + tmp = stPeakpower.lastweakpower; + printf("%4" PRId64 " W \n", tmp); printf("Min Power Consumption "); - tempbtuphrconv = (stMinpower.lastminutepower); - printf("%4" PRId64 " W ", tempbtuphrconv); - tempbtuphrconv = (stMinpower.lasthourpower); - printf("%4" PRId64 " W ", tempbtuphrconv); - tempbtuphrconv = (stMinpower.lastdaypower); - printf("%4" PRId64 " W ", tempbtuphrconv); - tempbtuphrconv = (stMinpower.lastweakpower); - printf("%4" PRId64 " W \n\n", tempbtuphrconv); + tmp = stMinpower.lastminutepower; + printf("%4" PRId64 " W ", tmp); + tmp = stMinpower.lasthourpower; + printf("%4" PRId64 " W ", tmp); + tmp = stMinpower.lastdaypower; + printf("%4" PRId64 " W ", tmp); + tmp = stMinpower.lastweakpower; + printf("%4" PRId64 " W \n\n", tmp); } - lastminutepeakpower = stPeakpower.lastminutepowertime; - lasthourpeakpower = stPeakpower.lasthourpowertime; - lastdaypeakpower = stPeakpower.lastdaypowertime; - lastweekpeakpower = stPeakpower.lastweekpowertime; - printf("Max Power Time\n"); - ipmi_time_to_str(lastminutepeakpower, timestr); - printf("Last Minute : %s",timestr); - ipmi_time_to_str(lasthourpeakpower, timestr); - printf("Last Hour : %s",timestr); - ipmi_time_to_str(lastdaypeakpower, timestr); - printf("Last Day : %s",timestr); - ipmi_time_to_str(lastweekpeakpower, timestr); - printf("Last Week : %s",timestr); - - lastminutepeakpower=stMinpower.lastminutepowertime; - lasthourpeakpower=stMinpower.lasthourpowertime; - lastdaypeakpower=stMinpower.lastdaypowertime; - lastweekpeakpower=stMinpower.lastweekpowertime; + printf("Last Minute : %s", + ipmi_timestamp_numeric(stPeakpower.lastminutepowertime)); + printf("Last Hour : %s", + ipmi_timestamp_numeric(stPeakpower.lasthourpowertime)); + printf("Last Day : %s", + ipmi_timestamp_numeric(stPeakpower.lastdaypowertime)); + printf("Last Week : %s", + ipmi_timestamp_numeric(stPeakpower.lastweekpowertime)); printf("Min Power Time\n"); - ipmi_time_to_str(lastminutepeakpower, timestr); - printf("Last Minute : %s", timestr); - ipmi_time_to_str(lasthourpeakpower, timestr); - printf("Last Hour : %s", timestr); - ipmi_time_to_str(lastdaypeakpower, timestr); - printf("Last Day : %s", timestr); - ipmi_time_to_str(lastweekpeakpower, timestr); - printf("Last Week : %s", timestr); + printf("Last Minute : %s", + ipmi_timestamp_numeric(stMinpower.lastminutepowertime)); + printf("Last Hour : %s", + ipmi_timestamp_numeric(stMinpower.lasthourpowertime)); + printf("Last Day : %s", + ipmi_timestamp_numeric(stMinpower.lastdaypowertime)); + printf("Last Week : %s", + ipmi_timestamp_numeric(stMinpower.lastweekpowertime)); return rc; } /* @@ -3688,7 +3621,7 @@ ipmi_set_power_cap(struct ipmi_intf * intf, int unit, int val) val = btuphr_to_watt_conversion(val); } else if (unit == percent) { if ((val < 0) || (val > 100)) { - lprintf(LOG_ERR, "Cap value is out of boundary conditon it " + lprintf(LOG_ERR, "Cap value is out of boundary condition it " "should be between 0 - 100"); return -1; } @@ -3703,7 +3636,7 @@ ipmi_set_power_cap(struct ipmi_intf * intf, int unit, int val) if (((val < ipmipowercap.MinimumPowerConsmp) || (val > ipmipowercap.MaximumPowerConsmp)) && (unit == watt)) { lprintf(LOG_ERR, - "Cap value is out of boundary conditon it should be between %d - %d", + "Cap value is out of boundary condition it should be between %d - %d", ipmipowercap.MinimumPowerConsmp, ipmipowercap.MaximumPowerConsmp); return -1; } else if (((val < ipmipowercap.MinimumPowerConsmp) @@ -3711,7 +3644,7 @@ ipmi_set_power_cap(struct ipmi_intf * intf, int unit, int val) minpowerbtuphr = watt_to_btuphr_conversion(ipmipowercap.MinimumPowerConsmp); maxpowerbtuphr = watt_to_btuphr_conversion(ipmipowercap.MaximumPowerConsmp); lprintf(LOG_ERR, - "Cap value is out of boundary conditon it should be between %d", + "Cap value is out of boundary condition it should be between %d", minpowerbtuphr); lprintf(LOG_ERR, " -%d", maxpowerbtuphr); return -1; @@ -3808,7 +3741,7 @@ ipmi_powermonitor_usage(void) * * Description: This function processes the delloem vFlash command * Input: intf - ipmi interface - * argc - no of arguments + * argc - no of arguments (unused) * argv - argument string array * Output: * @@ -3816,7 +3749,7 @@ ipmi_powermonitor_usage(void) * -1 - failure */ static int -ipmi_delloem_vFlash_main(struct ipmi_intf * intf, int argc, char ** argv) +ipmi_delloem_vFlash_main(struct ipmi_intf * intf, int __UNUSED__(argc), char ** argv) { int rc = 0; current_arg++; @@ -3837,7 +3770,7 @@ get_vFlash_compcode_str(uint8_t vflashcompcode, const struct vFlashstr *vs) { static char un_str[32]; int i; - for (i = 0; vs[i].str != NULL; i++) { + for (i = 0; vs[i].str; i++) { if (vs[i].val == vflashcompcode) return vs[i].str; } @@ -3871,10 +3804,10 @@ ipmi_get_sd_card_info(struct ipmi_intf * intf) { req.msg.data_len = input_length; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Error in getting SD Card Extended Information"); return -1; - } else if (rsp->ccode > 0) { + } else if (rsp->ccode) { lprintf(LOG_ERR, "Error in getting SD Card Extended Information (%s)", val2str(rsp->ccode, completion_code_vals)); return -1; @@ -3935,26 +3868,26 @@ static int ipmi_delloem_vFlash_process(struct ipmi_intf * intf, int current_arg, char ** argv) { int rc; - if (strncmp(intf->name,"wmi\0",4) && strncmp(intf->name, "open\0",5)) { + if (strcmp(intf->name,"wmi") && strcmp(intf->name, "open")) { lprintf(LOG_ERR, "vFlash support is enabled only for wmi and open interface."); lprintf(LOG_ERR, "Its not enabled for lan and lanplus interface."); return -1; } - if (argv[current_arg] == NULL || strcmp(argv[current_arg], "help") == 0) { + if (!argv[current_arg] || !strcmp(argv[current_arg], "help")) { ipmi_vFlash_usage(); return 0; } ipmi_idracvalidator_command(intf); - if (!strncmp(argv[current_arg], "info\0", 5)) { + if (!strcmp(argv[current_arg], "info")) { current_arg++; - if (argv[current_arg] == NULL) { + if (!argv[current_arg]) { ipmi_vFlash_usage(); return -1; - } else if (strncmp(argv[current_arg], "Card\0", 5) == 0) { + } else if (!strcmp(argv[current_arg], "Card")) { current_arg++; - if (argv[current_arg] != NULL) { + if (argv[current_arg]) { ipmi_vFlash_usage(); return -1; } @@ -4052,7 +3985,7 @@ CheckSetLEDSupport(struct ipmi_intf * intf) data[9] = 0x00; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL || rsp->ccode != 0) { + if (!rsp || rsp->ccode) { return; } SetLEDSupported = 1; @@ -4094,10 +4027,10 @@ ipmi_getdrivemap(struct ipmi_intf * intf, int b, int d, int f, int *bay, data[7] = (d << 3) + f; /* devfn */ rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Error issuing getdrivemap command."); return -1; - } else if (rsp->ccode != 0) { + } else if (rsp->ccode) { lprintf(LOG_ERR, "Error issuing getdrivemap command: %s", val2str(rsp->ccode, completion_code_vals)); return -1; @@ -4149,10 +4082,10 @@ ipmi_setled_state(struct ipmi_intf * intf, int bayId, int slotId, int state) data[11] = state >> 8; /* state MSB; */ rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Error issuing setled command."); return -1; - } else if (rsp->ccode != 0) { + } else if (rsp->ccode) { lprintf(LOG_ERR, "Error issuing setled command: %s", val2str(rsp->ccode, completion_code_vals)); return -1; @@ -4217,7 +4150,7 @@ ipmi_delloem_setled_main(struct ipmi_intf * intf, int argc, char ** argv) return -1; } /* ipmitool delloem setled info*/ - if (argc == 1 || strcmp(argv[current_arg], "help") == 0) { + if (argc == 1 || !strcmp(argv[current_arg], "help")) { ipmi_setled_usage(); return 0; } diff --git a/lib/ipmi_ekanalyzer.c b/lib/ipmi_ekanalyzer.c index 7a6c63d..dbc76b4 100644 --- a/lib/ipmi_ekanalyzer.c +++ b/lib/ipmi_ekanalyzer.c @@ -37,10 +37,14 @@ #include <ipmitool/log.h> #include <ipmitool/helper.h> #include <ipmitool/ipmi_strings.h> +#include <ipmitool/ipmi_fru.h> +#include <ipmitool/ipmi_time.h> #include <stdlib.h> #include <string.h> #include <time.h> +#include <fcntl.h> +#include <sys/stat.h> #define NO_MORE_INFO_FIELD 0xc1 #define TYPE_CODE 0xc0 /*Language code*/ @@ -193,7 +197,7 @@ struct ipmi_ek_amc_p2p_connectivity_record{ struct fru_picmgext_amc_channel_desc_record * ch_desc; unsigned char link_desc_count; struct fru_picmgext_amc_link_desc_record * link_desc; - int * matching_result; /*For link descriptor comparision*/ + int * matching_result; /*For link descriptor comparison*/ }; /***************************************************************************** @@ -216,8 +220,7 @@ static void ipmi_ek_add_record2list( struct ipmi_ek_multi_header ** record, struct ipmi_ek_multi_header ** list_last ); static void ipmi_ek_display_record( struct ipmi_ek_multi_header * record, - struct ipmi_ek_multi_header * list_head, - struct ipmi_ek_multi_header * list_last ); + struct ipmi_ek_multi_header * list_head); static void ipmi_ek_remove_record_from_list( struct ipmi_ek_multi_header * record, @@ -234,7 +237,7 @@ static int ipmi_ekanalyzer_fru_file2structure( char * filename, *****************************************************************************/ static int ipmi_ek_matching_process( int * file_type, int index1, int index2, struct ipmi_ek_multi_header ** list_head, - struct ipmi_ek_multi_header ** list_last, char * opt, + char * opt, struct ipmi_ek_multi_header * pphysical ); static int ipmi_ek_get_resource_descriptor( int port_count, int index, @@ -450,11 +453,11 @@ ipmi_ek_get_file_type(char *argument) * * Global: None * -* Return: OK_STATUS as succes or ERROR_STATUS as error +* Return: OK_STATUS as success or ERROR_STATUS as error * ***************************************************************************/ int -ipmi_ekanalyzer_main(struct ipmi_intf *intf, int argc, char **argv) +ipmi_ekanalyzer_main(struct ipmi_intf *__UNUSED__(intf), int argc, char **argv) { int rc = ERROR_STATUS; int file_type[MAX_FILE_NUMBER]; @@ -475,11 +478,12 @@ ipmi_ekanalyzer_main(struct ipmi_intf *intf, int argc, char **argv) return (-1); } - if (strcmp(argv[argument_offset], "help") == 0) { + if (!strcmp(argv[argument_offset], "help")) { ipmi_ekanalyzer_usage(); return 0; - } else if ((strcmp(argv[argument_offset], "frushow") == 0) - && (argc > (MIN_ARGUMENT-1))) { + } else if (!strcmp(argv[argument_offset], "frushow") + && (argc > (MIN_ARGUMENT-1))) + { for (type_offset = 0; type_offset < (argc-1); type_offset++ ) { argument_offset++; file_type[type_offset] = ipmi_ek_get_file_type(argv[argument_offset]); @@ -495,7 +499,7 @@ ipmi_ekanalyzer_main(struct ipmi_intf *intf, int argc, char **argv) */ filename[type_offset] = malloc(strlen(argv[argument_offset]) + 1 - SIZE_OF_FILE_TYPE); - if (filename[type_offset] == NULL) { + if (!filename[type_offset]) { lprintf(LOG_ERR, "malloc failure"); return (-1); } @@ -511,9 +515,9 @@ ipmi_ekanalyzer_main(struct ipmi_intf *intf, int argc, char **argv) /* Convert from binary data into multi record structure */ rc = ipmi_ekanalyzer_fru_file2structure (filename[type_offset], &list_head, &list_record, &list_last ); - ipmi_ek_display_record(list_record, list_head, list_last); + ipmi_ek_display_record(list_record, list_head); /* Remove record of list */ - while (list_head != NULL) { + while (list_head) { ipmi_ek_remove_record_from_list(list_head, &list_head,&list_last ); if (verbose > 1) { @@ -524,8 +528,9 @@ ipmi_ekanalyzer_main(struct ipmi_intf *intf, int argc, char **argv) free(filename[type_offset]); filename[type_offset] = NULL; } - } else if ((strcmp(argv[argument_offset], "print") == 0) - || (strcmp(argv[argument_offset], "summary") == 0)) { + } else if (!strcmp(argv[argument_offset], "print") + || !strcmp(argv[argument_offset], "summary")) + { /* Display help text for corresponding command * if not enough parameters were given. */ @@ -537,7 +542,7 @@ ipmi_ekanalyzer_main(struct ipmi_intf *intf, int argc, char **argv) int filename_size=0; if (argc < MIN_ARGUMENT) { lprintf(LOG_ERR, "Not enough parameters given."); - if (strcmp(argv[argument_offset], "print") == 0) { + if (!strcmp(argv[argument_offset], "print")) { lprintf(LOG_ERR, " ekanalyzer print [carrier/power/all]" " <xx=frufile> <xx=frufile> [xx=frufile]"); @@ -549,18 +554,20 @@ ipmi_ekanalyzer_main(struct ipmi_intf *intf, int argc, char **argv) return ERROR_STATUS; } argument_offset++; - if ((strcmp(argv[argument_offset], "carrier") == 0) - || (strcmp(argv[argument_offset], "power") == 0) - || (strcmp(argv[argument_offset], "all") == 0)) { + if (!strcmp(argv[argument_offset], "carrier") + || !strcmp(argv[argument_offset], "power") + || !strcmp(argv[argument_offset], "all")) + { option = argv[argument_offset]; index ++; argc--; - } else if ((strcmp(argv[argument_offset], "match") == 0) - || ( strcmp(argv[argument_offset], "unmatch") == 0)) { + } else if (!strcmp(argv[argument_offset], "match") + || !strcmp(argv[argument_offset], "unmatch")) + { option = argv[argument_offset]; index ++; argc--; - } else if ( strncmp(&argv[argument_offset][2], "=", 1) == 0) { + } else if ('=' == argv[argument_offset][2]) { /* since the command line must receive xx=filename, * so the position of "=" sign is 2 */ @@ -573,7 +580,7 @@ ipmi_ekanalyzer_main(struct ipmi_intf *intf, int argc, char **argv) option = "invalid"; printf("Invalid option '%s'\n", argv[argument_offset]); argument_offset--; - if (strcmp(argv[0], "print") == 0) { + if (!strcmp(argv[0], "print")) { lprintf (LOG_ERR, " ekanalyzer print [carrier/power/all]" " <xx=frufile> <xx=frufile> [xx=frufile]"); @@ -584,12 +591,12 @@ ipmi_ekanalyzer_main(struct ipmi_intf *intf, int argc, char **argv) } rc = ERROR_STATUS; } - if (strcmp(option, "invalid") != 0) { + if (strcmp(option, "invalid")) { int i=0; for (i = 0; i < (argc-1); i++) { file_type[i] = ipmi_ek_get_file_type (argv[index]); if (file_type[i] == ERROR_STATUS) { - /* display the first 2 charactors (file type) of argument */ + /* display the first 2 characters (file type) of argument */ lprintf(LOG_ERR, "Invalid file type: %c%c\n", argv[index][0], argv[index][1]); @@ -603,7 +610,7 @@ ipmi_ekanalyzer_main(struct ipmi_intf *intf, int argc, char **argv) filename_size = strlen(argv[index]) - SIZE_OF_FILE_TYPE + 1; if (filename_size > 0) { filename[i] = malloc( filename_size ); - if (filename[i] != NULL) { + if (filename[i]) { strcpy(filename[i], &argv[index][SIZE_OF_FILE_TYPE]); } else { lprintf(LOG_ERR, "ipmitool: malloc failure"); @@ -623,7 +630,7 @@ ipmi_ekanalyzer_main(struct ipmi_intf *intf, int argc, char **argv) printf("file name: %s\n", filename[i]); } } - if (strcmp(argv[0], "print") == 0) { + if (!strcmp(argv[0], "print")) { rc = ipmi_ekanalyzer_print((argc-1), option, filename, file_type); } else { @@ -631,7 +638,7 @@ ipmi_ekanalyzer_main(struct ipmi_intf *intf, int argc, char **argv) option, filename, file_type); } for (i = 0; i < (argc-1); i++) { - if (filename[i] != NULL) { + if (filename[i]) { free(filename[i]); filename[i] = NULL; } @@ -674,7 +681,7 @@ ipmi_ekanalyzer_print(int argc, char *opt, char **filename, int *file_type) { int return_value = OK_STATUS; /* Display carrier topology */ - if ((strcmp(opt, "carrier") == 0) || (strcmp(opt, "default") == 0)) { + if (!strcmp(opt, "carrier") || !strcmp(opt, "default")) { tboolean found_flag = FALSE; int index = 0; int index_name[argc]; @@ -714,8 +721,9 @@ ipmi_ekanalyzer_print(int argc, char *opt, char **filename, int *file_type) */ tboolean first_data = TRUE; for (list_record[i] = list_head[i]; - list_record[i] != NULL; - list_record[i] = list_record[i]->next) { + list_record[i]; + list_record[i] = list_record[i]->next) + { if (list_record[i]->data[PICMG_ID_OFFSET] == FRU_AMC_CARRIER_P2P) { if (first_data) { printf("%s\n", STAR_LINE_LIMITER); @@ -724,7 +732,7 @@ ipmi_ekanalyzer_print(int argc, char *opt, char **filename, int *file_type) } return_value = ipmi_ek_display_carrier_connectivity(list_record[i]); } else if (list_record[i]->data[PICMG_ID_OFFSET] == FRU_AMC_CARRIER_INFO) { - /*See AMC.0 specification Table3-3 for mor detail*/ + /*See AMC.0 specification Table3-3 for more detail*/ #define COUNT_OFFSET 6 if (first_data) { printf("From Carrier file: %s\n", filename[index_name[i]]); @@ -737,7 +745,7 @@ ipmi_ekanalyzer_print(int argc, char *opt, char **filename, int *file_type) } /*Destroy the list of record*/ for (i = 0; i < argc; i++) { - while (list_head[i] != NULL) { + while (list_head[i]) { ipmi_ek_remove_record_from_list(list_head[i], &list_head[i], &list_last[i]); } @@ -749,10 +757,10 @@ ipmi_ekanalyzer_print(int argc, char *opt, char **filename, int *file_type) } } } - } else if (strcmp(opt, "power") == 0) { + } else if (!strcmp(opt, "power")) { printf("Print power information\n"); return_value = ipmi_ek_display_power(argc, opt, filename, file_type); - } else if (strcmp(opt, "all") == 0) { + } else if (!strcmp(opt, "all")) { printf("Print all information\n"); return_value = ipmi_ek_display_power(argc, opt, filename, file_type); } else { @@ -787,7 +795,7 @@ ipmi_ek_display_carrier_connectivity(struct ipmi_ek_multi_header *record) int offset = START_DATA_OFFSET; struct fru_picmgext_carrier_p2p_record rsc_desc; struct fru_picmgext_carrier_p2p_descriptor *port_desc; - if (record == NULL) { + if (!record) { lprintf(LOG_ERR, "P2P connectivity record is invalid\n"); return ERROR_STATUS; } @@ -915,14 +923,14 @@ ipmi_ek_display_power( int argc, char * opt, char ** filename, int * file_type ) return_value = ipmi_ekanalyzer_fru_file2structure( filename[num_file], &list_head[num_file], &list_record[num_file], &list_last[num_file]); - if ( list_head[num_file] != NULL ){ + if (list_head[num_file]){ for ( list_record[num_file] = list_head[num_file]; - list_record[num_file] != NULL; - list_record[num_file] = list_record[num_file]->next - ){ - if ( ( strcmp(opt, "all") == 0 ) - && ( file_type[num_file] == ON_CARRIER_FRU_FILE ) - ){ + list_record[num_file]; + list_record[num_file] = list_record[num_file]->next) + { + if (!strcmp(opt, "all") + && file_type[num_file] == ON_CARRIER_FRU_FILE) + { if ( list_record[num_file]->data[PICMG_ID_OFFSET] == FRU_AMC_CARRIER_P2P @@ -989,7 +997,7 @@ ipmi_ek_display_power( int argc, char * opt, char ** filename, int * file_type ) return_value = OK_STATUS; /*Destroy the list of record*/ for ( index = 0; index < argc; index++ ){ - while ( list_head[index] != NULL ){ + while (list_head[index]) { ipmi_ek_remove_record_from_list ( list_head[index], &list_head[index],&list_last[index] ); } @@ -1081,7 +1089,7 @@ ipmi_ekanalyzer_ekeying_match( int argc, char * opt, { tboolean return_value = FALSE; - if ( (strcmp(opt, "carrier") == 0 ) || (strcmp(opt, "power") == 0) ){ + if (!strcmp(opt, "carrier") || !strcmp(opt, "power")) { lprintf(LOG_ERR, " ekanalyzer summary [match/ unmatch/ all]"\ " <xx=frufile> <xx=frufile> [xx=frufile]"); return_value = ERROR_STATUS; @@ -1152,13 +1160,13 @@ ipmi_ekanalyzer_ekeying_match( int argc, char * opt, /*Get Carrier p2p connectivity record for physical check*/ for (num_file=0; num_file < argc; num_file++){ if (file_type[num_file] == ON_CARRIER_FRU_FILE ){ - for ( pcarrier_p2p=list_head[num_file]; - pcarrier_p2p != NULL ; - pcarrier_p2p = pcarrier_p2p->next - ){ - if ( pcarrier_p2p->data[PICMG_ID_OFFSET] - == FRU_AMC_CARRIER_P2P - ){ + for (pcarrier_p2p = list_head[num_file]; + pcarrier_p2p; + pcarrier_p2p = pcarrier_p2p->next) + { + if (FRU_AMC_CARRIER_P2P == + pcarrier_p2p->data[PICMG_ID_OFFSET]) + { break; } } @@ -1185,14 +1193,14 @@ ipmi_ekanalyzer_ekeying_match( int argc, char * opt, } return_value = ipmi_ek_matching_process( file_type, match_pair, num_file, list_head, - list_last, opt, pcarrier_p2p); + opt, pcarrier_p2p); } } } match_pair ++; } for( num_file=0; num_file < argc; num_file++ ){ - if (list_head[num_file] != NULL ){ + if (list_head[num_file]) { ipmi_ek_remove_record_from_list( list_head[num_file], &list_record[num_file], &list_last[num_file]); } @@ -1221,8 +1229,6 @@ ipmi_ekanalyzer_ekeying_match( int argc, char * opt, * index2: position of the second record in the list of the record * ipmi_ek_multi_header ** list_head: pointer to the header of a * linked list that contain FRU multi record -* ipmi_ek_multi_header ** list_last: pointer to the tale of a -* linked list that contain FRU multi record * opt: string that contain display option such as "match", "unmatch", or * "all". * pphysical: a pointer that contain a carrier p2p connectivity record @@ -1238,7 +1244,7 @@ ipmi_ekanalyzer_ekeying_match( int argc, char * opt, ***************************************************************************/ static int ipmi_ek_matching_process( int * file_type, int index1, int index2, struct ipmi_ek_multi_header ** list_head, - struct ipmi_ek_multi_header ** list_last, char * opt, + char * opt, struct ipmi_ek_multi_header * pphysical ) { int result = ERROR_STATUS; @@ -1254,13 +1260,13 @@ static int ipmi_ek_matching_process( int * file_type, int index1, int index2, index2 = index_temp; /*index2 indcate an AMC*/ } /*Calculate record size for Carrier file*/ - for ( record=list_head[index1]; record != NULL;record = record->next ){ + for (record = list_head[index1]; record; record = record->next ){ if ( record->data[PICMG_ID_OFFSET] == FRU_AMC_P2P ){ num_amc_record2++; } } /*Calculate record size for amc file*/ - for ( record=list_head[index2]; record != NULL;record = record->next){ + for (record = list_head[index2]; record; record = record->next){ if ( record->data[PICMG_ID_OFFSET] == FRU_AMC_P2P ){ num_amc_record1++; } @@ -1278,17 +1284,17 @@ static int ipmi_ek_matching_process( int * file_type, int index1, int index2, amc_record2 = malloc ( num_amc_record2 * \ sizeof(struct ipmi_ek_amc_p2p_connectivity_record)); - for (record=list_head[index2]; record != NULL;record = record->next){ + for (record = list_head[index2]; record; record = record->next) { if ( record->data[PICMG_ID_OFFSET] == FRU_AMC_P2P ){ result = ipmi_ek_create_amc_p2p_record( record, &amc_record1[index_record1] ); if (result != ERROR_STATUS){ struct ipmi_ek_multi_header * current_record = NULL; - for ( current_record=list_head[index1]; - current_record != NULL ; - current_record = current_record->next - ){ + for (current_record=list_head[index1]; + current_record; + current_record = current_record->next) + { if ( current_record->data[PICMG_ID_OFFSET] == FRU_AMC_P2P ){ result = ipmi_ek_create_amc_p2p_record( current_record, &amc_record2[index_record2] ); @@ -1358,7 +1364,7 @@ ipmi_ek_check_physical_connectivity( { int return_status = OK_STATUS; - if ( record == NULL ){ + if (!record){ printf("NO Carrier p2p connectivity !\n"); return_status = ERROR_STATUS; } @@ -1423,7 +1429,7 @@ ipmi_ek_check_physical_connectivity( rsc_desc.p2p_count ); } - if ( (port_desc != NULL) && (return_status != ERROR_STATUS) ){ + if (port_desc && return_status != ERROR_STATUS) { int j=0; for ( j = 0; j < rsc_desc.p2p_count; j++ ){ @@ -1450,7 +1456,7 @@ ipmi_ek_check_physical_connectivity( (filetype1 ==(port_desc[j].remote_resource_id &0x0f)) ) ){ - if ( ! (strcmp(option, "unmatch") == 0) ){ + if (strcmp(option, "unmatch")){ printf("%s port %d ==> %s port %d\n", val2str(filetype2, ipmi_ekanalyzer_module_type), record1.ch_desc[index1].lane0port, @@ -1473,7 +1479,7 @@ ipmi_ek_check_physical_connectivity( && (filetype2 == (port_desc[j].remote_resource_id & 0x0f)) ){ - if ( ! (strcmp(option, "unmatch") == 0) ){ + if (strcmp(option, "unmatch")){ printf("%s port %d ==> %s port %d\n", val2str(filetype2, ipmi_ekanalyzer_module_type), record1.ch_desc[index1].lane0port, @@ -1487,7 +1493,7 @@ ipmi_ek_check_physical_connectivity( && (record2.rsc_id == (port_desc[j].remote_resource_id)) ){ - if ( ! (strcmp(option, "unmatch") == 0) ){ + if (strcmp(option, "unmatch")){ printf("%s port %d ==> %s %x port %d\n", val2str(filetype2, ipmi_ekanalyzer_module_type), record1.ch_desc[index1].lane0port, @@ -1523,7 +1529,7 @@ ipmi_ek_check_physical_connectivity( } return_status = ERROR_STATUS; } - if (port_desc != NULL){ + if (port_desc) { free(port_desc); port_desc = NULL; } @@ -1603,10 +1609,10 @@ ipmi_ek_compare_link( struct ipmi_ek_multi_header * physic_record, physic_record, file_type1, file_type2, opt ); if ( result == OK_STATUS ){ /*Display the result if option = match or all*/ - if ( (strcmp( opt, "match" ) == 0) - || (strcmp( opt, "all" ) == 0) - || (strcmp( opt, "default" ) == 0) - ){ + if (!strcmp(opt, "match") + || !strcmp(opt, "all") + || !strcmp(opt, "default")) + { tboolean isOEMtype = FALSE; printf(" Matching Result\n"); isOEMtype = ipmi_ek_display_link_descriptor( file_type1, @@ -1663,10 +1669,10 @@ ipmi_ek_compare_link( struct ipmi_ek_multi_header * physic_record, record1, index_ch_desc1, record2, index_ch_desc2, physic_record, file_type1, file_type2, opt ); if ( result == OK_STATUS ){ - if ( (strcmp( opt, "match" ) == 0) - || (strcmp( opt, "all" ) == 0) - || (strcmp( opt, "default" ) == 0) - ){ + if (!strcmp( opt, "match" ) + || !strcmp(opt, "all") + || !strcmp(opt, "default")) + { tboolean isOEMtype = FALSE; printf(" Matching Result\n"); isOEMtype = ipmi_ek_display_link_descriptor( file_type1, @@ -1694,7 +1700,7 @@ ipmi_ek_compare_link( struct ipmi_ek_multi_header * physic_record, } } - if ( (strcmp(opt, "unmatch") == 0) || (strcmp(opt, "all") == 0) ){ + if (!strcmp(opt, "unmatch") || !strcmp(opt, "all")) { int isOEMtype = FALSE; printf(" Unmatching result\n"); for (index1 = 0; index1 < record1.link_desc_count; index1++){ @@ -1939,12 +1945,12 @@ ipmi_ek_compare_link_descriptor( * * Function name: ipmi_ek_compare_asym * -* Description: This function compares 2 asymetric match of 2 +* Description: This function compares 2 asymmetric match of 2 * amc link descriptors * * Restriction: None * -* Input: asym[COMPARE_CANDIDATE]: Contain 2 asymetric match for comparison +* Input: asym[COMPARE_CANDIDATE]: Contain 2 asymmetric match for comparison * * Output: None * @@ -2055,7 +2061,7 @@ ipmi_ek_compare_number_of_enable_port( * destination (its value = "To"). ( it is set to "" if it is not * a source nor destination * link_desc: AMC link descriptor -* asym: asymetric match +* asym: asymmetric match * * Output: None * @@ -2208,7 +2214,7 @@ ipmi_ek_create_amc_p2p_record(struct ipmi_ek_multi_header *record, int index_oem = 0; amc_record->oem_guid = malloc(amc_record->guid_count * \ sizeof(struct fru_picmgext_guid)); - if (amc_record->oem_guid == NULL) { + if (!amc_record->oem_guid) { return ERROR_STATUS; } for (index_oem = 0; index_oem < amc_record->guid_count; @@ -2238,7 +2244,7 @@ ipmi_ek_create_amc_p2p_record(struct ipmi_ek_multi_header *record, int ch_index = 0; amc_record->ch_desc = malloc((amc_record->ch_count) * \ sizeof(struct fru_picmgext_amc_channel_desc_record)); - if (amc_record->ch_desc == NULL) { + if (!amc_record->ch_desc) { return ERROR_STATUS; } for (ch_index = 0; ch_index < amc_record->ch_count; @@ -2264,7 +2270,7 @@ ipmi_ek_create_amc_p2p_record(struct ipmi_ek_multi_header *record, int i=0; amc_record->link_desc = malloc(amc_record->link_desc_count * \ sizeof(struct fru_picmgext_amc_link_desc_record)); - if (amc_record->link_desc == NULL) { + if (!amc_record->link_desc) { return ERROR_STATUS; } for (i = 0; i< amc_record->link_desc_count; i++) { @@ -2347,7 +2353,7 @@ ipmi_ek_get_resource_descriptor(int port_count, int index, * * Global: None * -* Return: Return OK_STATUS on sucess, ERROR_STATUS on error +* Return: Return OK_STATUS on success, ERROR_STATUS on error * ***************************************************************************/ static int @@ -2358,7 +2364,7 @@ ipmi_ek_display_fru_header(char *filename) int ret = 0; input_file = fopen(filename, "r"); - if (input_file == NULL) { + if (!input_file) { lprintf(LOG_ERR, "File '%s' not found.", filename); return (ERROR_STATUS); } @@ -2413,7 +2419,7 @@ ipmi_ek_display_fru_header_detail(char *filename) FILE *input_file; size_t file_offset = 0; struct fru_header header; - time_t tval; + time_t ts; int ret = 0; unsigned char data = 0; unsigned char lan_code = 0; @@ -2421,7 +2427,7 @@ ipmi_ek_display_fru_header_detail(char *filename) unsigned int board_length = 0; input_file = fopen(filename, "r"); - if (input_file == NULL) { + if (!input_file) { lprintf(LOG_ERR, "File '%s' not found.", filename); return (-1); } @@ -2439,6 +2445,8 @@ ipmi_ek_display_fru_header_detail(char *filename) if (header.offset.internal != 0) { unsigned char format_version; unsigned long len = 0; + uint8_t *area_offset; + uint8_t next_offset = UINT8_MAX; printf("%s\n", EQUAL_LINE_LIMITER); printf("FRU Internal Use Info\n"); @@ -2452,12 +2460,46 @@ ipmi_ek_display_fru_header_detail(char *filename) } printf("Format Version: %d\n", (format_version & 0x0f)); - if (header.offset.chassis > 0) { - len = (header.offset.chassis * FACTOR_OFFSET) - - (header.offset.internal * FACTOR_OFFSET); - } else { - len = (header.offset.board * FACTOR_OFFSET) - - (header.offset.internal * FACTOR_OFFSET); + /* Internal use area doesn't contain the size byte. + * We need to calculate its size by finding the area + * that is next. Areas may not follow the same order + * as their offsets listed in the header, so we need + * to find the area that is physically next to the + * internal use area. + */ + for (area_offset = &header.offset.internal + 1; + area_offset <= &header.offset.multi; + ++area_offset) + { + /* If the area is closer to us than the previously + * checked one, make it our best candidate + */ + if (*area_offset < next_offset + && *area_offset > header.offset.internal) + { + next_offset = *area_offset; + } + } + + /* If there was at least one area after internal use one, + * then we must have found it and can use it to calculate + * length. Otherwise, everything till the end of file is + * internal use area expect for the last (checksum) byte. + */ + if (next_offset < UINT8_MAX) { + len = (next_offset - header.offset.internal) * FACTOR_OFFSET; + --len; /* First byte of internal use area is version and we've + already read it */ + } + else { + struct stat fs; + long curpos = ftell(input_file); + if (curpos < 0 || 0 > fstat(fileno(input_file), &fs)) { + lprintf(LOG_ERR, "Failed to determine FRU file size"); + fclose(input_file); + return -1; + } + len = fs.st_size - curpos - 1; /* Last byte is checksum */ } printf("Length: %ld\n", len); printf("Data dump:\n"); @@ -2541,33 +2583,40 @@ ipmi_ek_display_fru_header_detail(char *filename) fclose(input_file); return (-1); } - tval = ((mfg_date[2] << 16) + (mfg_date[1] << 8) - + (mfg_date[0])); - tval = tval * 60; - tval = tval + secs_from_1970_1996; - printf("Board Mfg Date: %ld, %s", tval, - asctime(localtime(&tval))); + + ts = ipmi_fru2time_t(mfg_date); + printf("Board Mfg Date: %ld, %s\n", + (IPMI_TIME_UNSPECIFIED == ts) + ? FRU_BOARD_DATE_UNSPEC + : ts, + ipmi_timestamp_numeric(ts)); board_length -= SIZE_MFG_DATE; + /* Board Mfg */ file_offset = ipmi_ek_display_board_info_area( input_file, "Board Manufacture Data", &board_length); ret = fseek(input_file, file_offset, SEEK_SET); + /* Board Product */ file_offset = ipmi_ek_display_board_info_area( input_file, "Board Product Name", &board_length); ret = fseek(input_file, file_offset, SEEK_SET); + /* Board Serial */ file_offset = ipmi_ek_display_board_info_area( input_file, "Board Serial Number", &board_length); ret = fseek(input_file, file_offset, SEEK_SET); + /* Board Part */ file_offset = ipmi_ek_display_board_info_area( input_file, "Board Part Number", &board_length); ret = fseek(input_file, file_offset, SEEK_SET); + /* FRU file ID */ file_offset = ipmi_ek_display_board_info_area( input_file, "FRU File ID", &board_length); ret = fseek(input_file, file_offset, SEEK_SET); + /* Additional Custom Mfg. */ file_offset = ipmi_ek_display_board_info_area( input_file, "Custom", &board_length); @@ -2614,7 +2663,7 @@ ipmi_ek_display_chassis_info_area(FILE *input_file, long offset) unsigned char ch_type = 0; unsigned int len; - if (input_file == NULL) { + if (!input_file) { lprintf(LOG_ERR, "No file stream to read."); return (-1); } @@ -2696,12 +2745,18 @@ ipmi_ek_display_board_info_area(FILE *input_file, char *board_type, int ret = 0; unsigned char len = 0; unsigned int size_board = 0; - if (input_file == NULL || board_type == NULL - || board_length == NULL) { + int custom_fields = 0; + if (!input_file || !board_type || !board_length) { return (size_t)(-1); } file_offset = ftell(input_file); + /* + * TODO: This whole file's code is extremely dirty and wicked. + * Must eventually switch to using ipmi_fru.c code or some + * specialized FRU library. + */ + /* Board length*/ ret = fread(&len, 1, 1, input_file); if ((ret != 1) || ferror(input_file)) { @@ -2710,21 +2765,22 @@ ipmi_ek_display_board_info_area(FILE *input_file, char *board_type, } (*board_length)--; - /* Bit 5:0 of Board Mfg type represent legnth */ + /* Bit 5:0 of Board Mfg type represent length */ size_board = (len & 0x3f); if (size_board == 0) { printf("%s: None\n", board_type); goto out; } - if (strncmp(board_type, "Custom", 6 ) != 0) { - unsigned char *data; + if (strcmp(board_type, "Custom")) { + unsigned char *data, *str; unsigned int i = 0; - data = malloc(size_board); - if (data == NULL) { + data = malloc(size_board + 1); /* Make room for type/length field */ + if (!data) { lprintf(LOG_ERR, "ipmitool: malloc failure"); return (size_t)(-1); } - ret = fread(data, size_board, 1, input_file); + data[0] = len; /* Save the type/length byte in 'data' */ + ret = fread(data + 1, size_board, 1, input_file); if ((ret != 1) || ferror(input_file)) { lprintf(LOG_ERR, "Invalid board type size!"); free(data); @@ -2733,17 +2789,11 @@ ipmi_ek_display_board_info_area(FILE *input_file, char *board_type, } printf("%s type: 0x%02x\n", board_type, len); printf("%s: ", board_type); - for (i = 0; i < size_board; i++) { - if ((len & TYPE_CODE) == TYPE_CODE) { - printf("%c", data[i]); - } else { - /* other than language code (binary, BCD, - * ASCII 6 bit...) is not supported - */ - printf("%02x", data[i]); - } - } - printf("\n"); + i = 0; + str = (unsigned char *)get_fru_area_str(data, &i); + printf("%s\n", str); + free(str); + str = NULL; free(data); data = NULL; (*board_length) -= size_board; @@ -2756,7 +2806,12 @@ ipmi_ek_display_board_info_area(FILE *input_file, char *board_type, /* take the rest of data in the area minus 1 byte of * checksum */ - printf("Additional Custom Mfg. length: 0x%02x\n", len); + if (custom_fields) { + printf("End of Custom Mfg. fields (0x%02x)\n", len); + } else { + printf("No Additional Custom Mfg. fields (0x%02x)\n", len); + } + padding = (*board_length) - 1; if ((padding > 0) && (!feof(input_file))) { printf("Unused space: %d (bytes)\n", padding); @@ -2770,36 +2825,47 @@ ipmi_ek_display_board_info_area(FILE *input_file, char *board_type, printf("Checksum: 0x%02x\n", checksum); goto out; } + custom_fields++; printf("Additional Custom Mfg. length: 0x%02x\n", len); if ((size_board > 0) && (size_board < (*board_length))) { - unsigned char * additional_data = NULL; + unsigned char *additional_data, *str; unsigned int i = 0; - additional_data = malloc(size_board); - if (additional_data == NULL) { + additional_data = malloc(size_board + 1); /* Make room for type/length field */ + if (!additional_data) { lprintf(LOG_ERR, "ipmitool: malloc failure"); return (size_t)(-1); } - ret = fread(additional_data, size_board, 1, input_file); + additional_data[0] = len; + ret = fread(additional_data + 1, size_board, 1, input_file); if ((ret != 1) || ferror(input_file)) { lprintf(LOG_ERR, "Invalid Additional Data!"); - if (additional_data != NULL) { + if (additional_data) { free(additional_data); additional_data = NULL; } goto out; } - printf("Additional Custom Mfg. Data: %02x", - additional_data[0]); - for (i = 1; i < size_board; i++) { - printf("-%02x", additional_data[i]); - } - printf("\n"); + printf("Additional Custom Mfg. Data: "); + i = 0; + str = (unsigned char *)get_fru_area_str(additional_data, &i); + printf("%s\n", str); + free(str); + str = NULL; free(additional_data); additional_data = NULL; + (*board_length) -= size_board; + ret = fread(&len, 1, 1, input_file); + if ((ret != 1) || ferror(input_file)) { + lprintf(LOG_ERR, "Invalid Length!"); + goto out; + } + (*board_length)--; + size_board = (len & 0x3f); } else { - printf("No Additional Custom Mfg. %d\n", *board_length); + printf("ERROR: File has insufficient data (%d bytes) for the " + "Additional Custom Mfg. field\n", *board_length); goto out; } } @@ -2838,7 +2904,7 @@ ipmi_ek_display_product_info_area(FILE *input_file, long offset) unsigned char data = 0; unsigned int len = 0; - if (input_file == NULL) { + if (!input_file) { lprintf(LOG_ERR, "No file stream to read."); return (-1); } @@ -2924,7 +2990,6 @@ ipmi_ek_display_product_info_area(FILE *input_file, long offset) * * Input: record: a pointer to current record * list_head: a pointer to header of the list -* list_last: a pointer to tale of the list * * Output: None * @@ -2935,17 +3000,16 @@ ipmi_ek_display_product_info_area(FILE *input_file, long offset) ***************************************************************************/ static void ipmi_ek_display_record(struct ipmi_ek_multi_header *record, - struct ipmi_ek_multi_header *list_head, - struct ipmi_ek_multi_header *list_last) + struct ipmi_ek_multi_header *list_head) { - if (list_head == NULL) { + if (!list_head) { printf("***empty list***\n"); return; } printf("%s\n", EQUAL_LINE_LIMITER); printf("FRU Multi Info area\n"); printf("%s\n", EQUAL_LINE_LIMITER); - for (record = list_head; record != NULL; record = record->next) { + for (record = list_head; record; record = record->next) { printf("Record Type ID: 0x%02x\n", record->header.type); printf("Record Format version: 0x%02x\n", record->header.format); @@ -3398,7 +3462,7 @@ ipmi_ek_display_board_p2p_record(struct ipmi_ek_multi_header *record) printf("ShMC Cross-connect (two-pair)\n"); break; default: - printf("Unknwon\n"); + printf("Unknown\n"); break; } } else if (d->type == FRU_PICMGEXT_LINK_TYPE_FABRIC_ETHERNET) { @@ -3413,17 +3477,17 @@ ipmi_ek_display_board_p2p_record(struct ipmi_ek_multi_header *record) printf("FC-PI\n"); break; default: - printf("Unknwon\n"); + printf("Unknown\n"); break; } } else if (d->type == FRU_PICMGEXT_LINK_TYPE_FABRIC_INFINIBAND) { - printf("Unknwon\n"); + printf("Unknown\n"); } else if (d->type == FRU_PICMGEXT_LINK_TYPE_FABRIC_STAR) { - printf("Unknwon\n"); + printf("Unknown\n"); } else if (d->type == FRU_PICMGEXT_LINK_TYPE_PCIE) { - printf("Unknwon\n"); + printf("Unknown\n"); } else { - printf("Unknwon\n"); + printf("Unknown\n"); } printf("\tLink Type:\t\t0x%02x - ", d->type); if (d->type == 0 || d->type == 0xff) { @@ -4007,7 +4071,7 @@ ipmi_ek_display_clock_config_record(struct ipmi_ek_multi_header *record) * * Restriction: None * -* Input/Ouput: filename1: name of the file that contain FRU binary data +* Input/Output: filename1: name of the file that contain FRU binary data * record: a pointer to current record * list_head: a pointer to header of the list * list_last: a pointer to tale of the list @@ -4031,7 +4095,7 @@ ipmi_ekanalyzer_fru_file2structure(char *filename, int ret = 0; input_file = fopen(filename, "r"); - if (input_file == NULL) { + if (!input_file) { lprintf(LOG_ERR, "File: '%s' is not found", filename); return ERROR_STATUS; } @@ -4058,7 +4122,7 @@ ipmi_ekanalyzer_fru_file2structure(char *filename, fseek(input_file, multi_offset, SEEK_SET); while (!feof(input_file)) { *list_record = malloc(sizeof(struct ipmi_ek_multi_header)); - if (*list_record == NULL) { + if (!(*list_record)) { lprintf(LOG_ERR, "ipmitool: malloc failure"); return ERROR_STATUS; } @@ -4076,7 +4140,7 @@ ipmi_ekanalyzer_fru_file2structure(char *filename, continue; } (*list_record)->data = malloc((*list_record)->header.len); - if ((*list_record)->data == NULL) { + if (!(*list_record)->data) { lprintf(LOG_ERR, "Failed to allocation memory size %d\n", (*list_record)->header.len); record_count++; @@ -4121,7 +4185,7 @@ ipmi_ekanalyzer_fru_file2structure(char *filename, * * Function name: ipmi_ek_add_record2list * -* Description: this function adds a sigle FRU multi record to a linked list of +* Description: this function adds a single FRU multi record to a linked list of * FRU multi record. * * Restriction: None @@ -4140,18 +4204,18 @@ ipmi_ek_add_record2list(struct ipmi_ek_multi_header **record, struct ipmi_ek_multi_header **list_head, struct ipmi_ek_multi_header **list_last) { - if (*list_head == NULL) { - *list_head = *record; - (*record)->prev = NULL; - if (verbose > 2) { - printf("Adding first record to list\n"); - } - } else { + if (*list_head) { (*list_last)->next = *record; (*record)->prev = *list_last; if (verbose > 2) { printf("Add 1 record to list\n"); } + } else { + *list_head = *record; + (*record)->prev = NULL; + if (verbose > 2) { + printf("Adding first record to list\n"); + } } *list_last = *record; (*record)->next = NULL; @@ -4161,7 +4225,7 @@ ipmi_ek_add_record2list(struct ipmi_ek_multi_header **record, * * Function name: ipmi_ek_remove_record_from_list * -* Description: this function removes a sigle FRU multi record from a linked +* Description: this function removes a single FRU multi record from a linked * list of FRU multi record. * * Restriction: None @@ -4180,12 +4244,12 @@ ipmi_ek_remove_record_from_list(struct ipmi_ek_multi_header *record, struct ipmi_ek_multi_header **list_head, struct ipmi_ek_multi_header **list_last) { - if (record->prev == NULL) { + if (!record->prev) { *list_head = record->next; } else { record->prev->next = record->next; } - if (record->next == NULL) { + if (!record->next) { (*list_last) = record->prev; } else { record->next->prev = record->prev; diff --git a/lib/ipmi_event.c b/lib/ipmi_event.c index bc32ae8..df6aa51 100644 --- a/lib/ipmi_event.c +++ b/lib/ipmi_event.c @@ -29,7 +29,6 @@ * LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, * EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. */ -#define _BSD_SOURCE #include <stdlib.h> #include <stdio.h> @@ -53,6 +52,14 @@ #include <ipmitool/ipmi_event.h> #include <ipmitool/ipmi_sdr.h> +static +inline +bool +is_system(const struct channel_info_t *chinfo) +{ + return (IPMI_CHANNEL_MEDIUM_SYSTEM == chinfo->medium + || CH_SYSTEM == chinfo->channel); +} static void ipmi_event_msg_print(struct ipmi_intf * intf, struct platform_event_msg * pmsg) @@ -62,7 +69,8 @@ ipmi_event_msg_print(struct ipmi_intf * intf, struct platform_event_msg * pmsg) memset(&sel_event, 0, sizeof(struct sel_event_record)); sel_event.record_id = 0; - sel_event.sel_type.standard_type.gen_id = 2; + htoipmi16(EVENT_GENERATOR(SMS, 0), + (void *)&sel_event.sel_type.standard_type.gen_id); sel_event.sel_type.standard_type.evm_rev = pmsg->evm_rev; sel_event.sel_type.standard_type.sensor_type = pmsg->sensor_type; @@ -84,36 +92,42 @@ ipmi_send_platform_event(struct ipmi_intf * intf, struct platform_event_msg * em { struct ipmi_rs * rsp; struct ipmi_rq req; - uint8_t rqdata[8]; - uint8_t chmed; + uint8_t rqdata[PLATFORM_EVENT_DATA_LEN_MAX]; + uint8_t *rqdata_start = rqdata; + struct channel_info_t chinfo; memset(&req, 0, sizeof(req)); - memset(rqdata, 0, 8); + memset(rqdata, 0, sizeof(rqdata)); req.msg.netfn = IPMI_NETFN_SE; - req.msg.cmd = 0x02; + req.msg.cmd = IPMI_CMD_PLATFORM_EVENT; req.msg.data = rqdata; + req.msg.data_len = PLATFORM_EVENT_DATA_LEN_NON_SI; - chmed = ipmi_current_channel_medium(intf); - if (chmed == IPMI_CHANNEL_MEDIUM_SYSTEM) { - /* system interface, need extra generator ID */ - req.msg.data_len = 8; - rqdata[0] = 0x41; // As per Fig. 29-2 and Table 5-4 - memcpy(rqdata+1, emsg, sizeof(struct platform_event_msg)); + ipmi_current_channel_info(intf, &chinfo); + if (chinfo.channel == CH_UNKNOWN) { + lprintf(LOG_ERR, "Failed to send the platform event " + "via an unknown channel"); + return -3; } - else { - req.msg.data_len = 7; - memcpy(rqdata, emsg, sizeof(struct platform_event_msg)); + + if (is_system(&chinfo)) { + /* system interface, need extra generator ID, see Fig. 29-2 */ + req.msg.data_len = PLATFORM_EVENT_DATA_LEN_SI; + rqdata[0] = EVENT_GENERATOR(SMS, 0); + rqdata_start++; } + memcpy(rqdata_start, emsg, sizeof(struct platform_event_msg)); + ipmi_event_msg_print(intf, emsg); rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Platform Event Message command failed"); return -1; } - else if (rsp->ccode > 0) { + else if (rsp->ccode) { lprintf(LOG_ERR, "Platform Event Message command failed: %s", val2str(rsp->ccode, completion_code_vals)); return -1; @@ -211,14 +225,14 @@ ipmi_event_find_offset(struct ipmi_intf *intf, uint8_t sensor_type, uint8_t even { const struct ipmi_event_sensor_types *evt; - if (desc == NULL || sensor_type == 0 || event_type == 0) { + if (!desc || sensor_type == 0 || event_type == 0) { return 0x00; } for (evt = ipmi_get_first_event_sensor_type(intf, sensor_type, event_type); - evt != NULL; evt = ipmi_get_next_event_sensor_type(evt)) { - if (evt->desc != NULL && - strncasecmp(desc, evt->desc, __maxlen(desc, evt->desc)) == 0) { + evt; evt = ipmi_get_next_event_sensor_type(evt)) { + if (evt->desc && + strcasecmp(desc, evt->desc) == 0) { return evt->offset; } } @@ -246,7 +260,7 @@ ipmi_event_fromsensor(struct ipmi_intf * intf, char * id, char * state, char * e int off; uint8_t target, lun, channel; - if (id == NULL) { + if (!id) { lprintf(LOG_ERR, "No sensor ID supplied"); return -1; } @@ -254,11 +268,11 @@ ipmi_event_fromsensor(struct ipmi_intf * intf, char * id, char * state, char * e memset(&emsg, 0, sizeof(struct platform_event_msg)); emsg.evm_rev = 0x04; - if (evdir == NULL) + if (!evdir) emsg.event_dir = EVENT_DIR_ASSERT; - else if (strncasecmp(evdir, "assert", 6) == 0) + else if (!strcmp(evdir, "assert")) emsg.event_dir = EVENT_DIR_ASSERT; - else if (strncasecmp(evdir, "deassert", 8) == 0) + else if (!strcmp(evdir, "deassert")) emsg.event_dir = EVENT_DIR_DEASSERT; else { lprintf(LOG_ERR, "Invalid event direction %s. Must be 'assert' or 'deassert'", evdir); @@ -267,7 +281,7 @@ ipmi_event_fromsensor(struct ipmi_intf * intf, char * id, char * state, char * e printf("Finding sensor %s... ", id); sdr = ipmi_sdr_find_sdr_byid(intf, id); - if (sdr == NULL) { + if (!sdr) { printf("not found!\n"); return -1; } @@ -304,7 +318,7 @@ ipmi_event_fromsensor(struct ipmi_intf * intf, char * id, char * state, char * e int hilo = 0; off = 1; - if (state == NULL || strncasecmp(state, "list", 4) == 0) { + if (!state || !strcmp(state, "list")) { printf("Sensor States:\n"); printf(" lnr : Lower Non-Recoverable \n"); printf(" lcr : Lower Critical\n"); @@ -315,12 +329,12 @@ ipmi_event_fromsensor(struct ipmi_intf * intf, char * id, char * state, char * e return -1; } - if (0 != strncasecmp(state, "lnr", 3) && - 0 != strncasecmp(state, "lcr", 3) && - 0 != strncasecmp(state, "lnc", 3) && - 0 != strncasecmp(state, "unc", 3) && - 0 != strncasecmp(state, "ucr", 3) && - 0 != strncasecmp(state, "unr", 3)) + if (0 != strcmp(state, "lnr") && + 0 != strcmp(state, "lcr") && + 0 != strcmp(state, "lnc") && + 0 != strcmp(state, "unc") && + 0 != strcmp(state, "ucr") && + 0 != strcmp(state, "unr")) { lprintf(LOG_ERR, "Invalid threshold identifier %s", state); return -1; @@ -349,11 +363,11 @@ ipmi_event_fromsensor(struct ipmi_intf * intf, char * id, char * state, char * e rsp = ipmi_sdr_get_sensor_thresholds(intf, emsg.sensor_num, target, lun, channel); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Command Get Sensor Thresholds failed: invalid response."); return (-1); - } else if (rsp->ccode != 0) { + } else if (rsp->ccode) { lprintf(LOG_ERR, "Command Get Sensor Thresholds failed: %s", val2str(rsp->ccode, completion_code_vals)); return (-1); @@ -364,7 +378,7 @@ ipmi_event_fromsensor(struct ipmi_intf * intf, char * id, char * state, char * e rsp = ipmi_sdr_get_sensor_hysteresis(intf, emsg.sensor_num, target, lun, channel); - if (rsp != NULL && rsp->ccode == 0) + if (rsp && !rsp->ccode) off = dir ? rsp->data[0] : rsp->data[1]; if (off <= 0) off = 1; @@ -401,7 +415,7 @@ ipmi_event_fromsensor(struct ipmi_intf * intf, char * id, char * state, char * e /* * print list of available states for this sensor */ - if (state == NULL || strncasecmp(state, "list", 4) == 0) { + if (!state || strcasecmp(state, "list") == 0) { print_sensor_states(intf, emsg.sensor_type, emsg.event_type); printf("Sensor State Shortcuts:\n"); for (x = 0; x < sizeof(digi_on)/sizeof(*digi_on); x++) { @@ -412,12 +426,12 @@ ipmi_event_fromsensor(struct ipmi_intf * intf, char * id, char * state, char * e off = 0; for (x = 0; x < sizeof(digi_on)/sizeof(*digi_on); x++) { - if (strncasecmp(state, digi_on[x], strlen(digi_on[x])) == 0) { + if (strcasecmp(state, digi_on[x]) == 0) { emsg.event_data[0] = 1; off = 1; break; } - else if (strncasecmp(state, digi_off[x], strlen(digi_off[x])) == 0) { + else if (strcasecmp(state, digi_off[x]) == 0) { emsg.event_data[0] = 0; off = 1; break; @@ -441,7 +455,7 @@ ipmi_event_fromsensor(struct ipmi_intf * intf, char * id, char * state, char * e /* * print list of available states for this sensor */ - if (state == NULL || strncasecmp(state, "list", 4) == 0) { + if (!state || strcasecmp(state, "list") == 0) { print_sensor_states(intf, emsg.sensor_type, emsg.event_type); return 0; } @@ -461,7 +475,7 @@ ipmi_event_fromsensor(struct ipmi_intf * intf, char * id, char * state, char * e /* * print list of available states for this sensor */ - if (state == NULL || strncasecmp(state, "list", 4) == 0) { + if (!state || strcasecmp(state, "list") == 0) { print_sensor_states(intf, emsg.sensor_type, emsg.event_type); return 0; } @@ -485,43 +499,30 @@ static int ipmi_event_fromfile(struct ipmi_intf * intf, char * file) { FILE * fp; - struct ipmi_rs * rsp; - struct ipmi_rq req; - struct sel_event_record sel_event; - uint8_t rqdata[8]; + /* For ease of filling in from file data */ + union { + struct platform_event_msg emsg; + uint8_t bytes[sizeof(struct platform_event_msg)]; + } __attribute__ ((packed)) rqdata; char buf[1024]; char * ptr, * tok; - int i, j; - uint8_t chmed; int rc = 0; - if (file == NULL) + if (!file) return -1; - memset(rqdata, 0, 8); - - /* setup Platform Event Message command */ - memset(&req, 0, sizeof(req)); - req.msg.netfn = IPMI_NETFN_SE; - req.msg.cmd = 0x02; - req.msg.data = rqdata; - req.msg.data_len = 7; - - chmed = ipmi_current_channel_medium(intf); - if (chmed == IPMI_CHANNEL_MEDIUM_SYSTEM) { - /* system interface, need extra generator ID */ - rqdata[0] = 0x41; // As per Fig. 29-2 and Table 5-4 - req.msg.data_len = 8; - } - fp = ipmi_open_file_read(file); - if (fp == NULL) + if (!fp) return -1; while (feof(fp) == 0) { - if (fgets(buf, 1024, fp) == NULL) + size_t count = 0; + if (!fgets(buf, 1024, fp)) continue; + /* Each line is a new event */ + memset(&rqdata, 0, sizeof(rqdata)); + /* clip off optional comment tail indicated by # */ ptr = strchr(buf, '#'); if (ptr) @@ -541,49 +542,28 @@ ipmi_event_fromfile(struct ipmi_intf * intf, char * file) /* parse the event, 7 bytes with optional comment */ /* 0x00 0x00 0x00 0x00 0x00 0x00 0x00 # event */ - i = 0; tok = strtok(ptr, " "); while (tok) { - if (i == 7) + if (count == sizeof(struct platform_event_msg)) break; - j = i++; - if (chmed == IPMI_CHANNEL_MEDIUM_SYSTEM) - j++; - rqdata[j] = (uint8_t)strtol(tok, NULL, 0); + if (0 > str2uchar(tok, &rqdata.bytes[count])) { + lprintf(LOG_ERR, "Invalid token in file: [%s]", tok); + rc = -1; + break; + } tok = strtok(NULL, " "); + ++count; } - if (i < 7) { + if (count < sizeof(struct platform_event_msg)) { lprintf(LOG_ERR, "Invalid Event: %s", - buf2str(rqdata, sizeof(rqdata))); + buf2str(rqdata.bytes, sizeof(rqdata.bytes))); continue; } - memset(&sel_event, 0, sizeof(struct sel_event_record)); - sel_event.record_id = 0; - sel_event.sel_type.standard_type.gen_id = 2; - - j = (chmed == IPMI_CHANNEL_MEDIUM_SYSTEM) ? 1 : 0; - sel_event.sel_type.standard_type.evm_rev = rqdata[j++]; - sel_event.sel_type.standard_type.sensor_type = rqdata[j++]; - sel_event.sel_type.standard_type.sensor_num = rqdata[j++]; - sel_event.sel_type.standard_type.event_type = rqdata[j] & 0x7f; - sel_event.sel_type.standard_type.event_dir = (rqdata[j++] & 0x80) >> 7; - sel_event.sel_type.standard_type.event_data[0] = rqdata[j++]; - sel_event.sel_type.standard_type.event_data[1] = rqdata[j++]; - sel_event.sel_type.standard_type.event_data[2] = rqdata[j++]; - - ipmi_sel_print_std_entry(intf, &sel_event); - - rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { - lprintf(LOG_ERR, "Platform Event Message command failed"); - rc = -1; - } - else if (rsp->ccode > 0) { - lprintf(LOG_ERR, "Platform Event Message command failed: %s", - val2str(rsp->ccode, completion_code_vals)); - rc = -1; - } + /* Now actually send it, failures will be logged by the sender */ + rc = ipmi_send_platform_event(intf, &rqdata.emsg); + if (IPMI_CC_OK != rc) + break; } fclose(fp); @@ -616,11 +596,11 @@ ipmi_event_main(struct ipmi_intf * intf, int argc, char ** argv) { int rc = 0; - if (argc == 0 || strncmp(argv[0], "help", 4) == 0) { + if (argc == 0 || !strcmp(argv[0], "help")) { ipmi_event_usage(); return 0; } - if (strncmp(argv[0], "file", 4) == 0) { + if (!strcmp(argv[0], "file")) { if (argc < 2) { ipmi_event_usage(); return 0; diff --git a/lib/ipmi_firewall.c b/lib/ipmi_firewall.c index 26bfd30..640a4ad 100644 --- a/lib/ipmi_firewall.c +++ b/lib/ipmi_firewall.c @@ -128,7 +128,7 @@ ipmi_firewall_parse_args(int argc, char ** argv, struct ipmi_function_params * p return -1; } for (i=0; i<argc; i++) { - if (strncmp(argv[i], "channel", 7) == 0 && (++i < argc)) { + if (!strcmp(argv[i], "channel") && (++i < argc)) { uint8_t channel_tmp = 0; if (is_ipmi_channel_num(argv[i], &channel_tmp) != 0) { conv_err = 1; @@ -137,31 +137,31 @@ ipmi_firewall_parse_args(int argc, char ** argv, struct ipmi_function_params * p p->channel = channel_tmp; } } - else if (strncmp(argv[i], "lun", 3) == 0 && (++i < argc)) { + else if (!strcmp(argv[i], "lun") && (++i < argc)) { if (str2int(argv[i], &(p->lun)) != 0) { lprintf(LOG_ERR, "Given lun '%s' is invalid.", argv[i]); conv_err = 1; break; } } - else if (strncmp(argv[i], "force", 5) == 0) { + else if (!strcmp(argv[i], "force")) { p->force = 1; } - else if (strncmp(argv[i], "netfn", 5) == 0 && (++i < argc)) { + else if (!strcmp(argv[i], "netfn") && (++i < argc)) { if (str2int(argv[i], &(p->netfn)) != 0) { lprintf(LOG_ERR, "Given netfn '%s' is invalid.", argv[i]); conv_err = 1; break; } } - else if (strncmp(argv[i], "command", 7) == 0 && (++i < argc)) { + else if (!strcmp(argv[i], "command") && (++i < argc)) { if (str2int(argv[i], &(p->command)) != 0) { lprintf(LOG_ERR, "Given command '%s' is invalid.", argv[i]); conv_err = 1; break; } } - else if (strncmp(argv[i], "subfn", 5) == 0 && (++i < argc)) { + else if (!strcmp(argv[i], "subfn") && (++i < argc)) { if (str2int(argv[i], &(p->subfn)) != 0) { lprintf(LOG_ERR, "Given subfn '%s' is invalid.", argv[i]); conv_err = 1; @@ -235,11 +235,11 @@ _get_netfn_support(struct ipmi_intf * intf, int channel, unsigned char * lun, un req.msg.data_len = 1; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Get NetFn Support command failed"); return -1; } - if (rsp->ccode > 0) { + if (rsp->ccode) { lprintf(LOG_ERR, "Get NetFn Support command failed: %s", val2str(rsp->ccode, completion_code_vals)); return -1; @@ -289,11 +289,11 @@ _get_command_support(struct ipmi_intf * intf, req.msg.data_len = 3; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Get Command Support (LUN=%d, NetFn=%d, op=0) command failed", p->lun, p->netfn); return -1; } - if (rsp->ccode > 0) { + if (rsp->ccode) { lprintf(LOG_ERR, "Get Command Support (LUN=%d, NetFn=%d, op=0) command failed: %s", p->lun, p->netfn, val2str(rsp->ccode, completion_code_vals)); return -1; @@ -316,11 +316,11 @@ _get_command_support(struct ipmi_intf * intf, req.msg.data_len = 3; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Get Command Support (LUN=%d, NetFn=%d, op=1) command failed", p->lun, p->netfn); return -1; } - if (rsp->ccode > 0) { + if (rsp->ccode) { lprintf(LOG_ERR, "Get Command Support (LUN=%d, NetFn=%d, op=1) command failed: %s", p->lun, p->netfn, val2str(rsp->ccode, completion_code_vals)); return -1; @@ -368,11 +368,11 @@ _get_command_configurable(struct ipmi_intf * intf, req.msg.data_len = 3; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Get Configurable Command (LUN=%d, NetFn=%d, op=0) command failed", p->lun, p->netfn); return -1; } - if (rsp->ccode > 0) { + if (rsp->ccode) { lprintf(LOG_ERR, "Get Configurable Command (LUN=%d, NetFn=%d, op=0) command failed: %s", p->lun, p->netfn, val2str(rsp->ccode, completion_code_vals)); return -1; @@ -395,11 +395,11 @@ _get_command_configurable(struct ipmi_intf * intf, req.msg.data_len = 3; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Get Configurable Command (LUN=%d, NetFn=%d, op=1) command failed", p->lun, p->netfn); return -1; } - if (rsp->ccode > 0) { + if (rsp->ccode) { lprintf(LOG_ERR, "Get Configurable Command (LUN=%d, NetFn=%d, op=1) command failed: %s", p->lun, p->netfn, val2str(rsp->ccode, completion_code_vals)); return -1; @@ -447,11 +447,11 @@ _get_command_enables(struct ipmi_intf * intf, req.msg.data_len = 3; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Get Command Enables (LUN=%d, NetFn=%d, op=0) command failed", p->lun, p->netfn); return -1; } - if (rsp->ccode > 0) { + if (rsp->ccode) { lprintf(LOG_ERR, "Get Command Enables (LUN=%d, NetFn=%d, op=0) command failed: %s", p->lun, p->netfn, val2str(rsp->ccode, completion_code_vals)); return -1; @@ -474,11 +474,11 @@ _get_command_enables(struct ipmi_intf * intf, req.msg.data_len = 3; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Get Command Enables (LUN=%d, NetFn=%d, op=1) command failed", p->lun, p->netfn); return -1; } - if (rsp->ccode > 0) { + if (rsp->ccode) { lprintf(LOG_ERR, "Get Command Enables (LUN=%d, NetFn=%d, op=1) command failed: %s", p->lun, p->netfn, val2str(rsp->ccode, completion_code_vals)); return -1; @@ -558,11 +558,11 @@ _set_command_enables(struct ipmi_intf * intf, req.msg.data_len = 19; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Set Command Enables (LUN=%d, NetFn=%d, op=0) command failed", p->lun, p->netfn); return -1; } - if (rsp->ccode > 0) { + if (rsp->ccode) { lprintf(LOG_ERR, "Set Command Enables (LUN=%d, NetFn=%d, op=0) command failed: %s", p->lun, p->netfn, val2str(rsp->ccode, completion_code_vals)); return -1; @@ -579,11 +579,11 @@ _set_command_enables(struct ipmi_intf * intf, req.msg.data_len = 19; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Set Command Enables (LUN=%d, NetFn=%d, op=1) command failed", p->lun, p->netfn); return -1; } - if (rsp->ccode > 0) { + if (rsp->ccode) { lprintf(LOG_ERR, "Set Command Enables (LUN=%d, NetFn=%d, op=1) command failed: %s", p->lun, p->netfn, val2str(rsp->ccode, completion_code_vals)); return -1; @@ -625,11 +625,11 @@ _get_subfn_support(struct ipmi_intf * intf, req.msg.data_len = 4; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Get Command Sub-function Support (LUN=%d, NetFn=%d, command=%d) command failed", p->lun, p->netfn, p->command); return -1; } - if (rsp->ccode > 0) { + if (rsp->ccode) { lprintf(LOG_ERR, "Get Command Sub-function Support (LUN=%d, NetFn=%d, command=%d) command failed: %s", p->lun, p->netfn, p->command, val2str(rsp->ccode, completion_code_vals)); return -1; @@ -672,11 +672,11 @@ _get_subfn_configurable(struct ipmi_intf * intf, req.msg.data_len = 4; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Get Configurable Command Sub-function (LUN=%d, NetFn=%d, command=%d) command failed", p->lun, p->netfn, p->command); return -1; } - if (rsp->ccode > 0) { + if (rsp->ccode) { lprintf(LOG_ERR, "Get Configurable Command Sub-function (LUN=%d, NetFn=%d, command=%d) command failed: %s", p->lun, p->netfn, p->command, val2str(rsp->ccode, completion_code_vals)); return -1; @@ -719,11 +719,11 @@ _get_subfn_enables(struct ipmi_intf * intf, req.msg.data_len = 4; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Get Command Sub-function Enables (LUN=%d, NetFn=%d, command=%d) command failed", p->lun, p->netfn, p->command); return -1; } - if (rsp->ccode > 0) { + if (rsp->ccode) { lprintf(LOG_ERR, "Get Command Sub-function Enables (LUN=%d, NetFn=%d, command=%d) command failed: %s", p->lun, p->netfn, p->command, val2str(rsp->ccode, completion_code_vals)); return -1; @@ -787,11 +787,11 @@ _set_subfn_enables(struct ipmi_intf * intf, req.msg.data_len = 8; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Set Command Sub-function Enables (LUN=%d, NetFn=%d, command=%d) command failed", p->lun, p->netfn, p->command); return -1; } - if (rsp->ccode > 0) { + if (rsp->ccode) { lprintf(LOG_ERR, "Set Command Sub-function Enables (LUN=%d, NetFn=%d, command=%d) command failed: %s", p->lun, p->netfn, p->command, val2str(rsp->ccode, completion_code_vals)); return -1; @@ -888,7 +888,7 @@ static int _gather_info(struct ipmi_intf * intf, struct ipmi_function_params * p /* ipmi_firewall_info - print out info for firewall functions * - * @intf: ipmi inteface + * @intf: ipmi interface * @argc: argument count * @argv: argument list * @@ -903,7 +903,7 @@ ipmi_firewall_info(struct ipmi_intf * intf, int argc, char ** argv) struct bmc_fn_support * bmc_fn_support; unsigned int l, n, c; - if ((argc > 0 && strncmp(argv[0], "help", 4) == 0) || ipmi_firewall_parse_args(argc, argv, &p) < 0) + if ((argc > 0 && !strcmp(argv[0], "help")) || ipmi_firewall_parse_args(argc, argv, &p) < 0) { printf_firewall_info_usage(); return 0; @@ -1001,7 +1001,7 @@ ipmi_firewall_info(struct ipmi_intf * intf, int argc, char ** argv) /* ipmi_firewall_enable_disable - enable/disable BMC functions * - * @intf: ipmi inteface + * @intf: ipmi interface * @enable: whether to enable or disable * @argc: argument count * @argv: argument list @@ -1018,7 +1018,7 @@ ipmi_firewall_enable_disable(struct ipmi_intf * intf, int enable, int argc, char unsigned int l, n, c; unsigned char enables[MAX_COMMAND_BYTES]; - if (argc < 1 || strncmp(argv[0], "help", 4) == 0) { + if (argc < 1 || !strcmp(argv[0], "help")) { char * s1 = enable?"en":"dis"; char * s2 = enable?"":" [force]"; printf("%sable [channel H] lun L netfn N%s\n", s1, s2); @@ -1055,7 +1055,7 @@ ipmi_firewall_enable_disable(struct ipmi_intf * intf, int enable, int argc, char c = p.command; if (p.subfn >= 0) { // firewall (en|dis)able [channel c] lun l netfn n command m subfn s - // (en|dis)able this sub-function for this commnad on this lun/netfn pair + // (en|dis)able this sub-function for this command on this lun/netfn pair memcpy(enables, bmc_fn_support->lun[l].netfn[n].command[c].subfn_enable, MAX_SUBFN_BYTES); @@ -1065,7 +1065,7 @@ ipmi_firewall_enable_disable(struct ipmi_intf * intf, int enable, int argc, char } else if (p.command >= 0) { // firewall (en|dis)able [channel c] lun l netfn n command m - // (en|dis)able all subfn and command for this commnad on this lun/netfn pair + // (en|dis)able all subfn and command for this command on this lun/netfn pair memset(enables, enable?0xff:0, MAX_SUBFN_BYTES); ret = _set_subfn_enables(intf, &p, &bmc_fn_support->lun[l].netfn[n].command[c], enables); @@ -1076,14 +1076,14 @@ ipmi_firewall_enable_disable(struct ipmi_intf * intf, int enable, int argc, char &bmc_fn_support->lun[l].netfn[n], enables, p.force); } else if (p.netfn >= 0) { // firewall (en|dis)able [channel c] lun l netfn n - // (en|dis)able all commnads on this lun/netfn pair + // (en|dis)able all command on this lun/netfn pair memset(enables, enable?0xff:0, sizeof(enables)); ret = _set_command_enables(intf, &p, &bmc_fn_support->lun[l].netfn[n], enables, p.force); /* } else if (p.lun >= 0) { // firewall (en|dis)able [channel c] lun l - // (en|dis)able all commnads on all netfn pairs for this lun + // (en|dis)able all command on all netfn pairs for this lun */ } free(bmc_fn_support); @@ -1093,7 +1093,7 @@ ipmi_firewall_enable_disable(struct ipmi_intf * intf, int enable, int argc, char /* ipmi_firewall_reset - reset firmware firewall to enable everything * - * @intf: ipmi inteface + * @intf: ipmi interface * @argc: argument count * @argv: argument list * @@ -1113,7 +1113,7 @@ ipmi_firewall_reset(struct ipmi_intf * intf, int argc, char ** argv) lprintf(LOG_ERR, "Not enough parameters given."); printf_firewall_usage(); return (-1); - } else if (argc > 0 && strncmp(argv[0], "help", 4) == 0) { + } else if (argc > 0 && !strcmp(argv[0], "help")) { printf_firewall_usage(); return 0; } @@ -1171,19 +1171,19 @@ ipmi_firewall_main(struct ipmi_intf * intf, int argc, char ** argv) { int rc = 0; - if (argc < 1 || strncmp(argv[0], "help", 4) == 0) { + if (argc < 1 || !strcmp(argv[0], "help")) { printf_firewall_usage(); } - else if (strncmp(argv[0], "info", 4) == 0) { + else if (!strcmp(argv[0], "info")) { rc = ipmi_firewall_info(intf, argc-1, &(argv[1])); } - else if (strncmp(argv[0], "enable", 6) == 0) { + else if (!strcmp(argv[0], "enable")) { rc = ipmi_firewall_enable_disable(intf, 1, argc-1, &(argv[1])); } - else if (strncmp(argv[0], "disable", 7) == 0) { + else if (!strcmp(argv[0], "disable")) { rc = ipmi_firewall_enable_disable(intf, 0, argc-1, &(argv[1])); } - else if (strncmp(argv[0], "reset", 5) == 0) { + else if (!strcmp(argv[0], "reset")) { rc = ipmi_firewall_reset(intf, argc-1, &(argv[1])); } else { diff --git a/lib/ipmi_fru.c b/lib/ipmi_fru.c index cf00eff..3d1d8a1 100644 --- a/lib/ipmi_fru.c +++ b/lib/ipmi_fru.c @@ -33,12 +33,15 @@ #include <ipmitool/ipmi.h> #include <ipmitool/log.h> #include <ipmitool/helper.h> +#include <ipmitool/ipmi_cc.h> #include <ipmitool/ipmi_intf.h> #include <ipmitool/ipmi_fru.h> #include <ipmitool/ipmi_mc.h> #include <ipmitool/ipmi_sdr.h> #include <ipmitool/ipmi_strings.h> /* IANA id strings */ +#include <ipmitool/ipmi_time.h> +#include <stdbool.h> #include <stdlib.h> #include <string.h> #include <time.h> @@ -49,6 +52,7 @@ #endif #define FRU_MULTIREC_CHUNK_SIZE (255 + sizeof(struct fru_multirec_header)) +#define FRU_FIELD_VALID(a) (a && a[0]) static const char *section_id[4] = { "Internal Use Section", @@ -57,16 +61,56 @@ static const char *section_id[4] = { "Product Section" }; +static const char * combined_voltage_desc[] = { + "12 V", + "-12 V", + "5 V", + "3.3 V" +}; + +static const char * chassis_type_desc[] = { + "Unspecified", + "Other", + "Unknown", + "Desktop", + "Low Profile Desktop", + "Pizza Box", + "Mini Tower", + "Tower", + "Portable", + "LapTop", + "Notebook", + "Hand Held", + "Docking Station", + "All in One", + "Sub Notebook", + "Space-saving", + "Lunch Box", + "Main Server Chassis", + "Expansion Chassis", + "SubChassis", + "Bus Expansion Chassis", + "Peripheral Chassis", + "RAID Chassis", + "Rack Mount Chassis", + "Sealed-case PC", + "Multi-system Chassis", + "CompactPCI", + "AdvancedTCA", + "Blade", + "Blade Enclosure" +}; + +static inline bool fru_cc_rq2big(int code) { + return (code == IPMI_CC_REQ_DATA_INV_LENGTH + || code == IPMI_CC_REQ_DATA_FIELD_EXCEED + || code == IPMI_CC_CANT_RET_NUM_REQ_BYTES); +} + /* From lib/dimm_spd.c: */ int ipmi_spd_print_fru(struct ipmi_intf * intf, uint8_t id); -/* From src/plugins/ipmi_intf.c: */ -void -ipmi_intf_set_max_request_data_size(struct ipmi_intf * intf, uint16_t size); -void -ipmi_intf_set_max_response_data_size(struct ipmi_intf * intf, uint16_t size); - extern int verbose; static void ipmi_fru_read_to_bin(struct ipmi_intf * intf, char * pFileName, uint8_t fruId); @@ -107,7 +151,7 @@ char * get_fru_area_str(uint8_t * data, uint32_t * offset) { static const char bcd_plus[] = "0123456789 -.:,_"; char * str; - int len, off, size, i, j, k, typecode; + int len, off, size, i, j, k, typecode, char_idx; union { uint32_t bits; char chars[4]; @@ -126,15 +170,15 @@ char * get_fru_area_str(uint8_t * data, uint32_t * offset) switch (typecode) { case 0: /* 00b: binary/unspecified */ - /* hex dump -> 2x length */ - size = (len*2); + case 1: /* 01b: BCD plus */ + /* hex dump or BCD -> 2x length */ + size = (len * 2); break; case 2: /* 10b: 6-bit ASCII */ - /* 4 chars per group of 1-3 bytes */ - size = ((((len+2)*4)/3) & ~3); + /* 4 chars per group of 1-3 bytes, round up to 4 bytes boundary */ + size = (len / 3 + 1) * 4; break; case 3: /* 11b: 8-bit ASCII */ - case 1: /* 01b: BCD plus */ /* no length adjustment */ size = len; break; @@ -145,11 +189,11 @@ char * get_fru_area_str(uint8_t * data, uint32_t * offset) return NULL; } str = malloc(size+1); - if (str == NULL) + if (!str) return NULL; memset(str, 0, size+1); - if (len == 0) { + if (size == 0) { str[0] = '\0'; *offset = off; return str; @@ -157,30 +201,30 @@ char * get_fru_area_str(uint8_t * data, uint32_t * offset) switch (typecode) { case 0: /* Binary */ - strncpy(str, buf2str(&data[off], len), len*2); + strncpy(str, buf2str(&data[off], len), size); break; case 1: /* BCD plus */ - for (k=0; k<len; k++) - str[k] = bcd_plus[(data[off+k] & 0x0f)]; + for (k = 0; k < size; k++) + str[k] = bcd_plus[((data[off + k / 2] >> ((k % 2) ? 0 : 4)) & 0x0f)]; str[k] = '\0'; break; case 2: /* 6-bit ASCII */ - for (i=j=0; i<len; i+=3) { + for (i = j = 0; i < len; i += 3) { u.bits = 0; - k = ((len-i) < 3 ? (len-i) : 3); + k = ((len - i) < 3 ? (len - i) : 3); #if WORDS_BIGENDIAN u.chars[3] = data[off+i]; u.chars[2] = (k > 1 ? data[off+i+1] : 0); u.chars[1] = (k > 2 ? data[off+i+2] : 0); -#define CHAR_IDX 3 + char_idx = 3; #else memcpy((void *)&u.bits, &data[off+i], k); -#define CHAR_IDX 0 + char_idx = 0; #endif for (k=0; k<4; k++) { - str[j++] = ((u.chars[CHAR_IDX] & 0x3f) + 0x20); + str[j++] = ((u.chars[char_idx] & 0x3f) + 0x20); u.bits >>= 6; } } @@ -188,8 +232,8 @@ char * get_fru_area_str(uint8_t * data, uint32_t * offset) break; case 3: - memcpy(str, &data[off], len); - str[len] = '\0'; + memcpy(str, &data[off], size); + str[size] = '\0'; break; } @@ -204,26 +248,26 @@ char * get_fru_area_str(uint8_t * data, uint32_t * offset) * input_filename - user input string * * returns 0 if path is ok - * returns (-1) if path is NULL - * returns (-2) if path is too short - * returns (-3) if path is too long + * returns -1 if path is NULL + * returns -2 if path is too short + * returns -3 if path is too long */ int is_valid_filename(const char *input_filename) { - if (input_filename == NULL) { + if (!input_filename) { lprintf(LOG_ERR, "ERROR: NULL pointer passed."); - return (-1); + return -1; } if (strlen(input_filename) < 1) { lprintf(LOG_ERR, "File/path is invalid."); - return (-2); + return -2; } if (strlen(input_filename) >= 512) { lprintf(LOG_ERR, "File/path must be shorter than 512 bytes."); - return (-3); + return -3; } return 0; @@ -271,12 +315,12 @@ build_fru_bloc(struct ipmi_intf * intf, struct fru_info *fru, uint8_t id) rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, " Device not present (No Response)"); return NULL; } - if (rsp->ccode > 0) { + if (rsp->ccode) { lprintf(LOG_ERR," Device not present (%s)", val2str(rsp->ccode, completion_code_vals)); return NULL; @@ -428,11 +472,15 @@ free_fru_bloc(t_ipmi_fru_bloc *bloc) while (bloc) { del = bloc; bloc = bloc->next; - free(del); - del = NULL; + free_n(&del); } } +/* By how many bytes to reduce a write command on a size failure. */ +#define FRU_BLOCK_SZ 8 +/* Baseline for a large enough piece to reduce via steps instead of bytes. */ +#define FRU_AREA_MAXIMUM_BLOCK_SZ 32 + /* * write FRU[doffset:length] from the pFrubuf[soffset:length] * rc=1 on success @@ -458,7 +506,7 @@ write_fru_area(struct ipmi_intf * intf, struct fru_info *fru, uint8_t id, if (fru->access && ((doffset & 1) || (length & 1))) { lprintf(LOG_ERROR, "Odd offset or length specified"); - return (-1); + return -1; } t_ipmi_fru_bloc * fru_bloc = build_fru_bloc(intf, fru, id); @@ -554,20 +602,20 @@ write_fru_area(struct ipmi_intf * intf, struct fru_info *fru, uint8_t id, break; } - if (rsp->ccode == 0xc7 || rsp->ccode == 0xc8 || rsp->ccode == 0xca) { - if (fru->max_write_size > 8) { - fru->max_write_size -= 8; + if (fru_cc_rq2big(rsp->ccode)) { + if (fru->max_write_size > FRU_AREA_MAXIMUM_BLOCK_SZ) { + fru->max_write_size -= FRU_BLOCK_SZ; lprintf(LOG_INFO, "Retrying FRU write with request size %d", fru->max_write_size); continue; } - } else if(rsp->ccode == 0x80) { - rsp->ccode = 0; + } else if (rsp->ccode == IPMI_CC_FRU_WRITE_PROTECTED_OFFSET) { + rsp->ccode = IPMI_CC_OK; // Write protected section protected_bloc = 1; } - if (rsp->ccode > 0) + if (rsp->ccode) break; if (protected_bloc == 0) { @@ -615,7 +663,10 @@ int read_fru_area(struct ipmi_intf * intf, struct fru_info *fru, uint8_t id, uint32_t offset, uint32_t length, uint8_t *frubuf) { - uint32_t off = offset, tmp, finish; + uint32_t off = offset; + uint32_t tmp; + uint32_t finish; + uint32_t size_left_in_buffer; struct ipmi_rs * rsp; struct ipmi_rq req; uint8_t msg_data[4]; @@ -628,10 +679,12 @@ read_fru_area(struct ipmi_intf * intf, struct fru_info *fru, uint8_t id, finish = offset + length; if (finish > fru->size) { + memset(frubuf + fru->size, 0, length - fru->size); finish = fru->size; lprintf(LOG_NOTICE, "Read FRU Area length %d too large, " "Adjusting to %d", offset + length, finish - offset); + length = finish - offset; } memset(&req, 0, sizeof(req)); @@ -667,6 +720,7 @@ read_fru_area(struct ipmi_intf * intf, struct fru_info *fru, uint8_t id, } } + size_left_in_buffer = length; do { tmp = fru->access ? off >> 1 : off; msg_data[0] = id; @@ -679,18 +733,19 @@ read_fru_area(struct ipmi_intf * intf, struct fru_info *fru, uint8_t id, msg_data[3] = (uint8_t)tmp; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_NOTICE, "FRU Read failed"); break; } - if (rsp->ccode > 0) { + if (rsp->ccode) { /* if we get C7h or C8h or CAh return code then we requested too * many bytes at once so try again with smaller size */ - if ((rsp->ccode == 0xc7 || rsp->ccode == 0xc8 || rsp->ccode == 0xca) - && fru->max_read_size > 8) { - if (fru->max_read_size > 32) { + if (fru_cc_rq2big(rsp->ccode) + && fru->max_read_size > FRU_BLOCK_SZ) + { + if (fru->max_read_size > FRU_AREA_MAXIMUM_BLOCK_SZ) { /* subtract read length more aggressively */ - fru->max_read_size -= 8; + fru->max_read_size -= FRU_BLOCK_SZ; } else { /* subtract length less aggressively */ fru->max_read_size--; @@ -707,9 +762,18 @@ read_fru_area(struct ipmi_intf * intf, struct fru_info *fru, uint8_t id, } tmp = fru->access ? rsp->data[0] << 1 : rsp->data[0]; + if(rsp->data_len < 1 + || tmp > rsp->data_len - 1 + || tmp > size_left_in_buffer) + { + printf(" Not enough buffer size"); + return -1; + } + memcpy(frubuf, rsp->data + 1, tmp); off += tmp; frubuf += tmp; + size_left_in_buffer -= tmp; /* sometimes the size returned in the Info command * is too large. return 0 so higher level function * still attempts to parse what was returned */ @@ -742,7 +806,9 @@ read_fru_area_section(struct ipmi_intf * intf, struct fru_info *fru, uint8_t id, uint32_t offset, uint32_t length, uint8_t *frubuf) { static uint32_t fru_data_rqst_size = 20; - uint32_t off = offset, tmp, finish; + uint32_t off = offset; + uint32_t tmp, finish; + uint32_t size_left_in_buffer; struct ipmi_rs * rsp; struct ipmi_rq req; uint8_t msg_data[4]; @@ -755,10 +821,12 @@ read_fru_area_section(struct ipmi_intf * intf, struct fru_info *fru, uint8_t id, finish = offset + length; if (finish > fru->size) { + memset(frubuf + fru->size, 0, length - fru->size); finish = fru->size; lprintf(LOG_NOTICE, "Read FRU Area length %d too large, " "Adjusting to %d", offset + length, finish - offset); + length = finish - offset; } memset(&req, 0, sizeof(req)); @@ -773,6 +841,8 @@ read_fru_area_section(struct ipmi_intf * intf, struct fru_info *fru, uint8_t id, if (fru->access && fru_data_rqst_size > 16) #endif fru_data_rqst_size = 16; + + size_left_in_buffer = length; do { tmp = fru->access ? off >> 1 : off; msg_data[0] = id; @@ -785,16 +855,16 @@ read_fru_area_section(struct ipmi_intf * intf, struct fru_info *fru, uint8_t id, msg_data[3] = (uint8_t)tmp; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_NOTICE, "FRU Read failed"); break; } - if (rsp->ccode > 0) { + if (rsp->ccode) { /* if we get C7 or C8 or CA return code then we requested too * many bytes at once so try again with smaller size */ - if ((rsp->ccode == 0xc7 || rsp->ccode == 0xc8 || rsp->ccode == 0xca) && - (--fru_data_rqst_size > 8)) { - lprintf(LOG_INFO, "Retrying FRU read with request size %d", + if (fru_cc_rq2big(rsp->ccode) && (--fru_data_rqst_size > FRU_BLOCK_SZ)) { + lprintf(LOG_INFO, + "Retrying FRU read with request size %d", fru_data_rqst_size); continue; } @@ -804,8 +874,16 @@ read_fru_area_section(struct ipmi_intf * intf, struct fru_info *fru, uint8_t id, } tmp = fru->access ? rsp->data[0] << 1 : rsp->data[0]; + if(rsp->data_len < 1 + || tmp > rsp->data_len - 1 + || tmp > size_left_in_buffer) + { + printf(" Not enough buffer size"); + return -1; + } memcpy((frubuf + off)-offset, rsp->data + 1, tmp); off += tmp; + size_left_in_buffer -= tmp; /* sometimes the size returned in the Info command * is too large. return 0 so higher level function @@ -834,7 +912,7 @@ fru_area_print_multirec_bloc(struct ipmi_intf * intf, struct fru_info * fru, i = last_off = offset; fru_data = malloc(fru->size + 1); - if (fru_data == NULL) { + if (!fru_data) { lprintf(LOG_ERR, " Out of memory!"); return; } @@ -878,8 +956,7 @@ fru_area_print_multirec_bloc(struct ipmi_intf * intf, struct fru_info * fru, lprintf(LOG_DEBUG ,"Multi-Record area ends at: %i (%xh)",i,i); - free(fru_data); - fru_data = NULL; + free_n(&fru_data); } @@ -898,6 +975,7 @@ fru_area_print_chassis(struct ipmi_intf * intf, struct fru_info * fru, uint8_t * fru_data; uint32_t fru_len, i; uint8_t tmp[2]; + size_t chassis_type; fru_len = 0; @@ -911,7 +989,7 @@ fru_area_print_chassis(struct ipmi_intf * intf, struct fru_info * fru, } fru_data = malloc(fru_len); - if (fru_data == NULL) { + if (!fru_data) { lprintf(LOG_ERR, "ipmitool: malloc failure"); return; } @@ -920,8 +998,7 @@ fru_area_print_chassis(struct ipmi_intf * intf, struct fru_info * fru, /* read in the full fru */ if (read_fru_area(intf, fru, id, offset, fru_len, fru_data) < 0) { - free(fru_data); - fru_data = NULL; + free_n(&fru_data); return; } @@ -931,42 +1008,38 @@ fru_area_print_chassis(struct ipmi_intf * intf, struct fru_info * fru, */ i = 2; - printf(" Chassis Type : %s\n", - chassis_type_desc[fru_data[i] > - (sizeof(chassis_type_desc)/sizeof(chassis_type_desc[0])) - 1 ? - 2 : fru_data[i]]); + chassis_type = (fru_data[i] > ARRAY_SIZE(chassis_type_desc) - 1) + ? 2 + : fru_data[i]; + printf(" Chassis Type : %s\n", chassis_type_desc[chassis_type]); i++; fru_area = get_fru_area_str(fru_data, &i); - if (fru_area != NULL) { + if (fru_area) { if (strlen(fru_area) > 0) { printf(" Chassis Part Number : %s\n", fru_area); } - free(fru_area); - fru_area = NULL; + free_n(&fru_area); } fru_area = get_fru_area_str(fru_data, &i); - if (fru_area != NULL) { + if (fru_area) { if (strlen(fru_area) > 0) { printf(" Chassis Serial : %s\n", fru_area); } - free(fru_area); - fru_area = NULL; + free_n(&fru_area); } /* read any extra fields */ - while ((fru_data[i] != 0xc1) && (i < fru_len)) - { + while ((i < fru_len) && (fru_data[i] != FRU_END_OF_FIELDS)) { int j = i; fru_area = get_fru_area_str(fru_data, &i); - if (fru_area != NULL) { + if (fru_area) { if (strlen(fru_area) > 0) { printf(" Chassis Extra : %s\n", fru_area); } - free(fru_area); - fru_area = NULL; + free_n(&fru_area); } if (i == j) { @@ -974,10 +1047,7 @@ fru_area_print_chassis(struct ipmi_intf * intf, struct fru_info * fru, } } - if (fru_data != NULL) { - free(fru_data); - fru_data = NULL; - } + free_n(&fru_data); } /* fru_area_print_board - Print FRU Board Area @@ -995,7 +1065,7 @@ fru_area_print_board(struct ipmi_intf * intf, struct fru_info * fru, uint8_t * fru_data; uint32_t fru_len; uint32_t i; - time_t tval; + time_t ts; uint8_t tmp[2]; fru_len = 0; @@ -1010,7 +1080,7 @@ fru_area_print_board(struct ipmi_intf * intf, struct fru_info * fru, } fru_data = malloc(fru_len); - if (fru_data == NULL) { + if (!fru_data) { lprintf(LOG_ERR, "ipmitool: malloc failure"); return; } @@ -1019,8 +1089,7 @@ fru_area_print_board(struct ipmi_intf * intf, struct fru_info * fru, /* read in the full fru */ if (read_fru_area(intf, fru, id, offset, fru_len, fru_data) < 0) { - free(fru_data); - fru_data = NULL; + free_n(&fru_data); return; } @@ -1031,77 +1100,65 @@ fru_area_print_board(struct ipmi_intf * intf, struct fru_info * fru, */ i = 3; - tval=((fru_data[i+2] << 16) + (fru_data[i+1] << 8) + (fru_data[i])); - tval=tval * 60; - tval=tval + secs_from_1970_1996; - printf(" Board Mfg Date : %s", asctime(localtime(&tval))); + ts = ipmi_fru2time_t(&fru_data[i]); + printf(" Board Mfg Date : %s\n", ipmi_timestamp_string(ts)); i += 3; /* skip mfg. date time */ fru_area = get_fru_area_str(fru_data, &i); - if (fru_area != NULL) { + if (fru_area) { if (strlen(fru_area) > 0) { printf(" Board Mfg : %s\n", fru_area); } - free(fru_area); - fru_area = NULL; + free_n(&fru_area); } fru_area = get_fru_area_str(fru_data, &i); - if (fru_area != NULL) { + if (fru_area) { if (strlen(fru_area) > 0) { printf(" Board Product : %s\n", fru_area); } - free(fru_area); - fru_area = NULL; + free_n(&fru_area); } fru_area = get_fru_area_str(fru_data, &i); - if (fru_area != NULL) { + if (fru_area) { if (strlen(fru_area) > 0) { printf(" Board Serial : %s\n", fru_area); } - free(fru_area); - fru_area = NULL; + free_n(&fru_area); } fru_area = get_fru_area_str(fru_data, &i); - if (fru_area != NULL) { + if (fru_area) { if (strlen(fru_area) > 0) { printf(" Board Part Number : %s\n", fru_area); } - free(fru_area); - fru_area = NULL; + free_n(&fru_area); } fru_area = get_fru_area_str(fru_data, &i); - if (fru_area != NULL) { + if (fru_area) { if (strlen(fru_area) > 0 && verbose > 0) { printf(" Board FRU ID : %s\n", fru_area); } - free(fru_area); - fru_area = NULL; + free_n(&fru_area); } /* read any extra fields */ - while ((fru_data[i] != 0xc1) && (i < fru_len)) - { + while ((i < fru_len) && (fru_data[i] != FRU_END_OF_FIELDS)) { int j = i; fru_area = get_fru_area_str(fru_data, &i); - if (fru_area != NULL) { + if (fru_area) { if (strlen(fru_area) > 0) { printf(" Board Extra : %s\n", fru_area); } - free(fru_area); - fru_area = NULL; + free_n(&fru_area); } if (i == j) break; } - if (fru_data != NULL) { - free(fru_data); - fru_data = NULL; - } + free_n(&fru_data); } /* fru_area_print_product - Print FRU Product Area @@ -1132,7 +1189,7 @@ fru_area_print_product(struct ipmi_intf * intf, struct fru_info * fru, } fru_data = malloc(fru_len); - if (fru_data == NULL) { + if (!fru_data) { lprintf(LOG_ERR, "ipmitool: malloc failure"); return; } @@ -1142,8 +1199,7 @@ fru_area_print_product(struct ipmi_intf * intf, struct fru_info * fru, /* read in the full fru */ if (read_fru_area(intf, fru, id, offset, fru_len, fru_data) < 0) { - free(fru_data); - fru_data = NULL; + free_n(&fru_data); return; } @@ -1155,88 +1211,76 @@ fru_area_print_product(struct ipmi_intf * intf, struct fru_info * fru, i = 3; fru_area = get_fru_area_str(fru_data, &i); - if (fru_area != NULL) { + if (fru_area) { if (strlen(fru_area) > 0) { printf(" Product Manufacturer : %s\n", fru_area); } - free(fru_area); - fru_area = NULL; + free_n(&fru_area); } fru_area = get_fru_area_str(fru_data, &i); - if (fru_area != NULL) { + if (fru_area) { if (strlen(fru_area) > 0) { printf(" Product Name : %s\n", fru_area); } - free(fru_area); - fru_area = NULL; + free_n(&fru_area); } fru_area = get_fru_area_str(fru_data, &i); - if (fru_area != NULL) { + if (fru_area) { if (strlen(fru_area) > 0) { printf(" Product Part Number : %s\n", fru_area); } - free(fru_area); - fru_area = NULL; + free_n(&fru_area); } fru_area = get_fru_area_str(fru_data, &i); - if (fru_area != NULL) { + if (fru_area) { if (strlen(fru_area) > 0) { printf(" Product Version : %s\n", fru_area); } - free(fru_area); - fru_area = NULL; + free_n(&fru_area); } fru_area = get_fru_area_str(fru_data, &i); - if (fru_area != NULL) { + if (fru_area) { if (strlen(fru_area) > 0) { printf(" Product Serial : %s\n", fru_area); } - free(fru_area); - fru_area = NULL; + free_n(&fru_area); } fru_area = get_fru_area_str(fru_data, &i); - if (fru_area != NULL) { + if (fru_area) { if (strlen(fru_area) > 0) { printf(" Product Asset Tag : %s\n", fru_area); } - free(fru_area); - fru_area = NULL; + free_n(&fru_area); } fru_area = get_fru_area_str(fru_data, &i); - if (fru_area != NULL) { + if (fru_area) { if (strlen(fru_area) > 0 && verbose > 0) { printf(" Product FRU ID : %s\n", fru_area); } - free(fru_area); - fru_area = NULL; + free_n(&fru_area); } /* read any extra fields */ - while ((fru_data[i] != 0xc1) && (i < fru_len)) - { + while ((i < fru_len) && (fru_data[i] != FRU_END_OF_FIELDS)) { int j = i; fru_area = get_fru_area_str(fru_data, &i); - if (fru_area != NULL) { + if (fru_area) { if (strlen(fru_area) > 0) { printf(" Product Extra : %s\n", fru_area); } - free(fru_area); - fru_area = NULL; + free_n(&fru_area); } if (i == j) break; } - if (fru_data != NULL) { - free(fru_data); - fru_data = NULL; - } + free_n(&fru_data); } /* fru_area_print_multirec - Print FRU Multi Record Area @@ -1262,7 +1306,7 @@ fru_area_print_multirec(struct ipmi_intf * intf, struct fru_info * fru, last_off = offset; fru_data = malloc(FRU_MULTIREC_CHUNK_SIZE); - if (fru_data == NULL) { + if (!fru_data) { lprintf(LOG_ERR, "ipmitool: malloc failure"); return; } @@ -1428,7 +1472,7 @@ fru_area_print_multirec(struct ipmi_intf * intf, struct fru_info * fru, lprintf(LOG_DEBUG ,"Multi-Record area ends at: %i (%xh)", last_off, last_off); - free(fru_data); + free_n(&fru_data); } /* ipmi_fru_query_new_value - Query new values to replace original FRU content @@ -1440,16 +1484,18 @@ fru_area_print_multirec(struct ipmi_intf * intf, struct fru_info * fru, * returns : TRUE if data changed * returns : FALSE if data not changed */ -int ipmi_fru_query_new_value(uint8_t *data,int offset, size_t len) +static +bool +ipmi_fru_query_new_value(uint8_t *data,int offset, size_t len) { - int status=FALSE; + bool status = false; int ret; char answer; printf("Would you like to change this value <y/n> ? "); ret = scanf("%c", &answer); if (ret != 1) { - return FALSE; + return false; } if( answer == 'y' || answer == 'Y' ){ @@ -1465,17 +1511,16 @@ int ipmi_fru_query_new_value(uint8_t *data,int offset, size_t len) for( i=0;i<len;i++ ){ ret = scanf("%x", holder+i); if (ret != 1) { - free(holder); - return FALSE; + free_n(&holder); + return false; } } for( i=0;i<len;i++ ){ data[offset++] = (unsigned char) *(holder+i); } /* &data[offset++] */ - free(holder); - holder = NULL; - status = TRUE; + free_n(&holder); + status = true; } else{ printf("Entered %c\n",answer); @@ -1572,12 +1617,13 @@ typedef struct OemKontronInformationRecordV1{ */ -static void ipmi_fru_oemkontron_get( int argc, char ** argv,uint8_t * fru_data, - int off,int len, - struct fru_multirec_header *h, - struct fru_multirec_oem_header *oh) +static void ipmi_fru_oemkontron_get(int argc, + char ** argv, + uint8_t * fru_data, + int off, + struct fru_multirec_oem_header *oh) { - static int badParams=FALSE; + static bool badParams = false; int start = off; int offset = start; offset += sizeof(struct fru_multirec_oem_header); @@ -1585,117 +1631,114 @@ static void ipmi_fru_oemkontron_get( int argc, char ** argv,uint8_t * fru_data, if(!badParams){ /* the 'OEM' field is already checked in caller */ if( argc > OEM_KONTRON_SUBCOMMAND_ARG_POS ){ - if(strncmp("oem", argv[OEM_KONTRON_SUBCOMMAND_ARG_POS],3)){ + if(strcmp("oem", argv[OEM_KONTRON_SUBCOMMAND_ARG_POS])){ printf("usage: fru get <id> <oem>\n"); - badParams = TRUE; + badParams = true; return; } } if( argc<GET_OEM_KONTRON_COMPLETE_ARG_COUNT ){ printf("usage: oem <iana> <recordid>\n"); printf("usage: oem 15000 3\n"); - badParams = TRUE; + badParams = true; return; } } - if(!badParams){ - - if(oh->record_id == OEM_KONTRON_INFORMATION_RECORD ) { - - uint8_t version; - - printf("Kontron OEM Information Record\n"); - version = oh->record_version; - - uint8_t blockCount; - uint8_t blockIndex=0; + if (badParams) { + return; + } - unsigned int matchInstance = 0; - uint8_t instance = 0; - - if (str2uchar(argv[OEM_KONTRON_INSTANCE_ARG_POS], &instance) != 0) { - lprintf(LOG_ERR, - "Instance argument '%s' is either invalid or out of range.", - argv[OEM_KONTRON_INSTANCE_ARG_POS]); - badParams = TRUE; - return; - } + if (oh->record_id != OEM_KONTRON_INFORMATION_RECORD) { + return; + } - blockCount = fru_data[offset++]; + uint8_t version; - for(blockIndex=0;blockIndex<blockCount;blockIndex++){ - void * pRecordData; - uint8_t nameLen; + printf("Kontron OEM Information Record\n"); + version = oh->record_version; - nameLen = ( fru_data[offset++] &= 0x3F ); - printf(" Name: %*.*s\n",nameLen, nameLen, (const char *)(fru_data+offset)); + uint8_t blockCount; + uint8_t blockIndex = 0; - offset+=nameLen; + uint8_t instance = 0; - pRecordData = &fru_data[offset]; + if (str2uchar(argv[OEM_KONTRON_INSTANCE_ARG_POS], &instance) != 0) { + lprintf(LOG_ERR, + "Instance argument '%s' is either invalid or out of range.", + argv[OEM_KONTRON_INSTANCE_ARG_POS]); + badParams = true; + return; + } - printf(" Record Version: %d\n", version); - if( version == 0 ) - { - printf(" Version: %*.*s\n", - OEM_KONTRON_FIELD_SIZE, - OEM_KONTRON_FIELD_SIZE, - ((tOemKontronInformationRecordV0 *) pRecordData)->field1); - printf(" Build Date: %*.*s\n", - OEM_KONTRON_FIELD_SIZE, - OEM_KONTRON_FIELD_SIZE, - ((tOemKontronInformationRecordV0 *) pRecordData)->field2); - printf(" Update Date: %*.*s\n", - OEM_KONTRON_FIELD_SIZE, - OEM_KONTRON_FIELD_SIZE, - ((tOemKontronInformationRecordV0 *) pRecordData)->field3); - printf(" Checksum: %*.*s\n\n", - OEM_KONTRON_FIELD_SIZE, - OEM_KONTRON_FIELD_SIZE, - ((tOemKontronInformationRecordV0 *) pRecordData)->crc32); - matchInstance++; - offset+= sizeof(tOemKontronInformationRecordV0); - offset++; - } - else if ( version == 1 ) - { - printf(" Version: %*.*s\n", - OEM_KONTRON_VERSION_FIELD_SIZE, - OEM_KONTRON_VERSION_FIELD_SIZE, - ((tOemKontronInformationRecordV1 *) pRecordData)->field1); - printf(" Build Date: %*.*s\n", - OEM_KONTRON_FIELD_SIZE, - OEM_KONTRON_FIELD_SIZE, - ((tOemKontronInformationRecordV1 *) pRecordData)->field2); - printf(" Update Date: %*.*s\n", - OEM_KONTRON_FIELD_SIZE, - OEM_KONTRON_FIELD_SIZE, - ((tOemKontronInformationRecordV1 *) pRecordData)->field3); - printf(" Checksum: %*.*s\n\n", - OEM_KONTRON_FIELD_SIZE, - OEM_KONTRON_FIELD_SIZE, - ((tOemKontronInformationRecordV1 *) pRecordData)->crc32); - matchInstance++; - offset+= sizeof(tOemKontronInformationRecordV1); - offset++; - } - else - { - printf (" Unsupported version %d\n",version); - } - } + blockCount = fru_data[offset++]; + + for (blockIndex = 0; blockIndex < blockCount; blockIndex++) { + void *pRecordData; + uint8_t nameLen; + + nameLen = (fru_data[offset++] &= 0x3F); + printf(" Name: %*.*s\n", nameLen, nameLen, + (const char *)(fru_data + offset)); + + offset += nameLen; + + pRecordData = &fru_data[offset]; + + printf(" Record Version: %d\n", version); + if (version == 0) { + printf(" Version: %*.*s\n", + OEM_KONTRON_FIELD_SIZE, + OEM_KONTRON_FIELD_SIZE, + ((tOemKontronInformationRecordV0 *)pRecordData)->field1); + printf(" Build Date: %*.*s\n", + OEM_KONTRON_FIELD_SIZE, + OEM_KONTRON_FIELD_SIZE, + ((tOemKontronInformationRecordV0 *)pRecordData)->field2); + printf(" Update Date: %*.*s\n", + OEM_KONTRON_FIELD_SIZE, + OEM_KONTRON_FIELD_SIZE, + ((tOemKontronInformationRecordV0 *)pRecordData)->field3); + printf(" Checksum: %*.*s\n\n", + OEM_KONTRON_FIELD_SIZE, + OEM_KONTRON_FIELD_SIZE, + ((tOemKontronInformationRecordV0 *)pRecordData)->crc32); + offset += sizeof(tOemKontronInformationRecordV0); + offset++; + } else if (version == 1) { + printf(" Version: %*.*s\n", + OEM_KONTRON_VERSION_FIELD_SIZE, + OEM_KONTRON_VERSION_FIELD_SIZE, + ((tOemKontronInformationRecordV1 *)pRecordData)->field1); + printf(" Build Date: %*.*s\n", + OEM_KONTRON_FIELD_SIZE, + OEM_KONTRON_FIELD_SIZE, + ((tOemKontronInformationRecordV1 *)pRecordData)->field2); + printf(" Update Date: %*.*s\n", + OEM_KONTRON_FIELD_SIZE, + OEM_KONTRON_FIELD_SIZE, + ((tOemKontronInformationRecordV1 *)pRecordData)->field3); + printf(" Checksum: %*.*s\n\n", + OEM_KONTRON_FIELD_SIZE, + OEM_KONTRON_FIELD_SIZE, + ((tOemKontronInformationRecordV1 *)pRecordData)->crc32); + offset += sizeof(tOemKontronInformationRecordV1); + offset++; + } else { + printf(" Unsupported version %d\n", version); } } } -static int ipmi_fru_oemkontron_edit( int argc, char ** argv,uint8_t * fru_data, +static +bool +ipmi_fru_oemkontron_edit( int argc, char ** argv,uint8_t * fru_data, int off,int len, struct fru_multirec_header *h, struct fru_multirec_oem_header *oh) { - static int badParams=FALSE; - int hasChanged = FALSE; + static bool badParams=false; + bool hasChanged = false; int start = off; int offset = start; int length = len; @@ -1706,9 +1749,9 @@ static int ipmi_fru_oemkontron_edit( int argc, char ** argv,uint8_t * fru_data, if(!badParams){ /* the 'OEM' field is already checked in caller */ if( argc > OEM_KONTRON_SUBCOMMAND_ARG_POS ){ - if(strncmp("oem", argv[OEM_KONTRON_SUBCOMMAND_ARG_POS],3)){ + if(strcmp("oem", argv[OEM_KONTRON_SUBCOMMAND_ARG_POS])){ printf("usage: fru edit <id> <oem> <args...>\n"); - badParams = TRUE; + badParams = true; return hasChanged; } } @@ -1716,14 +1759,14 @@ static int ipmi_fru_oemkontron_edit( int argc, char ** argv,uint8_t * fru_data, printf("usage: oem <iana> <recordid> <format> <args...>\n"); printf("usage: oem 15000 3 0 <name> <instance> <field1>"\ " <field2> <field3> <crc32>\n"); - badParams = TRUE; + badParams = true; return hasChanged; } if (str2uchar(argv[OEM_KONTRON_RECORDID_ARG_POS], &record_id) != 0) { lprintf(LOG_ERR, "Record ID argument '%s' is either invalid or out of range.", argv[OEM_KONTRON_RECORDID_ARG_POS]); - badParams = TRUE; + badParams = true; return hasChanged; } if (record_id == OEM_KONTRON_INFORMATION_RECORD) { @@ -1732,7 +1775,7 @@ static int ipmi_fru_oemkontron_edit( int argc, char ** argv,uint8_t * fru_data, (strlen(argv[i]) != OEM_KONTRON_VERSION_FIELD_SIZE)) { printf("error: version fields must have %d characters\n", OEM_KONTRON_FIELD_SIZE); - badParams = TRUE; + badParams = true; return hasChanged; } } @@ -1749,7 +1792,7 @@ static int ipmi_fru_oemkontron_edit( int argc, char ** argv,uint8_t * fru_data, lprintf(LOG_ERR, "Format argument '%s' is either invalid or out of range.", argv[OEM_KONTRON_FORMAT_ARG_POS]); - badParams = TRUE; + badParams = true; return hasChanged; } @@ -1767,7 +1810,7 @@ static int ipmi_fru_oemkontron_edit( int argc, char ** argv,uint8_t * fru_data, lprintf(LOG_ERR, "Instance argument '%s' is either invalid or out of range.", argv[OEM_KONTRON_INSTANCE_ARG_POS]); - badParams = TRUE; + badParams = true; return hasChanged; } @@ -1830,7 +1873,7 @@ static int ipmi_fru_oemkontron_edit( int argc, char ** argv,uint8_t * fru_data, } matchInstance++; - hasChanged = TRUE; + hasChanged = true; } else if(!strncmp((char *)argv[OEM_KONTRON_NAME_ARG_POS], (const char *)(fru_data+offset), nameLen)){ @@ -1906,12 +1949,14 @@ static int ipmi_fru_oemkontron_edit( int argc, char ** argv,uint8_t * fru_data, * returns: TRUE if data changed * returns: FALSE if data not changed */ -static int ipmi_fru_picmg_ext_edit(uint8_t * fru_data, +static +bool +ipmi_fru_picmg_ext_edit(uint8_t * fru_data, int off,int len, struct fru_multirec_header *h, struct fru_multirec_oem_header *oh) { - int hasChanged = FALSE; + bool hasChanged = false; int start = off; int offset = start; int length = len; @@ -1936,7 +1981,7 @@ static int ipmi_fru_picmg_ext_edit(uint8_t * fru_data, max_current |= fru_data[++index]<<8; printf(" New Maximum Internal Current(@12V): %.2f A (0x%02x)\n", (float)max_current / 10.0f, max_current); - hasChanged = TRUE; + hasChanged = true; } @@ -1974,7 +2019,7 @@ static int ipmi_fru_picmg_ext_edit(uint8_t * fru_data, printf(" New Current draw(@12V): %.2f A (0x%02x)\n", (float)current / 10.0f, current); - hasChanged = TRUE; + hasChanged = true; } } break; @@ -2885,11 +2930,11 @@ __ipmi_fru_print(struct ipmi_intf * intf, uint8_t id) req.msg.data_len = 1; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { printf(" Device not present (No Response)\n"); return -1; } - if (rsp->ccode > 0) { + if (rsp->ccode) { printf(" Device not present (%s)\n", val2str(rsp->ccode, completion_code_vals)); return -1; @@ -2922,11 +2967,11 @@ __ipmi_fru_print(struct ipmi_intf * intf, uint8_t id) req.msg.data_len = 4; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { printf(" Device not present (No Response)\n"); return 1; } - if (rsp->ccode > 0) { + if (rsp->ccode) { printf(" Device not present (%s)\n", val2str(rsp->ccode, completion_code_vals)); return 1; @@ -3003,7 +3048,7 @@ ipmi_fru_print(struct ipmi_intf * intf, struct sdr_record_fru_locator * fru) uint32_t save_channel; int rc = 0; - if (fru == NULL) + if (!fru) return __ipmi_fru_print(intf, 0); /* Logical FRU Device @@ -3033,7 +3078,7 @@ ipmi_fru_print(struct ipmi_intf * intf, struct sdr_record_fru_locator * fru) return 0; memset(desc, 0, sizeof(desc)); - memcpy(desc, fru->id_string, fru->id_code & 0x01f); + memcpy(desc, fru->id_string, __min(fru->id_code & 0x01f, sizeof(desc))); desc[fru->id_code & 0x01f] = 0; printf("FRU Device Description : %s (ID %d)\n", desc, fru->device_id); @@ -3101,11 +3146,11 @@ ipmi_fru_print_all(struct ipmi_intf * intf) req.msg.data_len = 0; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Get Device ID command failed"); return -1; } - if (rsp->ccode > 0) { + if (rsp->ccode) { lprintf(LOG_ERR, "Get Device ID command failed: %s", val2str(rsp->ccode, completion_code_vals)); return -1; @@ -3121,14 +3166,15 @@ ipmi_fru_print_all(struct ipmi_intf * intf) printf("\n"); } - if ((itr = ipmi_sdr_start(intf, 0)) == NULL) + itr = ipmi_sdr_start(intf, 0); + if (!itr) return -1; /* Walk the SDRs looking for FRU Devices and Management Controller Devices. */ /* For FRU devices, print the FRU from the SDR locator record. */ /* For MC devices, issue FRU commands to the satellite controller to print */ /* FRU data. */ - while ((header = ipmi_sdr_get_next_header(intf, itr)) != NULL) + while ((header = ipmi_sdr_get_next_header(intf, itr))) { if (header->type == SDR_RECORD_TYPE_MC_DEVICE_LOCATOR ) { /* Check the capabilities of the Management Controller Device */ @@ -3158,11 +3204,7 @@ ipmi_fru_print_all(struct ipmi_intf * intf) intf->target_addr = save_addr; } - if (mc) { - free(mc); - mc = NULL; - } - + free_n(&mc); continue; } @@ -3172,19 +3214,15 @@ ipmi_fru_print_all(struct ipmi_intf * intf) /* Print the FRU from the SDR locator record. */ fru = (struct sdr_record_fru_locator *) ipmi_sdr_get_record(intf, header, itr); - if (fru == NULL || !fru->logical) { - if (fru) { - free(fru); - fru = NULL; - } + if (!fru || !fru->logical) { + free_n(&fru); continue; } rc = ipmi_fru_print(intf, fru); - free(fru); - fru = NULL; + free_n(&fru); } - ipmi_sdr_end(intf, itr); + ipmi_sdr_end(itr); return rc; } @@ -3224,8 +3262,8 @@ ipmi_fru_read_to_bin(struct ipmi_intf * intf, if (!rsp) return; - if (rsp->ccode > 0) { - if (rsp->ccode == 0xc3) + if (rsp->ccode) { + if (rsp->ccode == IPMI_CC_TIMEOUT) printf (" Timeout accessing FRU info. (Device not present?)\n"); return; } @@ -3240,7 +3278,7 @@ ipmi_fru_read_to_bin(struct ipmi_intf * intf, } pFruBuf = malloc(fru.size); - if (pFruBuf != NULL) { + if (pFruBuf) { printf("Fru Size : %d bytes\n",fru.size); read_fru_area(intf, &fru, fruId, 0, fru.size, pFruBuf); } else { @@ -3248,7 +3286,7 @@ ipmi_fru_read_to_bin(struct ipmi_intf * intf, return; } - if(pFruBuf != NULL) + if(pFruBuf) { FILE * pFile; pFile = fopen(pFileName,"wb"); @@ -3257,14 +3295,12 @@ ipmi_fru_read_to_bin(struct ipmi_intf * intf, printf("Done\n"); } else { lprintf(LOG_ERR, "Error opening file %s\n", pFileName); - free(pFruBuf); - pFruBuf = NULL; + free_n(&pFruBuf); return; } fclose(pFile); } - free(pFruBuf); - pFruBuf = NULL; + free_n(&pFruBuf); } static void @@ -3293,7 +3329,7 @@ ipmi_fru_write_from_bin(struct ipmi_intf * intf, return; if (rsp->ccode) { - if (rsp->ccode == 0xc3) + if (rsp->ccode == IPMI_CC_TIMEOUT) printf(" Timeout accessing FRU info. (Device not present?)\n"); return; } @@ -3308,13 +3344,13 @@ ipmi_fru_write_from_bin(struct ipmi_intf * intf, } pFruBuf = malloc(fru.size); - if (pFruBuf == NULL) { + if (!pFruBuf) { lprintf(LOG_ERR, "Cannot allocate %d bytes\n", fru.size); return; } pFile = fopen(pFileName, "rb"); - if (pFile != NULL) { + if (pFile) { len = fread(pFruBuf, 1, fru.size, pFile); printf("Fru Size : %d bytes\n", fru.size); printf("Size to Write : %d bytes\n", len); @@ -3328,13 +3364,12 @@ ipmi_fru_write_from_bin(struct ipmi_intf * intf, lprintf(LOG_INFO,"Done"); } - free(pFruBuf); - pFruBuf = NULL; + free_n(&pFruBuf); } /* ipmi_fru_write_help() - print help text for 'write' * - * retruns void + * returns void */ void ipmi_fru_write_help() @@ -3411,11 +3446,11 @@ ipmi_fru_edit_multirec(struct ipmi_intf * intf, uint8_t id , req.msg.data_len = 1; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { printf(" Device not present (No Response)\n"); return -1; } - if (rsp->ccode > 0) { + if (rsp->ccode) { printf(" Device not present (%s)\n", val2str(rsp->ccode, completion_code_vals)); return -1; @@ -3446,7 +3481,7 @@ ipmi_fru_edit_multirec(struct ipmi_intf * intf, uint8_t id , memset(&fru, 0, sizeof(fru)); fru_data = malloc(fru.size + 1); - if (fru_data == NULL) { + if (!fru_data) { lprintf(LOG_ERR, " Out of memory!"); return -1; } @@ -3480,7 +3515,7 @@ ipmi_fru_edit_multirec(struct ipmi_intf * intf, uint8_t id , if( argc <=2 ) { suppliedIana = IPMI_OEM_PICMG; } else { - if( !strncmp( argv[2] , "oem" , 3 )) { + if( !strcmp( argv[2] , "oem")) { /* Expect IANA number next */ if( argc <= 3 ) { lprintf(LOG_ERR, "oem iana <record> <format> [<args>]"); @@ -3532,8 +3567,7 @@ ipmi_fru_edit_multirec(struct ipmi_intf * intf, uint8_t id , i += h->len + sizeof (struct fru_multirec_header); } while (!(h->format & 0x80) && (error != 1)); - free(fru_data); - fru_data = NULL; + free_n(&fru_data); } return 0; } @@ -3616,11 +3650,11 @@ ipmi_fru_get_multirec(struct ipmi_intf * intf, uint8_t id , req.msg.data_len = 1; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { printf(" Device not present (No Response)\n"); return -1; } - if (rsp->ccode > 0) { + if (rsp->ccode) { printf(" Device not present (%s)\n", val2str(rsp->ccode, completion_code_vals)); return -1; @@ -3650,7 +3684,7 @@ ipmi_fru_get_multirec(struct ipmi_intf * intf, uint8_t id , i = last_off = offset; fru_data = malloc(fru.size + 1); - if (fru_data == NULL) { + if (!fru_data) { lprintf(LOG_ERR, " Out of memory!"); return -1; } @@ -3679,7 +3713,7 @@ ipmi_fru_get_multirec(struct ipmi_intf * intf, uint8_t id , uint32_t suppliedIana = 0 ; /* Now makes sure this is really PICMG record */ - if( !strncmp( argv[2] , "oem" , 3 )) { + if( !strcmp( argv[2] , "oem")) { /* Expect IANA number next */ if( argc <= 3 ) { lprintf(LOG_ERR, "oem iana <record> <format>"); @@ -3701,15 +3735,15 @@ ipmi_fru_get_multirec(struct ipmi_intf * intf, uint8_t id , if( suppliedIana == iana ) { lprintf(LOG_DEBUG, "Matching record found" ); - if( iana == IPMI_OEM_KONTRON ) { - ipmi_fru_oemkontron_get( argc,argv,fru_data, - i + sizeof(struct fru_multirec_header), - h->len, h, oh ); + if( iana == IPMI_OEM_KONTRON ) { + ipmi_fru_oemkontron_get(argc, argv, fru_data, + i + sizeof(struct fru_multirec_header), + oh); } /* FIXME: Add OEM record support here */ else{ printf(" OEM IANA (%s) Record not supported in this mode\n", - val2str( iana, ipmi_oem_info)); + val2str( iana, ipmi_oem_info)); error = 1; } } @@ -3717,16 +3751,16 @@ ipmi_fru_get_multirec(struct ipmi_intf * intf, uint8_t id , i += h->len + sizeof (struct fru_multirec_header); } while (!(h->format & 0x80) && (error != 1)); - free(fru_data); - fru_data = NULL; + free_n(&fru_data); } return 0; } -static int -ipmi_fru_upg_ekeying(struct ipmi_intf * intf, - char * pFileName, - uint8_t fruId) +#define ERR_EXIT do { rc = -1; goto exit; } while(0) + +static +int +ipmi_fru_upg_ekeying(struct ipmi_intf *intf, char *pFileName, uint8_t fruId) { struct fru_info fruInfo = {0}; uint8_t *buf = NULL; @@ -3734,59 +3768,50 @@ ipmi_fru_upg_ekeying(struct ipmi_intf * intf, uint32_t fruMultiRecSize = 0; uint32_t offFileMultiRec = 0; uint32_t fileMultiRecSize = 0; - if (pFileName == NULL) { + int rc = 0; + + if (!pFileName) { lprintf(LOG_ERR, "File expected, but none given."); - return (-1); + ERR_EXIT; } if (ipmi_fru_get_multirec_location_from_fru(intf, fruId, &fruInfo, &offFruMultiRec, &fruMultiRecSize) != 0) { lprintf(LOG_ERR, "Failed to get multirec location from FRU."); - return (-1); + ERR_EXIT; } lprintf(LOG_DEBUG, "FRU Size : %lu\n", fruMultiRecSize); lprintf(LOG_DEBUG, "Multi Rec offset: %lu\n", offFruMultiRec); if (ipmi_fru_get_multirec_size_from_file(pFileName, &fileMultiRecSize, &offFileMultiRec) != 0) { lprintf(LOG_ERR, "Failed to get multirec size from file '%s'.", pFileName); - return (-1); + ERR_EXIT; } buf = malloc(fileMultiRecSize); - if (buf == NULL) { + if (!buf) { lprintf(LOG_ERR, "ipmitool: malloc failure"); - return (-1); + ERR_EXIT; } if (ipmi_fru_get_multirec_from_file(pFileName, buf, fileMultiRecSize, offFileMultiRec) != 0) { lprintf(LOG_ERR, "Failed to get multirec from file '%s'.", pFileName); - if (buf != NULL) { - free(buf); - buf = NULL; - } - return (-1); + ERR_EXIT; } if (ipmi_fru_get_adjust_size_from_buffer(buf, &fileMultiRecSize) != 0) { lprintf(LOG_ERR, "Failed to adjust size from buffer."); - if (buf != NULL) { - free(buf); - buf = NULL; - } - return (-1); + ERR_EXIT; } if (write_fru_area(intf, &fruInfo, fruId, 0, offFruMultiRec, fileMultiRecSize, buf) != 0) { lprintf(LOG_ERR, "Failed to write FRU area."); - if (buf != NULL) { - free(buf); - buf = NULL; - } - return (-1); - } - if (buf != NULL) { - free(buf); - buf = NULL; + ERR_EXIT; } + lprintf(LOG_INFO, "Done upgrading Ekey."); - return 0; + +exit: + free_n(&buf); + + return rc; } /* ipmi_fru_upgekey_help - print help text for 'upgEkey' @@ -3834,7 +3859,7 @@ ipmi_fru_get_multirec_size_from_file(char * pFileName, return -1; } - /* Retreive length */ + /* Retrieve length */ if (((header.offset.internal * 8) > (header.offset.internal * 8)) && ((header.offset.internal * 8) < end)) end = (header.offset.internal * 8); @@ -3882,7 +3907,7 @@ ipmi_fru_get_adjust_size_from_buffer(uint8_t * fru_data, uint32_t *pSize) } if (checksum != 0) { lprintf(LOG_ERR, "Bad checksum in Multi Records"); - status = (-1); + status = -1; if (verbose) { printf("--> FAIL"); } @@ -3912,9 +3937,9 @@ ipmi_fru_get_multirec_from_file(char * pFileName, uint8_t * pBufArea, { FILE * pFile; uint32_t len = 0; - if (pFileName == NULL) { + if (!pFileName) { lprintf(LOG_ERR, "Invalid file name given."); - return (-1); + return -1; } errno = 0; @@ -3922,21 +3947,21 @@ ipmi_fru_get_multirec_from_file(char * pFileName, uint8_t * pBufArea, if (!pFile) { lprintf(LOG_ERR, "Error opening file '%s': %i -> %s.", pFileName, errno, strerror(errno)); - return (-1); + return -1; } errno = 0; if (fseek(pFile, offset, SEEK_SET) != 0) { lprintf(LOG_ERR, "Failed to seek in file '%s': %i -> %s.", pFileName, errno, strerror(errno)); fclose(pFile); - return (-1); + return -1; } len = fread(pBufArea, size, 1, pFile); fclose(pFile); if (len != 1) { lprintf(LOG_ERR, "Error in file '%s'.", pFileName); - return (-1); + return -1; } return 0; } @@ -3971,8 +3996,8 @@ ipmi_fru_get_multirec_location_from_fru(struct ipmi_intf * intf, return -1; } - if (rsp->ccode > 0) { - if (rsp->ccode == 0xc3) + if (rsp->ccode) { + if (rsp->ccode == IPMI_CC_TIMEOUT) printf (" Timeout accessing FRU info. (Device not present?)\n"); else printf (" CCODE = 0x%02x\n", rsp->ccode); @@ -4003,8 +4028,8 @@ ipmi_fru_get_multirec_location_from_fru(struct ipmi_intf * intf, if (!rsp) return -1; - if (rsp->ccode > 0) { - if (rsp->ccode == 0xc3) + if (rsp->ccode) { + if (rsp->ccode == IPMI_CC_TIMEOUT) printf (" Timeout while reading FRU data. (Device not present?)\n"); return -1; } @@ -4021,7 +4046,7 @@ ipmi_fru_get_multirec_location_from_fru(struct ipmi_intf * intf, end = pFruInfo->size; - /* Retreive length */ + /* Retrieve length */ if (((header.offset.internal * 8) > (header.offset.internal * 8)) && ((header.offset.internal * 8) < end)) end = (header.offset.internal * 8); @@ -4044,7 +4069,7 @@ ipmi_fru_get_multirec_location_from_fru(struct ipmi_intf * intf, return 0; } -/* ipmi_fru_get_internal_use_offset - Retreive internal use offset +/* ipmi_fru_get_internal_use_offset - Retrieve internal use offset * * @intf: ipmi interface * @id: fru id @@ -4085,17 +4110,16 @@ ipmi_fru_get_internal_use_info( struct ipmi_intf * intf, req.msg.data_len = 1; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { printf(" Device not present (No Response)\n"); return -1; } - if (rsp->ccode > 0) { + if (rsp->ccode) { printf(" Device not present (%s)\n", val2str(rsp->ccode, completion_code_vals)); return -1; } - memset(&fru, 0, sizeof(fru)); fru->size = (rsp->data[1] << 8) | rsp->data[0]; fru->access = rsp->data[2] & 0x1; @@ -4122,11 +4146,11 @@ ipmi_fru_get_internal_use_info( struct ipmi_intf * intf, req.msg.data_len = 4; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { printf(" Device not present (No Response)\n"); return 1; } - if (rsp->ccode > 0) { + if (rsp->ccode) { printf(" Device not present (%s)\n", val2str(rsp->ccode, completion_code_vals)); return 1; @@ -4265,7 +4289,7 @@ ipmi_fru_read_internal_use(struct ipmi_intf * intf, uint8_t id, char * pFileName if(rc == 0) { - if(pFileName == NULL) + if(!pFileName) { uint16_t counter; for(counter = 0; counter < size; counter ++) @@ -4287,8 +4311,7 @@ ipmi_fru_read_internal_use(struct ipmi_intf * intf, uint8_t id, char * pFileName else { lprintf(LOG_ERR, "Error opening file %s\n", pFileName); - free(frubuf); - frubuf = NULL; + free_n(&frubuf); return -1; } fclose(pFile); @@ -4296,8 +4319,7 @@ ipmi_fru_read_internal_use(struct ipmi_intf * intf, uint8_t id, char * pFileName } printf("\n"); - free(frubuf); - frubuf = NULL; + free_n(&frubuf); } } @@ -4340,7 +4362,7 @@ ipmi_fru_write_internal_use(struct ipmi_intf * intf, uint8_t id, char * pFileNam if(fp) { - /* Retreive file length, check if it's fits the Eeprom Size */ + /* Retrieve file length, check if it's fits the Eeprom Size */ fseek(fp, 0 ,SEEK_END); fileLength = ftell(fp); @@ -4380,8 +4402,7 @@ ipmi_fru_write_internal_use(struct ipmi_intf * intf, uint8_t id, char * pFileNam lprintf(LOG_ERR, "Unable to read file: %i\n", fru_read_size); } - free(frubuf); - frubuf = NULL; + free_n(&frubuf); } fclose(fp); fp = NULL; @@ -4403,42 +4424,43 @@ ipmi_fru_main(struct ipmi_intf * intf, int argc, char ** argv) if (argc < 1) { rc = ipmi_fru_print_all(intf); } - else if (strncmp(argv[0], "help", 4) == 0) { + else if (!strcmp(argv[0], "help")) { ipmi_fru_help(); return 0; } - else if (strncmp(argv[0], "print", 5) == 0 || - strncmp(argv[0], "list", 4) == 0) { + else if (!strcmp(argv[0], "print") + || !strcmp(argv[0], "list")) + { if (argc > 1) { - if (strcmp(argv[1], "help") == 0) { + if (!strcmp(argv[1], "help")) { lprintf(LOG_NOTICE, "fru print [fru id] - print information about FRU(s)"); return 0; } if (is_fru_id(argv[1], &fru_id) != 0) - return (-1); + return -1; rc = __ipmi_fru_print(intf, fru_id); } else { rc = ipmi_fru_print_all(intf); } } - else if (!strncmp(argv[0], "read", 5)) { - if (argc > 1 && strcmp(argv[1], "help") == 0) { + else if (!strcmp(argv[0], "read")) { + if (argc > 1 && !strcmp(argv[1], "help")) { ipmi_fru_read_help(); return 0; } else if (argc < 3) { lprintf(LOG_ERR, "Not enough parameters given."); ipmi_fru_read_help(); - return (-1); + return -1; } if (is_fru_id(argv[1], &fru_id) != 0) - return (-1); + return -1; /* There is a file name in the parameters */ if (is_valid_filename(argv[2]) != 0) - return (-1); + return -1; if (verbose) { printf("FRU ID : %d\n", fru_id); @@ -4447,22 +4469,22 @@ ipmi_fru_main(struct ipmi_intf * intf, int argc, char ** argv) /* TODO - rc is missing */ ipmi_fru_read_to_bin(intf, argv[2], fru_id); } - else if (!strncmp(argv[0], "write", 5)) { - if (argc > 1 && strcmp(argv[1], "help") == 0) { + else if (!strcmp(argv[0], "write")) { + if (argc > 1 && !strcmp(argv[1], "help")) { ipmi_fru_write_help(); return 0; } else if (argc < 3) { lprintf(LOG_ERR, "Not enough parameters given."); ipmi_fru_write_help(); - return (-1); + return -1; } if (is_fru_id(argv[1], &fru_id) != 0) - return (-1); + return -1; /* There is a file name in the parameters */ if (is_valid_filename(argv[2]) != 0) - return (-1); + return -1; if (verbose) { printf("FRU ID : %d\n", fru_id); @@ -4471,67 +4493,67 @@ ipmi_fru_main(struct ipmi_intf * intf, int argc, char ** argv) /* TODO - rc is missing */ ipmi_fru_write_from_bin(intf, argv[2], fru_id); } - else if (!strncmp(argv[0], "upgEkey", 7)) { - if (argc > 1 && strcmp(argv[1], "help") == 0) { + else if (!strcmp(argv[0], "upgEkey")) { + if (argc > 1 && !strcmp(argv[1], "help")) { ipmi_fru_upgekey_help(); return 0; } else if (argc < 3) { lprintf(LOG_ERR, "Not enough parameters given."); ipmi_fru_upgekey_help(); - return (-1); + return -1; } if (is_fru_id(argv[1], &fru_id) != 0) - return (-1); + return -1; /* There is a file name in the parameters */ if (is_valid_filename(argv[2]) != 0) - return (-1); + return -1; rc = ipmi_fru_upg_ekeying(intf, argv[2], fru_id); } - else if (!strncmp(argv[0], "internaluse", 11)) { - if (argc > 1 && strcmp(argv[1], "help") == 0) { + else if (!strcmp(argv[0], "internaluse")) { + if (argc > 1 && !strcmp(argv[1], "help")) { ipmi_fru_internaluse_help(); return 0; } - if ( (argc >= 3) && (!strncmp(argv[2], "info", 4)) ) { + if ( (argc >= 3) && (!strcmp(argv[2], "info")) ) { if (is_fru_id(argv[1], &fru_id) != 0) - return (-1); + return -1; rc = ipmi_fru_info_internal_use(intf, fru_id); } - else if ( (argc >= 3) && (!strncmp(argv[2], "print", 5)) ) { + else if ( (argc >= 3) && (!strcmp(argv[2], "print")) ) { if (is_fru_id(argv[1], &fru_id) != 0) - return (-1); + return -1; rc = ipmi_fru_read_internal_use(intf, fru_id, NULL); } - else if ( (argc >= 4) && (!strncmp(argv[2], "read", 4)) ) { + else if ( (argc >= 4) && (!strcmp(argv[2], "read")) ) { if (is_fru_id(argv[1], &fru_id) != 0) - return (-1); + return -1; /* There is a file name in the parameters */ if (is_valid_filename(argv[3]) != 0) - return (-1); + return -1; lprintf(LOG_DEBUG, "FRU ID : %d", fru_id); lprintf(LOG_DEBUG, "FRU File : %s", argv[3]); rc = ipmi_fru_read_internal_use(intf, fru_id, argv[3]); } - else if ( (argc >= 4) && (!strncmp(argv[2], "write", 5)) ) { + else if ( (argc >= 4) && (!strcmp(argv[2], "write")) ) { if (is_fru_id(argv[1], &fru_id) != 0) - return (-1); + return -1; /* There is a file name in the parameters */ if (is_valid_filename(argv[3]) != 0) - return (-1); + return -1; lprintf(LOG_DEBUG, "FRU ID : %d", fru_id); lprintf(LOG_DEBUG, "FRU File : %s", argv[3]); @@ -4541,22 +4563,22 @@ ipmi_fru_main(struct ipmi_intf * intf, int argc, char ** argv) lprintf(LOG_ERR, "Either unknown command or not enough parameters given."); ipmi_fru_internaluse_help(); - return (-1); + return -1; } } - else if (!strncmp(argv[0], "edit", 4)) { - if (argc > 1 && strcmp(argv[1], "help") == 0) { + else if (!strcmp(argv[0], "edit")) { + if (argc > 1 && !strcmp(argv[1], "help")) { ipmi_fru_edit_help(); return 0; } else if (argc < 2) { lprintf(LOG_ERR, "Not enough parameters given."); ipmi_fru_edit_help(); - return (-1); + return -1; } if (argc >= 2) { if (is_fru_id(argv[1], &fru_id) != 0) - return (-1); + return -1; if (verbose) { printf("FRU ID : %d\n", fru_id); @@ -4566,38 +4588,38 @@ ipmi_fru_main(struct ipmi_intf * intf, int argc, char ** argv) } if (argc >= 3) { - if (!strncmp(argv[2], "field", 5)) { + if (!strcmp(argv[2], "field")) { if (argc != 6) { lprintf(LOG_ERR, "Not enough parameters given."); ipmi_fru_edit_help(); - return (-1); + return -1; } rc = ipmi_fru_set_field_string(intf, fru_id, *argv[3], *argv[4], (char *) argv[5]); - } else if (!strncmp(argv[2], "oem", 3)) { + } else if (!strcmp(argv[2], "oem")) { rc = ipmi_fru_edit_multirec(intf, fru_id, argc, argv); } else { lprintf(LOG_ERR, "Invalid command: %s", argv[2]); ipmi_fru_edit_help(); - return (-1); + return -1; } } else { rc = ipmi_fru_edit_multirec(intf, fru_id, argc, argv); } } - else if (!strncmp(argv[0], "get", 4)) { - if (argc > 1 && (strncmp(argv[1], "help", 4) == 0)) { + else if (!strcmp(argv[0], "get")) { + if (argc > 1 && (!strcmp(argv[1], "help"))) { ipmi_fru_get_help(); return 0; } else if (argc < 2) { lprintf(LOG_ERR, "Not enough parameters given."); ipmi_fru_get_help(); - return (-1); + return -1; } if (argc >= 2) { if (is_fru_id(argv[1], &fru_id) != 0) - return (-1); + return -1; if (verbose) { printf("FRU ID : %d\n", fru_id); @@ -4607,12 +4629,12 @@ ipmi_fru_main(struct ipmi_intf * intf, int argc, char ** argv) } if (argc >= 3) { - if (!strncmp(argv[2], "oem", 3)) { + if (!strcmp(argv[2], "oem")) { rc = ipmi_fru_get_multirec(intf, fru_id, argc, argv); } else { lprintf(LOG_ERR, "Invalid command: %s", argv[2]); ipmi_fru_get_help(); - return (-1); + return -1; } } else { rc = ipmi_fru_get_multirec(intf, fru_id, argc, argv); @@ -4621,7 +4643,7 @@ ipmi_fru_main(struct ipmi_intf * intf, int argc, char ** argv) else { lprintf(LOG_ERR, "Invalid FRU command: %s", argv[0]); ipmi_fru_help(); - return (-1); + return -1; } return rc; @@ -4668,15 +4690,15 @@ f_type, uint8_t f_index, char *f_string) req.msg.data_len = 1; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { printf(" Device not present (No Response)\n"); - rc = (-1); + rc = -1; goto ipmi_fru_set_field_string_out; } - if (rsp->ccode > 0) { + if (rsp->ccode) { printf(" Device not present (%s)\n", val2str(rsp->ccode, completion_code_vals)); - rc = (-1); + rc = -1; goto ipmi_fru_set_field_string_out; } @@ -4686,7 +4708,7 @@ f_type, uint8_t f_index, char *f_string) if (fru.size < 1) { printf(" Invalid FRU size %d", fru.size); - rc = (-1); + rc = -1; goto ipmi_fru_set_field_string_out; } /* @@ -4704,17 +4726,17 @@ f_type, uint8_t f_index, char *f_string) req.msg.data_len = 4; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) + if (!rsp) { printf(" Device not present (No Response)\n"); - rc = (-1); + rc = -1; goto ipmi_fru_set_field_string_out; } - if (rsp->ccode > 0) + if (rsp->ccode) { printf(" Device not present (%s)\n", val2str(rsp->ccode, completion_code_vals)); - rc = (-1); + rc = -1; goto ipmi_fru_set_field_string_out; } @@ -4723,20 +4745,17 @@ f_type, uint8_t f_index, char *f_string) memcpy(&header, rsp->data + 1, 8); - if (header.version != 1) - { + if (header.version != 1) { printf(" Unknown FRU header version 0x%02x", header.version); - rc = (-1); + rc = -1; goto ipmi_fru_set_field_string_out; } fru_data = malloc( fru.size ); - - if( fru_data == NULL ) - { + if (!fru_data) { printf("Out of memory!\n"); - rc = (-1); + rc = -1; goto ipmi_fru_set_field_string_out; } @@ -4766,14 +4785,14 @@ f_type, uint8_t f_index, char *f_string) else { printf("Wrong field type."); - rc = (-1); + rc = -1; goto ipmi_fru_set_field_string_out; } memset(fru_data, 0, fru.size); if( read_fru_area(intf ,&fru, fruId, header_offset , fru_section_len , fru_data) < 0 ) { - rc = (-1); + rc = -1; goto ipmi_fru_set_field_string_out; } /* Convert index from character to decimal */ @@ -4782,16 +4801,15 @@ f_type, uint8_t f_index, char *f_string) /*Seek to field index */ for (i=0; i <= f_index; i++) { fru_field_offset_tmp = fru_field_offset; - if (fru_area != NULL) { - free(fru_area); - fru_area = NULL; + if (fru_area) { + free_n(&fru_area); } fru_area = (uint8_t *) get_fru_area_str(fru_data, &fru_field_offset); } - if( (fru_area == NULL ) || strlen((const char *)fru_area) == 0 ) { + if (!FRU_FIELD_VALID(fru_area)) { printf("Field not found !\n"); - rc = (-1); + rc = -1; goto ipmi_fru_set_field_string_out; } @@ -4815,7 +4833,7 @@ f_type, uint8_t f_index, char *f_string) header_offset, fru_section_len, fru_data) < 0 ) { printf("Write to FRU data failed.\n"); - rc = (-1); + rc = -1; goto ipmi_fru_set_field_string_out; } } @@ -4825,20 +4843,14 @@ f_type, uint8_t f_index, char *f_string) ipmi_fru_set_field_string_rebuild(intf,fruId,fru,header,f_type,f_index,f_string) ) { - rc = (-1); + rc = -1; goto ipmi_fru_set_field_string_out; } } - ipmi_fru_set_field_string_out: - if (fru_data != NULL) { - free(fru_data); - fru_data = NULL; - } - if (fru_area != NULL) { - free(fru_area); - fru_area = NULL; - } +ipmi_fru_set_field_string_out: + free_n(&fru_data); + free_n(&fru_area); return rc; } @@ -4894,10 +4906,9 @@ ipmi_fru_set_field_string_rebuild(struct ipmi_intf * intf, uint8_t fruId, fru_data_new = malloc( fru.size ); - if( fru_data_old == NULL || fru_data_new == NULL ) - { + if (!fru_data_old || !fru_data_new) { printf("Out of memory!\n"); - rc = (-1); + rc = -1; goto ipmi_fru_set_field_string_rebuild_out; } @@ -4952,7 +4963,7 @@ ipmi_fru_set_field_string_rebuild(struct ipmi_intf * intf, uint8_t fruId, else { printf("Wrong field type."); - rc = (-1); + rc = -1; goto ipmi_fru_set_field_string_rebuild_out; } @@ -4960,16 +4971,13 @@ ipmi_fru_set_field_string_rebuild(struct ipmi_intf * intf, uint8_t fruId, 3) Seek to field index */ for (i = 0;i <= f_index; i++) { fru_field_offset_tmp = fru_field_offset; - if (fru_area != NULL) { - free(fru_area); - fru_area = NULL; - } + free_n(&fru_area); fru_area = (uint8_t *) get_fru_area_str(fru_data_old, &fru_field_offset); } - if( (fru_area == NULL ) || strlen((const char *)fru_area) == 0 ) { + if (!FRU_FIELD_VALID(fru_area)) { printf("Field not found (1)!\n"); - rc = (-1); + rc = -1; goto ipmi_fru_set_field_string_rebuild_out; } @@ -5142,7 +5150,7 @@ ipmi_fru_set_field_string_rebuild(struct ipmi_intf * intf, uint8_t fruId, *(fru_data_new + fru_field_offset_tmp) = (0xc0 + strlen(f_string)); memcpy(fru_data_new + fru_field_offset_tmp + 1, f_string, strlen(f_string)); - /* Copy remaing bytes in section */ + /* Copy remaining bytes in section */ #ifdef DBG_RESIZE_FRU printf("Copying remaining of sections: %d \n", (int)((fru_data_old + header_offset + fru_section_len - 1) - @@ -5178,7 +5186,7 @@ ipmi_fru_set_field_string_rebuild(struct ipmi_intf * intf, uint8_t fruId, else { printf( "Internal error, padding length %i (must be from 0 to 7) ", padding_len ); - rc = (-1); + rc = -1; goto ipmi_fru_set_field_string_rebuild_out; } @@ -5188,25 +5196,16 @@ ipmi_fru_set_field_string_rebuild(struct ipmi_intf * intf, uint8_t fruId, if( write_fru_area( intf, &fru, fruId, 0, 0, fru.size, fru_data_new ) < 0 ) { printf("Write to FRU data failed.\n"); - rc = (-1); + rc = -1; goto ipmi_fru_set_field_string_rebuild_out; } printf("Done.\n"); - ipmi_fru_set_field_string_rebuild_out: - if (fru_area != NULL) { - free(fru_area); - fru_area = NULL; - } - if (fru_data_new != NULL) { - free(fru_data_new); - fru_data_new = NULL; - } - if (fru_data_old != NULL) { - free(fru_data_old); - fru_data_old = NULL; - } +ipmi_fru_set_field_string_rebuild_out: + free_n(&fru_area); + free_n(&fru_data_new); + free_n(&fru_data_old); return rc; } diff --git a/lib/ipmi_fwum.c b/lib/ipmi_fwum.c index d1e3f4f..b01c545 100644 --- a/lib/ipmi_fwum.c +++ b/lib/ipmi_fwum.c @@ -151,16 +151,16 @@ ipmi_fwum_main(struct ipmi_intf *intf, int argc, char **argv) printf_kfwum_help(); return (-1); } - if (strncmp(argv[0], "help", 4) == 0) { + if (!strcmp(argv[0], "help")) { printf_kfwum_help(); rc = 0; - } else if (strncmp(argv[0], "info", 4) == 0) { + } else if (!strcmp(argv[0], "info")) { rc = ipmi_fwum_info(intf); - } else if (strncmp(argv[0], "status", 6) == 0) { + } else if (!strcmp(argv[0], "status")) { rc = ipmi_fwum_status(intf); - } else if (strncmp(argv[0], "rollback", 8) == 0) { + } else if (!strcmp(argv[0], "rollback")) { rc = KfwumManualRollback(intf); - } else if (strncmp(argv[0], "download", 8) == 0) { + } else if (!strcmp(argv[0], "download")) { if ((argc < 2) || (strlen(argv[1]) < 1)) { lprintf(LOG_ERR, "Path and file name must be specified."); @@ -168,14 +168,14 @@ ipmi_fwum_main(struct ipmi_intf *intf, int argc, char **argv) } printf("Firmware File Name : %s\n", argv[1]); rc = ipmi_fwum_fwupgrade(intf, argv[1], 0); - } else if (strncmp(argv[0], "upgrade", 7) == 0) { + } else if (!strcmp(argv[0], "upgrade")) { if ((argc >= 2) && (strlen(argv[1]) > 0)) { printf("Upgrading using file name %s\n", argv[1]); rc = ipmi_fwum_fwupgrade(intf, argv[1], 1); } else { rc = KfwumStartFirmwareUpgrade(intf); } - } else if (strncmp(argv[0], "tracelog", 8) == 0) { + } else if (!strcmp(argv[0], "tracelog")) { rc = KfwumGetTraceLog(intf); } else { lprintf(LOG_ERR, "Invalid KFWUM command: %s", argv[0]); @@ -258,7 +258,7 @@ ipmi_fwum_fwupgrade(struct ipmi_intf *intf, char *file, int action) unsigned short padding; unsigned long fsize = 0; unsigned char not_used; - if (file == NULL) { + if (!file) { lprintf(LOG_ERR, "No file given."); return (-1); } @@ -312,7 +312,7 @@ KfwumGetFileSize(const char *pFileName, unsigned long *pFileSize) { FILE *pFileHandle = NULL; pFileHandle = fopen(pFileName, "rb"); - if (pFileHandle == NULL) { + if (!pFileHandle) { return (-1); } if (fseek(pFileHandle, 0L , SEEK_END) == 0) { @@ -342,7 +342,7 @@ KfwumSetupBuffersFromFile(const char *pFileName, unsigned long fileSize) int qty = 0; pFileHandle = fopen(pFileName, "rb"); - if (pFileHandle == NULL) { + if (!pFileHandle) { lprintf(LOG_ERR, "Failed to open '%s' for reading.", pFileName); return (-1); @@ -454,7 +454,7 @@ KfwumGetInfo(struct ipmi_intf *intf, unsigned char output, if (!rsp) { lprintf(LOG_ERR, "Error in FWUM Firmware Get Info Command."); return (-1); - } else if (rsp->ccode != 0) { + } else if (rsp->ccode) { lprintf(LOG_ERR, "FWUM Firmware Get Info returned %x", rsp->ccode); return (-1); @@ -479,7 +479,7 @@ KfwumGetInfo(struct ipmi_intf *intf, unsigned char output, printf("Number Of Memory Bank : %u\n", pGetInfo->numBank); } *pNumBank = pGetInfo->numBank; - /* Determine wich type of download to use: */ + /* Determine which type of download to use: */ /* Old FWUM or Old IPMC fw (data_len < 7) * --> Address with small buffer size */ @@ -501,14 +501,14 @@ KfwumGetInfo(struct ipmi_intf *intf, unsigned char output, printf("Protocol Revision :"); printf(" > 5 optimizing buffers\n"); } - if (strstr(intf->name,"lan") != NULL) { + if (strstr(intf->name,"lan")) { /* also covers lanplus */ save_fw_nfo.bufferSize = KFWUM_SMALL_BUFFER; if (verbose) { printf("IOL payload size : %d\n", save_fw_nfo.bufferSize); } - } else if ((strstr(intf->name,"open")!= NULL) + } else if (strstr(intf->name,"open") && intf->target_addr != IPMI_BMC_SLAVE_ADDR && (intf->target_addr != intf->my_addr)) { save_fw_nfo.bufferSize = KFWUM_SMALL_BUFFER; @@ -549,10 +549,10 @@ KfwumGetDeviceInfo(struct ipmi_intf *intf, unsigned char output, req.msg.data_len = 0; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Error in Get Device Id Command"); return (-1); - } else if (rsp->ccode != 0) { + } else if (rsp->ccode) { lprintf(LOG_ERR, "Get Device Id returned %x", rsp->ccode); return (-1); @@ -598,19 +598,19 @@ KfwumGetStatus(struct ipmi_intf * intf) if (verbose) { printf(" Getting Status!\n"); } - /* Retreive the number of bank */ + /* Retrieve the number of bank */ rc = KfwumGetInfo(intf, 0, &numBank); for(counter = 0; (counter < numBank) && (rc == 0); counter ++) { - /* Retreive the status of each bank */ + /* Retrieve the status of each bank */ memset(&req, 0, sizeof(req)); req.msg.netfn = IPMI_NETFN_FIRMWARE; req.msg.cmd = KFWUM_CMD_ID_GET_FIRMWARE_STATUS; req.msg.data = &counter; req.msg.data_len = 1; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Error in FWUM Firmware Get Status Command."); rc = (-1); @@ -668,10 +668,10 @@ KfwumManualRollback(struct ipmi_intf *intf) req.msg.data_len = 1; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Error in FWUM Manual Rollback Command."); return (-1); - } else if (rsp->ccode != 0) { + } else if (rsp->ccode) { lprintf(LOG_ERR, "Error in FWUM Manual Rollback Command returned %x", rsp->ccode); @@ -707,7 +707,7 @@ KfwumStartFirmwareImage(struct ipmi_intf *intf, unsigned long length, req.msg.data_len = 6; } rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Error in FWUM Firmware Start Firmware Image Download Command."); return (-1); @@ -755,13 +755,13 @@ KfwumSaveFirmwareImage(struct ipmi_intf *intf, unsigned char sequenceNumber, /* + 1 => sequenceNumber*/ } rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Error in FWUM Firmware Save Firmware Image Download Command."); /* We don't receive "C7" on errors with IOL, * instead we receive nothing */ - if (strstr(intf->name, "lan") != NULL) { + if (strstr(intf->name, "lan")) { no_rsp++; if (no_rsp < FWUM_SAVE_FIRMWARE_NO_RESPONSE_LIMIT) { *pInBufLength -= 1; @@ -772,7 +772,7 @@ KfwumSaveFirmwareImage(struct ipmi_intf *intf, unsigned char sequenceNumber, *pInBufLength = 0; break; } /* For other interface keep trying */ - } else if (rsp->ccode != 0) { + } else if (rsp->ccode) { if (rsp->ccode == 0xc0) { sleep(1); } else if ((rsp->ccode == 0xc7) @@ -836,9 +836,9 @@ KfwumFinishFirmwareImage(struct ipmi_intf *intf, tKFWUM_InFirmwareInfo firmInfo) /* Infinite loop if BMC doesn't reply or replies 0xc0 every time. */ do { rsp = intf->sendrecv(intf, &req); - } while (rsp == NULL || rsp->ccode == 0xc0); + } while (!rsp || rsp->ccode == 0xc0); - if (rsp->ccode != 0) { + if (rsp->ccode) { lprintf(LOG_ERR, "FWUM Firmware Finish Firmware Image Download returned %x", rsp->ccode); @@ -917,7 +917,7 @@ KfwumStartFirmwareUpgrade(struct ipmi_intf *intf) req.msg.data_len = 1; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Error in FWUM Firmware Start Firmware Upgrade Command"); rc = (-1); @@ -950,7 +950,7 @@ KfwumGetTraceLog(struct ipmi_intf *intf) (chunkIdx < TRACE_LOG_CHUNK_COUNT) && (rc == 0); chunkIdx++) { - /* Retreive each log chunk and print it */ + /* Retrieve each log chunk and print it */ memset(&req, 0, sizeof(req)); req.msg.netfn = IPMI_NETFN_FIRMWARE; req.msg.cmd = KFWUM_CMD_ID_GET_TRACE_LOG; @@ -958,7 +958,7 @@ KfwumGetTraceLog(struct ipmi_intf *intf) req.msg.data_len = 1; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Error in FWUM Firmware Get Trace Log Command"); rc = (-1); @@ -971,7 +971,7 @@ KfwumGetTraceLog(struct ipmi_intf *intf) break; } for (cmdIdx=0; cmdIdx < TRACE_LOG_CHUNK_SIZE; cmdIdx++) { - /* Don't diplay commands with an invalid state */ + /* Don't display commands with an invalid state */ if ((rsp->data[TRACE_LOG_ATT_COUNT * cmdIdx + 1] != 0) && (rsp->data[TRACE_LOG_ATT_COUNT * cmdIdx] < KFWUM_CMD_ID_STD_MAX_CMD)) { printf(" Cmd ID: %17s -- CmdState: %10s -- CompCode: %2x\n", @@ -1001,7 +1001,7 @@ KfwumGetInfoFromFirmware(unsigned char *pBuf, unsigned long bufSize, } offset = IN_FIRMWARE_INFO_OFFSET_LOCATION; - /* Now, fill the structure with read informations */ + /* Now, fill the structure with read information */ pInfo->checksum = (unsigned short)KWUM_GET_BYTE_AT_OFFSET(pBuf, offset + 0 + IN_FIRMWARE_INFO_OFFSET_CHECKSUM ) << 8; diff --git a/lib/ipmi_gendev.c b/lib/ipmi_gendev.c index 7a4cf08..215a717 100644 --- a/lib/ipmi_gendev.c +++ b/lib/ipmi_gendev.c @@ -71,7 +71,6 @@ typedef struct gendev_eeprom_info static int ipmi_gendev_get_eeprom_size( - struct ipmi_intf *intf, struct sdr_record_generic_locator *dev, t_gendev_eeprom_info *info ) @@ -88,8 +87,7 @@ ipmi_gendev_get_eeprom_size( lprintf(LOG_ERR, "DevType : %x", dev->dev_type); lprintf(LOG_ERR, "DevType Mod: %x", dev->dev_type_modifier); */ - if( info != NULL) - { + if (info) { switch(dev->dev_type) { case 0x08: // 24C01 @@ -192,7 +190,7 @@ ipmi_gendev_read_file( int eeprom_size; t_gendev_eeprom_info eeprom_info; - eeprom_size = ipmi_gendev_get_eeprom_size(intf, dev, &eeprom_info); + eeprom_size = ipmi_gendev_get_eeprom_size(dev, &eeprom_info); if(eeprom_size > 0) { @@ -280,8 +278,7 @@ ipmi_gendev_read_file( msize ); - if (rsp != NULL) - { + if (rsp) { retryCounter = GENDEV_RETRY_COUNT; rc = 0; } @@ -364,7 +361,7 @@ ipmi_gendev_write_file( int eeprom_size; t_gendev_eeprom_info eeprom_info; - eeprom_size = ipmi_gendev_get_eeprom_size(intf, dev, &eeprom_info); + eeprom_size = ipmi_gendev_get_eeprom_size(dev, &eeprom_info); if(eeprom_size > 0) { @@ -376,7 +373,7 @@ ipmi_gendev_write_file( if(fp) { - /* Retreive file length, check if it's fits the Eeprom Size */ + /* Retrieve file length, check if it's fits the Eeprom Size */ fseek(fp, 0 ,SEEK_END); fileLength = ftell(fp); @@ -457,8 +454,6 @@ ipmi_gendev_write_file( break; } - - for( retryCounter = 0; retryCounter<GENDEV_RETRY_COUNT; @@ -476,8 +471,7 @@ ipmi_gendev_write_file( i2caddr+= (((eeprom_info.size) % address_span_size) * 2); rsp = ipmi_master_write_read(intf, i2cbus, i2caddr, (uint8_t *) wrByte, eeprom_info.address_length+msize, 0); - if (rsp != NULL) - { + if (rsp) { retryCounter = GENDEV_RETRY_COUNT; rc = 0; } @@ -495,8 +489,7 @@ ipmi_gendev_write_file( } } - if( rc == 0 ) - { + if (!rc) { static uint8_t previousCompleted = 101; percentCompleted = ((counter * 100) / eeprom_info.size ); @@ -548,11 +541,7 @@ ipmi_gendev_main(struct ipmi_intf *intf, int argc, char **argv) lprintf(LOG_ERR, "Rx gendev command: %s", argv[0]); - if ( - (argc == 0) - || - (strncmp(argv[0], "help", 4) == 0) - ) + if (!argc || !strcmp(argv[0], "help")) { lprintf(LOG_ERR, "SDR Commands: list read write"); @@ -562,18 +551,12 @@ ipmi_gendev_main(struct ipmi_intf *intf, int argc, char **argv) " read <sdr name> <file> Read to file eeprom specify by Generic Device Locators"); lprintf(LOG_ERR, " write <sdr name> <file> Write from file eeprom specify by Generic Device Locators"); - } - else if ( strncmp(argv[0], "list", 4) == 0) - { - rc = ipmi_sdr_print_sdr(intf, - SDR_RECORD_TYPE_GENERIC_DEVICE_LOCATOR); - } - else if (strncmp(argv[0], "read", 4) == 0) - { + } else if (!strcmp(argv[0], "list")) { + rc = ipmi_sdr_print_sdr(intf, SDR_RECORD_TYPE_GENERIC_DEVICE_LOCATOR); + } else if (!strcmp(argv[0], "read")) { if (argc < 3) lprintf(LOG_ERR, "usage: gendev read <gendev> <filename>"); - else - { + else { struct sdr_record_list *sdr; lprintf(LOG_ERR, "Gendev read sdr name : %s", argv[1]); @@ -582,14 +565,12 @@ ipmi_gendev_main(struct ipmi_intf *intf, int argc, char **argv) /* lookup by sensor name */ sdr = ipmi_sdr_find_sdr_byid(intf, argv[1]); - if (sdr == NULL) - { + if (!sdr) { lprintf(LOG_ERR, "Sensor data record not found!"); return -1; } - if (sdr->type != SDR_RECORD_TYPE_GENERIC_DEVICE_LOCATOR) - { + if (sdr->type != SDR_RECORD_TYPE_GENERIC_DEVICE_LOCATOR) { lprintf(LOG_ERR, "Target SDR is not a generic device locator"); return -1; } @@ -598,13 +579,10 @@ ipmi_gendev_main(struct ipmi_intf *intf, int argc, char **argv) ipmi_gendev_read_file(intf, sdr->record.genloc, argv[2]); } - } - else if (strncmp(argv[0], "write", 5) == 0) - { + } else if (!strcmp(argv[0], "write")) { if (argc < 3) lprintf(LOG_ERR, "usage: gendev write <gendev> <filename>"); - else - { + else { struct sdr_record_list *sdr; lprintf(LOG_ERR, "Gendev write sdr name : %s", argv[1]); @@ -613,25 +591,20 @@ ipmi_gendev_main(struct ipmi_intf *intf, int argc, char **argv) /* lookup by sensor name */ sdr = ipmi_sdr_find_sdr_byid(intf, argv[1]); - if (sdr == NULL) - { + if (!sdr) { lprintf(LOG_ERR, "Sensor data record not found!"); return -1; } - if (sdr->type != SDR_RECORD_TYPE_GENERIC_DEVICE_LOCATOR) - { + if (sdr->type != SDR_RECORD_TYPE_GENERIC_DEVICE_LOCATOR) { lprintf(LOG_ERR, "Target SDR is not a generic device locator"); return -1; } lprintf(LOG_ERR, "Gendev write file name: %s", argv[2]); ipmi_gendev_write_file(intf, sdr->record.genloc, argv[2]); - } - } - else - { + } else { lprintf(LOG_ERR, "Invalid gendev command: %s", argv[0]); rc = -1; } diff --git a/lib/ipmi_hpmfwupg.c b/lib/ipmi_hpmfwupg.c index bbcffc0..ea9072e 100644 --- a/lib/ipmi_hpmfwupg.c +++ b/lib/ipmi_hpmfwupg.c @@ -1,6 +1,7 @@ /* * Copyright (c) 2006 Kontron Canada, Inc. All Rights Reserved. * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved. + * Copyright 2020 Joyent, Inc. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -30,10 +31,6 @@ * LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, * EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. */ -#define _BSD_SOURCE || \ - (_XOPEN_SOURCE >= 500 || \ - _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED) && \ - !(_POSIX_C_SOURCE >= 200809L || _XOPEN_SOURCE >= 700) #include <ipmitool/ipmi_intf.h> #include <ipmitool/ipmi_mc.h> @@ -52,12 +49,27 @@ # include <config.h> #endif -/* From src/plugins/ipmi_intf.c: */ -uint16_t -ipmi_intf_get_max_request_data_size(struct ipmi_intf * intf); +/* + * This error code is used as a temporary PATCH to + * the latest Open ipmi driver. This PATCH + * will be removed once a new Open IPMI driver is released. + * (Buggy version = 39) + */ +#define ENABLE_OPENIPMI_V39_PATCH + +#ifdef ENABLE_OPENIPMI_V39_PATCH +# define RETRY_COUNT_MAX 3 +static int errorCount; +# define HPMFWUPG_IS_RETRYABLE(error) \ + ((((error==0x83)||(error==0x82)||(error==0x80)) && (errorCount++<RETRY_COUNT_MAX))?TRUE:FALSE) +#else +# define HPMFWUPG_IS_RETRYABLE(error) FALSE +#endif extern int verbose; +VERSIONINFO gVersionInfo[HPMFWUPG_COMPONENT_ID_MAX]; + int HpmfwupgUpgrade(struct ipmi_intf *intf, char *imageFilename, int activate, int, int); int HpmfwupgValidateImageIntegrity(struct HpmfwupgUpgradeCtx *pFwupgCtx); @@ -117,7 +129,7 @@ int HpmFwupgActionUploadFirmware(struct HpmfwupgComponentBitMask components, int option, int *pFlagColdReset); int -HpmfwupgPreUpgradeCheck(struct ipmi_intf *intf, +HpmfwupgPreUpgradeCheck( struct HpmfwupgUpgradeCtx *pFwupgCtx, int componentMask, int option); @@ -507,10 +519,9 @@ HpmfwupgUpgrade(struct ipmi_intf *intf, char *imageFilename, int activate, lprintf(LOG_NOTICE, "\nPerforming upgrade stage:"); } if (option & VIEW_MODE) { - rc = HpmfwupgPreUpgradeCheck(intf, - &fwupgCtx,componentMask, VIEW_MODE); + rc = HpmfwupgPreUpgradeCheck(&fwupgCtx,componentMask, VIEW_MODE); } else { - rc = HpmfwupgPreUpgradeCheck(intf, &fwupgCtx, + rc = HpmfwupgPreUpgradeCheck(&fwupgCtx, componentMask, option); if (rc == HPMFWUPG_SUCCESS) { if (verbose) { @@ -534,7 +545,7 @@ HpmfwupgUpgrade(struct ipmi_intf *intf, char *imageFilename, int activate, } if (rc == HPMFWUPG_SUCCESS) { if (option & VIEW_MODE) { - /* Dont display anything here in case we are just viewing it */ + /* Don't display anything here in case we are just viewing it */ lprintf(LOG_NOTICE," "); } else if (option & COMPARE_MODE) { lprintf(LOG_NOTICE, @@ -544,7 +555,7 @@ HpmfwupgUpgrade(struct ipmi_intf *intf, char *imageFilename, int activate, "\nFirmware upgrade procedure successful\n"); } } else if (option & VIEW_MODE) { - /* Dont display anything here in case we are just viewing it */ + /* Don't display anything here in case we are just viewing it */ lprintf(LOG_NOTICE," "); } else if (option & COMPARE_MODE) { lprintf(LOG_NOTICE, @@ -653,7 +664,7 @@ HpmfwupgPreparationStage(struct ipmi_intf *intf, if (rc != HPMFWUPG_SUCCESS) { /* Giving one more chance to user to check whether its OK to continue even if the * product ID does not match. This is helpful as sometimes we just want to update - * and dont care whether we have a different product Id. If the user says NO then + * and don't care whether we have a different product Id. If the user says NO then * we need to just bail out from here */ if (!((option & FORCE_MODE) || (option & VIEW_MODE))) { @@ -725,7 +736,7 @@ HpmfwupgPreparationStage(struct ipmi_intf *intf, "\n Some components present in the image file are not supported by the IPMC"); return HPMFWUPG_ERROR; } - /* Make sure the upgrade is desirable rigth now */ + /* Make sure the upgrade is desirable right now */ if (pFwupgCtx->targetCap.GlobalCapabilities.bitField.fwUpgUndesirable == 1) { lprintf(LOG_NOTICE, "\n Upgrade undesirable at this moment"); return HPMFWUPG_ERROR; @@ -834,7 +845,7 @@ HpmfwupgValidateActionRecordChecksum(struct HpmfwupgActionRecord *pActionRecord) * is same as target version. */ int -HpmfwupgPreUpgradeCheck(struct ipmi_intf *intf, +HpmfwupgPreUpgradeCheck( struct HpmfwupgUpgradeCtx *pFwupgCtx, int componentMask, int option) { @@ -1213,7 +1224,7 @@ HpmFwupgActionUploadFirmware(struct HpmfwupgComponentBitMask components, if (rc == HPMFWUPG_UPLOAD_BLOCK_LENGTH && !bufLengthIsSet) { rc = HPMFWUPG_SUCCESS; /* Retry with a smaller buffer length */ - if (strstr(intf->name,"lan") != NULL && bufLength > 8) { + if (strstr(intf->name,"lan") && bufLength > 8) { bufLength-= 8; lprintf(LOG_INFO, "Trying reduced buffer length: %d", @@ -1304,7 +1315,7 @@ HpmFwupgActionUploadFirmware(struct HpmfwupgComponentBitMask components, HpmDisplayUpgrade(1,0,0,0); if ((option & COMPARE_MODE) && !pFwupgCtx->genCompProp[pFwupgCtx->componentId].GeneralCompProperties.bitfield.comparisonSupport) { - printf("| |Comparison isn't supported for given compenent. |\n"); + printf("| |Comparison isn't supported for given component. |\n"); } *pImagePtr = pDataInitial + firmwareLength; } @@ -1390,27 +1401,26 @@ int HpmfwupgGetBufferFromFile(char *imageFilename, struct HpmfwupgUpgradeCtx *pFwupgCtx) { - int rc = HPMFWUPG_SUCCESS; + int rc = HPMFWUPG_ERROR; int ret = 0; FILE *pImageFile = fopen(imageFilename, "rb"); - if (pImageFile == NULL) { + if (!pImageFile) { lprintf(LOG_ERR, "Cannot open image file '%s'", imageFilename); - return HPMFWUPG_ERROR; + goto ret_no_close; } /* Get the raw data in file */ ret = fseek(pImageFile, 0, SEEK_END); if (ret != 0) { lprintf(LOG_ERR, "Failed to seek in the image file '%s'", imageFilename); - return HPMFWUPG_ERROR; + goto ret_close; } pFwupgCtx->imageSize = ftell(pImageFile); pFwupgCtx->pImageData = malloc(sizeof(unsigned char)*pFwupgCtx->imageSize); - if (pFwupgCtx->pImageData == NULL) { + if (!pFwupgCtx->pImageData) { lprintf(LOG_ERR, "ipmitool: malloc failure"); - fclose(pImageFile); - return HPMFWUPG_ERROR; + goto ret_close; } rewind(pImageFile); ret = fread(pFwupgCtx->pImageData, @@ -1422,9 +1432,14 @@ HpmfwupgGetBufferFromFile(char *imageFilename, "Failed to read file %s size %d", imageFilename, pFwupgCtx->imageSize); - rc = HPMFWUPG_ERROR; + goto ret_close; } + + rc = HPMFWUPG_SUCCESS; + +ret_close: fclose(pImageFile); +ret_no_close: return rc; } @@ -1438,11 +1453,11 @@ HpmfwupgGetDeviceId(struct ipmi_intf *intf, struct ipm_devid_rsp *pGetDevId) req.msg.cmd = BMC_GET_DEVICE_ID; req.msg.data_len = 0; rsp = HpmfwupgSendCmd(intf, req, NULL); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Error getting device ID."); return HPMFWUPG_ERROR; } - if (rsp->ccode != 0x00) { + if (rsp->ccode) { lprintf(LOG_ERR, "Error getting device ID."); lprintf(LOG_ERR, "compcode=0x%x: %s", rsp->ccode, @@ -1466,12 +1481,12 @@ HpmfwupgGetTargetUpgCapabilities(struct ipmi_intf *intf, req.msg.data = (unsigned char*)&pCtx->req; req.msg.data_len = sizeof(struct HpmfwupgGetTargetUpgCapabilitiesReq); rsp = HpmfwupgSendCmd(intf, req, NULL); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Error getting target upgrade capabilities."); return HPMFWUPG_ERROR; } - if (rsp->ccode != 0x00) { + if (rsp->ccode) { lprintf(LOG_ERR, "Error getting target upgrade capabilities, ccode: 0x%x: %s", rsp->ccode, @@ -1507,7 +1522,7 @@ HpmfwupgGetTargetUpgCapabilities(struct ipmi_intf *intf, pCtx->resp.GlobalCapabilities.bitField.autRollbackOverride ? 'y' : 'n'); lprintf(LOG_NOTICE, "IPMC degraded...........[%c] ", pCtx->resp.GlobalCapabilities.bitField.ipmcDegradedDurinUpg ? 'y' : 'n'); - lprintf(LOG_NOTICE, "Defered activation......[%c] ", + lprintf(LOG_NOTICE, "Deferred activation.....[%c] ", pCtx->resp.GlobalCapabilities.bitField.deferActivation ? 'y' : 'n'); lprintf(LOG_NOTICE, "Service affected........[%c] ", pCtx->resp.GlobalCapabilities.bitField.servAffectDuringUpg ? 'y' : 'n'); @@ -1543,12 +1558,12 @@ HpmfwupgGetComponentProperties(struct ipmi_intf *intf, req.msg.data = (unsigned char*)&pCtx->req; req.msg.data_len = sizeof(struct HpmfwupgGetComponentPropertiesReq); rsp = HpmfwupgSendCmd(intf, req, NULL); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_NOTICE, "Error getting component properties\n"); return HPMFWUPG_ERROR; } - if (rsp->ccode != 0x00) { + if (rsp->ccode) { lprintf(LOG_NOTICE, "Error getting component properties"); lprintf(LOG_NOTICE, @@ -1669,11 +1684,11 @@ HpmfwupgAbortUpgrade(struct ipmi_intf *intf, req.msg.data = (unsigned char*)&pCtx->req; req.msg.data_len = sizeof(struct HpmfwupgAbortUpgradeReq); rsp = HpmfwupgSendCmd(intf, req, NULL); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Error - aborting upgrade."); return HPMFWUPG_ERROR; } - if (rsp->ccode != 0x00) { + if (rsp->ccode) { lprintf(LOG_ERR, "Error aborting upgrade"); lprintf(LOG_ERR, "compcode=0x%x: %s", rsp->ccode, @@ -1698,14 +1713,14 @@ HpmfwupgInitiateUpgradeAction(struct ipmi_intf *intf, req.msg.data = (unsigned char*)&pCtx->req; req.msg.data_len = sizeof(struct HpmfwupgInitiateUpgradeActionReq); rsp = HpmfwupgSendCmd(intf, req, pFwupgCtx); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Error initiating upgrade action."); return HPMFWUPG_ERROR; } /* Long duration command handling */ if (rsp->ccode == HPMFWUPG_COMMAND_IN_PROGRESS) { rc = HpmfwupgWaitLongDurationCmd(intf, pFwupgCtx); - } else if (rsp->ccode != 0x00) { + } else if (rsp->ccode) { lprintf(LOG_NOTICE,"Error initiating upgrade action"); lprintf(LOG_NOTICE, "compcode=0x%x: %s", rsp->ccode, @@ -1732,7 +1747,7 @@ HpmfwupgUploadFirmwareBlock(struct ipmi_intf *intf, /* 2 is the size of the upload struct - data */ req.msg.data_len = 2 + count; rsp = HpmfwupgSendCmd(intf, req, pFwupgCtx); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_NOTICE, "Error uploading firmware block."); return HPMFWUPG_ERROR; } @@ -1768,7 +1783,7 @@ HpmfwupgUploadFirmwareBlock(struct ipmi_intf *intf, /* Long duration command handling */ if (rsp->ccode == HPMFWUPG_COMMAND_IN_PROGRESS) { rc = HpmfwupgWaitLongDurationCmd(intf, pFwupgCtx); - } else if (rsp->ccode != 0x00) { + } else if (rsp->ccode) { /* PATCH --> This validation is to handle retryables errors codes on IPMB bus. * This will be fixed in the next release of open ipmi and this * check will have to be removed. (Buggy version = 39) @@ -1809,7 +1824,7 @@ HpmfwupgFinishFirmwareUpload(struct ipmi_intf *intf, req.msg.data = (unsigned char*)&pCtx->req; req.msg.data_len = sizeof(struct HpmfwupgFinishFirmwareUploadReq); rsp = HpmfwupgSendCmd(intf, req, pFwupgCtx); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Error fininshing firmware upload."); return HPMFWUPG_ERROR; } @@ -1846,7 +1861,7 @@ HpmfwupgActivateFirmware(struct ipmi_intf *intf, req.msg.data_len = sizeof(struct HpmfwupgActivateFirmwareReq) - (!pCtx->req.rollback_override ? 1 : 0); rsp = HpmfwupgSendCmd(intf, req, pFwupgCtx); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Error activating firmware."); return HPMFWUPG_ERROR; } @@ -1947,7 +1962,7 @@ HpmfwupgManualFirmwareRollback(struct ipmi_intf *intf, req.msg.data = (unsigned char*)&pCtx->req; req.msg.data_len = sizeof(struct HpmfwupgManualFirmwareRollbackReq); rsp = HpmfwupgSendCmd(intf, req, &fwupgCtx); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Error sending manual rollback."); return HPMFWUPG_ERROR; } @@ -1958,7 +1973,7 @@ HpmfwupgManualFirmwareRollback(struct ipmi_intf *intf, printf("Waiting firmware rollback..."); fflush(stdout); rc = HpmfwupgQueryRollbackStatus(intf, &resCmd, &fwupgCtx); - } else if ( rsp->ccode != 0x00 ) { + } else if (rsp->ccode) { lprintf(LOG_ERR, "Error sending manual rollback"); lprintf(LOG_ERR, "compcode=0x%x: %s", rsp->ccode, @@ -1985,7 +2000,7 @@ HpmfwupgQueryRollbackStatus(struct ipmi_intf *intf, req.msg.data = (unsigned char*)&pCtx->req; req.msg.data_len = sizeof(struct HpmfwupgQueryRollbackStatusReq); /* If we are not in upgrade context, we use default timeout values */ - if (pFwupgCtx != NULL) { + if (pFwupgCtx) { struct HpmfwupgImageHeader *pImageHeader; if (pFwupgCtx->pImageData) { pImageHeader = (struct HpmfwupgImageHeader*)pFwupgCtx->pImageData; @@ -1994,7 +2009,7 @@ HpmfwupgQueryRollbackStatus(struct ipmi_intf *intf, rollbackTimeout = 0; } /* Use the greater of the two timeouts (header and target caps) */ - rollbackTimeout = MAX(rollbackTimeout, + rollbackTimeout = __max(rollbackTimeout, pFwupgCtx->targetCap.rollbackTimeout) * 5; } else { rollbackTimeout = HPMFWUPG_DEFAULT_UPGRADE_TIMEOUT; @@ -2021,7 +2036,7 @@ HpmfwupgQueryRollbackStatus(struct ipmi_intf *intf, && ((rsp->ccode == HPMFWUPG_COMMAND_IN_PROGRESS) || (rsp->ccode == IPMI_CC_TIMEOUT)) && (timeoutSec2 - timeoutSec1 < rollbackTimeout)); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Error getting upgrade status."); return HPMFWUPG_ERROR; } @@ -2065,11 +2080,11 @@ HpmfwupgQuerySelftestResult(struct ipmi_intf *intf, struct HpmfwupgQuerySelftest unsigned int timeoutSec1, timeoutSec2; pCtx->req.picmgId = HPMFWUPG_PICMG_IDENTIFIER; /* If we are not in upgrade context, we use default timeout values */ - if (pFwupgCtx != NULL) { + if (pFwupgCtx) { /* Getting selftest timeout from new image */ struct HpmfwupgImageHeader *pImageHeader = (struct HpmfwupgImageHeader*) pFwupgCtx->pImageData; - selfTestTimeout = MAX(pImageHeader->selfTestTimeout, + selfTestTimeout = __max(pImageHeader->selfTestTimeout, pFwupgCtx->targetCap.selftestTimeout) * 5; } else { selfTestTimeout = HPMFWUPG_DEFAULT_UPGRADE_TIMEOUT; @@ -2101,7 +2116,7 @@ HpmfwupgQuerySelftestResult(struct ipmi_intf *intf, struct HpmfwupgQuerySelftest } while (rsp && (rsp->ccode == HPMFWUPG_COMMAND_IN_PROGRESS) && (timeoutSec2 - timeoutSec1 < selfTestTimeout)); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_NOTICE, "Error getting upgrade status\n"); return HPMFWUPG_ERROR; } @@ -2135,14 +2150,14 @@ HpmfwupgSendCmd(struct ipmi_intf *intf, struct ipmi_rq req, unsigned int timeoutSec1, timeoutSec2; unsigned char retry = 0; /* If we are not in upgrade context, we use default timeout values */ - if (pFwupgCtx != NULL) { + if (pFwupgCtx) { inaccessTimeout = pFwupgCtx->targetCap.inaccessTimeout*5; upgradeTimeout = pFwupgCtx->targetCap.upgradeTimeout*5; } else { /* keeping the inaccessTimeout to 60 seconds results in almost 2900 retries * So if the target is not available it will be retrying the command for 2900 - * times which is not effecient -So reducing the Timout to 5 seconds which is - * almost 200 retries if it continuously recieves 0xC3 as completion code. + * times which is not efficient -So reducing the Timeout to 5 seconds which is + * almost 200 retries if it continuously receives 0xC3 as completion code. */ inaccessTimeout = HPMFWUPG_DEFAULT_UPGRADE_TIMEOUT; upgradeTimeout = HPMFWUPG_DEFAULT_UPGRADE_TIMEOUT; @@ -2151,10 +2166,10 @@ HpmfwupgSendCmd(struct ipmi_intf *intf, struct ipmi_rq req, do { static unsigned char isValidSize = FALSE; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { #define HPM_LAN_PACKET_RESIZE_LIMIT 6 /* also covers lanplus */ - if (strstr(intf->name, "lan") != NULL) { + if (strstr(intf->name, "lan")) { static int errorCount=0; static struct ipmi_rs fakeRsp; lprintf(LOG_DEBUG, @@ -2219,7 +2234,7 @@ HpmfwupgSendCmd(struct ipmi_intf *intf, struct ipmi_rq req, } } /* Handle inaccessibility timeout (rsp = NULL if IOL) */ - if (rsp == NULL || rsp->ccode == 0xff || rsp->ccode == 0xc3 || rsp->ccode == 0xd3) { + if (!rsp || rsp->ccode == 0xff || rsp->ccode == 0xc3 || rsp->ccode == 0xd3) { if (inaccessTimeoutCounter < inaccessTimeout) { timeoutSec2 = time(NULL); if (timeoutSec2 > timeoutSec1) { @@ -2272,14 +2287,14 @@ HpmfwupgWaitLongDurationCmd(struct ipmi_intf *intf, unsigned int timeoutSec1, timeoutSec2; struct HpmfwupgGetUpgradeStatusCtx upgStatusCmd; /* If we are not in upgrade context, we use default timeout values */ - if (pFwupgCtx != NULL) { + if (pFwupgCtx) { upgradeTimeout = (unsigned int)(pFwupgCtx->targetCap.upgradeTimeout*5); if (verbose) { printf("Use File Upgrade Capabilities: %i seconds\n", upgradeTimeout); } } else { - /* Try to retreive from Caps */ + /* Try to retrieve from Caps */ struct HpmfwupgGetTargetUpgCapabilitiesCtx targetCapCmd; if(HpmfwupgGetTargetUpgCapabilities(intf, &targetCapCmd) != HPMFWUPG_SUCCESS) { upgradeTimeout = HPMFWUPG_DEFAULT_UPGRADE_TIMEOUT; @@ -2295,13 +2310,9 @@ HpmfwupgWaitLongDurationCmd(struct ipmi_intf *intf, } } } - if (rc == HPMFWUPG_SUCCESS) { - /* Poll upgrade status until completion or timeout*/ - timeoutSec1 = time(NULL); - timeoutSec2 = time(NULL); - rc = HpmfwupgGetUpgradeStatus(intf, &upgStatusCmd, - pFwupgCtx, 1); - } + /* Poll upgrade status until completion or timeout*/ + timeoutSec2 = timeoutSec1 = time(NULL); + rc = HpmfwupgGetUpgradeStatus(intf, &upgStatusCmd, pFwupgCtx, 1); while ( /* With KCS: Cover the case where we sometime * receive d5 (on the first get status) from @@ -2464,12 +2475,12 @@ ipmi_hpmfwupg_main(struct ipmi_intf *intf, int argc, char **argv) HpmfwupgPrintUsage(); return HPMFWUPG_ERROR; } - if (strcmp(argv[0], "help") == 0) { + if (!strcmp(argv[0], "help")) { HpmfwupgPrintUsage(); return HPMFWUPG_SUCCESS; - } else if ((strcmp(argv[0], "check") == 0)) { + } else if (!strcmp(argv[0], "check")) { /* hpm check */ - if (argv[1] == NULL) { + if (!argv[1]) { rc = HpmfwupgTargetCheck(intf,VIEW_MODE); } else { /* hpm check <filename> */ @@ -2479,18 +2490,18 @@ ipmi_hpmfwupg_main(struct ipmi_intf *intf, int argc, char **argv) 0, VIEW_MODE); } } - } else if (strcmp(argv[0], "upgrade") == 0) { + } else if (!strcmp(argv[0], "upgrade")) { int i =0; for (i=1; i< argc ; i++) { - if (strcmp(argv[i],"activate") == 0) { + if (!strcmp(argv[i],"activate")) { activateFlag = 1; } /* hpm upgrade <filename> force */ - if (strcmp(argv[i],"force") == 0) { + if (!strcmp(argv[i],"force")) { option |= FORCE_MODE; } /* hpm upgrade <filename> component <comp Id> */ - if (strcmp(argv[i],"component") == 0) { + if (!strcmp(argv[i],"component")) { if (i+1 < argc) { /* Error Checking */ if (str2int(argv[i+1], &componentId) != 0 @@ -2519,7 +2530,7 @@ ipmi_hpmfwupg_main(struct ipmi_intf *intf, int argc, char **argv) return HPMFWUPG_ERROR; } } - if (strcmp(argv[i],"debug") == 0) { + if (!strcmp(argv[i],"debug")) { option |= DEBUG_MODE; } } @@ -2529,11 +2540,11 @@ ipmi_hpmfwupg_main(struct ipmi_intf *intf, int argc, char **argv) rc = HpmfwupgUpgrade(intf, argv[1], activateFlag, componentMask, option); } - } else if (strcmp(argv[0], "compare") == 0) { + } else if (!strcmp(argv[0], "compare")) { int i = 0; for (i=1; i< argc; i++) { /* hpm compare <file> [component x...] */ - if (strcmp(argv[i],"component") == 0) { + if (!strcmp(argv[i],"component")) { if (i+1 < argc) { /* Error Checking */ if (str2int(argv[i+1], &componentId) != 0 @@ -2562,7 +2573,7 @@ ipmi_hpmfwupg_main(struct ipmi_intf *intf, int argc, char **argv) "No component Id provided\n"); return HPMFWUPG_ERROR; } - } else if (strcmp(argv[i],"debug") == 0) { + } else if (!strcmp(argv[i],"debug")) { option|= DEBUG_MODE; } } @@ -2572,19 +2583,19 @@ ipmi_hpmfwupg_main(struct ipmi_intf *intf, int argc, char **argv) rc = HpmfwupgUpgrade(intf, argv[1], 0, componentMask, option); } - } else if ((argc >= 1) && (strcmp(argv[0], "activate") == 0)) { + } else if (argc >= 1 && !strcmp(argv[0], "activate")) { struct HpmfwupgActivateFirmwareCtx cmdCtx; - if ((argc == 2) && (strcmp(argv[1], "norollback") == 0)) { + if (argc == 2 && !strcmp(argv[1], "norollback")) { cmdCtx.req.rollback_override = 1; } else { cmdCtx.req.rollback_override = 0; } rc = HpmfwupgActivateFirmware(intf, &cmdCtx, NULL); - } else if ((argc == 1) && (strcmp(argv[0], "targetcap") == 0)) { + } else if (argc == 1 && !strcmp(argv[0], "targetcap")) { struct HpmfwupgGetTargetUpgCapabilitiesCtx cmdCtx; verbose++; rc = HpmfwupgGetTargetUpgCapabilities(intf, &cmdCtx); - } else if ((argc == 3) && (strcmp(argv[0], "compprop") == 0)) { + } else if (argc == 3 && !strcmp(argv[0], "compprop")) { struct HpmfwupgGetComponentPropertiesCtx cmdCtx; if (str2uchar(argv[1], &(cmdCtx.req.componentId)) != 0 || cmdCtx.req.componentId > 7) { @@ -2606,23 +2617,23 @@ ipmi_hpmfwupg_main(struct ipmi_intf *intf, int argc, char **argv) } verbose++; rc = HpmfwupgGetComponentProperties(intf, &cmdCtx); - } else if ((argc == 1) && (strcmp(argv[0], "abort") == 0)) { + } else if (argc == 1 && !strcmp(argv[0], "abort")) { struct HpmfwupgAbortUpgradeCtx cmdCtx; verbose++; rc = HpmfwupgAbortUpgrade(intf, &cmdCtx); - } else if ((argc == 1) && (strcmp(argv[0], "upgstatus") == 0)) { + } else if (argc == 1 && !strcmp(argv[0], "upgstatus")) { struct HpmfwupgGetUpgradeStatusCtx cmdCtx; verbose++; rc = HpmfwupgGetUpgradeStatus(intf, &cmdCtx, NULL, 0); - } else if ((argc == 1) && (strcmp(argv[0], "rollback") == 0)) { + } else if (argc == 1 && !strcmp(argv[0], "rollback")) { struct HpmfwupgManualFirmwareRollbackCtx cmdCtx; verbose++; rc = HpmfwupgManualFirmwareRollback(intf, &cmdCtx); - } else if ((argc == 1) && (strcmp(argv[0], "rollbackstatus") == 0)) { + } else if (argc == 1 && !strcmp(argv[0], "rollbackstatus")) { struct HpmfwupgQueryRollbackStatusCtx cmdCtx; verbose++; rc = HpmfwupgQueryRollbackStatus(intf, &cmdCtx, NULL); - } else if ((argc == 1) && (strcmp(argv[0], "selftestresult") == 0)) { + } else if (argc == 1 && !strcmp(argv[0], "selftestresult")) { struct HpmfwupgQuerySelftestResultCtx cmdCtx; verbose++; rc = HpmfwupgQuerySelftestResult(intf, &cmdCtx, NULL); diff --git a/lib/ipmi_ime.c b/lib/ipmi_ime.c index 6bdca3b..5499eba 100755..100644 --- a/lib/ipmi_ime.c +++ b/lib/ipmi_ime.c @@ -202,11 +202,11 @@ static int ImeGetInfo(struct ipmi_intf *intf) req.msg.data_len = 0; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Get Device ID command failed"); return IME_ERROR; } - if (rsp->ccode > 0) { + if (rsp->ccode) { lprintf(LOG_ERR, "Get Device ID command failed: %s", val2str(rsp->ccode, completion_code_vals)); return IME_ERROR; @@ -240,8 +240,7 @@ static int ImeGetInfo(struct ipmi_intf *intf) { rc = IME_SUCCESS; printf("Manufacturer Name : %s\n", - val2str( (long)IPM_DEV_MANUFACTURER_ID(devid->manufacturer_id), - ipmi_oem_info) ); + OEM_MFG_STRING(devid->manufacturer_id)); printf("Product ID : %u (0x%02x%02x)\n", buf2short((uint8_t *)(devid->product_id)), @@ -251,7 +250,7 @@ static int ImeGetInfo(struct ipmi_intf *intf) (devid->product_id[1]<<8)+devid->product_id[0], ipmi_oem_product_info); - if (product!=NULL) + if (product) { printf("Product Name : %s\n", product); } @@ -357,12 +356,7 @@ static int ImeUpgrade(struct ipmi_intf *intf, char* imageFilename) rc = ImeImageCtxFromFile(imageFilename, &imgCtx); - if( - (rc == IME_ERROR) || - (imgCtx.pData == NULL) || - (imgCtx.size == 0) - ) - { + if (rc == IME_ERROR || !imgCtx.pData || !imgCtx.size) { return IME_ERROR; } @@ -510,11 +504,11 @@ static int ImeUpdatePrepare(struct ipmi_intf *intf) req.msg.data_len = 0; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "UpdatePrepare command failed"); return IME_ERROR; } - if (rsp->ccode > 0) { + if (rsp->ccode) { lprintf(LOG_ERR, "UpdatePrepare command failed: %s", val2str(rsp->ccode, completion_code_vals)); return IME_ERROR; @@ -545,11 +539,11 @@ static int ImeUpdateOpenArea(struct ipmi_intf *intf) req.msg.data_len = 2; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "UpdateOpenArea command failed"); return IME_ERROR; } - if (rsp->ccode > 0) { + if (rsp->ccode) { lprintf(LOG_ERR, "UpdateOpenArea command failed: %s", val2str(rsp->ccode, completion_code_vals)); return IME_ERROR; @@ -585,11 +579,11 @@ static int ImeUpdateWriteArea( req.msg.data_len = length + 1; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "UpdateWriteArea command failed"); return IME_ERROR; } - if (rsp->ccode > 0) { + if (rsp->ccode) { lprintf(LOG_ERR, "UpdateWriteArea command failed: %s", val2str(rsp->ccode, completion_code_vals)); if( rsp->ccode == 0x80) // restart operation @@ -632,11 +626,11 @@ static int ImeUpdateCloseArea( req.msg.data_len = length; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "UpdateCloseArea command failed"); return IME_ERROR; } - if (rsp->ccode > 0) { + if (rsp->ccode) { lprintf(LOG_ERR, "UpdateCloseArea command failed: %s", val2str(rsp->ccode, completion_code_vals)); return IME_ERROR; @@ -666,11 +660,11 @@ static int ImeUpdateGetStatus(struct ipmi_intf *intf, tImeStatus *pStatus ) req.msg.data_len = 0; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "UpdatePrepare command failed"); return IME_ERROR; } - if (rsp->ccode > 0) { + if (rsp->ccode) { lprintf(LOG_ERR, "UpdatePrepare command failed: %s", val2str(rsp->ccode, completion_code_vals)); return IME_ERROR; @@ -739,11 +733,11 @@ static int ImeUpdateGetCapabilities(struct ipmi_intf *intf, tImeCaps *pCaps ) req.msg.data_len = 0; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "UpdatePrepare command failed"); return IME_ERROR; } - if (rsp->ccode > 0) { + if (rsp->ccode) { lprintf(LOG_ERR, "UpdatePrepare command failed: %s", val2str(rsp->ccode, completion_code_vals)); return IME_ERROR; @@ -779,11 +773,11 @@ static int ImeUpdateRegisterUpdate(struct ipmi_intf *intf, tImeUpdateType type) req.msg.data_len = 2; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "ImeUpdateRegisterUpdate command failed"); return IME_ERROR; } - if (rsp->ccode > 0) { + if (rsp->ccode) { lprintf(LOG_ERR, "ImeUpdateRegisterUpdate command failed: %s", val2str(rsp->ccode, completion_code_vals)); return IME_ERROR; @@ -810,11 +804,11 @@ static int ImeUpdateShowStatus(struct ipmi_intf *intf) req.msg.data_len = 0; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "UpdatePrepare command failed"); return IME_ERROR; } - if (rsp->ccode > 0) { + if (rsp->ccode) { lprintf(LOG_ERR, "UpdatePrepare command failed: %s", val2str(rsp->ccode, completion_code_vals)); return IME_ERROR; @@ -879,15 +873,13 @@ static int ImeImageCtxFromFile( { int rc = IME_SUCCESS; FILE* pImageFile = fopen(imageFilename, "rb"); - - if ( pImageFile == NULL ) - { + + if (!pImageFile) { lprintf(LOG_NOTICE,"Cannot open image file %s", imageFilename); rc = IME_ERROR; } - - if ( rc == IME_SUCCESS ) - { + + if (rc == IME_SUCCESS) { /* Get the raw data in file */ fseek(pImageFile, 0, SEEK_END); pImageCtx->size = ftell(pImageFile); @@ -901,32 +893,26 @@ static int ImeImageCtxFromFile( pImageCtx->pData = malloc(sizeof(unsigned char)*pImageCtx->size); rewind(pImageFile); - if ( pImageCtx->pData != NULL ) - { - if (pImageCtx->size < fread(pImageCtx->pData, sizeof(unsigned char), - pImageCtx->size, pImageFile)) - rc = IME_ERROR; - } - else + if (!pImageCtx->pData + || pImageCtx->size < fread(pImageCtx->pData, sizeof(unsigned char), + pImageCtx->size, pImageFile)) { rc = IME_ERROR; } } - + // Calculate checksum CRC8 if ( rc == IME_SUCCESS ) { pImageCtx->crc8 = ImeCrc8(pImageCtx->size, pImageCtx->pData); } - - if( pImageFile != NULL) - { + if (pImageFile) { fclose(pImageFile); } - + return rc; -} +} static uint8_t ImeCrc8( uint32_t length, uint8_t * pBuf ) { @@ -1002,16 +988,13 @@ int ipmi_ime_main(struct ipmi_intf * intf, int argc, char ** argv) lprintf(LOG_DEBUG,"ipmi_ime_main()"); - if ( (argc == 0) || (strcmp(argv[0], "help") == 0) ) - { + if (!argc || !strcmp(argv[0], "help")) { ImePrintUsage(); } - else if ( (argc == 0) || (strcmp(argv[0], "info") == 0) ) - { + else if (!strcmp(argv[0], "info")) { rc = ImeGetInfo(intf); } - else if ( strcmp(argv[0], "update") == 0) - { + else if (!strcmp(argv[0], "update")) { if(argc == 2) { lprintf(LOG_NOTICE,"Update using file: %s", argv[1]); @@ -1023,8 +1006,7 @@ int ipmi_ime_main(struct ipmi_intf * intf, int argc, char ** argv) rc = IME_ERROR; } } - else if ( (argc == 0) || (strcmp(argv[0], "rollback") == 0) ) - { + else if (!strcmp(argv[0], "rollback")) { rc = ImeManualRollback(intf); } else diff --git a/lib/ipmi_isol.c b/lib/ipmi_isol.c index bc0b08b..1c2708f 100644 --- a/lib/ipmi_isol.c +++ b/lib/ipmi_isol.c @@ -29,7 +29,6 @@ * LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, * EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. */ -#define _XOPEN_SOURCE #include <stdlib.h> #include <string.h> @@ -84,7 +83,7 @@ static int ipmi_get_isol_info(struct ipmi_intf * intf, data[3] = 0x00; /* selector */ rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Error in Get ISOL Config Command"); return -1; } @@ -92,7 +91,7 @@ static int ipmi_get_isol_info(struct ipmi_intf * intf, lprintf(LOG_ERR, "IPMI v1.5 Serial Over Lan (ISOL) not supported!"); return -1; } - if (rsp->ccode > 0) { + if (rsp->ccode) { lprintf(LOG_ERR, "Error in Get ISOL Config Command: %s", val2str(rsp->ccode, completion_code_vals)); return -1; @@ -108,11 +107,11 @@ static int ipmi_get_isol_info(struct ipmi_intf * intf, data[3] = 0x00; /* selector */ rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Error in Get ISOL Config Command"); return -1; } - if (rsp->ccode > 0) { + if (rsp->ccode) { lprintf(LOG_ERR, "Error in Get ISOL Config Command: %s", val2str(rsp->ccode, completion_code_vals)); return -1; @@ -128,11 +127,11 @@ static int ipmi_get_isol_info(struct ipmi_intf * intf, data[3] = 0x00; /* selector */ rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Error in Get ISOL Config Command"); return -1; } - if (rsp->ccode > 0) { + if (rsp->ccode) { lprintf(LOG_ERR, "Error in Get ISOL Config Command: %s", val2str(rsp->ccode, completion_code_vals)); return -1; @@ -193,12 +192,12 @@ static int ipmi_isol_set_param(struct ipmi_intf * intf, /* * enabled */ - if (strcmp(param, "enabled") == 0) + if (!strcmp(param, "enabled")) { data[1] = ISOL_ENABLE_PARAM; - if (strcmp(value, "true") == 0) + if (!strcmp(value, "true")) data[2] = 0x01; - else if (strcmp(value, "false") == 0) + else if (!strcmp(value, "false")) data[2] = 0x00; else { lprintf(LOG_ERR, "Invalid value %s for parameter %s", @@ -211,7 +210,7 @@ static int ipmi_isol_set_param(struct ipmi_intf * intf, /* * privilege-level */ - else if (strcmp(param, "privilege-level") == 0) + else if (!strcmp(param, "privilege-level")) { data[1] = ISOL_AUTHENTICATION_PARAM; if (! strcmp(value, "user")) @@ -236,22 +235,22 @@ static int ipmi_isol_set_param(struct ipmi_intf * intf, /* * bit-rate */ - else if (strcmp(param, "bit-rate") == 0) + else if (!strcmp(param, "bit-rate")) { data[1] = ISOL_BAUD_RATE_PARAM; - if (strncmp(value, "9.6", 3) == 0) { + if (!strcmp(value, "9.6")) { data[2] = 0x06; } - else if (strncmp(value, "19.2", 4) == 0) { + else if (!strcmp(value, "19.2")) { data[2] = 0x07; } - else if (strncmp(value, "38.4", 4) == 0) { + else if (!strcmp(value, "38.4")) { data[2] = 0x08; } - else if (strncmp(value, "57.6", 4) == 0) { + else if (!strcmp(value, "57.6")) { data[2] = 0x09; } - else if (strncmp(value, "115.2", 5) == 0) { + else if (!strcmp(value, "115.2")) { data[2] = 0x0A; } else { @@ -272,11 +271,11 @@ static int ipmi_isol_set_param(struct ipmi_intf * intf, */ rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Error setting ISOL parameter '%s'", param); return -1; } - if (rsp->ccode > 0) { + if (rsp->ccode) { lprintf(LOG_ERR, "Error setting ISOL parameter '%s': %s", param, val2str(rsp->ccode, completion_code_vals)); return -1; @@ -429,11 +428,11 @@ ipmi_isol_deactivate(struct ipmi_intf * intf) data[5] = 0x00; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Error deactivating ISOL"); return -1; } - if (rsp->ccode > 0) { + if (rsp->ccode) { lprintf(LOG_ERR, "Error deactivating ISOL: %s", val2str(rsp->ccode, completion_code_vals)); return -1; @@ -573,7 +572,7 @@ ipmi_isol_red_pill(struct ipmi_intf * intf) int timedout = 0; buffer = (char*)malloc(buffer_size); - if (buffer == NULL) { + if (!buffer) { lprintf(LOG_ERR, "ipmitool: malloc failure"); return -1; } @@ -791,20 +790,20 @@ int ipmi_isol_main(struct ipmi_intf * intf, int argc, char ** argv) /* * Help */ - if (!argc || !strncmp(argv[0], "help", 4)) + if (!argc || !strcmp(argv[0], "help")) print_isol_usage(); /* * Info */ - else if (!strncmp(argv[0], "info", 4)) { + else if (!strcmp(argv[0], "info")) { ret = ipmi_print_isol_info(intf); } /* * Set a parameter value */ - else if (!strncmp(argv[0], "set", 3)) { + else if (!strcmp(argv[0], "set")) { if (argc < 3) { print_isol_set_usage(); return -1; @@ -815,7 +814,7 @@ int ipmi_isol_main(struct ipmi_intf * intf, int argc, char ** argv) /* * Activate */ - else if (!strncmp(argv[0], "activate", 8)) { + else if (!strcmp(argv[0], "activate")) { ret = ipmi_isol_activate(intf); } diff --git a/lib/ipmi_kontronoem.c b/lib/ipmi_kontronoem.c index 64860be..16e6014 100644 --- a/lib/ipmi_kontronoem.c +++ b/lib/ipmi_kontronoem.c @@ -60,8 +60,7 @@ static void ipmi_kontron_help(void); static int ipmi_kontron_set_serial_number(struct ipmi_intf *intf); static int ipmi_kontron_set_mfg_date (struct ipmi_intf *intf); static void ipmi_kontron_nextboot_help(void); -static int ipmi_kontron_nextboot_set(struct ipmi_intf *intf, int argc, - char **argv); +static int ipmi_kontron_nextboot_set(struct ipmi_intf *intf, char **argv); static int ipmi_kontronoem_send_set_large_buffer(struct ipmi_intf *intf, unsigned char channel, unsigned char size); @@ -76,38 +75,38 @@ ipmi_kontronoem_main(struct ipmi_intf *intf, int argc, char **argv) ipmi_kontron_help(); return (-1); } - if (strncmp(argv[0], "help", 4) == 0) { + if (!strcmp(argv[0], "help")) { ipmi_kontron_help(); rc = 0; - } else if (!strncmp(argv[0], "setsn", 5)) { + } else if (!strcmp(argv[0], "setsn")) { if (argc < 1) { printf("fru setsn\n"); return (-1); } if (ipmi_kontron_set_serial_number(intf) > 0) { - printf("FRU serial number setted successfully\n"); + printf("FRU serial number set successfully\n"); } else { printf("FRU serial number set failed\n"); rc = (-1); } - } else if (!strncmp(argv[0], "setmfgdate", 10)) { + } else if (!strcmp(argv[0], "setmfgdate")) { if (argc < 1) { printf("fru setmfgdate\n"); return (-1); } if (ipmi_kontron_set_mfg_date(intf) > 0) { - printf("FRU manufacturing date setted successfully\n"); + printf("FRU manufacturing date set successfully\n"); } else { printf("FRU manufacturing date set failed\n"); rc = (-1); } - } else if (!strncmp(argv[0], "nextboot", 8)) { + } else if (!strcmp(argv[0], "nextboot")) { if (argc < 2) { lprintf(LOG_ERR, "Not enough parameters given."); ipmi_kontron_nextboot_help(); return (-1); } - rc = ipmi_kontron_nextboot_set(intf, (argc - 1), (argv + 1)); + rc = ipmi_kontron_nextboot_set(intf, (argv + 1)); if (rc == 0) { printf("Nextboot set successfully\n"); } else { @@ -188,10 +187,10 @@ ipmi_kontronoem_send_set_large_buffer(struct ipmi_intf *intf, req.msg.data_len = 2; req.msg.lun = 0x00; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { printf("Cannot send large buffer command\n"); return(-1); - } else if (rsp->ccode > 0) { + } else if (rsp->ccode) { printf("Invalid length for the selected interface (%s) %d\n", val2str(rsp->ccode, completion_code_vals), rsp->ccode); return(-1); @@ -243,16 +242,16 @@ ipmi_kontron_set_serial_number(struct ipmi_intf *intf) /* Set Lun, necessary for this oem command */ req.msg.lun = 0x03; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { printf(" Device not present (No Response)\n"); return (-1); - } else if (rsp->ccode > 0) { + } else if (rsp->ccode) { printf(" This option is not implemented for this board\n"); return (-1); } sn_size = rsp->data_len; sn = malloc(sn_size + 1); - if (sn == NULL) { + if (!sn) { lprintf(LOG_ERR, "ipmitool: malloc failure"); return (-1); } @@ -269,12 +268,12 @@ ipmi_kontron_set_serial_number(struct ipmi_intf *intf) req.msg.data = msg_data; req.msg.data_len = 1; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { printf(" Device not present (No Response)\n"); free(sn); sn = NULL; return (-1); - } else if (rsp->ccode > 0) { + } else if (rsp->ccode) { printf(" Device not present (%s)\n", val2str(rsp->ccode, completion_code_vals)); free(sn); @@ -302,12 +301,12 @@ ipmi_kontron_set_serial_number(struct ipmi_intf *intf) req.msg.data = msg_data; req.msg.data_len = 4; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { printf(" Device not present (No Response)\n"); free(sn); sn = NULL; return (-1); - } else if (rsp->ccode > 0) { + } else if (rsp->ccode) { printf(" Device not present (%s)\n", val2str(rsp->ccode, completion_code_vals)); free(sn); @@ -328,7 +327,7 @@ ipmi_kontron_set_serial_number(struct ipmi_intf *intf) /* Set the Board Section */ board_sec_len = (header.offset.product * 8) - (header.offset.board * 8); fru_data = malloc(fru.size); - if (fru_data == NULL) { + if (!fru_data) { lprintf(LOG_ERR, "ipmitool: malloc failure"); free(sn); sn = NULL; @@ -346,20 +345,20 @@ ipmi_kontron_set_serial_number(struct ipmi_intf *intf) /* Position at Board Manufacturer */ fru_data_offset = (header.offset.board * 8) + 6; fru_area = get_fru_area_str(fru_data, &fru_data_offset); - if (fru_area != NULL) { + if (fru_area) { free(fru_area); fru_area = NULL; } /* Position at Board Product Name */ fru_area = get_fru_area_str(fru_data, &fru_data_offset); - if (fru_area != NULL) { + if (fru_area) { free(fru_area); fru_area = NULL; } fru_data_offset_tmp = fru_data_offset; /* Position at Serial Number */ fru_area = get_fru_area_str(fru_data, &fru_data_offset_tmp); - if (fru_area == NULL) { + if (!fru_area) { lprintf(LOG_ERR, "Failed to read FRU Area string."); free(fru_data); fru_data = NULL; @@ -420,32 +419,32 @@ ipmi_kontron_set_serial_number(struct ipmi_intf *intf) /* Position at Product Manufacturer */ fru_data_offset = (header.offset.product * 8) + 3; fru_area = get_fru_area_str(fru_data, &fru_data_offset); - if (fru_area != NULL) { + if (fru_area) { free(fru_area); fru_area = NULL; } /* Position at Product Name */ fru_area = get_fru_area_str(fru_data, &fru_data_offset); - if (fru_area != NULL) { + if (fru_area) { free(fru_area); fru_area = NULL; } /* Position at Product Part */ fru_area = get_fru_area_str(fru_data, &fru_data_offset); - if (fru_area != NULL) { + if (fru_area) { free(fru_area); fru_area = NULL; } /* Position at Product Version */ fru_area = get_fru_area_str(fru_data, &fru_data_offset); - if (fru_area != NULL) { + if (fru_area) { free(fru_area); fru_area = NULL; } fru_data_offset_tmp = fru_data_offset; /* Position at Serial Number */ fru_area = get_fru_area_str(fru_data, &fru_data_offset_tmp); - if (fru_area == NULL) { + if (!fru_area) { lprintf(LOG_ERR, "Failed to read FRU Area string."); free(sn); sn = NULL; @@ -532,10 +531,10 @@ ipmi_kontron_set_mfg_date (struct ipmi_intf *intf) /* Set Lun temporary, necessary for this oem command */ req.msg.lun = 0x03; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { printf("Device not present (No Response)\n"); return(-1); - } else if (rsp->ccode > 0) { + } else if (rsp->ccode) { printf("This option is not implemented for this board\n"); return(-1); } @@ -554,10 +553,10 @@ ipmi_kontron_set_mfg_date (struct ipmi_intf *intf) req.msg.data = msg_data; req.msg.data_len = 1; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { printf(" Device not present (No Response)\n"); return(-1); - } else if (rsp->ccode > 0) { + } else if (rsp->ccode) { printf(" Device not present (%s)\n", val2str(rsp->ccode, completion_code_vals)); return(-1); @@ -582,10 +581,10 @@ ipmi_kontron_set_mfg_date (struct ipmi_intf *intf) req.msg.data = msg_data; req.msg.data_len = 4; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { printf(" Device not present (No Response)\n"); return (-1); - } else if (rsp->ccode > 0) { + } else if (rsp->ccode) { printf(" Device not present (%s)\n", val2str(rsp->ccode, completion_code_vals)); return (-1); @@ -601,7 +600,7 @@ ipmi_kontron_set_mfg_date (struct ipmi_intf *intf) } board_sec_len = (header.offset.product * 8) - (header.offset.board * 8); fru_data = malloc(fru.size); - if(fru_data == NULL) { + if (!fru_data) { lprintf(LOG_ERR, "ipmitool: malloc failure"); return(-1); } @@ -656,7 +655,7 @@ ipmi_kontron_nextboot_help(void) * returns 1 if successful */ static int -ipmi_kontron_nextboot_set(struct ipmi_intf *intf, int argc, char **argv) +ipmi_kontron_nextboot_set(struct ipmi_intf *intf, char **argv) { struct ipmi_rs *rsp; struct ipmi_rq req; @@ -672,7 +671,7 @@ ipmi_kontron_nextboot_set(struct ipmi_intf *intf, int argc, char **argv) msg_data[5] = 0xFF; msg_data[6] = 0xFF; /* any */ for (i = 0; bootdev[i] != 0; i++) { - if (strcmp(argv[0], bootdev[i]) == 0) { + if (!strcmp(argv[0], bootdev[i])) { msg_data[5] = i; break; } @@ -690,10 +689,10 @@ ipmi_kontron_nextboot_set(struct ipmi_intf *intf, int argc, char **argv) /* Set Lun temporary, necessary for this oem command */ req.msg.lun = 0x03; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { printf("Device not present (No Response)\n"); return(-1); - } else if (rsp->ccode > 0) { + } else if (rsp->ccode) { printf("Device not present (%s)\n", val2str(rsp->ccode, completion_code_vals)); return (-1); diff --git a/lib/ipmi_lanp.c b/lib/ipmi_lanp.c index 65d881b..16c0d9a 100644 --- a/lib/ipmi_lanp.c +++ b/lib/ipmi_lanp.c @@ -57,6 +57,62 @@ extern int verbose; +static struct lan_param { + int cmd; + int size; + char desc[24]; + uint8_t *data; + int data_len; +} ipmi_lan_params[] = { + { IPMI_LANP_SET_IN_PROGRESS, 1, "Set in Progress", NULL, 0 }, + { IPMI_LANP_AUTH_TYPE, 1, "Auth Type Support", NULL, 0 }, + { IPMI_LANP_AUTH_TYPE_ENABLE, 5, "Auth Type Enable", NULL, 0 }, + { IPMI_LANP_IP_ADDR, 4, "IP Address", NULL, 0 }, + { IPMI_LANP_IP_ADDR_SRC, 1, "IP Address Source", NULL, 0 }, + { IPMI_LANP_MAC_ADDR, 6, "MAC Address", NULL, 0 }, /* 5 */ + { IPMI_LANP_SUBNET_MASK, 4, "Subnet Mask", NULL, 0 }, + { IPMI_LANP_IP_HEADER, 3, "IP Header", NULL, 0 }, + { IPMI_LANP_PRI_RMCP_PORT, 2, "Primary RMCP Port", NULL, 0 }, + { IPMI_LANP_SEC_RMCP_PORT, 2, "Secondary RMCP Port", NULL, 0 }, + { IPMI_LANP_BMC_ARP, 1, "BMC ARP Control", NULL, 0}, /* 10 */ + { IPMI_LANP_GRAT_ARP, 1, "Gratituous ARP Intrvl", NULL, 0 }, + { IPMI_LANP_DEF_GATEWAY_IP, 4, "Default Gateway IP", NULL, 0 }, + { IPMI_LANP_DEF_GATEWAY_MAC, 6, "Default Gateway MAC", NULL, 0 }, + { IPMI_LANP_BAK_GATEWAY_IP, 4, "Backup Gateway IP", NULL, 0 }, + { IPMI_LANP_BAK_GATEWAY_MAC, 6, "Backup Gateway MAC", NULL, 0 }, /* 15 */ + { IPMI_LANP_SNMP_STRING, 18, "SNMP Community String", NULL, 0 }, + { IPMI_LANP_NUM_DEST, 1, "Number of Destinations", NULL, 0 }, + { IPMI_LANP_DEST_TYPE, 4, "Destination Type", NULL, 0 }, + { IPMI_LANP_DEST_ADDR, 13, "Destination Addresses", NULL, 0 }, + { IPMI_LANP_VLAN_ID, 2, "802.1q VLAN ID", NULL, 0 }, /* 20 */ + { IPMI_LANP_VLAN_PRIORITY, 1, "802.1q VLAN Priority", NULL, 0 }, + { IPMI_LANP_RMCP_CIPHER_SUPPORT,1, "RMCP+ Cipher Suite Count", NULL, 0 }, + { IPMI_LANP_RMCP_CIPHERS, 16, "RMCP+ Cipher Suites", NULL, 0 }, + { IPMI_LANP_RMCP_PRIV_LEVELS, 9, "Cipher Suite Priv Max", NULL, 0 }, + { IPMI_LANP_BAD_PASS_THRESH, 6, "Bad Password Threshold", NULL, 0 }, + { IPMI_LANP_OEM_ALERT_STRING, 28, "OEM Alert String", NULL, 0 }, /* 25 */ + { IPMI_LANP_ALERT_RETRY, 1, "Alert Retry Algorithm", NULL, 0 }, + { IPMI_LANP_UTC_OFFSET, 3, "UTC Offset", NULL, 0 }, + { IPMI_LANP_DHCP_SERVER_IP, 4, "DHCP Server IP", NULL, 0 }, + { IPMI_LANP_DHCP_SERVER_MAC, 6, "DHDP Server MAC", NULL, 0}, + { IPMI_LANP_DHCP_ENABLE, 1, "DHCP Enable", NULL, 0 }, /* 30 */ + { IPMI_LANP_CHAN_ACCESS_MODE, 2, "Channel Access Mode", NULL, 0 }, + { -1, -1, "", NULL, -1 } +}; + +static const struct valstr set_lan_cc_vals[] = { + { 0x80, "Unsupported parameter" }, + { 0x81, "Attempt to set 'in progress' while not in 'complete' state" }, + { 0x82, "Parameter is read-only" }, + { 0x83, "Parameter is wrote-only" }, + { 0x00, NULL } +}; + +static const struct valstr get_lan_cc_vals[] = { + { 0x80, "Unsupported parameter" }, + { 0x00, NULL } +}; + static void print_lan_alert_print_usage(void); static void print_lan_alert_set_usage(void); static void print_lan_set_usage(void); @@ -80,7 +136,7 @@ static void print_lan_usage(void); * @chan: channel number to check */ static int -is_lan_channel(struct ipmi_intf * intf, uint8_t chan) +is_lan_channel(struct ipmi_intf *intf, uint8_t chan) { uint8_t medium; @@ -105,7 +161,7 @@ is_lan_channel(struct ipmi_intf * intf, uint8_t chan) * @start: channel number to start searching from */ uint8_t -find_lan_channel(struct ipmi_intf * intf, uint8_t start) +find_lan_channel(struct ipmi_intf *intf, uint8_t start) { uint8_t chan = 0; @@ -131,10 +187,11 @@ find_lan_channel(struct ipmi_intf * intf, uint8_t start) * @select: lan parameter set selector */ static struct lan_param * -get_lan_param_select(struct ipmi_intf * intf, uint8_t chan, int param, int select) +get_lan_param_select(struct ipmi_intf *intf, uint8_t chan, int param, int select) { - struct lan_param * p = NULL; - struct ipmi_rs * rsp; + struct lan_param *p = NULL; + struct lan_param *rc = NULL; + struct ipmi_rs *rsp; struct ipmi_rq req; int i = 0; uint8_t msg_data[4]; @@ -146,9 +203,9 @@ get_lan_param_select(struct ipmi_intf * intf, uint8_t chan, int param, int selec } } - if (p == NULL) { + if (!p) { lprintf(LOG_INFO, "Get LAN Parameter failed: Unknown parameter."); - return NULL; + return rc; } msg_data[0] = chan; @@ -163,9 +220,9 @@ get_lan_param_select(struct ipmi_intf * intf, uint8_t chan, int param, int selec req.msg.data_len = 4; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_INFO, "Get LAN Parameter '%s' command failed", p->desc); - return NULL; + return rc; } switch (rsp->ccode) @@ -176,19 +233,18 @@ get_lan_param_select(struct ipmi_intf * intf, uint8_t chan, int param, int selec case 0x80: /* parameter not supported */ case 0xc9: /* parameter out of range */ case 0xcc: /* invalid data field in request */ - - /* these completion codes usually mean parameter not supported */ - lprintf(LOG_INFO, "Get LAN Parameter '%s' command failed: %s", - p->desc, val2str(rsp->ccode, completion_code_vals)); + /* We treat them as valid but empty response */ p->data = NULL; p->data_len = 0; - return p; - + rc = p; + /* fall through */ default: - /* other completion codes are treated as error */ lprintf(LOG_INFO, "Get LAN Parameter '%s' command failed: %s", - p->desc, val2str(rsp->ccode, completion_code_vals)); + p->desc, + specific_val2str(rsp->ccode, + get_lan_cc_vals, + completion_code_vals)); return NULL; } @@ -211,7 +267,7 @@ get_lan_param_select(struct ipmi_intf * intf, uint8_t chan, int param, int selec * @param: lan parameter id */ static struct lan_param * -get_lan_param(struct ipmi_intf * intf, uint8_t chan, int param) +get_lan_param(struct ipmi_intf *intf, uint8_t chan, int param) { return get_lan_param_select(intf, chan, param, 0); } @@ -232,10 +288,10 @@ get_lan_param(struct ipmi_intf * intf, uint8_t chan, int param) * @len: length of lan parameter data */ static int -set_lan_param_wait(struct ipmi_intf * intf, uint8_t chan, - int param, uint8_t * data, int len) +set_lan_param_wait(struct ipmi_intf *intf, uint8_t chan, + int param, uint8_t *data, int len) { - struct lan_param * p; + struct lan_param *p; int retry = 10; /* 10 retries */ lprintf(LOG_DEBUG, "Waiting for Set LAN Parameter to complete..."); @@ -244,7 +300,7 @@ set_lan_param_wait(struct ipmi_intf * intf, uint8_t chan, for (;;) { p = get_lan_param(intf, chan, param); - if (p == NULL) { + if (!p) { sleep(IPMI_LANP_TIMEOUT); if (retry-- == 0) return -1; @@ -291,10 +347,10 @@ set_lan_param_wait(struct ipmi_intf * intf, uint8_t chan, * @wait: whether to wait for write completion */ static int -__set_lan_param(struct ipmi_intf * intf, uint8_t chan, - int param, uint8_t * data, int len, int wait) +__set_lan_param(struct ipmi_intf *intf, uint8_t chan, + int param, uint8_t *data, int len, int wait) { - struct ipmi_rs * rsp; + struct ipmi_rs *rsp; struct ipmi_rq req; uint8_t msg_data[32]; @@ -312,13 +368,15 @@ __set_lan_param(struct ipmi_intf * intf, uint8_t chan, req.msg.data_len = len+2; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Set LAN Parameter failed"); return -1; } - if ((rsp->ccode > 0) && (wait != 0)) { + if (rsp->ccode && wait) { lprintf(LOG_DEBUG, "Warning: Set LAN Parameter failed: %s", - val2str(rsp->ccode, completion_code_vals)); + specific_val2str(rsp->ccode, + set_lan_cc_vals, + completion_code_vals)); if (rsp->ccode == 0xcc) { /* retry hack for invalid data field ccode */ int retry = 10; /* 10 retries */ @@ -328,9 +386,7 @@ __set_lan_param(struct ipmi_intf * intf, uint8_t chan, break; sleep(IPMI_LANP_TIMEOUT); rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) - continue; - if (rsp->ccode > 0) + if (!rsp || rsp->ccode) continue; return set_lan_param_wait(intf, chan, param, data, len); } @@ -341,7 +397,7 @@ __set_lan_param(struct ipmi_intf * intf, uint8_t chan, } } - if (wait == 0) + if (!wait) return 0; return set_lan_param_wait(intf, chan, param, data, len); } @@ -358,13 +414,13 @@ __set_lan_param(struct ipmi_intf * intf, uint8_t chan, * @chan: ipmi channel */ static int -ipmi_lanp_lock_state(struct ipmi_intf * intf, uint8_t chan) +ipmi_lanp_lock_state(struct ipmi_intf *intf, uint8_t chan) { - struct lan_param * p; + struct lan_param *p; p = get_lan_param(intf, chan, IPMI_LANP_SET_IN_PROGRESS); - if (p == NULL) + if (!p) return -1; - if (p->data == NULL) + if (!p->data) return -1; return (p->data[0] & 3); } @@ -381,7 +437,7 @@ ipmi_lanp_lock_state(struct ipmi_intf * intf, uint8_t chan) * @chan: ipmi channel */ static void -ipmi_lanp_lock(struct ipmi_intf * intf, uint8_t chan) +ipmi_lanp_lock(struct ipmi_intf *intf, uint8_t chan) { uint8_t val = IPMI_LANP_WRITE_LOCK; int retry = 3; @@ -411,7 +467,7 @@ ipmi_lanp_lock(struct ipmi_intf * intf, uint8_t chan) * @chan: ipmi channel */ static void -ipmi_lanp_unlock(struct ipmi_intf * intf, uint8_t chan) +ipmi_lanp_unlock(struct ipmi_intf *intf, uint8_t chan) { uint8_t val = IPMI_LANP_WRITE_COMMIT; int rc; @@ -436,8 +492,8 @@ ipmi_lanp_unlock(struct ipmi_intf * intf, uint8_t chan) * @len: length of lan parameter data */ static int -set_lan_param(struct ipmi_intf * intf, uint8_t chan, - int param, uint8_t * data, int len) +set_lan_param(struct ipmi_intf *intf, uint8_t chan, + int param, uint8_t *data, int len) { int rc; ipmi_lanp_lock(intf, chan); @@ -457,8 +513,8 @@ set_lan_param(struct ipmi_intf * intf, uint8_t chan, * @len: length of lan parameter data */ static int -set_lan_param_nowait(struct ipmi_intf * intf, uint8_t chan, - int param, uint8_t * data, int len) +set_lan_param_nowait(struct ipmi_intf *intf, uint8_t chan, + int param, uint8_t *data, int len) { int rc; ipmi_lanp_lock(intf, chan); @@ -468,16 +524,16 @@ set_lan_param_nowait(struct ipmi_intf * intf, uint8_t chan, } static int -lan_set_arp_interval(struct ipmi_intf * intf, uint8_t chan, uint8_t ival) +lan_set_arp_interval(struct ipmi_intf *intf, uint8_t chan, uint8_t ival) { struct lan_param *lp; uint8_t interval = 0; int rc = 0; lp = get_lan_param(intf, chan, IPMI_LANP_GRAT_ARP); - if (lp == NULL) + if (!lp) return -1; - if (lp->data == NULL) + if (!lp->data) return -1; if (ival != 0) { @@ -498,16 +554,16 @@ lan_set_arp_interval(struct ipmi_intf * intf, uint8_t chan, uint8_t ival) } static int -lan_set_arp_generate(struct ipmi_intf * intf, +lan_set_arp_generate(struct ipmi_intf *intf, uint8_t chan, uint8_t ctl) { struct lan_param *lp; uint8_t data; lp = get_lan_param(intf, chan, IPMI_LANP_BMC_ARP); - if (lp == NULL) + if (!lp) return -1; - if (lp->data == NULL) + if (!lp->data) return -1; data = lp->data[0]; @@ -522,16 +578,16 @@ lan_set_arp_generate(struct ipmi_intf * intf, } static int -lan_set_arp_respond(struct ipmi_intf * intf, +lan_set_arp_respond(struct ipmi_intf *intf, uint8_t chan, uint8_t ctl) { struct lan_param *lp; uint8_t data; lp = get_lan_param(intf, chan, IPMI_LANP_BMC_ARP); - if (lp == NULL) + if (!lp) return -1; - if (lp->data == NULL) + if (!lp->data) return -1; data = lp->data[0]; @@ -574,9 +630,9 @@ static char priv_level_to_char(unsigned char priv_level) static int -ipmi_lan_print(struct ipmi_intf * intf, uint8_t chan) +ipmi_lan_print(struct ipmi_intf *intf, uint8_t chan) { - struct lan_param * p; + struct lan_param *p; if (chan < 1 || chan > IPMI_CHANNEL_NUMBER_MAX) { lprintf(LOG_ERR, "Invalid Channel %d", chan); @@ -590,9 +646,9 @@ ipmi_lan_print(struct ipmi_intf * intf, uint8_t chan) } p = get_lan_param(intf, chan, IPMI_LANP_SET_IN_PROGRESS); - if (p == NULL) + if (!p) return -1; - if (p->data != NULL) { + if (p->data) { printf("%-24s: ", p->desc); p->data[0] &= 3; switch (p->data[0]) { @@ -614,9 +670,9 @@ ipmi_lan_print(struct ipmi_intf * intf, uint8_t chan) } p = get_lan_param(intf, chan, IPMI_LANP_AUTH_TYPE); - if (p == NULL) + if (!p) return -1; - if (p->data != NULL) { + if (p->data) { printf("%-24s: %s%s%s%s%s\n", p->desc, (p->data[0] & 1<<IPMI_SESSION_AUTHTYPE_NONE) ? "NONE " : "", (p->data[0] & 1<<IPMI_SESSION_AUTHTYPE_MD2) ? "MD2 " : "", @@ -626,9 +682,9 @@ ipmi_lan_print(struct ipmi_intf * intf, uint8_t chan) } p = get_lan_param(intf, chan, IPMI_LANP_AUTH_TYPE_ENABLE); - if (p == NULL) + if (!p) return -1; - if (p->data != NULL) { + if (p->data) { printf("%-24s: Callback : %s%s%s%s%s\n", p->desc, (p->data[0] & 1<<IPMI_SESSION_AUTHTYPE_NONE) ? "NONE " : "", (p->data[0] & 1<<IPMI_SESSION_AUTHTYPE_MD2) ? "MD2 " : "", @@ -662,9 +718,9 @@ ipmi_lan_print(struct ipmi_intf * intf, uint8_t chan) } p = get_lan_param(intf, chan, IPMI_LANP_IP_ADDR_SRC); - if (p == NULL) + if (!p) return -1; - if (p->data != NULL) { + if (p->data) { printf("%-24s: ", p->desc); p->data[0] &= 0xf; switch (p->data[0]) { @@ -687,79 +743,79 @@ ipmi_lan_print(struct ipmi_intf * intf, uint8_t chan) } p = get_lan_param(intf, chan, IPMI_LANP_IP_ADDR); - if (p == NULL) + if (!p) return -1; - if (p->data != NULL) + if (p->data) printf("%-24s: %d.%d.%d.%d\n", p->desc, p->data[0], p->data[1], p->data[2], p->data[3]); p = get_lan_param(intf, chan, IPMI_LANP_SUBNET_MASK); - if (p == NULL) + if (!p) return -1; - if (p->data != NULL) + if (p->data) printf("%-24s: %d.%d.%d.%d\n", p->desc, p->data[0], p->data[1], p->data[2], p->data[3]); p = get_lan_param(intf, chan, IPMI_LANP_MAC_ADDR); - if (p == NULL) + if (!p) return -1; - if (p->data != NULL) + if (p->data) printf("%-24s: %s\n", p->desc, mac2str(p->data)); p = get_lan_param(intf, chan, IPMI_LANP_SNMP_STRING); - if (p == NULL) + if (!p) return -1; - if (p->data != NULL) + if (p->data) printf("%-24s: %s\n", p->desc, p->data); p = get_lan_param(intf, chan, IPMI_LANP_IP_HEADER); - if (p == NULL) + if (!p) return -1; - if (p->data != NULL) + if (p->data) printf("%-24s: TTL=0x%02x Flags=0x%02x Precedence=0x%02x TOS=0x%02x\n", p->desc, p->data[0], p->data[1] & 0xe0, p->data[2] & 0xe0, p->data[2] & 0x1e); p = get_lan_param(intf, chan, IPMI_LANP_BMC_ARP); - if (p == NULL) + if (!p) return -1; - if (p->data != NULL) + if (p->data) printf("%-24s: ARP Responses %sabled, Gratuitous ARP %sabled\n", p->desc, (p->data[0] & 2) ? "En" : "Dis", (p->data[0] & 1) ? "En" : "Dis"); p = get_lan_param(intf, chan, IPMI_LANP_GRAT_ARP); - if (p == NULL) + if (!p) return -1; - if (p->data != NULL) + if (p->data) printf("%-24s: %.1f seconds\n", p->desc, (float)((p->data[0] + 1) / 2)); p = get_lan_param(intf, chan, IPMI_LANP_DEF_GATEWAY_IP); - if (p == NULL) + if (!p) return -1; - if (p->data != NULL) + if (p->data) printf("%-24s: %d.%d.%d.%d\n", p->desc, p->data[0], p->data[1], p->data[2], p->data[3]); p = get_lan_param(intf, chan, IPMI_LANP_DEF_GATEWAY_MAC); - if (p == NULL) + if (!p) return -1; - if (p->data != NULL) + if (p->data) printf("%-24s: %s\n", p->desc, mac2str(p->data)); p = get_lan_param(intf, chan, IPMI_LANP_BAK_GATEWAY_IP); - if (p == NULL) + if (!p) return -1; - if (p->data != NULL) + if (p->data) printf("%-24s: %d.%d.%d.%d\n", p->desc, p->data[0], p->data[1], p->data[2], p->data[3]); p = get_lan_param(intf, chan, IPMI_LANP_BAK_GATEWAY_MAC); - if (p == NULL) + if (!p) return -1; - if (p->data != NULL) + if (p->data) printf("%-24s: %s\n", p->desc, mac2str(p->data)); p = get_lan_param(intf, chan, IPMI_LANP_VLAN_ID); - if (p != NULL && p->data != NULL) { + if (p && p->data) { int id = ((p->data[1] & 0x0f) << 8) + p->data[0]; if (p->data[1] & 0x80) printf("%-24s: %d\n", p->desc, id); @@ -768,25 +824,25 @@ ipmi_lan_print(struct ipmi_intf * intf, uint8_t chan) } p = get_lan_param(intf, chan, IPMI_LANP_VLAN_PRIORITY); - if (p != NULL && p->data != NULL) + if (p && p->data) printf("%-24s: %d\n", p->desc, p->data[0] & 0x07); /* Determine supported Cipher Suites -- Requires two calls */ p = get_lan_param(intf, chan, IPMI_LANP_RMCP_CIPHER_SUPPORT); - if (p == NULL) + if (!p) return -1; - else if (p->data != NULL) + else if (p->data) { unsigned char cipher_suite_count = p->data[0]; p = get_lan_param(intf, chan, IPMI_LANP_RMCP_CIPHERS); - if (p == NULL) + if (!p) return -1; printf("%-24s: ", p->desc); /* Now we're dangerous. There are only 15 fixed cipher suite IDs, but the spec allows for 16 in the return data.*/ - if ((p->data != NULL) && (p->data_len <= 17)) + if (p->data && p->data_len <= 17) { unsigned int i; for (i = 0; (i < 16) && (i < cipher_suite_count); ++i) @@ -806,9 +862,9 @@ ipmi_lan_print(struct ipmi_intf * intf, uint8_t chan) /* RMCP+ Messaging Cipher Suite Privilege Levels */ /* These are the privilege levels for the 15 fixed cipher suites */ p = get_lan_param(intf, chan, IPMI_LANP_RMCP_PRIV_LEVELS); - if (p == NULL) + if (!p) return -1; - if ((p->data != NULL) && (p->data_len == 9)) + if (p->data && 9 == p->data_len) { printf("%-24s: %c%c%c%c%c%c%c%c%c%c%c%c%c%c%c\n", p->desc, priv_level_to_char(p->data[1] & 0x0F), @@ -840,9 +896,9 @@ ipmi_lan_print(struct ipmi_intf * intf, uint8_t chan) /* Bad Password Threshold */ p = get_lan_param(intf, chan, IPMI_LANP_BAD_PASS_THRESH); - if (p == NULL) + if (!p) return -1; - if ((p->data != NULL) && (p->data_len == 6)) { + if (p->data && 6 == p->data_len) { int tmp; printf("%-24s: %d\n", p->desc, p->data[1]); @@ -862,20 +918,20 @@ ipmi_lan_print(struct ipmi_intf * intf, uint8_t chan) /* Configure Authentication Types */ /* TODO - probably some code duplication going on ??? */ static int -ipmi_lan_set_auth(struct ipmi_intf * intf, uint8_t chan, char * level, char * types) +ipmi_lan_set_auth(struct ipmi_intf *intf, uint8_t chan, char *level, char *types) { uint8_t data[5]; uint8_t authtype = 0; - char * p; - struct lan_param * lp; + char *p; + struct lan_param *lp; - if (level == NULL || types == NULL) + if (!level || !types) return -1; lp = get_lan_param(intf, chan, IPMI_LANP_AUTH_TYPE_ENABLE); - if (lp == NULL) + if (!lp) return -1; - if (lp->data == NULL) + if (!lp->data) return -1; lprintf(LOG_DEBUG, "%-24s: callback=0x%02x user=0x%02x operator=0x%02x admin=0x%02x oem=0x%02x", @@ -886,16 +942,16 @@ ipmi_lan_set_auth(struct ipmi_intf * intf, uint8_t chan, char * level, char * ty p = types; while (p) { - if (strncasecmp(p, "none", 4) == 0) + if (strcasecmp(p, "none") == 0) authtype |= 1 << IPMI_SESSION_AUTHTYPE_NONE; - else if (strncasecmp(p, "md2", 3) == 0) + else if (strcasecmp(p, "md2") == 0) authtype |= 1 << IPMI_SESSION_AUTHTYPE_MD2; - else if (strncasecmp(p, "md5", 3) == 0) + else if (strcasecmp(p, "md5") == 0) authtype |= 1 << IPMI_SESSION_AUTHTYPE_MD5; - else if ((strncasecmp(p, "password", 8) == 0) || - (strncasecmp(p, "key", 3) == 0)) + else if ((strcasecmp(p, "password") == 0) || + (strcasecmp(p, "key") == 0)) authtype |= 1 << IPMI_SESSION_AUTHTYPE_KEY; - else if (strncasecmp(p, "oem", 3) == 0) + else if (strcasecmp(p, "oem") == 0) authtype |= 1 << IPMI_SESSION_AUTHTYPE_OEM; else lprintf(LOG_WARNING, "Invalid authentication type: %s", p); @@ -906,13 +962,13 @@ ipmi_lan_set_auth(struct ipmi_intf * intf, uint8_t chan, char * level, char * ty p = level; while (p) { - if (strncasecmp(p, "callback", 8) == 0) + if (strcasecmp(p, "callback") == 0) data[0] = authtype; - else if (strncasecmp(p, "user", 4) == 0) + else if (strcasecmp(p, "user") == 0) data[1] = authtype; - else if (strncasecmp(p, "operator", 8) == 0) + else if (strcasecmp(p, "operator") == 0) data[2] = authtype; - else if (strncasecmp(p, "admin", 5) == 0) + else if (strcasecmp(p, "admin") == 0) data[3] = authtype; else lprintf(LOG_WARNING, "Invalid authentication level: %s", p); @@ -944,7 +1000,7 @@ ipmi_lan_set_password(struct ipmi_intf *intf, */ ipmi_intf_session_set_password(intf, (char *)password); printf("Password %s for user %d\n", - (password == NULL) ? "cleared" : "set", user_id); + password ? "set" : "cleared", user_id); return 0; } @@ -1103,7 +1159,7 @@ ipmi_set_user_access(struct ipmi_intf *intf, uint8_t channel, uint8_t user_id) static int -get_cmdline_cipher_suite_priv_data(char * arg, uint8_t * buf) +get_cmdline_cipher_suite_priv_data(char *arg, uint8_t *buf) { int i, ret = 0; @@ -1180,7 +1236,7 @@ get_cmdline_cipher_suite_priv_data(char * arg, uint8_t * buf) static int -get_cmdline_ipaddr(char * arg, uint8_t * buf) +get_cmdline_ipaddr(char *arg, uint8_t *buf) { uint32_t ip1, ip2, ip3, ip4; if (sscanf(arg, @@ -1206,18 +1262,27 @@ ipmi_lan_set_vlan_id(struct ipmi_intf *intf, uint8_t chan, char *string) { struct lan_param *p; uint8_t data[2]; - int rc; + int rc = -1; - if (string == NULL) { + if (!string) { /* request to disable VLAN */ lprintf(LOG_DEBUG, "Get current VLAN ID from BMC."); p = get_lan_param(intf, chan, IPMI_LANP_VLAN_ID); - if (p != NULL && p->data != NULL && p->data_len > 1) { + if (p && p->data && p->data_len > 1) { int id = ((p->data[1] & 0x0f) << 8) + p->data[0]; - if (id < 1 || id > 4094) { + if (IPMI_LANP_VLAN_DISABLE == id) { + printf("VLAN is already disabled for channel %" + PRIu8 "\n", chan); + rc = 0; + goto out; + } + if (!IPMI_LANP_IS_VLAN_VALID(id)) { lprintf(LOG_ERR, - "Retrieved VLAN ID %i is out of range <1..4094>.", - id); - return (-1); + "Retrieved VLAN ID %i is out of " + "range <%d..%d>.", + id, + IPMI_LANP_VLAN_ID_MIN, + IPMI_LANP_VLAN_ID_MAX); + goto out; } data[0] = p->data[0]; data[1] = p->data[1] & 0x0F; @@ -1229,13 +1294,18 @@ ipmi_lan_set_vlan_id(struct ipmi_intf *intf, uint8_t chan, char *string) else { int id = 0; if (str2int(string, &id) != 0) { - lprintf(LOG_ERR, "Given VLAN ID '%s' is invalid.", string); - return (-1); + lprintf(LOG_ERR, + "Given VLAN ID '%s' is invalid.", + string); + goto out; } - if (id < 1 || id > 4094) { - lprintf(LOG_NOTICE, "VLAN ID must be between 1 and 4094."); - return (-1); + if (!IPMI_LANP_IS_VLAN_VALID(id)) { + lprintf(LOG_NOTICE, + "VLAN ID must be between %d and %d.", + IPMI_LANP_VLAN_ID_MIN, + IPMI_LANP_VLAN_ID_MAX); + goto out; } else { data[0] = (uint8_t)id; @@ -1243,6 +1313,8 @@ ipmi_lan_set_vlan_id(struct ipmi_intf *intf, uint8_t chan, char *string) } } rc = set_lan_param(intf, chan, IPMI_LANP_VLAN_ID, data, 2); + +out: return rc; } @@ -1270,8 +1342,8 @@ static void print_lan_set_bad_pass_thresh_usage(void) { lprintf(LOG_NOTICE, -"lan set <chanel> bad_pass_thresh <thresh_num> <1|0> <reset_interval> <lockout_interval>\n" -" <thresh_num> Bad Pasword Threshold number.\n" +"lan set <channel> bad_pass_thresh <thresh_num> <1|0> <reset_interval> <lockout_interval>\n" +" <thresh_num> Bad Password Threshold number.\n" " <1|0> 1 = generate a Session Audit sensor event.\n" " 0 = do not generate an event.\n" " <reset_interval> Attempt Count Reset Interval. In tens of seconds.\n" @@ -1316,7 +1388,7 @@ get_cmdline_bad_pass_thresh(char *argv[], uint8_t *buf) } static int -ipmi_lan_set(struct ipmi_intf * intf, int argc, char ** argv) +ipmi_lan_set(struct ipmi_intf *intf, int argc, char **argv) { uint8_t data[32]; uint8_t chan; @@ -1327,8 +1399,9 @@ ipmi_lan_set(struct ipmi_intf * intf, int argc, char ** argv) return (-1); } - if (strncmp(argv[0], "help", 4) == 0 || - strncmp(argv[1], "help", 4) == 0) { + if (!strcmp(argv[0], "help") + || !strcmp(argv[1], "help")) + { print_lan_set_usage(); return 0; } @@ -1348,23 +1421,23 @@ ipmi_lan_set(struct ipmi_intf * intf, int argc, char ** argv) memset(&data, 0, sizeof(data)); /* set user access */ - if (strncmp(argv[1], "user", 4) == 0) { + if (!strcmp(argv[1], "user")) { rc = ipmi_set_user_access(intf, chan, 1); } /* set channel access mode */ - else if (strncmp(argv[1], "access", 6) == 0) { + else if (!strcmp(argv[1], "access")) { if (argc < 3) { print_lan_set_access_usage(); return (-1); } - else if (strncmp(argv[2], "help", 4) == 0) { + else if (!strcmp(argv[2], "help")) { print_lan_set_access_usage(); return 0; } - else if (strncmp(argv[2], "on", 2) == 0) { + else if (!strcmp(argv[2], "on")) { rc = ipmi_set_channel_access(intf, chan, 1); } - else if (strncmp(argv[2], "off", 3) == 0) { + else if (!strcmp(argv[2], "off")) { rc = ipmi_set_channel_access(intf, chan, 0); } else { @@ -1373,15 +1446,15 @@ ipmi_lan_set(struct ipmi_intf * intf, int argc, char ** argv) } } /* set ARP control */ - else if (strncmp(argv[1], "arp", 3) == 0) { + else if (!strcmp(argv[1], "arp")) { if (argc < 3) { print_lan_set_arp_usage(); return (-1); } - else if (strncmp(argv[2], "help", 4) == 0) { + else if (!strcmp(argv[2], "help")) { print_lan_set_arp_usage(); } - else if (strncmp(argv[2], "interval", 8) == 0) { + else if (!strcmp(argv[2], "interval")) { uint8_t interval = 0; if (str2uchar(argv[3], &interval) != 0) { lprintf(LOG_ERR, "Given ARP interval '%s' is invalid.", argv[3]); @@ -1389,28 +1462,28 @@ ipmi_lan_set(struct ipmi_intf * intf, int argc, char ** argv) } rc = lan_set_arp_interval(intf, chan, interval); } - else if (strncmp(argv[2], "generate", 8) == 0) { + else if (!strcmp(argv[2], "generate")) { if (argc < 4) { print_lan_set_arp_usage(); return (-1); } - else if (strncmp(argv[3], "on", 2) == 0) + else if (!strcmp(argv[3], "on")) rc = lan_set_arp_generate(intf, chan, 1); - else if (strncmp(argv[3], "off", 3) == 0) + else if (!strcmp(argv[3], "off")) rc = lan_set_arp_generate(intf, chan, 0); else { print_lan_set_arp_usage(); return (-1); } } - else if (strncmp(argv[2], "respond", 7) == 0) { + else if (!strcmp(argv[2], "respond")) { if (argc < 4) { print_lan_set_arp_usage(); return (-1); } - else if (strncmp(argv[3], "on", 2) == 0) + else if (!strcmp(argv[3], "on")) rc = lan_set_arp_respond(intf, chan, 1); - else if (strncmp(argv[3], "off", 3) == 0) + else if (!strcmp(argv[3], "off")) rc = lan_set_arp_respond(intf, chan, 0); else { print_lan_set_arp_usage(); @@ -1422,12 +1495,12 @@ ipmi_lan_set(struct ipmi_intf * intf, int argc, char ** argv) } } /* set authentication types */ - else if (strncmp(argv[1], "auth", 4) == 0) { + else if (!strcmp(argv[1], "auth")) { if (argc < 3) { print_lan_set_auth_usage(); return (-1); } - else if (strncmp(argv[2], "help", 4) == 0) { + else if (!strcmp(argv[2], "help")) { print_lan_set_auth_usage(); return 0; } else { @@ -1435,22 +1508,22 @@ ipmi_lan_set(struct ipmi_intf * intf, int argc, char ** argv) } } /* ip address source */ - else if (strncmp(argv[1], "ipsrc", 5) == 0) { + else if (!strcmp(argv[1], "ipsrc")) { if (argc < 3) { print_lan_set_ipsrc_usage(); return (-1); } - else if (strncmp(argv[2], "help", 4) == 0) { + else if (!strcmp(argv[2], "help")) { print_lan_set_ipsrc_usage(); return 0; } - else if (strncmp(argv[2], "none", 4) == 0) + else if (!strcmp(argv[2], "none")) data[0] = 0; - else if (strncmp(argv[2], "static", 5) == 0) + else if (!strcmp(argv[2], "static")) data[0] = 1; - else if (strncmp(argv[2], "dhcp", 4) == 0) + else if (!strcmp(argv[2], "dhcp")) data[0] = 2; - else if (strncmp(argv[2], "bios", 4) == 0) + else if (!strcmp(argv[2], "bios")) data[0] = 3; else { print_lan_set_ipsrc_usage(); @@ -1460,16 +1533,16 @@ ipmi_lan_set(struct ipmi_intf * intf, int argc, char ** argv) } /* session password * not strictly a lan setting, but its used for lan connections */ - else if (strncmp(argv[1], "password", 8) == 0) { + else if (!strcmp(argv[1], "password")) { rc = ipmi_lan_set_password(intf, 1, argv[2]); } /* snmp community string */ - else if (strncmp(argv[1], "snmp", 4) == 0) { + else if (!strcmp(argv[1], "snmp")) { if (argc < 3) { print_lan_set_snmp_usage(); return (-1); } - else if (strncmp(argv[2], "help", 4) == 0) { + else if (!strcmp(argv[2], "help")) { print_lan_set_snmp_usage(); return 0; } else { @@ -1480,7 +1553,7 @@ ipmi_lan_set(struct ipmi_intf * intf, int argc, char ** argv) } } /* ip address */ - else if (strncmp(argv[1], "ipaddr", 6) == 0) { + else if (!strcmp(argv[1], "ipaddr")) { if(argc != 3) { print_lan_set_usage(); @@ -1495,7 +1568,7 @@ ipmi_lan_set(struct ipmi_intf * intf, int argc, char ** argv) } } /* network mask */ - else if (strncmp(argv[1], "netmask", 7) == 0) { + else if (!strcmp(argv[1], "netmask")) { if(argc != 3) { print_lan_set_usage(); @@ -1510,7 +1583,7 @@ ipmi_lan_set(struct ipmi_intf * intf, int argc, char ** argv) } } /* mac address */ - else if (strncmp(argv[1], "macaddr", 7) == 0) { + else if (!strcmp(argv[1], "macaddr")) { if(argc != 3) { print_lan_set_usage(); @@ -1525,24 +1598,26 @@ ipmi_lan_set(struct ipmi_intf * intf, int argc, char ** argv) } } /* default gateway settings */ - else if (strncmp(argv[1], "defgw", 5) == 0) { + else if (!strcmp(argv[1], "defgw")) { if (argc < 4) { print_lan_set_defgw_usage(); return (-1); } - else if (strncmp(argv[2], "help", 4) == 0) { + else if (!strcmp(argv[2], "help")) { print_lan_set_defgw_usage(); return 0; } - else if ((strncmp(argv[2], "ipaddr", 5) == 0) && - (get_cmdline_ipaddr(argv[3], data) == 0)) { + else if (!strcmp(argv[2], "ipaddr") + && !get_cmdline_ipaddr(argv[3], data)) + { printf("Setting LAN %s to %d.%d.%d.%d\n", ipmi_lan_params[IPMI_LANP_DEF_GATEWAY_IP].desc, data[0], data[1], data[2], data[3]); rc = set_lan_param(intf, chan, IPMI_LANP_DEF_GATEWAY_IP, data, 4); } - else if ((strncmp(argv[2], "macaddr", 7) == 0) && - (str2mac(argv[3], data) == 0)) { + else if (!strcmp(argv[2], "macaddr") + && !str2mac(argv[3], data)) + { printf("Setting LAN %s to %s\n", ipmi_lan_params[IPMI_LANP_DEF_GATEWAY_MAC].desc, mac2str(data)); @@ -1554,24 +1629,25 @@ ipmi_lan_set(struct ipmi_intf * intf, int argc, char ** argv) } } /* backup gateway settings */ - else if (strncmp(argv[1], "bakgw", 5) == 0) { + else if (!strcmp(argv[1], "bakgw")) { if (argc < 4) { print_lan_set_bakgw_usage(); return (-1); } - else if (strncmp(argv[2], "help", 4) == 0) { + else if (!strcmp(argv[2], "help")) { print_lan_set_bakgw_usage(); return 0; } - else if ((strncmp(argv[2], "ipaddr", 5) == 0) && - (get_cmdline_ipaddr(argv[3], data) == 0)) { + else if (!strcmp(argv[2], "ipaddr") + && !get_cmdline_ipaddr(argv[3], data)) + { printf("Setting LAN %s to %d.%d.%d.%d\n", ipmi_lan_params[IPMI_LANP_BAK_GATEWAY_IP].desc, data[0], data[1], data[2], data[3]); rc = set_lan_param(intf, chan, IPMI_LANP_BAK_GATEWAY_IP, data, 4); } - else if ((strncmp(argv[2], "macaddr", 7) == 0) && - (str2mac(argv[3], data) == 0)) { + else if (!strcmp(argv[2], "macaddr") + && !str2mac(argv[3], data)) { printf("Setting LAN %s to %s\n", ipmi_lan_params[IPMI_LANP_BAK_GATEWAY_MAC].desc, mac2str(data)); @@ -1582,24 +1658,24 @@ ipmi_lan_set(struct ipmi_intf * intf, int argc, char ** argv) return -1; } } - else if (strncasecmp(argv[1], "vlan", 4) == 0) { + else if (!strcmp(argv[1], "vlan")) { if (argc < 4) { print_lan_set_vlan_usage(); return (-1); } - else if (strncmp(argv[2], "help", 4) == 0) { + else if (!strcmp(argv[2], "help")) { print_lan_set_vlan_usage(); return 0; } - else if (strncasecmp(argv[2], "id", 2) == 0) { - if (strncasecmp(argv[3], "off", 3) == 0) { + else if (!strcmp(argv[2], "id")) { + if (!strcmp(argv[3], "off")) { ipmi_lan_set_vlan_id(intf, chan, NULL); } else { ipmi_lan_set_vlan_id(intf, chan, argv[3]); } } - else if (strncasecmp(argv[2], "priority", 8) == 0) { + else if (!strcmp(argv[2], "priority")) { ipmi_lan_set_vlan_priority(intf, chan, argv[3]); } else { @@ -1608,18 +1684,18 @@ ipmi_lan_set(struct ipmi_intf * intf, int argc, char ** argv) } } /* set PEF alerting on or off */ - else if (strncasecmp(argv[1], "alert", 5) == 0) { + else if (!strcmp(argv[1], "alert")) { if (argc < 3) { lprintf(LOG_NOTICE, "LAN set alert must be 'on' or 'off'"); return (-1); } - else if (strncasecmp(argv[2], "on", 2) == 0 || - strncasecmp(argv[2], "enable", 6) == 0) { + else if (!strcmp(argv[2], "on") || + !strcmp(argv[2], "enable")) { printf("Enabling PEF alerts for LAN channel %d\n", chan); rc = ipmi_set_alert_enable(intf, chan, 1); } - else if (strncasecmp(argv[2], "off", 3) == 0 || - strncasecmp(argv[2], "disable", 7) == 0) { + else if (!strcmp(argv[2], "off") || + !strcmp(argv[2], "disable")) { printf("Disabling PEF alerts for LAN channel %d\n", chan); rc = ipmi_set_alert_enable(intf, chan, 0); } @@ -1629,14 +1705,14 @@ ipmi_lan_set(struct ipmi_intf * intf, int argc, char ** argv) } } /* RMCP+ cipher suite privilege levels */ - else if (strncmp(argv[1], "cipher_privs", 12) == 0) + else if (!strcmp(argv[1], "cipher_privs")) { if (argc != 3) { print_lan_set_cipher_privs_usage(); return (-1); } - else if ((strncmp(argv[2], "help", 4) == 0) || - get_cmdline_cipher_suite_priv_data(argv[2], data)) + else if (!strcmp(argv[2], "help") + || get_cmdline_cipher_suite_priv_data(argv[2], data)) { print_lan_set_cipher_privs_usage(); return 0; @@ -1646,9 +1722,9 @@ ipmi_lan_set(struct ipmi_intf * intf, int argc, char ** argv) rc = set_lan_param(intf, chan, IPMI_LANP_RMCP_PRIV_LEVELS, data, 9); } } - else if (strncmp(argv[1], "bad_pass_thresh", 15) == 0) + else if (!strcmp(argv[1], "bad_pass_thresh")) { - if (argc == 3 && strncmp(argv[2], "help", 4) == 0) { + if (argc == 3 && !strcmp(argv[2], "help")) { print_lan_set_bad_pass_thresh_usage(); return 0; } @@ -1668,14 +1744,14 @@ ipmi_lan_set(struct ipmi_intf * intf, int argc, char ** argv) static int -is_alert_destination(struct ipmi_intf * intf, uint8_t channel, uint8_t alert) +is_alert_destination(struct ipmi_intf *intf, uint8_t channel, uint8_t alert) { - struct lan_param * p; + struct lan_param *p; p = get_lan_param(intf, channel, IPMI_LANP_NUM_DEST); - if (p == NULL) + if (!p) return 0; - if (p->data == NULL) + if (!p->data) return 0; if (alert <= (p->data[0] & 0xf)) @@ -1685,7 +1761,7 @@ is_alert_destination(struct ipmi_intf * intf, uint8_t channel, uint8_t alert) } static int -ipmi_lan_alert_print(struct ipmi_intf * intf, uint8_t channel, uint8_t alert) +ipmi_lan_alert_print(struct ipmi_intf *intf, uint8_t channel, uint8_t alert) { # define PTYPE_LEN 4 # define PADDR_LEN 13 @@ -1695,15 +1771,14 @@ ipmi_lan_alert_print(struct ipmi_intf * intf, uint8_t channel, uint8_t alert) uint8_t paddr[PADDR_LEN]; lp_ptr = get_lan_param_select(intf, channel, IPMI_LANP_DEST_TYPE, alert); - if (lp_ptr == NULL || lp_ptr->data == NULL + if (!lp_ptr || !lp_ptr->data || lp_ptr->data_len < PTYPE_LEN) { return (-1); } memcpy(ptype, lp_ptr->data, PTYPE_LEN); lp_ptr = get_lan_param_select(intf, channel, IPMI_LANP_DEST_ADDR, alert); - if (lp_ptr == NULL || lp_ptr->data == NULL - || lp_ptr->data_len < PADDR_LEN) { + if (!lp_ptr || !lp_ptr->data || lp_ptr->data_len < PADDR_LEN) { return (-1); } memcpy(paddr, lp_ptr->data, PADDR_LEN); @@ -1760,15 +1835,15 @@ ipmi_lan_alert_print(struct ipmi_intf * intf, uint8_t channel, uint8_t alert) } static int -ipmi_lan_alert_print_all(struct ipmi_intf * intf, uint8_t channel) +ipmi_lan_alert_print_all(struct ipmi_intf *intf, uint8_t channel) { int j, ndest; - struct lan_param * p; + struct lan_param *p; p = get_lan_param(intf, channel, IPMI_LANP_NUM_DEST); - if (p == NULL) + if (!p) return -1; - if (p->data == NULL) + if (!p->data) return -1; ndest = p->data[0] & 0xf; @@ -1780,10 +1855,10 @@ ipmi_lan_alert_print_all(struct ipmi_intf * intf, uint8_t channel) } static int -ipmi_lan_alert_set(struct ipmi_intf * intf, uint8_t chan, uint8_t alert, - int argc, char ** argv) +ipmi_lan_alert_set(struct ipmi_intf *intf, uint8_t chan, uint8_t alert, + int argc, char **argv) { - struct lan_param * p; + struct lan_param *p; uint8_t data[32], temp[32]; int rc = 0; @@ -1792,8 +1867,9 @@ ipmi_lan_alert_set(struct ipmi_intf * intf, uint8_t chan, uint8_t alert, return (-1); } - if (strncmp(argv[0], "help", 4) == 0 || - strncmp(argv[1], "help", 4) == 0) { + if (!strcmp(argv[0], "help") + || !strcmp(argv[1], "help")) + { print_lan_alert_set_usage(); return 0; } @@ -1802,14 +1878,14 @@ ipmi_lan_alert_set(struct ipmi_intf * intf, uint8_t chan, uint8_t alert, memset(temp, 0, sizeof(temp)); /* alert destination ip address */ - if (strncasecmp(argv[0], "ipaddr", 6) == 0 && + if (strcasecmp(argv[0], "ipaddr") == 0 && (get_cmdline_ipaddr(argv[1], temp) == 0)) { /* get current parameter */ p = get_lan_param_select(intf, chan, IPMI_LANP_DEST_ADDR, alert); - if (p == NULL) { + if (!p) { return (-1); } - memcpy(data, p->data, p->data_len); + memcpy(data, p->data, __min(p->data_len, sizeof(data))); /* set new ipaddr */ memcpy(data+3, temp, 4); printf("Setting LAN Alert %d IP Address to %d.%d.%d.%d\n", alert, @@ -1817,14 +1893,14 @@ ipmi_lan_alert_set(struct ipmi_intf * intf, uint8_t chan, uint8_t alert, rc = set_lan_param_nowait(intf, chan, IPMI_LANP_DEST_ADDR, data, p->data_len); } /* alert destination mac address */ - else if (strncasecmp(argv[0], "macaddr", 7) == 0 && + else if (strcasecmp(argv[0], "macaddr") == 0 && (str2mac(argv[1], temp) == 0)) { /* get current parameter */ p = get_lan_param_select(intf, chan, IPMI_LANP_DEST_ADDR, alert); - if (p == NULL) { + if (!p) { return (-1); } - memcpy(data, p->data, p->data_len); + memcpy(data, p->data, __min(p->data_len, sizeof(data))); /* set new macaddr */ memcpy(data+7, temp, 6); printf("Setting LAN Alert %d MAC Address to " @@ -1832,21 +1908,21 @@ ipmi_lan_alert_set(struct ipmi_intf * intf, uint8_t chan, uint8_t alert, rc = set_lan_param_nowait(intf, chan, IPMI_LANP_DEST_ADDR, data, p->data_len); } /* alert destination gateway selector */ - else if (strncasecmp(argv[0], "gateway", 7) == 0) { + else if (strcasecmp(argv[0], "gateway") == 0) { /* get current parameter */ p = get_lan_param_select(intf, chan, IPMI_LANP_DEST_ADDR, alert); - if (p == NULL) { + if (!p) { return (-1); } - memcpy(data, p->data, p->data_len); + memcpy(data, p->data, __min(p->data_len, sizeof(data))); - if (strncasecmp(argv[1], "def", 3) == 0 || - strncasecmp(argv[1], "default", 7) == 0) { + if (strcasecmp(argv[1], "def") == 0 || + strcasecmp(argv[1], "default") == 0) { printf("Setting LAN Alert %d to use Default Gateway\n", alert); data[2] = 0; } - else if (strncasecmp(argv[1], "bak", 3) == 0 || - strncasecmp(argv[1], "backup", 6) == 0) { + else if (strcasecmp(argv[1], "bak") == 0 || + strcasecmp(argv[1], "backup") == 0) { printf("Setting LAN Alert %d to use Backup Gateway\n", alert); data[2] = 1; } @@ -1858,21 +1934,21 @@ ipmi_lan_alert_set(struct ipmi_intf * intf, uint8_t chan, uint8_t alert, rc = set_lan_param_nowait(intf, chan, IPMI_LANP_DEST_ADDR, data, p->data_len); } /* alert acknowledgement */ - else if (strncasecmp(argv[0], "ack", 3) == 0) { + else if (strcasecmp(argv[0], "ack") == 0) { /* get current parameter */ p = get_lan_param_select(intf, chan, IPMI_LANP_DEST_TYPE, alert); - if (p == NULL) { + if (!p) { return (-1); } - memcpy(data, p->data, p->data_len); + memcpy(data, p->data, __min(p->data_len, sizeof(data))); - if (strncasecmp(argv[1], "on", 2) == 0 || - strncasecmp(argv[1], "yes", 3) == 0) { + if (strcasecmp(argv[1], "on") == 0 || + strcasecmp(argv[1], "yes") == 0) { printf("Setting LAN Alert %d to Acknowledged\n", alert); data[1] |= 0x80; } - else if (strncasecmp(argv[1], "off", 3) == 0 || - strncasecmp(argv[1], "no", 2) == 0) { + else if (strcasecmp(argv[1], "off") == 0 || + strcasecmp(argv[1], "no") == 0) { printf("Setting LAN Alert %d to Unacknowledged\n", alert); data[1] &= ~0x80; } @@ -1883,24 +1959,24 @@ ipmi_lan_alert_set(struct ipmi_intf * intf, uint8_t chan, uint8_t alert, rc = set_lan_param_nowait(intf, chan, IPMI_LANP_DEST_TYPE, data, p->data_len); } /* alert destination type */ - else if (strncasecmp(argv[0], "type", 4) == 0) { + else if (strcasecmp(argv[0], "type") == 0) { /* get current parameter */ p = get_lan_param_select(intf, chan, IPMI_LANP_DEST_TYPE, alert); - if (p == NULL) { + if (!p) { return (-1); } - memcpy(data, p->data, p->data_len); + memcpy(data, p->data, __min(p->data_len, sizeof(data))); - if (strncasecmp(argv[1], "pet", 3) == 0) { + if (strcasecmp(argv[1], "pet") == 0) { printf("Setting LAN Alert %d destination to PET Trap\n", alert); data[1] &= ~0x07; } - else if (strncasecmp(argv[1], "oem1", 4) == 0) { + else if (strcasecmp(argv[1], "oem1") == 0) { printf("Setting LAN Alert %d destination to OEM 1\n", alert); data[1] &= ~0x07; data[1] |= 0x06; } - else if (strncasecmp(argv[1], "oem2", 4) == 0) { + else if (strcasecmp(argv[1], "oem2") == 0) { printf("Setting LAN Alert %d destination to OEM 2\n", alert); data[1] |= 0x07; } @@ -1911,13 +1987,13 @@ ipmi_lan_alert_set(struct ipmi_intf * intf, uint8_t chan, uint8_t alert, rc = set_lan_param_nowait(intf, chan, IPMI_LANP_DEST_TYPE, data, p->data_len); } /* alert acknowledge timeout or retry interval */ - else if (strncasecmp(argv[0], "time", 4) == 0) { + else if (strcasecmp(argv[0], "time") == 0) { /* get current parameter */ p = get_lan_param_select(intf, chan, IPMI_LANP_DEST_TYPE, alert); - if (p == NULL) { + if (!p) { return (-1); } - memcpy(data, p->data, p->data_len); + memcpy(data, p->data, __min(p->data_len, sizeof(data))); if (str2uchar(argv[1], &data[2]) != 0) { lprintf(LOG_ERR, "Invalid time: %s", argv[1]); @@ -1927,13 +2003,13 @@ ipmi_lan_alert_set(struct ipmi_intf * intf, uint8_t chan, uint8_t alert, rc = set_lan_param_nowait(intf, chan, IPMI_LANP_DEST_TYPE, data, p->data_len); } /* number of retries */ - else if (strncasecmp(argv[0], "retry", 5) == 0) { + else if (strcasecmp(argv[0], "retry") == 0) { /* get current parameter */ p = get_lan_param_select(intf, chan, IPMI_LANP_DEST_TYPE, alert); - if (p == NULL) { + if (!p) { return (-1); } - memcpy(data, p->data, p->data_len); + memcpy(data, p->data, __min(p->data_len, sizeof(data))); if (str2uchar(argv[1], &data[3]) != 0) { lprintf(LOG_ERR, "Invalid retry: %s", argv[1]); @@ -1952,7 +2028,7 @@ ipmi_lan_alert_set(struct ipmi_intf * intf, uint8_t chan, uint8_t alert, } static int -ipmi_lan_alert(struct ipmi_intf * intf, int argc, char ** argv) +ipmi_lan_alert(struct ipmi_intf *intf, int argc, char **argv) { uint8_t alert; uint8_t channel = 1; @@ -1962,14 +2038,14 @@ ipmi_lan_alert(struct ipmi_intf * intf, int argc, char ** argv) print_lan_alert_set_usage(); return (-1); } - else if (strncasecmp(argv[0], "help", 4) == 0) { + else if (strcasecmp(argv[0], "help") == 0) { print_lan_alert_print_usage(); print_lan_alert_set_usage(); return 0; } /* alert print [channel] [alert] */ - if (strncasecmp(argv[0], "print", 5) == 0) { + if (strcasecmp(argv[0], "print") == 0) { if (argc < 2) { channel = find_lan_channel(intf, 1); if (!is_lan_channel(intf, channel)) { @@ -1979,7 +2055,7 @@ ipmi_lan_alert(struct ipmi_intf * intf, int argc, char ** argv) return ipmi_lan_alert_print_all(intf, channel); } - if (strncasecmp(argv[1], "help", 4) == 0) { + if (strcasecmp(argv[1], "help") == 0) { print_lan_alert_print_usage(); return 0; } @@ -2008,12 +2084,12 @@ ipmi_lan_alert(struct ipmi_intf * intf, int argc, char ** argv) } /* alert set <channel> <alert> [option] */ - if (strncasecmp(argv[0], "set", 3) == 0) { + if (strcasecmp(argv[0], "set") == 0) { if (argc < 5) { print_lan_alert_set_usage(); return (-1); } - else if (strncasecmp(argv[1], "help", 4) == 0) { + else if (strcasecmp(argv[1], "help") == 0) { print_lan_alert_set_usage(); return 0; } @@ -2044,10 +2120,10 @@ ipmi_lan_alert(struct ipmi_intf * intf, int argc, char ** argv) static int -ipmi_lan_stats_get(struct ipmi_intf * intf, uint8_t chan) +ipmi_lan_stats_get(struct ipmi_intf *intf, uint8_t chan) { int rc = 0; - struct ipmi_rs * rsp; + struct ipmi_rs *rsp; struct ipmi_rq req; uint8_t msg_data[2]; uint16_t statsTemp; @@ -2069,14 +2145,16 @@ ipmi_lan_stats_get(struct ipmi_intf * intf, uint8_t chan) req.msg.data_len = 2; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Get LAN Stats command failed"); return (-1); } - if (rsp->ccode > 0) { + if (rsp->ccode) { lprintf(LOG_ERR, "Get LAN Stats command failed: %s", - val2str(rsp->ccode, completion_code_vals)); + specific_val2str(rsp->ccode, + get_lan_cc_vals, + completion_code_vals)); return (-1); } @@ -2122,10 +2200,10 @@ ipmi_lan_stats_get(struct ipmi_intf * intf, uint8_t chan) static int -ipmi_lan_stats_clear(struct ipmi_intf * intf, uint8_t chan) +ipmi_lan_stats_clear(struct ipmi_intf *intf, uint8_t chan) { int rc = 0; - struct ipmi_rs * rsp; + struct ipmi_rs *rsp; struct ipmi_rq req; uint8_t msg_data[2]; @@ -2145,14 +2223,16 @@ ipmi_lan_stats_clear(struct ipmi_intf * intf, uint8_t chan) req.msg.data_len = 2; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_INFO, "Get LAN Stats command failed"); return (-1); } - if (rsp->ccode > 0) { + if (rsp->ccode) { lprintf(LOG_INFO, "Get LAN Stats command failed: %s", - val2str(rsp->ccode, completion_code_vals)); + specific_val2str(rsp->ccode, + get_lan_cc_vals, + completion_code_vals)); return (-1); } @@ -2412,7 +2492,7 @@ print_lan_usage(void) int -ipmi_lanp_main(struct ipmi_intf * intf, int argc, char ** argv) +ipmi_lanp_main(struct ipmi_intf *intf, int argc, char **argv) { int rc = 0; uint8_t chan = 0; @@ -2420,13 +2500,13 @@ ipmi_lanp_main(struct ipmi_intf * intf, int argc, char ** argv) if (argc == 0) { print_lan_usage(); return (-1); - } else if (strncmp(argv[0], "help", 4) == 0) { + } else if (!strcmp(argv[0], "help")) { print_lan_usage(); return 0; } - if (strncmp(argv[0], "printconf", 9) == 0 || - strncmp(argv[0], "print", 5) == 0) + if (!strcmp(argv[0], "printconf") + || !strcmp(argv[0], "print")) { if (argc > 2) { print_lan_usage(); @@ -2444,11 +2524,11 @@ ipmi_lanp_main(struct ipmi_intf * intf, int argc, char ** argv) return (-1); } rc = ipmi_lan_print(intf, chan); - } else if (strncmp(argv[0], "set", 3) == 0) { + } else if (!strcmp(argv[0], "set")) { rc = ipmi_lan_set(intf, argc-1, &(argv[1])); - } else if (strncmp(argv[0], "alert", 5) == 0) { + } else if (!strcmp(argv[0], "alert")) { rc = ipmi_lan_alert(intf, argc-1, &(argv[1])); - } else if (strncmp(argv[0], "stats", 5) == 0) { + } else if (!strcmp(argv[0], "stats")) { if (argc < 2) { print_lan_usage(); return (-1); @@ -2464,9 +2544,9 @@ ipmi_lanp_main(struct ipmi_intf * intf, int argc, char ** argv) lprintf(LOG_ERR, "Invalid channel: %d", chan); return (-1); } - if (strncmp(argv[1], "get", 3) == 0) { + if (!strcmp(argv[1], "get")) { rc = ipmi_lan_stats_get(intf, chan); - } else if (strncmp(argv[1], "clear", 5) == 0) { + } else if (!strcmp(argv[1], "clear")) { rc = ipmi_lan_stats_clear(intf, chan); } else { print_lan_usage(); diff --git a/lib/ipmi_lanp6.c b/lib/ipmi_lanp6.c index bbffb89..4af6d8b 100644 --- a/lib/ipmi_lanp6.c +++ b/lib/ipmi_lanp6.c @@ -333,7 +333,7 @@ ipmi_lanp_err(const struct ipmi_rs *rsp, const struct ipmi_lanp *p, int log_level = LOG_ERR; int err; - if (rsp == NULL) { + if (!rsp) { reason = "No response"; err = -1; } else { @@ -354,7 +354,7 @@ ipmi_lanp_err(const struct ipmi_rs *rsp, const struct ipmi_lanp *p, reason = val2str(rsp->ccode, lanp_cc_vals); } - if (reason == NULL) { + if (!reason) { /* print completion code value */ snprintf(cc_msg, sizeof(cc_msg), "CC=%02x", rsp->ccode); reason = cc_msg; @@ -403,7 +403,7 @@ ipmi_get_dynamic_oem_lanp(void *priv, const struct ipmi_lanp *param, param->name, set_selector, block_selector); rsp = lp->intf->sendrecv(lp->intf, &req); - if (rsp == NULL || rsp->ccode) { + if (!rsp || rsp->ccode) { return ipmi_lanp_err(rsp, param, "get", quiet); } @@ -467,7 +467,7 @@ ipmi_set_dynamic_oem_lanp(void *priv, const struct ipmi_lanp *param, lprintf(LOG_INFO, "Setting parameter '%s'", param->name); rsp = lp->intf->sendrecv(lp->intf, &req); - if (rsp == NULL || rsp->ccode) { + if (!rsp || rsp->ccode) { return ipmi_lanp_err(rsp, param, "set", 0); } @@ -1027,9 +1027,7 @@ static void lanp_print_usage(int cmd) printf("\n available parameters:\n"); /* 'save' shall use 'write' filter, since it outputs a block * of 'set's */ - ipmi_cfgp_usage(lan_cfgp, - sizeof(lan_cfgp)/sizeof(lan_cfgp[0]), - cmd != LANP_CMD_PRINT); + ipmi_cfgp_usage(lan_cfgp, ARRAY_SIZE(lan_cfgp), cmd != LANP_CMD_PRINT); } } @@ -1161,8 +1159,8 @@ ipmi_lan6_main(struct ipmi_intf *intf, int argc, char **argv) */ ipmi_cfgp_init(&ctx, lan_cfgp, - sizeof(lan_cfgp)/sizeof(lan_cfgp[0]), "lan6 set nolock", - lanp_ip6_cfgp, &lp); + ARRAY_SIZE(lan_cfgp), "lan6 set nolock", + lanp_ip6_cfgp, &lp); ret = ipmi_cfgp_parse_sel(&ctx, argc, (const char **)argv, &sel); if (ret == -1) { diff --git a/lib/ipmi_main.c b/lib/ipmi_main.c index 811c80b..a673a30 100644 --- a/lib/ipmi_main.c +++ b/lib/ipmi_main.c @@ -29,11 +29,6 @@ * LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, * EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. */ -#define _XOPEN_SOURCE 700 -#define _BSD_SOURCE || \ - (_XOPEN_SOURCE >= 500 || \ - _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED) && \ - !(_POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600) #include <stdlib.h> #include <stdio.h> @@ -47,6 +42,7 @@ #include <fcntl.h> #include <errno.h> #include <ctype.h> +#include <locale.h> #include <ipmitool/helper.h> #include <ipmitool/log.h> @@ -70,18 +66,20 @@ #include <ipmitool/ipmi_user.h> #include <ipmitool/ipmi_raw.h> #include <ipmitool/ipmi_pef.h> +#include <ipmitool/ipmi_time.h> #include <ipmitool/ipmi_oem.h> #include <ipmitool/ipmi_ekanalyzer.h> #include <ipmitool/ipmi_picmg.h> #include <ipmitool/ipmi_kontronoem.h> #include <ipmitool/ipmi_vita.h> +#include <ipmitool/ipmi_quantaoem.h> #ifdef HAVE_CONFIG_H # include <config.h> #endif #ifdef ENABLE_ALL_OPTIONS -# define OPTION_STRING "I:46hVvcgsEKYao:H:d:P:f:U:p:C:L:A:t:T:m:z:S:l:b:B:e:k:y:O:R:N:D:" +# define OPTION_STRING "I:46hVvcgsEKYao:H:d:P:f:U:p:C:L:A:t:T:m:z:S:l:b:B:e:k:y:O:R:N:D:Z" #else # define OPTION_STRING "I:46hVvcH:f:U:p:d:S:D:" #endif @@ -90,8 +88,6 @@ void ipmi_intf_set_max_request_data_size(struct ipmi_intf * intf, uint16_t size); -extern int verbose; -extern int csv_output; extern const struct valstr ipmi_privlvl_vals[]; extern const struct valstr ipmi_authtype_session_vals[]; @@ -113,14 +109,14 @@ ipmi_password_file_read(char * filename) int l; pass = malloc(21); - if (pass == NULL) { + if (!pass) { lprintf(LOG_ERR, "ipmitool: malloc failure"); return NULL; } memset(pass, 0, 21); fp = ipmi_open_file_read((const char *)filename); - if (fp == NULL) { + if (!fp) { lprintf(LOG_ERR, "Unable to open password file %s", filename); free(pass); @@ -128,7 +124,7 @@ ipmi_password_file_read(char * filename) } /* read in id */ - if (fgets(pass, 21, fp) == NULL) { + if (!fgets(pass, 21, fp)) { lprintf(LOG_ERR, "Unable to read password from file %s", filename); free(pass); @@ -157,10 +153,10 @@ ipmi_cmd_print(struct ipmi_cmd * cmdlist) struct ipmi_cmd * cmd; int hdr = 0; - if (cmdlist == NULL) + if (!cmdlist) return; - for (cmd=cmdlist; cmd->func != NULL; cmd++) { - if (cmd->desc == NULL) + for (cmd=cmdlist; cmd->func; cmd++) { + if (!cmd->desc) continue; if (hdr == 0) { lprintf(LOG_NOTICE, "Commands:"); @@ -182,7 +178,7 @@ ipmi_cmd_print(struct ipmi_cmd * cmdlist) * @argc: command argument count * @argv: command argument list * - * returns value from func() of that commnad if found + * returns value from func() of that command if found * returns -1 if command is not found */ int @@ -191,25 +187,25 @@ ipmi_cmd_run(struct ipmi_intf * intf, char * name, int argc, char ** argv) struct ipmi_cmd * cmd = intf->cmdlist; /* hook to run a default command if nothing specified */ - if (name == NULL) { - if (cmd->func == NULL || cmd->name == NULL) + if (!name) { + if (!cmd->func || !cmd->name) return -1; - else if (strncmp(cmd->name, "default", 7) == 0) + + if (!strcmp(cmd->name, "default")) return cmd->func(intf, 0, NULL); - else { - lprintf(LOG_ERR, "No command provided!"); - ipmi_cmd_print(intf->cmdlist); - return -1; - } + + lprintf(LOG_ERR, "No command provided!"); + ipmi_cmd_print(intf->cmdlist); + return -1; } - for (cmd=intf->cmdlist; cmd->func != NULL; cmd++) { - if (strncmp(name, cmd->name, __maxlen(cmd->name, name)) == 0) + for (cmd=intf->cmdlist; cmd->func; cmd++) { + if (!strcmp(name, cmd->name)) break; } - if (cmd->func == NULL) { + if (!cmd->func) { cmd = intf->cmdlist; - if (strncmp(cmd->name, "default", 7) == 0) + if (!strcmp(cmd->name, "default")) return cmd->func(intf, argc+1, argv-1); lprintf(LOG_ERR, "Invalid command: %s", name); @@ -263,12 +259,13 @@ ipmi_option_usage(const char * progname, struct ipmi_cmd * cmdlist, struct ipmi_ lprintf(LOG_NOTICE, " -O seloem Use file for OEM SEL event descriptions"); lprintf(LOG_NOTICE, " -N seconds Specify timeout for lan [default=2] / lanplus [default=1] interface"); lprintf(LOG_NOTICE, " -R retry Set the number of retries for lan/lanplus interface [default=4]"); + lprintf(LOG_NOTICE, " -Z Display all dates in UTC"); #endif lprintf(LOG_NOTICE, ""); ipmi_intf_print(intflist); - if (cmdlist != NULL) + if (cmdlist) ipmi_cmd_print(cmdlist); } /* ipmi_catch_sigint - Handle the interrupt signal (Ctrl-C), close the @@ -281,7 +278,7 @@ ipmi_option_usage(const char * progname, struct ipmi_cmd * cmdlist, struct ipmi_ */ void ipmi_catch_sigint() { - if (ipmi_main_intf != NULL) { + if (ipmi_main_intf) { printf("\nSIGN INT: Close Interface %s\n",ipmi_main_intf->desc); /* reduce retry count to a single retry */ ipmi_main_intf->ssn_params.retry = 1; @@ -323,6 +320,7 @@ ipmi_main(int argc, char ** argv, uint8_t target_addr = 0; uint8_t target_channel = 0; + uint8_t u8tmp = 0; uint8_t transit_addr = 0; uint8_t transit_channel = 0; uint8_t target_lun = 0; @@ -347,19 +345,29 @@ ipmi_main(int argc, char ** argv, char * seloem = NULL; int port = 0; int devnum = 0; - int cipher_suite_id = 3; /* See table 22-19 of the IPMIv2 spec */ +#ifdef IPMI_INTF_LANPLUS + /* lookup best cipher suite available */ + enum cipher_suite_ids cipher_suite_id = IPMI_LANPLUS_CIPHER_SUITE_RESERVED; +#endif /* IPMI_INTF_LANPLUS */ int argflag, i, found; int rc = -1; int ai_family = AF_UNSPEC; char sol_escape_char = SOL_ESCAPE_CHARACTER_DEFAULT; char * devfile = NULL; + /* Set program locale according to system settings */ + setlocale(LC_ALL, ""); + + /* save program name */ progname = strrchr(argv[0], '/'); - progname = ((progname == NULL) ? argv[0] : progname+1); + progname = ((!progname) ? argv[0] : progname+1); signal(SIGINT, ipmi_catch_sigint); memset(kgkey, 0, sizeof(kgkey)); + /* setup log */ + log_init(progname, 0, 0); + while ((argflag = getopt(argc, (char **)argv, OPTION_STRING)) != -1) { switch (argflag) { @@ -369,17 +377,18 @@ ipmi_main(int argc, char ** argv, intfname = NULL; } intfname = strdup(optarg); - if (intfname == NULL) { + if (!intfname) { lprintf(LOG_ERR, "%s: malloc failure", progname); goto out_free; } - if (intflist != NULL) { + if (intflist) { found = 0; - for (sup=intflist; sup->name != NULL; sup++) { - if (strncmp(sup->name, intfname, strlen(intfname)) == 0 && - strncmp(sup->name, intfname, strlen(sup->name)) == 0 && - sup->supported == 1) + for (sup=intflist; sup->name; sup++) { + if (!strcmp(sup->name, intfname) + && sup->supported) + { found = 1; + } } if (!found) { lprintf(LOG_ERR, "Interface %s not supported", intfname); @@ -425,21 +434,24 @@ ipmi_main(int argc, char ** argv, goto out_free; } break; +#ifdef IPMI_INTF_LANPLUS case 'C': - if (str2int(optarg, &cipher_suite_id) != 0) { - lprintf(LOG_ERR, "Invalid parameter given or out of range for '-C'."); - rc = -1; - goto out_free; - } - /* add check Cipher is -gt 0 */ - if (cipher_suite_id < 0) { - lprintf(LOG_ERR, "Cipher suite ID %i is invalid.", cipher_suite_id); + /* Cipher Suite ID is a byte as per IPMI specification */ + if (str2uchar(optarg, &u8tmp) != 0) { + lprintf(LOG_ERR, "Invalid parameter given or out of " + "range [0-255] for '-C'."); rc = -1; goto out_free; } + cipher_suite_id = u8tmp; break; +#endif /* IPMI_INTF_LANPLUS */ case 'v': - verbose++; + log_level_set(++verbose); + if (verbose == 2) { + /* add version info to debug output */ + lprintf(LOG_DEBUG, "%s version %s\n", progname, VERSION); + } break; case 'c': csv_output = 1; @@ -450,7 +462,7 @@ ipmi_main(int argc, char ** argv, hostname = NULL; } hostname = strdup(optarg); - if (hostname == NULL) { + if (!hostname) { lprintf(LOG_ERR, "%s: malloc failure", progname); goto out_free; } @@ -461,7 +473,7 @@ ipmi_main(int argc, char ** argv, password = NULL; } password = ipmi_password_file_read(optarg); - if (password == NULL) + if (!password) lprintf(LOG_ERR, "Unable to read password " "from file %s", optarg); break; @@ -471,14 +483,14 @@ ipmi_main(int argc, char ** argv, #else tmp_pass = getpass("Password: "); #endif - if (tmp_pass != NULL) { + if (tmp_pass) { if (password) { free(password); password = NULL; } password = strdup(tmp_pass); tmp_pass = NULL; - if (password == NULL) { + if (!password) { lprintf(LOG_ERR, "%s: malloc failure", progname); goto out_free; } @@ -518,7 +530,7 @@ ipmi_main(int argc, char ** argv, #else tmp_pass = getpass("Key: "); #endif - if (tmp_pass != NULL) { + if (tmp_pass) { memset(kgkey, 0, sizeof(kgkey)); strncpy((char *)kgkey, tmp_pass, sizeof(kgkey) - 1); @@ -535,7 +547,7 @@ ipmi_main(int argc, char ** argv, goto out_free; } username = strdup(optarg); - if (username == NULL) { + if (!username) { lprintf(LOG_ERR, "%s: malloc failure", progname); goto out_free; } @@ -546,7 +558,7 @@ ipmi_main(int argc, char ** argv, sdrcache = NULL; } sdrcache = strdup(optarg); - if (sdrcache == NULL) { + if (!sdrcache) { lprintf(LOG_ERR, "%s: malloc failure", progname); goto out_free; } @@ -558,7 +570,7 @@ ipmi_main(int argc, char ** argv, free(devfile); } devfile = strdup(optarg); - if (devfile == NULL) { + if (!devfile) { lprintf(LOG_ERR, "%s: malloc failure", progname); goto out_free; } @@ -602,12 +614,13 @@ ipmi_main(int argc, char ** argv, oemtype = NULL; } oemtype = strdup(optarg); - if (oemtype == NULL) { + if (!oemtype) { lprintf(LOG_ERR, "%s: malloc failure", progname); goto out_free; } - if (strncmp(oemtype, "list", 4) == 0 || - strncmp(oemtype, "help", 4) == 0) { + if (!strcmp(oemtype, "list") + || !strcmp(oemtype, "help")) + { ipmi_oem_print(); rc = 0; goto out_free; @@ -635,7 +648,7 @@ ipmi_main(int argc, char ** argv, password = NULL; } password = strdup(optarg); - if (password == NULL) { + if (!password) { lprintf(LOG_ERR, "%s: malloc failure", progname); goto out_free; } @@ -651,7 +664,7 @@ ipmi_main(int argc, char ** argv, password = NULL; } password = strdup(tmp_env); - if (password == NULL) { + if (!password) { lprintf(LOG_ERR, "%s: malloc failure", progname); goto out_free; } @@ -662,7 +675,7 @@ ipmi_main(int argc, char ** argv, password = NULL; } password = strdup(tmp_env); - if (password == NULL) { + if (!password) { lprintf(LOG_ERR, "%s: malloc failure", progname); goto out_free; } @@ -736,7 +749,7 @@ ipmi_main(int argc, char ** argv, seloem = NULL; } seloem = strdup(optarg); - if (seloem == NULL) { + if (!seloem) { lprintf(LOG_ERR, "%s: malloc failure", progname); goto out_free; } @@ -763,6 +776,9 @@ ipmi_main(int argc, char ** argv, goto out_free; } break; + case 'Z': + time_in_utc = 1; + break; #endif default: ipmi_option_usage(progname, cmdlist, intflist); @@ -771,8 +787,9 @@ ipmi_main(int argc, char ** argv, } /* check for command before doing anything */ - if (argc-optind > 0 && - strncmp(argv[optind], "help", 4) == 0) { + if (argc-optind > 0 + && !strcmp(argv[optind], "help")) + { ipmi_cmd_print(cmdlist); rc = 0; goto out_free; @@ -786,17 +803,17 @@ ipmi_main(int argc, char ** argv, * and the authtype was not explicitly set to NONE * then prompt the user. */ - if (hostname != NULL && password == NULL && + if (hostname && !password && (authtype != IPMI_SESSION_AUTHTYPE_NONE || authtype < 0)) { #ifdef HAVE_GETPASSPHRASE tmp_pass = getpassphrase("Password: "); #else tmp_pass = getpass("Password: "); #endif - if (tmp_pass != NULL) { + if (tmp_pass) { password = strdup(tmp_pass); tmp_pass = NULL; - if (password == NULL) { + if (!password) { lprintf(LOG_ERR, "%s: malloc failure", progname); goto out_free; } @@ -808,49 +825,52 @@ ipmi_main(int argc, char ** argv, * otherwise the default is hardcoded * to use the first entry in the list */ - if (intfname == NULL && hostname != NULL) { + if (!intfname && hostname) { intfname = strdup("lan"); - if (intfname == NULL) { + if (!intfname) { lprintf(LOG_ERR, "%s: malloc failure", progname); goto out_free; } } - if (password != NULL && intfname != NULL) { - if (strcmp(intfname, "lan") == 0 && strlen(password) > 16) { + if (password && intfname) { + if (!strcmp(intfname, "lan") && strlen(password) > 16) { lprintf(LOG_ERR, "%s: password is longer than 16 bytes.", intfname); rc = -1; goto out_free; - } else if (strcmp(intfname, "lanplus") == 0 && strlen(password) > 20) { + } else if (!strcmp(intfname, "lanplus") && strlen(password) > 20) { lprintf(LOG_ERR, "%s: password is longer than 20 bytes.", intfname); rc = -1; goto out_free; } - } /* if (password != NULL && intfname != NULL) */ + } /* load interface */ ipmi_main_intf = ipmi_intf_load(intfname); - if (ipmi_main_intf == NULL) { + if (!ipmi_main_intf) { lprintf(LOG_ERR, "Error loading interface %s", intfname); goto out_free; } - /* setup log */ - log_init(progname, 0, verbose); + /* load the IANA PEN registry */ + if (ipmi_oem_info_init()) { + lprintf(LOG_ERR, "Failed to initialize the OEM info dictionary"); + goto out_free; + } /* run OEM setup if found */ - if (oemtype != NULL && + if (oemtype && ipmi_oem_setup(ipmi_main_intf, oemtype) < 0) { lprintf(LOG_ERR, "OEM setup for \"%s\" failed", oemtype); goto out_free; } /* set session variables */ - if (hostname != NULL) + if (hostname) ipmi_intf_session_set_hostname(ipmi_main_intf, hostname); - if (username != NULL) + if (username) ipmi_intf_session_set_username(ipmi_main_intf, username); - if (password != NULL) + if (password) ipmi_intf_session_set_password(ipmi_main_intf, password); ipmi_intf_session_set_kgkey(ipmi_main_intf, kgkey); if (port > 0) @@ -870,7 +890,9 @@ ipmi_main(int argc, char ** argv, ipmi_intf_session_set_lookupbit(ipmi_main_intf, lookupbit); ipmi_intf_session_set_sol_escape_char(ipmi_main_intf, sol_escape_char); +#ifdef IPMI_INTF_LANPLUS ipmi_intf_session_set_cipher_suite_id(ipmi_main_intf, cipher_suite_id); +#endif /* IPMI_INTF_LANPLUS */ ipmi_main_intf->devnum = devnum; @@ -880,7 +902,7 @@ ipmi_main(int argc, char ** argv, ipmi_main_intf->ai_family = ai_family; /* Open the interface with the specified or default IPMB address */ ipmi_main_intf->my_addr = arg_addr ? arg_addr : IPMI_BMC_SLAVE_ADDR; - if (ipmi_main_intf->open != NULL) { + if (ipmi_main_intf->open) { if (ipmi_main_intf->open(ipmi_main_intf) < 0) { goto out_free; } @@ -975,11 +997,11 @@ ipmi_main(int argc, char ** argv, ipmi_main_intf->target_ipmb_addr); /* parse local SDR cache if given */ - if (sdrcache != NULL) { - ipmi_sdr_list_cache_fromfile(ipmi_main_intf, sdrcache); + if (sdrcache) { + ipmi_sdr_list_cache_fromfile(sdrcache); } /* Parse SEL OEM file if given */ - if (seloem != NULL) { + if (seloem) { ipmi_sel_oem_init(seloem); } @@ -1016,37 +1038,37 @@ ipmi_main(int argc, char ** argv, ipmi_cleanup(ipmi_main_intf); /* call interface close function if available */ - if (ipmi_main_intf->opened > 0 && ipmi_main_intf->close != NULL) + if (ipmi_main_intf->opened && ipmi_main_intf->close) ipmi_main_intf->close(ipmi_main_intf); out_free: log_halt(); - if (intfname != NULL) { + if (intfname) { free(intfname); intfname = NULL; } - if (hostname != NULL) { + if (hostname) { free(hostname); hostname = NULL; } - if (username != NULL) { + if (username) { free(username); username = NULL; } - if (password != NULL) { + if (password) { free(password); password = NULL; } - if (oemtype != NULL) { + if (oemtype) { free(oemtype); oemtype = NULL; } - if (seloem != NULL) { + if (seloem) { free(seloem); seloem = NULL; } - if (sdrcache != NULL) { + if (sdrcache) { free(sdrcache); sdrcache = NULL; } @@ -1055,6 +1077,8 @@ ipmi_main(int argc, char ** argv, devfile = NULL; } + ipmi_oem_info_free(); + return rc; } diff --git a/lib/ipmi_mc.c b/lib/ipmi_mc.c index 4580bfb..a594347 100644 --- a/lib/ipmi_mc.c +++ b/lib/ipmi_mc.c @@ -34,6 +34,10 @@ #include <string.h> #include <stdio.h> #include <time.h> +#include <limits.h> +#include <stdbool.h> + +#include <arpa/inet.h> #include <ipmitool/helper.h> #include <ipmitool/log.h> @@ -42,6 +46,7 @@ #include <ipmitool/ipmi_intf.h> #include <ipmitool/ipmi_mc.h> #include <ipmitool/ipmi_strings.h> +#include <ipmitool/ipmi_time.h> extern int verbose; @@ -81,14 +86,14 @@ ipmi_mc_reset(struct ipmi_intf * intf, int cmd) if (cmd == BMC_COLD_RESET) intf->abort = 1; - if (cmd == BMC_COLD_RESET && rsp == NULL) { + if (cmd == BMC_COLD_RESET && !rsp) { /* This is expected. See 20.2 Cold Reset Command, p.243, IPMIv2.0 rev1.0 */ - } else if (rsp == NULL) { + } else if (!rsp) { lprintf(LOG_ERR, "MC reset command failed."); return (-1); - } else if (rsp->ccode > 0) { + } else if (rsp->ccode) { lprintf(LOG_ERR, "MC reset command failed: %s", - val2str(rsp->ccode, completion_code_vals)); + CC_STRING(rsp->ccode)); return (-1); } @@ -181,13 +186,13 @@ printf_mc_usage(void) struct bitfield_data * bf; lprintf(LOG_NOTICE, "MC Commands:"); lprintf(LOG_NOTICE, " reset <warm|cold>"); - lprintf(LOG_NOTICE, " guid"); + lprintf(LOG_NOTICE, " guid [auto|smbios|ipmi|rfc4122|dump]"); lprintf(LOG_NOTICE, " info"); lprintf(LOG_NOTICE, " watchdog <get|reset|off>"); lprintf(LOG_NOTICE, " selftest"); lprintf(LOG_NOTICE, " getenables"); lprintf(LOG_NOTICE, " setenables <option=on|off> ..."); - for (bf = mc_enables_bf; bf->name != NULL; bf++) { + for (bf = mc_enables_bf; bf->name; bf++) { lprintf(LOG_NOTICE, " %-20s %s", bf->name, bf->desc); } printf_sysinfo_usage(0); @@ -230,15 +235,38 @@ printf_sysinfo_usage(int full_help) static void print_watchdog_usage(void) { - lprintf(LOG_NOTICE, "usage: watchdog <command>:"); - lprintf(LOG_NOTICE, " get : Get Current Watchdog settings"); - lprintf(LOG_NOTICE, " reset : Restart Watchdog timer based on most recent settings"); - lprintf(LOG_NOTICE, " off : Shut off a running Watchdog timer"); + lprintf(LOG_NOTICE, +"usage: watchdog <command>:\n" +"\n" +" set <option[=value]> [<option[=value]> ...]\n" +" Set Watchdog settings\n" +" Options: (* = mandatory)\n" +" timeout=<1-6553> - [0] Initial countdown value, sec\n" +" pretimeout=<1-255> - [0] Pre-timeout interval, sec\n" +" int=<smi|nmi|msg> - [-] Pre-timeout interrupt type\n" +" use=<frb2|post|osload|sms|oem> - [-] Timer use\n" +" clear=<frb2|post|osload|sms|oem> - [-] Clear timer use expiration\n" +" flag, can be specified\n" +" multiple times\n" +" action=<reset|poweroff|cycle|none> - [none] Timer action\n" +" nolog - [-] Don't log the timer use\n" +" dontstop - [-] Don't stop the timer\n" +" while applying settings\n" +"\n" +" get\n" +" Get Current settings\n" +"\n" +" reset\n" +" Restart Watchdog timer based on the most recent settings\n" +"\n" +" off\n" +" Shut off a running Watchdog timer" + ); } /* ipmi_mc_get_enables - print out MC enables * - * @intf: ipmi inteface + * @intf: ipmi interface * * returns 0 on success * returns -1 on error @@ -255,17 +283,17 @@ ipmi_mc_get_enables(struct ipmi_intf * intf) req.msg.cmd = BMC_GET_GLOBAL_ENABLES; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Get Global Enables command failed"); return -1; } - if (rsp->ccode > 0) { + if (rsp->ccode) { lprintf(LOG_ERR, "Get Global Enables command failed: %s", - val2str(rsp->ccode, completion_code_vals)); + CC_STRING(rsp->ccode)); return -1; } - for (bf = mc_enables_bf; bf->name != NULL; bf++) { + for (bf = mc_enables_bf; bf->name; bf++) { printf("%-40s : %sabled\n", bf->desc, rsp->data[0] & bf->mask ? "en" : "dis"); } @@ -275,7 +303,7 @@ ipmi_mc_get_enables(struct ipmi_intf * intf) /* ipmi_mc_set_enables - set MC enable flags * - * @intf: ipmi inteface + * @intf: ipmi interface * @argc: argument count * @argv: argument list * @@ -295,7 +323,7 @@ ipmi_mc_set_enables(struct ipmi_intf * intf, int argc, char ** argv) printf_mc_usage(); return (-1); } - else if (strncmp(argv[0], "help", 4) == 0) { + else if (!strcmp(argv[0], "help")) { printf_mc_usage(); return 0; } @@ -305,28 +333,28 @@ ipmi_mc_set_enables(struct ipmi_intf * intf, int argc, char ** argv) req.msg.cmd = BMC_GET_GLOBAL_ENABLES; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Get Global Enables command failed"); return -1; } - if (rsp->ccode > 0) { + if (rsp->ccode) { lprintf(LOG_ERR, "Get Global Enables command failed: %s", - val2str(rsp->ccode, completion_code_vals)); + CC_STRING(rsp->ccode)); return -1; } en = rsp->data[0]; for (i = 0; i < argc; i++) { - for (bf = mc_enables_bf; bf->name != NULL; bf++) { + for (bf = mc_enables_bf; bf->name; bf++) { int nl = strlen(bf->name); - if (strncmp(argv[i], bf->name, nl) != 0) + if (strcmp(argv[i], bf->name)) continue; - if (strncmp(argv[i]+nl+1, "off", 3) == 0) { + if (!strcmp(argv[i]+nl+1, "off")) { printf("Disabling %s\n", bf->desc); en &= ~bf->mask; } - else if (strncmp(argv[i]+nl+1, "on", 2) == 0) { + else if (!strcmp(argv[i]+nl+1, "on")) { printf("Enabling %s\n", bf->desc); en |= bf->mask; } @@ -347,13 +375,13 @@ ipmi_mc_set_enables(struct ipmi_intf * intf, int argc, char ** argv) req.msg.data_len = 1; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Set Global Enables command failed"); return -1; } - else if (rsp->ccode > 0) { + else if (rsp->ccode) { lprintf(LOG_ERR, "Set Global Enables command failed: %s", - val2str(rsp->ccode, completion_code_vals)); + CC_STRING(rsp->ccode)); return -1; } @@ -397,13 +425,13 @@ ipmi_mc_get_deviceid(struct ipmi_intf * intf) req.msg.data_len = 0; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Get Device ID command failed"); return -1; } - if (rsp->ccode > 0) { + if (rsp->ccode) { lprintf(LOG_ERR, "Get Device ID command failed: %s", - val2str(rsp->ccode, completion_code_vals)); + CC_STRING(rsp->ccode)); return -1; } @@ -421,18 +449,15 @@ ipmi_mc_get_deviceid(struct ipmi_intf * intf) printf("Manufacturer ID : %lu\n", (long)IPM_DEV_MANUFACTURER_ID(devid->manufacturer_id)); printf("Manufacturer Name : %s\n", - val2str( (long)IPM_DEV_MANUFACTURER_ID(devid->manufacturer_id), - ipmi_oem_info) ); + OEM_MFG_STRING(devid->manufacturer_id)); printf("Product ID : %u (0x%02x%02x)\n", buf2short((uint8_t *)(devid->product_id)), devid->product_id[1], devid->product_id[0]); - product=oemval2str(IPM_DEV_MANUFACTURER_ID(devid->manufacturer_id), - (devid->product_id[1]<<8)+devid->product_id[0], - ipmi_oem_product_info); + product = OEM_PROD_STRING(devid->manufacturer_id, devid->product_id); - if (product!=NULL) { + if (product) { printf("Product Name : %s\n", product); } @@ -470,69 +495,292 @@ ipmi_mc_get_deviceid(struct ipmi_intf * intf) * returns - negative number means error, positive is a ccode. */ int -_ipmi_mc_get_guid(struct ipmi_intf *intf, struct ipmi_guid_t *guid) +_ipmi_mc_get_guid(struct ipmi_intf *intf, ipmi_guid_t *guid) { struct ipmi_rs *rsp; struct ipmi_rq req; - if (guid == NULL) { + if (!guid) { return (-3); } - memset(guid, 0, sizeof(struct ipmi_guid_t)); + memset(guid, 0, sizeof(ipmi_guid_t)); memset(&req, 0, sizeof(req)); req.msg.netfn = IPMI_NETFN_APP; req.msg.cmd = BMC_GET_GUID; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { return (-1); - } else if (rsp->ccode > 0) { + } else if (rsp->ccode) { return rsp->ccode; } else if (rsp->data_len != 16 - || rsp->data_len != sizeof(struct ipmi_guid_t)) { + || rsp->data_len != sizeof(ipmi_guid_t)) { return (-2); } - memcpy(guid, &rsp->data[0], sizeof(struct ipmi_guid_t)); + memcpy(guid, &rsp->data[0], sizeof(ipmi_guid_t)); return 0; } -/* ipmi_mc_print_guid - print-out given BMC GUID +/* A helper function to convert GUID time to time_t */ +static time_t _guid_time(uint64_t t_low, uint64_t t_mid, uint64_t t_hi) +{ + /* GUID time-stamp is a 60-bit value representing the + * count of 100ns intervals since 00:00:00.00, 15 Oct 1582 */ + + const uint64_t t100ns_in_sec = 10000000LL; + + /* Seconds from 15 Oct 1582 to 1 Jan 1970 00:00:00 */ + uint64_t epoch_since_gregorian = 12219292800; + + /* 100ns intervals since 15 Oct 1582 00:00:00 */ + uint64_t gregorian = (GUID_TIME_HI(t_hi) << 48) + | (t_mid << 32) + | t_low; + time_t unixtime; /* We need timestamp in seconds since UNIX epoch */ + + gregorian /= t100ns_in_sec; /* Convert to seconds */ + unixtime = gregorian - epoch_since_gregorian; + + return unixtime; +} + +#define TM_YEAR_BASE 1900 +#define EPOCH_YEAR 1970 +static bool _is_time_valid(time_t t) +{ + time_t t_now = time(NULL); + struct tm tm; + struct tm now; + + gmtime_r(&t, &tm); + gmtime_r(&t_now, &now); + + /* It's enought to check that the year fits in [Epoch .. now] interval */ + + if (tm.tm_year + TM_YEAR_BASE < EPOCH_YEAR) + return false; + + if (tm.tm_year > now.tm_year) { + /* GUID timestamp can't be in future */ + return false; + } + + return true; +} + +/** ipmi_mc_parse_guid - print-out given BMC GUID + * + * The function parses the raw guid data according to the requested encoding + * mode. If GUID_AUTO mode is requested, then automatic detection of encoding + * is attempted using the version nibble of the time_hi_and_version field of + * each of the supported encodings. * - * @guid - struct with GUID. + * Considering the rather random nature of GUIDs, it may happen that the + * version nibble is valid for multiple encodings at the same time. That's why + * if the version is 1 (time-based), the function will also check validity of + * the time stamp. If a valid time stamp is found for a given mode, the mode is + * considered detected and no further checks are performed. Otherwise other + * encodings are probed the same way. If in neither encoding the valid version + * nibble happened to indicate time-based version or no valid time-stamp has + * been found, then the last probed encoding with valid version nibble is + * considered detected. If none of the probed encodings indicated a valid + * version nibble, then fall back to GUID_DUMP * - * returns 0 + * @param[in] guid - The original GUID data as received from BMC + * @param[in] mode - The requested mode/encoding + * + * @returns parsed GUID */ -static int -ipmi_mc_print_guid(struct ipmi_guid_t guid) +parsed_guid_t ipmi_parse_guid(void *guid, ipmi_guid_mode_t guid_mode) { - char tbuf[40]; - time_t s; - memset(tbuf, 0, 40); - /* Kipp - changed order of last field (node) to follow specification */ - printf("System GUID : %08x-%04x-%04x-%04x-%02x%02x%02x%02x%02x%02x\n", - guid.time_low, guid.time_mid, guid.time_hi_and_version, - guid.clock_seq_hi_variant << 8 | guid.clock_seq_low, - guid.node[0], guid.node[1], guid.node[2], - guid.node[3], guid.node[4], guid.node[5]); + ipmi_guid_mode_t i; + ipmi_guid_t *ipmi_guid = guid; + rfc_guid_t *rfc_guid = guid; + parsed_guid_t parsed_guid = { 0 }; + uint32_t t_low[GUID_REAL_MODES]; + uint16_t t_mid[GUID_REAL_MODES]; + uint16_t t_hi[GUID_REAL_MODES]; + uint16_t clk[GUID_REAL_MODES]; + time_t seconds[GUID_REAL_MODES]; + bool detect = false; + + /* Unless another mode is detected, default to dumping */ + if (GUID_AUTO == guid_mode) { + detect = true; + guid_mode = GUID_DUMP; + } - s = (time_t)guid.time_low; /* Kipp - removed the BSWAP_32, it was not needed here */ - strftime(tbuf, sizeof(tbuf), "%m/%d/%Y %H:%M:%S", localtime(&s)); - printf("Timestamp : %s\n", tbuf); - return 0; + /* Try to convert time using all possible methods to use + * the result later if GUID_AUTO is requested */ + + /* For IPMI all fields are little-endian (LSB first) */ + t_hi[GUID_IPMI] = ipmi16toh(&ipmi_guid->time_hi_and_version); + t_mid[GUID_IPMI] = ipmi16toh(&ipmi_guid->time_mid); + t_low[GUID_IPMI] = ipmi32toh(&ipmi_guid->time_low); + clk[GUID_IPMI] = ipmi16toh(&ipmi_guid->clock_seq_and_rsvd); + + /* For RFC4122 all fields are in network byte order (MSB first) */ + t_hi[GUID_RFC4122] = ntohs(rfc_guid->time_hi_and_version); + t_mid[GUID_RFC4122] = ntohs(rfc_guid->time_mid); + t_low[GUID_RFC4122] = ntohl(rfc_guid->time_low); + clk[GUID_RFC4122] = ntohs(rfc_guid->clock_seq_and_rsvd); + + /* For SMBIOS time fields are little-endian (as in IPMI), the rest is + * in network order (as in RFC4122) */ + t_hi[GUID_SMBIOS] = ipmi16toh(&rfc_guid->time_hi_and_version); + t_mid[GUID_SMBIOS] = ipmi16toh(&rfc_guid->time_mid); + t_low[GUID_SMBIOS] = ipmi32toh(&rfc_guid->time_low); + clk[GUID_SMBIOS] = ntohs(rfc_guid->clock_seq_and_rsvd); + + /* Using 0 here to allow for reordering of modes in ipmi_guid_mode_t */ + for (i = 0; i < GUID_REAL_MODES; ++i) { + seconds[i] = _guid_time(t_low[i], t_mid[i], t_hi[i]); + + /* If autodetection was initially requested and mode + * hasn't been detected yet */ + if (detect) { + guid_version_t ver = GUID_VERSION(t_hi[i]); + if (is_guid_version_valid(ver)) { + guid_mode = i; + if (GUID_VERSION_TIME == ver && _is_time_valid(seconds[i])) { + break; + } + } + } + } + + if (guid_mode >= GUID_REAL_MODES) { + guid_mode = GUID_DUMP; + /* The endianness and field order are irrelevant for dump mode */ + memcpy(&parsed_guid, guid, sizeof(ipmi_guid_t)); + goto out; + } + + /* + * Return only a valid version in the parsed version field. + * If one needs the raw value, they still may use + * GUID_VERSION(parsed_guid.time_hi_and_version) + */ + parsed_guid.ver = GUID_VERSION(t_hi[guid_mode]); + if (parsed_guid.ver > GUID_VERSION_MAX) { + parsed_guid.ver = GUID_VERSION_UNKNOWN; + } + + if (GUID_VERSION_TIME == parsed_guid.ver) { + parsed_guid.time = seconds[guid_mode]; + } + + if (GUID_IPMI == guid_mode) { + /* + * In IPMI all fields are little-endian (LSB first) + * That is, first byte last. Hence, swap before copying. + */ + memcpy(parsed_guid.node, + array_byteswap(ipmi_guid->node, GUID_NODE_SZ), + GUID_NODE_SZ); + } else { + /* + * For RFC4122 and SMBIOS the node field is in network byte order. + * That is first byte first. Hence, copy as is. + */ + memcpy(parsed_guid.node, rfc_guid->node, GUID_NODE_SZ); + } + + parsed_guid.time_low = t_low[guid_mode]; + parsed_guid.time_mid = t_mid[guid_mode]; + parsed_guid.time_hi_and_version = t_hi[guid_mode]; + parsed_guid.clock_seq_and_rsvd = clk[guid_mode]; + +out: + parsed_guid.mode = guid_mode; + return parsed_guid; } -/* ipmi_mc_get_guid - Gets and prints-out System GUID */ -int -ipmi_mc_get_guid(struct ipmi_intf *intf) +/* ipmi_mc_print_guid - print-out given BMC GUID + * + * @param[in] intf - The IPMI interface to request GUID from + * @param[in] guid_mode - GUID decoding mode + * + * @returns status code + * @retval 0 - Success + * @retval -1 - Error + */ +static int +ipmi_mc_print_guid(struct ipmi_intf *intf, ipmi_guid_mode_t guid_mode) { - struct ipmi_guid_t guid; + /* Allocate a byte array for ease of use in dump mode */ + uint8_t guid_data[sizeof(ipmi_guid_t)]; + + /* These are host architecture specific */ + parsed_guid_t guid; + + const char *guid_ver_str[GUID_VERSION_COUNT] = { + [GUID_VERSION_UNKNOWN] = "Unknown/unsupported", + [GUID_VERSION_TIME] = "Time-based", + [GUID_VERSION_DCE] = "DCE Security with POSIX UIDs (not for IPMI)", + [GUID_VERSION_MD5] = "Name-based using MD5", + [GUID_VERSION_RND] = "Random or pseudo-random", + [GUID_VERSION_SHA1] = "Name-based using SHA-1" + }; + + const char *guid_mode_str[GUID_TOTAL_MODES] = { + [GUID_IPMI] = "IPMI", + [GUID_RFC4122] = "RFC4122", + [GUID_SMBIOS] = "SMBIOS", + [GUID_AUTO] = "Automatic (if you see this, report a bug)", + [GUID_DUMP] = "Unknown (data dumped)" + }; + int rc; - rc = _ipmi_mc_get_guid(intf, &guid); + + rc = _ipmi_mc_get_guid(intf, (ipmi_guid_t *)guid_data); if (eval_ccode(rc) != 0) { return (-1); } - rc = ipmi_mc_print_guid(guid); - return rc; + + printf("System GUID : "); + + guid = ipmi_parse_guid(guid_data, guid_mode); + if (GUID_DUMP == guid.mode) { + size_t i; + for (i = 0; i < sizeof(guid_data); ++i) { + printf("%02X", guid_data[i]); + } + printf("\n"); + return 0; + } + + printf("%08x-%04x-%04x-%04x-%02x%02x%02x%02x%02x%02x\n", + (int)guid.time_low, + (int)guid.time_mid, + (int)guid.time_hi_and_version, + guid.clock_seq_and_rsvd, + guid.node[0], guid.node[1], guid.node[2], + guid.node[3], guid.node[4], guid.node[5]); + + if (GUID_AUTO == guid_mode) { + /* ipmi_parse_guid() returns only valid modes in guid.ver */ + printf("GUID Encoding : %s", guid_mode_str[guid.mode]); + if (GUID_IPMI != guid.mode) { + printf(" (WARNING: IPMI Specification violation!)"); + } + printf("\n"); + } + + printf("GUID Version : %s", guid_ver_str[guid.ver]); + + switch (guid.ver) { + case GUID_VERSION_UNKNOWN: + printf(" (%d)\n", GUID_VERSION((int)guid.time_hi_and_version)); + break; + case GUID_VERSION_TIME: + printf("\nTimestamp : %s\n", ipmi_timestamp_numeric(guid.time)); + break; + default: + printf("\n"); + } + + return 0; } /* ipmi_mc_get_selftest - returns and print selftest results @@ -559,7 +807,7 @@ static int ipmi_mc_get_selftest(struct ipmi_intf * intf) if (rsp->ccode) { lprintf(LOG_ERR, "Bad response: (%s)", - val2str(rsp->ccode, completion_code_vals)); + CC_STRING(rsp->ccode)); return -1; } @@ -583,7 +831,7 @@ static int ipmi_mc_get_selftest(struct ipmi_intf * intf) printf(" -> SEL device not accessible\n"); } if (sft_res->test & IPM_SELFTEST_SDR_ERROR) { - printf(" -> SDR repository not accesible\n"); + printf(" -> SDR repository not accessible\n"); } if (sft_res->test & IPM_SELFTEST_FRU_ERROR) { printf("FRU device not accessible\n"); @@ -625,6 +873,63 @@ static int ipmi_mc_get_selftest(struct ipmi_intf * intf) return rv; } +struct wdt_string_s { + const char *get; /* The name of 'timer use' for `watchdog get` command */ + const char *set; /* The name of 'timer use' for `watchdog set` command */ +}; + + +#define WDTS(g,s) &(const struct wdt_string_s){ (g), (s) } + +const struct wdt_string_s *wdt_use[] = { + WDTS("Reserved", "none"), + WDTS("BIOS FRB2", "frb2"), + WDTS("BIOS/POST", "post"), + WDTS("OS Load", "osload"), + WDTS("SMS/OS", "sms"), + WDTS("OEM", "oem"), + WDTS("Reserved", NULL), + WDTS("Reserved", NULL), + NULL +}; + +const struct wdt_string_s *wdt_int[] = { + WDTS("None", "none"), + WDTS("SMI", "smi"), + WDTS("NMI/Diagnostic", "nmi"), + WDTS("Messaging", "msg"), + WDTS("Reserved", NULL), + WDTS("Reserved", NULL), + WDTS("Reserved", NULL), + WDTS("Reserved", NULL), + NULL +}; + +const struct wdt_string_s *wdt_action[] = { + WDTS("No action", "none"), + WDTS("Hard Reset", "reset"), + WDTS("Power Down", "poweroff"), + WDTS("Power Cycle", "cycle"), + WDTS("Reserved", NULL), + WDTS("Reserved", NULL), + WDTS("Reserved", NULL), + WDTS("Reserved", NULL), + NULL +}; + +int find_set_wdt_string(const struct wdt_string_s *w[], const char *s) +{ + int val = 0; + while (w[val]) { + if (!strcmp(s, w[val]->set)) break; + ++val; + } + if (!w[val]) { + return -1; + } + return val; +} + /* ipmi_mc_get_watchdog * * @intf: ipmi interface @@ -632,35 +937,15 @@ static int ipmi_mc_get_selftest(struct ipmi_intf * intf) * returns 0 on success * returns -1 on error */ - -const char *wdt_use_string[8] = { - "Reserved", - "BIOS FRB2", - "BIOS/POST", - "OS Load", - "SMS/OS", - "OEM", - "Reserved", - "Reserved" -}; - -const char *wdt_action_string[8] = { - "No action", - "Hard Reset", - "Power Down", - "Power Cycle", - "Reserved", - "Reserved", - "Reserved", - "Reserved" -}; - static int ipmi_mc_get_watchdog(struct ipmi_intf * intf) { struct ipmi_rs * rsp; struct ipmi_rq req; struct ipm_get_watchdog_rsp * wdt_res; + double init_cnt; + double pres_cnt; + size_t i; memset(&req, 0, sizeof(req)); req.msg.netfn = IPMI_NETFN_APP; @@ -668,35 +953,226 @@ ipmi_mc_get_watchdog(struct ipmi_intf * intf) req.msg.data_len = 0; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Get Watchdog Timer command failed"); return -1; } if (rsp->ccode) { lprintf(LOG_ERR, "Get Watchdog Timer command failed: %s", - val2str(rsp->ccode, completion_code_vals)); + CC_STRING(rsp->ccode)); return -1; } wdt_res = (struct ipm_get_watchdog_rsp *) rsp->data; + /* Convert 100ms intervals to seconds */ + init_cnt = (double)ipmi16toh(&wdt_res->init_cnt_le) / 10.0; + pres_cnt = (double)ipmi16toh(&wdt_res->pres_cnt_le) / 10.0; + printf("Watchdog Timer Use: %s (0x%02x)\n", - wdt_use_string[(wdt_res->timer_use & 0x07 )], wdt_res->timer_use); + wdt_use[IPMI_WDT_GET(wdt_res->use, USE)]->get, wdt_res->use); printf("Watchdog Timer Is: %s\n", - wdt_res->timer_use & 0x40 ? "Started/Running" : "Stopped"); - printf("Watchdog Timer Actions: %s (0x%02x)\n", - wdt_action_string[(wdt_res->timer_actions&0x07)], wdt_res->timer_actions); + IS_WDT_BIT(wdt_res->use, USE_RUNNING) + ? "Started/Running" + : "Stopped"); + printf("Watchdog Timer Logging: %s\n", + IS_WDT_BIT(wdt_res->use, USE_NOLOG) + ? "Off" + : "On"); + printf("Watchdog Timer Action: %s (0x%02x)\n", + wdt_action[IPMI_WDT_GET(wdt_res->intr_action, ACTION)]->get, + wdt_res->intr_action); + printf("Pre-timeout interrupt: %s\n", + wdt_int[IPMI_WDT_GET(wdt_res->intr_action, INTR)]->get); printf("Pre-timeout interval: %d seconds\n", wdt_res->pre_timeout); - printf("Timer Expiration Flags: 0x%02x\n", wdt_res->timer_use_exp); - printf("Initial Countdown: %i sec\n", - ((wdt_res->initial_countdown_msb << 8) | wdt_res->initial_countdown_lsb)/10); - printf("Present Countdown: %i sec\n", - (((wdt_res->present_countdown_msb << 8) | wdt_res->present_countdown_lsb)) / 10); + printf("Timer Expiration Flags: %s(0x%02x)\n", + wdt_res->exp_flags ? "" : "None ", + wdt_res->exp_flags); + for (i = 0; i < sizeof(wdt_res->exp_flags) * CHAR_BIT; ++i) { + if (IS_SET(wdt_res->exp_flags, i)) { + printf(" * %s\n", wdt_use[i]->get); + } + } + printf("Initial Countdown: %0.1f sec\n", init_cnt); + printf("Present Countdown: %0.1f sec\n", pres_cnt); return 0; } +/* Configuration to set with ipmi_mc_set_watchdog() */ +typedef struct ipmi_mc_set_wdt_conf_s { + uint16_t timeout; + uint8_t pretimeout; + uint8_t intr; + uint8_t use; + uint8_t clear; + uint8_t action; + bool nolog; + bool dontstop; +} wdt_conf_t; + +/* Options parser for ipmi_mc_set_watchdog() */ +static bool +parse_set_wdt_options(wdt_conf_t *conf, int argc, char *argv[]) +{ + const int MAX_TIMEOUT = 6553; /* Seconds, makes almost USHRT_MAX when + converted to 100ms intervals */ + const int MAX_PRETIMEOUT = 255; /* Seconds */ + bool error = true; + int i; + + if (!argc || !strcmp(argv[0], "help")) { + goto out; + } + + for (i = 0; i < argc; ++i) { + long val; + char *vstr = strchr(argv[i], '='); + if (vstr) + vstr++; /* Point to the value */ + + switch (argv[i][0]) { /* only check the first letter to allow for + shortcuts */ + case 't': /* timeout */ + val = strtol(vstr, NULL, 10); + if (val < 1 || val > MAX_TIMEOUT) { + lprintf(LOG_ERR, "Timeout value %lu is out of range (1-%d)\n", + val, MAX_TIMEOUT); + goto out; + } + conf->timeout = val * 10; /* Convert seconds to 100ms intervals */ + break; + case 'p': /* pretimeout */ + val = strtol(vstr, NULL, 10); + if (val < 1 || val > MAX_PRETIMEOUT) { + lprintf(LOG_ERR, + "Pretimeout value %lu is out of range (1-%d)\n", + val, MAX_PRETIMEOUT); + goto out; + } + conf->pretimeout = val; /* Convert seconds to 100ms intervals */ + break; + case 'i': /* int */ + if (0 > (val = find_set_wdt_string(wdt_int, vstr))) { + lprintf(LOG_ERR, "Interrupt type '%s' is not valid\n", vstr); + goto out; + } + conf->intr = val; + break; + case 'u': /* use */ + if (0 > (val = find_set_wdt_string(wdt_use, vstr))) { + lprintf(LOG_ERR, "Use '%s' is not valid\n", vstr); + goto out; + } + conf->use = val; + break; + case 'a': /* action */ + if (0 > (val = find_set_wdt_string(wdt_action, vstr))) { + lprintf(LOG_ERR, "Use '%s' is not valid\n", vstr); + goto out; + } + conf->action = val; + break; + case 'c': /* clear */ + if (0 > (val = find_set_wdt_string(wdt_use, vstr))) { + lprintf(LOG_ERR, "Use '%s' is not valid\n", vstr); + goto out; + } + conf->clear |= 1 << val; + break; + case 'n': /* nolog */ + conf->nolog = true; + break; + case 'd': /* dontstop */ + conf->dontstop = true; + break; + + default: + lprintf(LOG_ERR, "Invalid option '%s'", argv[i]); + break; + } + } + + error = false; + +out: + return error; +} + +/* ipmi_mc_set_watchdog + * + * @intf: ipmi interface + * @argc: argument count + * @argv: arguments + * + * returns 0 on success + * returns non-zero (-1 or IPMI completion code) on error + */ +static int +ipmi_mc_set_watchdog(struct ipmi_intf * intf, int argc, char *argv[]) +{ + struct ipmi_rs * rsp; + struct ipmi_rq req = {0}; + unsigned char msg_data[6] = {0}; + int rc = -1; + wdt_conf_t conf = {0}; + bool options_error = parse_set_wdt_options(&conf, argc, argv); + + /* Fill data bytes according to IPMI 2.0 Spec section 27.6 */ + msg_data[0] = conf.nolog << IPMI_WDT_USE_NOLOG_SHIFT; + msg_data[0] |= conf.dontstop << IPMI_WDT_USE_DONTSTOP_SHIFT; + msg_data[0] |= conf.use & IPMI_WDT_USE_MASK; + + msg_data[1] = (conf.intr & IPMI_WDT_INTR_MASK) << IPMI_WDT_INTR_SHIFT; + msg_data[1] |= conf.action & IPMI_WDT_ACTION_MASK; + + msg_data[2] = conf.pretimeout; + + msg_data[3] = conf.clear; + + htoipmi16(conf.timeout, &msg_data[4]); + + req.msg.netfn = IPMI_NETFN_APP; + req.msg.cmd = BMC_SET_WATCHDOG_TIMER; + req.msg.data_len = 6; + req.msg.data = msg_data; + + lprintf(LOG_INFO, + "Sending Set Watchdog command [%02X %02X %02X %02X %02X %02X]:" + , msg_data[0], msg_data[1], msg_data[2] + , msg_data[3], msg_data[4], msg_data[5] + ); + lprintf(LOG_INFO, " - nolog = %d", conf.nolog); + lprintf(LOG_INFO, " - dontstop = %d", conf.dontstop); + lprintf(LOG_INFO, " - use = 0x%02hhX", conf.use); + lprintf(LOG_INFO, " - intr = 0x%02hhX", conf.intr); + lprintf(LOG_INFO, " - action = 0x%02hhX", conf.action); + lprintf(LOG_INFO, " - pretimeout = %hhu", conf.pretimeout); + lprintf(LOG_INFO, " - clear = 0x%02hhX", conf.clear); + lprintf(LOG_INFO, " - timeout = %hu", conf.timeout); + + rsp = intf->sendrecv(intf, &req); + if (!rsp) { + lprintf(LOG_ERR, "Set Watchdog Timer command failed"); + goto out; + } + + rc = rsp->ccode; + if (rc) { + lprintf(LOG_ERR, "Set Watchdog Timer command failed: %s", + CC_STRING(rsp->ccode)); + goto out; + } + + lprintf(LOG_NOTICE, "Watchdog Timer was successfully configured"); + +out: + if (options_error) print_watchdog_usage(); + + return rc; +} + /* ipmi_mc_shutoff_watchdog * * @intf: ipmi interface @@ -737,14 +1213,14 @@ ipmi_mc_shutoff_watchdog(struct ipmi_intf * intf) msg_data[5] = 0x0b; /* countdown msb - 5 mins */ rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Watchdog Timer Shutoff command failed!"); return -1; } if (rsp->ccode) { lprintf(LOG_ERR, "Watchdog Timer Shutoff command failed! %s", - val2str(rsp->ccode, completion_code_vals)); + CC_STRING(rsp->ccode)); return -1; } @@ -772,16 +1248,16 @@ ipmi_mc_rst_watchdog(struct ipmi_intf * intf) req.msg.data_len = 0; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Reset Watchdog Timer command failed!"); return -1; } if (rsp->ccode) { lprintf(LOG_ERR, "Reset Watchdog Timer command failed: %s", - (rsp->ccode == IPM_WATCHDOG_RESET_ERROR) ? - "Attempt to reset uninitialized watchdog" : - val2str(rsp->ccode, completion_code_vals)); + (rsp->ccode == IPM_WATCHDOG_RESET_ERROR) + ? "Attempt to reset uninitialized watchdog" + : CC_STRING(rsp->ccode)); return -1; } @@ -808,24 +1284,24 @@ ipmi_mc_main(struct ipmi_intf * intf, int argc, char ** argv) printf_mc_usage(); rc = (-1); } - else if (strncmp(argv[0], "help", 4) == 0) { + else if (!strcmp(argv[0], "help")) { printf_mc_usage(); rc = 0; } - else if (strncmp(argv[0], "reset", 5) == 0) { + else if (!strcmp(argv[0], "reset")) { if (argc < 2) { lprintf(LOG_ERR, "Not enough parameters given."); printf_mc_reset_usage(); rc = (-1); } - else if (strncmp(argv[1], "help", 4) == 0) { + else if (!strcmp(argv[1], "help")) { printf_mc_reset_usage(); rc = 0; } - else if (strncmp(argv[1], "cold", 4) == 0) { + else if (!strcmp(argv[1], "cold")) { rc = ipmi_mc_reset(intf, BMC_COLD_RESET); } - else if (strncmp(argv[1], "warm", 4) == 0) { + else if (!strcmp(argv[1], "warm")) { rc = ipmi_mc_reset(intf, BMC_WARM_RESET); } else { @@ -834,38 +1310,68 @@ ipmi_mc_main(struct ipmi_intf * intf, int argc, char ** argv) rc = (-1); } } - else if (strncmp(argv[0], "info", 4) == 0) { + else if (!strcmp(argv[0], "info")) { rc = ipmi_mc_get_deviceid(intf); } - else if (strncmp(argv[0], "guid", 4) == 0) { - rc = ipmi_mc_get_guid(intf); + else if (!strcmp(argv[0], "guid")) { + ipmi_guid_mode_t guid_mode = GUID_AUTO; + + /* Allow for 'rfc' and 'rfc4122' */ + if (argc > 1) { + if (!strcmp(argv[1], "rfc")) { + guid_mode = GUID_RFC4122; + } + else if (!strcmp(argv[1], "smbios")) { + guid_mode = GUID_SMBIOS; + } + else if (!strcmp(argv[1], "ipmi")) { + guid_mode = GUID_IPMI; + } + else if (!strcmp(argv[1], "auto")) { + guid_mode = GUID_AUTO; + } + else if (!strcmp(argv[1], "dump")) { + guid_mode = GUID_DUMP; + } + } + rc = ipmi_mc_print_guid(intf, guid_mode); } - else if (strncmp(argv[0], "getenables", 10) == 0) { + else if (!strcmp(argv[0], "getenables")) { rc = ipmi_mc_get_enables(intf); } - else if (strncmp(argv[0], "setenables", 10) == 0) { + else if (!strcmp(argv[0], "setenables")) { rc = ipmi_mc_set_enables(intf, argc-1, &(argv[1])); } - else if (!strncmp(argv[0], "selftest", 8)) { + else if (!strcmp(argv[0], "selftest")) { rc = ipmi_mc_get_selftest(intf); } - else if (!strncmp(argv[0], "watchdog", 8)) { + else if (!strcmp(argv[0], "watchdog")) { if (argc < 2) { lprintf(LOG_ERR, "Not enough parameters given."); print_watchdog_usage(); rc = (-1); } - else if (strncmp(argv[1], "help", 4) == 0) { + else if (!strcmp(argv[1], "help")) { print_watchdog_usage(); rc = 0; } - else if (strncmp(argv[1], "get", 3) == 0) { + else if (!strcmp(argv[1], "set")) { + if (argc < 3) { /* Requires options */ + lprintf(LOG_ERR, "Not enough parameters given."); + print_watchdog_usage(); + rc = (-1); + } + else { + rc = ipmi_mc_set_watchdog(intf, argc - 2, &(argv[2])); + } + } + else if (!strcmp(argv[1], "get")) { rc = ipmi_mc_get_watchdog(intf); } - else if(strncmp(argv[1], "off", 3) == 0) { + else if (!strcmp(argv[1], "off")) { rc = ipmi_mc_shutoff_watchdog(intf); } - else if(strncmp(argv[1], "reset", 5) == 0) { + else if (!strcmp(argv[1], "reset")) { rc = ipmi_mc_rst_watchdog(intf); } else { @@ -874,10 +1380,10 @@ ipmi_mc_main(struct ipmi_intf * intf, int argc, char ** argv) rc = (-1); } } - else if (strncmp(argv[0], "getsysinfo", 10) == 0) { + else if (!strcmp(argv[0], "getsysinfo")) { rc = ipmi_sysinfo_main(intf, argc, argv, 0); } - else if (strncmp(argv[0], "setsysinfo", 10) == 0) { + else if (!strcmp(argv[0], "setsysinfo")) { rc = ipmi_sysinfo_main(intf, argc, argv, 1); } else { @@ -969,10 +1475,10 @@ ipmi_mc_getsysinfo(struct ipmi_intf * intf, int param, int block, int set, * u8 data0[14] */ rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) + if (!rsp) return (-1); - if (rsp->ccode == 0) { + if (!rsp->ccode) { if (len > rsp->data_len) len = rsp->data_len; if (len && buffer) @@ -1011,7 +1517,7 @@ ipmi_mc_setsysinfo(struct ipmi_intf * intf, int len, void *buffer) * u8 data1[16] */ rsp = intf->sendrecv(intf, &req); - if (rsp != NULL) { + if (rsp) { return rsp->ccode; } return -1; @@ -1022,10 +1528,10 @@ ipmi_sysinfo_main(struct ipmi_intf *intf, int argc, char ** argv, int is_set) { char *str; unsigned char infostr[256]; - unsigned char paramdata[18]; + char paramdata[18]; int len, maxset, param, pos, rc, set; - if (argc == 2 && strcmp(argv[1], "help") == 0) { + if (argc == 2 && !strcmp(argv[1], "help")) { printf_sysinfo_usage(1); return 0; } @@ -1109,7 +1615,7 @@ ipmi_sysinfo_main(struct ipmi_intf *intf, int argc, char ** argv, int is_set) } else if (rc > 0) { lprintf(LOG_ERR, "%s command failed: %s", argv[0], - val2str(rc, completion_code_vals)); + CC_STRING(rc)); } return rc; } diff --git a/lib/ipmi_oem.c b/lib/ipmi_oem.c index 96db2ea..d7cf9aa 100644 --- a/lib/ipmi_oem.c +++ b/lib/ipmi_oem.c @@ -37,8 +37,9 @@ #include <ipmitool/helper.h> #include <ipmitool/ipmi_sel.h> -static int ipmi_oem_supermicro(struct ipmi_intf * intf); -static int ipmi_oem_ibm(struct ipmi_intf * intf); +static int ipmi_oem_supermicro(struct ipmi_intf *intf); +static int ipmi_oem_ibm(struct ipmi_intf *intf); +static int ipmi_oem_quanta(struct ipmi_intf *intf); static struct ipmi_oem_handle ipmi_oem_list[] = { { @@ -71,36 +72,49 @@ static struct ipmi_oem_handle ipmi_oem_list[] = { .name = "kontron", .desc = "Kontron OEM big buffer support" }, + { + .name = "quanta", + .desc = "Quanta IPMIv1.5 BMC with OEM LAN authentication support", + .setup = ipmi_oem_quanta, + }, { 0 } }; /* Supermicro IPMIv2 BMCs use OEM authtype */ static int -ipmi_oem_supermicro(struct ipmi_intf * intf) +ipmi_oem_supermicro(struct ipmi_intf *intf) { ipmi_intf_session_set_authtype(intf, IPMI_SESSION_AUTHTYPE_OEM); return 0; } static int -ipmi_oem_ibm(struct ipmi_intf * intf) +ipmi_oem_ibm(struct ipmi_intf *__UNUSED__(intf)) { - char * filename; - if ((filename = getenv("IPMI_OEM_IBM_DATAFILE")) == NULL) { + char *filename = getenv("IPMI_OEM_IBM_DATAFILE"); + if (!filename) { lprintf(LOG_ERR, "Unable to read IPMI_OEM_IBM_DATAFILE from environment"); return -1; } return ipmi_sel_oem_init((const char *)filename); } +/* Quanta IPMIv2 BMCs use OEM authtype */ +static int +ipmi_oem_quanta(struct ipmi_intf *intf) +{ + ipmi_intf_session_set_authtype(intf, IPMI_SESSION_AUTHTYPE_OEM); + return 0; +} + /* ipmi_oem_print - print list of OEM handles */ void ipmi_oem_print(void) { - struct ipmi_oem_handle * oem; + struct ipmi_oem_handle *oem; lprintf(LOG_NOTICE, "\nOEM Support:"); - for (oem=ipmi_oem_list; oem->name != NULL && oem->desc != NULL; oem++) { + for (oem=ipmi_oem_list; oem->name && oem->desc; oem++) { lprintf(LOG_NOTICE, "\t%-12s %s", oem->name, oem->desc); } lprintf(LOG_NOTICE, ""); @@ -120,26 +134,27 @@ ipmi_oem_setup(struct ipmi_intf * intf, char * oemtype) struct ipmi_oem_handle * oem; int rc = 0; - if (oemtype == NULL || - strncmp(oemtype, "help", 4) == 0 || - strncmp(oemtype, "list", 4) == 0) { + if (!oemtype + || !strcmp(oemtype, "help") + || !strcmp(oemtype, "list")) + { ipmi_oem_print(); return -1; } - for (oem=ipmi_oem_list; oem->name != NULL; oem++) { - if (strncmp(oemtype, oem->name, strlen(oem->name)) == 0) + for (oem=ipmi_oem_list; oem->name; oem++) { + if (!strcmp(oemtype, oem->name)) break; } - if (oem->name == NULL) + if (!oem->name) return -1; /* save pointer for later use */ intf->oem = oem; /* run optional setup function if it is defined */ - if (oem->setup != NULL) { + if (oem->setup) { lprintf(LOG_DEBUG, "Running OEM setup for \"%s\"", oem->desc); rc = oem->setup(intf); } @@ -158,10 +173,10 @@ ipmi_oem_setup(struct ipmi_intf * intf, char * oemtype) int ipmi_oem_active(struct ipmi_intf * intf, const char * oemtype) { - if (intf->oem == NULL) + if (!intf->oem) return 0; - if (strncmp(intf->oem->name, oemtype, strlen(oemtype)) == 0) + if (!strcmp(intf->oem->name, oemtype)) return 1; return 0; diff --git a/lib/ipmi_pef.c b/lib/ipmi_pef.c index bbf25f2..ef8c5d4 100644 --- a/lib/ipmi_pef.c +++ b/lib/ipmi_pef.c @@ -42,6 +42,7 @@ #include <ipmitool/ipmi_mc.h> #include <ipmitool/ipmi_pef.h> #include <ipmitool/ipmi_sel.h> +#include <ipmitool/ipmi_time.h> #include <ipmitool/log.h> extern int verbose; @@ -78,6 +79,307 @@ static const char * pef_flag_fmts[][3] = { }; static const char * listitem[] = {" | %s", ",%s", "%s"}; +static struct bit_desc_map +pef_b2s_actions = { +BIT_DESC_MAP_ALL, +{ {"Alert", PEF_ACTION_ALERT}, + {"Power-off", PEF_ACTION_POWER_DOWN}, + {"Reset", PEF_ACTION_RESET}, + {"Power-cycle", PEF_ACTION_POWER_CYCLE}, + {"OEM-defined", PEF_ACTION_OEM}, + {"Diagnostic-interrupt", PEF_ACTION_DIAGNOSTIC_INTERRUPT}, + {NULL} +} }; + +static struct bit_desc_map +pef_b2s_severities = { +BIT_DESC_MAP_ANY, +{ {"Non-recoverable", PEF_SEVERITY_NON_RECOVERABLE}, + {"Critical", PEF_SEVERITY_CRITICAL}, + {"Warning", PEF_SEVERITY_WARNING}, + {"OK", PEF_SEVERITY_OK}, + {"Information", PEF_SEVERITY_INFORMATION}, + {"Monitor", PEF_SEVERITY_MONITOR}, + {NULL} +} }; + +static struct bit_desc_map +pef_b2s_sensortypes = { +BIT_DESC_MAP_LIST, +{ {"Any", 255}, + {"Temperature", 1}, + {"Voltage", 2}, + {"Current", 3}, + {"Fan", 4}, + {"Chassis Intrusion", 5}, + {"Platform security breach", 6}, + {"Processor", 7}, + {"Power supply", 8}, + {"Power Unit", 9}, + {"Cooling device", 10}, + {"Other (units-based)", 11}, + {"Memory", 12}, + {"Drive Slot", 13}, + {"POST memory resize", 14}, + {"POST error", 15}, + {"Logging disabled", 16}, + {"Watchdog 1", 17}, + {"System event", 18}, + {"Critical Interrupt", 19}, + {"Button", 20}, + {"Module/board", 21}, + {"uController/coprocessor", 22}, + {"Add-in card", 23}, + {"Chassis", 24}, + {"Chipset", 25}, + {"Other (FRU)", 26}, + {"Cable/interconnect", 27}, + {"Terminator", 28}, + {"System boot", 29}, + {"Boot error", 30}, + {"OS boot", 31}, + {"OS critical stop", 32}, + {"Slot/connector", 33}, + {"ACPI power state", 34}, + {"Watchdog 2", 35}, + {"Platform alert", 36}, + {"Entity presence", 37}, + {"Monitor ASIC/IC", 38}, + {"LAN", 39}, + {"Management subsystem health", 40}, + {"Battery", 41}, + {NULL} +} }; + +static struct bit_desc_map +pef_b2s_gentype_1 = { +BIT_DESC_MAP_LIST, +{ {"<LNC", 0}, /* '<' : getting worse */ + {">LNC", 1}, /* '>' : getting better */ + {"<LC", 2}, + {">LC", 3}, + {"<LNR", 4}, + {">LNR", 5}, + {">UNC", 6}, + {"<UNC", 7}, + {">UC", 8}, + {"<UC", 9}, + {">UNR", 10}, + {"<UNR", 11}, + {NULL} +} }; + +static struct bit_desc_map +pef_b2s_gentype_2 = { +BIT_DESC_MAP_LIST, +{ {"transition to idle", 0}, + {"transition to active", 1}, + {"transition to busy", 2}, + {NULL} +} }; + +static struct bit_desc_map +pef_b2s_gentype_3 = { +BIT_DESC_MAP_LIST, +{ {"state deasserted", 0}, + {"state asserted", 1}, + {NULL} +} }; + +static struct bit_desc_map +pef_b2s_gentype_4 = { +BIT_DESC_MAP_LIST, +{ {"predictive failure deasserted", 0}, + {"predictive failure asserted", 1}, + {NULL} +} }; + +static struct bit_desc_map +pef_b2s_gentype_5 = { +BIT_DESC_MAP_LIST, +{ {"limit not exceeded", 0}, + {"limit exceeded", 1}, + {NULL} +} }; + +static struct bit_desc_map +pef_b2s_gentype_6 = { +BIT_DESC_MAP_LIST, +{ {"performance met", 0}, + {"performance lags", 1}, + {NULL} +} }; + +static struct bit_desc_map +pef_b2s_gentype_7 = { +BIT_DESC_MAP_LIST, +{ {"ok", 0}, + {"<warn", 1}, /* '<' : getting worse */ + {"<fail", 2}, + {"<dead", 3}, + {">warn", 4}, /* '>' : getting better */ + {">fail", 5}, + {"dead", 6}, + {"monitor", 7}, + {"informational", 8}, + {NULL} +} }; + +static struct bit_desc_map +pef_b2s_gentype_8 = { +BIT_DESC_MAP_LIST, +{ {"device removed/absent", 0}, + {"device inserted/present", 1}, + {NULL} +} }; + +static struct bit_desc_map +pef_b2s_gentype_9 = { +BIT_DESC_MAP_LIST, +{ {"device disabled", 0}, + {"device enabled", 1}, + {NULL} +} }; + +static struct bit_desc_map +pef_b2s_gentype_10 = { +BIT_DESC_MAP_LIST, +{ {"transition to running", 0}, + {"transition to in test", 1}, + {"transition to power off", 2}, + {"transition to online", 3}, + {"transition to offline", 4}, + {"transition to off duty", 5}, + {"transition to degraded", 6}, + {"transition to power save", 7}, + {"install error", 8}, + {NULL} +} }; + +static struct bit_desc_map +pef_b2s_gentype_11 = { +BIT_DESC_MAP_LIST, +{ {"fully redundant", 0}, + {"redundancy lost", 1}, + {"redundancy degraded", 2}, + {"<non-redundant/sufficient", 3}, /* '<' : getting worse */ + {">non-redundant/sufficient", 4}, /* '>' : getting better */ + {"non-redundant/insufficient", 5}, + {"<redundancy degraded", 6}, + {">redundancy degraded", 7}, + {NULL} +} }; + +static struct bit_desc_map +pef_b2s_gentype_12 = { +BIT_DESC_MAP_LIST, +{ {"D0 power state", 0}, + {"D1 power state", 1}, + {"D2 power state", 2}, + {"D3 power state", 3}, + {NULL} +} }; + +static struct bit_desc_map * +pef_b2s_generic_ER[] = { + &pef_b2s_gentype_1, + &pef_b2s_gentype_2, + &pef_b2s_gentype_3, + &pef_b2s_gentype_4, + &pef_b2s_gentype_5, + &pef_b2s_gentype_6, + &pef_b2s_gentype_7, + &pef_b2s_gentype_8, + &pef_b2s_gentype_9, + &pef_b2s_gentype_10, + &pef_b2s_gentype_11, + &pef_b2s_gentype_12, +}; +#define PEF_B2S_GENERIC_ER_ENTRIES ARRAY_SIZE(pef_b2s_generic_ER) + +static struct bit_desc_map +pef_b2s_policies = { +BIT_DESC_MAP_LIST, +{ {"Match-always", PEF_POLICY_FLAGS_MATCH_ALWAYS}, + {"Try-next-entry", PEF_POLICY_FLAGS_PREV_OK_SKIP}, + {"Try-next-set", PEF_POLICY_FLAGS_PREV_OK_NEXT_POLICY_SET}, + {"Try-next-channel", PEF_POLICY_FLAGS_PREV_OK_NEXT_CHANNEL_IN_SET}, + {"Try-next-destination", PEF_POLICY_FLAGS_PREV_OK_NEXT_DESTINATION_IN_SET}, + {NULL} +} }; + +static struct bit_desc_map +pef_b2s_ch_medium = { +#define PEF_CH_MEDIUM_TYPE_IPMB 1 +#define PEF_CH_MEDIUM_TYPE_ICMB_10 2 +#define PEF_CH_MEDIUM_TYPE_ICMB_09 3 +#define PEF_CH_MEDIUM_TYPE_LAN 4 +#define PEF_CH_MEDIUM_TYPE_SERIAL 5 +#define PEF_CH_MEDIUM_TYPE_XLAN 6 +#define PEF_CH_MEDIUM_TYPE_PCI_SMBUS 7 +#define PEF_CH_MEDIUM_TYPE_SMBUS_V1X 8 +#define PEF_CH_MEDIUM_TYPE_SMBUS_V2X 9 +#define PEF_CH_MEDIUM_TYPE_USB_V1X 10 +#define PEF_CH_MEDIUM_TYPE_USB_V2X 11 +#define PEF_CH_MEDIUM_TYPE_SYSTEM 12 +BIT_DESC_MAP_LIST, +{ {"IPMB (I2C)", PEF_CH_MEDIUM_TYPE_IPMB}, + {"ICMB v1.0", PEF_CH_MEDIUM_TYPE_ICMB_10}, + {"ICMB v0.9", PEF_CH_MEDIUM_TYPE_ICMB_09}, + {"802.3 LAN", PEF_CH_MEDIUM_TYPE_LAN}, + {"Serial/Modem (RS-232)", PEF_CH_MEDIUM_TYPE_SERIAL}, + {"Other LAN", PEF_CH_MEDIUM_TYPE_XLAN}, + {"PCI SMBus", PEF_CH_MEDIUM_TYPE_PCI_SMBUS}, + {"SMBus v1.0/1.1", PEF_CH_MEDIUM_TYPE_SMBUS_V1X}, + {"SMBus v2.0", PEF_CH_MEDIUM_TYPE_SMBUS_V2X}, + {"USB 1.x", PEF_CH_MEDIUM_TYPE_USB_V1X}, + {"USB 2.x", PEF_CH_MEDIUM_TYPE_USB_V2X}, + {"System I/F (KCS,SMIC,BT)", PEF_CH_MEDIUM_TYPE_SYSTEM}, + {NULL} +} }; + +static struct bit_desc_map +pef_b2s_control = { +BIT_DESC_MAP_ALL, +{ {"PEF", PEF_CONTROL_ENABLE}, + {"PEF event messages", PEF_CONTROL_ENABLE_EVENT_MESSAGES}, + {"PEF startup delay", PEF_CONTROL_ENABLE_STARTUP_DELAY}, + {"Alert startup delay", PEF_CONTROL_ENABLE_ALERT_STARTUP_DELAY}, + {NULL} +} }; + +static struct bit_desc_map +pef_b2s_lan_desttype = { +BIT_DESC_MAP_LIST, +{ {"Acknowledged", PEF_LAN_DEST_TYPE_ACK}, + {"PET", PEF_LAN_DEST_TYPE_PET}, + {"OEM 1", PEF_LAN_DEST_TYPE_OEM_1}, + {"OEM 2", PEF_LAN_DEST_TYPE_OEM_2}, + {NULL} +} }; + +static struct bit_desc_map +pef_b2s_serial_desttype = { +BIT_DESC_MAP_LIST, +{ {"Acknowledged", PEF_SERIAL_DEST_TYPE_ACK}, + {"TAP page", PEF_SERIAL_DEST_TYPE_TAP}, + {"PPP PET", PEF_SERIAL_DEST_TYPE_PPP}, + {"Basic callback", PEF_SERIAL_DEST_TYPE_BASIC_CALLBACK}, + {"PPP callback", PEF_SERIAL_DEST_TYPE_PPP_CALLBACK}, + {"OEM 1", PEF_SERIAL_DEST_TYPE_OEM_1}, + {"OEM 2", PEF_SERIAL_DEST_TYPE_OEM_2}, + {NULL} +} }; + +static struct bit_desc_map +pef_b2s_tap_svc_confirm = { +BIT_DESC_MAP_LIST, +{ {"ACK", PEF_SERIAL_TAP_CONFIRMATION_ACK_AFTER_ETX}, + {"211+ACK", PEF_SERIAL_TAP_CONFIRMATION_211_ACK_AFTER_ETX}, + {"{211|213}+ACK", PEF_SERIAL_TAP_CONFIRMATION_21X_ACK_AFTER_ETX}, + {NULL} +} }; + static int ipmi_pef2_list_filters(struct ipmi_intf *); const char * @@ -193,7 +495,7 @@ ipmi_pef_print_1xd(const char * text, uint32_t val) static int ipmi_pef_print_guid(uint8_t *guid) { - if (guid == NULL) { + if (!guid) { return (-1); } @@ -247,7 +549,7 @@ _ipmi_get_pef_capabilities(struct ipmi_intf *intf, { struct ipmi_rs *rsp; struct ipmi_rq req; - if (pcap == NULL) { + if (!pcap) { return (-3); } @@ -257,9 +559,9 @@ _ipmi_get_pef_capabilities(struct ipmi_intf *intf, req.msg.cmd = IPMI_CMD_GET_PEF_CAPABILITIES; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { return (-1); - } else if (rsp->ccode != 0) { + } else if (rsp->ccode) { return rsp->ccode; } else if (rsp->data_len != 3) { return (-2); @@ -287,7 +589,7 @@ _ipmi_get_pef_filter_entry(struct ipmi_intf *intf, uint8_t filter_id, uint8_t data[3]; uint8_t data_len = 3 * sizeof(uint8_t); int dest_size; - if (filter_entry == NULL) { + if (!filter_entry) { return (-3); } @@ -303,9 +605,9 @@ _ipmi_get_pef_filter_entry(struct ipmi_intf *intf, uint8_t filter_id, req.msg.data = (uint8_t *)&data; req.msg.data_len = data_len; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { return (-1); - } else if (rsp->ccode != 0) { + } else if (rsp->ccode) { return rsp->ccode; } else if (rsp->data_len != 22 || (rsp->data_len - 1) != dest_size) { return (-2); @@ -331,7 +633,7 @@ _ipmi_get_pef_filter_entry_cfg(struct ipmi_intf *intf, uint8_t filter_id, uint8_t data[3]; uint8_t data_len = 3 * sizeof(uint8_t); int dest_size; - if (filter_cfg == NULL) { + if (!filter_cfg) { return (-3); } @@ -347,9 +649,9 @@ _ipmi_get_pef_filter_entry_cfg(struct ipmi_intf *intf, uint8_t filter_id, req.msg.data = (uint8_t *)&data; req.msg.data_len = data_len; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { return (-1); - } else if (rsp->ccode != 0) { + } else if (rsp->ccode) { return rsp->ccode; } else if (rsp->data_len != 3 || (rsp->data_len - 1) != dest_size) { return (-2); @@ -375,7 +677,7 @@ _ipmi_get_pef_policy_entry(struct ipmi_intf *intf, uint8_t policy_id, uint8_t data[3]; uint8_t data_len = 3 * sizeof(uint8_t); int dest_size; - if (policy_entry == NULL) { + if (!policy_entry) { return (-3); } @@ -391,9 +693,9 @@ _ipmi_get_pef_policy_entry(struct ipmi_intf *intf, uint8_t policy_id, req.msg.data = (uint8_t *)&data; req.msg.data_len = data_len; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { return (-1); - } else if (rsp->ccode != 0) { + } else if (rsp->ccode) { return rsp->ccode; } else if (rsp->data_len != 5 || (rsp->data_len - 1) != dest_size) { return (-2); @@ -416,7 +718,7 @@ _ipmi_get_pef_filter_table_size(struct ipmi_intf *intf, uint8_t *table_size) struct ipmi_rq req; struct pef_cfgparm_selector psel; - if (table_size == NULL) { + if (!table_size) { return (-3); } @@ -430,9 +732,9 @@ _ipmi_get_pef_filter_table_size(struct ipmi_intf *intf, uint8_t *table_size) req.msg.data = (uint8_t *)&psel; req.msg.data_len = sizeof(psel); rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { return (-1); - } else if (rsp->ccode != 0) { + } else if (rsp->ccode) { return rsp->ccode; } else if (rsp->data_len != 2) { return (-2); @@ -455,7 +757,7 @@ _ipmi_get_pef_policy_table_size(struct ipmi_intf *intf, uint8_t *table_size) struct ipmi_rq req; struct pef_cfgparm_selector psel; - if (table_size == NULL) { + if (!table_size) { return (-3); } @@ -469,9 +771,9 @@ _ipmi_get_pef_policy_table_size(struct ipmi_intf *intf, uint8_t *table_size) req.msg.data = (uint8_t *)&psel; req.msg.data_len = sizeof(psel); rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { return (-1); - } else if (rsp->ccode != 0) { + } else if (rsp->ccode) { return rsp->ccode; } else if (rsp->data_len != 2) { return (-2); @@ -494,7 +796,7 @@ _ipmi_get_pef_system_guid(struct ipmi_intf *intf, struct ipmi_rs *rsp; struct ipmi_rq req; struct pef_cfgparm_selector psel; - if (system_guid == NULL) { + if (!system_guid) { return (-3); } @@ -508,9 +810,9 @@ _ipmi_get_pef_system_guid(struct ipmi_intf *intf, req.msg.data_len = sizeof(psel); rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { return (-1); - } else if (rsp->ccode != 0) { + } else if (rsp->ccode) { return rsp->ccode; } else if (rsp->data_len != 18 || (rsp->data_len - 2) != sizeof(system_guid->guid)) { @@ -537,7 +839,7 @@ _ipmi_set_pef_filter_entry_cfg(struct ipmi_intf *intf, uint8_t filter_id, struct ipmi_rq req; uint8_t data[3]; uint8_t data_len = 3 * sizeof(uint8_t); - if (filter_cfg == NULL) { + if (!filter_cfg) { return (-3); } @@ -553,9 +855,9 @@ _ipmi_set_pef_filter_entry_cfg(struct ipmi_intf *intf, uint8_t filter_id, data[2] = filter_cfg->cfg; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { return (-1); - } else if (rsp->ccode != 0) { + } else if (rsp->ccode) { return rsp->ccode; } return 0; @@ -576,7 +878,7 @@ _ipmi_set_pef_policy_entry(struct ipmi_intf *intf, uint8_t policy_id, struct ipmi_rs *rsp; struct ipmi_rq req; struct pef_cfgparm_set_policy_table_entry payload; - if (policy_entry == NULL) { + if (!policy_entry) { return (-3); } @@ -593,16 +895,17 @@ _ipmi_set_pef_policy_entry(struct ipmi_intf *intf, uint8_t policy_id, sizeof(policy_entry->entry)); rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { return (-1); - } else if (rsp->ccode != 0) { + } else if (rsp->ccode) { return rsp->ccode; } return 0; } static void -ipmi_pef_print_oem_lan_dest(struct ipmi_intf *intf, uint8_t ch, uint8_t dest) +ipmi_pef_print_oem_lan_dest(struct ipmi_intf *intf, + uint8_t dest) { char address[128]; int len; @@ -865,7 +1168,7 @@ ipmi_pef_print_serial_dest(struct ipmi_intf *intf, uint8_t ch, uint8_t dest) if (!dest || tbl_size == 0) /* Page alerting not supported */ return; if (dest > tbl_size) { - ipmi_pef_print_oem_lan_dest(intf, ch, dest - tbl_size); + ipmi_pef_print_oem_lan_dest(intf, dest - tbl_size); return; } @@ -903,7 +1206,7 @@ ipmi_pef_print_serial_dest(struct ipmi_intf *intf, uint8_t ch, uint8_t dest) } static void -ipmi_pef_print_dest(struct ipmi_intf * intf, uint8_t ch, uint8_t dest) +ipmi_pef_print_dest(uint8_t dest) { /* // print generic alert destination info */ @@ -1095,13 +1398,13 @@ ipmi_pef2_filter(struct ipmi_intf *intf, int argc, char **argv) lprintf(LOG_ERR, "Not enough parameters given."); ipmi_pef2_filter_help(); rc = (-1); - } else if (!strncmp(argv[0], "help\0", 5)) { + } else if (!strcmp(argv[0], "help")) { ipmi_pef2_filter_help(); rc = 0; - } else if (!strncmp(argv[0], "list\0", 5)) { + } else if (!strcmp(argv[0], "list")) { rc = ipmi_pef2_list_filters(intf); - } else if (!strncmp(argv[0], "enable\0", 7) - ||(!strncmp(argv[0], "disable\0", 8))) { + } else if (!strcmp(argv[0], "enable") + ||(!strcmp(argv[0], "disable"))) { uint8_t enable; uint8_t filter_id; if (argc != 2) { @@ -1117,16 +1420,16 @@ ipmi_pef2_filter(struct ipmi_intf *intf, int argc, char **argv) "Valid range is <1..255>."); return (-1); } - if (!strncmp(argv[0], "enable\0", 7)) { + if (!strcmp(argv[0], "enable")) { enable = 1; } else { enable = 0; } rc = ipmi_pef2_filter_enable(intf, enable, filter_id); - } else if (!strncmp(argv[0], "create\0", 7)) { + } else if (!strcmp(argv[0], "create")) { lprintf(LOG_ERR, "Not implemented."); rc = 1; - } else if (!strncmp(argv[0], "delete\0", 7)) { + } else if (!strcmp(argv[0], "delete")) { lprintf(LOG_ERR, "Not implemented."); rc = 1; } else { @@ -1143,7 +1446,7 @@ ipmi_pef2_get_info(struct ipmi_intf *intf) { struct pef_capabilities pcap; struct pef_cfgparm_system_guid psys_guid; - struct ipmi_guid_t guid; + ipmi_guid_t guid; int rc; uint8_t *guid_ptr = NULL; uint8_t policy_table_size; @@ -1183,6 +1486,7 @@ ipmi_pef2_get_info(struct ipmi_intf *intf) ipmi_pef_print_guid(guid_ptr); } ipmi_pef_print_flags(&pef_b2s_actions, P_SUPP, pcap.actions); + putchar('\n'); return 0; } @@ -1193,8 +1497,6 @@ ipmi_pef2_get_status(struct ipmi_intf *intf) struct ipmi_rs *rsp; struct ipmi_rq req; struct pef_cfgparm_selector psel; - char tbuf[40]; - uint32_t timei; time_t ts; memset(&req, 0, sizeof(req)); @@ -1206,15 +1508,9 @@ ipmi_pef2_get_status(struct ipmi_intf *intf) "Last S/W processed ID"); return (-1); } - memcpy(&timei, rsp->data, sizeof(timei)); -#if WORDS_BIGENDIAN - timei = BSWAP_32(timei); -#endif - ts = (time_t)timei; - - strftime(tbuf, sizeof(tbuf), "%m/%d/%Y %H:%M:%S", gmtime(&ts)); - ipmi_pef_print_str("Last SEL addition", tbuf); + ts = ipmi32toh(rsp->data); + ipmi_pef_print_str("Last SEL addition", ipmi_timestamp_numeric(ts)); ipmi_pef_print_2xd("Last SEL record ID", rsp->data[5], rsp->data[4]); ipmi_pef_print_2xd("Last S/W processed ID", rsp->data[7], rsp->data[6]); ipmi_pef_print_2xd("Last BMC processed ID", rsp->data[9], rsp->data[8]); @@ -1242,6 +1538,7 @@ ipmi_pef2_get_status(struct ipmi_intf *intf) return (-1); } ipmi_pef_print_flags(&pef_b2s_actions, P_ACTV, rsp->data[1]); + putchar('\n'); return 0; } @@ -1337,7 +1634,7 @@ ipmi_pef2_list_policies(struct ipmi_intf *intf) dest); break; default: - ipmi_pef_print_dest(intf, channel_info.channel, dest); + ipmi_pef_print_dest(dest); break; } printf("\n"); @@ -1424,13 +1721,13 @@ ipmi_pef2_policy(struct ipmi_intf *intf, int argc, char **argv) lprintf(LOG_ERR, "Not enough parameters given."); ipmi_pef2_policy_help(); rc = (-1); - } else if (!strncmp(argv[0], "help\0", 5)) { + } else if (!strcmp(argv[0], "help")) { ipmi_pef2_policy_help(); rc = 0; - } else if (!strncmp(argv[0], "list\0", 5)) { + } else if (!strcmp(argv[0], "list")) { rc = ipmi_pef2_list_policies(intf); - } else if (!strncmp(argv[0], "enable\0", 7) - || !strncmp(argv[0], "disable\0", 8)) { + } else if (!strcmp(argv[0], "enable") + || !strcmp(argv[0], "disable")) { uint8_t enable; uint8_t policy_id; if (argc != 2) { @@ -1445,16 +1742,16 @@ ipmi_pef2_policy(struct ipmi_intf *intf, int argc, char **argv) lprintf(LOG_ERR, "PEF Policy ID out of range. Valid range is <1..127>."); return (-1); } - if (!strncmp(argv[0], "enable\0", 7)) { + if (!strcmp(argv[0], "enable")) { enable = 1; } else { enable = 0; } rc = ipmi_pef2_policy_enable(intf, enable, policy_id); - } else if (!strncmp(argv[0], "create\0", 7)) { + } else if (!strcmp(argv[0], "create")) { lprintf(LOG_ERR, "Not implemented."); rc = 1; - } else if (!strncmp(argv[0], "delete\0", 7)) { + } else if (!strcmp(argv[0], "delete")) { lprintf(LOG_ERR, "Not implemented."); rc = 1; } else { @@ -1515,30 +1812,30 @@ int ipmi_pef_main(struct ipmi_intf *intf, int argc, char **argv) lprintf(LOG_ERR, "Not enough parameters given."); ipmi_pef2_help(); rc = (-1); - } else if (!strncmp(argv[0], "help\0", 5)) { + } else if (!strcmp(argv[0], "help")) { ipmi_pef2_help(); rc = 0; - } else if (!strncmp(argv[0], "capabilities\0", 13)) { + } else if (!strcmp(argv[0], "capabilities")) { /* rc = ipmi_pef2_get_capabilities(intf); */ lprintf(LOG_ERR, "Not implemented."); rc = 1; - } else if (!strncmp(argv[0], "event\0", 6)) { + } else if (!strcmp(argv[0], "event")) { /* rc = ipmi_pef2_event(intf, (argc - 1), ++argv); */ lprintf(LOG_ERR, "Not implemented."); rc = 1; - } else if (!strncmp(argv[0], "filter\0", 7)) { + } else if (!strcmp(argv[0], "filter")) { rc = ipmi_pef2_filter(intf, (argc - 1), ++argv); - } else if (!strncmp(argv[0], "info\0", 5)) { + } else if (!strcmp(argv[0], "info")) { rc = ipmi_pef2_get_info(intf); - } else if (!strncmp(argv[0], "pet\0", 4)) { + } else if (!strcmp(argv[0], "pet")) { /* rc = ipmi_pef2_pet(intf, (argc - 1), ++argv); */ lprintf(LOG_ERR, "Not implemented."); rc = 1; - } else if (!strncmp(argv[0], "policy\0", 7)) { + } else if (!strcmp(argv[0], "policy")) { rc = ipmi_pef2_policy(intf, (argc - 1), ++argv); - } else if (!strncmp(argv[0], "status\0", 7)) { + } else if (!strcmp(argv[0], "status")) { rc = ipmi_pef2_get_status(intf); - } else if (!strncmp(argv[0], "timer\0", 6)) { + } else if (!strcmp(argv[0], "timer")) { /* rc = ipmi_pef2_timer(intf, (argc - 1), ++argv); */ lprintf(LOG_ERR, "Not implemented."); rc = 1; diff --git a/lib/ipmi_picmg.c b/lib/ipmi_picmg.c index c7d9c8e..8becc78 100644 --- a/lib/ipmi_picmg.c +++ b/lib/ipmi_picmg.c @@ -37,11 +37,6 @@ #include <ipmitool/ipmi_strings.h> #include <ipmitool/log.h> -#define PICMG_EXTENSION_ATCA_MAJOR_VERSION 2 -#define PICMG_EXTENSION_AMC0_MAJOR_VERSION 4 -#define PICMG_EXTENSION_UTCA_MAJOR_VERSION 5 - - #define PICMG_EKEY_MODE_QUERY 0 #define PICMG_EKEY_MODE_PRINT_ALL 1 #define PICMG_EKEY_MODE_PRINT_ENABLED 2 @@ -67,7 +62,84 @@ typedef enum picmg_card_type { PICMG_CARD_TYPE_RESERVED } t_picmg_card_type ; -/* This is the version of the PICMG Extenstion */ +static const char* amc_link_type_str[] = { + "RESERVED", + "RESERVED1", + "PCI EXPRESS", + "ADVANCED SWITCHING1", + "ADVANCED SWITCHING2", + "ETHERNET", + "RAPIDIO", + "STORAGE", +}; + +static const char* amc_link_type_ext_str[][16] = { + /* FRU_PICMGEXT_AMC_LINK_TYPE_RESERVED */ + { + "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" + }, + /* FRU_PICMGEXT_AMC_LINK_TYPE_RESERVED1 */ + { + "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" + }, + /* FRU_PICMGEXT_AMC_LINK_TYPE_PCI_EXPRESS */ + { + "Gen 1 - NSSC", + "Gen 1 - SSC", + "Gen 2 - NSSC", + "Gen 2 - SSC", + "", "", "", "", + "", "", "", "", + "", "", "", "" + }, + /* FRU_PICMGEXT_AMC_LINK_TYPE_ADVANCED_SWITCHING1 */ + { + "Gen 1 - NSSC", + "Gen 1 - SSC", + "Gen 2 - NSSC", + "Gen 2 - SSC", + "", "", "", "", + "", "", "", "", + "", "", "", "" + }, + /* FRU_PICMGEXT_AMC_LINK_TYPE_ADVANCED_SWITCHING2 */ + { + "Gen 1 - NSSC", + "Gen 1 - SSC", + "Gen 2 - NSSC", + "Gen 2 - SSC", + "", "", "", "", + "", "", "", "", + "", "", "", "" + }, + /* FRU_PICMGEXT_AMC_LINK_TYPE_ETHERNET */ + { + "1000BASE-BX (SerDES Gigabit)", + "10GBASE-BX410 Gigabit XAUI", + "", "", + "", "", "", "", + "", "", "", "", + "", "", "", "" + }, + /* FRU_PICMGEXT_AMC_LINK_TYPE_RAPIDIO */ + { + "1.25 Gbaud transmission rate", + "2.5 Gbaud transmission rate", + "3.125 Gbaud transmission rate", + "", "", "", "", "", + "", "", "", "", "", "", "", "" + }, + /* FRU_PICMGEXT_AMC_LINK_TYPE_STORAGE */ + { + "Fibre Channel", + "Serial ATA", + "Serial Attached SCSI", + "", "", "", "", "", + "", "", "", "", "", "", "", "" + } +}; + +/* This is the version of the PICMG Extension */ static t_picmg_card_type PicmgCardType = PICMG_CARD_TYPE_RESERVED; void @@ -130,6 +202,28 @@ struct sAmcAddrMap { {0x88, "reserved", 0}, }; +/* the LED color capabilities */ +static const char *led_color_str[] = { + "reserved", + "BLUE", + "RED", + "GREEN", + "AMBER", + "ORANGE", + "WHITE", + "reserved" +}; + +const char * +picmg_led_color_str(int color) +{ + if (color < 0 || (size_t)color >= ARRAY_SIZE(led_color_str)) { + return "invalid"; + } + + return led_color_str[color]; +} + /* is_amc_channel - wrapper to convert user input into integer * AMC Channel range seems to be <0..255>, bits [7:0] * @@ -151,7 +245,7 @@ is_amc_channel(const char *argv_ptr, uint8_t *amc_chan_ptr) return (-1); } /* is_amc_dev - wrapper to convert user input into integer. - * AMC Dev ID limits are uknown. + * AMC Dev ID limits are unknown. * * @argv_ptr: source string to convert from; usually argv * @amc_dev_ptr: pointer where to store result @@ -172,7 +266,7 @@ is_amc_dev(const char *argv_ptr, int32_t *amc_dev_ptr) return (-1); } /* is_amc_intf - wrapper to convert user input into integer. - * AMC Interface (ID) limits are uknown. + * AMC Interface (ID) limits are unknown. * * @argv_ptr: source string to convert from; usually argv * @amc_intf_ptr: pointer where to store result @@ -193,7 +287,7 @@ is_amc_intf(const char *argv_ptr, int32_t *amc_intf_ptr) return (-1); } /* is_amc_port - wrapper to convert user input into integer. - * AMC Port limits are uknown. + * AMC Port limits are unknown. * * @argv_ptr: source string to convert from; usually argv * @amc_port_ptr: pointer where to store result @@ -213,7 +307,7 @@ is_amc_port(const char *argv_ptr, int32_t *amc_port_ptr) return (-1); } /* is_clk_acc - wrapper to convert user input into integer. - * Clock Accuracy limits are uknown[1byte by spec]. + * Clock Accuracy limits are unknown[1byte by spec]. * * @argv_ptr: source string to convert from; usually argv * @clk_acc_ptr: pointer where to store result @@ -234,7 +328,7 @@ is_clk_acc(const char *argv_ptr, uint8_t *clk_acc_ptr) return (-1); } /* is_clk_family - wrapper to convert user input into integer. - * Clock Family limits are uknown[1byte by spec]. + * Clock Family limits are unknown[1byte by spec]. * * @argv_ptr: source string to convert from; usually argv * @clk_family_ptr: pointer where to store result @@ -255,7 +349,7 @@ is_clk_family(const char *argv_ptr, uint8_t *clk_family_ptr) return (-1); } /* is_clk_freq - wrapper to convert user input into integer. - * Clock Frequency limits are uknown, but specification says + * Clock Frequency limits are unknown, but specification says * 3Bytes + 1B checksum * * @argv_ptr: source string to convert from; usually argv @@ -277,7 +371,7 @@ is_clk_freq(const char *argv_ptr, uint32_t *clk_freq_ptr) return (-1); } /* is_clk_id - wrapper to convert user input into integer. - * Clock ID limits are uknown, however it's 1B by specification and I've + * Clock ID limits are unknown, however it's 1B by specification and I've * found two ranges: <1..5> or <0..15> * * @argv_ptr: source string to convert from; usually argv @@ -298,7 +392,7 @@ is_clk_id(const char *argv_ptr, uint8_t *clk_id_ptr) return (-1); } /* is_clk_index - wrapper to convert user input into integer. - * Clock Index limits are uknown[1B by spec] + * Clock Index limits are unknown[1B by spec] * * @argv_ptr: source string to convert from; usually argv * @clk_index_ptr: pointer where to store result @@ -318,7 +412,7 @@ is_clk_index(const char *argv_ptr, uint8_t *clk_index_ptr) return (-1); } /* is_clk_resid - wrapper to convert user input into integer. - * Clock Resource Index(?) limits are uknown, but maximum seems to be 15. + * Clock Resource Index(?) limits are unknown, but maximum seems to be 15. * * @argv_ptr: source string to convert from; usually argv * @clk_resid_ptr: pointer where to store result @@ -661,7 +755,7 @@ ipmi_picmg_properties(struct ipmi_intf * intf, int show ) #define PICMG_FRU_ACTIVATE (unsigned char) 0x01 int -ipmi_picmg_fru_activation(struct ipmi_intf * intf, int argc, char ** argv, unsigned char state) +ipmi_picmg_fru_activation(struct ipmi_intf * intf, char ** argv, unsigned char state) { struct ipmi_rs * rsp; struct ipmi_rq req; @@ -695,7 +789,7 @@ ipmi_picmg_fru_activation(struct ipmi_intf * intf, int argc, char ** argv, unsig int -ipmi_picmg_fru_activation_policy_get(struct ipmi_intf * intf, int argc, char ** argv) +ipmi_picmg_fru_activation_policy_get(struct ipmi_intf * intf, char ** argv) { struct ipmi_rs * rsp; struct ipmi_rq req; @@ -734,7 +828,7 @@ ipmi_picmg_fru_activation_policy_get(struct ipmi_intf * intf, int argc, char ** } int -ipmi_picmg_fru_activation_policy_set(struct ipmi_intf * intf, int argc, char ** argv) +ipmi_picmg_fru_activation_policy_set(struct ipmi_intf * intf, char ** argv) { struct ipmi_rs * rsp; struct ipmi_rq req; @@ -1029,7 +1123,7 @@ ipmi_picmg_amc_portstate_get(struct ipmi_intf * intf, int32_t device, /* Removed endianness check here, probably not required - as we dont use bitfields */ + as we don't use bitfields */ port = d->linkInfo[0] & 0x0F; type = ((d->linkInfo[0] & 0xF0) >> 4 )|(d->linkInfo[1] & 0x0F ); ext = ((d->linkInfo[1] & 0xF0) >> 4 ); @@ -1158,7 +1252,7 @@ ipmi_picmg_amc_portstate_set(struct ipmi_intf * intf, uint8_t channel, int -ipmi_picmg_get_led_properties(struct ipmi_intf * intf, int argc, char ** argv) +ipmi_picmg_get_led_properties(struct ipmi_intf * intf, char ** argv) { struct ipmi_rs * rsp; struct ipmi_rq req; @@ -1197,7 +1291,7 @@ ipmi_picmg_get_led_properties(struct ipmi_intf * intf, int argc, char ** argv) } int -ipmi_picmg_get_led_capabilities(struct ipmi_intf * intf, int argc, char ** argv) +ipmi_picmg_get_led_capabilities(struct ipmi_intf * intf, char ** argv) { int i; struct ipmi_rs * rsp; @@ -1234,20 +1328,20 @@ ipmi_picmg_get_led_capabilities(struct ipmi_intf * intf, int argc, char ** argv) printf("LED Color Capabilities: "); for ( i=0 ; i<8 ; i++ ) { if ( rsp->data[1] & (0x01 << i) ) { - printf("%s, ", led_color_str[ i ]); + printf("%s, ", picmg_led_color_str(i)); } } printf("\n"); printf("Default LED Color in\n"); - printf(" LOCAL control: %s\n", led_color_str[ rsp->data[2] ] ); - printf(" OVERRIDE state: %s\n", led_color_str[ rsp->data[3] ] ); + printf(" LOCAL control: %s\n", picmg_led_color_str(rsp->data[2])); + printf(" OVERRIDE state: %s\n", picmg_led_color_str(rsp->data[3])); return 0; } int -ipmi_picmg_get_led_state(struct ipmi_intf * intf, int argc, char ** argv) +ipmi_picmg_get_led_state(struct ipmi_intf * intf, char ** argv) { struct ipmi_rs * rsp; struct ipmi_rq req; @@ -1308,7 +1402,9 @@ ipmi_picmg_get_led_state(struct ipmi_intf * intf, int argc, char ** argv) } printf(" Local Control On-Duration: %x\n", rsp->data[3] ); - printf(" Local Control Color: %x [%s]\n", rsp->data[4], led_color_str[ rsp->data[4] ]); + printf(" Local Control Color: %x [%s]\n", + rsp->data[4], + picmg_led_color_str(rsp->data[4])); /* override state or lamp test */ if (rsp->data[1] & 0x02) { @@ -1322,7 +1418,9 @@ ipmi_picmg_get_led_state(struct ipmi_intf * intf, int argc, char ** argv) } printf(" Override On-Duration: %x\n", rsp->data[6] ); - printf(" Override Color: %x [%s]\n", rsp->data[7], led_color_str[ rsp->data[7] ]); + printf(" Override Color: %x [%s]\n", + rsp->data[7], + picmg_led_color_str(rsp->data[7])); } @@ -1334,7 +1432,7 @@ ipmi_picmg_get_led_state(struct ipmi_intf * intf, int argc, char ** argv) } int -ipmi_picmg_set_led_state(struct ipmi_intf * intf, int argc, char ** argv) +ipmi_picmg_set_led_state(struct ipmi_intf * intf, char ** argv) { struct ipmi_rs * rsp; struct ipmi_rq req; @@ -1410,7 +1508,7 @@ ipmi_picmg_set_led_state(struct ipmi_intf * intf, int argc, char ** argv) } int -ipmi_picmg_get_power_level(struct ipmi_intf * intf, int argc, char ** argv) +ipmi_picmg_get_power_level(struct ipmi_intf * intf, char ** argv) { int i; struct ipmi_rs * rsp; @@ -1461,7 +1559,7 @@ ipmi_picmg_get_power_level(struct ipmi_intf * intf, int argc, char ** argv) } int -ipmi_picmg_set_power_level(struct ipmi_intf * intf, int argc, char ** argv) +ipmi_picmg_set_power_level(struct ipmi_intf * intf, char ** argv) { struct ipmi_rs * rsp; struct ipmi_rq req; @@ -1565,7 +1663,7 @@ ipmi_picmg_bused_resource(struct ipmi_intf * intf, t_picmg_bused_resource_mode m } int -ipmi_picmg_fru_control(struct ipmi_intf * intf, int argc, char ** argv) +ipmi_picmg_fru_control(struct ipmi_intf * intf, char ** argv) { struct ipmi_rs * rsp; struct ipmi_rq req; @@ -1654,7 +1752,7 @@ ipmi_picmg_clk_get(struct ipmi_intf * intf, uint8_t clk_id, int8_t clk_res, return -1; } - if (rsp->ccode == 0 ) { + if (!rsp->ccode) { enabled = (rsp->data[1]&0x8)!=0; direction = (rsp->data[1]&0x4)!=0; @@ -1785,24 +1883,24 @@ ipmi_picmg_main (struct ipmi_intf * intf, int argc, char ** argv) int rc = 0; int showProperties = 0; - if (argc == 0 || (!strncmp(argv[0], "help", 4))) { + if (!argc || !strcmp(argv[0], "help")) { ipmi_picmg_help(); return 0; } /* Get PICMG properties is called to obtain version information */ - if (argc !=0 && !strncmp(argv[0], "properties", 10)) { + if (!strcmp(argv[0], "properties")) { showProperties =1; } rc = ipmi_picmg_properties(intf,showProperties); /* address info command */ - if (!strncmp(argv[0], "addrinfo", 8)) { + if (!strcmp(argv[0], "addrinfo")) { rc = ipmi_picmg_getaddr(intf, argc-1, &argv[1]); } - else if (!strncmp(argv[0], "busres", 6)) { + else if (!strcmp(argv[0], "busres")) { if (argc > 1) { - if (!strncmp(argv[1], "summary", 7)) { + if (!strcmp(argv[1], "summary")) { ipmi_picmg_bused_resource(intf, PICMG_BUSED_RESOURCE_SUMMARY ); } } else { @@ -1810,9 +1908,9 @@ ipmi_picmg_main (struct ipmi_intf * intf, int argc, char ** argv) } } /* fru control command */ - else if (!strncmp(argv[0], "frucontrol", 10)) { + else if (!strcmp(argv[0], "frucontrol")) { if (argc > 2) { - rc = ipmi_picmg_fru_control(intf, argc-1, &(argv[1])); + rc = ipmi_picmg_fru_control(intf, &(argv[1])); } else { lprintf(LOG_NOTICE, "usage: frucontrol <FRU-ID> <OPTION>"); @@ -1830,9 +1928,9 @@ ipmi_picmg_main (struct ipmi_intf * intf, int argc, char ** argv) } /* fru activation command */ - else if (!strncmp(argv[0], "activate", 8)) { + else if (!strcmp(argv[0], "activate")) { if (argc > 1) { - rc = ipmi_picmg_fru_activation(intf, argc-1, &(argv[1]), PICMG_FRU_ACTIVATE); + rc = ipmi_picmg_fru_activation(intf, &(argv[1]), PICMG_FRU_ACTIVATE); } else { lprintf(LOG_ERR, "Specify the FRU to activate."); @@ -1841,9 +1939,9 @@ ipmi_picmg_main (struct ipmi_intf * intf, int argc, char ** argv) } /* fru deactivation command */ - else if (!strncmp(argv[0], "deactivate", 10)) { + else if (!strcmp(argv[0], "deactivate")) { if (argc > 1) { - rc = ipmi_picmg_fru_activation(intf, argc-1, &(argv[1]), PICMG_FRU_DEACTIVATE); + rc = ipmi_picmg_fru_activation(intf, &(argv[1]), PICMG_FRU_DEACTIVATE); }else { lprintf(LOG_ERR, "Specify the FRU to deactivate."); return -1; @@ -1851,17 +1949,17 @@ ipmi_picmg_main (struct ipmi_intf * intf, int argc, char ** argv) } /* activation policy command */ - else if (!strncmp(argv[0], "policy", 6)) { + else if (!strcmp(argv[0], "policy")) { if (argc > 1) { - if (!strncmp(argv[1], "get", 3)) { + if (!strcmp(argv[1], "get")) { if (argc > 2) { - rc = ipmi_picmg_fru_activation_policy_get(intf, argc-1, &(argv[2])); + rc = ipmi_picmg_fru_activation_policy_get(intf, &(argv[2])); } else { lprintf(LOG_NOTICE, "usage: get <fruid>"); } - } else if (!strncmp(argv[1], "set", 3)) { + } else if (!strcmp(argv[1], "set")) { if (argc > 4) { - rc = ipmi_picmg_fru_activation_policy_set(intf, argc-1, &(argv[2])); + rc = ipmi_picmg_fru_activation_policy_set(intf, &(argv[2])); } else { lprintf(LOG_NOTICE, "usage: set <fruid> <lockmask> <lock>"); lprintf(LOG_NOTICE, @@ -1884,18 +1982,18 @@ ipmi_picmg_main (struct ipmi_intf * intf, int argc, char ** argv) } /* portstate command */ - else if (!strncmp(argv[0], "portstate", 9)) { + else if (!strcmp(argv[0], "portstate")) { lprintf(LOG_DEBUG,"PICMG: portstate API"); if (argc > 1) { - if (!strncmp(argv[1], "get", 3)) { + if (!strcmp(argv[1], "get")) { int32_t iface; uint8_t channel = 0; lprintf(LOG_DEBUG,"PICMG: get"); - if(!strncmp(argv[1], "getall", 6)) { + if(!strcmp(argv[1], "getall")) { for(iface=0;iface<=PICMG_EKEY_MAX_INTERFACE;iface++) { for(channel=1;channel<=PICMG_EKEY_MAX_CHANNEL;channel++) { if(!(( iface == FRU_PICMGEXT_DESIGN_IF_FABRIC ) && @@ -1907,7 +2005,7 @@ ipmi_picmg_main (struct ipmi_intf * intf, int argc, char ** argv) } } } - else if(!strncmp(argv[1], "getgranted", 10)) { + else if(!strcmp(argv[1], "getgranted")) { for(iface=0;iface<=PICMG_EKEY_MAX_INTERFACE;iface++) { for(channel=1;channel<=PICMG_EKEY_MAX_CHANNEL;channel++) { rc = ipmi_picmg_portstate_get(intf,iface,channel, @@ -1915,7 +2013,7 @@ ipmi_picmg_main (struct ipmi_intf * intf, int argc, char ** argv) } } } - else if(!strncmp(argv[1], "getdenied", 9)){ + else if(!strcmp(argv[1], "getdenied")){ for(iface=0;iface<=PICMG_EKEY_MAX_INTERFACE;iface++) { for(channel=1;channel<=PICMG_EKEY_MAX_CHANNEL;channel++) { rc = ipmi_picmg_portstate_get(intf,iface,channel, @@ -1938,7 +2036,7 @@ ipmi_picmg_main (struct ipmi_intf * intf, int argc, char ** argv) lprintf(LOG_NOTICE, "<intf> <chn>|getall|getgranted|getdenied"); } } - else if (!strncmp(argv[1], "set", 3)) { + else if (!strcmp(argv[1], "set")) { if (argc == 9) { int32_t interface = 0; int32_t port = 0; @@ -1981,18 +2079,18 @@ ipmi_picmg_main (struct ipmi_intf * intf, int argc, char ** argv) } } /* amc portstate command */ - else if (!strncmp(argv[0], "amcportstate", 12)) { + else if (!strcmp(argv[0], "amcportstate")) { lprintf(LOG_DEBUG,"PICMG: amcportstate API"); if (argc > 1) { - if (!strncmp(argv[1], "get", 3)){ + if (!strcmp(argv[1], "get")){ int32_t device; uint8_t channel; lprintf(LOG_DEBUG,"PICMG: get"); - if(!strncmp(argv[1], "getall", 6)){ + if(!strcmp(argv[1], "getall")){ int maxDevice = PICMG_EKEY_AMC_MAX_DEVICE; if( PicmgCardType != PICMG_CARD_TYPE_ATCA ){ maxDevice = 0; @@ -2004,7 +2102,7 @@ ipmi_picmg_main (struct ipmi_intf * intf, int argc, char ** argv) } } } - else if(!strncmp(argv[1], "getgranted", 10)){ + else if(!strcmp(argv[1], "getgranted")){ int maxDevice = PICMG_EKEY_AMC_MAX_DEVICE; if( PicmgCardType != PICMG_CARD_TYPE_ATCA ){ maxDevice = 0; @@ -2016,7 +2114,7 @@ ipmi_picmg_main (struct ipmi_intf * intf, int argc, char ** argv) } } } - else if(!strncmp(argv[1], "getdenied", 9)){ + else if(!strcmp(argv[1], "getdenied")){ int maxDevice = PICMG_EKEY_AMC_MAX_DEVICE; if( PicmgCardType != PICMG_CARD_TYPE_ATCA ){ maxDevice = 0; @@ -2049,7 +2147,7 @@ ipmi_picmg_main (struct ipmi_intf * intf, int argc, char ** argv) lprintf(LOG_NOTICE, "<chn> <device>|getall|getgranted|getdenied"); } } - else if (!strncmp(argv[1], "set", 3)) { + else if (!strcmp(argv[1], "set")) { if (argc > 7) { int32_t device = -1; int32_t port = 0; @@ -2096,35 +2194,35 @@ ipmi_picmg_main (struct ipmi_intf * intf, int argc, char ** argv) } } /* ATCA led commands */ - else if (!strncmp(argv[0], "led", 3)) { + else if (!strcmp(argv[0], "led")) { if (argc > 1) { - if (!strncmp(argv[1], "prop", 4)) { + if (!strcmp(argv[1], "prop")) { if (argc > 2) { - rc = ipmi_picmg_get_led_properties(intf, argc-1, &(argv[2])); + rc = ipmi_picmg_get_led_properties(intf, &(argv[2])); } else { lprintf(LOG_NOTICE, "led prop <FRU-ID>"); } } - else if (!strncmp(argv[1], "cap", 3)) { + else if (!strcmp(argv[1], "cap")) { if (argc > 3) { - rc = ipmi_picmg_get_led_capabilities(intf, argc-1, &(argv[2])); + rc = ipmi_picmg_get_led_capabilities(intf, &(argv[2])); } else { lprintf(LOG_NOTICE, "led cap <FRU-ID> <LED-ID>"); } } - else if (!strncmp(argv[1], "get", 3)) { + else if (!strcmp(argv[1], "get")) { if (argc > 3) { - rc = ipmi_picmg_get_led_state(intf, argc-1, &(argv[2])); + rc = ipmi_picmg_get_led_state(intf, &(argv[2])); } else { lprintf(LOG_NOTICE, "led get <FRU-ID> <LED-ID>"); } } - else if (!strncmp(argv[1], "set", 3)) { + else if (!strcmp(argv[1], "set")) { if (argc > 6) { - rc = ipmi_picmg_set_led_state(intf, argc-1, &(argv[2])); + rc = ipmi_picmg_set_led_state(intf, &(argv[2])); } else { lprintf(LOG_NOTICE, @@ -2164,11 +2262,11 @@ ipmi_picmg_main (struct ipmi_intf * intf, int argc, char ** argv) } } /* power commands */ - else if (!strncmp(argv[0], "power", 5)) { + else if (!strcmp(argv[0], "power")) { if (argc > 1) { - if (!strncmp(argv[1], "get", 3)) { + if (!strcmp(argv[1], "get")) { if (argc > 3) { - rc = ipmi_picmg_get_power_level(intf, argc-1, &(argv[2])); + rc = ipmi_picmg_get_power_level(intf, &(argv[2])); } else { lprintf(LOG_NOTICE, "power get <FRU-ID> <type>"); @@ -2181,9 +2279,9 @@ ipmi_picmg_main (struct ipmi_intf * intf, int argc, char ** argv) return -1; } } - else if (!strncmp(argv[1], "set", 3)) { + else if (!strcmp(argv[1], "set")) { if (argc > 4) { - rc = ipmi_picmg_set_power_level(intf, argc-1, &(argv[2])); + rc = ipmi_picmg_set_power_level(intf, &(argv[2])); } else { lprintf(LOG_NOTICE, "power set <FRU-ID> <level> <present-desired>"); @@ -2208,9 +2306,9 @@ ipmi_picmg_main (struct ipmi_intf * intf, int argc, char ** argv) return -1; } }/* clk commands*/ - else if (!strncmp(argv[0], "clk", 3)) { + else if (!strcmp(argv[0], "clk")) { if (argc > 1) { - if (!strncmp(argv[1], "get", 3)) { + if (!strcmp(argv[1], "get")) { int8_t clk_res = -1; uint8_t clk_id; uint8_t max_res = 15; @@ -2219,7 +2317,7 @@ ipmi_picmg_main (struct ipmi_intf * intf, int argc, char ** argv) max_res = 0; } - if(!strncmp(argv[1], "getall", 6)) { + if(!strcmp(argv[1], "getall")) { if( verbose ) { printf("Getting all clock state\n") ;} for(clk_res=0;clk_res<=max_res;clk_res++) { for(clk_id=0;clk_id<=15;clk_id++) { @@ -2228,7 +2326,7 @@ ipmi_picmg_main (struct ipmi_intf * intf, int argc, char ** argv) } } } - else if(!strncmp(argv[1], "getdenied", 6)) { + else if(!strcmp(argv[1], "getdenied")) { if( verbose ) { printf("Getting disabled clocks\n") ;} for(clk_res=0;clk_res<=max_res;clk_res++) { for(clk_id=0;clk_id<=15;clk_id++) { @@ -2237,7 +2335,7 @@ ipmi_picmg_main (struct ipmi_intf * intf, int argc, char ** argv) } } } - else if(!strncmp(argv[1], "getgranted", 6)) { + else if(!strcmp(argv[1], "getgranted")) { if( verbose ) { printf("Getting enabled clocks\n") ;} for(clk_res=0;clk_res<=max_res;clk_res++) { for(clk_id=0;clk_id<=15;clk_id++) { @@ -2266,7 +2364,7 @@ ipmi_picmg_main (struct ipmi_intf * intf, int argc, char ** argv) return -1; } } - else if (!strncmp(argv[1], "set", 3)) { + else if (!strcmp(argv[1], "set")) { if (argc > 7) { rc = ipmi_picmg_clk_set(intf, argc-1, &(argv[2])); } @@ -2330,7 +2428,7 @@ ipmi_picmg_ipmb_address(struct ipmi_intf *intf) { uint8_t picmg_discover(struct ipmi_intf *intf) { /* Check if PICMG extension is available to use the function - * GetDeviceLocator to retreive i2c address PICMG hack to set + * GetDeviceLocator to retrieve i2c address PICMG hack to set * right IPMB address, If extension is not supported, should * not give any problems * PICMG Extension Version 2.0 (PICMG 3.0 Revision 1.0 ATCA) to @@ -2353,13 +2451,13 @@ picmg_discover(struct ipmi_intf *intf) { req.msg.data_len = 1; msg_data = 0; - lprintf(LOG_INFO, "Running Get PICMG Properties my_addr %#x, transit %#x, target %#x", + lprintf(LOG_DEBUG, "Running Get PICMG Properties my_addr %#x, transit %#x, target %#x", intf->my_addr, intf->transit_addr, intf->target_addr); rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { - lprintf(LOG_INFO,"No response from Get PICMG Properties"); - } else if (rsp->ccode != 0) { - lprintf(LOG_INFO,"Error response %#x from Get PICMG Properities", + if (!rsp) { + lprintf(LOG_DEBUG,"No response from Get PICMG Properties"); + } else if (rsp->ccode) { + lprintf(LOG_DEBUG,"Error response %#x from Get PICMG Properties", rsp->ccode); } else if (rsp->data_len < 4) { lprintf(LOG_INFO,"Invalid Get PICMG Properties response length %d", @@ -2367,14 +2465,14 @@ picmg_discover(struct ipmi_intf *intf) { } else if (rsp->data[0] != 0) { lprintf(LOG_INFO,"Invalid Get PICMG Properties group extension %#x", rsp->data[0]); - } else if ((rsp->data[1] & 0x0F) != PICMG_EXTENSION_ATCA_MAJOR_VERSION - && (rsp->data[1] & 0x0F) != PICMG_EXTENSION_AMC0_MAJOR_VERSION - && (rsp->data[1] & 0x0F) != PICMG_EXTENSION_UTCA_MAJOR_VERSION) { + } else if ((rsp->data[1] & 0x0F) != PICMG_ATCA_MAJOR_VERSION + && (rsp->data[1] & 0x0F) != PICMG_AMC_MAJOR_VERSION + && (rsp->data[1] & 0x0F) != PICMG_UTCA_MAJOR_VERSION) { lprintf(LOG_INFO,"Unknown PICMG Extension Version %d.%d", (rsp->data[1] & 0x0F), (rsp->data[1] >> 4)); } else { picmg_avail = 1; - lprintf(LOG_INFO, "Discovered PICMG Extension Version %d.%d", + lprintf(LOG_DEBUG, "Discovered PICMG Extension Version %d.%d", (rsp->data[1] & 0x0f), (rsp->data[1] >> 4)); } diff --git a/lib/ipmi_quantaoem.c b/lib/ipmi_quantaoem.c new file mode 100644 index 0000000..0ddcefd --- /dev/null +++ b/lib/ipmi_quantaoem.c @@ -0,0 +1,184 @@ +/* + * Copyright (c) 2018 Quanta Computer Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * Redistribution of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * Redistribution in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * Neither the name of Quanta Computer Inc. or the names of + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * This software is provided "AS IS," without a warranty of any kind. + * ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, + * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. + * Quanta Computer Inc. AND ITS LICENSORS SHALL NOT BE LIABLE + * FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING + * OR DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL + * Quanta Computer Inc. OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, + * OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR + * PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF + * LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, + * EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + */ +#define _XOPEN_SOURCE + +#include <stdlib.h> +#include <stdio.h> +#include <string.h> +#include <strings.h> +#include <sys/socket.h> +#include <netinet/in.h> +#include <arpa/inet.h> +#include <errno.h> +#include <time.h> +#include <unistd.h> +#include <signal.h> +#include <ctype.h> +#include <sys/time.h> +#include <limits.h> +#include <fcntl.h> +#include <sys/select.h> +#include <termios.h> +#include <ipmitool/ipmi.h> +#include <ipmitool/ipmi_mc.h> +#include <ipmitool/ipmi_intf.h> +#include <ipmitool/helper.h> +#include <ipmitool/log.h> +#include <ipmitool/ipmi_sel.h> +#include <ipmitool/ipmi_sdr.h> +#include <ipmitool/ipmi_strings.h> +#include <ipmitool/ipmi_channel.h> +#include <ipmitool/ipmi_quantaoem.h> +#include <ipmitool/ipmi_raw.h> + +/* Max Size of the description String to be displyed for the Each sel entry */ +#define SIZE_OF_DESC 128 + +#define CPU_SHIFT 6 +#define CPU_MASK 0X03 +#define CPU_NUM(x) (((x) >> CPU_SHIFT) & CPU_MASK) + +#define CHANNEL_BASE 0x41 +#define CHANNEL_SHIFT 3 +#define CHANNEL_MASK 0x07 +#define CHANNEL_OFFSET(x) (((x) >> CHANNEL_SHIFT) & CHANNEL_MASK) +#define CHANNEL_NUM(x) (CHANNEL_BASE + CHANNEL_OFFSET(x)) + +#define DIMM_MASK 0x07 +#define DIMM_NUM(x) ((x) & DIMM_MASK) + +#define GET_PLATFORM_ID_DATA_SIZE 4 + +// Magic code to check if it's valid command +#define QCT_MAGIC_1 0x4C +#define QCT_MAGIC_2 0x1C +#define QCT_MAGIC_3 0x00 +#define QCT_MAGIC_4 0x02 + +qct_platform_t +oem_qct_get_platform_id(struct ipmi_intf *intf) +{ + /* Execute a Get platform ID command to determine the board */ + struct ipmi_rs *rsp; + struct ipmi_rq req; + qct_platform_t platform_id; + uint8_t msg_data[GET_PLATFORM_ID_DATA_SIZE]; + + /* Ask for IPMI v2 data as well */ + msg_data[0] = QCT_MAGIC_1; + msg_data[1] = QCT_MAGIC_2; + msg_data[2] = QCT_MAGIC_3; + msg_data[3] = QCT_MAGIC_4; + + memset(&req, 0, sizeof(req)); + req.msg.netfn = OEM_QCT_NETFN; + req.msg.cmd = OEM_QCT_GET_INFO; + req.msg.data = msg_data; + req.msg.data_len = sizeof(msg_data); + + rsp = intf->sendrecv(intf, &req); + if (!rsp) { + lprintf(LOG_ERR, "Get Platform ID command failed"); + return 0; + } + if (rsp->ccode) { + lprintf(LOG_ERR, "Get Platform ID command failed: %#x %s", + rsp->ccode, val2str(rsp->ccode, completion_code_vals)); + return 0; + } + platform_id = rsp->data[0]; + lprintf(LOG_DEBUG,"Platform ID: %hhx", rsp->data[0]); + return platform_id; +} + +char * +oem_qct_get_evt_desc(struct ipmi_intf *intf, struct sel_event_record *rec) +{ + struct ipmi_rs *rsp; + struct ipmi_rq req; + char *desc = NULL; + int data; + int sensor_type; + qct_platform_t platform_id; + + /* Get the OEM event Bytes of the SEL Records byte 15 to data */ + data = rec->sel_type.standard_type.event_data[2]; + /* Check for the Standard Event type == 0x6F */ + if (rec->sel_type.standard_type.event_type != 0x6F) { + goto out; + } + /* Allocate mem for the Description string */ + desc = malloc(SIZE_OF_DESC); + if (!desc) { + lprintf(LOG_ERR, "ipmitool: malloc failure"); + goto out; + } + memset(desc, 0, SIZE_OF_DESC); + sensor_type = rec->sel_type.standard_type.sensor_type; + switch (sensor_type) { + case SENSOR_TYPE_MEMORY: + memset(&req, 0, sizeof (req)); + req.msg.netfn = IPMI_NETFN_APP; + req.msg.lun = 0; + req.msg.cmd = BMC_GET_DEVICE_ID; + req.msg.data = NULL; + req.msg.data_len = 0; + + rsp = intf->sendrecv(intf, &req); + if (!rsp) { + lprintf(LOG_ERR, " Error getting system info"); + goto out; + } else if (rsp->ccode) { + lprintf(LOG_ERR, " Error getting system info: %s", + val2str(rsp->ccode, completion_code_vals)); + goto out; + } + /* check the platform type */ + platform_id = oem_qct_get_platform_id(intf); + if (OEM_QCT_PLATFORM_PURLEY == platform_id) { + snprintf(desc, SIZE_OF_DESC, "CPU%d_%c%d", + CPU_NUM(data), + CHANNEL_NUM(data), + DIMM_NUM(data)); + } + break; + default: + goto out; + } + return desc; +out: + if (desc) { + free(desc); + desc = NULL; + } + return desc; +} diff --git a/lib/ipmi_raw.c b/lib/ipmi_raw.c index 92c0177..a8a42a0 100644 --- a/lib/ipmi_raw.c +++ b/lib/ipmi_raw.c @@ -101,11 +101,11 @@ ipmi_master_write_read(struct ipmi_intf * intf, uint8_t bus, uint8_t addr, } rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "I2C Master Write-Read command failed"); return NULL; } - else if (rsp->ccode > 0) { + else if (rsp->ccode) { switch (rsp->ccode) { case 0x81: lprintf(LOG_ERR, "I2C Master Write-Read command failed: Lost Arbitration"); @@ -145,7 +145,7 @@ ipmi_rawspd_main(struct ipmi_intf * intf, int argc, char ** argv) memset(spd_data, 0, RAW_SPD_SIZE); - if (argc < 2 || strncmp(argv[0], "help", 4) == 0) { + if (argc < 2 || !strcmp(argv[0], "help")) { lprintf(LOG_NOTICE, "usage: spd <i2cbus> <i2caddr> [channel] [maxread]"); return 0; } @@ -171,7 +171,7 @@ ipmi_rawspd_main(struct ipmi_intf * intf, int argc, char ** argv) for (i = 0; i < RAW_SPD_SIZE; i+= msize) { rsp = ipmi_master_write_read(intf, i2cbus, i2caddr, (uint8_t *)&i, 1, msize ); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Unable to perform I2C Master Write-Read"); return -1; } @@ -190,6 +190,9 @@ static void rawi2c_usage(void) lprintf(LOG_NOTICE, " chan=0 is default, bus= must be specified to use chan="); } +#define BUS_KW "bus=" +#define CHAN_KW "chan=" + int ipmi_rawi2c_main(struct ipmi_intf * intf, int argc, char ** argv) { @@ -203,25 +206,25 @@ ipmi_rawi2c_main(struct ipmi_intf * intf, int argc, char ** argv) int i = 0; /* handle bus= argument */ - if (argc > 2 && strncmp(argv[0], "bus=", 4) == 0) { + if (argc > 2 && !strncmp(argv[0], BUS_KW, strlen(BUS_KW))) { i = 1; - if (strncmp(argv[0], "bus=public", 10) == 0) + if (!strcmp(argv[0], BUS_KW "public")) bus = 0; - else if (sscanf(argv[0], "bus=%u", &rbus) == 1) + else if (sscanf(argv[0], BUS_KW "%u", &rbus) == 1) bus = ((rbus & 7) << 1) | 1; else bus = 0; /* handle channel= argument * the bus= argument must be supplied first on command line */ - if (argc > 3 && strncmp(argv[1], "chan=", 5) == 0) { + if (argc > 3 && !strncmp(argv[1], CHAN_KW, strlen(CHAN_KW))) { i = 2; - if (sscanf(argv[1], "chan=%u", &rbus) == 1) + if (sscanf(argv[1], CHAN_KW "%u", &rbus) == 1) bus |= rbus << 4; } } - if ((argc-i) < 2 || strncmp(argv[0], "help", 4) == 0) { + if ((argc - i) < 2 || !strcmp(argv[0], "help")) { rawi2c_usage(); return 0; } @@ -259,7 +262,7 @@ ipmi_rawi2c_main(struct ipmi_intf * intf, int argc, char ** argv) printbuf(wdata, wsize, "WRITE DATA"); rsp = ipmi_master_write_read(intf, bus, i2caddr, wdata, wsize, rsize); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Unable to perform I2C Master Write-Read"); return -1; } @@ -322,7 +325,7 @@ ipmi_raw_main(struct ipmi_intf * intf, int argc, char ** argv) int i; uint8_t data[256]; - if (argc == 1 && strncmp(argv[0], "help", 4) == 0) { + if (argc == 1 && !strcmp(argv[0], "help")) { ipmi_raw_help(); return 0; } @@ -379,13 +382,13 @@ ipmi_raw_main(struct ipmi_intf * intf, int argc, char ** argv) rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Unable to send RAW command " "(channel=0x%x netfn=0x%x lun=0x%x cmd=0x%x)", intf->target_channel & 0x0f, req.msg.netfn, req.msg.lun, req.msg.cmd); return -1; } - if (rsp->ccode > 0) { + if (rsp->ccode) { lprintf(LOG_ERR, "Unable to send RAW command " "(channel=0x%x netfn=0x%x lun=0x%x cmd=0x%x rsp=0x%x): %s", intf->target_channel & 0x0f, req.msg.netfn, req.msg.lun, req.msg.cmd, rsp->ccode, @@ -417,7 +420,7 @@ ipmi_raw_main(struct ipmi_intf * intf, int argc, char ** argv) */ int is_valid_param(const char *input_param, uint8_t *uchr_ptr, const char *label) { - if (input_param == NULL || label == NULL) { + if (!input_param || !label) { lprintf(LOG_ERROR, "ERROR: NULL pointer passed."); return (-1); } diff --git a/lib/ipmi_sdr.c b/lib/ipmi_sdr.c index 2a9cbe3..42ae9f9 100644 --- a/lib/ipmi_sdr.c +++ b/lib/ipmi_sdr.c @@ -1,5 +1,6 @@ /* * Copyright (c) 2012 Hewlett-Packard Development Company, L.P. + * Copyright 2020 Joyent, Inc. * * Based on code from * Copyright (c) 2003 Sun Microsystems, Inc. All Rights Reserved. @@ -32,7 +33,6 @@ * LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, * EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. */ -#define _BSD_SOURCE #include <string.h> @@ -53,6 +53,7 @@ #include <ipmitool/ipmi_entity.h> #include <ipmitool/ipmi_constants.h> #include <ipmitool/ipmi_strings.h> +#include <ipmitool/ipmi_time.h> #if HAVE_CONFIG_H # include <config.h> @@ -68,41 +69,211 @@ static struct sdr_record_list *sdr_list_head = NULL; static struct sdr_record_list *sdr_list_tail = NULL; static struct ipmi_sdr_iterator *sdr_list_itr = NULL; -void printf_sdr_usage(); +/* IPMI 2.0 Table 43-15, Sensor Unit Type Codes */ +#define UNIT_TYPE_MAX 92 /* This is the ID of "grams" */ +#define UNIT_TYPE_LONGEST_NAME 19 /* This is the length of "color temp deg K" */ +static const char *unit_desc[] = { + "unspecified", + "degrees C", + "degrees F", + "degrees K", + "Volts", + "Amps", + "Watts", + "Joules", + "Coulombs", + "VA", + "Nits", + "lumen", + "lux", + "Candela", + "kPa", + "PSI", + "Newton", + "CFM", + "RPM", + "Hz", + "microsecond", + "millisecond", + "second", + "minute", + "hour", + "day", + "week", + "mil", + "inches", + "feet", + "cu in", + "cu feet", + "mm", + "cm", + "m", + "cu cm", + "cu m", + "liters", + "fluid ounce", + "radians", + "steradians", + "revolutions", + "cycles", + "gravities", + "ounce", + "pound", + "ft-lb", + "oz-in", + "gauss", + "gilberts", + "henry", + "millihenry", + "farad", + "microfarad", + "ohms", + "siemens", + "mole", + "becquerel", + "PPM", + "reserved", + "Decibels", + "DbA", + "DbC", + "gray", + "sievert", + "color temp deg K", + "bit", + "kilobit", + "megabit", + "gigabit", + "byte", + "kilobyte", + "megabyte", + "gigabyte", + "word", + "dword", + "qword", + "line", + "hit", + "miss", + "retry", + "reset", + "overflow", + "underrun", + "collision", + "packets", + "messages", + "characters", + "error", + "correctable error", + "uncorrectable error", + "fatal error", + "grams" +}; + +/* sensor type codes (IPMI v1.5 table 36.3) + / Updated to v2.0 Table 42-3, Sensor Type Codes */ +static const char *sensor_type_desc[] = { + "reserved", + "Temperature", + "Voltage", + "Current", + "Fan", + "Physical Security", + "Platform Security", + "Processor", + "Power Supply", + "Power Unit", + "Cooling Device", + "Other", + "Memory", + "Drive Slot / Bay", + "POST Memory Resize", + "System Firmwares", + "Event Logging Disabled", + "Watchdog1", + "System Event", + "Critical Interrupt", + "Button", + "Module / Board", + "Microcontroller", + "Add-in Card", + "Chassis", + "Chip Set", + "Other FRU", + "Cable / Interconnect", + "Terminator", + "System Boot Initiated", + "Boot Error", + "OS Boot", + "OS Critical Stop", + "Slot / Connector", + "System ACPI Power State", + "Watchdog2", + "Platform Alert", + "Entity Presence", + "Monitor ASIC", + "LAN", + "Management Subsys Health", + "Battery", + "Session Audit", + "Version Change", + "FRU State" +}; -/* From src/plugins/ipmi_intf.c: */ -uint16_t -ipmi_intf_get_max_response_data_size(struct ipmi_intf * intf); +void printf_sdr_usage(); -/* ipmi_sdr_get_unit_string - return units for base/modifier +/** ipmi_sdr_get_unit_string - return units for base/modifier * - * @pct: units are a percentage - * @type: unit type - * @base: base - * @modifier: modifier + * @param[in] pct Indicates that units are a percentage + * @param[in] relation Modifier unit to base unit relation + * (SDR_UNIT_MOD_NONE, SDR_UNIT_MOD_MUL, + * or SDR_UNIT_MOD_DIV) + * @param[in] base The base unit type id + * @param[in] modifier The modifier unit type id * - * returns pointer to static string + * @returns a pointer to static string */ const char * -ipmi_sdr_get_unit_string(uint8_t pct, uint8_t type, uint8_t base, uint8_t modifier) +ipmi_sdr_get_unit_string(bool pct, uint8_t relation, + uint8_t base, uint8_t modifier) { - static char unitstr[16]; + /* + * Twice as long as the longest possible unit name, plus + * two characters for '%' and relation (either '*' or '/'), + * plus the terminating null-byte. + */ + static char unitstr[2 * UNIT_TYPE_LONGEST_NAME + 2 + 1]; + /* * By default, if units are supposed to be percent, we will pre-pend * the percent string to the textual representation of the units. */ - char *pctstr = pct ? "% " : ""; - memset(unitstr, 0, sizeof (unitstr)); - switch (type) { - case 2: - snprintf(unitstr, sizeof (unitstr), "%s%s * %s", - pctstr, unit_desc[base], unit_desc[modifier]); + const char *pctstr = pct ? "% " : ""; + const char *basestr; + const char *modstr; + + if (base <= UNIT_TYPE_MAX) { + basestr = unit_desc[base]; + } + else { + basestr = "invalid"; + } + + if (modifier <= UNIT_TYPE_MAX) { + modstr = unit_desc[modifier]; + } + else { + modstr = "invalid"; + } + + switch (relation) { + case SDR_UNIT_MOD_MUL: + snprintf(unitstr, sizeof (unitstr), "%s%s*%s", + pctstr, basestr, modstr); break; - case 1: + case SDR_UNIT_MOD_DIV: snprintf(unitstr, sizeof (unitstr), "%s%s/%s", - pctstr, unit_desc[base], unit_desc[modifier]); + pctstr, basestr, modstr); break; - case 0: + case SDR_UNIT_MOD_NONE: default: /* * Display the text "percent" only when the Base unit is @@ -111,8 +282,8 @@ ipmi_sdr_get_unit_string(uint8_t pct, uint8_t type, uint8_t base, uint8_t modifi if (base == 0 && pct) { snprintf(unitstr, sizeof(unitstr), "percent"); } else { - snprintf(unitstr, sizeof (unitstr), "%s%s", - pctstr, unit_desc[base]); + snprintf(unitstr, sizeof (unitstr), "%s%s", + pctstr, basestr); } break; } @@ -138,8 +309,8 @@ sdr_sensor_has_analog_reading(struct ipmi_intf *intf, * But... HP didn't interpret this as meaning that "Only Threshold * Sensors" can provide analog readings. So, HP packed analog * readings into some of their non-Threshold Sensor. There is - * nothing that explictly prohibits this in the spec, so if - * an Analog reading is available in a Non-Threshod sensor and + * nothing that explicitly prohibits this in the spec, so if + * an Analog reading is available in a Non-Threshold sensor and * there are units specified for identifying the reading then * we do an analog conversion even though the sensor is * non-Threshold. To be safe, we provide this extension for @@ -205,7 +376,7 @@ sdr_convert_sensor_reading(struct sdr_record_full_sensor *sensor, uint8_t val) case 1: if (val & 0x80) val++; - /* Deliberately fall through to case 2. */ + /* fall through */ case 2: result = (double) (((m * (int8_t) val) + (b * pow(10, k1))) * pow(10, k2)); @@ -285,7 +456,7 @@ sdr_convert_sensor_hysterisis(struct sdr_record_full_sensor *sensor, uint8_t val case 1: if (val & 0x80) val++; - /* Deliberately fall through to case 2. */ + /* fall through */ case 2: result = (double) (((m * (int8_t) val) ) * pow(10, k2)); break; @@ -360,7 +531,7 @@ sdr_convert_sensor_tolerance(struct sdr_record_full_sensor *sensor, uint8_t val) case 1: if (val & 0x80) val++; - /* Deliberately fall through to case 2. */ + /* fall through */ case 2: result = (double) (((m * ((double)((int8_t) val)/2))) * pow(10, k2)); break; @@ -691,7 +862,7 @@ ipmi_sdr_get_sensor_event_enable(struct ipmi_intf *intf, uint8_t sensor, /* ipmi_sdr_get_thresh_status - threshold status indicator * - * @rsp: response from Get Sensor Reading comand + * @rsp: response from Get Sensor Reading command * @validread: validity of the status field argument * @invalidstr: string to return if status field is not valid * @@ -756,7 +927,7 @@ ipmi_sdr_get_thresh_status(struct sensor_reading *sr, const char *invalidstr) return "ok"; } -/* ipmi_sdr_get_header - retreive SDR record header +/* ipmi_sdr_get_header - retrieve SDR record header * * @intf: ipmi interface * @itr: sdr iterator @@ -793,7 +964,7 @@ ipmi_sdr_get_header(struct ipmi_intf *intf, struct ipmi_sdr_iterator *itr) for (try = 0; try < 5; try++) { sdr_rq.reserve_id = itr->reservation; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Get SDR %04x command failed", itr->next); continue; @@ -811,7 +982,7 @@ ipmi_sdr_get_header(struct ipmi_intf *intf, struct ipmi_sdr_iterator *itr) "Unable to renew SDR reservation"); return NULL; } - } else if (rsp->ccode > 0) { + } else if (rsp->ccode) { lprintf(LOG_ERR, "Get SDR %04x command failed: %s", itr->next, val2str(rsp->ccode, completion_code_vals)); @@ -859,7 +1030,7 @@ ipmi_sdr_get_header(struct ipmi_intf *intf, struct ipmi_sdr_iterator *itr) return &sdr_rs; } -/* ipmi_sdr_get_next_header - retreive next SDR header +/* ipmi_sdr_get_next_header - retrieve next SDR header * * @intf: ipmi interface * @itr: sdr iterator @@ -876,7 +1047,7 @@ ipmi_sdr_get_next_header(struct ipmi_intf *intf, struct ipmi_sdr_iterator *itr) return NULL; header = ipmi_sdr_get_header(intf, itr); - if (header == NULL) + if (!header) return NULL; itr->next = header->next; @@ -959,13 +1130,13 @@ ipmi_sdr_print_sensor_event_status(struct ipmi_intf *intf, rsp = ipmi_sdr_get_sensor_event_status(intf, sensor_num, target, lun, channel); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_DEBUG, "Error reading event status for sensor #%02x", sensor_num); return -1; } - if (rsp->ccode > 0) { + if (rsp->ccode) { lprintf(LOG_DEBUG, "Error reading event status for sensor #%02x: %s", sensor_num, val2str(rsp->ccode, completion_code_vals)); @@ -1173,13 +1344,13 @@ ipmi_sdr_print_sensor_event_enable(struct ipmi_intf *intf, rsp = ipmi_sdr_get_sensor_event_enable(intf, sensor_num, target, lun, channel); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_DEBUG, "Error reading event enable for sensor #%02x", sensor_num); return -1; } - if (rsp->ccode > 0) { + if (rsp->ccode) { lprintf(LOG_DEBUG, "Error reading event enable for sensor #%02x: %s", sensor_num, val2str(rsp->ccode, completion_code_vals)); @@ -1399,7 +1570,7 @@ ipmi_sdr_read_sensor_value(struct ipmi_intf *intf, { static struct sensor_reading sr; - if (sensor == NULL) + if (!sensor) return NULL; /* Initialize to reading valid value of zero */ @@ -1439,7 +1610,7 @@ ipmi_sdr_read_sensor_value(struct ipmi_intf *intf, sr.s_a_units = ""; /* no converted analog units units */ - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_DEBUG, "Error reading sensor %s (#%02x)", sr.s_id, sensor->keys.sensor_num); return &sr; @@ -1525,7 +1696,7 @@ ipmi_sdr_print_sensor_fc(struct ipmi_intf *intf, sr = ipmi_sdr_read_sensor_value(intf, sensor, sdr_record_type, 2); - if (sr == NULL) + if (!sr) return -1; target = sensor->keys.owner_id; @@ -1978,7 +2149,7 @@ ipmi_sdr_print_discrete_state_mini(struct ipmi_intf *intf, printf("%s", header); for (evt = ipmi_get_first_event_sensor_type(intf, sensor_type, event_type); - evt != NULL; evt = ipmi_get_next_event_sensor_type(evt)) { + evt; evt = ipmi_get_next_event_sensor_type(evt)) { if (evt->data != 0xFF) { continue; } @@ -2028,7 +2199,7 @@ ipmi_sdr_print_discrete_state(struct ipmi_intf *intf, const char *desc, return; for (evt = ipmi_get_first_event_sensor_type(intf, sensor_type, event_type); - evt != NULL; evt = ipmi_get_next_event_sensor_type(evt)) { + evt; evt = ipmi_get_next_event_sensor_type(evt)) { if (evt->data != 0xFF) { continue; } @@ -2080,11 +2251,11 @@ ipmi_sdr_print_sensor_eventonly(struct ipmi_intf *intf, { char desc[17]; - if (sensor == NULL) + if (!sensor) return -1; memset(desc, 0, sizeof (desc)); - snprintf(desc, (sensor->id_code & 0x1f) + 1, "%s", sensor->id_string); + snprintf(desc, sizeof(desc), "%.*s", (sensor->id_code & 0x1f) + 1, sensor->id_string); if (verbose) { printf("Sensor ID : %s (0x%x)\n", @@ -2119,23 +2290,21 @@ ipmi_sdr_print_sensor_eventonly(struct ipmi_intf *intf, /* ipmi_sdr_print_sensor_mc_locator - print SDR MC locator record * - * @intf: ipmi interface * @mc: mc locator sdr record * * returns 0 on success * returns -1 on error */ int -ipmi_sdr_print_sensor_mc_locator(struct ipmi_intf *intf, - struct sdr_record_mc_locator *mc) +ipmi_sdr_print_sensor_mc_locator(struct sdr_record_mc_locator *mc) { char desc[17]; - if (mc == NULL) + if (!mc) return -1; memset(desc, 0, sizeof (desc)); - snprintf(desc, (mc->id_code & 0x1f) + 1, "%s", mc->id_string); + snprintf(desc, sizeof(desc), "%.*s", (mc->id_code & 0x1f) + 1, mc->id_string); if (verbose == 0) { if (csv_output) @@ -2215,20 +2384,18 @@ ipmi_sdr_print_sensor_mc_locator(struct ipmi_intf *intf, /* ipmi_sdr_print_sensor_generic_locator - print generic device locator record * - * @intf: ipmi interface * @gen: generic device locator sdr record * * returns 0 on success * returns -1 on error */ int -ipmi_sdr_print_sensor_generic_locator(struct ipmi_intf *intf, - struct sdr_record_generic_locator *dev) +ipmi_sdr_print_sensor_generic_locator(struct sdr_record_generic_locator *dev) { char desc[17]; memset(desc, 0, sizeof (desc)); - snprintf(desc, (dev->id_code & 0x1f) + 1, "%s", dev->id_string); + snprintf(desc, sizeof(desc), "%.*s", (dev->id_code & 0x1f) + 1, dev->id_string); if (!verbose) { if (csv_output) @@ -2272,20 +2439,18 @@ ipmi_sdr_print_sensor_generic_locator(struct ipmi_intf *intf, /* ipmi_sdr_print_sensor_fru_locator - print FRU locator record * - * @intf: ipmi interface * @fru: fru locator sdr record * * returns 0 on success * returns -1 on error */ int -ipmi_sdr_print_sensor_fru_locator(struct ipmi_intf *intf, - struct sdr_record_fru_locator *fru) +ipmi_sdr_print_sensor_fru_locator(struct sdr_record_fru_locator *fru) { char desc[17]; memset(desc, 0, sizeof (desc)); - snprintf(desc, (fru->id_code & 0x1f) + 1, "%s", fru->id_string); + snprintf(desc, sizeof(desc), "%.*s", (fru->id_code & 0x1f) + 1, fru->id_string); if (!verbose) { if (csv_output) @@ -2329,32 +2494,15 @@ ipmi_sdr_print_sensor_fru_locator(struct ipmi_intf *intf, return 0; } -/* ipmi_sdr_print_sensor_entity_assoc - print SDR entity association record - * - * @intf: ipmi interface - * @mc: entity association sdr record - * - * returns 0 on success - * returns -1 on error - */ -int -ipmi_sdr_print_sensor_entity_assoc(struct ipmi_intf *intf, - struct sdr_record_entity_assoc *assoc) -{ - return 0; -} - /* ipmi_sdr_print_sensor_oem_intel - print Intel OEM sensors * - * @intf: ipmi interface * @oem: oem sdr record * * returns 0 on success * returns -1 on error */ static int -ipmi_sdr_print_sensor_oem_intel(struct ipmi_intf *intf, - struct sdr_record_oem *oem) +ipmi_sdr_print_sensor_oem_intel(struct sdr_record_oem *oem) { switch (oem->data[3]) { /* record sub-type */ case 0x02: /* Power Unit Map */ @@ -2435,20 +2583,19 @@ ipmi_sdr_print_sensor_oem_intel(struct ipmi_intf *intf, * a particular BMC might stuff into its OEM records. The * records are keyed off manufacturer ID and record subtypes. * - * @intf: ipmi interface * @oem: oem sdr record * * returns 0 on success * returns -1 on error */ static int -ipmi_sdr_print_sensor_oem(struct ipmi_intf *intf, struct sdr_record_oem *oem) +ipmi_sdr_print_sensor_oem(struct sdr_record_oem *oem) { int rc = 0; - if (oem == NULL) + if (!oem) return -1; - if (oem->data_len == 0 || oem->data == NULL) + if (oem->data_len == 0 || !oem->data) return -1; if (verbose > 2) @@ -2457,7 +2604,7 @@ ipmi_sdr_print_sensor_oem(struct ipmi_intf *intf, struct sdr_record_oem *oem) /* intel manufacturer id */ if (oem->data[0] == 0x57 && oem->data[1] == 0x01 && oem->data[2] == 0x00) { - rc = ipmi_sdr_print_sensor_oem_intel(intf, oem); + rc = ipmi_sdr_print_sensor_oem_intel(oem); } return rc; @@ -2465,7 +2612,6 @@ ipmi_sdr_print_sensor_oem(struct ipmi_intf *intf, struct sdr_record_oem *oem) /* ipmi_sdr_print_name_from_rawentry - Print SDR name from raw data * - * @intf: ipmi interface * @type: sensor type * @raw: raw sensor data * @@ -2473,7 +2619,7 @@ ipmi_sdr_print_sensor_oem(struct ipmi_intf *intf, struct sdr_record_oem *oem) * returns -1 on error */ int -ipmi_sdr_print_name_from_rawentry(struct ipmi_intf *intf, uint16_t id, +ipmi_sdr_print_name_from_rawentry(uint16_t id, uint8_t type, uint8_t *raw) { union { @@ -2489,35 +2635,43 @@ ipmi_sdr_print_name_from_rawentry(struct ipmi_intf *intf, uint16_t id, int rc =0; char desc[17]; + const char *id_string; + uint8_t id_code; memset(desc, ' ', sizeof (desc)); switch ( type) { case SDR_RECORD_TYPE_FULL_SENSOR: record.full = (struct sdr_record_full_sensor *) raw; - snprintf(desc, (record.full->id_code & 0x1f) +1, "%s", - (const char *)record.full->id_string); + id_code = record.full->id_code; + id_string = record.full->id_string; break; + case SDR_RECORD_TYPE_COMPACT_SENSOR: record.compact = (struct sdr_record_compact_sensor *) raw ; - snprintf(desc, (record.compact->id_code & 0x1f) +1, "%s", - (const char *)record.compact->id_string); + id_code = record.compact->id_code; + id_string = record.compact->id_string; break; + case SDR_RECORD_TYPE_EVENTONLY_SENSOR: record.eventonly = (struct sdr_record_eventonly_sensor *) raw ; - snprintf(desc, (record.eventonly->id_code & 0x1f) +1, "%s", - (const char *)record.eventonly->id_string); - break; + id_code = record.eventonly->id_code; + id_string = record.eventonly->id_string; + break; + case SDR_RECORD_TYPE_MC_DEVICE_LOCATOR: record.mcloc = (struct sdr_record_mc_locator *) raw ; - snprintf(desc, (record.mcloc->id_code & 0x1f) +1, "%s", - (const char *)record.mcloc->id_string); + id_code = record.mcloc->id_code; + id_string = record.mcloc->id_string; break; + default: rc = -1; - break; - } + } + if (!rc) { + snprintf(desc, sizeof(desc), "%.*s", (id_code & 0x1f) + 1, id_string); + } - lprintf(LOG_INFO, "ID: 0x%04x , NAME: %-16s", id, desc); + lprintf(LOG_INFO, "ID: 0x%04x , NAME: %-16s", id, desc); return rc; } @@ -2551,35 +2705,27 @@ ipmi_sdr_print_rawentry(struct ipmi_intf *intf, uint8_t type, *) raw); break; case SDR_RECORD_TYPE_GENERIC_DEVICE_LOCATOR: - rc = ipmi_sdr_print_sensor_generic_locator(intf, - (struct + rc = ipmi_sdr_print_sensor_generic_locator((struct sdr_record_generic_locator *) raw); break; case SDR_RECORD_TYPE_FRU_DEVICE_LOCATOR: - rc = ipmi_sdr_print_sensor_fru_locator(intf, - (struct + rc = ipmi_sdr_print_sensor_fru_locator((struct sdr_record_fru_locator *) raw); break; case SDR_RECORD_TYPE_MC_DEVICE_LOCATOR: - rc = ipmi_sdr_print_sensor_mc_locator(intf, - (struct + rc = ipmi_sdr_print_sensor_mc_locator((struct sdr_record_mc_locator *) raw); break; case SDR_RECORD_TYPE_ENTITY_ASSOC: - rc = ipmi_sdr_print_sensor_entity_assoc(intf, - (struct - sdr_record_entity_assoc - *) raw); break; case SDR_RECORD_TYPE_OEM:{ struct sdr_record_oem oem; oem.data = raw; oem.data_len = len; - rc = ipmi_sdr_print_sensor_oem(intf, - (struct sdr_record_oem *) + rc = ipmi_sdr_print_sensor_oem((struct sdr_record_oem *) &oem); break; } @@ -2616,24 +2762,19 @@ ipmi_sdr_print_listentry(struct ipmi_intf *intf, struct sdr_record_list *entry) entry->record.eventonly); break; case SDR_RECORD_TYPE_GENERIC_DEVICE_LOCATOR: - rc = ipmi_sdr_print_sensor_generic_locator(intf, - entry->record. + rc = ipmi_sdr_print_sensor_generic_locator(entry->record. genloc); break; case SDR_RECORD_TYPE_FRU_DEVICE_LOCATOR: - rc = ipmi_sdr_print_sensor_fru_locator(intf, - entry->record.fruloc); + rc = ipmi_sdr_print_sensor_fru_locator(entry->record.fruloc); break; case SDR_RECORD_TYPE_MC_DEVICE_LOCATOR: - rc = ipmi_sdr_print_sensor_mc_locator(intf, - entry->record.mcloc); + rc = ipmi_sdr_print_sensor_mc_locator(entry->record.mcloc); break; case SDR_RECORD_TYPE_ENTITY_ASSOC: - rc = ipmi_sdr_print_sensor_entity_assoc(intf, - entry->record.entassoc); break; case SDR_RECORD_TYPE_OEM: - rc = ipmi_sdr_print_sensor_oem(intf, entry->record.oem); + rc = ipmi_sdr_print_sensor_oem(entry->record.oem); break; case SDR_RECORD_TYPE_DEVICE_ENTITY_ASSOC: case SDR_RECORD_TYPE_MC_CONFIRMATION: @@ -2662,15 +2803,15 @@ ipmi_sdr_print_sdr(struct ipmi_intf *intf, uint8_t type) lprintf(LOG_DEBUG, "Querying SDR for sensor list"); - if (sdr_list_itr == NULL) { + if (!sdr_list_itr) { sdr_list_itr = ipmi_sdr_start(intf, 0); - if (sdr_list_itr == NULL) { + if (!sdr_list_itr) { lprintf(LOG_ERR, "Unable to open SDR for reading"); return -1; } } - for (e = sdr_list_head; e != NULL; e = e->next) { + for (e = sdr_list_head; e; e = e->next) { if (type != e->type && type != 0xff && type != 0xfe) continue; if (type == 0xfe && @@ -2681,21 +2822,21 @@ ipmi_sdr_print_sdr(struct ipmi_intf *intf, uint8_t type) rc = -1; } - while ((header = ipmi_sdr_get_next_header(intf, sdr_list_itr)) != NULL) { + while ((header = ipmi_sdr_get_next_header(intf, sdr_list_itr))) { uint8_t *rec; struct sdr_record_list *sdrr; rec = ipmi_sdr_get_record(intf, header, sdr_list_itr); - if (rec == NULL) { + if (!rec) { lprintf(LOG_ERR, "ipmitool: ipmi_sdr_get_record() failed"); rc = -1; continue; } sdrr = malloc(sizeof (struct sdr_record_list)); - if (sdrr == NULL) { + if (!sdrr) { lprintf(LOG_ERR, "ipmitool: malloc failure"); - if (rec != NULL) { + if (rec) { free(rec); rec = NULL; } @@ -2734,7 +2875,7 @@ ipmi_sdr_print_sdr(struct ipmi_intf *intf, uint8_t type) default: free(rec); rec = NULL; - if (sdrr != NULL) { + if (sdrr) { free(sdrr); sdrr = NULL; } @@ -2753,7 +2894,7 @@ ipmi_sdr_print_sdr(struct ipmi_intf *intf, uint8_t type) } /* add to global record liset */ - if (sdr_list_head == NULL) + if (!sdr_list_head) sdr_list_head = sdrr; else sdr_list_tail->next = sdrr; @@ -2792,9 +2933,9 @@ ipmi_sdr_get_reservation(struct ipmi_intf *intf, int use_builtin, rsp = intf->sendrecv(intf, &req); /* be slient for errors, they are handled by calling function */ - if (rsp == NULL) + if (!rsp) return -1; - if (rsp->ccode > 0) + if (rsp->ccode) return -1; *reserve_id = ((struct sdr_reserve_repo_rs *) &(rsp->data))->reserve_id; @@ -2820,7 +2961,7 @@ ipmi_sdr_start(struct ipmi_intf *intf, int use_builtin) struct ipm_devid_rsp *devid; itr = malloc(sizeof (struct ipmi_sdr_iterator)); - if (itr == NULL) { + if (!itr) { lprintf(LOG_ERR, "ipmitool: malloc failure"); return NULL; } @@ -2833,13 +2974,13 @@ ipmi_sdr_start(struct ipmi_intf *intf, int use_builtin) rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Get Device ID command failed"); free(itr); itr = NULL; return NULL; } - if (rsp->ccode > 0) { + if (rsp->ccode) { lprintf(LOG_ERR, "Get Device ID command failed: %#x %s", rsp->ccode, val2str(rsp->ccode, completion_code_vals)); free(itr); @@ -2875,13 +3016,13 @@ ipmi_sdr_start(struct ipmi_intf *intf, int use_builtin) req.msg.cmd = GET_SDR_REPO_INFO; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Error obtaining SDR info"); free(itr); itr = NULL; return NULL; } - if (rsp->ccode > 0) { + if (rsp->ccode) { lprintf(LOG_ERR, "Error obtaining SDR info: %s", val2str(rsp->ccode, completion_code_vals)); free(itr); @@ -2973,7 +3114,7 @@ ipmi_sdr_get_record(struct ipmi_intf * intf, struct sdr_get_rs * header, return NULL; data = malloc(len + 1); - if (data == NULL) { + if (!data) { lprintf(LOG_ERR, "ipmitool: malloc failure"); return NULL; } @@ -3019,7 +3160,8 @@ ipmi_sdr_get_record(struct ipmi_intf * intf, struct sdr_get_rs * header, sdr_rq.length, sdr_rq.offset); rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + + if (!rsp || rsp->ccode == IPMI_CC_CANT_RET_NUM_REQ_BYTES) { sdr_max_read_len = sdr_rq.length - 1; if (sdr_max_read_len > 0) { /* no response may happen if requests are bridged @@ -3030,14 +3172,7 @@ ipmi_sdr_get_record(struct ipmi_intf * intf, struct sdr_get_rs * header, data = NULL; return NULL; } - } - - switch (rsp->ccode) { - case 0xca: - /* read too many bytes at once */ - sdr_max_read_len = sdr_rq.length - 1; - continue; - case 0xc5: + } else if (rsp->ccode == IPMI_CC_RES_CANCELED) { /* lost reservation */ lprintf(LOG_DEBUG, "SDR reservation cancelled. " "Sleeping a bit and retrying..."); @@ -3055,14 +3190,14 @@ ipmi_sdr_get_record(struct ipmi_intf * intf, struct sdr_get_rs * header, } /* special completion codes handled above */ - if (rsp->ccode > 0 || rsp->data_len == 0) { + if (rsp->ccode || rsp->data_len == 0) { free(data); data = NULL; return NULL; } memcpy(data + i, rsp->data + 2, sdr_rq.length); - i += sdr_max_read_len; + i += sdr_rq.length; } return data; @@ -3070,13 +3205,12 @@ ipmi_sdr_get_record(struct ipmi_intf * intf, struct sdr_get_rs * header, /* ipmi_sdr_end - cleanup SDR iterator * - * @intf: ipmi interface * @itr: SDR iterator * * no meaningful return code */ void -ipmi_sdr_end(struct ipmi_intf *intf, struct ipmi_sdr_iterator *itr) +ipmi_sdr_end(struct ipmi_sdr_iterator *itr) { if (itr) { free(itr); @@ -3098,11 +3232,11 @@ __sdr_list_add(struct sdr_record_list *head, struct sdr_record_list *entry) struct sdr_record_list *e; struct sdr_record_list *new; - if (head == NULL) + if (!head) return -1; new = malloc(sizeof (struct sdr_record_list)); - if (new == NULL) { + if (!new) { lprintf(LOG_ERR, "ipmitool: malloc failure"); return -1; } @@ -3127,7 +3261,7 @@ static void __sdr_list_empty(struct sdr_record_list *head) { struct sdr_record_list *e, *f; - for (e = head; e != NULL; e = f) { + for (e = head; e; e = f) { f = e->next; free(e); e = NULL; @@ -3137,18 +3271,16 @@ __sdr_list_empty(struct sdr_record_list *head) /* ipmi_sdr_list_empty - clean global SDR list * - * @intf: ipmi interface - * * no meaningful return code */ void -ipmi_sdr_list_empty(struct ipmi_intf *intf) +ipmi_sdr_list_empty(void) { struct sdr_record_list *list, *next; - ipmi_sdr_end(intf, sdr_list_itr); + ipmi_sdr_end(sdr_list_itr); - for (list = sdr_list_head; list != NULL; list = next) { + for (list = sdr_list_head; list; list = next) { switch (list->type) { case SDR_RECORD_TYPE_FULL_SENSOR: case SDR_RECORD_TYPE_COMPACT_SENSOR: @@ -3215,16 +3347,16 @@ ipmi_sdr_find_sdr_bynumtype(struct ipmi_intf *intf, uint16_t gen_id, uint8_t num struct sdr_record_list *e; int found = 0; - if (sdr_list_itr == NULL) { + if (!sdr_list_itr) { sdr_list_itr = ipmi_sdr_start(intf, 0); - if (sdr_list_itr == NULL) { + if (!sdr_list_itr) { lprintf(LOG_ERR, "Unable to open SDR for reading"); return NULL; } } /* check what we've already read */ - for (e = sdr_list_head; e != NULL; e = e->next) { + for (e = sdr_list_head; e; e = e->next) { switch (e->type) { case SDR_RECORD_TYPE_FULL_SENSOR: case SDR_RECORD_TYPE_COMPACT_SENSOR: @@ -3243,12 +3375,12 @@ ipmi_sdr_find_sdr_bynumtype(struct ipmi_intf *intf, uint16_t gen_id, uint8_t num } /* now keep looking */ - while ((header = ipmi_sdr_get_next_header(intf, sdr_list_itr)) != NULL) { + while ((header = ipmi_sdr_get_next_header(intf, sdr_list_itr))) { uint8_t *rec; struct sdr_record_list *sdrr; sdrr = malloc(sizeof (struct sdr_record_list)); - if (sdrr == NULL) { + if (!sdrr) { lprintf(LOG_ERR, "ipmitool: malloc failure"); break; } @@ -3257,8 +3389,8 @@ ipmi_sdr_find_sdr_bynumtype(struct ipmi_intf *intf, uint16_t gen_id, uint8_t num sdrr->type = header->type; rec = ipmi_sdr_get_record(intf, header, sdr_list_itr); - if (rec == NULL) { - if (sdrr != NULL) { + if (!rec) { + if (sdrr) { free(sdrr); sdrr = NULL; } @@ -3302,7 +3434,7 @@ ipmi_sdr_find_sdr_bynumtype(struct ipmi_intf *intf, uint16_t gen_id, uint8_t num default: free(rec); rec = NULL; - if (sdrr != NULL) { + if (sdrr) { free(sdrr); sdrr = NULL; } @@ -3310,7 +3442,7 @@ ipmi_sdr_find_sdr_bynumtype(struct ipmi_intf *intf, uint16_t gen_id, uint8_t num } /* put in the global record list */ - if (sdr_list_head == NULL) + if (!sdr_list_head) sdr_list_head = sdrr; else sdr_list_tail->next = sdrr; @@ -3339,9 +3471,9 @@ ipmi_sdr_find_sdr_bysensortype(struct ipmi_intf *intf, uint8_t type) struct sdr_get_rs *header; struct sdr_record_list *e; - if (sdr_list_itr == NULL) { + if (!sdr_list_itr) { sdr_list_itr = ipmi_sdr_start(intf, 0); - if (sdr_list_itr == NULL) { + if (!sdr_list_itr) { lprintf(LOG_ERR, "Unable to open SDR for reading"); return NULL; } @@ -3349,13 +3481,13 @@ ipmi_sdr_find_sdr_bysensortype(struct ipmi_intf *intf, uint8_t type) /* check what we've already read */ head = malloc(sizeof (struct sdr_record_list)); - if (head == NULL) { + if (!head) { lprintf(LOG_ERR, "ipmitool: malloc failure"); return NULL; } memset(head, 0, sizeof (struct sdr_record_list)); - for (e = sdr_list_head; e != NULL; e = e->next) { + for (e = sdr_list_head; e; e = e->next) { switch (e->type) { case SDR_RECORD_TYPE_FULL_SENSOR: case SDR_RECORD_TYPE_COMPACT_SENSOR: @@ -3370,12 +3502,12 @@ ipmi_sdr_find_sdr_bysensortype(struct ipmi_intf *intf, uint8_t type) } /* now keep looking */ - while ((header = ipmi_sdr_get_next_header(intf, sdr_list_itr)) != NULL) { + while ((header = ipmi_sdr_get_next_header(intf, sdr_list_itr))) { uint8_t *rec; struct sdr_record_list *sdrr; sdrr = malloc(sizeof (struct sdr_record_list)); - if (sdrr == NULL) { + if (!sdrr) { lprintf(LOG_ERR, "ipmitool: malloc failure"); break; } @@ -3384,8 +3516,8 @@ ipmi_sdr_find_sdr_bysensortype(struct ipmi_intf *intf, uint8_t type) sdrr->type = header->type; rec = ipmi_sdr_get_record(intf, header, sdr_list_itr); - if (rec == NULL) { - if (sdrr != NULL) { + if (!rec) { + if (sdrr) { free(sdrr); sdrr = NULL; } @@ -3425,7 +3557,7 @@ ipmi_sdr_find_sdr_bysensortype(struct ipmi_intf *intf, uint8_t type) default: free(rec); rec = NULL; - if (sdrr != NULL) { + if (sdrr) { free(sdrr); sdrr = NULL; } @@ -3433,7 +3565,7 @@ ipmi_sdr_find_sdr_bysensortype(struct ipmi_intf *intf, uint8_t type) } /* put in the global record list */ - if (sdr_list_head == NULL) + if (!sdr_list_head) sdr_list_head = sdrr; else sdr_list_tail->next = sdrr; @@ -3459,23 +3591,23 @@ ipmi_sdr_find_sdr_byentity(struct ipmi_intf *intf, struct entity_id *entity) struct sdr_record_list *e; struct sdr_record_list *head; - if (sdr_list_itr == NULL) { + if (!sdr_list_itr) { sdr_list_itr = ipmi_sdr_start(intf, 0); - if (sdr_list_itr == NULL) { + if (!sdr_list_itr) { lprintf(LOG_ERR, "Unable to open SDR for reading"); return NULL; } } head = malloc(sizeof (struct sdr_record_list)); - if (head == NULL) { + if (!head) { lprintf(LOG_ERR, "ipmitool: malloc failure"); return NULL; } memset(head, 0, sizeof (struct sdr_record_list)); /* check what we've already read */ - for (e = sdr_list_head; e != NULL; e = e->next) { + for (e = sdr_list_head; e; e = e->next) { switch (e->type) { case SDR_RECORD_TYPE_FULL_SENSOR: case SDR_RECORD_TYPE_COMPACT_SENSOR: @@ -3524,12 +3656,12 @@ ipmi_sdr_find_sdr_byentity(struct ipmi_intf *intf, struct entity_id *entity) } /* now keep looking */ - while ((header = ipmi_sdr_get_next_header(intf, sdr_list_itr)) != NULL) { + while ((header = ipmi_sdr_get_next_header(intf, sdr_list_itr))) { uint8_t *rec; struct sdr_record_list *sdrr; sdrr = malloc(sizeof (struct sdr_record_list)); - if (sdrr == NULL) { + if (!sdrr) { lprintf(LOG_ERR, "ipmitool: malloc failure"); break; } @@ -3538,8 +3670,8 @@ ipmi_sdr_find_sdr_byentity(struct ipmi_intf *intf, struct entity_id *entity) sdrr->type = header->type; rec = ipmi_sdr_get_record(intf, header, sdr_list_itr); - if (rec == NULL) { - if (sdrr != NULL) { + if (!rec) { + if (sdrr) { free(sdrr); sdrr = NULL; } @@ -3605,7 +3737,7 @@ ipmi_sdr_find_sdr_byentity(struct ipmi_intf *intf, struct entity_id *entity) default: free(rec); rec = NULL; - if (sdrr != NULL) { + if (sdrr) { free(sdrr); sdrr = NULL; } @@ -3613,7 +3745,7 @@ ipmi_sdr_find_sdr_byentity(struct ipmi_intf *intf, struct entity_id *entity) } /* add to global record list */ - if (sdr_list_head == NULL) + if (!sdr_list_head) sdr_list_head = sdrr; else sdr_list_tail->next = sdrr; @@ -3639,33 +3771,33 @@ ipmi_sdr_find_sdr_bytype(struct ipmi_intf *intf, uint8_t type) struct sdr_record_list *e; struct sdr_record_list *head; - if (sdr_list_itr == NULL) { + if (!sdr_list_itr) { sdr_list_itr = ipmi_sdr_start(intf, 0); - if (sdr_list_itr == NULL) { + if (!sdr_list_itr) { lprintf(LOG_ERR, "Unable to open SDR for reading"); return NULL; } } head = malloc(sizeof (struct sdr_record_list)); - if (head == NULL) { + if (!head) { lprintf(LOG_ERR, "ipmitool: malloc failure"); return NULL; } memset(head, 0, sizeof (struct sdr_record_list)); /* check what we've already read */ - for (e = sdr_list_head; e != NULL; e = e->next) + for (e = sdr_list_head; e; e = e->next) if (e->type == type) __sdr_list_add(head, e); /* now keep looking */ - while ((header = ipmi_sdr_get_next_header(intf, sdr_list_itr)) != NULL) { + while ((header = ipmi_sdr_get_next_header(intf, sdr_list_itr))) { uint8_t *rec; struct sdr_record_list *sdrr; sdrr = malloc(sizeof (struct sdr_record_list)); - if (sdrr == NULL) { + if (!sdrr) { lprintf(LOG_ERR, "ipmitool: malloc failure"); break; } @@ -3674,8 +3806,8 @@ ipmi_sdr_find_sdr_bytype(struct ipmi_intf *intf, uint8_t type) sdrr->type = header->type; rec = ipmi_sdr_get_record(intf, header, sdr_list_itr); - if (rec == NULL) { - if (sdrr != NULL) { + if (!rec) { + if (sdrr) { free(sdrr); sdrr = NULL; } @@ -3711,7 +3843,7 @@ ipmi_sdr_find_sdr_bytype(struct ipmi_intf *intf, uint8_t type) default: free(rec); rec = NULL; - if (sdrr != NULL) { + if (sdrr) { free(sdrr); sdrr = NULL; } @@ -3722,7 +3854,7 @@ ipmi_sdr_find_sdr_bytype(struct ipmi_intf *intf, uint8_t type) __sdr_list_add(head, sdrr); /* add to global record list */ - if (sdr_list_head == NULL) + if (!sdr_list_head) sdr_list_head = sdrr; else sdr_list_tail->next = sdrr; @@ -3749,21 +3881,21 @@ ipmi_sdr_find_sdr_byid(struct ipmi_intf *intf, char *id) int found = 0; int idlen; - if (id == NULL) + if (!id) return NULL; idlen = strlen(id); - if (sdr_list_itr == NULL) { + if (!sdr_list_itr) { sdr_list_itr = ipmi_sdr_start(intf, 0); - if (sdr_list_itr == NULL) { + if (!sdr_list_itr) { lprintf(LOG_ERR, "Unable to open SDR for reading"); return NULL; } } /* check what we've already read */ - for (e = sdr_list_head; e != NULL; e = e->next) { + for (e = sdr_list_head; e; e = e->next) { switch (e->type) { case SDR_RECORD_TYPE_FULL_SENSOR: if (!strncmp((const char *)e->record.full->id_string, @@ -3805,12 +3937,12 @@ ipmi_sdr_find_sdr_byid(struct ipmi_intf *intf, char *id) } /* now keep looking */ - while ((header = ipmi_sdr_get_next_header(intf, sdr_list_itr)) != NULL) { + while ((header = ipmi_sdr_get_next_header(intf, sdr_list_itr))) { uint8_t *rec; struct sdr_record_list *sdrr; sdrr = malloc(sizeof (struct sdr_record_list)); - if (sdrr == NULL) { + if (!sdrr) { lprintf(LOG_ERR, "ipmitool: malloc failure"); break; } @@ -3819,8 +3951,8 @@ ipmi_sdr_find_sdr_byid(struct ipmi_intf *intf, char *id) sdrr->type = header->type; rec = ipmi_sdr_get_record(intf, header, sdr_list_itr); - if (rec == NULL) { - if (sdrr != NULL) { + if (!rec) { + if (sdrr) { free(sdrr); sdrr = NULL; } @@ -3891,7 +4023,7 @@ ipmi_sdr_find_sdr_byid(struct ipmi_intf *intf, char *id) default: free(rec); rec = NULL; - if (sdrr != NULL) { + if (sdrr) { free(sdrr); sdrr = NULL; } @@ -3899,7 +4031,7 @@ ipmi_sdr_find_sdr_byid(struct ipmi_intf *intf, char *id) } /* add to global record liset */ - if (sdr_list_head == NULL) + if (!sdr_list_head) sdr_list_head = sdrr; else sdr_list_tail->next = sdrr; @@ -3915,14 +4047,13 @@ ipmi_sdr_find_sdr_byid(struct ipmi_intf *intf, char *id) /* ipmi_sdr_list_cache_fromfile - generate SDR cache for fast lookup from local file * - * @intf: ipmi interface * @ifile: input filename * * returns pointer to SDR list * returns NULL on error */ int -ipmi_sdr_list_cache_fromfile(struct ipmi_intf *intf, const char *ifile) +ipmi_sdr_list_cache_fromfile(const char *ifile) { FILE *fp; struct __sdr_header { @@ -3935,13 +4066,13 @@ ipmi_sdr_list_cache_fromfile(struct ipmi_intf *intf, const char *ifile) uint8_t *rec; int ret = 0, count = 0, bc = 0; - if (ifile == NULL) { + if (!ifile) { lprintf(LOG_ERR, "No SDR cache filename given"); return -1; } fp = ipmi_open_file_read(ifile); - if (fp == NULL) { + if (!fp) { lprintf(LOG_ERR, "Unable to open SDR cache %s for reading", ifile); return -1; @@ -3973,7 +4104,7 @@ ipmi_sdr_list_cache_fromfile(struct ipmi_intf *intf, const char *ifile) } sdrr = malloc(sizeof (struct sdr_record_list)); - if (sdrr == NULL) { + if (!sdrr) { lprintf(LOG_ERR, "ipmitool: malloc failure"); ret = -1; break; @@ -3984,10 +4115,10 @@ ipmi_sdr_list_cache_fromfile(struct ipmi_intf *intf, const char *ifile) sdrr->type = header.type; rec = malloc(header.length + 1); - if (rec == NULL) { + if (!rec) { lprintf(LOG_ERR, "ipmitool: malloc failure"); ret = -1; - if (sdrr != NULL) { + if (sdrr) { free(sdrr); sdrr = NULL; } @@ -4001,11 +4132,11 @@ ipmi_sdr_list_cache_fromfile(struct ipmi_intf *intf, const char *ifile) "record %04x read %d bytes, expected %d", header.id, bc, header.length); ret = -1; - if (sdrr != NULL) { + if (sdrr) { free(sdrr); sdrr = NULL; } - if (rec != NULL) { + if (rec) { free(rec); rec = NULL; } @@ -4041,7 +4172,7 @@ ipmi_sdr_list_cache_fromfile(struct ipmi_intf *intf, const char *ifile) default: free(rec); rec = NULL; - if (sdrr != NULL) { + if (sdrr) { free(sdrr); sdrr = NULL; } @@ -4049,7 +4180,7 @@ ipmi_sdr_list_cache_fromfile(struct ipmi_intf *intf, const char *ifile) } /* add to global record liset */ - if (sdr_list_head == NULL) + if (!sdr_list_head) sdr_list_head = sdrr; else sdr_list_tail->next = sdrr; @@ -4062,9 +4193,9 @@ ipmi_sdr_list_cache_fromfile(struct ipmi_intf *intf, const char *ifile) sdrr->id); } - if (sdr_list_itr == NULL) { + if (!sdr_list_itr) { sdr_list_itr = malloc(sizeof (struct ipmi_sdr_iterator)); - if (sdr_list_itr != NULL) { + if (sdr_list_itr) { sdr_list_itr->reservation = 0; sdr_list_itr->total = count; sdr_list_itr->next = 0xffff; @@ -4087,20 +4218,20 @@ ipmi_sdr_list_cache(struct ipmi_intf *intf) { struct sdr_get_rs *header; - if (sdr_list_itr == NULL) { + if (!sdr_list_itr) { sdr_list_itr = ipmi_sdr_start(intf, 0); - if (sdr_list_itr == NULL) { + if (!sdr_list_itr) { lprintf(LOG_ERR, "Unable to open SDR for reading"); return -1; } } - while ((header = ipmi_sdr_get_next_header(intf, sdr_list_itr)) != NULL) { + while ((header = ipmi_sdr_get_next_header(intf, sdr_list_itr))) { uint8_t *rec; struct sdr_record_list *sdrr; sdrr = malloc(sizeof (struct sdr_record_list)); - if (sdrr == NULL) { + if (!sdrr) { lprintf(LOG_ERR, "ipmitool: malloc failure"); break; } @@ -4109,8 +4240,8 @@ ipmi_sdr_list_cache(struct ipmi_intf *intf) sdrr->type = header->type; rec = ipmi_sdr_get_record(intf, header, sdr_list_itr); - if (rec == NULL) { - if (sdrr != NULL) { + if (!rec) { + if (sdrr) { free(sdrr); sdrr = NULL; } @@ -4146,7 +4277,7 @@ ipmi_sdr_list_cache(struct ipmi_intf *intf) default: free(rec); rec = NULL; - if (sdrr != NULL) { + if (sdrr) { free(sdrr); sdrr = NULL; } @@ -4154,7 +4285,7 @@ ipmi_sdr_list_cache(struct ipmi_intf *intf) } /* add to global record liset */ - if (sdr_list_head == NULL) + if (!sdr_list_head) sdr_list_head = sdrr; else sdr_list_tail->next = sdrr; @@ -4192,11 +4323,11 @@ ipmi_sdr_get_info(struct ipmi_intf *intf, rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Get SDR Repository Info command failed"); return -1; } - if (rsp->ccode > 0) { + if (rsp->ccode) { lprintf(LOG_ERR, "Get SDR Repository Info command failed: %s", val2str(rsp->ccode, completion_code_vals)); return -1; @@ -4210,24 +4341,6 @@ ipmi_sdr_get_info(struct ipmi_intf *intf, return 0; } -/* ipmi_sdr_timestamp - return string from timestamp value - * - * @stamp: 32bit timestamp - * - * returns pointer to static buffer - */ -static char * -ipmi_sdr_timestamp(uint32_t stamp) -{ - static char tbuf[40]; - time_t s = (time_t) stamp; - memset(tbuf, 0, 40); - if (stamp) - strftime(tbuf, sizeof (tbuf), "%m/%d/%Y %H:%M:%S", - gmtime(&s)); - return tbuf; -} - /* * ipmi_sdr_print_info * @@ -4240,7 +4353,7 @@ ipmi_sdr_timestamp(uint32_t stamp) int ipmi_sdr_print_info(struct ipmi_intf *intf) { - uint32_t timestamp; + time_t timestamp; uint16_t free_space; struct get_sdr_repository_info_rsp sdr_repository_info; @@ -4274,21 +4387,26 @@ ipmi_sdr_print_info(struct ipmi_intf *intf) break; } - timestamp = - (sdr_repository_info.most_recent_addition_timestamp[3] << 24) | - (sdr_repository_info.most_recent_addition_timestamp[2] << 16) | - (sdr_repository_info.most_recent_addition_timestamp[1] << 8) | - sdr_repository_info.most_recent_addition_timestamp[0]; - printf("Most recent Addition : %s\n", - ipmi_sdr_timestamp(timestamp)); + printf("Most recent Addition : "); + if (sdr_repository_info.partial_add_sdr_supported) + { + timestamp = ipmi32toh(sdr_repository_info + .most_recent_addition_timestamp); + printf("%s\n", ipmi_timestamp_numeric(timestamp)); + } + else { + printf("NA\n"); + } - timestamp = - (sdr_repository_info.most_recent_erase_timestamp[3] << 24) | - (sdr_repository_info.most_recent_erase_timestamp[2] << 16) | - (sdr_repository_info.most_recent_erase_timestamp[1] << 8) | - sdr_repository_info.most_recent_erase_timestamp[0]; - printf("Most recent Erase : %s\n", - ipmi_sdr_timestamp(timestamp)); + printf("Most recent Erase : "); + if(sdr_repository_info.delete_sdr_supported) { + timestamp = ipmi32toh(sdr_repository_info + .most_recent_erase_timestamp); + printf("%s\n", ipmi_timestamp_numeric(timestamp)); + } + else { + printf("NA\n"); + } printf("SDR overflow : %s\n", (sdr_repository_info.overflow_flag ? "yes" : "no")); @@ -4321,7 +4439,7 @@ ipmi_sdr_print_info(struct ipmi_intf *intf) reserve_sdr_repository_supported ? "yes" : "no"); printf("SDR Repository Alloc info supported : %s\n", sdr_repository_info. - get_sdr_repository_allo_info_supported ? "yes" : "no"); + get_sdr_repository_allo_info_supported ? "yes" : "no"); return 0; } @@ -4347,7 +4465,7 @@ ipmi_sdr_dump_bin(struct ipmi_intf *intf, const char *ofile) /* open connection to SDR */ itr = ipmi_sdr_start(intf, 0); - if (itr == NULL) { + if (!itr) { lprintf(LOG_ERR, "Unable to open SDR for reading"); return -1; } @@ -4355,9 +4473,9 @@ ipmi_sdr_dump_bin(struct ipmi_intf *intf, const char *ofile) printf("Dumping Sensor Data Repository to '%s'\n", ofile); /* generate list of records */ - while ((header = ipmi_sdr_get_next_header(intf, itr)) != NULL) { + while ((header = ipmi_sdr_get_next_header(intf, itr))) { sdrr = malloc(sizeof(struct sdr_record_list)); - if (sdrr == NULL) { + if (!sdrr) { lprintf(LOG_ERR, "ipmitool: malloc failure"); return -1; } @@ -4372,16 +4490,16 @@ ipmi_sdr_dump_bin(struct ipmi_intf *intf, const char *ofile) sdrr->length = header->length; sdrr->raw = ipmi_sdr_get_record(intf, header, itr); - if (sdrr->raw == NULL) { + if (!sdrr->raw) { lprintf(LOG_ERR, "ipmitool: cannot obtain SDR record %04x", header->id); - if (sdrr != NULL) { + if (sdrr) { free(sdrr); sdrr = NULL; } return -1; } - if (sdr_list_head == NULL) + if (!sdr_list_head) sdr_list_head = sdrr; else sdr_list_tail->next = sdrr; @@ -4389,14 +4507,14 @@ ipmi_sdr_dump_bin(struct ipmi_intf *intf, const char *ofile) sdr_list_tail = sdrr; } - ipmi_sdr_end(intf, itr); + ipmi_sdr_end(itr); /* now write to file */ fp = ipmi_open_file_write(ofile); - if (fp == NULL) + if (!fp) return -1; - for (sdrr = sdr_list_head; sdrr != NULL; sdrr = sdrr->next) { + for (sdrr = sdr_list_head; sdrr; sdrr = sdrr->next) { int r; uint8_t h[5]; @@ -4451,9 +4569,9 @@ ipmi_sdr_print_type(struct ipmi_intf *intf, char *type) int x; uint8_t sensor_type = 0; - if (type == NULL || - strncasecmp(type, "help", 4) == 0 || - strncasecmp(type, "list", 4) == 0) { + if (!type || + strcasecmp(type, "help") == 0 || + strcasecmp(type, "list") == 0) { printf("Sensor Types:\n"); for (x = 1; x < SENSOR_TYPE_MAX; x += 2) { printf("\t%-25s (0x%02x) %-25s (0x%02x)\n", @@ -4463,7 +4581,7 @@ ipmi_sdr_print_type(struct ipmi_intf *intf, char *type) return 0; } - if (strncmp(type, "0x", 2) == 0) { + if (!strcmp(type, "0x")) { /* begins with 0x so let it be entered as raw hex value */ if (str2uchar(type, &sensor_type) != 0) { lprintf(LOG_ERR, @@ -4473,9 +4591,7 @@ ipmi_sdr_print_type(struct ipmi_intf *intf, char *type) } } else { for (x = 1; x < SENSOR_TYPE_MAX; x++) { - if (strncasecmp(sensor_type_desc[x], type, - __maxlen(type, - sensor_type_desc[x])) == 0) { + if (strcasecmp(sensor_type_desc[x], type) == 0) { sensor_type = x; break; } @@ -4495,7 +4611,7 @@ ipmi_sdr_print_type(struct ipmi_intf *intf, char *type) list = ipmi_sdr_find_sdr_bysensortype(intf, sensor_type); - for (entry = list; entry != NULL; entry = entry->next) { + for (entry = list; entry; entry = entry->next) { rc = ipmi_sdr_print_listentry(intf, entry); } @@ -4521,9 +4637,9 @@ ipmi_sdr_print_entity(struct ipmi_intf *intf, char *entitystr) unsigned instance = 0; int rc = 0; - if (entitystr == NULL || - strncasecmp(entitystr, "help", 4) == 0 || - strncasecmp(entitystr, "list", 4) == 0) { + if (!entitystr || + strcasecmp(entitystr, "help") == 0 || + strcasecmp(entitystr, "list") == 0) { print_valstr_2col(entity_id_vals, "Entity IDs", -1); return 0; } @@ -4537,9 +4653,8 @@ ipmi_sdr_print_entity(struct ipmi_intf *intf, char *entitystr) int i, j=0; /* now try string input */ - for (i = 0; entity_id_vals[i].str != NULL; i++) { - if (strncasecmp(entitystr, entity_id_vals[i].str, - __maxlen(entitystr, entity_id_vals[i].str)) == 0) { + for (i = 0; entity_id_vals[i].str; i++) { + if (strcasecmp(entitystr, entity_id_vals[i].str) == 0) { entity.id = entity_id_vals[i].val; entity.instance = 0x7f; j=1; @@ -4560,7 +4675,7 @@ ipmi_sdr_print_entity(struct ipmi_intf *intf, char *entitystr) list = ipmi_sdr_find_sdr_byentity(intf, &entity); - for (entry = list; entry != NULL; entry = entry->next) { + for (entry = list; entry; entry = entry->next) { rc = ipmi_sdr_print_listentry(intf, entry); } @@ -4595,7 +4710,7 @@ ipmi_sdr_print_entry_byid(struct ipmi_intf *intf, int argc, char **argv) for (i = 0; i < argc; i++) { sdr = ipmi_sdr_find_sdr_byid(intf, argv[i]); - if (sdr == NULL) { + if (!sdr) { lprintf(LOG_ERR, "Unable to find sensor id '%s'", argv[i]); } else { @@ -4626,41 +4741,41 @@ ipmi_sdr_main(struct ipmi_intf *intf, int argc, char **argv) /* initialize random numbers used later */ srand(time(NULL)); - if (argc == 0) + if (argc == 0) { return ipmi_sdr_print_sdr(intf, 0xfe); - else if (strncmp(argv[0], "help", 4) == 0) { + } else if (!strcmp(argv[0], "help")) { printf_sdr_usage(); - } else if (strncmp(argv[0], "list", 4) == 0 - || strncmp(argv[0], "elist", 5) == 0) { - - if (strncmp(argv[0], "elist", 5) == 0) + } else if (!strcmp(argv[0], "list") + || !strcmp(argv[0], "elist")) + { + if (!strcmp(argv[0], "elist")) sdr_extended = 1; else sdr_extended = 0; if (argc <= 1) rc = ipmi_sdr_print_sdr(intf, 0xfe); - else if (strncmp(argv[1], "all", 3) == 0) + else if (!strcmp(argv[1], "all")) rc = ipmi_sdr_print_sdr(intf, 0xff); - else if (strncmp(argv[1], "full", 4) == 0) + else if (!strcmp(argv[1], "full")) rc = ipmi_sdr_print_sdr(intf, SDR_RECORD_TYPE_FULL_SENSOR); - else if (strncmp(argv[1], "compact", 7) == 0) + else if (!strcmp(argv[1], "compact")) rc = ipmi_sdr_print_sdr(intf, SDR_RECORD_TYPE_COMPACT_SENSOR); - else if (strncmp(argv[1], "event", 5) == 0) + else if (!strcmp(argv[1], "event")) rc = ipmi_sdr_print_sdr(intf, SDR_RECORD_TYPE_EVENTONLY_SENSOR); - else if (strncmp(argv[1], "mcloc", 5) == 0) + else if (!strcmp(argv[1], "mcloc")) rc = ipmi_sdr_print_sdr(intf, SDR_RECORD_TYPE_MC_DEVICE_LOCATOR); - else if (strncmp(argv[1], "fru", 3) == 0) + else if (!strcmp(argv[1], "fru")) rc = ipmi_sdr_print_sdr(intf, SDR_RECORD_TYPE_FRU_DEVICE_LOCATOR); - else if (strncmp(argv[1], "generic", 7) == 0) + else if (!strcmp(argv[1], "generic")) rc = ipmi_sdr_print_sdr(intf, SDR_RECORD_TYPE_GENERIC_DEVICE_LOCATOR); - else if (strcmp(argv[1], "help") == 0) { + else if (!strcmp(argv[1], "help")) { lprintf(LOG_NOTICE, "usage: sdr %s [all|full|compact|event|mcloc|fru|generic]", argv[0]); @@ -4675,35 +4790,35 @@ ipmi_sdr_main(struct ipmi_intf *intf, int argc, char **argv) argv[0]); return (-1); } - } else if (strncmp(argv[0], "type", 4) == 0) { + } else if (!strcmp(argv[0], "type")) { sdr_extended = 1; rc = ipmi_sdr_print_type(intf, argv[1]); - } else if (strncmp(argv[0], "entity", 6) == 0) { + } else if (!strcmp(argv[0], "entity")) { sdr_extended = 1; rc = ipmi_sdr_print_entity(intf, argv[1]); - } else if (strncmp(argv[0], "info", 4) == 0) { + } else if (!strcmp(argv[0], "info")) { rc = ipmi_sdr_print_info(intf); - } else if (strncmp(argv[0], "get", 3) == 0) { + } else if (!strcmp(argv[0], "get")) { rc = ipmi_sdr_print_entry_byid(intf, argc - 1, &argv[1]); - } else if (strncmp(argv[0], "dump", 4) == 0) { + } else if (!strcmp(argv[0], "dump")) { if (argc < 2) { lprintf(LOG_ERR, "Not enough parameters given."); lprintf(LOG_NOTICE, "usage: sdr dump <file>"); return (-1); } rc = ipmi_sdr_dump_bin(intf, argv[1]); - } else if (strncmp(argv[0], "fill", 4) == 0) { + } else if (!strcmp(argv[0], "fill")) { if (argc <= 1) { lprintf(LOG_ERR, "Not enough parameters given."); lprintf(LOG_NOTICE, "usage: sdr fill sensors"); lprintf(LOG_NOTICE, "usage: sdr fill file <file>"); lprintf(LOG_NOTICE, "usage: sdr fill range <range>"); return (-1); - } else if (strncmp(argv[1], "sensors", 7) == 0) { + } else if (!strcmp(argv[1], "sensors")) { rc = ipmi_sdr_add_from_sensors(intf, 21); - } else if (strncmp(argv[1], "nosat", 5) == 0) { + } else if (!strcmp(argv[1], "nosat")) { rc = ipmi_sdr_add_from_sensors(intf, 0); - } else if (strncmp(argv[1], "file", 4) == 0) { + } else if (!strcmp(argv[1], "file")) { if (argc < 3) { lprintf(LOG_ERR, "Not enough parameters given."); @@ -4712,7 +4827,7 @@ ipmi_sdr_main(struct ipmi_intf *intf, int argc, char **argv) return (-1); } rc = ipmi_sdr_add_from_file(intf, argv[2]); - } else if (strncmp(argv[1], "range", 4) == 0) { + } else if (!strcmp(argv[1], "range")) { if (argc < 3) { lprintf(LOG_ERR, "Not enough parameters given."); diff --git a/lib/ipmi_sdradd.c b/lib/ipmi_sdradd.c index 52848a3..87063bb 100644 --- a/lib/ipmi_sdradd.c +++ b/lib/ipmi_sdradd.c @@ -80,7 +80,7 @@ partial_send(struct ipmi_intf *intf, struct ipmi_rq *req, uint16_t *id) { struct ipmi_rs *rsp; rsp = intf->sendrecv(intf, req); - if (rsp == NULL) { + if (!rsp) { return -1; } @@ -115,7 +115,7 @@ ipmi_sdr_add_record(struct ipmi_intf *intf, struct sdr_record_list *sdrr) } sdr_rq = (struct sdr_add_rq *)malloc(sizeof(*sdr_rq) + sdr_max_write_len); - if (sdr_rq == NULL) { + if (!sdr_rq) { lprintf(LOG_ERR, "ipmitool: malloc failure"); return -1; } @@ -202,11 +202,11 @@ ipmi_sdr_repo_clear(struct ipmi_intf *intf) for (try = 0; try < 5; try++) { rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Unable to clear SDRR"); return -1; } - if (rsp->ccode > 0) { + if (rsp->ccode) { lprintf(LOG_ERR, "Unable to clear SDRR: %s", val2str(rsp->ccode, completion_code_vals)); return -1; @@ -248,11 +248,11 @@ sdrr_get_records(struct ipmi_intf *intf, struct ipmi_sdr_iterator *itr, queue->head = NULL; queue->tail = NULL; - while ((header = ipmi_sdr_get_next_header(intf, itr)) != NULL) { + while ((header = ipmi_sdr_get_next_header(intf, itr))) { struct sdr_record_list *sdrr; sdrr = malloc(sizeof (struct sdr_record_list)); - if (sdrr == NULL) { + if (!sdrr) { lprintf(LOG_ERR, "ipmitool: malloc failure"); return -1; } @@ -263,10 +263,10 @@ sdrr_get_records(struct ipmi_intf *intf, struct ipmi_sdr_iterator *itr, sdrr->type = header->type; sdrr->length = header->length; sdrr->raw = ipmi_sdr_get_record(intf, header, itr); - (void)ipmi_sdr_print_name_from_rawentry(intf, sdrr->id, sdrr->type,sdrr->raw); + (void)ipmi_sdr_print_name_from_rawentry(sdrr->id, sdrr->type,sdrr->raw); /* put in the record queue */ - if (queue->head == NULL) + if (!queue->head) queue->head = sdrr; else queue->tail->next = sdrr; @@ -295,12 +295,12 @@ sdr_copy_to_sdrr(struct ipmi_intf *intf, int use_builtin, printf("Load SDRs from 0x%x\n", from_addr); rc = sdrr_get_records(intf, itr, &sdrr_queue); - ipmi_sdr_end(intf, itr); + ipmi_sdr_end(itr); /* ... */ /* write the SDRs to the destination SDR Repository */ intf->target_addr = to_addr; - for (sdrr = sdrr_queue.head; sdrr != NULL; sdrr = sdrr_next) { + for (sdrr = sdrr_queue.head; sdrr; sdrr = sdrr_next) { sdrr_next = sdrr->next; rc = ipmi_sdr_add_record(intf, sdrr); if(rc < 0){ @@ -433,7 +433,7 @@ int ipmi_parse_range_list(const char *rangeList, unsigned char * pHexList) do { - if(nextString != NULL) + if(nextString) { (*nextString)= 0; nextString ++; @@ -446,8 +446,7 @@ int ipmi_parse_range_list(const char *rangeList, unsigned char * pHexList) /* At this point, it is a single entry or a range */ rangeString = strstr( inProcessString, "-" ); - if(rangeString == NULL) - { + if (!rangeString) { unsigned char decValue = 0; /* Single entry */ @@ -597,7 +596,7 @@ ipmi_sdr_read_records(const char *filename, struct sdrr_queue *queue) lprintf(LOG_DEBUG, "binHdr[4] (length) = 0x%02x", binHdr[4]); sdrr = malloc(sizeof(*sdrr)); - if (sdrr == NULL) { + if (!sdrr) { lprintf(LOG_ERR, "ipmitool: malloc failure"); rc = -1; break; @@ -607,7 +606,8 @@ ipmi_sdr_read_records(const char *filename, struct sdrr_queue *queue) sdrr->type = binHdr[3]; sdrr->length = binHdr[4]; - if ((sdrr->raw = malloc(sdrr->length)) == NULL) { + sdrr->raw = malloc(sdrr->length); + if (!sdrr->raw) { lprintf(LOG_ERR, "ipmitool: malloc failure"); free(sdrr); sdrr = NULL; @@ -626,7 +626,7 @@ ipmi_sdr_read_records(const char *filename, struct sdrr_queue *queue) } /* put in the record queue */ - if (queue->head == NULL) + if (!queue->head) queue->head = sdrr; else queue->tail->next = sdrr; @@ -654,7 +654,7 @@ ipmi_sdr_add_from_file(struct ipmi_intf *intf, const char *ifile) } /* write the SDRs to the SDR Repository */ - for (sdrr = sdrr_queue.head; sdrr != NULL; sdrr = sdrr_next) { + for (sdrr = sdrr_queue.head; sdrr; sdrr = sdrr_next) { sdrr_next = sdrr->next; rc = ipmi_sdr_add_record(intf, sdrr); if(rc < 0){ diff --git a/lib/ipmi_sel.c b/lib/ipmi_sel.c index 8b0395e..31c0eea 100644 --- a/lib/ipmi_sel.c +++ b/lib/ipmi_sel.c @@ -29,7 +29,6 @@ * LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, * EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. */ -#define _BSD_SOURCE #include <string.h> #include <strings.h> @@ -38,6 +37,7 @@ #include <time.h> #include <ctype.h> #include <errno.h> +#include <stdbool.h> #include <ipmitool/helper.h> #include <ipmitool/log.h> @@ -50,8 +50,9 @@ #include <ipmitool/ipmi_fru.h> #include <ipmitool/ipmi_sensor.h> #include <ipmitool/ipmi_strings.h> +#include <ipmitool/ipmi_quantaoem.h> +#include <ipmitool/ipmi_time.h> -extern int verbose; static int sel_extended = 0; static int sel_oem_nrecs = 0; @@ -123,13 +124,13 @@ int ipmi_sel_oem_init(const char * filename) int i, j, k, n, byte; char buf[15][150]; - if (filename == NULL) { + if (!filename) { lprintf(LOG_ERR, "No SEL OEM filename provided"); return -1; } fp = ipmi_open_file_read(filename); - if (fp == NULL) { + if (!fp) { lprintf(LOG_ERR, "Could not open %s file", filename); return -1; } @@ -193,7 +194,7 @@ int ipmi_sel_oem_init(const char * filename) return 0; } -static void ipmi_sel_oem_message(struct sel_event_record * evt, int verbose) +static void ipmi_sel_oem_message(struct sel_event_record * evt) { /* * Note: although we have a verbose argument, currently the output @@ -238,34 +239,6 @@ ipmi_get_event_type(uint8_t code) } static char * -ipmi_sel_timestamp(uint32_t stamp) -{ - static char tbuf[40]; - time_t s = (time_t)stamp; - memset(tbuf, 0, 40); - strftime(tbuf, sizeof(tbuf), "%m/%d/%Y %H:%M:%S", gmtime(&s)); - return tbuf; -} - -static char * -ipmi_sel_timestamp_date(uint32_t stamp) -{ - static char tbuf[11]; - time_t s = (time_t)stamp; - strftime(tbuf, sizeof(tbuf), "%m/%d/%Y", gmtime(&s)); - return tbuf; -} - -static char * -ipmi_sel_timestamp_time(uint32_t stamp) -{ - static char tbuf[9]; - time_t s = (time_t)stamp; - strftime(tbuf, sizeof(tbuf), "%H:%M:%S", gmtime(&s)); - return tbuf; -} - -static char * hex2ascii (uint8_t * hexChars, uint8_t numBytes) { int count; @@ -315,11 +288,11 @@ ipmi_get_oem(struct ipmi_intf * intf) req.msg.data_len = 0; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Get Device ID command failed"); return IPMI_OEM_UNKNOWN; } - if (rsp->ccode > 0) { + if (rsp->ccode) { lprintf(LOG_ERR, "Get Device ID command failed: %#x %s", rsp->ccode, val2str(rsp->ccode, completion_code_vals)); return IPMI_OEM_UNKNOWN; @@ -348,11 +321,11 @@ ipmi_sel_add_entry(struct ipmi_intf * intf, struct sel_event_record * rec) ipmi_sel_print_std_entry(intf, rec); rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Add SEL Entry failed"); return -1; } - else if (rsp->ccode > 0) { + else if (rsp->ccode) { lprintf(LOG_ERR, "Add SEL Entry failed: %s", val2str(rsp->ccode, completion_code_vals)); return -1; @@ -373,15 +346,15 @@ ipmi_sel_add_entries_fromfile(struct ipmi_intf * intf, const char * filename) uint8_t rqdata[8]; struct sel_event_record sel_event; - if (filename == NULL) + if (!filename) return -1; fp = ipmi_open_file_read(filename); - if (fp == NULL) + if (!fp) return -1; while (feof(fp) == 0) { - if (fgets(buf, 1024, fp) == NULL) + if (!fgets(buf, 1024, fp)) continue; /* clip off optional comment tail indicated by # */ @@ -447,25 +420,26 @@ ipmi_sel_add_entries_fromfile(struct ipmi_intf * intf, const char * filename) return rc; } -static struct ipmi_event_sensor_types oem_kontron_event_reading_types[] __attribute__((unused)) = { +static struct ipmi_event_sensor_types __UNUSED__(oem_kontron_event_reading_types[]) = { { 0x70 , 0x00 , 0xff, "Code Assert" }, { 0x71 , 0x00 , 0xff, "Code Assert" }, { 0, 0, 0xFF, NULL } }; - + +/* NOTE: unused paramter kept in for consistency. */ char * -get_kontron_evt_desc(struct ipmi_intf *intf, struct sel_event_record * rec) +get_kontron_evt_desc(struct ipmi_intf *__UNUSED__(intf), struct sel_event_record *rec) { - char * description = NULL; + char *description = NULL; /* * Kontron OEM events are described in the product's user manual, but are limited in favor of - * sensor specific + * sensor specific */ /* Only standard records are defined so far */ if( rec->record_type < 0xC0 ){ const struct ipmi_event_sensor_types *st=NULL; - for ( st=oem_kontron_event_types ; st->desc != NULL; st++){ + for (st = oem_kontron_event_types; st->desc; st++){ if (st->code == rec->sel_type.standard_type.event_type ){ size_t len =strlen(st->desc); description = (char*)malloc( len + 1 ); @@ -480,10 +454,10 @@ get_kontron_evt_desc(struct ipmi_intf *intf, struct sel_event_record * rec) } char * -get_newisys_evt_desc(struct ipmi_intf * intf, struct sel_event_record * rec) +get_viking_evt_desc(struct ipmi_intf * intf, struct sel_event_record * rec) { /* - * Newisys OEM event descriptions can be retrieved through an + * Viking OEM event descriptions can be retrieved through an * OEM IPMI command. */ struct ipmi_rs * rsp; @@ -506,12 +480,12 @@ get_newisys_evt_desc(struct ipmi_intf * intf, struct sel_event_record * rec) req.msg.data = msg_data; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { if (verbose) lprintf(LOG_ERR, "Error issuing OEM command"); return NULL; } - if (rsp->ccode > 0) { + if (rsp->ccode) { if (verbose) lprintf(LOG_ERR, "OEM command returned error code: %s", val2str(rsp->ccode, completion_code_vals)); @@ -521,17 +495,17 @@ get_newisys_evt_desc(struct ipmi_intf * intf, struct sel_event_record * rec) /* Verify our response before we use it */ if (rsp->data_len < 5) { - lprintf(LOG_ERR, "Newisys OEM response too short"); + lprintf(LOG_ERR, "Viking OEM response too short"); return NULL; } else if (rsp->data_len != (4 + rsp->data[3])) { - lprintf(LOG_ERR, "Newisys OEM response has unexpected length"); + lprintf(LOG_ERR, "Viking OEM response has unexpected length"); return NULL; } - else if (IPM_DEV_MANUFACTURER_ID(rsp->data) != IPMI_OEM_NEWISYS) + else if (IPM_DEV_MANUFACTURER_ID(rsp->data) != IPMI_OEM_VIKING) { - lprintf(LOG_ERR, "Newisys OEM response has unexpected length"); + lprintf(LOG_ERR, "Viking OEM response has unexpected length"); return NULL; } @@ -565,9 +539,9 @@ get_supermicro_evt_desc(struct ipmi_intf *intf, struct sel_event_record *rec) if (rec->sel_type.standard_type.event_type != 0x6F) { return NULL; } - /* Allocate mem for te Description string */ + /* Allocate mem for the Description string */ desc = malloc(sizeof(char) * SIZE_OF_DESC); - if (desc == NULL) { + if (!desc) { lprintf(LOG_ERR, "ipmitool: malloc failure"); return NULL; } @@ -583,17 +557,17 @@ get_supermicro_evt_desc(struct ipmi_intf *intf, struct sel_event_record *rec) req.msg.data_len = 0; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, " Error getting system info"); - if (desc != NULL) { + if (desc) { free(desc); desc = NULL; } return NULL; - } else if (rsp->ccode > 0) { + } else if (rsp->ccode) { lprintf(LOG_ERR, " Error getting system info: %s", val2str(rsp->ccode, completion_code_vals)); - if (desc != NULL) { + if (desc) { free(desc); desc = NULL; } @@ -602,7 +576,7 @@ get_supermicro_evt_desc(struct ipmi_intf *intf, struct sel_event_record *rec) /* check the chipset type */ oem_id = ipmi_get_oem_id(intf); if (oem_id == 0) { - if (desc != NULL) { + if (desc) { free(desc); desc = NULL; } @@ -705,7 +679,7 @@ get_supermicro_evt_desc(struct ipmi_intf *intf, struct sel_event_record *rec) /* * Function : Decoding the SEL OEM Bytes for the DELL Platforms. - * Description : The below fucntion will decode the SEL Events OEM Bytes for the Dell specific Sensors only. + * Description : The below function will decode the SEL Events OEM Bytes for the Dell specific Sensors only. * The below function will append the additional information Strings/description to the normal sel desc. * With this the SEL will display additional information sent via OEM Bytes of the SEL Record. * NOTE : Specific to DELL Platforms only. @@ -738,7 +712,7 @@ char * get_dell_evt_desc(struct ipmi_intf * intf, struct sel_event_record * rec) if (0x6F == rec->sel_type.standard_type.event_type) { sensor_type = rec->sel_type.standard_type.sensor_type; - /* Allocate mem for te Description string */ + /* Allocate mem for the Description string */ desc = (char*)malloc(SIZE_OF_DESC); if(NULL == desc) return NULL; @@ -787,17 +761,17 @@ char * get_dell_evt_desc(struct ipmi_intf * intf, struct sel_event_record * rec) if (NULL == rsp) { lprintf(LOG_ERR, " Error getting system info"); - if (desc != NULL) { + if (desc) { free(desc); desc = NULL; } return NULL; } - else if (rsp->ccode > 0) + else if (rsp->ccode) { lprintf(LOG_ERR, " Error getting system info: %s", val2str(rsp->ccode, completion_code_vals)); - if (desc != NULL) { + if (desc) { free(desc); desc = NULL; } @@ -896,11 +870,11 @@ char * get_dell_evt_desc(struct ipmi_intf * intf, struct sel_event_record * rec) if(SENSOR_TYPE_EVT_LOG == sensor_type) { if(0x03 == (data1 & MASK_LOWER_NIBBLE)) - snprintf(desc,SIZE_OF_DESC,"All Even Logging Dissabled"); + snprintf(desc,SIZE_OF_DESC,"All Even Logging Disabled"); } } /* - * Based on the above error, we need to find whcih memory slot or + * Based on the above error, we need to find which memory slot or * Card has got the Errors/Sel Generated. */ if(data1 & OEM_CODE_IN_BYTE2 ) @@ -1042,7 +1016,7 @@ char * get_dell_evt_desc(struct ipmi_intf * intf, struct sel_event_record * rec) } break; - /* This Event is for BMC to Othe Hardware or CPU . */ + /* This Event is for BMC to other Hardware or CPU . */ case SENSOR_TYPE_VER_CHANGE: if((0x02 == (data1 & MASK_LOWER_NIBBLE))&&((data1 & OEM_CODE_IN_BYTE2) && (data1 & OEM_CODE_IN_BYTE3))) { @@ -1231,8 +1205,8 @@ ipmi_get_oem_desc(struct ipmi_intf * intf, struct sel_event_record * rec) switch (ipmi_get_oem(intf)) { - case IPMI_OEM_NEWISYS: - desc = get_newisys_evt_desc(intf, rec); + case IPMI_OEM_VIKING: + desc = get_viking_evt_desc(intf, rec); break; case IPMI_OEM_KONTRON: desc = get_kontron_evt_desc(intf, rec); @@ -1244,6 +1218,9 @@ ipmi_get_oem_desc(struct ipmi_intf * intf, struct sel_event_record * rec) case IPMI_OEM_SUPERMICRO_47488: desc = get_supermicro_evt_desc(intf, rec); break; + case IPMI_OEM_QUANTA: + desc = oem_qct_get_evt_desc(intf, rec); + break; case IPMI_OEM_UNKNOWN: default: break; @@ -1282,9 +1259,9 @@ ipmi_get_first_event_sensor_type(struct ipmi_intf *intf, code = event_type; } - for (evt = start; evt->desc != NULL || next != NULL; evt++) { + for (evt = start; evt->desc || next; evt++) { /* check if VITA sensor event types has finished */ - if (evt->desc == NULL) { + if (!evt->desc) { /* proceed with next table */ evt = next; next = NULL; @@ -1303,7 +1280,7 @@ ipmi_get_next_event_sensor_type(const struct ipmi_event_sensor_types *evt) { const struct ipmi_event_sensor_types *start = evt; - for (evt = start + 1; evt->desc != NULL; evt++) { + for (evt = start + 1; evt->desc; evt++) { if (evt->code == start->code) { return evt; } @@ -1321,7 +1298,7 @@ ipmi_get_event_desc(struct ipmi_intf * intf, struct sel_event_record * rec, char char *sfx = NULL; /* This will be assigned if the Platform is DELL, additional info is appended to the current Description */ - if (desc == NULL) + if (!desc) return; *desc = NULL; @@ -1349,6 +1326,9 @@ ipmi_get_event_desc(struct ipmi_intf * intf, struct sel_event_record * rec, char sfx = ipmi_get_oem_desc(intf, rec); break; /* add your oem sensor assignation here */ + case IPMI_OEM_QUANTA: + sfx = ipmi_get_oem_desc(intf, rec); + break; default: lprintf(LOG_DEBUG, "oem sensor type %x using standard type supplied description", rec->sel_type.standard_type.sensor_type ); @@ -1359,9 +1339,12 @@ ipmi_get_event_desc(struct ipmi_intf * intf, struct sel_event_record * rec, char case IPMI_OEM_SUPERMICRO: case IPMI_OEM_SUPERMICRO_47488: sfx = ipmi_get_oem_desc(intf, rec); - break; + break; + case IPMI_OEM_QUANTA: + sfx = ipmi_get_oem_desc(intf, rec); + break; default: - break; + break; } } /* @@ -1387,10 +1370,11 @@ ipmi_get_event_desc(struct ipmi_intf * intf, struct sel_event_record * rec, char offset = rec->sel_type.standard_type.event_data[0] & 0xf; for (evt = ipmi_get_first_event_sensor_type(intf, - rec->sel_type.standard_type.sensor_type, - rec->sel_type.standard_type.event_type); - evt != NULL; evt = ipmi_get_next_event_sensor_type(evt)) { - if ((evt->offset == offset && evt->desc != NULL) && + rec->sel_type.standard_type.sensor_type, + rec->sel_type.standard_type.event_type); + evt; evt = ipmi_get_next_event_sensor_type(evt)) + { + if ((evt->offset == offset && evt->desc) && ((evt->data == ALL_OFFSETS_SPECIFIED) || ((rec->sel_type.standard_type.event_data[0] & DATA_BYTE2_SPECIFIED_MASK) && (evt->data == rec->sel_type.standard_type.event_data[1])))) @@ -1513,7 +1497,7 @@ ipmi_get_sensor_type(struct ipmi_intf *intf, uint8_t code) type = ipmi_get_generic_sensor_type(code); } - if (type == NULL) { + if (!type) { type = "Unknown"; } @@ -1537,10 +1521,10 @@ ipmi_sel_get_info(struct ipmi_intf * intf) req.msg.cmd = IPMI_CMD_GET_SEL_INFO; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Get SEL Info command failed"); return -1; - } else if (rsp->ccode > 0) { + } else if (rsp->ccode) { lprintf(LOG_ERR, "Get SEL Info command failed: %s", val2str(rsp->ccode, completion_code_vals)); return -1; @@ -1583,14 +1567,14 @@ ipmi_sel_get_info(struct ipmi_intf * intf) printf("Last Add Time : Not Available\n"); else printf("Last Add Time : %s\n", - ipmi_sel_timestamp(buf2long(rsp->data + 5))); + ipmi_timestamp_numeric(buf2long(rsp->data + 5))); if ((!memcmp(rsp->data + 9, &fs, 4)) || (!memcmp(rsp->data + 9, &zeros, 4))) printf("Last Del Time : Not Available\n"); else printf("Last Del Time : %s\n", - ipmi_sel_timestamp(buf2long(rsp->data + 9))); + ipmi_timestamp_numeric(buf2long(rsp->data + 9))); printf("Overflow : %s\n", @@ -1618,12 +1602,12 @@ ipmi_sel_get_info(struct ipmi_intf * intf) req.msg.cmd = IPMI_CMD_GET_SEL_ALLOC_INFO; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Get SEL Allocation Info command failed"); return -1; } - if (rsp->ccode > 0) { + if (rsp->ccode) { lprintf(LOG_ERR, "Get SEL Allocation Info command failed: %s", val2str(rsp->ccode, completion_code_vals)); @@ -1664,11 +1648,11 @@ ipmi_sel_get_std_entry(struct ipmi_intf * intf, uint16_t id, req.msg.data_len = 6; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Get SEL Entry %x command failed", id); return 0; } - if (rsp->ccode > 0) { + if (rsp->ccode) { lprintf(LOG_ERR, "Get SEL Entry %x command failed: %s", id, val2str(rsp->ccode, completion_code_vals)); return 0; @@ -1751,7 +1735,7 @@ ipmi_sel_print_event_file(struct ipmi_intf * intf, struct sel_event_record * evt { char * description; - if (fp == NULL) + if (!fp) return; ipmi_get_event_desc(intf, evt, &description); @@ -1766,9 +1750,9 @@ ipmi_sel_print_event_file(struct ipmi_intf * intf, struct sel_event_record * evt evt->sel_type.standard_type.event_data[2], ipmi_get_sensor_type(intf, evt->sel_type.standard_type.sensor_type), evt->sel_type.standard_type.sensor_num, - (description != NULL) ? description : "Unknown"); + description ? description : "Unknown"); - if (description != NULL) { + if (description) { free(description); description = NULL; } @@ -1828,18 +1812,19 @@ ipmi_sel_print_std_entry(struct ipmi_intf * intf, struct sel_event_record * evt) } else { if (evt->record_type < 0xc0) - printf("%s", ipmi_sel_timestamp_date(evt->sel_type.standard_type.timestamp)); + printf("%s", ipmi_timestamp_date(evt->sel_type.standard_type.timestamp)); else - printf("%s", ipmi_sel_timestamp_date(evt->sel_type.oem_ts_type.timestamp)); + printf("%s", ipmi_timestamp_date(evt->sel_type.oem_ts_type.timestamp)); + if (csv_output) printf(","); else printf(" | "); - + if (evt->record_type < 0xc0) - printf("%s", ipmi_sel_timestamp_time(evt->sel_type.standard_type.timestamp)); + printf("%s", ipmi_timestamp_time(evt->sel_type.standard_type.timestamp)); else - printf("%s", ipmi_sel_timestamp_time(evt->sel_type.oem_ts_type.timestamp)); + printf("%s", ipmi_timestamp_time(evt->sel_type.oem_ts_type.timestamp)); if (csv_output) printf(","); @@ -1877,13 +1862,13 @@ ipmi_sel_print_std_entry(struct ipmi_intf * intf, struct sel_event_record * evt) for(data_count=0;data_count < SEL_OEM_NOTS_DATA_LEN;data_count++) printf("%02x", evt->sel_type.oem_nots_type.oem_defined[data_count]); } - ipmi_sel_oem_message(evt, 0); + ipmi_sel_oem_message(evt); printf ("\n"); return; } /* lookup SDR entry based on sensor number and type */ - if (sdr != NULL) { + if (sdr) { printf("%s ", ipmi_get_sensor_type(intf, evt->sel_type.standard_type.sensor_type)); switch (sdr->type) { @@ -1940,7 +1925,7 @@ ipmi_sel_print_std_entry(struct ipmi_intf * intf, struct sel_event_record * evt) printf("Asserted"); } - if (sdr != NULL && evt->sel_type.standard_type.event_type == 1) { + if (sdr && evt->sel_type.standard_type.event_type == 1) { /* * Threshold Event */ @@ -1970,8 +1955,20 @@ ipmi_sel_print_std_entry(struct ipmi_intf * intf, struct sel_event_record * evt) (trigger_reading==(int)trigger_reading) ? 0 : 2, trigger_reading); if (threshold_reading_provided) { + /* According to Table 29-6, Event Data byte 1 contains, + * among other info, the offset from the Threshold type + * code. According to Table 42-2, all even offsets + * are 'going low', and all odd offsets are 'going high' + */ + bool going_high = + (evt->sel_type.standard_type.event_data[0] + & EVENT_OFFSET_MASK) % 2; + if (evt->sel_type.standard_type.event_dir) { + /* Event is de-asserted so the inequality is reversed */ + going_high = !going_high; + } printf(" %s Threshold %.*f %s", - ((evt->sel_type.standard_type.event_data[0] & 0xf) % 2) ? ">" : "<", + going_high ? ">" : "<", (threshold_reading==(int)threshold_reading) ? 0 : 2, threshold_reading, ipmi_sdr_get_unit_string(sdr->record.common->unit.pct, @@ -1986,9 +1983,12 @@ ipmi_sel_print_std_entry(struct ipmi_intf * intf, struct sel_event_record * evt) case IPMI_OEM_SUPERMICRO: case IPMI_OEM_SUPERMICRO_47488: print_sensor = 0; - break; + break; + case IPMI_OEM_QUANTA: + print_sensor = 0; + break; default: - break; + break; } /* * Sensor-Specific Discrete @@ -2043,11 +2043,11 @@ ipmi_sel_print_std_entry_verbose(struct ipmi_intf * intf, struct sel_event_recor { printf(" Timestamp : "); if (evt->record_type < 0xc0) - printf("%s %s", ipmi_sel_timestamp_date(evt->sel_type.standard_type.timestamp), - ipmi_sel_timestamp_time(evt->sel_type.standard_type.timestamp)); + printf("%s %s", ipmi_timestamp_date(evt->sel_type.standard_type.timestamp), + ipmi_timestamp_time(evt->sel_type.standard_type.timestamp)); else - printf("%s %s", ipmi_sel_timestamp_date(evt->sel_type.oem_ts_type.timestamp), - ipmi_sel_timestamp_time(evt->sel_type.oem_ts_type.timestamp)); + printf("%s %s", ipmi_timestamp_date(evt->sel_type.oem_ts_type.timestamp), + ipmi_timestamp_time(evt->sel_type.oem_ts_type.timestamp)); printf("\n"); } @@ -2068,7 +2068,7 @@ ipmi_sel_print_std_entry_verbose(struct ipmi_intf * intf, struct sel_event_recor for(data_count=0;data_count < SEL_OEM_NOTS_DATA_LEN;data_count++) printf("%02x", evt->sel_type.oem_nots_type.oem_defined[data_count]); printf(" [%s]\n\n",hex2ascii (evt->sel_type.oem_nots_type.oem_defined, SEL_OEM_NOTS_DATA_LEN)); - ipmi_sel_oem_message(evt, 1); + ipmi_sel_oem_message(evt); } return; } @@ -2111,7 +2111,7 @@ ipmi_sel_print_extended_entry_verbose(struct ipmi_intf * intf, struct sel_event_ evt->sel_type.standard_type.gen_id, evt->sel_type.standard_type.sensor_num, evt->sel_type.standard_type.sensor_type); - if (sdr == NULL) + if (!sdr) { ipmi_sel_print_std_entry_verbose(intf, evt); return; @@ -2133,8 +2133,8 @@ ipmi_sel_print_extended_entry_verbose(struct ipmi_intf * intf, struct sel_event_ if (evt->record_type < 0xe0) { printf(" Timestamp : "); - printf("%s %s\n", ipmi_sel_timestamp_date(evt->sel_type.standard_type.timestamp), - ipmi_sel_timestamp_time(evt->sel_type.standard_type.timestamp)); + printf("%s %s\n", ipmi_timestamp_date(evt->sel_type.standard_type.timestamp), + ipmi_timestamp_time(evt->sel_type.standard_type.timestamp)); } @@ -2268,11 +2268,11 @@ __ipmi_sel_savelist_entries(struct ipmi_intf * intf, int count, const char * sav req.msg.cmd = IPMI_CMD_GET_SEL_INFO; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Get SEL Info command failed"); return -1; } - if (rsp->ccode > 0) { + if (rsp->ccode) { lprintf(LOG_ERR, "Get SEL Info command failed: %s", val2str(rsp->ccode, completion_code_vals)); return -1; @@ -2285,21 +2285,6 @@ __ipmi_sel_savelist_entries(struct ipmi_intf * intf, int count, const char * sav return 0; } - memset(&req, 0, sizeof(req)); - req.msg.netfn = IPMI_NETFN_STORAGE; - req.msg.cmd = IPMI_CMD_RESERVE_SEL; - - rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { - lprintf(LOG_ERR, "Reserve SEL command failed"); - return -1; - } - if (rsp->ccode > 0) { - lprintf(LOG_ERR, "Reserve SEL command failed: %s", - val2str(rsp->ccode, completion_code_vals)); - return -1; - } - if (count < 0) { /** Show only the most recent 'count' records. */ int i; @@ -2307,11 +2292,11 @@ __ipmi_sel_savelist_entries(struct ipmi_intf * intf, int count, const char * sav req.msg.cmd = IPMI_CMD_GET_SEL_INFO; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Get SEL Info command failed"); return -1; } - if (rsp->ccode > 0) { + if (rsp->ccode) { lprintf(LOG_ERR, "Get SEL Info command failed: %s", val2str(rsp->ccode, completion_code_vals)); return -1; @@ -2336,7 +2321,7 @@ __ipmi_sel_savelist_entries(struct ipmi_intf * intf, int count, const char * sav } } - if (savefile != NULL) { + if (savefile) { fp = ipmi_open_file_write(savefile); } @@ -2361,7 +2346,7 @@ __ipmi_sel_savelist_entries(struct ipmi_intf * intf, int count, const char * sav else ipmi_sel_print_std_entry(intf, &evt); - if (fp != NULL) { + if (fp) { if (binary) fwrite(&evt, 1, 16, fp); else @@ -2373,7 +2358,7 @@ __ipmi_sel_savelist_entries(struct ipmi_intf * intf, int count, const char * sav } } - if (fp != NULL) + if (fp) fclose(fp); return 0; @@ -2410,7 +2395,7 @@ ipmi_sel_interpret(struct ipmi_intf *intf, unsigned long iana, * the command line */ sel_iana = iana; - if (strncmp("pps", format, 3) == 0) { + if (!strcmp("pps", format)) { /* Parser for the following format */ /* 0x001F: Event: at Mar 27 06:41:10 2007;from:(0x9a,0,7); * sensor:(0xc3,119); event:0x6f(asserted): 0xA3 0x00 0x88 @@ -2418,13 +2403,13 @@ ipmi_sel_interpret(struct ipmi_intf *intf, unsigned long iana, * Supports a tweak for hotswap events that are already interpreted. */ fp = ipmi_open_file(readfile, 0); - if (fp == NULL) { + if (!fp) { lprintf(LOG_ERR, "Failed to open file '%s' for reading.", readfile); return (-1); } buffer = (char *)malloc((size_t)256); - if (buffer == NULL) { + if (!buffer) { lprintf(LOG_ERR, "ipmitool: malloc failure"); fclose(fp); return (-1); @@ -2433,7 +2418,7 @@ ipmi_sel_interpret(struct ipmi_intf *intf, unsigned long iana, /* Only allow complete lines to be parsed, * hardcoded maximum line length */ - if (fgets(buffer, 256, fp) == NULL) { + if (!fgets(buffer, 256, fp)) { status = (-1); break; } @@ -2687,11 +2672,11 @@ ipmi_sel_reserve(struct ipmi_intf * intf) req.msg.cmd = IPMI_CMD_RESERVE_SEL; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_WARN, "Unable to reserve SEL"); return 0; } - if (rsp->ccode > 0) { + if (rsp->ccode) { printf("Unable to reserve SEL: %s", val2str(rsp->ccode, completion_code_vals)); return 0; @@ -2713,8 +2698,6 @@ ipmi_sel_get_time(struct ipmi_intf * intf) { struct ipmi_rs * rsp; struct ipmi_rq req; - static char tbuf[40]; - uint32_t timei; time_t time; memset(&req, 0, sizeof(req)); @@ -2723,13 +2706,12 @@ ipmi_sel_get_time(struct ipmi_intf * intf) rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { - lprintf(LOG_ERR, "Get SEL Time command failed"); - return -1; - } - if (rsp->ccode > 0) { + if (!rsp || rsp->ccode) { lprintf(LOG_ERR, "Get SEL Time command failed: %s", - val2str(rsp->ccode, completion_code_vals)); + rsp + ? val2str(rsp->ccode, completion_code_vals) + : "Unknown" + ); return -1; } if (rsp->data_len != 4) { @@ -2738,15 +2720,8 @@ ipmi_sel_get_time(struct ipmi_intf * intf) return -1; } - memcpy(&timei, rsp->data, 4); -#if WORDS_BIGENDIAN - time = (time_t)(BSWAP_32(timei)); -#else - time = (time_t)timei; -#endif - - strftime(tbuf, sizeof(tbuf), "%m/%d/%Y %H:%M:%S", gmtime(&time)); - printf("%s\n", tbuf); + time = ipmi32toh(rsp->data); + printf("%s\n", ipmi_timestamp_numeric(time)); return 0; } @@ -2762,76 +2737,65 @@ ipmi_sel_get_time(struct ipmi_intf * intf) static int ipmi_sel_set_time(struct ipmi_intf * intf, const char * time_string) { - struct ipmi_rs * rsp; - struct ipmi_rq req; - struct tm tm = {0}; - time_t t; - uint32_t timei; - const char * time_format = "%m/%d/%Y %H:%M:%S"; + struct ipmi_rs *rsp; + struct ipmi_rq req; + struct tm tm = {0}; + uint8_t msg_data[4] = {0}; + time_t t; + const char *time_format = "%x %X"; /* Use locale-defined format */ memset(&req, 0, sizeof(req)); req.msg.netfn = IPMI_NETFN_STORAGE; req.msg.cmd = IPMI_SET_SEL_TIME; /* See if user requested set to current client system time */ - if (strncasecmp(time_string, "now", 3) == 0) { + if (strcasecmp(time_string, "now") == 0) { t = time(NULL); + /* + * Now we have local time in t, but BMC requires UTC + */ + t = ipmi_localtime2utc(t); } else { - /* Now how do we get our time_t from our ascii version? */ - if (strptime(time_string, time_format, &tm) == 0) { - lprintf(LOG_ERR, "Specified time could not be parsed"); - return -1; + bool error = true; /* Assume the string is invalid */ + /* Now let's extract time_t from the supplied string */ + if (strptime(time_string, time_format, &tm) != NULL) { + tm.tm_isdst = (-1); /* look up DST information */ + t = mktime(&tm); + if (t >= 0) { + /* Surprisingly, the user hasn't mistaken ;) */ + error = false; + } } - tm.tm_isdst = (-1); /* look up DST information */ - t = mktime(&tm); - if (t < 0) { + + if (error) { lprintf(LOG_ERR, "Specified time could not be parsed"); return -1; } + + /* + * If `-c` wasn't specified then t we've just got is in local timesone + */ + if (!time_in_utc) { + t = ipmi_localtime2utc(t); + } } - { - //modify UTC time to local time expressed in number of seconds from 1/1/70 0:0:0 1970 GMT - struct tm * tm_tmp = {0}; - int gt_year,gt_yday,gt_hour,gt_min,lt_year,lt_yday,lt_hour,lt_min; - int delta_hour; - tm_tmp=gmtime(&t); - gt_year=tm_tmp->tm_year; - gt_yday=tm_tmp->tm_yday; - gt_hour=tm_tmp->tm_hour; - gt_min=tm_tmp->tm_min; - memset(&*tm_tmp, 0, sizeof(struct tm)); - tm_tmp=localtime(&t); - lt_year=tm_tmp->tm_year; - lt_yday=tm_tmp->tm_yday; - lt_hour=tm_tmp->tm_hour; - lt_min=tm_tmp->tm_min; - delta_hour=lt_hour - gt_hour; - if ( (lt_year > gt_year) || ((lt_year == gt_year) && (lt_yday > gt_yday)) ) - delta_hour += 24; - if ( (lt_year < gt_year) || ((lt_year == gt_year) && (lt_yday < gt_yday)) ) - delta_hour -= 24; - - t += (delta_hour * 60 * 60) + (lt_min - gt_min) * 60; - } - - timei = (uint32_t)t; - req.msg.data = (uint8_t *)&timei; - req.msg.data_len = 4; - -#if WORDS_BIGENDIAN - timei = BSWAP_32(timei); -#endif + /* + * At this point `t` is UTC. Convert it to LE and send. + */ + + req.msg.data = msg_data; + htoipmi32(t, req.msg.data); + req.msg.data_len = sizeof(msg_data); rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { - lprintf(LOG_ERR, "Set SEL Time command failed"); - return -1; - } - if (rsp->ccode > 0) { + if (!rsp || rsp->ccode) { lprintf(LOG_ERR, "Set SEL Time command failed: %s", - val2str(rsp->ccode, completion_code_vals)); + rsp + ? val2str(rsp->ccode, completion_code_vals) + : "Unknown" + ); return -1; } @@ -2840,8 +2804,6 @@ ipmi_sel_set_time(struct ipmi_intf * intf, const char * time_string) return 0; } - - static int ipmi_sel_clear(struct ipmi_intf * intf) { @@ -2869,11 +2831,11 @@ ipmi_sel_clear(struct ipmi_intf * intf) req.msg.data_len = 6; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Unable to clear SEL"); return -1; } - if (rsp->ccode > 0) { + if (rsp->ccode) { lprintf(LOG_ERR, "Unable to clear SEL: %s", val2str(rsp->ccode, completion_code_vals)); return -1; @@ -2892,7 +2854,7 @@ ipmi_sel_delete(struct ipmi_intf * intf, int argc, char ** argv) uint8_t msg_data[4]; int rc = 0; - if (argc == 0 || strncmp(argv[0], "help", 4) == 0) { + if (!argc || !strcmp(argv[0], "help")) { lprintf(LOG_ERR, "usage: delete <id>...<id>\n"); return -1; } @@ -2923,11 +2885,11 @@ ipmi_sel_delete(struct ipmi_intf * intf, int argc, char ** argv) req.msg.data_len = 4; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Unable to delete entry %d", id); rc = -1; } - else if (rsp->ccode > 0) { + else if (rsp->ccode) { lprintf(LOG_ERR, "Unable to delete entry %d: %s", id, val2str(rsp->ccode, completion_code_vals)); rc = -1; @@ -2953,16 +2915,11 @@ ipmi_sel_show_entry(struct ipmi_intf * intf, int argc, char ** argv) int rc = 0; uint16_t id; - if (argc == 0 || strncmp(argv[0], "help", 4) == 0) { + if (!argc || !strcmp(argv[0], "help")) { lprintf(LOG_ERR, "usage: sel get <id>...<id>"); return (-1); } - if (ipmi_sel_reserve(intf) == 0) { - lprintf(LOG_ERR, "Unable to reserve SEL"); - return (-1); - } - for (i = 0; i < argc; i++) { if (str2ushort(argv[i], &id) != 0) { lprintf(LOG_ERR, "Given SEL ID '%s' is invalid.", @@ -2994,7 +2951,7 @@ ipmi_sel_show_entry(struct ipmi_intf * intf, int argc, char ** argv) evt.sel_type.standard_type.gen_id, evt.sel_type.standard_type.sensor_num, evt.sel_type.standard_type.sensor_type); - if (sdr == NULL) { + if (!sdr) { continue; } @@ -3042,10 +2999,10 @@ int ipmi_sel_main(struct ipmi_intf * intf, int argc, char ** argv) if (argc == 0) rc = ipmi_sel_get_info(intf); - else if (strncmp(argv[0], "help", 4) == 0) + else if (!strcmp(argv[0], "help")) lprintf(LOG_ERR, "SEL Commands: " "info clear delete list elist get add time save readraw writeraw interpret"); - else if (strncmp(argv[0], "interpret", 9) == 0) { + else if (!strcmp(argv[0], "interpret")) { uint32_t iana = 0; if (argc < 4) { lprintf(LOG_NOTICE, "usage: sel interpret iana filename format(pps)"); @@ -3058,37 +3015,37 @@ int ipmi_sel_main(struct ipmi_intf * intf, int argc, char ** argv) } rc = ipmi_sel_interpret(intf, iana, argv[2], argv[3]); } - else if (strncmp(argv[0], "info", 4) == 0) + else if (!strcmp(argv[0], "info")) rc = ipmi_sel_get_info(intf); - else if (strncmp(argv[0], "save", 4) == 0) { + else if (!strcmp(argv[0], "save")) { if (argc < 2) { lprintf(LOG_NOTICE, "usage: sel save <filename>"); return 0; } rc = ipmi_sel_save_entries(intf, 0, argv[1]); } - else if (strncmp(argv[0], "add", 3) == 0) { + else if (!strcmp(argv[0], "add")) { if (argc < 2) { lprintf(LOG_NOTICE, "usage: sel add <filename>"); return 0; } rc = ipmi_sel_add_entries_fromfile(intf, argv[1]); } - else if (strncmp(argv[0], "writeraw", 8) == 0) { + else if (!strcmp(argv[0], "writeraw")) { if (argc < 2) { lprintf(LOG_NOTICE, "usage: sel writeraw <filename>"); return 0; } rc = ipmi_sel_writeraw(intf, argv[1]); } - else if (strncmp(argv[0], "readraw", 7) == 0) { + else if (!strcmp(argv[0], "readraw")) { if (argc < 2) { lprintf(LOG_NOTICE, "usage: sel readraw <filename>"); return 0; } rc = ipmi_sel_readraw(intf, argv[1]); } - else if (strncmp(argv[0], "ereadraw", 8) == 0) { + else if (!strcmp(argv[0], "ereadraw")) { if (argc < 2) { lprintf(LOG_NOTICE, "usage: sel ereadraw <filename>"); return 0; @@ -3096,8 +3053,9 @@ int ipmi_sel_main(struct ipmi_intf * intf, int argc, char ** argv) sel_extended = 1; rc = ipmi_sel_readraw(intf, argv[1]); } - else if (strncmp(argv[0], "list", 4) == 0 || - strncmp(argv[0], "elist", 5) == 0) { + else if (!strcmp(argv[0], "list") + || !strcmp(argv[0], "elist")) + { /* * Usage: * list - show all SEL entries @@ -3108,7 +3066,7 @@ int ipmi_sel_main(struct ipmi_intf * intf, int argc, char ** argv) int sign = 1; char *countstr = NULL; - if (strncmp(argv[0], "elist", 5) == 0) + if (!strcmp(argv[0], "elist")) sel_extended = 1; else sel_extended = 0; @@ -3119,10 +3077,10 @@ int ipmi_sel_main(struct ipmi_intf * intf, int argc, char ** argv) else if (argc == 3) { countstr = argv[2]; - if (strncmp(argv[1], "last", 4) == 0) { + if (!strcmp(argv[1], "last")) { sign = -1; } - else if (strncmp(argv[1], "first", 5) != 0) { + else if (strcmp(argv[1], "first")) { lprintf(LOG_ERR, "Unknown sel list option"); return -1; } @@ -3139,26 +3097,26 @@ int ipmi_sel_main(struct ipmi_intf * intf, int argc, char ** argv) rc = ipmi_sel_list_entries(intf,count); } - else if (strncmp(argv[0], "clear", 5) == 0) + else if (!strcmp(argv[0], "clear")) rc = ipmi_sel_clear(intf); - else if (strncmp(argv[0], "delete", 6) == 0) { + else if (!strcmp(argv[0], "delete")) { if (argc < 2) lprintf(LOG_ERR, "usage: sel delete <id>...<id>"); else rc = ipmi_sel_delete(intf, argc-1, &argv[1]); } - else if (strncmp(argv[0], "get", 3) == 0) { + else if (!strcmp(argv[0], "get")) { if (argc < 2) lprintf(LOG_ERR, "usage: sel get <entry>"); else rc = ipmi_sel_show_entry(intf, argc-1, &argv[1]); } - else if (strncmp(argv[0], "time", 4) == 0) { + else if (!strcmp(argv[0], "time")) { if (argc < 2) lprintf(LOG_ERR, "sel time commands: get set"); - else if (strncmp(argv[1], "get", 3) == 0) + else if (!strcmp(argv[1], "get")) ipmi_sel_get_time(intf); - else if (strncmp(argv[1], "set", 3) == 0) { + else if (!strcmp(argv[1], "set")) { if (argc < 3) lprintf(LOG_ERR, "usage: sel time set \"mm/dd/yyyy hh:mm:ss\""); else diff --git a/lib/ipmi_sensor.c b/lib/ipmi_sensor.c index a0b7eb8..45d6d6d 100644 --- a/lib/ipmi_sensor.c +++ b/lib/ipmi_sensor.c @@ -62,7 +62,7 @@ ipmi_sensor_get_sensor_reading_factors( char id[17]; - if (intf == NULL || sensor == NULL) + if (!intf || !sensor) return -1; memset(id, 0, sizeof(id)); @@ -80,7 +80,7 @@ ipmi_sensor_get_sensor_reading_factors( rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Error updating reading factor for sensor %s (#%02x)", id, sensor->cmn.keys.sensor_num); return -1; @@ -164,12 +164,30 @@ ipmi_sensor_print_fc_discrete(struct ipmi_intf *intf, sr = ipmi_sdr_read_sensor_value(intf, sensor, sdr_record_type, 3); - if (sr == NULL) { + if (!sr) { return -1; } if (csv_output) { - /* NOT IMPLEMENTED */ + printf("%s", sr->s_id); + if (sr->s_reading_valid) { + if (sr->s_has_analog_value) { + /* don't show discrete component */ + printf(",%s,%s,%s", + sr->s_a_str, sr->s_a_units, "ok"); + } else { + printf(",0x%x,%s,0x%02x%02x", + sr->s_reading, "discrete", + sr->s_data2, sr->s_data3); + } + } else { + printf(",%s,%s,%s", + "na", "discrete", "na"); + } + printf(",%s,%s,%s,%s,%s,%s", + "na", "na", "na", "na", "na", "na"); + + printf("\n"); } else { if (verbose == 0) { /* output format @@ -242,6 +260,184 @@ print_thresh_setting(struct sdr_record_full_sensor *full, } } +static void +dump_sensor_fc_thredshold_csv( + int thresh_available, + const char *thresh_status, + struct ipmi_rs *rsp, + struct sensor_reading *sr) +{ + printf("%s", sr->s_id); + if (sr->s_reading_valid) { + if (sr->s_has_analog_value) + printf(",%.3f,%s,%s", + sr->s_a_val, sr->s_a_units, thresh_status); + else + printf(",0x%x,%s,%s", + sr->s_reading, sr->s_a_units, thresh_status); + } else { + printf(",%s,%s,%s", + "na", sr->s_a_units, "na"); + } + if (thresh_available && sr->full) { +#define PTS(bit, dataidx) { \ +print_thresh_setting(sr->full, rsp->data[0] & (bit), \ +rsp->data[(dataidx)], ",", "%.3f", "0x%x", "%s"); \ +} + PTS(LOWER_NON_RECOV_SPECIFIED, 3); + PTS(LOWER_CRIT_SPECIFIED, 2); + PTS(LOWER_NON_CRIT_SPECIFIED, 1); + PTS(UPPER_NON_CRIT_SPECIFIED, 4); + PTS(UPPER_CRIT_SPECIFIED, 5); + PTS(UPPER_NON_RECOV_SPECIFIED, 6); +#undef PTS + } else { + printf(",%s,%s,%s,%s,%s,%s", + "na", "na", "na", "na", "na", "na"); + } + printf("\n"); +} + +/* output format + * id value units status thresholds.... + */ +static void +dump_sensor_fc_thredshold( + int thresh_available, + const char *thresh_status, + struct ipmi_rs *rsp, + struct sensor_reading *sr) +{ + printf("%-16s ", sr->s_id); + if (sr->s_reading_valid) { + if (sr->s_has_analog_value) + printf("| %-10.3f | %-10s | %-6s", + sr->s_a_val, sr->s_a_units, thresh_status); + else + printf("| 0x%-8x | %-10s | %-6s", + sr->s_reading, sr->s_a_units, thresh_status); + } else { + printf("| %-10s | %-10s | %-6s", + "na", sr->s_a_units, "na"); + } + if (thresh_available && sr->full) { +#define PTS(bit, dataidx) { \ +print_thresh_setting(sr->full, rsp->data[0] & (bit), \ +rsp->data[(dataidx)], "| ", "%-10.3f", "0x%-8x", "%-10s"); \ +} + PTS(LOWER_NON_RECOV_SPECIFIED, 3); + PTS(LOWER_CRIT_SPECIFIED, 2); + PTS(LOWER_NON_CRIT_SPECIFIED, 1); + PTS(UPPER_NON_CRIT_SPECIFIED, 4); + PTS(UPPER_CRIT_SPECIFIED, 5); + PTS(UPPER_NON_RECOV_SPECIFIED, 6); +#undef PTS + } else { + printf("| %-10s| %-10s| %-10s| %-10s| %-10s| %-10s", + "na", "na", "na", "na", "na", "na"); + } + + printf("\n"); +} + +static void +dump_sensor_fc_thredshold_verbose( + int thresh_available, + const char *thresh_status, + struct ipmi_intf *intf, + struct sdr_record_common_sensor *sensor, + struct ipmi_rs *rsp, + struct sensor_reading *sr) +{ + printf("Sensor ID : %s (0x%x)\n", + sr->s_id, sensor->keys.sensor_num); + + printf(" Entity ID : %d.%d\n", + sensor->entity.id, sensor->entity.instance); + + printf(" Sensor Type (Threshold) : %s\n", + ipmi_get_sensor_type(intf, sensor->sensor.type)); + + printf(" Sensor Reading : "); + if (sr->s_reading_valid) { + if (sr->full) { + uint16_t raw_tol = __TO_TOL(sr->full->mtol); + if (sr->s_has_analog_value) { + double tol = + sdr_convert_sensor_tolerance(sr->full, + raw_tol); + printf("%.*f (+/- %.*f) %s\n", + (sr->s_a_val == (int) + sr->s_a_val) ? 0 : 3, + sr->s_a_val, + (tol == (int) tol) ? 0 : 3, tol, + sr->s_a_units); + } else { + printf("0x%x (+/- 0x%x) %s\n", + sr->s_reading, + raw_tol, + sr->s_a_units); + } + } else { + printf("0x%x %s\n", + sr->s_reading, sr->s_a_units); + } + printf(" Status : %s\n", thresh_status); + + if (thresh_available) { + if (sr->full) { +#define PTS(bit, dataidx, str) { \ +print_thresh_setting(sr->full, rsp->data[0] & (bit), \ + rsp->data[(dataidx)], \ + (str), "%.3f\n", "0x%x\n", "%s\n"); \ +} + PTS(LOWER_NON_RECOV_SPECIFIED, 3, " Lower Non-Recoverable : "); + PTS(LOWER_CRIT_SPECIFIED, 2, " Lower Critical : "); + PTS(LOWER_NON_CRIT_SPECIFIED, 1, " Lower Non-Critical : "); + PTS(UPPER_NON_CRIT_SPECIFIED, 4, " Upper Non-Critical : "); + PTS(UPPER_CRIT_SPECIFIED, 5, " Upper Critical : "); + PTS(UPPER_NON_RECOV_SPECIFIED, 6, " Upper Non-Recoverable : "); +#undef PTS + + } + ipmi_sdr_print_sensor_hysteresis(sensor, sr->full, + sr->full ? sr->full->threshold.hysteresis.positive : + sr->compact->threshold.hysteresis.positive, + "Positive Hysteresis"); + + ipmi_sdr_print_sensor_hysteresis(sensor, sr->full, + sr->full ? sr->full->threshold.hysteresis.negative : + sr->compact->threshold.hysteresis.negative, + "Negative Hysteresis"); + } else { + printf(" Sensor Threshold Settings not available\n"); + } + } else { + printf(" Unable to read sensor: Device Not Present\n\n"); + } + + ipmi_sdr_print_sensor_event_status(intf, + sensor->keys. + sensor_num, + sensor->sensor.type, + sensor->event_type, + ANALOG_SENSOR, + sensor->keys.owner_id, + sensor->keys.lun, + sensor->keys.channel); + ipmi_sdr_print_sensor_event_enable(intf, + sensor->keys. + sensor_num, + sensor->sensor.type, + sensor->event_type, + ANALOG_SENSOR, + sensor->keys.owner_id, + sensor->keys.lun, + sensor->keys.channel); + + printf("\n"); +} + static int ipmi_sensor_print_fc_threshold(struct ipmi_intf *intf, struct sdr_record_common_sensor *sensor, @@ -253,7 +449,7 @@ ipmi_sensor_print_fc_threshold(struct ipmi_intf *intf, sr = ipmi_sdr_read_sensor_value(intf, sensor, sdr_record_type, 3); - if (sr == NULL) { + if (!sr) { return -1; } @@ -266,137 +462,17 @@ ipmi_sensor_print_fc_threshold(struct ipmi_intf *intf, sensor->keys.sensor_num, sensor->keys.owner_id, sensor->keys.lun, sensor->keys.channel); - if ((rsp == NULL) || (rsp->ccode > 0) || (rsp->data_len == 0)) + if (!rsp || rsp->ccode || !rsp->data_len) thresh_available = 0; if (csv_output) { - /* NOT IMPLEMENTED */ + dump_sensor_fc_thredshold_csv(thresh_available, thresh_status, rsp, sr); } else { if (verbose == 0) { - /* output format - * id value units status thresholds.... - */ - printf("%-16s ", sr->s_id); - if (sr->s_reading_valid) { - if (sr->s_has_analog_value) - printf("| %-10.3f | %-10s | %-6s", - sr->s_a_val, sr->s_a_units, thresh_status); - else - printf("| 0x%-8x | %-10s | %-6s", - sr->s_reading, sr->s_a_units, thresh_status); - } else { - printf("| %-10s | %-10s | %-6s", - "na", sr->s_a_units, "na"); - } - if (thresh_available && sr->full) { -#define PTS(bit, dataidx) { \ - print_thresh_setting(sr->full, rsp->data[0] & (bit), \ - rsp->data[(dataidx)], "| ", "%-10.3f", "0x-8x", "%-10s"); \ -} - PTS(LOWER_NON_RECOV_SPECIFIED, 3); - PTS(LOWER_CRIT_SPECIFIED, 2); - PTS(LOWER_NON_CRIT_SPECIFIED, 1); - PTS(UPPER_NON_CRIT_SPECIFIED, 4); - PTS(UPPER_CRIT_SPECIFIED, 5); - PTS(UPPER_NON_RECOV_SPECIFIED, 6); -#undef PTS - } else { - printf - ("| %-10s| %-10s| %-10s| %-10s| %-10s| %-10s", - "na", "na", "na", "na", "na", "na"); - } - - printf("\n"); + dump_sensor_fc_thredshold(thresh_available, thresh_status, rsp, sr); } else { - printf("Sensor ID : %s (0x%x)\n", - sr->s_id, sensor->keys.sensor_num); - - printf(" Entity ID : %d.%d\n", - sensor->entity.id, sensor->entity.instance); - - printf(" Sensor Type (Threshold) : %s\n", - ipmi_get_sensor_type(intf, sensor->sensor. - type)); - - printf(" Sensor Reading : "); - if (sr->s_reading_valid) { - if (sr->full) { - uint16_t raw_tol = __TO_TOL(sr->full->mtol); - if (sr->s_has_analog_value) { - double tol = - sdr_convert_sensor_tolerance(sr->full, - raw_tol); - printf("%.*f (+/- %.*f) %s\n", - (sr->s_a_val == (int) - sr->s_a_val) ? 0 : 3, - sr->s_a_val, - (tol == (int) tol) ? 0 : 3, tol, - sr->s_a_units); - } else { - printf("0x%x (+/- 0x%x) %s\n", - sr->s_reading, - raw_tol, - sr->s_a_units); - } - } else { - printf("0x%x %s\n", sr->s_reading, - sr->s_a_units); - } - printf(" Status : %s\n", thresh_status); - - if (thresh_available) { - if (sr->full) { -#define PTS(bit, dataidx, str) { \ -print_thresh_setting(sr->full, rsp->data[0] & (bit), \ - rsp->data[(dataidx)], \ - (str), "%.3f\n", "0x%x\n", "%s\n"); \ -} - - PTS(LOWER_NON_RECOV_SPECIFIED, 3, " Lower Non-Recoverable : "); - PTS(LOWER_CRIT_SPECIFIED, 2, " Lower Critical : "); - PTS(LOWER_NON_CRIT_SPECIFIED, 1, " Lower Non-Critical : "); - PTS(UPPER_NON_CRIT_SPECIFIED, 4, " Upper Non-Critical : "); - PTS(UPPER_CRIT_SPECIFIED, 5, " Upper Critical : "); - PTS(UPPER_NON_RECOV_SPECIFIED, 6, " Upper Non-Recoverable : "); -#undef PTS - - } - ipmi_sdr_print_sensor_hysteresis(sensor, sr->full, - sr->full ? sr->full->threshold.hysteresis.positive : - sr->compact->threshold.hysteresis.positive, - "Positive Hysteresis"); - - ipmi_sdr_print_sensor_hysteresis(sensor, sr->full, - sr->full ? sr->full->threshold.hysteresis.negative : - sr->compact->threshold.hysteresis.negative, - "Negative Hysteresis"); - } else { - printf(" Sensor Threshold Settings not available\n"); - } - } else { - printf(" Unable to read sensor: Device Not Present\n\n"); - } - - ipmi_sdr_print_sensor_event_status(intf, - sensor->keys. - sensor_num, - sensor->sensor.type, - sensor->event_type, - ANALOG_SENSOR, - sensor->keys.owner_id, - sensor->keys.lun, - sensor->keys.channel); - ipmi_sdr_print_sensor_event_enable(intf, - sensor->keys. - sensor_num, - sensor->sensor.type, - sensor->event_type, - ANALOG_SENSOR, - sensor->keys.owner_id, - sensor->keys.lun, - sensor->keys.channel); - - printf("\n"); + dump_sensor_fc_thredshold_verbose(thresh_available, thresh_status, + intf, sensor, rsp, sr); } } @@ -424,16 +500,16 @@ ipmi_sensor_list(struct ipmi_intf *intf) lprintf(LOG_DEBUG, "Querying SDR for sensor list"); itr = ipmi_sdr_start(intf, 0); - if (itr == NULL) { + if (!itr) { lprintf(LOG_ERR, "Unable to open SDR for reading"); return -1; } - while ((header = ipmi_sdr_get_next_header(intf, itr)) != NULL) { + while ((header = ipmi_sdr_get_next_header(intf, itr))) { uint8_t *rec; rec = ipmi_sdr_get_record(intf, header, itr); - if (rec == NULL) { + if (!rec) { lprintf(LOG_DEBUG, "rec == NULL"); continue; } @@ -456,7 +532,7 @@ ipmi_sensor_list(struct ipmi_intf *intf) /* rc = (r == 0) ? rc : r; */ } - ipmi_sdr_end(intf, itr); + ipmi_sdr_end(itr); return rc; } @@ -481,11 +557,11 @@ __ipmi_sensor_set_threshold(struct ipmi_intf *intf, rsp = ipmi_sensor_set_sensor_thresholds(intf, num, mask, setting, target, lun, channel); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Error setting threshold"); return -1; } - if (rsp->ccode > 0) { + if (rsp->ccode) { lprintf(LOG_ERR, "Error setting threshold: %s", val2str(rsp->ccode, completion_code_vals)); return -1; @@ -529,7 +605,7 @@ ipmi_sensor_set_threshold(struct ipmi_intf *intf, int argc, char **argv) struct sdr_record_list *sdr; - if (argc < 3 || strncmp(argv[0], "help", 4) == 0) { + if (argc < 3 || !strcmp(argv[0], "help")) { print_sensor_thresh_usage(); return 0; } @@ -537,7 +613,7 @@ ipmi_sensor_set_threshold(struct ipmi_intf *intf, int argc, char **argv) id = argv[0]; thresh = argv[1]; - if (strncmp(thresh, "upper", 5) == 0) { + if (!strcmp(thresh, "upper")) { if (argc < 5) { lprintf(LOG_ERR, "usage: sensor thresh <id> upper <unc> <ucr> <unr>"); @@ -559,7 +635,7 @@ ipmi_sensor_set_threshold(struct ipmi_intf *intf, int argc, char **argv) argv[4]); return (-1); } - } else if (strncmp(thresh, "lower", 5) == 0) { + } else if (!strcmp(thresh, "lower")) { if (argc < 5) { lprintf(LOG_ERR, "usage: sensor thresh <id> lower <lnr> <lcr> <lnc>"); @@ -582,17 +658,17 @@ ipmi_sensor_set_threshold(struct ipmi_intf *intf, int argc, char **argv) return (-1); } } else { - if (strncmp(thresh, "unr", 3) == 0) + if (!strcmp(thresh, "unr")) settingMask = UPPER_NON_RECOV_SPECIFIED; - else if (strncmp(thresh, "ucr", 3) == 0) + else if (!strcmp(thresh, "ucr")) settingMask = UPPER_CRIT_SPECIFIED; - else if (strncmp(thresh, "unc", 3) == 0) + else if (!strcmp(thresh, "unc")) settingMask = UPPER_NON_CRIT_SPECIFIED; - else if (strncmp(thresh, "lnc", 3) == 0) + else if (!strcmp(thresh, "lnc")) settingMask = LOWER_NON_CRIT_SPECIFIED; - else if (strncmp(thresh, "lcr", 3) == 0) + else if (!strcmp(thresh, "lcr")) settingMask = LOWER_CRIT_SPECIFIED; - else if (strncmp(thresh, "lnr", 3) == 0) + else if (!strcmp(thresh, "lnr")) settingMask = LOWER_NON_RECOV_SPECIFIED; else { lprintf(LOG_ERR, @@ -612,7 +688,7 @@ ipmi_sensor_set_threshold(struct ipmi_intf *intf, int argc, char **argv) /* lookup by sensor name */ sdr = ipmi_sdr_find_sdr_byid(intf, id); - if (sdr == NULL) { + if (!sdr) { lprintf(LOG_ERR, "Sensor data record not found!"); return -1; } @@ -721,7 +797,7 @@ ipmi_sensor_set_threshold(struct ipmi_intf *intf, int argc, char **argv) sdr->record.common->keys.owner_id, sdr->record.common->keys.lun, sdr->record.common->keys.channel); - if ((rsp == NULL) || (rsp->ccode > 0)) { + if (!rsp || rsp->ccode) { lprintf(LOG_ERR, "Sensor data record not found!"); return -1; } @@ -810,7 +886,7 @@ ipmi_sensor_get_reading(struct ipmi_intf *intf, int argc, char **argv) struct sdr_record_list *sdr; int i, rc=0; - if (argc < 1 || strncmp(argv[0], "help", 4) == 0) { + if (argc < 1 || !strcmp(argv[0], "help")) { lprintf(LOG_NOTICE, "sensor reading <id> ... [id]"); lprintf(LOG_NOTICE, " id : name of desired sensor"); return -1; @@ -818,7 +894,7 @@ ipmi_sensor_get_reading(struct ipmi_intf *intf, int argc, char **argv) for (i = 0; i < argc; i++) { sdr = ipmi_sdr_find_sdr_byid(intf, argv[i]); - if (sdr == NULL) { + if (!sdr) { lprintf(LOG_ERR, "Sensor \"%s\" not found!", argv[i]); rc = -1; @@ -833,7 +909,7 @@ ipmi_sensor_get_reading(struct ipmi_intf *intf, int argc, char **argv) struct sdr_record_common_sensor *sensor = sdr->record.common; sr = ipmi_sdr_read_sensor_value(intf, sensor, sdr->type, 3); - if (sr == NULL) { + if (!sr) { rc = -1; continue; } @@ -874,7 +950,7 @@ ipmi_sensor_get(struct ipmi_intf *intf, int argc, char **argv) lprintf(LOG_ERR, "Not enough parameters given."); print_sensor_get_usage(); return (-1); - } else if (strcmp(argv[0], "help") == 0) { + } else if (!strcmp(argv[0], "help")) { print_sensor_get_usage(); return 0; } @@ -882,7 +958,7 @@ ipmi_sensor_get(struct ipmi_intf *intf, int argc, char **argv) /* lookup by sensor name */ for (i = 0; i < argc; i++) { sdr = ipmi_sdr_find_sdr_byid(intf, argv[i]); - if (sdr == NULL) { + if (!sdr) { lprintf(LOG_ERR, "Sensor data record \"%s\" not found!", argv[i]); rc = -1; @@ -919,15 +995,15 @@ ipmi_sensor_main(struct ipmi_intf *intf, int argc, char **argv) if (argc == 0) { rc = ipmi_sensor_list(intf); - } else if (strncmp(argv[0], "help", 4) == 0) { + } else if (!strcmp(argv[0], "help")) { lprintf(LOG_NOTICE, "Sensor Commands: list thresh get reading"); - } else if (strncmp(argv[0], "list", 4) == 0) { + } else if (!strcmp(argv[0], "list")) { rc = ipmi_sensor_list(intf); - } else if (strncmp(argv[0], "thresh", 5) == 0) { + } else if (!strcmp(argv[0], "thresh")) { rc = ipmi_sensor_set_threshold(intf, argc - 1, &argv[1]); - } else if (strncmp(argv[0], "get", 3) == 0) { + } else if (!strcmp(argv[0], "get")) { rc = ipmi_sensor_get(intf, argc - 1, &argv[1]); - } else if (strncmp(argv[0], "reading", 7) == 0) { + } else if (!strcmp(argv[0], "reading")) { rc = ipmi_sensor_get_reading(intf, argc - 1, &argv[1]); } else { lprintf(LOG_ERR, "Invalid sensor command: %s", argv[0]); diff --git a/lib/ipmi_session.c b/lib/ipmi_session.c index 141f0f4..70a3521 100644 --- a/lib/ipmi_session.c +++ b/lib/ipmi_session.c @@ -288,12 +288,12 @@ ipmi_get_session_info(struct ipmi_intf * intf, } rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) + if (!rsp) { lprintf(LOG_ERR, "Get Session Info command failed"); retval = -1; } - else if (rsp->ccode > 0) + else if (rsp->ccode) { lprintf(LOG_ERR, "Get Session Info command failed: %s", val2str(rsp->ccode, completion_code_vals)); @@ -302,15 +302,19 @@ ipmi_get_session_info(struct ipmi_intf * intf, if (retval < 0) { - if ((session_request_type == IPMI_SESSION_REQUEST_CURRENT) && - (strncmp(intf->name, "lan", 3) != 0)) + if (session_request_type == IPMI_SESSION_REQUEST_CURRENT + && strcmp(intf->name, "lan")) + { lprintf(LOG_ERR, "It is likely that the channel in use " "does not support sessions"); + } } else { - memcpy(&session_info, rsp->data, rsp->data_len); - print_session_info(&session_info, rsp->data_len); + memcpy(&session_info, rsp->data, + __min(rsp->data_len, sizeof(session_info))); + print_session_info(&session_info, + __min(rsp->data_len, sizeof(session_info))); } break; @@ -322,13 +326,13 @@ ipmi_get_session_info(struct ipmi_intf * intf, rqdata[0] = i++; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) + if (!rsp) { lprintf(LOG_ERR, "Get Session Info command failed"); retval = -1; break; } - else if (rsp->ccode > 0 && rsp->ccode != 0xCC && rsp->ccode != 0xCB) + else if (rsp->ccode && rsp->ccode != 0xCC && rsp->ccode != 0xCB) { lprintf(LOG_ERR, "Get Session Info command failed: %s", val2str(rsp->ccode, completion_code_vals)); @@ -341,8 +345,10 @@ ipmi_get_session_info(struct ipmi_intf * intf, break; } - memcpy(&session_info, rsp->data, rsp->data_len); - print_session_info(&session_info, rsp->data_len); + memcpy(&session_info, rsp->data, + __min(rsp->data_len, sizeof(session_info))); + print_session_info(&session_info, + __min(rsp->data_len, sizeof(session_info))); } while (i <= session_info.session_slot_count); break; @@ -365,14 +371,14 @@ ipmi_session_main(struct ipmi_intf * intf, int argc, char ** argv) { int retval = 0; - if (argc == 0 || strncmp(argv[0], "help", 4) == 0) + if (!argc || !strcmp(argv[0], "help")) { printf_session_usage(); } - else if (strncmp(argv[0], "info", 4) == 0) + else if (!strcmp(argv[0], "info")) { - if ((argc < 2) || strncmp(argv[1], "help", 4) == 0) + if (argc < 2 || !strcmp(argv[1], "help")) { printf_session_usage(); } @@ -381,11 +387,11 @@ ipmi_session_main(struct ipmi_intf * intf, int argc, char ** argv) Ipmi_Session_Request_Type session_request_type = 0; uint32_t id_or_handle = 0; - if (strncmp(argv[1], "active", 6) == 0) + if (!strcmp(argv[1], "active")) session_request_type = IPMI_SESSION_REQUEST_CURRENT; - else if (strncmp(argv[1], "all", 3) == 0) + else if (!strcmp(argv[1], "all")) session_request_type = IPMI_SESSION_REQUEST_ALL; - else if (strncmp(argv[1], "id", 2) == 0) + else if (!strcmp(argv[1], "id")) { if (argc >= 3) { @@ -404,7 +410,7 @@ ipmi_session_main(struct ipmi_intf * intf, int argc, char ** argv) retval = -1; } } - else if (strncmp(argv[1], "handle", 6) == 0) + else if (!strcmp(argv[1], "handle")) { if (argc >= 3) { diff --git a/lib/ipmi_sol.c b/lib/ipmi_sol.c index 3acd5bb..8e7285c 100644 --- a/lib/ipmi_sol.c +++ b/lib/ipmi_sol.c @@ -29,11 +29,6 @@ * LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, * EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. */ -#define _XOPEN_SOURCE -#define _BSD_SOURCE || \ - (_XOPEN_SOURCE >= 500 || \ - _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED) && \ - !(_POSIX_C_SOURCE >= 200809L || _XOPEN_SOURCE >= 700) #include <stdlib.h> #include <string.h> @@ -130,11 +125,11 @@ ipmi_sol_payload_access(struct ipmi_intf * intf, uint8_t channel, /* payload 1 is SOL */ data[2] = 0x02; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Error %sabling SOL payload for user %d on channel %d", enable ? "en" : "dis", userid, channel); rc = (-1); - } else if (rsp->ccode != 0) { + } else if (rsp->ccode) { lprintf(LOG_ERR, "Error %sabling SOL payload for user %d on channel %d: %s", enable ? "en" : "dis", userid, channel, val2str(rsp->ccode, completion_code_vals)); @@ -164,7 +159,7 @@ ipmi_sol_payload_access_status(struct ipmi_intf * intf, data[1] = userid & 0x3f; /* user id */ rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Error. No valid response received."); return -1; } @@ -219,7 +214,7 @@ ipmi_get_sol_info( data[3] = 0x00; /* block selector */ rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Error: No response requesting SOL parameter '%s'", val2str(data[1], sol_parameter_vals)); return (-1); @@ -257,7 +252,7 @@ ipmi_get_sol_info( data[3] = 0x00; /* block selector */ rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Error: No response requesting SOL parameter '%s'", val2str(data[1], sol_parameter_vals)); return (-1); @@ -295,7 +290,7 @@ ipmi_get_sol_info( data[3] = 0x00; /* block selector */ rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Error: No response requesting SOL parameter '%s'", val2str(data[1], sol_parameter_vals)); return (-1); @@ -335,7 +330,7 @@ ipmi_get_sol_info( data[3] = 0x00; /* block selector */ rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Error: No response requesting SOL parameter '%s'", val2str(data[1], sol_parameter_vals)); return (-1); @@ -374,7 +369,7 @@ ipmi_get_sol_info( data[3] = 0x00; /* block selector */ rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Error: No response requesting SOL parameter '%s'", val2str(data[1], sol_parameter_vals)); return (-1); @@ -413,7 +408,7 @@ ipmi_get_sol_info( data[3] = 0x00; /* block selector */ rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Error: No response requesting SOL parameter '%s'", val2str(data[1], sol_parameter_vals)); return (-1); @@ -451,7 +446,7 @@ ipmi_get_sol_info( data[3] = 0x00; /* block selector */ rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Error: No response requesting SOL parameter '%s'", val2str(data[1], sol_parameter_vals)); return (-1); @@ -489,7 +484,7 @@ ipmi_get_sol_info( data[3] = 0x00; /* block selector */ rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Error: No response requesting SOL parameter '%s'", val2str(data[1], sol_parameter_vals)); return (-1); @@ -528,7 +523,7 @@ ipmi_get_sol_info( data[3] = 0x00; /* block selector */ rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Error: No response requesting SOL parameter '%s'", val2str(data[1], sol_parameter_vals)); return (-1); @@ -546,7 +541,7 @@ ipmi_get_sol_info( } break; case 0x80: - if( intf->session != NULL ) { + if (intf->session) { lprintf(LOG_ERR, "Info: SOL parameter '%s' not supported - defaulting to %d", val2str(data[1], sol_parameter_vals), intf->ssn_params.port); params->payload_port = intf->ssn_params.port; @@ -653,13 +648,14 @@ ipmi_print_sol_info(struct ipmi_intf * intf, uint8_t channel) * * function will return -1 if value is not valid, or * will return 0 if valid. + * + * base parameter currently unused, left in for extension. */ -int ipmi_sol_set_param_isvalid_uint8_t( const char *strval, - const char *name, - int base, - uint8_t minval, - uint8_t maxval, - uint8_t *out_value) +int ipmi_sol_set_param_isvalid_uint8_t(const char *strval, + const char *name, + uint8_t minval, + uint8_t maxval, + uint8_t *out_value) { if (str2uchar(strval, out_value) != 0 || (*out_value < minval) || (*out_value > maxval)) { @@ -871,7 +867,7 @@ ipmi_sol_set_param(struct ipmi_intf * intf, data[1] = SOL_PARAMETER_CHARACTER_INTERVAL; /* validate user-supplied input */ - if (ipmi_sol_set_param_isvalid_uint8_t(value, param, 0, 1, 255, &data[2])) + if (ipmi_sol_set_param_isvalid_uint8_t(value, param, 1, 255, &data[2])) return -1; /* We need other values to complete the request */ @@ -897,7 +893,7 @@ ipmi_sol_set_param(struct ipmi_intf * intf, data[1] = SOL_PARAMETER_CHARACTER_INTERVAL; /* validate user-supplied input */ - if (ipmi_sol_set_param_isvalid_uint8_t(value, param, 0, 0, 255, &data[3])) + if (ipmi_sol_set_param_isvalid_uint8_t(value, param, 0, 255, &data[3])) return -1; /* We need other values to complete the request */ @@ -923,7 +919,7 @@ ipmi_sol_set_param(struct ipmi_intf * intf, data[1] = SOL_PARAMETER_SOL_RETRY; /* validate user input, 7 is max value */ - if (ipmi_sol_set_param_isvalid_uint8_t(value, param, 0, 0, 7, &data[2])) + if (ipmi_sol_set_param_isvalid_uint8_t(value, param, 0, 7, &data[2])) return -1; /* We need other values to complete the request */ @@ -949,7 +945,7 @@ ipmi_sol_set_param(struct ipmi_intf * intf, data[1] = SOL_PARAMETER_SOL_RETRY; /* validate user-supplied input */ - if (ipmi_sol_set_param_isvalid_uint8_t(value, param, 0, 0, 255, &data[3])) + if (ipmi_sol_set_param_isvalid_uint8_t(value, param, 0, 255, &data[3])) return -1; /* We need other values to complete the request */ @@ -1073,13 +1069,13 @@ ipmi_sol_set_param(struct ipmi_intf * intf, /* The command proper */ rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Error setting SOL parameter '%s'", param); return -1; } - if (!(!strncmp(param, "set-in-progress", 15) && !strncmp(value, "commit-write", 12)) && - rsp->ccode > 0) { + if (!(!strcmp(param, "set-in-progress") && !strcmp(value, "commit-write")) && + rsp->ccode) { switch (rsp->ccode) { case 0x80: lprintf(LOG_ERR, "Error setting SOL parameter '%s': " @@ -1491,7 +1487,7 @@ ipmi_sol_keepalive_using_sol(struct ipmi_intf * intf) if (end.tv_sec - _start_keepalive.tv_sec > SOL_KEEPALIVE_TIMEOUT) { memset(&v2_payload, 0, sizeof(v2_payload)); v2_payload.payload.sol_packet.character_count = 0; - if (intf->send_sol(intf, &v2_payload) == NULL) + if (!intf->send_sol(intf, &v2_payload)) return -1; /* good return, reset start time */ gettimeofday(&_start_keepalive, 0); @@ -1542,7 +1538,7 @@ ipmi_sol_red_pill(struct ipmi_intf * intf, int instance) buffer_size -= 4; buffer = (char*)malloc(buffer_size); - if (buffer == NULL) { + if (!buffer) { lprintf(LOG_ERR, "ipmitool: malloc failure"); return -1; } @@ -1709,7 +1705,7 @@ ipmi_sol_activate(struct ipmi_intf * intf, int looptest, int interval, * This command is only available over RMCP+ (the lanplus * interface). */ - if (strncmp(intf->name, "lanplus", 7) != 0) + if (strcmp(intf->name, "lanplus")) { lprintf(LOG_ERR, "Error: This command is only available over the " "lanplus interface"); @@ -1822,9 +1818,6 @@ ipmi_sol_activate(struct ipmi_intf * intf, int looptest, int interval, (ap_rsp.payload_udp_port[1] << 8) | ap_rsp.payload_udp_port[0]; - intf->session->timeout = 1; - - /* NOTE: the spec does allow for SOL traffic to be sent on * a different port. we do not yet support that feature. */ if (intf->session->sol_data.port != intf->ssn_params.port) @@ -1915,10 +1908,13 @@ int ipmi_sol_main(struct ipmi_intf * intf, int argc, char ** argv) { int retval = 0; - if (!argc || !strncmp(argv[0], "help", 4)) { + const char *instance_kw = "instance="; + size_t instance_len = strlen(instance_kw); + + if (!argc || !strcmp(argv[0], "help")) { /* Help */ print_sol_usage(); - } else if (!strncmp(argv[0], "info", 4)) { + } else if (!strcmp(argv[0], "info")) { /* Info */ uint8_t channel; if (argc == 1) { @@ -1933,7 +1929,7 @@ ipmi_sol_main(struct ipmi_intf * intf, int argc, char ** argv) return -1; } retval = ipmi_print_sol_info(intf, channel); - } else if (!strncmp(argv[0], "payload", 7)) { + } else if (!strcmp(argv[0], "payload")) { /* Payload enable or disable */ uint8_t channel = 0xe; uint8_t userid = 1; @@ -1952,25 +1948,25 @@ ipmi_sol_main(struct ipmi_intf * intf, int argc, char ** argv) return (-1); } } - if (!strncmp(argv[1], "enable", 6)) { + if (!strcmp(argv[1], "enable")) { enable = 1; - } else if (!strncmp(argv[1], "disable", 7)) { + } else if (!strcmp(argv[1], "disable")) { enable = 0; - } else if (!strncmp(argv[1], "status", 6)) { + } else if (!strcmp(argv[1], "status")) { return ipmi_sol_payload_access_status(intf, channel, userid); } else { print_sol_usage(); return -1; } retval = ipmi_sol_payload_access(intf, channel, userid, enable); - } else if (!strncmp(argv[0], "set", 3)) { + } else if (!strcmp(argv[0], "set")) { /* Set a parameter value */ uint8_t channel = 0xe; uint8_t guard = 1; if (argc == 3) { channel = 0xe; } else if (argc == 4) { - if (!strncmp(argv[3], "noguard", 7)) { + if (!strcmp(argv[3], "noguard")) { guard = 0; } else { if (is_ipmi_channel_num(argv[3], &channel) != 0) { @@ -1981,7 +1977,7 @@ ipmi_sol_main(struct ipmi_intf * intf, int argc, char ** argv) if (is_ipmi_channel_num(argv[3], &channel) != 0) { return (-1); } - if (!strncmp(argv[4], "noguard", 7)) { + if (!strcmp(argv[4], "noguard")) { guard = 0; } } else { @@ -1989,16 +1985,16 @@ ipmi_sol_main(struct ipmi_intf * intf, int argc, char ** argv) return -1; } retval = ipmi_sol_set_param(intf, channel, argv[1], argv[2], guard); - } else if (!strncmp(argv[0], "activate", 8)) { + } else if (!strcmp(argv[0], "activate")) { /* Activate */ int i; uint8_t instance = 1; for (i = 1; i < argc; i++) { - if (!strncmp(argv[i], "usesolkeepalive", 15)) { + if (!strcmp(argv[i], "usesolkeepalive")) { _use_sol_for_keepalive = 1; - } else if (!strncmp(argv[i], "nokeepalive", 11)) { + } else if (!strcmp(argv[i], "nokeepalive")) { _disable_keepalive = 1; - } else if (!strncmp(argv[i], "instance=", 9)) { + } else if (!strncmp(argv[i], instance_kw, instance_len)) { if (str2uchar(argv[i] + 9, &instance) != 0) { lprintf(LOG_ERR, "Given instance '%s' is invalid.", argv[i] + 9); print_sol_usage(); @@ -2010,12 +2006,12 @@ ipmi_sol_main(struct ipmi_intf * intf, int argc, char ** argv) } } retval = ipmi_sol_activate(intf, 0, 0, instance); - } else if (!strncmp(argv[0], "deactivate", 10)) { - /* Dectivate */ + } else if (!strcmp(argv[0], "deactivate")) { + /* Deactivate */ int i; uint8_t instance = 1; for (i = 1; i < argc; i++) { - if (!strncmp(argv[i], "instance=", 9)) { + if (!strncmp(argv[i], instance_kw, instance_len)) { if (str2uchar(argv[i] + 9, &instance) != 0) { lprintf(LOG_ERR, "Given instance '%s' is invalid.", @@ -2029,8 +2025,8 @@ ipmi_sol_main(struct ipmi_intf * intf, int argc, char ** argv) } } retval = ipmi_sol_deactivate(intf, instance); - } else if (!strncmp(argv[0], "looptest", 8)) { - /* SOL loop test: Activate and then Dectivate */ + } else if (!strcmp(argv[0], "looptest")) { + /* SOL loop test: Activate and then Deactivate */ int cnt = 200; int interval = 100; /* Unit is: ms */ uint8_t instance = 1; diff --git a/lib/ipmi_strings.c b/lib/ipmi_strings.c index 94b2abd..26b359f 100644 --- a/lib/ipmi_strings.c +++ b/lib/ipmi_strings.c @@ -30,77 +30,58 @@ * EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. */ +#include <ctype.h> +#include <limits.h> #include <stddef.h> + #include <ipmitool/ipmi_strings.h> #include <ipmitool/ipmi_constants.h> #include <ipmitool/ipmi_sensor.h> #include <ipmitool/ipmi_sel.h> /* for IPMI_OEM */ +#include <ipmitool/log.h> + +/* + * These are put at the head so they are found first because they + * may overlap with IANA specified numbers found in the registry. + */ +static const struct valstr ipmi_oem_info_head[] = { + { IPMI_OEM_UNKNOWN, "Unknown" }, /* IPMI Unknown */ + { IPMI_OEM_RESERVED, "Unspecified" }, /* IPMI Reserved */ + { UINT32_MAX , NULL }, +}; -const struct valstr ipmi_oem_info[] = { - - { IPMI_OEM_UNKNOWN, "Unknown" }, - { IPMI_OEM_HP, "Hewlett-Packard" }, - { IPMI_OEM_SUN, "Sun Microsystems" }, - { IPMI_OEM_INTEL, "Intel Corporation" }, - { IPMI_OEM_LMC, "LMC" }, - { IPMI_OEM_RADISYS, "RadiSys Corporation" }, - { IPMI_OEM_TYAN, "Tyan Computer Corporation" }, - { IPMI_OEM_NEWISYS, "Newisys" }, - { IPMI_OEM_SUPERMICRO, "Supermicro" }, - { IPMI_OEM_GOOGLE, "Google" }, - { IPMI_OEM_KONTRON, "Kontron" }, - { IPMI_OEM_NOKIA, "Nokia" }, - { IPMI_OEM_PICMG, "PICMG" }, - { IPMI_OEM_PEPPERCON, "Peppercon AG" }, - { IPMI_OEM_DELL, "DELL Inc" }, - { IPMI_OEM_NEC, "NEC" }, - { IPMI_OEM_MAGNUM, "Magnum Technologies" }, - { IPMI_OEM_FUJITSU_SIEMENS, "Fujitsu Siemens" }, - { IPMI_OEM_TATUNG, "Tatung" }, - { IPMI_OEM_AMI, "AMI" }, - { IPMI_OEM_RARITAN, "Raritan" }, - { IPMI_OEM_AVOCENT, "Avocent" }, - { IPMI_OEM_OSA, "OSA" }, - { IPMI_OEM_TOSHIBA, "Toshiba" }, - { IPMI_OEM_HITACHI_116, "Hitachi" }, - { IPMI_OEM_HITACHI_399, "Hitachi" }, - { IPMI_OEM_NOKIA_SOLUTIONS_AND_NETWORKS, "Nokia Solutions and Networks" }, - { IPMI_OEM_BULL, "Bull Company" }, - { IPMI_OEM_PPS, "Pigeon Point Systems" }, - { IPMI_OEM_BROADCOM, "Broadcom Corporation" }, - { IPMI_OEM_ERICSSON, "Ericsson AB"}, - { IPMI_OEM_QUANTA, "Quanta" }, - { IPMI_OEM_VITA, "VITA" }, - { IPMI_OEM_ADVANTECH, "Advantech" }, - /************************************************************************ - * Add ID String for IANA Enterprise Number of IBM & ADLINK - * https://www.iana.org/assignments/enterprise-numbers/enterprise-numbers - * 2 - * IBM - * Kristine Adamson - * adamson&us.ibm.com - * 4769 - * IBM Corporation - * Victor Sample - * vsample&us.ibm.com - * 20301 - * IBM eServer X - * Lynn Fore - * sls&us.ibm.com - * 24339 - * ADLINK TECHNOLOGY INC. - * Ryan Hsu - * ryan.hsu&adlinktech.com - ************************************************************************/ - { IPMI_OEM_IBM_2, "IBM" }, - { IPMI_OEM_IBM_4769, "IBM Corporation" }, - { IPMI_OEM_IBM_20301, "IBM eServer X" }, - { IPMI_OEM_ADLINK_24339, "ADLINK Technology Inc." }, - { 0xffff , NULL }, +/* + * These are our own technical values. We don't want them to take precedence + * over IANA's defined values, so they go at the very end of the array. + */ +static const struct valstr ipmi_oem_info_tail[] = { + { IPMI_OEM_DEBUG, "A Debug Assisting Company, Ltd." }, + { UINT32_MAX , NULL }, }; +/* + * This is used when ipmi_oem_info couldn't be allocated. + * ipmitool would report all OEMs as unknown, but would be functional otherwise. + */ +static const struct valstr ipmi_oem_info_dummy[] = { + { UINT32_MAX , NULL }, +}; + +/* This will point to an array filled from IANA's enterprise numbers registry */ +const struct valstr *ipmi_oem_info; + +/* Single-linked list of OEM valstrs */ +typedef struct oem_valstr_list_s { + struct valstr valstr; + struct oem_valstr_list_s *next; +} oem_valstr_list_t; + const struct oemvalstr ipmi_oem_product_info[] = { /* Keep OEM grouped together */ + + /* For ipmitool debugging */ + { IPMI_OEM_DEBUG, 0x1234, "Great Debuggable BMC" }, + /* Intel stuff, thanks to Tim Bell */ { IPMI_OEM_INTEL, 0x000C, "TSRLT2" }, { IPMI_OEM_INTEL, 0x001B, "TIGPR2U" }, @@ -114,6 +95,7 @@ const struct oemvalstr ipmi_oem_product_info[] = { { IPMI_OEM_INTEL, 0x0808, "MPCBL0001" }, { IPMI_OEM_INTEL, 0x0811, "TIGW1U" }, { IPMI_OEM_INTEL, 0x4311, "NSI2U" }, + /* Kontron */ { IPMI_OEM_KONTRON,4000, "AM4000 AdvancedMC" }, { IPMI_OEM_KONTRON,4001, "AM4001 AdvancedMC" }, @@ -141,10 +123,13 @@ const struct oemvalstr ipmi_oem_product_info[] = { { IPMI_OEM_KONTRON,5007, "AT8050" }, { IPMI_OEM_KONTRON,5301, "AT8400" }, { IPMI_OEM_KONTRON,5303, "AT8901" }, + /* Broadcom */ { IPMI_OEM_BROADCOM, 5725, "BCM5725" }, + /* Ericsson */ { IPMI_OEM_ERICSSON, 0x0054, "Phantom" }, + /* Advantech */ /* ATCA Blades */ { IPMI_OEM_ADVANTECH, 0x3393, "MIC-3393" }, @@ -227,6 +212,7 @@ const struct oemvalstr ipmi_oem_product_info[] = { { IPMI_OEM_ADVANTECH, 0x9212, "ESP-9212" }, { IPMI_OEM_ADVANTECH, 0x6000, "CGS-6000" }, { IPMI_OEM_ADVANTECH, 0x6010, "CGS-6010" }, + /* ADLINK Technology Inc. */ /* AdvancedTCA Processor Blades */ { IPMI_OEM_ADLINK_24339, 0x3100, "aTCA-3100" }, @@ -283,6 +269,668 @@ const struct oemvalstr ipmi_oem_product_info[] = { { IPMI_OEM_ADLINK_24339, 0x0410, "MXN-0410" }, { IPMI_OEM_ADLINK_24339, 0x2600, "MCN-2600" }, { IPMI_OEM_ADLINK_24339, 0x1500, "MCN-1500" }, + /* Supermicro */ + { IPMI_OEM_SUPERMICRO, 0x0001, "X8DT3/i/-LN4" }, + { IPMI_OEM_SUPERMICRO, 0x0002, "C2SLM-OC012" }, + { IPMI_OEM_SUPERMICRO, 0x0003, "X8DTW-3/i/-LN4" }, + { IPMI_OEM_SUPERMICRO, 0x0006, "X8DTL-3/i" }, + { IPMI_OEM_SUPERMICRO, 0x0007, "X8DTT-IBX" }, + { IPMI_OEM_SUPERMICRO, 0x0008, "X8DTT-B-SG" }, + { IPMI_OEM_SUPERMICRO, 0x0009, "X8STi-3/-LN4" }, + { IPMI_OEM_SUPERMICRO, 0x000A, "B8DT3" }, + { IPMI_OEM_SUPERMICRO, 0x0100, "X8DAH+" }, + { IPMI_OEM_SUPERMICRO, 0x0101, "B8DTL" }, + { IPMI_OEM_SUPERMICRO, 0x0400, "X8DTH-6/i" }, + { IPMI_OEM_SUPERMICRO, 0x0401, "X8DTH-RC014" }, + { IPMI_OEM_SUPERMICRO, 0x0403, "X8DA6/i-X" }, + { IPMI_OEM_SUPERMICRO, 0x0404, "X8DT6/E" }, + { IPMI_OEM_SUPERMICRO, 0x0409, "H8QI6/E(+)(-F)" }, + { IPMI_OEM_SUPERMICRO, 0x040B, "X8DTW-6+/i+" }, + { IPMI_OEM_SUPERMICRO, 0x040D, "X8SII/X8SI6" }, + { IPMI_OEM_SUPERMICRO, 0x0410, "X8DTL-6/L" }, + { IPMI_OEM_SUPERMICRO, 0x0600, "X8DTU" }, + { IPMI_OEM_SUPERMICRO, 0x0601, "X8DAL-3/i" }, + { IPMI_OEM_SUPERMICRO, 0x0602, "X7SLA" }, + { IPMI_OEM_SUPERMICRO, 0x0603, "C2SEM-Q" }, + { IPMI_OEM_SUPERMICRO, 0x0604, "winbond IPMI (Aten)" }, + { IPMI_OEM_SUPERMICRO, 0x0605, "X8SIL" }, + { IPMI_OEM_SUPERMICRO, 0x0606, "X8DTG-4" }, + { IPMI_OEM_SUPERMICRO, 0x0607, "C2G41" }, + { IPMI_OEM_SUPERMICRO, 0x0608, "X8DTG-DF" }, + { IPMI_OEM_SUPERMICRO, 0x0609, "X8DTS" }, + { IPMI_OEM_SUPERMICRO, 0x060A, "X7SPA" }, + { IPMI_OEM_SUPERMICRO, 0x060B, "X8SIA" }, + { IPMI_OEM_SUPERMICRO, 0x060C, "X8DTU+" }, + { IPMI_OEM_SUPERMICRO, 0x060C, "X8DTU-LN4F+" }, + { IPMI_OEM_SUPERMICRO, 0x060D, "X8DTU-6TF+" }, + { IPMI_OEM_SUPERMICRO, 0x060E, "X8SIT" }, + { IPMI_OEM_SUPERMICRO, 0x060F, "X8DTN+-F" }, + { IPMI_OEM_SUPERMICRO, 0x0610, "X8QB6/E" }, + { IPMI_OEM_SUPERMICRO, 0x0611, "AOC-STGN-I2S" }, + { IPMI_OEM_SUPERMICRO, 0x0612, "B8DTT" }, + { IPMI_OEM_SUPERMICRO, 0x0613, "X8DTT-C-SG007" }, + { IPMI_OEM_SUPERMICRO, 0x0614, "X8DTU-F-AI034" }, + { IPMI_OEM_SUPERMICRO, 0x061A, "X8SIU" }, + { IPMI_OEM_SUPERMICRO, 0x061B, "X8DTT-HA" }, + { IPMI_OEM_SUPERMICRO, 0x061C, "B8DT6-AI034" }, + { IPMI_OEM_SUPERMICRO, 0x061D, "C7SIA" }, + { IPMI_OEM_SUPERMICRO, 0x061E, "B8DTT-AI034" }, + { IPMI_OEM_SUPERMICRO, 0x061E, "X9SCL" }, + { IPMI_OEM_SUPERMICRO, 0x061F, "B8DTP" }, + { IPMI_OEM_SUPERMICRO, 0x0620, "B8DTG" }, + { IPMI_OEM_SUPERMICRO, 0x0621, "X8OBN" }, + { IPMI_OEM_SUPERMICRO, 0x0622, "C7P67" }, + { IPMI_OEM_SUPERMICRO, 0x0623, "C7Q67" }, + { IPMI_OEM_SUPERMICRO, 0x0624, "X9SCM" }, + { IPMI_OEM_SUPERMICRO, 0x0625, "B9DRi" }, + { IPMI_OEM_SUPERMICRO, 0x0626, "X9DR3-LN4F+" }, + { IPMI_OEM_SUPERMICRO, 0x0627, "X7SPT-DF-D525" }, + { IPMI_OEM_SUPERMICRO, 0x0628, "X9DR3/i-F" }, + { IPMI_OEM_SUPERMICRO, 0x0629, "X9SRT-F" }, + { IPMI_OEM_SUPERMICRO, 0x062A, "X9SRA" }, + { IPMI_OEM_SUPERMICRO, 0x062B, "X9SRi" }, + { IPMI_OEM_SUPERMICRO, 0x062C, "X9DAi" }, + { IPMI_OEM_SUPERMICRO, 0x062D, "X8SIL-SIOM-FI005" }, + { IPMI_OEM_SUPERMICRO, 0x062E, "X8STE-DS018" }, + { IPMI_OEM_SUPERMICRO, 0x062F, "X9DRT-HF" }, + { IPMI_OEM_SUPERMICRO, 0x0630, "X9DRW-3TF+" }, + { IPMI_OEM_SUPERMICRO, 0x0631, "X9SCA/X9SCI" }, + { IPMI_OEM_SUPERMICRO, 0x0632, "X8DTG-QF+" }, + { IPMI_OEM_SUPERMICRO, 0x0633, "X9SCV-Q" }, + { IPMI_OEM_SUPERMICRO, 0x0634, "X9SCD" }, + { IPMI_OEM_SUPERMICRO, 0x0635, "X9DAL-6/i" }, + { IPMI_OEM_SUPERMICRO, 0x0636, "X9DRW-3F" }, + { IPMI_OEM_SUPERMICRO, 0x0637, "X9DBU-3F" }, + { IPMI_OEM_SUPERMICRO, 0x0638, "X8QB6-LF" }, + { IPMI_OEM_SUPERMICRO, 0x0640, "X9SCL/SCM-II" }, + { IPMI_OEM_SUPERMICRO, 0x0641, "X9SCV-LN4F+" }, + { IPMI_OEM_SUPERMICRO, 0x0642, "C7Q67-H" }, + { IPMI_OEM_SUPERMICRO, 0x0644, "X9SAE" }, + { IPMI_OEM_SUPERMICRO, 0x0645, "C7H61" }, + { IPMI_OEM_SUPERMICRO, 0x0646, "X9SCFF" }, + { IPMI_OEM_SUPERMICRO, 0x0647, "X9SCAA" }, + { IPMI_OEM_SUPERMICRO, 0x0647, "X9SCE-F" }, + { IPMI_OEM_SUPERMICRO, 0x0648, "C7B75" }, + { IPMI_OEM_SUPERMICRO, 0x0650, "X9SPV-M4" }, + { IPMI_OEM_SUPERMICRO, 0x0651, "X9SBAA" }, + { IPMI_OEM_SUPERMICRO, 0x0652, "AOC-CGP-i2" }, + { IPMI_OEM_SUPERMICRO, 0x0653, "C7Z87" }, + { IPMI_OEM_SUPERMICRO, 0x0654, "C7Q87" }, + { IPMI_OEM_SUPERMICRO, 0x0655, "AOC-XEH-IN2" }, + { IPMI_OEM_SUPERMICRO, 0x0656, "AOC-SGP-i2" }, + { IPMI_OEM_SUPERMICRO, 0x0657, "C7Z87-OCE" }, + { IPMI_OEM_SUPERMICRO, 0x0658, "AOC-STG-B4S" }, + { IPMI_OEM_SUPERMICRO, 0x0659, "AOC-STGN-I1S" }, + { IPMI_OEM_SUPERMICRO, 0x0660, "X9DRD-3/iF" }, + { IPMI_OEM_SUPERMICRO, 0x0661, "B1SA4-F" }, + { IPMI_OEM_SUPERMICRO, 0x0661, "X9SRG" }, + { IPMI_OEM_SUPERMICRO, 0x0662, "X9DRG-QF+" }, + { IPMI_OEM_SUPERMICRO, 0x0663, "X9SRW" }, + { IPMI_OEM_SUPERMICRO, 0x0664, "X9DRH-7F" }, + { IPMI_OEM_SUPERMICRO, 0x0665, "X9DRG-QF" }, + { IPMI_OEM_SUPERMICRO, 0x0666, "X9DRT-D-SG007" }, + { IPMI_OEM_SUPERMICRO, 0x0667, "X9DRL-3/iF" }, + { IPMI_OEM_SUPERMICRO, 0x0668, "X9SRD" }, + { IPMI_OEM_SUPERMICRO, 0x0669, "X9DRX+-F" }, + { IPMI_OEM_SUPERMICRO, 0x066A, "B9DRT" }, + { IPMI_OEM_SUPERMICRO, 0x066B, "X9SRL-F" }, + { IPMI_OEM_SUPERMICRO, 0x066C, "B9DRG" }, + { IPMI_OEM_SUPERMICRO, 0x066D, "X9DR6+-F-AI034" }, + { IPMI_OEM_SUPERMICRO, 0x066E, "X9DR6-LN4F+-AI034" }, + { IPMI_OEM_SUPERMICRO, 0x066F, "X9DRW-LN4F+-AI034" }, + { IPMI_OEM_SUPERMICRO, 0x0690, "2208" }, + { IPMI_OEM_SUPERMICRO, 0x0691, "2308" }, + { IPMI_OEM_SUPERMICRO, 0x0700, "X9DRT-HF-AI034" }, + { IPMI_OEM_SUPERMICRO, 0x0701, "X9DRT-HIBQF-AI034" }, + { IPMI_OEM_SUPERMICRO, 0x0702, "X9DRD-7LN4F" }, + { IPMI_OEM_SUPERMICRO, 0x0703, "X9DBL-6F" }, + { IPMI_OEM_SUPERMICRO, 0x0704, "X9DR7/E-TF+" }, + { IPMI_OEM_SUPERMICRO, 0x0705, "X9DR7/E-LN4F" }, + { IPMI_OEM_SUPERMICRO, 0x0706, "X9DRT-HF+" }, + { IPMI_OEM_SUPERMICRO, 0x0707, "X9QR7-TF+" }, + { IPMI_OEM_SUPERMICRO, 0x0708, "X9DRT-F" }, + { IPMI_OEM_SUPERMICRO, 0x0709, "X9DA7/E" }, + { IPMI_OEM_SUPERMICRO, 0x070A, "X9DRF-F" }, + { IPMI_OEM_SUPERMICRO, 0x070B, "X9SRL-CF" }, + { IPMI_OEM_SUPERMICRO, 0x070C, "X9SRD-CD" }, + { IPMI_OEM_SUPERMICRO, 0x070D, "B9DR7" }, + { IPMI_OEM_SUPERMICRO, 0x070E, "X9DAX-7" }, + { IPMI_OEM_SUPERMICRO, 0x070F, "X9QR7-TF" }, + { IPMI_OEM_SUPERMICRO, 0x0710, "X9SRE" }, + { IPMI_OEM_SUPERMICRO, 0x0711, "X9DRG-HTF+" }, + { IPMI_OEM_SUPERMICRO, 0x0712, "B9DRG-X" }, + { IPMI_OEM_SUPERMICRO, 0x0713, "X9DRFF-7" }, + { IPMI_OEM_SUPERMICRO, 0x0714, "X9SRH-7F" }, + { IPMI_OEM_SUPERMICRO, 0x0715, "X9DRW-7TPF" }, + { IPMI_OEM_SUPERMICRO, 0x0716, "X9DBU-3F-AI034" }, + { IPMI_OEM_SUPERMICRO, 0x0717, "X9DRFF-7+/i+" }, + { IPMI_OEM_SUPERMICRO, 0x0718, "X9DRFF-7G+" }, + { IPMI_OEM_SUPERMICRO, 0x0719, "B9DRP" }, + { IPMI_OEM_SUPERMICRO, 0x0720, "X9DRW-7TPF+" }, + { IPMI_OEM_SUPERMICRO, 0x0721, "X9DBS-F" }, + { IPMI_OEM_SUPERMICRO, 0x0722, "X9DB3-TPF" }, + { IPMI_OEM_SUPERMICRO, 0x0723, "X9DRL-7F/EF" }, + { IPMI_OEM_SUPERMICRO, 0x0724, "X9DRH-if-NV" }, + { IPMI_OEM_SUPERMICRO, 0x0725, "X9DRG+HF+II" }, + { IPMI_OEM_SUPERMICRO, 0x0726, "X10QBi" }, + { IPMI_OEM_SUPERMICRO, 0x0727, "X9DRW-CF31/CTF31" }, + { IPMI_OEM_SUPERMICRO, 0x0728, "X10DRI/T" }, + { IPMI_OEM_SUPERMICRO, 0x0729, "B9DRG-E" }, + { IPMI_OEM_SUPERMICRO, 0x0730, "X9DAX-HFT" }, + { IPMI_OEM_SUPERMICRO, 0x0731, "X9DRT-P" }, + { IPMI_OEM_SUPERMICRO, 0x0732, "X9DRG-OF" }, + { IPMI_OEM_SUPERMICRO, 0x0733, "X9DB3-CPU-AI026" }, + { IPMI_OEM_SUPERMICRO, 0x0734, "AOC-STG-I2T" }, + { IPMI_OEM_SUPERMICRO, 0x0743, "X9SPU" }, + { IPMI_OEM_SUPERMICRO, 0x0801, "X10SLL" }, + { IPMI_OEM_SUPERMICRO, 0x0802, "X10SLA" }, + { IPMI_OEM_SUPERMICRO, 0x0803, "X10SLH" }, + { IPMI_OEM_SUPERMICRO, 0x0804, "X10SL7-F" }, + { IPMI_OEM_SUPERMICRO, 0x0805, "X10SAE" }, + { IPMI_OEM_SUPERMICRO, 0x0806, "X10SLM-LN4F" }, + { IPMI_OEM_SUPERMICRO, 0x0807, "X10SLE" }, + { IPMI_OEM_SUPERMICRO, 0x0808, "LSI3008" }, + { IPMI_OEM_SUPERMICRO, 0x0809, "LSI3108" }, + { IPMI_OEM_SUPERMICRO, 0x0810, "X10SLD" }, + { IPMI_OEM_SUPERMICRO, 0x0811, "X10SLM-F" }, + { IPMI_OEM_SUPERMICRO, 0x0812, "X10SLL+-F" }, + { IPMI_OEM_SUPERMICRO, 0x0813, "X10SEAA-LN4F" }, + { IPMI_OEM_SUPERMICRO, 0x0814, "X10SLX-TF" }, + { IPMI_OEM_SUPERMICRO, 0x0815, "X10SLV" }, + { IPMI_OEM_SUPERMICRO, 0x0816, "X10SBA" }, + { IPMI_OEM_SUPERMICRO, 0x0817, "X10SLE-DF" }, + { IPMI_OEM_SUPERMICRO, 0x0818, "X10SAT" }, + { IPMI_OEM_SUPERMICRO, 0x0819, "X10SLV-Q" }, + { IPMI_OEM_SUPERMICRO, 0x0820, "A1SAM" }, + { IPMI_OEM_SUPERMICRO, 0x0820, "X9SKV" }, + { IPMI_OEM_SUPERMICRO, 0x0821, "X10DRW-i(T)" }, + { IPMI_OEM_SUPERMICRO, 0x0822, "X10DRFF(-C)" }, + { IPMI_OEM_SUPERMICRO, 0x0823, "AOC-CTG-I1S" }, + { IPMI_OEM_SUPERMICRO, 0x0824, "X10DRT-P" }, + { IPMI_OEM_SUPERMICRO, 0x0825, "X10SRE-DS018" }, + { IPMI_OEM_SUPERMICRO, 0x0826, "X10SRE-EXP-SI030" }, + { IPMI_OEM_SUPERMICRO, 0x0827, "X9QRH-TF" }, + { IPMI_OEM_SUPERMICRO, 0x0828, "A1SA2-2750F" }, + { IPMI_OEM_SUPERMICRO, 0x0829, "C7Z97-OCE" }, + { IPMI_OEM_SUPERMICRO, 0x0830, "X10DRFR" }, + { IPMI_OEM_SUPERMICRO, 0x0831, "X10DRL-i" }, + { IPMI_OEM_SUPERMICRO, 0x0832, "X10SRL" }, + { IPMI_OEM_SUPERMICRO, 0x0833, "X10SRW-F" }, + { IPMI_OEM_SUPERMICRO, 0x0834, "X10SRI" }, + { IPMI_OEM_SUPERMICRO, 0x0835, "X10DRC/i-LN4+/T4+" }, + { IPMI_OEM_SUPERMICRO, 0x0836, "X10DAi" }, + { IPMI_OEM_SUPERMICRO, 0x0837, "X10DRT-D-SG007" }, + { IPMI_OEM_SUPERMICRO, 0x0838, "X10SRH-F" }, + { IPMI_OEM_SUPERMICRO, 0x0839, "AOC-SLG3-2E4" }, + { IPMI_OEM_SUPERMICRO, 0x083A, "X10DBT-T" }, + { IPMI_OEM_SUPERMICRO, 0x083B, "X10DDW-iT" }, + { IPMI_OEM_SUPERMICRO, 0x083C, "A1SA7-2750F" }, + { IPMI_OEM_SUPERMICRO, 0x083D, "LSI 2116" }, + { IPMI_OEM_SUPERMICRO, 0x083E, "B10DRi" }, + { IPMI_OEM_SUPERMICRO, 0x083F, "B9QR7" }, + { IPMI_OEM_SUPERMICRO, 0x0840, "B9DRG-3M" }, + { IPMI_OEM_SUPERMICRO, 0x0841, "X9DRD-iT+" }, + { IPMI_OEM_SUPERMICRO, 0x0842, "X10SLH-N6-ST031" }, + { IPMI_OEM_SUPERMICRO, 0x0843, "X10DRG-H(T)" }, + { IPMI_OEM_SUPERMICRO, 0x0844, "X10DRU-i+" }, + { IPMI_OEM_SUPERMICRO, 0x0845, "X10DDW-iN" }, + { IPMI_OEM_SUPERMICRO, 0x0846, "B1DRi" }, + { IPMI_OEM_SUPERMICRO, 0x0847, "AOC-UR-i4XT" }, + { IPMI_OEM_SUPERMICRO, 0x0848, "AOC-2UR68-i4G" }, + { IPMI_OEM_SUPERMICRO, 0x0849, "AOC-UR-i4G" }, + { IPMI_OEM_SUPERMICRO, 0x084A, "AOC-S40G-i2Q" }, + { IPMI_OEM_SUPERMICRO, 0x084B, "X10SRG" }, + { IPMI_OEM_SUPERMICRO, 0x084C, "C7Z97" }, + { IPMI_OEM_SUPERMICRO, 0x084C, "C7Z97-MF" }, + { IPMI_OEM_SUPERMICRO, 0x084D, "AOC-STGN-i1SF" }, + { IPMI_OEM_SUPERMICRO, 0x084F, "AOC-STGN-i2SF" }, + { IPMI_OEM_SUPERMICRO, 0x0850, "AOC-PG-i4M" }, + { IPMI_OEM_SUPERMICRO, 0x0851, "PMC PM8076" }, + { IPMI_OEM_SUPERMICRO, 0x0852, "X10DRG-Q" }, + { IPMI_OEM_SUPERMICRO, 0x0853, "X10QBL" }, + { IPMI_OEM_SUPERMICRO, 0x0854, "X10DRU-X" }, + { IPMI_OEM_SUPERMICRO, 0x0855, "H9SKV-420" }, + { IPMI_OEM_SUPERMICRO, 0x0856, "C7X99" }, + { IPMI_OEM_SUPERMICRO, 0x0857, "X10SRA" }, + { IPMI_OEM_SUPERMICRO, 0x0858, "X10DRT-H" }, + { IPMI_OEM_SUPERMICRO, 0x0859, "X10DRH-C" }, + { IPMI_OEM_SUPERMICRO, 0x085A, "A1SRM-LN7F" }, + { IPMI_OEM_SUPERMICRO, 0x085A, "A1SRM-LN7F" }, + { IPMI_OEM_SUPERMICRO, 0x085B, "X10DRT-HA/HB-SG007" }, + { IPMI_OEM_SUPERMICRO, 0x085C, "X10DRU-XLL" }, + { IPMI_OEM_SUPERMICRO, 0x085D, "AOC-UR-i2XT" }, + { IPMI_OEM_SUPERMICRO, 0x085E, "AOC-2UR6-i4XT" }, + { IPMI_OEM_SUPERMICRO, 0x085F, "AOC-2UR68-i2XT" }, + { IPMI_OEM_SUPERMICRO, 0x0860, "X10DRL-C/CT" }, + { IPMI_OEM_SUPERMICRO, 0x0861, "B10DRT" }, + { IPMI_OEM_SUPERMICRO, 0x0862, "B1SL1-F" }, + { IPMI_OEM_SUPERMICRO, 0x0863, "RSC-W2-66" }, + { IPMI_OEM_SUPERMICRO, 0x0864, "X10DRW-E/NT" }, + { IPMI_OEM_SUPERMICRO, 0x0865, "X10DRD-i/LTP" }, + { IPMI_OEM_SUPERMICRO, 0x0866, "AOC-SLG3-2E4R" }, + { IPMI_OEM_SUPERMICRO, 0x0867, "AOC-SLG3-4E4R" }, + { IPMI_OEM_SUPERMICRO, 0x0868, "AOC-SLG3-2E4" }, + { IPMI_OEM_SUPERMICRO, 0x0869, "AOC-URN2-i4XT" }, + { IPMI_OEM_SUPERMICRO, 0x086A, "AOC-URN2-i2XT" }, + { IPMI_OEM_SUPERMICRO, 0x086B, "X10DRS" }, + { IPMI_OEM_SUPERMICRO, 0x086C, "X10DAL-i" }, + { IPMI_OEM_SUPERMICRO, 0x086D, "X10SDV-TLN4F" }, + { IPMI_OEM_SUPERMICRO, 0x086E, "X10DDW-iN" }, + { IPMI_OEM_SUPERMICRO, 0x086F, "X10DRT-L" }, + { IPMI_OEM_SUPERMICRO, 0x0870, "AOC-URN2-ii2SX" }, + { IPMI_OEM_SUPERMICRO, 0x0871, "AOC-2UR68-i2XS" }, + { IPMI_OEM_SUPERMICRO, 0x0872, "X10QRH+" }, + { IPMI_OEM_SUPERMICRO, 0x0873, "AOC-2URN4-i4XT" }, + { IPMI_OEM_SUPERMICRO, 0x0874, "AOC-2UR8N4-i2XT" }, + { IPMI_OEM_SUPERMICRO, 0x0875, "AOC-2UR66-i4G" }, + { IPMI_OEM_SUPERMICRO, 0x0876, "A2SCL-IN001" }, + { IPMI_OEM_SUPERMICRO, 0x0877, "X10DRT-HB-SG007" }, + { IPMI_OEM_SUPERMICRO, 0x0878, "RSC-S2-88" }, + { IPMI_OEM_SUPERMICRO, 0x0879, "X10DRD-I/L/NT" }, + { IPMI_OEM_SUPERMICRO, 0x087A, "B1SD2-TF" }, + { IPMI_OEM_SUPERMICRO, 0x087B, "AOC-XEH-i2M" }, + { IPMI_OEM_SUPERMICRO, 0x087C, "AOC-XEH-i4M" }, + { IPMI_OEM_SUPERMICRO, 0x087D, "X10SRD-F" }, + { IPMI_OEM_SUPERMICRO, 0x087E, "AOC-STG-i4S" }, + { IPMI_OEM_SUPERMICRO, 0x087F, "X10DRFF-iG" }, + { IPMI_OEM_SUPERMICRO, 0x0880, "X10DRT-XA-SG007" }, + { IPMI_OEM_SUPERMICRO, 0x0881, "X10DRT-XB-SG007" }, + { IPMI_OEM_SUPERMICRO, 0x0882, "X10DRX" }, + { IPMI_OEM_SUPERMICRO, 0x0883, "K1SPI" }, + { IPMI_OEM_SUPERMICRO, 0x0884, "X11SSH-F/-LN4F" }, + { IPMI_OEM_SUPERMICRO, 0x0885, "X11SSL-CF/-NF" }, + { IPMI_OEM_SUPERMICRO, 0x0886, "X11SSA(-F)/X11SSi-LN4(F)" }, + { IPMI_OEM_SUPERMICRO, 0x0887, "AOC-S8076L-L16e" }, + { IPMI_OEM_SUPERMICRO, 0x0888, "X11SSZ" }, + { IPMI_OEM_SUPERMICRO, 0x0889, "B10DRG" }, + { IPMI_OEM_SUPERMICRO, 0x088A, "AOC-URN6-i2XT" }, + { IPMI_OEM_SUPERMICRO, 0x088B, "C7Z170-SQ" }, + { IPMI_OEM_SUPERMICRO, 0x088C, "AOM-S3108-H8S-SB" }, + { IPMI_OEM_SUPERMICRO, 0x088D, "AOC-S100G-i2C" }, + { IPMI_OEM_SUPERMICRO, 0x088E, "AOC-PIO-i2G" }, + { IPMI_OEM_SUPERMICRO, 0x088F, "AOM-PIO-i2XT" }, + { IPMI_OEM_SUPERMICRO, 0x0890, "X11SSQ" }, + { IPMI_OEM_SUPERMICRO, 0x0891, "X11SBA" }, + { IPMI_OEM_SUPERMICRO, 0x0892, "X10DRG-O+-CPU" }, + { IPMI_OEM_SUPERMICRO, 0x0893, "X10DGQ" }, + { IPMI_OEM_SUPERMICRO, 0x0894, "X11SSV-Q" }, + { IPMI_OEM_SUPERMICRO, 0x0895, "X11SAE" }, + { IPMI_OEM_SUPERMICRO, 0x0896, "X11SSL/M-F" }, + { IPMI_OEM_SUPERMICRO, 0x0897, "B1SD1-TF" }, + { IPMI_OEM_SUPERMICRO, 0x0898, "X11SSE" }, + { IPMI_OEM_SUPERMICRO, 0x0899, "X10DRH" }, + { IPMI_OEM_SUPERMICRO, 0x089A, "X11SLL" }, + { IPMI_OEM_SUPERMICRO, 0x089B, "X11SSW-F" }, + { IPMI_OEM_SUPERMICRO, 0x089C, "X11SSH-CTF" }, + { IPMI_OEM_SUPERMICRO, 0x089D, "X10DSC+" }, + { IPMI_OEM_SUPERMICRO, 0x089E, "AOC-URN2-i4GXS" }, + { IPMI_OEM_SUPERMICRO, 0x089F, "X11SAE-M" }, + { IPMI_OEM_SUPERMICRO, 0x0901, "X11SSM" }, + { IPMI_OEM_SUPERMICRO, 0x0902, "C7Z170-OCE" }, + { IPMI_OEM_SUPERMICRO, 0x0903, "AOC-CTGS-i2T" }, + { IPMI_OEM_SUPERMICRO, 0x0904, "AOC-2UR6N4-i4XT" }, + { IPMI_OEM_SUPERMICRO, 0x0905, "K1SPI-KA-SG007" }, + { IPMI_OEM_SUPERMICRO, 0x0906, "K1SPi-KB-SG007" }, + { IPMI_OEM_SUPERMICRO, 0x0907, "X11SAT(-F)" }, + { IPMI_OEM_SUPERMICRO, 0x0908, "B2SS2" }, + { IPMI_OEM_SUPERMICRO, 0x0909, "X11SSD-F" }, + { IPMI_OEM_SUPERMICRO, 0x090A, "AOC-SLG3-4E4" }, + { IPMI_OEM_SUPERMICRO, 0x090B, "AOC-MTG-i4S" }, + { IPMI_OEM_SUPERMICRO, 0x090C, "AOC-MTG-I2s" }, + { IPMI_OEM_SUPERMICRO, 0x090D, "X11SRE-DS018" }, + { IPMI_OEM_SUPERMICRO, 0x090E, "K1SPE(-T)" }, + { IPMI_OEM_SUPERMICRO, 0x090F, "A2SDi" }, + { IPMI_OEM_SUPERMICRO, 0x0910, "A2SDi-H" }, + { IPMI_OEM_SUPERMICRO, 0x0911, "X10DRT-PS" }, + { IPMI_OEM_SUPERMICRO, 0x0912, "AOC-MG-i2" }, + { IPMI_OEM_SUPERMICRO, 0x0913, "AOC-MG-i4" }, + { IPMI_OEM_SUPERMICRO, 0x0914, "AOC-STGS-i1T" }, + { IPMI_OEM_SUPERMICRO, 0x0915, "AOC-STGS-i2T" }, + { IPMI_OEM_SUPERMICRO, 0x0916, "X10DSC-TP4S" }, + { IPMI_OEM_SUPERMICRO, 0x0917, "X11DPi-N(T)" }, + { IPMI_OEM_SUPERMICRO, 0x0918, "AOC-UR-i4GXS" }, + { IPMI_OEM_SUPERMICRO, 0x0919, "X10SDD-F" }, + { IPMI_OEM_SUPERMICRO, 0x091A, "AOC-2UR6-i4xT+" }, + { IPMI_OEM_SUPERMICRO, 0x091B, "AOC-UR-i4XT+" }, + { IPMI_OEM_SUPERMICRO, 0x091C, "X11DPU" }, + { IPMI_OEM_SUPERMICRO, 0x091D, "X11SSW-LN4F" }, + { IPMI_OEM_SUPERMICRO, 0x091E, "X10SD7-AC107" }, + { IPMI_OEM_SUPERMICRO, 0x091F, "AOC-MTG-i4T" }, + { IPMI_OEM_SUPERMICRO, 0x0920, "AOC-MTG-i2T" }, + { IPMI_OEM_SUPERMICRO, 0x0921, "X10SDV-7TP8F" }, + { IPMI_OEM_SUPERMICRO, 0x0922, "X10SRW-LN4F" }, + { IPMI_OEM_SUPERMICRO, 0x0923, "AOM-X10OBI-PCH" }, + { IPMI_OEM_SUPERMICRO, 0x0924, "X10SRM-(T)F" }, + { IPMI_OEM_SUPERMICRO, 0x0925, "AOC-MHIBF-2QG" }, + { IPMI_OEM_SUPERMICRO, 0x0926, "AOC-MHIBF-1QG" }, + { IPMI_OEM_SUPERMICRO, 0x0927, "X11DPT-PS" }, + { IPMI_OEM_SUPERMICRO, 0x0928, "AOC-S25G-b2S" }, + { IPMI_OEM_SUPERMICRO, 0x0929, "AOC-2UR66-i4XTF" }, + { IPMI_OEM_SUPERMICRO, 0x092A, "AOC-M25G-b2S" }, + { IPMI_OEM_SUPERMICRO, 0x092B, "X10DSN-TS" }, + { IPMI_OEM_SUPERMICRO, 0x092C, "AOC-S8069L-16xR" }, + { IPMI_OEM_SUPERMICRO, 0x092D, "X10SDE-DF" }, + { IPMI_OEM_SUPERMICRO, 0x092E, "AOC-2UR68-B2TS" }, + { IPMI_OEM_SUPERMICRO, 0x092F, "AOC-S40G-i1Q" }, + { IPMI_OEM_SUPERMICRO, 0x0930, "X11SSQ-L" }, + { IPMI_OEM_SUPERMICRO, 0x0931, "B2SS1-CF" }, + { IPMI_OEM_SUPERMICRO, 0x0932, "X10DRL-LN4" }, + { IPMI_OEM_SUPERMICRO, 0x0933, "P8DTU" }, + { IPMI_OEM_SUPERMICRO, 0x0934, "AOC-MHFI-i1C" }, + { IPMI_OEM_SUPERMICRO, 0x0935, "AOC-STG-i4T" }, + { IPMI_OEM_SUPERMICRO, 0x0936, "AOC-UR-i4XTF" }, + { IPMI_OEM_SUPERMICRO, 0x0937, "X11DPT" }, + { IPMI_OEM_SUPERMICRO, 0x0938, "X11DPT" }, + { IPMI_OEM_SUPERMICRO, 0x0939, "X11SSV-M4" }, + { IPMI_OEM_SUPERMICRO, 0x093A, "X11SSV-M4F" }, + { IPMI_OEM_SUPERMICRO, 0x093B, "AOC-STGF-i2S" }, + { IPMI_OEM_SUPERMICRO, 0x093C, "A2SAV" }, + { IPMI_OEM_SUPERMICRO, 0x093D, "AOC-S3216L-L16iT" }, + { IPMI_OEM_SUPERMICRO, 0x093E, "X10DRT-B+" }, + { IPMI_OEM_SUPERMICRO, 0x093F, "C7Z270-CG-L" }, + { IPMI_OEM_SUPERMICRO, 0x0940, "C7Z270-CG" }, + { IPMI_OEM_SUPERMICRO, 0x0941, "X11SPi-TF" }, + { IPMI_OEM_SUPERMICRO, 0x0942, "K1SPE" }, + { IPMI_OEM_SUPERMICRO, 0x0943, "C7Z270-PG" }, + { IPMI_OEM_SUPERMICRO, 0x0944, "C7H270-CG-ML" }, + { IPMI_OEM_SUPERMICRO, 0x0945, "C7Q270-CB-ML" }, + { IPMI_OEM_SUPERMICRO, 0x0946, "X10SDV" }, + { IPMI_OEM_SUPERMICRO, 0x0947, "A2SAN" }, + { IPMI_OEM_SUPERMICRO, 0x0948, "AOC-C25G-m2S" }, + { IPMI_OEM_SUPERMICRO, 0x0949, "AOC-MH25G-m2S2T" }, + { IPMI_OEM_SUPERMICRO, 0x094A, "AOC-2UR68-m2TS" }, + { IPMI_OEM_SUPERMICRO, 0x094B, "AOC-S100G-m2C" }, + { IPMI_OEM_SUPERMICRO, 0x094C, "AOC-S25G-m2S" }, + { IPMI_OEM_SUPERMICRO, 0x094D, "AOC-MHIBF" }, + { IPMI_OEM_SUPERMICRO, 0x094E, "AOC-MH25G-b2S2G" }, + { IPMI_OEM_SUPERMICRO, 0x094F, "P8DNU" }, + { IPMI_OEM_SUPERMICRO, 0x0950, "X10DRW-SE" }, + { IPMI_OEM_SUPERMICRO, 0x0951, "B2SS1(2)-MTF" }, + { IPMI_OEM_SUPERMICRO, 0x0952, "X11SPX-TF" }, + { IPMI_OEM_SUPERMICRO, 0x0953, "X11SPW-(c)TF" }, + { IPMI_OEM_SUPERMICRO, 0x0954, "AOC-C25G-m1S" }, + { IPMI_OEM_SUPERMICRO, 0x0955, "X11SSW" }, + { IPMI_OEM_SUPERMICRO, 0x0956, "AOC-MHIBF-m1Q2G" }, + { IPMI_OEM_SUPERMICRO, 0x0957, "AOC-MHIBF-m2Q2G" }, + { IPMI_OEM_SUPERMICRO, 0x0958, "X11SSH" }, + { IPMI_OEM_SUPERMICRO, 0x0959, "R10SR2" }, + { IPMI_OEM_SUPERMICRO, 0x095A, "X10DGO" }, + { IPMI_OEM_SUPERMICRO, 0x095B, "X11DPU-XLL" }, + { IPMI_OEM_SUPERMICRO, 0x095C, "X11DPU-X" }, + { IPMI_OEM_SUPERMICRO, 0x095D, "X11SPM-T(P)F" }, + { IPMI_OEM_SUPERMICRO, 0x095E, "X11SPH-NCTPF" }, + { IPMI_OEM_SUPERMICRO, 0x095F, "X11SAA" }, + { IPMI_OEM_SUPERMICRO, 0x0960, "X11SAN" }, + { IPMI_OEM_SUPERMICRO, 0x0961, "P9DSC" }, + { IPMI_OEM_SUPERMICRO, 0x0962, "X11DPT-B+" }, + { IPMI_OEM_SUPERMICRO, 0x0963, "H11DSU-i" }, + { IPMI_OEM_SUPERMICRO, 0x0964, "H11DSi-NT" }, + { IPMI_OEM_SUPERMICRO, 0x0965, "C7B250-CB-ML" }, + { IPMI_OEM_SUPERMICRO, 0x0966, "B11DPT" }, + { IPMI_OEM_SUPERMICRO, 0x0967, "X11DDW" }, + { IPMI_OEM_SUPERMICRO, 0x0968, "X11DPL-i" }, + { IPMI_OEM_SUPERMICRO, 0x0969, "A2SDi-HLN4F" }, + { IPMI_OEM_SUPERMICRO, 0x096A, "C7C232-CB-ML" }, + { IPMI_OEM_SUPERMICRO, 0x096B, "X11DPT-P-SG007" }, + { IPMI_OEM_SUPERMICRO, 0x096C, "X11DPU-Z+" }, + { IPMI_OEM_SUPERMICRO, 0x096D, "X11DPG-Qt" }, + { IPMI_OEM_SUPERMICRO, 0x096E, "X11SPL-F" }, + { IPMI_OEM_SUPERMICRO, 0x096F, "AOC-IBH-X4ED" }, + { IPMI_OEM_SUPERMICRO, 0x0970, "C7Z270-CG-M" }, + { IPMI_OEM_SUPERMICRO, 0x0971, "X11SRE-EXP-SI030" }, + { IPMI_OEM_SUPERMICRO, 0x0972, "SAS3216" }, + { IPMI_OEM_SUPERMICRO, 0x0973, "SAS3508" }, + { IPMI_OEM_SUPERMICRO, 0x0974, "SAS3516" }, + { IPMI_OEM_SUPERMICRO, 0x0975, "SAS3316" }, + { IPMI_OEM_SUPERMICRO, 0x0976, "SAS3324" }, + { IPMI_OEM_SUPERMICRO, 0x0977, "X11DPFR-SN" }, + { IPMI_OEM_SUPERMICRO, 0x0978, "AOC-S25G-i2S" }, + { IPMI_OEM_SUPERMICRO, 0x0979, "BMB-IBD-E3616" }, + { IPMI_OEM_SUPERMICRO, 0x097A, "X11DAI-N" }, + { IPMI_OEM_SUPERMICRO, 0x097B, "C7X299" }, + { IPMI_OEM_SUPERMICRO, 0x097C, "AOC-IBH_X4ES" }, + { IPMI_OEM_SUPERMICRO, 0x097D, "C7B250-CB-i" }, + { IPMI_OEM_SUPERMICRO, 0x097E, "X11SPG-F" }, + { IPMI_OEM_SUPERMICRO, 0x097F, "X11QPH+" }, + { IPMI_OEM_SUPERMICRO, 0x0980, "X11OPi" }, + { IPMI_OEM_SUPERMICRO, 0x0981, "X11DPH-i" }, + { IPMI_OEM_SUPERMICRO, 0x0982, "A2SDV-TLN5F" }, + { IPMI_OEM_SUPERMICRO, 0x0983, "AOC-M25G-m4S" }, + { IPMI_OEM_SUPERMICRO, 0x0984, "X11SRM-(V)F" }, + { IPMI_OEM_SUPERMICRO, 0x0985, "P9DSU-C" }, + { IPMI_OEM_SUPERMICRO, 0x0986, "X11SDV" }, + { IPMI_OEM_SUPERMICRO, 0x0987, "X11SDV-TLN2F" }, + { IPMI_OEM_SUPERMICRO, 0x0988, "X11DGQ" }, + { IPMI_OEM_SUPERMICRO, 0x0989, "B10DRE" }, + { IPMI_OEM_SUPERMICRO, 0x098A, "H11DST-B" }, + { IPMI_OEM_SUPERMICRO, 0x098B, "X11SSN" }, + { IPMI_OEM_SUPERMICRO, 0x098C, "X11DPX-T" }, + { IPMI_OEM_SUPERMICRO, 0x098D, "A2SAP-H/E/L" }, + { IPMI_OEM_SUPERMICRO, 0x098E, "X11SRA-R/F" }, + { IPMI_OEM_SUPERMICRO, 0x098F, "B11QPi" }, + { IPMI_OEM_SUPERMICRO, 0x0991, "C7Z370-CG-L" }, + { IPMI_OEM_SUPERMICRO, 0x0992, "B11SPi-CPU-TF" }, + { IPMI_OEM_SUPERMICRO, 0x0993, "AOC-URN4-i2TS" }, + { IPMI_OEM_SUPERMICRO, 0x0994, "AOC-B25G-M2S" }, + { IPMI_OEM_SUPERMICRO, 0x0995, "X11DPG-SN" }, + { IPMI_OEM_SUPERMICRO, 0x0996, "AOC-MTG-b2T" }, + { IPMI_OEM_SUPERMICRO, 0x0997, "B11DPE" }, + { IPMI_OEM_SUPERMICRO, 0x0998, "C7Z370-CG-iW" }, + { IPMI_OEM_SUPERMICRO, 0x0999, "AOC-MHIBE-m1CG" }, + { IPMI_OEM_SUPERMICRO, 0x099A, "X11DPS-R" }, + { IPMI_OEM_SUPERMICRO, 0x099B, "AOC-OPH-WFR" }, + { IPMI_OEM_SUPERMICRO, 0x099C, "SAS 3616" }, + { IPMI_OEM_SUPERMICRO, 0x099C, "SAS 3616" }, + { IPMI_OEM_SUPERMICRO, 0x099D, "X11DSC+" }, + { IPMI_OEM_SUPERMICRO, 0x099E, "C7Z390-PGW" }, + { IPMI_OEM_SUPERMICRO, 0x099F, "C7Z390-CG-IW" }, + { IPMI_OEM_SUPERMICRO, 0x1111, "H8DCR-3" }, + { IPMI_OEM_SUPERMICRO, 0x1211, "H8DC8" }, + { IPMI_OEM_SUPERMICRO, 0x1311, "H8QM8-2" }, + { IPMI_OEM_SUPERMICRO, 0x1411, "H8DA8-2" }, + { IPMI_OEM_SUPERMICRO, 0x1511, "H8DMR-82" }, + { IPMI_OEM_SUPERMICRO, 0x1611, "H8DM8-2" }, + { IPMI_OEM_SUPERMICRO, 0x1711, "H8SMI-2" }, + { IPMI_OEM_SUPERMICRO, 0x1811, "H8SSL-I2" }, + { IPMI_OEM_SUPERMICRO, 0x1911, "H8DMU" }, + { IPMI_OEM_SUPERMICRO, 0x1A01, "C7B360-CB-M" }, + { IPMI_OEM_SUPERMICRO, 0x1A02, "C7C242-CB-M" }, + { IPMI_OEM_SUPERMICRO, 0x1A03, "H11SSL-i/c/nc" }, + { IPMI_OEM_SUPERMICRO, 0x1A04, "B10KNM" }, + { IPMI_OEM_SUPERMICRO, 0x1A05, "AOM-M25G-i2S" }, + { IPMI_OEM_SUPERMICRO, 0x1A06, "X11DPG-OT-CPU" }, + { IPMI_OEM_SUPERMICRO, 0x1A07, "B11SPE-CPU-TF/25G" }, + { IPMI_OEM_SUPERMICRO, 0x1A08, "AOC-STG-b2T" }, + { IPMI_OEM_SUPERMICRO, 0x1A09, "AOC-URN4-b2XT" }, + { IPMI_OEM_SUPERMICRO, 0x1A1A, "A2SD1-3750F/3955F" }, + { IPMI_OEM_SUPERMICRO, 0x1A1B, "X11SCE-F" }, + { IPMI_OEM_SUPERMICRO, 0x1A1C, "X11DSF" }, + { IPMI_OEM_SUPERMICRO, 0x1A1D, "X11SCA-F/W" }, + { IPMI_OEM_SUPERMICRO, 0x1A1E, "X11DAC" }, + { IPMI_OEM_SUPERMICRO, 0x1A1F, "X11SCL-F" }, + { IPMI_OEM_SUPERMICRO, 0x1B01, "X11DSN-TS" }, + { IPMI_OEM_SUPERMICRO, 0x1B02, "X11DGO-T" }, + { IPMI_OEM_SUPERMICRO, 0x1B03, "AOC-2UR688-i4XTF" }, + { IPMI_OEM_SUPERMICRO, 0x1B04, "X11DPT-LC019" }, + { IPMI_OEM_SUPERMICRO, 0x1B05, "X11SCQ" }, + { IPMI_OEM_SUPERMICRO, 0x1B06, "X11SCQ-L" }, + { IPMI_OEM_SUPERMICRO, 0x1B07, "X11SCW-F" }, + { IPMI_OEM_SUPERMICRO, 0x1B08, "C9X299-PG300" }, + { IPMI_OEM_SUPERMICRO, 0x1B09, "X11SCZ-F" }, + { IPMI_OEM_SUPERMICRO, 0x1B0A, "B10DRT-IBF2" }, + { IPMI_OEM_SUPERMICRO, 0x1B0B, "AOC-STG-b2T" }, + { IPMI_OEM_SUPERMICRO, 0x1B0C, "AOC-B25G-6X4D" }, + { IPMI_OEM_SUPERMICRO, 0x1B0D, "X11SCV-Q/L" }, + { IPMI_OEM_SUPERMICRO, 0x1B0E, "X11SCL-IF" }, + { IPMI_OEM_SUPERMICRO, 0x1B0F, "X11SCM" }, + { IPMI_OEM_SUPERMICRO, 0x1B10, "A2SDV-LN8F/LN10PF" }, + { IPMI_OEM_SUPERMICRO, 0x1B11, "X11SCH-LN4F" }, + { IPMI_OEM_SUPERMICRO, 0x1B12, "AOC-SGP-i4" }, + { IPMI_OEM_SUPERMICRO, 0x1B13, "AOC-4UR66-i4XTF" }, + { IPMI_OEM_SUPERMICRO, 0x1B14, "C9X299-PG300F" }, + { IPMI_OEM_SUPERMICRO, 0x1B15, "X11SCL-LN4F" }, + { IPMI_OEM_SUPERMICRO, 0x1B16, "AOM-PICO-3L" }, + { IPMI_OEM_SUPERMICRO, 0x1B17, "X11DPFF-SN" }, + { IPMI_OEM_SUPERMICRO, 0x1B18, "C7B360-CB-ML" }, + { IPMI_OEM_SUPERMICRO, 0x1B19, "H11SSW-NT/iN" }, + { IPMI_OEM_SUPERMICRO, 0x1B1A, "C9Z390-CG(W)" }, + { IPMI_OEM_SUPERMICRO, 0x1B1B, "AOC-CTG-i2S" }, + { IPMI_OEM_SUPERMICRO, 0x1B1C, "X11SDD" }, + { IPMI_OEM_SUPERMICRO, 0x1B1D, "X11DPT-L" }, + { IPMI_OEM_SUPERMICRO, 0x1B1E, "AOC-URN4-B2ts" }, + { IPMI_OEM_SUPERMICRO, 0x1B1F, "X11DPG-HGX2" }, + { IPMI_OEM_SUPERMICRO, 0x1B20, "AOC-SLG2-2TM2" }, + { IPMI_OEM_SUPERMICRO, 0x1B21, "AOC-SLG2-4TM2" }, + { IPMI_OEM_SUPERMICRO, 0x1B22, "AOC-SMG2-2TM2" }, + { IPMI_OEM_SUPERMICRO, 0x1B23, "RSC-UM2R-8+-NI22" }, + { IPMI_OEM_SUPERMICRO, 0x1B24, "BPN-6S3008S6" }, + { IPMI_OEM_SUPERMICRO, 0x1B25, "X11DPU-ZE+" }, + { IPMI_OEM_SUPERMICRO, 0x1B26, "AOC-2UR68-b2TS" }, + { IPMI_OEM_SUPERMICRO, 0x1B27, "AOC-S100G-b1C" }, + { IPMI_OEM_SUPERMICRO, 0x1B28, "X11SPA-TF" }, + { IPMI_OEM_SUPERMICRO, 0x1B29, "B2SC1" }, + { IPMI_OEM_SUPERMICRO, 0x1B2A, "AOC-2MG-i8" }, + { IPMI_OEM_SUPERMICRO, 0x1B2B, "H12SSW-iN" }, + { IPMI_OEM_SUPERMICRO, 0x1B2C, "H12SSW-NT" }, + { IPMI_OEM_SUPERMICRO, 0x1B2D, "M11SDV" }, + { IPMI_OEM_SUPERMICRO, 0x1B2E, "AOC-MG-b2" }, + { IPMI_OEM_SUPERMICRO, 0x1B2F, "AOM-SMF-TP4F" }, + { IPMI_OEM_SUPERMICRO, 0x1B31, "AOC-M25G-m2S" }, + { IPMI_OEM_SUPERMICRO, 0x1B32, "B11SRE-CPU" }, + { IPMI_OEM_SUPERMICRO, 0x1B33, "B11SRE" }, + { IPMI_OEM_SUPERMICRO, 0x1B34, "X11SPA-T" }, + { IPMI_OEM_SUPERMICRO, 0x1B35, "X11SDW" }, + { IPMI_OEM_SUPERMICRO, 0x1B36, "X11SCD-F" }, + { IPMI_OEM_SUPERMICRO, 0x1B37, "X11DPU-V" }, + { IPMI_OEM_SUPERMICRO, 0x1B38, "X11DPT-BV" }, + { IPMI_OEM_SUPERMICRO, 0x1B39, "B11SCG-ZTF" }, + { IPMI_OEM_SUPERMICRO, 0x1B3A, "H12DST-B" }, + { IPMI_OEM_SUPERMICRO, 0x1B3B, "X11SDS-8C" }, + { IPMI_OEM_SUPERMICRO, 0x1B3C, "AOM-SDW-B16X2" }, + { IPMI_OEM_SUPERMICRO, 0x1B3D, "B11SCG-CTF" }, + { IPMI_OEM_SUPERMICRO, 0x1B3E, "AOC-S100G-b2C" }, + { IPMI_OEM_SUPERMICRO, 0x1B3F, "X11SPD-F" }, + { IPMI_OEM_SUPERMICRO, 0x1B41, "X11SRL-F" }, + { IPMI_OEM_SUPERMICRO, 0x2011, "H8SMU" }, + { IPMI_OEM_SUPERMICRO, 0x2111, "M8QME" }, + { IPMI_OEM_SUPERMICRO, 0x2211, "H8DMT" }, + { IPMI_OEM_SUPERMICRO, 0x2311, "BHDME" }, + { IPMI_OEM_SUPERMICRO, 0x2411, "H8DMT-IBX" }, + { IPMI_OEM_SUPERMICRO, 0x2511, "H8DME-2-LS006" }, + { IPMI_OEM_SUPERMICRO, 0x8080, "X7DB8" }, + { IPMI_OEM_SUPERMICRO, 0x8180, "X7DA8" }, + { IPMI_OEM_SUPERMICRO, 0x8280, "PDSMI-LN4" }, + { IPMI_OEM_SUPERMICRO, 0x8380, "X7DBP-X" }, + { IPMI_OEM_SUPERMICRO, 0x8480, "X7DBR-8+" }, + { IPMI_OEM_SUPERMICRO, 0x8580, "PDSML" }, + { IPMI_OEM_SUPERMICRO, 0x8680, "X7DVL" }, + { IPMI_OEM_SUPERMICRO, 0x8780, "PDSBA" }, + { IPMI_OEM_SUPERMICRO, 0x8880, "X7DBX" }, + { IPMI_OEM_SUPERMICRO, 0x8980, "X7DBP-8" }, + { IPMI_OEM_SUPERMICRO, 0x9080, "X7DB8-X" }, + { IPMI_OEM_SUPERMICRO, 0x9180, "PDSME+" }, + { IPMI_OEM_SUPERMICRO, 0x9280, "X7DBR-3" }, + { IPMI_OEM_SUPERMICRO, 0x9380, "PDSLM" }, + { IPMI_OEM_SUPERMICRO, 0x9480, "X7DAL-E" }, + { IPMI_OEM_SUPERMICRO, 0x9580, "X6QT8" }, + { IPMI_OEM_SUPERMICRO, 0x9680, "X7DBN" }, + { IPMI_OEM_SUPERMICRO, 0x9780, "X7DBU" }, + { IPMI_OEM_SUPERMICRO, 0x9880, "PDSMU+" }, + { IPMI_OEM_SUPERMICRO, 0x9980, "X7DBT" }, + { IPMI_OEM_SUPERMICRO, 0xA011, "H8DM3-2" }, + { IPMI_OEM_SUPERMICRO, 0xA080, "X7DVL-3" }, + { IPMI_OEM_SUPERMICRO, 0xA111, "H8DA3-2" }, + { IPMI_OEM_SUPERMICRO, 0xA211, "H8QM3-2" }, + { IPMI_OEM_SUPERMICRO, 0xA280, "X7DW3+" }, + { IPMI_OEM_SUPERMICRO, 0xA311, "H8QM3-EX" }, + { IPMI_OEM_SUPERMICRO, 0xA380, "X7QC3" }, + { IPMI_OEM_SUPERMICRO, 0xA480, "X7DCL-3" }, + { IPMI_OEM_SUPERMICRO, 0xA511, "H8DI3+" }, + { IPMI_OEM_SUPERMICRO, 0xA580, "AOC-USAS-L8I" }, + { IPMI_OEM_SUPERMICRO, 0xA611, "BHQIE" }, + { IPMI_OEM_SUPERMICRO, 0xA680, "X7DCA-3/i" }, + { IPMI_OEM_SUPERMICRO, 0xA711, "H8SGL" }, + { IPMI_OEM_SUPERMICRO, 0xA780, "B7DC3" }, + { IPMI_OEM_SUPERMICRO, 0xA811, "H8DGU" }, + { IPMI_OEM_SUPERMICRO, 0xA811, "H8DGU" }, + { IPMI_OEM_SUPERMICRO, 0xA880, "X8DA3/i" }, + { IPMI_OEM_SUPERMICRO, 0xA911, "H8DGG-QF" }, + { IPMI_OEM_SUPERMICRO, 0xA980, "X7SB3" }, + { IPMI_OEM_SUPERMICRO, 0xAA11, "H8DGT" }, + { IPMI_OEM_SUPERMICRO, 0xAA80, "X7DWT-C-SG007" }, + { IPMI_OEM_SUPERMICRO, 0xAA80, "X7SBL-LN1/LN2" }, + { IPMI_OEM_SUPERMICRO, 0xAB11, "H8QG6" }, + { IPMI_OEM_SUPERMICRO, 0xAB80, "C2SBM-Q" }, + { IPMI_OEM_SUPERMICRO, 0xAC11, "H8DGU-LN4" }, + { IPMI_OEM_SUPERMICRO, 0xAC80, "X7DWU" }, + { IPMI_OEM_SUPERMICRO, 0xAD11, "BHQME" }, + { IPMI_OEM_SUPERMICRO, 0xAD11, "H8DGT-HIBQF-AI034" }, + { IPMI_OEM_SUPERMICRO, 0xAE11, "H8QGI-F-AI034" }, + { IPMI_OEM_SUPERMICRO, 0xAE80, "PDSMP-JN001" }, + { IPMI_OEM_SUPERMICRO, 0xAF11, "H8DGU-LN4F+-AI034" }, + { IPMI_OEM_SUPERMICRO, 0xAF80, "AOC-UTG-I2" }, + { IPMI_OEM_SUPERMICRO, 0xB080, "B7DBE" }, + { IPMI_OEM_SUPERMICRO, 0xB180, "X7DBI+" }, + { IPMI_OEM_SUPERMICRO, 0xB280, "X7DVL-L" }, + { IPMI_OEM_SUPERMICRO, 0xB380, "X7DWN" }, + { IPMI_OEM_SUPERMICRO, 0xB480, "AOC-UG-i4" }, + { IPMI_OEM_SUPERMICRO, 0xB580, "PDSBM-LN2" }, + { IPMI_OEM_SUPERMICRO, 0xB680, "X7DGT-ATOKAP" }, + { IPMI_OEM_SUPERMICRO, 0xB780, "C2SBA" }, + { IPMI_OEM_SUPERMICRO, 0xB780, "X7DWT-CD-SG007" }, + { IPMI_OEM_SUPERMICRO, 0xB880, "C2SEA" }, + { IPMI_OEM_SUPERMICRO, 0xB980, "Winbond IPMI (AMI)" }, + { IPMI_OEM_SUPERMICRO, 0xBA11, "H8SCM-F" }, + { IPMI_OEM_SUPERMICRO, 0xBA80, "C2SBX" }, + { IPMI_OEM_SUPERMICRO, 0xBA80, "X7SLM-L" }, + { IPMI_OEM_SUPERMICRO, 0xBB11, "BHDGT" }, + { IPMI_OEM_SUPERMICRO, 0xBB80, "B7DCE" }, + { IPMI_OEM_SUPERMICRO, 0xBC11, "BHQG6/E" }, + { IPMI_OEM_SUPERMICRO, 0xBC11, "H8DG6/i-F" }, + { IPMI_OEM_SUPERMICRO, 0xBC80, "X7DWT/-INF" }, + { IPMI_OEM_SUPERMICRO, 0xBD11, "H8DCT-IBQF" }, + { IPMI_OEM_SUPERMICRO, 0xBD11, "H8DGT-C" }, + { IPMI_OEM_SUPERMICRO, 0xBD80, "C2SBM" }, + { IPMI_OEM_SUPERMICRO, 0xBE11, "H8DCT" }, + { IPMI_OEM_SUPERMICRO, 0xBE80, "C2SBC" }, + { IPMI_OEM_SUPERMICRO, 0xBE80, "C2SBC" }, + { IPMI_OEM_SUPERMICRO, 0xBF11, "H8DME-EX-LS006" }, + { IPMI_OEM_SUPERMICRO, 0xBF80, "C2SBi" }, + { IPMI_OEM_SUPERMICRO, 0xC080, "AOC-USAS-H4i" }, + { IPMI_OEM_SUPERMICRO, 0xC180, "AOC-USAS-H8i" }, + { IPMI_OEM_SUPERMICRO, 0xC280, "B7DW3" }, + { IPMI_OEM_SUPERMICRO, 0xC380, "AOC-USASLP-H8iR" }, + { IPMI_OEM_SUPERMICRO, 0xCA11, "H8QGL" }, + { IPMI_OEM_SUPERMICRO, 0xCB11, "H8DGT-CM" }, + { IPMI_OEM_SUPERMICRO, 0xCD11, "H8DCL-6F" }, + { IPMI_OEM_SUPERMICRO, 0xCE11, "H8DCT-HLN4F" }, + { IPMI_OEM_SUPERMICRO, 0xCF11, "H8SML-7/i(F)" }, + { IPMI_OEM_SUPERMICRO, 0xD011, "H8QG7" }, + { IPMI_OEM_SUPERMICRO, 0xD080, "X7DWP" }, + { IPMI_OEM_SUPERMICRO, 0xD111, "H8SME-F" }, + { IPMI_OEM_SUPERMICRO, 0xD180, "X7SBi" }, + { IPMI_OEM_SUPERMICRO, 0xD280, "X7SB4/E" }, + { IPMI_OEM_SUPERMICRO, 0xD380, "X7SBA" }, + { IPMI_OEM_SUPERMICRO, 0xD480, "X7SBi-LN4" }, + { IPMI_OEM_SUPERMICRO, 0xD580, "X7SBF" }, + { IPMI_OEM_SUPERMICRO, 0xD680, "X7DCA-3/i" }, + { IPMI_OEM_SUPERMICRO, 0xDA80, "C2SBM-Q" }, + { IPMI_OEM_SUPERMICRO, 0xDB80, "X7DCU" }, + { IPMI_OEM_SUPERMICRO, 0xDC80, "X7DCA-L" }, + { IPMI_OEM_SUPERMICRO, 0xDD80, "X7SBX" }, + { IPMI_OEM_SUPERMICRO, 0xDE80, "X7DCT-10G" }, + { IPMI_OEM_SUPERMICRO, 0xDF80, "X7DWE" }, + { IPMI_OEM_SUPERMICRO, 0xF080, "X7SBT" }, + { IPMI_OEM_SUPERMICRO, 0xF180, "X7SBU" }, + { IPMI_OEM_SUPERMICRO, 0xF280, "X8DTN+" }, + { IPMI_OEM_SUPERMICRO, 0xF380, "X8SAX" }, + { IPMI_OEM_SUPERMICRO, 0xF480, "X7DCX" }, + { IPMI_OEM_SUPERMICRO, 0xF580, "X8ST3" }, + /* YADRO */ + { IPMI_OEM_YADRO, 0x0001, "VESNIN BMC" }, + { IPMI_OEM_YADRO, 0x000A, "TATLIN.UNIFIED Storage Controller BMC" }, + { IPMI_OEM_YADRO, 0x0014, "VEGMAN Series BMC" }, + { IPMI_OEM_YADRO, 0x0015, "TATLIN.ARCHIVE/xS BMC" }, { 0xffffff , 0xffff , NULL }, }; @@ -385,8 +1033,8 @@ const struct valstr ipmi_privlvl_vals[] = { { IPMI_SESSION_PRIV_OPERATOR, "OPERATOR" }, { IPMI_SESSION_PRIV_ADMIN, "ADMINISTRATOR" }, { IPMI_SESSION_PRIV_OEM, "OEM" }, - { 0xF, "NO ACCESS" }, - { 0xFF, NULL }, + { IPMI_SESSION_PRIV_NOACCESS, "NO ACCESS" }, + { UINT8_MAX, NULL }, }; @@ -617,6 +1265,25 @@ const struct valstr ipmi_chassis_power_control_vals[] = { { 0x00, NULL }, }; +/* + * See Table 28-11, Get System Restart Cause Command + */ +const struct valstr ipmi_chassis_restart_cause_vals[] = { + { 0x0, "unknown" }, + { 0x1, "chassis power control command" }, + { 0x2, "reset via pushbutton" }, + { 0x3, "power-up via pushbutton" }, + { 0x4, "watchdog expired" }, + { 0x5, "OEM" }, + { 0x6, "power-up due to always-restore power policy" }, + { 0x7, "power-up due to restore-previous power policy" }, + { 0x8, "reset via PEF" }, + { 0x9, "power-cycle via PEF" }, + { 0xa, "soft reset" }, + { 0xb, "power-up via RTC wakeup" }, + { 0xFF, NULL }, +}; + const struct valstr ipmi_auth_algorithms[] = { { IPMI_AUTH_RAKP_NONE, "none" }, { IPMI_AUTH_RAKP_HMAC_SHA1, "hmac_sha1" }, @@ -787,3 +1454,327 @@ const struct oemvalstr picmg_busres_shmc_status_vals[] = { { 0xffffff, 0x00, NULL } }; + + +/** + * A helper function to count repetitions of the same byte + * at the beginning of a string. + */ +static +size_t count_bytes(const char *s, unsigned char c) +{ + size_t count; + + for (count = 0; s && s[0] == c; ++s, ++count); + + return count; +} + +/** + * Parse the IANA PEN registry file. + * + * See https://www.iana.org/assignments/enterprise-numbers/enterprise-numbers + * The expected entry format is: + * + * Decimal + * | Organization + * | | Contact + * | | | Email + * | | | | + * 0 + * Reserved + * Internet Assigned Numbers Authority + * iana&iana.org + * + * That is, IANA PEN at position 0, enterprise name at position 2. + */ +#define IANA_NAME_OFFSET 2 +#define IANA_PEN_REGISTRY "enterprise-numbers" +static +int oem_info_list_load(oem_valstr_list_t **list) +{ + FILE *in = NULL; + char *home; + oem_valstr_list_t *oemlist = *list; + int count = 0; + + /* + * First try to open user's local registry if HOME is set + */ + if ((home = getenv("HOME"))) { + char path[PATH_MAX + 1] = { 0 }; + snprintf(path, PATH_MAX, "%s%s", + home, + PATH_SEPARATOR IANAUSERDIR PATH_SEPARATOR IANA_PEN_REGISTRY); + in = fopen(path, "r"); + } + + if (!in) { + /* + * Now open the system default file + */ + in = fopen(IANADIR PATH_SEPARATOR IANA_PEN_REGISTRY, "r"); + if (!in) { + lperror(LOG_ERR, "IANA PEN registry open failed"); + return -1; + } + } + + /* + * Read the registry file line by line, fill in the linked list, + * and count the entries. No sorting is done, entries will come in + * reverse registry order. + */ + while (!feof(in)) { + oem_valstr_list_t *item; + char *line = NULL; + char *endptr = NULL; + size_t len = 0; + long iana; + + if (!getline(&line, &len, in)) { + /* Either an EOF or an empty line. Start over. */ + continue; + } + + /* + * Check if the line starts with a digit. If so, take it as IANA PEN. + * Any numbers not starting at position 0 are discarded. + */ + iana = strtol(line, &endptr, 10); + if (!isdigit(line[0]) || endptr == line) { + free_n(&line); + continue; + } + free_n(&line); + + /* + * Now as we have the enterprise number, we're expecting the + * organization name to immediately follow. + */ + len = 0; + if (!getline(&line, &len, in)) { + /* + * Either an EOF or an empty line. Neither one can happen in + * a valid registry entry. Start over. + */ + continue; + } + + if (len < IANA_NAME_OFFSET + 1 + || count_bytes(line, ' ') != IANA_NAME_OFFSET) + { + /* + * This is not a valid line, it doesn't start with + * a correct-sized indentation or is too short. + * Start over. + */ + free_n(&line); + continue; + } + + /* Adjust to real line length, don't count the indentation */ + len = strnlen(line + IANA_NAME_OFFSET, len - IANA_NAME_OFFSET); + + /* Don't count the trailing newline */ + if (line[IANA_NAME_OFFSET + len - 1] == '\n') { + --len; + } + + item = malloc(sizeof(oem_valstr_list_t)); + if (!item) { + lperror(LOG_ERR, "IANA PEN registry entry allocation failed"); + free_n(&line); + /* Just stop reading, and process what has already been read */ + break; + } + + /* + * Looks like we have a valid entry, store it in the list. + */ + item->valstr.val = iana; + item->valstr.str = malloc(len + 1); /* Add 1 for \0 terminator */ + if (!item->valstr.str) { + lperror(LOG_ERR, "IANA PEN registry string allocation failed"); + free_n(&line); + free_n(&item); + /* Just stop reading, and process what has already been read */ + break; + } + + /* + * Most other valstr arrays are constant and all of them aren't meant + * for modification, so the string inside 'struct valstr' is const. + * Here we're loading the strings dynamically so we intentionally + * cast to a non-const type to be able to modify data here and + * keep the compiler silent about it. Restrictions still apply to + * other places where these strings are used. + */ + snprintf((void *)item->valstr.str, len + 1, + "%s", line + IANA_NAME_OFFSET); + free_n(&line); + item->next = oemlist; + oemlist = item; + ++count; + } + fclose (in); + + *list = oemlist; + return count; +} + +/** + * Free the allocated list items and, if needed, strings. + */ +static +void +oem_info_list_free(oem_valstr_list_t **list, bool free_strings) +{ + while ((*list)->next) { + oem_valstr_list_t *item = *list; + *list = item->next; + if (free_strings) { + free_n(&item->valstr.str); + } + free_n(&item); + } +} + +/** + * Initialize the ipmi_oem_info array from a list + */ +static +bool +oem_info_init_from_list(oem_valstr_list_t *oemlist, size_t count) +{ + /* Do not count terminators */ + size_t head_entries = ARRAY_SIZE(ipmi_oem_info_head) - 1; + size_t tail_entries = ARRAY_SIZE(ipmi_oem_info_tail) - 1; + static oem_valstr_list_t *item; + bool rc = false; + int oemlist_debug = LOG_DEBUG + 4; /* Require six -v options */ + + /* Include static entries and the terminator */ + count += head_entries + tail_entries + 1; + + /* + * Allocate as much memory as needed to accomodata all the entries + * of the loaded linked list, plus the static head and tail, not including + * their terminating entries, plus the terminating entry for the new + * array. + */ + ipmi_oem_info = malloc(count * sizeof(*ipmi_oem_info)); + + if (!ipmi_oem_info) { + /* + * We can't identify OEMs without an allocated ipmi_oem_info. + * Report an error, set the pointer to dummy and clean up. + */ + lperror(LOG_ERR, "IANA PEN registry array allocation failed"); + ipmi_oem_info = ipmi_oem_info_dummy; + goto out; + } + + lprintf(oemlist_debug, " Allocating %6zu entries", count); + + /* Add a terminator at the very end */ + --count; + ((struct valstr *)ipmi_oem_info)[count].val = -1; + ((struct valstr *)ipmi_oem_info)[count].str = NULL; + + /* Add tail entries from the end */ + while (count-- < SIZE_MAX && tail_entries--) { + ((struct valstr *)ipmi_oem_info)[count] = + ipmi_oem_info_tail[tail_entries]; + + lprintf(oemlist_debug, " [%6zu] %8d | %s", count, + ipmi_oem_info[count].val, ipmi_oem_info[count].str); + } + + /* Now add the loaded entries */ + item = oemlist; + while (count < SIZE_MAX && item->next) { + ((struct valstr *)ipmi_oem_info)[count] = + item->valstr; + + lprintf(oemlist_debug, " [%6zu] %8d | %s", count, + ipmi_oem_info[count].val, ipmi_oem_info[count].str); + + item = item->next; + --count; + } + + /* Now add head entries */ + while (count < SIZE_MAX && head_entries--) { + ((struct valstr *)ipmi_oem_info)[count] = + ipmi_oem_info_head[head_entries]; + lprintf(oemlist_debug, " [%6zu] %8d | %s", count, + ipmi_oem_info[count].val, ipmi_oem_info[count].str); + --count; + } + + rc = true; + +out: + return rc; +} + +int ipmi_oem_info_init() +{ + oem_valstr_list_t terminator = { { -1, NULL}, NULL }; /* Terminator */ + oem_valstr_list_t *oemlist = &terminator; + bool free_strings = true; + size_t count; + int rc = -4; + + lprintf(LOG_INFO, "Loading IANA PEN Registry..."); + + if (ipmi_oem_info) { + lprintf(LOG_INFO, "IANA PEN Registry is already loaded"); + rc = 0; + goto out; + } + + if (!(count = oem_info_list_load(&oemlist))) { + /* + * We can't identify OEMs without a loaded registry. + * Set the pointer to dummy and return. + */ + ipmi_oem_info = ipmi_oem_info_dummy; + goto out; + } + + /* In the array was allocated, don't free the strings at cleanup */ + free_strings = !oem_info_init_from_list(oemlist, count); + + rc = IPMI_CC_OK; + +out: + oem_info_list_free(&oemlist, free_strings); + return rc; +} + +void ipmi_oem_info_free() +{ + /* Start with the dynamically allocated entries */ + size_t i = ARRAY_SIZE(ipmi_oem_info_head) - 1; + + if (ipmi_oem_info == ipmi_oem_info_dummy) { + return; + } + + /* + * Proceed dynamically allocated entries until we hit the first + * entry of ipmi_oem_info_tail[], which is statically allocated. + */ + while (ipmi_oem_info + && ipmi_oem_info[i].val < UINT32_MAX + && ipmi_oem_info[i].str != ipmi_oem_info_tail[0].str) + { + free_n(&((struct valstr *)ipmi_oem_info)[i].str); + ++i; + } + + /* Free the array itself */ + free_n(&ipmi_oem_info); +} diff --git a/lib/ipmi_sunoem.c b/lib/ipmi_sunoem.c index ecbcbd9..d03900d 100644 --- a/lib/ipmi_sunoem.c +++ b/lib/ipmi_sunoem.c @@ -29,7 +29,6 @@ * LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, * EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. */ -#define _XOPEN_SOURCE #include <stdlib.h> #include <stdio.h> @@ -197,7 +196,7 @@ static void __sdr_list_empty(struct sdr_record_list * head) { struct sdr_record_list * e, *f; - for (e = head; e != NULL; e = f) { + for (e = head; e; e = f) { f = e->next; free(e); } @@ -254,7 +253,7 @@ sunoem_led_get(struct ipmi_intf * intf, struct sdr_record_generic_locator * dev, uint8_t rqdata[7]; int rqdata_len; - if (dev == NULL) { + if (!dev) { *loc_rsp = NULL; return (SUNOEM_EC_INVALID_ARG); } @@ -283,10 +282,10 @@ sunoem_led_get(struct ipmi_intf * intf, struct sdr_record_generic_locator * dev, * Just return NULL if there was * an error. */ - if (rsp == NULL) { + if (!rsp) { *loc_rsp = NULL; return (SUNOEM_EC_BMC_NOT_RESPONDING); - } else if (rsp->ccode > 0) { + } else if (rsp->ccode) { *loc_rsp = rsp; return (SUNOEM_EC_BMC_CCODE_NONZERO); } else { @@ -304,7 +303,7 @@ sunoem_led_set(struct ipmi_intf * intf, struct sdr_record_generic_locator * dev, uint8_t rqdata[9]; int rqdata_len; - if (dev == NULL) + if (!dev) return NULL; rqdata[0] = dev->dev_slave_addr; @@ -330,10 +329,10 @@ sunoem_led_set(struct ipmi_intf * intf, struct sdr_record_generic_locator * dev, req.msg.data_len = rqdata_len; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Sun OEM Set LED command failed."); return NULL; - } else if (rsp->ccode > 0) { + } else if (rsp->ccode) { lprintf(LOG_ERR, "Sun OEM Set LED command failed: %s", val2str(rsp->ccode, completion_code_vals)); return NULL; @@ -361,11 +360,11 @@ sunoem_led_get_byentity(struct ipmi_intf * intf, uint8_t entity_id, elist = ipmi_sdr_find_sdr_byentity(intf, &entity); - if (elist == NULL) + if (!elist) ret_get = -1; /* for each generic sensor get its led state */ - for (e = elist; e != NULL; e = e->next) { + for (e = elist; e; e = e->next) { if (e->type != SDR_RECORD_TYPE_GENERIC_DEVICE_LOCATOR) continue; @@ -404,11 +403,11 @@ sunoem_led_set_byentity(struct ipmi_intf * intf, uint8_t entity_id, elist = ipmi_sdr_find_sdr_byentity(intf, &entity); - if (elist == NULL) + if (!elist) ret_set = -1; /* for each generic sensor set its led state */ - for (e = elist; e != NULL; e = e->next) { + for (e = elist; e; e = e->next) { if (e->type != SDR_RECORD_TYPE_GENERIC_DEVICE_LOCATOR) continue; @@ -417,7 +416,7 @@ sunoem_led_set_byentity(struct ipmi_intf * intf, uint8_t entity_id, if (rsp && rsp->data_len == 0) { led_print((const char *) e->record.genloc->id_string, PRINT_NORMAL, ledmode); - } else if (rsp == NULL) { + } else if (!rsp) { ret_set = -1; } } @@ -435,14 +434,14 @@ sunoem_led_set_byentity(struct ipmi_intf * intf, uint8_t entity_id, * Access Address" field, 0x20 if the LED is local * [byte 3] hwInfo The OEM field from the SDR record * [byte 4] force 1 = directly access the device - * 0 = go thru its controller + * 0 = go through its controller * Ignored if LED is local * * The format below is for Sun Blade Modular systems only * [byte 4] entityID The entityID field from the SDR record * [byte 5] entityIns The entityIns field from the SDR record * [byte 6] force 1 = directly access the device - * 0 = go thru its controller + * 0 = go through its controller * Ignored if LED is local */ static int @@ -460,7 +459,7 @@ ipmi_sunoem_led_get(struct ipmi_intf * intf, int argc, char ** argv) * sunoem led/sbled get <id> [type] */ - if (argc < 1 || strncmp(argv[0], "help", 4) == 0) { + if (argc < 1 || !strcmp(argv[0], "help")) { ipmi_sunoem_usage(); return (0); } @@ -472,15 +471,15 @@ ipmi_sunoem_led_get(struct ipmi_intf * intf, int argc, char ** argv) "Unknown ledtype, will use data from the SDR oem field"); } - if (strncasecmp(argv[0], "all", 3) == 0) { + if (strcasecmp(argv[0], "all") == 0) { /* do all generic sensors */ alist = ipmi_sdr_find_sdr_bytype(intf, SDR_RECORD_TYPE_GENERIC_DEVICE_LOCATOR); - if (alist == NULL) + if (!alist) return (-1); - for (a = alist; a != NULL; a = a->next) { + for (a = alist; a; a = a->next) { if (a->type != SDR_RECORD_TYPE_GENERIC_DEVICE_LOCATOR) continue; if (a->record.genloc->entity.logical) @@ -511,7 +510,7 @@ ipmi_sunoem_led_get(struct ipmi_intf * intf, int argc, char ** argv) /* look up generic device locator record in SDR */ sdr = ipmi_sdr_find_sdr_byid(intf, argv[0]); - if (sdr == NULL) { + if (!sdr) { lprintf(LOG_ERR, "No Sensor Data Record found for %s", argv[0]); return (-1); } @@ -556,14 +555,14 @@ ipmi_sunoem_led_get(struct ipmi_intf * intf, int argc, char ** argv) /* get entity assoc records */ alist = ipmi_sdr_find_sdr_bytype(intf, SDR_RECORD_TYPE_ENTITY_ASSOC); - if (alist == NULL) + if (!alist) return (-1); - for (a = alist; a != NULL; a = a->next) { + for (a = alist; a; a = a->next) { if (a->type != SDR_RECORD_TYPE_ENTITY_ASSOC) continue; assoc = a->record.entassoc; - if (assoc == NULL) + if (!assoc) continue; /* check that the entity id/instance matches our generic record */ @@ -625,7 +624,7 @@ ipmi_sunoem_led_get(struct ipmi_intf * intf, int argc, char ** argv) * [byte 3] hwInfo The OEM field from the SDR record * [byte 4] mode LED Mode: OFF, ON, STANDBY, SLOW, FAST * [byte 5] force TRUE - directly access the device - * FALSE - go thru its controller + * FALSE - go through its controller * Ignored if LED is local * [byte 6] role Used by BMC for authorization purposes * @@ -633,7 +632,7 @@ ipmi_sunoem_led_get(struct ipmi_intf * intf, int argc, char ** argv) * [byte 5] entityID The entityID field from the SDR record * [byte 6] entityIns The entityIns field from the SDR record * [byte 7] force TRUE - directly access the device - * FALSE - go thru its controller + * FALSE - go through its controller * Ignored if LED is local * [byte 8] role Used by BMC for authorization purposes * @@ -658,7 +657,7 @@ ipmi_sunoem_led_set(struct ipmi_intf * intf, int argc, char ** argv) * sunoem led/sbled set <id> <mode> [type] */ - if (argc < 2 || strncmp(argv[0], "help", 4) == 0) { + if (argc < 2 || !strcmp(argv[0], "help")) { ipmi_sunoem_usage(); return (0); } @@ -679,21 +678,21 @@ ipmi_sunoem_led_set(struct ipmi_intf * intf, int argc, char ** argv) "Unknown ledtype, will use data from the SDR oem field"); } - if (strncasecmp(argv[0], "all", 3) == 0) { + if (strcasecmp(argv[0], "all") == 0) { /* do all generic sensors */ alist = ipmi_sdr_find_sdr_bytype(intf, SDR_RECORD_TYPE_GENERIC_DEVICE_LOCATOR); - if (alist == NULL) + if (!alist) return (-1); - for (a = alist; a != NULL; a = a->next) { + for (a = alist; a; a = a->next) { if (a->type != SDR_RECORD_TYPE_GENERIC_DEVICE_LOCATOR) continue; if (a->record.genloc->entity.logical) continue; rsp = sunoem_led_set(intf, a->record.genloc, ledtype, ledmode); - if (rsp && rsp->ccode == 0) + if (rsp && !rsp->ccode) led_print((const char *) a->record.genloc->id_string, PRINT_NORMAL, ledmode); else @@ -710,7 +709,7 @@ ipmi_sunoem_led_set(struct ipmi_intf * intf, int argc, char ** argv) /* look up generic device locator records in SDR */ sdr = ipmi_sdr_find_sdr_byid(intf, argv[0]); - if (sdr == NULL) { + if (!sdr) { lprintf(LOG_ERR, "No Sensor Data Record found for %s", argv[0]); return (-1); } @@ -725,7 +724,7 @@ ipmi_sunoem_led_set(struct ipmi_intf * intf, int argc, char ** argv) * handle physical entity */ rsp = sunoem_led_set(intf, sdr->record.genloc, ledtype, ledmode); - if (rsp && rsp->ccode == 0) + if (rsp && !rsp->ccode) led_print(argv[0], PRINT_NORMAL, ledmode); else return (-1); @@ -742,14 +741,14 @@ ipmi_sunoem_led_set(struct ipmi_intf * intf, int argc, char ** argv) /* get entity assoc records */ alist = ipmi_sdr_find_sdr_bytype(intf, SDR_RECORD_TYPE_ENTITY_ASSOC); - if (alist == NULL) + if (!alist) return (-1); - for (a = alist; a != NULL; a = a->next) { + for (a = alist; a; a = a->next) { if (a->type != SDR_RECORD_TYPE_ENTITY_ASSOC) continue; assoc = a->record.entassoc; - if (assoc == NULL) + if (!assoc) continue; /* check that the entity id/instance matches our generic record */ @@ -813,10 +812,10 @@ ipmi_sunoem_sshkey_del(struct ipmi_intf * intf, uint8_t uid) req.msg.data_len = 1; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Unable to delete ssh key for UID %d", uid); return (-1); - } else if (rsp->ccode > 0) { + } else if (rsp->ccode) { lprintf(LOG_ERR, "Unable to delete ssh key for UID %d: %s", uid, val2str(rsp->ccode, completion_code_vals)); return (-1); @@ -839,13 +838,13 @@ ipmi_sunoem_sshkey_set(struct ipmi_intf * intf, uint8_t uid, char * ifile) int32_t r = 0; int32_t size = 0; - if (ifile == NULL) { + if (!ifile) { lprintf(LOG_ERR, "Invalid or misisng input filename."); return (-1); } fp = ipmi_open_file_read(ifile); - if (fp == NULL) { + if (!fp) { lprintf(LOG_ERR, "Unable to open file '%s' for reading.", ifile); return (-1); } @@ -857,7 +856,7 @@ ipmi_sunoem_sshkey_set(struct ipmi_intf * intf, uint8_t uid, char * ifile) if (fseek(fp, 0, SEEK_END) == (-1)) { lprintf(LOG_ERR, "Failed to seek in file '%s'.", ifile); - if (fp != NULL) + if (fp) fclose(fp); return (-1); @@ -866,13 +865,13 @@ ipmi_sunoem_sshkey_set(struct ipmi_intf * intf, uint8_t uid, char * ifile) size = (int32_t) ftell(fp); if (size < 0) { lprintf(LOG_ERR, "Failed to seek in file '%s'.", ifile); - if (fp != NULL) + if (fp) fclose(fp); return (-1); } else if (size == 0) { lprintf(LOG_ERR, "File '%s' is empty.", ifile); - if (fp != NULL) + if (fp) fclose(fp); return (-1); @@ -880,7 +879,7 @@ ipmi_sunoem_sshkey_set(struct ipmi_intf * intf, uint8_t uid, char * ifile) if (fseek(fp, 0, SEEK_SET) == (-1)) { lprintf(LOG_ERR, "Failed to seek in file '%s'.", ifile); - if (fp != NULL) + if (fp) fclose(fp); return (-1); @@ -900,7 +899,7 @@ ipmi_sunoem_sshkey_set(struct ipmi_intf * intf, uint8_t uid, char * ifile) printf("failed\n"); lprintf(LOG_ERR, "Unable to read %ld bytes from file '%s'.", i_size, ifile); - if (fp != NULL) + if (fp) fclose(fp); return (-1); @@ -917,7 +916,7 @@ ipmi_sunoem_sshkey_set(struct ipmi_intf * intf, uint8_t uid, char * ifile) printf("failed\n"); lprintf(LOG_ERR, "Unable to pack byte %ld from file '%s'.", r, ifile); - if (fp != NULL) + if (fp) fclose(fp); return (-1); @@ -930,23 +929,23 @@ ipmi_sunoem_sshkey_set(struct ipmi_intf * intf, uint8_t uid, char * ifile) req.msg.data_len = i_size + 3; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { printf("failed\n"); lprintf(LOG_ERR, "Unable to set ssh key for UID %d.", uid); - if (fp != NULL) + if (fp) fclose(fp); return (-1); - } /* if (rsp == NULL) */ - if (rsp->ccode != 0) { + } + if (rsp->ccode) { printf("failed\n"); lprintf(LOG_ERR, "Unable to set ssh key for UID %d, %s.", uid, val2str(rsp->ccode, completion_code_vals)); - if (fp != NULL) + if (fp) fclose(fp); return (-1); - } /* if (rsp->ccode != 0) */ + } } printf("done\n"); @@ -1077,7 +1076,7 @@ ipmi_sunoem_cli(struct ipmi_intf * intf, int argc, char *argv[]) memset(&cli_req, 0, sizeof(cli_req)); cli_req.version = SunOemCliActingVersion; cli_req.command_response = SUNOEM_CLI_CMD_OPEN; - if (argc > 0 && strcmp(argv[0], "force") == 0) { + if (argc > 0 && !strcmp(argv[0], "force")) { cli_req.command_response = SUNOEM_CLI_CMD_FORCE; argc--; argv++; @@ -1091,16 +1090,15 @@ ipmi_sunoem_cli(struct ipmi_intf * intf, int argc, char *argv[]) while (1) { cli_req.version = SunOemCliActingVersion; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Sun OEM cli command failed"); return (-1); } cli_rsp = (sunoem_cli_msg_t *) rsp->data; - if ((cli_rsp->command_response != 0) || (rsp->ccode != 0)) { - if (strncmp(cli_rsp->buf, SUNOEM_CLI_INVALID_VER_ERR, - sizeof(SUNOEM_CLI_INVALID_VER_ERR) - 1) == 0 - || strncmp(&(cli_rsp->buf[1]), SUNOEM_CLI_INVALID_VER_ERR, - sizeof(SUNOEM_CLI_INVALID_VER_ERR) - 1) == 0) { + if (cli_rsp->command_response || rsp->ccode) { + if (!strcmp(cli_rsp->buf, SUNOEM_CLI_INVALID_VER_ERR) + || !strcmp(&(cli_rsp->buf[1]), SUNOEM_CLI_INVALID_VER_ERR)) + { if (SunOemCliActingVersion == SUNOEM_CLI_VERSION) { /* Server doesn't support version SUNOEM_CLI_VERSION Fall back to legacy version, and try again*/ @@ -1110,8 +1108,7 @@ ipmi_sunoem_cli(struct ipmi_intf * intf, int argc, char *argv[]) /* Server doesn't support legacy version either */ lprintf(LOG_ERR, "Failed to connect: %s", cli_rsp->buf); return (-1); - } else if (strncmp(cli_rsp->buf, SUNOEM_CLI_BUSY_ERR, - sizeof(SUNOEM_CLI_BUSY_ERR) - 1) == 0) { + } else if (!strcmp(cli_rsp->buf, SUNOEM_CLI_BUSY_ERR)) { if (retries++ < SUNOEM_CLI_MAX_RETRY) { lprintf(LOG_INFO, "Failed to connect: %s, retrying", cli_rsp->buf); @@ -1155,7 +1152,7 @@ ipmi_sunoem_cli(struct ipmi_intf * intf, int argc, char *argv[]) return (-1); } } - while (rsp->ccode == 0 && cli_rsp->command_response == 0) { + while (!rsp->ccode && cli_rsp->command_response == 0) { int rc = 0; int count = 0; cli_req.buf[0] = '\0'; @@ -1197,7 +1194,7 @@ ipmi_sunoem_cli(struct ipmi_intf * intf, int argc, char *argv[]) } else if (arg_num >= argc) { /* Last arg was sent. Set EOF */ cli_req.command_response = SUNOEM_CLI_CMD_EOF; - } else if (strncmp(argv[arg_num], "@wait=", 6) == 0) { + } else if (!strcmp(argv[arg_num], "@wait=")) { /* This is a wait command */ char *s = &argv[arg_num][6]; delay = 0; @@ -1254,7 +1251,7 @@ ipmi_sunoem_cli(struct ipmi_intf * intf, int argc, char *argv[]) req.msg.data_len = SUNOEM_CLI_HEADER + count; for (retries = 0; retries <= SUNOEM_CLI_MAX_RETRY; retries++) { rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Communication error."); error = 1; goto cleanup; @@ -1281,7 +1278,7 @@ ipmi_sunoem_cli(struct ipmi_intf * intf, int argc, char *argv[]) fflush(NULL); /* Flush partial lines to stdout */ count = 0; /* Don't re-send the client's data */ if (cli_req.command_response == SUNOEM_CLI_CMD_EOF - && cli_rsp->command_response != 0 && rsp->ccode == 0) { + && cli_rsp->command_response != 0 && !rsp->ccode) { cli_rsp->command_response = 1; } } while (cli_rsp->command_response == 0 && cli_rsp->buf[0] != '\0'); @@ -1381,7 +1378,7 @@ ipmi_sunoem_echo(struct ipmi_intf * intf, int argc, char *argv[]) gettimeofday(&end_time, NULL); resp_time = ((end_time.tv_sec - start_time.tv_sec) * 1000) + ((end_time.tv_usec - start_time.tv_usec) / 1000); - if ((rsp == NULL) || (rsp->ccode != 0)) { + if (!rsp || rsp->ccode) { lprintf(LOG_ERR, "Sun OEM echo command failed. Seq # %d", echo_req.seq_num); rc = (-2); @@ -1466,7 +1463,7 @@ typedef struct /* * When adding new fields (using the spare bytes), * add it immediately after the spare field to - * ensure backward compatability. + * ensure backward compatibility. * * e.g. char version[40]; * unsigned char spare[11]; @@ -1501,11 +1498,11 @@ ipmi_sunoem_getversion(struct ipmi_intf * intf, req.msg.data_len = 0; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Sun OEM Get SP Version Failed."); return (-1); } - if (rsp->ccode != 0) { + if (rsp->ccode) { lprintf(LOG_ERR, "Sun OEM Get SP Version Failed: %d", rsp->ccode); return (-1); } @@ -1651,11 +1648,11 @@ ipmi_sunoem_nacname(struct ipmi_intf * intf, int argc, char *argv[]) req.msg.data_len = sizeof(sunoem_nacname_t); rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Sun OEM nacname command failed."); return (-1); } - if (rsp->ccode != 0) { + if (rsp->ccode) { lprintf(LOG_ERR, "Sun OEM nacname command failed: %d", rsp->ccode); return (-1); } @@ -1800,7 +1797,7 @@ ipmi_sunoem_getval(struct ipmi_intf * intf, int argc, char *argv[]) } if ((ipmi_sunoem_checkversion(intf, &supp_ver) < 0) - && (!strncmp(argv[0], sp_path, strlen(sp_path)))) { + && (!strcmp(argv[0], sp_path))) { argv[0][1] = 'X'; /*replace SP by X to gain access to hidden properties*/ memmove(&argv[0][2], &argv[0][3], strlen(argv[0]) - 2); } @@ -1821,11 +1818,11 @@ ipmi_sunoem_getval(struct ipmi_intf * intf, int argc, char *argv[]) req.msg.data_len = sizeof(sunoem_getval_t); rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Sun OEM getval1 command failed."); return (-1); } - if (rsp->ccode != 0) { + if (rsp->ccode) { lprintf(LOG_ERR, "Sun OEM getval1 command failed: %d", rsp->ccode); return (-1); } @@ -1843,12 +1840,12 @@ ipmi_sunoem_getval(struct ipmi_intf * intf, int argc, char *argv[]) req.msg.data_len = sizeof(sunoem_getval_t); rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Sun OEM getval2 command failed."); return (-1); } - if (rsp->ccode != 0) { + if (rsp->ccode) { lprintf(LOG_ERR, "Sun OEM getval2 command failed: %d", rsp->ccode); return (-1); } @@ -1911,12 +1908,12 @@ send_luapi_prop_name(struct ipmi_intf * intf, int len, char *prop_name, req.msg.data_len = sizeof(sunoem_setval_t); rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Sun OEM setval prop name: response is NULL"); return (-1); } - if (rsp->ccode != 0) { + if (rsp->ccode) { lprintf(LOG_ERR, "Sun OEM setval prop name: request failed: %d", rsp->ccode); return (-1); @@ -1984,12 +1981,12 @@ send_luapi_prop_value(struct ipmi_intf * intf, int len, char *prop_value, req.msg.data_len = sizeof(sunoem_setval_t); rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Sun OEM setval prop value: response is NULL"); return (-1); } - if (rsp->ccode != 0) { + if (rsp->ccode) { lprintf(LOG_ERR, "Sun OEM setval prop value: request failed: %d", rsp->ccode); return (-1); @@ -2077,12 +2074,12 @@ ipmi_sunoem_setval(struct ipmi_intf * intf, int argc, char *argv[]) req.msg.data_len = sizeof(sunoem_setval_t); rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Sun OEM setval command failed."); return (-1); } - if (rsp->ccode != 0) { + if (rsp->ccode) { lprintf(LOG_ERR, "Sun OEM setval command failed: %d", rsp->ccode); return (-1); } @@ -2167,7 +2164,7 @@ ipmi_sunoem_getfile(struct ipmi_intf * intf, int argc, char *argv[]) /* Create the destination file */ fp = ipmi_open_file_write(argv[1]); - if (fp == NULL) { + if (!fp) { lprintf(LOG_ERR, "Unable to open file: %s", argv[1]); return (-1); } @@ -2188,12 +2185,12 @@ ipmi_sunoem_getfile(struct ipmi_intf * intf, int argc, char *argv[]) rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Sun OEM getfile command failed."); fclose(fp); return (-1); } - if (rsp->ccode != 0) { + if (rsp->ccode) { lprintf(LOG_ERR, "Sun OEM getfile command failed: %d", rsp->ccode); fclose(fp); return (-1); @@ -2301,12 +2298,12 @@ ipmi_sunoem_getbehavior(struct ipmi_intf * intf, int argc, char *argv[]) rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Sun OEM getbehavior command failed."); return (-1); } - if (rsp->ccode != 0) { + if (rsp->ccode) { lprintf(LOG_ERR, "Sun OEM getbehavior command failed: %d", rsp->ccode); return (-1); } @@ -2323,27 +2320,29 @@ ipmi_sunoem_main(struct ipmi_intf * intf, int argc, char ** argv) { int rc = 0; - if (argc == 0 || strcmp(argv[0], "help") == 0) { + if (!argc || !strcmp(argv[0], "help")) { ipmi_sunoem_usage(); return (0); - } /* if (argc == 0 || strcmp(argv[0], "help") == 0) */ + } - if (strcmp(argv[0], "cli") == 0) { + if (!strcmp(argv[0], "cli")) { rc = ipmi_sunoem_cli(intf, argc - 1, &argv[1]); - } else if ((strcmp(argv[0], "led") == 0) || (strcmp(argv[0], "sbled") == 0)) { + } else if (!strcmp(argv[0], "led") + || !strcmp(argv[0], "sbled")) + { if (argc < 2) { ipmi_sunoem_usage(); return (-1); } - if (strcmp(argv[1], "get") == 0) { + if (!strcmp(argv[1], "get")) { if (argc < 3) { char * arg[] = { "all" }; rc = ipmi_sunoem_led_get(intf, 1, arg); } else { rc = ipmi_sunoem_led_get(intf, argc - 2, &(argv[2])); } - } else if (strcmp(argv[1], "set") == 0) { + } else if (!strcmp(argv[1], "set")) { if (argc < 4) { ipmi_sunoem_usage(); return (-1); @@ -2353,7 +2352,7 @@ ipmi_sunoem_main(struct ipmi_intf * intf, int argc, char ** argv) ipmi_sunoem_usage(); return (-1); } - } else if (strcmp(argv[0], "sshkey") == 0) { + } else if (!strcmp(argv[0], "sshkey")) { uint8_t uid = 0; if (argc < 3) { ipmi_sunoem_usage(); @@ -2371,10 +2370,10 @@ ipmi_sunoem_main(struct ipmi_intf * intf, int argc, char ** argv) return (-1); } - if (strcmp(argv[1], "del") == 0) { + if (!strcmp(argv[1], "del")) { /* number of arguments, three, is already checked at this point */ rc = ipmi_sunoem_sshkey_del(intf, uid); - } else if (strcmp(argv[1], "set") == 0) { + } else if (!strcmp(argv[1], "set")) { if (argc < 4) { ipmi_sunoem_usage(); return (-1); @@ -2384,39 +2383,39 @@ ipmi_sunoem_main(struct ipmi_intf * intf, int argc, char ** argv) ipmi_sunoem_usage(); return (-1); } - } else if (strcmp(argv[0], "ping") == 0) { + } else if (!strcmp(argv[0], "ping")) { if (argc < 2) { ipmi_sunoem_usage(); return (-1); } rc = ipmi_sunoem_echo(intf, argc - 1, &(argv[1])); - } else if (strcmp(argv[0], "version") == 0) { + } else if (!strcmp(argv[0], "version")) { rc = ipmi_sunoem_version(intf); - } else if (strcmp(argv[0], "nacname") == 0) { + } else if (!strcmp(argv[0], "nacname")) { if (argc < 2) { ipmi_sunoem_usage(); return (-1); } rc = ipmi_sunoem_nacname(intf, argc - 1, &(argv[1])); - } else if (strcmp(argv[0], "getval") == 0) { + } else if (!strcmp(argv[0], "getval")) { if (argc < 2) { ipmi_sunoem_usage(); return (-1); } rc = ipmi_sunoem_getval(intf, argc - 1, &(argv[1])); - } else if (strcmp(argv[0], "setval") == 0) { + } else if (!strcmp(argv[0], "setval")) { if (argc < 3) { ipmi_sunoem_usage(); return (-1); } rc = ipmi_sunoem_setval(intf, argc - 1, &(argv[1])); - } else if (strcmp(argv[0], "getfile") == 0) { + } else if (!strcmp(argv[0], "getfile")) { if (argc < 3) { ipmi_sunoem_usage(); return (-1); } rc = ipmi_sunoem_getfile(intf, argc - 1, &(argv[1])); - } else if (strcmp(argv[0], "getbehavior") == 0) { + } else if (!strcmp(argv[0], "getbehavior")) { if (argc < 2) { ipmi_sunoem_usage(); return (-1); @@ -2425,7 +2424,7 @@ ipmi_sunoem_main(struct ipmi_intf * intf, int argc, char ** argv) } else { lprintf(LOG_ERR, "Invalid sunoem command: %s", argv[0]); return (-1); - } /* if (strcmp(argv[0], "cli") == 0) */ + } return (rc); } diff --git a/lib/ipmi_time.c b/lib/ipmi_time.c new file mode 100644 index 0000000..aecd656 --- /dev/null +++ b/lib/ipmi_time.c @@ -0,0 +1,243 @@ +/* + * Copyright (c) 2018 Alexander Amelkin. All Rights Reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * Redistribution of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * Redistribution in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * Neither the name of the copyright holder, nor the names of + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * This software is provided "AS IS," without a warranty of any kind. + * ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, + * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A + * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. + * THE COPYRIGHT HOLDER AND ITS LICENSORS SHALL NOT BE LIABLE + * FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING + * OR DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. IN NO EVENT WILL + * THE COPYRIGHT HOLDER OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, + * PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, + * INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE + * THEORY OF LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS + * SOFTWARE, EVEN IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY + * OF SUCH DAMAGES. + */ + +#include <time.h> +#include <stdbool.h> +#include <stdint.h> +#include <stdio.h> /* snprintf */ + +#if HAVE_CONFIG_H +# include <config.h> +#endif + +#include <ipmitool/ipmi_time.h> + +bool time_in_utc; /* Set by '-Z' command line option */ + +time_t +ipmi_localtime2utc(time_t local) +{ + struct tm tm; + gmtime_r(&local, &tm); + tm.tm_isdst = (-1); + return mktime(&tm); +} + +/** + * @brief Convert a timestamp to a formatted string, + * considering the '-Z' option. Acts as if tzset() was called. + * + * @param[out] s The output string buffer + * @param[in] max The size of the output string buffer including the + * terminating null byte + * @param[in] format The format string, as in strftime(), ignored for + * special timestamp values as per section 37.1 of + * IPMI v2.0 specification rev 1.1. + * @param[in] stamp The time stamp to convert + * + * @returns the number of bytes written to s or 0, see strftime() + */ +size_t +ipmi_strftime(char *s, size_t max, const char *format, time_t stamp) +{ + struct tm tm; + /* + * There is a bug in gcc since 4.3.2 and still not fixed in 8.1.0. + * Even if __attribute__((format(strftime... is specified for a wrapper + * function around strftime, gcc still complains about strftime being + * called from the wrapper with a "non-literal" format argument. + * + * See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=39438 + * + * The following macro uses an "ugly cast" from that discussion to + * silence the compiler. The format string is checked for the wrapper + * because __attribute__((format)) is specified in the header file. + */ + #define wrapstrftime(buf, buflen, fmt, t) \ + ((size_t (*)(char *, size_t, const char *, const struct tm *))\ + strftime)(buf, buflen, fmt, t) + + + if (IPMI_TIME_UNSPECIFIED == stamp) { + return snprintf(s, max, "Unknown"); + } + else if (stamp <= IPMI_TIME_INIT_DONE) { + /* Timestamp is relative to BMC start, no GMT offset */ + gmtime_r(&stamp, &tm); + + return wrapstrftime(s, max, format, &tm); + } + + if (time_in_utc || ipmi_timestamp_is_special(stamp)) { + /* + * The user wants the time reported in UTC or the stamp represents the + * number of seconds since system power on. In any case, don't apply + * the timezone offset. + */ + gmtime_r(&stamp, &tm); + daylight = -1; + } else { + /* + * The user wants the time reported in local time zone. + */ + localtime_r(&stamp, &tm); + } + return wrapstrftime(s, max, format, &tm); +} + +/** + * @brief Convert a timestamp to string, considering the '-Z' option. + * Similar to asctime_r(), but takes time_t instead of struct tm, + * and the string is in form "Wed Jun 30 21:49:08 1993 TZD" without + * the new line at the end. + * + * @param[in] stamp The timestamp to convert + * @param[out] outbuf The buffer to write the string to. + * @param[in] len The maximum length of the output buffer. + * Recommended size is IPMI_ASCTIME_SZ. + * + * @returns outbuf + */ +char * +ipmi_asctime_r(const time_t stamp, ipmi_datebuf_t outbuf) +{ + if (ipmi_timestamp_is_special(stamp)) { + if (stamp < SECONDS_A_DAY) { + ipmi_strftime(outbuf, IPMI_ASCTIME_SZ, "S+%H:%M:%S", stamp); + } + /* + * IPMI_TIME_INIT_DONE is over 17 years. This should never + * happen normally, but we'll support this anyway. + */ + else { + ipmi_strftime(outbuf, IPMI_ASCTIME_SZ, "S+%yy %jd %H:%M:%S", stamp); + } + } + + ipmi_strftime(outbuf, IPMI_ASCTIME_SZ, "%c %Z", stamp); + return outbuf; +} + +char * +ipmi_timestamp_fmt(uint32_t stamp, const char *fmt) +{ + /* + * It's assumed that supplied 'fmt' is never longer + * than IPMI_ASCTIME_SZ + */ + static ipmi_datebuf_t datebuf; + /* + * There is a bug in gcc since 4.3.2 and still not fixed in 8.1.0. + * Even if __attribute__((format(strftime... is specified for a wrapper + * function around strftime, gcc still complains about strftime being + * called from the wrapper with a "non-literal" format argument. + * + * See https://gcc.gnu.org/bugzilla/show_bug.cgi?id=39438 + * + * The following call uses an "ugly cast" from that discussion to + * silence the compiler. The format string is checked for the wrapper + * because __attribute__((format)) is specified in the header file. + */ + ((size_t (*)(char *, size_t, const char *, time_t)) + ipmi_strftime)(datebuf, sizeof(datebuf), fmt, stamp); + + return datebuf; +} + +char * +ipmi_timestamp_string(uint32_t stamp) +{ + if (!ipmi_timestamp_is_valid(stamp)) { + return "Unspecified"; + } + + if (ipmi_timestamp_is_special(stamp)) { + if (stamp < SECONDS_A_DAY) { + return ipmi_timestamp_fmt(stamp, "S+ %H:%M:%S"); + } + /* + * IPMI_TIME_INIT_DONE is over 17 years. This should never + * happen normally, but we'll support this anyway. + */ + else { + return ipmi_timestamp_fmt(stamp, "S+ %y years %j days %H:%M:%S"); + } + } + return ipmi_timestamp_fmt(stamp, "%c %Z"); +} + +char * +ipmi_timestamp_numeric(uint32_t stamp) +{ + if (!ipmi_timestamp_is_valid(stamp)) { + return "Unspecified"; + } + + if (ipmi_timestamp_is_special(stamp)) { + if (stamp < SECONDS_A_DAY) { + return ipmi_timestamp_fmt(stamp, "S+ %H:%M:%S"); + } + /* + * IPMI_TIME_INIT_DONE is over 17 years. This should never + * happen normally, but we'll support this anyway. + */ + else { + return ipmi_timestamp_fmt(stamp, "S+ %y/%j %H:%M:%S"); + } + } + return ipmi_timestamp_fmt(stamp, "%x %X %Z"); +} + +char * +ipmi_timestamp_date(uint32_t stamp) +{ + if (!ipmi_timestamp_is_valid(stamp)) { + return "Unspecified"; + } + + if (ipmi_timestamp_is_special(stamp)) { + return ipmi_timestamp_fmt(stamp, "S+ %y/%j"); + } + return ipmi_timestamp_fmt(stamp, "%x"); +} + +char * +ipmi_timestamp_time(uint32_t stamp) +{ + if (!ipmi_timestamp_is_valid(stamp)) { + return "Unspecified"; + } + + /* Format is the same for both normal and special timestamps */ + return ipmi_timestamp_fmt(stamp, "%X %Z"); +} diff --git a/lib/ipmi_tsol.c b/lib/ipmi_tsol.c index d89bcfd..7cf1bcc 100644 --- a/lib/ipmi_tsol.c +++ b/lib/ipmi_tsol.c @@ -29,7 +29,6 @@ * LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, * EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. */ -#define _DEFAULT_SOURCE #include <sys/types.h> #include <sys/stat.h> @@ -104,11 +103,11 @@ ipmi_tsol_command(struct ipmi_intf *intf, char *recvip, int port, data[5] = (port & 0xff); rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Unable to perform TSOL command"); return (-1); } - if (rsp->ccode > 0) { + if (rsp->ccode) { lprintf(LOG_ERR, "Unable to perform TSOL command: %s", val2str(rsp->ccode, completion_code_vals)); return (-1); @@ -149,11 +148,11 @@ ipmi_tsol_send_keystroke(struct ipmi_intf *intf, char *buff, int length) rsp = intf->sendrecv(intf, &req); if (verbose) { - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Unable to send keystroke"); return -1; } - if (rsp->ccode > 0) { + if (rsp->ccode) { lprintf(LOG_ERR, "Unable to send keystroke: %s", val2str(rsp->ccode, completion_code_vals)); return -1; @@ -377,12 +376,12 @@ ipmi_tsol_main(struct ipmi_intf *intf, int argc, char **argv) char out_buff[IPMI_BUF_SIZE * 8]; char buff[IPMI_BUF_SIZE + 4]; int fd_socket, result, i; - int out_buff_fill, in_buff_fill; + size_t out_buff_fill, in_buff_fill; int ip1, ip2, ip3, ip4; int read_only = 0, rows = 0, cols = 0; int port = IPMI_TSOL_DEF_PORT; - if (strlen(intf->name) < 3 || strncmp(intf->name, "lan", 3) != 0) { + if (strlen(intf->name) < 3 || strcmp(intf->name, "lan")) { lprintf(LOG_ERR, "Error: Tyan SOL is only available over lan interface"); return (-1); } @@ -398,17 +397,13 @@ ipmi_tsol_main(struct ipmi_intf *intf, int argc, char **argv) rows = ip1; } else if (sscanf(argv[i], "cols=%d", &ip1) == 1) { cols = ip1; - } else if (strlen(argv[i]) == 2 - && strncmp(argv[i], "ro", 2) == 0) { + } else if (!strcmp(argv[i], "ro")) { read_only = 1; - } else if (strlen(argv[i]) == 2 - && strncmp(argv[i], "rw", 2) == 0) { + } else if (!strcmp(argv[i], "rw")) { read_only = 0; - } else if (strlen(argv[i]) == 7 - && strncmp(argv[i], "altterm", 7) == 0) { + } else if (!strcmp(argv[i], "altterm")) { _altterm = 1; - } else if (strlen(argv[i]) == 4 - && strncmp(argv[i], "help", 4) == 0) { + } else if (!strcmp(argv[i], "help")) { print_tsol_usage(); return 0; } else { @@ -430,7 +425,7 @@ ipmi_tsol_main(struct ipmi_intf *intf, int argc, char **argv) if (result <= 0) { struct hostent *host = gethostbyname((const char *)intf->ssn_params.hostname); - if (host == NULL ) { + if (!host ) { lprintf(LOG_ERR, "Address lookup for %s failed", intf->ssn_params.hostname); return -1; @@ -460,7 +455,7 @@ ipmi_tsol_main(struct ipmi_intf *intf, int argc, char **argv) /* * retrieve local IP address if not supplied on command line */ - if (recvip == NULL) { + if (!recvip) { /* must connect first */ result = intf->open(intf); if (result < 0) { @@ -476,7 +471,7 @@ ipmi_tsol_main(struct ipmi_intf *intf, int argc, char **argv) } recvip = inet_ntoa(myaddr.sin_addr); - if (recvip == NULL) { + if (!recvip) { lprintf(LOG_ERR, "Unable to find local IP address"); close(fd_socket); return -1; @@ -539,7 +534,7 @@ ipmi_tsol_main(struct ipmi_intf *intf, int argc, char **argv) if ((fds[0].revents & POLLIN) && (sizeof(out_buff) > out_buff_fill)) { socklen_t sin_len = sizeof(sin); - int buff_size = sizeof(buff); + size_t buff_size = sizeof(buff); if ((sizeof(out_buff) - out_buff_fill + 4) < buff_size) { buff_size = (sizeof(out_buff) - out_buff_fill) + 4; if ((buff_size - 4) <= 0) { diff --git a/lib/ipmi_user.c b/lib/ipmi_user.c index 2780e61..2068c93 100644 --- a/lib/ipmi_user.c +++ b/lib/ipmi_user.c @@ -29,10 +29,6 @@ * LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, * EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. */ -#define _BSD_SOURCE || \ - (_XOPEN_SOURCE >= 500 || \ - _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED) && \ - !(_POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600) #include <stdlib.h> #include <string.h> @@ -72,27 +68,27 @@ _ipmi_get_user_access(struct ipmi_intf *intf, struct ipmi_rq req = {0}; struct ipmi_rs *rsp; uint8_t data[2]; - if (user_access_rsp == NULL) { + if (!user_access_rsp) { return (-3); } data[0] = user_access_rsp->channel & 0x0F; - data[1] = user_access_rsp->user_id & 0x3F; + data[1] = IPMI_UID(user_access_rsp->user_id); req.msg.netfn = IPMI_NETFN_APP; req.msg.cmd = IPMI_GET_USER_ACCESS; req.msg.data = data; req.msg.data_len = 2; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { return (-1); - } else if (rsp->ccode != 0) { + } else if (rsp->ccode) { return rsp->ccode; } else if (rsp->data_len != 4) { return (-2); } - user_access_rsp->max_user_ids = rsp->data[0] & 0x3F; + user_access_rsp->max_user_ids = IPMI_UID(rsp->data[0]); user_access_rsp->enable_status = rsp->data[1] & 0xC0; - user_access_rsp->enabled_user_ids = rsp->data[1] & 0x3F; - user_access_rsp->fixed_user_ids = rsp->data[2] & 0x3F; + user_access_rsp->enabled_user_ids = IPMI_UID(rsp->data[1]); + user_access_rsp->fixed_user_ids = IPMI_UID(rsp->data[2]); user_access_rsp->callin_callback = rsp->data[3] & 0x40; user_access_rsp->link_auth = rsp->data[3] & 0x20; user_access_rsp->ipmi_messaging = rsp->data[3] & 0x10; @@ -114,18 +110,18 @@ _ipmi_get_user_name(struct ipmi_intf *intf, struct user_name_t *user_name_ptr) struct ipmi_rq req = {0}; struct ipmi_rs *rsp; uint8_t data[1]; - if (user_name_ptr == NULL) { + if (!user_name_ptr) { return (-3); } - data[0] = user_name_ptr->user_id & 0x3F; + data[0] = IPMI_UID(user_name_ptr->user_id); req.msg.netfn = IPMI_NETFN_APP; req.msg.cmd = IPMI_GET_USER_NAME; req.msg.data = data; req.msg.data_len = 1; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { return (-1); - } else if (rsp->ccode > 0) { + } else if (rsp->ccode) { return rsp->ccode; } else if (rsp->data_len != 16) { return (-2); @@ -151,7 +147,7 @@ _ipmi_set_user_access(struct ipmi_intf *intf, uint8_t data[4]; struct ipmi_rq req = {0}; struct ipmi_rs *rsp; - if (user_access_req == NULL) { + if (!user_access_req) { return (-3); } data[0] = change_priv_limit_only ? 0x00 : 0x80; @@ -165,7 +161,7 @@ _ipmi_set_user_access(struct ipmi_intf *intf, data[0] |= 0x10; } data[0] |= (user_access_req->channel & 0x0F); - data[1] = user_access_req->user_id & 0x3F; + data[1] = IPMI_UID(user_access_req->user_id); data[2] = user_access_req->privilege_limit & 0x0F; data[3] = user_access_req->session_limit & 0x0F; req.msg.netfn = IPMI_NETFN_APP; @@ -173,7 +169,7 @@ _ipmi_set_user_access(struct ipmi_intf *intf, req.msg.data = data; req.msg.data_len = 4; rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { return (-1); } else { return rsp->ccode; @@ -200,14 +196,14 @@ _ipmi_set_user_password(struct ipmi_intf *intf, uint8_t user_id, uint8_t *data; uint8_t data_len = (is_twenty_byte) ? 22 : 18; data = malloc(sizeof(uint8_t) * data_len); - if (data == NULL) { + if (!data) { return (-4); } memset(data, 0, data_len); data[0] = (is_twenty_byte) ? 0x80 : 0x00; - data[0] |= (0x0F & user_id); + data[0] |= IPMI_UID(user_id); data[1] = 0x03 & operation; - if (password != NULL) { + if (password) { size_t copy_len = strlen(password); if (copy_len > (data_len - 2)) { copy_len = data_len - 2; @@ -224,7 +220,7 @@ _ipmi_set_user_password(struct ipmi_intf *intf, uint8_t user_id, rsp = intf->sendrecv(intf, &req); free(data); data = NULL; - if (rsp == NULL) { + if (!rsp) { return (-1); } return rsp->ccode; @@ -371,18 +367,20 @@ ipmi_user_set_username( req.msg.data_len = sizeof(msg_data); memset(msg_data, 0, sizeof(msg_data)); + user_id = IPMI_UID(user_id); + /* The channel number will remain constant throughout this function */ msg_data[0] = user_id; strncpy((char *)(msg_data + 1), name, strlen(name)); rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "Set User Name command failed (user %d, name %s)", user_id, name); return -1; } - if (rsp->ccode > 0) { + if (rsp->ccode) { lprintf(LOG_ERR, "Set User Name command failed (user %d, name %s): %s", user_id, name, val2str(rsp->ccode, completion_code_vals)); return -1; @@ -436,7 +434,7 @@ print_user_usage(void) lprintf(LOG_NOTICE, " set name <user id> <username>"); lprintf(LOG_NOTICE, -" set password <user id> [<password> <16|20>]"); +" set password <user id> [<password> [<16|20>]]"); lprintf(LOG_NOTICE, " disable <user id>"); lprintf(LOG_NOTICE, @@ -553,7 +551,7 @@ ipmi_user_test(struct ipmi_intf *intf, int argc, char **argv) if (argc == 3) { /* We need to prompt for a password */ password = ask_password(user_id); - if (password == NULL) { + if (!password) { lprintf(LOG_ERR, "ipmitool: malloc failure"); return (-1); } @@ -615,7 +613,7 @@ ipmi_user_mod(struct ipmi_intf *intf, int argc, char **argv) if (is_ipmi_user_id(argv[1], &user_id)) { return (-1); } - operation = (strncmp(argv[0], "disable", 7) == 0) ? + operation = (!strcmp(argv[0], "disable")) ? IPMI_PASSWORD_DISABLE_USER : IPMI_PASSWORD_ENABLE_USER; ccode = _ipmi_set_user_password(intf, user_id, operation, @@ -628,12 +626,17 @@ ipmi_user_mod(struct ipmi_intf *intf, int argc, char **argv) return 0; } +#define USER_PW_IPMI15_LEN 16 /* IPMI 1.5 only allowed for 16 bytes */ +#define USER_PW_IPMI20_LEN 20 /* IPMI 2.0 allows for 20 bytes */ +#define USER_PW_MAX_LEN USER_PW_IPMI20_LEN + int ipmi_user_password(struct ipmi_intf *intf, int argc, char **argv) { char *password = NULL; int ccode = 0; - uint8_t password_type = 16; + uint8_t password_type = USER_PW_IPMI15_LEN; + size_t password_len; uint8_t user_id = 0; if (is_ipmi_user_id(argv[2], &user_id)) { return (-1); @@ -642,52 +645,63 @@ ipmi_user_password(struct ipmi_intf *intf, int argc, char **argv) if (argc == 3) { /* We need to prompt for a password */ char *tmp; + size_t tmplen; password = ask_password(user_id); - if (password == NULL) { + if (!password) { lprintf(LOG_ERR, "ipmitool: malloc failure"); return (-1); } tmp = ask_password(user_id); - if (tmp == NULL) { + tmplen = strnlen(tmp, USER_PW_MAX_LEN + 1); + if (!tmp) { lprintf(LOG_ERR, "ipmitool: malloc failure"); return (-1); } - if (strlen(password) != strlen(tmp) - || strncmp(password, tmp, strlen(tmp))) { - lprintf(LOG_ERR, "Passwords do not match."); + if (strncmp(password, tmp, tmplen)) { + lprintf(LOG_ERR, "Passwords do not match or are " + "longer than %d", USER_PW_MAX_LEN); return (-1); } } else { password = argv[3]; - if (argc > 4) { - if ((str2uchar(argv[4], &password_type) != 0) - || (password_type != 16 && password_type != 20)) { - lprintf(LOG_ERR, "Invalid password length '%s'", argv[4]); - return (-1); - } - } else { - password_type = 16; - } } - if (password == NULL) { + if (!password) { lprintf(LOG_ERR, "Unable to parse password argument."); return (-1); - } else if (strlen(password) > 20) { - lprintf(LOG_ERR, "Password is too long (> 20 bytes)"); + } + + password_len = strnlen(password, USER_PW_MAX_LEN + 1); + + if (argc > 4) { + if ((str2uchar(argv[4], &password_type) != 0) + || (password_type != USER_PW_IPMI15_LEN + && password_type != USER_PW_IPMI20_LEN)) + { + lprintf(LOG_ERR, "Invalid password length '%s'", + argv[4]); + return (-1); + } + } else if (password_len > USER_PW_IPMI15_LEN) { + password_type = USER_PW_IPMI20_LEN; + } + + if (password_len > password_type) { + lprintf(LOG_ERR, "Password is too long (> %d bytes)", + password_type); return (-1); } ccode = _ipmi_set_user_password(intf, user_id, - IPMI_PASSWORD_SET_PASSWORD, password, - password_type > 16); + IPMI_PASSWORD_SET_PASSWORD, password, + password_type > USER_PW_IPMI15_LEN); if (eval_ccode(ccode) != 0) { lprintf(LOG_ERR, "Set User Password command failed (user %d)", - user_id); + user_id); return (-1); } else { printf("Set User Password command successful (user %d)\n", - user_id); + user_id); return 0; } } @@ -726,32 +740,34 @@ ipmi_user_main(struct ipmi_intf *intf, int argc, char **argv) print_user_usage(); return (-1); } - if (strncmp(argv[0], "help", 4) == 0) { + if (!strcmp(argv[0], "help")) { /* Help */ print_user_usage(); return 0; - } else if (strncmp(argv[0], "summary", 7) == 0) { + } else if (!strcmp(argv[0], "summary")) { return ipmi_user_summary(intf, argc, argv); - } else if (strncmp(argv[0], "list", 4) == 0) { + } else if (!strcmp(argv[0], "list")) { return ipmi_user_list(intf, argc, argv); - } else if (strncmp(argv[0], "test", 4) == 0) { + } else if (!strcmp(argv[0], "test")) { return ipmi_user_test(intf, argc, argv); - } else if (strncmp(argv[0], "set", 3) == 0) { + } else if (!strcmp(argv[0], "set")) { /* Set */ - if ((argc >= 3) - && (strncmp("password", argv[1], 8) == 0)) { + if (argc >= 3 + && !strcmp("password", argv[1])) + { return ipmi_user_password(intf, argc, argv); - } else if ((argc >= 2) - && (strncmp("name", argv[1], 4) == 0)) { + } else if (argc >= 2 + && !strcmp("name", argv[1])) + { return ipmi_user_name(intf, argc, argv); } else { print_user_usage(); return (-1); } - } else if (strncmp(argv[0], "priv", 4) == 0) { + } else if (!strcmp(argv[0], "priv")) { return ipmi_user_priv(intf, argc, argv); - } else if ((strncmp(argv[0], "disable", 7) == 0) - || (strncmp(argv[0], "enable", 6) == 0)) { + } else if (!strcmp(argv[0], "disable") + || !strcmp(argv[0], "enable")) { return ipmi_user_mod(intf, argc, argv); } else { lprintf(LOG_ERR, "Invalid user command: '%s'\n", argv[0]); diff --git a/lib/ipmi_vita.c b/lib/ipmi_vita.c index 3900974..2771809 100644 --- a/lib/ipmi_vita.c +++ b/lib/ipmi_vita.c @@ -190,7 +190,7 @@ vita_discover(struct ipmi_intf *intf) rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "No valid response received"); } else if (rsp->ccode == 0xC1) { lprintf(LOG_INFO, "Invalid completion code received: %s", @@ -198,7 +198,7 @@ vita_discover(struct ipmi_intf *intf) } else if (rsp->ccode == 0xCC) { lprintf(LOG_INFO, "Invalid data field received: %s", val2str(rsp->ccode, completion_code_vals)); - } else if (rsp->ccode != 0) { + } else if (rsp->ccode) { lprintf(LOG_INFO, "Invalid completion code received: %s", val2str(rsp->ccode, completion_code_vals)); } else if (rsp->data_len < 5) { @@ -240,9 +240,9 @@ ipmi_vita_ipmb_address(struct ipmi_intf *intf) rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "No valid response received"); - } else if (rsp->ccode != 0) { + } else if (rsp->ccode) { lprintf(LOG_ERR, "Invalid completion code received: %s", val2str(rsp->ccode, completion_code_vals)); } else if (rsp->data_len < 7) { @@ -284,10 +284,10 @@ ipmi_vita_getaddr(struct ipmi_intf *intf, int argc, char **argv) rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "No valid response received"); return -1; - } else if (rsp->ccode != 0) { + } else if (rsp->ccode) { lprintf(LOG_ERR, "Invalid completion code received: %s", val2str(rsp->ccode, completion_code_vals)); return -1; @@ -332,10 +332,10 @@ ipmi_vita_get_vso_capabilities(struct ipmi_intf *intf) rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "No valid response received."); return -1; - } else if (rsp->ccode != 0) { + } else if (rsp->ccode) { lprintf(LOG_ERR, "Invalid completion code received: %s", val2str(rsp->ccode, completion_code_vals)); return -1; @@ -402,10 +402,10 @@ ipmi_vita_set_fru_activation(struct ipmi_intf *intf, rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "No valid response received."); return -1; - } else if (rsp->ccode != 0) { + } else if (rsp->ccode) { lprintf(LOG_ERR, "Invalid completion code received: %s", val2str(rsp->ccode, completion_code_vals)); return -1; @@ -444,10 +444,10 @@ ipmi_vita_get_fru_state_policy_bits(struct ipmi_intf *intf, char **argv) rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "No valid response received."); return -1; - } else if (rsp->ccode != 0) { + } else if (rsp->ccode) { lprintf(LOG_ERR, "Invalid completion code received: %s", val2str(rsp->ccode, completion_code_vals)); return -1; @@ -499,10 +499,10 @@ ipmi_vita_set_fru_state_policy_bits(struct ipmi_intf *intf, char **argv) rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "No valid response received."); return -1; - } else if (rsp->ccode != 0) { + } else if (rsp->ccode) { lprintf(LOG_ERR, "Invalid completion code received: %s", val2str(rsp->ccode, completion_code_vals)); return -1; @@ -540,10 +540,10 @@ ipmi_vita_get_led_properties(struct ipmi_intf *intf, char **argv) rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "No valid response received."); return -1; - } else if (rsp->ccode != 0) { + } else if (rsp->ccode) { lprintf(LOG_ERR, "Invalid completion code received: %s", val2str(rsp->ccode, completion_code_vals)); return -1; @@ -585,10 +585,10 @@ ipmi_vita_get_led_color_capabilities(struct ipmi_intf *intf, char **argv) rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "No valid response received."); return -1; - } else if (rsp->ccode != 0) { + } else if (rsp->ccode) { lprintf(LOG_ERR, "Invalid completion code received: %s", val2str(rsp->ccode, completion_code_vals)); return -1; @@ -603,14 +603,14 @@ ipmi_vita_get_led_color_capabilities(struct ipmi_intf *intf, char **argv) printf("LED Color Capabilities: "); for (i = 0; i < 8; i++) { if (rsp->data[1] & (0x01 << i)) { - printf("%s, ", led_color_str[i]); + printf("%s, ", picmg_led_color_str(i)); } } putchar('\n'); printf("Default LED Color in\n"); - printf(" LOCAL control: %s\n", led_color_str[rsp->data[2]]); - printf(" OVERRIDE state: %s\n", led_color_str[rsp->data[3]]); + printf(" LOCAL control: %s\n", picmg_led_color_str(rsp->data[2])); + printf(" OVERRIDE state: %s\n", picmg_led_color_str(rsp->data[3])); if (rsp->data_len == 5) { printf("LED flags:\n"); @@ -649,10 +649,10 @@ ipmi_vita_get_led_state(struct ipmi_intf *intf, char **argv) rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "No valid response received."); return -1; - } else if (rsp->ccode != 0) { + } else if (rsp->ccode) { lprintf(LOG_ERR, "Invalid completion code received: %s", val2str(rsp->ccode, completion_code_vals)); return -1; @@ -692,7 +692,7 @@ ipmi_vita_get_led_state(struct ipmi_intf *intf, char **argv) } printf(" Local Control On-Duration: %x\n", rsp->data[3]); printf(" Local Control Color: %x\t[%s]\n", - rsp->data[4], led_color_str[rsp->data[4] & 7]); + rsp->data[4], picmg_led_color_str(rsp->data[4] & 7)); } /* override state or lamp test */ @@ -707,7 +707,7 @@ ipmi_vita_get_led_state(struct ipmi_intf *intf, char **argv) } printf(" Override On-Duration: %x\n", rsp->data[6]); printf(" Override Color: %x\t[%s]\n", - rsp->data[7], led_color_str[rsp->data[7] & 7]); + rsp->data[7], picmg_led_color_str(rsp->data[7] & 7)); if (rsp->data[1] == 0x04) { printf(" Lamp test duration: %x\n", rsp->data[8]); } @@ -749,10 +749,10 @@ ipmi_vita_set_led_state(struct ipmi_intf *intf, char **argv) rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "No valid response received."); return -1; - } else if (rsp->ccode != 0) { + } else if (rsp->ccode) { lprintf(LOG_ERR, "Invalid completion code received: %s", val2str(rsp->ccode, completion_code_vals)); return -1; @@ -796,10 +796,10 @@ ipmi_vita_fru_control(struct ipmi_intf *intf, char **argv) rsp = intf->sendrecv(intf, &req); - if (rsp == NULL) { + if (!rsp) { lprintf(LOG_ERR, "No valid response received."); return -1; - } else if (rsp->ccode != 0) { + } else if (rsp->ccode) { lprintf(LOG_ERR, "Invalid completion code received: %s", val2str(rsp->ccode, completion_code_vals)); return -1; @@ -819,48 +819,48 @@ ipmi_vita_fru_control(struct ipmi_intf *intf, char **argv) static int ipmi_vita_get_cmd(int argc, char **argv) { - if (argc < 1 || !strncmp(argv[0], "help", 4)) { + if (argc < 1 || !strcmp(argv[0], "help")) { return VITA_CMD_HELP; } /* Get VSO Properties */ - if (!strncmp(argv[0], "properties", 10)) { + if (!strcmp(argv[0], "properties")) { return VITA_CMD_PROPERTIES; } /* FRU Control command */ - if (!strncmp(argv[0], "frucontrol", 10)) { + if (!strcmp(argv[0], "frucontrol")) { return VITA_CMD_FRUCONTROL; } /* Get FRU Address Info command */ - if (!strncmp(argv[0], "addrinfo", 8)) { + if (!strcmp(argv[0], "addrinfo")) { return VITA_CMD_ADDRINFO; } /* Set FRU Activation (activate) command */ - if (!strncmp(argv[0], "activate", 8)) { + if (!strcmp(argv[0], "activate")) { return VITA_CMD_ACTIVATE; } /* Set FRU Activation (deactivate) command */ - if (!strncmp(argv[0], "deactivate", 10)) { + if (!strcmp(argv[0], "deactivate")) { return VITA_CMD_DEACTIVATE; } /* FRU State Policy Bits commands */ - if (!strncmp(argv[0], "policy", 6)) { + if (!strcmp(argv[0], "policy")) { if (argc < 2) { return VITA_CMD_UNKNOWN; } /* Get FRU State Policy Bits command */ - if (!strncmp(argv[1], "get", 3)) { + if (!strcmp(argv[1], "get")) { return VITA_CMD_POLICY_GET; } /* Set FRU State Policy Bits command */ - if (!strncmp(argv[1], "set", 3)) { + if (!strcmp(argv[1], "set")) { return VITA_CMD_POLICY_SET; } @@ -869,28 +869,28 @@ ipmi_vita_get_cmd(int argc, char **argv) } /* FRU LED commands */ - if (!strncmp(argv[0], "led", 3)) { + if (!strcmp(argv[0], "led")) { if (argc < 2) { return VITA_CMD_UNKNOWN; } /* FRU LED Get Properties */ - if (!strncmp(argv[1], "prop", 4)) { + if (!strcmp(argv[1], "prop")) { return VITA_CMD_LED_PROP; } /* FRU LED Get Capabilities */ - if (!strncmp(argv[1], "cap", 3)) { + if (!strcmp(argv[1], "cap")) { return VITA_CMD_LED_CAP; } /* FRU LED Get State */ - if (!strncmp(argv[1], "get", 3)) { + if (!strcmp(argv[1], "get")) { return VITA_CMD_LED_GET; } /* FRU LED Set State */ - if (!strncmp(argv[1], "set", 3)) { + if (!strcmp(argv[1], "set")) { return VITA_CMD_LED_SET; } @@ -29,9 +29,6 @@ * LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE, * EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. */ -#define _SVID_SOURCE || _BSD_SOURCE || _XOPEN_SOURCE >= 500 || \ - _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED || \ - /* Since glibc 2.12: */ _POSIX_C_SOURCE >= 200809L #include <unistd.h> #include <stdio.h> @@ -111,12 +108,12 @@ void log_init(const char * name, int isdaemon, int verbose) if (!logpriv) return; - if (name != NULL) + if (name) logpriv->name = strdup(name); else logpriv->name = strdup(LOG_NAME_DEFAULT); - if (logpriv->name == NULL) + if (!logpriv->name) fprintf(stderr, "ipmitool: malloc failure\n"); logpriv->daemon = isdaemon; @@ -147,13 +144,8 @@ void log_halt(void) logpriv = NULL; } -int log_level_get(void) +void log_level_set(int verbose) { - return logpriv->level; -} - -void log_level_set(int level) -{ - logpriv->level = level; + logpriv->level = verbose + LOG_NOTICE; } |