fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro/*
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro * CDDL HEADER START
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro *
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 *
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro * or http://www.opensolaris.org/os/licensing.
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro * See the License for the specific language governing permissions
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro * and limitations under the License.
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro *
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 *
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro * CDDL HEADER END
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro */
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro/*
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro * Use is subject to license terms.
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro */
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro#include <strings.h>
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro#include <stdio.h>
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro#include <unistd.h>
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro#include <stdlib.h>
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro#include <strings.h>
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro#include <note.h>
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro#include <errno.h>
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro#include <sys/mdesc.h>
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro#include <sys/mdesc_impl.h>
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro#include <sys/sysmacros.h>
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro#include "mdesc_mutable.h"
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro
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
fc256490629fe68815f7e0f23cf9b3545720cfacJason Belorostatic uint32_t
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloromd_byte_hash(uint8_t *bp, int len)
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro{
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro uint32_t hash = 0;
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro int i;
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro for (i = 0; i < len; i++) {
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro /* 5 bit rotation */
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro hash = (hash >> 27) | (hash << 5) | bp[i];
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro }
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro return (hash);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro}
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro
fc256490629fe68815f7e0f23cf9b3545720cfacJason Belorostatic md_string_t *
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloromd_find_string(mmd_t *mdp, char *strp, uint32_t *hashp)
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro{
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro md_string_t *msp;
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro uint32_t hash;
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro hash = md_byte_hash((uint8_t *)strp, strlen(strp));
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro if (hashp != NULL)
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro *hashp = hash;
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro CHAIN_ITER(mdp->string_list, msp) {
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro if (msp->hash == hash && strcmp(msp->strp, strp) == 0)
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro return (msp);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro }
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro return (NULL);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro}
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro
fc256490629fe68815f7e0f23cf9b3545720cfacJason Belorostatic md_string_t *
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloromd_new_string(mmd_t *mdp, char *strp)
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro{
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro md_string_t *msp;
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro uint32_t hash;
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro msp = md_find_string(mdp, strp, &hash);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro if (msp == NULL) {
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro msp = calloc(1, sizeof (md_string_t));
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro if (msp == NULL)
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro return (NULL);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro msp->strp = strdup(strp);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro if (msp->strp == NULL) {
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro free(msp);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro return (NULL);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro }
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro msp->size = strlen(strp) + 1;
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro msp->hash = hash;
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro msp->ref_cnt = 0;
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro msp->build_offset = MD_OFFSET_UNDEF;
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro CHAIN_ADD(mdp->string_list, msp);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro }
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro msp->ref_cnt++;
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro return (msp);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro}
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro
fc256490629fe68815f7e0f23cf9b3545720cfacJason Belorostatic md_data_block_t *
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloromd_find_data_block(mmd_t *mdp, uint8_t *datap, int len, uint32_t *hashp)
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro{
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro md_data_block_t *dbp;
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro uint32_t hash;
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro hash = md_byte_hash(datap, len);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro if (hashp != NULL)
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro *hashp = hash;
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro CHAIN_ITER(mdp->data_block_list, dbp) {
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro if (dbp->size == len &&
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro dbp->hash == hash && bcmp(dbp->datap, datap, len) == 0)
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro return (dbp);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro }
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro return (NULL);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro}
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro
fc256490629fe68815f7e0f23cf9b3545720cfacJason Belorostatic md_data_block_t *
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloromd_new_data_block(mmd_t *mdp, uint8_t *bufp, int len)
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro{
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro md_data_block_t *dbp;
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro uint32_t hash;
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro dbp = md_find_data_block(mdp, bufp, len, &hash);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro if (dbp == NULL) {
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro dbp = calloc(1, sizeof (md_data_block_t));
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro if (dbp == NULL)
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro return (NULL);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro dbp->datap = malloc(len);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro if (dbp->datap == NULL) {
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro free(dbp);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro return (NULL);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro }
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro (void) memcpy(dbp->datap, bufp, len);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro dbp->size = len;
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro dbp->hash = hash;
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro dbp->ref_cnt = 0;
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro dbp->build_offset = MD_OFFSET_UNDEF;
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro CHAIN_ADD(mdp->data_block_list, dbp);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro }
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro dbp->ref_cnt++;
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro return (dbp);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro}
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloromd_node_t *
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloromd_new_node(mmd_t *mdp, char *sp)
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro{
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro md_node_t *nodep;
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro nodep = calloc(1, sizeof (md_node_t));
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro if (nodep == NULL)
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro return (NULL);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro nodep->typep = md_new_string(mdp, sp);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro if (nodep->typep == NULL) {
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro free(nodep);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro return (NULL);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro }
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro CHAIN_ADD(mdp->node_list, nodep);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro return (nodep);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro}
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro
fc256490629fe68815f7e0f23cf9b3545720cfacJason Belorostatic md_prop_t *
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloromd_new_property(mmd_t *mdp, md_node_t *nodep, uint8_t type, char *sp)
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro{
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro md_prop_t *propp;
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro propp = calloc(1, sizeof (md_prop_t));
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro if (propp == NULL)
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro return (NULL);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro propp->type = type;
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro propp->sp = md_new_string(mdp, sp);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro if (propp->sp == NULL) {
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro free(propp);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro return (NULL);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro }
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro CHAIN_ADD(nodep->prop_list, propp);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro return (propp);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro}
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloroint
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloromd_add_value_property(mmd_t *mdp, md_node_t *nodep, char *sp, uint64_t value)
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro{
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro md_prop_t *propp;
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro propp = md_new_property(mdp, nodep, MDET_PROP_VAL, sp);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro if (propp == NULL)
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro return (ENOMEM);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro propp->d.value = value;
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro return (0);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro}
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloroint
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloromd_add_string_property(mmd_t *mdp, md_node_t *nodep, char *sp, char *bufp)
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro{
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro md_prop_t *propp;
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro md_data_block_t *dbp;
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro dbp = md_new_data_block(mdp, (uint8_t *)bufp, strlen(bufp) + 1);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro if (dbp == NULL)
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro return (ENOMEM);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro propp = md_new_property(mdp, nodep, MDET_PROP_STR, sp);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro if (propp == NULL) {
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro md_free_data_block(mdp, dbp);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro return (NULL);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro }
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro propp->d.dbp = dbp;
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro return (0);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro}
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloroint
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloromd_add_data_property(mmd_t *mdp, md_node_t *nodep, char *sp, int len,
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro uint8_t *bufp)
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro{
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro md_prop_t *propp;
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro md_data_block_t *dbp;
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro dbp = md_new_data_block(mdp, bufp, len);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro if (dbp == NULL)
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro return (ENOMEM);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro propp = md_new_property(mdp, nodep, MDET_PROP_DAT, sp);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro if (propp == NULL) {
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro md_free_data_block(mdp, dbp);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro return (ENOMEM);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro }
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro propp->d.dbp = dbp;
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro return (0);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro}
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro
fc256490629fe68815f7e0f23cf9b3545720cfacJason Belorostatic int
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloromd_add_arc_property(mmd_t *mdp, md_node_t *nodep, char *arcnamep,
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro md_node_t *tgtnodep)
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro{
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro md_prop_t *propp;
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro propp = md_new_property(mdp, nodep, MDET_PROP_ARC, arcnamep);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro if (propp == NULL)
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro return (ENOMEM);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro propp->d.arc.is_ptr = B_TRUE;
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro propp->d.arc.val.nodep = tgtnodep;
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro return (0);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro}
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloromd_node_t *
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloromd_link_new_node(mmd_t *mdp, char *nodenamep, md_node_t *parentnodep,
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro char *linktonewp, char *linkbackp)
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro{
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro md_node_t *nodep;
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro nodep = md_new_node(mdp, nodenamep);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro if (nodep == NULL)
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro return (NULL);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro ASSERT(linktonewp != NULL);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro ASSERT(parentnodep != NULL && !parentnodep->deleted);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro if (md_add_arc_property(mdp, parentnodep, linktonewp, nodep) != 0) {
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro return (NULL);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro }
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro if (linkbackp != NULL) {
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro if (md_add_arc_property(mdp,
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro nodep, linkbackp, parentnodep) != 0) {
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro return (NULL);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro }
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro }
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro return (nodep);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro}
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro
fc256490629fe68815f7e0f23cf9b3545720cfacJason Belorovoid
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloromd_destroy(mmd_t *mdp)
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro{
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro md_node_t *nodep;
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro for (nodep = CHAIN_START(mdp->node_list); nodep != NULL; ) {
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro md_node_t *tmp_nodep;
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro tmp_nodep = nodep->nextp;
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro md_free_node(mdp, nodep);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro nodep = tmp_nodep;
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro }
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro /* should have deleted all the string refs by here */
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro ASSERT(CHAIN_LENGTH(mdp->string_list) == 0);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro free(mdp);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro}
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro
fc256490629fe68815f7e0f23cf9b3545720cfacJason Belorovoid
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloromd_free_node(mmd_t *mdp, md_node_t *nodep)
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro{
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro md_prop_t *propp;
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro if (nodep->typep != NULL)
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro md_free_string(mdp, nodep->typep);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro for (propp = CHAIN_START(nodep->prop_list); propp != NULL; ) {
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro md_prop_t *tmp_propp;
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro tmp_propp = propp->nextp;
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro md_free_prop(mdp, propp);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro propp = tmp_propp;
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro }
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro free(nodep);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro}
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro
fc256490629fe68815f7e0f23cf9b3545720cfacJason Belorostatic void
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloromd_free_prop(mmd_t *mdp, md_prop_t *propp)
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro{
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro if (propp->sp != NULL)
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro md_free_string(mdp, propp->sp);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro switch (propp->type) {
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro case MDET_PROP_VAL:
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro break;
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro case MDET_PROP_ARC:
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro break;
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro case MDET_PROP_STR:
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro case MDET_PROP_DAT:
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro md_free_data_block(mdp, propp->d.dbp);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro break;
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro default:
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro ASSERT(B_FALSE);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro }
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro free(propp);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro}
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro
fc256490629fe68815f7e0f23cf9b3545720cfacJason Belorostatic void
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloromd_free_string(mmd_t *mdp, md_string_t *msp)
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro{
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro ASSERT(msp->ref_cnt > 0);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro msp->ref_cnt--;
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro if (msp->ref_cnt == 0) {
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro free(msp->strp);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro mdp->string_list.startp = msp->nextp;
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro free(msp);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro }
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro}
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro
fc256490629fe68815f7e0f23cf9b3545720cfacJason Belorostatic void
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloromd_free_data_block(mmd_t *mdp, md_data_block_t *mdbp)
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro{
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro ASSERT(mdbp->ref_cnt > 0);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro mdbp->ref_cnt--;
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro if (mdbp->ref_cnt == 0) {
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro free(mdbp->datap);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro mdp->data_block_list.startp = mdbp->nextp;
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro free(mdbp);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro }
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro}
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro
fc256490629fe68815f7e0f23cf9b3545720cfacJason Belorommd_t *
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloromd_new_md(void)
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro{
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro return ((mmd_t *)calloc(1, sizeof (mmd_t)));
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro}
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro
fc256490629fe68815f7e0f23cf9b3545720cfacJason Belorostatic void
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloromd_fix_name(md_element_t *mdep, md_prop_t *propp)
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro{
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro mdep->name_len = htomd8(propp->sp->size - 1);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro mdep->name_offset = htomd32(propp->sp->build_offset);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro}
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro
fc256490629fe68815f7e0f23cf9b3545720cfacJason Belorovoid
fc256490629fe68815f7e0f23cf9b3545720cfacJason Belorocreate_mde(md_element_t *mdep, int type, md_node_t *nodep, md_prop_t *propp)
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro{
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro (void) memset(mdep, 0, MD_ELEMENT_SIZE);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro mdep->tag = htomd8(type);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro switch (type) {
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro case MDET_NODE:
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro mdep->d.prop_idx = htomd32(nodep->next_index);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro mdep->name_len = htomd8(nodep->typep->size - 1);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro mdep->name_offset = htomd32(nodep->typep->build_offset);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro break;
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro case MDET_PROP_ARC:
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro ASSERT(propp->d.arc.is_ptr);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro mdep->d.prop_idx = htomd64(propp->d.arc.val.nodep->build_index);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro md_fix_name(mdep, propp);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro break;
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro case MDET_PROP_VAL:
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro mdep->d.prop_val = htomd64(propp->d.value);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro md_fix_name(mdep, propp);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro break;
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro case MDET_PROP_STR:
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro case MDET_PROP_DAT:
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 md_fix_name(mdep, propp);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro break;
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro case MDET_NULL:
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro case MDET_NODE_END:
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro case MDET_LIST_END:
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro break;
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro default:
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro ASSERT(B_FALSE);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro }
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro}
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloroint
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloromd_gen_bin(mmd_t *mdp, uint8_t **bufvalp)
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro{
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro uint32_t offset;
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro md_node_t *nodep;
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro md_data_block_t *mdbp;
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro md_string_t *msp;
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro md_header_t *mdhp;
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro md_element_t *mdep;
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro uint32_t strings_size;
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro uint32_t data_block_size;
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro int total_size;
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro uint8_t *bufferp;
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro uint8_t *string_bufferp;
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro uint8_t *data_block_bufferp;
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro /*
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro * Skip through strings to compute offsets.
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro */
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro offset = 0;
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro for (msp = CHAIN_START(mdp->string_list); msp != NULL;
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro msp = msp->nextp) {
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro msp->build_offset = offset;
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro offset += msp->size;
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro }
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro strings_size = P2ROUNDUP(offset, MD_ALIGNMENT_SIZE);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro /*
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro * Skip through data blocks to compute offsets.
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro */
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro offset = 0;
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro for (mdbp = CHAIN_START(mdp->data_block_list); mdbp != NULL;
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro mdbp = mdbp->nextp) {
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro mdbp->build_offset = offset;
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro offset += mdbp->size;
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro offset = P2ROUNDUP(offset, MD_ALIGNMENT_SIZE);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro }
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro data_block_size = P2ROUNDUP(offset, MD_ALIGNMENT_SIZE);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro /*
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 */
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro offset = 0;
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro for (nodep = CHAIN_START(mdp->node_list); nodep != NULL;
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro nodep = nodep->nextp) {
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro nodep->build_index = offset;
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro offset += 2 + CHAIN_LENGTH(nodep->prop_list);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro nodep->next_index = offset;
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro }
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro offset += 1; /* add the LIST_END element */
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro total_size = MD_HEADER_SIZE + offset * MD_ELEMENT_SIZE +
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro strings_size + data_block_size;
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro /*
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro * Allocate output buffer.
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro */
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro bufferp = calloc(total_size, sizeof (uint8_t));
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro if (bufferp == NULL)
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro return (0);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro /* LINTED */
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro mdhp = (md_header_t *)bufferp;
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro string_bufferp = bufferp + MD_HEADER_SIZE + offset * MD_ELEMENT_SIZE;
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro data_block_bufferp = string_bufferp + strings_size;
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro mdhp->transport_version = htomd32(MD_TRANSPORT_VERSION);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro mdhp->node_blk_sz = htomd32(offset * MD_ELEMENT_SIZE);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro mdhp->name_blk_sz = htomd32(strings_size);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro mdhp->data_blk_sz = htomd32(data_block_size);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro /*
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 */
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro offset = 0;
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 nodep = nodep->nextp) {
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro md_prop_t *propp;
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro create_mde(mdep, MDET_NODE, nodep, NULL);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro mdep++;
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro for (propp = CHAIN_START(nodep->prop_list); propp != NULL;
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro propp = propp->nextp) {
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro create_mde(mdep, propp->type, nodep, propp);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro mdep++;
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro }
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro create_mde(mdep, MDET_NODE_END, NULL, NULL);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro mdep++;
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro }
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro create_mde(mdep, MDET_LIST_END, NULL, NULL);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro mdep++;
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro /*
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro * Quick sanity check.
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro */
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro ASSERT(((uint8_t *)mdep) == ((uint8_t *)string_bufferp));
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro /*
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro * Skip through strings and stash them..
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro */
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro offset = 0;
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro for (msp = CHAIN_START(mdp->string_list); msp != NULL;
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro msp = msp->nextp) {
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro (void) memcpy(string_bufferp + msp->build_offset, msp->strp,
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro msp->size);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro }
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro /*
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro * Skip through data blocks and stash them.
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro */
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro offset = 0;
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro for (mdbp = CHAIN_START(mdp->data_block_list); mdbp != NULL;
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro mdbp = mdbp->nextp) {
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro (void) memcpy(data_block_bufferp + mdbp->build_offset,
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro mdbp->datap, mdbp->size);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro }
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro *bufvalp = bufferp;
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro return (total_size);
fc256490629fe68815f7e0f23cf9b3545720cfacJason Beloro}