fmtopo.c revision c40d7343efa60b18ad1ceb316eb337caeea79046
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi/*
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi * CDDL HEADER START
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi *
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi * The contents of this file are subject to the terms of the
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi * Common Development and Distribution License (the "License").
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi * 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/*
c40d7343efa60b18ad1ceb316eb337caeea79046cindi * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi * Use is subject to license terms.
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi */
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi#pragma ident "%Z%%M% %I% %E% SMI"
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi#include <sys/fm/protocol.h>
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi#include <fm/libtopo.h>
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi#include <ctype.h>
c40d7343efa60b18ad1ceb316eb337caeea79046cindi#include <fnmatch.h>
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi#include <limits.h>
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi#include <strings.h>
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi#include <stdio.h>
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi#include <errno.h>
c40d7343efa60b18ad1ceb316eb337caeea79046cindi#include <umem.h>
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi#include <sys/param.h>
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi#define FMTOPO_EXIT_SUCCESS 0
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi#define FMTOPO_EXIT_ERROR 1
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi#define FMTOPO_EXIT_USAGE 2
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi#define STDERR "stderr"
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi#define DOTS "..."
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi#define ALL "all"
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindistatic const char *g_pname;
c40d7343efa60b18ad1ceb316eb337caeea79046cindistatic const char *g_fmri = NULL;
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindistatic const char *opt_R = "/";
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindistatic const char *opt_s = FM_FMRI_SCHEME_HC;
c40d7343efa60b18ad1ceb316eb337caeea79046cindistatic const char optstr[] = "aCdeP:pR:s:StvVx";
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi
0eb822a1c0c2bea495647510b75f77f0e57633ebcindistatic int opt_e = 0;
0eb822a1c0c2bea495647510b75f77f0e57633ebcindistatic int opt_d = 0;
0eb822a1c0c2bea495647510b75f77f0e57633ebcindistatic int opt_V = 0;
0eb822a1c0c2bea495647510b75f77f0e57633ebcindistatic int opt_p = 0;
c40d7343efa60b18ad1ceb316eb337caeea79046cindistatic int opt_S = 0;
c40d7343efa60b18ad1ceb316eb337caeea79046cindistatic int opt_t = 0;
0eb822a1c0c2bea495647510b75f77f0e57633ebcindistatic int opt_x = 0;
c40d7343efa60b18ad1ceb316eb337caeea79046cindistatic int opt_all = 0;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi
c40d7343efa60b18ad1ceb316eb337caeea79046cindistruct prop_args {
c40d7343efa60b18ad1ceb316eb337caeea79046cindi const char *group;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi const char *prop;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi const char *type;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi const char *value;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi};
c40d7343efa60b18ad1ceb316eb337caeea79046cindi
c40d7343efa60b18ad1ceb316eb337caeea79046cindistatic struct prop_args **pargs = NULL;
c40d7343efa60b18ad1ceb316eb337caeea79046cindistatic int pcnt = 0;
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindistatic int
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindiusage(FILE *fp)
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi{
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi (void) fprintf(fp,
c40d7343efa60b18ad1ceb316eb337caeea79046cindi "Usage: %s [-CedpSVx] [-P group.property[=type:value]] "
c40d7343efa60b18ad1ceb316eb337caeea79046cindi "[-R root] [-s scheme] [fmri]\n", g_pname);
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi (void) fprintf(fp,
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi "\t-C dump core after completing execution\n"
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi "\t-d set debug mode for libtopo modules\n"
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi "\t-e display FMRIs as paths using esc/eft notation\n"
c40d7343efa60b18ad1ceb316eb337caeea79046cindi "\t-P get/set specified properties\n"
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi "\t-p display of FMRI protocol properties\n"
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi "\t-R set root directory for libtopo plug-ins and other files\n"
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi "\t-s display topology for the specified FMRI scheme\n"
c40d7343efa60b18ad1ceb316eb337caeea79046cindi "\t-S display FMRI status (present/usable)\n"
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi "\t-V set verbose mode\n"
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi "\t-x display a xml formatted topology\n");
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi return (FMTOPO_EXIT_USAGE);
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi}
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi
c40d7343efa60b18ad1ceb316eb337caeea79046cindistatic topo_type_t
c40d7343efa60b18ad1ceb316eb337caeea79046cindistr2type(const char *tstr)
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi{
c40d7343efa60b18ad1ceb316eb337caeea79046cindi topo_type_t type;
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi
c40d7343efa60b18ad1ceb316eb337caeea79046cindi if (tstr == NULL)
c40d7343efa60b18ad1ceb316eb337caeea79046cindi return (TOPO_TYPE_INVALID);
c40d7343efa60b18ad1ceb316eb337caeea79046cindi
c40d7343efa60b18ad1ceb316eb337caeea79046cindi if (strcmp(tstr, "int32") == 0)
c40d7343efa60b18ad1ceb316eb337caeea79046cindi type = TOPO_TYPE_INT32;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi else if (strcmp(tstr, "uint32") == 0)
c40d7343efa60b18ad1ceb316eb337caeea79046cindi type = TOPO_TYPE_UINT32;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi else if (strcmp(tstr, "int64") == 0)
c40d7343efa60b18ad1ceb316eb337caeea79046cindi type = TOPO_TYPE_INT64;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi else if (strcmp(tstr, "uint64") == 0)
c40d7343efa60b18ad1ceb316eb337caeea79046cindi type = TOPO_TYPE_UINT64;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi else if (strcmp(tstr, "string") == 0)
c40d7343efa60b18ad1ceb316eb337caeea79046cindi type = TOPO_TYPE_STRING;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi else if (strcmp(tstr, "fmri") == 0)
c40d7343efa60b18ad1ceb316eb337caeea79046cindi type = TOPO_TYPE_FMRI;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi else {
c40d7343efa60b18ad1ceb316eb337caeea79046cindi type = TOPO_TYPE_INVALID;
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi }
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi
c40d7343efa60b18ad1ceb316eb337caeea79046cindi return (type);
c40d7343efa60b18ad1ceb316eb337caeea79046cindi}
c40d7343efa60b18ad1ceb316eb337caeea79046cindi
c40d7343efa60b18ad1ceb316eb337caeea79046cindistatic void
c40d7343efa60b18ad1ceb316eb337caeea79046cindiprint_node(topo_hdl_t *thp, tnode_t *node, nvlist_t *nvl, const char *fmri)
c40d7343efa60b18ad1ceb316eb337caeea79046cindi{
c40d7343efa60b18ad1ceb316eb337caeea79046cindi int err, ret;
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi
c40d7343efa60b18ad1ceb316eb337caeea79046cindi (void) printf("%s\n", (char *)fmri);
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi
c40d7343efa60b18ad1ceb316eb337caeea79046cindi if (opt_p && !(pcnt > 0 || opt_V || opt_all)) {
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi char *aname = NULL, *fname = NULL, *lname = NULL;
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi nvlist_t *asru = NULL;
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi nvlist_t *fru = NULL;
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi if (topo_node_asru(node, &asru, NULL, &err) == 0)
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi (void) topo_fmri_nvl2str(thp, asru, &aname, &err);
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi if (topo_node_fru(node, &fru, NULL, &err) == 0)
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi (void) topo_fmri_nvl2str(thp, fru, &fname, &err);
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi (void) topo_node_label(node, &lname, &err);
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi if (aname != NULL) {
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi nvlist_free(asru);
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi (void) printf("\tASRU: %s\n", aname);
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi topo_hdl_strfree(thp, aname);
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi } else {
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi (void) printf("\tASRU: -\n");
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi }
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi if (fname != NULL) {
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi nvlist_free(fru);
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi (void) printf("\tFRU: %s\n", fname);
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi topo_hdl_strfree(thp, fname);
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi } else {
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi (void) printf("\tFRU: -\n");
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi }
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi if (lname != NULL) {
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi (void) printf("\tLabel: %s\n", lname);
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi topo_hdl_strfree(thp, lname);
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi } else {
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi (void) printf("\tLabel: -\n");
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi }
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi }
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi
c40d7343efa60b18ad1ceb316eb337caeea79046cindi if (opt_S) {
c40d7343efa60b18ad1ceb316eb337caeea79046cindi if ((ret = topo_fmri_present(thp, nvl, &err)) < 0)
c40d7343efa60b18ad1ceb316eb337caeea79046cindi (void) printf("\tPresent: -\n");
c40d7343efa60b18ad1ceb316eb337caeea79046cindi else
c40d7343efa60b18ad1ceb316eb337caeea79046cindi (void) printf("\tPresent: %s\n",
c40d7343efa60b18ad1ceb316eb337caeea79046cindi ret ? "true" : "false");
c40d7343efa60b18ad1ceb316eb337caeea79046cindi
c40d7343efa60b18ad1ceb316eb337caeea79046cindi if ((ret = topo_fmri_unusable(thp, nvl, &err)) < 0)
c40d7343efa60b18ad1ceb316eb337caeea79046cindi (void) printf("\tUnusable: -\n");
c40d7343efa60b18ad1ceb316eb337caeea79046cindi else
c40d7343efa60b18ad1ceb316eb337caeea79046cindi (void) printf("\tUnusable: %s\n",
c40d7343efa60b18ad1ceb316eb337caeea79046cindi ret ? "true" : "false");
c40d7343efa60b18ad1ceb316eb337caeea79046cindi }
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi}
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindistatic void
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindiprint_everstyle(tnode_t *node)
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi{
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi char buf[PATH_MAX], numbuf[64];
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi nvlist_t *fmri, **hcl;
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi int i, err;
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi uint_t n;
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi if (topo_prop_get_fmri(node, TOPO_PGROUP_PROTOCOL,
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi TOPO_PROP_RESOURCE, &fmri, &err) < 0) {
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi (void) fprintf(stderr, "%s: failed to get fmri for %s=%d: %s\n",
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi g_pname, topo_node_name(node),
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi topo_node_instance(node), topo_strerror(err));
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi return;
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi }
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi if (nvlist_lookup_nvlist_array(fmri, FM_FMRI_HC_LIST, &hcl, &n) != 0) {
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi (void) fprintf(stderr, "%s: failed to find %s for %s=%d\n",
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi g_pname, FM_FMRI_HC_LIST, topo_node_name(node),
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi topo_node_instance(node));
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi return;
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi }
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi buf[0] = '\0';
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi for (i = 0; i < n; i++) {
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi char *name, *inst, *estr;
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi ulong_t ul;
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi if (nvlist_lookup_string(hcl[i], FM_FMRI_HC_NAME, &name) != 0 ||
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi nvlist_lookup_string(hcl[i], FM_FMRI_HC_ID, &inst) != 0) {
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi (void) fprintf(stderr, "%s: failed to get "
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi "name-instance for %s=%d\n", g_pname,
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi topo_node_name(node), topo_node_instance(node));
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi return;
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi }
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi errno = 0;
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi ul = strtoul(inst, &estr, 10);
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi if (errno != 0 || estr == inst) {
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi (void) fprintf(stderr, "%s: instance %s does not "
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi "convert to an unsigned integer\n", g_pname, inst);
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi }
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi (void) strlcat(buf, "/", sizeof (buf));
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi (void) strlcat(buf, name, sizeof (buf));
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi (void) snprintf(numbuf, sizeof (numbuf), "%u", ul);
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi (void) strlcat(buf, numbuf, sizeof (buf));
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi }
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi (void) printf("%s\n", buf);
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi}
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi
0eb822a1c0c2bea495647510b75f77f0e57633ebcindistatic void
c40d7343efa60b18ad1ceb316eb337caeea79046cindiprint_prop_nameval(topo_hdl_t *thp, nvlist_t *nvl)
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi{
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi int err;
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi topo_type_t type;
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi char *tstr, *propn, buf[48];
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi nvpair_t *pv_nvp;
9dd0f810214fdc8e1af881a9a5c4b6927629ff9ecindi int i;
9dd0f810214fdc8e1af881a9a5c4b6927629ff9ecindi uint_t nelem;
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi if ((pv_nvp = nvlist_next_nvpair(nvl, NULL)) == NULL)
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi return;
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi /* Print property name */
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi if ((pv_nvp = nvlist_next_nvpair(nvl, NULL)) == NULL ||
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi nvpair_name(pv_nvp) == NULL ||
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi strcmp(TOPO_PROP_VAL_NAME, nvpair_name(pv_nvp)) != 0) {
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi (void) fprintf(stderr, "%s: malformed property name\n",
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi g_pname);
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi return;
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi } else {
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi (void) nvpair_value_string(pv_nvp, &propn);
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi }
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi if ((pv_nvp = nvlist_next_nvpair(nvl, pv_nvp)) == NULL ||
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi nvpair_name(pv_nvp) == NULL ||
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi strcmp(nvpair_name(pv_nvp), TOPO_PROP_VAL_TYPE) != 0 ||
c40d7343efa60b18ad1ceb316eb337caeea79046cindi nvpair_type(pv_nvp) != DATA_TYPE_UINT32) {
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi (void) fprintf(stderr, "%s: malformed property type for %s\n",
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi g_pname, propn);
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi return;
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi } else {
c40d7343efa60b18ad1ceb316eb337caeea79046cindi (void) nvpair_value_uint32(pv_nvp, (uint32_t *)&type);
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi }
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi switch (type) {
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi case TOPO_TYPE_BOOLEAN: tstr = "boolean"; break;
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi case TOPO_TYPE_INT32: tstr = "int32"; break;
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi case TOPO_TYPE_UINT32: tstr = "uint32"; break;
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi case TOPO_TYPE_INT64: tstr = "int64"; break;
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi case TOPO_TYPE_UINT64: tstr = "uint64"; break;
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi case TOPO_TYPE_STRING: tstr = "string"; break;
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi case TOPO_TYPE_FMRI: tstr = "fmri"; break;
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi case TOPO_TYPE_INT32_ARRAY: tstr = "int32[]"; break;
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi case TOPO_TYPE_UINT32_ARRAY: tstr = "uint32[]"; break;
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi case TOPO_TYPE_INT64_ARRAY: tstr = "int64[]"; break;
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi case TOPO_TYPE_UINT64_ARRAY: tstr = "uint64[]"; break;
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi case TOPO_TYPE_STRING_ARRAY: tstr = "string[]"; break;
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi case TOPO_TYPE_FMRI_ARRAY: tstr = "fmri[]"; break;
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi default: tstr = "unknown type";
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi }
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi
c40d7343efa60b18ad1ceb316eb337caeea79046cindi printf(" %-17s %-8s ", propn, tstr);
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi /*
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi * Get property value
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi */
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi if (nvpair_name(pv_nvp) == NULL ||
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi (pv_nvp = nvlist_next_nvpair(nvl, pv_nvp)) == NULL) {
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi (void) fprintf(stderr, "%s: malformed property value\n",
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi g_pname);
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi return;
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi }
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi switch (nvpair_type(pv_nvp)) {
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi case DATA_TYPE_INT32: {
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi int32_t val;
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi (void) nvpair_value_int32(pv_nvp, &val);
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi (void) printf(" %d", val);
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi break;
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi }
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi case DATA_TYPE_UINT32: {
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi uint32_t val;
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi (void) nvpair_value_uint32(pv_nvp, &val);
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi (void) printf(" 0x%x", val);
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi break;
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi }
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi case DATA_TYPE_INT64: {
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi int64_t val;
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi (void) nvpair_value_int64(pv_nvp, &val);
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi (void) printf(" %lld", (longlong_t)val);
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi break;
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi }
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi case DATA_TYPE_UINT64: {
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi uint64_t val;
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi (void) nvpair_value_uint64(pv_nvp, &val);
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi (void) printf(" 0x%llx", (u_longlong_t)val);
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi break;
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi }
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi case DATA_TYPE_STRING: {
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi char *val;
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi (void) nvpair_value_string(pv_nvp, &val);
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi if (!opt_V && strlen(val) > 48) {
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi (void) snprintf(buf, 48, "%s...", val);
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi (void) printf(" %s", buf);
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi } else {
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi (void) printf(" %s", val);
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi }
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi break;
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi }
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi case DATA_TYPE_NVLIST: {
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi nvlist_t *val;
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi char *fmri;
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi (void) nvpair_value_nvlist(pv_nvp, &val);
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi if (topo_fmri_nvl2str(thp, val, &fmri, &err) != 0) {
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi if (opt_V)
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi nvlist_print(stdout, nvl);
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi break;
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi }
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi if (!opt_V && strlen(fmri) > 48) {
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi (void) snprintf(buf, 48, "%s", fmri);
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi (void) snprintf(&buf[45], 4, "%s", DOTS);
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi (void) printf(" %s", buf);
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi } else {
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi (void) printf(" %s", fmri);
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi }
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi topo_hdl_strfree(thp, fmri);
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi break;
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi }
9dd0f810214fdc8e1af881a9a5c4b6927629ff9ecindi case DATA_TYPE_UINT32_ARRAY: {
9dd0f810214fdc8e1af881a9a5c4b6927629ff9ecindi uint32_t *val;
9dd0f810214fdc8e1af881a9a5c4b6927629ff9ecindi
9dd0f810214fdc8e1af881a9a5c4b6927629ff9ecindi (void) nvpair_value_uint32_array(pv_nvp, &val, &nelem);
9dd0f810214fdc8e1af881a9a5c4b6927629ff9ecindi (void) printf(" [ ");
9dd0f810214fdc8e1af881a9a5c4b6927629ff9ecindi for (i = 0; i < nelem; i++)
9dd0f810214fdc8e1af881a9a5c4b6927629ff9ecindi (void) printf("%u ", val[i]);
9dd0f810214fdc8e1af881a9a5c4b6927629ff9ecindi (void) printf("]");
9dd0f810214fdc8e1af881a9a5c4b6927629ff9ecindi break;
9dd0f810214fdc8e1af881a9a5c4b6927629ff9ecindi }
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi default:
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi (void) fprintf(stderr, " unknown data type (%d)",
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi nvpair_type(pv_nvp));
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi break;
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi }
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi (void) printf("\n");
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi}
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi
0eb822a1c0c2bea495647510b75f77f0e57633ebcindistatic void
c40d7343efa60b18ad1ceb316eb337caeea79046cindiprint_pgroup(topo_hdl_t *thp, tnode_t *node, const char *pgn, char *dstab,
c40d7343efa60b18ad1ceb316eb337caeea79046cindi char *nstab, int32_t version)
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi{
c40d7343efa60b18ad1ceb316eb337caeea79046cindi int err;
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi char buf[30];
c40d7343efa60b18ad1ceb316eb337caeea79046cindi topo_pgroup_info_t *pgi = NULL;
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi
c40d7343efa60b18ad1ceb316eb337caeea79046cindi if (pgn == NULL)
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi return;
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi
c40d7343efa60b18ad1ceb316eb337caeea79046cindi if (node != NULL && (dstab == NULL || nstab == NULL || version == -1)) {
c40d7343efa60b18ad1ceb316eb337caeea79046cindi if ((pgi = topo_pgroup_info(node, pgn, &err)) != NULL) {
c40d7343efa60b18ad1ceb316eb337caeea79046cindi dstab = (char *)topo_stability2name(pgi->tpi_datastab);
c40d7343efa60b18ad1ceb316eb337caeea79046cindi nstab = (char *)topo_stability2name(pgi->tpi_namestab);
c40d7343efa60b18ad1ceb316eb337caeea79046cindi version = pgi->tpi_version;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi }
c40d7343efa60b18ad1ceb316eb337caeea79046cindi }
c40d7343efa60b18ad1ceb316eb337caeea79046cindi
c40d7343efa60b18ad1ceb316eb337caeea79046cindi if (dstab == NULL || nstab == NULL || version == -1) {
c40d7343efa60b18ad1ceb316eb337caeea79046cindi printf(" group: %-30s version: - stability: -/-\n", pgn);
c40d7343efa60b18ad1ceb316eb337caeea79046cindi } else if (!opt_V && strlen(pgn) > 30) {
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi (void) snprintf(buf, 26, "%s", pgn);
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi (void) snprintf(&buf[27], 4, "%s", DOTS);
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi printf(" group: %-30s version: %-3d stability: %s/%s\n",
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi buf, version, nstab, dstab);
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi } else {
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi printf(" group: %-30s version: %-3d stability: %s/%s\n",
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi pgn, version, nstab, dstab);
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi }
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi
c40d7343efa60b18ad1ceb316eb337caeea79046cindi if (pgi != NULL) {
c40d7343efa60b18ad1ceb316eb337caeea79046cindi topo_hdl_strfree(thp, (char *)pgi->tpi_name);
c40d7343efa60b18ad1ceb316eb337caeea79046cindi topo_hdl_free(thp, pgi, sizeof (topo_pgroup_info_t));
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi }
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi}
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi
0eb822a1c0c2bea495647510b75f77f0e57633ebcindistatic void
c40d7343efa60b18ad1ceb316eb337caeea79046cindiprint_all_props(topo_hdl_t *thp, tnode_t *node, nvlist_t *p_nv,
c40d7343efa60b18ad1ceb316eb337caeea79046cindi const char *group)
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi{
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi char *pgn = NULL, *dstab = NULL, *nstab = NULL;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi int32_t version;
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi nvlist_t *pg_nv, *pv_nv;
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi nvpair_t *nvp, *pg_nvp;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi int pg_done, match, all = strcmp(group, ALL) == 0;
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi for (nvp = nvlist_next_nvpair(p_nv, NULL); nvp != NULL;
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi nvp = nvlist_next_nvpair(p_nv, nvp)) {
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi if (strcmp(TOPO_PROP_GROUP, nvpair_name(nvp)) != 0 ||
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi nvpair_type(nvp) != DATA_TYPE_NVLIST)
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi continue;
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi
c40d7343efa60b18ad1ceb316eb337caeea79046cindi nstab = NULL;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi dstab = NULL;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi version = -1;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi pg_done = match = 0;
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi (void) nvpair_value_nvlist(nvp, &pg_nv);
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi for (pg_nvp = nvlist_next_nvpair(pg_nv, NULL); pg_nvp != NULL;
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi pg_nvp = nvlist_next_nvpair(pg_nv, pg_nvp)) {
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi /*
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi * Print property group name and stability levels
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi */
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi if (strcmp(TOPO_PROP_GROUP_NAME, nvpair_name(pg_nvp))
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi == 0 && nvpair_type(pg_nvp) == DATA_TYPE_STRING) {
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi (void) nvpair_value_string(pg_nvp, &pgn);
c40d7343efa60b18ad1ceb316eb337caeea79046cindi match = strcmp(group, pgn) == 0;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi continue;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi }
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi
c40d7343efa60b18ad1ceb316eb337caeea79046cindi if (strcmp(TOPO_PROP_GROUP_NSTAB,
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi nvpair_name(pg_nvp)) == 0 &&
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi nvpair_type(pg_nvp) == DATA_TYPE_STRING) {
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi (void) nvpair_value_string(pg_nvp, &nstab);
c40d7343efa60b18ad1ceb316eb337caeea79046cindi continue;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi }
c40d7343efa60b18ad1ceb316eb337caeea79046cindi
c40d7343efa60b18ad1ceb316eb337caeea79046cindi if (strcmp(TOPO_PROP_GROUP_DSTAB,
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi nvpair_name(pg_nvp)) == 0 &&
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi nvpair_type(pg_nvp) == DATA_TYPE_STRING) {
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi (void) nvpair_value_string(pg_nvp, &dstab);
c40d7343efa60b18ad1ceb316eb337caeea79046cindi continue;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi }
c40d7343efa60b18ad1ceb316eb337caeea79046cindi
c40d7343efa60b18ad1ceb316eb337caeea79046cindi if (strcmp(TOPO_PROP_GROUP_VERSION,
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi nvpair_name(pg_nvp)) == 0 &&
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi nvpair_type(pg_nvp) == DATA_TYPE_INT32) {
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi (void) nvpair_value_int32(pg_nvp, &version);
c40d7343efa60b18ad1ceb316eb337caeea79046cindi continue;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi }
c40d7343efa60b18ad1ceb316eb337caeea79046cindi
c40d7343efa60b18ad1ceb316eb337caeea79046cindi if ((match || all) && !pg_done) {
c40d7343efa60b18ad1ceb316eb337caeea79046cindi print_pgroup(thp, node, pgn, dstab, nstab,
c40d7343efa60b18ad1ceb316eb337caeea79046cindi version);
c40d7343efa60b18ad1ceb316eb337caeea79046cindi pg_done++;
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi }
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi /*
c40d7343efa60b18ad1ceb316eb337caeea79046cindi * Print property group and property name-value pair
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi */
c40d7343efa60b18ad1ceb316eb337caeea79046cindi if (strcmp(TOPO_PROP_VAL, nvpair_name(pg_nvp))
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi == 0 && nvpair_type(pg_nvp) == DATA_TYPE_NVLIST) {
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi (void) nvpair_value_nvlist(pg_nvp, &pv_nv);
c40d7343efa60b18ad1ceb316eb337caeea79046cindi if ((match || all) && pg_done) {
c40d7343efa60b18ad1ceb316eb337caeea79046cindi print_prop_nameval(thp, pv_nv);
c40d7343efa60b18ad1ceb316eb337caeea79046cindi }
c40d7343efa60b18ad1ceb316eb337caeea79046cindi
c40d7343efa60b18ad1ceb316eb337caeea79046cindi }
c40d7343efa60b18ad1ceb316eb337caeea79046cindi
c40d7343efa60b18ad1ceb316eb337caeea79046cindi }
c40d7343efa60b18ad1ceb316eb337caeea79046cindi if (match && !all)
c40d7343efa60b18ad1ceb316eb337caeea79046cindi return;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi }
c40d7343efa60b18ad1ceb316eb337caeea79046cindi}
c40d7343efa60b18ad1ceb316eb337caeea79046cindi
c40d7343efa60b18ad1ceb316eb337caeea79046cindistatic void
c40d7343efa60b18ad1ceb316eb337caeea79046cindiset_prop(topo_hdl_t *thp, tnode_t *node, nvlist_t *fmri, struct prop_args *pp)
c40d7343efa60b18ad1ceb316eb337caeea79046cindi{
c40d7343efa60b18ad1ceb316eb337caeea79046cindi int ret, err = 0;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi topo_type_t type;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi nvlist_t *nvl, *f = NULL;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi char *end;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi
c40d7343efa60b18ad1ceb316eb337caeea79046cindi if (pp->prop == NULL || pp->type == NULL || pp->value == NULL)
c40d7343efa60b18ad1ceb316eb337caeea79046cindi return;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi
c40d7343efa60b18ad1ceb316eb337caeea79046cindi if ((type = str2type(pp->type)) == TOPO_TYPE_INVALID) {
c40d7343efa60b18ad1ceb316eb337caeea79046cindi (void) fprintf(stderr, "%s: invalid property type %s for %s\n",
c40d7343efa60b18ad1ceb316eb337caeea79046cindi g_pname, pp->type, pp->prop);
c40d7343efa60b18ad1ceb316eb337caeea79046cindi return;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi }
c40d7343efa60b18ad1ceb316eb337caeea79046cindi
c40d7343efa60b18ad1ceb316eb337caeea79046cindi if (nvlist_alloc(&nvl, NV_UNIQUE_NAME, 0) != 0) {
c40d7343efa60b18ad1ceb316eb337caeea79046cindi (void) fprintf(stderr, "%s: nvlist allocation failed for "
c40d7343efa60b18ad1ceb316eb337caeea79046cindi "%s=%s:%s\n", g_pname, pp->prop, pp->type, pp->value);
c40d7343efa60b18ad1ceb316eb337caeea79046cindi return;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi }
c40d7343efa60b18ad1ceb316eb337caeea79046cindi ret = nvlist_add_string(nvl, TOPO_PROP_VAL_NAME, pp->prop);
c40d7343efa60b18ad1ceb316eb337caeea79046cindi ret |= nvlist_add_uint32(nvl, TOPO_PROP_VAL_TYPE, type);
c40d7343efa60b18ad1ceb316eb337caeea79046cindi if (ret != 0) {
c40d7343efa60b18ad1ceb316eb337caeea79046cindi (void) fprintf(stderr, "%s: invalid property type %s for %s\n",
c40d7343efa60b18ad1ceb316eb337caeea79046cindi g_pname, pp->type, pp->prop);
c40d7343efa60b18ad1ceb316eb337caeea79046cindi nvlist_free(nvl);
c40d7343efa60b18ad1ceb316eb337caeea79046cindi return;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi }
c40d7343efa60b18ad1ceb316eb337caeea79046cindi
c40d7343efa60b18ad1ceb316eb337caeea79046cindi errno = 0;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi switch (type) {
c40d7343efa60b18ad1ceb316eb337caeea79046cindi case TOPO_TYPE_INT32:
c40d7343efa60b18ad1ceb316eb337caeea79046cindi {
c40d7343efa60b18ad1ceb316eb337caeea79046cindi int32_t val;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi
c40d7343efa60b18ad1ceb316eb337caeea79046cindi val = strtol(pp->value, &end, 0);
c40d7343efa60b18ad1ceb316eb337caeea79046cindi if (errno == ERANGE) {
c40d7343efa60b18ad1ceb316eb337caeea79046cindi ret = -1;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi break;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi }
c40d7343efa60b18ad1ceb316eb337caeea79046cindi ret = nvlist_add_int32(nvl, TOPO_PROP_VAL_VAL, val);
c40d7343efa60b18ad1ceb316eb337caeea79046cindi break;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi }
c40d7343efa60b18ad1ceb316eb337caeea79046cindi case TOPO_TYPE_UINT32:
c40d7343efa60b18ad1ceb316eb337caeea79046cindi {
c40d7343efa60b18ad1ceb316eb337caeea79046cindi uint32_t val;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi
c40d7343efa60b18ad1ceb316eb337caeea79046cindi val = strtoul(pp->value, &end, 0);
c40d7343efa60b18ad1ceb316eb337caeea79046cindi if (errno == ERANGE) {
c40d7343efa60b18ad1ceb316eb337caeea79046cindi ret = -1;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi break;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi }
c40d7343efa60b18ad1ceb316eb337caeea79046cindi ret = nvlist_add_uint32(nvl, TOPO_PROP_VAL_VAL, val);
c40d7343efa60b18ad1ceb316eb337caeea79046cindi break;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi }
c40d7343efa60b18ad1ceb316eb337caeea79046cindi case TOPO_TYPE_INT64:
c40d7343efa60b18ad1ceb316eb337caeea79046cindi {
c40d7343efa60b18ad1ceb316eb337caeea79046cindi int64_t val;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi
c40d7343efa60b18ad1ceb316eb337caeea79046cindi val = strtoll(pp->value, &end, 0);
c40d7343efa60b18ad1ceb316eb337caeea79046cindi if (errno == ERANGE) {
c40d7343efa60b18ad1ceb316eb337caeea79046cindi ret = -1;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi break;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi }
c40d7343efa60b18ad1ceb316eb337caeea79046cindi ret = nvlist_add_int64(nvl, TOPO_PROP_VAL_VAL, val);
c40d7343efa60b18ad1ceb316eb337caeea79046cindi break;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi }
c40d7343efa60b18ad1ceb316eb337caeea79046cindi case TOPO_TYPE_UINT64:
c40d7343efa60b18ad1ceb316eb337caeea79046cindi {
c40d7343efa60b18ad1ceb316eb337caeea79046cindi uint64_t val;
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi
c40d7343efa60b18ad1ceb316eb337caeea79046cindi val = strtoull(pp->value, &end, 0);
c40d7343efa60b18ad1ceb316eb337caeea79046cindi if (errno == ERANGE) {
c40d7343efa60b18ad1ceb316eb337caeea79046cindi ret = -1;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi break;
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi }
c40d7343efa60b18ad1ceb316eb337caeea79046cindi ret = nvlist_add_uint64(nvl, TOPO_PROP_VAL_VAL, val);
c40d7343efa60b18ad1ceb316eb337caeea79046cindi break;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi }
c40d7343efa60b18ad1ceb316eb337caeea79046cindi case TOPO_TYPE_STRING:
c40d7343efa60b18ad1ceb316eb337caeea79046cindi {
c40d7343efa60b18ad1ceb316eb337caeea79046cindi ret = nvlist_add_string(nvl, TOPO_PROP_VAL_VAL,
c40d7343efa60b18ad1ceb316eb337caeea79046cindi pp->value);
c40d7343efa60b18ad1ceb316eb337caeea79046cindi break;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi }
c40d7343efa60b18ad1ceb316eb337caeea79046cindi case TOPO_TYPE_FMRI:
c40d7343efa60b18ad1ceb316eb337caeea79046cindi {
c40d7343efa60b18ad1ceb316eb337caeea79046cindi if ((ret = topo_fmri_str2nvl(thp, pp->value, &f, &err))
c40d7343efa60b18ad1ceb316eb337caeea79046cindi < 0)
c40d7343efa60b18ad1ceb316eb337caeea79046cindi break;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi
c40d7343efa60b18ad1ceb316eb337caeea79046cindi if ((ret = nvlist_add_nvlist(nvl, TOPO_PROP_VAL_VAL,
c40d7343efa60b18ad1ceb316eb337caeea79046cindi f)) != 0)
c40d7343efa60b18ad1ceb316eb337caeea79046cindi err = ETOPO_PROP_NVL;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi break;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi }
c40d7343efa60b18ad1ceb316eb337caeea79046cindi default:
c40d7343efa60b18ad1ceb316eb337caeea79046cindi ret = -1;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi }
c40d7343efa60b18ad1ceb316eb337caeea79046cindi
c40d7343efa60b18ad1ceb316eb337caeea79046cindi if (ret != 0) {
c40d7343efa60b18ad1ceb316eb337caeea79046cindi (void) fprintf(stderr, "%s: unable to set property value for "
c40d7343efa60b18ad1ceb316eb337caeea79046cindi "%s: %s\n", g_pname, pp->prop, topo_strerror(err));
c40d7343efa60b18ad1ceb316eb337caeea79046cindi nvlist_free(nvl);
c40d7343efa60b18ad1ceb316eb337caeea79046cindi return;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi }
c40d7343efa60b18ad1ceb316eb337caeea79046cindi
c40d7343efa60b18ad1ceb316eb337caeea79046cindi if (node != NULL) {
c40d7343efa60b18ad1ceb316eb337caeea79046cindi if (topo_prop_setprop(node, pp->group, nvl, TOPO_PROP_MUTABLE,
c40d7343efa60b18ad1ceb316eb337caeea79046cindi f, &ret) < 0) {
c40d7343efa60b18ad1ceb316eb337caeea79046cindi (void) fprintf(stderr, "%s: unable to set property "
c40d7343efa60b18ad1ceb316eb337caeea79046cindi "value for " "%s=%s:%s: %s\n", g_pname, pp->prop,
c40d7343efa60b18ad1ceb316eb337caeea79046cindi pp->type, pp->value, topo_strerror(ret));
c40d7343efa60b18ad1ceb316eb337caeea79046cindi nvlist_free(nvl);
c40d7343efa60b18ad1ceb316eb337caeea79046cindi nvlist_free(f);
c40d7343efa60b18ad1ceb316eb337caeea79046cindi return;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi }
c40d7343efa60b18ad1ceb316eb337caeea79046cindi } else {
c40d7343efa60b18ad1ceb316eb337caeea79046cindi if (topo_fmri_setprop(thp, fmri, pp->group, nvl,
c40d7343efa60b18ad1ceb316eb337caeea79046cindi TOPO_PROP_MUTABLE, f, &ret) < 0) {
c40d7343efa60b18ad1ceb316eb337caeea79046cindi (void) fprintf(stderr, "%s: unable to set property "
c40d7343efa60b18ad1ceb316eb337caeea79046cindi "value for " "%s=%s:%s: %s\n", g_pname, pp->prop,
c40d7343efa60b18ad1ceb316eb337caeea79046cindi pp->type, pp->value, topo_strerror(ret));
c40d7343efa60b18ad1ceb316eb337caeea79046cindi nvlist_free(nvl);
c40d7343efa60b18ad1ceb316eb337caeea79046cindi nvlist_free(f);
c40d7343efa60b18ad1ceb316eb337caeea79046cindi return;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi }
c40d7343efa60b18ad1ceb316eb337caeea79046cindi }
c40d7343efa60b18ad1ceb316eb337caeea79046cindi
c40d7343efa60b18ad1ceb316eb337caeea79046cindi nvlist_free(nvl);
c40d7343efa60b18ad1ceb316eb337caeea79046cindi
c40d7343efa60b18ad1ceb316eb337caeea79046cindi /*
c40d7343efa60b18ad1ceb316eb337caeea79046cindi * Now, get the property back for printing
c40d7343efa60b18ad1ceb316eb337caeea79046cindi */
c40d7343efa60b18ad1ceb316eb337caeea79046cindi if (node != NULL) {
c40d7343efa60b18ad1ceb316eb337caeea79046cindi if (topo_prop_getprop(node, pp->group, pp->prop, f, &nvl,
c40d7343efa60b18ad1ceb316eb337caeea79046cindi &err) < 0) {
c40d7343efa60b18ad1ceb316eb337caeea79046cindi (void) fprintf(stderr, "%s: failed to get %s.%s: %s\n",
c40d7343efa60b18ad1ceb316eb337caeea79046cindi g_pname, pp->group, pp->prop, topo_strerror(err));
c40d7343efa60b18ad1ceb316eb337caeea79046cindi nvlist_free(f);
c40d7343efa60b18ad1ceb316eb337caeea79046cindi return;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi }
c40d7343efa60b18ad1ceb316eb337caeea79046cindi } else {
c40d7343efa60b18ad1ceb316eb337caeea79046cindi if (topo_fmri_getprop(thp, fmri, pp->group, pp->prop,
c40d7343efa60b18ad1ceb316eb337caeea79046cindi f, &nvl, &err) < 0) {
c40d7343efa60b18ad1ceb316eb337caeea79046cindi (void) fprintf(stderr, "%s: failed to get %s.%s: %s\n",
c40d7343efa60b18ad1ceb316eb337caeea79046cindi g_pname, pp->group, pp->prop, topo_strerror(err));
c40d7343efa60b18ad1ceb316eb337caeea79046cindi nvlist_free(f);
c40d7343efa60b18ad1ceb316eb337caeea79046cindi return;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi }
c40d7343efa60b18ad1ceb316eb337caeea79046cindi }
c40d7343efa60b18ad1ceb316eb337caeea79046cindi
c40d7343efa60b18ad1ceb316eb337caeea79046cindi print_pgroup(thp, node, pp->group, NULL, NULL, 0);
c40d7343efa60b18ad1ceb316eb337caeea79046cindi print_prop_nameval(thp, nvl);
c40d7343efa60b18ad1ceb316eb337caeea79046cindi nvlist_free(nvl);
c40d7343efa60b18ad1ceb316eb337caeea79046cindi
c40d7343efa60b18ad1ceb316eb337caeea79046cindi nvlist_free(f);
c40d7343efa60b18ad1ceb316eb337caeea79046cindi}
c40d7343efa60b18ad1ceb316eb337caeea79046cindi
c40d7343efa60b18ad1ceb316eb337caeea79046cindistatic void
c40d7343efa60b18ad1ceb316eb337caeea79046cindiprint_props(topo_hdl_t *thp, tnode_t *node)
c40d7343efa60b18ad1ceb316eb337caeea79046cindi{
c40d7343efa60b18ad1ceb316eb337caeea79046cindi int i, err;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi nvlist_t *nvl;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi struct prop_args *pp;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi
c40d7343efa60b18ad1ceb316eb337caeea79046cindi if (pcnt == 0)
c40d7343efa60b18ad1ceb316eb337caeea79046cindi return;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi
c40d7343efa60b18ad1ceb316eb337caeea79046cindi for (i = 0; i < pcnt; ++i) {
c40d7343efa60b18ad1ceb316eb337caeea79046cindi pp = pargs[i];
c40d7343efa60b18ad1ceb316eb337caeea79046cindi
c40d7343efa60b18ad1ceb316eb337caeea79046cindi if (pp->group == NULL)
c40d7343efa60b18ad1ceb316eb337caeea79046cindi continue;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi
c40d7343efa60b18ad1ceb316eb337caeea79046cindi /*
c40d7343efa60b18ad1ceb316eb337caeea79046cindi * If we have a valid value, this is a request to
c40d7343efa60b18ad1ceb316eb337caeea79046cindi * set a property. Otherwise, just print the property
c40d7343efa60b18ad1ceb316eb337caeea79046cindi * group and any specified properties.
c40d7343efa60b18ad1ceb316eb337caeea79046cindi */
c40d7343efa60b18ad1ceb316eb337caeea79046cindi if (pp->value == NULL) {
c40d7343efa60b18ad1ceb316eb337caeea79046cindi if (pp->prop == NULL) {
c40d7343efa60b18ad1ceb316eb337caeea79046cindi
c40d7343efa60b18ad1ceb316eb337caeea79046cindi /*
c40d7343efa60b18ad1ceb316eb337caeea79046cindi * Print all properties in this group
c40d7343efa60b18ad1ceb316eb337caeea79046cindi */
c40d7343efa60b18ad1ceb316eb337caeea79046cindi if ((nvl = topo_prop_getprops(node, &err))
c40d7343efa60b18ad1ceb316eb337caeea79046cindi == NULL) {
c40d7343efa60b18ad1ceb316eb337caeea79046cindi (void) fprintf(stderr, "%s: failed to "
c40d7343efa60b18ad1ceb316eb337caeea79046cindi "get %s: %s\n", g_pname,
c40d7343efa60b18ad1ceb316eb337caeea79046cindi pp->group,
c40d7343efa60b18ad1ceb316eb337caeea79046cindi topo_strerror(err));
c40d7343efa60b18ad1ceb316eb337caeea79046cindi continue;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi } else {
c40d7343efa60b18ad1ceb316eb337caeea79046cindi print_all_props(thp, node, nvl,
c40d7343efa60b18ad1ceb316eb337caeea79046cindi pp->group);
c40d7343efa60b18ad1ceb316eb337caeea79046cindi nvlist_free(nvl);
c40d7343efa60b18ad1ceb316eb337caeea79046cindi continue;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi }
c40d7343efa60b18ad1ceb316eb337caeea79046cindi }
c40d7343efa60b18ad1ceb316eb337caeea79046cindi if (topo_prop_getprop(node, pp->group, pp->prop,
c40d7343efa60b18ad1ceb316eb337caeea79046cindi NULL, &nvl, &err) < 0) {
c40d7343efa60b18ad1ceb316eb337caeea79046cindi (void) fprintf(stderr, "%s: failed to get "
c40d7343efa60b18ad1ceb316eb337caeea79046cindi "%s.%s: %s\n", g_pname,
c40d7343efa60b18ad1ceb316eb337caeea79046cindi pp->group, pp->prop,
c40d7343efa60b18ad1ceb316eb337caeea79046cindi topo_strerror(err));
c40d7343efa60b18ad1ceb316eb337caeea79046cindi continue;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi } else {
c40d7343efa60b18ad1ceb316eb337caeea79046cindi print_pgroup(thp, node, pp->group, NULL,
c40d7343efa60b18ad1ceb316eb337caeea79046cindi NULL, 0);
c40d7343efa60b18ad1ceb316eb337caeea79046cindi print_prop_nameval(thp, nvl);
c40d7343efa60b18ad1ceb316eb337caeea79046cindi nvlist_free(nvl);
c40d7343efa60b18ad1ceb316eb337caeea79046cindi }
c40d7343efa60b18ad1ceb316eb337caeea79046cindi } else {
c40d7343efa60b18ad1ceb316eb337caeea79046cindi set_prop(thp, node, NULL, pp);
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi }
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi }
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi}
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi/*ARGSUSED*/
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindistatic int
c40d7343efa60b18ad1ceb316eb337caeea79046cindiwalk_node(topo_hdl_t *thp, tnode_t *node, void *arg)
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi{
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi int err;
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi nvlist_t *nvl;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi nvlist_t *rsrc;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi char *s;
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi if (opt_e && strcmp(opt_s, FM_FMRI_SCHEME_HC) == 0) {
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi print_everstyle(node);
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi return (TOPO_WALK_NEXT);
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi }
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi
c40d7343efa60b18ad1ceb316eb337caeea79046cindi if (topo_node_resource(node, &rsrc, &err) < 0) {
c40d7343efa60b18ad1ceb316eb337caeea79046cindi (void) fprintf(stderr, "%s: failed to get resource: "
c40d7343efa60b18ad1ceb316eb337caeea79046cindi "%s", g_pname, topo_strerror(err));
c40d7343efa60b18ad1ceb316eb337caeea79046cindi return (TOPO_WALK_NEXT);
c40d7343efa60b18ad1ceb316eb337caeea79046cindi }
c40d7343efa60b18ad1ceb316eb337caeea79046cindi if (topo_fmri_nvl2str(thp, rsrc, &s, &err) < 0) {
c40d7343efa60b18ad1ceb316eb337caeea79046cindi (void) fprintf(stderr, "%s: failed to convert "
c40d7343efa60b18ad1ceb316eb337caeea79046cindi "resource to FMRI string: %s", g_pname,
c40d7343efa60b18ad1ceb316eb337caeea79046cindi topo_strerror(err));
c40d7343efa60b18ad1ceb316eb337caeea79046cindi nvlist_free(rsrc);
c40d7343efa60b18ad1ceb316eb337caeea79046cindi return (TOPO_WALK_NEXT);
c40d7343efa60b18ad1ceb316eb337caeea79046cindi }
c40d7343efa60b18ad1ceb316eb337caeea79046cindi
c40d7343efa60b18ad1ceb316eb337caeea79046cindi if (g_fmri != NULL && fnmatch(g_fmri, s, 0) != 0) {
c40d7343efa60b18ad1ceb316eb337caeea79046cindi nvlist_free(rsrc);
c40d7343efa60b18ad1ceb316eb337caeea79046cindi topo_hdl_strfree(thp, s);
c40d7343efa60b18ad1ceb316eb337caeea79046cindi return (TOPO_WALK_NEXT);
c40d7343efa60b18ad1ceb316eb337caeea79046cindi }
c40d7343efa60b18ad1ceb316eb337caeea79046cindi
c40d7343efa60b18ad1ceb316eb337caeea79046cindi print_node(thp, node, rsrc, s);
c40d7343efa60b18ad1ceb316eb337caeea79046cindi topo_hdl_strfree(thp, s);
c40d7343efa60b18ad1ceb316eb337caeea79046cindi nvlist_free(rsrc);
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi
c40d7343efa60b18ad1ceb316eb337caeea79046cindi if (opt_V || opt_all) {
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi if ((nvl = topo_prop_getprops(node, &err)) == NULL) {
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi (void) fprintf(stderr, "%s: failed to get "
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi "properties for %s=%d: %s\n", g_pname,
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi topo_node_name(node), topo_node_instance(node),
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi topo_strerror(err));
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi } else {
c40d7343efa60b18ad1ceb316eb337caeea79046cindi print_all_props(thp, node, nvl, ALL);
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi nvlist_free(nvl);
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi }
c40d7343efa60b18ad1ceb316eb337caeea79046cindi } else if (pcnt > 0) {
c40d7343efa60b18ad1ceb316eb337caeea79046cindi print_props(thp, node);
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi }
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi printf("\n");
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi return (TOPO_WALK_NEXT);
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi}
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi
c40d7343efa60b18ad1ceb316eb337caeea79046cindistatic void
c40d7343efa60b18ad1ceb316eb337caeea79046cindiget_pargs(int argc, char *argv[])
c40d7343efa60b18ad1ceb316eb337caeea79046cindi{
c40d7343efa60b18ad1ceb316eb337caeea79046cindi struct prop_args *pp;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi char c, *s, *p;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi int i = 0;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi
c40d7343efa60b18ad1ceb316eb337caeea79046cindi if ((pargs = malloc(sizeof (struct prop_args *) * pcnt)) == NULL) {
c40d7343efa60b18ad1ceb316eb337caeea79046cindi (void) fprintf(stderr, "%s: failed to allocate property "
c40d7343efa60b18ad1ceb316eb337caeea79046cindi "arguments\n", g_pname);
c40d7343efa60b18ad1ceb316eb337caeea79046cindi return;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi }
c40d7343efa60b18ad1ceb316eb337caeea79046cindi
c40d7343efa60b18ad1ceb316eb337caeea79046cindi for (optind = 1; (c = getopt(argc, argv, optstr)) != EOF; ) {
c40d7343efa60b18ad1ceb316eb337caeea79046cindi if (c == 'P') {
c40d7343efa60b18ad1ceb316eb337caeea79046cindi
c40d7343efa60b18ad1ceb316eb337caeea79046cindi if (strcmp(optarg, ALL) == 0) {
c40d7343efa60b18ad1ceb316eb337caeea79046cindi opt_all++;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi break;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi }
c40d7343efa60b18ad1ceb316eb337caeea79046cindi
c40d7343efa60b18ad1ceb316eb337caeea79046cindi if ((pp = pargs[i] = malloc(sizeof (struct prop_args)))
c40d7343efa60b18ad1ceb316eb337caeea79046cindi == NULL) {
c40d7343efa60b18ad1ceb316eb337caeea79046cindi (void) fprintf(stderr, "%s: failed to "
c40d7343efa60b18ad1ceb316eb337caeea79046cindi "allocate propertyarguments\n", g_pname);
c40d7343efa60b18ad1ceb316eb337caeea79046cindi return;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi }
c40d7343efa60b18ad1ceb316eb337caeea79046cindi ++i;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi pp->group = NULL;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi pp->prop = NULL;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi pp->type = NULL;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi pp->value = NULL;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi
c40d7343efa60b18ad1ceb316eb337caeea79046cindi p = optarg;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi if ((s = strchr(p, '.')) != NULL) {
c40d7343efa60b18ad1ceb316eb337caeea79046cindi *s++ = '\0'; /* strike out delimiter */
c40d7343efa60b18ad1ceb316eb337caeea79046cindi pp->group = p;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi p = s;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi if ((s = strchr(p, '=')) != NULL) {
c40d7343efa60b18ad1ceb316eb337caeea79046cindi *s++ = '\0'; /* strike out delimiter */
c40d7343efa60b18ad1ceb316eb337caeea79046cindi pp->prop = p;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi p = s;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi if ((s = strchr(p, ':')) != NULL) {
c40d7343efa60b18ad1ceb316eb337caeea79046cindi *s++ = '\0';
c40d7343efa60b18ad1ceb316eb337caeea79046cindi pp->type = p;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi pp->value = s;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi } else {
c40d7343efa60b18ad1ceb316eb337caeea79046cindi (void) fprintf(stderr, "%s: "
c40d7343efa60b18ad1ceb316eb337caeea79046cindi "property type not "
c40d7343efa60b18ad1ceb316eb337caeea79046cindi "specified for assignment "
c40d7343efa60b18ad1ceb316eb337caeea79046cindi " of %s.%s\n", g_pname,
c40d7343efa60b18ad1ceb316eb337caeea79046cindi pp->group, pp->prop);
c40d7343efa60b18ad1ceb316eb337caeea79046cindi break;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi }
c40d7343efa60b18ad1ceb316eb337caeea79046cindi } else {
c40d7343efa60b18ad1ceb316eb337caeea79046cindi pp->prop = p;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi }
c40d7343efa60b18ad1ceb316eb337caeea79046cindi } else {
c40d7343efa60b18ad1ceb316eb337caeea79046cindi pp->group = p;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi }
c40d7343efa60b18ad1ceb316eb337caeea79046cindi if (i >= pcnt)
c40d7343efa60b18ad1ceb316eb337caeea79046cindi break;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi }
c40d7343efa60b18ad1ceb316eb337caeea79046cindi }
c40d7343efa60b18ad1ceb316eb337caeea79046cindi
c40d7343efa60b18ad1ceb316eb337caeea79046cindi if (opt_all > 0) {
c40d7343efa60b18ad1ceb316eb337caeea79046cindi int j;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi
c40d7343efa60b18ad1ceb316eb337caeea79046cindi for (j = 0; j < i; ++j)
c40d7343efa60b18ad1ceb316eb337caeea79046cindi free(pargs[i]);
c40d7343efa60b18ad1ceb316eb337caeea79046cindi free(pargs);
c40d7343efa60b18ad1ceb316eb337caeea79046cindi pargs = NULL;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi }
c40d7343efa60b18ad1ceb316eb337caeea79046cindi}
c40d7343efa60b18ad1ceb316eb337caeea79046cindi
c40d7343efa60b18ad1ceb316eb337caeea79046cindistatic int
c40d7343efa60b18ad1ceb316eb337caeea79046cindiwalk_topo(topo_hdl_t *thp, char *uuid)
c40d7343efa60b18ad1ceb316eb337caeea79046cindi{
c40d7343efa60b18ad1ceb316eb337caeea79046cindi int err;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi topo_walk_t *twp;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi
c40d7343efa60b18ad1ceb316eb337caeea79046cindi if ((twp = topo_walk_init(thp, opt_s, walk_node, NULL, &err))
c40d7343efa60b18ad1ceb316eb337caeea79046cindi == NULL) {
c40d7343efa60b18ad1ceb316eb337caeea79046cindi (void) fprintf(stderr, "%s: failed to walk %s topology:"
c40d7343efa60b18ad1ceb316eb337caeea79046cindi " %s\n", g_pname, opt_s, topo_strerror(err));
c40d7343efa60b18ad1ceb316eb337caeea79046cindi
c40d7343efa60b18ad1ceb316eb337caeea79046cindi return (-1);
c40d7343efa60b18ad1ceb316eb337caeea79046cindi }
c40d7343efa60b18ad1ceb316eb337caeea79046cindi
c40d7343efa60b18ad1ceb316eb337caeea79046cindi /*
c40d7343efa60b18ad1ceb316eb337caeea79046cindi * Print standard header
c40d7343efa60b18ad1ceb316eb337caeea79046cindi */
c40d7343efa60b18ad1ceb316eb337caeea79046cindi if (!opt_e) {
c40d7343efa60b18ad1ceb316eb337caeea79046cindi char buf[32];
c40d7343efa60b18ad1ceb316eb337caeea79046cindi time_t tod = time(NULL);
c40d7343efa60b18ad1ceb316eb337caeea79046cindi
c40d7343efa60b18ad1ceb316eb337caeea79046cindi printf("TIME UUID\n");
c40d7343efa60b18ad1ceb316eb337caeea79046cindi (void) strftime(buf, sizeof (buf), "%b %d %T", localtime(&tod));
c40d7343efa60b18ad1ceb316eb337caeea79046cindi (void) printf("%-15s %-32s\n", buf, uuid);
c40d7343efa60b18ad1ceb316eb337caeea79046cindi (void) printf("\n");
c40d7343efa60b18ad1ceb316eb337caeea79046cindi }
c40d7343efa60b18ad1ceb316eb337caeea79046cindi
c40d7343efa60b18ad1ceb316eb337caeea79046cindi if (topo_walk_step(twp, TOPO_WALK_CHILD) == TOPO_WALK_ERR) {
c40d7343efa60b18ad1ceb316eb337caeea79046cindi (void) fprintf(stderr, "%s: failed to walk topology\n",
c40d7343efa60b18ad1ceb316eb337caeea79046cindi g_pname);
c40d7343efa60b18ad1ceb316eb337caeea79046cindi topo_walk_fini(twp);
c40d7343efa60b18ad1ceb316eb337caeea79046cindi return (-1);
c40d7343efa60b18ad1ceb316eb337caeea79046cindi }
c40d7343efa60b18ad1ceb316eb337caeea79046cindi
c40d7343efa60b18ad1ceb316eb337caeea79046cindi topo_walk_fini(twp);
c40d7343efa60b18ad1ceb316eb337caeea79046cindi
c40d7343efa60b18ad1ceb316eb337caeea79046cindi return (0);
c40d7343efa60b18ad1ceb316eb337caeea79046cindi}
c40d7343efa60b18ad1ceb316eb337caeea79046cindi
c40d7343efa60b18ad1ceb316eb337caeea79046cindistatic void
c40d7343efa60b18ad1ceb316eb337caeea79046cindiprint_fmri_pgroup(topo_hdl_t *thp, const char *pgn, nvlist_t *nvl)
c40d7343efa60b18ad1ceb316eb337caeea79046cindi{
c40d7343efa60b18ad1ceb316eb337caeea79046cindi char *dstab = NULL, *nstab = NULL;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi int32_t version = -1;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi nvlist_t *pnvl;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi nvpair_t *pnvp;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi
c40d7343efa60b18ad1ceb316eb337caeea79046cindi (void) nvlist_lookup_string(nvl, TOPO_PROP_GROUP_NSTAB, &nstab);
c40d7343efa60b18ad1ceb316eb337caeea79046cindi (void) nvlist_lookup_string(nvl, TOPO_PROP_GROUP_DSTAB, &dstab);
c40d7343efa60b18ad1ceb316eb337caeea79046cindi (void) nvlist_lookup_int32(nvl, TOPO_PROP_GROUP_VERSION, &version);
c40d7343efa60b18ad1ceb316eb337caeea79046cindi
c40d7343efa60b18ad1ceb316eb337caeea79046cindi print_pgroup(thp, NULL, pgn, dstab, nstab, version);
c40d7343efa60b18ad1ceb316eb337caeea79046cindi
c40d7343efa60b18ad1ceb316eb337caeea79046cindi for (pnvp = nvlist_next_nvpair(nvl, NULL); pnvp != NULL;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi pnvp = nvlist_next_nvpair(nvl, pnvp)) {
c40d7343efa60b18ad1ceb316eb337caeea79046cindi
c40d7343efa60b18ad1ceb316eb337caeea79046cindi /*
c40d7343efa60b18ad1ceb316eb337caeea79046cindi * Print property group and property name-value pair
c40d7343efa60b18ad1ceb316eb337caeea79046cindi */
c40d7343efa60b18ad1ceb316eb337caeea79046cindi if (strcmp(TOPO_PROP_VAL, nvpair_name(pnvp))
c40d7343efa60b18ad1ceb316eb337caeea79046cindi == 0 && nvpair_type(pnvp) == DATA_TYPE_NVLIST) {
c40d7343efa60b18ad1ceb316eb337caeea79046cindi (void) nvpair_value_nvlist(pnvp, &pnvl);
c40d7343efa60b18ad1ceb316eb337caeea79046cindi print_prop_nameval(thp, pnvl);
c40d7343efa60b18ad1ceb316eb337caeea79046cindi
c40d7343efa60b18ad1ceb316eb337caeea79046cindi }
c40d7343efa60b18ad1ceb316eb337caeea79046cindi
c40d7343efa60b18ad1ceb316eb337caeea79046cindi }
c40d7343efa60b18ad1ceb316eb337caeea79046cindi}
c40d7343efa60b18ad1ceb316eb337caeea79046cindi
c40d7343efa60b18ad1ceb316eb337caeea79046cindistatic void
c40d7343efa60b18ad1ceb316eb337caeea79046cindiprint_fmri_props(topo_hdl_t *thp, nvlist_t *nvl)
c40d7343efa60b18ad1ceb316eb337caeea79046cindi{
c40d7343efa60b18ad1ceb316eb337caeea79046cindi int i, err;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi struct prop_args *pp;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi nvlist_t *pnvl;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi
c40d7343efa60b18ad1ceb316eb337caeea79046cindi for (i = 0; i < pcnt; ++i) {
c40d7343efa60b18ad1ceb316eb337caeea79046cindi pp = pargs[i];
c40d7343efa60b18ad1ceb316eb337caeea79046cindi
c40d7343efa60b18ad1ceb316eb337caeea79046cindi if (pp->group == NULL)
c40d7343efa60b18ad1ceb316eb337caeea79046cindi continue;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi
c40d7343efa60b18ad1ceb316eb337caeea79046cindi pnvl = NULL;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi
c40d7343efa60b18ad1ceb316eb337caeea79046cindi /*
c40d7343efa60b18ad1ceb316eb337caeea79046cindi * If we have a valid value, this is a request to
c40d7343efa60b18ad1ceb316eb337caeea79046cindi * set a property. Otherwise, just print the property
c40d7343efa60b18ad1ceb316eb337caeea79046cindi * group and any specified properties.
c40d7343efa60b18ad1ceb316eb337caeea79046cindi */
c40d7343efa60b18ad1ceb316eb337caeea79046cindi if (pp->value == NULL) {
c40d7343efa60b18ad1ceb316eb337caeea79046cindi if (pp->prop == NULL) {
c40d7343efa60b18ad1ceb316eb337caeea79046cindi
c40d7343efa60b18ad1ceb316eb337caeea79046cindi /*
c40d7343efa60b18ad1ceb316eb337caeea79046cindi * Print all properties in this group
c40d7343efa60b18ad1ceb316eb337caeea79046cindi */
c40d7343efa60b18ad1ceb316eb337caeea79046cindi if (topo_fmri_getpgrp(thp, nvl, pp->group,
c40d7343efa60b18ad1ceb316eb337caeea79046cindi &pnvl, &err) < 0) {
c40d7343efa60b18ad1ceb316eb337caeea79046cindi (void) fprintf(stderr, "%s: failed to "
c40d7343efa60b18ad1ceb316eb337caeea79046cindi "get group %s: %s\n", g_pname,
c40d7343efa60b18ad1ceb316eb337caeea79046cindi pp->group, topo_strerror(err));
c40d7343efa60b18ad1ceb316eb337caeea79046cindi continue;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi } else {
c40d7343efa60b18ad1ceb316eb337caeea79046cindi print_fmri_pgroup(thp, pp->group, pnvl);
c40d7343efa60b18ad1ceb316eb337caeea79046cindi nvlist_free(pnvl);
c40d7343efa60b18ad1ceb316eb337caeea79046cindi continue;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi }
c40d7343efa60b18ad1ceb316eb337caeea79046cindi }
c40d7343efa60b18ad1ceb316eb337caeea79046cindi if (topo_fmri_getprop(thp, nvl, pp->group, pp->prop,
c40d7343efa60b18ad1ceb316eb337caeea79046cindi NULL, &pnvl, &err) < 0) {
c40d7343efa60b18ad1ceb316eb337caeea79046cindi (void) fprintf(stderr, "%s: failed to get "
c40d7343efa60b18ad1ceb316eb337caeea79046cindi "%s.%s: %s\n", g_pname,
c40d7343efa60b18ad1ceb316eb337caeea79046cindi pp->group, pp->prop,
c40d7343efa60b18ad1ceb316eb337caeea79046cindi topo_strerror(err));
c40d7343efa60b18ad1ceb316eb337caeea79046cindi continue;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi } else {
c40d7343efa60b18ad1ceb316eb337caeea79046cindi print_fmri_pgroup(thp, pp->group, pnvl);
c40d7343efa60b18ad1ceb316eb337caeea79046cindi print_prop_nameval(thp, pnvl);
c40d7343efa60b18ad1ceb316eb337caeea79046cindi nvlist_free(nvl);
c40d7343efa60b18ad1ceb316eb337caeea79046cindi }
c40d7343efa60b18ad1ceb316eb337caeea79046cindi } else {
c40d7343efa60b18ad1ceb316eb337caeea79046cindi set_prop(thp, NULL, nvl, pp);
c40d7343efa60b18ad1ceb316eb337caeea79046cindi }
c40d7343efa60b18ad1ceb316eb337caeea79046cindi }
c40d7343efa60b18ad1ceb316eb337caeea79046cindi}
c40d7343efa60b18ad1ceb316eb337caeea79046cindi
c40d7343efa60b18ad1ceb316eb337caeea79046cindivoid
c40d7343efa60b18ad1ceb316eb337caeea79046cindiprint_fmri(topo_hdl_t *thp, char *uuid)
c40d7343efa60b18ad1ceb316eb337caeea79046cindi{
c40d7343efa60b18ad1ceb316eb337caeea79046cindi int ret, err;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi nvlist_t *nvl;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi char buf[32];
c40d7343efa60b18ad1ceb316eb337caeea79046cindi time_t tod = time(NULL);
c40d7343efa60b18ad1ceb316eb337caeea79046cindi
c40d7343efa60b18ad1ceb316eb337caeea79046cindi if (topo_fmri_str2nvl(thp, g_fmri, &nvl, &err) < 0) {
c40d7343efa60b18ad1ceb316eb337caeea79046cindi (void) fprintf(stderr, "%s: failed to convert %s to nvlist: "
c40d7343efa60b18ad1ceb316eb337caeea79046cindi "%s\n", g_pname, g_fmri, topo_strerror(err));
c40d7343efa60b18ad1ceb316eb337caeea79046cindi return;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi }
c40d7343efa60b18ad1ceb316eb337caeea79046cindi
c40d7343efa60b18ad1ceb316eb337caeea79046cindi printf("TIME UUID\n");
c40d7343efa60b18ad1ceb316eb337caeea79046cindi (void) strftime(buf, sizeof (buf), "%b %d %T", localtime(&tod));
c40d7343efa60b18ad1ceb316eb337caeea79046cindi (void) printf("%-15s %-32s\n", buf, uuid);
c40d7343efa60b18ad1ceb316eb337caeea79046cindi (void) printf("\n");
c40d7343efa60b18ad1ceb316eb337caeea79046cindi
c40d7343efa60b18ad1ceb316eb337caeea79046cindi (void) printf("%s\n", (char *)g_fmri);
c40d7343efa60b18ad1ceb316eb337caeea79046cindi
c40d7343efa60b18ad1ceb316eb337caeea79046cindi if (opt_p && !(pcnt > 0 || opt_V || opt_all)) {
c40d7343efa60b18ad1ceb316eb337caeea79046cindi char *aname = NULL, *fname = NULL, *lname = NULL;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi nvlist_t *asru = NULL;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi nvlist_t *fru = NULL;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi
c40d7343efa60b18ad1ceb316eb337caeea79046cindi if (topo_fmri_asru(thp, nvl, &asru, &err) == 0)
c40d7343efa60b18ad1ceb316eb337caeea79046cindi (void) topo_fmri_nvl2str(thp, asru, &aname, &err);
c40d7343efa60b18ad1ceb316eb337caeea79046cindi if (topo_fmri_fru(thp, nvl, &fru, &err) == 0)
c40d7343efa60b18ad1ceb316eb337caeea79046cindi (void) topo_fmri_nvl2str(thp, fru, &fname, &err);
c40d7343efa60b18ad1ceb316eb337caeea79046cindi (void) topo_fmri_label(thp, nvl, &lname, &err);
c40d7343efa60b18ad1ceb316eb337caeea79046cindi
c40d7343efa60b18ad1ceb316eb337caeea79046cindi nvlist_free(fru);
c40d7343efa60b18ad1ceb316eb337caeea79046cindi nvlist_free(asru);
c40d7343efa60b18ad1ceb316eb337caeea79046cindi
c40d7343efa60b18ad1ceb316eb337caeea79046cindi if (aname != NULL) {
c40d7343efa60b18ad1ceb316eb337caeea79046cindi (void) printf("\tASRU: %s\n", aname);
c40d7343efa60b18ad1ceb316eb337caeea79046cindi topo_hdl_strfree(thp, aname);
c40d7343efa60b18ad1ceb316eb337caeea79046cindi } else {
c40d7343efa60b18ad1ceb316eb337caeea79046cindi (void) printf("\tASRU: -\n");
c40d7343efa60b18ad1ceb316eb337caeea79046cindi }
c40d7343efa60b18ad1ceb316eb337caeea79046cindi if (fname != NULL) {
c40d7343efa60b18ad1ceb316eb337caeea79046cindi (void) printf("\tFRU: %s\n", fname);
c40d7343efa60b18ad1ceb316eb337caeea79046cindi topo_hdl_strfree(thp, fname);
c40d7343efa60b18ad1ceb316eb337caeea79046cindi } else {
c40d7343efa60b18ad1ceb316eb337caeea79046cindi (void) printf("\tFRU: -\n");
c40d7343efa60b18ad1ceb316eb337caeea79046cindi }
c40d7343efa60b18ad1ceb316eb337caeea79046cindi if (lname != NULL) {
c40d7343efa60b18ad1ceb316eb337caeea79046cindi (void) printf("\tLabel: %s\n", lname);
c40d7343efa60b18ad1ceb316eb337caeea79046cindi topo_hdl_strfree(thp, lname);
c40d7343efa60b18ad1ceb316eb337caeea79046cindi } else {
c40d7343efa60b18ad1ceb316eb337caeea79046cindi (void) printf("\tLabel: -\n");
c40d7343efa60b18ad1ceb316eb337caeea79046cindi }
c40d7343efa60b18ad1ceb316eb337caeea79046cindi }
c40d7343efa60b18ad1ceb316eb337caeea79046cindi
c40d7343efa60b18ad1ceb316eb337caeea79046cindi if (opt_S) {
c40d7343efa60b18ad1ceb316eb337caeea79046cindi if (topo_fmri_str2nvl(thp, g_fmri, &nvl, &err) < 0) {
c40d7343efa60b18ad1ceb316eb337caeea79046cindi (void) printf("\tPresent: -\n");
c40d7343efa60b18ad1ceb316eb337caeea79046cindi (void) printf("\tUnusable: -\n");
c40d7343efa60b18ad1ceb316eb337caeea79046cindi return;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi }
c40d7343efa60b18ad1ceb316eb337caeea79046cindi
c40d7343efa60b18ad1ceb316eb337caeea79046cindi if ((ret = topo_fmri_present(thp, nvl, &err)) < 0)
c40d7343efa60b18ad1ceb316eb337caeea79046cindi (void) printf("\tPresent: -\n");
c40d7343efa60b18ad1ceb316eb337caeea79046cindi else
c40d7343efa60b18ad1ceb316eb337caeea79046cindi (void) printf("\tPresent: %s\n",
c40d7343efa60b18ad1ceb316eb337caeea79046cindi ret ? "true" : "false");
c40d7343efa60b18ad1ceb316eb337caeea79046cindi
c40d7343efa60b18ad1ceb316eb337caeea79046cindi if ((ret = topo_fmri_unusable(thp, nvl, &err)) < 0)
c40d7343efa60b18ad1ceb316eb337caeea79046cindi (void) printf("\tUnusable: -\n");
c40d7343efa60b18ad1ceb316eb337caeea79046cindi else
c40d7343efa60b18ad1ceb316eb337caeea79046cindi (void) printf("\tUnusable: %s\n",
c40d7343efa60b18ad1ceb316eb337caeea79046cindi ret ? "true" : "false");
c40d7343efa60b18ad1ceb316eb337caeea79046cindi
c40d7343efa60b18ad1ceb316eb337caeea79046cindi nvlist_free(nvl);
c40d7343efa60b18ad1ceb316eb337caeea79046cindi }
c40d7343efa60b18ad1ceb316eb337caeea79046cindi
c40d7343efa60b18ad1ceb316eb337caeea79046cindi if (pcnt > 0)
c40d7343efa60b18ad1ceb316eb337caeea79046cindi print_fmri_props(thp, nvl);
c40d7343efa60b18ad1ceb316eb337caeea79046cindi}
c40d7343efa60b18ad1ceb316eb337caeea79046cindi
c40d7343efa60b18ad1ceb316eb337caeea79046cindiint
c40d7343efa60b18ad1ceb316eb337caeea79046cindifmtopo_exit(topo_hdl_t *thp, char *uuid, int err)
c40d7343efa60b18ad1ceb316eb337caeea79046cindi{
c40d7343efa60b18ad1ceb316eb337caeea79046cindi if (uuid != NULL)
c40d7343efa60b18ad1ceb316eb337caeea79046cindi topo_hdl_strfree(thp, uuid);
c40d7343efa60b18ad1ceb316eb337caeea79046cindi
c40d7343efa60b18ad1ceb316eb337caeea79046cindi if (thp != NULL) {
c40d7343efa60b18ad1ceb316eb337caeea79046cindi topo_snap_release(thp);
c40d7343efa60b18ad1ceb316eb337caeea79046cindi topo_close(thp);
c40d7343efa60b18ad1ceb316eb337caeea79046cindi }
c40d7343efa60b18ad1ceb316eb337caeea79046cindi
c40d7343efa60b18ad1ceb316eb337caeea79046cindi if (pargs) {
c40d7343efa60b18ad1ceb316eb337caeea79046cindi int i;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi for (i = 0; i < pcnt; ++i)
c40d7343efa60b18ad1ceb316eb337caeea79046cindi free(pargs[i]);
c40d7343efa60b18ad1ceb316eb337caeea79046cindi free(pargs);
c40d7343efa60b18ad1ceb316eb337caeea79046cindi }
c40d7343efa60b18ad1ceb316eb337caeea79046cindi
c40d7343efa60b18ad1ceb316eb337caeea79046cindi return (err);
c40d7343efa60b18ad1ceb316eb337caeea79046cindi}
c40d7343efa60b18ad1ceb316eb337caeea79046cindi
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindiint
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindimain(int argc, char *argv[])
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi{
c40d7343efa60b18ad1ceb316eb337caeea79046cindi topo_hdl_t *thp = NULL;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi char *uuid = NULL;
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi int c, err = 0;
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi g_pname = argv[0];
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi while (optind < argc) {
c40d7343efa60b18ad1ceb316eb337caeea79046cindi while ((c = getopt(argc, argv, optstr)) != -1) {
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi switch (c) {
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi case 'C':
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi atexit(abort);
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi break;
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi case 'd':
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi opt_d++;
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi break;
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi case 'e':
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi opt_e++;
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi break;
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi case 'P':
c40d7343efa60b18ad1ceb316eb337caeea79046cindi pcnt++;
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi break;
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi case 'p':
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi opt_p++;
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi break;
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi case 'V':
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi opt_V++;
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi break;
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi case 'R':
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi opt_R = optarg;
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi break;
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi case 's':
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi opt_s = optarg;
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi break;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi case 'S':
c40d7343efa60b18ad1ceb316eb337caeea79046cindi opt_S++;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi break;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi case 't':
c40d7343efa60b18ad1ceb316eb337caeea79046cindi opt_t++;
c40d7343efa60b18ad1ceb316eb337caeea79046cindi break;
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi case 'x':
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi opt_x++;
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi break;
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi default:
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi return (usage(stderr));
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi }
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi }
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi if (optind < argc) {
c40d7343efa60b18ad1ceb316eb337caeea79046cindi if (g_fmri != NULL) {
c40d7343efa60b18ad1ceb316eb337caeea79046cindi (void) fprintf(stderr, "%s: illegal argument "
c40d7343efa60b18ad1ceb316eb337caeea79046cindi "-- %s\n", g_pname, argv[optind]);
c40d7343efa60b18ad1ceb316eb337caeea79046cindi return (FMTOPO_EXIT_USAGE);
c40d7343efa60b18ad1ceb316eb337caeea79046cindi } else {
c40d7343efa60b18ad1ceb316eb337caeea79046cindi g_fmri = argv[optind++];
c40d7343efa60b18ad1ceb316eb337caeea79046cindi }
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi }
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi }
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi
c40d7343efa60b18ad1ceb316eb337caeea79046cindi if (pcnt > 0)
c40d7343efa60b18ad1ceb316eb337caeea79046cindi get_pargs(argc, argv);
c40d7343efa60b18ad1ceb316eb337caeea79046cindi
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi if ((thp = topo_open(TOPO_VERSION, opt_R, &err)) == NULL) {
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi (void) fprintf(stderr, "%s: failed to open topology tree: %s\n",
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi g_pname, topo_strerror(err));
c40d7343efa60b18ad1ceb316eb337caeea79046cindi return (fmtopo_exit(thp, uuid, FMTOPO_EXIT_ERROR));
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi }
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi if (opt_d)
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi topo_debug_set(thp, "module", "stderr");
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi if ((uuid = topo_snap_hold(thp, NULL, &err)) == NULL) {
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi (void) fprintf(stderr, "%s: failed to snapshot topology: %s\n",
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi g_pname, topo_strerror(err));
c40d7343efa60b18ad1ceb316eb337caeea79046cindi return (fmtopo_exit(thp, uuid, FMTOPO_EXIT_ERROR));
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi } else if (err != 0) {
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi (void) fprintf(stderr, "%s: topology snapshot incomplete\n",
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi g_pname);
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi }
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi if (opt_x) {
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi err = 0;
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi if (topo_xml_print(thp, stdout, opt_s, &err) < 0)
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi (void) fprintf(stderr, "%s: failed to print xml "
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi "formatted topology:%s", g_pname,
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi topo_strerror(err));
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi
c40d7343efa60b18ad1ceb316eb337caeea79046cindi return (fmtopo_exit(thp, uuid, err ? FMTOPO_EXIT_ERROR :
c40d7343efa60b18ad1ceb316eb337caeea79046cindi FMTOPO_EXIT_SUCCESS));
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi }
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi
c40d7343efa60b18ad1ceb316eb337caeea79046cindi if (opt_t || walk_topo(thp, uuid) < 0) {
c40d7343efa60b18ad1ceb316eb337caeea79046cindi if (g_fmri != NULL)
c40d7343efa60b18ad1ceb316eb337caeea79046cindi /*
c40d7343efa60b18ad1ceb316eb337caeea79046cindi * Try getting some useful information
c40d7343efa60b18ad1ceb316eb337caeea79046cindi */
c40d7343efa60b18ad1ceb316eb337caeea79046cindi print_fmri(thp, uuid);
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi
c40d7343efa60b18ad1ceb316eb337caeea79046cindi return (fmtopo_exit(thp, uuid, FMTOPO_EXIT_ERROR));
0eb822a1c0c2bea495647510b75f77f0e57633ebcindi }
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi topo_hdl_strfree(thp, uuid);
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi return (FMTOPO_EXIT_SUCCESS);
7aec1d6e253b21f9e9b7ef68b4d81ab9859b51fecindi}