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 |
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); |
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 } |
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); |
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(); |
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 |
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); |
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", |