Print this page
patch tsoome-feedback


  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,