f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel/*
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel * CDDL HEADER START
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel *
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel * The contents of this file are subject to the terms of the
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel * Common Development and Distribution License (the "License").
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel * You may not use this file except in compliance with the License.
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel *
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel * or http://www.opensolaris.org/os/licensing.
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel * See the License for the specific language governing permissions
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel * and limitations under the License.
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel *
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel * When distributing Covered Code, include this CDDL HEADER in each
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel * If applicable, add the following below this CDDL HEADER, with the
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel * fields enclosed by brackets "[]" replaced with your own identifying
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel * information: Portions Copyright [yyyy] [name of copyright owner]
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel *
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel * CDDL HEADER END
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel */
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel/*
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel * Copyright (c) 2009, 2010, Oracle and/or its affiliates. All rights reserved.
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel */
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel/* auditd smf(5)/libscf(3LIB) interface - set and display audit parameters */
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel#include <audit_scf.h>
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel#include <audit_policy.h>
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel/* propvec array must be NULL terminated */
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedelscf_propvec_t prop_vect[MAX_PROPVECS + 1];
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel/*
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel * prt_error() - prt_error_va() wrapper; see prt_error_va() for more contextual
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel * information. Note, that the function disregards errno; if you need to print
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel * out strerror()/errno use directly prt_error_va().
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel * Inputs - program error format and message.
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel */
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel/*PRINTFLIKE1*/
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedelstatic void
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedelprt_error(char *fmt, ...)
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel{
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel va_list args;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel errno = 0;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel va_start(args, fmt);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel prt_error_va(fmt, args);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel va_end(args);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel}
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel/*
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel * prt_error_va() - prints an error message along with corresponding system
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel * error number. Inputs - program error format and the va_list already prepared
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel * by the preceding functions.
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel *
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel */
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel/*PRINTFLIKE1*/
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedelvoid
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedelprt_error_va(char *fmt, va_list args)
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel{
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel (void) vfprintf(stderr, fmt, args);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel (void) fputc('\n', stderr);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel if (errno)
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel (void) fprintf(stderr, "error: %s(%d)\n",
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel strerror(errno), errno);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel (void) fflush(stderr);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel}
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel/*
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel * prt_scf_err() - scf_error()/scf_strerror() wrapper.
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel */
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedelstatic void
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedelprt_scf_err(void)
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel{
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel (void) fprintf(stderr, "error: %s\n", scf_strerror(scf_error()));
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel}
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel/*
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel * add_prop_vect_scf() - adds vector to the array of vectors later passed to
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel * get_/set_val_scf(). The first argument (vector) points to particular position
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel * in the vector of properties.
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel */
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedelstatic void
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedeladd_prop_vect_scf(scf_propvec_t *vector, const char *prop_str,
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel scf_type_t prop_type, void *prop_val_ptr)
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel{
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel vector->pv_prop = prop_str;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel vector->pv_type = prop_type;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel vector->pv_ptr = prop_val_ptr;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel}
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel/*
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel * get_val_scf() - get a property values from the audit service
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel *
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel * Arguments: vector = pointers to the head end of array of property vectors
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel * pgroup_str = property group of property in AUDITD_FMRI
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel *
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel */
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedelstatic boolean_t
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedelget_val_scf(scf_propvec_t *vector, char *pgroup_str)
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel{
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel scf_propvec_t *bad_prop_vec = NULL;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel /*
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel * Get the property vector from the editing snapshot (B_FALSE).
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel * For documentation on property vectors see <libscf_priv.h>.
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel */
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel if (scf_read_propvec(AUDITD_FMRI, pgroup_str, B_FALSE, vector,
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel &bad_prop_vec) != SCF_SUCCESS) {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel prt_scf_err();
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel if (bad_prop_vec != NULL) {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel prt_error(gettext("Reading the %s property in the %s "
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel "property group failed.\n"), bad_prop_vec->pv_prop,
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel pgroup_str);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel return (B_FALSE);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel return (B_TRUE);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel}
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel/*
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel * set_val_scf() - set property values of the audit service.
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel *
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel * arguments: vector = pointers to the head end of array of property vectors
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel * pgroup_str = property group of property in AUDITD_FMRI
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel *
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel */
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedelstatic boolean_t
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedelset_val_scf(scf_propvec_t *vector, char *pgroup_str)
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel{
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel scf_propvec_t *bad_prop_vec = NULL;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel /* for documentation on property vectors see <libscf_priv.h> */
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel if (scf_write_propvec(AUDITD_FMRI, pgroup_str, vector,
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel &bad_prop_vec) != SCF_SUCCESS) {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel prt_scf_err();
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel if (bad_prop_vec != NULL) {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel prt_error(gettext("Setting the %s property in the %s "
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel "property group failed.\n"), bad_prop_vec->pv_prop,
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel pgroup_str);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel return (B_FALSE);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel return (B_TRUE);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel}
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel/*
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel * free_prop_vect() - deallocate heap memory used for propvect values.
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel */
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedelstatic void
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedelfree_prop_vect(void)
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel{
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel scf_propvec_t *prop_vect_ptr;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel prop_vect_ptr = prop_vect;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel while (prop_vect_ptr->pv_prop != NULL) {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel if (stack_inbounds(prop_vect_ptr->pv_ptr) == 0) {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel free(prop_vect_ptr->pv_ptr);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel prop_vect_ptr++;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel}
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel/*
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel * chk_prop_vect() - check for prop_vect boundaries and possibly process
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel * (typically) full prop_vect.
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel */
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedelstatic boolean_t
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedelchk_prop_vect(scf_propvec_t **prop_vect_ptr, char *pgrp_str)
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel{
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel if (*prop_vect_ptr < prop_vect ||
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel *prop_vect_ptr >= (prop_vect + MAX_PROPVECS)) {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel DPRINT((dbfp, "prop_vect is full; flushing\n"));
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel if (!set_val_scf(prop_vect, pgrp_str)) {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel return (B_FALSE);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel free_prop_vect();
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel bzero(prop_vect, sizeof (prop_vect));
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel *prop_vect_ptr = prop_vect;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel return (B_TRUE);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel}
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel/*
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel * get_props_kva_all() - get all properties and fill in the plugin_kva.
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel */
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedelstatic boolean_t
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedelget_props_kva_all(asi_scfhandle_t *handle, asi_scfhandle_iter_t *handle_iter,
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel kva_t **plugin_kva)
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel{
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel char key_buf[PLUGIN_MAXKEY];
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel char val_buf[PLUGIN_MAXVAL];
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel char attr_string[PLUGIN_MAXATT];
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel char attr_buf[PLUGIN_MAXATT];
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel int len = 0;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel scf_type_t prop_type;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel attr_string[0] = 0;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel attr_buf[0] = 0;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel while (scf_iter_next_property(handle_iter->prop, handle->prop) == 1) {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel if (scf_property_get_name(handle->prop, key_buf,
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel PLUGIN_MAXKEY) == -1) {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel prt_scf_err();
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel return (B_FALSE);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel /*
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel * We do not fully support multi-valued properties.
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel * scf_property_get_value() only supports single-valued
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel * properties. It returns SCF_ERROR_CONSTRAINT_VIOLATED and one
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel * of the property values. The audit service configuration
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel * values are all single-valued properties. The authorizations
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel * to configure and read the audit service properties may be
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel * multi-valued, these may safely be ignored here as not an
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel * error.
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel */
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel if (scf_property_get_value(handle->prop,
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel handle_iter->prop_val) != 0 &&
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel scf_error() != SCF_ERROR_CONSTRAINT_VIOLATED) {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel prt_scf_err();
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel return (B_FALSE);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel if (scf_property_type(handle->prop, &prop_type) == -1) {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel prt_scf_err();
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel return (B_FALSE);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel switch (prop_type) {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel case SCF_TYPE_BOOLEAN: {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel uint8_t pval_bool;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel if (scf_value_get_boolean(handle_iter->prop_val,
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel &pval_bool) == -1) {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel prt_scf_err();
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel return (B_FALSE);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel len = snprintf(attr_buf, PLUGIN_MAXATT, "%s=%d;",
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel key_buf, pval_bool);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel if (len < 0 || len >= PLUGIN_MAXATT) {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel prt_error(gettext("Too long attribute: %s\n"),
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel key_buf);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel return (B_FALSE);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel if (strlcat(attr_string, attr_buf, PLUGIN_MAXATT) >=
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel PLUGIN_MAXATT) {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel prt_error(gettext("Too long attribute string: "
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel "%s\n"), key_buf);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel return (B_FALSE);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel break;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel case SCF_TYPE_ASTRING: {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel if (scf_value_get_as_string(handle_iter->prop_val,
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel val_buf, PLUGIN_MAXATT) == -1) {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel prt_scf_err();
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel return (B_FALSE);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel len = snprintf(attr_buf, PLUGIN_MAXATT, "%s=%s;",
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel key_buf, val_buf);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel if (len < 0 || len >= PLUGIN_MAXATT) {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel prt_error(gettext("Too long attribute: %s\n"),
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel key_buf);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel return (B_FALSE);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel if (strlcat(attr_string, attr_buf, PLUGIN_MAXATT) >=
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel PLUGIN_MAXATT) {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel prt_error(gettext("Too long attribute string: "
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel "%s\n"), key_buf);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel return (B_FALSE);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel break;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel case SCF_TYPE_COUNT: {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel uint64_t pval_count;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel if (scf_value_get_count(handle_iter->prop_val,
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel &pval_count) == -1) {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel prt_scf_err();
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel return (B_FALSE);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel len = snprintf(attr_buf, PLUGIN_MAXATT, "%s=%llu;",
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel key_buf, pval_count);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel if (len < 0 || len >= PLUGIN_MAXATT) {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel prt_error(gettext("Too long attribute: %s\n"),
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel key_buf);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel return (B_FALSE);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel if (strlcat(attr_string, attr_buf, PLUGIN_MAXATT) >=
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel PLUGIN_MAXATT) {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel prt_error(gettext("Too long attribute string: "
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel "%s\n"), key_buf);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel return (B_FALSE);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel break;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel default:
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel (void) printf("Unsupported value type %s [%d]\n",
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel key_buf, prop_type);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel break;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel if (*attr_string == '\0' ||
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel (*plugin_kva = _str2kva(attr_string, "=", ";")) == NULL) {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel prt_error(gettext("Empty or invalid attribute string."));
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel return (B_FALSE);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel return (B_TRUE);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel}
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel/*
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel * get_plugin_kva() - get and save config attributes of given plugin plugin_str
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel * (or all plugins in case plugin_str == NULL) into scf_plugin_kva_node_t.
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel */
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedelstatic boolean_t
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedelget_plugin_kva(asi_scfhandle_t *handle, asi_scfhandle_iter_t *handle_iter,
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel scf_plugin_kva_node_t **plugin_kva_ll, char *plugin_str)
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel{
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel scf_plugin_kva_node_t *node = NULL;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel scf_plugin_kva_node_t *node_prev = NULL;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel scf_plugin_kva_node_t *node_head = NULL;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel char plugin_str_tmp[PLUGIN_MAXBUF];
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel bzero(plugin_str_tmp, PLUGIN_MAXBUF);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel if (scf_iter_instance_pgs_typed(handle_iter->pgrp, handle->inst,
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel (const char *)"plugin") == -1) {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel prt_scf_err();
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel return (B_FALSE);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel while (scf_iter_next_pg(handle_iter->pgrp, handle->pgrp) == 1) {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel if (scf_pg_get_name(handle->pgrp, plugin_str_tmp,
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel PLUGIN_MAXBUF) == -1) {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel prt_scf_err();
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel plugin_kva_ll_free(node);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel return (B_FALSE);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel if (plugin_str != NULL &&
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel strcmp(plugin_str_tmp, plugin_str) != 0) {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel continue;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel if ((node =
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel calloc(1, sizeof (scf_plugin_kva_node_t))) == NULL) {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel prt_error(gettext("No available memory."));
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel plugin_kva_ll_free(node_prev);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel return (B_FALSE);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel if (node_head == NULL) {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel node_head = node;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel if (node_prev != NULL) {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel node_prev->next = node;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel node->prev = node_prev;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel node_prev = node;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel (void) strlcat((char *)&(node->plugin_name), plugin_str_tmp,
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel PLUGIN_MAXBUF);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel if (scf_iter_pg_properties(handle_iter->prop,
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel handle->pgrp) != 0) {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel prt_scf_err();
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel plugin_kva_ll_free(node);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel return (B_FALSE);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel if (!get_props_kva_all(handle, handle_iter,
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel &(node->plugin_kva))) {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel plugin_kva_ll_free(node);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel return (B_FALSE);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel#if DEBUG
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel scf_plugin_kva_node_t *node_debug = node_head;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel char attr_string[PLUGIN_MAXATT];
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel while (node_debug != NULL) {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel if (_kva2str(node_debug->plugin_kva, attr_string,
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel PLUGIN_MAXATT, "=", ";") == 0) {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel DPRINT((dbfp, "Found plugin - %s: %s\n",
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel node_debug->plugin_name, attr_string));
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel } else {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel DPRINT((dbfp, "Could not get attribute string "
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel "for %s\n", node_debug->plugin_name));
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel node_debug = node_debug->prev;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel#endif
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel *plugin_kva_ll = node_head;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel return (B_TRUE);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel}
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel/*
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel * scf_free() - free scf handles
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel */
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedelstatic void
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedelscf_free(asi_scfhandle_t *handle)
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel{
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel if (handle == NULL) {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel return;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel if (handle->prop != NULL) {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel scf_property_destroy(handle->prop);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel if (handle->pgrp != NULL) {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel scf_pg_destroy(handle->pgrp);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel if (handle->inst != NULL) {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel scf_instance_destroy(handle->inst);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel if (handle->hndl != NULL) {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel if (scf_handle_unbind(handle->hndl) == -1) {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel prt_error(gettext("Internal error."));
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel prt_scf_err();
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel scf_handle_destroy(handle->hndl);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel}
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel/*
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel * scf_init() - initiate scf handles
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel */
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedelstatic boolean_t
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedelscf_init(asi_scfhandle_t *handle)
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel{
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel bzero(handle, sizeof (asi_scfhandle_t));
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel if ((handle->hndl = scf_handle_create(SCF_VERSION)) == NULL ||
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel scf_handle_bind(handle->hndl) != 0) {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel goto err_out;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel if ((handle->inst = scf_instance_create(handle->hndl)) == NULL) {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel goto err_out;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel if ((handle->pgrp = scf_pg_create(handle->hndl)) == NULL) {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel goto err_out;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel if ((handle->prop = scf_property_create(handle->hndl)) == NULL) {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel goto err_out;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel return (B_TRUE);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedelerr_out:
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel prt_scf_err();
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel scf_free(handle);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel return (B_FALSE);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel}
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel/*
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel * scf_free_iter() - free scf iter handles
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel */
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedelstatic void
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedelscf_free_iter(asi_scfhandle_iter_t *handle_iter)
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel{
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel if (handle_iter == NULL) {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel return;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel if (handle_iter->pgrp != NULL) {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel scf_iter_destroy(handle_iter->pgrp);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel if (handle_iter->prop != NULL) {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel scf_iter_destroy(handle_iter->prop);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel if (handle_iter->prop_val != NULL) {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel scf_value_destroy(handle_iter->prop_val);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel}
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel/*
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel * scf_init_iter() - initiate scf iter handles
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel */
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedelstatic boolean_t
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedelscf_init_iter(asi_scfhandle_iter_t *handle_iter,
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel asi_scfhandle_t *handle)
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel{
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel bzero(handle_iter, sizeof (asi_scfhandle_iter_t));
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel if ((handle_iter->pgrp = scf_iter_create(handle->hndl)) == NULL) {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel goto err_out;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel if ((handle_iter->prop = scf_iter_create(handle->hndl)) == NULL) {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel goto err_out;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel if ((handle_iter->prop_val = scf_value_create(handle->hndl)) == NULL) {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel goto err_out;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel return (B_TRUE);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedelerr_out:
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel prt_scf_err();
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel scf_free_iter(handle_iter);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel return (B_FALSE);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel}
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel/*
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel * chk_policy_context() - does some policy based checks, checks the context
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel * (zone, smf) in which the policy could make some sense.
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel */
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedelstatic boolean_t
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedelchk_policy_context(char *policy_str)
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel{
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel /*
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel * "all" and "none" policy flags, since they represent
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel * sub/set of auditing policies, are not stored in the
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel * AUDITD_FMRI service instance configuration.
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel */
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel DPRINT((dbfp, "Walking policy - %s: ", policy_str));
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel if (strcmp("all", policy_str) == 0 ||
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel strcmp("none", policy_str) == 0) {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel DPRINT((dbfp, "skipped\n"));
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel return (B_FALSE);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel /*
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel * In the local zone (!= GLOBAL_ZONEID) we do not touch
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel * "ahlt" and "perzone" policy flags, since these are
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel * relevant only in the global zone.
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel */
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel if ((getzoneid() != GLOBAL_ZONEID) &&
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel (strcmp("ahlt", policy_str) == 0 ||
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel strcmp("perzone", policy_str) == 0)) {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel DPRINT((dbfp, "skipped\n"));
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel return (B_FALSE);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel return (B_TRUE);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel}
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel/*
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel * free_static_att_kva() - free hardcoded/static plugin attributes (key/value
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel * pairs) from the kva plugin structure.
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel */
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedelvoid
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedelfree_static_att_kva(kva_t *plugin_kva)
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel{
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel _kva_free_value(plugin_kva, PLUGIN_ACTIVE);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel _kva_free_value(plugin_kva, PLUGIN_PATH);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel _kva_free_value(plugin_kva, PLUGIN_QSIZE);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel _kva_free_value(plugin_kva, "read_authorization");
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel _kva_free_value(plugin_kva, "value_authorization");
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel}
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel/*
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel * do_getqctrl_scf() - get the values of qctrl properties of the audit service
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel */
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedelboolean_t
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedeldo_getqctrl_scf(struct au_qctrl *cval)
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel{
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel scf_propvec_t *prop_vect_ptr;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel scf_qctrl_t cval_scf;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel bzero(prop_vect, sizeof (prop_vect));
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel prop_vect_ptr = prop_vect;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel add_prop_vect_scf(prop_vect_ptr++, QUEUECTRL_QHIWATER,
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel SCF_TYPE_COUNT, &cval_scf.scf_qhiwater);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel add_prop_vect_scf(prop_vect_ptr++, QUEUECTRL_QLOWATER,
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel SCF_TYPE_COUNT, &cval_scf.scf_qlowater);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel add_prop_vect_scf(prop_vect_ptr++, QUEUECTRL_QBUFSZ,
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel SCF_TYPE_COUNT, &cval_scf.scf_qbufsz);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel add_prop_vect_scf(prop_vect_ptr, QUEUECTRL_QDELAY,
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel SCF_TYPE_COUNT, &cval_scf.scf_qdelay);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel if (!get_val_scf(prop_vect, ASI_PGROUP_QUEUECTRL)) {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel return (B_FALSE);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel cval->aq_hiwater = (size_t)cval_scf.scf_qhiwater;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel cval->aq_lowater = (size_t)cval_scf.scf_qlowater;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel cval->aq_bufsz = (size_t)cval_scf.scf_qbufsz;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel cval->aq_delay = (clock_t)cval_scf.scf_qdelay;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel scf_clean_propvec(prop_vect);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel return (B_TRUE);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel}
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel/*
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel * do_getqbufsz_scf() - get the qbufsz audit service property value
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel */
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedelboolean_t
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedeldo_getqbufsz_scf(size_t *cval)
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel{
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel uint64_t cval_l;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel bzero(prop_vect, sizeof (prop_vect));
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel add_prop_vect_scf(prop_vect, QUEUECTRL_QBUFSZ, SCF_TYPE_COUNT, &cval_l);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel if (!get_val_scf(prop_vect, ASI_PGROUP_QUEUECTRL)) {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel return (B_FALSE);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel *cval = (size_t)cval_l;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel return (B_TRUE);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel}
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel/*
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel * do_getqdelay_scf() - get the qdelay audit service property value
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel */
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedelboolean_t
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedeldo_getqdelay_scf(clock_t *cval)
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel{
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel uint64_t cval_l;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel bzero(prop_vect, sizeof (prop_vect));
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel add_prop_vect_scf(prop_vect, QUEUECTRL_QDELAY, SCF_TYPE_COUNT, &cval_l);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel if (!get_val_scf(prop_vect, ASI_PGROUP_QUEUECTRL)) {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel return (B_FALSE);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel *cval = (clock_t)cval_l;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel return (B_TRUE);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel}
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel/*
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel * do_getqhiwater_scf() - get the qhiwater audit service property value
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel */
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedelboolean_t
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedeldo_getqhiwater_scf(size_t *cval)
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel{
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel uint64_t cval_l;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel bzero(prop_vect, sizeof (prop_vect));
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel add_prop_vect_scf(prop_vect, QUEUECTRL_QHIWATER, SCF_TYPE_COUNT,
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel &cval_l);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel if (!get_val_scf(prop_vect, ASI_PGROUP_QUEUECTRL)) {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel return (B_FALSE);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel *cval = (size_t)cval_l;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel return (B_TRUE);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel}
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel/*
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel * do_getqlowater_scf() - get the qlowater audit service property value
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel */
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedelboolean_t
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedeldo_getqlowater_scf(size_t *cval)
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel{
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel uint64_t cval_l;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel bzero(prop_vect, sizeof (prop_vect));
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel add_prop_vect_scf(prop_vect, QUEUECTRL_QLOWATER, SCF_TYPE_COUNT,
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel &cval_l);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel if (!get_val_scf(prop_vect, ASI_PGROUP_QUEUECTRL)) {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel return (B_FALSE);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel *cval = (size_t)cval_l;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel return (B_TRUE);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel}
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel/*
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel * do_getpolicy_scf() - get the audit policy flags from service
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel */
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedelboolean_t
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedeldo_getpolicy_scf(uint32_t *policy_mask)
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel{
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel int i;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel scf_propvec_t *prop_vect_ptr;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel char *cur_policy_str;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel policy_sw_t policy_arr[POLICY_TBL_SZ + 1];
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel policy_sw_t *policy_arr_ptr;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel prop_vect_ptr = prop_vect;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel policy_arr_ptr = policy_arr;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel bzero(prop_vect, sizeof (prop_vect));
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel bzero(policy_arr, sizeof (policy_arr));
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel /* prepare the smf(5) query */
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel for (i = 0; i < POLICY_TBL_SZ; i++) {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel cur_policy_str = policy_table[i].policy_str;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel /* Do some basic policy dependent checks */
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel if (!chk_policy_context(cur_policy_str)) {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel continue;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel DPRINT((dbfp, "will be queried\n"));
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel add_prop_vect_scf(prop_vect_ptr++, cur_policy_str,
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel SCF_TYPE_BOOLEAN, &policy_arr_ptr->flag);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel policy_arr_ptr->policy = cur_policy_str;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel policy_arr_ptr++;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel if (!get_val_scf(prop_vect, ASI_PGROUP_POLICY)) {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel return (B_FALSE);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel /* set the policy mask */
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel policy_arr_ptr = policy_arr;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel *policy_mask = 0;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel while (policy_arr_ptr->policy != NULL) {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel if (policy_arr_ptr->flag) {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel *policy_mask |= get_policy(policy_arr_ptr->policy);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel policy_arr_ptr++;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel return (B_TRUE);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel}
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel/*
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel * do_setpolicy_scf() - sets the policy flags in audit service configuration
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel */
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedelboolean_t
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedeldo_setpolicy_scf(uint32_t policy)
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel{
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel int i;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel char *cur_policy_str;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel scf_propvec_t *prop_vect_ptr;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel boolean_t bool_arr[POLICY_TBL_SZ];
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel boolean_t *bool_arr_ptr;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel prop_vect_ptr = prop_vect;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel bool_arr_ptr = bool_arr;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel bzero(prop_vect, sizeof (prop_vect));
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel bzero(bool_arr, sizeof (bool_arr));
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel for (i = 0; i < POLICY_TBL_SZ; i++) {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel cur_policy_str = policy_table[i].policy_str;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel /* Do some basic policy dependent checks */
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel if (!chk_policy_context(cur_policy_str)) {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel continue;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel if (policy_table[i].policy_mask & policy) {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel *bool_arr_ptr = B_TRUE;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel } else {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel *bool_arr_ptr = B_FALSE;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel DPRINT((dbfp, "%s%s\n", (*bool_arr_ptr == B_TRUE ? "+" : "-"),
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel cur_policy_str));
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel add_prop_vect_scf(prop_vect_ptr++, cur_policy_str,
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel SCF_TYPE_BOOLEAN, bool_arr_ptr++);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel return (set_val_scf(prop_vect, ASI_PGROUP_POLICY));
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel}
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel/*
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel * do_setqctrl_scf() - set the values of qctrl properties of the audit service
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel */
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedelboolean_t
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedeldo_setqctrl_scf(struct au_qctrl *cval)
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel{
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel scf_propvec_t *prop_vect_ptr;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel scf_qctrl_t cval_scf;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel if (!CHK_BDRY_QHIWATER(cval->aq_lowater, cval->aq_hiwater) &&
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel cval->aq_hiwater != 0) {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel (void) printf(gettext("Specified audit queue hiwater mark is "
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel "outside of allowed boundaries.\n"));
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel return (B_FALSE);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel if (!CHK_BDRY_QLOWATER(cval->aq_lowater, cval->aq_hiwater) &&
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel cval->aq_lowater != 0) {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel (void) printf(gettext("Specified audit queue lowater mark is "
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel "outside of allowed boundaries.\n"));
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel return (B_FALSE);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel if (!CHK_BDRY_QBUFSZ(cval->aq_bufsz) && cval->aq_bufsz != 0) {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel (void) printf(gettext("Specified audit queue buffer size is "
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel "outside of allowed boundaries.\n"));
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel return (B_FALSE);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel if (!CHK_BDRY_QDELAY(cval->aq_delay) && cval->aq_delay != 0) {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel (void) printf(gettext("Specified audit queue delay is "
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel "outside of allowed boundaries.\n"));
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel return (B_FALSE);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel cval_scf.scf_qhiwater = (uint64_t)cval->aq_hiwater;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel cval_scf.scf_qlowater = (uint64_t)cval->aq_lowater;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel cval_scf.scf_qbufsz = (uint64_t)cval->aq_bufsz;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel cval_scf.scf_qdelay = (uint64_t)cval->aq_delay;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel bzero(prop_vect, sizeof (prop_vect));
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel prop_vect_ptr = prop_vect;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel add_prop_vect_scf(prop_vect_ptr++, QUEUECTRL_QHIWATER, SCF_TYPE_COUNT,
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel &cval_scf.scf_qhiwater);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel add_prop_vect_scf(prop_vect_ptr++, QUEUECTRL_QLOWATER, SCF_TYPE_COUNT,
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel &cval_scf.scf_qlowater);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel add_prop_vect_scf(prop_vect_ptr++, QUEUECTRL_QBUFSZ, SCF_TYPE_COUNT,
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel &cval_scf.scf_qbufsz);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel add_prop_vect_scf(prop_vect_ptr, QUEUECTRL_QDELAY, SCF_TYPE_COUNT,
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel &cval_scf.scf_qdelay);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel return (set_val_scf(prop_vect, ASI_PGROUP_QUEUECTRL));
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel}
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel/*
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel * do_setqbufsz_scf() - set the qbufsz property value of the audit service
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel */
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedelboolean_t
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedeldo_setqbufsz_scf(size_t *cval)
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel{
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel uint64_t cval_l;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel if (!CHK_BDRY_QBUFSZ(*cval) && *cval != 0) {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel (void) printf(gettext("Specified audit queue buffer size is "
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel "outside of allowed boundaries.\n"));
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel return (B_FALSE);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel cval_l = (uint64_t)*cval;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel bzero(prop_vect, sizeof (prop_vect));
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel add_prop_vect_scf(prop_vect, QUEUECTRL_QBUFSZ, SCF_TYPE_COUNT, &cval_l);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel return (set_val_scf(prop_vect, ASI_PGROUP_QUEUECTRL));
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel}
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel/*
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel * do_setqdelay_scf() - set the qdelay property value of the audit service
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel */
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedelboolean_t
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedeldo_setqdelay_scf(clock_t *cval)
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel{
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel uint64_t cval_l;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel if (!CHK_BDRY_QDELAY(*cval) && *cval != 0) {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel (void) printf(gettext("Specified audit queue delay is "
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel "outside of allowed boundaries.\n"));
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel return (B_FALSE);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel cval_l = (uint64_t)*cval;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel bzero(prop_vect, sizeof (prop_vect));
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel add_prop_vect_scf(prop_vect, QUEUECTRL_QDELAY, SCF_TYPE_COUNT, &cval_l);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel return (set_val_scf(prop_vect, ASI_PGROUP_QUEUECTRL));
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel}
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel/*
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel * do_setqhiwater_scf() - set the qhiwater property value of the audit service
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel */
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedelboolean_t
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedeldo_setqhiwater_scf(size_t *cval)
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel{
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel uint64_t cval_l;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel size_t cval_lowater;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel if (!do_getqlowater_scf(&cval_lowater)) {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel (void) printf(gettext("Could not get configured value of "
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel "queue lowater mark.\n"));
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel return (B_FALSE);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel if (cval_lowater == 0) {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel cval_lowater = AQ_MINLOW;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel if (!CHK_BDRY_QHIWATER(cval_lowater, *cval) && *cval != 0) {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel (void) printf(gettext("Specified audit queue hiwater mark is "
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel "outside of allowed boundaries.\n"));
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel return (B_FALSE);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel cval_l = (uint64_t)*cval;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel bzero(prop_vect, sizeof (prop_vect));
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel add_prop_vect_scf(prop_vect, QUEUECTRL_QHIWATER, SCF_TYPE_COUNT,
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel &cval_l);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel return (set_val_scf(prop_vect, ASI_PGROUP_QUEUECTRL));
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel}
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel/*
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel * do_setqlowater_scf() - set the qlowater property value of the audit service
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel */
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedelboolean_t
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedeldo_setqlowater_scf(size_t *cval)
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel{
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel uint64_t cval_l;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel size_t cval_hiwater;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel if (!do_getqhiwater_scf(&cval_hiwater)) {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel (void) printf(gettext("Could not get configured value of "
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel "queue hiwater mark.\n"));
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel return (B_FALSE);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel if (cval_hiwater == 0) {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel cval_hiwater = AQ_MAXHIGH;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel if (!CHK_BDRY_QLOWATER(*cval, cval_hiwater) && *cval != 0) {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel (void) printf(gettext("Specified audit queue lowater mark is "
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel "outside of allowed boundaries.\n"));
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel return (B_FALSE);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel cval_l = (uint64_t)*cval;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel bzero(prop_vect, sizeof (prop_vect));
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel add_prop_vect_scf(prop_vect, QUEUECTRL_QLOWATER, SCF_TYPE_COUNT,
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel &cval_l);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel return (set_val_scf(prop_vect, ASI_PGROUP_QUEUECTRL));
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel}
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel/*
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel * do_getflags_scf() - get the audit attributable flags from service
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel */
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedelboolean_t
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedeldo_getflags_scf(char **flags)
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel{
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel bzero(prop_vect, sizeof (prop_vect));
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel add_prop_vect_scf(prop_vect, PRESELECTION_FLAGS, SCF_TYPE_ASTRING,
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel flags);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel if (!get_val_scf(prop_vect, ASI_PGROUP_PRESELECTION)) {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel return (B_FALSE);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel return (B_TRUE);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel}
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel/*
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel * do_getnaflags_scf() - get the audit non-attributable flags from service
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel */
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedelboolean_t
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedeldo_getnaflags_scf(char **naflags)
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel{
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel bzero(prop_vect, sizeof (prop_vect));
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel add_prop_vect_scf(prop_vect, PRESELECTION_NAFLAGS, SCF_TYPE_ASTRING,
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel naflags);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel if (!get_val_scf(prop_vect, ASI_PGROUP_PRESELECTION)) {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel return (B_FALSE);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel return (B_TRUE);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel}
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel/*
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel * do_setflags_scf() - set the attributable mask property value of the audit
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel * service
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel */
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedelboolean_t
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedeldo_setflags_scf(char *flags)
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel{
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel bzero(prop_vect, sizeof (prop_vect));
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel add_prop_vect_scf(prop_vect, PRESELECTION_FLAGS, SCF_TYPE_ASTRING,
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel flags);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel return (set_val_scf(prop_vect, ASI_PGROUP_PRESELECTION));
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel}
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel/*
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel * do_setnaflags_scf() - set the attributable mask property value of the audit
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel * service
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel */
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedelboolean_t
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedeldo_setnaflags_scf(char *naflags)
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel{
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel bzero(prop_vect, sizeof (prop_vect));
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel add_prop_vect_scf(prop_vect, PRESELECTION_NAFLAGS, SCF_TYPE_ASTRING,
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel naflags);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel return (set_val_scf(prop_vect, ASI_PGROUP_PRESELECTION));
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel}
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel/*
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel * plugin_avail_scf() - look for the plugin in the audit service configuration
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel */
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedelboolean_t
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedelplugin_avail_scf(const char *plugin_str)
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel{
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel scf_simple_handle_t *sh;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel if (plugin_str == NULL || *plugin_str == '\0') {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel return (B_FALSE);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel if ((sh = scf_general_pg_setup(AUDITD_FMRI, plugin_str)) == NULL) {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel DPRINT((dbfp, "No such plugin found: %s (%s)\n", plugin_str,
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel scf_strerror(scf_error())));
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel return (B_FALSE);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel scf_simple_handle_destroy(sh);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel return (B_TRUE);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel}
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel/*
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel * do_getpluginconfig_scf() - get plugin configuration from the audit service
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel * configuration.
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel */
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedelboolean_t
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedeldo_getpluginconfig_scf(char *plugin_str, scf_plugin_kva_node_t **plugin_kva_ll)
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel{
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel char *asi_fmri;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel asi_scfhandle_t handle;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel asi_scfhandle_iter_t handle_iter;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel boolean_t plugin_all = B_FALSE;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel boolean_t rv = B_TRUE;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel if (plugin_str == NULL || *plugin_str == '\0') {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel if (asprintf(&asi_fmri, "%s", AUDITD_FMRI) == -1) {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel prt_error(gettext("Out of memory."));
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel return (B_FALSE);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel plugin_all = B_TRUE;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel } else {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel if (asprintf(&asi_fmri, "%s%s%s", AUDITD_FMRI,
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel SCF_FMRI_PROPERTYGRP_PREFIX, plugin_str) == -1) {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel prt_error(gettext("Out of memory."));
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel return (B_FALSE);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel DPRINT((dbfp, "%s will be decoded\n", asi_fmri));
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel if (!scf_init(&handle)) {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel prt_error(gettext("Unable to initialize scf handles."));
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel free(asi_fmri);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel return (B_FALSE);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel if (scf_handle_decode_fmri(handle.hndl, asi_fmri, NULL, NULL,
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel handle.inst, plugin_all ? NULL : handle.pgrp, NULL,
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel SCF_DECODE_FMRI_EXACT) == -1) {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel prt_scf_err();
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel scf_free(&handle);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel free(asi_fmri);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel return (B_FALSE);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel if (!scf_init_iter(&handle_iter, &handle)) {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel prt_error(gettext("Unable to initialize scf iter handles."));
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel scf_free(&handle);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel free(asi_fmri);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel return (B_FALSE);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel if (plugin_all) {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel rv = get_plugin_kva(&handle, &handle_iter, plugin_kva_ll, NULL);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel } else {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel rv = get_plugin_kva(&handle, &handle_iter, plugin_kva_ll,
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel plugin_str);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel scf_free(&handle);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel scf_free_iter(&handle_iter);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel free(asi_fmri);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel return (rv);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel}
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel/*
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel * do_setpluginconfig_scf() - set plugin configuration in the audit service
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel * configuration.
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel */
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedelboolean_t
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedeldo_setpluginconfig_scf(char *plugin_str, boolean_t plugin_state,
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel char *plugin_att, int plugin_qsize)
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel{
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel kva_t *plugin_att_kva = NULL;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel char *plugin_att_ptr = plugin_att;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel char *plugin_att_clr_ptr = plugin_att;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel scf_simple_prop_t *plugin_prop;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel scf_type_t plugin_prop_type;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel scf_propvec_t *prop_vect_ptr;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel int cnt = 0;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel kv_t *data;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel boolean_t rval = B_TRUE;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel uint64_t plugin_qsize_l = (uint64_t)plugin_qsize;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel DPRINT((dbfp, "Auditd plugin configuration to be set:\n\tplugin=%s\n\t"
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel "state=%d (%s)\n\tattributes=%s\n\tqsize=%d%s\n", plugin_str,
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel plugin_state, plugin_state == B_TRUE ? "active" : "inactive",
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel plugin_att == NULL ? " (unspecified)" : plugin_att,
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel plugin_qsize, plugin_qsize == -1 ? " (unspecified)" : ""));
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel bzero(prop_vect, sizeof (prop_vect));
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel prop_vect_ptr = prop_vect;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel if (plugin_att != NULL) {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel /* get rid of white-space chars */
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel if (*plugin_att_ptr != '\0') {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel while (*plugin_att_ptr != '\0') {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel if (isspace(*plugin_att_ptr) == 0) {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel *plugin_att_clr_ptr++ = *plugin_att_ptr;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel plugin_att_ptr++;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel *plugin_att_clr_ptr = '\0';
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel DPRINT((dbfp, "attributes (no white-space): %s\n", plugin_att));
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel /* allow empty plugin_att */
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel if (*plugin_att == '\0') {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel cnt = 0;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel data = NULL;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel } else {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel plugin_att_kva = _str2kva(plugin_att, "=", ";");
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel if (plugin_att_kva == NULL) {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel prt_error(gettext("Could not parse plugin "
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel "attributes."));
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel return (B_FALSE);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel free_static_att_kva(plugin_att_kva);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel cnt = plugin_att_kva->length;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel data = plugin_att_kva->data;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel /* set state */
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel add_prop_vect_scf(prop_vect_ptr++, PLUGIN_ACTIVE, SCF_TYPE_BOOLEAN,
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel &plugin_state);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel DPRINT((dbfp, "Prepared active -> %d\n", plugin_state));
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel /* set attributes */
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel while (cnt) {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel if (data->value == NULL) {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel cnt--;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel data++;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel continue;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel if (!chk_prop_vect(&prop_vect_ptr, plugin_str)) {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel rval = B_FALSE;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel goto err_out;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel if ((plugin_prop = scf_simple_prop_get(NULL,
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel AUDITD_FMRI, plugin_str, data->key)) == NULL) {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel prt_error(gettext("Could not get configuration for "
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel "attribute: %s"), data->key);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel prt_scf_err();
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel rval = B_FALSE;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel goto err_out;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel if ((plugin_prop_type = scf_simple_prop_type(plugin_prop))
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel == -1) {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel prt_error(gettext("Could not get property type: %s"),
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel data->key);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel prt_scf_err();
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel rval = B_FALSE;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel goto err_out;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel switch (plugin_prop_type) {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel case SCF_TYPE_BOOLEAN: {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel uint8_t *pval_bool;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel pval_bool = (uint8_t *)malloc(sizeof (uint8_t));
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel if (pval_bool == NULL) {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel prt_error(gettext("No free memory available."));
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel rval = B_FALSE;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel goto err_out;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel *pval_bool = (uint8_t)atoi(data->value);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel add_prop_vect_scf(prop_vect_ptr++, data->key,
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel SCF_TYPE_BOOLEAN, pval_bool);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel break;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel case SCF_TYPE_ASTRING: {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel char *pval_str;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel if ((pval_str = strdup(data->value)) == NULL) {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel prt_error(gettext("No free memory available."));
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel rval = B_FALSE;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel goto err_out;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel add_prop_vect_scf(prop_vect_ptr++, data->key,
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel SCF_TYPE_ASTRING, pval_str);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel break;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel case SCF_TYPE_COUNT: {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel uint64_t *pval_count;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel pval_count = (uint64_t *)malloc(sizeof (uint64_t));
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel if (pval_count == NULL) {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel prt_error(gettext("No free memory available."));
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel rval = B_FALSE;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel goto err_out;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel *pval_count = (uint64_t)atoll(data->value);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel add_prop_vect_scf(prop_vect_ptr++, data->key,
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel SCF_TYPE_COUNT, pval_count);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel break;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel default:
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel prt_error(gettext("Unsupported property type: %s (%d)"),
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel data->key, plugin_prop_type);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel break;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel DPRINT((dbfp, "Prepared %s -> %s\n", data->key, data->value));
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel scf_simple_prop_free(plugin_prop);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel data++;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel cnt--;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel if (!chk_prop_vect(&prop_vect_ptr, plugin_str)) {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel rval = B_FALSE;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel goto err_out;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel /* set qsize */
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel if (plugin_qsize != -1) {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel add_prop_vect_scf(prop_vect_ptr, PLUGIN_QSIZE, SCF_TYPE_COUNT,
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel &plugin_qsize_l);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel DPRINT((dbfp, "Prepared qsize -> %d\n", plugin_qsize));
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel if (!set_val_scf(prop_vect, plugin_str)) {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel rval = B_FALSE;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedelerr_out:
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel free_prop_vect();
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel _kva_free(plugin_att_kva);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel return (rval);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel}
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel/*
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel * plugin_kva_ll_free() - free the memory used by plugin kva linked list.
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel */
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedelvoid
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedelplugin_kva_ll_free(scf_plugin_kva_node_t *node)
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel{
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel scf_plugin_kva_node_t *node_next;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel if (node == NULL) {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel return;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel while (node->prev != NULL) {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel node = node->prev;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel while (node != NULL) {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel _kva_free(node->plugin_kva);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel node_next = node->next;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel free(node);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel node = node_next;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel}
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel/*
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel * get_policy() - get policy mask entry
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel */
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedeluint32_t
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedelget_policy(char *policy)
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel{
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel int i;
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel for (i = 0; i < POLICY_TBL_SZ; i++) {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel if (strcasecmp(policy, policy_table[i].policy_str) == 0) {
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel return (policy_table[i].policy_mask);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel }
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel return (0);
f89940742f5d14dde79b69b98a414dd7b7f585c7Jan Friedel}