fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro * CDDL HEADER START
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro * The contents of this file are subject to the terms of the
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro * Common Development and Distribution License (the "License").
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro * You may not use this file except in compliance with the License.
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro * See the License for the specific language governing permissions
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro * and limitations under the License.
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro * When distributing Covered Code, include this CDDL HEADER in each
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro * If applicable, add the following below this CDDL HEADER, with the
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro * fields enclosed by brackets "[]" replaced with your own identifying
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro * information: Portions Copyright [yyyy] [name of copyright owner]
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro * CDDL HEADER END
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro * Use is subject to license terms.
fc256490629fe68815f7e0f23cf9b3545720cfacJason Belorostatic void md_free_prop(mmd_t *mdp, md_prop_t *propp);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Belorostatic void md_free_string(mmd_t *mdp, md_string_t *msp);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Belorostatic void md_free_data_block(mmd_t *mdp, md_data_block_t *mdbp);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro for (i = 0; i < len; i++) {
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro /* 5 bit rotation */
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloromd_find_string(mmd_t *mdp, char *strp, uint32_t *hashp)
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro hash = md_byte_hash((uint8_t *)strp, strlen(strp));
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro if (msp->hash == hash && strcmp(msp->strp, strp) == 0)
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloromd_find_data_block(mmd_t *mdp, uint8_t *datap, int len, uint32_t *hashp)
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro dbp->hash == hash && bcmp(dbp->datap, datap, len) == 0)
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloromd_new_data_block(mmd_t *mdp, uint8_t *bufp, int len)
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro dbp = md_find_data_block(mdp, bufp, len, &hash);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloromd_new_property(mmd_t *mdp, md_node_t *nodep, uint8_t type, char *sp)
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloromd_add_value_property(mmd_t *mdp, md_node_t *nodep, char *sp, uint64_t value)
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro propp = md_new_property(mdp, nodep, MDET_PROP_VAL, sp);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloromd_add_string_property(mmd_t *mdp, md_node_t *nodep, char *sp, char *bufp)
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro dbp = md_new_data_block(mdp, (uint8_t *)bufp, strlen(bufp) + 1);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro propp = md_new_property(mdp, nodep, MDET_PROP_STR, sp);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloromd_add_data_property(mmd_t *mdp, md_node_t *nodep, char *sp, int len,
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro propp = md_new_property(mdp, nodep, MDET_PROP_DAT, sp);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloromd_add_arc_property(mmd_t *mdp, md_node_t *nodep, char *arcnamep,
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro propp = md_new_property(mdp, nodep, MDET_PROP_ARC, arcnamep);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloromd_link_new_node(mmd_t *mdp, char *nodenamep, md_node_t *parentnodep,
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro ASSERT(parentnodep != NULL && !parentnodep->deleted);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro if (md_add_arc_property(mdp, parentnodep, linktonewp, nodep) != 0) {
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro for (nodep = CHAIN_START(mdp->node_list); nodep != NULL; ) {
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro /* should have deleted all the string refs by here */
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro for (propp = CHAIN_START(nodep->prop_list); propp != NULL; ) {
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloromd_free_data_block(mmd_t *mdp, md_data_block_t *mdbp)
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloromd_fix_name(md_element_t *mdep, md_prop_t *propp)
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro mdep->name_offset = htomd32(propp->sp->build_offset);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Belorocreate_mde(md_element_t *mdep, int type, md_node_t *nodep, md_prop_t *propp)
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro mdep->name_len = htomd8(nodep->typep->size - 1);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro mdep->name_offset = htomd32(nodep->typep->build_offset);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro mdep->d.prop_idx = htomd64(propp->d.arc.val.nodep->build_index);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro mdep->d.prop_data.offset = htomd32(propp->d.dbp->build_offset);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro mdep->d.prop_data.len = htomd32(propp->d.dbp->size);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro * Skip through strings to compute offsets.
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro for (msp = CHAIN_START(mdp->string_list); msp != NULL;
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro strings_size = P2ROUNDUP(offset, MD_ALIGNMENT_SIZE);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro * Skip through data blocks to compute offsets.
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro for (mdbp = CHAIN_START(mdp->data_block_list); mdbp != NULL;
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro data_block_size = P2ROUNDUP(offset, MD_ALIGNMENT_SIZE);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro * Compute the MD elements required to build the element list.
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro * For each node there is a node start and end, and one
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro * element for each property.
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro for (nodep = CHAIN_START(mdp->node_list); nodep != NULL;
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro total_size = MD_HEADER_SIZE + offset * MD_ELEMENT_SIZE +
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro * Allocate output buffer.
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro bufferp = calloc(total_size, sizeof (uint8_t));
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro /* LINTED */
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro string_bufferp = bufferp + MD_HEADER_SIZE + offset * MD_ELEMENT_SIZE;
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro data_block_bufferp = string_bufferp + strings_size;
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro mdhp->transport_version = htomd32(MD_TRANSPORT_VERSION);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro mdhp->node_blk_sz = htomd32(offset * MD_ELEMENT_SIZE);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro * Build the element list.
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro * For each node there is a node start and end, and one
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro * element for each property.
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro /* LINTED */
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro mdep = (md_element_t *)(bufferp + MD_HEADER_SIZE);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro for (nodep = CHAIN_START(mdp->node_list); nodep != NULL;
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro for (propp = CHAIN_START(nodep->prop_list); propp != NULL;
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro * Quick sanity check.
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro ASSERT(((uint8_t *)mdep) == ((uint8_t *)string_bufferp));
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro * Skip through strings and stash them..
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro for (msp = CHAIN_START(mdp->string_list); msp != NULL;
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro (void) memcpy(string_bufferp + msp->build_offset, msp->strp,
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro * Skip through data blocks and stash them.
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro for (mdbp = CHAIN_START(mdp->data_block_list); mdbp != NULL;