components/visual-panels/core/src/cmd/rad/mod/smf_old/mod_smf.c
changeset 901 19b502ccabc8
parent 827 0944d8c0158b
child 1410 ca9946e5736c
equal deleted inserted replaced
900:63d3bf696d85 901:19b502ccabc8
    72 	SCF_GROUP_TEMPLATE_PROP_PATTERN,
    72 	SCF_GROUP_TEMPLATE_PROP_PATTERN,
    73 	NULL
    73 	NULL
    74 };
    74 };
    75 
    75 
    76 static conerr_t
    76 static conerr_t
    77 error_scf(data_t **error, int code)
    77 error_scf(adr_data_t **error, int code)
    78 {
    78 {
    79 	if (error != NULL) {
    79 	if (error != NULL) {
    80 		data_t *e = data_new_struct(&t__SmfError);
    80 		adr_data_t *e = adr_data_new_struct(&t__SmfError);
    81 		struct_set(e, "error", data_new_enum(&t__SmfErrorCode, code));
    81 		adr_struct_set(e, "error",
    82 		struct_set(e, "message",
    82 		    adr_data_new_enum(&t__SmfErrorCode, code));
    83 		    data_new_string(scf_strerror(code), lt_const));
    83 		adr_struct_set(e, "message",
    84 		*error = data_purify(e);
    84 		    adr_data_new_string(scf_strerror(code), LT_CONST));
       
    85 		*error = adr_data_purify(e);
    85 	}
    86 	}
    86 	return (ce_object);
    87 	return (ce_object);
    87 }
    88 }
    88 
    89 
    89 static conerr_t
    90 static conerr_t
    90 simple_scf(data_t **error, int result)
    91 simple_scf(adr_data_t **error, int result)
    91 {
    92 {
    92 	if (result == 0)
    93 	if (result == 0)
    93 		return (ce_ok);
    94 		return (ce_ok);
    94 	return (error_scf(error, scf_error()));
    95 	return (error_scf(error, scf_error()));
    95 }
    96 }
   121 		return (NULL);
   122 		return (NULL);
   122 	}
   123 	}
   123 	return (h);
   124 	return (h);
   124 }
   125 }
   125 
   126 
   126 static int getpgs(servinst_t *si, data_t **data, boolean_t namesonly,
   127 static int getpgs(servinst_t *si, adr_data_t **data, boolean_t namesonly,
   127     boolean_t(*fp)(const char **, const char *), const char **set,
   128     boolean_t(*fp)(const char **, const char *), const char **set,
   128     data_t **error)
   129     adr_data_t **error)
   129 {
   130 {
   130 	conerr_t err = ce_ok;
   131 	conerr_t err = ce_ok;
   131 	scf_handle_t *scfhandle = handle_create();
   132 	scf_handle_t *scfhandle = handle_create();
   132 	scf_service_t *service = scf_service_create(scfhandle);
   133 	scf_service_t *service = scf_service_create(scfhandle);
   133 	scf_instance_t *instance = scf_instance_create(scfhandle);
   134 	scf_instance_t *instance = scf_instance_create(scfhandle);
   157 			err = error_scf(error, scf_error());
   158 			err = error_scf(error, scf_error());
   158 			goto out;
   159 			goto out;
   159 		}
   160 		}
   160 	}
   161 	}
   161 
   162 
   162 	data_t *result = namesonly ? data_new_array(&t_array_string, 5) :
   163 	adr_data_t *result = namesonly ?
   163 	    data_new_array(&t_array__PropertyGroup, 5);
   164 	    adr_data_new_array(&adr_t_array_string, 5) :
       
   165 	    adr_data_new_array(&t_array__PropertyGroup, 5);
   164 	while (scf_iter_next_pg(iter, pg) > 0) {
   166 	while (scf_iter_next_pg(iter, pg) > 0) {
   165 		char nbuf[1000];
   167 		char nbuf[1000];
   166 		char tbuf[1000];
   168 		char tbuf[1000];
   167 		(void) scf_pg_get_name(pg, nbuf, 1000);
   169 		(void) scf_pg_get_name(pg, nbuf, 1000);
   168 		(void) scf_pg_get_type(pg, tbuf, 1000);
   170 		(void) scf_pg_get_type(pg, tbuf, 1000);
   169 
   171 
   170 		if (fp(set, tbuf)) {
   172 		if (fp(set, tbuf)) {
   171 			if (namesonly) {
   173 			if (namesonly) {
   172 				(void) array_add(result,
   174 				(void) adr_array_add(result,
   173 				    data_new_string(nbuf, lt_copy));
   175 				    adr_data_new_string(nbuf, LT_COPY));
   174 			} else {
   176 			} else {
   175 				data_t *pgdata =
   177 				adr_data_t *pgdata =
   176 				    data_new_struct(&t__PropertyGroup);
   178 				    adr_data_new_struct(&t__PropertyGroup);
   177 				struct_set(pgdata, "name",
   179 				adr_struct_set(pgdata, "name",
   178 				    data_new_string(nbuf, lt_copy));
   180 				    adr_data_new_string(nbuf, LT_COPY));
   179 				struct_set(pgdata, "type",
   181 				adr_struct_set(pgdata, "type",
   180 				    data_new_string(tbuf, lt_copy));
   182 				    adr_data_new_string(tbuf, LT_COPY));
   181 				(void) array_add(result, pgdata);
   183 				(void) adr_array_add(result, pgdata);
   182 			}
   184 			}
   183 		}
   185 		}
   184 	}
   186 	}
   185 
   187 
   186 	*data = result;
   188 	*data = result;
   197 }
   199 }
   198 
   200 
   199 /* ARGSUSED */
   201 /* ARGSUSED */
   200 conerr_t
   202 conerr_t
   201 interface_ServiceInfo_read_fmri(rad_instance_t *inst, adr_attribute_t *attr,
   203 interface_ServiceInfo_read_fmri(rad_instance_t *inst, adr_attribute_t *attr,
   202     data_t **data, data_t **error)
   204     adr_data_t **data, adr_data_t **error)
   203 {
   205 {
   204 	servinst_t *si = instance_getdata(inst);
   206 	servinst_t *si = instance_getdata(inst);
   205 	*data = data_new_string(si->fmri, lt_copy);
   207 	*data = adr_data_new_string(si->fmri, LT_COPY);
   206 	return (ce_ok);
   208 	return (ce_ok);
   207 }
   209 }
   208 
   210 
   209 /* ARGSUSED */
   211 /* ARGSUSED */
   210 conerr_t
   212 conerr_t
   211 interface_ServiceInfo_read_methodNames(rad_instance_t *inst,
   213 interface_ServiceInfo_read_methodNames(rad_instance_t *inst,
   212     adr_attribute_t *attr, data_t **data, data_t **error)
   214     adr_attribute_t *attr, adr_data_t **data, adr_data_t **error)
   213 {
   215 {
   214 	const char *pgtypes[] = { SCF_GROUP_METHOD, NULL };
   216 	const char *pgtypes[] = { SCF_GROUP_METHOD, NULL };
   215 	return (getpgs(instance_getdata(inst), data, B_TRUE, strinset, pgtypes,
   217 	return (getpgs(instance_getdata(inst), data, B_TRUE, strinset, pgtypes,
   216 	    error));
   218 	    error));
   217 }
   219 }
   218 
   220 
   219 /* ARGSUSED */
   221 /* ARGSUSED */
   220 conerr_t
   222 conerr_t
   221 interface_ServiceInfo_read_dependencyNames(rad_instance_t *inst,
   223 interface_ServiceInfo_read_dependencyNames(rad_instance_t *inst,
   222     adr_attribute_t *attr, data_t **data, data_t **error)
   224     adr_attribute_t *attr, adr_data_t **data, adr_data_t **error)
   223 {
   225 {
   224 	const char *pgtypes[] = { SCF_GROUP_DEPENDENCY, NULL };
   226 	const char *pgtypes[] = { SCF_GROUP_DEPENDENCY, NULL };
   225 	return (getpgs(instance_getdata(inst), data, B_TRUE, strinset, pgtypes,
   227 	return (getpgs(instance_getdata(inst), data, B_TRUE, strinset, pgtypes,
   226 	    error));
   228 	    error));
   227 }
   229 }
   228 
   230 
   229 /* ARGSUSED */
   231 /* ARGSUSED */
   230 conerr_t
   232 conerr_t
   231 interface_ServiceInfo_read_propertyGroups(rad_instance_t *inst,
   233 interface_ServiceInfo_read_propertyGroups(rad_instance_t *inst,
   232     adr_attribute_t *attr, data_t **data, data_t **error)
   234     adr_attribute_t *attr, adr_data_t **data, adr_data_t **error)
   233 {
   235 {
   234 	return (getpgs(instance_getdata(inst), data, B_FALSE, strnotinset,
   236 	return (getpgs(instance_getdata(inst), data, B_FALSE, strnotinset,
   235 	    framework_pgtypes, error));
   237 	    framework_pgtypes, error));
   236 }
   238 }
   237 
   239 
   238 /* ARGSUSED */
   240 /* ARGSUSED */
   239 conerr_t
   241 conerr_t
   240 interface_ServiceInfo_read_manpages(rad_instance_t *inst, adr_attribute_t *attr,
   242 interface_ServiceInfo_read_manpages(rad_instance_t *inst, adr_attribute_t *attr,
   241     data_t **data, data_t **error)
   243     adr_data_t **data, adr_data_t **error)
   242 {
   244 {
   243 	servinst_t *si = instance_getdata(inst);
   245 	servinst_t *si = instance_getdata(inst);
   244 	char *title, *section, *path;
   246 	char *title, *section, *path;
   245 	rad_propvec_t *badprop;
   247 	rad_propvec_t *badprop;
   246 	rad_propvec_t evec[] = {
   248 	rad_propvec_t evec[] = {
   254 	const char *pgtypes[] = {
   256 	const char *pgtypes[] = {
   255 		SCF_GROUP_TEMPLATE,
   257 		SCF_GROUP_TEMPLATE,
   256 		NULL
   258 		NULL
   257 	};
   259 	};
   258 
   260 
   259 	data_t *pgs;
   261 	adr_data_t *pgs;
   260 	conerr_t err = getpgs(si, &pgs, B_TRUE, strinset, pgtypes, error);
   262 	conerr_t err = getpgs(si, &pgs, B_TRUE, strinset, pgtypes, error);
   261 	if (err != ce_ok)
   263 	if (err != ce_ok)
   262 		return (err);
   264 		return (err);
   263 	data_t *result = data_new_array(&t_array__Manpage, 5);
   265 	adr_data_t *result = adr_data_new_array(&t_array__Manpage, 5);
   264 	for (int i = 0; i < array_size(pgs); i++) {
   266 	for (int i = 0; i < adr_array_size(pgs); i++) {
   265 		const char *str = data_to_string(array_get(pgs, i));
   267 		const char *str = adr_data_to_string(adr_array_get(pgs, i));
   266 		if (strncmp(str, SCF_PG_TM_MAN_PREFIX,
   268 		if (strncmp(str, SCF_PG_TM_MAN_PREFIX,
   267 		    strlen(SCF_PG_TM_MAN_PREFIX)) != 0) {
   269 		    strlen(SCF_PG_TM_MAN_PREFIX)) != 0) {
   268 			continue;
   270 			continue;
   269 		}
   271 		}
   270 
   272 
   271 		if (rad_read_propvec(si->fmri, str, B_FALSE, evec,
   273 		if (rad_read_propvec(si->fmri, str, B_FALSE, evec,
   272 		    &badprop) != 0)
   274 		    &badprop) != 0)
   273 			continue;
   275 			continue;
   274 
   276 
   275 		data_t *mp = data_new_struct(&t__Manpage);
   277 		adr_data_t *mp = adr_data_new_struct(&t__Manpage);
   276 		struct_set(mp, "title", data_new_string(title, lt_copy));
   278 		adr_struct_set(mp, "title",
   277 		struct_set(mp, "section", data_new_string(section, lt_copy));
   279 		    adr_data_new_string(title, LT_COPY));
   278 		struct_set(mp, "path", data_new_string(path, lt_copy));
   280 		adr_struct_set(mp, "section",
   279 		(void) array_add(result, mp);
   281 		    adr_data_new_string(section, LT_COPY));
       
   282 		adr_struct_set(mp, "path", adr_data_new_string(path, LT_COPY));
       
   283 		(void) adr_array_add(result, mp);
   280 		rad_clean_propvec(evec);
   284 		rad_clean_propvec(evec);
   281 	}
   285 	}
   282 	data_free(pgs);
   286 	adr_data_free(pgs);
   283 	*data = result;
   287 	*data = result;
   284 
   288 
   285 	return (ce_ok);
   289 	return (ce_ok);
   286 }
   290 }
   287 
   291 
   288 /* ARGSUSED */
   292 /* ARGSUSED */
   289 conerr_t
   293 conerr_t
   290 interface_ServiceInfo_read_doclinks(rad_instance_t *inst, adr_attribute_t *attr,
   294 interface_ServiceInfo_read_doclinks(rad_instance_t *inst, adr_attribute_t *attr,
   291     data_t **data, data_t **error)
   295     adr_data_t **data, adr_data_t **error)
   292 {
   296 {
   293 	servinst_t *si = instance_getdata(inst);
   297 	servinst_t *si = instance_getdata(inst);
   294 	char *uri;
   298 	char *uri;
   295 	rad_propvec_t *badprop;
   299 	rad_propvec_t *badprop;
   296 	rad_propvec_t evec[] = {
   300 	rad_propvec_t evec[] = {
   301 	const char *pgtypes[] = {
   305 	const char *pgtypes[] = {
   302 		SCF_GROUP_TEMPLATE,
   306 		SCF_GROUP_TEMPLATE,
   303 		NULL
   307 		NULL
   304 	};
   308 	};
   305 
   309 
   306 	data_t *pgs;
   310 	adr_data_t *pgs;
   307 	conerr_t err = getpgs(si, &pgs, B_TRUE, strinset, pgtypes, error);
   311 	conerr_t err = getpgs(si, &pgs, B_TRUE, strinset, pgtypes, error);
   308 	if (err != ce_ok)
   312 	if (err != ce_ok)
   309 		return (err);
   313 		return (err);
   310 	data_t *result = data_new_array(&t_array_string, 5);
   314 	adr_data_t *result = adr_data_new_array(&adr_t_array_string, 5);
   311 	for (int i = 0; i < array_size(pgs); i++) {
   315 	for (int i = 0; i < adr_array_size(pgs); i++) {
   312 		const char *str = data_to_string(array_get(pgs, i));
   316 		const char *str = adr_data_to_string(adr_array_get(pgs, i));
   313 		if (strncmp(str, SCF_PG_TM_DOC_PREFIX,
   317 		if (strncmp(str, SCF_PG_TM_DOC_PREFIX,
   314 		    strlen(SCF_PG_TM_DOC_PREFIX)) != 0) {
   318 		    strlen(SCF_PG_TM_DOC_PREFIX)) != 0) {
   315 			continue;
   319 			continue;
   316 		}
   320 		}
   317 
   321 
   318 		if (rad_read_propvec(si->fmri, str, B_FALSE, evec,
   322 		if (rad_read_propvec(si->fmri, str, B_FALSE, evec,
   319 		    &badprop) == 0) {
   323 		    &badprop) == 0) {
   320 			(void) array_add(result, data_new_string(uri, lt_copy));
   324 			(void) adr_array_add(result,
       
   325 			    adr_data_new_string(uri, LT_COPY));
   321 			rad_clean_propvec(evec);
   326 			rad_clean_propvec(evec);
   322 		}
   327 		}
   323 	}
   328 	}
   324 	data_free(pgs);
   329 	adr_data_free(pgs);
   325 	*data = result;
   330 	*data = result;
   326 
   331 
   327 	return (ce_ok);
   332 	return (ce_ok);
   328 }
   333 }
   329 
   334 
   330 /* ARGSUSED */
   335 /* ARGSUSED */
   331 conerr_t
   336 conerr_t
   332 interface_ServiceInfo_read_persistentlyEnabled(rad_instance_t *inst,
   337 interface_ServiceInfo_read_persistentlyEnabled(rad_instance_t *inst,
   333     adr_attribute_t *attr, data_t **data, data_t **error)
   338     adr_attribute_t *attr, adr_data_t **data, adr_data_t **error)
   334 {
   339 {
   335 	servinst_t *si = instance_getdata(inst);
   340 	servinst_t *si = instance_getdata(inst);
   336 	if (!si->instance)
   341 	if (!si->instance)
   337 		return (error_scf(error, SCF_ERROR_INVALID_ARGUMENT));
   342 		return (error_scf(error, SCF_ERROR_INVALID_ARGUMENT));
   338 
   343 
   347 	    evec, &badprop);
   352 	    evec, &badprop);
   348 	if (scferr != 0)
   353 	if (scferr != 0)
   349 		return (error_scf(error, scferr));
   354 		return (error_scf(error, scferr));
   350 	rad_clean_propvec(evec);
   355 	rad_clean_propvec(evec);
   351 
   356 
   352 	*data = data_new_boolean(enabled);
   357 	*data = adr_data_new_boolean(enabled);
   353 	return (ce_ok);
   358 	return (ce_ok);
   354 }
   359 }
   355 
   360 
   356 /* ARGSUSED */
   361 /* ARGSUSED */
   357 conerr_t
   362 conerr_t
   358 interface_ServiceInfo_read_temporarilyEnabled(rad_instance_t *inst,
   363 interface_ServiceInfo_read_temporarilyEnabled(rad_instance_t *inst,
   359     adr_attribute_t *attr, data_t **data, data_t **error)
   364     adr_attribute_t *attr, adr_data_t **data, adr_data_t **error)
   360 {
   365 {
   361 	servinst_t *si = instance_getdata(inst);
   366 	servinst_t *si = instance_getdata(inst);
   362 	if (!si->instance)
   367 	if (!si->instance)
   363 		return (error_scf(error, SCF_ERROR_INVALID_ARGUMENT));
   368 		return (error_scf(error, SCF_ERROR_INVALID_ARGUMENT));
   364 
   369 
   373 	    &badprop) != 0)
   378 	    &badprop) != 0)
   374 		return (interface_ServiceInfo_read_persistentlyEnabled(
   379 		return (interface_ServiceInfo_read_persistentlyEnabled(
   375 		    inst, attr, data, error));
   380 		    inst, attr, data, error));
   376 	rad_clean_propvec(evec);
   381 	rad_clean_propvec(evec);
   377 
   382 
   378 	*data = data_new_boolean(enabled);
   383 	*data = adr_data_new_boolean(enabled);
   379 	return (ce_ok);
   384 	return (ce_ok);
   380 }
   385 }
   381 
   386 
   382 /* ARGSUSED */
   387 /* ARGSUSED */
   383 conerr_t
   388 conerr_t
   384 interface_ServiceInfo_read_enabled(rad_instance_t *inst, adr_attribute_t *attr,
   389 interface_ServiceInfo_read_enabled(rad_instance_t *inst, adr_attribute_t *attr,
   385     data_t **data, data_t **error)
   390     adr_data_t **data, adr_data_t **error)
   386 {
   391 {
   387 	/*
   392 	/*
   388 	 * XXX: The java version always had the same implementation for both.
   393 	 * XXX: The java version always had the same implementation for both.
   389 	 */
   394 	 */
   390 	return (interface_ServiceInfo_read_persistentlyEnabled(inst, attr, data,
   395 	return (interface_ServiceInfo_read_persistentlyEnabled(inst, attr, data,
   392 }
   397 }
   393 
   398 
   394 /* ARGSUSED */
   399 /* ARGSUSED */
   395 conerr_t
   400 conerr_t
   396 interface_ServiceInfo_read_instance(rad_instance_t *inst, adr_attribute_t *attr,
   401 interface_ServiceInfo_read_instance(rad_instance_t *inst, adr_attribute_t *attr,
   397     data_t **data, data_t **error)
   402     adr_data_t **data, adr_data_t **error)
   398 {
   403 {
   399 	servinst_t *si = instance_getdata(inst);
   404 	servinst_t *si = instance_getdata(inst);
   400 	*data = data_new_boolean(si->instance);
   405 	*data = adr_data_new_boolean(si->instance);
   401 	return (ce_ok);
   406 	return (ce_ok);
   402 }
   407 }
   403 
   408 
   404 /* ARGSUSED */
   409 /* ARGSUSED */
   405 conerr_t
   410 conerr_t
   406 interface_ServiceInfo_read_restarter(rad_instance_t *inst,
   411 interface_ServiceInfo_read_restarter(rad_instance_t *inst,
   407     adr_attribute_t *attr, data_t **data, data_t **error)
   412     adr_attribute_t *attr, adr_data_t **data, adr_data_t **error)
   408 {
   413 {
   409 	servinst_t *si = instance_getdata(inst);
   414 	servinst_t *si = instance_getdata(inst);
   410 	if (!si->instance)
   415 	if (!si->instance)
   411 		return (error_scf(error, SCF_ERROR_INVALID_ARGUMENT));
   416 		return (error_scf(error, SCF_ERROR_INVALID_ARGUMENT));
   412 
   417 
   417 	};
   422 	};
   418 
   423 
   419 	rad_propvec_t *badprop;
   424 	rad_propvec_t *badprop;
   420 	if (rad_read_propvec(si->fmri, SCF_PG_GENERAL, B_FALSE, evec,
   425 	if (rad_read_propvec(si->fmri, SCF_PG_GENERAL, B_FALSE, evec,
   421 	    &badprop) == 0) {
   426 	    &badprop) == 0) {
   422 		*data = data_new_string(fmri, lt_copy);
   427 		*data = adr_data_new_string(fmri, LT_COPY);
   423 		rad_clean_propvec(evec);
   428 		rad_clean_propvec(evec);
   424 	} else {
   429 	} else {
   425 		*data = data_new_fstring("svc:/%s:%s",
   430 		*data = adr_data_new_fstring("svc:/%s:%s",
   426 		    "system/svc/restarter", "default");
   431 		    "system/svc/restarter", "default");
   427 	}
   432 	}
   428 
   433 
   429 	return (*data != NULL ? ce_ok : ce_system);
   434 	return (*data != NULL ? ce_ok : ce_system);
   430 }
   435 }
   431 
   436 
   432 static data_t *
   437 static adr_data_t *
   433 state2enum(const char *state)
   438 state2enum(const char *state)
   434 {
   439 {
   435 	if (strcmp(state, SCF_STATE_STRING_UNINIT) == 0) {
   440 	if (strcmp(state, SCF_STATE_STRING_UNINIT) == 0) {
   436 		return (&e__SmfState_UNINIT);
   441 		return (&e__SmfState_UNINIT);
   437 	} else if (strcmp(state, SCF_STATE_STRING_MAINT) == 0) {
   442 	} else if (strcmp(state, SCF_STATE_STRING_MAINT) == 0) {
   438 		return (&e__SmfState_MAINT);
   443 		return (&e__SmfState_MAINT);
   439 	} else if (strcmp(state, SCF_STATE_STRING_LEGACY) == 0) {
   444 	} else if (strcmp(state, SCF_STATE_STRING_LEGACY) == 0) {
   440 		return (&e__SmfState_LEGACY);
   445 		return (&e__SmfState_LEGACY);
   441 	} else {
   446 	} else {
   442 		return (data_new_enum_byname(&t__SmfState, state));
   447 		return (adr_data_new_enum_byname(&t__SmfState, state));
   443 	}
   448 	}
   444 }
   449 }
   445 
   450 
   446 /* ARGSUSED */
   451 /* ARGSUSED */
   447 conerr_t
   452 conerr_t
   448 interface_ServiceInfo_read_state(rad_instance_t *inst, adr_attribute_t *attr,
   453 interface_ServiceInfo_read_state(rad_instance_t *inst, adr_attribute_t *attr,
   449     data_t **data, data_t **error)
   454     adr_data_t **data, adr_data_t **error)
   450 {
   455 {
   451 	servinst_t *si = instance_getdata(inst);
   456 	servinst_t *si = instance_getdata(inst);
   452 	if (!si->instance)
   457 	if (!si->instance)
   453 		return (error_scf(error, SCF_ERROR_INVALID_ARGUMENT));
   458 		return (error_scf(error, SCF_ERROR_INVALID_ARGUMENT));
   454 
   459 
   462 }
   467 }
   463 
   468 
   464 /* ARGSUSED */
   469 /* ARGSUSED */
   465 conerr_t
   470 conerr_t
   466 interface_ServiceInfo_read_nextState(rad_instance_t *inst,
   471 interface_ServiceInfo_read_nextState(rad_instance_t *inst,
   467     adr_attribute_t *attr, data_t **data, data_t **error)
   472     adr_attribute_t *attr, adr_data_t **data, adr_data_t **error)
   468 {
   473 {
   469 	servinst_t *si = instance_getdata(inst);
   474 	servinst_t *si = instance_getdata(inst);
   470 	if (!si->instance)
   475 	if (!si->instance)
   471 		return (error_scf(error, SCF_ERROR_INVALID_ARGUMENT));
   476 		return (error_scf(error, SCF_ERROR_INVALID_ARGUMENT));
   472 
   477 
   488 }
   493 }
   489 
   494 
   490 /* ARGSUSED */
   495 /* ARGSUSED */
   491 conerr_t
   496 conerr_t
   492 interface_ServiceInfo_read_auxiliaryState(rad_instance_t *inst,
   497 interface_ServiceInfo_read_auxiliaryState(rad_instance_t *inst,
   493     adr_attribute_t *attr, data_t **data, data_t **error)
   498     adr_attribute_t *attr, adr_data_t **data, adr_data_t **error)
   494 {
   499 {
   495 	servinst_t *si = instance_getdata(inst);
   500 	servinst_t *si = instance_getdata(inst);
   496 	if (!si->instance)
   501 	if (!si->instance)
   497 		return (error_scf(error, SCF_ERROR_INVALID_ARGUMENT));
   502 		return (error_scf(error, SCF_ERROR_INVALID_ARGUMENT));
   498 
   503 
   511 			return (ce_ok);
   516 			return (ce_ok);
   512 		}
   517 		}
   513 		return (error_scf(error, scferr));
   518 		return (error_scf(error, scferr));
   514 	}
   519 	}
   515 
   520 
   516 	*data = data_new_string(aux, lt_copy);
   521 	*data = adr_data_new_string(aux, LT_COPY);
   517 	rad_clean_propvec(evec);
   522 	rad_clean_propvec(evec);
   518 
   523 
   519 	return (*data != NULL ? ce_ok : ce_system);
   524 	return (*data != NULL ? ce_ok : ce_system);
   520 }
   525 }
   521 
   526 
   522 /* ARGSUSED */
   527 /* ARGSUSED */
   523 conerr_t
   528 conerr_t
   524 interface_ServiceInfo_read_stime(rad_instance_t *inst, adr_attribute_t *attr,
   529 interface_ServiceInfo_read_stime(rad_instance_t *inst, adr_attribute_t *attr,
   525     data_t **data, data_t **error)
   530     adr_data_t **data, adr_data_t **error)
   526 {
   531 {
   527 	servinst_t *si = instance_getdata(inst);
   532 	servinst_t *si = instance_getdata(inst);
   528 	if (!si->instance)
   533 	if (!si->instance)
   529 		return (error_scf(error, SCF_ERROR_INVALID_ARGUMENT));
   534 		return (error_scf(error, SCF_ERROR_INVALID_ARGUMENT));
   530 
   535 
   540 	if (scferr != 0)
   545 	if (scferr != 0)
   541 		return (error_scf(error, scferr));
   546 		return (error_scf(error, scferr));
   542 
   547 
   543 	rad_clean_propvec(evec);
   548 	rad_clean_propvec(evec);
   544 
   549 
   545 	*data = data_new_time(time.t_seconds, time.t_ns);
   550 	*data = adr_data_new_time(time.t_seconds, time.t_ns);
   546 
   551 
   547 	return (*data != NULL ? ce_ok : ce_system);
   552 	return (*data != NULL ? ce_ok : ce_system);
   548 }
   553 }
   549 
   554 
   550 /* ARGSUSED */
   555 /* ARGSUSED */
   551 conerr_t
   556 conerr_t
   552 interface_ServiceInfo_read_contractID(rad_instance_t *inst,
   557 interface_ServiceInfo_read_contractID(rad_instance_t *inst,
   553     adr_attribute_t *attr, data_t **data, data_t **error)
   558     adr_attribute_t *attr, adr_data_t **data, adr_data_t **error)
   554 {
   559 {
   555 	servinst_t *si = instance_getdata(inst);
   560 	servinst_t *si = instance_getdata(inst);
   556 	if (!si->instance)
   561 	if (!si->instance)
   557 		return (error_scf(error, SCF_ERROR_INVALID_ARGUMENT));
   562 		return (error_scf(error, SCF_ERROR_INVALID_ARGUMENT));
   558 
   563 
   567 	    &badprop);
   572 	    &badprop);
   568 	if (scferr != 0)
   573 	if (scferr != 0)
   569 		return (error_scf(error, scferr));
   574 		return (error_scf(error, scferr));
   570 	rad_clean_propvec(evec);
   575 	rad_clean_propvec(evec);
   571 
   576 
   572 	*data = data_new_long(count);
   577 	*data = adr_data_new_long(count);
   573 
   578 
   574 	return (*data != NULL ? ce_ok : ce_system);
   579 	return (*data != NULL ? ce_ok : ce_system);
   575 }
   580 }
   576 
   581 
   577 /* ARGSUSED */
   582 /* ARGSUSED */
   578 conerr_t
   583 conerr_t
   579 interface_ServiceInfo_read_reason(rad_instance_t *inst, adr_attribute_t *attr,
   584 interface_ServiceInfo_read_reason(rad_instance_t *inst, adr_attribute_t *attr,
   580     data_t **data, data_t **error)
   585     adr_data_t **data, adr_data_t **error)
   581 {
   586 {
   582 	servinst_t *si = instance_getdata(inst);
   587 	servinst_t *si = instance_getdata(inst);
   583 	if (!si->instance)
   588 	if (!si->instance)
   584 		return (error_scf(error, SCF_ERROR_INVALID_ARGUMENT));
   589 		return (error_scf(error, SCF_ERROR_INVALID_ARGUMENT));
   585 	*data = NULL;
   590 	*data = NULL;
   587 }
   592 }
   588 
   593 
   589 /* ARGSUSED */
   594 /* ARGSUSED */
   590 conerr_t
   595 conerr_t
   591 interface_ServiceInfo_write_persistentlyEnabled(rad_instance_t *inst,
   596 interface_ServiceInfo_write_persistentlyEnabled(rad_instance_t *inst,
   592     adr_attribute_t *attr, data_t *data, data_t **error)
   597     adr_attribute_t *attr, adr_data_t *data, adr_data_t **error)
   593 {
   598 {
   594 	servinst_t *si = instance_getdata(inst);
   599 	servinst_t *si = instance_getdata(inst);
   595 	boolean_t enable = data_to_boolean(data);
   600 	boolean_t enable = adr_data_to_boolean(data);
   596 	if (!si->instance)
   601 	if (!si->instance)
   597 		return (error_scf(error, SCF_ERROR_INVALID_ARGUMENT));
   602 		return (error_scf(error, SCF_ERROR_INVALID_ARGUMENT));
   598 
   603 
   599 	return (simple_scf(error, enable ? smf_enable_instance(si->fmri, 0) :
   604 	return (simple_scf(error, enable ? smf_enable_instance(si->fmri, 0) :
   600 	    smf_disable_instance(si->fmri, 0)));
   605 	    smf_disable_instance(si->fmri, 0)));
   601 }
   606 }
   602 
   607 
   603 static conerr_t
   608 static conerr_t
   604 get_pg(scf_handle_t *scfhandle, scf_propertygroup_t *pg, servinst_t *si,
   609 get_pg(scf_handle_t *scfhandle, scf_propertygroup_t *pg, servinst_t *si,
   605     const char *snapname, const char *pgname, data_t **error)
   610     const char *snapname, const char *pgname, adr_data_t **error)
   606 {
   611 {
   607 	conerr_t err = ce_ok;
   612 	conerr_t err = ce_ok;
   608 	scf_service_t *service = scf_service_create(scfhandle);
   613 	scf_service_t *service = scf_service_create(scfhandle);
   609 	scf_instance_t *instance = scf_instance_create(scfhandle);
   614 	scf_instance_t *instance = scf_instance_create(scfhandle);
   610 	scf_snapshot_t *snap = scf_snapshot_create(scfhandle);
   615 	scf_snapshot_t *snap = scf_snapshot_create(scfhandle);
   651 }
   656 }
   652 
   657 
   653 /* ARGSUSED */
   658 /* ARGSUSED */
   654 conerr_t
   659 conerr_t
   655 interface_ServiceInfo_invoke_getDependency(rad_instance_t *inst,
   660 interface_ServiceInfo_invoke_getDependency(rad_instance_t *inst,
   656     adr_method_t *meth, data_t **ret, data_t **args, int count, data_t **error)
   661     adr_method_t *meth, adr_data_t **ret, adr_data_t **args, int count,
       
   662     adr_data_t **error)
   657 {
   663 {
   658 	conerr_t err = ce_ok;
   664 	conerr_t err = ce_ok;
   659 	const char *pgname = data_to_string(args[0]);
   665 	const char *pgname = adr_data_to_string(args[0]);
   660 	servinst_t *si = instance_getdata(inst);
   666 	servinst_t *si = instance_getdata(inst);
   661 	char type[1000];
   667 	char type[1000];
   662 	char grouping[1000];
   668 	char grouping[1000];
   663 	char restarton[1000];
   669 	char restarton[1000];
   664 
   670 
   696 	    scf_iter_property_values(iter, prop) != 0) {
   702 	    scf_iter_property_values(iter, prop) != 0) {
   697 		err = error_scf(error, scf_error());
   703 		err = error_scf(error, scf_error());
   698 		goto out;
   704 		goto out;
   699 	}
   705 	}
   700 
   706 
   701 	data_t *result = data_new_struct(&t__Dependency);
   707 	adr_data_t *result = adr_data_new_struct(&t__Dependency);
   702 	data_t *array = data_new_array(&t_array_string, 5);
   708 	adr_data_t *array = adr_data_new_array(&adr_t_array_string, 5);
   703 	struct_set(result, "name", data_ref(args[0]));
   709 	adr_struct_set(result, "name", adr_data_ref(args[0]));
   704 	struct_set(result, "grouping", data_new_string(grouping, lt_copy));
   710 	adr_struct_set(result, "grouping",
   705 	struct_set(result, "restartOn", data_new_string(restarton, lt_copy));
   711 	    adr_data_new_string(grouping, LT_COPY));
   706 	struct_set(result, "target", array);
   712 	adr_struct_set(result, "restartOn",
       
   713 	    adr_data_new_string(restarton, LT_COPY));
       
   714 	adr_struct_set(result, "target", array);
   707 	while (scf_iter_next_value(iter, val) > 0) {
   715 	while (scf_iter_next_value(iter, val) > 0) {
   708 		if (scf_value_get_as_string(val, type, sizeof (type)) == -1) {
   716 		if (scf_value_get_as_string(val, type, sizeof (type)) == -1) {
   709 			err = error_scf(error, scf_error());
   717 			err = error_scf(error, scf_error());
   710 			data_free(result);
   718 			adr_data_free(result);
   711 			goto out;
   719 			goto out;
   712 		}
   720 		}
   713 		(void) array_add(array, data_new_string(type, lt_copy));
   721 		(void) adr_array_add(array, adr_data_new_string(type, LT_COPY));
   714 	}
   722 	}
   715 	if (!data_verify(result, NULL, B_TRUE)) {
   723 	if (!adr_data_verify(result, NULL, B_TRUE)) {
   716 		data_free(result);
   724 		adr_data_free(result);
   717 		err = error_scf(error, SCF_ERROR_NO_MEMORY);
   725 		err = error_scf(error, SCF_ERROR_NO_MEMORY);
   718 		goto out;
   726 		goto out;
   719 	}
   727 	}
   720 
   728 
   721 	*ret = result;
   729 	*ret = result;
   729 }
   737 }
   730 
   738 
   731 /* ARGSUSED */
   739 /* ARGSUSED */
   732 conerr_t
   740 conerr_t
   733 interface_ServiceInfo_invoke_getPropertyNames(rad_instance_t *inst,
   741 interface_ServiceInfo_invoke_getPropertyNames(rad_instance_t *inst,
   734     adr_method_t *meth, data_t **ret, data_t **args, int count, data_t **error)
   742     adr_method_t *meth, adr_data_t **ret, adr_data_t **args, int count,
       
   743     adr_data_t **error)
   735 {
   744 {
   736 	conerr_t err = ce_ok;
   745 	conerr_t err = ce_ok;
   737 	const char *pgname = data_to_string(args[0]);
   746 	const char *pgname = adr_data_to_string(args[0]);
   738 	servinst_t *si = instance_getdata(inst);
   747 	servinst_t *si = instance_getdata(inst);
   739 
   748 
   740 	scf_handle_t *scfhandle = handle_create();
   749 	scf_handle_t *scfhandle = handle_create();
   741 	scf_iter_t *iter = scf_iter_create(scfhandle);
   750 	scf_iter_t *iter = scf_iter_create(scfhandle);
   742 	scf_propertygroup_t *pg = scf_pg_create(scfhandle);
   751 	scf_propertygroup_t *pg = scf_pg_create(scfhandle);
   749 
   758 
   750 	if ((err = get_pg(scfhandle, pg, si, "running", pgname, error))
   759 	if ((err = get_pg(scfhandle, pg, si, "running", pgname, error))
   751 	    != ce_ok)
   760 	    != ce_ok)
   752 		goto out;
   761 		goto out;
   753 
   762 
   754 	data_t *result = data_new_array(&t_array_string, 5);
   763 	adr_data_t *result = adr_data_new_array(&adr_t_array_string, 5);
   755 	(void) scf_iter_pg_properties(iter, pg);
   764 	(void) scf_iter_pg_properties(iter, pg);
   756 	while (scf_iter_next_property(iter, prop) > 0) {
   765 	while (scf_iter_next_property(iter, prop) > 0) {
   757 		char pbuf[1000];
   766 		char pbuf[1000];
   758 		(void) scf_property_get_name(prop, pbuf, 1000);
   767 		(void) scf_property_get_name(prop, pbuf, 1000);
   759 		(void) array_add(result, data_new_string(pbuf, lt_copy));
   768 		(void) adr_array_add(result,
       
   769 		    adr_data_new_string(pbuf, LT_COPY));
   760 	}
   770 	}
   761 	*ret = result;
   771 	*ret = result;
   762 
   772 
   763 out:
   773 out:
   764 	scf_property_destroy(prop);
   774 	scf_property_destroy(prop);
   770 }
   780 }
   771 
   781 
   772 /* ARGSUSED */
   782 /* ARGSUSED */
   773 conerr_t
   783 conerr_t
   774 interface_ServiceInfo_invoke_getPropertyType(rad_instance_t *inst,
   784 interface_ServiceInfo_invoke_getPropertyType(rad_instance_t *inst,
   775     adr_method_t *meth, data_t **ret, data_t **args, int count, data_t **error)
   785     adr_method_t *meth, adr_data_t **ret, adr_data_t **args, int count,
   776 {
   786     adr_data_t **error)
   777 	const char *pgname = data_to_string(args[0]);
   787 {
   778 	const char *propname = data_to_string(args[1]);
   788 	const char *pgname = adr_data_to_string(args[0]);
       
   789 	const char *propname = adr_data_to_string(args[1]);
   779 	conerr_t err = ce_ok;
   790 	conerr_t err = ce_ok;
   780 	servinst_t *si = instance_getdata(inst);
   791 	servinst_t *si = instance_getdata(inst);
   781 
   792 
   782 	scf_handle_t *scfhandle = handle_create();
   793 	scf_handle_t *scfhandle = handle_create();
   783 	scf_propertygroup_t *pg = scf_pg_create(scfhandle);
   794 	scf_propertygroup_t *pg = scf_pg_create(scfhandle);
   796 	    scf_property_type(prop, &type) != 0) {
   807 	    scf_property_type(prop, &type) != 0) {
   797 		err = error_scf(error, scf_error());
   808 		err = error_scf(error, scf_error());
   798 		goto out;
   809 		goto out;
   799 	}
   810 	}
   800 
   811 
   801 	data_t *result = data_new_enum(&t__PropertyType, type);
   812 	adr_data_t *result = adr_data_new_enum(&t__PropertyType, type);
   802 	if (result != NULL)
   813 	if (result != NULL)
   803 		*ret = result;
   814 		*ret = result;
   804 	else
   815 	else
   805 		err = error_scf(error, SCF_ERROR_NO_MEMORY);
   816 		err = error_scf(error, SCF_ERROR_NO_MEMORY);
   806 
   817 
   812 }
   823 }
   813 
   824 
   814 /* ARGSUSED */
   825 /* ARGSUSED */
   815 conerr_t
   826 conerr_t
   816 interface_ServiceInfo_invoke_getPropertyValues(rad_instance_t *inst,
   827 interface_ServiceInfo_invoke_getPropertyValues(rad_instance_t *inst,
   817     adr_method_t *meth, data_t **ret, data_t **args, int count, data_t **error)
   828     adr_method_t *meth, adr_data_t **ret, adr_data_t **args, int count,
       
   829     adr_data_t **error)
   818 {
   830 {
   819 	conerr_t err = ce_ok;
   831 	conerr_t err = ce_ok;
   820 	const char *pgname = data_to_string(args[0]);
   832 	const char *pgname = adr_data_to_string(args[0]);
   821 	const char *propname = data_to_string(args[1]);
   833 	const char *propname = adr_data_to_string(args[1]);
   822 
   834 
   823 	servinst_t *si = instance_getdata(inst);
   835 	servinst_t *si = instance_getdata(inst);
   824 
   836 
   825 	scf_handle_t *scfhandle = handle_create();
   837 	scf_handle_t *scfhandle = handle_create();
   826 	scf_service_t *service = scf_service_create(scfhandle);
   838 	scf_service_t *service = scf_service_create(scfhandle);
   851 	    scf_iter_property_values(iter, prop) != 0) {
   863 	    scf_iter_property_values(iter, prop) != 0) {
   852 		err = error_scf(error, scf_error());
   864 		err = error_scf(error, scf_error());
   853 		goto out;
   865 		goto out;
   854 	}
   866 	}
   855 
   867 
   856 	data_t *result = data_new_array(&t_array_string, 5);
   868 	adr_data_t *result = adr_data_new_array(&adr_t_array_string, 5);
   857 	while (scf_iter_next_value(iter, val) > 0) {
   869 	while (scf_iter_next_value(iter, val) > 0) {
   858 		char pbuf[1000];
   870 		char pbuf[1000];
   859 		(void) scf_value_get_as_string(val, pbuf, 1000);
   871 		(void) scf_value_get_as_string(val, pbuf, 1000);
   860 		(void) array_add(result, data_new_string(pbuf, lt_copy));
   872 		(void) adr_array_add(result,
       
   873 		    adr_data_new_string(pbuf, LT_COPY));
   861 	}
   874 	}
   862 	*ret = result;
   875 	*ret = result;
   863 out:
   876 out:
   864 	scf_value_destroy(val);
   877 	scf_value_destroy(val);
   865 	scf_property_destroy(prop);
   878 	scf_property_destroy(prop);
   874 }
   887 }
   875 
   888 
   876 /* ARGSUSED */
   889 /* ARGSUSED */
   877 conerr_t
   890 conerr_t
   878 interface_ServiceInfo_invoke_getSnapshotPropertyValues(rad_instance_t *inst,
   891 interface_ServiceInfo_invoke_getSnapshotPropertyValues(rad_instance_t *inst,
   879     adr_method_t *meth, data_t **ret, data_t **args, int count, data_t **error)
   892     adr_method_t *meth, adr_data_t **ret, adr_data_t **args, int count,
       
   893     adr_data_t **error)
   880 {
   894 {
   881 	conerr_t err = ce_ok;
   895 	conerr_t err = ce_ok;
   882 	const char *snapname = data_to_string(args[0]);
   896 	const char *snapname = adr_data_to_string(args[0]);
   883 	const char *pgname = data_to_string(args[1]);
   897 	const char *pgname = adr_data_to_string(args[1]);
   884 	const char *propname = data_to_string(args[2]);
   898 	const char *propname = adr_data_to_string(args[2]);
   885 
   899 
   886 	servinst_t *si = instance_getdata(inst);
   900 	servinst_t *si = instance_getdata(inst);
   887 	if (!si->instance)
   901 	if (!si->instance)
   888 		return (error_scf(error, SCF_ERROR_INVALID_ARGUMENT));
   902 		return (error_scf(error, SCF_ERROR_INVALID_ARGUMENT));
   889 
   903 
   907 	if (scf_pg_get_property(pg, propname, prop) != 0) {
   921 	if (scf_pg_get_property(pg, propname, prop) != 0) {
   908 		err = error_scf(error, scf_error());
   922 		err = error_scf(error, scf_error());
   909 		goto out;
   923 		goto out;
   910 	}
   924 	}
   911 
   925 
   912 	data_t *result = data_new_array(&t_array_string, 5);
   926 	adr_data_t *result = adr_data_new_array(&adr_t_array_string, 5);
   913 	(void) scf_iter_property_values(iter, prop);
   927 	(void) scf_iter_property_values(iter, prop);
   914 	while (scf_iter_next_value(iter, val) > 0) {
   928 	while (scf_iter_next_value(iter, val) > 0) {
   915 		char pbuf[1000];
   929 		char pbuf[1000];
   916 		(void) scf_value_get_as_string(val, pbuf, 1000);
   930 		(void) scf_value_get_as_string(val, pbuf, 1000);
   917 		(void) array_add(result, data_new_string(pbuf, lt_copy));
   931 		(void) adr_array_add(result,
       
   932 		    adr_data_new_string(pbuf, LT_COPY));
   918 	}
   933 	}
   919 	*ret = result;
   934 	*ret = result;
   920 out:
   935 out:
   921 	scf_value_destroy(val);
   936 	scf_value_destroy(val);
   922 	scf_property_destroy(prop);
   937 	scf_property_destroy(prop);
   928 }
   943 }
   929 
   944 
   930 /* ARGSUSED */
   945 /* ARGSUSED */
   931 conerr_t
   946 conerr_t
   932 interface_ServiceInfo_invoke_setPropertyValues(rad_instance_t *inst,
   947 interface_ServiceInfo_invoke_setPropertyValues(rad_instance_t *inst,
   933     adr_method_t *meth, data_t **ret, data_t **args, int count, data_t **error)
   948     adr_method_t *meth, adr_data_t **ret, adr_data_t **args, int count,
       
   949     adr_data_t **error)
   934 {
   950 {
   935 	conerr_t err = ce_ok;
   951 	conerr_t err = ce_ok;
   936 	const char *pgname = data_to_string(args[0]);
   952 	const char *pgname = adr_data_to_string(args[0]);
   937 	const char *propname = data_to_string(args[1]);
   953 	const char *propname = adr_data_to_string(args[1]);
   938 	data_t *values = args[2];
   954 	adr_data_t *values = args[2];
   939 
   955 
   940 	servinst_t *si = instance_getdata(inst);
   956 	servinst_t *si = instance_getdata(inst);
   941 
   957 
   942 	scf_handle_t *scfhandle = handle_create();
   958 	scf_handle_t *scfhandle = handle_create();
   943 	scf_service_t *service = scf_service_create(scfhandle);
   959 	scf_service_t *service = scf_service_create(scfhandle);
   945 	scf_propertygroup_t *pg = scf_pg_create(scfhandle);
   961 	scf_propertygroup_t *pg = scf_pg_create(scfhandle);
   946 	scf_property_t *prop = scf_property_create(scfhandle);
   962 	scf_property_t *prop = scf_property_create(scfhandle);
   947 	scf_transaction_t *tx = scf_transaction_create(scfhandle);
   963 	scf_transaction_t *tx = scf_transaction_create(scfhandle);
   948 	scf_transaction_entry_t *ent = scf_entry_create(scfhandle);
   964 	scf_transaction_entry_t *ent = scf_entry_create(scfhandle);
   949 	scf_value_t **val =
   965 	scf_value_t **val =
   950 	    rad_zalloc(array_size(values) * sizeof (scf_value_t *));
   966 	    rad_zalloc(adr_array_size(values) * sizeof (scf_value_t *));
   951 	scf_type_t type;
   967 	scf_type_t type;
   952 
   968 
   953 	if (scfhandle == NULL || service == NULL || instance == NULL ||
   969 	if (scfhandle == NULL || service == NULL || instance == NULL ||
   954 	    pg == NULL || prop == NULL || tx == NULL || ent == NULL ||
   970 	    pg == NULL || prop == NULL || tx == NULL || ent == NULL ||
   955 	    val == NULL) {
   971 	    val == NULL) {
   956 		err = error_scf(error, SCF_ERROR_NO_MEMORY);
   972 		err = error_scf(error, SCF_ERROR_NO_MEMORY);
   957 		goto out;
   973 		goto out;
   958 	}
   974 	}
   959 
   975 
   960 	for (int i = 0; i < array_size(values); i++) {
   976 	for (int i = 0; i < adr_array_size(values); i++) {
   961 		if ((val[i] = scf_value_create(scfhandle)) == NULL) {
   977 		if ((val[i] = scf_value_create(scfhandle)) == NULL) {
   962 			err = error_scf(error, SCF_ERROR_NO_MEMORY);
   978 			err = error_scf(error, SCF_ERROR_NO_MEMORY);
   963 			goto out;
   979 			goto out;
   964 		}
   980 		}
   965 	}
   981 	}
  1000 	if (scf_transaction_property_change(tx, ent, propname, type) != 0) {
  1016 	if (scf_transaction_property_change(tx, ent, propname, type) != 0) {
  1001 		err = error_scf(error, scf_error());
  1017 		err = error_scf(error, scf_error());
  1002 		goto out;
  1018 		goto out;
  1003 	}
  1019 	}
  1004 
  1020 
  1005 	for (int i = 0; i < array_size(values); i++) {
  1021 	for (int i = 0; i < adr_array_size(values); i++) {
  1006 		if (scf_value_set_from_string(val[i], type,
  1022 		if (scf_value_set_from_string(val[i], type,
  1007 		    data_to_string(array_get(values, i))) != 0 ||
  1023 		    adr_data_to_string(adr_array_get(values, i))) != 0 ||
  1008 		    scf_entry_add_value(ent, val[i]) != 0) {
  1024 		    scf_entry_add_value(ent, val[i]) != 0) {
  1009 			err = error_scf(error, scf_error());
  1025 			err = error_scf(error, scf_error());
  1010 			goto out;
  1026 			goto out;
  1011 		}
  1027 		}
  1012 	}
  1028 	}
  1020 	}
  1036 	}
  1021 	err = error_scf(error, scf_error());
  1037 	err = error_scf(error, scf_error());
  1022 
  1038 
  1023 out:
  1039 out:
  1024 	if (val != NULL) {
  1040 	if (val != NULL) {
  1025 		for (int i = 0; i < array_size(values); i++) {
  1041 		for (int i = 0; i < adr_array_size(values); i++) {
  1026 			if (val[i] == NULL)
  1042 			if (val[i] == NULL)
  1027 				break;
  1043 				break;
  1028 			scf_value_destroy(val[i]);
  1044 			scf_value_destroy(val[i]);
  1029 		}
  1045 		}
  1030 		free(val);
  1046 		free(val);
  1042 }
  1058 }
  1043 
  1059 
  1044 /* ARGSUSED */
  1060 /* ARGSUSED */
  1045 conerr_t
  1061 conerr_t
  1046 interface_ServiceInfo_invoke_createPropertyGroup(rad_instance_t *inst,
  1062 interface_ServiceInfo_invoke_createPropertyGroup(rad_instance_t *inst,
  1047     adr_method_t *meth, data_t **ret, data_t **args, int count, data_t **error)
  1063     adr_method_t *meth, adr_data_t **ret, adr_data_t **args, int count,
       
  1064     adr_data_t **error)
  1048 {
  1065 {
  1049 	conerr_t err = ce_ok;
  1066 	conerr_t err = ce_ok;
  1050 	const char *pgname = data_to_string(args[0]);
  1067 	const char *pgname = adr_data_to_string(args[0]);
  1051 	const char *pgtype = data_to_string(args[1]);
  1068 	const char *pgtype = adr_data_to_string(args[1]);
  1052 
  1069 
  1053 	servinst_t *si = instance_getdata(inst);
  1070 	servinst_t *si = instance_getdata(inst);
  1054 
  1071 
  1055 	scf_handle_t *scfhandle = handle_create();
  1072 	scf_handle_t *scfhandle = handle_create();
  1056 	scf_service_t *service = scf_service_create(scfhandle);
  1073 	scf_service_t *service = scf_service_create(scfhandle);
  1093 }
  1110 }
  1094 
  1111 
  1095 /* ARGSUSED */
  1112 /* ARGSUSED */
  1096 conerr_t
  1113 conerr_t
  1097 interface_ServiceInfo_invoke_deletePropertyGroup(rad_instance_t *inst,
  1114 interface_ServiceInfo_invoke_deletePropertyGroup(rad_instance_t *inst,
  1098     adr_method_t *meth, data_t **ret, data_t **args, int count, data_t **error)
  1115     adr_method_t *meth, adr_data_t **ret, adr_data_t **args, int count,
       
  1116     adr_data_t **error)
  1099 {
  1117 {
  1100 	conerr_t err = ce_ok;
  1118 	conerr_t err = ce_ok;
  1101 	const char *pgname = data_to_string(args[0]);
  1119 	const char *pgname = adr_data_to_string(args[0]);
  1102 
  1120 
  1103 	servinst_t *si = instance_getdata(inst);
  1121 	servinst_t *si = instance_getdata(inst);
  1104 
  1122 
  1105 	scf_handle_t *scfhandle = handle_create();
  1123 	scf_handle_t *scfhandle = handle_create();
  1106 	scf_service_t *service = scf_service_create(scfhandle);
  1124 	scf_service_t *service = scf_service_create(scfhandle);
  1149 }
  1167 }
  1150 
  1168 
  1151 /* ARGSUSED */
  1169 /* ARGSUSED */
  1152 conerr_t
  1170 conerr_t
  1153 interface_ServiceInfo_invoke_createProperty(rad_instance_t *inst,
  1171 interface_ServiceInfo_invoke_createProperty(rad_instance_t *inst,
  1154     adr_method_t *meth, data_t **ret, data_t **args, int count, data_t **error)
  1172     adr_method_t *meth, adr_data_t **ret, adr_data_t **args, int count,
       
  1173     adr_data_t **error)
  1155 {
  1174 {
  1156 	conerr_t err = ce_ok;
  1175 	conerr_t err = ce_ok;
  1157 	const char *pgname = data_to_string(args[0]);
  1176 	const char *pgname = adr_data_to_string(args[0]);
  1158 	const char *propname = data_to_string(args[1]);
  1177 	const char *propname = adr_data_to_string(args[1]);
  1159 	scf_type_t type = enum_tovalue(args[2]);
  1178 	scf_type_t type = adr_enum_tovalue(args[2]);
  1160 	int sret;
  1179 	int sret;
  1161 
  1180 
  1162 	servinst_t *si = instance_getdata(inst);
  1181 	servinst_t *si = instance_getdata(inst);
  1163 
  1182 
  1164 	scf_handle_t *scfhandle = handle_create();
  1183 	scf_handle_t *scfhandle = handle_create();
  1230 }
  1249 }
  1231 
  1250 
  1232 /* ARGSUSED */
  1251 /* ARGSUSED */
  1233 conerr_t
  1252 conerr_t
  1234 interface_ServiceInfo_invoke_deleteProperty(rad_instance_t *inst,
  1253 interface_ServiceInfo_invoke_deleteProperty(rad_instance_t *inst,
  1235     adr_method_t *meth, data_t **ret, data_t **args, int count, data_t **error)
  1254     adr_method_t *meth, adr_data_t **ret, adr_data_t **args, int count,
       
  1255     adr_data_t **error)
  1236 {
  1256 {
  1237 	conerr_t err = ce_ok;
  1257 	conerr_t err = ce_ok;
  1238 	const char *pgname = data_to_string(args[0]);
  1258 	const char *pgname = adr_data_to_string(args[0]);
  1239 	const char *propname = data_to_string(args[1]);
  1259 	const char *propname = adr_data_to_string(args[1]);
  1240 	int sret;
  1260 	int sret;
  1241 
  1261 
  1242 	servinst_t *si = instance_getdata(inst);
  1262 	servinst_t *si = instance_getdata(inst);
  1243 
  1263 
  1244 	scf_handle_t *scfhandle = handle_create();
  1264 	scf_handle_t *scfhandle = handle_create();
  1307 }
  1327 }
  1308 
  1328 
  1309 /* ARGSUSED */
  1329 /* ARGSUSED */
  1310 conerr_t
  1330 conerr_t
  1311 interface_ServiceInfo_invoke_getPropertyTemplate(rad_instance_t *inst,
  1331 interface_ServiceInfo_invoke_getPropertyTemplate(rad_instance_t *inst,
  1312     adr_method_t *meth, data_t **ret, data_t **args, int count, data_t **error)
  1332     adr_method_t *meth, adr_data_t **ret, adr_data_t **args, int count,
       
  1333     adr_data_t **error)
  1313 {
  1334 {
  1314 	conerr_t err = ce_ok;
  1335 	conerr_t err = ce_ok;
  1315 	const char *pgname = data_to_string(args[0]);
  1336 	const char *pgname = adr_data_to_string(args[0]);
  1316 	const char *propname = data_to_string(args[1]);
  1337 	const char *propname = adr_data_to_string(args[1]);
  1317 	const char *locale = data_to_string(args[2]);
  1338 	const char *locale = adr_data_to_string(args[2]);
  1318 
  1339 
  1319 	servinst_t *si = instance_getdata(inst);
  1340 	servinst_t *si = instance_getdata(inst);
  1320 	scf_handle_t *scfhandle = handle_create();
  1341 	scf_handle_t *scfhandle = handle_create();
  1321 	scf_pg_tmpl_t *pgtmpl = scf_tmpl_pg_create(scfhandle);
  1342 	scf_pg_tmpl_t *pgtmpl = scf_tmpl_pg_create(scfhandle);
  1322 	scf_prop_tmpl_t *proptmpl = scf_tmpl_prop_create(scfhandle);
  1343 	scf_prop_tmpl_t *proptmpl = scf_tmpl_prop_create(scfhandle);
  1331 	    scf_tmpl_get_by_prop(pgtmpl, propname, proptmpl, 0) == -1) {
  1352 	    scf_tmpl_get_by_prop(pgtmpl, propname, proptmpl, 0) == -1) {
  1332 		err = error_scf(error, scf_error());
  1353 		err = error_scf(error, scf_error());
  1333 		goto out;
  1354 		goto out;
  1334 	}
  1355 	}
  1335 
  1356 
  1336 	data_t *result = data_new_struct(&t__Template);
  1357 	adr_data_t *result = adr_data_new_struct(&t__Template);
  1337 
  1358 
  1338 	char *name;
  1359 	char *name;
  1339 	if (scf_tmpl_prop_common_name(proptmpl, locale, &name) >= 0)
  1360 	if (scf_tmpl_prop_common_name(proptmpl, locale, &name) >= 0)
  1340 		struct_set(result, "name", data_new_string(name, lt_free));
  1361 		adr_struct_set(result, "name",
       
  1362 		    adr_data_new_string(name, LT_FREE));
  1341 
  1363 
  1342 	if (scf_tmpl_prop_description(proptmpl, locale, &name) >= 0)
  1364 	if (scf_tmpl_prop_description(proptmpl, locale, &name) >= 0)
  1343 		struct_set(result, "description",
  1365 		adr_struct_set(result, "description",
  1344 		    data_new_string(name, lt_free));
  1366 		    adr_data_new_string(name, LT_FREE));
  1345 
  1367 
  1346 	if (scf_tmpl_prop_units(proptmpl, locale, &name) >= 0)
  1368 	if (scf_tmpl_prop_units(proptmpl, locale, &name) >= 0)
  1347 		struct_set(result, "units", data_new_string(name, lt_free));
  1369 		adr_struct_set(result, "units",
       
  1370 		    adr_data_new_string(name, LT_FREE));
  1348 
  1371 
  1349 	uint8_t vis;
  1372 	uint8_t vis;
  1350 	if (scf_tmpl_prop_visibility(proptmpl, &vis) == -1) {
  1373 	if (scf_tmpl_prop_visibility(proptmpl, &vis) == -1) {
  1351 		data_free(result);
  1374 		adr_data_free(result);
  1352 		goto out;
  1375 		goto out;
  1353 	}
  1376 	}
  1354 	data_t *visvalue = NULL;
  1377 	adr_data_t *visvalue = NULL;
  1355 	switch (vis) {
  1378 	switch (vis) {
  1356 	case SCF_TMPL_VISIBILITY_HIDDEN:
  1379 	case SCF_TMPL_VISIBILITY_HIDDEN:
  1357 		visvalue = &e__PropertyVisibility_HIDDEN;
  1380 		visvalue = &e__PropertyVisibility_HIDDEN;
  1358 		break;
  1381 		break;
  1359 	case SCF_TMPL_VISIBILITY_READONLY:
  1382 	case SCF_TMPL_VISIBILITY_READONLY:
  1361 		break;
  1384 		break;
  1362 	case SCF_TMPL_VISIBILITY_READWRITE:
  1385 	case SCF_TMPL_VISIBILITY_READWRITE:
  1363 		visvalue = &e__PropertyVisibility_READWRITE;
  1386 		visvalue = &e__PropertyVisibility_READWRITE;
  1364 		break;
  1387 		break;
  1365 	}
  1388 	}
  1366 	struct_set(result, "visibility", visvalue);
  1389 	adr_struct_set(result, "visibility", visvalue);
  1367 
  1390 
  1368 	scf_values_t values;
  1391 	scf_values_t values;
  1369 	if (scf_tmpl_prop_internal_seps(proptmpl, &values) == 0) {
  1392 	if (scf_tmpl_prop_internal_seps(proptmpl, &values) == 0) {
  1370 		data_t *array =
  1393 		adr_data_t *array =
  1371 		    data_new_array(&t_array_string, values.value_count);
  1394 		    adr_data_new_array(&adr_t_array_string, values.value_count);
  1372 		for (int i = 0; i < values.value_count; i++)
  1395 		for (int i = 0; i < values.value_count; i++)
  1373 			(void) array_add(array, data_new_string(
  1396 			(void) adr_array_add(array, adr_data_new_string(
  1374 			    values.values_as_strings[i], lt_copy));
  1397 			    values.values_as_strings[i], LT_COPY));
  1375 		struct_set(result, "separators", array);
  1398 		adr_struct_set(result, "separators", array);
  1376 		scf_values_destroy(&values);
  1399 		scf_values_destroy(&values);
  1377 	}
  1400 	}
  1378 
  1401 
  1379 	if (scf_tmpl_value_name_choices(proptmpl, &values) == 0) {
  1402 	if (scf_tmpl_value_name_choices(proptmpl, &values) == 0) {
  1380 		data_t *array =
  1403 		adr_data_t *array =
  1381 		    data_new_array(&t_array_string, values.value_count);
  1404 		    adr_data_new_array(&adr_t_array_string, values.value_count);
  1382 		for (int i = 0; i < values.value_count; i++)
  1405 		for (int i = 0; i < values.value_count; i++)
  1383 			(void) array_add(array, data_new_string(
  1406 			(void) adr_array_add(array, adr_data_new_string(
  1384 			    values.values_as_strings[i], lt_copy));
  1407 			    values.values_as_strings[i], LT_COPY));
  1385 		struct_set(result, "allowed", array);
  1408 		adr_struct_set(result, "allowed", array);
  1386 		scf_values_destroy(&values);
  1409 		scf_values_destroy(&values);
  1387 	}
  1410 	}
  1388 
  1411 
  1389 	if ((*ret = data_purify_deep(result)) == NULL)
  1412 	if ((*ret = adr_data_purify_deep(result)) == NULL)
  1390 		err = error_scf(error, SCF_ERROR_NO_MEMORY);
  1413 		err = error_scf(error, SCF_ERROR_NO_MEMORY);
  1391 out:
  1414 out:
  1392 	scf_tmpl_prop_destroy(proptmpl);
  1415 	scf_tmpl_prop_destroy(proptmpl);
  1393 	scf_tmpl_pg_destroy(pgtmpl);
  1416 	scf_tmpl_pg_destroy(pgtmpl);
  1394 	scf_handle_destroy(scfhandle);
  1417 	scf_handle_destroy(scfhandle);
  1396 	return (err);
  1419 	return (err);
  1397 }
  1420 }
  1398 
  1421 
  1399 static int
  1422 static int
  1400 get_localedprop(servinst_t *si, const char *locale, const char *name,
  1423 get_localedprop(servinst_t *si, const char *locale, const char *name,
  1401     data_t **ret, data_t **error)
  1424     adr_data_t **ret, adr_data_t **error)
  1402 {
  1425 {
  1403 	char *str;
  1426 	char *str;
  1404 	rad_propvec_t *badprop;
  1427 	rad_propvec_t *badprop;
  1405 	rad_propvec_t evec[] = {
  1428 	rad_propvec_t evec[] = {
  1406 		{ locale, NULL, SCF_TYPE_ASTRING, &str, 0 },
  1429 		{ locale, NULL, SCF_TYPE_ASTRING, &str, 0 },
  1415 			return (ce_ok);
  1438 			return (ce_ok);
  1416 		}
  1439 		}
  1417 		return (error_scf(error, scferr));
  1440 		return (error_scf(error, scferr));
  1418 	}
  1441 	}
  1419 
  1442 
  1420 	*ret = data_new_string(str, lt_copy);
  1443 	*ret = adr_data_new_string(str, LT_COPY);
  1421 	rad_clean_propvec(evec);
  1444 	rad_clean_propvec(evec);
  1422 	return (ce_ok);
  1445 	return (ce_ok);
  1423 }
  1446 }
  1424 
  1447 
  1425 /* ARGSUSED */
  1448 /* ARGSUSED */
  1426 conerr_t
  1449 conerr_t
  1427 interface_ServiceInfo_invoke_getCommonName(rad_instance_t *inst,
  1450 interface_ServiceInfo_invoke_getCommonName(rad_instance_t *inst,
  1428     adr_method_t *meth, data_t **ret, data_t **args, int count, data_t **error)
  1451     adr_method_t *meth, adr_data_t **ret, adr_data_t **args, int count,
  1429 {
  1452     adr_data_t **error)
  1430 	const char *locale = data_to_string(args[0]);
  1453 {
       
  1454 	const char *locale = adr_data_to_string(args[0]);
  1431 	servinst_t *si = instance_getdata(inst);
  1455 	servinst_t *si = instance_getdata(inst);
  1432 
  1456 
  1433 	if (get_localedprop(si, locale, SCF_PG_TM_COMMON_NAME, ret, NULL)
  1457 	if (get_localedprop(si, locale, SCF_PG_TM_COMMON_NAME, ret, NULL)
  1434 	    == ce_ok)
  1458 	    == ce_ok)
  1435 		return (ce_ok);
  1459 		return (ce_ok);
  1437 }
  1461 }
  1438 
  1462 
  1439 /* ARGSUSED */
  1463 /* ARGSUSED */
  1440 conerr_t
  1464 conerr_t
  1441 interface_ServiceInfo_invoke_getDescription(rad_instance_t *inst,
  1465 interface_ServiceInfo_invoke_getDescription(rad_instance_t *inst,
  1442     adr_method_t *meth, data_t **ret, data_t **args, int count, data_t **error)
  1466     adr_method_t *meth, adr_data_t **ret, adr_data_t **args, int count,
  1443 {
  1467     adr_data_t **error)
  1444 	const char *locale = data_to_string(args[0]);
  1468 {
       
  1469 	const char *locale = adr_data_to_string(args[0]);
  1445 	servinst_t *si = instance_getdata(inst);
  1470 	servinst_t *si = instance_getdata(inst);
  1446 
  1471 
  1447 	if (get_localedprop(si, locale, SCF_PG_TM_DESCRIPTION, ret, NULL)
  1472 	if (get_localedprop(si, locale, SCF_PG_TM_DESCRIPTION, ret, NULL)
  1448 	    == ce_ok)
  1473 	    == ce_ok)
  1449 		return (ce_ok);
  1474 		return (ce_ok);
  1451 }
  1476 }
  1452 
  1477 
  1453 /* ARGSUSED */
  1478 /* ARGSUSED */
  1454 conerr_t
  1479 conerr_t
  1455 interface_ServiceInfo_invoke_getLogInfo(rad_instance_t *inst,
  1480 interface_ServiceInfo_invoke_getLogInfo(rad_instance_t *inst,
  1456     adr_method_t *meth, data_t **ret, data_t **args, int count, data_t **error)
  1481     adr_method_t *meth, adr_data_t **ret, adr_data_t **args, int count,
       
  1482     adr_data_t **error)
  1457 {
  1483 {
  1458 	servinst_t *si = instance_getdata(inst);
  1484 	servinst_t *si = instance_getdata(inst);
  1459 	if (!si->instance)
  1485 	if (!si->instance)
  1460 		return (ce_object);
  1486 		return (ce_object);
  1461 
  1487 
  1475 	if (stat(logname, &st) != 0) {
  1501 	if (stat(logname, &st) != 0) {
  1476 		free(logname);
  1502 		free(logname);
  1477 		return (ce_object);
  1503 		return (ce_object);
  1478 	}
  1504 	}
  1479 
  1505 
  1480 	int max_size = data_to_integer(args[0]);
  1506 	int max_size = adr_data_to_integer(args[0]);
  1481 
  1507 
  1482 	int bsize = max_size >= 0 && max_size < st.st_size ?
  1508 	int bsize = max_size >= 0 && max_size < st.st_size ?
  1483 	    max_size : st.st_size;
  1509 	    max_size : st.st_size;
  1484 	char *buffer = malloc(bsize);
  1510 	char *buffer = malloc(bsize);
  1485 	if (buffer == NULL) {
  1511 	if (buffer == NULL) {
  1501 		return (ce_system);
  1527 		return (ce_system);
  1502 	}
  1528 	}
  1503 
  1529 
  1504 	(void) close(fd);
  1530 	(void) close(fd);
  1505 
  1531 
  1506 	data_t *result = data_new_struct(&t__LogInfo);
  1532 	adr_data_t *result = adr_data_new_struct(&t__LogInfo);
  1507 	struct_set(result, "name", data_new_string(logname, lt_free));
  1533 	adr_struct_set(result, "name", adr_data_new_string(logname, LT_FREE));
  1508 	struct_set(result, "size", data_new_integer(st.st_size));
  1534 	adr_struct_set(result, "size", adr_data_new_integer(st.st_size));
  1509 	struct_set(result, "MTime", data_new_time_ts(&st.st_mtim));
  1535 	adr_struct_set(result, "MTime", adr_data_new_time_ts(&st.st_mtim));
  1510 	struct_set(result, "contents", data_new_opaque(buffer, bsize, lt_free));
  1536 	adr_struct_set(result, "contents",
  1511 
  1537 	    adr_data_new_opaque(buffer, bsize, LT_FREE));
  1512 	if ((*ret = data_purify(result)) == NULL)
  1538 
       
  1539 	if ((*ret = adr_data_purify(result)) == NULL)
  1513 		return (ce_object);
  1540 		return (ce_object);
  1514 
  1541 
  1515 	return (ce_ok);
  1542 	return (ce_ok);
  1516 }
  1543 }
  1517 
  1544 
  1518 /* ARGSUSED */
  1545 /* ARGSUSED */
  1519 conerr_t
  1546 conerr_t
  1520 interface_ServiceInfo_invoke_delete(rad_instance_t *inst, adr_method_t *meth,
  1547 interface_ServiceInfo_invoke_delete(rad_instance_t *inst, adr_method_t *meth,
  1521     data_t **ret, data_t **args, int count, data_t **error)
  1548     adr_data_t **ret, adr_data_t **args, int count, adr_data_t **error)
  1522 {
  1549 {
  1523 	conerr_t err = ce_ok;
  1550 	conerr_t err = ce_ok;
  1524 	servinst_t *si = instance_getdata(inst);
  1551 	servinst_t *si = instance_getdata(inst);
  1525 
  1552 
  1526 	scf_handle_t *scfhandle = handle_create();
  1553 	scf_handle_t *scfhandle = handle_create();
  1552 }
  1579 }
  1553 
  1580 
  1554 /* ARGSUSED */
  1581 /* ARGSUSED */
  1555 conerr_t
  1582 conerr_t
  1556 interface_ServiceInfo_invoke_clear(rad_instance_t *inst, adr_method_t *meth,
  1583 interface_ServiceInfo_invoke_clear(rad_instance_t *inst, adr_method_t *meth,
  1557     data_t **ret, data_t **args, int count, data_t **error)
  1584     adr_data_t **ret, adr_data_t **args, int count, adr_data_t **error)
  1558 {
  1585 {
  1559 	servinst_t *si = instance_getdata(inst);
  1586 	servinst_t *si = instance_getdata(inst);
  1560 	if (!si->instance)
  1587 	if (!si->instance)
  1561 		return (error_scf(error, SCF_ERROR_INVALID_ARGUMENT));
  1588 		return (error_scf(error, SCF_ERROR_INVALID_ARGUMENT));
  1562 
  1589 
  1564 }
  1591 }
  1565 
  1592 
  1566 /* ARGSUSED */
  1593 /* ARGSUSED */
  1567 conerr_t
  1594 conerr_t
  1568 interface_ServiceInfo_invoke_degrade(rad_instance_t *inst, adr_method_t *meth,
  1595 interface_ServiceInfo_invoke_degrade(rad_instance_t *inst, adr_method_t *meth,
  1569     data_t **ret, data_t **args, int count, data_t **error)
  1596     adr_data_t **ret, adr_data_t **args, int count, adr_data_t **error)
  1570 {
  1597 {
  1571 	servinst_t *si = instance_getdata(inst);
  1598 	servinst_t *si = instance_getdata(inst);
  1572 	if (!si->instance)
  1599 	if (!si->instance)
  1573 		return (error_scf(error, SCF_ERROR_INVALID_ARGUMENT));
  1600 		return (error_scf(error, SCF_ERROR_INVALID_ARGUMENT));
  1574 
  1601 
  1575 	return (simple_scf(error, smf_degrade_instance(si->fmri,
  1602 	return (simple_scf(error, smf_degrade_instance(si->fmri,
  1576 	    data_to_boolean(args[0]) ? SMF_IMMEDIATE : 0)));
  1603 	    adr_data_to_boolean(args[0]) ? SMF_IMMEDIATE : 0)));
  1577 }
  1604 }
  1578 
  1605 
  1579 /* ARGSUSED */
  1606 /* ARGSUSED */
  1580 conerr_t
  1607 conerr_t
  1581 interface_ServiceInfo_invoke_maintain(rad_instance_t *inst, adr_method_t *meth,
  1608 interface_ServiceInfo_invoke_maintain(rad_instance_t *inst, adr_method_t *meth,
  1582     data_t **ret, data_t **args, int count, data_t **error)
  1609     adr_data_t **ret, adr_data_t **args, int count, adr_data_t **error)
  1583 {
  1610 {
  1584 	servinst_t *si = instance_getdata(inst);
  1611 	servinst_t *si = instance_getdata(inst);
  1585 	if (!si->instance)
  1612 	if (!si->instance)
  1586 		return (error_scf(error, SCF_ERROR_INVALID_ARGUMENT));
  1613 		return (error_scf(error, SCF_ERROR_INVALID_ARGUMENT));
  1587 
  1614 
  1588 	return (simple_scf(error, smf_maintain_instance(si->fmri,
  1615 	return (simple_scf(error, smf_maintain_instance(si->fmri,
  1589 	    data_to_boolean(args[0]) ? SMF_IMMEDIATE : 0)));
  1616 	    adr_data_to_boolean(args[0]) ? SMF_IMMEDIATE : 0)));
  1590 }
  1617 }
  1591 
  1618 
  1592 /* ARGSUSED */
  1619 /* ARGSUSED */
  1593 conerr_t
  1620 conerr_t
  1594 interface_ServiceInfo_invoke_restart(rad_instance_t *inst, adr_method_t *meth,
  1621 interface_ServiceInfo_invoke_restart(rad_instance_t *inst, adr_method_t *meth,
  1595     data_t **ret, data_t **args, int count, data_t **error)
  1622     adr_data_t **ret, adr_data_t **args, int count, adr_data_t **error)
  1596 {
  1623 {
  1597 	servinst_t *si = instance_getdata(inst);
  1624 	servinst_t *si = instance_getdata(inst);
  1598 	if (!si->instance)
  1625 	if (!si->instance)
  1599 		return (error_scf(error, SCF_ERROR_INVALID_ARGUMENT));
  1626 		return (error_scf(error, SCF_ERROR_INVALID_ARGUMENT));
  1600 
  1627 
  1602 }
  1629 }
  1603 
  1630 
  1604 /* ARGSUSED */
  1631 /* ARGSUSED */
  1605 conerr_t
  1632 conerr_t
  1606 interface_ServiceInfo_invoke_refresh(rad_instance_t *inst, adr_method_t *meth,
  1633 interface_ServiceInfo_invoke_refresh(rad_instance_t *inst, adr_method_t *meth,
  1607     data_t **ret, data_t **args, int count, data_t **error)
  1634     adr_data_t **ret, adr_data_t **args, int count, adr_data_t **error)
  1608 {
  1635 {
  1609 	servinst_t *si = instance_getdata(inst);
  1636 	servinst_t *si = instance_getdata(inst);
  1610 	if (!si->instance)
  1637 	if (!si->instance)
  1611 		return (error_scf(error, SCF_ERROR_INVALID_ARGUMENT));
  1638 		return (error_scf(error, SCF_ERROR_INVALID_ARGUMENT));
  1612 
  1639 
  1614 }
  1641 }
  1615 
  1642 
  1616 /* ARGSUSED */
  1643 /* ARGSUSED */
  1617 conerr_t
  1644 conerr_t
  1618 interface_Aggregator_read_services(rad_instance_t *inst, adr_attribute_t *attr,
  1645 interface_Aggregator_read_services(rad_instance_t *inst, adr_attribute_t *attr,
  1619     data_t **data, data_t **error)
  1646     adr_data_t **data, adr_data_t **error)
  1620 {
  1647 {
  1621 	rad_mutex_enter(&service_lock);
  1648 	rad_mutex_enter(&service_lock);
  1622 	data_t *result = data_new_array(&t_array__Service, service_count);
  1649 	adr_data_t *result =
       
  1650 	    adr_data_new_array(&t_array__Service, service_count);
  1623 
  1651 
  1624 	for (servinst_t *si = list_head(&service_list); si != NULL;
  1652 	for (servinst_t *si = list_head(&service_list); si != NULL;
  1625 	    si = list_next(&service_list, si)) {
  1653 	    si = list_next(&service_list, si)) {
  1626 		data_t *insts = data_new_array(&t_array_string, si->ninstances);
  1654 		adr_data_t *insts = adr_data_new_array(&adr_t_array_string,
       
  1655 		    si->ninstances);
  1627 		for (servinst_t *i = list_head(&si->instances); i != NULL;
  1656 		for (servinst_t *i = list_head(&si->instances); i != NULL;
  1628 		    i = list_next(&si->instances, i))
  1657 		    i = list_next(&si->instances, i))
  1629 			(void) array_add(insts, data_new_string(i->iname,
  1658 			(void) adr_array_add(insts,
  1630 			    lt_copy));
  1659 			    adr_data_new_string(i->iname,
  1631 
  1660 			    LT_COPY));
  1632 		data_t *service = data_new_struct(&t__Service);
  1661 
  1633 		struct_set(service, "fmri", data_new_string(si->fmri, lt_copy));
  1662 		adr_data_t *service = adr_data_new_struct(&t__Service);
  1634 		struct_set(service, "objectName", instance_getname(si->inst));
  1663 		adr_struct_set(service, "fmri",
  1635 		struct_set(service, "instances", insts);
  1664 		    adr_data_new_string(si->fmri, LT_COPY));
  1636 		(void) array_add(result, service);
  1665 		adr_struct_set(service, "objectName",
  1637 	}
  1666 		    instance_getname(si->inst));
  1638 
  1667 		adr_struct_set(service, "instances", insts);
  1639 	if (data_verify(result, NULL, B_TRUE))
  1668 		(void) adr_array_add(result, service);
       
  1669 	}
       
  1670 
       
  1671 	if (adr_data_verify(result, NULL, B_TRUE))
  1640 		*data = result;
  1672 		*data = result;
  1641 	else
  1673 	else
  1642 		data_free(result);
  1674 		adr_data_free(result);
  1643 
  1675 
  1644 	rad_mutex_exit(&service_lock);
  1676 	rad_mutex_exit(&service_lock);
  1645 	return (*data != NULL ? ce_ok : ce_object);
  1677 	return (*data != NULL ? ce_ok : ce_object);
  1646 }
  1678 }
  1647 
  1679 
  1648 /* ARGSUSED */
  1680 /* ARGSUSED */
  1649 conerr_t
  1681 conerr_t
  1650 interface_Aggregator_read_instances(rad_instance_t *inst, adr_attribute_t *attr,
  1682 interface_Aggregator_read_instances(rad_instance_t *inst, adr_attribute_t *attr,
  1651     data_t **data, data_t **error)
  1683     adr_data_t **data, adr_data_t **error)
  1652 {
  1684 {
  1653 	conerr_t err = ce_ok;
  1685 	conerr_t err = ce_ok;
  1654 
  1686 
  1655 	scf_handle_t *scfhandle = handle_create();
  1687 	scf_handle_t *scfhandle = handle_create();
  1656 	scf_service_t *service = scf_service_create(scfhandle);
  1688 	scf_service_t *service = scf_service_create(scfhandle);
  1665 		err = error_scf(error, SCF_ERROR_NO_MEMORY);
  1697 		err = error_scf(error, SCF_ERROR_NO_MEMORY);
  1666 		goto out;
  1698 		goto out;
  1667 	}
  1699 	}
  1668 
  1700 
  1669 	rad_mutex_enter(&service_lock);
  1701 	rad_mutex_enter(&service_lock);
  1670 	data_t *result = data_new_array(&t_array__Instance, instance_count);
  1702 	adr_data_t *result = adr_data_new_array(&t_array__Instance,
       
  1703 	    instance_count);
  1671 
  1704 
  1672 	/*
  1705 	/*
  1673 	 * It would be easy to iterate over all instances -- not just the
  1706 	 * It would be easy to iterate over all instances -- not just the
  1674 	 * ones we know about -- but until we dynamically add and remove
  1707 	 * ones we know about -- but until we dynamically add and remove
  1675 	 * their MBeans we'll stick to our list to avoid confusion.
  1708 	 * their MBeans we'll stick to our list to avoid confusion.
  1698 		if (scf_pg_get_property(pg, SCF_PROPERTY_STATE_TIMESTAMP,
  1731 		if (scf_pg_get_property(pg, SCF_PROPERTY_STATE_TIMESTAMP,
  1699 		    prop) != 0 || scf_property_get_value(prop, val) != 0 ||
  1732 		    prop) != 0 || scf_property_get_value(prop, val) != 0 ||
  1700 		    scf_value_get_time(val, &seconds, &ns) != 0)
  1733 		    scf_value_get_time(val, &seconds, &ns) != 0)
  1701 			continue;
  1734 			continue;
  1702 
  1735 
  1703 		data_t *inst = data_new_struct(&t__Instance);
  1736 		adr_data_t *inst = adr_data_new_struct(&t__Instance);
  1704 		struct_set(inst, "fmri", data_new_string(si->fmri, lt_copy));
  1737 		adr_struct_set(inst, "fmri",
  1705 		struct_set(inst, "objectName", instance_getname(si->inst));
  1738 		    adr_data_new_string(si->fmri, LT_COPY));
  1706 		struct_set(inst, "STime", data_new_time(seconds, ns));
  1739 		adr_struct_set(inst, "objectName", instance_getname(si->inst));
  1707 		struct_set(inst, "state", state2enum(statestr));
  1740 		adr_struct_set(inst, "STime", adr_data_new_time(seconds, ns));
  1708 		if (!data_verify(inst, NULL, B_TRUE))
  1741 		adr_struct_set(inst, "state", state2enum(statestr));
  1709 			data_free(inst);
  1742 		if (!adr_data_verify(inst, NULL, B_TRUE))
       
  1743 			adr_data_free(inst);
  1710 		else
  1744 		else
  1711 			(void) array_add(result, inst);
  1745 			(void) adr_array_add(result, inst);
  1712 	}
  1746 	}
  1713 
  1747 
  1714 	if ((*data = data_purify(result)) == NULL)
  1748 	if ((*data = adr_data_purify(result)) == NULL)
  1715 		err = ce_object;
  1749 		err = ce_object;
  1716 	rad_mutex_exit(&service_lock);
  1750 	rad_mutex_exit(&service_lock);
  1717 out:
  1751 out:
  1718 	scf_value_destroy(val);
  1752 	scf_value_destroy(val);
  1719 	scf_property_destroy(prop);
  1753 	scf_property_destroy(prop);
  1768 			continue;
  1802 			continue;
  1769 		}
  1803 		}
  1770 
  1804 
  1771 		rad_log(RL_DEBUG, "identified SMF event: %s/%s", sname, iname);
  1805 		rad_log(RL_DEBUG, "identified SMF event: %s/%s", sname, iname);
  1772 
  1806 
  1773 		data_t *stime = NULL, *state = NULL, *nstate = NULL;
  1807 		adr_data_t *stime = NULL, *state = NULL, *nstate = NULL;
  1774 		data_t *astate = NULL, *reason = NULL;
  1808 		adr_data_t *astate = NULL, *reason = NULL;
  1775 
  1809 
  1776 		/* Inefficient, but expedient */
  1810 		/* Inefficient, but expedient */
  1777 		(void) interface_ServiceInfo_read_stime(si->inst, NULL, &stime,
  1811 		(void) interface_ServiceInfo_read_stime(si->inst, NULL, &stime,
  1778 		    NULL);
  1812 		    NULL);
  1779 		(void) interface_ServiceInfo_read_state(si->inst, NULL, &state,
  1813 		(void) interface_ServiceInfo_read_state(si->inst, NULL, &state,
  1783 		(void) interface_ServiceInfo_read_auxiliaryState(si->inst, NULL,
  1817 		(void) interface_ServiceInfo_read_auxiliaryState(si->inst, NULL,
  1784 		    &astate, NULL);
  1818 		    &astate, NULL);
  1785 		(void) interface_ServiceInfo_read_reason(si->inst, NULL,
  1819 		(void) interface_ServiceInfo_read_reason(si->inst, NULL,
  1786 		    &reason, NULL);
  1820 		    &reason, NULL);
  1787 
  1821 
  1788 		data_t *event = data_new_struct(&t__StateChange);
  1822 		adr_data_t *event = adr_data_new_struct(&t__StateChange);
  1789 		struct_set(event, "source", instance_getname(si->inst));
  1823 		adr_struct_set(event, "source", instance_getname(si->inst));
  1790 		struct_set(event, "state", state);
  1824 		adr_struct_set(event, "state", state);
  1791 		struct_set(event, "nextState", nstate);
  1825 		adr_struct_set(event, "nextState", nstate);
  1792 		struct_set(event, "stateTime", stime);
  1826 		adr_struct_set(event, "stateTime", stime);
  1793 		struct_set(event, "auxState", astate);
  1827 		adr_struct_set(event, "auxState", astate);
  1794 		struct_set(event, "reason", reason);
  1828 		adr_struct_set(event, "reason", reason);
  1795 		struct_set(event, "anomaly", data_new_boolean(B_FALSE));
  1829 		adr_struct_set(event, "anomaly", adr_data_new_boolean(B_FALSE));
  1796 		if (data_verify(event, NULL, B_FALSE)) {
  1830 		if (adr_data_verify(event, NULL, B_FALSE)) {
  1797 			rad_log(RL_DEBUG, "sending SMF event");
  1831 			rad_log(RL_DEBUG, "sending SMF event");
  1798 			if (agg_inst != NULL)
  1832 			if (agg_inst != NULL)
  1799 				instance_notify(agg_inst, "statechange",
  1833 				instance_notify(agg_inst, "statechange",
  1800 				    0, data_ref(event));
  1834 				    0, adr_data_ref(event));
  1801 			instance_notify(si->inst, "statechange", 0, event);
  1835 			instance_notify(si->inst, "statechange", 0, event);
  1802 		} else {
  1836 		} else {
  1803 			rad_log(RL_DEBUG, "failed to send SMF event");
  1837 			rad_log(RL_DEBUG, "failed to send SMF event");
  1804 			data_free(event);
  1838 			adr_data_free(event);
  1805 		}
  1839 		}
  1806 
  1840 
  1807 		rad_mutex_exit(&service_lock);
  1841 		rad_mutex_exit(&service_lock);
  1808 	}
  1842 	}
  1809 	rad_log(RL_ERROR, "_scf_notify_wait failed: %s",
  1843 	rad_log(RL_ERROR, "_scf_notify_wait failed: %s",