6185db853e024a486ff8837e6784dd290d866112dougm/*
6185db853e024a486ff8837e6784dd290d866112dougm * CDDL HEADER START
6185db853e024a486ff8837e6784dd290d866112dougm *
6185db853e024a486ff8837e6784dd290d866112dougm * The contents of this file are subject to the terms of the
6185db853e024a486ff8837e6784dd290d866112dougm * Common Development and Distribution License (the "License").
6185db853e024a486ff8837e6784dd290d866112dougm * You may not use this file except in compliance with the License.
6185db853e024a486ff8837e6784dd290d866112dougm *
6185db853e024a486ff8837e6784dd290d866112dougm * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
6185db853e024a486ff8837e6784dd290d866112dougm * or http://www.opensolaris.org/os/licensing.
6185db853e024a486ff8837e6784dd290d866112dougm * See the License for the specific language governing permissions
6185db853e024a486ff8837e6784dd290d866112dougm * and limitations under the License.
6185db853e024a486ff8837e6784dd290d866112dougm *
6185db853e024a486ff8837e6784dd290d866112dougm * When distributing Covered Code, include this CDDL HEADER in each
6185db853e024a486ff8837e6784dd290d866112dougm * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
6185db853e024a486ff8837e6784dd290d866112dougm * If applicable, add the following below this CDDL HEADER, with the
6185db853e024a486ff8837e6784dd290d866112dougm * fields enclosed by brackets "[]" replaced with your own identifying
6185db853e024a486ff8837e6784dd290d866112dougm * information: Portions Copyright [yyyy] [name of copyright owner]
6185db853e024a486ff8837e6784dd290d866112dougm *
6185db853e024a486ff8837e6784dd290d866112dougm * CDDL HEADER END
6185db853e024a486ff8837e6784dd290d866112dougm */
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm/*
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krier * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
6185db853e024a486ff8837e6784dd290d866112dougm * Use is subject to license terms.
6185db853e024a486ff8837e6784dd290d866112dougm */
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm/* helper functions for using libscf with sharemgr */
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm#include <libscf.h>
6185db853e024a486ff8837e6784dd290d866112dougm#include <libxml/parser.h>
6185db853e024a486ff8837e6784dd290d866112dougm#include <libxml/tree.h>
6185db853e024a486ff8837e6784dd290d866112dougm#include "libshare.h"
6185db853e024a486ff8837e6784dd290d866112dougm#include "libshare_impl.h"
6185db853e024a486ff8837e6784dd290d866112dougm#include "scfutil.h"
6185db853e024a486ff8837e6784dd290d866112dougm#include <string.h>
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw#include <ctype.h>
6185db853e024a486ff8837e6784dd290d866112dougm#include <errno.h>
6185db853e024a486ff8837e6784dd290d866112dougm#include <uuid/uuid.h>
6185db853e024a486ff8837e6784dd290d866112dougm#include <sys/param.h>
f345c0beb4c8f75cb54c2e070498e56febd468acdougm#include <signal.h>
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm#include <sys/time.h>
1f29d134f841501a6ae1c2be035dd0647720537cdougm#include <libintl.h>
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougmssize_t scf_max_name_len;
6185db853e024a486ff8837e6784dd290d866112dougmextern struct sa_proto_plugin *sap_proto_list;
549ec3fff108310966327d1dc9004551b63210b7dougmextern sa_handle_impl_t get_handle_for_root(xmlNodePtr);
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougmstatic void set_transaction_tstamp(sa_handle_impl_t);
6185db853e024a486ff8837e6784dd290d866112dougm/*
6185db853e024a486ff8837e6784dd290d866112dougm * The SMF facility uses some properties that must exist. We want to
6185db853e024a486ff8837e6784dd290d866112dougm * skip over these when processing protocol options.
6185db853e024a486ff8837e6784dd290d866112dougm */
6185db853e024a486ff8837e6784dd290d866112dougmstatic char *skip_props[] = {
6185db853e024a486ff8837e6784dd290d866112dougm "modify_authorization",
6185db853e024a486ff8837e6784dd290d866112dougm "action_authorization",
6185db853e024a486ff8837e6784dd290d866112dougm "value_authorization",
6185db853e024a486ff8837e6784dd290d866112dougm NULL
6185db853e024a486ff8837e6784dd290d866112dougm};
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm/*
6185db853e024a486ff8837e6784dd290d866112dougm * sa_scf_fini(handle)
6185db853e024a486ff8837e6784dd290d866112dougm *
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * Must be called when done. Called with the handle allocated in
6185db853e024a486ff8837e6784dd290d866112dougm * sa_scf_init(), it cleans up the state and frees any SCF resources
6185db853e024a486ff8837e6784dd290d866112dougm * still in use. Called by sa_fini().
6185db853e024a486ff8837e6784dd290d866112dougm */
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougmvoid
6185db853e024a486ff8837e6784dd290d866112dougmsa_scf_fini(scfutilhandle_t *handle)
6185db853e024a486ff8837e6784dd290d866112dougm{
6185db853e024a486ff8837e6784dd290d866112dougm if (handle != NULL) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm int unbind = 0;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (handle->scope != NULL) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm unbind = 1;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm scf_scope_destroy(handle->scope);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm }
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (handle->instance != NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm scf_instance_destroy(handle->instance);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (handle->service != NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm scf_service_destroy(handle->service);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (handle->pg != NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm scf_pg_destroy(handle->pg);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (handle->handle != NULL) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm handle->scf_state = SCH_STATE_UNINIT;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (unbind)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm (void) scf_handle_unbind(handle->handle);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm scf_handle_destroy(handle->handle);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm }
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm free(handle);
6185db853e024a486ff8837e6784dd290d866112dougm }
6185db853e024a486ff8837e6784dd290d866112dougm}
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm/*
6185db853e024a486ff8837e6784dd290d866112dougm * sa_scf_init()
6185db853e024a486ff8837e6784dd290d866112dougm *
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * Must be called before using any of the SCF functions. Called by
6185db853e024a486ff8837e6784dd290d866112dougm * sa_init() during the API setup.
6185db853e024a486ff8837e6784dd290d866112dougm */
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougmscfutilhandle_t *
549ec3fff108310966327d1dc9004551b63210b7dougmsa_scf_init(sa_handle_impl_t ihandle)
6185db853e024a486ff8837e6784dd290d866112dougm{
6185db853e024a486ff8837e6784dd290d866112dougm scfutilhandle_t *handle;
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm scf_max_name_len = scf_limit(SCF_LIMIT_MAX_NAME_LENGTH);
6185db853e024a486ff8837e6784dd290d866112dougm if (scf_max_name_len <= 0)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm scf_max_name_len = SA_MAX_NAME_LEN + 1;
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm handle = calloc(1, sizeof (scfutilhandle_t));
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (handle == NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm return (handle);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm ihandle->scfhandle = handle;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm handle->scf_state = SCH_STATE_INITIALIZING;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm handle->handle = scf_handle_create(SCF_VERSION);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (handle->handle == NULL) {
6185db853e024a486ff8837e6784dd290d866112dougm free(handle);
6185db853e024a486ff8837e6784dd290d866112dougm handle = NULL;
6185db853e024a486ff8837e6784dd290d866112dougm (void) printf("libshare could not access SMF repository: %s\n",
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm scf_strerror(scf_error()));
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm return (handle);
6185db853e024a486ff8837e6784dd290d866112dougm }
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (scf_handle_bind(handle->handle) != 0)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm goto err;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm handle->scope = scf_scope_create(handle->handle);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm handle->service = scf_service_create(handle->handle);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm handle->pg = scf_pg_create(handle->handle);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm /* Make sure we have sufficient SMF running */
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm handle->instance = scf_instance_create(handle->handle);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (handle->scope == NULL || handle->service == NULL ||
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm handle->pg == NULL || handle->instance == NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm goto err;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (scf_handle_get_scope(handle->handle,
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm SCF_SCOPE_LOCAL, handle->scope) != 0)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm goto err;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (scf_scope_get_service(handle->scope,
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm SA_GROUP_SVC_NAME, handle->service) != 0)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm goto err;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm handle->scf_state = SCH_STATE_INIT;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (sa_get_instance(handle, "default") != SA_OK) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm sa_group_t defgrp;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm defgrp = sa_create_group((sa_handle_t)ihandle, "default", NULL);
1f29d134f841501a6ae1c2be035dd0647720537cdougm /* Only NFS enabled for "default" group. */
1f29d134f841501a6ae1c2be035dd0647720537cdougm if (defgrp != NULL)
1f29d134f841501a6ae1c2be035dd0647720537cdougm (void) sa_create_optionset(defgrp, "nfs");
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm }
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm
6185db853e024a486ff8837e6784dd290d866112dougm return (handle);
6185db853e024a486ff8837e6784dd290d866112dougm
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm /* Error handling/unwinding */
6185db853e024a486ff8837e6784dd290d866112dougmerr:
6185db853e024a486ff8837e6784dd290d866112dougm (void) sa_scf_fini(handle);
6185db853e024a486ff8837e6784dd290d866112dougm (void) printf("libshare SMF initialization problem: %s\n",
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm scf_strerror(scf_error()));
6185db853e024a486ff8837e6784dd290d866112dougm return (NULL);
6185db853e024a486ff8837e6784dd290d866112dougm}
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm/*
6185db853e024a486ff8837e6784dd290d866112dougm * get_scf_limit(name)
6185db853e024a486ff8837e6784dd290d866112dougm *
6185db853e024a486ff8837e6784dd290d866112dougm * Since we use scf_limit a lot and do the same check and return the
6185db853e024a486ff8837e6784dd290d866112dougm * same value if it fails, implement as a function for code
6185db853e024a486ff8837e6784dd290d866112dougm * simplification. Basically, if name isn't found, return MAXPATHLEN
6185db853e024a486ff8837e6784dd290d866112dougm * (1024) so we have a reasonable default buffer size.
6185db853e024a486ff8837e6784dd290d866112dougm */
6185db853e024a486ff8837e6784dd290d866112dougmstatic ssize_t
6185db853e024a486ff8837e6784dd290d866112dougmget_scf_limit(uint32_t name)
6185db853e024a486ff8837e6784dd290d866112dougm{
6185db853e024a486ff8837e6784dd290d866112dougm ssize_t vallen;
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm vallen = scf_limit(name);
6185db853e024a486ff8837e6784dd290d866112dougm if (vallen == (ssize_t)-1)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm vallen = MAXPATHLEN;
6185db853e024a486ff8837e6784dd290d866112dougm return (vallen);
6185db853e024a486ff8837e6784dd290d866112dougm}
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm/*
6185db853e024a486ff8837e6784dd290d866112dougm * skip_property(name)
6185db853e024a486ff8837e6784dd290d866112dougm *
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * Internal function to check to see if a property is an SMF magic
6185db853e024a486ff8837e6784dd290d866112dougm * property that needs to be skipped.
6185db853e024a486ff8837e6784dd290d866112dougm */
6185db853e024a486ff8837e6784dd290d866112dougmstatic int
6185db853e024a486ff8837e6784dd290d866112dougmskip_property(char *name)
6185db853e024a486ff8837e6784dd290d866112dougm{
6185db853e024a486ff8837e6784dd290d866112dougm int i;
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm for (i = 0; skip_props[i] != NULL; i++)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (strcmp(name, skip_props[i]) == 0)
6185db853e024a486ff8837e6784dd290d866112dougm return (1);
6185db853e024a486ff8837e6784dd290d866112dougm return (0);
6185db853e024a486ff8837e6784dd290d866112dougm}
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm/*
6185db853e024a486ff8837e6784dd290d866112dougm * generate_unique_sharename(sharename)
6185db853e024a486ff8837e6784dd290d866112dougm *
6185db853e024a486ff8837e6784dd290d866112dougm * Shares are represented in SMF as property groups. Due to share
6185db853e024a486ff8837e6784dd290d866112dougm * paths containing characters that are not allowed in SMF names and
6185db853e024a486ff8837e6784dd290d866112dougm * the need to be unique, we use UUIDs to construct a unique name.
6185db853e024a486ff8837e6784dd290d866112dougm */
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougmstatic void
6185db853e024a486ff8837e6784dd290d866112dougmgenerate_unique_sharename(char *sharename)
6185db853e024a486ff8837e6784dd290d866112dougm{
6185db853e024a486ff8837e6784dd290d866112dougm uuid_t uuid;
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm uuid_generate(uuid);
6185db853e024a486ff8837e6784dd290d866112dougm (void) strcpy(sharename, "S-");
6185db853e024a486ff8837e6784dd290d866112dougm uuid_unparse(uuid, sharename + 2);
6185db853e024a486ff8837e6784dd290d866112dougm}
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm/*
6185db853e024a486ff8837e6784dd290d866112dougm * valid_protocol(proto)
6185db853e024a486ff8837e6784dd290d866112dougm *
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * Check to see if the specified protocol is a valid one for the
6185db853e024a486ff8837e6784dd290d866112dougm * general sharemgr facility. We determine this by checking which
6185db853e024a486ff8837e6784dd290d866112dougm * plugin protocols were found.
6185db853e024a486ff8837e6784dd290d866112dougm */
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougmstatic int
6185db853e024a486ff8837e6784dd290d866112dougmvalid_protocol(char *proto)
6185db853e024a486ff8837e6784dd290d866112dougm{
6185db853e024a486ff8837e6784dd290d866112dougm struct sa_proto_plugin *plugin;
6185db853e024a486ff8837e6784dd290d866112dougm for (plugin = sap_proto_list; plugin != NULL;
6185db853e024a486ff8837e6784dd290d866112dougm plugin = plugin->plugin_next)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (strcmp(proto, plugin->plugin_ops->sa_protocol) == 0)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm return (1);
6185db853e024a486ff8837e6784dd290d866112dougm return (0);
6185db853e024a486ff8837e6784dd290d866112dougm}
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm/*
6185db853e024a486ff8837e6784dd290d866112dougm * sa_extract_pgroup(root, handle, pg, nodetype, proto, sectype)
6185db853e024a486ff8837e6784dd290d866112dougm *
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * Extract the name property group and create the specified type of
6185db853e024a486ff8837e6784dd290d866112dougm * node on the provided group. type will be optionset or security.
6185db853e024a486ff8837e6784dd290d866112dougm */
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougmstatic int
6185db853e024a486ff8837e6784dd290d866112dougmsa_extract_pgroup(xmlNodePtr root, scfutilhandle_t *handle,
6185db853e024a486ff8837e6784dd290d866112dougm scf_propertygroup_t *pg,
6185db853e024a486ff8837e6784dd290d866112dougm char *nodetype, char *proto, char *sectype)
6185db853e024a486ff8837e6784dd290d866112dougm{
6185db853e024a486ff8837e6784dd290d866112dougm xmlNodePtr node;
6185db853e024a486ff8837e6784dd290d866112dougm scf_iter_t *iter;
6185db853e024a486ff8837e6784dd290d866112dougm scf_property_t *prop;
6185db853e024a486ff8837e6784dd290d866112dougm scf_value_t *value;
6185db853e024a486ff8837e6784dd290d866112dougm char *name;
6185db853e024a486ff8837e6784dd290d866112dougm char *valuestr;
6185db853e024a486ff8837e6784dd290d866112dougm ssize_t vallen;
6185db853e024a486ff8837e6784dd290d866112dougm int ret = SA_OK;
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm vallen = get_scf_limit(SCF_LIMIT_MAX_VALUE_LENGTH);
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm node = xmlNewChild(root, NULL, (xmlChar *)nodetype, NULL);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (node == NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm return (ret);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (proto != NULL)
7a9d7716b53eb5c2c08bf4f0fdf4369571dbde4dthurlow (void) xmlSetProp(node, (xmlChar *)"type", (xmlChar *)proto);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (sectype != NULL)
7a9d7716b53eb5c2c08bf4f0fdf4369571dbde4dthurlow (void) xmlSetProp(node, (xmlChar *)"sectype",
7a9d7716b53eb5c2c08bf4f0fdf4369571dbde4dthurlow (xmlChar *)sectype);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm /*
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * Have node to work with so iterate over the properties
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * in the pg and create option sub nodes.
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm */
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm iter = scf_iter_create(handle->handle);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm value = scf_value_create(handle->handle);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm prop = scf_property_create(handle->handle);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm name = malloc(scf_max_name_len);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm valuestr = malloc(vallen);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm /*
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * Want to iterate through the properties and add them
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * to the base optionset.
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm */
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (iter == NULL || value == NULL || prop == NULL ||
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm valuestr == NULL || name == NULL) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm ret = SA_NO_MEMORY;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm goto out;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm }
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (scf_iter_pg_properties(iter, pg) == 0) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm /* Now iterate the properties in the group */
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm while (scf_iter_next_property(iter, prop) > 0) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm /* have a property */
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (scf_property_get_name(prop, name,
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm scf_max_name_len) > 0) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm sa_property_t saprop;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm /* Some properties are part of the framework */
6185db853e024a486ff8837e6784dd290d866112dougm if (skip_property(name))
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm continue;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (scf_property_get_value(prop, value) != 0)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm continue;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (scf_value_get_astring(value, valuestr,
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm vallen) < 0)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm continue;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm saprop = sa_create_property(name, valuestr);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (saprop != NULL) {
6185db853e024a486ff8837e6784dd290d866112dougm /*
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * Since in SMF, don't
6185db853e024a486ff8837e6784dd290d866112dougm * recurse. Use xmlAddChild
6185db853e024a486ff8837e6784dd290d866112dougm * directly, instead.
6185db853e024a486ff8837e6784dd290d866112dougm */
7a9d7716b53eb5c2c08bf4f0fdf4369571dbde4dthurlow (void) xmlAddChild(node,
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm (xmlNodePtr) saprop);
6185db853e024a486ff8837e6784dd290d866112dougm }
6185db853e024a486ff8837e6784dd290d866112dougm }
6185db853e024a486ff8837e6784dd290d866112dougm }
6185db853e024a486ff8837e6784dd290d866112dougm }
25a68471b9ababbc21cfdbbb2866014f34f419ecdougmout:
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm /* cleanup to avoid memory leaks */
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (value != NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm scf_value_destroy(value);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (iter != NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm scf_iter_destroy(iter);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (prop != NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm scf_property_destroy(prop);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (name != NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm free(name);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (valuestr != NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm free(valuestr);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm
6185db853e024a486ff8837e6784dd290d866112dougm return (ret);
6185db853e024a486ff8837e6784dd290d866112dougm}
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm/*
6185db853e024a486ff8837e6784dd290d866112dougm * sa_extract_attrs(root, handle, instance)
6185db853e024a486ff8837e6784dd290d866112dougm *
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * Local function to extract the actual attributes/properties from the
6185db853e024a486ff8837e6784dd290d866112dougm * property group of the service instance. These are the well known
6185db853e024a486ff8837e6784dd290d866112dougm * attributes of "state" and "zfs". If additional attributes are
6185db853e024a486ff8837e6784dd290d866112dougm * added, they should be added here.
6185db853e024a486ff8837e6784dd290d866112dougm */
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougmstatic void
6185db853e024a486ff8837e6784dd290d866112dougmsa_extract_attrs(xmlNodePtr root, scfutilhandle_t *handle,
6185db853e024a486ff8837e6784dd290d866112dougm scf_instance_t *instance)
6185db853e024a486ff8837e6784dd290d866112dougm{
6185db853e024a486ff8837e6784dd290d866112dougm scf_property_t *prop;
6185db853e024a486ff8837e6784dd290d866112dougm scf_value_t *value;
6185db853e024a486ff8837e6784dd290d866112dougm char *valuestr;
6185db853e024a486ff8837e6784dd290d866112dougm ssize_t vallen;
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm vallen = get_scf_limit(SCF_LIMIT_MAX_VALUE_LENGTH);
6185db853e024a486ff8837e6784dd290d866112dougm prop = scf_property_create(handle->handle);
6185db853e024a486ff8837e6784dd290d866112dougm value = scf_value_create(handle->handle);
6185db853e024a486ff8837e6784dd290d866112dougm valuestr = malloc(vallen);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (prop == NULL || value == NULL || valuestr == NULL ||
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm scf_instance_get_pg(instance, "operation", handle->pg) != 0) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm goto out;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm }
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm /*
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * Have a property group with desired name so now get
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * the known attributes.
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm */
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (scf_pg_get_property(handle->pg, "state", prop) == 0) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm /* Found the property so get the value */
6185db853e024a486ff8837e6784dd290d866112dougm if (scf_property_get_value(prop, value) == 0) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (scf_value_get_astring(value, valuestr,
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm vallen) >= 0) {
7a9d7716b53eb5c2c08bf4f0fdf4369571dbde4dthurlow (void) xmlSetProp(root, (xmlChar *)"state",
6185db853e024a486ff8837e6784dd290d866112dougm (xmlChar *)valuestr);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm }
6185db853e024a486ff8837e6784dd290d866112dougm }
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm }
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (scf_pg_get_property(handle->pg, "zfs", prop) == 0) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm /* Found the property so get the value */
6185db853e024a486ff8837e6784dd290d866112dougm if (scf_property_get_value(prop, value) == 0) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (scf_value_get_astring(value, valuestr,
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm vallen) > 0) {
7a9d7716b53eb5c2c08bf4f0fdf4369571dbde4dthurlow (void) xmlSetProp(root, (xmlChar *)"zfs",
6185db853e024a486ff8837e6784dd290d866112dougm (xmlChar *)valuestr);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm }
6185db853e024a486ff8837e6784dd290d866112dougm }
6185db853e024a486ff8837e6784dd290d866112dougm }
25a68471b9ababbc21cfdbbb2866014f34f419ecdougmout:
6185db853e024a486ff8837e6784dd290d866112dougm if (valuestr != NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm free(valuestr);
6185db853e024a486ff8837e6784dd290d866112dougm if (value != NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm scf_value_destroy(value);
6185db853e024a486ff8837e6784dd290d866112dougm if (prop != NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm scf_property_destroy(prop);
6185db853e024a486ff8837e6784dd290d866112dougm}
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm/*
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * List of known share attributes.
6185db853e024a486ff8837e6784dd290d866112dougm */
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougmstatic char *share_attr[] = {
6185db853e024a486ff8837e6784dd290d866112dougm "path",
6185db853e024a486ff8837e6784dd290d866112dougm "id",
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw "drive-letter",
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw "exclude",
6185db853e024a486ff8837e6784dd290d866112dougm NULL,
6185db853e024a486ff8837e6784dd290d866112dougm};
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougmstatic int
6185db853e024a486ff8837e6784dd290d866112dougmis_share_attr(char *name)
6185db853e024a486ff8837e6784dd290d866112dougm{
6185db853e024a486ff8837e6784dd290d866112dougm int i;
6185db853e024a486ff8837e6784dd290d866112dougm for (i = 0; share_attr[i] != NULL; i++)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (strcmp(name, share_attr[i]) == 0)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm return (1);
6185db853e024a486ff8837e6784dd290d866112dougm return (0);
6185db853e024a486ff8837e6784dd290d866112dougm}
6185db853e024a486ff8837e6784dd290d866112dougm
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * _sa_make_resource(node, valuestr)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Make a resource node on the share node. The valusestr will either
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * be old format (SMF acceptable string) or new format (pretty much an
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * arbitrary string with "nnn:" prefixing in order to persist
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * mapping). The input valuestr will get modified in place. This is
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * only used in SMF repository parsing. A possible third field will be
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * a "description" string.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwstatic void
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw_sa_make_resource(xmlNodePtr node, char *valuestr)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw{
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw char *idx;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw char *name;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw char *description = NULL;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw idx = valuestr;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw name = strchr(valuestr, ':');
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (name == NULL) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /* this is old form so give an index of "0" */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw idx = "0";
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw name = valuestr;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw } else {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /* NUL the ':' and move past it */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *name++ = '\0';
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /* There could also be a description string */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw description = strchr(name, ':');
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (description != NULL)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *description++ = '\0';
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw node = xmlNewChild(node, NULL, (xmlChar *)"resource", NULL);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (node != NULL) {
7a9d7716b53eb5c2c08bf4f0fdf4369571dbde4dthurlow (void) xmlSetProp(node, (xmlChar *)"name", (xmlChar *)name);
7a9d7716b53eb5c2c08bf4f0fdf4369571dbde4dthurlow (void) xmlSetProp(node, (xmlChar *)"id", (xmlChar *)idx);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /* SMF values are always persistent */
7a9d7716b53eb5c2c08bf4f0fdf4369571dbde4dthurlow (void) xmlSetProp(node, (xmlChar *)"type",
7a9d7716b53eb5c2c08bf4f0fdf4369571dbde4dthurlow (xmlChar *)"persist");
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (description != NULL && strlen(description) > 0) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw (void) xmlNewChild(node, NULL, (xmlChar *)"description",
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw (xmlChar *)description);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw}
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
6185db853e024a486ff8837e6784dd290d866112dougm/*
6185db853e024a486ff8837e6784dd290d866112dougm * sa_share_from_pgroup
6185db853e024a486ff8837e6784dd290d866112dougm *
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * Extract the share definition from the share property group. We do
6185db853e024a486ff8837e6784dd290d866112dougm * some sanity checking to avoid bad data.
6185db853e024a486ff8837e6784dd290d866112dougm *
6185db853e024a486ff8837e6784dd290d866112dougm * Since this is only constructing the internal data structures, we
6185db853e024a486ff8837e6784dd290d866112dougm * don't use the sa_* functions most of the time.
6185db853e024a486ff8837e6784dd290d866112dougm */
6185db853e024a486ff8837e6784dd290d866112dougmvoid
6185db853e024a486ff8837e6784dd290d866112dougmsa_share_from_pgroup(xmlNodePtr root, scfutilhandle_t *handle,
6185db853e024a486ff8837e6784dd290d866112dougm scf_propertygroup_t *pg, char *id)
6185db853e024a486ff8837e6784dd290d866112dougm{
6185db853e024a486ff8837e6784dd290d866112dougm xmlNodePtr node;
6185db853e024a486ff8837e6784dd290d866112dougm char *name;
6185db853e024a486ff8837e6784dd290d866112dougm scf_iter_t *iter;
6185db853e024a486ff8837e6784dd290d866112dougm scf_property_t *prop;
6185db853e024a486ff8837e6784dd290d866112dougm scf_value_t *value;
6185db853e024a486ff8837e6784dd290d866112dougm ssize_t vallen;
6185db853e024a486ff8837e6784dd290d866112dougm char *valuestr;
6185db853e024a486ff8837e6784dd290d866112dougm int ret = SA_OK;
f345c0beb4c8f75cb54c2e070498e56febd468acdougm int have_path = 0;
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm /*
6185db853e024a486ff8837e6784dd290d866112dougm * While preliminary check (starts with 'S') passed before
6185db853e024a486ff8837e6784dd290d866112dougm * getting here. Need to make sure it is in ID syntax
6185db853e024a486ff8837e6784dd290d866112dougm * (Snnnnnn). Note that shares with properties have similar
6185db853e024a486ff8837e6784dd290d866112dougm * pgroups.
6185db853e024a486ff8837e6784dd290d866112dougm */
6185db853e024a486ff8837e6784dd290d866112dougm vallen = strlen(id);
6185db853e024a486ff8837e6784dd290d866112dougm if (*id == SA_SHARE_PG_PREFIX[0] && vallen == SA_SHARE_PG_LEN) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm uuid_t uuid;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (strncmp(id, SA_SHARE_PG_PREFIX,
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm SA_SHARE_PG_PREFIXLEN) != 0 ||
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm uuid_parse(id + 2, uuid) < 0)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm return;
6185db853e024a486ff8837e6784dd290d866112dougm } else {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm return;
6185db853e024a486ff8837e6784dd290d866112dougm }
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm vallen = get_scf_limit(SCF_LIMIT_MAX_VALUE_LENGTH);
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm iter = scf_iter_create(handle->handle);
6185db853e024a486ff8837e6784dd290d866112dougm value = scf_value_create(handle->handle);
6185db853e024a486ff8837e6784dd290d866112dougm prop = scf_property_create(handle->handle);
6185db853e024a486ff8837e6784dd290d866112dougm name = malloc(scf_max_name_len);
6185db853e024a486ff8837e6784dd290d866112dougm valuestr = malloc(vallen);
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm /*
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * Construct the share XML node. It is similar to sa_add_share
6185db853e024a486ff8837e6784dd290d866112dougm * but never changes the repository. Also, there won't be any
6185db853e024a486ff8837e6784dd290d866112dougm * ZFS or transient shares. Root will be the group it is
6185db853e024a486ff8837e6784dd290d866112dougm * associated with.
6185db853e024a486ff8837e6784dd290d866112dougm */
6185db853e024a486ff8837e6784dd290d866112dougm node = xmlNewChild(root, NULL, (xmlChar *)"share", NULL);
6185db853e024a486ff8837e6784dd290d866112dougm if (node != NULL) {
6185db853e024a486ff8837e6784dd290d866112dougm /*
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * Make sure the UUID part of the property group is
6185db853e024a486ff8837e6784dd290d866112dougm * stored in the share "id" property. We use this
6185db853e024a486ff8837e6784dd290d866112dougm * later.
6185db853e024a486ff8837e6784dd290d866112dougm */
7a9d7716b53eb5c2c08bf4f0fdf4369571dbde4dthurlow (void) xmlSetProp(node, (xmlChar *)"id", (xmlChar *)id);
7a9d7716b53eb5c2c08bf4f0fdf4369571dbde4dthurlow (void) xmlSetProp(node, (xmlChar *)"type",
7a9d7716b53eb5c2c08bf4f0fdf4369571dbde4dthurlow (xmlChar *)"persist");
6185db853e024a486ff8837e6784dd290d866112dougm }
6185db853e024a486ff8837e6784dd290d866112dougm
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (iter == NULL || value == NULL || prop == NULL || name == NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm goto out;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm /* Iterate over the share pg properties */
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (scf_iter_pg_properties(iter, pg) != 0)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm goto out;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm while (scf_iter_next_property(iter, prop) > 0) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm ret = SA_SYSTEM_ERR; /* assume the worst */
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (scf_property_get_name(prop, name, scf_max_name_len) > 0) {
6185db853e024a486ff8837e6784dd290d866112dougm if (scf_property_get_value(prop, value) == 0) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (scf_value_get_astring(value, valuestr,
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm vallen) >= 0) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm ret = SA_OK;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw } else if (strcmp(name, "resource") == 0) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw ret = SA_OK;
6185db853e024a486ff8837e6784dd290d866112dougm }
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (ret != SA_OK)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw continue;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Check that we have the "path" property in
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * name. The string in name will always be nul
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * terminated if scf_property_get_name()
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * succeeded.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (strcmp(name, "path") == 0)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw have_path = 1;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (is_share_attr(name)) {
f345c0beb4c8f75cb54c2e070498e56febd468acdougm /*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * If a share attr, then simple -
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * usually path and id name
f345c0beb4c8f75cb54c2e070498e56febd468acdougm */
7a9d7716b53eb5c2c08bf4f0fdf4369571dbde4dthurlow (void) xmlSetProp(node, (xmlChar *)name,
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw (xmlChar *)valuestr);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw } else if (strcmp(name, "resource") == 0) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Resource names handled differently since
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * there can be multiple on each share. The
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * "resource" id must be preserved since this
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * will be used by some protocols in mapping
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * "property spaces" to names and is always
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * used to create SMF property groups specific
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * to resources. CIFS needs this. The first
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * value is present so add and then loop for
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * any additional. Since this is new and
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * previous values may exist, handle
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * conversions.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw scf_iter_t *viter;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw viter = scf_iter_create(handle->handle);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (viter != NULL &&
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw scf_iter_property_values(viter, prop) == 0) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw while (scf_iter_next_value(viter, value) > 0) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /* Have a value so process it */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (scf_value_get_ustring(value,
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw valuestr, vallen) >= 0) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /* have a ustring */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw _sa_make_resource(node,
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw valuestr);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw } else if (scf_value_get_astring(value,
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw valuestr, vallen) >= 0) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /* have an astring */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw _sa_make_resource(node,
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw valuestr);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw scf_iter_destroy(viter);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw } else {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (strcmp(name, "description") == 0) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /* We have a description node */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw xmlNodePtr desc;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw desc = xmlNewChild(node, NULL,
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw (xmlChar *)"description", NULL);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (desc != NULL)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw xmlNodeSetContent(desc,
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw (xmlChar *)valuestr);
6185db853e024a486ff8837e6784dd290d866112dougm }
6185db853e024a486ff8837e6784dd290d866112dougm }
6185db853e024a486ff8837e6784dd290d866112dougm }
25a68471b9ababbc21cfdbbb2866014f34f419ecdougmout:
f345c0beb4c8f75cb54c2e070498e56febd468acdougm /*
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * A share without a path is broken so we want to not include
f345c0beb4c8f75cb54c2e070498e56febd468acdougm * these. They shouldn't happen but if you kill a sharemgr in
f345c0beb4c8f75cb54c2e070498e56febd468acdougm * the process of creating a share, it could happen. They
f345c0beb4c8f75cb54c2e070498e56febd468acdougm * should be harmless. It is also possible that another
f345c0beb4c8f75cb54c2e070498e56febd468acdougm * sharemgr is running and in the process of creating a share.
f345c0beb4c8f75cb54c2e070498e56febd468acdougm */
f345c0beb4c8f75cb54c2e070498e56febd468acdougm if (have_path == 0 && node != NULL) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm xmlUnlinkNode(node);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm xmlFreeNode(node);
f345c0beb4c8f75cb54c2e070498e56febd468acdougm }
6185db853e024a486ff8837e6784dd290d866112dougm if (name != NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm free(name);
6185db853e024a486ff8837e6784dd290d866112dougm if (valuestr != NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm free(valuestr);
6185db853e024a486ff8837e6784dd290d866112dougm if (value != NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm scf_value_destroy(value);
6185db853e024a486ff8837e6784dd290d866112dougm if (iter != NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm scf_iter_destroy(iter);
6185db853e024a486ff8837e6784dd290d866112dougm if (prop != NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm scf_property_destroy(prop);
6185db853e024a486ff8837e6784dd290d866112dougm}
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm/*
6185db853e024a486ff8837e6784dd290d866112dougm * find_share_by_id(shareid)
6185db853e024a486ff8837e6784dd290d866112dougm *
6185db853e024a486ff8837e6784dd290d866112dougm * Search all shares in all groups until we find the share represented
6185db853e024a486ff8837e6784dd290d866112dougm * by "id".
6185db853e024a486ff8837e6784dd290d866112dougm */
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougmstatic sa_share_t
549ec3fff108310966327d1dc9004551b63210b7dougmfind_share_by_id(sa_handle_t handle, char *shareid)
6185db853e024a486ff8837e6784dd290d866112dougm{
6185db853e024a486ff8837e6784dd290d866112dougm sa_group_t group;
6185db853e024a486ff8837e6784dd290d866112dougm sa_share_t share = NULL;
6185db853e024a486ff8837e6784dd290d866112dougm char *id = NULL;
6185db853e024a486ff8837e6784dd290d866112dougm int done = 0;
6185db853e024a486ff8837e6784dd290d866112dougm
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm for (group = sa_get_group(handle, NULL);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm group != NULL && !done;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm group = sa_get_next_group(group)) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm for (share = sa_get_share(group, NULL);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm share != NULL;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm share = sa_get_next_share(share)) {
6185db853e024a486ff8837e6784dd290d866112dougm id = sa_get_share_attr(share, "id");
6185db853e024a486ff8837e6784dd290d866112dougm if (id != NULL && strcmp(id, shareid) == 0) {
6185db853e024a486ff8837e6784dd290d866112dougm sa_free_attr_string(id);
6185db853e024a486ff8837e6784dd290d866112dougm id = NULL;
6185db853e024a486ff8837e6784dd290d866112dougm done++;
6185db853e024a486ff8837e6784dd290d866112dougm break;
6185db853e024a486ff8837e6784dd290d866112dougm }
6185db853e024a486ff8837e6784dd290d866112dougm if (id != NULL) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm sa_free_attr_string(id);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm id = NULL;
6185db853e024a486ff8837e6784dd290d866112dougm }
6185db853e024a486ff8837e6784dd290d866112dougm }
6185db853e024a486ff8837e6784dd290d866112dougm }
6185db853e024a486ff8837e6784dd290d866112dougm return (share);
6185db853e024a486ff8837e6784dd290d866112dougm}
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm/*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * find_resource_by_index(share, index)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Search the resource records on the share for the id index.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwstatic sa_resource_t
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwfind_resource_by_index(sa_share_t share, char *index)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw{
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw sa_resource_t resource;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw sa_resource_t found = NULL;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw char *id;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw for (resource = sa_get_share_resource(share, NULL);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw resource != NULL && found == NULL;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw resource = sa_get_next_resource(resource)) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw id = (char *)xmlGetProp((xmlNodePtr)resource, (xmlChar *)"id");
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (id != NULL) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (strcmp(id, index) == 0) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /* found it so save in "found" */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw found = resource;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw sa_free_attr_string(id);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (found);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw}
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * sa_share_props_from_pgroup(root, handle, pg, id, sahandle)
6185db853e024a486ff8837e6784dd290d866112dougm *
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * Extract share properties from the SMF property group. More sanity
6185db853e024a486ff8837e6784dd290d866112dougm * checks are done and the share object is created. We ignore some
6185db853e024a486ff8837e6784dd290d866112dougm * errors that could exist in the repository and only worry about
6185db853e024a486ff8837e6784dd290d866112dougm * property groups that validate in naming.
6185db853e024a486ff8837e6784dd290d866112dougm */
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougmstatic int
6185db853e024a486ff8837e6784dd290d866112dougmsa_share_props_from_pgroup(xmlNodePtr root, scfutilhandle_t *handle,
549ec3fff108310966327d1dc9004551b63210b7dougm scf_propertygroup_t *pg, char *id, sa_handle_t sahandle)
6185db853e024a486ff8837e6784dd290d866112dougm{
6185db853e024a486ff8837e6784dd290d866112dougm xmlNodePtr node;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm char *name = NULL;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm scf_iter_t *iter = NULL;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm scf_property_t *prop = NULL;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm scf_value_t *value = NULL;
6185db853e024a486ff8837e6784dd290d866112dougm ssize_t vallen;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm char *valuestr = NULL;
6185db853e024a486ff8837e6784dd290d866112dougm int ret = SA_OK;
6185db853e024a486ff8837e6784dd290d866112dougm char *sectype = NULL;
6185db853e024a486ff8837e6784dd290d866112dougm char *proto;
6185db853e024a486ff8837e6784dd290d866112dougm sa_share_t share;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm uuid_t uuid;
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm /*
6185db853e024a486ff8837e6784dd290d866112dougm * While preliminary check (starts with 'S') passed before
6185db853e024a486ff8837e6784dd290d866112dougm * getting here. Need to make sure it is in ID syntax
6185db853e024a486ff8837e6784dd290d866112dougm * (Snnnnnn). Note that shares with properties have similar
6185db853e024a486ff8837e6784dd290d866112dougm * pgroups. If the pg name is more than SA_SHARE_PG_LEN
6185db853e024a486ff8837e6784dd290d866112dougm * characters, it is likely one of the protocol/security
6185db853e024a486ff8837e6784dd290d866112dougm * versions.
6185db853e024a486ff8837e6784dd290d866112dougm */
6185db853e024a486ff8837e6784dd290d866112dougm vallen = strlen(id);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (*id != SA_SHARE_PG_PREFIX[0] || vallen <= SA_SHARE_PG_LEN) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm /*
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * It is ok to not have what we thought since someone might
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * have added a name via SMF.
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm */
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm return (ret);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm }
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (strncmp(id, SA_SHARE_PG_PREFIX, SA_SHARE_PG_PREFIXLEN) == 0) {
6185db853e024a486ff8837e6784dd290d866112dougm proto = strchr(id, '_');
6185db853e024a486ff8837e6784dd290d866112dougm if (proto == NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm return (ret);
6185db853e024a486ff8837e6784dd290d866112dougm *proto++ = '\0';
6185db853e024a486ff8837e6784dd290d866112dougm if (uuid_parse(id + SA_SHARE_PG_PREFIXLEN, uuid) < 0)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm return (ret);
6185db853e024a486ff8837e6784dd290d866112dougm /*
6185db853e024a486ff8837e6784dd290d866112dougm * probably a legal optionset so check a few more
6185db853e024a486ff8837e6784dd290d866112dougm * syntax points below.
6185db853e024a486ff8837e6784dd290d866112dougm */
6185db853e024a486ff8837e6784dd290d866112dougm if (*proto == '\0') {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm /* not a valid proto (null) */
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm return (ret);
6185db853e024a486ff8837e6784dd290d866112dougm }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
6185db853e024a486ff8837e6784dd290d866112dougm sectype = strchr(proto, '_');
6185db853e024a486ff8837e6784dd290d866112dougm if (sectype != NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm *sectype++ = '\0';
6185db853e024a486ff8837e6784dd290d866112dougm if (!valid_protocol(proto))
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm return (ret);
6185db853e024a486ff8837e6784dd290d866112dougm }
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm /*
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * To get here, we have a valid protocol and possibly a
6185db853e024a486ff8837e6784dd290d866112dougm * security. We now have to find the share that it is really
6185db853e024a486ff8837e6784dd290d866112dougm * associated with. The "id" portion of the pgroup name will
6185db853e024a486ff8837e6784dd290d866112dougm * match.
6185db853e024a486ff8837e6784dd290d866112dougm */
6185db853e024a486ff8837e6784dd290d866112dougm
549ec3fff108310966327d1dc9004551b63210b7dougm share = find_share_by_id(sahandle, id);
6185db853e024a486ff8837e6784dd290d866112dougm if (share == NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm return (SA_BAD_PATH);
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm root = (xmlNodePtr)share;
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm vallen = get_scf_limit(SCF_LIMIT_MAX_VALUE_LENGTH);
6185db853e024a486ff8837e6784dd290d866112dougm
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (sectype == NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm node = xmlNewChild(root, NULL, (xmlChar *)"optionset", NULL);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm else {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (isdigit((int)*sectype)) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw sa_resource_t resource;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * If sectype[0] is a digit, then it is an index into
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * the resource names. We need to find a resource
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * record and then get the properties into an
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * optionset. The optionset becomes the "node" and the
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * rest is hung off of the share.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw resource = find_resource_by_index(share, sectype);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (resource != NULL) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw node = xmlNewChild(resource, NULL,
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw (xmlChar *)"optionset", NULL);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw } else {
55bf511df53aad0fdb7eb3fa349f0308cc05234cas /* This shouldn't happen. */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw ret = SA_SYSTEM_ERR;
55bf511df53aad0fdb7eb3fa349f0308cc05234cas goto out;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw } else {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * If not a digit, then it is a security type
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * (alternate option space). Security types start with
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * an alphabetic.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw node = xmlNewChild(root, NULL, (xmlChar *)"security",
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw NULL);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (node != NULL)
7a9d7716b53eb5c2c08bf4f0fdf4369571dbde4dthurlow (void) xmlSetProp(node, (xmlChar *)"sectype",
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw (xmlChar *)sectype);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm }
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (node == NULL) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm ret = SA_NO_MEMORY;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm goto out;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm }
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm
7a9d7716b53eb5c2c08bf4f0fdf4369571dbde4dthurlow (void) xmlSetProp(node, (xmlChar *)"type", (xmlChar *)proto);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm /* now find the properties */
6185db853e024a486ff8837e6784dd290d866112dougm iter = scf_iter_create(handle->handle);
6185db853e024a486ff8837e6784dd290d866112dougm value = scf_value_create(handle->handle);
6185db853e024a486ff8837e6784dd290d866112dougm prop = scf_property_create(handle->handle);
6185db853e024a486ff8837e6784dd290d866112dougm name = malloc(scf_max_name_len);
6185db853e024a486ff8837e6784dd290d866112dougm valuestr = malloc(vallen);
6185db853e024a486ff8837e6784dd290d866112dougm
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (iter == NULL || value == NULL || prop == NULL || name == NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm goto out;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /* iterate over the share pg properties */
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (scf_iter_pg_properties(iter, pg) == 0) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm while (scf_iter_next_property(iter, prop) > 0) {
6185db853e024a486ff8837e6784dd290d866112dougm ret = SA_SYSTEM_ERR; /* assume the worst */
6185db853e024a486ff8837e6784dd290d866112dougm if (scf_property_get_name(prop, name,
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm scf_max_name_len) > 0) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (scf_property_get_value(prop, value) == 0) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (scf_value_get_astring(value,
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm valuestr, vallen) >= 0) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm ret = SA_OK;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm }
6185db853e024a486ff8837e6784dd290d866112dougm }
6185db853e024a486ff8837e6784dd290d866112dougm } else {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm ret = SA_SYSTEM_ERR;
6185db853e024a486ff8837e6784dd290d866112dougm }
6185db853e024a486ff8837e6784dd290d866112dougm if (ret == SA_OK) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm sa_property_t prop;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm prop = sa_create_property(name, valuestr);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (prop != NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm prop = (sa_property_t)xmlAddChild(node,
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm (xmlNodePtr)prop);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm else
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm ret = SA_NO_MEMORY;
6185db853e024a486ff8837e6784dd290d866112dougm }
6185db853e024a486ff8837e6784dd290d866112dougm }
6185db853e024a486ff8837e6784dd290d866112dougm } else {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm ret = SA_SYSTEM_ERR;
6185db853e024a486ff8837e6784dd290d866112dougm }
25a68471b9ababbc21cfdbbb2866014f34f419ecdougmout:
6185db853e024a486ff8837e6784dd290d866112dougm if (iter != NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm scf_iter_destroy(iter);
6185db853e024a486ff8837e6784dd290d866112dougm if (value != NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm scf_value_destroy(value);
6185db853e024a486ff8837e6784dd290d866112dougm if (prop != NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm scf_property_destroy(prop);
6185db853e024a486ff8837e6784dd290d866112dougm if (name != NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm free(name);
6185db853e024a486ff8837e6784dd290d866112dougm if (valuestr != NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm free(valuestr);
6185db853e024a486ff8837e6784dd290d866112dougm return (ret);
6185db853e024a486ff8837e6784dd290d866112dougm}
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm/*
6185db853e024a486ff8837e6784dd290d866112dougm * sa_extract_group(root, handle, instance)
6185db853e024a486ff8837e6784dd290d866112dougm *
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * Get the config info for this instance of a group and create the XML
6185db853e024a486ff8837e6784dd290d866112dougm * subtree from it.
6185db853e024a486ff8837e6784dd290d866112dougm */
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougmstatic int
6185db853e024a486ff8837e6784dd290d866112dougmsa_extract_group(xmlNodePtr root, scfutilhandle_t *handle,
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm scf_instance_t *instance, sa_handle_t sahandle)
6185db853e024a486ff8837e6784dd290d866112dougm{
6185db853e024a486ff8837e6784dd290d866112dougm char *buff;
6185db853e024a486ff8837e6784dd290d866112dougm xmlNodePtr node;
6185db853e024a486ff8837e6784dd290d866112dougm scf_iter_t *iter;
6185db853e024a486ff8837e6784dd290d866112dougm char *proto;
6185db853e024a486ff8837e6784dd290d866112dougm char *sectype;
1f29d134f841501a6ae1c2be035dd0647720537cdougm boolean_t have_shares = B_FALSE;
1f29d134f841501a6ae1c2be035dd0647720537cdougm boolean_t is_default = B_FALSE;
1f29d134f841501a6ae1c2be035dd0647720537cdougm boolean_t is_nfs = B_FALSE;
6185db853e024a486ff8837e6784dd290d866112dougm int ret = SA_OK;
6185db853e024a486ff8837e6784dd290d866112dougm int err;
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm buff = malloc(scf_max_name_len);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (buff == NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm return (SA_NO_MEMORY);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm
6185db853e024a486ff8837e6784dd290d866112dougm iter = scf_iter_create(handle->handle);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (iter == NULL) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm ret = SA_NO_MEMORY;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm goto out;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm }
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (scf_instance_get_name(instance, buff, scf_max_name_len) > 0) {
6185db853e024a486ff8837e6784dd290d866112dougm node = xmlNewChild(root, NULL, (xmlChar *)"group", NULL);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (node == NULL) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm ret = SA_NO_MEMORY;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm goto out;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm }
7a9d7716b53eb5c2c08bf4f0fdf4369571dbde4dthurlow (void) xmlSetProp(node, (xmlChar *)"name", (xmlChar *)buff);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (strcmp(buff, "default") == 0)
1f29d134f841501a6ae1c2be035dd0647720537cdougm is_default = B_TRUE;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm sa_extract_attrs(node, handle, instance);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm /*
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * Iterate through all the property groups
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * looking for those with security or
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * optionset prefixes. The names of the
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * matching pgroups are parsed to get the
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * protocol, and for security, the sectype.
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * Syntax is as follows:
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * optionset | optionset_<proto>
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * security_default | security_<proto>_<sectype>
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * "operation" is handled by
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * sa_extract_attrs().
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm */
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (scf_iter_instance_pgs(iter, instance) != 0) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm ret = SA_NO_MEMORY;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm goto out;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm }
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm while (scf_iter_next_pg(iter, handle->pg) > 0) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm /* Have a pgroup so sort it out */
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm ret = scf_pg_get_name(handle->pg, buff,
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm scf_max_name_len);
1f29d134f841501a6ae1c2be035dd0647720537cdougm if (ret <= 0)
1f29d134f841501a6ae1c2be035dd0647720537cdougm continue;
1f29d134f841501a6ae1c2be035dd0647720537cdougm is_nfs = B_FALSE;
1f29d134f841501a6ae1c2be035dd0647720537cdougm
1f29d134f841501a6ae1c2be035dd0647720537cdougm if (buff[0] == SA_SHARE_PG_PREFIX[0]) {
1f29d134f841501a6ae1c2be035dd0647720537cdougm sa_share_from_pgroup(node, handle,
1f29d134f841501a6ae1c2be035dd0647720537cdougm handle->pg, buff);
1f29d134f841501a6ae1c2be035dd0647720537cdougm have_shares = B_TRUE;
1f29d134f841501a6ae1c2be035dd0647720537cdougm } else if (strncmp(buff, "optionset", 9) == 0) {
1f29d134f841501a6ae1c2be035dd0647720537cdougm char *nodetype = "optionset";
1f29d134f841501a6ae1c2be035dd0647720537cdougm /* Have an optionset */
1f29d134f841501a6ae1c2be035dd0647720537cdougm sectype = NULL;
1f29d134f841501a6ae1c2be035dd0647720537cdougm proto = strchr(buff, '_');
1f29d134f841501a6ae1c2be035dd0647720537cdougm if (proto != NULL) {
1f29d134f841501a6ae1c2be035dd0647720537cdougm *proto++ = '\0';
1f29d134f841501a6ae1c2be035dd0647720537cdougm sectype = strchr(proto, '_');
1f29d134f841501a6ae1c2be035dd0647720537cdougm if (sectype != NULL) {
1f29d134f841501a6ae1c2be035dd0647720537cdougm *sectype++ = '\0';
1f29d134f841501a6ae1c2be035dd0647720537cdougm nodetype = "security";
6185db853e024a486ff8837e6784dd290d866112dougm }
1f29d134f841501a6ae1c2be035dd0647720537cdougm is_nfs = strcmp(proto, "nfs") == 0;
1f29d134f841501a6ae1c2be035dd0647720537cdougm } else if (strlen(buff) > 9) {
6185db853e024a486ff8837e6784dd290d866112dougm /*
1f29d134f841501a6ae1c2be035dd0647720537cdougm * This can only occur if
1f29d134f841501a6ae1c2be035dd0647720537cdougm * someone has made changes
1f29d134f841501a6ae1c2be035dd0647720537cdougm * via an SMF command. Since
1f29d134f841501a6ae1c2be035dd0647720537cdougm * this would be an unknown
1f29d134f841501a6ae1c2be035dd0647720537cdougm * syntax, we just ignore it.
6185db853e024a486ff8837e6784dd290d866112dougm */
1f29d134f841501a6ae1c2be035dd0647720537cdougm continue;
1f29d134f841501a6ae1c2be035dd0647720537cdougm }
1f29d134f841501a6ae1c2be035dd0647720537cdougm /*
1f29d134f841501a6ae1c2be035dd0647720537cdougm * If the group is not "default" or is
1f29d134f841501a6ae1c2be035dd0647720537cdougm * "default" and is_nfs, then extract the
1f29d134f841501a6ae1c2be035dd0647720537cdougm * pgroup. If it is_default and !is_nfs,
1f29d134f841501a6ae1c2be035dd0647720537cdougm * then we have an error and should remove
1f29d134f841501a6ae1c2be035dd0647720537cdougm * the extraneous protocols. We don't care
1f29d134f841501a6ae1c2be035dd0647720537cdougm * about errors on scf_pg_delete since we
1f29d134f841501a6ae1c2be035dd0647720537cdougm * might not have permission during an
1f29d134f841501a6ae1c2be035dd0647720537cdougm * extract only.
1f29d134f841501a6ae1c2be035dd0647720537cdougm */
1f29d134f841501a6ae1c2be035dd0647720537cdougm if (!is_default || is_nfs) {
6185db853e024a486ff8837e6784dd290d866112dougm ret = sa_extract_pgroup(node, handle,
1f29d134f841501a6ae1c2be035dd0647720537cdougm handle->pg, nodetype, proto,
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm sectype);
1f29d134f841501a6ae1c2be035dd0647720537cdougm } else {
1f29d134f841501a6ae1c2be035dd0647720537cdougm err = scf_pg_delete(handle->pg);
1f29d134f841501a6ae1c2be035dd0647720537cdougm if (err == 0)
1f29d134f841501a6ae1c2be035dd0647720537cdougm (void) fprintf(stderr,
1f29d134f841501a6ae1c2be035dd0647720537cdougm dgettext(TEXT_DOMAIN,
1f29d134f841501a6ae1c2be035dd0647720537cdougm "Removed protocol \"%s\" "
1f29d134f841501a6ae1c2be035dd0647720537cdougm "from group \"default\"\n"),
1f29d134f841501a6ae1c2be035dd0647720537cdougm proto);
1f29d134f841501a6ae1c2be035dd0647720537cdougm }
1f29d134f841501a6ae1c2be035dd0647720537cdougm } else if (strncmp(buff, "security", 8) == 0) {
1f29d134f841501a6ae1c2be035dd0647720537cdougm /*
1f29d134f841501a6ae1c2be035dd0647720537cdougm * Have a security (note that
1f29d134f841501a6ae1c2be035dd0647720537cdougm * this should change in the
1f29d134f841501a6ae1c2be035dd0647720537cdougm * future)
1f29d134f841501a6ae1c2be035dd0647720537cdougm */
1f29d134f841501a6ae1c2be035dd0647720537cdougm proto = strchr(buff, '_');
1f29d134f841501a6ae1c2be035dd0647720537cdougm sectype = NULL;
1f29d134f841501a6ae1c2be035dd0647720537cdougm if (proto != NULL) {
1f29d134f841501a6ae1c2be035dd0647720537cdougm *proto++ = '\0';
1f29d134f841501a6ae1c2be035dd0647720537cdougm sectype = strchr(proto, '_');
1f29d134f841501a6ae1c2be035dd0647720537cdougm if (sectype != NULL)
1f29d134f841501a6ae1c2be035dd0647720537cdougm *sectype++ = '\0';
1f29d134f841501a6ae1c2be035dd0647720537cdougm if (strcmp(proto, "default") == 0)
1f29d134f841501a6ae1c2be035dd0647720537cdougm proto = NULL;
6185db853e024a486ff8837e6784dd290d866112dougm }
1f29d134f841501a6ae1c2be035dd0647720537cdougm ret = sa_extract_pgroup(node, handle,
1f29d134f841501a6ae1c2be035dd0647720537cdougm handle->pg, "security", proto, sectype);
6185db853e024a486ff8837e6784dd290d866112dougm }
1f29d134f841501a6ae1c2be035dd0647720537cdougm /* Ignore everything else */
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm }
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm /*
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * Make sure we have a valid default group.
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * On first boot, default won't have any
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * protocols defined and won't be enabled (but
1f29d134f841501a6ae1c2be035dd0647720537cdougm * should be). "default" only has NFS enabled on it.
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm */
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (is_default) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm char *state = sa_get_group_attr((sa_group_t)node,
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm "state");
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (state == NULL) {
6185db853e024a486ff8837e6784dd290d866112dougm /* set attribute to enabled */
6185db853e024a486ff8837e6784dd290d866112dougm (void) sa_set_group_attr((sa_group_t)node,
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm "state", "enabled");
1f29d134f841501a6ae1c2be035dd0647720537cdougm (void) sa_create_optionset((sa_group_t)node,
1f29d134f841501a6ae1c2be035dd0647720537cdougm "nfs");
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm } else {
6185db853e024a486ff8837e6784dd290d866112dougm sa_free_attr_string(state);
6185db853e024a486ff8837e6784dd290d866112dougm }
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm }
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm /* Do a second pass if shares were found */
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (have_shares && scf_iter_instance_pgs(iter, instance) == 0) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm while (scf_iter_next_pg(iter, handle->pg) > 0) {
6185db853e024a486ff8837e6784dd290d866112dougm /*
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * Have a pgroup so see if it is a
6185db853e024a486ff8837e6784dd290d866112dougm * share optionset
6185db853e024a486ff8837e6784dd290d866112dougm */
6185db853e024a486ff8837e6784dd290d866112dougm err = scf_pg_get_name(handle->pg, buff,
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm scf_max_name_len);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (err <= 0)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm continue;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (buff[0] == SA_SHARE_PG_PREFIX[0]) {
6185db853e024a486ff8837e6784dd290d866112dougm ret = sa_share_props_from_pgroup(node,
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm handle, handle->pg, buff,
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm sahandle);
6185db853e024a486ff8837e6784dd290d866112dougm }
6185db853e024a486ff8837e6784dd290d866112dougm }
6185db853e024a486ff8837e6784dd290d866112dougm }
6185db853e024a486ff8837e6784dd290d866112dougm }
25a68471b9ababbc21cfdbbb2866014f34f419ecdougmout:
6185db853e024a486ff8837e6784dd290d866112dougm if (iter != NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm scf_iter_destroy(iter);
6185db853e024a486ff8837e6784dd290d866112dougm if (buff != NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm free(buff);
6185db853e024a486ff8837e6784dd290d866112dougm return (ret);
6185db853e024a486ff8837e6784dd290d866112dougm}
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm/*
6185db853e024a486ff8837e6784dd290d866112dougm * sa_extract_defaults(root, handle, instance)
6185db853e024a486ff8837e6784dd290d866112dougm *
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * Local function to find the default properties that live in the
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * default instance's "operation" property group.
6185db853e024a486ff8837e6784dd290d866112dougm */
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougmstatic void
6185db853e024a486ff8837e6784dd290d866112dougmsa_extract_defaults(xmlNodePtr root, scfutilhandle_t *handle,
6185db853e024a486ff8837e6784dd290d866112dougm scf_instance_t *instance)
6185db853e024a486ff8837e6784dd290d866112dougm{
6185db853e024a486ff8837e6784dd290d866112dougm xmlNodePtr node;
6185db853e024a486ff8837e6784dd290d866112dougm scf_property_t *prop;
6185db853e024a486ff8837e6784dd290d866112dougm scf_value_t *value;
6185db853e024a486ff8837e6784dd290d866112dougm char *valuestr;
6185db853e024a486ff8837e6784dd290d866112dougm ssize_t vallen;
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm vallen = get_scf_limit(SCF_LIMIT_MAX_VALUE_LENGTH);
6185db853e024a486ff8837e6784dd290d866112dougm prop = scf_property_create(handle->handle);
6185db853e024a486ff8837e6784dd290d866112dougm value = scf_value_create(handle->handle);
6185db853e024a486ff8837e6784dd290d866112dougm valuestr = malloc(vallen);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (prop == NULL || value == NULL || vallen == 0 ||
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm scf_instance_get_pg(instance, "operation", handle->pg) != 0)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm goto out;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (scf_pg_get_property(handle->pg, "legacy-timestamp", prop) != 0)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm goto out;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm /* Found the property so get the value */
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (scf_property_get_value(prop, value) == 0) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (scf_value_get_astring(value, valuestr, vallen) > 0) {
6185db853e024a486ff8837e6784dd290d866112dougm node = xmlNewChild(root, NULL, (xmlChar *)"legacy",
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm NULL);
6185db853e024a486ff8837e6784dd290d866112dougm if (node != NULL) {
7a9d7716b53eb5c2c08bf4f0fdf4369571dbde4dthurlow (void) xmlSetProp(node, (xmlChar *)"timestamp",
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm (xmlChar *)valuestr);
7a9d7716b53eb5c2c08bf4f0fdf4369571dbde4dthurlow (void) xmlSetProp(node, (xmlChar *)"path",
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm (xmlChar *)SA_LEGACY_DFSTAB);
6185db853e024a486ff8837e6784dd290d866112dougm }
6185db853e024a486ff8837e6784dd290d866112dougm }
6185db853e024a486ff8837e6784dd290d866112dougm }
25a68471b9ababbc21cfdbbb2866014f34f419ecdougmout:
6185db853e024a486ff8837e6784dd290d866112dougm if (valuestr != NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm free(valuestr);
6185db853e024a486ff8837e6784dd290d866112dougm if (value != NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm scf_value_destroy(value);
6185db853e024a486ff8837e6784dd290d866112dougm if (prop != NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm scf_property_destroy(prop);
6185db853e024a486ff8837e6784dd290d866112dougm}
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm/*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * sa_get_config(handle, root, doc, sahandle)
6185db853e024a486ff8837e6784dd290d866112dougm *
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * Walk the SMF repository for /network/shares/group and find all the
6185db853e024a486ff8837e6784dd290d866112dougm * instances. These become group names. Then add the XML structure
6185db853e024a486ff8837e6784dd290d866112dougm * below the groups based on property groups and properties.
6185db853e024a486ff8837e6784dd290d866112dougm */
6185db853e024a486ff8837e6784dd290d866112dougmint
1d1813a7a7c570174c2b6adc372045307b266117dougmsa_get_config(scfutilhandle_t *handle, xmlNodePtr root, sa_handle_t sahandle)
6185db853e024a486ff8837e6784dd290d866112dougm{
6185db853e024a486ff8837e6784dd290d866112dougm int ret = SA_OK;
6185db853e024a486ff8837e6784dd290d866112dougm scf_instance_t *instance;
6185db853e024a486ff8837e6784dd290d866112dougm scf_iter_t *iter;
6185db853e024a486ff8837e6784dd290d866112dougm char buff[BUFSIZ * 2];
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm instance = scf_instance_create(handle->handle);
6185db853e024a486ff8837e6784dd290d866112dougm iter = scf_iter_create(handle->handle);
1d1813a7a7c570174c2b6adc372045307b266117dougm if (instance != NULL && iter != NULL) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if ((ret = scf_iter_service_instances(iter,
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm handle->service)) == 0) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm while ((ret = scf_iter_next_instance(iter,
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm instance)) > 0) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (scf_instance_get_name(instance, buff,
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm sizeof (buff)) > 0) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (strcmp(buff, "default") == 0)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm sa_extract_defaults(root,
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm handle, instance);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm ret = sa_extract_group(root, handle,
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm instance, sahandle);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm }
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm }
6185db853e024a486ff8837e6784dd290d866112dougm }
6185db853e024a486ff8837e6784dd290d866112dougm }
1d1813a7a7c570174c2b6adc372045307b266117dougm
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm /* Always cleanup these */
6185db853e024a486ff8837e6784dd290d866112dougm if (instance != NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm scf_instance_destroy(instance);
6185db853e024a486ff8837e6784dd290d866112dougm if (iter != NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm scf_iter_destroy(iter);
6185db853e024a486ff8837e6784dd290d866112dougm return (ret);
6185db853e024a486ff8837e6784dd290d866112dougm}
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm/*
6185db853e024a486ff8837e6784dd290d866112dougm * sa_get_instance(handle, instance)
6185db853e024a486ff8837e6784dd290d866112dougm *
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * Get the instance of the group service. This is actually the
6185db853e024a486ff8837e6784dd290d866112dougm * specific group name. The instance is needed for all property and
6185db853e024a486ff8837e6784dd290d866112dougm * control operations.
6185db853e024a486ff8837e6784dd290d866112dougm */
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougmint
6185db853e024a486ff8837e6784dd290d866112dougmsa_get_instance(scfutilhandle_t *handle, char *instname)
6185db853e024a486ff8837e6784dd290d866112dougm{
6185db853e024a486ff8837e6784dd290d866112dougm if (scf_service_get_instance(handle->service, instname,
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm handle->instance) != 0) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm return (SA_NO_SUCH_GROUP);
6185db853e024a486ff8837e6784dd290d866112dougm }
6185db853e024a486ff8837e6784dd290d866112dougm return (SA_OK);
6185db853e024a486ff8837e6784dd290d866112dougm}
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm/*
6185db853e024a486ff8837e6784dd290d866112dougm * sa_create_instance(handle, instname)
6185db853e024a486ff8837e6784dd290d866112dougm *
6185db853e024a486ff8837e6784dd290d866112dougm * Create a new SMF service instance. There can only be one with a
6185db853e024a486ff8837e6784dd290d866112dougm * given name.
6185db853e024a486ff8837e6784dd290d866112dougm */
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougmint
6185db853e024a486ff8837e6784dd290d866112dougmsa_create_instance(scfutilhandle_t *handle, char *instname)
6185db853e024a486ff8837e6784dd290d866112dougm{
6185db853e024a486ff8837e6784dd290d866112dougm int ret = SA_OK;
6185db853e024a486ff8837e6784dd290d866112dougm char instance[SA_GROUP_INST_LEN];
6185db853e024a486ff8837e6784dd290d866112dougm if (scf_service_add_instance(handle->service, instname,
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm handle->instance) != 0) {
6185db853e024a486ff8837e6784dd290d866112dougm /* better error returns need to be added based on real error */
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (scf_error() == SCF_ERROR_PERMISSION_DENIED)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm ret = SA_NO_PERMISSION;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm else
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm ret = SA_DUPLICATE_NAME;
6185db853e024a486ff8837e6784dd290d866112dougm } else {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm /* have the service created, so enable it */
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm (void) snprintf(instance, sizeof (instance), "%s:%s",
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm SA_SVC_FMRI_BASE, instname);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm (void) smf_enable_instance(instance, 0);
6185db853e024a486ff8837e6784dd290d866112dougm }
6185db853e024a486ff8837e6784dd290d866112dougm return (ret);
6185db853e024a486ff8837e6784dd290d866112dougm}
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm/*
6185db853e024a486ff8837e6784dd290d866112dougm * sa_delete_instance(handle, instname)
6185db853e024a486ff8837e6784dd290d866112dougm *
6185db853e024a486ff8837e6784dd290d866112dougm * When a group goes away, we also remove the service instance.
6185db853e024a486ff8837e6784dd290d866112dougm */
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougmint
6185db853e024a486ff8837e6784dd290d866112dougmsa_delete_instance(scfutilhandle_t *handle, char *instname)
6185db853e024a486ff8837e6784dd290d866112dougm{
6185db853e024a486ff8837e6784dd290d866112dougm int ret;
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm if (strcmp(instname, "default") == 0) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm ret = SA_NO_PERMISSION;
6185db853e024a486ff8837e6784dd290d866112dougm } else {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if ((ret = sa_get_instance(handle, instname)) == SA_OK) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (scf_instance_delete(handle->instance) != 0)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm /* need better analysis */
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm ret = SA_NO_PERMISSION;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm }
6185db853e024a486ff8837e6784dd290d866112dougm }
6185db853e024a486ff8837e6784dd290d866112dougm return (ret);
6185db853e024a486ff8837e6784dd290d866112dougm}
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm/*
6185db853e024a486ff8837e6784dd290d866112dougm * sa_create_pgroup(handle, pgroup)
6185db853e024a486ff8837e6784dd290d866112dougm *
6185db853e024a486ff8837e6784dd290d866112dougm * create a new property group
6185db853e024a486ff8837e6784dd290d866112dougm */
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougmint
6185db853e024a486ff8837e6784dd290d866112dougmsa_create_pgroup(scfutilhandle_t *handle, char *pgroup)
6185db853e024a486ff8837e6784dd290d866112dougm{
6185db853e024a486ff8837e6784dd290d866112dougm int ret = SA_OK;
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm int persist = 0;
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm
6185db853e024a486ff8837e6784dd290d866112dougm /*
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * Only create a handle if it doesn't exist. It is ok to exist
6185db853e024a486ff8837e6784dd290d866112dougm * since the pg handle will be set as a side effect.
6185db853e024a486ff8837e6784dd290d866112dougm */
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (handle->pg == NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm handle->pg = scf_pg_create(handle->handle);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm /*
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm * Special case for a non-persistent property group. This is
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm * internal use only.
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm */
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm if (*pgroup == '*') {
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm persist = SCF_PG_FLAG_NONPERSISTENT;
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm pgroup++;
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm }
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm
6185db853e024a486ff8837e6784dd290d866112dougm /*
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * If the pgroup exists, we are done. If it doesn't, then we
6185db853e024a486ff8837e6784dd290d866112dougm * need to actually add one to the service instance.
6185db853e024a486ff8837e6784dd290d866112dougm */
6185db853e024a486ff8837e6784dd290d866112dougm if (scf_instance_get_pg(handle->instance,
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm pgroup, handle->pg) != 0) {
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm /* Doesn't exist so create one */
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (scf_instance_add_pg(handle->instance, pgroup,
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm SCF_GROUP_APPLICATION, persist, handle->pg) != 0) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm switch (scf_error()) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm case SCF_ERROR_PERMISSION_DENIED:
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm ret = SA_NO_PERMISSION;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm break;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm default:
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm ret = SA_SYSTEM_ERR;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm break;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm }
6185db853e024a486ff8837e6784dd290d866112dougm }
6185db853e024a486ff8837e6784dd290d866112dougm }
6185db853e024a486ff8837e6784dd290d866112dougm return (ret);
6185db853e024a486ff8837e6784dd290d866112dougm}
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm/*
6185db853e024a486ff8837e6784dd290d866112dougm * sa_delete_pgroup(handle, pgroup)
6185db853e024a486ff8837e6784dd290d866112dougm *
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * Remove the property group from the current instance of the service,
6185db853e024a486ff8837e6784dd290d866112dougm * but only if it actually exists.
6185db853e024a486ff8837e6784dd290d866112dougm */
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougmint
6185db853e024a486ff8837e6784dd290d866112dougmsa_delete_pgroup(scfutilhandle_t *handle, char *pgroup)
6185db853e024a486ff8837e6784dd290d866112dougm{
6185db853e024a486ff8837e6784dd290d866112dougm int ret = SA_OK;
6185db853e024a486ff8837e6784dd290d866112dougm /*
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * Only delete if it does exist.
6185db853e024a486ff8837e6784dd290d866112dougm */
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (scf_instance_get_pg(handle->instance, pgroup, handle->pg) == 0) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm /* does exist so delete it */
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (scf_pg_delete(handle->pg) != 0)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm ret = SA_SYSTEM_ERR;
6185db853e024a486ff8837e6784dd290d866112dougm } else {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm ret = SA_SYSTEM_ERR;
6185db853e024a486ff8837e6784dd290d866112dougm }
6185db853e024a486ff8837e6784dd290d866112dougm if (ret == SA_SYSTEM_ERR &&
6185db853e024a486ff8837e6784dd290d866112dougm scf_error() == SCF_ERROR_PERMISSION_DENIED) {
6185db853e024a486ff8837e6784dd290d866112dougm ret = SA_NO_PERMISSION;
6185db853e024a486ff8837e6784dd290d866112dougm }
6185db853e024a486ff8837e6784dd290d866112dougm return (ret);
6185db853e024a486ff8837e6784dd290d866112dougm}
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm/*
6185db853e024a486ff8837e6784dd290d866112dougm * sa_start_transaction(handle, pgroup)
6185db853e024a486ff8837e6784dd290d866112dougm *
6185db853e024a486ff8837e6784dd290d866112dougm * Start an SMF transaction so we can deal with properties. it would
6185db853e024a486ff8837e6784dd290d866112dougm * be nice to not have to expose this, but we have to in order to
6185db853e024a486ff8837e6784dd290d866112dougm * optimize.
6185db853e024a486ff8837e6784dd290d866112dougm *
6185db853e024a486ff8837e6784dd290d866112dougm * Basic model is to hold the transaction in the handle and allow
6185db853e024a486ff8837e6784dd290d866112dougm * property adds/deletes/updates to be added then close the
6185db853e024a486ff8837e6784dd290d866112dougm * transaction (or abort). There may eventually be a need to handle
6185db853e024a486ff8837e6784dd290d866112dougm * other types of transaction mechanisms but we don't do that now.
6185db853e024a486ff8837e6784dd290d866112dougm *
6185db853e024a486ff8837e6784dd290d866112dougm * An sa_start_transaction must be followed by either an
6185db853e024a486ff8837e6784dd290d866112dougm * sa_end_transaction or sa_abort_transaction before another
6185db853e024a486ff8837e6784dd290d866112dougm * sa_start_transaction can be done.
6185db853e024a486ff8837e6784dd290d866112dougm */
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougmint
6185db853e024a486ff8837e6784dd290d866112dougmsa_start_transaction(scfutilhandle_t *handle, char *propgroup)
6185db853e024a486ff8837e6784dd290d866112dougm{
6185db853e024a486ff8837e6784dd290d866112dougm int ret = SA_OK;
6185db853e024a486ff8837e6784dd290d866112dougm /*
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * Lookup the property group and create it if it doesn't already
6185db853e024a486ff8837e6784dd290d866112dougm * exist.
6185db853e024a486ff8837e6784dd290d866112dougm */
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm if (handle == NULL)
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm return (SA_CONFIG_ERR);
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm
6185db853e024a486ff8837e6784dd290d866112dougm if (handle->scf_state == SCH_STATE_INIT) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm ret = sa_create_pgroup(handle, propgroup);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (ret == SA_OK) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm handle->trans = scf_transaction_create(handle->handle);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (handle->trans != NULL) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (scf_transaction_start(handle->trans,
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm handle->pg) != 0) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm ret = SA_SYSTEM_ERR;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm }
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (ret != SA_OK) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm scf_transaction_destroy(handle->trans);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm handle->trans = NULL;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm }
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm } else {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm ret = SA_SYSTEM_ERR;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm }
6185db853e024a486ff8837e6784dd290d866112dougm }
6185db853e024a486ff8837e6784dd290d866112dougm }
6185db853e024a486ff8837e6784dd290d866112dougm if (ret == SA_SYSTEM_ERR &&
6185db853e024a486ff8837e6784dd290d866112dougm scf_error() == SCF_ERROR_PERMISSION_DENIED) {
6185db853e024a486ff8837e6784dd290d866112dougm ret = SA_NO_PERMISSION;
6185db853e024a486ff8837e6784dd290d866112dougm }
6185db853e024a486ff8837e6784dd290d866112dougm return (ret);
6185db853e024a486ff8837e6784dd290d866112dougm}
6185db853e024a486ff8837e6784dd290d866112dougm
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm
6185db853e024a486ff8837e6784dd290d866112dougm/*
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm * sa_end_transaction(scfhandle, sahandle)
6185db853e024a486ff8837e6784dd290d866112dougm *
6185db853e024a486ff8837e6784dd290d866112dougm * Commit the changes that were added to the transaction in the
6185db853e024a486ff8837e6784dd290d866112dougm * handle. Do all necessary cleanup.
6185db853e024a486ff8837e6784dd290d866112dougm */
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougmint
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougmsa_end_transaction(scfutilhandle_t *handle, sa_handle_impl_t sahandle)
6185db853e024a486ff8837e6784dd290d866112dougm{
6185db853e024a486ff8837e6784dd290d866112dougm int ret = SA_OK;
6185db853e024a486ff8837e6784dd290d866112dougm
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm if (handle == NULL || handle->trans == NULL || sahandle == NULL) {
6185db853e024a486ff8837e6784dd290d866112dougm ret = SA_SYSTEM_ERR;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm } else {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (scf_transaction_commit(handle->trans) < 0)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm ret = SA_SYSTEM_ERR;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm scf_transaction_destroy_children(handle->trans);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm scf_transaction_destroy(handle->trans);
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm if (ret == SA_OK)
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm set_transaction_tstamp(sahandle);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm handle->trans = NULL;
6185db853e024a486ff8837e6784dd290d866112dougm }
6185db853e024a486ff8837e6784dd290d866112dougm return (ret);
6185db853e024a486ff8837e6784dd290d866112dougm}
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm/*
6185db853e024a486ff8837e6784dd290d866112dougm * sa_abort_transaction(handle)
6185db853e024a486ff8837e6784dd290d866112dougm *
6185db853e024a486ff8837e6784dd290d866112dougm * Abort the changes that were added to the transaction in the
6185db853e024a486ff8837e6784dd290d866112dougm * handle. Do all necessary cleanup.
6185db853e024a486ff8837e6784dd290d866112dougm */
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougmvoid
6185db853e024a486ff8837e6784dd290d866112dougmsa_abort_transaction(scfutilhandle_t *handle)
6185db853e024a486ff8837e6784dd290d866112dougm{
6185db853e024a486ff8837e6784dd290d866112dougm if (handle->trans != NULL) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm scf_transaction_reset_all(handle->trans);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm scf_transaction_destroy_children(handle->trans);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm scf_transaction_destroy(handle->trans);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm handle->trans = NULL;
6185db853e024a486ff8837e6784dd290d866112dougm }
6185db853e024a486ff8837e6784dd290d866112dougm}
6185db853e024a486ff8837e6784dd290d866112dougm
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm/*
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm * set_transaction_tstamp(sahandle)
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm *
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm * After a successful transaction commit, update the timestamp of the
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm * last transaction. This lets us detect changes from other processes.
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm */
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougmstatic void
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougmset_transaction_tstamp(sa_handle_impl_t sahandle)
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm{
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm char tstring[32];
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm struct timeval tv;
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm scfutilhandle_t *scfhandle;
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm if (sahandle == NULL || sahandle->scfhandle == NULL)
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm return;
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm scfhandle = sahandle->scfhandle;
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm if (sa_get_instance(scfhandle, "default") != SA_OK)
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm return;
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm if (gettimeofday(&tv, NULL) != 0)
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm return;
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm if (sa_start_transaction(scfhandle, "*state") != SA_OK)
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm return;
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm sahandle->tstrans = TSTAMP((*(timestruc_t *)&tv));
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm (void) snprintf(tstring, sizeof (tstring), "%lld", sahandle->tstrans);
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm if (sa_set_property(sahandle->scfhandle, "lastupdate", tstring) ==
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm SA_OK) {
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm /*
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm * While best if it succeeds, a failure doesn't cause
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm * problems and we will ignore it anyway.
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm */
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm (void) scf_transaction_commit(scfhandle->trans);
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm scf_transaction_destroy_children(scfhandle->trans);
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm scf_transaction_destroy(scfhandle->trans);
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm } else {
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm sa_abort_transaction(scfhandle);
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm }
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm}
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm
6185db853e024a486ff8837e6784dd290d866112dougm/*
6185db853e024a486ff8837e6784dd290d866112dougm * sa_set_property(handle, prop, value)
6185db853e024a486ff8837e6784dd290d866112dougm *
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * Set a property transaction entry into the pending SMF transaction.
6185db853e024a486ff8837e6784dd290d866112dougm */
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougmint
6185db853e024a486ff8837e6784dd290d866112dougmsa_set_property(scfutilhandle_t *handle, char *propname, char *valstr)
6185db853e024a486ff8837e6784dd290d866112dougm{
6185db853e024a486ff8837e6784dd290d866112dougm int ret = SA_OK;
6185db853e024a486ff8837e6784dd290d866112dougm scf_value_t *value;
6185db853e024a486ff8837e6784dd290d866112dougm scf_transaction_entry_t *entry;
6185db853e024a486ff8837e6784dd290d866112dougm /*
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * Properties must be set in transactions and don't take
6185db853e024a486ff8837e6784dd290d866112dougm * effect until the transaction has been ended/committed.
6185db853e024a486ff8837e6784dd290d866112dougm */
6185db853e024a486ff8837e6784dd290d866112dougm value = scf_value_create(handle->handle);
6185db853e024a486ff8837e6784dd290d866112dougm entry = scf_entry_create(handle->handle);
6185db853e024a486ff8837e6784dd290d866112dougm if (value != NULL && entry != NULL) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (scf_transaction_property_change(handle->trans, entry,
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm propname, SCF_TYPE_ASTRING) == 0 ||
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm scf_transaction_property_new(handle->trans, entry,
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm propname, SCF_TYPE_ASTRING) == 0) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (scf_value_set_astring(value, valstr) == 0) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (scf_entry_add_value(entry, value) != 0) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm ret = SA_SYSTEM_ERR;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm scf_value_destroy(value);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm }
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm /* The value is in the transaction */
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm value = NULL;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm } else {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm /* Value couldn't be constructed */
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm ret = SA_SYSTEM_ERR;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm }
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm /* The entry is in the transaction */
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm entry = NULL;
6185db853e024a486ff8837e6784dd290d866112dougm } else {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm ret = SA_SYSTEM_ERR;
6185db853e024a486ff8837e6784dd290d866112dougm }
6185db853e024a486ff8837e6784dd290d866112dougm } else {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm ret = SA_SYSTEM_ERR;
6185db853e024a486ff8837e6784dd290d866112dougm }
6185db853e024a486ff8837e6784dd290d866112dougm if (ret == SA_SYSTEM_ERR) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm switch (scf_error()) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm case SCF_ERROR_PERMISSION_DENIED:
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm ret = SA_NO_PERMISSION;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm break;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm }
6185db853e024a486ff8837e6784dd290d866112dougm }
6185db853e024a486ff8837e6784dd290d866112dougm /*
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * Cleanup if there were any errors that didn't leave these
6185db853e024a486ff8837e6784dd290d866112dougm * values where they would be cleaned up later.
6185db853e024a486ff8837e6784dd290d866112dougm */
6185db853e024a486ff8837e6784dd290d866112dougm if (value != NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm scf_value_destroy(value);
6185db853e024a486ff8837e6784dd290d866112dougm if (entry != NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm scf_entry_destroy(entry);
6185db853e024a486ff8837e6784dd290d866112dougm return (ret);
6185db853e024a486ff8837e6784dd290d866112dougm}
6185db853e024a486ff8837e6784dd290d866112dougm
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * check_resource(share)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * Check to see if share has any persistent resources. We don't want
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * to save if they are all transient.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwstatic int
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwcheck_resource(sa_share_t share)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw{
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw sa_resource_t resource;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw int ret = B_FALSE;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw for (resource = sa_get_share_resource(share, NULL);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw resource != NULL && ret == B_FALSE;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw resource = sa_get_next_resource(resource)) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw char *type;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw type = sa_get_resource_attr(resource, "type");
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (type != NULL) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (strcmp(type, "transient") != 0) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw ret = B_TRUE;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw sa_free_attr_string(type);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (ret);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw}
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * sa_set_resource_property(handle, prop, value)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * set a property transaction entry into the pending SMF
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * transaction. We don't want to include any transient resources
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwstatic int
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwsa_set_resource_property(scfutilhandle_t *handle, sa_share_t share)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw{
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw int ret = SA_OK;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw scf_value_t *value;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw scf_transaction_entry_t *entry;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw sa_resource_t resource;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw char *valstr;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw char *idstr;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw char *description;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw char *propstr = NULL;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw size_t strsize;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /* don't bother if no persistent resources */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (check_resource(share) == B_FALSE)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (ret);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * properties must be set in transactions and don't take
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * effect until the transaction has been ended/committed.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw entry = scf_entry_create(handle->handle);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (entry == NULL)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (SA_SYSTEM_ERR);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (scf_transaction_property_change(handle->trans, entry,
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw "resource", SCF_TYPE_ASTRING) != 0 &&
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw scf_transaction_property_new(handle->trans, entry,
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw "resource", SCF_TYPE_ASTRING) != 0) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw scf_entry_destroy(entry);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (SA_SYSTEM_ERR);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw for (resource = sa_get_share_resource(share, NULL);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw resource != NULL;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw resource = sa_get_next_resource(resource)) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw value = scf_value_create(handle->handle);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (value == NULL) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw ret = SA_NO_MEMORY;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw break;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /* Get size of complete string */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw valstr = sa_get_resource_attr(resource, "name");
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw idstr = sa_get_resource_attr(resource, "id");
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw description = sa_get_resource_description(resource);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw strsize = (valstr != NULL) ? strlen(valstr) : 0;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw strsize += (idstr != NULL) ? strlen(idstr) : 0;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw strsize += (description != NULL) ? strlen(description) : 0;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (strsize > 0) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw strsize += 3; /* add nul and ':' */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw propstr = (char *)malloc(strsize);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (propstr == NULL) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw scf_value_destroy(value);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw ret = SA_NO_MEMORY;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw goto err;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (idstr == NULL)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw (void) snprintf(propstr, strsize, "%s",
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw valstr ? valstr : "");
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw else
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw (void) snprintf(propstr, strsize, "%s:%s:%s",
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krier idstr, valstr ? valstr : "",
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw description ? description : "");
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (scf_value_set_astring(value, propstr) != 0) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw ret = SA_SYSTEM_ERR;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw free(propstr);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw scf_value_destroy(value);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw break;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (scf_entry_add_value(entry, value) != 0) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw ret = SA_SYSTEM_ERR;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw free(propstr);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw scf_value_destroy(value);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw break;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /* the value is in the transaction */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw value = NULL;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw free(propstr);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwerr:
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krier if (valstr != NULL) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw sa_free_attr_string(valstr);
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krier valstr = NULL;
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krier }
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krier if (idstr != NULL) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw sa_free_attr_string(idstr);
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krier idstr = NULL;
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krier }
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krier if (description != NULL) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw sa_free_share_description(description);
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krier description = NULL;
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krier }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /* the entry is in the transaction */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw entry = NULL;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krier if (valstr != NULL)
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krier sa_free_attr_string(valstr);
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krier if (idstr != NULL)
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krier sa_free_attr_string(idstr);
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krier if (description != NULL)
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krier sa_free_share_description(description);
fe1c642d06e14b412cd83ae2179303186ab08972Bill Krier
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (ret == SA_SYSTEM_ERR) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw switch (scf_error()) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw case SCF_ERROR_PERMISSION_DENIED:
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw ret = SA_NO_PERMISSION;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw break;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * cleanup if there were any errors that didn't leave
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * these values where they would be cleaned up later.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (entry != NULL)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw scf_entry_destroy(entry);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (ret);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw}
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
6185db853e024a486ff8837e6784dd290d866112dougm/*
6185db853e024a486ff8837e6784dd290d866112dougm * sa_commit_share(handle, group, share)
6185db853e024a486ff8837e6784dd290d866112dougm *
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * Commit this share to the repository.
6185db853e024a486ff8837e6784dd290d866112dougm * properties are added if they exist but can be added later.
6185db853e024a486ff8837e6784dd290d866112dougm * Need to add to dfstab and sharetab, if appropriate.
6185db853e024a486ff8837e6784dd290d866112dougm */
6185db853e024a486ff8837e6784dd290d866112dougmint
6185db853e024a486ff8837e6784dd290d866112dougmsa_commit_share(scfutilhandle_t *handle, sa_group_t group, sa_share_t share)
6185db853e024a486ff8837e6784dd290d866112dougm{
6185db853e024a486ff8837e6784dd290d866112dougm int ret = SA_OK;
6185db853e024a486ff8837e6784dd290d866112dougm char *groupname;
6185db853e024a486ff8837e6784dd290d866112dougm char *name;
6185db853e024a486ff8837e6784dd290d866112dougm char *description;
6185db853e024a486ff8837e6784dd290d866112dougm char *sharename;
6185db853e024a486ff8837e6784dd290d866112dougm ssize_t proplen;
6185db853e024a486ff8837e6784dd290d866112dougm char *propstring;
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm /*
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * Don't commit in the zfs group. We do commit legacy
6185db853e024a486ff8837e6784dd290d866112dougm * (default) and all other groups/shares. ZFS is handled
6185db853e024a486ff8837e6784dd290d866112dougm * through the ZFS configuration rather than SMF.
6185db853e024a486ff8837e6784dd290d866112dougm */
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm groupname = sa_get_group_attr(group, "name");
6185db853e024a486ff8837e6784dd290d866112dougm if (groupname != NULL) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (strcmp(groupname, "zfs") == 0) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm /*
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * Adding to the ZFS group will result in the sharenfs
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * property being set but we don't want to do anything
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * SMF related at this point.
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm */
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm sa_free_attr_string(groupname);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm return (ret);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm }
6185db853e024a486ff8837e6784dd290d866112dougm }
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm proplen = get_scf_limit(SCF_LIMIT_MAX_VALUE_LENGTH);
6185db853e024a486ff8837e6784dd290d866112dougm propstring = malloc(proplen);
6185db853e024a486ff8837e6784dd290d866112dougm if (propstring == NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm ret = SA_NO_MEMORY;
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm if (groupname != NULL && ret == SA_OK) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm ret = sa_get_instance(handle, groupname);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm sa_free_attr_string(groupname);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm groupname = NULL;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm sharename = sa_get_share_attr(share, "id");
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (sharename == NULL) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm /* slipped by */
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm char shname[SA_SHARE_UUID_BUFLEN];
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm generate_unique_sharename(shname);
7a9d7716b53eb5c2c08bf4f0fdf4369571dbde4dthurlow (void) xmlSetProp((xmlNodePtr)share, (xmlChar *)"id",
6185db853e024a486ff8837e6784dd290d866112dougm (xmlChar *)shname);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm sharename = strdup(shname);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm }
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (sharename != NULL) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm sigset_t old, new;
6185db853e024a486ff8837e6784dd290d866112dougm /*
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * Have a share name allocated so create a pgroup for
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * it. It may already exist, but that is OK. In order
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * to avoid creating a share pgroup that doesn't have
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * a path property, block signals around the critical
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * region of creating the share pgroup and props.
6185db853e024a486ff8837e6784dd290d866112dougm */
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm (void) sigprocmask(SIG_BLOCK, NULL, &new);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm (void) sigaddset(&new, SIGHUP);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm (void) sigaddset(&new, SIGINT);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm (void) sigaddset(&new, SIGQUIT);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm (void) sigaddset(&new, SIGTSTP);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm (void) sigprocmask(SIG_SETMASK, &new, &old);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm ret = sa_create_pgroup(handle, sharename);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (ret == SA_OK) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm /*
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * Now start the transaction for the
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * properties that define this share. They may
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * exist so attempt to update before create.
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm */
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm ret = sa_start_transaction(handle, sharename);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm }
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (ret == SA_OK) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm name = sa_get_share_attr(share, "path");
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (name != NULL) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm /*
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * There needs to be a path
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * for a share to exist.
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm */
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm ret = sa_set_property(handle, "path",
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm name);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm sa_free_attr_string(name);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm } else {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm ret = SA_NO_MEMORY;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm }
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm }
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (ret == SA_OK) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw name = sa_get_share_attr(share, "drive-letter");
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (name != NULL) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /* A drive letter may exist for SMB */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw ret = sa_set_property(handle,
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw "drive-letter", name);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw sa_free_attr_string(name);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (ret == SA_OK) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw name = sa_get_share_attr(share, "exclude");
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (name != NULL) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * In special cases need to
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * exclude proto enable.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm ret = sa_set_property(handle,
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw "exclude", name);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw sa_free_attr_string(name);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm }
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (ret == SA_OK) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * If there are resource names, bundle them up
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * and save appropriately.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw ret = sa_set_resource_property(handle, share);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (ret == SA_OK) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm description = sa_get_share_description(share);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (description != NULL) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm ret = sa_set_property(handle,
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm "description",
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm description);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm sa_free_share_description(description);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm }
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm }
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm /* Make sure we cleanup the transaction */
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (ret == SA_OK) {
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm sa_handle_impl_t sahandle;
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm sahandle = (sa_handle_impl_t)
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm sa_find_group_handle(group);
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm if (sahandle != NULL)
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm ret = sa_end_transaction(handle,
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm sahandle);
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm else
5b6e0c463149a26dd0aeb4c1f70611c97161ff32dougm ret = SA_SYSTEM_ERR;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm } else {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm sa_abort_transaction(handle);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm }
f345c0beb4c8f75cb54c2e070498e56febd468acdougm
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm (void) sigprocmask(SIG_SETMASK, &old, NULL);
f345c0beb4c8f75cb54c2e070498e56febd468acdougm
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm free(sharename);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm }
6185db853e024a486ff8837e6784dd290d866112dougm }
6185db853e024a486ff8837e6784dd290d866112dougm if (ret == SA_SYSTEM_ERR) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm int err = scf_error();
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (err == SCF_ERROR_PERMISSION_DENIED)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm ret = SA_NO_PERMISSION;
6185db853e024a486ff8837e6784dd290d866112dougm }
6185db853e024a486ff8837e6784dd290d866112dougm if (propstring != NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm free(propstring);
6185db853e024a486ff8837e6784dd290d866112dougm if (groupname != NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm sa_free_attr_string(groupname);
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm return (ret);
6185db853e024a486ff8837e6784dd290d866112dougm}
6185db853e024a486ff8837e6784dd290d866112dougm
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw/*
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * remove_resources(handle, share, shareid)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw *
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * If the share has resources, remove all of them and their
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw * optionsets.
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwstatic int
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amwremove_resources(scfutilhandle_t *handle, sa_share_t share, char *shareid)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw{
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw sa_resource_t resource;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw sa_optionset_t opt;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw char *proto;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw char *id;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw ssize_t proplen;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw char *propstring;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw int ret = SA_OK;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw proplen = get_scf_limit(SCF_LIMIT_MAX_VALUE_LENGTH);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw propstring = malloc(proplen);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (propstring == NULL)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (SA_NO_MEMORY);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw for (resource = sa_get_share_resource(share, NULL);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw resource != NULL; resource = sa_get_next_resource(resource)) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw id = sa_get_resource_attr(resource, "id");
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (id == NULL)
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw continue;
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw for (opt = sa_get_optionset(resource, NULL);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw opt != NULL; opt = sa_get_next_optionset(resource)) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw proto = sa_get_optionset_attr(opt, "type");
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw if (proto != NULL) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw (void) snprintf(propstring, proplen,
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw "%s_%s_%s", shareid, proto, id);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw ret = sa_delete_pgroup(handle, propstring);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw sa_free_attr_string(proto);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw sa_free_attr_string(id);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw }
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw free(propstring);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw return (ret);
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw}
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw
6185db853e024a486ff8837e6784dd290d866112dougm/*
6185db853e024a486ff8837e6784dd290d866112dougm * sa_delete_share(handle, group, share)
6185db853e024a486ff8837e6784dd290d866112dougm *
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * Remove the specified share from the group (and service instance).
6185db853e024a486ff8837e6784dd290d866112dougm */
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougmint
6185db853e024a486ff8837e6784dd290d866112dougmsa_delete_share(scfutilhandle_t *handle, sa_group_t group, sa_share_t share)
6185db853e024a486ff8837e6784dd290d866112dougm{
6185db853e024a486ff8837e6784dd290d866112dougm int ret = SA_OK;
6185db853e024a486ff8837e6784dd290d866112dougm char *groupname = NULL;
6185db853e024a486ff8837e6784dd290d866112dougm char *shareid = NULL;
6185db853e024a486ff8837e6784dd290d866112dougm sa_optionset_t opt;
6185db853e024a486ff8837e6784dd290d866112dougm sa_security_t sec;
6185db853e024a486ff8837e6784dd290d866112dougm ssize_t proplen;
6185db853e024a486ff8837e6784dd290d866112dougm char *propstring;
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm proplen = get_scf_limit(SCF_LIMIT_MAX_VALUE_LENGTH);
6185db853e024a486ff8837e6784dd290d866112dougm propstring = malloc(proplen);
6185db853e024a486ff8837e6784dd290d866112dougm if (propstring == NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm ret = SA_NO_MEMORY;
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm if (ret == SA_OK) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm groupname = sa_get_group_attr(group, "name");
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm shareid = sa_get_share_attr(share, "id");
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (groupname == NULL || shareid == NULL) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm ret = SA_CONFIG_ERR;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm goto out;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm }
6185db853e024a486ff8837e6784dd290d866112dougm ret = sa_get_instance(handle, groupname);
6185db853e024a486ff8837e6784dd290d866112dougm if (ret == SA_OK) {
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw /* If a share has resources, remove them */
da6c28aaf62fa55f0fdb8004aa40f88f23bf53f0amw ret = remove_resources(handle, share, shareid);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm /* If a share has properties, remove them */
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm ret = sa_delete_pgroup(handle, shareid);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm for (opt = sa_get_optionset(share, NULL);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm opt != NULL;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm opt = sa_get_next_optionset(opt)) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm char *proto;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm proto = sa_get_optionset_attr(opt, "type");
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (proto != NULL) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm (void) snprintf(propstring,
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm proplen, "%s_%s", shareid,
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm proto);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm ret = sa_delete_pgroup(handle,
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm propstring);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm sa_free_attr_string(proto);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm } else {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm ret = SA_NO_MEMORY;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm }
6185db853e024a486ff8837e6784dd290d866112dougm }
6185db853e024a486ff8837e6784dd290d866112dougm /*
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm * If a share has security/negotiable
6185db853e024a486ff8837e6784dd290d866112dougm * properties, remove them.
6185db853e024a486ff8837e6784dd290d866112dougm */
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm for (sec = sa_get_security(share, NULL, NULL);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm sec != NULL;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm sec = sa_get_next_security(sec)) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm char *proto;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm char *sectype;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm proto = sa_get_security_attr(sec, "type");
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm sectype = sa_get_security_attr(sec, "sectype");
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (proto != NULL && sectype != NULL) {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm (void) snprintf(propstring, proplen,
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm "%s_%s_%s", shareid, proto,
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm sectype);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm ret = sa_delete_pgroup(handle,
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm propstring);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm } else {
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm ret = SA_NO_MEMORY;
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm }
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (proto != NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm sa_free_attr_string(proto);
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm if (sectype != NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm sa_free_attr_string(sectype);
6185db853e024a486ff8837e6784dd290d866112dougm }
6185db853e024a486ff8837e6784dd290d866112dougm }
6185db853e024a486ff8837e6784dd290d866112dougm }
25a68471b9ababbc21cfdbbb2866014f34f419ecdougmout:
6185db853e024a486ff8837e6784dd290d866112dougm if (groupname != NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm sa_free_attr_string(groupname);
6185db853e024a486ff8837e6784dd290d866112dougm if (shareid != NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm sa_free_attr_string(shareid);
6185db853e024a486ff8837e6784dd290d866112dougm if (propstring != NULL)
25a68471b9ababbc21cfdbbb2866014f34f419ecdougm free(propstring);
6185db853e024a486ff8837e6784dd290d866112dougm
6185db853e024a486ff8837e6784dd290d866112dougm return (ret);
6185db853e024a486ff8837e6784dd290d866112dougm}