components/visual-panels/smf/src/cmd/rad/mod/smf/common.c
changeset 901 19b502ccabc8
parent 827 0944d8c0158b
equal deleted inserted replaced
900:63d3bf696d85 901:19b502ccabc8
    34 #include "datatype.h"
    34 #include "datatype.h"
    35 
    35 
    36 /*ARGSUSED*/
    36 /*ARGSUSED*/
    37 conerr_t
    37 conerr_t
    38 interface_Entity_read_fmri(rad_instance_t *inst, adr_attribute_t *attr,
    38 interface_Entity_read_fmri(rad_instance_t *inst, adr_attribute_t *attr,
    39     data_t **data, data_t **error)
    39     adr_data_t **data, adr_data_t **error)
    40 {
    40 {
    41 	smfobj_t *smfo = instance_getdata(inst);
    41 	smfobj_t *smfo = instance_getdata(inst);
    42 	*data = data_new_string(smfo->fmri, lt_copy);
    42 	*data = adr_data_new_string(smfo->fmri, LT_COPY);
    43 	return (*data == NULL ? ce_nomem : ce_ok);
    43 	return (*data == NULL ? ce_nomem : ce_ok);
    44 }
    44 }
    45 
    45 
    46 /*ARGSUSED*/
    46 /*ARGSUSED*/
    47 conerr_t
    47 conerr_t
    48 interface_Entity_read_scope(rad_instance_t *inst, adr_attribute_t *attr,
    48 interface_Entity_read_scope(rad_instance_t *inst, adr_attribute_t *attr,
    49     data_t **data, data_t **error)
    49     adr_data_t **data, adr_data_t **error)
    50 {
    50 {
    51 	*data = data_new_string("localhost", lt_const);
    51 	*data = adr_data_new_string("localhost", LT_CONST);
    52 	return (*data == NULL ? ce_nomem : ce_ok);
    52 	return (*data == NULL ? ce_nomem : ce_ok);
    53 }
    53 }
    54 
    54 
    55 /*ARGSUSED*/
    55 /*ARGSUSED*/
    56 conerr_t
    56 conerr_t
    57 interface_Entity_read_service(rad_instance_t *inst, adr_attribute_t *attr,
    57 interface_Entity_read_service(rad_instance_t *inst, adr_attribute_t *attr,
    58     data_t **data, data_t **error)
    58     adr_data_t **data, adr_data_t **error)
    59 {
    59 {
    60 	smfobj_t *smfo = instance_getdata(inst);
    60 	smfobj_t *smfo = instance_getdata(inst);
    61 	*data = data_new_string(smfo->sname, lt_copy);
    61 	*data = adr_data_new_string(smfo->sname, LT_COPY);
    62 	return (*data == NULL ? ce_nomem : ce_ok);
    62 	return (*data == NULL ? ce_nomem : ce_ok);
    63 }
    63 }
    64 
    64 
    65 
    65 
    66 /*
    66 /*
    73  * property group isn't of interest and should be skipped.
    73  * property group isn't of interest and should be skipped.
    74  */
    74  */
    75 
    75 
    76 struct pgargs {
    76 struct pgargs {
    77 	smfobj_t *smfo;
    77 	smfobj_t *smfo;
    78 	type_t *type;
    78 	adr_type_t *type;
    79 	const char *pgtype;
    79 	const char *pgtype;
    80 	svcerr_t (*cb)(scf_handle_t *, scf_propertygroup_t *, data_t **);
    80 	svcerr_t (*cb)(scf_handle_t *, scf_propertygroup_t *, adr_data_t **);
    81 };
    81 };
    82 
    82 
    83 /*ARGSUSED*/
    83 /*ARGSUSED*/
    84 static svcerr_t
    84 static svcerr_t
    85 rt_collect_pgs(scf_handle_t *h, void *arg, data_t **ret, data_t **error)
    85 rt_collect_pgs(scf_handle_t *h, void *arg, adr_data_t **ret, adr_data_t **error)
    86 {
    86 {
    87 	struct pgargs *pga = arg;
    87 	struct pgargs *pga = arg;
    88 	smfobj_t *smfo = pga->smfo;
    88 	smfobj_t *smfo = pga->smfo;
    89 	smfu_entity_t entity = SMFU_ENTITY_INIT;
    89 	smfu_entity_t entity = SMFU_ENTITY_INIT;
    90 	svcerr_t se = SE_OK;
    90 	svcerr_t se = SE_OK;
    91 	data_t *result = data_new_array(pga->type, 5);
    91 	adr_data_t *result = adr_data_new_array(pga->type, 5);
    92 	scf_propertygroup_t *pg = scf_pg_create(h);
    92 	scf_propertygroup_t *pg = scf_pg_create(h);
    93 	scf_iter_t *iter = scf_iter_create(h);
    93 	scf_iter_t *iter = scf_iter_create(h);
    94 
    94 
    95 	if (pg == NULL || iter == NULL) {
    95 	if (pg == NULL || iter == NULL) {
    96 		se = SE_FATAL;
    96 		se = SE_FATAL;
   103 	if ((se = smfu_iter_pg_r(h, &entity, pga->pgtype, iter)) != SE_OK)
   103 	if ((se = smfu_iter_pg_r(h, &entity, pga->pgtype, iter)) != SE_OK)
   104 		goto done;
   104 		goto done;
   105 
   105 
   106 	int err;
   106 	int err;
   107 	while ((err = scf_iter_next_pg(iter, pg)) > 0) {
   107 	while ((err = scf_iter_next_pg(iter, pg)) > 0) {
   108 		data_t *item = NULL;
   108 		adr_data_t *item = NULL;
   109 		se = pga->cb(h, pg, &item);
   109 		se = pga->cb(h, pg, &item);
   110 		if (se == SE_OK)
   110 		if (se == SE_OK)
   111 			(void) array_add(result, item);
   111 			(void) adr_array_add(result, item);
   112 		else if (se != SE_NOTFOUND)
   112 		else if (se != SE_NOTFOUND)
   113 			goto done;
   113 			goto done;
   114 	}
   114 	}
   115 	se = (err != 0) ? smfu_maperr(scf_error()) : SE_OK;
   115 	se = (err != 0) ? smfu_maperr(scf_error()) : SE_OK;
   116 
   116 
   124 }
   124 }
   125 
   125 
   126 /*ARGSUSED*/
   126 /*ARGSUSED*/
   127 conerr_t
   127 conerr_t
   128 interface_Entity_read_dependencies(rad_instance_t *inst, adr_attribute_t *attr,
   128 interface_Entity_read_dependencies(rad_instance_t *inst, adr_attribute_t *attr,
   129     data_t **data, data_t **error)
   129     adr_data_t **data, adr_data_t **error)
   130 {
   130 {
   131 	struct pgargs pga = {
   131 	struct pgargs pga = {
   132 		.smfo = instance_getdata(inst),
   132 		.smfo = instance_getdata(inst),
   133 		.type = &t_array__Dependency,
   133 		.type = &t_array__Dependency,
   134 		.pgtype = SCF_GROUP_DEPENDENCY,
   134 		.pgtype = SCF_GROUP_DEPENDENCY,
   138 }
   138 }
   139 
   139 
   140 /*ARGSUSED*/
   140 /*ARGSUSED*/
   141 conerr_t
   141 conerr_t
   142 interface_Entity_read_manpages(rad_instance_t *inst, adr_attribute_t *attr,
   142 interface_Entity_read_manpages(rad_instance_t *inst, adr_attribute_t *attr,
   143     data_t **data, data_t **error)
   143     adr_data_t **data, adr_data_t **error)
   144 {
   144 {
   145 	struct pgargs pga = {
   145 	struct pgargs pga = {
   146 		.smfo = instance_getdata(inst),
   146 		.smfo = instance_getdata(inst),
   147 		.type = &t_array__Manpage,
   147 		.type = &t_array__Manpage,
   148 		.pgtype = SCF_GROUP_TEMPLATE,
   148 		.pgtype = SCF_GROUP_TEMPLATE,
   152 }
   152 }
   153 
   153 
   154 /*ARGSUSED*/
   154 /*ARGSUSED*/
   155 conerr_t
   155 conerr_t
   156 interface_Entity_read_doclinks(rad_instance_t *inst, adr_attribute_t *attr,
   156 interface_Entity_read_doclinks(rad_instance_t *inst, adr_attribute_t *attr,
   157     data_t **data, data_t **error)
   157     adr_data_t **data, adr_data_t **error)
   158 {
   158 {
   159 	struct pgargs pga = {
   159 	struct pgargs pga = {
   160 		.smfo = instance_getdata(inst),
   160 		.smfo = instance_getdata(inst),
   161 		.type = &t_array__Doclink,
   161 		.type = &t_array__Doclink,
   162 		.pgtype = SCF_GROUP_TEMPLATE,
   162 		.pgtype = SCF_GROUP_TEMPLATE,
   165 	return (smfu_rtrun(rt_collect_pgs, &pga, data, error));
   165 	return (smfu_rtrun(rt_collect_pgs, &pga, data, error));
   166 }
   166 }
   167 
   167 
   168 /*ARGSUSED*/
   168 /*ARGSUSED*/
   169 static svcerr_t
   169 static svcerr_t
   170 rt_read_pgs(scf_handle_t *h, void *arg, data_t **ret, data_t **error)
   170 rt_read_pgs(scf_handle_t *h, void *arg, adr_data_t **ret, adr_data_t **error)
   171 {
   171 {
   172 	smfobj_t *smfo = arg;
   172 	smfobj_t *smfo = arg;
   173 	svcerr_t se = SE_OK;
   173 	svcerr_t se = SE_OK;
   174 	smfu_entity_t entity = SMFU_ENTITY_INIT;
   174 	smfu_entity_t entity = SMFU_ENTITY_INIT;
   175 
   175 
   176 	scf_propertygroup_t *pg = scf_pg_create(h);
   176 	scf_propertygroup_t *pg = scf_pg_create(h);
   177 	scf_iter_t *iter = scf_iter_create(h);
   177 	scf_iter_t *iter = scf_iter_create(h);
   178 	data_t *result = data_new_array(&t_array__PropertyGroup, 5);
   178 	adr_data_t *result = adr_data_new_array(&t_array__PropertyGroup, 5);
   179 
   179 
   180 	if (pg == NULL || iter == NULL) {
   180 	if (pg == NULL || iter == NULL) {
   181 		se = SE_FATAL;
   181 		se = SE_FATAL;
   182 		goto done;
   182 		goto done;
   183 	}
   183 	}
   188 	if ((se = smfu_iter_pg(&entity, NULL, iter)) != SE_OK)
   188 	if ((se = smfu_iter_pg(&entity, NULL, iter)) != SE_OK)
   189 		goto done;
   189 		goto done;
   190 
   190 
   191 	int e;
   191 	int e;
   192 	while ((e = scf_iter_next_pg(iter, pg)) > 0) {
   192 	while ((e = scf_iter_next_pg(iter, pg)) > 0) {
   193 		data_t *pgdata;
   193 		adr_data_t *pgdata;
   194 		if ((se = create_PropertyGroup(pg, &pgdata)) != SE_OK)
   194 		if ((se = create_PropertyGroup(pg, &pgdata)) != SE_OK)
   195 			goto done;
   195 			goto done;
   196 		(void) array_add(result, pgdata);
   196 		(void) adr_array_add(result, pgdata);
   197 	}
   197 	}
   198 	if (e != 0)
   198 	if (e != 0)
   199 		se = smfu_maperr(scf_error());
   199 		se = smfu_maperr(scf_error());
   200 
   200 
   201 done:
   201 done:
   208 }
   208 }
   209 
   209 
   210 /*ARGSUSED*/
   210 /*ARGSUSED*/
   211 conerr_t
   211 conerr_t
   212 interface_Entity_read_pgs(rad_instance_t *inst, adr_attribute_t *attr,
   212 interface_Entity_read_pgs(rad_instance_t *inst, adr_attribute_t *attr,
   213     data_t **data, data_t **error)
   213     adr_data_t **data, adr_data_t **error)
   214 {
   214 {
   215 	return (smfu_rtrun(rt_read_pgs, instance_getdata(inst), data, error));
   215 	return (smfu_rtrun(rt_read_pgs, instance_getdata(inst), data, error));
   216 }
   216 }
   217 
   217 
   218 
   218 
   219 /*ARGSUSED*/
   219 /*ARGSUSED*/
   220 static svcerr_t
   220 static svcerr_t
   221 rt_invoke_delete(scf_handle_t *h, void *arg, data_t **ret, data_t **error)
   221 rt_invoke_delete(scf_handle_t *h, void *arg, adr_data_t **ret,
       
   222     adr_data_t **error)
   222 {
   223 {
   223 	smfobj_t *smfo = arg;
   224 	smfobj_t *smfo = arg;
   224 	svcerr_t se = SE_OK;
   225 	svcerr_t se = SE_OK;
   225 	smfu_entity_t entity = SMFU_ENTITY_INIT;
   226 	smfu_entity_t entity = SMFU_ENTITY_INIT;
   226 
   227 
   255 }
   256 }
   256 
   257 
   257 /*ARGSUSED*/
   258 /*ARGSUSED*/
   258 conerr_t
   259 conerr_t
   259 interface_Entity_invoke_delete(rad_instance_t *inst, adr_method_t *meth,
   260 interface_Entity_invoke_delete(rad_instance_t *inst, adr_method_t *meth,
   260     data_t **ret, data_t **args, int count, data_t **error)
   261     adr_data_t **ret, adr_data_t **args, int count, adr_data_t **error)
   261 {
   262 {
   262 	return (smfu_rtrun(rt_invoke_delete, instance_getdata(inst), NULL,
   263 	return (smfu_rtrun(rt_invoke_delete, instance_getdata(inst), NULL,
   263 	    error));
   264 	    error));
   264 }
   265 }
   265 
   266 
   266 
   267 
   267 /*ARGSUSED*/
   268 /*ARGSUSED*/
   268 static svcerr_t
   269 static svcerr_t
   269 rt_invoke_deleteCust(scf_handle_t *h, void *arg, data_t **ret, data_t **error)
   270 rt_invoke_deleteCust(scf_handle_t *h, void *arg, adr_data_t **ret,
       
   271     adr_data_t **error)
   270 {
   272 {
   271 	smfobj_t *smfo = arg;
   273 	smfobj_t *smfo = arg;
   272 	svcerr_t se = SE_OK;
   274 	svcerr_t se = SE_OK;
   273 	smfu_entity_t entity = SMFU_ENTITY_INIT;
   275 	smfu_entity_t entity = SMFU_ENTITY_INIT;
   274 
   276 
   304 }
   306 }
   305 
   307 
   306 /*ARGSUSED*/
   308 /*ARGSUSED*/
   307 conerr_t
   309 conerr_t
   308 interface_Entity_invoke_deleteCust(rad_instance_t *inst, adr_method_t *meth,
   310 interface_Entity_invoke_deleteCust(rad_instance_t *inst, adr_method_t *meth,
   309     data_t **ret, data_t **args, int count, data_t **error)
   311     adr_data_t **ret, adr_data_t **args, int count, adr_data_t **error)
   310 {
   312 {
   311 	return (smfu_rtrun(rt_invoke_deleteCust, instance_getdata(inst), NULL,
   313 	return (smfu_rtrun(rt_invoke_deleteCust, instance_getdata(inst), NULL,
   312 	    error));
   314 	    error));
   313 }
   315 }
   314 
   316 
   315 /*ARGSUSED*/
   317 /*ARGSUSED*/
   316 static svcerr_t
   318 static svcerr_t
   317 rt_invoke_createPG(scf_handle_t *h, void *arg, data_t **ret, data_t **error)
   319 rt_invoke_createPG(scf_handle_t *h, void *arg, adr_data_t **ret,
       
   320     adr_data_t **error)
   318 {
   321 {
   319 	radarg_t *ra = arg;
   322 	radarg_t *ra = arg;
   320 	smfobj_t *smfo = instance_getdata(ra->inst);
   323 	smfobj_t *smfo = instance_getdata(ra->inst);
   321 	const char *pgname = data_to_string(ra->args[0]);
   324 	const char *pgname = adr_data_to_string(ra->args[0]);
   322 	const char *pgtype = data_to_string(ra->args[1]);
   325 	const char *pgtype = adr_data_to_string(ra->args[1]);
   323 	unsigned int pgflags = data_to_uinteger(ra->args[2]);
   326 	unsigned int pgflags = adr_data_to_uinteger(ra->args[2]);
   324 	svcerr_t se = SE_OK;
   327 	svcerr_t se = SE_OK;
   325 	smfu_entity_t entity = SMFU_ENTITY_INIT;
   328 	smfu_entity_t entity = SMFU_ENTITY_INIT;
   326 
   329 
   327 	if ((se = smfu_lookup(h, smfo->sname, smfo->iname, &entity)) != SE_OK)
   330 	if ((se = smfu_lookup(h, smfo->sname, smfo->iname, &entity)) != SE_OK)
   328 		goto done;
   331 		goto done;
   361 }
   364 }
   362 
   365 
   363 /*ARGSUSED*/
   366 /*ARGSUSED*/
   364 conerr_t
   367 conerr_t
   365 interface_Entity_invoke_createPG(rad_instance_t *inst, adr_method_t *meth,
   368 interface_Entity_invoke_createPG(rad_instance_t *inst, adr_method_t *meth,
   366     data_t **ret, data_t **args, int count, data_t **error)
   369     adr_data_t **ret, adr_data_t **args, int count, adr_data_t **error)
   367 {
   370 {
   368 	radarg_t ra = { .inst = inst, .args = args };
   371 	radarg_t ra = { .inst = inst, .args = args };
   369 	return (smfu_rtrun(rt_invoke_createPG, &ra, NULL, error));
   372 	return (smfu_rtrun(rt_invoke_createPG, &ra, NULL, error));
   370 }
   373 }
   371 
   374 
   372 
   375 
   373 /*ARGSUSED*/
   376 /*ARGSUSED*/
   374 static svcerr_t
   377 static svcerr_t
   375 rt_invoke_deletePG(scf_handle_t *h, void *arg, data_t **ret, data_t **error)
   378 rt_invoke_deletePG(scf_handle_t *h, void *arg, adr_data_t **ret,
       
   379     adr_data_t **error)
   376 {
   380 {
   377 	radarg_t *ra = arg;
   381 	radarg_t *ra = arg;
   378 	smfobj_t *smfo = instance_getdata(ra->inst);
   382 	smfobj_t *smfo = instance_getdata(ra->inst);
   379 	const char *pgname = data_to_string(ra->args[0]);
   383 	const char *pgname = adr_data_to_string(ra->args[0]);
   380 	svcerr_t se = SE_OK;
   384 	svcerr_t se = SE_OK;
   381 	smfu_entity_t entity = SMFU_ENTITY_INIT;
   385 	smfu_entity_t entity = SMFU_ENTITY_INIT;
   382 	scf_propertygroup_t *pg = scf_pg_create(h);
   386 	scf_propertygroup_t *pg = scf_pg_create(h);
   383 
   387 
   384 	if (pg == NULL) {
   388 	if (pg == NULL) {
   414 }
   418 }
   415 
   419 
   416 /*ARGSUSED*/
   420 /*ARGSUSED*/
   417 conerr_t
   421 conerr_t
   418 interface_Entity_invoke_deletePG(rad_instance_t *inst, adr_method_t *meth,
   422 interface_Entity_invoke_deletePG(rad_instance_t *inst, adr_method_t *meth,
   419     data_t **ret, data_t **args, int count, data_t **error)
   423     adr_data_t **ret, adr_data_t **args, int count, adr_data_t **error)
   420 {
   424 {
   421 	radarg_t ra = { .inst = inst, .args = args };
   425 	radarg_t ra = { .inst = inst, .args = args };
   422 	return (smfu_rtrun(rt_invoke_deletePG, &ra, NULL, error));
   426 	return (smfu_rtrun(rt_invoke_deletePG, &ra, NULL, error));
   423 }
   427 }
   424 
   428 
   425 
   429 
   426 /*ARGSUSED*/
   430 /*ARGSUSED*/
   427 static svcerr_t
   431 static svcerr_t
   428 rt_invoke_deletePGCust(scf_handle_t *h, void *arg, data_t **ret, data_t **error)
   432 rt_invoke_deletePGCust(scf_handle_t *h, void *arg, adr_data_t **ret,
       
   433     adr_data_t **error)
   429 {
   434 {
   430 	radarg_t *ra = arg;
   435 	radarg_t *ra = arg;
   431 	smfobj_t *smfo = instance_getdata(ra->inst);
   436 	smfobj_t *smfo = instance_getdata(ra->inst);
   432 	const char *pgname = data_to_string(ra->args[0]);
   437 	const char *pgname = adr_data_to_string(ra->args[0]);
   433 	svcerr_t se = SE_OK;
   438 	svcerr_t se = SE_OK;
   434 	smfu_entity_t entity = SMFU_ENTITY_INIT;
   439 	smfu_entity_t entity = SMFU_ENTITY_INIT;
   435 	scf_propertygroup_t *pg = scf_pg_create(h);
   440 	scf_propertygroup_t *pg = scf_pg_create(h);
   436 
   441 
   437 	if (pg == NULL) {
   442 	if (pg == NULL) {
   471 }
   476 }
   472 
   477 
   473 /*ARGSUSED*/
   478 /*ARGSUSED*/
   474 conerr_t
   479 conerr_t
   475 interface_Entity_invoke_deletePGCust(rad_instance_t *inst, adr_method_t *meth,
   480 interface_Entity_invoke_deletePGCust(rad_instance_t *inst, adr_method_t *meth,
   476     data_t **ret, data_t **args, int count, data_t **error)
   481     adr_data_t **ret, adr_data_t **args, int count, adr_data_t **error)
   477 {
   482 {
   478 	radarg_t ra = { .inst = inst, .args = args };
   483 	radarg_t ra = { .inst = inst, .args = args };
   479 	return (smfu_rtrun(rt_invoke_deletePGCust, &ra, NULL, error));
   484 	return (smfu_rtrun(rt_invoke_deletePGCust, &ra, NULL, error));
   480 }
   485 }
   481 
   486 
   482 static svcerr_t
   487 static svcerr_t
   483 rt_invoke_readProperties(scf_handle_t *h, void *arg, data_t **ret,
   488 rt_invoke_readProperties(scf_handle_t *h, void *arg, adr_data_t **ret,
   484     data_t **error)
   489     adr_data_t **error)
   485 {
   490 {
   486 	radarg_t *ra = arg;
   491 	radarg_t *ra = arg;
   487 	smfobj_t *smfo = instance_getdata(ra->inst);
   492 	smfobj_t *smfo = instance_getdata(ra->inst);
   488 	const char *pgname = data_to_string(ra->args[0]);
   493 	const char *pgname = adr_data_to_string(ra->args[0]);
   489 	svcerr_t se = SE_OK;
   494 	svcerr_t se = SE_OK;
   490 	smfu_entity_t entity = SMFU_ENTITY_INIT;
   495 	smfu_entity_t entity = SMFU_ENTITY_INIT;
   491 	scf_propertygroup_t *pg = scf_pg_create(h);
   496 	scf_propertygroup_t *pg = scf_pg_create(h);
   492 
   497 
   493 	if (pg == NULL) {
   498 	if (pg == NULL) {
   509 }
   514 }
   510 
   515 
   511 /*ARGSUSED*/
   516 /*ARGSUSED*/
   512 conerr_t
   517 conerr_t
   513 interface_Entity_invoke_readProperties(rad_instance_t *inst, adr_method_t *meth,
   518 interface_Entity_invoke_readProperties(rad_instance_t *inst, adr_method_t *meth,
   514     data_t **ret, data_t **args, int count, data_t **error)
   519     adr_data_t **ret, adr_data_t **args, int count, adr_data_t **error)
   515 {
   520 {
   516 	radarg_t ra = { .inst = inst, .args = args };
   521 	radarg_t ra = { .inst = inst, .args = args };
   517 	return (smfu_rtrun(rt_invoke_readProperties, &ra, ret, error));
   522 	return (smfu_rtrun(rt_invoke_readProperties, &ra, ret, error));
   518 }
   523 }
   519 
   524 
   520 /*ARGSUSED*/
   525 /*ARGSUSED*/
   521 static svcerr_t
   526 static svcerr_t
   522 tx_write_prop(scf_handle_t *h, scf_transaction_t *tx,
   527 tx_write_prop(scf_handle_t *h, scf_transaction_t *tx,
   523     const char *name, scf_type_t type, data_t *values, data_t **error)
   528     const char *name, scf_type_t type, adr_data_t *values, adr_data_t **error)
   524 {
   529 {
   525 	scf_transaction_entry_t *entry = scf_entry_create(h);
   530 	scf_transaction_entry_t *entry = scf_entry_create(h);
   526 
   531 
   527 	if (entry == NULL)
   532 	if (entry == NULL)
   528 		return (SE_FATAL);
   533 		return (SE_FATAL);
   547 				    &e__ErrorTarget_PROPERTY, name, NULL));
   552 				    &e__ErrorTarget_PROPERTY, name, NULL));
   548 			return (smfu_maperr(e));
   553 			return (smfu_maperr(e));
   549 		}
   554 		}
   550 	}
   555 	}
   551 
   556 
   552 	int nvalues = array_size(values);
   557 	int nvalues = adr_array_size(values);
   553 	for (int i = 0; i < nvalues; i++) {
   558 	for (int i = 0; i < nvalues; i++) {
   554 		const char *vstr = data_to_string(array_get(values, i));
   559 		const char *vstr = adr_data_to_string(adr_array_get(values, i));
   555 		scf_value_t *v = scf_value_create(h);
   560 		scf_value_t *v = scf_value_create(h);
   556 		if (v == NULL)
   561 		if (v == NULL)
   557 			return (SE_FATAL);
   562 			return (SE_FATAL);
   558 		if (scf_value_set_from_string(v, type, vstr) == -1 ||
   563 		if (scf_value_set_from_string(v, type, vstr) == -1 ||
   559 		    scf_entry_add_value(entry, v) == -1) {
   564 		    scf_entry_add_value(entry, v) == -1) {
   569 	return (SE_OK);
   574 	return (SE_OK);
   570 }
   575 }
   571 
   576 
   572 /*ARGSUSED*/
   577 /*ARGSUSED*/
   573 static svcerr_t
   578 static svcerr_t
   574 rt_invoke_writeProperties(scf_handle_t *h, void *arg, data_t **ret,
   579 rt_invoke_writeProperties(scf_handle_t *h, void *arg, adr_data_t **ret,
   575     data_t **error)
   580     adr_data_t **error)
   576 {
   581 {
   577 	radarg_t *ra = arg;
   582 	radarg_t *ra = arg;
   578 	smfobj_t *smfo = instance_getdata(ra->inst);
   583 	smfobj_t *smfo = instance_getdata(ra->inst);
   579 	const char *pgname = data_to_string(ra->args[0]);
   584 	const char *pgname = adr_data_to_string(ra->args[0]);
   580 	data_t *data = ra->args[1];
   585 	adr_data_t *data = ra->args[1];
   581 	svcerr_t se = SE_OK;
   586 	svcerr_t se = SE_OK;
   582 	smfu_entity_t entity = SMFU_ENTITY_INIT;
   587 	smfu_entity_t entity = SMFU_ENTITY_INIT;
   583 	scf_propertygroup_t *pg = scf_pg_create(h);
   588 	scf_propertygroup_t *pg = scf_pg_create(h);
   584 	scf_transaction_t *tx = scf_transaction_create(h);
   589 	scf_transaction_t *tx = scf_transaction_create(h);
   585 
   590 
   596 
   601 
   597 top:
   602 top:
   598 	if (scf_transaction_start(tx, pg) == -1)
   603 	if (scf_transaction_start(tx, pg) == -1)
   599 		goto txerror;
   604 		goto txerror;
   600 
   605 
   601 	int nprops = array_size(data);
   606 	int nprops = adr_array_size(data);
   602 	for (int i = 0; i < nprops; i++) {
   607 	for (int i = 0; i < nprops; i++) {
   603 		data_t *propdata = array_get(data, i);
   608 		adr_data_t *propdata = adr_array_get(data, i);
   604 		const char *propname =
   609 		const char *propname =
   605 		    data_to_string(struct_get(propdata, "name"));
   610 		    adr_data_to_string(adr_struct_get(propdata, "name"));
   606 		scf_type_t proptype =
   611 		scf_type_t proptype =
   607 		    from_PropertyType(struct_get(propdata, "type"));
   612 		    from_PropertyType(adr_struct_get(propdata, "type"));
   608 		data_t *values = struct_get(propdata, "values");
   613 		adr_data_t *values = adr_struct_get(propdata, "values");
   609 
   614 
   610 		se = tx_write_prop(h, tx, propname, proptype, values, error);
   615 		se = tx_write_prop(h, tx, propname, proptype, values, error);
   611 		if (se != SE_OK)
   616 		if (se != SE_OK)
   612 			goto done;
   617 			goto done;
   613 	}
   618 	}
   645 }
   650 }
   646 
   651 
   647 /*ARGSUSED*/
   652 /*ARGSUSED*/
   648 conerr_t
   653 conerr_t
   649 interface_Entity_invoke_writeProperties(rad_instance_t *inst,
   654 interface_Entity_invoke_writeProperties(rad_instance_t *inst,
   650     adr_method_t *meth, data_t **ret, data_t **args, int count, data_t **error)
   655     adr_method_t *meth, adr_data_t **ret, adr_data_t **args, int count,
       
   656     adr_data_t **error)
   651 {
   657 {
   652 	radarg_t ra = { .inst = inst, .args = args };
   658 	radarg_t ra = { .inst = inst, .args = args };
   653 	return (smfu_rtrun(rt_invoke_writeProperties, &ra, NULL, error));
   659 	return (smfu_rtrun(rt_invoke_writeProperties, &ra, NULL, error));
   654 }
   660 }
   655 
   661 
   656 static svcerr_t
   662 static svcerr_t
   657 rt_invoke_readProperty(scf_handle_t *h, void *arg, data_t **ret, data_t **error)
   663 rt_invoke_readProperty(scf_handle_t *h, void *arg, adr_data_t **ret,
       
   664     adr_data_t **error)
   658 {
   665 {
   659 	radarg_t *ra = arg;
   666 	radarg_t *ra = arg;
   660 	smfobj_t *smfo = instance_getdata(ra->inst);
   667 	smfobj_t *smfo = instance_getdata(ra->inst);
   661 	const char *pgname = data_to_string(ra->args[0]);
   668 	const char *pgname = adr_data_to_string(ra->args[0]);
   662 	const char *propname = data_to_string(ra->args[1]);
   669 	const char *propname = adr_data_to_string(ra->args[1]);
   663 	svcerr_t se = SE_OK;
   670 	svcerr_t se = SE_OK;
   664 	smfu_entity_t entity = SMFU_ENTITY_INIT;
   671 	smfu_entity_t entity = SMFU_ENTITY_INIT;
   665 	scf_propertygroup_t *pg = scf_pg_create(h);
   672 	scf_propertygroup_t *pg = scf_pg_create(h);
   666 	scf_property_t *prop = scf_property_create(h);
   673 	scf_property_t *prop = scf_property_create(h);
   667 	scf_iter_t *iter = scf_iter_create(h);
   674 	scf_iter_t *iter = scf_iter_create(h);
   695 }
   702 }
   696 
   703 
   697 /*ARGSUSED*/
   704 /*ARGSUSED*/
   698 conerr_t
   705 conerr_t
   699 interface_Entity_invoke_readProperty(rad_instance_t *inst, adr_method_t *meth,
   706 interface_Entity_invoke_readProperty(rad_instance_t *inst, adr_method_t *meth,
   700     data_t **ret, data_t **args, int count, data_t **error)
   707     adr_data_t **ret, adr_data_t **args, int count, adr_data_t **error)
   701 {
   708 {
   702 	radarg_t ra = { .inst = inst, .args = args };
   709 	radarg_t ra = { .inst = inst, .args = args };
   703 	return (smfu_rtrun(rt_invoke_readProperty, &ra, ret, error));
   710 	return (smfu_rtrun(rt_invoke_readProperty, &ra, ret, error));
   704 }
   711 }
   705 
   712 
   706 
   713 
   707 /*ARGSUSED*/
   714 /*ARGSUSED*/
   708 static svcerr_t
   715 static svcerr_t
   709 rt_invoke_writeProperty(scf_handle_t *h, void *arg, data_t **ret,
   716 rt_invoke_writeProperty(scf_handle_t *h, void *arg, adr_data_t **ret,
   710     data_t **error)
   717     adr_data_t **error)
   711 {
   718 {
   712 	radarg_t *ra = arg;
   719 	radarg_t *ra = arg;
   713 	smfobj_t *smfo = instance_getdata(ra->inst);
   720 	smfobj_t *smfo = instance_getdata(ra->inst);
   714 	const char *pgname = data_to_string(ra->args[0]);
   721 	const char *pgname = adr_data_to_string(ra->args[0]);
   715 	const char *propname = data_to_string(ra->args[1]);
   722 	const char *propname = adr_data_to_string(ra->args[1]);
   716 	scf_type_t proptype = from_PropertyType(ra->args[2]);
   723 	scf_type_t proptype = from_PropertyType(ra->args[2]);
   717 	data_t *data = ra->args[3];
   724 	adr_data_t *data = ra->args[3];
   718 	svcerr_t se = SE_OK;
   725 	svcerr_t se = SE_OK;
   719 	smfu_entity_t entity = SMFU_ENTITY_INIT;
   726 	smfu_entity_t entity = SMFU_ENTITY_INIT;
   720 	scf_propertygroup_t *pg = scf_pg_create(h);
   727 	scf_propertygroup_t *pg = scf_pg_create(h);
   721 	scf_transaction_t *tx = scf_transaction_create(h);
   728 	scf_transaction_t *tx = scf_transaction_create(h);
   722 
   729 
   772 }
   779 }
   773 
   780 
   774 /*ARGSUSED*/
   781 /*ARGSUSED*/
   775 conerr_t
   782 conerr_t
   776 interface_Entity_invoke_writeProperty(rad_instance_t *inst, adr_method_t *meth,
   783 interface_Entity_invoke_writeProperty(rad_instance_t *inst, adr_method_t *meth,
   777     data_t **ret, data_t **args, int count, data_t **error)
   784     adr_data_t **ret, adr_data_t **args, int count, adr_data_t **error)
   778 {
   785 {
   779 	radarg_t ra = { .inst = inst, .args = args };
   786 	radarg_t ra = { .inst = inst, .args = args };
   780 	return (smfu_rtrun(rt_invoke_writeProperty, &ra, NULL, error));
   787 	return (smfu_rtrun(rt_invoke_writeProperty, &ra, NULL, error));
   781 }
   788 }
   782 
   789 
   783 static svcerr_t
   790 static svcerr_t
   784 tx_delete_prop(scf_handle_t *h, scf_transaction_t *tx,
   791 tx_delete_prop(scf_handle_t *h, scf_transaction_t *tx,
   785     const char *name, data_t **error)
   792     const char *name, adr_data_t **error)
   786 {
   793 {
   787 	scf_transaction_entry_t *entry = scf_entry_create(h);
   794 	scf_transaction_entry_t *entry = scf_entry_create(h);
   788 
   795 
   789 	if (entry == NULL)
   796 	if (entry == NULL)
   790 		return (SE_FATAL);
   797 		return (SE_FATAL);
   808 	return (SE_OK);
   815 	return (SE_OK);
   809 }
   816 }
   810 
   817 
   811 /*ARGSUSED*/
   818 /*ARGSUSED*/
   812 static svcerr_t
   819 static svcerr_t
   813 rt_invoke_deleteProperty(scf_handle_t *h, void *arg, data_t **ret,
   820 rt_invoke_deleteProperty(scf_handle_t *h, void *arg, adr_data_t **ret,
   814     data_t **error)
   821     adr_data_t **error)
   815 {
   822 {
   816 	radarg_t *ra = arg;
   823 	radarg_t *ra = arg;
   817 	smfobj_t *smfo = instance_getdata(ra->inst);
   824 	smfobj_t *smfo = instance_getdata(ra->inst);
   818 	const char *pgname = data_to_string(ra->args[0]);
   825 	const char *pgname = adr_data_to_string(ra->args[0]);
   819 	const char *propname = data_to_string(ra->args[1]);
   826 	const char *propname = adr_data_to_string(ra->args[1]);
   820 	svcerr_t se = SE_OK;
   827 	svcerr_t se = SE_OK;
   821 	smfu_entity_t entity = SMFU_ENTITY_INIT;
   828 	smfu_entity_t entity = SMFU_ENTITY_INIT;
   822 	scf_propertygroup_t *pg = scf_pg_create(h);
   829 	scf_propertygroup_t *pg = scf_pg_create(h);
   823 	scf_transaction_t *tx = scf_transaction_create(h);
   830 	scf_transaction_t *tx = scf_transaction_create(h);
   824 
   831 
   873 }
   880 }
   874 
   881 
   875 /*ARGSUSED*/
   882 /*ARGSUSED*/
   876 conerr_t
   883 conerr_t
   877 interface_Entity_invoke_deleteProperty(rad_instance_t *inst, adr_method_t *meth,
   884 interface_Entity_invoke_deleteProperty(rad_instance_t *inst, adr_method_t *meth,
   878     data_t **ret, data_t **args, int count, data_t **error)
   885     adr_data_t **ret, adr_data_t **args, int count, adr_data_t **error)
   879 {
   886 {
   880 	radarg_t ra = { .inst = inst, .args = args };
   887 	radarg_t ra = { .inst = inst, .args = args };
   881 	return (smfu_rtrun(rt_invoke_deleteProperty, &ra, NULL, error));
   888 	return (smfu_rtrun(rt_invoke_deleteProperty, &ra, NULL, error));
   882 }
   889 }
   883 
   890 
   884 static svcerr_t
   891 static svcerr_t
   885 tx_delete_propcust(scf_handle_t *h, scf_transaction_t *tx,
   892 tx_delete_propcust(scf_handle_t *h, scf_transaction_t *tx,
   886     const char *name, data_t **error)
   893     const char *name, adr_data_t **error)
   887 {
   894 {
   888 	svcerr_t se = SE_OK;
   895 	svcerr_t se = SE_OK;
   889 	scf_transaction_entry_t *entry = scf_entry_create(h);
   896 	scf_transaction_entry_t *entry = scf_entry_create(h);
   890 
   897 
   891 	if (entry == NULL)
   898 	if (entry == NULL)
   914 	return (se);
   921 	return (se);
   915 }
   922 }
   916 
   923 
   917 /*ARGSUSED*/
   924 /*ARGSUSED*/
   918 static svcerr_t
   925 static svcerr_t
   919 rt_invoke_deletePropertyCust(scf_handle_t *h, void *arg, data_t **ret,
   926 rt_invoke_deletePropertyCust(scf_handle_t *h, void *arg, adr_data_t **ret,
   920     data_t **error)
   927     adr_data_t **error)
   921 {
   928 {
   922 	radarg_t *ra = arg;
   929 	radarg_t *ra = arg;
   923 	smfobj_t *smfo = instance_getdata(ra->inst);
   930 	smfobj_t *smfo = instance_getdata(ra->inst);
   924 	const char *pgname = data_to_string(ra->args[0]);
   931 	const char *pgname = adr_data_to_string(ra->args[0]);
   925 	const char *propname = data_to_string(ra->args[1]);
   932 	const char *propname = adr_data_to_string(ra->args[1]);
   926 	svcerr_t se = SE_OK;
   933 	svcerr_t se = SE_OK;
   927 	smfu_entity_t entity = SMFU_ENTITY_INIT;
   934 	smfu_entity_t entity = SMFU_ENTITY_INIT;
   928 	scf_propertygroup_t *pg = scf_pg_create(h);
   935 	scf_propertygroup_t *pg = scf_pg_create(h);
   929 	scf_transaction_t *tx = scf_transaction_create(h);
   936 	scf_transaction_t *tx = scf_transaction_create(h);
   930 
   937 
   979 }
   986 }
   980 
   987 
   981 /*ARGSUSED*/
   988 /*ARGSUSED*/
   982 conerr_t
   989 conerr_t
   983 interface_Entity_invoke_deletePropertyCust(rad_instance_t *inst,
   990 interface_Entity_invoke_deletePropertyCust(rad_instance_t *inst,
   984     adr_method_t *meth, data_t **ret, data_t **args, int count, data_t **error)
   991     adr_method_t *meth, adr_data_t **ret, adr_data_t **args, int count,
       
   992     adr_data_t **error)
   985 {
   993 {
   986 	radarg_t ra = { .inst = inst, .args = args };
   994 	radarg_t ra = { .inst = inst, .args = args };
   987 	return (smfu_rtrun(rt_invoke_deletePropertyCust, &ra, NULL, error));
   995 	return (smfu_rtrun(rt_invoke_deletePropertyCust, &ra, NULL, error));
   988 }
   996 }
   989 
   997 
   999 	const char *locale;
  1007 	const char *locale;
  1000 };
  1008 };
  1001 
  1009 
  1002 /*ARGSUSED*/
  1010 /*ARGSUSED*/
  1003 static svcerr_t
  1011 static svcerr_t
  1004 rt_get_template(scf_handle_t *h, void *arg, data_t **ret, data_t **error)
  1012 rt_get_template(scf_handle_t *h, void *arg, adr_data_t **ret,
       
  1013     adr_data_t **error)
  1005 {
  1014 {
  1006 	struct tmplarg *ta = arg;
  1015 	struct tmplarg *ta = arg;
  1007 	svcerr_t se = SE_OK;
  1016 	svcerr_t se = SE_OK;
  1008 	smfu_entity_t entity = SMFU_ENTITY_INIT;
  1017 	smfu_entity_t entity = SMFU_ENTITY_INIT;
  1009 	scf_propertygroup_t *pg = scf_pg_create(h);
  1018 	scf_propertygroup_t *pg = scf_pg_create(h);
  1018 	    &entity)) != SE_OK)
  1027 	    &entity)) != SE_OK)
  1019 		goto done;
  1028 		goto done;
  1020 
  1029 
  1021 	if ((se = smfu_get_pg_r(h, &entity, ta->pgname, pg)) == SE_OK &&
  1030 	if ((se = smfu_get_pg_r(h, &entity, ta->pgname, pg)) == SE_OK &&
  1022 	    (se = smfu_get_l10n_str(h, pg, ta->locale, &str)) == SE_OK) {
  1031 	    (se = smfu_get_l10n_str(h, pg, ta->locale, &str)) == SE_OK) {
  1023 		if ((*ret = data_new_string(str, lt_free)) == NULL)
  1032 		if ((*ret = adr_data_new_string(str, LT_FREE)) == NULL)
  1024 			se = SE_FATAL;
  1033 			se = SE_FATAL;
  1025 	} else if (se == SE_NOTFOUND) {
  1034 	} else if (se == SE_NOTFOUND) {
  1026 		se = SE_OK;
  1035 		se = SE_OK;
  1027 	}
  1036 	}
  1028 
  1037 
  1034 }
  1043 }
  1035 
  1044 
  1036 /*ARGSUSED*/
  1045 /*ARGSUSED*/
  1037 conerr_t
  1046 conerr_t
  1038 interface_Entity_invoke_getCommonName(rad_instance_t *inst, adr_method_t *meth,
  1047 interface_Entity_invoke_getCommonName(rad_instance_t *inst, adr_method_t *meth,
  1039     data_t **ret, data_t **args, int count, data_t **error)
  1048     adr_data_t **ret, adr_data_t **args, int count, adr_data_t **error)
  1040 {
  1049 {
  1041 	struct tmplarg ta = {
  1050 	struct tmplarg ta = {
  1042 	    .smfo = instance_getdata(inst),
  1051 	    .smfo = instance_getdata(inst),
  1043 	    .pgname = SCF_PG_TM_COMMON_NAME,
  1052 	    .pgname = SCF_PG_TM_COMMON_NAME,
  1044 	    .locale = data_to_string(args[0])
  1053 	    .locale = adr_data_to_string(args[0])
  1045 	};
  1054 	};
  1046 	return (smfu_rtrun_opt(rt_get_template, &ta, ret, error));
  1055 	return (smfu_rtrun_opt(rt_get_template, &ta, ret, error));
  1047 }
  1056 }
  1048 
  1057 
  1049 /*ARGSUSED*/
  1058 /*ARGSUSED*/
  1050 conerr_t
  1059 conerr_t
  1051 interface_Entity_invoke_getDescription(rad_instance_t *inst, adr_method_t *meth,
  1060 interface_Entity_invoke_getDescription(rad_instance_t *inst, adr_method_t *meth,
  1052     data_t **ret, data_t **args, int count, data_t **error)
  1061     adr_data_t **ret, adr_data_t **args, int count, adr_data_t **error)
  1053 {
  1062 {
  1054 	struct tmplarg ta = {
  1063 	struct tmplarg ta = {
  1055 	    .smfo = instance_getdata(inst),
  1064 	    .smfo = instance_getdata(inst),
  1056 	    .pgname = SCF_PG_TM_DESCRIPTION,
  1065 	    .pgname = SCF_PG_TM_DESCRIPTION,
  1057 	    .locale = data_to_string(args[0])
  1066 	    .locale = adr_data_to_string(args[0])
  1058 	};
  1067 	};
  1059 	return (smfu_rtrun_opt(rt_get_template, &ta, ret, error));
  1068 	return (smfu_rtrun_opt(rt_get_template, &ta, ret, error));
  1060 }
  1069 }
  1061 
  1070 
  1062 
  1071 
  1063 /*ARGSUSED*/
  1072 /*ARGSUSED*/
  1064 static svcerr_t
  1073 static svcerr_t
  1065 rt_invoke_getPGTemplates(scf_handle_t *h, void *arg, data_t **ret,
  1074 rt_invoke_getPGTemplates(scf_handle_t *h, void *arg, adr_data_t **ret,
  1066     data_t **error)
  1075     adr_data_t **error)
  1067 {
  1076 {
  1068 	radarg_t *ra = arg;
  1077 	radarg_t *ra = arg;
  1069 	smfobj_t *smfo = instance_getdata(ra->inst);
  1078 	smfobj_t *smfo = instance_getdata(ra->inst);
  1070 	const char *locale = data_to_string(ra->args[0]);
  1079 	const char *locale = adr_data_to_string(ra->args[0]);
  1071 	svcerr_t se = SE_OK;
  1080 	svcerr_t se = SE_OK;
  1072 	data_t *result = data_new_array(&t_array__PGTemplate, 5);
  1081 	adr_data_t *result = adr_data_new_array(&t_array__PGTemplate, 5);
  1073 
  1082 
  1074 	scf_pg_tmpl_t *pgtmpl = scf_tmpl_pg_create(h);
  1083 	scf_pg_tmpl_t *pgtmpl = scf_tmpl_pg_create(h);
  1075 	if (pgtmpl == NULL) {
  1084 	if (pgtmpl == NULL) {
  1076 		se = SE_FATAL;
  1085 		se = SE_FATAL;
  1077 		goto done;
  1086 		goto done;
  1078 	}
  1087 	}
  1079 
  1088 
  1080 	int e;
  1089 	int e;
  1081 	while ((e = scf_tmpl_iter_pgs(pgtmpl, smfo->fmri, NULL, NULL,
  1090 	while ((e = scf_tmpl_iter_pgs(pgtmpl, smfo->fmri, NULL, NULL,
  1082 	    SCF_PG_TMPL_FLAG_CURRENT)) == 1) {
  1091 	    SCF_PG_TMPL_FLAG_CURRENT)) == 1) {
  1083 		data_t *t = NULL;
  1092 		adr_data_t *t = NULL;
  1084 		if ((se = create_PGTemplate(pgtmpl, locale, &t)) != SE_OK)
  1093 		if ((se = create_PGTemplate(pgtmpl, locale, &t)) != SE_OK)
  1085 			goto done;
  1094 			goto done;
  1086 		(void) array_add(result, t);
  1095 		(void) adr_array_add(result, t);
  1087 	}
  1096 	}
  1088 	if (e == -1)
  1097 	if (e == -1)
  1089 		se = smfu_maperr(scf_error());
  1098 		se = smfu_maperr(scf_error());
  1090 done:
  1099 done:
  1091 	*ret = result;
  1100 	*ret = result;
  1095 }
  1104 }
  1096 
  1105 
  1097 /*ARGSUSED*/
  1106 /*ARGSUSED*/
  1098 conerr_t
  1107 conerr_t
  1099 interface_Entity_invoke_getPGTemplates(rad_instance_t *inst, adr_method_t *meth,
  1108 interface_Entity_invoke_getPGTemplates(rad_instance_t *inst, adr_method_t *meth,
  1100     data_t **ret, data_t **args, int count, data_t **error)
  1109     adr_data_t **ret, adr_data_t **args, int count, adr_data_t **error)
  1101 {
  1110 {
  1102 	radarg_t ra = { .inst = inst, .args = args };
  1111 	radarg_t ra = { .inst = inst, .args = args };
  1103 	return (smfu_rtrun(rt_invoke_getPGTemplates, &ra, ret, error));
  1112 	return (smfu_rtrun(rt_invoke_getPGTemplates, &ra, ret, error));
  1104 }
  1113 }
  1105 
  1114 
  1106 
  1115 
  1107 /*ARGSUSED*/
  1116 /*ARGSUSED*/
  1108 static svcerr_t
  1117 static svcerr_t
  1109 rt_invoke_getPropTemplates(scf_handle_t *h, void *arg, data_t **ret,
  1118 rt_invoke_getPropTemplates(scf_handle_t *h, void *arg, adr_data_t **ret,
  1110     data_t **error)
  1119     adr_data_t **error)
  1111 {
  1120 {
  1112 	radarg_t *ra = arg;
  1121 	radarg_t *ra = arg;
  1113 	smfobj_t *smfo = instance_getdata(ra->inst);
  1122 	smfobj_t *smfo = instance_getdata(ra->inst);
  1114 	const char *pgname = data_to_string(ra->args[0]);
  1123 	const char *pgname = adr_data_to_string(ra->args[0]);
  1115 	const char *pgtype = data_to_string(ra->args[1]);
  1124 	const char *pgtype = adr_data_to_string(ra->args[1]);
  1116 	const char *locale = data_to_string(ra->args[2]);
  1125 	const char *locale = adr_data_to_string(ra->args[2]);
  1117 	svcerr_t se = SE_OK;
  1126 	svcerr_t se = SE_OK;
  1118 	data_t *result = data_new_array(&t_array__PropTemplate, 5);
  1127 	adr_data_t *result = adr_data_new_array(&t_array__PropTemplate, 5);
  1119 
  1128 
  1120 	scf_pg_tmpl_t *pgtmpl = scf_tmpl_pg_create(h);
  1129 	scf_pg_tmpl_t *pgtmpl = scf_tmpl_pg_create(h);
  1121 	scf_prop_tmpl_t *proptmpl = scf_tmpl_prop_create(h);
  1130 	scf_prop_tmpl_t *proptmpl = scf_tmpl_prop_create(h);
  1122 
  1131 
  1123 	if (pgtmpl == NULL || proptmpl == NULL) {
  1132 	if (pgtmpl == NULL || proptmpl == NULL) {
  1131 		goto done;
  1140 		goto done;
  1132 	}
  1141 	}
  1133 
  1142 
  1134 	int e;
  1143 	int e;
  1135 	while ((e = scf_tmpl_iter_props(pgtmpl, proptmpl, 0)) == 0) {
  1144 	while ((e = scf_tmpl_iter_props(pgtmpl, proptmpl, 0)) == 0) {
  1136 		data_t *t = NULL;
  1145 		adr_data_t *t = NULL;
  1137 		if ((se = create_PropTemplate(proptmpl, locale, &t)) != SE_OK)
  1146 		if ((se = create_PropTemplate(proptmpl, locale, &t)) != SE_OK)
  1138 			goto done;
  1147 			goto done;
  1139 		(void) array_add(result, t);
  1148 		(void) adr_array_add(result, t);
  1140 	}
  1149 	}
  1141 	if (e == -1)
  1150 	if (e == -1)
  1142 		se = smfu_maperr(scf_error());
  1151 		se = smfu_maperr(scf_error());
  1143 done:
  1152 done:
  1144 	*ret = result;
  1153 	*ret = result;
  1149 }
  1158 }
  1150 
  1159 
  1151 /*ARGSUSED*/
  1160 /*ARGSUSED*/
  1152 conerr_t
  1161 conerr_t
  1153 interface_Entity_invoke_getPropTemplates(rad_instance_t *inst,
  1162 interface_Entity_invoke_getPropTemplates(rad_instance_t *inst,
  1154     adr_method_t *meth, data_t **ret, data_t **args, int count, data_t **error)
  1163     adr_method_t *meth, adr_data_t **ret, adr_data_t **args, int count,
       
  1164     adr_data_t **error)
  1155 {
  1165 {
  1156 	radarg_t ra = { .inst = inst, .args = args };
  1166 	radarg_t ra = { .inst = inst, .args = args };
  1157 	return (smfu_rtrun(rt_invoke_getPropTemplates, &ra, ret, error));
  1167 	return (smfu_rtrun(rt_invoke_getPropTemplates, &ra, ret, error));
  1158 }
  1168 }