Print this page
OS-2031 fmtopo -P flag does not appear to set properties

*** 19,28 **** --- 19,29 ---- * CDDL HEADER END */ /* * Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013, Joyent, Inc. All rights reserved. */ #include <sys/fm/protocol.h> #include <fm/libtopo.h>
*** 595,628 **** static void set_prop(topo_hdl_t *thp, tnode_t *node, nvlist_t *fmri, struct prop_args *pp) { int ret, err = 0; topo_type_t type; ! nvlist_t *nvl, *f = NULL; char *end; if (pp->prop == NULL || pp->type == NULL || pp->value == NULL) ! return; if ((type = str2type(pp->type)) == TOPO_TYPE_INVALID) { (void) fprintf(stderr, "%s: invalid property type %s for %s\n", g_pname, pp->type, pp->prop); ! return; } if (nvlist_alloc(&nvl, NV_UNIQUE_NAME, 0) != 0) { (void) fprintf(stderr, "%s: nvlist allocation failed for " "%s=%s:%s\n", g_pname, pp->prop, pp->type, pp->value); ! return; } ret = nvlist_add_string(nvl, TOPO_PROP_VAL_NAME, pp->prop); ret |= nvlist_add_uint32(nvl, TOPO_PROP_VAL_TYPE, type); if (ret != 0) { (void) fprintf(stderr, "%s: invalid property type %s for %s\n", g_pname, pp->type, pp->prop); ! nvlist_free(nvl); ! return; } errno = 0; switch (type) { case TOPO_TYPE_INT32: --- 596,628 ---- static void set_prop(topo_hdl_t *thp, tnode_t *node, nvlist_t *fmri, struct prop_args *pp) { int ret, err = 0; topo_type_t type; ! nvlist_t *nvl = NULL; char *end; if (pp->prop == NULL || pp->type == NULL || pp->value == NULL) ! goto out; if ((type = str2type(pp->type)) == TOPO_TYPE_INVALID) { (void) fprintf(stderr, "%s: invalid property type %s for %s\n", g_pname, pp->type, pp->prop); ! goto out; } if (nvlist_alloc(&nvl, NV_UNIQUE_NAME, 0) != 0) { (void) fprintf(stderr, "%s: nvlist allocation failed for " "%s=%s:%s\n", g_pname, pp->prop, pp->type, pp->value); ! goto out; } ret = nvlist_add_string(nvl, TOPO_PROP_VAL_NAME, pp->prop); ret |= nvlist_add_uint32(nvl, TOPO_PROP_VAL_TYPE, type); if (ret != 0) { (void) fprintf(stderr, "%s: invalid property type %s for %s\n", g_pname, pp->type, pp->prop); ! goto out; } errno = 0; switch (type) { case TOPO_TYPE_INT32:
*** 679,758 **** pp->value); break; } case TOPO_TYPE_FMRI: { ! if ((ret = topo_fmri_str2nvl(thp, pp->value, &f, &err)) ! < 0) break; if ((ret = nvlist_add_nvlist(nvl, TOPO_PROP_VAL_VAL, ! f)) != 0) err = ETOPO_PROP_NVL; break; } default: ret = -1; } if (ret != 0) { (void) fprintf(stderr, "%s: unable to set property value for " "%s: %s\n", g_pname, pp->prop, topo_strerror(err)); ! nvlist_free(nvl); ! return; } if (node != NULL) { ! if (topo_prop_setprop(node, pp->group, nvl, TOPO_PROP_MUTABLE, ! f, &ret) < 0) { (void) fprintf(stderr, "%s: unable to set property " "value for " "%s=%s:%s: %s\n", g_pname, pp->prop, ! pp->type, pp->value, topo_strerror(ret)); ! nvlist_free(nvl); ! nvlist_free(f); ! return; } } else { ! if (topo_fmri_setprop(thp, fmri, pp->group, nvl, ! TOPO_PROP_MUTABLE, f, &ret) < 0) { (void) fprintf(stderr, "%s: unable to set property " "value for " "%s=%s:%s: %s\n", g_pname, pp->prop, ! pp->type, pp->value, topo_strerror(ret)); ! nvlist_free(nvl); ! nvlist_free(f); ! return; } } nvlist_free(nvl); /* * Now, get the property back for printing */ if (node != NULL) { ! if (topo_prop_getprop(node, pp->group, pp->prop, f, &nvl, ! &err) < 0) { (void) fprintf(stderr, "%s: failed to get %s.%s: %s\n", g_pname, pp->group, pp->prop, topo_strerror(err)); ! nvlist_free(f); ! return; } } else { ! if (topo_fmri_getprop(thp, fmri, pp->group, pp->prop, ! f, &nvl, &err) < 0) { (void) fprintf(stderr, "%s: failed to get %s.%s: %s\n", g_pname, pp->group, pp->prop, topo_strerror(err)); ! nvlist_free(f); ! return; } } print_pgroup(thp, node, pp->group, NULL, NULL, 0); print_prop_nameval(thp, node, nvl); - nvlist_free(nvl); ! nvlist_free(f); } static void print_props(topo_hdl_t *thp, tnode_t *node) { --- 679,756 ---- pp->value); break; } case TOPO_TYPE_FMRI: { ! nvlist_t *val = NULL; ! ! if ((ret = topo_fmri_str2nvl(thp, pp->value, &val, ! &err)) < 0) break; if ((ret = nvlist_add_nvlist(nvl, TOPO_PROP_VAL_VAL, ! val)) != 0) err = ETOPO_PROP_NVL; + + nvlist_free(val); break; } default: ret = -1; } if (ret != 0) { (void) fprintf(stderr, "%s: unable to set property value for " "%s: %s\n", g_pname, pp->prop, topo_strerror(err)); ! goto out; } if (node != NULL) { ! if ((ret = topo_prop_setprop(node, pp->group, nvl, ! TOPO_PROP_MUTABLE, nvl, &err)) < 0) { (void) fprintf(stderr, "%s: unable to set property " "value for " "%s=%s:%s: %s\n", g_pname, pp->prop, ! pp->type, pp->value, topo_strerror(err)); ! goto out; } } else { ! if ((ret = topo_fmri_setprop(thp, fmri, pp->group, nvl, ! TOPO_PROP_MUTABLE, nvl, &err)) < 0) { (void) fprintf(stderr, "%s: unable to set property " "value for " "%s=%s:%s: %s\n", g_pname, pp->prop, ! pp->type, pp->value, topo_strerror(err)); ! goto out; } } nvlist_free(nvl); + nvl = NULL; /* * Now, get the property back for printing */ if (node != NULL) { ! if ((ret = topo_prop_getprop(node, pp->group, pp->prop, NULL, ! &nvl, &err)) < 0) { (void) fprintf(stderr, "%s: failed to get %s.%s: %s\n", g_pname, pp->group, pp->prop, topo_strerror(err)); ! goto out; } } else { ! if ((ret = topo_fmri_getprop(thp, fmri, pp->group, pp->prop, ! NULL, &nvl, &err)) < 0) { (void) fprintf(stderr, "%s: failed to get %s.%s: %s\n", g_pname, pp->group, pp->prop, topo_strerror(err)); ! goto out; } } print_pgroup(thp, node, pp->group, NULL, NULL, 0); print_prop_nameval(thp, node, nvl); ! out: ! nvlist_free(nvl); } static void print_props(topo_hdl_t *thp, tnode_t *node) {