f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby/*
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * CDDL HEADER START
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby *
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * The contents of this file are subject to the terms of the
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * Common Development and Distribution License (the "License").
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * You may not use this file except in compliance with the License.
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby *
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * or http://www.opensolaris.org/os/licensing.
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * See the License for the specific language governing permissions
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * and limitations under the License.
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby *
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * When distributing Covered Code, include this CDDL HEADER in each
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * If applicable, add the following below this CDDL HEADER, with the
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * fields enclosed by brackets "[]" replaced with your own identifying
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * information: Portions Copyright [yyyy] [name of copyright owner]
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby *
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * CDDL HEADER END
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby */
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby/*
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby */
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby#include "libscf_impl.h"
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby#include <assert.h>
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby#include <strings.h>
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby/*
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * Errors returned by smf_notify_{del|get|set}_params()
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby */
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltbystatic const scf_error_t errs_1[] = {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby SCF_ERROR_BACKEND_ACCESS,
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby SCF_ERROR_BACKEND_READONLY,
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby SCF_ERROR_CONNECTION_BROKEN,
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby SCF_ERROR_DELETED,
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby SCF_ERROR_INTERNAL,
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby SCF_ERROR_INVALID_ARGUMENT,
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby SCF_ERROR_NO_MEMORY,
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby SCF_ERROR_NO_RESOURCES,
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby SCF_ERROR_NOT_FOUND,
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby SCF_ERROR_PERMISSION_DENIED,
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby 0
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby};
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby/*
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * Errors returned by smf_notify_{del|get|set}_params()
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * Except SCF_ERROR_INVALID_ARGUMENT
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby */
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltbystatic const scf_error_t errs_2[] = {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby SCF_ERROR_BACKEND_ACCESS,
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby SCF_ERROR_BACKEND_READONLY,
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby SCF_ERROR_CONNECTION_BROKEN,
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby SCF_ERROR_DELETED,
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby SCF_ERROR_INTERNAL,
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby SCF_ERROR_NO_MEMORY,
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby SCF_ERROR_NO_RESOURCES,
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby SCF_ERROR_NOT_FOUND,
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby SCF_ERROR_PERMISSION_DENIED,
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby 0
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby};
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby/*
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * Helper function that abort() on unexpected errors.
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * The expected error set is a zero-terminated array of scf_error_t
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby */
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltbystatic int
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltbycheck_scf_error(scf_error_t e, const scf_error_t *errs)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby{
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (ismember(e, errs))
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (1);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby assert(0);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby abort();
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby /*NOTREACHED*/
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby}
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby/*
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * Mapping of state transition to pgname.
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby */
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltbystatic struct st_pgname {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby const char *st_pgname;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby int32_t st_state;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby} st_pgnames[] = {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby { "to-uninitialized", SCF_TRANS(0, SCF_STATE_UNINIT) },
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby { "from-uninitialized", SCF_TRANS(SCF_STATE_UNINIT, 0) },
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby { "to-maintenance", SCF_TRANS(0, SCF_STATE_MAINT) },
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby { "from-maintenance", SCF_TRANS(SCF_STATE_MAINT, 0) },
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby { "to-offline", SCF_TRANS(0, SCF_STATE_OFFLINE) },
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby { "from-offline", SCF_TRANS(SCF_STATE_OFFLINE, 0) },
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby { "to-disabled", SCF_TRANS(0, SCF_STATE_DISABLED) },
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby { "from-disabled", SCF_TRANS(SCF_STATE_DISABLED, 0) },
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby { "to-online", SCF_TRANS(0, SCF_STATE_ONLINE) },
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby { "from-online", SCF_TRANS(SCF_STATE_ONLINE, 0) },
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby { "to-degraded", SCF_TRANS(0, SCF_STATE_DEGRADED) },
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby { "from-degraded", SCF_TRANS(SCF_STATE_DEGRADED, 0) },
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby { NULL, 0 }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby};
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby/*
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * Check if class matches or is a subclass of SCF_SVC_TRANSITION_CLASS
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby *
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * returns 1, otherwise return 0
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby */
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltbystatic boolean_t
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltbyis_svc_stn(const char *class)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby{
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby int n = strlen(SCF_SVC_TRANSITION_CLASS);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (class && strncmp(class, SCF_SVC_TRANSITION_CLASS, n) == 0)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (class[n] == '\0' || class[n] == '.')
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (1);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (0);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby}
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby/*
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * Return the len of the base class. For instance, "class.class1.class2.*"
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * will return the length of "class.class1.class2"
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * This function does not check if the class or base class is valid.
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * A class such as "class.class1....****" is not valid but will return the
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * length of "class.class1....***"
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby */
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltbystatic size_t
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltbybase_class_len(const char *c)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby{
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby const char *p;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby size_t n;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if ((n = strlen(c)) == 0)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (0);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby p = c + n;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby /* get rid of any trailing asterisk */
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (*--p == '*')
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby n--;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby /* make sure the class doesn't end in '.' */
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby while (p >= c && *--p == '.')
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby n--;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (n);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby}
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby/*
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * Allocates and builds the pgname for an FMA dotted class.
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * The pgname will be of the form "class.class1.class2,SCF_NOTIFY_PG_POSTFIX"
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby *
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * NULL on error
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby */
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltbystatic char *
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltbyclass_to_pgname(const char *class)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby{
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby size_t n;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby ssize_t sz = scf_limit(SCF_LIMIT_MAX_NAME_LENGTH) + 1;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby char *pgname = NULL;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby n = base_class_len(class);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (n == 0) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby (void) scf_set_error(SCF_ERROR_INVALID_ARGUMENT);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (NULL);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if ((pgname = malloc(sz)) == NULL) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby (void) scf_set_error(SCF_ERROR_NO_MEMORY);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby goto error;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (snprintf(pgname, sz, "%.*s,%s", (int)n, class,
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby SCF_NOTIFY_PG_POSTFIX) >= sz) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby (void) scf_set_error(SCF_ERROR_INVALID_ARGUMENT);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby goto error;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (pgname);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltbyerror:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby free(pgname);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby pgname = NULL;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (pgname);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby}
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby/*
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * Get the pg from the running snapshot of the instance (composed or not)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby */
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltbystatic int
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltbyget_pg(scf_service_t *s, scf_instance_t *i, const char *n,
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby scf_propertygroup_t *pg, int composed)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby{
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby scf_handle_t *h = scf_instance_handle(i);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby scf_error_t scf_e = scf_error();
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby scf_snapshot_t *snap = scf_snapshot_create(h);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby scf_snaplevel_t *slvl = scf_snaplevel_create(h);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby int r = -1;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (h == NULL) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby /*
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * Use the error stored in scf_e
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby */
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby (void) scf_set_error(scf_e);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby goto out;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (s == NULL) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (snap == NULL || slvl == NULL)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby goto out;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (scf_instance_get_snapshot(i, "running", snap) != 0)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby goto out;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (composed) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (scf_instance_get_pg_composed(i, snap, n, pg) != 0)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby goto out;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby } else {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (scf_snapshot_get_base_snaplevel(snap, slvl) != 0 ||
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby scf_snaplevel_get_pg(slvl, n, pg) != 0)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby goto out;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby } else {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (scf_service_get_pg(s, n, pg) != 0)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby goto out;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby r = 0;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltbyout:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby scf_snaplevel_destroy(slvl);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby scf_snapshot_destroy(snap);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (r);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby}
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby/*
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * Add a pg if it does not exist, or get it if it exists.
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * It operates on the instance if the service parameter is NULL.
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby *
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * returns 0 on success or -1 on failure
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby */
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltbystatic int
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltbyget_or_add_pg(scf_service_t *s, scf_instance_t *i, const char *n, const char *t,
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby uint32_t flags, scf_propertygroup_t *pg)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby{
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby int r;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (s == NULL)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby r = scf_instance_add_pg(i, n, t, flags, pg);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby else
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby r = scf_service_add_pg(s, n, t, flags, pg);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (r == 0)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (0);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby else if (scf_error() != SCF_ERROR_EXISTS)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (-1);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (s == NULL)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby r = scf_instance_get_pg(i, n, pg);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby else
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby r = scf_service_get_pg(s, n, pg);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (r);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby}
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby/*
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * Delete the property group form the instance or service.
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * If service is NULL, use instance, otherwise use only the service.
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby *
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * Return SCF_SUCCESS or SCF_FAILED on
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_BACKEND_ACCESS
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_BACKEND_READONLY
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_CONNECTION_BROKEN
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_DELETED
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_HANDLE_MISMATCH
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_INTERNAL
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_INVALID_ARGUMENT
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_NO_RESOURCES
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_NOT_BOUND
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_NOT_FOUND
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_NOT_SET
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_PERMISSION_DENIED
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby */
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltbystatic int
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltbydel_pg(scf_service_t *s, scf_instance_t *i, const char *n,
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby scf_propertygroup_t *pg)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby{
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if ((s == NULL ? scf_instance_get_pg(i, n, pg) :
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby scf_service_get_pg(s, n, pg)) != SCF_SUCCESS)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (scf_error() == SCF_ERROR_NOT_FOUND)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (SCF_SUCCESS);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby else
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (SCF_FAILED);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (scf_pg_delete(pg) != SCF_SUCCESS)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (scf_error() == SCF_ERROR_DELETED)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (SCF_SUCCESS);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby else
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (SCF_FAILED);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (SCF_SUCCESS);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby}
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltbystatic scf_type_t
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltbyget_scf_type(nvpair_t *p)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby{
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby switch (nvpair_type(p)) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby case DATA_TYPE_BOOLEAN:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby case DATA_TYPE_BOOLEAN_VALUE:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby case DATA_TYPE_BOOLEAN_ARRAY:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (SCF_TYPE_BOOLEAN);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby case DATA_TYPE_BYTE:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby case DATA_TYPE_UINT8:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby case DATA_TYPE_UINT16:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby case DATA_TYPE_UINT32:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby case DATA_TYPE_UINT64:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby case DATA_TYPE_BYTE_ARRAY:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby case DATA_TYPE_UINT8_ARRAY:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby case DATA_TYPE_UINT16_ARRAY:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby case DATA_TYPE_UINT32_ARRAY:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby case DATA_TYPE_UINT64_ARRAY:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (SCF_TYPE_COUNT);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby case DATA_TYPE_INT8:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby case DATA_TYPE_INT16:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby case DATA_TYPE_INT32:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby case DATA_TYPE_INT64:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby case DATA_TYPE_INT8_ARRAY:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby case DATA_TYPE_INT16_ARRAY:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby case DATA_TYPE_INT32_ARRAY:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby case DATA_TYPE_INT64_ARRAY:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (SCF_TYPE_INTEGER);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby case DATA_TYPE_STRING:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby case DATA_TYPE_STRING_ARRAY:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (SCF_TYPE_ASTRING);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby default:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (SCF_TYPE_INVALID);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby}
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltbystatic int
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltbyadd_entry(scf_transaction_entry_t *te, scf_value_t *val)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby{
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (scf_entry_add_value(te, val) != 0) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby scf_value_destroy(val);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (SCF_FAILED);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (SCF_SUCCESS);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby}
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltbystatic int
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltbyadd_boolean_entry(scf_handle_t *h, scf_transaction_entry_t *te, uint8_t v)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby{
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby scf_value_t *val = scf_value_create(h);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (val == NULL)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (SCF_FAILED);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby scf_value_set_boolean(val, v);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (add_entry(te, val));
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby}
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltbystatic int
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltbyadd_count_entry(scf_handle_t *h, scf_transaction_entry_t *te, uint64_t v)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby{
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby scf_value_t *val = scf_value_create(h);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (val == NULL)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (SCF_FAILED);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby scf_value_set_count(val, v);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (add_entry(te, val));
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby}
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltbystatic int
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltbyadd_integer_entry(scf_handle_t *h, scf_transaction_entry_t *te, int64_t v)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby{
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby scf_value_t *val = scf_value_create(h);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (val == NULL)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (SCF_FAILED);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby scf_value_set_integer(val, v);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (add_entry(te, val));
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby}
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltbystatic int
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltbyadd_astring_entry(scf_handle_t *h, scf_transaction_entry_t *te, char *s)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby{
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby scf_value_t *val = scf_value_create(h);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (val == NULL)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (SCF_FAILED);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (scf_value_set_astring(val, s) != 0) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby scf_value_destroy(val);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (SCF_FAILED);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (add_entry(te, val));
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby}
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltbystatic int
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltbyget_nvpair_vals(scf_handle_t *h, scf_transaction_entry_t *te, nvpair_t *p)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby{
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby scf_value_t *val = scf_value_create(h);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby uint_t n = 1;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby int i;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (val == NULL)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (SCF_FAILED);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby switch (nvpair_type(p)) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby case DATA_TYPE_BOOLEAN:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (add_boolean_entry(h, te, 1));
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby case DATA_TYPE_BOOLEAN_VALUE:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby boolean_t v;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby (void) nvpair_value_boolean_value(p, &v);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (add_boolean_entry(h, te, (uint8_t)v));
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby case DATA_TYPE_BOOLEAN_ARRAY:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby boolean_t *v;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby (void) nvpair_value_boolean_array(p, &v, &n);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby for (i = 0; i < n; ++i) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (add_boolean_entry(h, te, (uint8_t)v[i]) !=
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby SCF_SUCCESS)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (SCF_FAILED);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (SCF_SUCCESS);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby case DATA_TYPE_BYTE:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby uchar_t v;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby (void) nvpair_value_byte(p, &v);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (add_count_entry(h, te, v));
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby case DATA_TYPE_UINT8:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby uint8_t v;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby (void) nvpair_value_uint8(p, &v);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (add_count_entry(h, te, v));
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby case DATA_TYPE_UINT16:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby uint16_t v;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby (void) nvpair_value_uint16(p, &v);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (add_count_entry(h, te, v));
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby case DATA_TYPE_UINT32:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby uint32_t v;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby (void) nvpair_value_uint32(p, &v);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (add_count_entry(h, te, v));
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby case DATA_TYPE_UINT64:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby uint64_t v;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby (void) nvpair_value_uint64(p, &v);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (add_count_entry(h, te, v));
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby case DATA_TYPE_BYTE_ARRAY:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby uchar_t *v;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby (void) nvpair_value_byte_array(p, &v, &n);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby for (i = 0; i < n; ++i) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (add_count_entry(h, te, v[i]) != SCF_SUCCESS)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (SCF_FAILED);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (SCF_SUCCESS);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby case DATA_TYPE_UINT8_ARRAY:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby uint8_t *v;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby (void) nvpair_value_uint8_array(p, &v, &n);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby for (i = 0; i < n; ++i) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (add_count_entry(h, te, v[i]) != SCF_SUCCESS)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (SCF_FAILED);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (SCF_SUCCESS);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby case DATA_TYPE_UINT16_ARRAY:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby uint16_t *v;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby (void) nvpair_value_uint16_array(p, &v, &n);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby for (i = 0; i < n; ++i) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (add_count_entry(h, te, v[i]) != SCF_SUCCESS)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (SCF_FAILED);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (SCF_SUCCESS);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby case DATA_TYPE_UINT32_ARRAY:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby uint32_t *v;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby (void) nvpair_value_uint32_array(p, &v, &n);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby for (i = 0; i < n; ++i) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (add_count_entry(h, te, v[i]) != SCF_SUCCESS)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (SCF_FAILED);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (SCF_SUCCESS);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby case DATA_TYPE_UINT64_ARRAY:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby uint64_t *v;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby (void) nvpair_value_uint64_array(p, &v, &n);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby for (i = 0; i < n; ++i) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (add_count_entry(h, te, v[i]) != SCF_SUCCESS)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (SCF_FAILED);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (SCF_SUCCESS);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby case DATA_TYPE_INT8:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby int8_t v;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby (void) nvpair_value_int8(p, &v);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (add_integer_entry(h, te, v));
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby case DATA_TYPE_INT16:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby int16_t v;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby (void) nvpair_value_int16(p, &v);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (add_integer_entry(h, te, v));
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby case DATA_TYPE_INT32:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby int32_t v;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby (void) nvpair_value_int32(p, &v);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (add_integer_entry(h, te, v));
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby case DATA_TYPE_INT64:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby int64_t v;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby (void) nvpair_value_int64(p, &v);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (add_integer_entry(h, te, v));
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby case DATA_TYPE_INT8_ARRAY:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby int8_t *v;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby (void) nvpair_value_int8_array(p, &v, &n);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby for (i = 0; i < n; ++i) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (add_integer_entry(h, te, v[i]) !=
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby SCF_SUCCESS)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (SCF_FAILED);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (SCF_SUCCESS);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby case DATA_TYPE_INT16_ARRAY:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby int16_t *v;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby (void) nvpair_value_int16_array(p, &v, &n);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby for (i = 0; i < n; ++i) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (add_integer_entry(h, te, v[i]) !=
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby SCF_SUCCESS)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (SCF_FAILED);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (SCF_SUCCESS);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby case DATA_TYPE_INT32_ARRAY:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby int32_t *v;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby (void) nvpair_value_int32_array(p, &v, &n);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby for (i = 0; i < n; ++i) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (add_integer_entry(h, te, v[i]) !=
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby SCF_SUCCESS)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (SCF_FAILED);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (SCF_SUCCESS);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby case DATA_TYPE_INT64_ARRAY:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby int64_t *v;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby (void) nvpair_value_int64_array(p, &v, &n);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby for (i = 0; i < n; ++i) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (add_integer_entry(h, te, v[i]) !=
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby SCF_SUCCESS)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (SCF_FAILED);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (SCF_SUCCESS);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby case DATA_TYPE_STRING:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby char *str;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby (void) nvpair_value_string(p, &str);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (add_astring_entry(h, te, str));
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby case DATA_TYPE_STRING_ARRAY:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby char **v;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby (void) nvpair_value_string_array(p, &v, &n);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby for (i = 0; i < n; ++i) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (add_astring_entry(h, te, v[i]) !=
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby SCF_SUCCESS)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (SCF_FAILED);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (SCF_SUCCESS);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby default:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby (void) scf_set_error(SCF_ERROR_INVALID_ARGUMENT);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (SCF_FAILED);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby /*NOTREACHED*/
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby}
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby/*
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * Add new transaction entry to scf_transaction_t
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby *
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * Can fail with
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_BACKEND_ACCESS
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_CONNECTION_BROKEN
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_DELETED
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_INTERNAL
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_NO_RESOURCES
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_NOT_FOUND
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby */
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltbystatic int
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltbyprep_transaction(scf_transaction_t *tx, scf_transaction_entry_t *te,
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby const char *prop, scf_type_t type)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby{
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (scf_transaction_property_new(tx, te, prop, type) != SCF_SUCCESS &&
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby (scf_error() != SCF_ERROR_EXISTS ||
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby scf_transaction_property_change(tx, te, prop, type) !=
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby SCF_SUCCESS)) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (check_scf_error(scf_error(), errs_2)) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (SCF_FAILED);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (SCF_SUCCESS);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby}
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby/*
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * notify_set_params()
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * returns 0 on success or -1 on failure
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_BACKEND_ACCESS
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_BACKEND_READONLY
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_CONNECTION_BROKEN
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_DELETED
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_INTERNAL
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_INVALID_ARGUMENT
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_NO_MEMORY
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_NO_RESOURCES
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_NOT_FOUND
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_PERMISSION_DENIED
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby */
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltbystatic int
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltbynotify_set_params(scf_propertygroup_t *pg, nvlist_t *params)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby{
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby scf_handle_t *h = scf_pg_handle(pg);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby scf_error_t scf_e = scf_error();
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby scf_transaction_t *tx = scf_transaction_create(h);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby int bufsz = scf_limit(SCF_LIMIT_MAX_NAME_LENGTH) + 1;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby char *propname = malloc(bufsz);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby int r = -1;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby int err;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (h == NULL) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby /*
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * Use the error stored in scf_e
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby */
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby (void) scf_set_error(scf_e);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby goto cleanup;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (tx == NULL)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby goto cleanup;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (propname == NULL) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby (void) scf_set_error(SCF_ERROR_NO_MEMORY);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby goto cleanup;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby do {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby nvpair_t *nvp;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby /*
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * make sure we have the most recent version of the pg
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * start the transaction
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby */
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (scf_pg_update(pg) == SCF_FAILED ||
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby scf_transaction_start(tx, pg) != SCF_SUCCESS) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (check_scf_error(scf_error(), errs_2)) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby goto cleanup;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby for (nvp = nvlist_next_nvpair(params, NULL); nvp != NULL;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby nvp = nvlist_next_nvpair(params, nvp)) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby nvlist_t *m;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby nvpair_t *p;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby /* we ONLY take nvlists here */
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (nvpair_type(nvp) != DATA_TYPE_NVLIST) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby char *name = nvpair_name(nvp);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby /*
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * if this is output from
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * smf_notify_get_params() we want to skip
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * the tset value of the nvlist
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby */
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (strcmp(name, SCF_NOTIFY_NAME_TSET) == 0)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby continue;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby (void) scf_set_error(
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby SCF_ERROR_INVALID_ARGUMENT);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby goto cleanup;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (nvpair_value_nvlist(nvp, &m) != 0) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby (void) scf_set_error(
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby SCF_ERROR_INVALID_ARGUMENT);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby goto cleanup;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby /*
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * Traverse each mechanism list
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby */
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby for (p = nvlist_next_nvpair(m, NULL); p != NULL;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby p = nvlist_next_nvpair(m, p)) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby scf_transaction_entry_t *te =
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby scf_entry_create(h);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby /* map the nvpair type to scf type */
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby scf_type_t type = get_scf_type(p);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (te == NULL) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (scf_error() !=
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby SCF_ERROR_INVALID_ARGUMENT) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby scf_entry_destroy(te);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby goto cleanup;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby } else {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby assert(0);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby abort();
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (type == SCF_TYPE_INVALID) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby (void) scf_set_error(
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby SCF_ERROR_INVALID_ARGUMENT);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby scf_entry_destroy(te);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby goto cleanup;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (snprintf(propname, bufsz, "%s,%s",
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby nvpair_name(nvp), nvpair_name(p)) >=
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby bufsz) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby (void) scf_set_error(
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby SCF_ERROR_INVALID_ARGUMENT);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby scf_entry_destroy(te);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby goto cleanup;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (prep_transaction(tx, te, propname, type) !=
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby SCF_SUCCESS) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby scf_entry_destroy(te);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby goto cleanup;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (get_nvpair_vals(h, te, p) != SCF_SUCCESS) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (check_scf_error(scf_error(),
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby errs_2)) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby goto cleanup;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby err = scf_transaction_commit(tx);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby scf_transaction_destroy_children(tx);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby } while (err == 0);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (err == -1) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (check_scf_error(scf_error(), errs_2)) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby goto cleanup;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby r = 0;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltbycleanup:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby scf_transaction_destroy_children(tx);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby scf_transaction_destroy(tx);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby free(propname);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (r);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby}
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby/*
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * Decode fmri. Populates service OR instance depending on which one is an
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * exact match to the fmri parameter.
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby *
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * The function destroys and sets the unused entity (service or instance) to
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * NULL.
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby *
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * return SCF_SUCCESS or SCF_FAILED on
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_BACKEND_ACCESS
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_CONNECTION_BROKEN
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_CONSTRAINT_VIOLATED
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_DELETED
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_HANDLE_MISMATCH
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_INTERNAL
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_INVALID_ARGUMENT
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_NO_RESOURCES
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_NOT_BOUND
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_NOT_FOUND
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_NOT_SET
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby */
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltbystatic int
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltbydecode_fmri(const char *fmri, scf_handle_t *h, scf_service_t **s,
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby scf_instance_t **i)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby{
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (scf_handle_decode_fmri(h, fmri, NULL, *s, NULL, NULL, NULL,
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby SCF_DECODE_FMRI_EXACT) != SCF_SUCCESS) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (scf_error() == SCF_ERROR_CONSTRAINT_VIOLATED) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby scf_service_destroy(*s);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby *s = NULL;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby } else {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (SCF_FAILED);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (*s == NULL)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (scf_handle_decode_fmri(h, fmri, NULL, NULL, *i,
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby NULL, NULL, SCF_DECODE_FMRI_EXACT) != SCF_SUCCESS) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (SCF_FAILED);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (SCF_SUCCESS);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby}
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby/*
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * Return size in bytes for an SCF_TYPE_*. Not all libscf types are supported
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby */
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltbystatic int
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltbyget_type_size(scf_type_t t)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby{
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby switch (t) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby case SCF_TYPE_BOOLEAN:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (sizeof (uint8_t));
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby case SCF_TYPE_COUNT:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (sizeof (uint64_t));
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby case SCF_TYPE_INTEGER:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (sizeof (int64_t));
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby case SCF_TYPE_ASTRING:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby case SCF_TYPE_USTRING:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (sizeof (void *));
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby default:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (-1);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby /*NOTREACHED*/
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby}
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby/*
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * Return a pointer to the array of values according to its type
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby */
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltbystatic void **
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltbyget_v_pointer(scf_values_t *v)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby{
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby switch (v->value_type) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby case SCF_TYPE_BOOLEAN:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return ((void **)&v->values.v_boolean);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby case SCF_TYPE_COUNT:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return ((void **)&v->values.v_count);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby case SCF_TYPE_INTEGER:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return ((void **)&v->values.v_integer);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby case SCF_TYPE_ASTRING:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return ((void **)&v->values.v_astring);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby case SCF_TYPE_USTRING:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return ((void **)&v->values.v_ustring);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby default:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (NULL);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby /*NOTREACHED*/
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby}
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby/*
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * Populate scf_values_t value array at position c.
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby */
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltbystatic int
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltbyget_value(scf_value_t *val, scf_values_t *v, int c, char *buf, int sz)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby{
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby switch (v->value_type) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby case SCF_TYPE_BOOLEAN:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (scf_value_get_boolean(val, v->values.v_boolean + c));
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby case SCF_TYPE_COUNT:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (scf_value_get_count(val, v->values.v_count + c));
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby case SCF_TYPE_INTEGER:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (scf_value_get_integer(val, v->values.v_integer + c));
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby case SCF_TYPE_ASTRING:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (scf_value_get_astring(val, buf, sz) < 0 ||
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby (v->values.v_astring[c] = strdup(buf)) == NULL) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby (void) scf_set_error(SCF_ERROR_NO_MEMORY);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (-1);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (0);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby case SCF_TYPE_USTRING:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (scf_value_get_ustring(val, buf, sz) < 0 ||
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby (v->values.v_ustring[c] = strdup(buf)) == NULL) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby (void) scf_set_error(SCF_ERROR_NO_MEMORY);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (-1);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (0);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby default:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (-1);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby /*NOTREACHED*/
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby}
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby/*
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * Populate scf_values_t structure with values from prop
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby */
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltbystatic int
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltbyvalues_get(scf_property_t *prop, scf_values_t *v)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby{
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby scf_handle_t *h = scf_property_handle(prop);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby scf_error_t scf_e = scf_error();
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby scf_value_t *val = scf_value_create(h);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby scf_iter_t *it = scf_iter_create(h);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby scf_type_t type = SCF_TYPE_INVALID;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby ssize_t sz = scf_limit(SCF_LIMIT_MAX_VALUE_LENGTH) + 1;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby char *buf = malloc(sz);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby void **p;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby int err, elem_sz, count, cursz;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby int r = SCF_FAILED;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby assert(v != NULL);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby assert(v->reserved == NULL);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (buf == NULL) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby (void) scf_set_error(SCF_ERROR_NO_MEMORY);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby goto cleanup;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (h == NULL) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby /*
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * Use the error stored in scf_e
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby */
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby (void) scf_set_error(scf_e);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby goto cleanup;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (val == NULL || it == NULL)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby goto cleanup;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (scf_property_type(prop, &type) != SCF_SUCCESS)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby goto cleanup;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (scf_property_is_type(prop, v->value_type) != SCF_SUCCESS)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby goto error;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby elem_sz = get_type_size(type);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby assert(elem_sz > 0);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby p = get_v_pointer(v);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby assert(p != NULL);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby cursz = count = v->value_count;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (scf_iter_property_values(it, prop) != 0) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby goto error;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby while ((err = scf_iter_next_value(it, val)) == 1) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (count + 1 >= cursz) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby void *tmp;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby /* set initial size or double it */
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby cursz = cursz ? 2 * cursz : 8;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if ((tmp = realloc(*p, cursz * elem_sz)) == NULL) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby (void) scf_set_error(SCF_ERROR_NO_MEMORY);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby goto error;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby *p = tmp;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (get_value(val, v, count, buf, sz) != 0)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby goto error;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby count++;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby v->value_count = count;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (err != 0)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby goto error;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby r = SCF_SUCCESS;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby goto cleanup;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltbyerror:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby v->value_count = count;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby scf_values_destroy(v);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltbycleanup:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby free(buf);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby scf_iter_destroy(it);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby scf_value_destroy(val);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (r);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby}
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby/*
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * Add values from property p to existing nvlist_t nvl. The data type in the
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * nvlist is inferred from the scf_type_t of the property.
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby *
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * Returns SCF_SUCCESS or SCF_FAILED on
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_CONNECTION_BROKEN
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_DELETED
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_HANDLE_DESTROYED
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_HANDLE_MISMATCH
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_INVALID_ARGUMENT
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_NO_MEMORY
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_NO_RESOURCES
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_NOT_BOUND
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_NOT_SET
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_PERMISSION_DENIED
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_TYPE_MISMATCH
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby */
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltbystatic int
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltbyadd_prop_to_nvlist(scf_property_t *p, const char *pname, nvlist_t *nvl,
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby int array)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby{
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby scf_values_t vals = { 0 };
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby scf_type_t type, base_type;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby int r = SCF_FAILED;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby int err = 0;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (p == NULL || pname == NULL || *pname == '\0' || nvl == NULL) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby (void) scf_set_error(SCF_ERROR_INVALID_ARGUMENT);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (r);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (scf_property_type(p, &type) != 0)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby goto cleanup;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby /*
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * scf_values_t does not support subtypes of SCF_TYPE_USTRING,
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * mapping them all to SCF_TYPE_USTRING
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby */
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby base_type = scf_true_base_type(type);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (base_type == SCF_TYPE_ASTRING && type != SCF_TYPE_ASTRING)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby type = SCF_TYPE_USTRING;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby vals.value_type = type;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (values_get(p, &vals) != SCF_SUCCESS) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (scf_error() == SCF_ERROR_INVALID_ARGUMENT) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby assert(0);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby abort();
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby goto cleanup;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby switch (vals.value_type) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby case SCF_TYPE_BOOLEAN:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby boolean_t *v;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby int i;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby int n = vals.value_count;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby v = calloc(n, sizeof (boolean_t));
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (v == NULL) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby (void) scf_set_error(SCF_ERROR_NO_MEMORY);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby goto cleanup;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby for (i = 0; i < n; ++i)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby v[i] = (boolean_t)vals.values.v_boolean[i];
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (n == 1 && !array)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby err = nvlist_add_boolean_value(nvl, pname, *v);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby else
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby err = nvlist_add_boolean_array(nvl, pname,
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby v, n);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (err != 0) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby free(v);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby goto cleanup;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby free(v);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby break;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby case SCF_TYPE_COUNT:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (vals.value_count == 1 && !array)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby err = nvlist_add_uint64(nvl, pname,
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby *vals.values.v_count);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby else
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby err = nvlist_add_uint64_array(nvl, pname,
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby vals.values.v_count, vals.value_count);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (err != 0)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby goto cleanup;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby break;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby case SCF_TYPE_INTEGER:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (vals.value_count == 1 && !array)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby err = nvlist_add_int64(nvl, pname,
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby *vals.values.v_integer);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby else
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby err = nvlist_add_int64_array(nvl, pname,
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby vals.values.v_integer, vals.value_count);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (err != 0)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby goto cleanup;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby break;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby case SCF_TYPE_ASTRING:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (vals.value_count == 1 && !array)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby err = nvlist_add_string(nvl, pname,
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby *vals.values.v_astring);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby else
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby err = nvlist_add_string_array(nvl, pname,
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby vals.values.v_astring, vals.value_count);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (err != 0)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby goto cleanup;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby break;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby default:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby (void) scf_set_error(SCF_ERROR_INVALID_ARGUMENT);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby goto cleanup;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby r = SCF_SUCCESS;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltbycleanup:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby scf_values_destroy(&vals);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby switch (err) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby case 0:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby break;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby case EINVAL:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby (void) scf_set_error(SCF_ERROR_INVALID_ARGUMENT);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby break;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby case ENOMEM:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby (void) scf_set_error(SCF_ERROR_NO_MEMORY);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby break;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby default:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby /* we should *never* get here */
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby abort();
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (r);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby}
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby/*
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * Parse property name "mechanism,parameter" into separate mechanism
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * and parameter. *mech must be freed by caller. *val points into
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * *mech and must not be freed.
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby *
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * Returns SCF_SUCCESS or SCF_FAILED on
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_NO_MEMORY
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_NOT_FOUND
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby */
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltbystatic int
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltbyget_mech_name(const char *name, char **mech, char **val)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby{
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby char *p;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby char *m;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if ((m = strdup(name)) == NULL) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby (void) scf_set_error(SCF_ERROR_NO_MEMORY);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (SCF_FAILED);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if ((p = strchr(m, ',')) == NULL) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby free(m);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby (void) scf_set_error(SCF_ERROR_NOT_FOUND);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (SCF_FAILED);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby *p = '\0';
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby *val = p + 1;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby *mech = m;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (SCF_SUCCESS);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby}
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby/*
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * Return the number of transitions in a transition set.
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * If the transition set is invalid, it returns zero.
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby */
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltbystatic uint_t
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltbynum_of_transitions(int32_t t)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby{
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby int i;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby int n = 0;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (SCF_TRANS_VALID(t)) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby for (i = 0x1; i < SCF_STATE_ALL; i <<= 1) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (i & t)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby ++n;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (SCF_TRANS_INITIAL_STATE(t) & i)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby ++n;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (n);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby}
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby/*
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * Return the SCF_STATE_* macro value for the state in the FMA classes for
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SMF state transitions. They are of type:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_SVC_TRANSITION_CLASS.<state>
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * ireport.os.smf.state-transition.<state>
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby */
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltbystatic int32_t
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltbyclass_to_transition(const char *c)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby{
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby const char *p;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby int r = 0;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby size_t n;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (!is_svc_stn(c)) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (0);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby /*
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * if we get here, c is SCF_SVC_TRANSITION_CLASS or longer
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby */
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby p = c + strlen(SCF_SVC_TRANSITION_CLASS);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (*p == '.')
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby ++p;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby else
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (0);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if ((n = base_class_len(p)) == 0)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (0);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if ((r = state_from_string(p, n)) == -1)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby r = 0;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (r);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby}
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby/*
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * return SCF_SUCCESS or SCF_FAILED on
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_BACKEND_ACCESS
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_BACKEND_READONLY
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_CONNECTION_BROKEN
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_DELETED
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_INTERNAL
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_INVALID_ARGUMENT
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_NO_MEMORY
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_NO_RESOURCES
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_NOT_FOUND
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_PERMISSION_DENIED
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby */
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltbyint
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltbysmf_notify_set_params(const char *class, nvlist_t *attr)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby{
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby uint32_t ver;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby int32_t tset;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby scf_handle_t *h = _scf_handle_create_and_bind(SCF_VERSION);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby scf_error_t scf_e = scf_error();
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby scf_service_t *s = scf_service_create(h);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby scf_instance_t *i = scf_instance_create(h);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby scf_propertygroup_t *pg = scf_pg_create(h);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby nvlist_t *params = NULL;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby char *fmri = (char *)SCF_NOTIFY_PARAMS_INST;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby char *pgname = NULL;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby int r = SCF_FAILED;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby boolean_t is_stn;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby int j;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby assert(class != NULL);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (h == NULL) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby /*
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * use saved error if _scf_handle_create_and_bind() fails
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby */
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby (void) scf_set_error(scf_e);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby goto cleanup;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (i == NULL || s == NULL || pg == NULL)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby goto cleanup;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby /* check version */
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (nvlist_lookup_uint32(attr, SCF_NOTIFY_NAME_VERSION, &ver) != 0 ||
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby ver != SCF_NOTIFY_PARAMS_VERSION) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby (void) scf_set_error(SCF_ERROR_INVALID_ARGUMENT);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby goto cleanup;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (nvlist_lookup_nvlist(attr, SCF_NOTIFY_PARAMS, &params) != 0) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby (void) scf_set_error(SCF_ERROR_INVALID_ARGUMENT);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby goto cleanup;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby is_stn = is_svc_stn(class);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby /* special case SMF state transition notification */
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (is_stn &&
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby (nvlist_lookup_string(attr, SCF_NOTIFY_NAME_FMRI, &fmri) != 0 ||
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby nvlist_lookup_int32(attr, SCF_NOTIFY_NAME_TSET, &tset) != 0 ||
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby !SCF_TRANS_VALID(tset))) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby (void) scf_set_error(SCF_ERROR_INVALID_ARGUMENT);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby goto cleanup;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (decode_fmri(fmri, h, &s, &i) != SCF_SUCCESS)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (scf_error() == SCF_ERROR_CONSTRAINT_VIOLATED) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby (void) scf_set_error(SCF_ERROR_INVALID_ARGUMENT);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby } else if (check_scf_error(scf_error(), errs_1)) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby goto cleanup;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (is_stn) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby tset |= class_to_transition(class);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (!SCF_TRANS_VALID(tset)) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby (void) scf_set_error(SCF_ERROR_INVALID_ARGUMENT);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby goto cleanup;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby for (j = 0; st_pgnames[j].st_pgname != NULL; ++j) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby /* if this transition is not in the tset, continue */
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (!(tset & st_pgnames[j].st_state))
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby continue;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (get_or_add_pg(s, i, st_pgnames[j].st_pgname,
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby SCF_NOTIFY_PARAMS_PG_TYPE, 0, pg) != 0 &&
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby check_scf_error(scf_error(), errs_2))
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby goto cleanup;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (notify_set_params(pg, params) != 0)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby goto cleanup;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (s == NULL) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby /* We only need to refresh the instance */
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (_smf_refresh_instance_i(i) != 0 &&
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby check_scf_error(scf_error(), errs_1))
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby goto cleanup;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby } else {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby /* We have to refresh all instances in the service */
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (_smf_refresh_all_instances(s) != 0 &&
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby check_scf_error(scf_error(), errs_1))
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby goto cleanup;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby } else {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if ((pgname = class_to_pgname(class)) == NULL)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby goto cleanup;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (get_or_add_pg(s, i, pgname, SCF_GROUP_APPLICATION, 0, pg) !=
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby 0) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (check_scf_error(scf_error(), errs_2)) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby goto cleanup;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (notify_set_params(pg, params) != 0) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby goto cleanup;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (_smf_refresh_instance_i(i) != 0 &&
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby check_scf_error(scf_error(), errs_1))
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby goto cleanup;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby r = SCF_SUCCESS;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltbycleanup:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby scf_instance_destroy(i);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby scf_service_destroy(s);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby scf_pg_destroy(pg);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby scf_handle_destroy(h);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby free(pgname);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (r);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby}
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby/*
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * returns SCF_SUCCESS or SCF_FAILED on
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_CONNECTION_BROKEN
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_DELETED
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_HANDLE_DESTROYED
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_HANDLE_MISMATCH
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_INVALID_ARGUMENT
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_NO_MEMORY
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_NO_RESOURCES
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_NOT_BOUND
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_NOT_FOUND
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_NOT_SET
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_PERMISSION_DENIED
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby */
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltbyint
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby_scf_notify_get_params(scf_propertygroup_t *pg, nvlist_t *params)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby{
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby scf_handle_t *h = scf_pg_handle(pg);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby scf_error_t scf_e = scf_error();
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby scf_property_t *p = scf_property_create(h);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby scf_iter_t *it = scf_iter_create(h);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby int sz = scf_limit(SCF_LIMIT_MAX_NAME_LENGTH) + 1;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby char *name = malloc(sz);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby int r = SCF_FAILED;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby int err;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (h == NULL) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby /*
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * Use the error stored in scf_e
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby */
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby (void) scf_set_error(scf_e);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby goto cleanup;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (it == NULL || p == NULL)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby goto cleanup;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (name == NULL) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby (void) scf_set_error(SCF_ERROR_NO_MEMORY);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby goto cleanup;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (scf_iter_pg_properties(it, pg) != SCF_SUCCESS) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (check_scf_error(scf_error(), errs_1)) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby goto cleanup;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby while ((err = scf_iter_next_property(it, p)) == 1) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby nvlist_t *nvl;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby int nvl_new = 0;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby char *mech;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby char *val;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (scf_property_get_name(p, name, sz) == SCF_FAILED) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (check_scf_error(scf_error(), errs_1)) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby goto cleanup;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (get_mech_name(name, &mech, &val) != SCF_SUCCESS) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (scf_error() == SCF_ERROR_NOT_FOUND)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby continue;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby goto cleanup;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (nvlist_lookup_nvlist(params, mech, &nvl) != 0) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (nvlist_alloc(&nvl, NV_UNIQUE_NAME, 0) != 0) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby (void) scf_set_error(SCF_ERROR_NO_MEMORY);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby free(mech);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby goto cleanup;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby nvl_new = 1;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (add_prop_to_nvlist(p, val, nvl, 1) != SCF_SUCCESS) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (check_scf_error(scf_error(), errs_2)) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby free(mech);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby nvlist_free(nvl);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby goto cleanup;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (nvl_new) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (nvlist_add_nvlist(params, mech, nvl) != 0) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby (void) scf_set_error(SCF_ERROR_NO_MEMORY);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby free(mech);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby nvlist_free(nvl);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby goto cleanup;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby nvlist_free(nvl);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby free(mech);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (err == 0) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby r = SCF_SUCCESS;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby } else if (check_scf_error(scf_error(), errs_2)) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby goto cleanup;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltbycleanup:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby scf_iter_destroy(it);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby scf_property_destroy(p);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby free(name);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (r);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby}
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby/*
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * Look up pg containing an SMF state transition parameters. If it cannot find
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * the pg in the composed view of the instance, it will look in the global
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * instance for the system wide parameters.
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * Instance, service and global instance have to be passed by caller.
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby *
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * returns SCF_SUCCESS or SCF_FAILED on
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_BACKEND_ACCESS
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_CONNECTION_BROKEN
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_DELETED
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_HANDLE_DESTROYED
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_HANDLE_MISMATCH
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_INTERNAL
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_INVALID_ARGUMENT
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_NO_MEMORY
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_NO_RESOURCES
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_NOT_BOUND
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_NOT_FOUND
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_NOT_SET
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby */
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltbystatic int
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltbyget_stn_pg(scf_service_t *s, scf_instance_t *i, scf_instance_t *g,
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby const char *pgname, scf_propertygroup_t *pg)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby{
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (get_pg(s, i, pgname, pg, 1) == 0 ||
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby scf_error() == SCF_ERROR_NOT_FOUND &&
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby get_pg(NULL, g, pgname, pg, 0) == 0)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (SCF_SUCCESS);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (SCF_FAILED);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby}
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby/*
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * Populates nvlist_t params with the source fmri for the pg
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby *
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * return SCF_SUCCESS or SCF_FAILED on
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_DELETED
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_CONNECTION_BROKEN
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_NO_MEMORY
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby */
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltbystatic int
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltbyget_pg_source(scf_propertygroup_t *pg, nvlist_t *params)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby{
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby size_t sz = scf_limit(SCF_LIMIT_MAX_FMRI_LENGTH) + 1;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby char *fmri = malloc(sz);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby char *p;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby int r = SCF_FAILED;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (fmri == NULL) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby (void) scf_set_error(SCF_ERROR_NO_MEMORY);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby goto out;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (scf_pg_to_fmri(pg, fmri, sz) == -1) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (check_scf_error(scf_error(), errs_1)) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby goto out;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby /* get rid of the properties part of the pg source */
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if ((p = strrchr(fmri, ':')) != NULL && p > fmri)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby *(p - 1) = '\0';
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (nvlist_add_string(params, SCF_NOTIFY_PARAMS_SOURCE_NAME, fmri) !=
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby 0) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby (void) scf_set_error(SCF_ERROR_NO_MEMORY);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby goto out;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby r = SCF_SUCCESS;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltbyout:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby free(fmri);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (r);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby}
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby/*
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * Specialized function to get SMF state transition notification parameters
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby *
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * return SCF_SUCCESS or SCF_FAILED on
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_BACKEND_ACCESS
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_CONNECTION_BROKEN
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_DELETED
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_INTERNAL
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_INVALID_ARGUMENT
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_NO_MEMORY
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_NO_RESOURCES
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_NOT_FOUND
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_PERMISSION_DENIED
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby */
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltbyint
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby_scf_get_svc_notify_params(const char *fmri, nvlist_t *nvl, int32_t tset,
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby int getsource, int getglobal)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby{
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby scf_handle_t *h = _scf_handle_create_and_bind(SCF_VERSION);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby scf_error_t scf_e = scf_error();
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby scf_service_t *s = scf_service_create(h);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby scf_instance_t *i = scf_instance_create(h);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby scf_instance_t *g = scf_instance_create(h);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby scf_propertygroup_t *pg = scf_pg_create(h);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby int r = SCF_FAILED;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby nvlist_t **params = NULL;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby uint_t c, nvl_num = 0;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby int not_found = 1;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby int j;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby const char *pgname;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby assert(fmri != NULL && nvl != NULL);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (h == NULL) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby /*
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * use saved error if _scf_handle_create_and_bind() fails
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby */
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby (void) scf_set_error(scf_e);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby goto cleanup;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (s == NULL || i == NULL || g == NULL || pg == NULL)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby goto cleanup;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (decode_fmri(fmri, h, &s, &i) != SCF_SUCCESS ||
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby scf_handle_decode_fmri(h, SCF_INSTANCE_GLOBAL, NULL, NULL, g, NULL,
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby NULL, SCF_DECODE_FMRI_EXACT) != 0) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (scf_error() == SCF_ERROR_CONSTRAINT_VIOLATED) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby (void) scf_set_error(SCF_ERROR_INVALID_ARGUMENT);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby } else if (check_scf_error(scf_error(), errs_1)) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby goto cleanup;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby nvl_num = num_of_transitions(tset);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if ((params = calloc(nvl_num, sizeof (nvlist_t *))) == NULL) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby (void) scf_set_error(SCF_ERROR_NO_MEMORY);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby goto cleanup;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby for (c = 0; c < nvl_num; ++c)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (nvlist_alloc(params + c, NV_UNIQUE_NAME, 0) != 0) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby (void) scf_set_error(SCF_ERROR_NO_MEMORY);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby goto cleanup;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby for (c = 0, j = 0; st_pgnames[j].st_pgname != NULL; ++j) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby /* if this transition is not in the tset, continue */
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (!(tset & st_pgnames[j].st_state))
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby continue;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby assert(c < nvl_num);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby pgname = st_pgnames[j].st_pgname;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (nvlist_add_int32(params[c], SCF_NOTIFY_NAME_TSET,
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby st_pgnames[j].st_state) != 0) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby (void) scf_set_error(SCF_ERROR_NO_MEMORY);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby goto cleanup;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if ((getglobal ? get_stn_pg(s, i, g, pgname, pg) :
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby get_pg(s, i, pgname, pg, 1)) == SCF_SUCCESS) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby not_found = 0;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (_scf_notify_get_params(pg, params[c]) !=
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby SCF_SUCCESS)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby goto cleanup;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (getsource && get_pg_source(pg, params[c]) !=
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby SCF_SUCCESS)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby goto cleanup;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby } else if (scf_error() == SCF_ERROR_NOT_FOUND ||
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby scf_error() == SCF_ERROR_DELETED) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby /* keep driving */
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby /*EMPTY*/
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby } else if (check_scf_error(scf_error(), errs_1)) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby goto cleanup;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby ++c;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (not_found) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby (void) scf_set_error(SCF_ERROR_NOT_FOUND);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby goto cleanup;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby assert(c == nvl_num);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (nvlist_add_nvlist_array(nvl, SCF_NOTIFY_PARAMS, params, nvl_num) !=
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby 0 || nvlist_add_uint32(nvl, SCF_NOTIFY_NAME_VERSION,
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby SCF_NOTIFY_PARAMS_VERSION) != 0) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby (void) scf_set_error(SCF_ERROR_NO_MEMORY);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby goto cleanup;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby r = SCF_SUCCESS;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltbycleanup:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby scf_pg_destroy(pg);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby scf_instance_destroy(i);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby scf_instance_destroy(g);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby scf_service_destroy(s);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby scf_handle_destroy(h);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (params != NULL)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby for (c = 0; c < nvl_num; ++c)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby nvlist_free(params[c]);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby free(params);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (r);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby}
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby/*
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * Specialized function to get fma notification parameters
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby *
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * return SCF_SUCCESS or SCF_FAILED on
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_BACKEND_ACCESS
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_CONNECTION_BROKEN
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_DELETED
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_INTERNAL
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_INVALID_ARGUMENT
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_NO_MEMORY
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_NO_RESOURCES
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_NOT_FOUND
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_PERMISSION_DENIED
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby */
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltbyint
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby_scf_get_fma_notify_params(const char *class, nvlist_t *nvl, int getsource)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby{
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby scf_handle_t *h = _scf_handle_create_and_bind(SCF_VERSION);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby scf_error_t scf_e = scf_error();
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby scf_instance_t *i = scf_instance_create(h);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby scf_propertygroup_t *pg = scf_pg_create(h);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby int r = SCF_FAILED;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby nvlist_t *params = NULL;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby char *pgname = NULL;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (h == NULL) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby /*
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * use saved error if _scf_handle_create_and_bind() fails
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby */
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby (void) scf_set_error(scf_e);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby goto cleanup;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (i == NULL || pg == NULL)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby goto cleanup;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (scf_handle_decode_fmri(h, SCF_NOTIFY_PARAMS_INST, NULL, NULL, i,
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby NULL, NULL, SCF_DECODE_FMRI_EXACT) != SCF_SUCCESS) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (check_scf_error(scf_error(), errs_1)) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby goto cleanup;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if ((pgname = class_to_pgname(class)) == NULL)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby goto cleanup;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby while (get_pg(NULL, i, pgname, pg, 0) != 0) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (scf_error() == SCF_ERROR_NOT_FOUND) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby char *p = strrchr(pgname, '.');
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (p != NULL) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby *p = ',';
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby /*
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * since the resulting string is shorter,
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * there is no risk of buffer overflow
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby */
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby (void) strcpy(p + 1, SCF_NOTIFY_PG_POSTFIX);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby continue;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (check_scf_error(scf_error(), errs_1)) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby goto cleanup;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (nvlist_alloc(&params, NV_UNIQUE_NAME, 0) != 0) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby (void) scf_set_error(SCF_ERROR_NO_MEMORY);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby goto cleanup;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (_scf_notify_get_params(pg, params) != SCF_SUCCESS)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby goto cleanup;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (getsource && get_pg_source(pg, params) != SCF_SUCCESS)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby goto cleanup;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (nvlist_add_nvlist_array(nvl, SCF_NOTIFY_PARAMS, &params, 1) != 0 ||
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby nvlist_add_uint32(nvl, SCF_NOTIFY_NAME_VERSION,
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby SCF_NOTIFY_PARAMS_VERSION) != 0) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby (void) scf_set_error(SCF_ERROR_NO_MEMORY);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby goto cleanup;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby r = SCF_SUCCESS;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltbycleanup:
aab83bb83be7342f6cfccaed8d5fe0b2f404855dJosef 'Jeff' Sipek nvlist_free(params);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby scf_pg_destroy(pg);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby scf_instance_destroy(i);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby scf_handle_destroy(h);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby free(pgname);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (r);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby}
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby/*
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * Retrieve the notification parameters for the Event described in the
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * input nvlist_t nvl.
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * The function will allocate an nvlist_t to store the notification
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * parameters. The notification parameters in the output nvlist will have
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * the following format:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby *
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * version (uint32_t)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_NOTIFY_PARAMS (array of embedded nvlists)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * (start of notify-params[0])
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * tset (int32_t)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * <mechanism-name> (embedded nvlist)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * <parameter-name> <parameter-type>
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * ...
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * (end <mechanism-name>)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * ...
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * (end of notify-params[0])
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * ...
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby *
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * return SCF_SUCCESS or SCF_FAILED on
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_BACKEND_ACCESS
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_CONNECTION_BROKEN
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_DELETED
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_INTERNAL
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_INVALID_ARGUMENT
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_NO_MEMORY
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_NO_RESOURCES
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_NOT_FOUND
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_PERMISSION_DENIED
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby */
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltbyint
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltbysmf_notify_get_params(nvlist_t **params, nvlist_t *nvl)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby{
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby char *class;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby char *from; /* from state */
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby char *to; /* to state */
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby nvlist_t *attr;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby char *fmri;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby int32_t tset = 0;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby int r = SCF_FAILED;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (params == NULL || nvlist_lookup_string(nvl, "class", &class) != 0) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby (void) scf_set_error(SCF_ERROR_INVALID_ARGUMENT);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (r);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (nvlist_alloc(params, NV_UNIQUE_NAME, 0) != 0) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby (void) scf_set_error(SCF_ERROR_NO_MEMORY);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (r);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (is_svc_stn(class)) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (nvlist_lookup_nvlist(nvl, "attr", &attr) != 0 ||
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby nvlist_lookup_string(attr, "svc-string", &fmri) != 0 ||
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby nvlist_lookup_string(attr, "from-state", &from) != 0 ||
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby nvlist_lookup_string(attr, "to-state", &to) != 0) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby (void) scf_set_error(SCF_ERROR_INVALID_ARGUMENT);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby goto cleanup;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby tset = SCF_TRANS(smf_state_from_string(from),
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby smf_state_from_string(to));
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (!SCF_TRANS_VALID(tset)) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby (void) scf_set_error(SCF_ERROR_INVALID_ARGUMENT);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby goto cleanup;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby tset |= class_to_transition(class);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby r = _scf_get_svc_notify_params(fmri, *params, tset, 0, 1);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby } else {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby r = _scf_get_fma_notify_params(class, *params, 0);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltbycleanup:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (r == SCF_FAILED) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby nvlist_free(*params);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby *params = NULL;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (r);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby}
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby/*
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * return SCF_SUCCESS or SCF_FAILED on
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_BACKEND_ACCESS
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_BACKEND_READONLY
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_CONNECTION_BROKEN
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_DELETED
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_INTERNAL
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_INVALID_ARGUMENT
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_NO_MEMORY
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_NO_RESOURCES
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_NOT_FOUND
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * SCF_ERROR_PERMISSION_DENIED
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby */
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltbyint
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltbysmf_notify_del_params(const char *class, const char *fmri, int32_t tset)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby{
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby scf_handle_t *h = _scf_handle_create_and_bind(SCF_VERSION);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby scf_error_t scf_e = scf_error();
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby scf_service_t *s = scf_service_create(h);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby scf_instance_t *i = scf_instance_create(h);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby scf_propertygroup_t *pg = scf_pg_create(h);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby int r = SCF_FAILED;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby char *pgname = NULL;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby int j;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (class == NULL) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby (void) scf_set_error(SCF_ERROR_INVALID_ARGUMENT);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby goto cleanup;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (h == NULL) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby /*
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby * use saved error if _scf_handle_create_and_bind() fails
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby */
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby (void) scf_set_error(scf_e);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby goto cleanup;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (s == NULL || i == NULL || pg == NULL)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby goto cleanup;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (is_svc_stn(class)) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby tset |= class_to_transition(class);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (!SCF_TRANS_VALID(tset) || fmri == NULL) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby (void) scf_set_error(SCF_ERROR_INVALID_ARGUMENT);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby goto cleanup;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (decode_fmri(fmri, h, &s, &i) != SCF_SUCCESS) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (scf_error() == SCF_ERROR_CONSTRAINT_VIOLATED)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby (void) scf_set_error(
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby SCF_ERROR_INVALID_ARGUMENT);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (check_scf_error(scf_error(), errs_1)) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby goto cleanup;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby for (j = 0; st_pgnames[j].st_pgname != NULL; ++j) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby /* if this transition is not in the tset, continue */
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (!(tset & st_pgnames[j].st_state))
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby continue;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (del_pg(s, i, st_pgnames[j].st_pgname, pg) !=
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby SCF_SUCCESS &&
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby scf_error() != SCF_ERROR_DELETED &&
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby scf_error() != SCF_ERROR_NOT_FOUND) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (check_scf_error(scf_error(),
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby errs_1)) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby goto cleanup;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (s == NULL) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby /* We only need to refresh the instance */
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (_smf_refresh_instance_i(i) != 0 &&
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby check_scf_error(scf_error(), errs_1))
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby goto cleanup;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby } else {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby /* We have to refresh all instances in the service */
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (_smf_refresh_all_instances(s) != 0 &&
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby check_scf_error(scf_error(), errs_1))
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby goto cleanup;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby } else {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if ((pgname = class_to_pgname(class)) == NULL)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby goto cleanup;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (scf_handle_decode_fmri(h, SCF_NOTIFY_PARAMS_INST, NULL,
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby NULL, i, NULL, NULL, SCF_DECODE_FMRI_EXACT) != SCF_SUCCESS)
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby goto cleanup;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (del_pg(NULL, i, pgname, pg) != SCF_SUCCESS &&
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby scf_error() != SCF_ERROR_DELETED &&
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby scf_error() != SCF_ERROR_NOT_FOUND) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (check_scf_error(scf_error(), errs_1)) {
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby goto cleanup;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby if (_smf_refresh_instance_i(i) != 0 &&
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby check_scf_error(scf_error(), errs_1))
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby goto cleanup;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby }
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby r = SCF_SUCCESS;
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltbycleanup:
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby scf_pg_destroy(pg);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby scf_instance_destroy(i);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby scf_service_destroy(s);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby scf_handle_destroy(h);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby free(pgname);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby return (r);
f6e214c7418f43af38bd8c3a557e3d0a1d311cfaGavin Maltby}