1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * CDDL HEADER START
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * The contents of this file are subject to the terms of the
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Common Development and Distribution License (the "License").
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * You may not use this file except in compliance with the License.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * See the License for the specific language governing permissions
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * and limitations under the License.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * When distributing Covered Code, include this CDDL HEADER in each
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * If applicable, add the following below this CDDL HEADER, with the
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * fields enclosed by brackets "[]" replaced with your own identifying
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * information: Portions Copyright [yyyy] [name of copyright owner]
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * CDDL HEADER END
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved.
a58a7fedf7a57cbc5bdaa455cf9134f7a84bbe8fMilan Jurik * Copyright 2012 Milan Jurik. All rights reserved.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * This file implements the bulk of the libscf templates interfaces.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Templates describe metadata about a service or instance in general,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * and individual configuration properties on those services and instances.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Human-consumable descriptions can be provided, along with definitions
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * of valid configuration. See service_bundle.dtd.1 for XML definitions
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * of templates, and the svccfg code for information on how those definitions
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * are translated into the repository.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * The main data structures are scf_pg_tmpl and scf_prop_tmpl. These
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * are allocated by the callers through scf_tmpl_[pg|prop]_create(), and
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * destroyed with scf_tmpl_[pg|prop]_destroy(). They are populated by
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * scf_tmpl_get_by_pg_name(), scf_tmpl_get_by_pg(), and
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * scf_tmpl_get_by_prop(). They also store the iterator state for
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * scf_tmpl_iter_pgs() and scf_tmpl_iter_props().
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * These data structures are then consumed by other functions to
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * gather information about the template (e.g. name, description,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * choices, constraints, etc.).
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * scf_tmpl_validate_fmri() does instance validation against template
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * data, and populates a set of template errors which can be explored using
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * the scf_tmpl_next_error() and the scf_tmpl_error*() suite of functions.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * The main data structures for template errors are scf_tmpl_errors,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * defined in this file, and scf_tmpl_error, defined in libscf_priv.h.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * scf_tmpl_error is shared with svccfg to offer common printing
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * of error messages between libscf and svccfg.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * General convenience functions are towards the top of this file,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * followed by pg and prop template discovery functions, followed
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * by functions which gather information about the discovered
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * template. Validation and error functions are at the end of this file.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza#define SCF_TMPL_PG_COMMON_NAME_C "common_name_C"
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Prazatypedef int walk_template_inst_func_t(scf_service_t *_svc,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Common server errors are usually passed back to the caller. This
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * array defines them centrally so that they don't need to be enumerated
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * in every libscf call.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * int ismember()
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Returns 1 if the supplied error is a member of the error array, 0
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * if it is not.
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltbyismember(const scf_error_t error, const scf_error_t error_array[])
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza for (i = 0; error_array[i] != 0; ++i) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * char *_scf_tmpl_get_fmri()
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Given a pg_tmpl, returns the FMRI of the service or instance that
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * template describes. The allocated string must be freed with free().
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * On failure, returns NULL and sets scf_error() to _CONNECTION_BROKEN,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * _DELETED, or _NO_MEMORY.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Prazastatic char *
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza ssize_t sz = scf_limit(SCF_LIMIT_MAX_FMRI_LENGTH) + 1;
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza assert(t->pt_svc != NULL || t->pt_inst != NULL);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza assert(t->pt_svc == NULL || t->pt_inst == NULL);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if (r == -1) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * char *_scf_get_pg_type()
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Given a propertygroup, returns an allocated string containing the
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * type. The string must be freed with free().
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * On failure, returns NULL and sets scf_error() to: _CONNECTION_BROKEN,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * _DELETED, or _NO_MEMORY.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Prazastatic char *
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza ssize_t sz = scf_limit(SCF_LIMIT_MAX_PG_TYPE_LENGTH) + 1;
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza } else if (scf_pg_get_type(pg, buf, sz) == -1) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * char *_scf_get_prop_name()
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Given a property, returns the name in an allocated string. The string must
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * be freed with free().
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * On error, returns NULL and sets scf_error() to _CONNECTION_BROKEN,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * _DELETED, or _NO_MEMORY.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Prazastatic char *
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza ssize_t sz = scf_limit(SCF_LIMIT_MAX_NAME_LENGTH) + 1;
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza } else if (scf_property_get_name(prop, buf, sz) == -1) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * char *_scf_get_prop_type()
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Given a property, returns the type in an allocated string. The string must
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * be freed with free().
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * On error, returns NULL and sets scf_error() to _CONNECTION_BROKEN,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * _DELETED, or _NO_MEMORY.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Prazastatic char *
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * int _read_single_value_from_pg()
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Reads a single value from the pg and property name specified. On success,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * returns an allocated value that must be freed.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Returns -1 on failure, sets scf_error() to:
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_BACKEND_ACCESS
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_CONNECTION_BROKEN
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_CONSTRAINT_VIOLATED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Property has more than one value associated with it.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_DELETED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_HANDLE_DESTROYED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_INTERNAL
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_INVALID_ARGUMENT
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * prop_name not a valid property name.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_MEMORY
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_RESOURCES
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NOT_BOUND
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NOT_FOUND
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Property doesn't exist or exists and has no value.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NOT_SET
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Property group specified by pg is not set.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_PERMISSION_DENIED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza_read_single_value_from_pg(scf_propertygroup_t *pg, const char *prop_name,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza assert(scf_error() == SCF_ERROR_HANDLE_DESTROYED);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza assert(scf_error() != SCF_ERROR_INVALID_ARGUMENT);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if (scf_pg_get_property(pg, prop_name, prop) != 0) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza assert(scf_error() != SCF_ERROR_HANDLE_MISMATCH);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza assert(scf_error() != SCF_ERROR_HANDLE_MISMATCH);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * char *_scf_read_single_astring_from_pg()
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Reads an astring from the pg and property name specified. On success,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * returns an allocated string. The string must be freed with free().
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Returns NULL on failure, sets scf_error() to:
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_BACKEND_ACCESS
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_CONNECTION_BROKEN
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_CONSTRAINT_VIOLATED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Property has more than one value associated with it.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_DELETED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_HANDLE_DESTROYED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_INTERNAL
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_INVALID_ARGUMENT
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * prop_name not a valid property name.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_MEMORY
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_RESOURCES
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NOT_BOUND
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NOT_FOUND
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Property doesn't exist or exists and has no value.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NOT_SET
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * The property group specified by pg is not set.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_PERMISSION_DENIED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_TYPE_MISMATCH
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza_scf_read_single_astring_from_pg(scf_propertygroup_t *pg, const char *prop_name)
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza ssize_t rsize = scf_limit(SCF_LIMIT_MAX_VALUE_LENGTH) + 1;
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if (_read_single_value_from_pg(pg, prop_name, &val) == -1)
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if (scf_value_get_astring(val, ret, rsize) < 0) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * char *_scf_read_tmpl_prop_type_as_string()
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Reads the property type and returns it as an allocated string. The string
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * must be freed with free().
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Returns NULL on failure, sets scf_error() to _BACKEND_ACCESS,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * _CONNECTION_BROKEN, _DELETED, _HANDLE_DESTROYED, _INTERNAL, _NO_MEMORY,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * _NO_RESOURCES, _NOT_BOUND, _PERMISSION_DENIED, or _TEMPLATE_INVALID.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza_scf_read_tmpl_prop_type_as_string(const scf_prop_tmpl_t *pt)
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza type = _scf_read_single_astring_from_pg(pt->prt_pg,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza } else switch (scf_error()) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza (void) scf_set_error(SCF_ERROR_TEMPLATE_INVALID);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * int _read_single_boolean_from_pg()
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Reads a boolean from the pg and property name specified.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Returns -1 on failure, sets scf_error() to:
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_BACKEND_ACCESS
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_CONNECTION_BROKEN
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_CONSTRAINT_VIOLATED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Property has more than one value associated with it.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_DELETED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_HANDLE_DESTROYED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_INTERNAL
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_INVALID_ARGUMENT
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * prop_name is not a valid property name.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_MEMORY
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_RESOURCES
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NOT_BOUND
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NOT_FOUND
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Property doesn't exist or exists and has no value.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NOT_SET
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * The property group specified by pg is not set.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_PERMISSION_DENIED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_TYPE_MISMATCH
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza_read_single_boolean_from_pg(scf_propertygroup_t *pg, const char *prop_name,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if (_read_single_value_from_pg(pg, prop_name, &val) == -1)
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * static char ** _append_astrings_values()
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * This function reads the values from the property prop_name in pg and
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * appends to an existing scf_values_t *vals. vals may be empty, but
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * must exist. The function skips over zero-length and duplicate values.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Returns NULL on failure, sets scf_error() to:
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_BACKEND_ACCESS
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_CONNECTION_BROKEN
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_DELETED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_HANDLE_DESTROYED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_INTERNAL
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_INVALID_ARGUMENT
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * prop_name is not a valid property name.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_MEMORY
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_RESOURCES
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NOT_BOUND
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NOT_FOUND
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NOT_SET
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_PERMISSION_DENIED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_TYPE_MISMATCH
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Prazastatic char **
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza_append_astrings_values(scf_propertygroup_t *pg, const char *prop_name,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza ssize_t rsize = scf_limit(SCF_LIMIT_MAX_VALUE_LENGTH) + 1;
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza vals->values.v_astring = calloc(cursz, sizeof (char *));
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * The array may be bigger, but it is irrelevant since
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * we will always re-allocate a new one.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza assert(scf_error() == SCF_ERROR_HANDLE_DESTROYED);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if (prop == NULL || val == NULL || iter == NULL) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza assert(scf_error() != SCF_ERROR_INVALID_ARGUMENT);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if (scf_pg_get_property(pg, prop_name, prop) != 0) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza assert(scf_error() != SCF_ERROR_HANDLE_MISMATCH);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if (scf_iter_property_values(iter, prop) != 0) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza assert(scf_error() != SCF_ERROR_HANDLE_MISMATCH);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza while ((err = scf_iter_next_value(iter, val)) == 1) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if ((aux = calloc(cursz, sizeof (char *))) == NULL) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza count * sizeof (char *));
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /* discard zero length strings */
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if (r == 0) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /* find and discard duplicates */
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza assert(scf_error() != SCF_ERROR_INVALID_ARGUMENT);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza assert(scf_error() != SCF_ERROR_HANDLE_MISMATCH);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza vals->values_as_strings = vals->values.v_astring;
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza for (i = 0; i <= count; ++i) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Returns NULL on failure, sets scf_error() to:
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_BACKEND_ACCESS
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_CONNECTION_BROKEN
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_DELETED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_HANDLE_DESTROYED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_INTERNAL
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_INVALID_ARGUMENT
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * prop_name is not a valid property name.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_MEMORY
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_RESOURCES
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NOT_BOUND
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NOT_FOUND
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NOT_SET
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_PERMISSION_DENIED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_TYPE_MISMATCH
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Prazastatic char **
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza_read_astrings_values(scf_propertygroup_t *pg, const char *prop_name,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (_append_astrings_values(pg, prop_name, vals));
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * The returned string needs to be freed by the caller
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Returns NULL on failure. Sets scf_error() to:
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_MEMORY
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_INVALID_ARGUMENT
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Name isn't short enough to add the locale to.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Prazastatic char *
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza_add_locale_to_name(const char *name, const char *locale)
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza (void) scf_set_error(SCF_ERROR_INVALID_ARGUMENT);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * char *_tmpl_pg_name(pg, type, use_type)
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * pg and type can both be NULL. Returns the name of the most specific
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * template property group name based on the inputs.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * If use_type is set and pg is not NULL, a property group name for a
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * property group template that has type defined is returned, even if no
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * type is provided.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Returns NULL on failure and sets scf_error() to:
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_INVALID_ARGUMENT
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * can't combine the arguments and get a reasonable length name
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_MEMORY
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Prazastatic char *
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza_tmpl_pg_name(const char *pg, const char *type, int use_type)
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza limit = scf_limit(SCF_LIMIT_MAX_NAME_LENGTH) + 1;
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if (strlcpy(name, SCF_PG_TM_PG_PATTERN_PREFIX, limit) >=
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza } else if (pg != NULL && type == NULL && use_type == 1) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza (void) scf_set_error(SCF_ERROR_INVALID_ARGUMENT);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * _scf_get_pg_name()
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Gets the name of the supplied property group. On success, returns an
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * allocated string. The string must be freed by free().
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Returns NULL on failure and sets scf_error() to _CONNECTION_BROKEN,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * _DELETED, or _NO_MEMORY.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Prazastatic char *
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza ssize_t sz = scf_limit(SCF_LIMIT_MAX_NAME_LENGTH) + 1;
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza } else if (scf_pg_get_name(pg, buf, sz) == -1) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * char *_tmpl_prop_name()
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Returns the name of the property template prop (which is the name of
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * the property template property group) in the property group
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * template t. Returns NULL on failure and sets scf_error() to:
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_CONNECTION_BROKEN
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_DELETED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_INVALID_ARGUMENT
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * can't combine the arguments and get a reasonable length name
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_MEMORY
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Prazastatic char *
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza_tmpl_prop_name(const char *prop, scf_pg_tmpl_t *t)
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza limit = scf_limit(SCF_LIMIT_MAX_NAME_LENGTH) + 1;
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if ((pg_name = _scf_get_pg_name(t->pt_pg)) == NULL) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if (strncmp(pg_name, SCF_PG_TM_PG_PAT_BASE, prefix_size) != 0) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza (void) scf_set_error(SCF_ERROR_INVALID_ARGUMENT);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza size = snprintf(name, limit, "%s%s_%s", SCF_PG_TM_PROP_PATTERN_PREFIX,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza (void) scf_set_error(SCF_ERROR_INVALID_ARGUMENT);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * int _get_snapshot()
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Gets the specified snapshot. If "snapshot" isn't defined, use the
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * running snapshot. If the snapshot isn't found, that may or may
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * not be an error depending on the caller. Return 0 in that case,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * but leave scf_error() set to SCF_ERROR_NOT_FOUND. On all other
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * errors, set scf_error() to:
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_BACKEND_ACCESS
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_CONNECTION_BROKEN
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_DELETED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERR_HANDLE_DESTROYED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_INTERNAL
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_INVALID_ARGUMENT
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * The handle argument is NULL, or snaphot is not a valid snapshot name
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_MEMORY
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_RESOURCES
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NOT_BOUND
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NOT_FOUND
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza_get_snapshot(scf_instance_t *inst, const char *snapshot,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /* Use running snapshot by default. */
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza err = scf_instance_get_snapshot(inst, "running", *snap);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza err = scf_instance_get_snapshot(inst, snapshot, *snap);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza } else switch (scf_error()) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Explicitly set SCF_ERROR_NONE so that the SCF_ERROR_NOT_FOUND
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * return above is explicitly guaranteed to be from
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * scf_instance_get_snapshot().
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Returns NULL on error, sets scf_error() to:
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_BACKEND_ACCESS
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_CONNECTION_BROKEN
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_CONSTRAINT_VIOLATED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * The restarter's FMRI does not match an existing instance.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_DELETED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_HANDLE_DESTROYED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_INTERNAL
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_INVALID_ARGUMENT
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * The restarter's FMRI is not a valid FMRI.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_MEMORY
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_RESOURCES
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NOT_BOUND
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NOT_FOUND
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Property doesn't exist or exists and has no value.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_TEMPLATE_INVALID
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * restarter property is not SCF_TYPE_ASTRING or has more than one value
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza_get_restarter_inst(scf_handle_t *h, scf_service_t *svc,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza assert(scf_error() != SCF_ERROR_INVALID_ARGUMENT);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza ret = scf_instance_get_pg_composed(inst, s, SCF_PG_GENERAL,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza ret = scf_service_get_pg(svc, SCF_PG_GENERAL, pg);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza } else switch (scf_error()) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /* Assume default restarter. */
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * If the arguments to the above functions
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * aren't derived from the same handle, there's
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * something wrong with the internal implementation,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * not the public caller further up the chain.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza restarter = _scf_read_single_astring_from_pg(pg,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /* zero length string is NOT a valid restarter */
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if (restarter != NULL && restarter[0] == '\0') {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza } else switch (scf_error()) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /* Use default restarter */
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if (scf_handle_decode_fmri(h, restarter, NULL, NULL, ri, NULL, NULL,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza SCF_DECODE_FMRI_EXACT|SCF_DECODE_FMRI_REQUIRE_INSTANCE) != 0) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza } else switch (scf_error()) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Returns NULL on error, sets scf_error() to:
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_BACKEND_ACCESS
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_CONNECTION_BROKEN
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_CONSTRAINT_VIOLATED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Restarter property has more than one value associated with it,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * or FMRI does not meet restrictions in scf_handle_decode_fmri() flags.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_DELETED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_HANDLE_DESTROYED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_INTERNAL
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_INVALID_ARGUMENT
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * The fmri argument in scf_handle_decode_fmri() is not a valid FMRI.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_MEMORY
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_RESOURCES
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NOT_BOUND
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NOT_FOUND
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Property doesn't exist or exists and has no value.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza assert(scf_error() != SCF_ERROR_INVALID_ARGUMENT);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if (scf_handle_decode_fmri(h, SCF_INSTANCE_GLOBAL, NULL, NULL, ri,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza SCF_DECODE_FMRI_EXACT|SCF_DECODE_FMRI_REQUIRE_INSTANCE) != 0) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza } else switch (scf_error()) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Call the supplied function for each of the service or instance, the
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * service's restarter, and the globally defined template instance.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * If the function returns SCF_WALK_ERROR, the walk is ended. If
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * the function returns SCF_WALK_NEXT, the next entity is tried.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * The function is only expected to return SCF_WALK_DONE if it has
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * found a property group match in the current entity, and has
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * populated p->pw_pg with the matching property group.
76fa7285ab719293f713601f68497677a82ce6f9Antonello Cruz * The caller of _walk_template_instances() MUST check if the passed parameters
76fa7285ab719293f713601f68497677a82ce6f9Antonello Cruz * inst and svc match the fields pw_inst and pw_svc in the resulting
76fa7285ab719293f713601f68497677a82ce6f9Antonello Cruz * pg_tmpl_walk_t and call the destructor for the unmatching objects. The walker
76fa7285ab719293f713601f68497677a82ce6f9Antonello Cruz * may silently drop them if the template definition is in the restarter or in
76fa7285ab719293f713601f68497677a82ce6f9Antonello Cruz * the global instance.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza_walk_template_instances(scf_service_t *svc, scf_instance_t *inst,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza scf_snapshot_t *snap, walk_template_inst_func_t *func,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /* First, use supplied service or instance */
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Check that the template scoping matches and if not,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /*FALLTHROUGH*/
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /*NOTREACHED*/
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /* Next the restarter. */
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza tmpl_inst = _get_restarter_inst(h, svc, inst, snap);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Check that the template scoping matches and if not,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /*FALLTHROUGH*/
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /*NOTREACHED*/
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Check that the template scoping matches and if not,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /*FALLTHROUGH*/
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /*NOTREACHED*/
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * _get_pg() returns 0 on success and -1 on failure. Sets scf_error()
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * on failure.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_BACKEND_ACCESS
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_CONNECTION_BROKEN
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_DELETED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_HANDLE_MISMATCH
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_INTERNAL
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_INVALID_ARGUMENT
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * name is not a valid property group.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_RESOURCES
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NOT_BOUND
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NOT_FOUND
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NOT_SET
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza_get_pg(scf_service_t *svc, scf_instance_t *inst,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza const scf_snapshot_t *snap, const char *name, scf_propertygroup_t *pg)
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza ret = scf_instance_get_pg_composed(inst, snap, name, pg);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Returns SCF_WALK_NEXT for not found, SCF_WALK_ERROR for error,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * and SCF_WALK_DONE for found.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * On error, destroy pg and set it to NULL.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Sets scf_error() if SCF_WALK_ERROR is returned to _BACKEND_ACCESS,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * _CONNECTION_BROKEN, _INTERNAL, _INVALID_ARGUMENT (name is not a
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * valid property group), _NO_RESOURCES, or _NOT_BOUND.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza_lookup_pg(scf_service_t *svc, scf_instance_t *inst,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza const scf_snapshot_t *snap, const char *name, scf_propertygroup_t *pg)
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /*NOTREACHED*/
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * If match, return 0. If no match, return 1. If error, return -1.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * On error set scf_error() to _BACKEND_ACCESS, _CONNECTION_BROKEN,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * _HANDLE_DESTROYED, _INTERNAL, _NO_MEMORY, _NO_RESOURCES, _NOT_BOUND,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * _NOT_SET (property group specified by pg is not set), _PERMISSION_DENIED,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * or _TEMPLATE_INVALID (target property is not SCF_TYPE_ASTRING or has
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * more than one value).
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Prazacheck_target_match(scf_propertygroup_t *pg, const char *target)
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza pg_target = _scf_read_single_astring_from_pg(pg,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /*FALLTHROUGH*/
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /*NOTREACHED*/
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /* For a desired target of 'this', check for 'this' and 'instance'. */
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if ((strcmp(target, SCF_TM_TARGET_INSTANCE) == 0 ||
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza (strcmp(pg_target, SCF_TM_TARGET_INSTANCE) == 0 ||
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if (strcmp(target, SCF_TM_TARGET_DELEGATE) == 0 &&
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza strcmp(pg_target, SCF_TM_TARGET_DELEGATE) == 0) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Check if a matching template property group exists for each of:
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * name and type, name only, type only, and completely wildcarded
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Both pg_name and pg_type are optional.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Returns NULL on failure, sets scf_error():
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_BACKEND_ACCESS
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_CONNECTION_BROKEN
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_DELETED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_HANDLE_DESTROYED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_INTERNAL
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_INVALID_ARGUMENT
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * can't combine the _tmpl_pg_name arguments and get a reasonable
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * length name, or pg_name is not a valid property group.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_MEMORY
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_RESOURCES
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NOT_BOUND
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NOT_FOUND
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Property doesn't exist or exists and has no value.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_PERMISSION_DENIED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_TEMPLATE_INVALID
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * target property is not SCF_TYPE_ASTRING or has more than one value.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza_find_template_pg_match(scf_service_t *svc, scf_instance_t *inst,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza const scf_snapshot_t *snap, const char *pg_name, const char *pg_type,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza assert(scf_error() != SCF_ERROR_INVALID_ARGUMENT);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * We're going to walk through the possible pg templates that
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * could match the supplied name and type. We do this
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * by explicit name lookups when possible to avoid having to
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * keep track of a most-explicit-match during iteration.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /* First look for a template with name and type set and matching. */
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza *tmpl_pg_name = _tmpl_pg_name(pg_name, pg_type, 1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza ret = _lookup_pg(svc, inst, snap, *tmpl_pg_name, pg);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza else if (r == -1)
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Need to search on a name-only match before searching on
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * type matches.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza *tmpl_pg_name = _tmpl_pg_name(pg_name, NULL, 0);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza ret = _lookup_pg(svc, inst, snap, *tmpl_pg_name, pg);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza else if (r == -1)
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /* Next, see if there's an "nt" template where the type matches. */
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza ret = scf_iter_instance_pgs_typed_composed(iter, inst,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza while ((ret = scf_iter_next_pg(iter, pg)) == 1) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /* Make sure this is a name and type specified pg. */
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza *tmpl_pg_name = _tmpl_pg_name(NULL, pg_type, 0);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza ret = _lookup_pg(svc, inst, snap, *tmpl_pg_name, pg);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza else if (r == -1)
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza ret = _lookup_pg(svc, inst, snap, *tmpl_pg_name, pg);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza else if (r == -1)
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Finds the pg match in either the supplied service or instance.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Returns SCF_WALK_ERROR, SCF_WALK_NEXT, or SCF_WALK_DONE.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * If returning SCF_WALK_ERROR, sets scf_error():
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_BACKEND_ACCESS
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_CONNECTION_BROKEN
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_DELETED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_HANDLE_DESTROYED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_INTERNAL
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_INVALID_ARGUMENT
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * The snaphot is not a valid snapshot name,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * or can't create a reasonable property group template name.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_MEMORY
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_RESOURCES
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NOT_BOUND
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NOT_FOUND
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Property doesn't exist or exists and has no value.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_PERMISSION_DENIED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_TEMPLATE_INVALID
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * target property is not SCF_TYPE_ASTRING or has more than one value.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Prazafind_pg_match(scf_service_t *svc, scf_instance_t *inst, pg_tmpl_walk_t *p)
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if (_get_snapshot(inst, p->pw_snapname, &tmpl_snap) == -1)
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza pg = _find_template_pg_match(svc, inst, tmpl_snap, p->pw_pgname,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * return 0 on success and -1 on failure.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_CONNECTION_BROKEN
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_DELETED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_HANDLE_DESTROYED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_HANDLE_MISMATCH
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_INTERNAL
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_INVALID_ARGUMENT
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * FMRI argument, snapshot name, pg_name, or pg is invalid.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_MEMORY
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_RESOURCES
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NOT_BOUND
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NOT_FOUND
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NOT_SET
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Prazascf_tmpl_get_by_pg(scf_propertygroup_t *pg, scf_pg_tmpl_t *pg_tmpl, int flags)
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza char *fmribuf = NULL, *snapbuf = NULL, *pg_name = NULL, *pg_type = NULL;
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza ssize_t fbufsz = scf_limit(SCF_LIMIT_MAX_FMRI_LENGTH) + 1;
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza ssize_t nbufsz = scf_limit(SCF_LIMIT_MAX_NAME_LENGTH) + 1;
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza ssize_t tbufsz = scf_limit(SCF_LIMIT_MAX_PG_TYPE_LENGTH) + 1;
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza assert(fbufsz != 0 && nbufsz != 0 && tbufsz != 0);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza (p = calloc(1, sizeof (pg_tmpl_walk_t))) == NULL) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /* Parent type doesn't match. Keep looking. */
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /* Pass these back to the caller. */
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * No snapshot. We'll use 'editing' by default since
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * snap and snapbuf are NULL.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /* Grab snapshot name while we're here. */
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if (scf_snapshot_get_name(snap, snapbuf, nbufsz) < 0) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza (walk_template_inst_func_t *)find_pg_match, p, flags);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /* No snapshot parent. Go looking for instance parent. */
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /* First look for instance parent. */
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /* OK, check for service parent */
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /*FALLTHROUGH*/
76fa7285ab719293f713601f68497677a82ce6f9Antonello Cruz /* we may get a different instance back */
76fa7285ab719293f713601f68497677a82ce6f9Antonello Cruz /* we may get a different service back */
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * int scf_tmpl_get_by_pg_name()
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Get a template by a combination of the name and type. Either name
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * or type can be null, which indicates a wildcard. flags may be
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_PG_TMPL_FLAG_CURRENT (use current properties rather than
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * the defined or running snapshot), and SCF_PG_TMPL_FLAG_EXACT (match
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * only templates defined by the FMRI in question, not by its restarter
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * or globally). Returns 0 on success and -1 on error, and sets
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * scf_error() to:
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_BACKEND_ACCESS
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_CONNECTION_BROKEN
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * The connection to the repository was lost.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_DELETED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * The instance has been deleted.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_HANDLE_DESTROYED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_INTERNAL
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_INVALID_ARGUMENT
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * FMRI isn't valid, pg_name is too long to look for a template, or
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * snapshot specified isn't a valid name
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_MEMORY
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_RESOURCES
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * The server does not have adequate resources to complete the request.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NOT_BOUND
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * The handle is not currently bound.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NOT_FOUND
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Object matching FMRI doesn't exist in the repository, or snapshot
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * doesn't exist.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Prazascf_tmpl_get_by_pg_name(const char *fmri, const char *snapshot,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza const char *pg_name, const char *pg_type, scf_pg_tmpl_t *pg_tmpl, int flags)
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza ret = scf_handle_decode_fmri(h, fmri, NULL, NULL, inst, NULL,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza } else if (ret != 0 &&
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza ret = scf_handle_decode_fmri(h, fmri, NULL, svc,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza } else switch (scf_error()) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza (void) scf_set_error(SCF_ERROR_INVALID_ARGUMENT);
76fa7285ab719293f713601f68497677a82ce6f9Antonello Cruz /* If we have a service fmri, snapshot is ignored. */
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if (snapshot == NULL || strcmp(snapshot, "running") == 0 ||
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if (_get_snapshot(inst, snapshot, &snap) == -1) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza } else if (scf_error() == SCF_ERROR_NOT_FOUND) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * For each of instance, restarter, global
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * - check for a tm_pg_pattern_nt_<name> matching type
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * - check for a tm_pg_pattern_t_<type> matching type
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * - check for any tm_pg_pattern_
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Currently plan to return the most specific match only.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza (walk_template_inst_func_t *)find_pg_match, p, flags);
76fa7285ab719293f713601f68497677a82ce6f9Antonello Cruz /* we may get a different instance back */
76fa7285ab719293f713601f68497677a82ce6f9Antonello Cruz /* we may get a different service back */
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Returns NULL on failure, sets scf_error() to _CONNECTION_BROKEN,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * _DELETED, _NO_RESOURCES, or _NOT_BOUND.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza_get_svc_or_inst_iter(scf_handle_t *h, scf_pg_tmpl_t *t)
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza assert(t->pt_svc != NULL || t->pt_inst != NULL);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza assert(t->pt_svc == NULL || t->pt_inst == NULL);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /* Iterate on property groups of type template_pg_pattern */
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza ret = scf_iter_instance_pgs_typed_composed(iter,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza ret = scf_iter_service_pgs_typed(iter, t->pt_svc,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Returns NULL on failure, sets scf_error() to:
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_BACKEND_ACCESS
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_CONNECTION_BROKEN
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_DELETED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_HANDLE_DESTROYED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_INTERNAL
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_INVALID_ARGUMENT
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Handle argument is NULL, or snaphot is not a valid snapshot name.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_MEMORY
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_RESOURCES
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NOT_BOUND
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NOT_FOUND
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza_get_next_iterator(scf_handle_t *h, scf_pg_tmpl_t *t, const char *snapshot,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza limit = scf_limit(SCF_LIMIT_MAX_NAME_LENGTH) + 1;
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Check what level we last iterated on: none, service,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * restarter, or global. Make sure that if one in the middle
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * doesn't exist, we move on to the next entity.
76fa7285ab719293f713601f68497677a82ce6f9Antonello Cruz * Before we drop any references to pt_inst or pt_svc we must
76fa7285ab719293f713601f68497677a82ce6f9Antonello Cruz * destroy them so we don't leak them.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Don't go any further than the specified instance
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * if exact was set.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza t->pt_inst = _get_restarter_inst(h, t->pt_orig_svc,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza } while (t->pt_inst == NULL && t->pt_svc == NULL);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /* Set pt_snap to the snapshot for this instance */
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * scf_pg_tmpl_t *scf_tmpl_pg_create(scf_handle_t *)
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Returns NULL on failure, sets scf_error() to _INVALID_ARGUMENT
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * or _NO_MEMORY.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza (void) scf_set_error(SCF_ERROR_INVALID_ARGUMENT);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Retrieves name or type of a template pg.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Returns -1 on failure. Sets scf_error():
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_BACKEND_ACCESS
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_CONNECTION_BROKEN
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_DELETED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_HANDLE_DESTROYED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_INTERNAL
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_MEMORY
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_RESOURCES
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NOT_BOUND
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_PERMISSION_DENIED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_TEMPLATE_INVALID
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * pname property is not SCF_TYPE_ASTRING or has more than one value.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza_scf_tmpl_prop_value(scf_propertygroup_t *pg, const char *pname, char **out)
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza assert(strcmp(pname, SCF_PROPERTY_TM_NAME) == 0 ||
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza *out = _scf_read_single_astring_from_pg(pg, pname);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza } else switch (scf_error()) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza (void) scf_set_error(SCF_ERROR_TEMPLATE_INVALID);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * int scf_tmpl_iter_pgs()
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Iterates through the property group templates for the fmri given.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * When t is uninitialized or reset, sets t to the first property group
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * template in fmri. On subsequent calls, sets t to the next property group
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * template in frmi.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Returns 1 on success, 0 when no property group templates are left to
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * iterate, -1 on error.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * The flags argument may include SCF_PG_TMPL_FLAG_REQUIRED,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_PG_TMPL_FLAG_CURRENT, and/or SCF_PG_TMPL_FLAG_EXACT.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Returns -1 on error and sets scf_error() to:
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_BACKEND_ACCESS
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_CONNECTION_BROKEN
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_DELETED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_HANDLE_DESTROYED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_INTERNAL
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_INVALID_ARGUMENT
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * The handle argument is NULL, fmri is invalid, or snapshot is invalid.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_MEMORY
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_RESOURCES
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NOT_BOUND
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NOT_FOUND
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_PERMISSION_DENIED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Prazascf_tmpl_iter_pgs(scf_pg_tmpl_t *t, const char *fmri, const char *snapshot,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza (void) scf_set_error(SCF_ERROR_INVALID_ARGUMENT);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if (t->pt_populated == 0) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza ret = scf_handle_decode_fmri(h, fmri, NULL, NULL, inst, NULL,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza } else if (ret != 0 &&
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza ret = scf_handle_decode_fmri(h, fmri, NULL, svc,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza } else switch (scf_error()) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza } else if (scf_error() == SCF_ERROR_NOT_FOUND) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza (void) scf_set_error(SCF_ERROR_INVALID_ARGUMENT);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza pg_tmpl->pt_iter = _get_next_iterator(h, pg_tmpl, snapshot,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza while (found == 0) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza while ((err = scf_iter_next_pg(pg_tmpl->pt_iter,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza } else switch (scf_error()) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza } else if (err == 0) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /* This iteration is done. Get the next one */
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Discard pgs which don't exist at the right scoping. This
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * check also makes sure that if we're looking at, for
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * example, svc:/system/svc/restarter:default, that we
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * don't hand back the same property groups twice.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * If walking only required property groups, check if
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * the retrieved group is required.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if (scf_tmpl_pg_required(pg_tmpl, &required) == 0) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * If type != NULL, check if type property matches. If no
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * type property exists, consider it a match.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if (scf_tmpl_pg_type(pg_tmpl, &tmpl_type) != -1) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza } else if (scf_error() == SCF_ERROR_NOT_FOUND ||
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /* Do not reset t->pt_h. */
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * int scf_tmpl_get_by_prop()
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Get the property template given a property group template and property
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * name. No flags are currently defined for this function.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Returns NULL on failure, and sets scf_error():
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_BACKEND_ACCESS
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_CONNECTION_BROKEN
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_DELETED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_HANDLE_DESTROYED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_INTERNAL
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_INVALID_ARGUMENT
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_MEMORY
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_RESOURCES
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NOT_BOUND
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NOT_FOUND
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Template object matching property doesn't exist in the repository.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_TYPE_MISMATCH
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Matching template object is the wrong type in the repository.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Prazascf_tmpl_get_by_prop(scf_pg_tmpl_t *t, const char *prop,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza (void) scf_set_error(SCF_ERROR_INVALID_ARGUMENT);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if ((pg = scf_pg_create(scf_pg_handle(t->pt_pg))) == NULL)
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * We've only found a template property group if the type
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * is correct.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza strcmp(pg_type, SCF_GROUP_TEMPLATE_PROP_PATTERN) == 0)
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * scf_prop_tmpl_t *scf_tmpl_prop_create(scf_handle_t *);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Returns NULL on failure, sets scf_error() to _INVALID_ARGUMENT, or
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * _NO_MEMORY.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza (void) scf_set_error(SCF_ERROR_INVALID_ARGUMENT);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * int scf_tmpl_iter_props()
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Iterates over all property templates defined in the specified property
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * group template. The iterator state is stored on the property template
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * data structure, and the data structure should be allocated with
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * scf_tmpl_prop_create(). To continue the iteration, the previously
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * returned structure should be passed in as an argument to this function.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * flags can include SCF_PROP_TMPL_FLAG_REQUIRED. The function returns
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * 1 when a result was found, and 0 when the iteration is complete.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Returns -1 on failure, and sets scf_error():
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_BACKEND_ACCESS
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_CONNECTION_BROKEN
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_DELETED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_HANDLE_DESTROYED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_INTERNAL
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_INVALID_ARGUMENT
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_MEMORY
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_RESOURCES
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NOT_BOUND
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_PERMISSION_DENIED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_TEMPLATE_INVALID
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Template data is invalid. One of the property templates in this
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * pg_tmpl is malformed.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Prazascf_tmpl_iter_props(scf_pg_tmpl_t *t, scf_prop_tmpl_t *pt, int flags)
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza ssize_t size = scf_limit(SCF_LIMIT_MAX_NAME_LENGTH) + 1;
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza (void) scf_set_error(SCF_ERROR_INVALID_ARGUMENT);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza assert(t->pt_inst == NULL || t->pt_svc == NULL);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza assert(t->pt_inst != NULL || t->pt_svc != NULL);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza err = scf_iter_instance_pgs_typed_composed(iter,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza err = scf_iter_service_pgs_typed(iter, t->pt_svc,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza } else switch (scf_error()) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza while ((err = scf_iter_next_pg(prop_tmpl->prt_iter,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Check if the name matches the appropriate property
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * group template name.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza pg_pat = _scf_read_single_astring_from_pg(prop_tmpl->prt_pg,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza } else switch (scf_error()) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if ((ret = scf_pg_get_name(t->pt_pg, pg_name, size)) <= 0) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * If walking only required properties, check if
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * the retrieved property is required.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if (scf_tmpl_prop_required(prop_tmpl, &required) == 0) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza } else if (err == 0) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Returns -1 on failure. Sets scf_error():
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_BACKEND_ACCESS
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_CONNECTION_BROKEN
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_DELETED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_HANDLE_DESTROYED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_INTERNAL
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_MEMORY
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_RESOURCES
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NOT_BOUND
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_PERMISSION_DENIED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_TEMPLATE_INVALID
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * The name of the template property group (the pname property) has
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * an improper repository format and is not type astring or has
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * more than one value.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Prazascf_tmpl_pg_name(const scf_pg_tmpl_t *t, char **out)
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (_scf_tmpl_prop_value(t->pt_pg, SCF_PROPERTY_TM_NAME, out));
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * returns an allocated string that must be freed
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Returns NULL on failure, sets scf_error() to:
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_BACKEND_ACCESS
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_CONNECTION_BROKEN
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_DELETED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_HANDLE_DESTROYED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_INTERNAL
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_INVALID_ARGUMENT
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * name not a valid property name
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * name and locale are too long to make a property name
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_MEMORY
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_RESOURCES
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NOT_BOUND
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NOT_FOUND
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Property doesn't exist or exists and has no value.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_PERMISSION_DENIED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_TEMPLATE_INVALID
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Prazastatic char *
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza_read_localized_astring_from_pg(scf_propertygroup_t *pg, const char *name,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza lname_prop = _scf_read_single_astring_from_pg(pg, str);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza lname_prop = _scf_read_single_astring_from_pg(pg, str);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza (void) scf_set_error(SCF_ERROR_TEMPLATE_INVALID);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * returns an allocated string that must be freed
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Returns -1 on failure, sets scf_error() to:
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_BACKEND_ACCESS
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_CONNECTION_BROKEN
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_DELETED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_HANDLE_DESTROYED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_INTERNAL
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_INVALID_ARGUMENT
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * locale is too long to make a valid property name
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_MEMORY
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_RESOURCES
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NOT_BOUND
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NOT_FOUND
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Property doesn't exist or exists and has no value.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_PERMISSION_DENIED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_TEMPLATE_INVALID
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Prazascf_tmpl_pg_common_name(const scf_pg_tmpl_t *t, const char *locale, char **out)
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if ((*out = _read_localized_astring_from_pg(t->pt_pg,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza SCF_PROPERTY_TM_COMMON_NAME_PREFIX, locale)) == NULL)
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * returns an allocated string that must be freed
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Returns -1 on failure, sets scf_error() to:
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_BACKEND_ACCESS
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_CONNECTION_BROKEN
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_DELETED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_HANDLE_DESTROYED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_INTERNAL
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_INVALID_ARGUMENT
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * locale is too long to make a valid property name
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_MEMORY
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_RESOURCES
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NOT_BOUND
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NOT_FOUND
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Property doesn't exist or exists and has no value.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_PERMISSION_DENIED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_TEMPLATE_INVALID
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Prazascf_tmpl_pg_description(const scf_pg_tmpl_t *t, const char *locale, char **out)
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if ((*out = _read_localized_astring_from_pg(t->pt_pg,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza SCF_PROPERTY_TM_DESCRIPTION_PREFIX, locale)) == NULL)
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Returns -1 on failure. Sets scf_error():
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_BACKEND_ACCESS
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_CONNECTION_BROKEN
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_DELETED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_HANDLE_DESTROYED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_INTERNAL
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_MEMORY
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_RESOURCES
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NOT_BOUND
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NOT_FOUND
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * 'type' property doesn't exist or exists and has no value.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_PERMISSION_DENIED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_TEMPLATE_INVALID
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * 'type' property is not SCF_TYPE_ASTRING or has more than one value.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Prazascf_tmpl_pg_type(const scf_pg_tmpl_t *t, char **out)
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (_scf_tmpl_prop_value(t->pt_pg, SCF_PROPERTY_TM_TYPE, out));
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Returns -1 on failure, sets scf_error() to:
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_BACKEND_ACCESS
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_CONNECTION_BROKEN
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_DELETED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_HANDLE_DESTROYED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_INTERNAL
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_MEMORY
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_RESOURCES
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NOT_BOUND
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_PERMISSION_DENIED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_TEMPLATE_INVALID
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * required property is not SCF_TYPE_BOOLEAN or has more than one value.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Prazascf_tmpl_pg_required(const scf_pg_tmpl_t *t, uint8_t *out)
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if (_read_single_boolean_from_pg(t->pt_pg, SCF_PROPERTY_TM_REQUIRED,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza } else switch (scf_error()) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza (void) scf_set_error(SCF_ERROR_TEMPLATE_INVALID);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Returns -1 on failure. Sets scf_error():
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_BACKEND_ACCESS
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_CONNECTION_BROKEN
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_DELETED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_HANDLE_DESTROYED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_INTERNAL
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_MEMORY
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_RESOURCES
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NOT_BOUND
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_PERMISSION_DENIED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_TEMPLATE_INVALID
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * target property is not SCF_TYPE_ASTRING or has more than one value.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Prazascf_tmpl_pg_target(const scf_pg_tmpl_t *t, char **out)
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza *out = _scf_read_single_astring_from_pg(t->pt_pg,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza } else switch (scf_error()) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza (void) scf_set_error(SCF_ERROR_TEMPLATE_INVALID);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Returns -1 on failure. Sets scf_error():
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_BACKEND_ACCESS
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_CONNECTION_BROKEN
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_DELETED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_HANDLE_DESTROYED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_INTERNAL
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_MEMORY
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_RESOURCES
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NOT_BOUND
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_PERMISSION_DENIED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_TEMPLATE_INVALID
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Prazascf_tmpl_prop_name(const scf_prop_tmpl_t *t, char **out)
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza *out = _scf_read_single_astring_from_pg(t->prt_pg,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza (void) scf_set_error(SCF_ERROR_TEMPLATE_INVALID);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza } else switch (scf_error()) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza (void) scf_set_error(SCF_ERROR_TEMPLATE_INVALID);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Returns -1 on failure. Sets scf_error():
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_BACKEND_ACCESS
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_CONNECTION_BROKEN
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_DELETED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_HANDLE_DESTROYED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_INTERNAL
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_MEMORY
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_RESOURCES
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NOT_BOUND
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NOT_FOUND
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * 'type' property doesn't exist or exists and has no value.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_PERMISSION_DENIED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_TEMPLATE_INVALID
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * 'type' property is not SCF_TYPE_ASTRING, has more than one value,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * is SCF_TYPE_INVALID, or is the empty string.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Prazascf_tmpl_prop_type(const scf_prop_tmpl_t *t, scf_type_t *out)
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza type = _scf_read_single_astring_from_pg(t->prt_pg,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza } else switch (scf_error()) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza (void) scf_set_error(SCF_ERROR_TEMPLATE_INVALID);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /*FALLTHROUGH*/
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza (void) scf_set_error(SCF_ERROR_TEMPLATE_INVALID);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Returns -1 on failure, sets scf_error() to:
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_BACKEND_ACCESS
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_CONNECTION_BROKEN
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_DELETED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Property group which represents t was deleted.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_HANDLE_DESTROYED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_INTERNAL
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_MEMORY
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_RESOURCES
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NOT_BOUND
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_PERMISSION_DENIED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_TEMPLATE_INVALID
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * required property is not SCF_TYPE_ASTRING has more than one value.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Prazascf_tmpl_prop_required(const scf_prop_tmpl_t *t, uint8_t *out)
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if (_read_single_boolean_from_pg(t->prt_pg, SCF_PROPERTY_TM_REQUIRED,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza } else switch (scf_error()) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza (void) scf_set_error(SCF_ERROR_TEMPLATE_INVALID);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Returns -1 on failure. Sets scf_error():
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_BACKEND_ACCESS
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_CONNECTION_BROKEN
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_DELETED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_HANDLE_DESTROYED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_INTERNAL
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_MEMORY
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_RESOURCES
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NOT_BOUND
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NOT_FOUND
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Property doesn't exist or exists and has no value.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_INVALID_ARGUMENT
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * locale is too long to make a property name
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_PERMISSION_DENIED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_TEMPLATE_INVALID
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * common_name property is not SCF_TYPE_ASTRING has more than one value.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Prazascf_tmpl_prop_common_name(const scf_prop_tmpl_t *t, const char *locale,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if ((*out = _read_localized_astring_from_pg(t->prt_pg,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza SCF_PROPERTY_TM_COMMON_NAME_PREFIX, locale)) == NULL)
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Returns -1 on failure. Sets scf_error():
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_BACKEND_ACCESS
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_CONNECTION_BROKEN
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_DELETED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_HANDLE_DESTROYED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_INTERNAL
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_MEMORY
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_RESOURCES
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NOT_BOUND
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NOT_FOUND
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Property doesn't exist or exists and has no value.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_INVALID_ARGUMENT
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * locale is too long to make a property name
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_PERMISSION_DENIED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_TEMPLATE_INVALID
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * description property is not SCF_TYPE_ASTRING has more than one value.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Prazascf_tmpl_prop_description(const scf_prop_tmpl_t *t, const char *locale,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if ((*out = _read_localized_astring_from_pg(t->prt_pg,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza SCF_PROPERTY_TM_DESCRIPTION_PREFIX, locale)) == NULL)
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Returns -1 on failure. Sets scf_error():
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_BACKEND_ACCESS
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_CONNECTION_BROKEN
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_DELETED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_HANDLE_DESTROYED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_INTERNAL
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_MEMORY
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_RESOURCES
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NOT_BOUND
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NOT_FOUND
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Property doesn't exist or exists and has no value.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_INVALID_ARGUMENT
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * locale is too long to make a property name
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_PERMISSION_DENIED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_TEMPLATE_INVALID
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * units property is not SCF_TYPE_ASTRING has more than one value.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Prazascf_tmpl_prop_units(const scf_prop_tmpl_t *t, const char *locale, char **out)
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if ((*out = _read_localized_astring_from_pg(t->prt_pg,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Returns -1 on failure. Sets scf_error():
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_BACKEND_ACCESS
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_CONNECTION_BROKEN
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_DELETED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_HANDLE_DESTROYED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_INTERNAL
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_MEMORY
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_RESOURCES
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NOT_BOUND
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_PERMISSION_DENIED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_TEMPLATE_INVALID
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * visibility property is not SCF_TYPE_ASTRING has more than one value.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Prazascf_tmpl_prop_visibility(const scf_prop_tmpl_t *t, uint8_t *out)
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza visibility = _scf_read_single_astring_from_pg(t->prt_pg,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza } else switch (scf_error()) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /* prop doesn't exist we take the default value */
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza (void) scf_set_error(SCF_ERROR_TEMPLATE_INVALID);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza } else if (strcmp(visibility, SCF_TM_VISIBILITY_READWRITE) == 0) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza } else if (strcmp(visibility, SCF_TM_VISIBILITY_HIDDEN) == 0) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza } else if (strcmp(visibility, SCF_TM_VISIBILITY_READONLY) == 0) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza (void) scf_set_error(SCF_ERROR_TEMPLATE_INVALID);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Return an allocated string containing the value that must be freed
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * with free().
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * On error set scf_error() _NO_MEMORY, or _NOT_SET (val has not been set
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * to a value).
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Prazastatic char *
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza ssize_t sz = scf_limit(SCF_LIMIT_MAX_VALUE_LENGTH) + 1;
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza } else if (scf_value_get_as_string(val, buf, sz) == -1) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Returns -1 on failure, sets scf_error() to:
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_BACKEND_ACCESS
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_CONNECTION_BROKEN
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_DELETED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_HANDLE_DESTROYED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_INTERNAL
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_MEMORY
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_RESOURCES
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NOT_BOUND
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NOT_FOUND
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_PERMISSION_DENIED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_TEMPLATE_INVALID
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Prazascf_tmpl_prop_cardinality(const scf_prop_tmpl_t *t, uint64_t *min,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza SCF_PROPERTY_TM_CARDINALITY_MIN, &val_min) == 0) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza SCF_PROPERTY_TM_CARDINALITY_MAX, &val_max) == 0) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza } else switch (scf_error()) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza (void) scf_set_error(SCF_ERROR_TEMPLATE_INVALID);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /*FALLTHROUGH*/
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Returns -1 on failure. Sets scf_error():
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_BACKEND_ACCESS
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_CONNECTION_BROKEN
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_DELETED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_HANDLE_DESTROYED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_INTERNAL
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_MEMORY
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_RESOURCES
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NOT_BOUND
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NOT_FOUND
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Property doesn't exist or exists and has no value.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_PERMISSION_DENIED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_TEMPLATE_INVALID
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Prazascf_tmpl_prop_internal_seps(const scf_prop_tmpl_t *t, scf_values_t *vals)
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza SCF_PROPERTY_INTERNAL_SEPARATORS, vals) == NULL) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza } else switch (scf_error()) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza (void) scf_set_error(SCF_ERROR_TEMPLATE_INVALID);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /*FALLTHROUGH*/
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /* property has no value */
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Returns -1 on failure. Sets scf_error():
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_BACKEND_ACCESS
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_CONNECTION_BROKEN
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_DELETED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_HANDLE_DESTROYED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_INTERNAL
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_MEMORY
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_RESOURCES
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NOT_BOUND
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NOT_FOUND
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Property doesn't exist or exists and has no value.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_PERMISSION_DENIED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_TEMPLATE_INVALID
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Prazascf_tmpl_value_name_constraints(const scf_prop_tmpl_t *t,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza } else switch (scf_error()) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza (void) scf_set_error(SCF_ERROR_TEMPLATE_INVALID);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /*FALLTHROUGH*/
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /* property has no value */
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Returns NULL on failure. Sets scf_error():
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Caller is responsible for freeing returned pointer after use.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_CONSTRAINT_VIOLATED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * More tokens than the array size supplied.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_MEMORY
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Prazastatic void *
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza_separate_by_separator(char *string, const char *sep, char **array, int size)
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if ((array[n] = strtok_r(str, sep, &lasts)) == NULL) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza while ((token = strtok_r(NULL, sep, &lasts)) != NULL) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza (void) scf_set_error(SCF_ERROR_CONSTRAINT_VIOLATED);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * check if name is among values of CHOICES_INCLUDE_VALUES
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * return 0 if name is present, 1 name is not present, -1 on failure
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_BACKEND_ACCESS
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_CONNECTION_BROKEN
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_DELETED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_HANDLE_DESTROYED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_INTERNAL
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_MEMORY
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_RESOURCES
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NOT_BOUND
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_PERMISSION_DENIED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_TEMPLATE_INVALID
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza_check_choices_include_values(scf_propertygroup_t *pg, const char *name)
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza int n = 0, r = 1;
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza SCF_PROPERTY_TM_CHOICES_INCLUDE_VALUES, &vals)) == NULL) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza } else switch (scf_error()) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza (void) scf_set_error(SCF_ERROR_TEMPLATE_INVALID);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Prazascf_count_ranges_destroy(scf_count_ranges_t *ranges)
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Returns -1 on failure. Sets scf_error():
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_BACKEND_ACCESS
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_CONNECTION_BROKEN
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_CONSTRAINT_VIOLATED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_DELETED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_HANDLE_DESTROYED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_INTERNAL
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_MEMORY
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_RESOURCES
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NOT_BOUND
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NOT_FOUND
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Property doesn't exist or exists and has no value.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_PERMISSION_DENIED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_TEMPLATE_INVALID
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza_scf_tmpl_get_count_ranges(const scf_prop_tmpl_t *t, const char *prop,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if ((ret = _read_astrings_values(t->prt_pg, prop, &vals)) == NULL)
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /* range values are empty */
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza min = malloc(vals.value_count * sizeof (uint64_t));
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza max = malloc(vals.value_count * sizeof (uint64_t));
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /* min and max should be separated by a "," */
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if ((str = _separate_by_separator(ret[i], ",", one_range,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if (errno != 0 || endptr == one_range[0] || *endptr) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza (void) scf_set_error(SCF_ERROR_CONSTRAINT_VIOLATED);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if (errno != 0 || endptr == one_range[1] || *endptr) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza (void) scf_set_error(SCF_ERROR_CONSTRAINT_VIOLATED);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza (void) scf_set_error(SCF_ERROR_CONSTRAINT_VIOLATED);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza } else switch (scf_error()) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza (void) scf_set_error(SCF_ERROR_TEMPLATE_INVALID);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /*FALLTHROUGH*/
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /*NOTREACHED*/
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Returns -1 on failure. Sets scf_error():
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_BACKEND_ACCESS
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_CONNECTION_BROKEN
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_CONSTRAINT_VIOLATED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_DELETED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_HANDLE_DESTROYED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_INTERNAL
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_MEMORY
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_RESOURCES
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NOT_BOUND
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NOT_FOUND
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Property doesn't exist or exists and has no value.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_PERMISSION_DENIED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_TEMPLATE_INVALID
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza_scf_tmpl_get_int_ranges(const scf_prop_tmpl_t *t, const char *prop,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if ((ret = _read_astrings_values(t->prt_pg, prop, &vals)) == NULL)
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /* range values are empty */
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza min = malloc(vals.value_count * sizeof (int64_t));
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza max = malloc(vals.value_count * sizeof (int64_t));
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /* min and max should be separated by a "," */
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if ((str = _separate_by_separator(ret[n], ",", one_range, 2))
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if (errno != 0 || endptr == one_range[0] || *endptr) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza (void) scf_set_error(SCF_ERROR_CONSTRAINT_VIOLATED);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if (errno != 0 || endptr == one_range[1] || *endptr) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza (void) scf_set_error(SCF_ERROR_CONSTRAINT_VIOLATED);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza (void) scf_set_error(SCF_ERROR_TEMPLATE_INVALID);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza } else switch (scf_error()) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza (void) scf_set_error(SCF_ERROR_TEMPLATE_INVALID);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /*FALLTHROUGH*/
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /*NOTREACHED*/
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Returns -1 on failure. Sets scf_error():
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_BACKEND_ACCESS
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_CONNECTION_BROKEN
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_CONSTRAINT_VIOLATED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_DELETED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_HANDLE_DESTROYED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_INTERNAL
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_MEMORY
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_RESOURCES
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NOT_BOUND
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NOT_FOUND
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Property doesn't exist or exists and has no value.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_PERMISSION_DENIED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_TEMPLATE_INVALID
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Prazascf_tmpl_value_count_range_constraints(const scf_prop_tmpl_t *t,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (_scf_tmpl_get_count_ranges(t, SCF_PROPERTY_TM_CONSTRAINT_RANGE,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Prazascf_tmpl_value_int_range_constraints(const scf_prop_tmpl_t *t,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (_scf_tmpl_get_int_ranges(t, SCF_PROPERTY_TM_CONSTRAINT_RANGE,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Prazascf_tmpl_value_count_range_choices(const scf_prop_tmpl_t *t,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (_scf_tmpl_get_count_ranges(t, SCF_PROPERTY_TM_CHOICES_RANGE,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Prazascf_tmpl_value_int_range_choices(const scf_prop_tmpl_t *t,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (_scf_tmpl_get_int_ranges(t, SCF_PROPERTY_TM_CHOICES_RANGE,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Returns -1 on failure. Sets scf_error():
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_BACKEND_ACCESS
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_CONNECTION_BROKEN
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_DELETED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_HANDLE_DESTROYED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_INTERNAL
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_MEMORY
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_RESOURCES
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NOT_BOUND
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NOT_FOUND
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Property doesn't exist or exists and has no value.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_PERMISSION_DENIED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_TEMPLATE_INVALID
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Prazascf_tmpl_value_name_choices(const scf_prop_tmpl_t *t, scf_values_t *vals)
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza int c_flag = 0; /* have not read any value yet */
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /* First, look for explicitly declared choices. */
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza } else if (scf_error() != SCF_ERROR_NOT_FOUND) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /* Next, check for choices included by 'values'. */
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if ((r = _check_choices_include_values(t->prt_pg, "values")) == 0) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /* read values_name */
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /* append values */
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /* read values */
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza } else if (scf_error() != SCF_ERROR_NOT_FOUND) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza } else if (r == -1) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /* Finally check for choices included by 'constraints'. */
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if ((r = _check_choices_include_values(t->prt_pg, "constraints")) ==
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /* read constraint_name */
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /* append values */
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /* read values */
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza } else if (scf_error() != SCF_ERROR_NOT_FOUND) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza } else if (r == -1) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza } else switch (scf_error()) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza (void) scf_set_error(SCF_ERROR_TEMPLATE_INVALID);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /*NOTREACHED*/
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /* free values */
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * char *_make_value_name()
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Construct the prefix for a value common name or value description property.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * It takes the form:
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * value_<BASE32 name>_<common_name|description>_
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * This is then combined with a localized suffix by the caller to look
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * up the property in the repository:
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * value_<BASE32 name>_<common_name|description>_<lang>
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Returns NULL on failure. Sets scf_error():
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_INVALID_ARGUMENT
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Name isn't short enough make a value name with.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_MEMORY
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Prazastatic char *
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza_make_value_name(char *desc_name, const char *value)
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza ssize_t sz = scf_limit(SCF_LIMIT_MAX_NAME_LENGTH) + 1;
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if (scf_encode32(value, strlen(value), encoded, sz, NULL,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /* Shouldn't happen. */
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza (void) strlcpy(name, SCF_PROPERTY_TM_VALUE_PREFIX, sz);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza (void) scf_set_error(SCF_ERROR_INVALID_ARGUMENT);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza (void) scf_set_error(SCF_ERROR_INVALID_ARGUMENT);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza (void) scf_set_error(SCF_ERROR_INVALID_ARGUMENT);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza (void) scf_set_error(SCF_ERROR_INVALID_ARGUMENT);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * ssize_t scf_tmpl_value_common_name()
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Populates "out" with an allocated string containing the value's
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * common name. Returns the size of the string on successful return.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * out must be freed with free() on successful return.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Returns -1 on failure, sets scf_error() to:
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_BACKEND_ACCESS
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_CONNECTION_BROKEN
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_DELETED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Property group was deleted.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_HANDLE_DESTROYED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_INTERNAL
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_INVALID_ARGUMENT
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * name not a valid property name
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * name and locale are too long to make a property name
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_MEMORY
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_RESOURCES
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NOT_BOUND
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NOT_FOUND
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Property doesn't exist or exists and has no value.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_PERMISSION_DENIED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_TEMPLATE_INVALID
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * property is not SCF_TYPE_ASTRING has more than one value.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Prazascf_tmpl_value_common_name(const scf_prop_tmpl_t *t, const char *locale,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza value_name = _make_value_name("common_name", value);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza *out = _read_localized_astring_from_pg(t->prt_pg, value_name, locale);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * ssize_t scf_tmpl_value_description()
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Populates "out" with an allocated string containing the value's
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * description. Returns the size of the string on successful return.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * out must be freed with free() on successful return.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Returns -1 on failure, sets scf_error() to:
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_BACKEND_ACCESS
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_CONNECTION_BROKEN
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_DELETED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Property group was deleted.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_HANDLE_DESTROYED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_INTERNAL
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_INVALID_ARGUMENT
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * name not a valid property name
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * name and locale are too long to make a property name
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_MEMORY
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_RESOURCES
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NOT_BOUND
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NOT_FOUND
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Property doesn't exist or exists and has no value.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_PERMISSION_DENIED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_TEMPLATE_INVALID
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * property is not SCF_TYPE_ASTRING has more than one value.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Prazascf_tmpl_value_description(const scf_prop_tmpl_t *t, const char *locale,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza value_name = _make_value_name("description", value);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza *out = _read_localized_astring_from_pg(t->prt_pg, value_name, locale);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Templates error messages format, in human readable form.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Each line is one error item:
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * prefix error message
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * FMRI="err->te_errs->tes_fmri"
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Property group="err->te_pg_name"
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Property name="err->te_prop_name"
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * expected value 1="err->te_ev1"
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * expected value 2="err->te_ev2"
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * actual value="err->te_actual"
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Tempalte source="err->te_tmpl_fmri"
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * pg_pattern name="err->tmpl_pg_name"
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * pg_pattern type="err->tmpl_pg_type"
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * prop_pattern name="err->tmpl_prop_name"
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * prop_pattern type="err->tmpl_prop_type"
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * To add a new error type, include scf_tmpl_error_type_t in libscf.h
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * add one entry in em_desc[], and update the functions pointed by the
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * _tmpl_error_access array with the new error code. Also, update the
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * scf_tmpl_error_* functions to provide access to desired
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * scf_tmpl_error_t fields.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * To add a new error item, add a new field to scf_tmpl_error_t, a new field
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * in _scf_tmpl_error_desc or a new non-error-dependent string, add a new entry
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * in _tmpl_error_access array and create the appropriate get_val, get_desc
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * functions.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Changes to both the validation logic and the error types and items must
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * be coordinated with the code in svccfg to ensure both libscf and svccfg's
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * manifest validation validate the same things.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Container for all template errors on a validated object.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza int tes_flag; /* if set, scf_tmpl_error_destroy */
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /* will free strings in tes_errs */
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Templates error-dependent labels
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * This array MUST be kept in synch with the template error definition of
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * scf_tmpl_error_type_t in libscf.h
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /* SCF_TERR_MISSING_PG */
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza { "Required property group missing", "Name of missing property group",
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /* SCF_TERR_WRONG_PG_TYPE */
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza { "Property group has bad type", "Specified type", NULL,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza "Actual type" },
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /* SCF_TERR_MISSING_PROP */
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza { "Required property missing", "Name of missing property", NULL, NULL },
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /* SCF_TERR_WRONG_PROP_TYPE */
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza { "Property has bad type", "Specified property type", NULL,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza "Actual property type" },
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /* SCF_TERR_CARDINALITY_VIOLATION */
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza { "Number of property values violates cardinality restriction",
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza "Actual number of values" },
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /* SCF_TERR_VALUE_CONSTRAINT_VIOLATED */
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza { "Property has illegal value", NULL, NULL, "Illegal value" },
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /* SCF_TERR_RANGE_VIOLATION */
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza { "Property value is out of range", NULL, NULL, "Actual value" },
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /* SCF_TERR_PG_REDEFINE */
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza { "Instance redefines pg_pattern", "Instance pg_pattern name",
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /* SCF_TERR_PROP_TYPE_MISMATCH */
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza { "Property type and value type mismatch", NULL, NULL, "Value type" },
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /* SCF_TERR_VALUE_OUT_OF_RANGE */
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza { "Value is out of range", NULL, NULL, "Value" },
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /* SCF_TERR_INVALID_VALUE */
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /* SCF_TERR_PG_PATTERN_CONFLICT */
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza { "Conflicting pg_pattern specifications", "Template source",
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /* SCF_TERR_PROP_PATTERN_CONFLICT */
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza { "Conflicting prop_pattern specifications", "Template source",
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /* SCF_TERR_GENERAL_REDEFINE */
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza { "Service or instance pg_pattern redefines a global or restarter "
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza "pg_pattern", "Template source", "pg_pattern name",
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza "pg_pattern type" },
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /* SCF_TERR_INCLUDE_VALUES */
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza { "Missing constraints or values for include_values element",
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /* SCF_TERR_PG_PATTERN_INCOMPLETE */
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza { "Required pg_pattern is missing a name or type attribute",
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /* SCF_TERR_PROP_PATTERN_INCOMPLETE */
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza { "Required prop_pattern is missing a type attribute",
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Templates non error-dependent labels
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Prazastatic const char *em_pg_name = "Property group";
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Prazastatic const char *em_prop_name = "Property name";
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Prazastatic const char *em_tmpl_fmri = "Template source";
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Prazastatic const char *em_tmpl_pg_name = "pg_pattern name";
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Prazastatic const char *em_tmpl_pg_type = "pg_pattern type";
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Prazastatic const char *em_tmpl_prop_name = "prop_pattern name";
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Prazastatic const char *em_tmpl_prop_type = "prop_pattern type";
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Prazastatic const char *
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Prazastatic const char *
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Prazastatic const char *
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Prazastatic const char *
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (dgettext(TEXT_DOMAIN, em_desc[err->te_type].em_ev1));
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Prazastatic const char *
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (dgettext(TEXT_DOMAIN, em_desc[err->te_type].em_ev2));
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Prazastatic const char *
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Prazastatic const char *
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Prazastatic const char *
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (dgettext(TEXT_DOMAIN, em_tmpl_pg_name));
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Prazastatic const char *
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (dgettext(TEXT_DOMAIN, em_tmpl_pg_type));
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Prazastatic const char *
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (dgettext(TEXT_DOMAIN, em_tmpl_prop_name));
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Prazastatic const char *
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (dgettext(TEXT_DOMAIN, em_tmpl_prop_type));
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Prazastatic const char *
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Prazastatic const char *
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Prazastatic const char *
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Prazastatic const char *
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Prazastatic const char *
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Prazastatic const char *
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Prazastatic const char *
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Prazastatic const char *
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Prazastatic const char *
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Prazastatic const char *
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Prazastatic const char *
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Templates error item retrival functions
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Prazatypedef const char *(*get_em)(scf_tmpl_error_t *);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * if new items (lines) are added to the templates error messages,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * new entries in this array (and new fuctions) will be required.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza { (get_em)_get_fmri_desc, (get_em)_get_fmri_val },
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza { (get_em)_get_pg_name_desc, (get_em)_get_pg_name_val },
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza { (get_em)_get_prop_name_desc, (get_em)_get_prop_name_val },
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza { (get_em)_get_ev1_desc, (get_em)_get_ev1_val },
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza { (get_em)_get_ev2_desc, (get_em)_get_ev2_val },
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza { (get_em)_get_actual_desc, (get_em)_get_actual_val },
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza { (get_em)_get_tmpl_fmri_desc, (get_em)_get_tmpl_fmri_val },
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza { (get_em)_get_tmpl_pg_name_desc, (get_em)_get_tmpl_pg_name_val },
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza { (get_em)_get_tmpl_pg_type_desc, (get_em)_get_tmpl_pg_type_val },
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza { (get_em)_get_tmpl_prop_name_desc, (get_em)_get_tmpl_prop_name_val },
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza { (get_em)_get_tmpl_prop_type_desc, (get_em)_get_tmpl_prop_type_val },
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Allocate a new scf_tmpl_error_t and add it to the errs list provided.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Returns NULL on failure. Sets scf_error():
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_MEMORY
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza assert(errs->tes_num_errs <= errs->tes_errs_size);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if (errs->tes_num_errs == errs->tes_errs_size) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /* Time to grow the pointer array. */
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza errs->tes_errs = calloc(2 * errs->tes_errs_size,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza (void) memcpy(errs->tes_errs, saved_errs, errs->tes_errs_size *
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * If destroy_strings is set, scf_tmpl_errors_destroy will free the
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * strings in scf_tmpl_error_t entries.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Returns NULL on failure. Sets scf_error():
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_MEMORY
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza_scf_create_errors(const char *fmri, int destroy_strings)
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /* Make space for a few errors. */
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza ret->tes_errs = calloc(errs_size, sizeof (scf_tmpl_error_t *));
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * return 0 on success, if fails set scf_error() to:
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_MEMORY
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza_scf_tmpl_error_set_prefix(scf_tmpl_errors_t *errs, const char *prefix)
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Returns -1 on failure. Sets scf_error():
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_MEMORY
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza_scf_tmpl_add_error(scf_tmpl_errors_t *errs, scf_tmpl_error_type_t type,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza const char *ev1, const char *ev2, const char *actual,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza const char *tmpl_fmri, const char *tmpl_pg_name, const char *tmpl_pg_type,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza const char *tmpl_prop_name, const char *tmpl_prop_type)
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * returns an allocated string that must be freed with free()
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * string contains converted 64-bit integer value
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * flag set for signed values
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * if fails return NULL and set scf_error() to:
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_MEMORY
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Prazastatic char *
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza ssize_t sz = scf_limit(SCF_LIMIT_MAX_VALUE_LENGTH) + 1;
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza (void) snprintf(buf, sz, "%" PRIi64, (int64_t)val);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * return 0 on success, -1 on failure.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * set scf_error() to:
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_BACKEND_ACCESS
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_CONNECTION_BROKEN
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_DELETED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_HANDLE_DESTROYED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_INTERNAL
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_MEMORY
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_RESOURCES
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NOT_BOUND
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_PERMISSION_DENIED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_TEMPLATE_INVALID
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza_add_tmpl_missing_pg_error(scf_tmpl_errors_t *errs, scf_pg_tmpl_t *t)
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (_scf_tmpl_add_error(errs, SCF_TERR_MISSING_PG, NULL, NULL, ev1,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza ev2, NULL, t_fmri, t_pg_name, t_pg_type, NULL, NULL));
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * return 0 on success, -1 on failure.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * set scf_error() to:
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_BACKEND_ACCESS
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_CONNECTION_BROKEN
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_DELETED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_HANDLE_DESTROYED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_INTERNAL
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_MEMORY
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_RESOURCES
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NOT_BOUND
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_PERMISSION_DENIED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_TEMPLATE_INVALID
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza_add_tmpl_wrong_pg_type_error(scf_tmpl_errors_t *errs, scf_pg_tmpl_t *t,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (_scf_tmpl_add_error(errs, SCF_TERR_WRONG_PG_TYPE, pg_name, NULL,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza ev1, NULL, actual, t_fmri, t_pg_name, t_pg_type, NULL, NULL));
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * return 0 on success, -1 on failure.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * set scf_error() to:
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_BACKEND_ACCESS
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_CONNECTION_BROKEN
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_DELETED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_HANDLE_DESTROYED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_INTERNAL
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_MEMORY
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_RESOURCES
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NOT_BOUND
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_PERMISSION_DENIED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_TEMPLATE_INVALID
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza_add_tmpl_missing_prop_error(scf_tmpl_errors_t *errs, scf_pg_tmpl_t *t,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza scf_propertygroup_t *pg, const scf_prop_tmpl_t *pt)
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if (scf_tmpl_prop_name(pt, &t_prop_name) == -1) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza t_prop_type = _scf_read_tmpl_prop_type_as_string(pt);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if (t_prop_type != NULL && t_prop_type[0] == '\0') {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if ((t_prop_type = strdup(SCF_TMPL_WILDCARD)) == NULL) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (_scf_tmpl_add_error(errs, SCF_TERR_MISSING_PROP, pg_name, NULL,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza ev1, NULL, NULL, t_fmri, t_pg_name, t_pg_type, t_prop_name,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * return 0 on success, -1 on failure.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * set scf_error() to:
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_BACKEND_ACCESS
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_CONNECTION_BROKEN
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_DELETED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_HANDLE_DESTROYED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_INTERNAL
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_MEMORY
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_RESOURCES
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NOT_BOUND
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_PERMISSION_DENIED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_TEMPLATE_INVALID
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza_add_tmpl_wrong_prop_type_error(scf_tmpl_errors_t *errs,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza scf_propertygroup_t *pg, const scf_prop_tmpl_t *pt, scf_property_t *prop)
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if ((t_fmri = _scf_tmpl_get_fmri(pt->prt_t)) == NULL)
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if ((prop_name = _scf_get_prop_name(prop)) == NULL)
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if ((actual = _scf_get_prop_type(prop)) == NULL)
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if (scf_tmpl_pg_name(pt->prt_t, &t_pg_name) == -1) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if (scf_tmpl_pg_type(pt->prt_t, &t_pg_type) == -1) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if (scf_tmpl_prop_name(pt, &t_prop_name) == -1) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza t_prop_type = _scf_read_tmpl_prop_type_as_string(pt);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if (t_prop_type != NULL && t_prop_type[0] == '\0') {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if ((t_prop_type = strdup(SCF_TMPL_WILDCARD)) == NULL) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (_scf_tmpl_add_error(errs, SCF_TERR_WRONG_PROP_TYPE, pg_name,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza prop_name, ev1, NULL, actual, t_fmri, t_pg_name, t_pg_type,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * return 0 on success, -1 on failure.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * set scf_error() to:
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_BACKEND_ACCESS
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_CONNECTION_BROKEN
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_DELETED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_HANDLE_DESTROYED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_INTERNAL
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_MEMORY
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_RESOURCES
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NOT_BOUND
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_PERMISSION_DENIED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_TEMPLATE_INVALID
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza_add_tmpl_count_error(scf_tmpl_errors_t *errs, scf_tmpl_error_type_t type,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza scf_propertygroup_t *pg, const scf_prop_tmpl_t *pt, scf_property_t *prop,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if ((t_fmri = _scf_tmpl_get_fmri(pt->prt_t)) == NULL)
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if ((prop_name = _scf_get_prop_name(prop)) == NULL)
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /* keep pg_name = NULL and prop_name = NULL */
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if (scf_tmpl_pg_name(pt->prt_t, &t_pg_name) == -1) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if (scf_tmpl_pg_type(pt->prt_t, &t_pg_type) == -1) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if (scf_tmpl_prop_name(pt, &t_prop_name) == -1) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza t_prop_type = _scf_read_tmpl_prop_type_as_string(pt);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if (t_prop_type != NULL && t_prop_type[0] == '\0') {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if ((t_prop_type = strdup(SCF_TMPL_WILDCARD)) == NULL) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if ((s_min = _val_to_string(*min, 0)) == NULL) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if ((s_max = _val_to_string(*max, 0)) == NULL) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (_scf_tmpl_add_error(errs, type, pg_name, prop_name, s_min,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza s_max, num, t_fmri, t_pg_name, t_pg_type, t_prop_name,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * return 0 on success, -1 on failure.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * set scf_error() to:
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_BACKEND_ACCESS
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_CONNECTION_BROKEN
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_DELETED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_HANDLE_DESTROYED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_INTERNAL
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_MEMORY
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_RESOURCES
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NOT_BOUND
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_PERMISSION_DENIED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_TEMPLATE_INVALID
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza_add_tmpl_constraint_error(scf_tmpl_errors_t *errs, scf_tmpl_error_type_t type,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza scf_propertygroup_t *pg, const scf_prop_tmpl_t *pt, scf_property_t *prop,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if ((t_fmri = _scf_tmpl_get_fmri(pt->prt_t)) == NULL)
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if ((prop_name = _scf_get_prop_name(prop)) == NULL)
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /*FALLTHROUGH*/
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /* keep pg_name = NULL and prop_name = NULL */
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if ((value = _scf_value_get_as_string(val)) == NULL)
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /* keep pg_name = NULL and prop_name = NULL */
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /* use value for value type */
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if ((value = strdup(scf_type_to_string(val_type))) ==
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if (scf_tmpl_pg_name(pt->prt_t, &t_pg_name) == -1) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if (scf_tmpl_pg_type(pt->prt_t, &t_pg_type) == -1) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if (scf_tmpl_prop_name(pt, &t_prop_name) == -1) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza t_prop_type = _scf_read_tmpl_prop_type_as_string(pt);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if (t_prop_type != NULL && t_prop_type[0] == '\0') {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if ((t_prop_type = strdup(SCF_TMPL_WILDCARD)) == NULL) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (_scf_tmpl_add_error(errs, type, pg_name, prop_name, NULL, NULL,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza value, t_fmri, t_pg_name, t_pg_type, t_prop_name, t_prop_type));
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * return 0 on success, -1 on failure.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * set scf_error() to:
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_BACKEND_ACCESS
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_CONNECTION_BROKEN
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_DELETED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_HANDLE_DESTROYED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_INTERNAL
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_MEMORY
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_RESOURCES
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NOT_BOUND
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_PERMISSION_DENIED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_TEMPLATE_INVALID
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza_add_tmpl_int_error(scf_tmpl_errors_t *errs, scf_tmpl_error_type_t type,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza scf_propertygroup_t *pg, const scf_prop_tmpl_t *pt, scf_property_t *prop,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if ((t_fmri = _scf_tmpl_get_fmri(pt->prt_t)) == NULL)
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if ((prop_name = _scf_get_prop_name(prop)) == NULL)
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /* keep pg_name = NULL and prop_name = NULL */
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if (scf_tmpl_pg_name(pt->prt_t, &t_pg_name) == -1) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if (scf_tmpl_pg_type(pt->prt_t, &t_pg_type) == -1) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if (scf_tmpl_prop_name(pt, &t_prop_name) == -1) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza t_prop_type = _scf_read_tmpl_prop_type_as_string(pt);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if (t_prop_type != NULL && t_prop_type[0] == '\0') {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if ((t_prop_type = strdup(SCF_TMPL_WILDCARD)) == NULL) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if ((s_min = _val_to_string(*((uint64_t *)min), 1)) == NULL) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if ((s_max = _val_to_string(*((uint64_t *)max), 1)) == NULL) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if ((value = _val_to_string((uint64_t)val, 1)) == NULL) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (_scf_tmpl_add_error(errs, type, pg_name, prop_name, s_min,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza s_max, value, t_fmri, t_pg_name, t_pg_type, t_prop_name,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * return 0 on success, -1 on failure.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * set scf_error() to:
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_BACKEND_ACCESS
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_CONNECTION_BROKEN
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_DELETED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_HANDLE_DESTROYED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_INTERNAL
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_MEMORY
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_RESOURCES
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NOT_BOUND
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_PERMISSION_DENIED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_TEMPLATE_INVALID
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza_add_tmpl_pg_redefine_error(scf_tmpl_errors_t *errs, scf_pg_tmpl_t *t,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (_scf_tmpl_add_error(errs, SCF_TERR_PG_REDEFINE, NULL, NULL,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza ev1, ev2, NULL, t_fmri, t_pg_name, t_pg_type, NULL, NULL));
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * return 0 if value is within count ranges constraint.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * return -1 otherwise
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza_check_count_ranges(scf_count_ranges_t *cr, uint64_t v)
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /* value is within ranges constraint */
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * return 0 if value is within count ranges constraint.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * return -1 otherwise
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza_check_int_ranges(scf_int_ranges_t *ir, int64_t v)
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /* value is within integer ranges constraint */
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * int _value_in_constraint()
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Checks whether the supplied value violates any of the constraints
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * specified in the supplied property template. If it does, an appropriate
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * error is appended to "errs". pg and prop, if supplied, are used to
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * augment the information in the error. Returns 0 on success.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Returns -1 on failure. Sets scf_error():
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_BACKEND_ACCESS
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_CONNECTION_BROKEN
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_DELETED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_HANDLE_DESTROYED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_INTERNAL
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_INVALID_ARGUMENT
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_MEMORY
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_RESOURCES
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NOT_BOUND
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_PERMISSION_DENIED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_TEMPLATE_INVALID
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza_value_in_constraint(scf_propertygroup_t *pg, scf_property_t *prop,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza const scf_prop_tmpl_t *pt, scf_value_t *value, scf_tmpl_errors_t *errs)
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza ssize_t sz = scf_limit(SCF_LIMIT_MAX_VALUE_LENGTH) + 1;
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza (void) scf_set_error(SCF_ERROR_INVALID_ARGUMENT);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /* Check if template type matches value type. */
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /* type is not wildcarded */
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /* Numeric values should be checked against any range constraints. */
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if (scf_tmpl_value_count_range_constraints(pt, &cr) != 0) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if (scf_error() == SCF_ERROR_CONSTRAINT_VIOLATED)
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /* value is within ranges constraint */
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * If we get here, we have a possible constraint
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * violation.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if (scf_tmpl_value_int_range_constraints(pt, &ir) != 0) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if (scf_error() != SCF_ERROR_CONSTRAINT_VIOLATED)
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /* value is within ranges constraint */
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * If we get here, we have a possible constraint
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * violation.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * If a set of names is provided, confirm value has one of
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * those names.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if (scf_tmpl_value_name_constraints(pt, &vals) != 0) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza r = scf_value_get_as_string_typed(value, type, vstr, sz);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * All errors (INVALID_ARGUMENT, NOT_SET, TYPE_MISMATCH)
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * should be impossible or already caught above.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /* value is within constraint */
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /* if we get here, we have a constraint violation */
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /* register the errors found */
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Help make the error more human-friendly. If
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * pg and prop are provided, we know we're
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * validating repository data. If they're not,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * we're validating a potentially hypothetical
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if (_add_tmpl_count_error(errs, terr_type, pg, pt,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if (_add_tmpl_int_error(errs, terr_type, pg, pt, prop,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if (_add_tmpl_constraint_error(errs, terr_type, pg,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Returns -1 on failure. Sets scf_error():
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_BACKEND_ACCESS
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_CONNECTION_BROKEN
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_DELETED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_HANDLE_DESTROYED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_INTERNAL
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_INVALID_ARGUMENT
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_MEMORY
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_RESOURCES
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NOT_BOUND
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_PERMISSION_DENIED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_TEMPLATE_INVALID
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Prazascf_tmpl_value_in_constraint(const scf_prop_tmpl_t *pt, scf_value_t *value,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if ((fmri = _scf_tmpl_get_fmri(pt->prt_t)) == NULL)
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (_value_in_constraint(NULL, NULL, pt, value, e));
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza assert(errs->tes_errs[errs->tes_index] != NULL);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Prazascf_tmpl_strerror(scf_tmpl_error_t *err, char *s, size_t n, int flag)
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza char *s0 = (flag == SCF_TMPL_STRERROR_HUMAN) ? ":\n\t" : ": ";
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza char *s1 = (flag == SCF_TMPL_STRERROR_HUMAN) ? "\n\t" : "; ";
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /* prefix */
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza ret = snprintf(buf, sz, "%s", dgettext(TEXT_DOMAIN,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /* error message */
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza ret = snprintf(buf, sz, "%s", dgettext(TEXT_DOMAIN,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza for (i = 0; _tmpl_error_items[i].get_desc != NULL; ++i) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if ((str = _tmpl_error_items[i].get_desc(err)) == NULL)
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /* no item to print */
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza ret = snprintf(buf, sz, "%s%s=\"%s\"", sep, str,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * return 0 on success, -1 on failure.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * set scf_error() to:
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_BACKEND_ACCESS
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_CONNECTION_BROKEN
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_DELETED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_HANDLE_DESTROYED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_INTERNAL
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_MEMORY
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_RESOURCES
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NOT_BOUND
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_PERMISSION_DENIED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_TEMPLATE_INVALID
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza_validate_cardinality(scf_propertygroup_t *pg, scf_prop_tmpl_t *pt,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if (scf_tmpl_prop_cardinality(pt, &min, &max) != 0) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /* Any number of values permitted. Just return success. */
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza assert(scf_error() == SCF_ERROR_HANDLE_DESTROYED);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if (scf_iter_property_values(iter, prop) != 0) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza while ((r = scf_iter_next_value(iter, val)) == 1)
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if (r < 0) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if (_add_tmpl_count_error(errs, SCF_TERR_CARDINALITY_VIOLATION,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza pg, pt, prop, (uint64_t)count, &min, &max) == -1)
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Returns -1 on error. Sets scf_error():
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_BACKEND_ACCESS
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_CONNECTION_BROKEN
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_DELETED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_HANDLE_DESTROYED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_INTERNAL
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_MEMORY
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_RESOURCES
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NOT_BOUND
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_PERMISSION_DENIED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_TEMPLATE_INVALID
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza_check_property(scf_prop_tmpl_t *pt, scf_propertygroup_t *pg,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza assert(scf_error() == SCF_ERROR_HANDLE_DESTROYED);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /* Check type */
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza } else if (required) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /* If required, type must be specified. */
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza (void) scf_set_error(SCF_ERROR_TEMPLATE_INVALID);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza } else if (scf_property_is_type(prop, tmpl_type) != 0) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza } else switch (scf_error()) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if (_add_tmpl_wrong_prop_type_error(errs, pg, pt,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * tmpl_prop_type shouldn't have handed back
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * an invalid property type.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /* Cardinality */
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if (_validate_cardinality(pg, pt, prop, errs) == -1)
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /* Value constraints */
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Iterate through each value, and confirm it is defined as
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * constrained.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if (scf_iter_property_values(iter, prop) != 0) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza while ((r = scf_iter_next_value(iter, val)) == 1) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if (_value_in_constraint(pg, prop, pt, val, errs) == -1) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza } else switch (scf_error()) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if (r < 0) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Returns -1 on failure, sets scf_error() to:
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_BACKEND_ACCESS
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_CONNECTION_BROKEN
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_DELETED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_HANDLE_DESTROYED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_INTERNAL
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_MEMORY
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_RESOURCES
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NOT_BOUND
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_PERMISSION_DENIED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_TEMPLATE_INVALID
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza_check_pg(scf_pg_tmpl_t *t, scf_propertygroup_t *pg, char *pg_name,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza ssize_t nsize = scf_limit(SCF_LIMIT_MAX_NAME_LENGTH) + 1;
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza assert(scf_error() == SCF_ERROR_HANDLE_DESTROYED);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza assert(scf_error() != SCF_ERROR_INVALID_ARGUMENT);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza assert(scf_error() != SCF_ERROR_INVALID_ARGUMENT);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza assert(scf_error() != SCF_ERROR_INVALID_ARGUMENT);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza } else if (pg_required != 0 &&
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /* Type must be specified for required pgs. */
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza (void) scf_set_error(SCF_ERROR_TEMPLATE_INVALID);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if (_add_tmpl_wrong_pg_type_error(errs, t, pg) == -1)
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /* Iterate through properties in the repository and check them. */
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza while ((r = scf_iter_next_property(iter, prop)) == 1) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if (scf_property_get_name(prop, prop_name, nsize) == -1) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if (scf_tmpl_get_by_prop(t, prop_name, pt, 0) != 0) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza } else switch (scf_error()) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /* No template. Continue. */
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if (r < 0) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Confirm required properties are present.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /* required properties cannot have type wildcarded */
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if (scf_pg_get_property(pg, prop_name, prop) != 0) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza } else switch (scf_error()) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if (r < 0) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza } else switch (scf_error()) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Checks if instance fmri redefines any pgs defined in restarter or global
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Return -1 on failure, sets scf_error() to:
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_BACKEND_ACCESS
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_CONNECTION_BROKEN
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_DELETED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_HANDLE_DESTROYED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_INTERNAL
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_INVALID_ARGUMENT
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_MEMORY
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_RESOURCES
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NOT_BOUND
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NOT_FOUND
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_PERMISSION_DENIED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_TEMPLATE_INVALID
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza_scf_tmpl_check_pg_redef(scf_handle_t *h, const char *fmri,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza while ((ret = scf_tmpl_iter_pgs(t, fmri, snapname, NULL,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /* look for a redefinition of a global/restarter pg_pattern */
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza while ((ret = scf_tmpl_iter_pgs(r, fmri, snapname, pg_type,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza } else if (strcmp(pg_name_r, SCF_TMPL_WILDCARD) != 0 &&
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /* not a match */
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza } else if (strcmp(pg_type_r, SCF_TMPL_WILDCARD) != 0 &&
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /* not a match */
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /* found a pg_pattern redefinition */
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /*FALLTHROUGH*/
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Returns -1 on failure, sets scf_error() to:
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_BACKEND_ACCESS
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_CONNECTION_BROKEN
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_DELETED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_HANDLE_DESTROYED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_INTERNAL
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_INVALID_ARGUMENT
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_MEMORY
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_RESOURCES
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NOT_BOUND
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NOT_FOUND
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_PERMISSION_DENIED
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_TEMPLATE_INVALID
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Prazascf_tmpl_validate_fmri(scf_handle_t *h, const char *fmri, const char *snapshot,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza ssize_t rsize = scf_limit(SCF_LIMIT_MAX_PG_TYPE_LENGTH) + 1;
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza ssize_t nsize = scf_limit(SCF_LIMIT_MAX_NAME_LENGTH) + 1;
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if ((*errs = _scf_create_errors(fmri, 1)) == NULL)
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Sets SCF_ERROR_INVALID_ARGUMENT, SCF_ERROR_NO_MEMORY,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_NO_RESOURCES, SCF_ERROR_INTERNAL or
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * SCF_ERROR_HANDLE_DESTROYED.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if (scf_handle_decode_fmri(h, fmri, NULL, NULL, inst, NULL, NULL,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza SCF_DECODE_FMRI_EXACT|SCF_DECODE_FMRI_REQUIRE_INSTANCE) != 0) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza } else switch (scf_error()) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza (void) scf_set_error(SCF_ERROR_TEMPLATE_INVALID);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /*FALLTHROUGH*/
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if (snapshot == NULL || strcmp(snapshot, "running") == 0 ||
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if (_get_snapshot(inst, snapshot, &snap) == -1) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza } else if (scf_error() == SCF_ERROR_NOT_FOUND) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if (_scf_tmpl_check_pg_redef(h, fmri, snapshot, *errs) != 0) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Check that property groups on this instance conform to the template.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if (scf_iter_instance_pgs_composed(iter, inst, snap) != 0) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if (scf_pg_get_name(pg, pg_name, nsize) == -1) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if (scf_tmpl_get_by_pg_name(fmri, snapshot, pg_name, type, t,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza } else switch (scf_error()) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if (_check_pg(t, pg, pg_name, type, *errs) != 0)
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if (r < 0) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * Confirm required property groups are present.
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza while ((r = scf_tmpl_iter_pgs(t, fmri, snapshot, NULL,
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * required property group templates should not have
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza * wildcarded name or type
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza (void) scf_set_error(SCF_ERROR_TEMPLATE_INVALID);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if (_get_pg(NULL, inst, snap, pg_name, pg) != 0) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza } else switch (scf_error()) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if (r < 0) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza } else switch (scf_error()) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /* there are no errors to report */
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Prazascf_tmpl_error_source_fmri(const scf_tmpl_error_t *err, char **fmri)
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /*NOTREACHED*/
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza (void) scf_set_error(SCF_ERROR_INVALID_ARGUMENT);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Prazascf_tmpl_error_type(const scf_tmpl_error_t *err, scf_tmpl_error_type_t *type)
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /*NOTREACHED*/
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza (void) scf_set_error(SCF_ERROR_INVALID_ARGUMENT);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Prazascf_tmpl_error_pg_tmpl(const scf_tmpl_error_t *err, char **name, char **type)
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza (void) scf_set_error(SCF_ERROR_INVALID_ARGUMENT);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Prazascf_tmpl_error_pg(const scf_tmpl_error_t *err, char **name, char **type)
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /*FALLTHROUGH*/
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza if (err->te_ev1 != NULL && err->te_ev2 != NULL) {
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza (void) scf_set_error(SCF_ERROR_INVALID_ARGUMENT);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Prazascf_tmpl_error_prop_tmpl(const scf_tmpl_error_t *err, char **name, char **type)
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /*FALLTHROUGH*/
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza (void) scf_set_error(SCF_ERROR_INVALID_ARGUMENT);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Prazascf_tmpl_error_prop(const scf_tmpl_error_t *err, char **name, char **type)
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /*FALLTHROUGH*/
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza (void) scf_set_error(SCF_ERROR_INVALID_ARGUMENT);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Prazascf_tmpl_error_value(const scf_tmpl_error_t *err, char **val)
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza /*FALLTHROUGH*/
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza (void) scf_set_error(SCF_ERROR_INVALID_ARGUMENT);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return (-1);
1f6eb0216cb17ca5fdff9563329f1dda47c8b801Liane Praza return ("unknown");