7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi/*
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi * CDDL HEADER START
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi *
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi * The contents of this file are subject to the terms of the
74a31ce69a88d851777ca840d31ec610ce9ecab3timh * Common Development and Distribution License (the "License").
74a31ce69a88d851777ca840d31ec610ce9ecab3timh * You may not use this file except in compliance with the License.
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi *
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi * or http://www.opensolaris.org/os/licensing.
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi * See the License for the specific language governing permissions
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi * and limitations under the License.
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi *
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi * When distributing Covered Code, include this CDDL HEADER in each
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi * If applicable, add the following below this CDDL HEADER, with the
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi * fields enclosed by brackets "[]" replaced with your own identifying
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi * information: Portions Copyright [yyyy] [name of copyright owner]
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi *
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi * CDDL HEADER END
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi */
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi/*
8393544efeffe8042bf5273c148010b32fa827e2Hyon Kim * Copyright (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved.
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi */
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi#include <alloca.h>
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi#include <ctype.h>
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi#include <limits.h>
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi#include <syslog.h>
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi#include <strings.h>
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi#include <unistd.h>
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi#include <topo_error.h>
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi#include <topo_subr.h>
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindivoid
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecinditopo_hdl_lock(topo_hdl_t *thp)
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi{
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi (void) pthread_mutex_lock(&thp->th_lock);
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi}
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindivoid
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecinditopo_hdl_unlock(topo_hdl_t *thp)
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi{
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi (void) pthread_mutex_unlock(&thp->th_lock);
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi}
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindiconst char *
0eb822a1c0c2bea495647510b75f77f0e57633ebcinditopo_stability2name(topo_stability_t s)
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi{
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi switch (s) {
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi case TOPO_STABILITY_INTERNAL: return (TOPO_STABSTR_INTERNAL);
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi case TOPO_STABILITY_PRIVATE: return (TOPO_STABSTR_PRIVATE);
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi case TOPO_STABILITY_OBSOLETE: return (TOPO_STABSTR_OBSOLETE);
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi case TOPO_STABILITY_EXTERNAL: return (TOPO_STABSTR_EXTERNAL);
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi case TOPO_STABILITY_UNSTABLE: return (TOPO_STABSTR_UNSTABLE);
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi case TOPO_STABILITY_EVOLVING: return (TOPO_STABSTR_EVOLVING);
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi case TOPO_STABILITY_STABLE: return (TOPO_STABSTR_STABLE);
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi case TOPO_STABILITY_STANDARD: return (TOPO_STABSTR_STANDARD);
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi default: return (TOPO_STABSTR_UNKNOWN);
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi }
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi}
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi
0eb822a1c0c2bea495647510b75f77f0e57633ebcinditopo_stability_t
0eb822a1c0c2bea495647510b75f77f0e57633ebcinditopo_name2stability(const char *name)
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi{
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi if (strcmp(name, TOPO_STABSTR_INTERNAL) == 0)
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi return (TOPO_STABILITY_INTERNAL);
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi else if (strcmp(name, TOPO_STABSTR_PRIVATE) == 0)
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi return (TOPO_STABILITY_PRIVATE);
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi else if (strcmp(name, TOPO_STABSTR_OBSOLETE) == 0)
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi return (TOPO_STABILITY_OBSOLETE);
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi else if (strcmp(name, TOPO_STABSTR_EXTERNAL) == 0)
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi return (TOPO_STABILITY_EXTERNAL);
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi else if (strcmp(name, TOPO_STABSTR_UNSTABLE) == 0)
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi return (TOPO_STABILITY_UNSTABLE);
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi else if (strcmp(name, TOPO_STABSTR_EVOLVING) == 0)
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi return (TOPO_STABILITY_EVOLVING);
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi else if (strcmp(name, TOPO_STABSTR_STABLE) == 0)
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi return (TOPO_STABILITY_STABLE);
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi else if (strcmp(name, TOPO_STABSTR_STANDARD) == 0)
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi return (TOPO_STABILITY_STANDARD);
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi return (TOPO_STABILITY_UNKNOWN);
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi}
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindistatic const topo_debug_mode_t _topo_dbout_modes[] = {
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi { "stderr", "send debug messages to stderr", TOPO_DBOUT_STDERR },
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi { "syslog", "send debug messages to syslog", TOPO_DBOUT_SYSLOG },
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi { NULL, NULL, 0 }
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi};
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi
0eb822a1c0c2bea495647510b75f77f0e57633ebcindistatic const topo_debug_mode_t _topo_dbflag_modes[] = {
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi { "error", "error handling debug messages enabled", TOPO_DBG_ERR },
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi { "module", "module debug messages enabled", TOPO_DBG_MOD },
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi { "modulesvc", "module services debug messages enabled",
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi TOPO_DBG_MODSVC },
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi { "walk", "walker subsystem debug messages enabled", TOPO_DBG_WALK },
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi { "xml", "xml file parsing messages enabled", TOPO_DBG_XML },
8393544efeffe8042bf5273c148010b32fa827e2Hyon Kim { "devinfoforce", "devinfo DINFOFORCE snapshot used", TOPO_DBG_FORCE },
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi { "all", "all debug modes enabled", TOPO_DBG_ALL},
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi { NULL, NULL, 0 }
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi};
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindivoid
0eb822a1c0c2bea495647510b75f77f0e57633ebcindienv_process_value(topo_hdl_t *thp, const char *begin, const char *end)
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi{
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi char buf[MAXNAMELEN];
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi size_t count;
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi topo_debug_mode_t *dbp;
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi while (begin < end && isspace(*begin))
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi begin++;
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi while (begin < end && isspace(*(end - 1)))
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi end--;
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi if (begin >= end)
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi return;
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi count = end - begin;
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi count += 1;
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi if (count > sizeof (buf))
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi return;
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi (void) snprintf(buf, count, "%s", begin);
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi for (dbp = (topo_debug_mode_t *)_topo_dbflag_modes;
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi dbp->tdm_name != NULL; ++dbp) {
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi if (strcmp(buf, dbp->tdm_name) == 0)
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi thp->th_debug |= dbp->tdm_mode;
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi }
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi}
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi
0eb822a1c0c2bea495647510b75f77f0e57633ebcindivoid
0eb822a1c0c2bea495647510b75f77f0e57633ebcinditopo_debug_set(topo_hdl_t *thp, const char *dbmode, const char *dout)
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi{
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi char *end, *value, *next;
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi topo_debug_mode_t *dbp;
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi topo_hdl_lock(thp);
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi value = (char *)dbmode;
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi for (end = (char *)dbmode; *end != '\0'; value = next) {
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi end = strchr(value, ',');
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi if (end != NULL)
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi next = end + 1; /* skip the comma */
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi else
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi next = end = value + strlen(value);
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi env_process_value(thp, value, end);
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi }
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi if (dout == NULL) {
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi topo_hdl_unlock(thp);
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi return;
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi }
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi for (dbp = (topo_debug_mode_t *)_topo_dbout_modes;
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi dbp->tdm_name != NULL; ++dbp) {
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi if (strcmp(dout, dbp->tdm_name) == 0)
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi thp->th_dbout = dbp->tdm_mode;
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi }
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi topo_hdl_unlock(thp);
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi}
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindivoid
0eb822a1c0c2bea495647510b75f77f0e57633ebcinditopo_vdprintf(topo_hdl_t *thp, int mask, const char *mod, const char *format,
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi va_list ap)
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi{
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi char *msg;
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi size_t len;
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi char c;
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi if (!(thp->th_debug & mask))
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi return;
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi len = vsnprintf(&c, 1, format, ap);
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi msg = alloca(len + 2);
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi (void) vsnprintf(msg, len + 1, format, ap);
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi if (msg[len - 1] != '\n')
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi (void) strcpy(&msg[len], "\n");
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi if (thp->th_dbout == TOPO_DBOUT_SYSLOG) {
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi if (mod == NULL) {
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi syslog(LOG_DEBUG | LOG_USER, "libtopo DEBUG: %s", msg);
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi } else {
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi syslog(LOG_DEBUG | LOG_USER, "libtopo DEBUG: %s: %s",
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi mod, msg);
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi }
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi } else {
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi if (mod == NULL) {
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi (void) fprintf(stderr, "libtopo DEBUG: %s", msg);
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi } else {
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi (void) fprintf(stderr, "libtopo DEBUG: %s: %s", mod,
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi msg);
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi }
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi }
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi}
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi/*PRINTFLIKE3*/
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindivoid
0eb822a1c0c2bea495647510b75f77f0e57633ebcinditopo_dprintf(topo_hdl_t *thp, int mask, const char *format, ...)
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi{
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi va_list ap;
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi va_start(ap, format);
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi topo_vdprintf(thp, mask, NULL, format, ap);
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi va_end(ap);
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi}
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecinditnode_t *
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecinditopo_hdl_root(topo_hdl_t *thp, const char *scheme)
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi{
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi ttree_t *tp;
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi for (tp = topo_list_next(&thp->th_trees); tp != NULL;
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi tp = topo_list_next(tp)) {
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi if (strcmp(scheme, tp->tt_scheme) == 0)
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi return (tp->tt_root);
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi }
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi return (NULL);
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi}
74a31ce69a88d851777ca840d31ec610ce9ecab3timh
74a31ce69a88d851777ca840d31ec610ce9ecab3timh/*
74a31ce69a88d851777ca840d31ec610ce9ecab3timh * buf_append -- Append str to buf (if it's non-NULL). Place prepend
74a31ce69a88d851777ca840d31ec610ce9ecab3timh * in buf in front of str and append behind it (if they're non-NULL).
74a31ce69a88d851777ca840d31ec610ce9ecab3timh * Continue to update size even if we run out of space to actually
74a31ce69a88d851777ca840d31ec610ce9ecab3timh * stuff characters in the buffer.
74a31ce69a88d851777ca840d31ec610ce9ecab3timh */
74a31ce69a88d851777ca840d31ec610ce9ecab3timhvoid
74a31ce69a88d851777ca840d31ec610ce9ecab3timhtopo_fmristr_build(ssize_t *sz, char *buf, size_t buflen, char *str,
74a31ce69a88d851777ca840d31ec610ce9ecab3timh char *prepend, char *append)
74a31ce69a88d851777ca840d31ec610ce9ecab3timh{
74a31ce69a88d851777ca840d31ec610ce9ecab3timh ssize_t left;
74a31ce69a88d851777ca840d31ec610ce9ecab3timh
74a31ce69a88d851777ca840d31ec610ce9ecab3timh if (str == NULL)
74a31ce69a88d851777ca840d31ec610ce9ecab3timh return;
74a31ce69a88d851777ca840d31ec610ce9ecab3timh
74a31ce69a88d851777ca840d31ec610ce9ecab3timh if (buflen == 0 || (left = buflen - *sz) < 0)
74a31ce69a88d851777ca840d31ec610ce9ecab3timh left = 0;
74a31ce69a88d851777ca840d31ec610ce9ecab3timh
74a31ce69a88d851777ca840d31ec610ce9ecab3timh if (buf != NULL && left != 0)
74a31ce69a88d851777ca840d31ec610ce9ecab3timh buf += *sz;
74a31ce69a88d851777ca840d31ec610ce9ecab3timh
74a31ce69a88d851777ca840d31ec610ce9ecab3timh if (prepend == NULL && append == NULL)
74a31ce69a88d851777ca840d31ec610ce9ecab3timh *sz += snprintf(buf, left, "%s", str);
74a31ce69a88d851777ca840d31ec610ce9ecab3timh else if (append == NULL)
74a31ce69a88d851777ca840d31ec610ce9ecab3timh *sz += snprintf(buf, left, "%s%s", prepend, str);
74a31ce69a88d851777ca840d31ec610ce9ecab3timh else if (prepend == NULL)
74a31ce69a88d851777ca840d31ec610ce9ecab3timh *sz += snprintf(buf, left, "%s%s", str, append);
74a31ce69a88d851777ca840d31ec610ce9ecab3timh else
74a31ce69a88d851777ca840d31ec610ce9ecab3timh *sz += snprintf(buf, left, "%s%s%s", prepend, str, append);
74a31ce69a88d851777ca840d31ec610ce9ecab3timh}
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi#define TOPO_PLATFORM_PATH "%s/usr/platform/%s/lib/fm/topo/%s"
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi#define TOPO_COMMON_PATH "%s/usr/lib/fm/topo/%s"
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi
0eb822a1c0c2bea495647510b75f77f0e57633ebcindichar *
0eb822a1c0c2bea495647510b75f77f0e57633ebcinditopo_search_path(topo_mod_t *mod, const char *rootdir, const char *file)
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi{
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi char *pp, sp[PATH_MAX];
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi topo_hdl_t *thp = mod->tm_hdl;
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi /*
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi * Search for file name in order of platform, machine and common
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi * topo directories
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi */
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi (void) snprintf(sp, PATH_MAX, TOPO_PLATFORM_PATH, rootdir,
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi thp->th_platform, file);
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi if (access(sp, F_OK) != 0) {
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi (void) snprintf(sp, PATH_MAX, TOPO_PLATFORM_PATH,
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi thp->th_rootdir, thp->th_machine, file);
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi if (access(sp, F_OK) != 0) {
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi (void) snprintf(sp, PATH_MAX, TOPO_COMMON_PATH,
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi thp->th_rootdir, file);
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi if (access(sp, F_OK) != 0) {
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi return (NULL);
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi }
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi }
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi }
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi pp = topo_mod_strdup(mod, sp);
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi return (pp);
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi}
24db46411fd54f70c35b94bb952eb7ba040e43b4eschrock
24db46411fd54f70c35b94bb952eb7ba040e43b4eschrock/*
24db46411fd54f70c35b94bb952eb7ba040e43b4eschrock * SMBIOS serial numbers can contain characters (particularly ':' and ' ')
24db46411fd54f70c35b94bb952eb7ba040e43b4eschrock * that are invalid for the authority and can break FMRI parsing. We translate
24db46411fd54f70c35b94bb952eb7ba040e43b4eschrock * any invalid characters to a safe '-', as well as trimming any leading or
20c794b39650d115e17a15983b6b82e46238cf45gavinm * trailing whitespace. Similarly, '/' can be found in some product names
20c794b39650d115e17a15983b6b82e46238cf45gavinm * so we translate that to '-'.
24db46411fd54f70c35b94bb952eb7ba040e43b4eschrock */
24db46411fd54f70c35b94bb952eb7ba040e43b4eschrockchar *
e3d60c9bd991a9826cbfa63b10595d44e123b9c4Adrian Frosttopo_cleanup_auth_str(topo_hdl_t *thp, const char *begin)
24db46411fd54f70c35b94bb952eb7ba040e43b4eschrock{
24db46411fd54f70c35b94bb952eb7ba040e43b4eschrock char buf[MAXNAMELEN];
e3d60c9bd991a9826cbfa63b10595d44e123b9c4Adrian Frost const char *end, *cp;
e3d60c9bd991a9826cbfa63b10595d44e123b9c4Adrian Frost char *pp;
e3d60c9bd991a9826cbfa63b10595d44e123b9c4Adrian Frost char c;
e3d60c9bd991a9826cbfa63b10595d44e123b9c4Adrian Frost int i;
24db46411fd54f70c35b94bb952eb7ba040e43b4eschrock
24db46411fd54f70c35b94bb952eb7ba040e43b4eschrock end = begin + strlen(begin);
24db46411fd54f70c35b94bb952eb7ba040e43b4eschrock
24db46411fd54f70c35b94bb952eb7ba040e43b4eschrock while (begin < end && isspace(*begin))
24db46411fd54f70c35b94bb952eb7ba040e43b4eschrock begin++;
24db46411fd54f70c35b94bb952eb7ba040e43b4eschrock while (begin < end && isspace(*(end - 1)))
24db46411fd54f70c35b94bb952eb7ba040e43b4eschrock end--;
24db46411fd54f70c35b94bb952eb7ba040e43b4eschrock
24db46411fd54f70c35b94bb952eb7ba040e43b4eschrock if (begin >= end)
24db46411fd54f70c35b94bb952eb7ba040e43b4eschrock return (NULL);
24db46411fd54f70c35b94bb952eb7ba040e43b4eschrock
e3d60c9bd991a9826cbfa63b10595d44e123b9c4Adrian Frost cp = begin;
e3d60c9bd991a9826cbfa63b10595d44e123b9c4Adrian Frost for (i = 0; i < MAXNAMELEN - 1; i++) {
e3d60c9bd991a9826cbfa63b10595d44e123b9c4Adrian Frost if (cp >= end)
e3d60c9bd991a9826cbfa63b10595d44e123b9c4Adrian Frost break;
e3d60c9bd991a9826cbfa63b10595d44e123b9c4Adrian Frost c = *cp;
e3d60c9bd991a9826cbfa63b10595d44e123b9c4Adrian Frost if (c == ':' || c == '=' || c == '/' || isspace(c) ||
e3d60c9bd991a9826cbfa63b10595d44e123b9c4Adrian Frost !isprint(c))
e3d60c9bd991a9826cbfa63b10595d44e123b9c4Adrian Frost buf[i] = '-';
e3d60c9bd991a9826cbfa63b10595d44e123b9c4Adrian Frost else
e3d60c9bd991a9826cbfa63b10595d44e123b9c4Adrian Frost buf[i] = c;
e3d60c9bd991a9826cbfa63b10595d44e123b9c4Adrian Frost cp++;
e3d60c9bd991a9826cbfa63b10595d44e123b9c4Adrian Frost }
e3d60c9bd991a9826cbfa63b10595d44e123b9c4Adrian Frost buf[i] = 0;
24db46411fd54f70c35b94bb952eb7ba040e43b4eschrock
24db46411fd54f70c35b94bb952eb7ba040e43b4eschrock pp = topo_hdl_strdup(thp, buf);
24db46411fd54f70c35b94bb952eb7ba040e43b4eschrock return (pp);
24db46411fd54f70c35b94bb952eb7ba040e43b4eschrock}
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robjvoid
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robjtopo_sensor_type_name(uint32_t type, char *buf, size_t len)
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj{
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj topo_name_trans_t *ntp;
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj for (ntp = &topo_sensor_type_table[0]; ntp->int_name != NULL; ntp++) {
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj if (ntp->int_value == type) {
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj (void) strlcpy(buf, ntp->int_name, len);
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj return;
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj }
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj }
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj (void) snprintf(buf, len, "0x%02x", type);
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj}
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robjvoid
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robjtopo_sensor_units_name(uint8_t type, char *buf, size_t len)
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj{
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj topo_name_trans_t *ntp;
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj for (ntp = &topo_units_type_table[0]; ntp->int_name != NULL; ntp++) {
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj if (ntp->int_value == type) {
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj (void) strlcpy(buf, ntp->int_name, len);
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj return;
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj }
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj }
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj (void) snprintf(buf, len, "0x%02x", type);
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj}
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robjvoid
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robjtopo_led_type_name(uint8_t type, char *buf, size_t len)
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj{
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj topo_name_trans_t *ntp;
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj for (ntp = &topo_led_type_table[0]; ntp->int_name != NULL; ntp++) {
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj if (ntp->int_value == type) {
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj (void) strlcpy(buf, ntp->int_name, len);
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj return;
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj }
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj }
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj (void) snprintf(buf, len, "0x%02x", type);
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj}
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robjvoid
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robjtopo_led_state_name(uint8_t type, char *buf, size_t len)
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj{
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj topo_name_trans_t *ntp;
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj for (ntp = &topo_led_states_table[0]; ntp->int_name != NULL; ntp++) {
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj if (ntp->int_value == type) {
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj (void) strlcpy(buf, ntp->int_name, len);
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj return;
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj }
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj }
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj (void) snprintf(buf, len, "0x%02x", type);
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj}
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robjvoid
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robjtopo_sensor_state_name(uint32_t sensor_type, uint8_t state, char *buf,
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robjsize_t len)
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj{
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj topo_name_trans_t *ntp;
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj switch (sensor_type) {
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj case TOPO_SENSOR_TYPE_PHYSICAL:
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj ntp = &topo_sensor_states_physical_table[0];
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj break;
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj case TOPO_SENSOR_TYPE_PLATFORM:
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj ntp = &topo_sensor_states_platform_table[0];
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj break;
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj case TOPO_SENSOR_TYPE_PROCESSOR:
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj ntp = &topo_sensor_states_processor_table[0];
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj break;
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj case TOPO_SENSOR_TYPE_POWER_SUPPLY:
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj ntp = &topo_sensor_states_power_supply_table[0];
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj break;
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj case TOPO_SENSOR_TYPE_POWER_UNIT:
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj ntp = &topo_sensor_states_power_unit_table[0];
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj break;
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj case TOPO_SENSOR_TYPE_MEMORY:
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj ntp = &topo_sensor_states_memory_table[0];
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj break;
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj case TOPO_SENSOR_TYPE_BAY:
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj ntp = &topo_sensor_states_bay_table[0];
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj break;
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj case TOPO_SENSOR_TYPE_FIRMWARE:
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj ntp = &topo_sensor_states_firmware_table[0];
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj break;
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj case TOPO_SENSOR_TYPE_EVENT_LOG:
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj ntp = &topo_sensor_states_event_log_table[0];
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj break;
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj case TOPO_SENSOR_TYPE_WATCHDOG1:
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj ntp = &topo_sensor_states_watchdog1_table[0];
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj break;
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj case TOPO_SENSOR_TYPE_SYSTEM:
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj ntp = &topo_sensor_states_system_table[0];
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj break;
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj case TOPO_SENSOR_TYPE_CRITICAL:
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj ntp = &topo_sensor_states_critical_table[0];
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj break;
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj case TOPO_SENSOR_TYPE_BUTTON:
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj ntp = &topo_sensor_states_button_table[0];
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj break;
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj case TOPO_SENSOR_TYPE_CABLE:
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj ntp = &topo_sensor_states_cable_table[0];
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj break;
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj case TOPO_SENSOR_TYPE_BOOT_STATE:
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj ntp = &topo_sensor_states_boot_state_table[0];
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj break;
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj case TOPO_SENSOR_TYPE_BOOT_ERROR:
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj ntp = &topo_sensor_states_boot_error_table[0];
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj break;
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj case TOPO_SENSOR_TYPE_BOOT_OS:
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj ntp = &topo_sensor_states_boot_os_table[0];
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj break;
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj case TOPO_SENSOR_TYPE_OS_SHUTDOWN:
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj ntp = &topo_sensor_states_os_table[0];
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj break;
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj case TOPO_SENSOR_TYPE_SLOT:
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj ntp = &topo_sensor_states_slot_table[0];
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj break;
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj case TOPO_SENSOR_TYPE_ACPI:
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj ntp = &topo_sensor_states_acpi_table[0];
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj break;
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj case TOPO_SENSOR_TYPE_WATCHDOG2:
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj ntp = &topo_sensor_states_watchdog2_table[0];
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj break;
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj case TOPO_SENSOR_TYPE_ALERT:
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj ntp = &topo_sensor_states_alert_table[0];
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj break;
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj case TOPO_SENSOR_TYPE_PRESENCE:
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj ntp = &topo_sensor_states_presence_table[0];
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj break;
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj case TOPO_SENSOR_TYPE_LAN:
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj ntp = &topo_sensor_states_lan_table[0];
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj break;
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj case TOPO_SENSOR_TYPE_HEALTH:
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj ntp = &topo_sensor_states_health_table[0];
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj break;
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj case TOPO_SENSOR_TYPE_BATTERY:
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj ntp = &topo_sensor_states_battery_table[0];
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj break;
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj case TOPO_SENSOR_TYPE_AUDIT:
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj ntp = &topo_sensor_states_audit_table[0];
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj break;
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj case TOPO_SENSOR_TYPE_VERSION:
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj ntp = &topo_sensor_states_version_table[0];
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj break;
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj case TOPO_SENSOR_TYPE_FRU_STATE:
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj ntp = &topo_sensor_states_fru_state_table[0];
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj break;
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj case TOPO_SENSOR_TYPE_THRESHOLD_STATE:
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj ntp = &topo_sensor_states_thresh_table[0];
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj break;
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj case TOPO_SENSOR_TYPE_GENERIC_USAGE:
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj ntp = &topo_sensor_states_generic_usage_table[0];
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj break;
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj case TOPO_SENSOR_TYPE_GENERIC_STATE:
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj ntp = &topo_sensor_states_generic_state_table[0];
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj break;
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj case TOPO_SENSOR_TYPE_GENERIC_PREDFAIL:
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj ntp = &topo_sensor_states_generic_predfail_table[0];
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj break;
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj case TOPO_SENSOR_TYPE_GENERIC_LIMIT:
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj ntp = &topo_sensor_states_generic_limit_table[0];
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj break;
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj case TOPO_SENSOR_TYPE_GENERIC_PERFORMANCE:
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj ntp = &topo_sensor_states_generic_perf_table[0];
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj break;
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj case TOPO_SENSOR_TYPE_SEVERITY:
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj ntp = &topo_sensor_states_severity_table[0];
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj break;
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj case TOPO_SENSOR_TYPE_GENERIC_PRESENCE:
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj ntp = &topo_sensor_states_generic_presence_table[0];
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj break;
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj case TOPO_SENSOR_TYPE_GENERIC_AVAILABILITY:
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj ntp = &topo_sensor_states_generic_avail_table[0];
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj break;
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj case TOPO_SENSOR_TYPE_GENERIC_STATUS:
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj ntp = &topo_sensor_states_generic_status_table[0];
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj break;
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj case TOPO_SENSOR_TYPE_GENERIC_ACPI:
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj ntp = &topo_sensor_states_generic_acpi_pwr_table[0];
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj break;
e5dcf7beb7c949f9234713d5818b581ec3825443Robert Johnston case TOPO_SENSOR_TYPE_GENERIC_FAILURE:
e5dcf7beb7c949f9234713d5818b581ec3825443Robert Johnston ntp = &topo_sensor_states_generic_failure_table[0];
e5dcf7beb7c949f9234713d5818b581ec3825443Robert Johnston break;
e5dcf7beb7c949f9234713d5818b581ec3825443Robert Johnston case TOPO_SENSOR_TYPE_GENERIC_OK:
e5dcf7beb7c949f9234713d5818b581ec3825443Robert Johnston ntp = &topo_sensor_states_generic_ok_table[0];
e5dcf7beb7c949f9234713d5818b581ec3825443Robert Johnston break;
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj default:
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj (void) snprintf(buf, len, "0x%02x", state);
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj return;
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj }
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj for (; ntp->int_name != NULL; ntp++) {
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj if (ntp->int_value == state) {
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj (void) strlcpy(buf, ntp->int_name, len);
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj return;
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj }
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj }
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj (void) snprintf(buf, len, "0x%02x", state);
825ba0f20a74fd9c5d0d1ce2c195da2cc88a7f77robj}