int topo_prop_getpgrp(tnode_t *node, const char *pgname, nvlist_t **pgrp, int *err) { int ret; topo_hdl_t *thp = node->tn_hdl; nvlist_t *nvl, *pvnvl; topo_pgroup_t *pg; topo_propval_t *pv; topo_proplist_t *pvl; if (topo_hdl_nvalloc(thp, &nvl, 0) != 0) { *err = ETOPO_NOMEM; return (-1); } topo_node_lock(node); for (pg = topo_list_next(&node->tn_pgroups); pg != NULL; pg = topo_list_next(pg)) { if (strcmp(pgname, pg->tpg_info->tpi_name) != 0) continue; if (nvlist_add_string(nvl, TOPO_PROP_GROUP_NAME, pg->tpg_info->tpi_name) != 0 || nvlist_add_string(nvl, TOPO_PROP_GROUP_NSTAB, topo_stability2name(pg->tpg_info->tpi_namestab)) != 0 || nvlist_add_string(nvl, TOPO_PROP_GROUP_DSTAB, topo_stability2name(pg->tpg_info->tpi_datastab)) != 0 || nvlist_add_int32(nvl, TOPO_PROP_GROUP_VERSION, pg->tpg_info->tpi_version) != 0) return (get_pgrp_seterror(node, nvl, err, ETOPO_PROP_NVL)); for (pvl = topo_list_next(&pg->tpg_pvals); pvl != NULL; pvl = topo_list_next(pvl)) { pv = pvl->tp_pval; if (prop_val_add(node, &pvnvl, pv, err) < 0) { return (get_pgrp_seterror(node, nvl, err, *err)); } if ((ret = nvlist_add_nvlist(nvl, TOPO_PROP_VAL, pvnvl)) != 0) { nvlist_free(pvnvl); return (get_pgrp_seterror(node, nvl, err, ret)); } nvlist_free(pvnvl); } topo_node_unlock(node); *pgrp = nvl; return (0); } topo_node_unlock(node); *err = ETOPO_PROP_NOENT; return (-1); }
static void print_pgroup(topo_hdl_t *thp, tnode_t *node, const char *pgn, char *dstab, char *nstab, int32_t version) { int err; char buf[30]; topo_pgroup_info_t *pgi = NULL; if (pgn == NULL) return; if (node != NULL && (dstab == NULL || nstab == NULL || version == -1)) { if ((pgi = topo_pgroup_info(node, pgn, &err)) != NULL) { dstab = (char *)topo_stability2name(pgi->tpi_datastab); nstab = (char *)topo_stability2name(pgi->tpi_namestab); version = pgi->tpi_version; } } if (dstab == NULL || nstab == NULL || version == -1) { (void) printf(" group: %-30s version: - stability: -/-\n", pgn); } else if (!opt_V && strlen(pgn) > 30) { (void) snprintf(buf, 26, "%s", pgn); (void) snprintf(&buf[27], 4, "%s", DOTS); (void) printf(" group: %-30s version: %-3d stability: %s/%s\n", buf, version, nstab, dstab); } else { (void) printf(" group: %-30s version: %-3d stability: %s/%s\n", pgn, version, nstab, dstab); } if (pgi != NULL) { topo_hdl_strfree(thp, (char *)pgi->tpi_name); topo_hdl_free(thp, pgi, sizeof (topo_pgroup_info_t)); } }