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 (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved.
  23  * Copyright 2013, Joyent, Inc. All rights reserved.
  24  */
  25 
  26 #ifndef _LIBSCF_PRIV_H
  27 #define _LIBSCF_PRIV_H
  28 
  29 
  30 #include <libscf.h>
  31 #include <unistd.h>
  32 #if !defined(NATIVE_BUILD)
  33 #include <sys/secflags.h>
  34 #endif
  35 
  36 #ifdef  __cplusplus
  37 extern "C" {
  38 #endif
  39 
  40 /*
  41  * NOTE
  42  *
  43  * The contents of this file are private to the implementation of Solaris
  44  * and are subject to change at any time without notice.
  45  */
  46 
  47 #define SCF_PG_GENERAL_TYPE             SCF_GROUP_FRAMEWORK
  48 #define SCF_PG_GENERAL_FLAGS            0
  49 
  50 #define SCF_PG_GENERAL_OVR_TYPE         SCF_GROUP_FRAMEWORK
  51 #define SCF_PG_GENERAL_OVR_FLAGS        SCF_PG_FLAG_NONPERSISTENT
  52 
  53 #define SCF_PG_DEATHROW_TYPE            SCF_GROUP_FRAMEWORK
  54 #define SCF_PG_DEATHROW_FLAGS           SCF_PG_FLAG_NONPERSISTENT
  55 
  56 #define SCF_PG_OPTIONS_TYPE             SCF_GROUP_FRAMEWORK
  57 #define SCF_PG_OPTIONS_FLAGS            0
  58 
  59 #define SCF_PG_OPTIONS_OVR_TYPE         SCF_GROUP_FRAMEWORK
  60 #define SCF_PG_OPTIONS_OVR_FLAGS        SCF_PG_FLAG_NONPERSISTENT
  61 
  62 #define SCF_PG_RESTARTER_TYPE           SCF_GROUP_FRAMEWORK
  63 #define SCF_PG_RESTARTER_FLAGS          SCF_PG_FLAG_NONPERSISTENT
  64 
  65 #define SCF_PG_RESTARTER_ACTIONS_TYPE   SCF_GROUP_FRAMEWORK
  66 #define SCF_PG_RESTARTER_ACTIONS_FLAGS  SCF_PG_FLAG_NONPERSISTENT
  67 
  68 #define SCF_PROPERTY_CLEAR              ((const char *)"maint_off")
  69 #define SCF_PROPERTY_MAINTENANCE        ((const char *)"maint_on")
  70 
  71 #define SCF_PROPERTY_LOGFILE            ((const char *)"logfile")
  72 #define SCF_PROPERTY_ALT_LOGFILE        ((const char *)"alt_logfile")
  73 
  74 #define SCF_LEGACY_SERVICE              ((const char *)"smf/legacy_run")
  75 
  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")
  79 
  80 #define SCF_FMRI_TYPE_SVC               0x1
  81 #define SCF_FMRI_TYPE_FILE              0x2
  82 
  83 /*
  84  * Strings for use in constructing FMRIs
  85  */
  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:"
  96 
  97 /*
  98  * sulogin Service FMRI
  99  */
 100 #define SVC_SULOGIN_FMRI ((const char *)"svc:/system/sulogin")
 101 
 102 typedef struct scf_decoration_info {
 103         const char *sdi_name;
 104         scf_type_t sdi_type;
 105         scf_value_t *sdi_value;         /* can be SCF_DECORATE_CLEAR */
 106 } scf_decoration_info_t;
 107 
 108 typedef int (*scf_decoration_func)(const scf_decoration_info_t *, void *);
 109 
 110 /*
 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.
 115  */
 116 int _scf_handle_decorations(scf_handle_t *, scf_decoration_func *,
 117     scf_value_t *, void *);
 118 
 119 /*
 120  * wait for a change to the propertygroup -- may return early.
 121  * For now, only one of these can be outstanding at a time.
 122  *
 123  * The second argument is how long, in seconds, to wait for a response.
 124  *
 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
 127  * actually changed.
 128  */
 129 int _scf_pg_wait(scf_propertygroup_t *, int);
 130 
 131 /*
 132  * set up notifications for changes to a class of property groups (by name
 133  * and type)
 134  *
 135  * Only one thread can be sleeping in _scf_notify_wait() -- others will
 136  * fail.  Deletions give an fmri in the output path.
 137  *
 138  * These do not survive unbind()->bind() -- in fact, that is currently the
 139  * only way to clear them.
 140  */
 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);
 144 
 145 /*
 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.
 154  *
 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
 160  *      then be deleted.
 161  *
 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
 167  *      snaplevels.
 168  *
 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.
 173  *
 174  * _scf_snapshot_take_new() can fail with at least _HANDLE_MISMATCH,
 175  * _CONNECTION_BROKEN, _INVALID_ARGUMENT, _NO_RESOURCES, _PERMISSION_DENIED,
 176  * _NOT_SET, _EXISTS.
 177  *
 178  * _scf_snapshot_take_new_named() can fail with at least _HANDLE_MISMATCH,
 179  * _CONNECTION_BROKEN, _INVALID_ARGUMENT, _NO_RESOURCES, _PERMISSION_DENIED,
 180  * _NOT_SET, _EXISTS.
 181  *
 182  * _scf_snapshot_take_attach() can fail with _CONNECTION_BROKEN, _NOT_SET,
 183  * _PERMISSION_DENIED, _NO_RESOURCES, _INVALID_ARGUMENT.
 184  *
 185  * _scf_snapshot_attach() can fail with _HANDLE_MISMATCH, _CONNECTION_BROKEN,
 186  * _NOT_SET, _NO_RESOURCES, _PERMISSION_DENIED.
 187  */
 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 *);
 194 
 195 /*
 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.
 200  *
 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.
 204  *
 205  * Note that some of the returned pointers (in particular the scope) may not
 206  * point into the passed buffer.
 207  */
 208 int scf_parse_fmri(char *, int *, const char **, const char **, const char **,
 209     const char **, const char **);
 210 
 211 int scf_parse_svc_fmri(char *, const char **, const char **, const char **,
 212     const char **, const char **);
 213 
 214 int scf_parse_file_fmri(char *fmri, const char **scope, const char **path);
 215 
 216 ssize_t scf_canonify_fmri(const char *, char *, size_t);
 217 
 218 int _smf_refresh_instance_i(scf_instance_t *);
 219 
 220 typedef 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 
 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);
 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  *      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.
 278  *
 279  * If no arguments are given, then all instances in the service graph are
 280  * walked.
 281  *
 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
 284  * set.
 285  *
 286  * The last parameter is a user-supplied error function that is called when
 287  * reporting invalid arguments.
 288  */
 289 
 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
 297 
 298 /*
 299  * The default locations of the repository dbs
 300  */
 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"
 305 
 306 
 307 typedef struct scf_walkinfo {
 308         const char              *fmri;
 309         scf_scope_t             *scope;
 310         scf_service_t           *svc;
 311         scf_instance_t          *inst;
 312         scf_propertygroup_t     *pg;
 313         scf_property_t          *prop;
 314         int                     count;  /* svcprop special */
 315 } scf_walkinfo_t;
 316 
 317 typedef int (*scf_walk_callback)(void *, scf_walkinfo_t *);
 318 
 319 scf_error_t scf_walk_fmri(scf_handle_t *, int, char **, int,
 320     scf_walk_callback, void *, int *, void (*)(const char *, ...));
 321 
 322 /*
 323  * Requests a backup of the repository with a particular name, which
 324  * can be any alphabetic string.  Only privileged users can do this.
 325  *
 326  * Can fail with:
 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)
 330  */
 331 int _scf_request_backup(scf_handle_t *, const char *);
 332 
 333 /*
 334  * Repository switch client
 335  */
 336 int _scf_repository_switch(scf_handle_t *, int);
 337 
 338 /*
 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.
 343  *
 344  * Can fail with:
 345  *      _NOT_BOUND, _CONNECTION_BROKEN, _INVALID_ARGUMENT, _INTERNAL,
 346  *      _NO_RESOURCES, _CONSTRAINT_VIOLATED, _DELETED.
 347  */
 348 int _scf_pg_is_read_protected(const scf_propertygroup_t *, boolean_t *);
 349 
 350 /*
 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
 355  * svccfg import.
 356  */
 357 int _scf_set_annotation(scf_handle_t *h, const char *operation,
 358     const char *file);
 359 
 360 /*
 361  * scf_pattern_t
 362  */
 363 typedef struct scf_pattern {
 364         enum    {
 365                 PATTERN_INVALID,        /* Uninitialized state */
 366                 PATTERN_EXACT,
 367                 PATTERN_GLOB,
 368                 PATTERN_PARTIAL
 369         } sp_type;
 370         char                    *sp_arg;        /* Original argument */
 371         struct scf_match        *sp_matches;    /* List of matches */
 372         int                     sp_matchcount;  /* # of matches */
 373 } scf_pattern_t;
 374 
 375 int scf_cmp_pattern(char *, scf_pattern_t *);
 376 
 377 int gen_filenms_from_fmri(const char *, const char *, char *, char *);
 378 
 379 /*
 380  * Interfaces for bulk access to SMF-stored configuration.
 381  *
 382  * Each scf_propvec_t represents a single property to be read (with
 383  * scf_read_propvec) or written (with scf_write_propvec).
 384  *
 385  * The fields of a scf_propvec_t have the following meanings:
 386  *
 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
 391  *             be written
 392  *   pv_aux  - additional data influencing the interpretation of pv_ptr
 393  *
 394  * The meaning of pv_ptr and pv_aux depends on the type of property.  For:
 395  *
 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
 406  */
 407 typedef struct {
 408         void    *so_addr;
 409         size_t  so_size;
 410 } scf_opaque_t;
 411 
 412 typedef struct {
 413         const char      *pv_prop;
 414         const char      *pv_desc;
 415         scf_type_t      pv_type;
 416         void            *pv_ptr;
 417         uint64_t        pv_aux;
 418 } scf_propvec_t;
 419 
 420 void scf_clean_propvec(scf_propvec_t *);
 421 int scf_read_propvec(const char *, const char *, boolean_t, scf_propvec_t *,
 422     scf_propvec_t **);
 423 int scf_write_propvec(const char *, const char *, scf_propvec_t *,
 424     scf_propvec_t **);
 425 
 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 *);
 433 
 434 /*
 435  * Templates definitions
 436  */
 437 
 438 /*
 439  * For CARDINALITY_VIOLATION and RANGE_VIOLATION, te_ev1 holds
 440  * the min value and te_ev2 holds the max value
 441  *
 442  * For MISSING_PG te_ev1 should hold the expected pg_name and
 443  * expected2 holds the expected pg_type.
 444  *
 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
 448  * pg_pattern.
 449  *
 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.
 453  *
 454  * For SCF_TERR_INCLUDE_VALUES te_ev1 is the type specified for the
 455  * include_values element.
 456  *
 457  * For all other errors, te_ev1 should hold the expected value and
 458  * te_ev2 is ignored
 459  *
 460  * te_actual holds the current value of the property
 461  */
 462 
 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;
 468         const char                      *te_ev1;
 469         const char                      *te_ev2;
 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;
 476 };
 477 
 478 /*
 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.
 483  *
 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
 488  */
 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 \
 491         "_")
 492 #define SCF_PG_TM_PG_PATTERN_N_PREFIX   ((const char *)SCF_PG_TM_PG_PAT_BASE \
 493         "n_")
 494 #define SCF_PG_TM_PG_PATTERN_T_PREFIX   ((const char *)SCF_PG_TM_PG_PAT_BASE \
 495         "t_")
 496 #define SCF_PG_TM_PG_PATTERN_NT_PREFIX  ((const char *)SCF_PG_TM_PG_PAT_BASE \
 497         "nt_")
 498 #define SCF_PG_TM_PROP_PATTERN_PREFIX   ((const char *)"tm_proppat_")
 499 
 500 /*
 501  * Pad character to use when encoding strings for property names.
 502  */
 503 #define SCF_ENCODE32_PAD                ('-')
 504 
 505 /*
 506  * Functions for base 32 encoding/decoding
 507  */
 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);
 510 
 511 /*
 512  * handy functions
 513  */
 514 /*
 515  * _scf_sanitize_locale
 516  * Make sure a locale string has only alpha-numeric or '_' characters
 517  */
 518 void _scf_sanitize_locale(char *);
 519 
 520 /*
 521  * _scf_read_tmpl_prop_type_as_string()
 522  * Handy function to get template property type as a string
 523  */
 524 char *_scf_read_tmpl_prop_type_as_string(const scf_prop_tmpl_t *);
 525 /*
 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.
 529  */
 530 char *_scf_read_single_astring_from_pg(scf_propertygroup_t *, const char *);
 531 
 532 /*
 533  * scf_instance_delete_prop()
 534  * Given instance, property group, and property, delete the property.
 535  */
 536 int
 537 scf_instance_delete_prop(scf_instance_t *, const char *, const char *);
 538 
 539 /*
 540  * Functions to extract boot config information from FMRI_BOOT_CONFIG
 541  */
 542 void scf_get_boot_config(uint8_t *);
 543 void scf_get_boot_config_ovr(uint8_t *);
 544 int scf_is_fastboot_default(void);
 545 
 546 /*
 547  * Set value of "config_ovr/fastreboot_default".
 548  */
 549 int scf_fastreboot_default_set_transient(boolean_t);
 550 
 551 /*
 552  * scf_is_compatible_type()
 553  * Return true if the second type is the same type, or a subtype of the
 554  * first.
 555  */
 556 int scf_is_compatible_type(scf_type_t, scf_type_t);
 557 
 558 /*
 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).
 562  */
 563 void _check_services(char **);
 564 
 565 /*
 566  * _scf_handle_create_and_bind()
 567  * convenience function that creates and binds a handle
 568  */
 569 scf_handle_t *_scf_handle_create_and_bind(scf_version_t);
 570 
 571 /*
 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.
 576  */
 577 int _smf_refresh_all_instances(scf_service_t *);
 578 
 579 /*
 580  * _scf_get_fma_notify_params()
 581  * Specialized fuction to get fma notifitation parameters
 582  */
 583 int _scf_get_fma_notify_params(const char *, nvlist_t *, int);
 584 
 585 /*
 586  * _scf_get_svc_notify_params()
 587  * Specialized function to get SMF state transition notification parameters
 588  */
 589 int _scf_get_svc_notify_params(const char *, nvlist_t *, int32_t, int, int);
 590 
 591 /*
 592  * _scf_notify_get_params()
 593  * Specialized function to get notification parametes from a pg into an
 594  * nvlist_t
 595  */
 596 int _scf_notify_get_params(scf_propertygroup_t *, nvlist_t *);
 597 
 598 #if !defined(NATIVE_BUILD)
 599 int scf_default_secflags(scf_handle_t *, psecflags_t *);
 600 #endif
 601 
 602 #define SCF_NOTIFY_PARAMS_SOURCE_NAME   ((const char *)"preference_source")
 603 
 604 #ifdef  __cplusplus
 605 }
 606 #endif
 607 
 608 #endif  /* _LIBSCF_PRIV_H */