libscf_priv.h revision 4119:293019c5ea1f
1117397Skan/* 2117397Skan * CDDL HEADER START 3169691Skan * 4117397Skan * The contents of this file are subject to the terms of the 5117397Skan * Common Development and Distribution License (the "License"). 6117397Skan * You may not use this file except in compliance with the License. 7117397Skan * 8117397Skan * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9117397Skan * or http://www.opensolaris.org/os/licensing. 10117397Skan * See the License for the specific language governing permissions 11117397Skan * and limitations under the License. 12117397Skan * 13117397Skan * When distributing Covered Code, include this CDDL HEADER in each 14117397Skan * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15117397Skan * If applicable, add the following below this CDDL HEADER, with the 16117397Skan * fields enclosed by brackets "[]" replaced with your own identifying 17117397Skan * information: Portions Copyright [yyyy] [name of copyright owner] 18169691Skan * 19117397Skan * CDDL HEADER END 20117397Skan */ 21117397Skan/* 22117397Skan * Copyright 2007 Sun Microsystems, Inc. All rights reserved. 23117397Skan * Use is subject to license terms. 24117397Skan */ 25117397Skan 26117397Skan#ifndef _LIBSCF_PRIV_H 27117397Skan#define _LIBSCF_PRIV_H 28117397Skan 29117397Skan#pragma ident "%Z%%M% %I% %E% SMI" 30169691Skan 31117397Skan#include <libscf.h> 32169691Skan#include <unistd.h> 33169691Skan 34132720Skan#ifdef __cplusplus 35132720Skanextern "C" { 36132720Skan#endif 37132720Skan 38132720Skan/* 39132720Skan * NOTE 40132720Skan * 41132720Skan * The contents of this file are private to the implementation of Solaris 42132720Skan * and are subject to change at any time without notice. 43132720Skan */ 44132720Skan 45132720Skan#define SCF_PG_GENERAL_TYPE SCF_GROUP_FRAMEWORK 46132720Skan#define SCF_PG_GENERAL_FLAGS 0 47132720Skan 48132720Skan#define SCF_PG_GENERAL_OVR_TYPE SCF_GROUP_FRAMEWORK 49132720Skan#define SCF_PG_GENERAL_OVR_FLAGS SCF_PG_FLAG_NONPERSISTENT 50132720Skan 51132720Skan#define SCF_PG_OPTIONS_TYPE SCF_GROUP_FRAMEWORK 52117397Skan#define SCF_PG_OPTIONS_FLAGS 0 53169691Skan 54169691Skan#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_LOGFILE ((const char *)"logfile") 64#define SCF_PROPERTY_ALT_LOGFILE ((const char *)"alt_logfile") 65 66#define SCF_LEGACY_SERVICE ((const char *)"smf/legacy_run") 67 68#define SCF_LEGACY_PROPERTY_NAME ((const char *)"name") 69#define SCF_LEGACY_PROPERTY_INODE ((const char *)"inode") 70#define SCF_LEGACY_PROPERTY_SUFFIX ((const char *)"suffix") 71 72#define SCF_FMRI_TYPE_SVC 0x1 73#define SCF_FMRI_TYPE_FILE 0x2 74 75typedef struct scf_decoration_info { 76 const char *sdi_name; 77 scf_type_t sdi_type; 78 scf_value_t *sdi_value; /* can be SCF_DECORATE_CLEAR */ 79} scf_decoration_info_t; 80 81typedef int (*scf_decoration_func)(const scf_decoration_info_t *, void *); 82 83/* 84 * calls a callback function for each decoration on the handle. If the 85 * callback returns 0, the iteration stops and returns 0. If the callback 86 * returns a non-zero value, the iteration continues. After full completion, 87 * 1 is returned. On error, -1 is returned. 88 */ 89int _scf_handle_decorations(scf_handle_t *, scf_decoration_func *, 90 scf_value_t *, void *); 91 92/* 93 * wait for a change to the propertygroup -- may return early. 94 * For now, only one of these can be outstanding at a time. 95 * 96 * The second argument is how long, in seconds, to wait for a response. 97 * 98 * Returns SCF_COMPLETE on timeout, -1 on error, and SCF_SUCCESS in every 99 * other case. You must call scf_pg_update() to see if the object has 100 * actually changed. 101 */ 102int _scf_pg_wait(scf_propertygroup_t *, int); 103 104/* 105 * set up notifications for changes to a class of property groups (by name 106 * and type) 107 * 108 * Only one thread can be sleeping in _scf_notify_wait() -- others will 109 * fail. Deletions give an fmri in the output path. 110 * 111 * These do not survive unbind()->bind() -- in fact, that is currently the 112 * only way to clear them. 113 */ 114int _scf_notify_add_pgname(scf_handle_t *, const char *); 115int _scf_notify_add_pgtype(scf_handle_t *, const char *); 116int _scf_notify_wait(scf_propertygroup_t *, char *, size_t); 117 118/* 119 * Internal interfaces for snapshot creation: 120 * _scf_snapshot_take_new(), _scf_snapshot_take_new_named(), and 121 * _scf_snapshot_take_attach() create a set of snaplevels 122 * containing frozen versions of both the instance's property groups and 123 * its parent service's property groups. _scf_snapshot_take_new() and 124 * _scf_snapshot_take_new_named() create a new snapshot to which the 125 * new snaplevels are attached, while _scf_snapshot_take_attach() 126 * attaches the new snaplevels to a pre-existing snapshot. 127 * 128 * _scf_snapshot_take_new_named() records the passed in names into the 129 * snaplevel instead of the instance and service name. This creates 130 * an inconsistency, which should be resolved by using 131 * _scf_snapshot_attach() to attach the new snaplevels to a snapshot 132 * underneath the appropriate instance. The first snapshot can 133 * then be deleted. 134 * 135 * _scf_snapshot_attach(snap1, snap2) points snap2 at the snaplevels 136 * pointed to by snap1. After a call to either 137 * _scf_snapshot_take_attach(snap1, snap2) or 138 * _scf_snapshot_attach(inst, snap), scf_snapshot_update() will be 139 * required for any open references to snap or snap2 to see the new 140 * snaplevels. 141 * 142 * _scf_snapshot_delete() deletes the snapshot object. While 143 * snaplevels, being only loosely connected to snapshots, stay 144 * around until they are no longer referenced, any references *through 145 * this snapshot object* will be invalidated. 146 * 147 * _scf_snapshot_take_new() can fail with at least _HANDLE_MISMATCH, 148 * _CONNECTION_BROKEN, _INVALID_ARGUMENT, _NO_RESOURCES, _PERMISSION_DENIED, 149 * _NOT_SET, _EXISTS. 150 * 151 * _scf_snapshot_take_new_named() can fail with at least _HANDLE_MISMATCH, 152 * _CONNECTION_BROKEN, _INVALID_ARGUMENT, _NO_RESOURCES, _PERMISSION_DENIED, 153 * _NOT_SET, _EXISTS. 154 * 155 * _scf_snapshot_take_attach() can fail with _CONNECTION_BROKEN, _NOT_SET, 156 * _PERMISSION_DENIED, _NO_RESOURCES, _INVALID_ARGUMENT. 157 * 158 * _scf_snapshot_attach() can fail with _HANDLE_MISMATCH, _CONNECTION_BROKEN, 159 * _NOT_SET, _NO_RESOURCES, _PERMISSION_DENIED. 160 */ 161int _scf_snapshot_take_new(scf_instance_t *, const char *, scf_snapshot_t *); 162int _scf_snapshot_take_new_named(scf_instance_t *, 163 const char *, const char *, const char *, scf_snapshot_t *); 164int _scf_snapshot_take_attach(scf_instance_t *, scf_snapshot_t *); 165int _scf_snapshot_attach(scf_snapshot_t *, scf_snapshot_t *); 166int _scf_snapshot_delete(scf_snapshot_t *); 167 168/* 169 * Destructively portions up the first argument into the different portions 170 * of a svc: fmri, and returns pointers to the applicable portions. Omitted 171 * portions are set to NULL, except for the scope, which is set to the 172 * default local scope if not specified. 173 * 174 * Parsing is attempted in the order of: svc:, file:. The identified type 175 * of the service is returned in the second argument and may take a value 176 * of: SCF_FMRI_TYPE_SVC or SCF_FMRI_TYPE_FILE. 177 * 178 * Note that some of the returned pointers (in particular the scope) may not 179 * point into the passed buffer. 180 */ 181int scf_parse_fmri(char *, int *, const char **, const char **, const char **, 182 const char **, const char **); 183 184int scf_parse_svc_fmri(char *, const char **, const char **, const char **, 185 const char **, const char **); 186 187int scf_parse_file_fmri(char *fmri, const char **scope, const char **path); 188 189ssize_t scf_canonify_fmri(const char *, char *, size_t); 190 191const char *scf_type_to_string(scf_type_t); 192scf_type_t scf_string_to_type(const char *); 193 194int _smf_refresh_instance_i(scf_instance_t *); 195 196typedef struct scf_simple_handle { 197 scf_handle_t *h; 198 scf_snapshot_t *snap; 199 scf_instance_t *inst; 200 scf_propertygroup_t *running_pg; 201 scf_propertygroup_t *editing_pg; 202} scf_simple_handle_t; 203 204void scf_simple_handle_destroy(scf_simple_handle_t *); 205scf_simple_handle_t *scf_general_pg_setup(const char *, const char *); 206scf_transaction_t *scf_transaction_setup(scf_simple_handle_t *); 207int scf_transaction_restart(scf_simple_handle_t *, scf_transaction_t *); 208int scf_read_count_property(scf_simple_handle_t *, char *, uint64_t *); 209int scf_set_count_property(scf_transaction_t *, char *, uint64_t, boolean_t); 210 211/* 212 * Walks all the instances matching a given fmri list. Each fmri in the array 213 * can be one of the following: 214 * 215 * - Full instance name 216 * - Full service name 217 * - Full property group or property name 218 * - Partial service or instance name 219 * - A globbed pattern 220 * 221 * The matching rules for partial fmris are a slightly more complex. We allow 222 * for any substring anchored at the end of the instance or service name, 223 * provided it begins with a complete element in the fmri. For example, given 224 * the fmri "svc:/system/filesystem/local:default", any of the following would 225 * be acceptable matches: 'default', 'local', 'local:default', 226 * 'filesystem/local'. The following would not be acceptable: 227 * 'system/filesystem', 'filesystem/loc', 'system/local'. Possible flag values: 228 * 229 * SCF_WALK_MULTIPLE Allow individual arguments to correspond to 230 * multiple instances. 231 * 232 * SCF_WALK_LEGACY Walk legacy services (indicated by a non-NULL 233 * propery group). 234 * 235 * SCF_WALK_SERVICE If the user specifies a service, pass the 236 * service to the callback without iterating over 237 * its instances. 238 * 239 * SCF_WALK_PROPERTY Allow FMRIs which match property groups or 240 * individual properties. Incompatible with 241 * SCF_WALK_LEGACY. 242 * 243 * SCF_WALK_NOINSTANCE Walk only services. Must be used in 244 * conjunction with SCF_WALK_SERVICE. 245 * 246 * SCF_WALK_EXPLICIT Walk only services if the match is exact 247 * else return instances. Must be used in 248 * conjunction with SCF_WALK_SERVICE. 249 * 250 * If no arguments are given, then all instances in the service graph are 251 * walked. 252 * 253 * The second to last parameter is set to UU_EXIT_FATAL if one of the arguments 254 * is an invalid FMRI or matches multiple FMRIs when SCF_WALK_MULTIPLE is not 255 * set. 256 * 257 * The last parameter is a user-supplied error function that is called when 258 * reporting invalid arguments. 259 */ 260 261#define SCF_WALK_MULTIPLE 0x01 262#define SCF_WALK_LEGACY 0x02 263#define SCF_WALK_SERVICE 0x04 264#define SCF_WALK_PROPERTY 0x08 265#define SCF_WALK_NOINSTANCE 0x10 266#define SCF_WALK_EXPLICIT 0x20 267 268typedef struct scf_walkinfo { 269 const char *fmri; 270 scf_scope_t *scope; 271 scf_service_t *svc; 272 scf_instance_t *inst; 273 scf_propertygroup_t *pg; 274 scf_property_t *prop; 275 int count; /* svcprop special */ 276} scf_walkinfo_t; 277 278typedef int (*scf_walk_callback)(void *, scf_walkinfo_t *); 279 280scf_error_t scf_walk_fmri(scf_handle_t *, int, char **, int, 281 scf_walk_callback, void *, int *, void (*)(const char *, ...)); 282 283/* 284 * Requests a backup of the repository with a particular name, which 285 * can be any alphabetic string. Only privileged users can do this. 286 * 287 * Can fail with: 288 * _NOT_BOUND, _CONNECTION_BROKEN, _PERMISSION_DENIED, _INVALID_ARGUMENT, 289 * _INTERNAL (path too long, or the backup failed for an odd reason), 290 * _BACKEND_READONLY (filesystem is still read-only) 291 */ 292int _scf_request_backup(scf_handle_t *, const char *); 293 294/* 295 * scf_pattern_t 296 */ 297typedef struct scf_pattern { 298 enum { 299 PATTERN_INVALID, /* Uninitialized state */ 300 PATTERN_EXACT, 301 PATTERN_GLOB, 302 PATTERN_PARTIAL 303 } sp_type; 304 char *sp_arg; /* Original argument */ 305 struct scf_match *sp_matches; /* List of matches */ 306 int sp_matchcount; /* # of matches */ 307} scf_pattern_t; 308 309int scf_cmp_pattern(char *, scf_pattern_t *); 310 311int gen_filenms_from_fmri(const char *, const char *, char *, char *); 312 313#ifdef __cplusplus 314} 315#endif 316 317#endif /* _LIBSCF_PRIV_H */ 318