9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn/*
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn * CDDL HEADER START
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn *
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn * The contents of this file are subject to the terms of the
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn * Common Development and Distribution License (the "License").
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn * You may not use this file except in compliance with the License.
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn *
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn * or http://www.opensolaris.org/os/licensing.
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn * See the License for the specific language governing permissions
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn * and limitations under the License.
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn *
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn * When distributing Covered Code, include this CDDL HEADER in each
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn * If applicable, add the following below this CDDL HEADER, with the
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn * fields enclosed by brackets "[]" replaced with your own identifying
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn * information: Portions Copyright [yyyy] [name of copyright owner]
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn *
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn * CDDL HEADER END
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn */
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn/*
a20ee4162885a4dc8273c6b6903dcb7e0e525704Glenn Faden * Copyright (c) 2006, 2010, Oracle and/or its affiliates. All rights reserved.
c6596baec58ade84b0609c78e64fc3f89447c7d1Patrick Mooney * Copyright (c) 2015, Joyent, Inc.
3c7284bd3243d42a710edac3a15f6019b4c849beAlexander Eremin * Copyright 2014 Nexenta Systems, Inc. All rights reserved.
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn */
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn#include <assert.h>
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn#include <dirent.h>
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn#include <errno.h>
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn#include <fnmatch.h>
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn#include <signal.h>
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn#include <stdlib.h>
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn#include <unistd.h>
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn#include <strings.h>
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn#include <synch.h>
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn#include <sys/brand.h>
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn#include <sys/fcntl.h>
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn#include <sys/param.h>
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn#include <sys/stat.h>
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn#include <sys/systeminfo.h>
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn#include <sys/types.h>
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn#include <thread.h>
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn#include <zone.h>
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn#include <libbrand_impl.h>
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn#include <libbrand.h>
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn
ff17c8bf86c3e567734be83f90267edee20f580fgjelinek#define DTD_ELEM_ATTACH ((const xmlChar *) "attach")
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn#define DTD_ELEM_BOOT ((const xmlChar *) "boot")
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn#define DTD_ELEM_BRAND ((const xmlChar *) "brand")
ff17c8bf86c3e567734be83f90267edee20f580fgjelinek#define DTD_ELEM_CLONE ((const xmlChar *) "clone")
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn#define DTD_ELEM_COMMENT ((const xmlChar *) "comment")
ff17c8bf86c3e567734be83f90267edee20f580fgjelinek#define DTD_ELEM_DETACH ((const xmlChar *) "detach")
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn#define DTD_ELEM_DEVICE ((const xmlChar *) "device")
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn#define DTD_ELEM_GLOBAL_MOUNT ((const xmlChar *) "global_mount")
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn#define DTD_ELEM_HALT ((const xmlChar *) "halt")
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn#define DTD_ELEM_INITNAME ((const xmlChar *) "initname")
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn#define DTD_ELEM_INSTALL ((const xmlChar *) "install")
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn#define DTD_ELEM_INSTALLOPTS ((const xmlChar *) "installopts")
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn#define DTD_ELEM_LOGIN_CMD ((const xmlChar *) "login_cmd")
cb8a054b1ab30d5caa746e6c44f29d4c9d3071c1Glenn Faden#define DTD_ELEM_FORCELOGIN_CMD ((const xmlChar *) "forcedlogin_cmd")
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn#define DTD_ELEM_MODNAME ((const xmlChar *) "modname")
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn#define DTD_ELEM_MOUNT ((const xmlChar *) "mount")
bafd1f1462c49949e0251d74b4fbfa24d29bc79aJerry Jelinek#define DTD_ELEM_RESTARTINIT ((const xmlChar *) "restartinit")
37774979c2601819ef2cdb4ae1469d9111ccf52bgjelinek#define DTD_ELEM_POSTATTACH ((const xmlChar *) "postattach")
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn#define DTD_ELEM_POSTCLONE ((const xmlChar *) "postclone")
1100f00d5652de2808b73c61bcfdb3fc87ef1fc8gjelinek#define DTD_ELEM_POSTINSTALL ((const xmlChar *) "postinstall")
ff17c8bf86c3e567734be83f90267edee20f580fgjelinek#define DTD_ELEM_POSTSNAP ((const xmlChar *) "postsnap")
c5cd6260c3d6c06a9359df595ad9dddbfd00a80e#define DTD_ELEM_POSTSTATECHG ((const xmlChar *) "poststatechange")
37774979c2601819ef2cdb4ae1469d9111ccf52bgjelinek#define DTD_ELEM_PREDETACH ((const xmlChar *) "predetach")
ff17c8bf86c3e567734be83f90267edee20f580fgjelinek#define DTD_ELEM_PRESNAP ((const xmlChar *) "presnap")
c5cd6260c3d6c06a9359df595ad9dddbfd00a80e#define DTD_ELEM_PRESTATECHG ((const xmlChar *) "prestatechange")
37774979c2601819ef2cdb4ae1469d9111ccf52bgjelinek#define DTD_ELEM_PREUNINSTALL ((const xmlChar *) "preuninstall")
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn#define DTD_ELEM_PRIVILEGE ((const xmlChar *) "privilege")
c5cd6260c3d6c06a9359df595ad9dddbfd00a80e#define DTD_ELEM_QUERY ((const xmlChar *) "query")
3c7284bd3243d42a710edac3a15f6019b4c849beAlexander Eremin#define DTD_ELEM_SHUTDOWN ((const xmlChar *) "shutdown")
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn#define DTD_ELEM_SYMLINK ((const xmlChar *) "symlink")
fbbfbc6ee66f60ad88ebd18c6c030797335354f4jv#define DTD_ELEM_SYSBOOT ((const xmlChar *) "sysboot")
ff17c8bf86c3e567734be83f90267edee20f580fgjelinek#define DTD_ELEM_UNINSTALL ((const xmlChar *) "uninstall")
858a4b9997a29c40b725e606eb9bc3ac0a8c765bsl#define DTD_ELEM_USER_CMD ((const xmlChar *) "user_cmd")
ff17c8bf86c3e567734be83f90267edee20f580fgjelinek#define DTD_ELEM_VALIDSNAP ((const xmlChar *) "validatesnap")
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn#define DTD_ELEM_VERIFY_CFG ((const xmlChar *) "verify_cfg")
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn#define DTD_ELEM_VERIFY_ADM ((const xmlChar *) "verify_adm")
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh#define DTD_ATTR_ALLOWEXCL ((const xmlChar *) "allow-exclusive-ip")
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn#define DTD_ATTR_ARCH ((const xmlChar *) "arch")
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn#define DTD_ATTR_DIRECTORY ((const xmlChar *) "directory")
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh#define DTD_ATTR_IPTYPE ((const xmlChar *) "ip-type")
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn#define DTD_ATTR_MATCH ((const xmlChar *) "match")
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn#define DTD_ATTR_MODE ((const xmlChar *) "mode")
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn#define DTD_ATTR_NAME ((const xmlChar *) "name")
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn#define DTD_ATTR_OPT ((const xmlChar *) "opt")
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn#define DTD_ATTR_PATH ((const xmlChar *) "path")
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn#define DTD_ATTR_SET ((const xmlChar *) "set")
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn#define DTD_ATTR_SOURCE ((const xmlChar *) "source")
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn#define DTD_ATTR_SPECIAL ((const xmlChar *) "special")
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn#define DTD_ATTR_TARGET ((const xmlChar *) "target")
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn#define DTD_ATTR_TYPE ((const xmlChar *) "type")
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh#define DTD_ENTITY_TRUE "true"
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnnstatic volatile boolean_t libbrand_initialized = B_FALSE;
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnnstatic char i_curr_arch[MAXNAMELEN];
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnnstatic char i_curr_zone[ZONENAME_MAX];
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn/*ARGSUSED*/
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnnstatic void
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnnbrand_error_func(void *ctx, const char *msg, ...)
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn{
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn /*
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn * Ignore error messages from libxml
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn */
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn}
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnnstatic boolean_t
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnnlibbrand_initialize()
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn{
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn static mutex_t initialize_lock = DEFAULTMUTEX;
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn (void) mutex_lock(&initialize_lock);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn if (libbrand_initialized) {
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn (void) mutex_unlock(&initialize_lock);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn return (B_TRUE);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn }
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn if (sysinfo(SI_ARCHITECTURE, i_curr_arch, sizeof (i_curr_arch)) < 0) {
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn (void) mutex_unlock(&initialize_lock);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn return (B_FALSE);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn }
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn if (getzonenamebyid(getzoneid(), i_curr_zone,
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn sizeof (i_curr_zone)) < 0) {
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn (void) mutex_unlock(&initialize_lock);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn return (B_FALSE);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn }
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn /*
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn * Note that here we're initializing per-process libxml2
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn * state. By doing so we're implicitly assuming that
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn * no other code in this process is also trying to
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn * use libxml2. But in most case we know this not to
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn * be true since we're almost always used in conjunction
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn * with libzonecfg, which also uses libxml2. Lucky for
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn * us, libzonecfg initializes libxml2 to essentially
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn * the same defaults as we're using below.
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn */
5ad42b1b1469908fabc0099764182e9ecbc04ddaSurya Prakki (void) xmlLineNumbersDefault(1);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn xmlLoadExtDtdDefaultValue |= XML_DETECT_IDS;
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn xmlDoValidityCheckingDefaultValue = 1;
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn (void) xmlKeepBlanksDefault(0);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn xmlGetWarningsDefaultValue = 0;
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn xmlSetGenericErrorFunc(NULL, brand_error_func);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn libbrand_initialized = B_TRUE;
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn (void) mutex_unlock(&initialize_lock);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn return (B_TRUE);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn}
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnnstatic const char *
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnnget_curr_arch(void)
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn{
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn if (!libbrand_initialize())
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn return (NULL);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn return (i_curr_arch);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn}
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnnstatic const char *
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnnget_curr_zone(void)
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn{
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn if (!libbrand_initialize())
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn return (NULL);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn return (i_curr_zone);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn}
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn/*
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn * Internal function to open an XML file
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn *
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn * Returns the XML doc pointer, or NULL on failure. It will validate the
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn * document, as well as removing any comments from the document structure.
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn */
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnnstatic xmlDocPtr
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnnopen_xml_file(const char *file)
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn{
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn xmlDocPtr doc;
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn xmlValidCtxtPtr cvp;
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn int valid;
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn if (!libbrand_initialize())
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn return (NULL);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn /*
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn * Parse the file
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn */
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn if ((doc = xmlParseFile(file)) == NULL)
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn return (NULL);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn /*
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn * Validate the file
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn */
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn if ((cvp = xmlNewValidCtxt()) == NULL) {
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn xmlFreeDoc(doc);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn return (NULL);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn }
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn cvp->error = brand_error_func;
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn cvp->warning = brand_error_func;
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn valid = xmlValidateDocument(cvp, doc);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn xmlFreeValidCtxt(cvp);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn if (valid == 0) {
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn xmlFreeDoc(doc);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn return (NULL);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn }
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn return (doc);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn}
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn/*
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn * Open a handle to the named brand.
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn *
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn * Returns a handle to the named brand, which is used for all subsequent brand
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn * interaction, or NULL if unable to open or initialize the brand.
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn */
123807fb8274cf8e22f09732e34303ba6baf55a5edpbrand_handle_t
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnnbrand_open(const char *name)
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn{
123807fb8274cf8e22f09732e34303ba6baf55a5edp struct brand_handle *bhp;
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn char path[MAXPATHLEN];
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn xmlNodePtr node;
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn xmlChar *property;
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn struct stat statbuf;
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn /*
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn * Make sure brand name isn't too long
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn */
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn if (strlen(name) >= MAXNAMELEN)
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn return (NULL);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn /*
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn * Check that the brand exists
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn */
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn (void) snprintf(path, sizeof (path), "%s/%s", BRAND_DIR, name);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn if (stat(path, &statbuf) != 0)
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn return (NULL);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn /*
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn * Allocate brand handle
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn */
123807fb8274cf8e22f09732e34303ba6baf55a5edp if ((bhp = malloc(sizeof (struct brand_handle))) == NULL)
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn return (NULL);
123807fb8274cf8e22f09732e34303ba6baf55a5edp bzero(bhp, sizeof (struct brand_handle));
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn (void) strcpy(bhp->bh_name, name);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn /*
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn * Open the configuration file
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn */
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn (void) snprintf(path, sizeof (path), "%s/%s/%s", BRAND_DIR, name,
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn BRAND_CONFIG);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn if ((bhp->bh_config = open_xml_file(path)) == NULL) {
123807fb8274cf8e22f09732e34303ba6baf55a5edp brand_close((brand_handle_t)bhp);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn return (NULL);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn }
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn /*
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn * Verify that the name of the brand matches the directory in which it
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn * is installed.
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn */
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn if ((node = xmlDocGetRootElement(bhp->bh_config)) == NULL) {
123807fb8274cf8e22f09732e34303ba6baf55a5edp brand_close((brand_handle_t)bhp);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn return (NULL);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn }
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn if (xmlStrcmp(node->name, DTD_ELEM_BRAND) != 0) {
123807fb8274cf8e22f09732e34303ba6baf55a5edp brand_close((brand_handle_t)bhp);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn return (NULL);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn }
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn if ((property = xmlGetProp(node, DTD_ATTR_NAME)) == NULL) {
123807fb8274cf8e22f09732e34303ba6baf55a5edp brand_close((brand_handle_t)bhp);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn return (NULL);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn }
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn if (strcmp((char *)property, name) != 0) {
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn xmlFree(property);
123807fb8274cf8e22f09732e34303ba6baf55a5edp brand_close((brand_handle_t)bhp);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn return (NULL);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn }
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn xmlFree(property);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn /*
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn * Open handle to platform configuration file.
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn */
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn (void) snprintf(path, sizeof (path), "%s/%s/%s", BRAND_DIR, name,
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn BRAND_PLATFORM);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn if ((bhp->bh_platform = open_xml_file(path)) == NULL) {
123807fb8274cf8e22f09732e34303ba6baf55a5edp brand_close((brand_handle_t)bhp);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn return (NULL);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn }
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn
123807fb8274cf8e22f09732e34303ba6baf55a5edp return ((brand_handle_t)bhp);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn}
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn/*
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn * Closes the given brand handle
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn */
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnnvoid
123807fb8274cf8e22f09732e34303ba6baf55a5edpbrand_close(brand_handle_t bh)
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn{
123807fb8274cf8e22f09732e34303ba6baf55a5edp struct brand_handle *bhp = (struct brand_handle *)bh;
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn if (bhp->bh_platform != NULL)
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn xmlFreeDoc(bhp->bh_platform);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn if (bhp->bh_config != NULL)
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn xmlFreeDoc(bhp->bh_config);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn free(bhp);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn}
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnnstatic int
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnni_substitute_tokens(const char *sbuf, char *dbuf, int dbuf_size,
ff17c8bf86c3e567734be83f90267edee20f580fgjelinek const char *zonename, const char *zonepath, const char *username,
ff17c8bf86c3e567734be83f90267edee20f580fgjelinek const char *curr_zone)
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn{
ff17c8bf86c3e567734be83f90267edee20f580fgjelinek int dst, src;
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn /*
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn * Walk through the characters, substituting values as needed.
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn */
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn dbuf[0] = '\0';
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn dst = 0;
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn for (src = 0; src < strlen((char *)sbuf) && dst < dbuf_size; src++) {
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn if (sbuf[src] != '%') {
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn dbuf[dst++] = sbuf[src];
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn continue;
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn }
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn switch (sbuf[++src]) {
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn case '%':
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn dst += strlcpy(dbuf + dst, "%", dbuf_size - dst);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn break;
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn case 'R':
ff17c8bf86c3e567734be83f90267edee20f580fgjelinek if (zonepath == NULL)
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn break;
ff17c8bf86c3e567734be83f90267edee20f580fgjelinek dst += strlcpy(dbuf + dst, zonepath, dbuf_size - dst);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn break;
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn case 'u':
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn if (username == NULL)
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn break;
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn dst += strlcpy(dbuf + dst, username, dbuf_size - dst);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn break;
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn case 'Z':
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn if (curr_zone == NULL)
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn break;
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn /* name of the zone we're running in */
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn dst += strlcpy(dbuf + dst, curr_zone, dbuf_size - dst);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn break;
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn case 'z':
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn /* name of the zone we're operating on */
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn if (zonename == NULL)
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn break;
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn dst += strlcpy(dbuf + dst, zonename, dbuf_size - dst);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn break;
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn }
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn }
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn if (dst >= dbuf_size)
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn return (-1);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn dbuf[dst] = '\0';
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn return (0);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn}
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn/*
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn * Retrieve the given tag from the brand.
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn * Perform the following substitutions as necessary:
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn *
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn * %% %
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn * %u Username
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn * %z Name of target zone
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn * %Z Name of current zone
ff17c8bf86c3e567734be83f90267edee20f580fgjelinek * %R Zonepath of zone
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn *
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn * Returns 0 on success, -1 on failure.
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn */
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnnstatic int
123807fb8274cf8e22f09732e34303ba6baf55a5edpbrand_get_value(struct brand_handle *bhp, const char *zonename,
ff17c8bf86c3e567734be83f90267edee20f580fgjelinek const char *zonepath, const char *username, const char *curr_zone,
ff17c8bf86c3e567734be83f90267edee20f580fgjelinek char *buf, size_t len, const xmlChar *tagname,
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn boolean_t substitute, boolean_t optional)
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn{
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn xmlNodePtr node;
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn xmlChar *content;
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn int err = 0;
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn /*
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn * Retrieve the specified value from the XML doc
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn */
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn if ((node = xmlDocGetRootElement(bhp->bh_config)) == NULL)
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn return (-1);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn if (xmlStrcmp(node->name, DTD_ELEM_BRAND) != 0)
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn return (-1);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn for (node = node->xmlChildrenNode; node != NULL;
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn node = node->next) {
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn if (xmlStrcmp(node->name, tagname) == 0)
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn break;
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn }
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn
db52f3aed012d3e73f2a8a861d7eee8d87ac71bcgjelinek if (node == NULL) {
db52f3aed012d3e73f2a8a861d7eee8d87ac71bcgjelinek if (optional) {
db52f3aed012d3e73f2a8a861d7eee8d87ac71bcgjelinek buf[0] = '\0';
db52f3aed012d3e73f2a8a861d7eee8d87ac71bcgjelinek return (0);
db52f3aed012d3e73f2a8a861d7eee8d87ac71bcgjelinek } else {
db52f3aed012d3e73f2a8a861d7eee8d87ac71bcgjelinek return (-1);
db52f3aed012d3e73f2a8a861d7eee8d87ac71bcgjelinek }
db52f3aed012d3e73f2a8a861d7eee8d87ac71bcgjelinek }
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn if ((content = xmlNodeGetContent(node)) == NULL)
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn return (-1);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn if (strlen((char *)content) == 0) {
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn /*
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn * If the entry in the config file is empty, check to see
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn * whether this is an optional field. If so, we return the
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn * empty buffer. If not, we return an error.
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn */
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn if (optional) {
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn buf[0] = '\0';
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn } else {
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn err = -1;
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn }
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn } else {
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn /* Substitute token values as needed. */
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn if (substitute) {
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn if (i_substitute_tokens((char *)content, buf, len,
ff17c8bf86c3e567734be83f90267edee20f580fgjelinek zonename, zonepath, username, curr_zone) != 0)
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn err = -1;
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn } else {
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn if (strlcpy(buf, (char *)content, len) >= len)
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn err = -1;
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn }
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn }
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn xmlFree(content);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn return (err);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn}
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn
ff17c8bf86c3e567734be83f90267edee20f580fgjelinekint
ff17c8bf86c3e567734be83f90267edee20f580fgjelinekbrand_get_attach(brand_handle_t bh, const char *zonename,
ff17c8bf86c3e567734be83f90267edee20f580fgjelinek const char *zonepath, char *buf, size_t len)
ff17c8bf86c3e567734be83f90267edee20f580fgjelinek{
ff17c8bf86c3e567734be83f90267edee20f580fgjelinek struct brand_handle *bhp = (struct brand_handle *)bh;
ff17c8bf86c3e567734be83f90267edee20f580fgjelinek return (brand_get_value(bhp, zonename, zonepath, NULL, NULL,
ff17c8bf86c3e567734be83f90267edee20f580fgjelinek buf, len, DTD_ELEM_ATTACH, B_TRUE, B_TRUE));
ff17c8bf86c3e567734be83f90267edee20f580fgjelinek}
ff17c8bf86c3e567734be83f90267edee20f580fgjelinek
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnnint
123807fb8274cf8e22f09732e34303ba6baf55a5edpbrand_get_boot(brand_handle_t bh, const char *zonename,
ff17c8bf86c3e567734be83f90267edee20f580fgjelinek const char *zonepath, char *buf, size_t len)
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn{
123807fb8274cf8e22f09732e34303ba6baf55a5edp struct brand_handle *bhp = (struct brand_handle *)bh;
ff17c8bf86c3e567734be83f90267edee20f580fgjelinek return (brand_get_value(bhp, zonename, zonepath, NULL, NULL,
ff17c8bf86c3e567734be83f90267edee20f580fgjelinek buf, len, DTD_ELEM_BOOT, B_TRUE, B_TRUE));
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn}
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnnint
123807fb8274cf8e22f09732e34303ba6baf55a5edpbrand_get_brandname(brand_handle_t bh, char *buf, size_t len)
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn{
123807fb8274cf8e22f09732e34303ba6baf55a5edp struct brand_handle *bhp = (struct brand_handle *)bh;
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn if (len <= strlen(bhp->bh_name))
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn return (-1);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn (void) strcpy(buf, bhp->bh_name);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn return (0);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn}
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn
ff17c8bf86c3e567734be83f90267edee20f580fgjelinekint
ff17c8bf86c3e567734be83f90267edee20f580fgjelinekbrand_get_clone(brand_handle_t bh, const char *zonename,
ff17c8bf86c3e567734be83f90267edee20f580fgjelinek const char *zonepath, char *buf, size_t len)
ff17c8bf86c3e567734be83f90267edee20f580fgjelinek{
ff17c8bf86c3e567734be83f90267edee20f580fgjelinek struct brand_handle *bhp = (struct brand_handle *)bh;
ff17c8bf86c3e567734be83f90267edee20f580fgjelinek return (brand_get_value(bhp, zonename, zonepath, NULL, NULL,
ff17c8bf86c3e567734be83f90267edee20f580fgjelinek buf, len, DTD_ELEM_CLONE, B_TRUE, B_TRUE));
ff17c8bf86c3e567734be83f90267edee20f580fgjelinek}
ff17c8bf86c3e567734be83f90267edee20f580fgjelinek
ff17c8bf86c3e567734be83f90267edee20f580fgjelinekint
ff17c8bf86c3e567734be83f90267edee20f580fgjelinekbrand_get_detach(brand_handle_t bh, const char *zonename,
ff17c8bf86c3e567734be83f90267edee20f580fgjelinek const char *zonepath, char *buf, size_t len)
ff17c8bf86c3e567734be83f90267edee20f580fgjelinek{
ff17c8bf86c3e567734be83f90267edee20f580fgjelinek struct brand_handle *bhp = (struct brand_handle *)bh;
ff17c8bf86c3e567734be83f90267edee20f580fgjelinek return (brand_get_value(bhp, zonename, zonepath, NULL, NULL,
ff17c8bf86c3e567734be83f90267edee20f580fgjelinek buf, len, DTD_ELEM_DETACH, B_TRUE, B_TRUE));
ff17c8bf86c3e567734be83f90267edee20f580fgjelinek}
ff17c8bf86c3e567734be83f90267edee20f580fgjelinek
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnnint
123807fb8274cf8e22f09732e34303ba6baf55a5edpbrand_get_halt(brand_handle_t bh, const char *zonename,
ff17c8bf86c3e567734be83f90267edee20f580fgjelinek const char *zonepath, char *buf, size_t len)
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn{
123807fb8274cf8e22f09732e34303ba6baf55a5edp struct brand_handle *bhp = (struct brand_handle *)bh;
ff17c8bf86c3e567734be83f90267edee20f580fgjelinek return (brand_get_value(bhp, zonename, zonepath, NULL, NULL,
ff17c8bf86c3e567734be83f90267edee20f580fgjelinek buf, len, DTD_ELEM_HALT, B_TRUE, B_TRUE));
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn}
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn
3c7284bd3243d42a710edac3a15f6019b4c849beAlexander Ereminint
3c7284bd3243d42a710edac3a15f6019b4c849beAlexander Ereminbrand_get_shutdown(brand_handle_t bh, const char *zonename,
3c7284bd3243d42a710edac3a15f6019b4c849beAlexander Eremin const char *zonepath, char *buf, size_t len)
3c7284bd3243d42a710edac3a15f6019b4c849beAlexander Eremin{
3c7284bd3243d42a710edac3a15f6019b4c849beAlexander Eremin struct brand_handle *bhp = (struct brand_handle *)bh;
3c7284bd3243d42a710edac3a15f6019b4c849beAlexander Eremin return (brand_get_value(bhp, zonename, zonepath, NULL, NULL,
3c7284bd3243d42a710edac3a15f6019b4c849beAlexander Eremin buf, len, DTD_ELEM_SHUTDOWN, B_TRUE, B_TRUE));
3c7284bd3243d42a710edac3a15f6019b4c849beAlexander Eremin}
3c7284bd3243d42a710edac3a15f6019b4c849beAlexander Eremin
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnnint
123807fb8274cf8e22f09732e34303ba6baf55a5edpbrand_get_initname(brand_handle_t bh, char *buf, size_t len)
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn{
123807fb8274cf8e22f09732e34303ba6baf55a5edp struct brand_handle *bhp = (struct brand_handle *)bh;
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn return (brand_get_value(bhp, NULL, NULL, NULL, NULL,
ff17c8bf86c3e567734be83f90267edee20f580fgjelinek buf, len, DTD_ELEM_INITNAME, B_FALSE, B_FALSE));
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn}
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn
bafd1f1462c49949e0251d74b4fbfa24d29bc79aJerry Jelinekboolean_t
bafd1f1462c49949e0251d74b4fbfa24d29bc79aJerry Jelinekbrand_restartinit(brand_handle_t bh)
bafd1f1462c49949e0251d74b4fbfa24d29bc79aJerry Jelinek{
bafd1f1462c49949e0251d74b4fbfa24d29bc79aJerry Jelinek struct brand_handle *bhp = (struct brand_handle *)bh;
bafd1f1462c49949e0251d74b4fbfa24d29bc79aJerry Jelinek char val[80];
bafd1f1462c49949e0251d74b4fbfa24d29bc79aJerry Jelinek
bafd1f1462c49949e0251d74b4fbfa24d29bc79aJerry Jelinek if (brand_get_value(bhp, NULL, NULL, NULL, NULL,
bafd1f1462c49949e0251d74b4fbfa24d29bc79aJerry Jelinek val, sizeof (val), DTD_ELEM_RESTARTINIT, B_FALSE, B_FALSE) != 0)
bafd1f1462c49949e0251d74b4fbfa24d29bc79aJerry Jelinek return (B_TRUE);
bafd1f1462c49949e0251d74b4fbfa24d29bc79aJerry Jelinek
bafd1f1462c49949e0251d74b4fbfa24d29bc79aJerry Jelinek if (strcmp(val, "false") == 0)
bafd1f1462c49949e0251d74b4fbfa24d29bc79aJerry Jelinek return (B_FALSE);
bafd1f1462c49949e0251d74b4fbfa24d29bc79aJerry Jelinek return (B_TRUE);
bafd1f1462c49949e0251d74b4fbfa24d29bc79aJerry Jelinek}
bafd1f1462c49949e0251d74b4fbfa24d29bc79aJerry Jelinek
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnnint
123807fb8274cf8e22f09732e34303ba6baf55a5edpbrand_get_login_cmd(brand_handle_t bh, const char *username,
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn char *buf, size_t len)
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn{
123807fb8274cf8e22f09732e34303ba6baf55a5edp struct brand_handle *bhp = (struct brand_handle *)bh;
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn const char *curr_zone = get_curr_zone();
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn return (brand_get_value(bhp, NULL, NULL, username, curr_zone,
ff17c8bf86c3e567734be83f90267edee20f580fgjelinek buf, len, DTD_ELEM_LOGIN_CMD, B_TRUE, B_FALSE));
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn}
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn
cb8a054b1ab30d5caa746e6c44f29d4c9d3071c1Glenn Fadenint
cb8a054b1ab30d5caa746e6c44f29d4c9d3071c1Glenn Fadenbrand_get_forcedlogin_cmd(brand_handle_t bh, const char *username,
cb8a054b1ab30d5caa746e6c44f29d4c9d3071c1Glenn Faden char *buf, size_t len)
cb8a054b1ab30d5caa746e6c44f29d4c9d3071c1Glenn Faden{
cb8a054b1ab30d5caa746e6c44f29d4c9d3071c1Glenn Faden struct brand_handle *bhp = (struct brand_handle *)bh;
cb8a054b1ab30d5caa746e6c44f29d4c9d3071c1Glenn Faden const char *curr_zone = get_curr_zone();
cb8a054b1ab30d5caa746e6c44f29d4c9d3071c1Glenn Faden return (brand_get_value(bhp, NULL, NULL, username, curr_zone,
cb8a054b1ab30d5caa746e6c44f29d4c9d3071c1Glenn Faden buf, len, DTD_ELEM_FORCELOGIN_CMD, B_TRUE, B_FALSE));
cb8a054b1ab30d5caa746e6c44f29d4c9d3071c1Glenn Faden}
cb8a054b1ab30d5caa746e6c44f29d4c9d3071c1Glenn Faden
858a4b9997a29c40b725e606eb9bc3ac0a8c765bslint
858a4b9997a29c40b725e606eb9bc3ac0a8c765bslbrand_get_user_cmd(brand_handle_t bh, const char *username,
858a4b9997a29c40b725e606eb9bc3ac0a8c765bsl char *buf, size_t len)
858a4b9997a29c40b725e606eb9bc3ac0a8c765bsl{
858a4b9997a29c40b725e606eb9bc3ac0a8c765bsl struct brand_handle *bhp = (struct brand_handle *)bh;
858a4b9997a29c40b725e606eb9bc3ac0a8c765bsl
858a4b9997a29c40b725e606eb9bc3ac0a8c765bsl return (brand_get_value(bhp, NULL, NULL, username, NULL,
ff17c8bf86c3e567734be83f90267edee20f580fgjelinek buf, len, DTD_ELEM_USER_CMD, B_TRUE, B_FALSE));
858a4b9997a29c40b725e606eb9bc3ac0a8c765bsl}
858a4b9997a29c40b725e606eb9bc3ac0a8c765bsl
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnnint
123807fb8274cf8e22f09732e34303ba6baf55a5edpbrand_get_install(brand_handle_t bh, const char *zonename,
ff17c8bf86c3e567734be83f90267edee20f580fgjelinek const char *zonepath, char *buf, size_t len)
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn{
123807fb8274cf8e22f09732e34303ba6baf55a5edp struct brand_handle *bhp = (struct brand_handle *)bh;
ff17c8bf86c3e567734be83f90267edee20f580fgjelinek return (brand_get_value(bhp, zonename, zonepath, NULL, NULL,
ff17c8bf86c3e567734be83f90267edee20f580fgjelinek buf, len, DTD_ELEM_INSTALL, B_TRUE, B_FALSE));
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn}
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnnint
123807fb8274cf8e22f09732e34303ba6baf55a5edpbrand_get_installopts(brand_handle_t bh, char *buf, size_t len)
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn{
123807fb8274cf8e22f09732e34303ba6baf55a5edp struct brand_handle *bhp = (struct brand_handle *)bh;
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn return (brand_get_value(bhp, NULL, NULL, NULL, NULL,
ff17c8bf86c3e567734be83f90267edee20f580fgjelinek buf, len, DTD_ELEM_INSTALLOPTS, B_FALSE, B_TRUE));
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn}
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnnint
123807fb8274cf8e22f09732e34303ba6baf55a5edpbrand_get_modname(brand_handle_t bh, char *buf, size_t len)
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn{
123807fb8274cf8e22f09732e34303ba6baf55a5edp struct brand_handle *bhp = (struct brand_handle *)bh;
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn return (brand_get_value(bhp, NULL, NULL, NULL, NULL,
ff17c8bf86c3e567734be83f90267edee20f580fgjelinek buf, len, DTD_ELEM_MODNAME, B_FALSE, B_TRUE));
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn}
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn
37774979c2601819ef2cdb4ae1469d9111ccf52bgjelinekint
37774979c2601819ef2cdb4ae1469d9111ccf52bgjelinekbrand_get_postattach(brand_handle_t bh, const char *zonename,
ff17c8bf86c3e567734be83f90267edee20f580fgjelinek const char *zonepath, char *buf, size_t len)
37774979c2601819ef2cdb4ae1469d9111ccf52bgjelinek{
37774979c2601819ef2cdb4ae1469d9111ccf52bgjelinek struct brand_handle *bhp = (struct brand_handle *)bh;
ff17c8bf86c3e567734be83f90267edee20f580fgjelinek return (brand_get_value(bhp, zonename, zonepath, NULL, NULL,
ff17c8bf86c3e567734be83f90267edee20f580fgjelinek buf, len, DTD_ELEM_POSTATTACH, B_TRUE, B_TRUE));
37774979c2601819ef2cdb4ae1469d9111ccf52bgjelinek}
37774979c2601819ef2cdb4ae1469d9111ccf52bgjelinek
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnnint
123807fb8274cf8e22f09732e34303ba6baf55a5edpbrand_get_postclone(brand_handle_t bh, const char *zonename,
ff17c8bf86c3e567734be83f90267edee20f580fgjelinek const char *zonepath, char *buf, size_t len)
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn{
123807fb8274cf8e22f09732e34303ba6baf55a5edp struct brand_handle *bhp = (struct brand_handle *)bh;
ff17c8bf86c3e567734be83f90267edee20f580fgjelinek return (brand_get_value(bhp, zonename, zonepath, NULL, NULL,
ff17c8bf86c3e567734be83f90267edee20f580fgjelinek buf, len, DTD_ELEM_POSTCLONE, B_TRUE, B_TRUE));
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn}
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn
1100f00d5652de2808b73c61bcfdb3fc87ef1fc8gjelinekint
1100f00d5652de2808b73c61bcfdb3fc87ef1fc8gjelinekbrand_get_postinstall(brand_handle_t bh, const char *zonename,
ff17c8bf86c3e567734be83f90267edee20f580fgjelinek const char *zonepath, char *buf, size_t len)
ff17c8bf86c3e567734be83f90267edee20f580fgjelinek{
ff17c8bf86c3e567734be83f90267edee20f580fgjelinek struct brand_handle *bhp = (struct brand_handle *)bh;
ff17c8bf86c3e567734be83f90267edee20f580fgjelinek return (brand_get_value(bhp, zonename, zonepath, NULL, NULL,
ff17c8bf86c3e567734be83f90267edee20f580fgjelinek buf, len, DTD_ELEM_POSTINSTALL, B_TRUE, B_TRUE));
ff17c8bf86c3e567734be83f90267edee20f580fgjelinek}
ff17c8bf86c3e567734be83f90267edee20f580fgjelinek
ff17c8bf86c3e567734be83f90267edee20f580fgjelinekint
ff17c8bf86c3e567734be83f90267edee20f580fgjelinekbrand_get_postsnap(brand_handle_t bh, const char *zonename,
ff17c8bf86c3e567734be83f90267edee20f580fgjelinek const char *zonepath, char *buf, size_t len)
1100f00d5652de2808b73c61bcfdb3fc87ef1fc8gjelinek{
1100f00d5652de2808b73c61bcfdb3fc87ef1fc8gjelinek struct brand_handle *bhp = (struct brand_handle *)bh;
ff17c8bf86c3e567734be83f90267edee20f580fgjelinek return (brand_get_value(bhp, zonename, zonepath, NULL, NULL,
ff17c8bf86c3e567734be83f90267edee20f580fgjelinek buf, len, DTD_ELEM_POSTSNAP, B_TRUE, B_TRUE));
1100f00d5652de2808b73c61bcfdb3fc87ef1fc8gjelinek}
1100f00d5652de2808b73c61bcfdb3fc87ef1fc8gjelinek
c5cd6260c3d6c06a9359df595ad9dddbfd00a80eint
c5cd6260c3d6c06a9359df595ad9dddbfd00a80ebrand_get_poststatechange(brand_handle_t bh, const char *zonename,
c5cd6260c3d6c06a9359df595ad9dddbfd00a80e const char *zonepath, char *buf, size_t len)
c5cd6260c3d6c06a9359df595ad9dddbfd00a80e{
c5cd6260c3d6c06a9359df595ad9dddbfd00a80e struct brand_handle *bhp = (struct brand_handle *)bh;
c5cd6260c3d6c06a9359df595ad9dddbfd00a80e return (brand_get_value(bhp, zonename, zonepath, NULL, NULL,
c5cd6260c3d6c06a9359df595ad9dddbfd00a80e buf, len, DTD_ELEM_POSTSTATECHG, B_TRUE, B_TRUE));
c5cd6260c3d6c06a9359df595ad9dddbfd00a80e}
c5cd6260c3d6c06a9359df595ad9dddbfd00a80e
37774979c2601819ef2cdb4ae1469d9111ccf52bgjelinekint
37774979c2601819ef2cdb4ae1469d9111ccf52bgjelinekbrand_get_predetach(brand_handle_t bh, const char *zonename,
ff17c8bf86c3e567734be83f90267edee20f580fgjelinek const char *zonepath, char *buf, size_t len)
ff17c8bf86c3e567734be83f90267edee20f580fgjelinek{
ff17c8bf86c3e567734be83f90267edee20f580fgjelinek struct brand_handle *bhp = (struct brand_handle *)bh;
ff17c8bf86c3e567734be83f90267edee20f580fgjelinek return (brand_get_value(bhp, zonename, zonepath, NULL, NULL,
ff17c8bf86c3e567734be83f90267edee20f580fgjelinek buf, len, DTD_ELEM_PREDETACH, B_TRUE, B_TRUE));
ff17c8bf86c3e567734be83f90267edee20f580fgjelinek}
ff17c8bf86c3e567734be83f90267edee20f580fgjelinek
ff17c8bf86c3e567734be83f90267edee20f580fgjelinekint
ff17c8bf86c3e567734be83f90267edee20f580fgjelinekbrand_get_presnap(brand_handle_t bh, const char *zonename,
ff17c8bf86c3e567734be83f90267edee20f580fgjelinek const char *zonepath, char *buf, size_t len)
37774979c2601819ef2cdb4ae1469d9111ccf52bgjelinek{
37774979c2601819ef2cdb4ae1469d9111ccf52bgjelinek struct brand_handle *bhp = (struct brand_handle *)bh;
ff17c8bf86c3e567734be83f90267edee20f580fgjelinek return (brand_get_value(bhp, zonename, zonepath, NULL, NULL,
ff17c8bf86c3e567734be83f90267edee20f580fgjelinek buf, len, DTD_ELEM_PRESNAP, B_TRUE, B_TRUE));
37774979c2601819ef2cdb4ae1469d9111ccf52bgjelinek}
37774979c2601819ef2cdb4ae1469d9111ccf52bgjelinek
c5cd6260c3d6c06a9359df595ad9dddbfd00a80eint
c5cd6260c3d6c06a9359df595ad9dddbfd00a80ebrand_get_prestatechange(brand_handle_t bh, const char *zonename,
c5cd6260c3d6c06a9359df595ad9dddbfd00a80e const char *zonepath, char *buf, size_t len)
c5cd6260c3d6c06a9359df595ad9dddbfd00a80e{
c5cd6260c3d6c06a9359df595ad9dddbfd00a80e struct brand_handle *bhp = (struct brand_handle *)bh;
c5cd6260c3d6c06a9359df595ad9dddbfd00a80e return (brand_get_value(bhp, zonename, zonepath, NULL, NULL,
c5cd6260c3d6c06a9359df595ad9dddbfd00a80e buf, len, DTD_ELEM_PRESTATECHG, B_TRUE, B_TRUE));
c5cd6260c3d6c06a9359df595ad9dddbfd00a80e}
c5cd6260c3d6c06a9359df595ad9dddbfd00a80e
37774979c2601819ef2cdb4ae1469d9111ccf52bgjelinekint
37774979c2601819ef2cdb4ae1469d9111ccf52bgjelinekbrand_get_preuninstall(brand_handle_t bh, const char *zonename,
ff17c8bf86c3e567734be83f90267edee20f580fgjelinek const char *zonepath, char *buf, size_t len)
ff17c8bf86c3e567734be83f90267edee20f580fgjelinek{
ff17c8bf86c3e567734be83f90267edee20f580fgjelinek struct brand_handle *bhp = (struct brand_handle *)bh;
ff17c8bf86c3e567734be83f90267edee20f580fgjelinek return (brand_get_value(bhp, zonename, zonepath, NULL, NULL,
ff17c8bf86c3e567734be83f90267edee20f580fgjelinek buf, len, DTD_ELEM_PREUNINSTALL, B_TRUE, B_TRUE));
ff17c8bf86c3e567734be83f90267edee20f580fgjelinek}
ff17c8bf86c3e567734be83f90267edee20f580fgjelinek
c5cd6260c3d6c06a9359df595ad9dddbfd00a80eint
c5cd6260c3d6c06a9359df595ad9dddbfd00a80ebrand_get_query(brand_handle_t bh, const char *zonename,
c5cd6260c3d6c06a9359df595ad9dddbfd00a80e const char *zonepath, char *buf, size_t len)
c5cd6260c3d6c06a9359df595ad9dddbfd00a80e{
c5cd6260c3d6c06a9359df595ad9dddbfd00a80e struct brand_handle *bhp = (struct brand_handle *)bh;
c5cd6260c3d6c06a9359df595ad9dddbfd00a80e return (brand_get_value(bhp, zonename, zonepath, NULL, NULL,
c5cd6260c3d6c06a9359df595ad9dddbfd00a80e buf, len, DTD_ELEM_QUERY, B_TRUE, B_TRUE));
c5cd6260c3d6c06a9359df595ad9dddbfd00a80e}
c5cd6260c3d6c06a9359df595ad9dddbfd00a80e
ff17c8bf86c3e567734be83f90267edee20f580fgjelinekint
ff17c8bf86c3e567734be83f90267edee20f580fgjelinekbrand_get_uninstall(brand_handle_t bh, const char *zonename,
ff17c8bf86c3e567734be83f90267edee20f580fgjelinek const char *zonepath, char *buf, size_t len)
ff17c8bf86c3e567734be83f90267edee20f580fgjelinek{
ff17c8bf86c3e567734be83f90267edee20f580fgjelinek struct brand_handle *bhp = (struct brand_handle *)bh;
ff17c8bf86c3e567734be83f90267edee20f580fgjelinek return (brand_get_value(bhp, zonename, zonepath, NULL, NULL,
ff17c8bf86c3e567734be83f90267edee20f580fgjelinek buf, len, DTD_ELEM_UNINSTALL, B_TRUE, B_TRUE));
ff17c8bf86c3e567734be83f90267edee20f580fgjelinek}
ff17c8bf86c3e567734be83f90267edee20f580fgjelinek
ff17c8bf86c3e567734be83f90267edee20f580fgjelinekint
ff17c8bf86c3e567734be83f90267edee20f580fgjelinekbrand_get_validatesnap(brand_handle_t bh, const char *zonename,
ff17c8bf86c3e567734be83f90267edee20f580fgjelinek const char *zonepath, char *buf, size_t len)
37774979c2601819ef2cdb4ae1469d9111ccf52bgjelinek{
37774979c2601819ef2cdb4ae1469d9111ccf52bgjelinek struct brand_handle *bhp = (struct brand_handle *)bh;
ff17c8bf86c3e567734be83f90267edee20f580fgjelinek return (brand_get_value(bhp, zonename, zonepath, NULL, NULL,
ff17c8bf86c3e567734be83f90267edee20f580fgjelinek buf, len, DTD_ELEM_VALIDSNAP, B_TRUE, B_TRUE));
37774979c2601819ef2cdb4ae1469d9111ccf52bgjelinek}
37774979c2601819ef2cdb4ae1469d9111ccf52bgjelinek
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnnint
123807fb8274cf8e22f09732e34303ba6baf55a5edpbrand_get_verify_cfg(brand_handle_t bh, char *buf, size_t len)
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn{
123807fb8274cf8e22f09732e34303ba6baf55a5edp struct brand_handle *bhp = (struct brand_handle *)bh;
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn return (brand_get_value(bhp, NULL, NULL, NULL, NULL,
ff17c8bf86c3e567734be83f90267edee20f580fgjelinek buf, len, DTD_ELEM_VERIFY_CFG, B_FALSE, B_TRUE));
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn}
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnnint
123807fb8274cf8e22f09732e34303ba6baf55a5edpbrand_get_verify_adm(brand_handle_t bh, const char *zonename,
ff17c8bf86c3e567734be83f90267edee20f580fgjelinek const char *zonepath, char *buf, size_t len)
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn{
123807fb8274cf8e22f09732e34303ba6baf55a5edp struct brand_handle *bhp = (struct brand_handle *)bh;
ff17c8bf86c3e567734be83f90267edee20f580fgjelinek return (brand_get_value(bhp, zonename, zonepath, NULL, NULL,
ff17c8bf86c3e567734be83f90267edee20f580fgjelinek buf, len, DTD_ELEM_VERIFY_ADM, B_TRUE, B_TRUE));
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn}
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn
fbbfbc6ee66f60ad88ebd18c6c030797335354f4jvint
fbbfbc6ee66f60ad88ebd18c6c030797335354f4jvbrand_get_sysboot(brand_handle_t bh, const char *zonename,
fbbfbc6ee66f60ad88ebd18c6c030797335354f4jv const char *zonepath, char *buf, size_t len)
fbbfbc6ee66f60ad88ebd18c6c030797335354f4jv{
fbbfbc6ee66f60ad88ebd18c6c030797335354f4jv struct brand_handle *bhp = (struct brand_handle *)bh;
fbbfbc6ee66f60ad88ebd18c6c030797335354f4jv return (brand_get_value(bhp, zonename, zonepath, NULL, NULL,
fbbfbc6ee66f60ad88ebd18c6c030797335354f4jv buf, len, DTD_ELEM_SYSBOOT, B_TRUE, B_TRUE));
fbbfbc6ee66f60ad88ebd18c6c030797335354f4jv}
fbbfbc6ee66f60ad88ebd18c6c030797335354f4jv
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dhboolean_t
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dhbrand_allow_exclusive_ip(brand_handle_t bh)
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh{
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh struct brand_handle *bhp = (struct brand_handle *)bh;
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh xmlNodePtr node;
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh xmlChar *allow_excl;
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh boolean_t ret;
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh assert(bhp != NULL);
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh if ((node = xmlDocGetRootElement(bhp->bh_platform)) == NULL)
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh return (B_FALSE);
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh allow_excl = xmlGetProp(node, DTD_ATTR_ALLOWEXCL);
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh if (allow_excl == NULL)
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh return (B_FALSE);
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh /* Note: only return B_TRUE if it's "true" */
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh if (strcmp((char *)allow_excl, DTD_ENTITY_TRUE) == 0)
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh ret = B_TRUE;
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh else
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh ret = B_FALSE;
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh xmlFree(allow_excl);
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh return (ret);
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh}
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn/*
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn * Iterate over brand privileges
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn *
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn * Walks the brand config, searching for <privilege> elements, calling the
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn * specified callback for each. Returns 0 on success, or -1 on failure.
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn */
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnnint
bf1d7e28fd966a3f7e92b40aa301efdedc81ef7bdhbrand_config_iter_privilege(brand_handle_t bh,
bf1d7e28fd966a3f7e92b40aa301efdedc81ef7bdh int (*func)(void *, priv_iter_t *), void *data)
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn{
123807fb8274cf8e22f09732e34303ba6baf55a5edp struct brand_handle *bhp = (struct brand_handle *)bh;
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn xmlNodePtr node;
bf1d7e28fd966a3f7e92b40aa301efdedc81ef7bdh xmlChar *name, *set, *iptype;
bf1d7e28fd966a3f7e92b40aa301efdedc81ef7bdh priv_iter_t priv_iter;
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn int ret;
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn if ((node = xmlDocGetRootElement(bhp->bh_config)) == NULL)
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn return (-1);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn for (node = node->xmlChildrenNode; node != NULL; node = node->next) {
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn if (xmlStrcmp(node->name, DTD_ELEM_PRIVILEGE) != 0)
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn continue;
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn name = xmlGetProp(node, DTD_ATTR_NAME);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn set = xmlGetProp(node, DTD_ATTR_SET);
bf1d7e28fd966a3f7e92b40aa301efdedc81ef7bdh iptype = xmlGetProp(node, DTD_ATTR_IPTYPE);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn
bf1d7e28fd966a3f7e92b40aa301efdedc81ef7bdh if (name == NULL || set == NULL || iptype == NULL) {
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn if (name != NULL)
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn xmlFree(name);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn if (set != NULL)
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn xmlFree(set);
bf1d7e28fd966a3f7e92b40aa301efdedc81ef7bdh if (iptype != NULL)
bf1d7e28fd966a3f7e92b40aa301efdedc81ef7bdh xmlFree(iptype);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn return (-1);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn }
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn
bf1d7e28fd966a3f7e92b40aa301efdedc81ef7bdh priv_iter.pi_name = (char *)name;
bf1d7e28fd966a3f7e92b40aa301efdedc81ef7bdh priv_iter.pi_set = (char *)set;
bf1d7e28fd966a3f7e92b40aa301efdedc81ef7bdh priv_iter.pi_iptype = (char *)iptype;
bf1d7e28fd966a3f7e92b40aa301efdedc81ef7bdh
bf1d7e28fd966a3f7e92b40aa301efdedc81ef7bdh ret = func(data, &priv_iter);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn xmlFree(name);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn xmlFree(set);
bf1d7e28fd966a3f7e92b40aa301efdedc81ef7bdh xmlFree(iptype);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn if (ret != 0)
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn return (-1);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn }
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn return (0);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn}
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnnstatic int
c6596baec58ade84b0609c78e64fc3f89447c7d1Patrick Mooneyi_brand_platform_iter_mounts(struct brand_handle *bhp, const char *zonename,
c6596baec58ade84b0609c78e64fc3f89447c7d1Patrick Mooney const char *zonepath, int (*func)(void *, const char *, const char *,
c6596baec58ade84b0609c78e64fc3f89447c7d1Patrick Mooney const char *, const char *), void *data, const xmlChar *mount_type)
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn{
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn xmlNodePtr node;
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn xmlChar *special, *dir, *type, *opt;
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn char special_exp[MAXPATHLEN];
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn char opt_exp[MAXPATHLEN];
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn int ret;
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn if ((node = xmlDocGetRootElement(bhp->bh_platform)) == NULL)
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn return (-1);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn for (node = node->xmlChildrenNode; node != NULL; node = node->next) {
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn if (xmlStrcmp(node->name, mount_type) != 0)
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn continue;
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn special = xmlGetProp(node, DTD_ATTR_SPECIAL);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn dir = xmlGetProp(node, DTD_ATTR_DIRECTORY);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn type = xmlGetProp(node, DTD_ATTR_TYPE);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn opt = xmlGetProp(node, DTD_ATTR_OPT);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn if ((special == NULL) || (dir == NULL) || (type == NULL) ||
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn (opt == NULL)) {
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn ret = -1;
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn goto next;
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn }
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn /* Substitute token values as needed. */
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn if ((ret = i_substitute_tokens((char *)special,
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn special_exp, sizeof (special_exp),
c6596baec58ade84b0609c78e64fc3f89447c7d1Patrick Mooney zonename, zonepath, NULL, NULL)) != 0)
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn goto next;
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn /* opt might not be defined */
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn if (strlen((const char *)opt) == 0) {
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn xmlFree(opt);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn opt = NULL;
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn } else {
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn if ((ret = i_substitute_tokens((char *)opt,
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn opt_exp, sizeof (opt_exp),
c6596baec58ade84b0609c78e64fc3f89447c7d1Patrick Mooney zonename, zonepath, NULL, NULL)) != 0)
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn goto next;
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn }
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn ret = func(data, (char *)special_exp, (char *)dir,
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn (char *)type, ((opt != NULL) ? opt_exp : NULL));
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnnnext:
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn if (special != NULL)
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn xmlFree(special);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn if (dir != NULL)
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn xmlFree(dir);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn if (type != NULL)
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn xmlFree(type);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn if (opt != NULL)
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn xmlFree(opt);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn if (ret != 0)
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn return (-1);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn }
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn return (0);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn}
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn/*
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn * Iterate over global platform filesystems
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn *
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn * Walks the platform, searching for <global_mount> elements, calling the
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn * specified callback for each. Returns 0 on success, or -1 on failure.
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn *
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn * Perform the following substitutions as necessary:
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn *
ff17c8bf86c3e567734be83f90267edee20f580fgjelinek * %R Zonepath of zone
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn */
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnnint
c6596baec58ade84b0609c78e64fc3f89447c7d1Patrick Mooneybrand_platform_iter_gmounts(brand_handle_t bh, const char *zonename,
c6596baec58ade84b0609c78e64fc3f89447c7d1Patrick Mooney const char *zonepath, int (*func)(void *, const char *, const char *,
c6596baec58ade84b0609c78e64fc3f89447c7d1Patrick Mooney const char *, const char *), void *data)
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn{
123807fb8274cf8e22f09732e34303ba6baf55a5edp struct brand_handle *bhp = (struct brand_handle *)bh;
c6596baec58ade84b0609c78e64fc3f89447c7d1Patrick Mooney return (i_brand_platform_iter_mounts(bhp, zonename, zonepath, func,
c6596baec58ade84b0609c78e64fc3f89447c7d1Patrick Mooney data, DTD_ELEM_GLOBAL_MOUNT));
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn}
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn/*
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn * Iterate over non-global zone platform filesystems
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn *
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn * Walks the platform, searching for <mount> elements, calling the
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn * specified callback for each. Returns 0 on success, or -1 on failure.
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn */
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnnint
123807fb8274cf8e22f09732e34303ba6baf55a5edpbrand_platform_iter_mounts(brand_handle_t bh, int (*func)(void *,
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn const char *, const char *, const char *, const char *), void *data)
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn{
123807fb8274cf8e22f09732e34303ba6baf55a5edp struct brand_handle *bhp = (struct brand_handle *)bh;
c6596baec58ade84b0609c78e64fc3f89447c7d1Patrick Mooney return (i_brand_platform_iter_mounts(bhp, NULL, NULL, func, data,
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn DTD_ELEM_MOUNT));
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn}
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn/*
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn * Iterate over platform symlinks
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn *
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn * Walks the platform, searching for <symlink> elements, calling the
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn * specified callback for each. Returns 0 on success, or -1 on failure.
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn */
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnnint
123807fb8274cf8e22f09732e34303ba6baf55a5edpbrand_platform_iter_link(brand_handle_t bh,
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn int (*func)(void *, const char *, const char *), void *data)
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn{
123807fb8274cf8e22f09732e34303ba6baf55a5edp struct brand_handle *bhp = (struct brand_handle *)bh;
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn xmlNodePtr node;
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn xmlChar *source, *target;
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn int ret;
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn if ((node = xmlDocGetRootElement(bhp->bh_platform)) == NULL)
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn return (-1);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn for (node = node->xmlChildrenNode; node != NULL; node = node->next) {
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn if (xmlStrcmp(node->name, DTD_ELEM_SYMLINK) != 0)
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn continue;
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn source = xmlGetProp(node, DTD_ATTR_SOURCE);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn target = xmlGetProp(node, DTD_ATTR_TARGET);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn if (source == NULL || target == NULL) {
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn if (source != NULL)
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn xmlFree(source);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn if (target != NULL)
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn xmlFree(target);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn return (-1);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn }
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn ret = func(data, (char *)source, (char *)target);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn xmlFree(source);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn xmlFree(target);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn if (ret != 0)
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn return (-1);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn }
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn return (0);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn}
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn/*
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn * Iterate over platform devices
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn *
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn * Walks the platform, searching for <device> elements, calling the
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn * specified callback for each. Returns 0 on success, or -1 on failure.
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn */
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnnint
123807fb8274cf8e22f09732e34303ba6baf55a5edpbrand_platform_iter_devices(brand_handle_t bh, const char *zonename,
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh int (*func)(void *, const char *, const char *), void *data,
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh const char *curr_iptype)
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn{
123807fb8274cf8e22f09732e34303ba6baf55a5edp struct brand_handle *bhp = (struct brand_handle *)bh;
123807fb8274cf8e22f09732e34303ba6baf55a5edp const char *curr_arch = get_curr_arch();
123807fb8274cf8e22f09732e34303ba6baf55a5edp xmlNodePtr node;
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh xmlChar *match, *name, *arch, *iptype;
123807fb8274cf8e22f09732e34303ba6baf55a5edp char match_exp[MAXPATHLEN];
123807fb8274cf8e22f09732e34303ba6baf55a5edp boolean_t err = B_FALSE;
123807fb8274cf8e22f09732e34303ba6baf55a5edp int ret = 0;
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn assert(bhp != NULL);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn assert(zonename != NULL);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn assert(func != NULL);
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh assert(curr_iptype != NULL);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn if ((node = xmlDocGetRootElement(bhp->bh_platform)) == NULL)
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn return (-1);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn for (node = node->xmlChildrenNode; node != NULL; node = node->next) {
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn if (xmlStrcmp(node->name, DTD_ELEM_DEVICE) != 0)
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn continue;
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn match = xmlGetProp(node, DTD_ATTR_MATCH);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn name = xmlGetProp(node, DTD_ATTR_NAME);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn arch = xmlGetProp(node, DTD_ATTR_ARCH);
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh iptype = xmlGetProp(node, DTD_ATTR_IPTYPE);
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh if ((match == NULL) || (name == NULL) || (arch == NULL) ||
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh (iptype == NULL)) {
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn err = B_TRUE;
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn goto next;
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn }
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn /* check if the arch matches */
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn if ((strcmp((char *)arch, "all") != 0) &&
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn (strcmp((char *)arch, curr_arch) != 0))
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn goto next;
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh /* check if the iptype matches */
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh if ((strcmp((char *)iptype, "all") != 0) &&
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh (strcmp((char *)iptype, curr_iptype) != 0))
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh goto next;
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn /* Substitute token values as needed. */
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn if ((ret = i_substitute_tokens((char *)match,
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn match_exp, sizeof (match_exp),
ff17c8bf86c3e567734be83f90267edee20f580fgjelinek zonename, NULL, NULL, NULL)) != 0) {
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn err = B_TRUE;
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn goto next;
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn }
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn /* name might not be defined */
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn if (strlen((const char *)name) == 0) {
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn xmlFree(name);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn name = NULL;
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn }
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn /* invoke the callback */
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn ret = func(data, (const char *)match_exp, (const char *)name);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnnnext:
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn if (match != NULL)
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn xmlFree(match);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn if (name != NULL)
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn xmlFree(name);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn if (arch != NULL)
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn xmlFree(arch);
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh if (iptype != NULL)
f4b3ec61df05330d25f55a36b975b4d7519fdeb1dh xmlFree(iptype);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn if (err)
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn return (-1);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn if (ret != 0)
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn return (-1);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn }
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn return (0);
9acbbeaf2a1ffe5c14b244867d427714fab43c5cnn}