da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * CDDL HEADER START
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * The contents of this file are subject to the terms of the
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Common Development and Distribution License (the "License").
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * You may not use this file except in compliance with the License.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * or http://www.opensolaris.org/os/licensing.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * See the License for the specific language governing permissions
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * and limitations under the License.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * When distributing Covered Code, include this CDDL HEADER in each
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * If applicable, add the following below this CDDL HEADER, with the
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * fields enclosed by brackets "[]" replaced with your own identifying
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * information: Portions Copyright [yyyy] [name of copyright owner]
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * CDDL HEADER END
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
dc20a3024900c47dd2ee44b9707e6df38f7d62a5as * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Use is subject to license terms.
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross *
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * Copyright 2015 Nexenta Systems, Inc. All rights reserved.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/* helper functions for using libscf with CIFS */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#include <libscf.h>
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#include <string.h>
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#include <stdio.h>
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#include <stdlib.h>
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#include <syslog.h>
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#include <errno.h>
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#include <libintl.h>
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#include <assert.h>
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#include <strings.h>
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#include <uuid/uuid.h>
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#include <sys/param.h>
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#include <smbsrv/libsmb.h>
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * smb_smf_scf_log_error(msg)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Logs error messages from scf API's
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwstatic void
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwsmb_smf_scf_log_error(char *msg)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw{
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross if (msg == NULL)
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross msg = "SMBD SMF problem";
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross
b819cea2f73f98c5662230cc9affc8cc84f77fcfGordon Ross syslog(LOG_ERR, " %s: %s", msg, scf_strerror(scf_error()));
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw}
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * smb_smf_create_service_pgroup(handle, pgroup)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * create a new property group at service level.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwint
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwsmb_smf_create_service_pgroup(smb_scfhandle_t *handle, char *pgroup)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw{
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw int ret = SMBD_SMF_OK;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw int err;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
7b59d02d2a384be9a08087b14defadd214b3c1ddjb if (handle == NULL)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (SMBD_SMF_SYSTEM_ERR);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * only create a handle if it doesn't exist. It is ok to exist
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * since the pg handle will be set as a side effect.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (handle->scf_pg == NULL)
7b59d02d2a384be9a08087b14defadd214b3c1ddjb if ((handle->scf_pg =
7b59d02d2a384be9a08087b14defadd214b3c1ddjb scf_pg_create(handle->scf_handle)) == NULL)
7b59d02d2a384be9a08087b14defadd214b3c1ddjb return (SMBD_SMF_SYSTEM_ERR);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * if the pgroup exists, we are done. If it doesn't, then we
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * need to actually add one to the service instance.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (scf_service_get_pg(handle->scf_service,
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw pgroup, handle->scf_pg) != 0) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /* doesn't exist so create one */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (scf_service_add_pg(handle->scf_service, pgroup,
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw SCF_GROUP_APPLICATION, 0, handle->scf_pg) != 0) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw err = scf_error();
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (err != SCF_ERROR_NONE)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw smb_smf_scf_log_error(NULL);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw switch (err) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw case SCF_ERROR_PERMISSION_DENIED:
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw ret = SMBD_SMF_NO_PERMISSION;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw break;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw default:
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw ret = SMBD_SMF_SYSTEM_ERR;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw break;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (ret);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw}
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Start transaction on current pg in handle.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * The pg could be service or instance level.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Must be called after pg handle is obtained
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * from create or get.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwint
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwsmb_smf_start_transaction(smb_scfhandle_t *handle)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw{
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw int ret = SMBD_SMF_OK;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (!handle || (!handle->scf_pg))
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (SMBD_SMF_SYSTEM_ERR);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * lookup the property group and create it if it doesn't already
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * exist.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (handle->scf_state == SCH_STATE_INIT) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (ret == SMBD_SMF_OK) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw handle->scf_trans =
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw scf_transaction_create(handle->scf_handle);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (handle->scf_trans != NULL) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (scf_transaction_start(handle->scf_trans,
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw handle->scf_pg) != 0) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw ret = SMBD_SMF_SYSTEM_ERR;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw scf_transaction_destroy(
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw handle->scf_trans);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw handle->scf_trans = NULL;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw } else {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw ret = SMBD_SMF_SYSTEM_ERR;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (ret == SMBD_SMF_SYSTEM_ERR &&
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw scf_error() == SCF_ERROR_PERMISSION_DENIED)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw ret = SMBD_SMF_NO_PERMISSION;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (ret);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw}
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * smb_smf_end_transaction(handle)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Commit the changes that were added to the transaction in the
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * handle. Do all necessary cleanup.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwint
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwsmb_smf_end_transaction(smb_scfhandle_t *handle)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw{
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw int ret = SMBD_SMF_OK;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross int rc;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (handle == NULL)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (SMBD_SMF_SYSTEM_ERR);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (handle->scf_trans == NULL) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw ret = SMBD_SMF_SYSTEM_ERR;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw } else {
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross rc = scf_transaction_commit(handle->scf_trans);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross if (rc == 1) {
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross ret = SMBD_SMF_OK;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross } else if (rc == 0) {
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross ret = SMBD_SMF_INVALID_ARG;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross smb_smf_scf_log_error("Failed to commit, old pg: "
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross "transaction: %s");
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross } else {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw ret = SMBD_SMF_SYSTEM_ERR;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross smb_smf_scf_log_error("Failed to commit, error: "
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw "transaction: %s");
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw scf_transaction_destroy_children(handle->scf_trans);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw scf_transaction_destroy(handle->scf_trans);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw handle->scf_trans = NULL;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (ret);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw}
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Sets string property in current pg
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwint
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwsmb_smf_set_string_property(smb_scfhandle_t *handle,
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw char *propname, char *valstr)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw{
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw int ret = SMBD_SMF_OK;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw scf_value_t *value = NULL;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw scf_transaction_entry_t *entry = NULL;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (handle == NULL)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (SMBD_SMF_SYSTEM_ERR);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * properties must be set in transactions and don't take
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * effect until the transaction has been ended/committed.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw value = scf_value_create(handle->scf_handle);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw entry = scf_entry_create(handle->scf_handle);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (value != NULL && entry != NULL) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (scf_transaction_property_change(handle->scf_trans, entry,
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw propname, SCF_TYPE_ASTRING) == 0 ||
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw scf_transaction_property_new(handle->scf_trans, entry,
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw propname, SCF_TYPE_ASTRING) == 0) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (scf_value_set_astring(value, valstr) == 0) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (scf_entry_add_value(entry, value) != 0) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw ret = SMBD_SMF_SYSTEM_ERR;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw scf_value_destroy(value);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /* the value is in the transaction */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw value = NULL;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw } else {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /* value couldn't be constructed */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw ret = SMBD_SMF_SYSTEM_ERR;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /* the entry is in the transaction */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw entry = NULL;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw } else {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw ret = SMBD_SMF_SYSTEM_ERR;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw } else {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw ret = SMBD_SMF_SYSTEM_ERR;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (ret == SMBD_SMF_SYSTEM_ERR) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw switch (scf_error()) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw case SCF_ERROR_PERMISSION_DENIED:
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw ret = SMBD_SMF_NO_PERMISSION;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw break;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * cleanup if there were any errors that didn't leave these
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * values where they would be cleaned up later.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (value != NULL)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw scf_value_destroy(value);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (entry != NULL)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw scf_entry_destroy(entry);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (ret);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw}
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Gets string property value.upto sz size.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Caller is responsible to have enough memory allocated.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwint
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwsmb_smf_get_string_property(smb_scfhandle_t *handle, char *propname,
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw char *valstr, size_t sz)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw{
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw int ret = SMBD_SMF_OK;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw scf_value_t *value;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw scf_property_t *prop;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (handle == NULL)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (SMBD_SMF_SYSTEM_ERR);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw value = scf_value_create(handle->scf_handle);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw prop = scf_property_create(handle->scf_handle);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (value && prop &&
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw (scf_pg_get_property(handle->scf_pg, propname, prop) == 0)) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (scf_property_get_value(prop, value) == 0) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (scf_value_get_astring(value, valstr, sz) < 0) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw ret = SMBD_SMF_SYSTEM_ERR;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw } else {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw ret = SMBD_SMF_SYSTEM_ERR;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw } else {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw ret = SMBD_SMF_SYSTEM_ERR;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (value != NULL)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw scf_value_destroy(value);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (prop != NULL)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw scf_property_destroy(prop);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (ret);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw}
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Set integer value of property.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * The value is returned as int64_t value
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Caller ensures appropriate translation.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwint
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwsmb_smf_set_integer_property(smb_scfhandle_t *handle, char *propname,
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw int64_t valint)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw{
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw int ret = SMBD_SMF_OK;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw scf_value_t *value = NULL;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw scf_transaction_entry_t *entry = NULL;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (handle == NULL)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (SMBD_SMF_SYSTEM_ERR);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * properties must be set in transactions and don't take
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * effect until the transaction has been ended/committed.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw value = scf_value_create(handle->scf_handle);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw entry = scf_entry_create(handle->scf_handle);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (value != NULL && entry != NULL) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (scf_transaction_property_change(handle->scf_trans, entry,
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw propname, SCF_TYPE_INTEGER) == 0 ||
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw scf_transaction_property_new(handle->scf_trans, entry,
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw propname, SCF_TYPE_INTEGER) == 0) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw scf_value_set_integer(value, valint);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (scf_entry_add_value(entry, value) != 0) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw ret = SMBD_SMF_SYSTEM_ERR;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw scf_value_destroy(value);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /* the value is in the transaction */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw value = NULL;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /* the entry is in the transaction */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw entry = NULL;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw } else {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw ret = SMBD_SMF_SYSTEM_ERR;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (ret == SMBD_SMF_SYSTEM_ERR) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw switch (scf_error()) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw case SCF_ERROR_PERMISSION_DENIED:
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw ret = SMBD_SMF_NO_PERMISSION;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw break;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * cleanup if there were any errors that didn't leave these
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * values where they would be cleaned up later.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (value != NULL)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw scf_value_destroy(value);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (entry != NULL)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw scf_entry_destroy(entry);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (ret);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw}
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Gets integer property value.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Caller is responsible to have enough memory allocated.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwint
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwsmb_smf_get_integer_property(smb_scfhandle_t *handle, char *propname,
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw int64_t *valint)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw{
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw int ret = SMBD_SMF_OK;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw scf_value_t *value = NULL;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw scf_property_t *prop = NULL;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (handle == NULL)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (SMBD_SMF_SYSTEM_ERR);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw value = scf_value_create(handle->scf_handle);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw prop = scf_property_create(handle->scf_handle);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if ((prop) && (value) &&
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw (scf_pg_get_property(handle->scf_pg, propname, prop) == 0)) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (scf_property_get_value(prop, value) == 0) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (scf_value_get_integer(value,
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw valint) != 0) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw ret = SMBD_SMF_SYSTEM_ERR;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw } else {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw ret = SMBD_SMF_SYSTEM_ERR;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw } else {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw ret = SMBD_SMF_SYSTEM_ERR;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (value != NULL)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw scf_value_destroy(value);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (prop != NULL)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw scf_property_destroy(prop);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (ret);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw}
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Set boolean value of property.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * The value is returned as int64_t value
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Caller ensures appropriate translation.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwint
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwsmb_smf_set_boolean_property(smb_scfhandle_t *handle, char *propname,
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw uint8_t valbool)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw{
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw int ret = SMBD_SMF_OK;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw scf_value_t *value = NULL;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw scf_transaction_entry_t *entry = NULL;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (handle == NULL)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (SMBD_SMF_SYSTEM_ERR);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * properties must be set in transactions and don't take
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * effect until the transaction has been ended/committed.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw value = scf_value_create(handle->scf_handle);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw entry = scf_entry_create(handle->scf_handle);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (value != NULL && entry != NULL) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (scf_transaction_property_change(handle->scf_trans, entry,
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw propname, SCF_TYPE_BOOLEAN) == 0 ||
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw scf_transaction_property_new(handle->scf_trans, entry,
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw propname, SCF_TYPE_BOOLEAN) == 0) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw scf_value_set_boolean(value, valbool);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (scf_entry_add_value(entry, value) != 0) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw ret = SMBD_SMF_SYSTEM_ERR;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw scf_value_destroy(value);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /* the value is in the transaction */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw value = NULL;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /* the entry is in the transaction */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw entry = NULL;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw } else {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw ret = SMBD_SMF_SYSTEM_ERR;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (ret == SMBD_SMF_SYSTEM_ERR) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw switch (scf_error()) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw case SCF_ERROR_PERMISSION_DENIED:
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw ret = SMBD_SMF_NO_PERMISSION;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw break;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * cleanup if there were any errors that didn't leave these
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * values where they would be cleaned up later.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (value != NULL)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw scf_value_destroy(value);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (entry != NULL)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw scf_entry_destroy(entry);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (ret);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw}
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Gets boolean property value.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Caller is responsible to have enough memory allocated.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwint
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwsmb_smf_get_boolean_property(smb_scfhandle_t *handle, char *propname,
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw uint8_t *valbool)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw{
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw int ret = SMBD_SMF_OK;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw scf_value_t *value = NULL;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw scf_property_t *prop = NULL;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (handle == NULL)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (SMBD_SMF_SYSTEM_ERR);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw value = scf_value_create(handle->scf_handle);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw prop = scf_property_create(handle->scf_handle);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if ((prop) && (value) &&
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw (scf_pg_get_property(handle->scf_pg, propname, prop) == 0)) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (scf_property_get_value(prop, value) == 0) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (scf_value_get_boolean(value,
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw valbool) != 0) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw ret = SMBD_SMF_SYSTEM_ERR;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw } else {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw ret = SMBD_SMF_SYSTEM_ERR;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw } else {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw ret = SMBD_SMF_SYSTEM_ERR;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (value != NULL)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw scf_value_destroy(value);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (prop != NULL)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw scf_property_destroy(prop);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (ret);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw}
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Sets a blob property value.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwint
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwsmb_smf_set_opaque_property(smb_scfhandle_t *handle, char *propname,
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw void *voidval, size_t sz)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw{
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw int ret = SMBD_SMF_OK;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw scf_value_t *value;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw scf_transaction_entry_t *entry;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (handle == NULL)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (SMBD_SMF_SYSTEM_ERR);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * properties must be set in transactions and don't take
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * effect until the transaction has been ended/committed.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw value = scf_value_create(handle->scf_handle);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw entry = scf_entry_create(handle->scf_handle);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (value != NULL && entry != NULL) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (scf_transaction_property_change(handle->scf_trans, entry,
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw propname, SCF_TYPE_OPAQUE) == 0 ||
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw scf_transaction_property_new(handle->scf_trans, entry,
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw propname, SCF_TYPE_OPAQUE) == 0) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (scf_value_set_opaque(value, voidval, sz) == 0) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (scf_entry_add_value(entry, value) != 0) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw ret = SMBD_SMF_SYSTEM_ERR;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw scf_value_destroy(value);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /* the value is in the transaction */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw value = NULL;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw } else {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /* value couldn't be constructed */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw ret = SMBD_SMF_SYSTEM_ERR;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /* the entry is in the transaction */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw entry = NULL;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw } else {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw ret = SMBD_SMF_SYSTEM_ERR;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw } else {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw ret = SMBD_SMF_SYSTEM_ERR;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (ret == SMBD_SMF_SYSTEM_ERR) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw switch (scf_error()) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw case SCF_ERROR_PERMISSION_DENIED:
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw ret = SMBD_SMF_NO_PERMISSION;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw break;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * cleanup if there were any errors that didn't leave these
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * values where they would be cleaned up later.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (value != NULL)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw scf_value_destroy(value);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (entry != NULL)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw scf_entry_destroy(entry);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (ret);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw}
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Gets a blob property value.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Caller is responsible to have enough memory allocated.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwint
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwsmb_smf_get_opaque_property(smb_scfhandle_t *handle, char *propname,
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw void *v, size_t sz)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw{
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw int ret = SMBD_SMF_OK;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw scf_value_t *value = NULL;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw scf_property_t *prop = NULL;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (handle == NULL)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (SMBD_SMF_SYSTEM_ERR);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw value = scf_value_create(handle->scf_handle);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw prop = scf_property_create(handle->scf_handle);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if ((prop) && (value) &&
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw (scf_pg_get_property(handle->scf_pg, propname, prop) == 0)) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (scf_property_get_value(prop, value) == 0) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (scf_value_get_opaque(value, (char *)v, sz) != sz) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw ret = SMBD_SMF_SYSTEM_ERR;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw } else {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw ret = SMBD_SMF_SYSTEM_ERR;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw } else {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw ret = SMBD_SMF_SYSTEM_ERR;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (value != NULL)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw scf_value_destroy(value);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (prop != NULL)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw scf_property_destroy(prop);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (ret);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw}
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross/*
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * Delete a property (for properties obsoleted during an upgrade).
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rossint
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rosssmb_smf_delete_property(smb_scfhandle_t *handle, char *propname)
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross{
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross scf_transaction_entry_t *entry;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross int ret = SMBD_SMF_OK;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross if (handle == NULL)
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross return (SMBD_SMF_SYSTEM_ERR);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross if (handle->scf_trans == NULL)
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross return (SMBD_SMF_SYSTEM_ERR);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross /*
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * properties must be set in transactions and don't take
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross * effect until the transaction has been ended/committed.
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross entry = scf_entry_create(handle->scf_handle);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross if (entry == NULL) {
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross ret = SMBD_SMF_SYSTEM_ERR;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross goto out;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross }
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross if (scf_transaction_property_delete(handle->scf_trans,
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross entry, propname) == 0) {
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross /* the entry is in the transaction */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross entry = NULL;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross } else {
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross switch (scf_error()) {
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross case SCF_ERROR_NOT_FOUND:
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross /* Did not exist. We're done. */
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross ret = SMBD_SMF_OK;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross goto out;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross case SCF_ERROR_PERMISSION_DENIED:
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross ret = SMBD_SMF_NO_PERMISSION;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross goto out;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross default:
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross ret = SMBD_SMF_SYSTEM_ERR;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross goto out;
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross }
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross }
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Rossout:
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross scf_entry_destroy(entry);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross return (ret);
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross}
a90cf9f29973990687fa61de9f1f6ea22e924e40Gordon Ross
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego/*
8d7e41661dc4633488e93b13363137523ce59977jose borrego * Put the smb service into maintenance mode.
8d7e41661dc4633488e93b13363137523ce59977jose borrego */
8d7e41661dc4633488e93b13363137523ce59977jose borregoint
8d7e41661dc4633488e93b13363137523ce59977jose borregosmb_smf_maintenance_mode(void)
8d7e41661dc4633488e93b13363137523ce59977jose borrego{
8d7e41661dc4633488e93b13363137523ce59977jose borrego return (smf_maintain_instance(SMBD_DEFAULT_INSTANCE_FMRI, 0));
8d7e41661dc4633488e93b13363137523ce59977jose borrego}
8d7e41661dc4633488e93b13363137523ce59977jose borrego
8d7e41661dc4633488e93b13363137523ce59977jose borrego/*
8d7e41661dc4633488e93b13363137523ce59977jose borrego * Restart the smb service.
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego */
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borregoint
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borregosmb_smf_restart_service(void)
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego{
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego return (smf_restart_instance(SMBD_DEFAULT_INSTANCE_FMRI));
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego}
c8ec8eea9849cac239663c46be8a7f5d2ba7ca00jose borrego
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * smb_smf_scf_init()
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * must be called before using any of the SCF functions.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Returns smb_scfhandle_t pointer if success.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwsmb_scfhandle_t *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwsmb_smf_scf_init(char *svc_name)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw{
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw smb_scfhandle_t *handle;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw handle = malloc(sizeof (smb_scfhandle_t));
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (handle != NULL) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw bzero((char *)handle, sizeof (smb_scfhandle_t));
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw handle->scf_state = SCH_STATE_INITIALIZING;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw handle->scf_handle = scf_handle_create(SCF_VERSION);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (handle->scf_handle != NULL) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (scf_handle_bind(handle->scf_handle) == 0) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw handle->scf_scope =
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw scf_scope_create(handle->scf_handle);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb if (handle->scf_scope == NULL)
7b59d02d2a384be9a08087b14defadd214b3c1ddjb goto err;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (scf_handle_get_local_scope(
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw handle->scf_handle, handle->scf_scope) != 0)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw goto err;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw handle->scf_service =
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw scf_service_create(handle->scf_handle);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
7b59d02d2a384be9a08087b14defadd214b3c1ddjb if (handle->scf_service == NULL)
7b59d02d2a384be9a08087b14defadd214b3c1ddjb goto err;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (scf_scope_get_service(handle->scf_scope,
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw svc_name, handle->scf_service)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw != SCF_SUCCESS) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw goto err;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw handle->scf_pg =
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw scf_pg_create(handle->scf_handle);
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
7b59d02d2a384be9a08087b14defadd214b3c1ddjb if (handle->scf_pg == NULL)
7b59d02d2a384be9a08087b14defadd214b3c1ddjb goto err;
7b59d02d2a384be9a08087b14defadd214b3c1ddjb
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw handle->scf_state = SCH_STATE_INIT;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw } else {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw goto err;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw } else {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw free(handle);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw handle = NULL;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw smb_smf_scf_log_error("Could not access SMF "
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw "repository: %s\n");
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (handle);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /* error handling/unwinding */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwerr:
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw (void) smb_smf_scf_fini(handle);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw (void) smb_smf_scf_log_error("SMF initialization problem: %s\n");
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (NULL);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw}
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * smb_smf_scf_fini(handle)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * must be called when done. Called with the handle allocated in
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * smb_smf_scf_init(), it cleans up the state and frees any SCF resources
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * still in use.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwvoid
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwsmb_smf_scf_fini(smb_scfhandle_t *handle)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw{
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (handle != NULL) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw int unbind = 0;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw scf_iter_destroy(handle->scf_pg_iter);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw handle->scf_pg_iter = NULL;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw scf_iter_destroy(handle->scf_inst_iter);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw handle->scf_inst_iter = NULL;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw unbind = 1;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw scf_scope_destroy(handle->scf_scope);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw handle->scf_scope = NULL;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw scf_instance_destroy(handle->scf_instance);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw handle->scf_instance = NULL;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw scf_service_destroy(handle->scf_service);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw handle->scf_service = NULL;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw scf_pg_destroy(handle->scf_pg);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw handle->scf_pg = NULL;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw handle->scf_state = SCH_STATE_UNINIT;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (unbind)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw (void) scf_handle_unbind(handle->scf_handle);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw scf_handle_destroy(handle->scf_handle);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw handle->scf_handle = NULL;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw free(handle);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw}