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