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