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.
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.
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]
22 * Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved.
23 * Copyright 2013, Joyent, Inc. All rights reserved.
26 #ifndef _LIBSCF_PRIV_H
27 #define _LIBSCF_PRIV_H
32 #if !defined(NATIVE_BUILD)
33 #include <sys/secflags.h>
43 * The contents of this file are private to the implementation of Solaris
44 * and are subject to change at any time without notice.
47 #define SCF_PG_GENERAL_TYPE SCF_GROUP_FRAMEWORK
48 #define SCF_PG_GENERAL_FLAGS 0
50 #define SCF_PG_GENERAL_OVR_TYPE SCF_GROUP_FRAMEWORK
51 #define SCF_PG_GENERAL_OVR_FLAGS SCF_PG_FLAG_NONPERSISTENT
53 #define SCF_PG_DEATHROW_TYPE SCF_GROUP_FRAMEWORK
54 #define SCF_PG_DEATHROW_FLAGS SCF_PG_FLAG_NONPERSISTENT
56 #define SCF_PG_OPTIONS_TYPE SCF_GROUP_FRAMEWORK
57 #define SCF_PG_OPTIONS_FLAGS 0
59 #define SCF_PG_OPTIONS_OVR_TYPE SCF_GROUP_FRAMEWORK
60 #define SCF_PG_OPTIONS_OVR_FLAGS SCF_PG_FLAG_NONPERSISTENT
62 #define SCF_PG_RESTARTER_TYPE SCF_GROUP_FRAMEWORK
63 #define SCF_PG_RESTARTER_FLAGS SCF_PG_FLAG_NONPERSISTENT
65 #define SCF_PG_RESTARTER_ACTIONS_TYPE SCF_GROUP_FRAMEWORK
66 #define SCF_PG_RESTARTER_ACTIONS_FLAGS SCF_PG_FLAG_NONPERSISTENT
68 #define SCF_PROPERTY_CLEAR ((const char *)"maint_off")
69 #define SCF_PROPERTY_MAINTENANCE ((const char *)"maint_on")
71 #define SCF_PROPERTY_LOGFILE ((const char *)"logfile")
72 #define SCF_PROPERTY_ALT_LOGFILE ((const char *)"alt_logfile")
74 #define SCF_LEGACY_SERVICE ((const char *)"smf/legacy_run")
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")
80 #define SCF_FMRI_TYPE_SVC 0x1
81 #define SCF_FMRI_TYPE_FILE 0x2
84 * Strings for use in constructing FMRIs
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:"
98 * sulogin Service FMRI
100 #define SVC_SULOGIN_FMRI ((const char *)"svc:/system/sulogin")
102 typedef struct scf_decoration_info
{
103 const char *sdi_name
;
105 scf_value_t
*sdi_value
; /* can be SCF_DECORATE_CLEAR */
106 } scf_decoration_info_t
;
108 typedef int (*scf_decoration_func
)(const scf_decoration_info_t
*, void *);
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.
116 int _scf_handle_decorations(scf_handle_t
*, scf_decoration_func
*,
117 scf_value_t
*, void *);
120 * wait for a change to the propertygroup -- may return early.
121 * For now, only one of these can be outstanding at a time.
123 * The second argument is how long, in seconds, to wait for a response.
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
129 int _scf_pg_wait(scf_propertygroup_t
*, int);
132 * set up notifications for changes to a class of property groups (by name
135 * Only one thread can be sleeping in _scf_notify_wait() -- others will
136 * fail. Deletions give an fmri in the output path.
138 * These do not survive unbind()->bind() -- in fact, that is currently the
139 * only way to clear them.
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);
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.
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
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
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.
174 * _scf_snapshot_take_new() can fail with at least _HANDLE_MISMATCH,
175 * _CONNECTION_BROKEN, _INVALID_ARGUMENT, _NO_RESOURCES, _PERMISSION_DENIED,
178 * _scf_snapshot_take_new_named() can fail with at least _HANDLE_MISMATCH,
179 * _CONNECTION_BROKEN, _INVALID_ARGUMENT, _NO_RESOURCES, _PERMISSION_DENIED,
182 * _scf_snapshot_take_attach() can fail with _CONNECTION_BROKEN, _NOT_SET,
183 * _PERMISSION_DENIED, _NO_RESOURCES, _INVALID_ARGUMENT.
185 * _scf_snapshot_attach() can fail with _HANDLE_MISMATCH, _CONNECTION_BROKEN,
186 * _NOT_SET, _NO_RESOURCES, _PERMISSION_DENIED.
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
*);
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.
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.
205 * Note that some of the returned pointers (in particular the scope) may not
206 * point into the passed buffer.
208 int scf_parse_fmri(char *, int *, const char **, const char **, const char **,
209 const char **, const char **);
211 int scf_parse_svc_fmri(char *, const char **, const char **, const char **,
212 const char **, const char **);
214 int scf_parse_file_fmri(char *fmri
, const char **scope
, const char **path
);
216 ssize_t
scf_canonify_fmri(const char *, char *, size_t);
218 int _smf_refresh_instance_i(scf_instance_t
*);
220 typedef struct scf_simple_handle
{
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
;
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
);
236 * Walks all the instances matching a given fmri list. Each fmri in the array
237 * can be one of the following:
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
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:
253 * SCF_WALK_MULTIPLE Allow individual arguments to correspond to
254 * multiple instances.
256 * SCF_WALK_LEGACY Walk legacy services (indicated by a non-NULL
259 * SCF_WALK_SERVICE If the user specifies a service, pass the
260 * service to the callback without iterating over
263 * SCF_WALK_PROPERTY Allow FMRIs which match property groups or
264 * individual properties. Incompatible with
267 * SCF_WALK_NOINSTANCE Walk only services. Must be used in
268 * conjunction with SCF_WALK_SERVICE.
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.
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.
279 * If no arguments are given, then all instances in the service graph are
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
286 * The last parameter is a user-supplied error function that is called when
287 * reporting invalid arguments.
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
299 * The default locations of the repository dbs
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"
307 typedef struct scf_walkinfo
{
311 scf_instance_t
*inst
;
312 scf_propertygroup_t
*pg
;
313 scf_property_t
*prop
;
314 int count
; /* svcprop special */
317 typedef int (*scf_walk_callback
)(void *, scf_walkinfo_t
*);
319 scf_error_t
scf_walk_fmri(scf_handle_t
*, int, char **, int,
320 scf_walk_callback
, void *, int *, void (*)(const char *, ...));
323 * Requests a backup of the repository with a particular name, which
324 * can be any alphabetic string. Only privileged users can do this.
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)
331 int _scf_request_backup(scf_handle_t
*, const char *);
334 * Repository switch client
336 int _scf_repository_switch(scf_handle_t
*, int);
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.
345 * _NOT_BOUND, _CONNECTION_BROKEN, _INVALID_ARGUMENT, _INTERNAL,
346 * _NO_RESOURCES, _CONSTRAINT_VIOLATED, _DELETED.
348 int _scf_pg_is_read_protected(const scf_propertygroup_t
*, boolean_t
*);
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
357 int _scf_set_annotation(scf_handle_t
*h
, const char *operation
,
363 typedef struct scf_pattern
{
365 PATTERN_INVALID
, /* Uninitialized state */
370 char *sp_arg
; /* Original argument */
371 struct scf_match
*sp_matches
; /* List of matches */
372 int sp_matchcount
; /* # of matches */
375 int scf_cmp_pattern(char *, scf_pattern_t
*);
377 int gen_filenms_from_fmri(const char *, const char *, char *, char *);
380 * Interfaces for bulk access to SMF-stored configuration.
382 * Each scf_propvec_t represents a single property to be read (with
383 * scf_read_propvec) or written (with scf_write_propvec).
385 * The fields of a scf_propvec_t have the following meanings:
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
392 * pv_aux - additional data influencing the interpretation of pv_ptr
394 * The meaning of pv_ptr and pv_aux depends on the type of property. For:
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
420 void scf_clean_propvec(scf_propvec_t
*);
421 int scf_read_propvec(const char *, const char *, boolean_t
, scf_propvec_t
*,
423 int scf_write_propvec(const char *, const char *, scf_propvec_t
*,
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 *);
435 * Templates definitions
439 * For CARDINALITY_VIOLATION and RANGE_VIOLATION, te_ev1 holds
440 * the min value and te_ev2 holds the max value
442 * For MISSING_PG te_ev1 should hold the expected pg_name and
443 * expected2 holds the expected pg_type.
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
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.
454 * For SCF_TERR_INCLUDE_VALUES te_ev1 is the type specified for the
455 * include_values element.
457 * For all other errors, te_ev1 should hold the expected value and
460 * te_actual holds the current value of the property
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
;
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
;
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.
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
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 \
492 #define SCF_PG_TM_PG_PATTERN_N_PREFIX ((const char *)SCF_PG_TM_PG_PAT_BASE \
494 #define SCF_PG_TM_PG_PATTERN_T_PREFIX ((const char *)SCF_PG_TM_PG_PAT_BASE \
496 #define SCF_PG_TM_PG_PATTERN_NT_PREFIX ((const char *)SCF_PG_TM_PG_PAT_BASE \
498 #define SCF_PG_TM_PROP_PATTERN_PREFIX ((const char *)"tm_proppat_")
501 * Pad character to use when encoding strings for property names.
503 #define SCF_ENCODE32_PAD ('-')
506 * Functions for base 32 encoding/decoding
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);
515 * _scf_sanitize_locale
516 * Make sure a locale string has only alpha-numeric or '_' characters
518 void _scf_sanitize_locale(char *);
521 * _scf_read_tmpl_prop_type_as_string()
522 * Handy function to get template property type as a string
524 char *_scf_read_tmpl_prop_type_as_string(const scf_prop_tmpl_t
*);
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.
530 char *_scf_read_single_astring_from_pg(scf_propertygroup_t
*, const char *);
533 * scf_instance_delete_prop()
534 * Given instance, property group, and property, delete the property.
537 scf_instance_delete_prop(scf_instance_t
*, const char *, const char *);
540 * Functions to extract boot config information from FMRI_BOOT_CONFIG
542 void scf_get_boot_config(uint8_t *);
543 void scf_get_boot_config_ovr(uint8_t *);
544 int scf_is_fastboot_default(void);
547 * Set value of "config_ovr/fastreboot_default".
549 int scf_fastreboot_default_set_transient(boolean_t
);
552 * scf_is_compatible_type()
553 * Return true if the second type is the same type, or a subtype of the
556 int scf_is_compatible_type(scf_type_t
, scf_type_t
);
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).
563 void _check_services(char **);
566 * _scf_handle_create_and_bind()
567 * convenience function that creates and binds a handle
569 scf_handle_t
*_scf_handle_create_and_bind(scf_version_t
);
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.
577 int _smf_refresh_all_instances(scf_service_t
*);
580 * _scf_get_fma_notify_params()
581 * Specialized fuction to get fma notifitation parameters
583 int _scf_get_fma_notify_params(const char *, nvlist_t
*, int);
586 * _scf_get_svc_notify_params()
587 * Specialized function to get SMF state transition notification parameters
589 int _scf_get_svc_notify_params(const char *, nvlist_t
*, int32_t, int, int);
592 * _scf_notify_get_params()
593 * Specialized function to get notification parametes from a pg into an
596 int _scf_notify_get_params(scf_propertygroup_t
*, nvlist_t
*);
598 #if !defined(NATIVE_BUILD)
599 int scf_default_secflags(scf_handle_t
*, scf_secflags_t
*);
602 #define SCF_NOTIFY_PARAMS_SOURCE_NAME ((const char *)"preference_source")
608 #endif /* _LIBSCF_PRIV_H */