57 * - retire
58 * - unretire
59 *
60 * In addition, the following operations are supported per-FMRI:
61 *
62 * - str2nvl: convert string-based FMRI to nvlist
63 * - compare: compare two FMRIs
64 * - asru: lookup associated ASRU property by FMRI
65 * - fru: lookup associated FRU by FMRI
66 * - create: an FMRI nvlist by scheme type
67 * - propery lookup
68 *
69 * These routines may only be called by consumers of a topology snapshot.
70 * They may not be called by libtopo enumerator or method modules.
71 */
72
73 /*ARGSUSED*/
74 static int
75 set_error(topo_hdl_t *thp, int err, int *errp, char *method, nvlist_t *nvlp)
76 {
77 if (nvlp != NULL)
78 nvlist_free(nvlp);
79
80 topo_dprintf(thp, TOPO_DBG_ERR, "%s failed: %s\n", method,
81 topo_strerror(err));
82
83 *errp = err;
84 return (-1);
85 }
86
87 /*ARGSUSED*/
88 static nvlist_t *
89 set_nverror(topo_hdl_t *thp, int err, int *errp, char *method, nvlist_t *nvlp)
90 {
91 if (nvlp != NULL)
92 nvlist_free(nvlp);
93
94 topo_dprintf(thp, TOPO_DBG_ERR, "%s failed: %s\n", method,
95 topo_strerror(err));
96
97 *errp = err;
98 return (NULL);
99 }
100
101 int
102 topo_fmri_nvl2str(topo_hdl_t *thp, nvlist_t *fmri, char **fmristr, int *err)
103 {
104 char *scheme, *str;
105 nvlist_t *out = NULL;
106 tnode_t *rnode;
107
108 if (nvlist_lookup_string(fmri, FM_FMRI_SCHEME, &scheme) != 0)
109 return (set_error(thp, ETOPO_FMRI_MALFORM, err,
110 TOPO_METH_NVL2STR, out));
111
576 if (topo_hdl_nvalloc(thp, &in, NV_UNIQUE_NAME) != 0)
577 return (set_error(thp, ETOPO_FMRI_NVL, err,
578 TOPO_METH_PROP_SET, in));
579
580 rv = nvlist_add_nvlist(in, TOPO_PROP_RESOURCE, nvl);
581 rv |= nvlist_add_string(in, TOPO_PROP_GROUP, pg);
582 rv |= nvlist_add_nvlist(in, TOPO_PROP_VAL, prop);
583 rv |= nvlist_add_int32(in, TOPO_PROP_FLAG, (int32_t)flag);
584 if (args != NULL)
585 rv |= nvlist_add_nvlist(in, TOPO_PROP_PARGS, args);
586 if (rv != 0)
587 return (set_error(thp, ETOPO_FMRI_NVL, err,
588 TOPO_METH_PROP_SET, in));
589
590 rv = topo_method_invoke(rnode, TOPO_METH_PROP_SET,
591 TOPO_METH_PROP_SET_VERSION, in, &out, err);
592
593 nvlist_free(in);
594
595 /* no return values */
596 if (out != NULL)
597 nvlist_free(out);
598
599 if (rv)
600 return (-1);
601
602 return (0);
603
604 }
605
606 int
607 topo_fmri_getpgrp(topo_hdl_t *thp, nvlist_t *rsrc, const char *pgname,
608 nvlist_t **pgroup, int *err)
609 {
610 int rv;
611 nvlist_t *in = NULL;
612 tnode_t *rnode;
613 char *scheme;
614
615 if (nvlist_lookup_string(rsrc, FM_FMRI_SCHEME, &scheme) != 0)
616 return (set_error(thp, ETOPO_FMRI_MALFORM, err,
|
57 * - retire
58 * - unretire
59 *
60 * In addition, the following operations are supported per-FMRI:
61 *
62 * - str2nvl: convert string-based FMRI to nvlist
63 * - compare: compare two FMRIs
64 * - asru: lookup associated ASRU property by FMRI
65 * - fru: lookup associated FRU by FMRI
66 * - create: an FMRI nvlist by scheme type
67 * - propery lookup
68 *
69 * These routines may only be called by consumers of a topology snapshot.
70 * They may not be called by libtopo enumerator or method modules.
71 */
72
73 /*ARGSUSED*/
74 static int
75 set_error(topo_hdl_t *thp, int err, int *errp, char *method, nvlist_t *nvlp)
76 {
77 nvlist_free(nvlp);
78
79 topo_dprintf(thp, TOPO_DBG_ERR, "%s failed: %s\n", method,
80 topo_strerror(err));
81
82 *errp = err;
83 return (-1);
84 }
85
86 /*ARGSUSED*/
87 static nvlist_t *
88 set_nverror(topo_hdl_t *thp, int err, int *errp, char *method, nvlist_t *nvlp)
89 {
90 nvlist_free(nvlp);
91
92 topo_dprintf(thp, TOPO_DBG_ERR, "%s failed: %s\n", method,
93 topo_strerror(err));
94
95 *errp = err;
96 return (NULL);
97 }
98
99 int
100 topo_fmri_nvl2str(topo_hdl_t *thp, nvlist_t *fmri, char **fmristr, int *err)
101 {
102 char *scheme, *str;
103 nvlist_t *out = NULL;
104 tnode_t *rnode;
105
106 if (nvlist_lookup_string(fmri, FM_FMRI_SCHEME, &scheme) != 0)
107 return (set_error(thp, ETOPO_FMRI_MALFORM, err,
108 TOPO_METH_NVL2STR, out));
109
574 if (topo_hdl_nvalloc(thp, &in, NV_UNIQUE_NAME) != 0)
575 return (set_error(thp, ETOPO_FMRI_NVL, err,
576 TOPO_METH_PROP_SET, in));
577
578 rv = nvlist_add_nvlist(in, TOPO_PROP_RESOURCE, nvl);
579 rv |= nvlist_add_string(in, TOPO_PROP_GROUP, pg);
580 rv |= nvlist_add_nvlist(in, TOPO_PROP_VAL, prop);
581 rv |= nvlist_add_int32(in, TOPO_PROP_FLAG, (int32_t)flag);
582 if (args != NULL)
583 rv |= nvlist_add_nvlist(in, TOPO_PROP_PARGS, args);
584 if (rv != 0)
585 return (set_error(thp, ETOPO_FMRI_NVL, err,
586 TOPO_METH_PROP_SET, in));
587
588 rv = topo_method_invoke(rnode, TOPO_METH_PROP_SET,
589 TOPO_METH_PROP_SET_VERSION, in, &out, err);
590
591 nvlist_free(in);
592
593 /* no return values */
594 nvlist_free(out);
595
596 if (rv)
597 return (-1);
598
599 return (0);
600
601 }
602
603 int
604 topo_fmri_getpgrp(topo_hdl_t *thp, nvlist_t *rsrc, const char *pgname,
605 nvlist_t **pgroup, int *err)
606 {
607 int rv;
608 nvlist_t *in = NULL;
609 tnode_t *rnode;
610 char *scheme;
611
612 if (nvlist_lookup_string(rsrc, FM_FMRI_SCHEME, &scheme) != 0)
613 return (set_error(thp, ETOPO_FMRI_MALFORM, err,
|