libscf_priv.h revision 7475:9a5f7406e094
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 2008 Sun Microsystems, Inc.  All rights reserved.
23 * Use is subject to license terms.
24 */
25
26#ifndef	_LIBSCF_PRIV_H
27#define	_LIBSCF_PRIV_H
28
29
30#include <libscf.h>
31#include <unistd.h>
32
33#ifdef	__cplusplus
34extern "C" {
35#endif
36
37/*
38 * NOTE
39 *
40 * The contents of this file are private to the implementation of Solaris
41 * and are subject to change at any time without notice.
42 */
43
44#define	SCF_PG_GENERAL_TYPE		SCF_GROUP_FRAMEWORK
45#define	SCF_PG_GENERAL_FLAGS		0
46
47#define	SCF_PG_GENERAL_OVR_TYPE		SCF_GROUP_FRAMEWORK
48#define	SCF_PG_GENERAL_OVR_FLAGS	SCF_PG_FLAG_NONPERSISTENT
49
50#define	SCF_PG_DEATHROW_TYPE		SCF_GROUP_FRAMEWORK
51#define	SCF_PG_DEATHROW_FLAGS		SCF_PG_FLAG_NONPERSISTENT
52
53#define	SCF_PG_OPTIONS_TYPE		SCF_GROUP_FRAMEWORK
54#define	SCF_PG_OPTIONS_FLAGS		0
55
56#define	SCF_PG_OPTIONS_OVR_TYPE		SCF_GROUP_FRAMEWORK
57#define	SCF_PG_OPTIONS_OVR_FLAGS	SCF_PG_FLAG_NONPERSISTENT
58
59#define	SCF_PG_RESTARTER_TYPE		SCF_GROUP_FRAMEWORK
60#define	SCF_PG_RESTARTER_FLAGS		SCF_PG_FLAG_NONPERSISTENT
61
62#define	SCF_PG_RESTARTER_ACTIONS_TYPE	SCF_GROUP_FRAMEWORK
63#define	SCF_PG_RESTARTER_ACTIONS_FLAGS	SCF_PG_FLAG_NONPERSISTENT
64
65#define	SCF_PROPERTY_CLEAR		((const char *)"maint_off")
66#define	SCF_PROPERTY_MAINTENANCE	((const char *)"maint_on")
67
68#define	SCF_PROPERTY_LOGFILE		((const char *)"logfile")
69#define	SCF_PROPERTY_ALT_LOGFILE	((const char *)"alt_logfile")
70
71#define	SCF_LEGACY_SERVICE		((const char *)"smf/legacy_run")
72
73#define	SCF_LEGACY_PROPERTY_NAME	((const char *)"name")
74#define	SCF_LEGACY_PROPERTY_INODE	((const char *)"inode")
75#define	SCF_LEGACY_PROPERTY_SUFFIX	((const char *)"suffix")
76
77#define	SCF_FMRI_TYPE_SVC		0x1
78#define	SCF_FMRI_TYPE_FILE		0x2
79
80/*
81 * Strings for use in constructing FMRIs
82 */
83#define	SCF_FMRI_SVC_PREFIX		"svc:"
84#define	SCF_FMRI_FILE_PREFIX		"file:"
85#define	SCF_FMRI_SCOPE_PREFIX		"//"
86#define	SCF_FMRI_LOCAL_SCOPE		"localhost"
87#define	SCF_FMRI_SCOPE_SUFFIX		"@localhost"
88#define	SCF_FMRI_SERVICE_PREFIX		"/"
89#define	SCF_FMRI_INSTANCE_PREFIX	":"
90#define	SCF_FMRI_PROPERTYGRP_PREFIX	"/:properties/"
91#define	SCF_FMRI_PROPERTY_PREFIX	"/"
92#define	SCF_FMRI_LEGACY_PREFIX		"lrc:"
93
94/*
95 * sulogin Service FMRI
96 */
97#define	SVC_SULOGIN_FMRI ((const char *)"svc:/system/sulogin")
98
99typedef struct scf_decoration_info {
100	const char *sdi_name;
101	scf_type_t sdi_type;
102	scf_value_t *sdi_value;		/* can be SCF_DECORATE_CLEAR */
103} scf_decoration_info_t;
104
105typedef int (*scf_decoration_func)(const scf_decoration_info_t *, void *);
106
107/*
108 * calls a callback function for each decoration on the handle.  If the
109 * callback returns 0, the iteration stops and returns 0.  If the callback
110 * returns a non-zero value, the iteration continues.  After full completion,
111 * 1 is returned.  On error, -1 is returned.
112 */
113int _scf_handle_decorations(scf_handle_t *, scf_decoration_func *,
114    scf_value_t *, void *);
115
116/*
117 * wait for a change to the propertygroup -- may return early.
118 * For now, only one of these can be outstanding at a time.
119 *
120 * The second argument is how long, in seconds, to wait for a response.
121 *
122 * Returns SCF_COMPLETE on timeout, -1 on error, and SCF_SUCCESS in every
123 * other case.  You must call scf_pg_update() to see if the object has
124 * actually changed.
125 */
126int _scf_pg_wait(scf_propertygroup_t *, int);
127
128/*
129 * set up notifications for changes to a class of property groups (by name
130 * and type)
131 *
132 * Only one thread can be sleeping in _scf_notify_wait() -- others will
133 * fail.  Deletions give an fmri in the output path.
134 *
135 * These do not survive unbind()->bind() -- in fact, that is currently the
136 * only way to clear them.
137 */
138int _scf_notify_add_pgname(scf_handle_t *, const char *);
139int _scf_notify_add_pgtype(scf_handle_t *, const char *);
140int _scf_notify_wait(scf_propertygroup_t *, char *, size_t);
141
142/*
143 * Internal interfaces for snapshot creation:
144 *	_scf_snapshot_take_new(), _scf_snapshot_take_new_named(), and
145 *	_scf_snapshot_take_attach() create a set of snaplevels
146 *	containing frozen versions of both the instance's property groups and
147 *	its parent service's property groups. _scf_snapshot_take_new() and
148 *	_scf_snapshot_take_new_named() create a new snapshot to which the
149 *	new snaplevels are attached, while _scf_snapshot_take_attach()
150 *	attaches the new snaplevels to a pre-existing snapshot.
151 *
152 *	_scf_snapshot_take_new_named() records the passed in names into the
153 *	snaplevel instead of the instance and service name.  This creates
154 *	an inconsistency, which should be resolved by using
155 *	_scf_snapshot_attach() to attach the new snaplevels to a snapshot
156 *	underneath the appropriate instance.  The first snapshot can
157 *	then be deleted.
158 *
159 *	_scf_snapshot_attach(snap1, snap2) points snap2 at the snaplevels
160 *	pointed to by snap1.  After a call to either
161 *	_scf_snapshot_take_attach(snap1, snap2) or
162 *	_scf_snapshot_attach(inst, snap), scf_snapshot_update() will be
163 *	required for any open references to snap or snap2 to see the new
164 *	snaplevels.
165 *
166 *	_scf_snapshot_delete() deletes the snapshot object.  While
167 *	snaplevels, being only loosely connected to snapshots, stay
168 *	around until they are no longer referenced, any references *through
169 *	this snapshot object* will be invalidated.
170 *
171 * _scf_snapshot_take_new() can fail with at least _HANDLE_MISMATCH,
172 * _CONNECTION_BROKEN, _INVALID_ARGUMENT, _NO_RESOURCES, _PERMISSION_DENIED,
173 * _NOT_SET, _EXISTS.
174 *
175 * _scf_snapshot_take_new_named() can fail with at least _HANDLE_MISMATCH,
176 * _CONNECTION_BROKEN, _INVALID_ARGUMENT, _NO_RESOURCES, _PERMISSION_DENIED,
177 * _NOT_SET, _EXISTS.
178 *
179 * _scf_snapshot_take_attach() can fail with _CONNECTION_BROKEN, _NOT_SET,
180 * _PERMISSION_DENIED, _NO_RESOURCES, _INVALID_ARGUMENT.
181 *
182 * _scf_snapshot_attach() can fail with _HANDLE_MISMATCH, _CONNECTION_BROKEN,
183 * _NOT_SET, _NO_RESOURCES, _PERMISSION_DENIED.
184 */
185int _scf_snapshot_take_new(scf_instance_t *, const char *, scf_snapshot_t *);
186int _scf_snapshot_take_new_named(scf_instance_t *,
187    const char *, const char *, const char *, scf_snapshot_t *);
188int _scf_snapshot_take_attach(scf_instance_t *, scf_snapshot_t *);
189int _scf_snapshot_attach(scf_snapshot_t *, scf_snapshot_t *);
190int _scf_snapshot_delete(scf_snapshot_t *);
191
192/*
193 * Destructively portions up the first argument into the different portions
194 * of a svc: fmri, and returns pointers to the applicable portions.  Omitted
195 * portions are set to NULL, except for the scope, which is set to the
196 * default local scope if not specified.
197 *
198 * Parsing is attempted in the order of: svc:, file:. The identified type
199 * of the service is returned in the second argument and may take a value
200 * of: SCF_FMRI_TYPE_SVC or SCF_FMRI_TYPE_FILE.
201 *
202 * Note that some of the returned pointers (in particular the scope) may not
203 * point into the passed buffer.
204 */
205int scf_parse_fmri(char *, int *, const char **, const char **, const char **,
206    const char **, const char **);
207
208int scf_parse_svc_fmri(char *, const char **, const char **, const char **,
209    const char **, const char **);
210
211int scf_parse_file_fmri(char *fmri, const char **scope, const char **path);
212
213ssize_t scf_canonify_fmri(const char *, char *, size_t);
214
215const char *scf_type_to_string(scf_type_t);
216scf_type_t scf_string_to_type(const char *);
217
218int _smf_refresh_instance_i(scf_instance_t *);
219
220typedef 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
228void scf_simple_handle_destroy(scf_simple_handle_t *);
229scf_simple_handle_t *scf_general_pg_setup(const char *, const char *);
230scf_transaction_t *scf_transaction_setup(scf_simple_handle_t *);
231int scf_transaction_restart(scf_simple_handle_t *, scf_transaction_t *);
232int scf_read_count_property(scf_simple_handle_t *, char *, uint64_t *);
233int 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 * If no arguments are given, then all instances in the service graph are
275 * walked.
276 *
277 * The second to last parameter is set to UU_EXIT_FATAL if one of the arguments
278 * is an invalid FMRI or matches multiple FMRIs when SCF_WALK_MULTIPLE is not
279 * set.
280 *
281 * The last parameter is a user-supplied error function that is called when
282 * reporting invalid arguments.
283 */
284
285#define	SCF_WALK_MULTIPLE	0x01
286#define	SCF_WALK_LEGACY		0x02
287#define	SCF_WALK_SERVICE	0x04
288#define	SCF_WALK_PROPERTY	0x08
289#define	SCF_WALK_NOINSTANCE	0x10
290#define	SCF_WALK_EXPLICIT	0x20
291
292/*
293 * The default locations of the repository dbs
294 */
295#define	REPOSITORY_DB		"/etc/svc/repository.db"
296#define	NONPERSIST_DB		"/etc/svc/volatile/svc_nonpersist.db"
297#define	FAST_REPOSITORY_DB	"/etc/svc/volatile/fast_repository.db"
298
299
300typedef struct scf_walkinfo {
301	const char		*fmri;
302	scf_scope_t		*scope;
303	scf_service_t		*svc;
304	scf_instance_t		*inst;
305	scf_propertygroup_t	*pg;
306	scf_property_t		*prop;
307	int			count;	/* svcprop special */
308} scf_walkinfo_t;
309
310typedef int (*scf_walk_callback)(void *, scf_walkinfo_t *);
311
312scf_error_t scf_walk_fmri(scf_handle_t *, int, char **, int,
313    scf_walk_callback, void *, int *, void (*)(const char *, ...));
314
315/*
316 * Requests a backup of the repository with a particular name, which
317 * can be any alphabetic string.  Only privileged users can do this.
318 *
319 * Can fail with:
320 *	_NOT_BOUND, _CONNECTION_BROKEN, _PERMISSION_DENIED, _INVALID_ARGUMENT,
321 *	_INTERNAL (path too long, or the backup failed for an odd reason),
322 *	_BACKEND_READONLY (filesystem is still read-only)
323 */
324int _scf_request_backup(scf_handle_t *, const char *);
325
326/*
327 * Repository switch client
328 */
329int _scf_repository_switch(scf_handle_t *, int);
330
331/*
332 * Determines whether a property group requires authorization to read; this
333 * does not in any way reflect whether the caller has that authorization.
334 * To determine that, the caller must attempt to read the value of one of the
335 * group's properties.
336 *
337 * Can fail with:
338 *	_NOT_BOUND, _CONNECTION_BROKEN, _INVALID_ARGUMENT, _INTERNAL,
339 *	_NO_RESOURCES, _CONSTRAINT_VIOLATED, _DELETED.
340 */
341int _scf_pg_is_read_protected(const scf_propertygroup_t *, boolean_t *);
342
343/*
344 * Sets annotation data for SMF audit logging.  Once this function has been
345 * set, the next audit record will be preceded by an ADT_smf_annotation
346 * with the information provided in this function.  This function is used
347 * to mark operations which comprise multiple primitive operations such as
348 * svccfg import.
349 */
350int _scf_set_annotation(scf_handle_t *h, const char *operation,
351    const char *file);
352
353/*
354 * scf_pattern_t
355 */
356typedef struct scf_pattern {
357	enum	{
358		PATTERN_INVALID,	/* Uninitialized state */
359		PATTERN_EXACT,
360		PATTERN_GLOB,
361		PATTERN_PARTIAL
362	} sp_type;
363	char			*sp_arg;	/* Original argument */
364	struct scf_match	*sp_matches;	/* List of matches */
365	int			sp_matchcount;	/* # of matches */
366} scf_pattern_t;
367
368int scf_cmp_pattern(char *, scf_pattern_t *);
369
370int gen_filenms_from_fmri(const char *, const char *, char *, char *);
371
372#ifdef	__cplusplus
373}
374#endif
375
376#endif	/* _LIBSCF_PRIV_H */
377