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, Version 1.0 only 6 * (the "License"). You may not use this file except in compliance 7 * with the License. 8 * 9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 10 * or http://www.opensolaris.org/os/licensing. 11 * See the License for the specific language governing permissions 12 * and limitations under the License. 13 * 14 * When distributing Covered Code, include this CDDL HEADER in each 15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 16 * If applicable, add the following below this CDDL HEADER, with the 17 * fields enclosed by brackets "[]" replaced with your own identifying 18 * information: Portions Copyright [yyyy] [name of copyright owner] 19 * 20 * CDDL HEADER END 21 */ 22 /* 23 * Copyright 2004 Sun Microsystems, Inc. All rights reserved. 24 * Use is subject to license terms. 25 */ 26 27 #ifndef _LIBSCF_PRIV_H 28 #define _LIBSCF_PRIV_H 29 30 #pragma ident "%Z%%M% %I% %E% SMI" 31 32 #include <libscf.h> 33 #include <unistd.h> 34 35 #ifdef __cplusplus 36 extern "C" { 37 #endif 38 39 /* 40 * NOTE 41 * 42 * The contents of this file are private to the implementation of Solaris 43 * and are subject to change at any time without notice. 44 */ 45 46 #define SCF_PG_GENERAL_TYPE SCF_GROUP_FRAMEWORK 47 #define SCF_PG_GENERAL_FLAGS 0 48 49 #define SCF_PG_GENERAL_OVR_TYPE SCF_GROUP_FRAMEWORK 50 #define SCF_PG_GENERAL_OVR_FLAGS SCF_PG_FLAG_NONPERSISTENT 51 52 #define SCF_PG_OPTIONS_TYPE SCF_GROUP_FRAMEWORK 53 #define SCF_PG_OPTIONS_FLAGS 0 54 55 #define SCF_PG_OPTIONS_OVR_TYPE SCF_GROUP_FRAMEWORK 56 #define SCF_PG_OPTIONS_OVR_FLAGS SCF_PG_FLAG_NONPERSISTENT 57 58 #define SCF_PG_RESTARTER_TYPE SCF_GROUP_FRAMEWORK 59 #define SCF_PG_RESTARTER_FLAGS SCF_PG_FLAG_NONPERSISTENT 60 61 #define SCF_PG_RESTARTER_ACTIONS_TYPE SCF_GROUP_FRAMEWORK 62 #define SCF_PG_RESTARTER_ACTIONS_FLAGS SCF_PG_FLAG_NONPERSISTENT 63 64 #define SCF_PROPERTY_LOGFILE ((const char *)"logfile") 65 #define SCF_PROPERTY_ALT_LOGFILE ((const char *)"alt_logfile") 66 67 #define SCF_LEGACY_SERVICE ((const char *)"smf/legacy_run") 68 69 #define SCF_LEGACY_PROPERTY_NAME ((const char *)"name") 70 #define SCF_LEGACY_PROPERTY_INODE ((const char *)"inode") 71 #define SCF_LEGACY_PROPERTY_SUFFIX ((const char *)"suffix") 72 73 #define SCF_FMRI_TYPE_SVC 0x1 74 #define SCF_FMRI_TYPE_FILE 0x2 75 76 typedef struct scf_decoration_info { 77 const char *sdi_name; 78 scf_type_t sdi_type; 79 scf_value_t *sdi_value; /* can be SCF_DECORATE_CLEAR */ 80 } scf_decoration_info_t; 81 82 typedef int (*scf_decoration_func)(const scf_decoration_info_t *, void *); 83 84 /* 85 * calls a callback function for each decoration on the handle. If the 86 * callback returns 0, the iteration stops and returns 0. If the callback 87 * returns a non-zero value, the iteration continues. After full completion, 88 * 1 is returned. On error, -1 is returned. 89 */ 90 int _scf_handle_decorations(scf_handle_t *, scf_decoration_func *, 91 scf_value_t *, void *); 92 93 /* 94 * wait for a change to the propertygroup -- may return early. 95 * For now, only one of these can be outstanding at a time. 96 * 97 * The second argument is how long, in seconds, to wait for a response. 98 * 99 * Returns SCF_COMPLETE on timeout, -1 on error, and SCF_SUCCESS in every 100 * other case. You must call scf_pg_update() to see if the object has 101 * actually changed. 102 */ 103 int _scf_pg_wait(scf_propertygroup_t *, int); 104 105 /* 106 * set up notifications for changes to a class of property groups (by name 107 * and type) 108 * 109 * Only one thread can be sleeping in _scf_notify_wait() -- others will 110 * fail. Deletions give an fmri in the output path. 111 * 112 * These do not survive unbind()->bind() -- in fact, that is currently the 113 * only way to clear them. 114 */ 115 int _scf_notify_add_pgname(scf_handle_t *, const char *); 116 int _scf_notify_add_pgtype(scf_handle_t *, const char *); 117 int _scf_notify_wait(scf_propertygroup_t *, char *, size_t); 118 119 /* 120 * Internal interfaces for snapshot creation: 121 * _scf_snapshot_take_new(), _scf_snapshot_take_new_named(), and 122 * _scf_snapshot_take_attach() create a set of snaplevels 123 * containing frozen versions of both the instance's property groups and 124 * its parent service's property groups. _scf_snapshot_take_new() and 125 * _scf_snapshot_take_new_named() create a new snapshot to which the 126 * new snaplevels are attached, while _scf_snapshot_take_attach() 127 * attaches the new snaplevels to a pre-existing snapshot. 128 * 129 * _scf_snapshot_take_new_named() records the passed in names into the 130 * snaplevel instead of the instance and service name. This creates 131 * an inconsistency, which should be resolved by using 132 * _scf_snapshot_attach() to attach the new snaplevels to a snapshot 133 * underneath the appropriate instance. The first snapshot can 134 * then be deleted. 135 * 136 * _scf_snapshot_attach(snap1, snap2) points snap2 at the snaplevels 137 * pointed to by snap1. After a call to either 138 * _scf_snapshot_take_attach(snap1, snap2) or 139 * _scf_snapshot_attach(inst, snap), scf_snapshot_update() will be 140 * required for any open references to snap or snap2 to see the new 141 * snaplevels. 142 * 143 * _scf_snapshot_delete() deletes the snapshot object. While 144 * snaplevels, being only loosely connected to snapshots, stay 145 * around until they are no longer referenced, any references *through 146 * this snapshot object* will be invalidated. 147 * 148 * _scf_snapshot_take_new() can fail with at least _HANDLE_MISMATCH, 149 * _CONNECTION_BROKEN, _INVALID_ARGUMENT, _NO_RESOURCES, _PERMISSION_DENIED, 150 * _NOT_SET, _EXISTS. 151 * 152 * _scf_snapshot_take_new_named() can fail with at least _HANDLE_MISMATCH, 153 * _CONNECTION_BROKEN, _INVALID_ARGUMENT, _NO_RESOURCES, _PERMISSION_DENIED, 154 * _NOT_SET, _EXISTS. 155 * 156 * _scf_snapshot_take_attach() can fail with _CONNECTION_BROKEN, _NOT_SET, 157 * _PERMISSION_DENIED, _NO_RESOURCES, _INVALID_ARGUMENT. 158 * 159 * _scf_snapshot_attach() can fail with _HANDLE_MISMATCH, _CONNECTION_BROKEN, 160 * _NOT_SET, _NO_RESOURCES, _PERMISSION_DENIED. 161 */ 162 int _scf_snapshot_take_new(scf_instance_t *, const char *, scf_snapshot_t *); 163 int _scf_snapshot_take_new_named(scf_instance_t *, 164 const char *, const char *, const char *, scf_snapshot_t *); 165 int _scf_snapshot_take_attach(scf_instance_t *, scf_snapshot_t *); 166 int _scf_snapshot_attach(scf_snapshot_t *, scf_snapshot_t *); 167 int _scf_snapshot_delete(scf_snapshot_t *); 168 169 /* 170 * Destructively portions up the first argument into the different portions 171 * of a svc: fmri, and returns pointers to the applicable portions. Omitted 172 * portions are set to NULL, except for the scope, which is set to the 173 * default local scope if not specified. 174 * 175 * Parsing is attempted in the order of: svc:, file:. The identified type 176 * of the service is returned in the second argument and may take a value 177 * of: SCF_FMRI_TYPE_SVC or SCF_FMRI_TYPE_FILE. 178 * 179 * Note that some of the returned pointers (in particular the scope) may not 180 * point into the passed buffer. 181 */ 182 int scf_parse_fmri(char *, int *, const char **, const char **, const char **, 183 const char **, const char **); 184 185 int scf_parse_svc_fmri(char *, const char **, const char **, const char **, 186 const char **, const char **); 187 188 int scf_parse_file_fmri(char *fmri, const char **scope, const char **path); 189 190 ssize_t scf_canonify_fmri(const char *, char *, size_t); 191 192 const char *scf_type_to_string(scf_type_t); 193 scf_type_t scf_string_to_type(const char *); 194 195 int _smf_refresh_instance_i(scf_instance_t *); 196 197 /* 198 * Walks all the instances matching a given fmri list. Each fmri in the array 199 * can be one of the following: 200 * 201 * - Full instance name 202 * - Full service name 203 * - Full property group or property name 204 * - Partial service or instance name 205 * - A globbed pattern 206 * 207 * The matching rules for partial fmris are a slightly more complex. We allow 208 * for any substring anchored at the end of the instance or service name, 209 * provided it begins with a complete element in the fmri. For example, given 210 * the fmri "svc:/system/filesystem/local:default", any of the following would 211 * be acceptable matches: 'default', 'local', 'local:default', 212 * 'filesystem/local'. The following would not be acceptable: 213 * 'system/filesystem', 'filesystem/loc', 'system/local'. Possible flag values: 214 * 215 * SCF_WALK_MULTIPLE Allow individual arguments to correspond to 216 * multiple instances. 217 * 218 * SCF_WALK_LEGACY Walk legacy services (indicated by a non-NULL 219 * propery group). 220 * 221 * SCF_WALK_SERVICE If the user specifies a service, pass the 222 * service to the callback without iterating over 223 * its instances. 224 * 225 * SCF_WALK_PROPERTY Allow FMRIs which match property groups or 226 * individual properties. Incompatible with 227 * SCF_WALK_LEGACY. 228 * 229 * SCF_WALK_NOINSTANCE Walk only services. Must be used in 230 * conjunction with SCF_WALK_SERVICE. 231 * 232 * SCF_WALK_EXPLICIT Walk only services if the match is exact 233 * else return instances. Must be used in 234 * conjunction with SCF_WALK_SERVICE. 235 * 236 * If no arguments are given, then all instances in the service graph are 237 * walked. 238 * 239 * The second to last parameter is set to UU_EXIT_FATAL if one of the arguments 240 * is an invalid FMRI or matches multiple FMRIs when SCF_WALK_MULTIPLE is not 241 * set. 242 * 243 * The last parameter is a user-supplied error function that is called when 244 * reporting invalid arguments. 245 */ 246 247 #define SCF_WALK_MULTIPLE 0x01 248 #define SCF_WALK_LEGACY 0x02 249 #define SCF_WALK_SERVICE 0x04 250 #define SCF_WALK_PROPERTY 0x08 251 #define SCF_WALK_NOINSTANCE 0x10 252 #define SCF_WALK_EXPLICIT 0x20 253 254 typedef struct scf_walkinfo { 255 const char *fmri; 256 scf_scope_t *scope; 257 scf_service_t *svc; 258 scf_instance_t *inst; 259 scf_propertygroup_t *pg; 260 scf_property_t *prop; 261 int count; /* svcprop special */ 262 } scf_walkinfo_t; 263 264 typedef int (*scf_walk_callback)(void *, scf_walkinfo_t *); 265 266 scf_error_t scf_walk_fmri(scf_handle_t *, int, char **, int, 267 scf_walk_callback, void *, int *, void (*)(const char *, ...)); 268 269 /* 270 * Requests a backup of the repository with a particular name, which 271 * can be any alphabetic string. Only privileged users can do this. 272 * 273 * Can fail with: 274 * _NOT_BOUND, _CONNECTION_BROKEN, _PERMISSION_DENIED, _INVALID_ARGUMENT, 275 * _INTERNAL (path too long, or the backup failed for an odd reason), 276 * _BACKEND_READONLY (filesystem is still read-only) 277 */ 278 int _scf_request_backup(scf_handle_t *, const char *); 279 280 #ifdef __cplusplus 281 } 282 #endif 283 284 #endif /* _LIBSCF_PRIV_H */ 285