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 /*
  23  * Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved.
  24  */
  25 
  26 #ifndef _LIBSCF_H
  27 #define _LIBSCF_H
  28 
  29 
  30 #include <stddef.h>
  31 #include <libnvpair.h>
  32 
  33 #ifndef NATIVE_BUILD
  34 #include <sys/secflags.h>
  35 #endif  /* NATIVE_BUILD */
  36 #include <sys/types.h>
  37 
  38 #ifdef  __cplusplus
  39 extern "C" {
  40 #endif
  41 
  42 typedef struct scf_version *scf_version_t;
  43 #define SCF_VERSION     ((scf_version_t)1UL)
  44 
  45 /*
  46  * Opaque structures
  47  */
  48 typedef struct scf_handle scf_handle_t;
  49 typedef struct scf_scope scf_scope_t;
  50 typedef struct scf_service scf_service_t;
  51 typedef struct scf_instance scf_instance_t;
  52 typedef struct scf_propertygroup scf_propertygroup_t;
  53 typedef struct scf_property scf_property_t;
  54 
  55 typedef struct scf_snapshot scf_snapshot_t;
  56 typedef struct scf_snaplevel scf_snaplevel_t;
  57 
  58 typedef struct scf_transaction scf_transaction_t;
  59 typedef struct scf_transaction_entry scf_transaction_entry_t;
  60 typedef struct scf_value scf_value_t;
  61 
  62 typedef struct scf_iter scf_iter_t;
  63 
  64 typedef struct scf_pg_tmpl scf_pg_tmpl_t;
  65 typedef struct scf_prop_tmpl scf_prop_tmpl_t;
  66 typedef struct scf_tmpl_errors scf_tmpl_errors_t;
  67 
  68 typedef struct scf_simple_app_props scf_simple_app_props_t;
  69 typedef struct scf_simple_prop scf_simple_prop_t;
  70 
  71 /*
  72  * Types
  73  */
  74 typedef enum {
  75         SCF_TYPE_INVALID = 0,
  76 
  77         SCF_TYPE_BOOLEAN,
  78         SCF_TYPE_COUNT,
  79         SCF_TYPE_INTEGER,
  80         SCF_TYPE_TIME,
  81         SCF_TYPE_ASTRING,
  82         SCF_TYPE_OPAQUE,
  83 
  84         SCF_TYPE_USTRING = 100,
  85 
  86         SCF_TYPE_URI = 200,
  87         SCF_TYPE_FMRI,
  88 
  89         SCF_TYPE_HOST = 300,
  90         SCF_TYPE_HOSTNAME,
  91         SCF_TYPE_NET_ADDR_V4,
  92         SCF_TYPE_NET_ADDR_V6,
  93         SCF_TYPE_NET_ADDR
  94 } scf_type_t;
  95 
  96 typedef struct scf_time {
  97         int64_t         t_seconds;
  98         int32_t         t_ns;
  99 } scf_time_t;
 100 
 101 /*
 102  * There is no explicit initializer for this structure.  Functions
 103  * which set or populate this structure assume that it is either
 104  * uninitialized or destroyed.
 105  */
 106 typedef struct scf_values {
 107         scf_type_t              value_type;
 108         void                    *reserved;      /* reserved for future use */
 109         int                     value_count;
 110         char                    **values_as_strings;
 111         union {
 112                 uint64_t        *v_count;
 113                 uint8_t         *v_boolean;
 114                 int64_t         *v_integer;
 115                 char            **v_astring;
 116                 char            **v_ustring;
 117                 char            **v_opaque;
 118                 scf_time_t      *v_time;
 119         } values;
 120 } scf_values_t;
 121 
 122 typedef struct scf_count_ranges {
 123         int             scr_num_ranges;
 124         uint64_t        *scr_min;
 125         uint64_t        *scr_max;
 126 } scf_count_ranges_t;
 127 
 128 typedef struct scf_int_ranges {
 129         int             sir_num_ranges;
 130         int64_t         *sir_min;
 131         int64_t         *sir_max;
 132 } scf_int_ranges_t;
 133 
 134 /*
 135  * Return codes
 136  */
 137 #define SCF_SUCCESS                     0
 138 #define SCF_COMPLETE                    1
 139 #define SCF_FAILED                      -1
 140 
 141 typedef enum scf_error {
 142         SCF_ERROR_NONE = 1000,          /* no error */
 143         SCF_ERROR_NOT_BOUND,            /* handle not bound */
 144         SCF_ERROR_NOT_SET,              /* cannot use unset argument */
 145         SCF_ERROR_NOT_FOUND,            /* nothing of that name found */
 146         SCF_ERROR_TYPE_MISMATCH,        /* type does not match value */
 147         SCF_ERROR_IN_USE,               /* cannot modify while in-use */
 148         SCF_ERROR_CONNECTION_BROKEN,    /* repository connection gone */
 149         SCF_ERROR_INVALID_ARGUMENT,     /* bad argument */
 150         SCF_ERROR_NO_MEMORY,            /* no memory available */
 151         SCF_ERROR_CONSTRAINT_VIOLATED,  /* required constraint not met */
 152         SCF_ERROR_EXISTS,               /* object already exists */
 153         SCF_ERROR_NO_SERVER,            /* repository server unavailable */
 154         SCF_ERROR_NO_RESOURCES,         /* server has insufficient resources */
 155         SCF_ERROR_PERMISSION_DENIED,    /* insufficient privileges for action */
 156         SCF_ERROR_BACKEND_ACCESS,       /* backend refused access */
 157         SCF_ERROR_HANDLE_MISMATCH,      /* mismatched SCF handles */
 158         SCF_ERROR_HANDLE_DESTROYED,     /* object bound to destroyed handle */
 159         SCF_ERROR_VERSION_MISMATCH,     /* incompatible SCF version */
 160         SCF_ERROR_BACKEND_READONLY,     /* backend is read-only */
 161         SCF_ERROR_DELETED,              /* object has been deleted */
 162         SCF_ERROR_TEMPLATE_INVALID,     /* template data is invalid */
 163 
 164         SCF_ERROR_CALLBACK_FAILED = 1080, /* user callback function failed */
 165 
 166         SCF_ERROR_INTERNAL = 1101       /* internal error */
 167 } scf_error_t;
 168 
 169 /*
 170  * This enum MUST be kept in sync with
 171  * struct _scf_tmpl_error_desc em_desc() in scf_tmpl.c
 172  */
 173 typedef enum scf_tmpl_error_type {
 174         SCF_TERR_MISSING_PG,            /* property group missing */
 175         SCF_TERR_WRONG_PG_TYPE,         /* property group type incorrect */
 176         SCF_TERR_MISSING_PROP,          /* missing required property */
 177         SCF_TERR_WRONG_PROP_TYPE,       /* property type incorrect */
 178         SCF_TERR_CARDINALITY_VIOLATION, /* wrong number of values */
 179         SCF_TERR_VALUE_CONSTRAINT_VIOLATED, /* constraint violated for value */
 180         SCF_TERR_RANGE_VIOLATION,       /* value violated specified range */
 181         SCF_TERR_PG_REDEFINE,           /* global or restarter pg_pattern */
 182                                         /* redefined by the instance */
 183         SCF_TERR_PROP_TYPE_MISMATCH,    /* property and value type mismatch */
 184         SCF_TERR_VALUE_OUT_OF_RANGE,    /* value is out of range in template */
 185         SCF_TERR_INVALID_VALUE,         /* value is not valid for the */
 186                                         /* template */
 187         SCF_TERR_PG_PATTERN_CONFLICT,   /* pg_pattern conflicts with higher */
 188                                         /* level definition */
 189         SCF_TERR_PROP_PATTERN_CONFLICT, /* prop_pattern conflicts with higher */
 190                                         /* level definition */
 191         SCF_TERR_GENERAL_REDEFINE,      /* global or restarter template */
 192                                         /* redefined */
 193         SCF_TERR_INCLUDE_VALUES,        /* No supporting constraints or */
 194                                         /* values for include_values */
 195         SCF_TERR_PG_PATTERN_INCOMPLETE, /* Required pg_pattern is missing */
 196                                         /* name or type attribute. */
 197         SCF_TERR_PROP_PATTERN_INCOMPLETE    /* Required prop_pattern is */
 198                                             /* missing a type attribute. */
 199 } scf_tmpl_error_type_t;
 200 
 201 typedef struct scf_tmpl_error scf_tmpl_error_t;
 202 
 203 /*
 204  * This unfortunately needs to be public, because consumers of librestart must
 205  * deal with it
 206  */
 207 typedef struct {
 208 #ifndef NATIVE_BUILD
 209         secflagdelta_t ss_default;
 210         secflagdelta_t ss_lower;
 211         secflagdelta_t ss_upper;
 212 #else
 213         /*
 214          * This is never used, but is necessary for bootstrapping.
 215          * Not even the size matters.
 216          */
 217         void *ss_default;
 218         void *ss_lower;
 219         void *ss_upper;
 220 #endif /* NATIVE_BUILD */
 221 } scf_secflags_t;
 222 
 223 /*
 224  * scf_tmpl_strerror() human readable flag
 225  */
 226 #define SCF_TMPL_STRERROR_HUMAN 0x1
 227 
 228 /*
 229  * Standard services
 230  */
 231 #define SCF_SERVICE_CONFIGD     ((const char *) \
 232                                     "svc:/system/svc/repository:default")
 233 #define SCF_INSTANCE_GLOBAL     ((const char *) \
 234                                     "svc:/system/svc/global:default")
 235 #define SCF_SERVICE_GLOBAL      ((const char *) \
 236                                     "svc:/system/svc/global")
 237 #define SCF_SERVICE_STARTD      ((const char *) \
 238                                     "svc:/system/svc/restarter:default")
 239 #define SCF_INSTANCE_EMI        ((const char *) \
 240                                     "svc:/system/early-manifest-import:default")
 241 #define SCF_INSTANCE_FS_MINIMAL ((const char *) \
 242                                     "svc:/system/filesystem/minimal:default")
 243 #define SCF_INSTANCE_MI         ((const char *) \
 244                                     "svc:/system/manifest-import:default")
 245 
 246 /*
 247  * Major milestones
 248  */
 249 #define SCF_MILESTONE_SINGLE_USER \
 250         ((const char *) "svc:/milestone/single-user:default")
 251 #define SCF_MILESTONE_MULTI_USER \
 252         ((const char *) "svc:/milestone/multi-user:default")
 253 #define SCF_MILESTONE_MULTI_USER_SERVER \
 254         ((const char *) "svc:/milestone/multi-user-server:default")
 255 
 256 /*
 257  * standard scope names
 258  */
 259 #define SCF_SCOPE_LOCAL                 ((const char *)"localhost")
 260 
 261 /*
 262  * Property group types
 263  */
 264 #define SCF_GROUP_APPLICATION           ((const char *)"application")
 265 #define SCF_GROUP_FRAMEWORK             ((const char *)"framework")
 266 #define SCF_GROUP_DEPENDENCY            ((const char *)"dependency")
 267 #define SCF_GROUP_METHOD                ((const char *)"method")
 268 #define SCF_GROUP_TEMPLATE              ((const char *)"template")
 269 #define SCF_GROUP_TEMPLATE_PG_PATTERN   ((const char *)"template_pg_pattern")
 270 #define SCF_GROUP_TEMPLATE_PROP_PATTERN ((const char *)"template_prop_pattern")
 271 
 272 /*
 273  * Dependency types
 274  */
 275 #define SCF_DEP_REQUIRE_ALL             ((const char *)"require_all")
 276 #define SCF_DEP_REQUIRE_ANY             ((const char *)"require_any")
 277 #define SCF_DEP_EXCLUDE_ALL             ((const char *)"exclude_all")
 278 #define SCF_DEP_OPTIONAL_ALL            ((const char *)"optional_all")
 279 
 280 #define SCF_DEP_RESET_ON_ERROR          ((const char *)"error")
 281 #define SCF_DEP_RESET_ON_RESTART        ((const char *)"restart")
 282 #define SCF_DEP_RESET_ON_REFRESH        ((const char *)"refresh")
 283 #define SCF_DEP_RESET_ON_NONE           ((const char *)"none")
 284 
 285 /*
 286  * Standard property group names
 287  */
 288 #define SCF_PG_GENERAL                  ((const char *)"general")
 289 #define SCF_PG_GENERAL_OVR              ((const char *)"general_ovr")
 290 #define SCF_PG_RESTARTER                ((const char *)"restarter")
 291 #define SCF_PG_RESTARTER_ACTIONS        ((const char *)"restarter_actions")
 292 #define SCF_PG_METHOD_CONTEXT           ((const char *)"method_context")
 293 #define SCF_PG_APP_DEFAULT              ((const char *)"application")
 294 #define SCF_PG_DEPENDENTS               ((const char *)"dependents")
 295 #define SCF_PG_OPTIONS                  ((const char *)"options")
 296 #define SCF_PG_OPTIONS_OVR              ((const char *)"options_ovr")
 297 #define SCF_PG_STARTD                   ((const char *)"startd")
 298 #define SCF_PG_STARTD_PRIVATE           ((const char *)"svc-startd-private")
 299 #define SCF_PG_DEATHROW                 ((const char *)"deathrow")
 300 #define SCF_PG_MANIFESTFILES            ((const char *)"manifestfiles")
 301 
 302 /*
 303  * Template property group names and prefixes
 304  */
 305 #define SCF_PG_TM_COMMON_NAME           ((const char *)"tm_common_name")
 306 #define SCF_PG_TM_DESCRIPTION           ((const char *)"tm_description")
 307 
 308 #define SCF_PG_TM_MAN_PREFIX            ((const char *)"tm_man_")
 309 #define SCF_PG_TM_DOC_PREFIX            ((const char *)"tm_doc_")
 310 
 311 /*
 312  * Standard property names
 313  */
 314 #define SCF_PROPERTY_ACTIVE_POSTFIX     ((const char *)"active")
 315 #define SCF_PROPERTY_AUX_STATE          ((const char *)"auxiliary_state")
 316 #define SCF_PROPERTY_AUX_FMRI           ((const char *)"auxiliary_fmri")
 317 #define SCF_PROPERTY_AUX_TTY            ((const char *)"auxiliary_tty")
 318 #define SCF_PROPERTY_CONTRACT           ((const char *)"contract")
 319 #define SCF_PROPERTY_COREFILE_PATTERN   ((const char *)"corefile_pattern")
 320 #define SCF_PROPERTY_DEGRADED           ((const char *)"degraded")
 321 #define SCF_PROPERTY_DEGRADE_IMMEDIATE  ((const char *)"degrade_immediate")
 322 #define SCF_PROPERTY_DODUMP             ((const char *)"do_dump")
 323 #define SCF_PROPERTY_DURATION           ((const char *)"duration")
 324 #define SCF_PROPERTY_ENABLED            ((const char *)"enabled")
 325 #define SCF_PROPERTY_DEATHROW           ((const char *)"deathrow")
 326 #define SCF_PROPERTY_ENTITY_STABILITY   ((const char *)"entity_stability")
 327 #define SCF_PROPERTY_ENTITIES           ((const char *)"entities")
 328 #define SCF_PROPERTY_EXEC               ((const char *)"exec")
 329 #define SCF_PROPERTY_GROUP              ((const char *)"group")
 330 #define SCF_PROPERTY_GROUPING           ((const char *)"grouping")
 331 #define SCF_PROPERTY_IGNORE             ((const char *)"ignore_error")
 332 #define SCF_PROPERTY_INTERNAL_SEPARATORS ((const char *)"internal_separators")
 333 #define SCF_PROPERTY_LIMIT_PRIVILEGES   ((const char *)"limit_privileges")
 334 #define SCF_PROPERTY_MAINT_OFF          ((const char *)"maint_off")
 335 #define SCF_PROPERTY_MAINT_ON           ((const char *)"maint_on")
 336 #define SCF_PROPERTY_MAINT_ON_IMMEDIATE ((const char *)"maint_on_immediate")
 337 #define SCF_PROPERTY_MAINT_ON_IMMTEMP   ((const char *)"maint_on_immtemp")
 338 #define SCF_PROPERTY_MAINT_ON_TEMPORARY ((const char *)"maint_on_temporary")
 339 #define SCF_PROPERTY_METHOD_PID         ((const char *)"method_pid")
 340 #define SCF_PROPERTY_MILESTONE          ((const char *)"milestone")
 341 #define SCF_PROPERTY_NEED_SESSION       ((const char *)"need_session")
 342 #define SCF_PROPERTY_NEXT_STATE         ((const char *)"next_state")
 343 #define SCF_PROPERTY_PACKAGE            ((const char *)"package")
 344 #define SCF_PROPERTY_PRIVILEGES         ((const char *)"privileges")
 345 #define SCF_PROPERTY_PROFILE            ((const char *)"profile")
 346 #define SCF_PROPERTY_PROJECT            ((const char *)"project")
 347 #define SCF_PROPERTY_REFRESH            ((const char *)"refresh")
 348 #define SCF_PROPERTY_RESOURCE_POOL      ((const char *)"resource_pool")
 349 #define SCF_PROPERTY_ENVIRONMENT        ((const char *)"environment")
 350 #define SCF_PROPERTY_RESTART            ((const char *)"restart")
 351 #define SCF_PROPERTY_RESTARTER          ((const char *)"restarter")
 352 #define SCF_PROPERTY_RESTART_INTERVAL   ((const char *)"restart_interval")
 353 #define SCF_PROPERTY_RESTART_ON         ((const char *)"restart_on")
 354 #define SCF_PROPERTY_RESTORE            ((const char *)"restore")
 355 #define SCF_PROPERTY_SECFLAGS           ((const char *)"security_flags")
 356 #define SCF_PROPERTY_SINGLE_INSTANCE    ((const char *)"single_instance")
 357 #define SCF_PROPERTY_START_METHOD_TIMESTAMP     \
 358         ((const char *)"start_method_timestamp")
 359 #define SCF_PROPERTY_START_METHOD_WAITSTATUS    \
 360         ((const char *)"start_method_waitstatus")
 361 #define SCF_PROPERTY_START_PID          ((const char *)"start_pid")
 362 #define SCF_PROPERTY_STATE              ((const char *)"state")
 363 #define SCF_PROPERTY_STABILITY          ((const char *)"stability")
 364 #define SCF_PROPERTY_STATE_TIMESTAMP    ((const char *)"state_timestamp")
 365 #define SCF_PROPERTY_SUPP_GROUPS        ((const char *)"supp_groups")
 366 #define SCF_PROPERTY_TIMEOUT            ((const char *)"timeout_seconds")
 367 #define SCF_PROPERTY_TIMEOUT_RETRY      ((const char *)"timeout_retry")
 368 #define SCF_PROPERTY_TRANSIENT_CONTRACT ((const char *)"transient_contract")
 369 #define SCF_PROPERTY_TYPE               ((const char *)"type")
 370 #define SCF_PROPERTY_USE_PROFILE        ((const char *)"use_profile")
 371 #define SCF_PROPERTY_USER               ((const char *)"user")
 372 #define SCF_PROPERTY_UTMPX_PREFIX       ((const char *)"utmpx_prefix")
 373 #define SCF_PROPERTY_WORKING_DIRECTORY  ((const char *)"working_directory")
 374 
 375 /*
 376  * Template property names
 377  */
 378 #define SCF_PROPERTY_TM_CARDINALITY_MIN ((const char *)"cardinality_min")
 379 #define SCF_PROPERTY_TM_CARDINALITY_MAX ((const char *)"cardinality_max")
 380 #define SCF_PROPERTY_TM_CHOICES_INCLUDE_VALUES ((const char *) \
 381                                             "choices_include_values")
 382 #define SCF_PROPERTY_TM_CHOICES_NAME    ((const char *)"choices_name")
 383 #define SCF_PROPERTY_TM_CHOICES_RANGE   ((const char *)"choices_range")
 384 #define SCF_PROPERTY_TM_CONSTRAINT_NAME ((const char *)"constraint_name")
 385 #define SCF_PROPERTY_TM_CONSTRAINT_RANGE ((const char *)"constraint_range")
 386 #define SCF_PROPERTY_TM_MANPATH         ((const char *)"manpath")
 387 #define SCF_PROPERTY_TM_NAME            ((const char *)"name")
 388 #define SCF_PROPERTY_TM_PG_PATTERN      ((const char *)"pg_pattern")
 389 #define SCF_PROPERTY_TM_REQUIRED        ((const char *)"required")
 390 #define SCF_PROPERTY_TM_SECTION         ((const char *)"section")
 391 #define SCF_PROPERTY_TM_TARGET          ((const char *)"target")
 392 #define SCF_PROPERTY_TM_TITLE           ((const char *)"title")
 393 #define SCF_PROPERTY_TM_TYPE            ((const char *)"type")
 394 #define SCF_PROPERTY_TM_URI             ((const char *)"uri")
 395 #define SCF_PROPERTY_TM_VALUE_PREFIX    ((const char *)"value_")
 396 #define SCF_PROPERTY_TM_VALUES_NAME     ((const char *)"values_name")
 397 #define SCF_PROPERTY_TM_VISIBILITY      ((const char *)"visibility")
 398 #define SCF_PROPERTY_TM_COMMON_NAME_PREFIX      ((const char *)"common_name_")
 399 #define SCF_PROPERTY_TM_DESCRIPTION_PREFIX      ((const char *)"description_")
 400 #define SCF_PROPERTY_TM_UNITS_PREFIX            ((const char *)"units_")
 401 
 402 /*
 403  * Templates wildcard string
 404  */
 405 #define SCF_TMPL_WILDCARD       ((const char *)"*")
 406 
 407 /*
 408  * Strings used by restarters for state and next_state properties.
 409  * MAX_SCF_STATE_STRING holds the max length of a state string, including the
 410  * terminating null.
 411  */
 412 
 413 #define MAX_SCF_STATE_STRING_SZ         14
 414 
 415 #define SCF_STATE_STRING_NONE           ((const char *)"none")
 416 #define SCF_STATE_STRING_UNINIT         ((const char *)"uninitialized")
 417 #define SCF_STATE_STRING_MAINT          ((const char *)"maintenance")
 418 #define SCF_STATE_STRING_OFFLINE        ((const char *)"offline")
 419 #define SCF_STATE_STRING_DISABLED       ((const char *)"disabled")
 420 #define SCF_STATE_STRING_ONLINE         ((const char *)"online")
 421 #define SCF_STATE_STRING_DEGRADED       ((const char *)"degraded")
 422 #define SCF_STATE_STRING_LEGACY         ((const char *)"legacy_run")
 423 
 424 #define SCF_STATE_UNINIT                0x00000001
 425 #define SCF_STATE_MAINT                 0x00000002
 426 #define SCF_STATE_OFFLINE               0x00000004
 427 #define SCF_STATE_DISABLED              0x00000008
 428 #define SCF_STATE_ONLINE                0x00000010
 429 #define SCF_STATE_DEGRADED              0x00000020
 430 #define SCF_STATE_ALL                   0x0000003F
 431 
 432 /*
 433  * software fma svc-transition class
 434  */
 435 #define SCF_NOTIFY_PARAMS_VERSION       0X0
 436 #define SCF_NOTIFY_NAME_FMRI            ((const char *)"fmri")
 437 #define SCF_NOTIFY_NAME_VERSION         ((const char *)"version")
 438 #define SCF_NOTIFY_NAME_TSET            ((const char *)"tset")
 439 #define SCF_NOTIFY_PG_POSTFIX           ((const char *)"fmnotify")
 440 #define SCF_NOTIFY_PARAMS               ((const char *)"notify-params")
 441 #define SCF_NOTIFY_PARAMS_INST \
 442         ((const char *)"svc:/system/fm/notify-params:default")
 443 #define SCF_SVC_TRANSITION_CLASS \
 444         ((const char *)"ireport.os.smf.state-transition")
 445 #define SCF_NOTIFY_PARAMS_PG_TYPE       ((const char *)"notify_params")
 446 
 447 /*
 448  * Useful transition macros
 449  */
 450 #define SCF_TRANS_SHIFT_INITIAL_STATE(s)        ((s) << 16)
 451 #define SCF_TRANSITION_ALL \
 452         (SCF_TRANS_SHIFT_INITIAL_STATE(SCF_STATE_ALL) | SCF_STATE_ALL)
 453 #define SCF_TRANS(f, t) (SCF_TRANS_SHIFT_INITIAL_STATE(f) | (t))
 454 #define SCF_TRANS_VALID(t)      (!((t) & ~SCF_TRANSITION_ALL))
 455 #define SCF_TRANS_INITIAL_STATE(t)      ((t) >> 16 & SCF_STATE_ALL)
 456 #define SCF_TRANS_FINAL_STATE(t)        ((t) & SCF_STATE_ALL)
 457 
 458 /*
 459  * Prefixes for states in state transition notification
 460  */
 461 #define SCF_STN_PREFIX_FROM             ((const char *)"from-")
 462 #define SCF_STN_PREFIX_TO               ((const char *)"to-")
 463 
 464 #define SCF_PG_FLAG_NONPERSISTENT       0x1
 465 
 466 #define SCF_TRACE_LIBRARY               0x1
 467 #define SCF_TRACE_DAEMON                0x2
 468 
 469 #define SMF_IMMEDIATE                   0x1
 470 #define SMF_TEMPORARY                   0x2
 471 #define SMF_AT_NEXT_BOOT                0x4
 472 
 473 scf_error_t scf_error(void);
 474 const char *scf_strerror(scf_error_t);
 475 
 476 ssize_t scf_limit(uint32_t code);
 477 #define SCF_LIMIT_MAX_NAME_LENGTH       -2000U
 478 #define SCF_LIMIT_MAX_VALUE_LENGTH      -2001U
 479 #define SCF_LIMIT_MAX_PG_TYPE_LENGTH    -2002U
 480 #define SCF_LIMIT_MAX_FMRI_LENGTH       -2003U
 481 
 482 scf_handle_t *scf_handle_create(scf_version_t);
 483 
 484 int scf_handle_decorate(scf_handle_t *, const char *, scf_value_t *);
 485 #define SCF_DECORATE_CLEAR      ((scf_value_t *)0)
 486 
 487 int scf_handle_bind(scf_handle_t *);
 488 int scf_handle_unbind(scf_handle_t *);
 489 void scf_handle_destroy(scf_handle_t *);
 490 
 491 int scf_type_base_type(scf_type_t type, scf_type_t *out);
 492 const char *scf_type_to_string(scf_type_t);
 493 scf_type_t scf_string_to_type(const char *);
 494 
 495 /* values */
 496 scf_value_t *scf_value_create(scf_handle_t *);
 497 scf_handle_t *scf_value_handle(const scf_value_t *);
 498 void scf_value_destroy(scf_value_t *);
 499 
 500 scf_type_t scf_value_base_type(const scf_value_t *);
 501 scf_type_t scf_value_type(const scf_value_t *);
 502 int scf_value_is_type(const scf_value_t *, scf_type_t);
 503 
 504 void scf_value_reset(scf_value_t *);
 505 
 506 int scf_value_get_boolean(const scf_value_t *, uint8_t *);
 507 int scf_value_get_count(const scf_value_t *, uint64_t *);
 508 int scf_value_get_integer(const scf_value_t *, int64_t *);
 509 int scf_value_get_time(const scf_value_t *, int64_t *, int32_t *);
 510 ssize_t scf_value_get_astring(const scf_value_t *, char *, size_t);
 511 ssize_t scf_value_get_ustring(const scf_value_t *, char *, size_t);
 512 ssize_t scf_value_get_opaque(const scf_value_t *, void *, size_t);
 513 
 514 void scf_value_set_boolean(scf_value_t *, uint8_t);
 515 void scf_value_set_count(scf_value_t *, uint64_t);
 516 void scf_value_set_integer(scf_value_t *, int64_t);
 517 int scf_value_set_time(scf_value_t *, int64_t, int32_t);
 518 int scf_value_set_astring(scf_value_t *, const char *);
 519 int scf_value_set_ustring(scf_value_t *, const char *);
 520 int scf_value_set_opaque(scf_value_t *, const void *, size_t);
 521 
 522 ssize_t scf_value_get_as_string(const scf_value_t *, char *, size_t);
 523 ssize_t scf_value_get_as_string_typed(const scf_value_t *, scf_type_t,
 524     char *, size_t);
 525 int scf_value_set_from_string(scf_value_t *, scf_type_t, const char *);
 526 
 527 scf_iter_t *scf_iter_create(scf_handle_t *);
 528 scf_handle_t *scf_iter_handle(const scf_iter_t *);
 529 void scf_iter_reset(scf_iter_t *);
 530 void scf_iter_destroy(scf_iter_t *);
 531 
 532 int scf_iter_handle_scopes(scf_iter_t *, const scf_handle_t *);
 533 int scf_iter_scope_services(scf_iter_t *, const scf_scope_t *);
 534 int scf_iter_service_instances(scf_iter_t *, const scf_service_t *);
 535 int scf_iter_service_pgs(scf_iter_t *, const scf_service_t *);
 536 int scf_iter_instance_pgs(scf_iter_t *, const scf_instance_t *);
 537 int scf_iter_instance_pgs_composed(scf_iter_t *, const scf_instance_t *,
 538     const scf_snapshot_t *);
 539 int scf_iter_service_pgs_typed(scf_iter_t *, const scf_service_t *,
 540     const char *);
 541 int scf_iter_instance_pgs_typed(scf_iter_t *, const scf_instance_t *,
 542     const char *);
 543 int scf_iter_instance_pgs_typed_composed(scf_iter_t *, const scf_instance_t *,
 544     const scf_snapshot_t *, const char *);
 545 int scf_iter_snaplevel_pgs(scf_iter_t *, const scf_snaplevel_t *);
 546 int scf_iter_snaplevel_pgs_typed(scf_iter_t *, const scf_snaplevel_t *,
 547     const char *);
 548 int scf_iter_instance_snapshots(scf_iter_t *, const scf_instance_t *);
 549 int scf_iter_pg_properties(scf_iter_t *, const scf_propertygroup_t *);
 550 int scf_iter_property_values(scf_iter_t *, const scf_property_t *);
 551 
 552 int scf_iter_next_scope(scf_iter_t *, scf_scope_t *);
 553 int scf_iter_next_service(scf_iter_t *, scf_service_t *);
 554 int scf_iter_next_instance(scf_iter_t *, scf_instance_t *);
 555 int scf_iter_next_pg(scf_iter_t *, scf_propertygroup_t *);
 556 int scf_iter_next_property(scf_iter_t *, scf_property_t *);
 557 int scf_iter_next_snapshot(scf_iter_t *, scf_snapshot_t *);
 558 int scf_iter_next_value(scf_iter_t *, scf_value_t *);
 559 
 560 scf_scope_t *scf_scope_create(scf_handle_t *);
 561 scf_handle_t *scf_scope_handle(const scf_scope_t *);
 562 
 563 /* XXX eventually remove this */
 564 #define scf_handle_get_local_scope(h, s) \
 565         scf_handle_get_scope((h), SCF_SCOPE_LOCAL, (s))
 566 
 567 int scf_handle_get_scope(scf_handle_t *, const char *, scf_scope_t *);
 568 void scf_scope_destroy(scf_scope_t *);
 569 ssize_t scf_scope_get_name(const scf_scope_t *, char *, size_t);
 570 
 571 ssize_t scf_scope_to_fmri(const scf_scope_t *, char *, size_t);
 572 
 573 scf_service_t *scf_service_create(scf_handle_t *);
 574 scf_handle_t *scf_service_handle(const scf_service_t *);
 575 void scf_service_destroy(scf_service_t *);
 576 int scf_scope_get_parent(const scf_scope_t *, scf_scope_t *);
 577 ssize_t scf_service_get_name(const scf_service_t *, char *, size_t);
 578 ssize_t scf_service_to_fmri(const scf_service_t *, char *, size_t);
 579 int scf_service_get_parent(const scf_service_t *, scf_scope_t *);
 580 int scf_scope_get_service(const scf_scope_t *, const char *, scf_service_t *);
 581 int scf_scope_add_service(const scf_scope_t *, const char *, scf_service_t *);
 582 int scf_service_delete(scf_service_t *);
 583 
 584 scf_instance_t *scf_instance_create(scf_handle_t *);
 585 scf_handle_t *scf_instance_handle(const scf_instance_t *);
 586 void scf_instance_destroy(scf_instance_t *);
 587 ssize_t scf_instance_get_name(const scf_instance_t *, char *, size_t);
 588 ssize_t scf_instance_to_fmri(const scf_instance_t *, char *, size_t);
 589 int scf_service_get_instance(const scf_service_t *, const char *,
 590     scf_instance_t *);
 591 int scf_service_add_instance(const scf_service_t *, const char *,
 592     scf_instance_t *);
 593 int scf_instance_delete(scf_instance_t *);
 594 
 595 scf_snapshot_t *scf_snapshot_create(scf_handle_t *);
 596 scf_handle_t *scf_snapshot_handle(const scf_snapshot_t *);
 597 void scf_snapshot_destroy(scf_snapshot_t *);
 598 ssize_t scf_snapshot_get_name(const scf_snapshot_t *, char *, size_t);
 599 int scf_snapshot_get_parent(const scf_snapshot_t *, scf_instance_t *);
 600 int scf_instance_get_snapshot(const scf_instance_t *, const char *,
 601     scf_snapshot_t *);
 602 int scf_snapshot_update(scf_snapshot_t *);
 603 
 604 scf_snaplevel_t *scf_snaplevel_create(scf_handle_t *);
 605 scf_handle_t *scf_snaplevel_handle(const scf_snaplevel_t *);
 606 void scf_snaplevel_destroy(scf_snaplevel_t *);
 607 int scf_snaplevel_get_parent(const scf_snaplevel_t *, scf_snapshot_t *);
 608 ssize_t scf_snaplevel_get_scope_name(const scf_snaplevel_t *, char *, size_t);
 609 ssize_t scf_snaplevel_get_service_name(const scf_snaplevel_t *, char *, size_t);
 610 ssize_t scf_snaplevel_get_instance_name(const scf_snaplevel_t *, char *,
 611     size_t);
 612 int scf_snaplevel_get_pg(const scf_snaplevel_t *, const char *,
 613     scf_propertygroup_t *pg);
 614 int scf_snapshot_get_base_snaplevel(const scf_snapshot_t *, scf_snaplevel_t *);
 615 int scf_snaplevel_get_next_snaplevel(const scf_snaplevel_t *,
 616     scf_snaplevel_t *);
 617 
 618 scf_propertygroup_t *scf_pg_create(scf_handle_t *);
 619 scf_handle_t *scf_pg_handle(const scf_propertygroup_t *);
 620 void scf_pg_destroy(scf_propertygroup_t *);
 621 ssize_t scf_pg_to_fmri(const scf_propertygroup_t *,  char *, size_t);
 622 ssize_t scf_pg_get_name(const scf_propertygroup_t *, char *, size_t);
 623 ssize_t scf_pg_get_type(const scf_propertygroup_t *, char *, size_t);
 624 int scf_pg_get_flags(const scf_propertygroup_t *, uint32_t *);
 625 int scf_pg_get_parent_service(const scf_propertygroup_t *, scf_service_t *);
 626 int scf_pg_get_parent_instance(const scf_propertygroup_t *, scf_instance_t *);
 627 int scf_pg_get_parent_snaplevel(const scf_propertygroup_t *, scf_snaplevel_t *);
 628 int scf_service_get_pg(const scf_service_t *, const char *,
 629     scf_propertygroup_t *);
 630 int scf_instance_get_pg(const scf_instance_t *, const char *,
 631     scf_propertygroup_t *);
 632 int scf_instance_get_pg_composed(const scf_instance_t *, const scf_snapshot_t *,
 633     const char *, scf_propertygroup_t *);
 634 int scf_service_add_pg(const scf_service_t *,  const char *, const char *,
 635     uint32_t, scf_propertygroup_t *);
 636 int scf_instance_add_pg(const scf_instance_t *,  const char *, const char *,
 637     uint32_t, scf_propertygroup_t *);
 638 int scf_pg_delete(scf_propertygroup_t *);
 639 
 640 int scf_pg_get_underlying_pg(const scf_propertygroup_t *,
 641     scf_propertygroup_t *);
 642 int scf_instance_get_parent(const scf_instance_t *, scf_service_t *);
 643 
 644 int scf_pg_update(scf_propertygroup_t *);
 645 
 646 scf_property_t *scf_property_create(scf_handle_t *);
 647 scf_handle_t *scf_property_handle(const scf_property_t *);
 648 void scf_property_destroy(scf_property_t *);
 649 int scf_property_is_type(const scf_property_t *, scf_type_t);
 650 int scf_property_type(const scf_property_t *, scf_type_t *);
 651 ssize_t scf_property_get_name(const scf_property_t *, char *, size_t);
 652 int scf_property_get_value(const scf_property_t *, scf_value_t *);
 653 ssize_t scf_property_to_fmri(const scf_property_t *, char *, size_t);
 654 int scf_pg_get_property(const scf_propertygroup_t *,  const char *,
 655     scf_property_t *);
 656 
 657 scf_transaction_t *scf_transaction_create(scf_handle_t *);
 658 scf_handle_t *scf_transaction_handle(const scf_transaction_t *);
 659 int scf_transaction_start(scf_transaction_t *, scf_propertygroup_t *);
 660 void scf_transaction_destroy(scf_transaction_t *);
 661 void scf_transaction_destroy_children(scf_transaction_t *);
 662 
 663 void scf_transaction_reset(scf_transaction_t *);
 664 void scf_transaction_reset_all(scf_transaction_t *);
 665 
 666 int scf_transaction_commit(scf_transaction_t *);
 667 
 668 scf_transaction_entry_t *scf_entry_create(scf_handle_t *);
 669 scf_handle_t *scf_entry_handle(const scf_transaction_entry_t *);
 670 void scf_entry_reset(scf_transaction_entry_t *);
 671 void scf_entry_destroy(scf_transaction_entry_t *);
 672 void scf_entry_destroy_children(scf_transaction_entry_t *);
 673 
 674 int scf_transaction_property_change(scf_transaction_t *,
 675     scf_transaction_entry_t *, const char *, scf_type_t);
 676 int scf_transaction_property_delete(scf_transaction_t *,
 677     scf_transaction_entry_t *, const char *);
 678 int scf_transaction_property_new(scf_transaction_t *,
 679     scf_transaction_entry_t *, const char *, scf_type_t);
 680 int scf_transaction_property_change_type(scf_transaction_t *,
 681     scf_transaction_entry_t *, const char *, scf_type_t);
 682 
 683 int scf_entry_add_value(scf_transaction_entry_t *, scf_value_t *);
 684 
 685 int scf_handle_decode_fmri(scf_handle_t *, const char *, scf_scope_t *,
 686     scf_service_t *, scf_instance_t *, scf_propertygroup_t *, scf_property_t *,
 687     int);
 688 #define SCF_DECODE_FMRI_EXACT                   0x00000001
 689 #define SCF_DECODE_FMRI_TRUNCATE                0x00000002
 690 #define SCF_DECODE_FMRI_REQUIRE_INSTANCE        0x00000004
 691 #define SCF_DECODE_FMRI_REQUIRE_NO_INSTANCE     0x00000008
 692 
 693 ssize_t scf_myname(scf_handle_t *, char *, size_t);
 694 
 695 /*
 696  * Property group template interfaces.
 697  */
 698 scf_pg_tmpl_t *scf_tmpl_pg_create(scf_handle_t *);
 699 void scf_tmpl_pg_destroy(scf_pg_tmpl_t *);
 700 void scf_tmpl_pg_reset(scf_pg_tmpl_t *);
 701 int scf_tmpl_get_by_pg(scf_propertygroup_t *, scf_pg_tmpl_t *, int);
 702 int scf_tmpl_get_by_pg_name(const char *, const char *,
 703     const char *, const char *, scf_pg_tmpl_t *, int);
 704 int scf_tmpl_iter_pgs(scf_pg_tmpl_t *, const char *, const char *,
 705     const char *, int);
 706 #define SCF_PG_TMPL_FLAG_REQUIRED       0x1
 707 #define SCF_PG_TMPL_FLAG_EXACT          0x2
 708 #define SCF_PG_TMPL_FLAG_CURRENT        0x4
 709 
 710 ssize_t scf_tmpl_pg_name(const scf_pg_tmpl_t *, char **);
 711 ssize_t scf_tmpl_pg_common_name(const scf_pg_tmpl_t *, const char *, char **);
 712 ssize_t scf_tmpl_pg_description(const scf_pg_tmpl_t *, const char *, char **);
 713 ssize_t scf_tmpl_pg_type(const scf_pg_tmpl_t *, char **);
 714 
 715 ssize_t scf_tmpl_pg_target(const scf_pg_tmpl_t *, char **);
 716 #define SCF_TM_TARGET_ALL               ((const char *)"all")
 717 #define SCF_TM_TARGET_DELEGATE          ((const char *)"delegate")
 718 #define SCF_TM_TARGET_INSTANCE          ((const char *)"instance")
 719 #define SCF_TM_TARGET_THIS              ((const char *)"this")
 720 
 721 int scf_tmpl_pg_required(const scf_pg_tmpl_t *, uint8_t *);
 722 
 723 /*
 724  * Property template interfaces.
 725  */
 726 scf_prop_tmpl_t *scf_tmpl_prop_create(scf_handle_t *);
 727 void scf_tmpl_prop_destroy(scf_prop_tmpl_t *);
 728 void scf_tmpl_prop_reset(scf_prop_tmpl_t *);
 729 int scf_tmpl_get_by_prop(scf_pg_tmpl_t *, const char *,
 730     scf_prop_tmpl_t *, int);
 731 int scf_tmpl_iter_props(scf_pg_tmpl_t *, scf_prop_tmpl_t *, int);
 732 #define SCF_PROP_TMPL_FLAG_REQUIRED     0x1
 733 
 734 ssize_t scf_tmpl_prop_name(const scf_prop_tmpl_t *, char **);
 735 int scf_tmpl_prop_type(const scf_prop_tmpl_t *, scf_type_t *);
 736 int scf_tmpl_prop_required(const scf_prop_tmpl_t *, uint8_t *);
 737 ssize_t scf_tmpl_prop_common_name(const scf_prop_tmpl_t *, const char *,
 738     char **);
 739 ssize_t scf_tmpl_prop_description(const scf_prop_tmpl_t *, const char *,
 740     char **);
 741 ssize_t scf_tmpl_prop_units(const scf_prop_tmpl_t *, const char *, char **);
 742 int scf_tmpl_prop_cardinality(const scf_prop_tmpl_t *prop, uint64_t *,
 743     uint64_t *);
 744 int scf_tmpl_prop_internal_seps(const scf_prop_tmpl_t *, scf_values_t *);
 745 
 746 int scf_tmpl_prop_visibility(const scf_prop_tmpl_t *, uint8_t *);
 747 #define SCF_TMPL_VISIBILITY_HIDDEN              1
 748 #define SCF_TMPL_VISIBILITY_READONLY            2
 749 #define SCF_TMPL_VISIBILITY_READWRITE           3
 750 
 751 const char *scf_tmpl_visibility_to_string(uint8_t);
 752 #define SCF_TM_VISIBILITY_HIDDEN        ((const char *)"hidden")
 753 #define SCF_TM_VISIBILITY_READONLY      ((const char *)"readonly")
 754 #define SCF_TM_VISIBILITY_READWRITE     ((const char *)"readwrite")
 755 
 756 int scf_tmpl_value_name_constraints(const scf_prop_tmpl_t *prop,
 757     scf_values_t *vals);
 758 void scf_count_ranges_destroy(scf_count_ranges_t *);
 759 void scf_int_ranges_destroy(scf_int_ranges_t *);
 760 int scf_tmpl_value_count_range_constraints(const scf_prop_tmpl_t *,
 761     scf_count_ranges_t *);
 762 int scf_tmpl_value_int_range_constraints(const scf_prop_tmpl_t *,
 763     scf_int_ranges_t *);
 764 int scf_tmpl_value_count_range_choices(const scf_prop_tmpl_t *,
 765     scf_count_ranges_t *);
 766 int scf_tmpl_value_int_range_choices(const scf_prop_tmpl_t *,
 767     scf_int_ranges_t *);
 768 int scf_tmpl_value_name_choices(const scf_prop_tmpl_t *prop,
 769     scf_values_t *vals);
 770 
 771 void scf_values_destroy(scf_values_t *);
 772 
 773 ssize_t scf_tmpl_value_common_name(const scf_prop_tmpl_t *, const char *,
 774     const char *, char **);
 775 ssize_t scf_tmpl_value_description(const scf_prop_tmpl_t *, const char *,
 776     const char *, char **);
 777 
 778 int scf_tmpl_value_in_constraint(const scf_prop_tmpl_t *pt, scf_value_t *value,
 779     scf_tmpl_errors_t **errs);
 780 
 781 /*
 782  * Template validation interfaces
 783  */
 784 int scf_tmpl_validate_fmri(scf_handle_t *, const char *,
 785     const char *, scf_tmpl_errors_t **, int);
 786 #define SCF_TMPL_VALIDATE_FLAG_CURRENT  0x1
 787 
 788 void scf_tmpl_errors_destroy(scf_tmpl_errors_t *errs);
 789 scf_tmpl_error_t *scf_tmpl_next_error(scf_tmpl_errors_t *);
 790 void scf_tmpl_reset_errors(scf_tmpl_errors_t *errs);
 791 int scf_tmpl_strerror(scf_tmpl_error_t *err, char *s, size_t n, int flag);
 792 int scf_tmpl_error_source_fmri(const scf_tmpl_error_t *, char **);
 793 int scf_tmpl_error_type(const scf_tmpl_error_t *, scf_tmpl_error_type_t *);
 794 int scf_tmpl_error_pg_tmpl(const scf_tmpl_error_t *, char **, char **);
 795 int scf_tmpl_error_pg(const scf_tmpl_error_t *, char **, char **);
 796 int scf_tmpl_error_prop_tmpl(const scf_tmpl_error_t *, char **, char **);
 797 int scf_tmpl_error_prop(const scf_tmpl_error_t *, char **, char **);
 798 int scf_tmpl_error_value(const scf_tmpl_error_t *, char **);
 799 
 800 /*
 801  * Simplified calls
 802  */
 803 int smf_enable_instance(const char *, int);
 804 int smf_disable_instance(const char *, int);
 805 int smf_refresh_instance(const char *);
 806 int smf_restart_instance(const char *);
 807 int smf_maintain_instance(const char *, int);
 808 int smf_degrade_instance(const char *, int);
 809 int smf_restore_instance(const char *);
 810 char *smf_get_state(const char *);
 811 
 812 int scf_simple_walk_instances(uint_t, void *,
 813     int (*inst_callback)(scf_handle_t *, scf_instance_t *, void *));
 814 
 815 scf_simple_prop_t *scf_simple_prop_get(scf_handle_t *, const char *,
 816     const char *, const char *);
 817 void scf_simple_prop_free(scf_simple_prop_t *);
 818 scf_simple_app_props_t *scf_simple_app_props_get(scf_handle_t *, const char *);
 819 void scf_simple_app_props_free(scf_simple_app_props_t *);
 820 const scf_simple_prop_t *scf_simple_app_props_next(
 821     const scf_simple_app_props_t *, scf_simple_prop_t *);
 822 const scf_simple_prop_t *scf_simple_app_props_search(
 823     const scf_simple_app_props_t *, const char *, const char *);
 824 ssize_t scf_simple_prop_numvalues(const scf_simple_prop_t *);
 825 scf_type_t scf_simple_prop_type(const scf_simple_prop_t *);
 826 char *scf_simple_prop_name(const scf_simple_prop_t *);
 827 char *scf_simple_prop_pgname(const scf_simple_prop_t *);
 828 uint8_t *scf_simple_prop_next_boolean(scf_simple_prop_t *);
 829 uint64_t *scf_simple_prop_next_count(scf_simple_prop_t *);
 830 int64_t *scf_simple_prop_next_integer(scf_simple_prop_t *);
 831 int64_t *scf_simple_prop_next_time(scf_simple_prop_t *, int32_t *);
 832 char *scf_simple_prop_next_astring(scf_simple_prop_t *);
 833 char *scf_simple_prop_next_ustring(scf_simple_prop_t *);
 834 void *scf_simple_prop_next_opaque(scf_simple_prop_t *, size_t *);
 835 void scf_simple_prop_next_reset(scf_simple_prop_t *);
 836 
 837 /*
 838  * smf_state_from_string()
 839  * return SCF_STATE_* value for the input
 840  * -1 on error. String "all" maps to SCF_STATE_ALL macro
 841  */
 842 int32_t smf_state_from_string(const char *);
 843 
 844 /*
 845  * smf_state_to_string()
 846  * return SCF_STATE_STRING* value for the input
 847  * NULL on error.
 848  */
 849 const char *smf_state_to_string(int32_t);
 850 
 851 /*
 852  * Notification interfaces
 853  */
 854 int smf_notify_set_params(const char *, nvlist_t *);
 855 int smf_notify_get_params(nvlist_t **, nvlist_t *);
 856 int smf_notify_del_params(const char *, const char *, int32_t);
 857 
 858 /*
 859  * SMF exit status definitions
 860  */
 861 #define SMF_EXIT_OK               0
 862 #define SMF_EXIT_ERR_FATAL       95
 863 #define SMF_EXIT_ERR_CONFIG      96
 864 #define SMF_EXIT_MON_DEGRADE     97
 865 #define SMF_EXIT_MON_OFFLINE     98
 866 #define SMF_EXIT_ERR_NOSMF       99
 867 #define SMF_EXIT_ERR_PERM       100
 868 
 869 #ifdef  __cplusplus
 870 }
 871 #endif
 872 
 873 #endif  /* _LIBSCF_H */