1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 /*
22  * Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved.
23  * Copyright 2013, Joyent, Inc. All rights reserved.
24  */
25 
26 #ifndef	_LIBSCF_PRIV_H
27 #define	_LIBSCF_PRIV_H
28 
29 
30 #include <libscf.h>
31 #include <unistd.h>
32 #if !defined(NATIVE_BUILD)
33 #include <sys/secflags.h>
34 #endif
35 
36 #ifdef	__cplusplus
37 extern "C" {
38 #endif
39 
40 /*
41  * NOTE
42  *
43  * The contents of this file are private to the implementation of Solaris
44  * and are subject to change at any time without notice.
45  */
46 
47 #define	SCF_PG_GENERAL_TYPE		SCF_GROUP_FRAMEWORK
48 #define	SCF_PG_GENERAL_FLAGS		0
49 
50 #define	SCF_PG_GENERAL_OVR_TYPE		SCF_GROUP_FRAMEWORK
51 #define	SCF_PG_GENERAL_OVR_FLAGS	SCF_PG_FLAG_NONPERSISTENT
52 
53 #define	SCF_PG_DEATHROW_TYPE		SCF_GROUP_FRAMEWORK
54 #define	SCF_PG_DEATHROW_FLAGS		SCF_PG_FLAG_NONPERSISTENT
55 
56 #define	SCF_PG_OPTIONS_TYPE		SCF_GROUP_FRAMEWORK
57 #define	SCF_PG_OPTIONS_FLAGS		0
58 
59 #define	SCF_PG_OPTIONS_OVR_TYPE		SCF_GROUP_FRAMEWORK
60 #define	SCF_PG_OPTIONS_OVR_FLAGS	SCF_PG_FLAG_NONPERSISTENT
61 
62 #define	SCF_PG_RESTARTER_TYPE		SCF_GROUP_FRAMEWORK
63 #define	SCF_PG_RESTARTER_FLAGS		SCF_PG_FLAG_NONPERSISTENT
64 
65 #define	SCF_PG_RESTARTER_ACTIONS_TYPE	SCF_GROUP_FRAMEWORK
66 #define	SCF_PG_RESTARTER_ACTIONS_FLAGS	SCF_PG_FLAG_NONPERSISTENT
67 
68 #define	SCF_PROPERTY_CLEAR		((const char *)"maint_off")
69 #define	SCF_PROPERTY_MAINTENANCE	((const char *)"maint_on")
70 
71 #define	SCF_PROPERTY_LOGFILE		((const char *)"logfile")
72 #define	SCF_PROPERTY_ALT_LOGFILE	((const char *)"alt_logfile")
73 
74 #define	SCF_LEGACY_SERVICE		((const char *)"smf/legacy_run")
75 
76 #define	SCF_LEGACY_PROPERTY_NAME	((const char *)"name")
77 #define	SCF_LEGACY_PROPERTY_INODE	((const char *)"inode")
78 #define	SCF_LEGACY_PROPERTY_SUFFIX	((const char *)"suffix")
79 
80 #define	SCF_FMRI_TYPE_SVC		0x1
81 #define	SCF_FMRI_TYPE_FILE		0x2
82 
83 /*
84  * Strings for use in constructing FMRIs
85  */
86 #define	SCF_FMRI_SVC_PREFIX		"svc:"
87 #define	SCF_FMRI_FILE_PREFIX		"file:"
88 #define	SCF_FMRI_SCOPE_PREFIX		"//"
89 #define	SCF_FMRI_LOCAL_SCOPE		"localhost"
90 #define	SCF_FMRI_SCOPE_SUFFIX		"@localhost"
91 #define	SCF_FMRI_SERVICE_PREFIX		"/"
92 #define	SCF_FMRI_INSTANCE_PREFIX	":"
93 #define	SCF_FMRI_PROPERTYGRP_PREFIX	"/:properties/"
94 #define	SCF_FMRI_PROPERTY_PREFIX	"/"
95 #define	SCF_FMRI_LEGACY_PREFIX		"lrc:"
96 
97 /*
98  * sulogin Service FMRI
99  */
100 #define	SVC_SULOGIN_FMRI ((const char *)"svc:/system/sulogin")
101 
102 typedef struct scf_decoration_info {
103 	const char *sdi_name;
104 	scf_type_t sdi_type;
105 	scf_value_t *sdi_value;		/* can be SCF_DECORATE_CLEAR */
106 } scf_decoration_info_t;
107 
108 typedef int (*scf_decoration_func)(const scf_decoration_info_t *, void *);
109 
110 /*
111  * calls a callback function for each decoration on the handle.  If the
112  * callback returns 0, the iteration stops and returns 0.  If the callback
113  * returns a non-zero value, the iteration continues.  After full completion,
114  * 1 is returned.  On error, -1 is returned.
115  */
116 int _scf_handle_decorations(scf_handle_t *, scf_decoration_func *,
117     scf_value_t *, void *);
118 
119 /*
120  * wait for a change to the propertygroup -- may return early.
121  * For now, only one of these can be outstanding at a time.
122  *
123  * The second argument is how long, in seconds, to wait for a response.
124  *
125  * Returns SCF_COMPLETE on timeout, -1 on error, and SCF_SUCCESS in every
126  * other case.  You must call scf_pg_update() to see if the object has
127  * actually changed.
128  */
129 int _scf_pg_wait(scf_propertygroup_t *, int);
130 
131 /*
132  * set up notifications for changes to a class of property groups (by name
133  * and type)
134  *
135  * Only one thread can be sleeping in _scf_notify_wait() -- others will
136  * fail.  Deletions give an fmri in the output path.
137  *
138  * These do not survive unbind()->bind() -- in fact, that is currently the
139  * only way to clear them.
140  */
141 int _scf_notify_add_pgname(scf_handle_t *, const char *);
142 int _scf_notify_add_pgtype(scf_handle_t *, const char *);
143 int _scf_notify_wait(scf_propertygroup_t *, char *, size_t);
144 
145 /*
146  * Internal interfaces for snapshot creation:
147  *	_scf_snapshot_take_new(), _scf_snapshot_take_new_named(), and
148  *	_scf_snapshot_take_attach() create a set of snaplevels
149  *	containing frozen versions of both the instance's property groups and
150  *	its parent service's property groups. _scf_snapshot_take_new() and
151  *	_scf_snapshot_take_new_named() create a new snapshot to which the
152  *	new snaplevels are attached, while _scf_snapshot_take_attach()
153  *	attaches the new snaplevels to a pre-existing snapshot.
154  *
155  *	_scf_snapshot_take_new_named() records the passed in names into the
156  *	snaplevel instead of the instance and service name.  This creates
157  *	an inconsistency, which should be resolved by using
158  *	_scf_snapshot_attach() to attach the new snaplevels to a snapshot
159  *	underneath the appropriate instance.  The first snapshot can
160  *	then be deleted.
161  *
162  *	_scf_snapshot_attach(snap1, snap2) points snap2 at the snaplevels
163  *	pointed to by snap1.  After a call to either
164  *	_scf_snapshot_take_attach(snap1, snap2) or
165  *	_scf_snapshot_attach(inst, snap), scf_snapshot_update() will be
166  *	required for any open references to snap or snap2 to see the new
167  *	snaplevels.
168  *
169  *	_scf_snapshot_delete() deletes the snapshot object.  While
170  *	snaplevels, being only loosely connected to snapshots, stay
171  *	around until they are no longer referenced, any references *through
172  *	this snapshot object* will be invalidated.
173  *
174  * _scf_snapshot_take_new() can fail with at least _HANDLE_MISMATCH,
175  * _CONNECTION_BROKEN, _INVALID_ARGUMENT, _NO_RESOURCES, _PERMISSION_DENIED,
176  * _NOT_SET, _EXISTS.
177  *
178  * _scf_snapshot_take_new_named() can fail with at least _HANDLE_MISMATCH,
179  * _CONNECTION_BROKEN, _INVALID_ARGUMENT, _NO_RESOURCES, _PERMISSION_DENIED,
180  * _NOT_SET, _EXISTS.
181  *
182  * _scf_snapshot_take_attach() can fail with _CONNECTION_BROKEN, _NOT_SET,
183  * _PERMISSION_DENIED, _NO_RESOURCES, _INVALID_ARGUMENT.
184  *
185  * _scf_snapshot_attach() can fail with _HANDLE_MISMATCH, _CONNECTION_BROKEN,
186  * _NOT_SET, _NO_RESOURCES, _PERMISSION_DENIED.
187  */
188 int _scf_snapshot_take_new(scf_instance_t *, const char *, scf_snapshot_t *);
189 int _scf_snapshot_take_new_named(scf_instance_t *,
190     const char *, const char *, const char *, scf_snapshot_t *);
191 int _scf_snapshot_take_attach(scf_instance_t *, scf_snapshot_t *);
192 int _scf_snapshot_attach(scf_snapshot_t *, scf_snapshot_t *);
193 int _scf_snapshot_delete(scf_snapshot_t *);
194 
195 /*
196  * Destructively portions up the first argument into the different portions
197  * of a svc: fmri, and returns pointers to the applicable portions.  Omitted
198  * portions are set to NULL, except for the scope, which is set to the
199  * default local scope if not specified.
200  *
201  * Parsing is attempted in the order of: svc:, file:. The identified type
202  * of the service is returned in the second argument and may take a value
203  * of: SCF_FMRI_TYPE_SVC or SCF_FMRI_TYPE_FILE.
204  *
205  * Note that some of the returned pointers (in particular the scope) may not
206  * point into the passed buffer.
207  */
208 int scf_parse_fmri(char *, int *, const char **, const char **, const char **,
209     const char **, const char **);
210 
211 int scf_parse_svc_fmri(char *, const char **, const char **, const char **,
212     const char **, const char **);
213 
214 int scf_parse_file_fmri(char *fmri, const char **scope, const char **path);
215 
216 ssize_t scf_canonify_fmri(const char *, char *, size_t);
217 
218 int _smf_refresh_instance_i(scf_instance_t *);
219 
220 typedef struct scf_simple_handle {
221 	scf_handle_t		*h;
222 	scf_snapshot_t		*snap;
223 	scf_instance_t		*inst;
224 	scf_propertygroup_t	*running_pg;
225 	scf_propertygroup_t	*editing_pg;
226 } scf_simple_handle_t;
227 
228 void scf_simple_handle_destroy(scf_simple_handle_t *);
229 scf_simple_handle_t *scf_general_pg_setup(const char *, const char *);
230 scf_transaction_t *scf_transaction_setup(scf_simple_handle_t *);
231 int scf_transaction_restart(scf_simple_handle_t *, scf_transaction_t *);
232 int scf_read_count_property(scf_simple_handle_t *, char *, uint64_t *);
233 int scf_set_count_property(scf_transaction_t *, char *, uint64_t, boolean_t);
234 
235 /*
236  * Walks all the instances matching a given fmri list.  Each fmri in the array
237  * can be one of the following:
238  *
239  * 	- Full instance name
240  * 	- Full service name
241  * 	- Full property group or property name
242  * 	- Partial service or instance name
243  * 	- A globbed pattern
244  *
245  * The matching rules for partial fmris are a slightly more complex.  We allow
246  * for any substring anchored at the end of the instance or service name,
247  * provided it begins with a complete element in the fmri.  For example, given
248  * the fmri "svc:/system/filesystem/local:default", any of the following would
249  * be acceptable matches: 'default', 'local', 'local:default',
250  * 'filesystem/local'.  The following would not be acceptable:
251  * 'system/filesystem', 'filesystem/loc', 'system/local'.  Possible flag values:
252  *
253  * 	SCF_WALK_MULTIPLE	Allow individual arguments to correspond to
254  * 				multiple instances.
255  *
256  * 	SCF_WALK_LEGACY		Walk legacy services (indicated by a non-NULL
257  * 				propery group).
258  *
259  * 	SCF_WALK_SERVICE	If the user specifies a service, pass the
260  * 				service to the callback without iterating over
261  * 				its instances.
262  *
263  * 	SCF_WALK_PROPERTY	Allow FMRIs which match property groups or
264  * 				individual properties.  Incompatible with
265  * 				SCF_WALK_LEGACY.
266  *
267  * 	SCF_WALK_NOINSTANCE	Walk only services.  Must be used in
268  * 				conjunction with SCF_WALK_SERVICE.
269  *
270  * 	SCF_WALK_EXPLICIT	Walk only services if the match is exact
271  *				else return instances. Must be used in
272  *				conjunction with SCF_WALK_SERVICE.
273  *
274  * 	SCF_WALK_UNIPARTIAL	Can be combined with SCF_WALK_MULTIPLE
275  * 				so that an error is returned if a partial
276  *				fmri matches multiple instances, unless
277  *				a wildcard match is also used.
278  *
279  * If no arguments are given, then all instances in the service graph are
280  * walked.
281  *
282  * The second to last parameter is set to UU_EXIT_FATAL if one of the arguments
283  * is an invalid FMRI or matches multiple FMRIs when SCF_WALK_MULTIPLE is not
284  * set.
285  *
286  * The last parameter is a user-supplied error function that is called when
287  * reporting invalid arguments.
288  */
289 
290 #define	SCF_WALK_MULTIPLE	0x01
291 #define	SCF_WALK_LEGACY		0x02
292 #define	SCF_WALK_SERVICE	0x04
293 #define	SCF_WALK_PROPERTY	0x08
294 #define	SCF_WALK_NOINSTANCE	0x10
295 #define	SCF_WALK_EXPLICIT	0x20
296 #define	SCF_WALK_UNIPARTIAL	0x40
297 
298 /*
299  * The default locations of the repository dbs
300  */
301 #define	REPOSITORY_DB		"/etc/svc/repository.db"
302 #define	NONPERSIST_DB		"/etc/svc/volatile/svc_nonpersist.db"
303 #define	FAST_REPOSITORY_DB	"/etc/svc/volatile/fast_repository.db"
304 #define	REPOSITORY_CHECKPOINT	"/etc/svc/volatile/checkpoint_repository.db"
305 
306 
307 typedef struct scf_walkinfo {
308 	const char		*fmri;
309 	scf_scope_t		*scope;
310 	scf_service_t		*svc;
311 	scf_instance_t		*inst;
312 	scf_propertygroup_t	*pg;
313 	scf_property_t		*prop;
314 	int			count;	/* svcprop special */
315 } scf_walkinfo_t;
316 
317 typedef int (*scf_walk_callback)(void *, scf_walkinfo_t *);
318 
319 scf_error_t scf_walk_fmri(scf_handle_t *, int, char **, int,
320     scf_walk_callback, void *, int *, void (*)(const char *, ...));
321 
322 /*
323  * Requests a backup of the repository with a particular name, which
324  * can be any alphabetic string.  Only privileged users can do this.
325  *
326  * Can fail with:
327  *	_NOT_BOUND, _CONNECTION_BROKEN, _PERMISSION_DENIED, _INVALID_ARGUMENT,
328  *	_INTERNAL (path too long, or the backup failed for an odd reason),
329  *	_BACKEND_READONLY (filesystem is still read-only)
330  */
331 int _scf_request_backup(scf_handle_t *, const char *);
332 
333 /*
334  * Repository switch client
335  */
336 int _scf_repository_switch(scf_handle_t *, int);
337 
338 /*
339  * Determines whether a property group requires authorization to read; this
340  * does not in any way reflect whether the caller has that authorization.
341  * To determine that, the caller must attempt to read the value of one of the
342  * group's properties.
343  *
344  * Can fail with:
345  *	_NOT_BOUND, _CONNECTION_BROKEN, _INVALID_ARGUMENT, _INTERNAL,
346  *	_NO_RESOURCES, _CONSTRAINT_VIOLATED, _DELETED.
347  */
348 int _scf_pg_is_read_protected(const scf_propertygroup_t *, boolean_t *);
349 
350 /*
351  * Sets annotation data for SMF audit logging.  Once this function has been
352  * set, the next audit record will be preceded by an ADT_smf_annotation
353  * with the information provided in this function.  This function is used
354  * to mark operations which comprise multiple primitive operations such as
355  * svccfg import.
356  */
357 int _scf_set_annotation(scf_handle_t *h, const char *operation,
358     const char *file);
359 
360 /*
361  * scf_pattern_t
362  */
363 typedef struct scf_pattern {
364 	enum	{
365 		PATTERN_INVALID,	/* Uninitialized state */
366 		PATTERN_EXACT,
367 		PATTERN_GLOB,
368 		PATTERN_PARTIAL
369 	} sp_type;
370 	char			*sp_arg;	/* Original argument */
371 	struct scf_match	*sp_matches;	/* List of matches */
372 	int			sp_matchcount;	/* # of matches */
373 } scf_pattern_t;
374 
375 int scf_cmp_pattern(char *, scf_pattern_t *);
376 
377 int gen_filenms_from_fmri(const char *, const char *, char *, char *);
378 
379 /*
380  * Interfaces for bulk access to SMF-stored configuration.
381  *
382  * Each scf_propvec_t represents a single property to be read (with
383  * scf_read_propvec) or written (with scf_write_propvec).
384  *
385  * The fields of a scf_propvec_t have the following meanings:
386  *
387  *   pv_prop - the name of the property
388  *   pv_desc - a description string (optional; to be consumed by the caller)
389  *   pv_type - the type of the property
390  *   pv_ptr  - where to store the data read, or a pointer to the data to
391  *             be written
392  *   pv_aux  - additional data influencing the interpretation of pv_ptr
393  *
394  * The meaning of pv_ptr and pv_aux depends on the type of property.  For:
395  *
396  *   boolean - if pv_aux is 0, pv_ptr is a pointer to a boolean_t
397  *             if pv_aux is non-0, pv_ptr is a pointer to a uint64_t,
398  *             where pv_aux indicates the bit holding the truth value.
399  *   count   - pv_ptr is a pointer to a uint64_t; pv_aux is unused
400  *   integer - pv_ptr is a pointer to an int64_t; pv_aux is unused
401  *   time    - pv_ptr is a pointer to an scf_time_t; pv_aux is unused
402  *   opaque  - pv_ptr is a pointer to an scf_opaque_t; pv_aux is unused
403  *   strings - (scf_read_propvec) pv_ptr is a pointer to a char *
404  *             (scf_write_propvec) pv_ptr is a pointer to an array of char
405  *             (both) pv_aux is unused
406  */
407 typedef struct {
408 	void	*so_addr;
409 	size_t	so_size;
410 } scf_opaque_t;
411 
412 typedef struct {
413 	const char	*pv_prop;
414 	const char	*pv_desc;
415 	scf_type_t	pv_type;
416 	void		*pv_ptr;
417 	uint64_t	pv_aux;
418 } scf_propvec_t;
419 
420 void scf_clean_propvec(scf_propvec_t *);
421 int scf_read_propvec(const char *, const char *, boolean_t, scf_propvec_t *,
422     scf_propvec_t **);
423 int scf_write_propvec(const char *, const char *, scf_propvec_t *,
424     scf_propvec_t **);
425 
426 scf_tmpl_errors_t *_scf_create_errors(const char *, int);
427 int _scf_tmpl_add_error(scf_tmpl_errors_t *errs, scf_tmpl_error_type_t type,
428     const char *pg_name, const char *prop_name,
429     const char *ev1, const char *ev2, const char *actual,
430     const char *tmpl_fmri, const char *tmpl_pg_name, const char *tmpl_pg_type,
431     const char *tmpl_prop_name, const char *tmpl_prop_type);
432 int _scf_tmpl_error_set_prefix(scf_tmpl_errors_t *, const char *);
433 
434 /*
435  * Templates definitions
436  */
437 
438 /*
439  * For CARDINALITY_VIOLATION and RANGE_VIOLATION, te_ev1 holds
440  * the min value and te_ev2 holds the max value
441  *
442  * For MISSING_PG te_ev1 should hold the expected pg_name and
443  * expected2 holds the expected pg_type.
444  *
445  * For SCF_TERR_PG_PATTERN_CONFLICT and SCF_TERR_GENERAL_REDEFINE te_ev1 is
446  * the FMRI holding the conflicting pg_pattern.  te_ev2 is the name of the
447  * conflicting pg_pattern, and actual is the type of the conflicting
448  * pg_pattern.
449  *
450  * SCF_TERR_PROP_PATTERN_CONFLICT te_ev1 is the FMRI holding the
451  * conflicting prop_pattern.  te_ev2 is the name of the conflicting
452  * prop_pattern, and actual is the type of the conflicting prop_pattern.
453  *
454  * For SCF_TERR_INCLUDE_VALUES te_ev1 is the type specified for the
455  * include_values element.
456  *
457  * For all other errors, te_ev1 should hold the expected value and
458  * te_ev2 is ignored
459  *
460  * te_actual holds the current value of the property
461  */
462 
463 struct scf_tmpl_error {
464 	scf_tmpl_errors_t		*te_errs;
465 	scf_tmpl_error_type_t		te_type;
466 	const char			*te_pg_name;
467 	const char			*te_prop_name;
468 	const char			*te_ev1;
469 	const char			*te_ev2;
470 	const char			*te_actual;
471 	const char			*te_tmpl_fmri;
472 	const char			*te_tmpl_pg_name;
473 	const char			*te_tmpl_pg_type;
474 	const char			*te_tmpl_prop_name;
475 	const char			*te_tmpl_prop_type;
476 };
477 
478 /*
479  * The pg_pattern element has two optional attributes that play a part in
480  * selecting the appropriate prefix for the name of the pg_pattern property
481  * group. The two attributes are name and type.  The appropriate prefix
482  * encodes the presence are absence of these attributes.
483  *
484  *	SCF_PG_TM_PG_PATTERN_PREFIX	neither attribute
485  *	SCF_PG_TM_PG_PATTERN_N_PREFIX	name only
486  *	SCF_PG_TM_PG_PATTERN_T_PREFIX	type only
487  *	SCF_PG_TM_PG_PATTERN_NT_PREFIX	both name and type
488  */
489 #define	SCF_PG_TM_PG_PAT_BASE		"tm_pgpat"
490 #define	SCF_PG_TM_PG_PATTERN_PREFIX	((const char *)SCF_PG_TM_PG_PAT_BASE \
491 	"_")
492 #define	SCF_PG_TM_PG_PATTERN_N_PREFIX	((const char *)SCF_PG_TM_PG_PAT_BASE \
493 	"n_")
494 #define	SCF_PG_TM_PG_PATTERN_T_PREFIX	((const char *)SCF_PG_TM_PG_PAT_BASE \
495 	"t_")
496 #define	SCF_PG_TM_PG_PATTERN_NT_PREFIX	((const char *)SCF_PG_TM_PG_PAT_BASE \
497 	"nt_")
498 #define	SCF_PG_TM_PROP_PATTERN_PREFIX	((const char *)"tm_proppat_")
499 
500 /*
501  * Pad character to use when encoding strings for property names.
502  */
503 #define	SCF_ENCODE32_PAD		('-')
504 
505 /*
506  * Functions for base 32 encoding/decoding
507  */
508 int scf_decode32(const char *, size_t, char *, size_t, size_t *, char);
509 int scf_encode32(const char *, size_t, char *, size_t, size_t *, char);
510 
511 /*
512  * handy functions
513  */
514 /*
515  * _scf_sanitize_locale
516  * Make sure a locale string has only alpha-numeric or '_' characters
517  */
518 void _scf_sanitize_locale(char *);
519 
520 /*
521  * _scf_read_tmpl_prop_type_as_string()
522  * Handy function to get template property type as a string
523  */
524 char *_scf_read_tmpl_prop_type_as_string(const scf_prop_tmpl_t *);
525 /*
526  * _scf_read_single_astring_from_pg()
527  * Given a property group (pg) and a property name (pn), this function
528  * retrives an astring value from pg/pn.
529  */
530 char *_scf_read_single_astring_from_pg(scf_propertygroup_t *, const char *);
531 
532 /*
533  * scf_instance_delete_prop()
534  * Given instance, property group, and property, delete the property.
535  */
536 int
537 scf_instance_delete_prop(scf_instance_t *, const char *, const char *);
538 
539 /*
540  * Functions to extract boot config information from FMRI_BOOT_CONFIG
541  */
542 void scf_get_boot_config(uint8_t *);
543 void scf_get_boot_config_ovr(uint8_t *);
544 int scf_is_fastboot_default(void);
545 
546 /*
547  * Set value of "config_ovr/fastreboot_default".
548  */
549 int scf_fastreboot_default_set_transient(boolean_t);
550 
551 /*
552  * scf_is_compatible_type()
553  * Return true if the second type is the same type, or a subtype of the
554  * first.
555  */
556 int scf_is_compatible_type(scf_type_t, scf_type_t);
557 
558 /*
559  * Check an array of services and enable any that don't have the
560  * "application/auto_enable" property set to "false", which is
561  * the interface to turn off this behaviour (see PSARC 2004/739).
562  */
563 void _check_services(char **);
564 
565 /*
566  * _scf_handle_create_and_bind()
567  * convenience function that creates and binds a handle
568  */
569 scf_handle_t *_scf_handle_create_and_bind(scf_version_t);
570 
571 /*
572  * _smf_refresh_all_instances()
573  * refresh all intances of a service
574  * return SCF_SUCCESS or SCF_FAILED on _PERMISSION_DENIED, _BACKEND_ACCESS
575  * or _BACKEND_READONLY.
576  */
577 int _smf_refresh_all_instances(scf_service_t *);
578 
579 /*
580  * _scf_get_fma_notify_params()
581  * Specialized fuction to get fma notifitation parameters
582  */
583 int _scf_get_fma_notify_params(const char *, nvlist_t *, int);
584 
585 /*
586  * _scf_get_svc_notify_params()
587  * Specialized function to get SMF state transition notification parameters
588  */
589 int _scf_get_svc_notify_params(const char *, nvlist_t *, int32_t, int, int);
590 
591 /*
592  * _scf_notify_get_params()
593  * Specialized function to get notification parametes from a pg into an
594  * nvlist_t
595  */
596 int _scf_notify_get_params(scf_propertygroup_t *, nvlist_t *);
597 
598 #if !defined(NATIVE_BUILD)
599 int scf_default_secflags(scf_handle_t *, scf_secflags_t *);
600 #endif
601 
602 #define	SCF_NOTIFY_PARAMS_SOURCE_NAME	((const char *)"preference_source")
603 
604 #ifdef	__cplusplus
605 }
606 #endif
607 
608 #endif	/* _LIBSCF_PRIV_H */
609