1*11596SJason.Beloro@Sun.COM /* 2*11596SJason.Beloro@Sun.COM * CDDL HEADER START 3*11596SJason.Beloro@Sun.COM * 4*11596SJason.Beloro@Sun.COM * The contents of this file are subject to the terms of the 5*11596SJason.Beloro@Sun.COM * Common Development and Distribution License (the "License"). 6*11596SJason.Beloro@Sun.COM * You may not use this file except in compliance with the License. 7*11596SJason.Beloro@Sun.COM * 8*11596SJason.Beloro@Sun.COM * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9*11596SJason.Beloro@Sun.COM * or http://www.opensolaris.org/os/licensing. 10*11596SJason.Beloro@Sun.COM * See the License for the specific language governing permissions 11*11596SJason.Beloro@Sun.COM * and limitations under the License. 12*11596SJason.Beloro@Sun.COM * 13*11596SJason.Beloro@Sun.COM * When distributing Covered Code, include this CDDL HEADER in each 14*11596SJason.Beloro@Sun.COM * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15*11596SJason.Beloro@Sun.COM * If applicable, add the following below this CDDL HEADER, with the 16*11596SJason.Beloro@Sun.COM * fields enclosed by brackets "[]" replaced with your own identifying 17*11596SJason.Beloro@Sun.COM * information: Portions Copyright [yyyy] [name of copyright owner] 18*11596SJason.Beloro@Sun.COM * 19*11596SJason.Beloro@Sun.COM * CDDL HEADER END 20*11596SJason.Beloro@Sun.COM */ 21*11596SJason.Beloro@Sun.COM 22*11596SJason.Beloro@Sun.COM /* 23*11596SJason.Beloro@Sun.COM * Copyright 2010 Sun Microsystems, Inc. All rights reserved. 24*11596SJason.Beloro@Sun.COM * Use is subject to license terms. 25*11596SJason.Beloro@Sun.COM */ 26*11596SJason.Beloro@Sun.COM 27*11596SJason.Beloro@Sun.COM #ifndef _MDESC_MUTABLE_H_ 28*11596SJason.Beloro@Sun.COM #define _MDESC_MUTABLE_H_ 29*11596SJason.Beloro@Sun.COM 30*11596SJason.Beloro@Sun.COM #ifdef DEBUG 31*11596SJason.Beloro@Sun.COM #include <assert.h> 32*11596SJason.Beloro@Sun.COM #endif 33*11596SJason.Beloro@Sun.COM 34*11596SJason.Beloro@Sun.COM #ifdef __cplusplus 35*11596SJason.Beloro@Sun.COM extern "C" { 36*11596SJason.Beloro@Sun.COM #endif 37*11596SJason.Beloro@Sun.COM 38*11596SJason.Beloro@Sun.COM #ifdef DEBUG 39*11596SJason.Beloro@Sun.COM 40*11596SJason.Beloro@Sun.COM #define ASSERT(_s) assert(_s) 41*11596SJason.Beloro@Sun.COM 42*11596SJason.Beloro@Sun.COM #else /* DEBUG */ 43*11596SJason.Beloro@Sun.COM 44*11596SJason.Beloro@Sun.COM #define ASSERT(_s) 45*11596SJason.Beloro@Sun.COM 46*11596SJason.Beloro@Sun.COM #endif /* DEBUG */ 47*11596SJason.Beloro@Sun.COM 48*11596SJason.Beloro@Sun.COM #define MD_ALIGNMENT_SIZE 0x10 49*11596SJason.Beloro@Sun.COM #define MD_OFFSET_UNDEF (uint32_t)-1 50*11596SJason.Beloro@Sun.COM /* 51*11596SJason.Beloro@Sun.COM * List management macros for mutable MD structure 52*11596SJason.Beloro@Sun.COM */ 53*11596SJason.Beloro@Sun.COM #define CHAIN(_type, _chain) \ 54*11596SJason.Beloro@Sun.COM struct { \ 55*11596SJason.Beloro@Sun.COM _type *startp; \ 56*11596SJason.Beloro@Sun.COM _type *endp; \ 57*11596SJason.Beloro@Sun.COM int count; \ 58*11596SJason.Beloro@Sun.COM } _chain 59*11596SJason.Beloro@Sun.COM 60*11596SJason.Beloro@Sun.COM #define CHAIN_ITER(_chain, _itv) \ 61*11596SJason.Beloro@Sun.COM for ((_itv) = CHAIN_START(_chain); (_itv) != NULL; \ 62*11596SJason.Beloro@Sun.COM (_itv) = (_itv)->nextp) 63*11596SJason.Beloro@Sun.COM 64*11596SJason.Beloro@Sun.COM #define CHAIN_START(_name) ((_name).startp) 65*11596SJason.Beloro@Sun.COM #define CHAIN_LENGTH(_name) ((_name).count) 66*11596SJason.Beloro@Sun.COM 67*11596SJason.Beloro@Sun.COM /* 68*11596SJason.Beloro@Sun.COM * Add node _nodep to the end of _chain via the required 'nextp' element. 69*11596SJason.Beloro@Sun.COM */ 70*11596SJason.Beloro@Sun.COM #define CHAIN_ADD(_chain, _nodep) \ 71*11596SJason.Beloro@Sun.COM do { \ 72*11596SJason.Beloro@Sun.COM if ((_chain).startp == NULL) { \ 73*11596SJason.Beloro@Sun.COM (_chain).startp = (_nodep); \ 74*11596SJason.Beloro@Sun.COM } else { \ 75*11596SJason.Beloro@Sun.COM (_chain).endp->nextp = (_nodep); \ 76*11596SJason.Beloro@Sun.COM } \ 77*11596SJason.Beloro@Sun.COM (_chain).endp = (_nodep); \ 78*11596SJason.Beloro@Sun.COM (_nodep)->nextp = NULL; \ 79*11596SJason.Beloro@Sun.COM (_chain).count++; \ 80*11596SJason.Beloro@Sun.COM NOTE(CONSTCOND) } while (0) 81*11596SJason.Beloro@Sun.COM 82*11596SJason.Beloro@Sun.COM /* 83*11596SJason.Beloro@Sun.COM * Internal definitions. 84*11596SJason.Beloro@Sun.COM */ 85*11596SJason.Beloro@Sun.COM 86*11596SJason.Beloro@Sun.COM typedef struct md_string md_string_t; 87*11596SJason.Beloro@Sun.COM typedef struct md_data_block md_data_block_t; 88*11596SJason.Beloro@Sun.COM typedef struct md_prop md_prop_t; 89*11596SJason.Beloro@Sun.COM typedef struct md_node md_node_t; 90*11596SJason.Beloro@Sun.COM typedef struct mmd mmd_t; 91*11596SJason.Beloro@Sun.COM 92*11596SJason.Beloro@Sun.COM struct md_string { 93*11596SJason.Beloro@Sun.COM md_string_t *nextp; 94*11596SJason.Beloro@Sun.COM char *strp; 95*11596SJason.Beloro@Sun.COM int size; /* strlen()+1 */ 96*11596SJason.Beloro@Sun.COM uint32_t hash; 97*11596SJason.Beloro@Sun.COM int ref_cnt; 98*11596SJason.Beloro@Sun.COM uint32_t build_offset; 99*11596SJason.Beloro@Sun.COM }; 100*11596SJason.Beloro@Sun.COM 101*11596SJason.Beloro@Sun.COM struct md_data_block { 102*11596SJason.Beloro@Sun.COM md_data_block_t *nextp; 103*11596SJason.Beloro@Sun.COM uint8_t *datap; 104*11596SJason.Beloro@Sun.COM uint32_t size; 105*11596SJason.Beloro@Sun.COM uint32_t hash; 106*11596SJason.Beloro@Sun.COM int ref_cnt; 107*11596SJason.Beloro@Sun.COM uint32_t build_offset; 108*11596SJason.Beloro@Sun.COM }; 109*11596SJason.Beloro@Sun.COM 110*11596SJason.Beloro@Sun.COM struct md_prop { 111*11596SJason.Beloro@Sun.COM uint8_t type; 112*11596SJason.Beloro@Sun.COM md_string_t *sp; 113*11596SJason.Beloro@Sun.COM union { 114*11596SJason.Beloro@Sun.COM uint64_t value; 115*11596SJason.Beloro@Sun.COM struct { 116*11596SJason.Beloro@Sun.COM boolean_t is_ptr; 117*11596SJason.Beloro@Sun.COM union { 118*11596SJason.Beloro@Sun.COM uint64_t index; 119*11596SJason.Beloro@Sun.COM md_node_t *nodep; 120*11596SJason.Beloro@Sun.COM } val; 121*11596SJason.Beloro@Sun.COM } arc; 122*11596SJason.Beloro@Sun.COM md_data_block_t *dbp; 123*11596SJason.Beloro@Sun.COM } d; 124*11596SJason.Beloro@Sun.COM md_prop_t *nextp; 125*11596SJason.Beloro@Sun.COM }; 126*11596SJason.Beloro@Sun.COM 127*11596SJason.Beloro@Sun.COM struct md_node { 128*11596SJason.Beloro@Sun.COM md_string_t *typep; 129*11596SJason.Beloro@Sun.COM CHAIN(md_prop_t, prop_list); 130*11596SJason.Beloro@Sun.COM md_node_t *nextp; 131*11596SJason.Beloro@Sun.COM int build_index; /* for building a binary md & cloning */ 132*11596SJason.Beloro@Sun.COM int next_index; /* for building a binary md */ 133*11596SJason.Beloro@Sun.COM char seen; /* seen flag (md_scan_dag/md_scour) */ 134*11596SJason.Beloro@Sun.COM char deleted; /* pending deletion flag */ 135*11596SJason.Beloro@Sun.COM }; 136*11596SJason.Beloro@Sun.COM 137*11596SJason.Beloro@Sun.COM struct mmd { 138*11596SJason.Beloro@Sun.COM CHAIN(md_node_t, node_list); 139*11596SJason.Beloro@Sun.COM CHAIN(md_string_t, string_list); 140*11596SJason.Beloro@Sun.COM CHAIN(md_data_block_t, data_block_list); 141*11596SJason.Beloro@Sun.COM }; 142*11596SJason.Beloro@Sun.COM 143*11596SJason.Beloro@Sun.COM md_node_t *md_new_node(mmd_t *mdp, char *sp); 144*11596SJason.Beloro@Sun.COM int md_add_value_property(mmd_t *mdp, 145*11596SJason.Beloro@Sun.COM md_node_t *nodep, char *sp, uint64_t value); 146*11596SJason.Beloro@Sun.COM int md_add_string_property(mmd_t *mdp, md_node_t *nodep, char *sp, char *bufp); 147*11596SJason.Beloro@Sun.COM int md_add_data_property(mmd_t *mdp, md_node_t *nodep, char *sp, int len, 148*11596SJason.Beloro@Sun.COM uint8_t *bufp); 149*11596SJason.Beloro@Sun.COM int md_gen_bin(mmd_t *mdp, uint8_t **bufpp); 150*11596SJason.Beloro@Sun.COM md_node_t *md_link_new_node(mmd_t *mdp, char *nodenamep, md_node_t *parentnodep, 151*11596SJason.Beloro@Sun.COM char *linktonewp, char *linkbackp); 152*11596SJason.Beloro@Sun.COM mmd_t *md_new_md(void); 153*11596SJason.Beloro@Sun.COM void md_free_node(mmd_t *mdp, md_node_t *nodep); 154*11596SJason.Beloro@Sun.COM void md_destroy(mmd_t *); 155*11596SJason.Beloro@Sun.COM 156*11596SJason.Beloro@Sun.COM #ifdef __cplusplus 157*11596SJason.Beloro@Sun.COM } 158*11596SJason.Beloro@Sun.COM #endif 159*11596SJason.Beloro@Sun.COM 160*11596SJason.Beloro@Sun.COM #endif /* _MDESC_MUTABLE_H_ */ 161