mdesc_mutable.h revision fc256490629fe68815f7e0f23cf9b3545720cfac
/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License (the "License").
* You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
* Copyright 2010 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
#ifndef _MDESC_MUTABLE_H_
#define _MDESC_MUTABLE_H_
#ifdef DEBUG
#include <assert.h>
#endif
#ifdef __cplusplus
extern "C" {
#endif
#ifdef DEBUG
#define ASSERT(_s) assert(_s)
#else /* DEBUG */
#define ASSERT(_s)
#endif /* DEBUG */
#define MD_ALIGNMENT_SIZE 0x10
#define MD_OFFSET_UNDEF (uint32_t)-1
/*
* List management macros for mutable MD structure
*/
#define CHAIN(_type, _chain) \
struct { \
_type *startp; \
_type *endp; \
int count; \
} _chain
#define CHAIN_ITER(_chain, _itv) \
for ((_itv) = CHAIN_START(_chain); (_itv) != NULL; \
(_itv) = (_itv)->nextp)
#define CHAIN_START(_name) ((_name).startp)
#define CHAIN_LENGTH(_name) ((_name).count)
/*
* Add node _nodep to the end of _chain via the required 'nextp' element.
*/
#define CHAIN_ADD(_chain, _nodep) \
do { \
if ((_chain).startp == NULL) { \
(_chain).startp = (_nodep); \
} else { \
(_chain).endp->nextp = (_nodep); \
} \
(_chain).endp = (_nodep); \
(_nodep)->nextp = NULL; \
(_chain).count++; \
NOTE(CONSTCOND) } while (0)
/*
* Internal definitions.
*/
typedef struct md_string md_string_t;
typedef struct md_data_block md_data_block_t;
typedef struct md_prop md_prop_t;
typedef struct md_node md_node_t;
typedef struct mmd mmd_t;
struct md_string {
md_string_t *nextp;
char *strp;
int size; /* strlen()+1 */
uint32_t hash;
int ref_cnt;
uint32_t build_offset;
};
struct md_data_block {
md_data_block_t *nextp;
uint8_t *datap;
uint32_t size;
uint32_t hash;
int ref_cnt;
uint32_t build_offset;
};
struct md_prop {
uint8_t type;
md_string_t *sp;
union {
uint64_t value;
struct {
boolean_t is_ptr;
union {
uint64_t index;
md_node_t *nodep;
} val;
} arc;
md_data_block_t *dbp;
} d;
md_prop_t *nextp;
};
struct md_node {
md_string_t *typep;
CHAIN(md_prop_t, prop_list);
md_node_t *nextp;
int build_index; /* for building a binary md & cloning */
int next_index; /* for building a binary md */
char seen; /* seen flag (md_scan_dag/md_scour) */
char deleted; /* pending deletion flag */
};
struct mmd {
CHAIN(md_node_t, node_list);
CHAIN(md_string_t, string_list);
CHAIN(md_data_block_t, data_block_list);
};
md_node_t *md_new_node(mmd_t *mdp, char *sp);
int md_add_value_property(mmd_t *mdp,
md_node_t *nodep, char *sp, uint64_t value);
int md_add_string_property(mmd_t *mdp, md_node_t *nodep, char *sp, char *bufp);
int md_add_data_property(mmd_t *mdp, md_node_t *nodep, char *sp, int len,
uint8_t *bufp);
int md_gen_bin(mmd_t *mdp, uint8_t **bufpp);
md_node_t *md_link_new_node(mmd_t *mdp, char *nodenamep, md_node_t *parentnodep,
char *linktonewp, char *linkbackp);
mmd_t *md_new_md(void);
void md_free_node(mmd_t *mdp, md_node_t *nodep);
void md_destroy(mmd_t *);
#ifdef __cplusplus
}
#endif
#endif /* _MDESC_MUTABLE_H_ */