1*aace55b7Skettenis /* $OpenBSD: mdesc.h,v 1.8 2019/07/14 14:40:55 kettenis Exp $ */ 2b01cf3d3Skettenis 3b01cf3d3Skettenis /* 4b01cf3d3Skettenis * Copyright (c) 2012 Mark Kettenis 5b01cf3d3Skettenis * 6b01cf3d3Skettenis * Permission to use, copy, modify, and distribute this software for any 7b01cf3d3Skettenis * purpose with or without fee is hereby granted, provided that the above 8b01cf3d3Skettenis * copyright notice and this permission notice appear in all copies. 9b01cf3d3Skettenis * 10b01cf3d3Skettenis * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 11b01cf3d3Skettenis * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 12b01cf3d3Skettenis * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 13b01cf3d3Skettenis * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 14b01cf3d3Skettenis * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 15b01cf3d3Skettenis * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 16b01cf3d3Skettenis * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 17b01cf3d3Skettenis */ 18b01cf3d3Skettenis 19b01cf3d3Skettenis #include <sys/types.h> 20b01cf3d3Skettenis #include <sys/queue.h> 21b01cf3d3Skettenis #include <stdbool.h> 22b01cf3d3Skettenis 23b01cf3d3Skettenis struct md_header { 24b01cf3d3Skettenis uint32_t transport_version; 25b01cf3d3Skettenis uint32_t node_blk_sz; 26b01cf3d3Skettenis uint32_t name_blk_sz; 27b01cf3d3Skettenis uint32_t data_blk_sz; 28b01cf3d3Skettenis }; 29b01cf3d3Skettenis 30b01cf3d3Skettenis #define MD_TRANSPORT_VERSION 0x10000 31b01cf3d3Skettenis 32b01cf3d3Skettenis #define MD_ALIGNMENT_SIZE 0x10 33b01cf3d3Skettenis 34b01cf3d3Skettenis #define MD_LIST_END 0 35b01cf3d3Skettenis #define MD_NODE 'N' 36b01cf3d3Skettenis #define MD_NODE_END 'E' 37b01cf3d3Skettenis #define MD_NOOP ' ' 38b01cf3d3Skettenis #define MD_PROP_ARC 'a' 39b01cf3d3Skettenis #define MD_PROP_VAL 'v' 40b01cf3d3Skettenis #define MD_PROP_STR 's' 41b01cf3d3Skettenis #define MD_PROP_DATA 'd' 42b01cf3d3Skettenis 43b01cf3d3Skettenis struct md_element { 44b01cf3d3Skettenis uint8_t tag; 45b01cf3d3Skettenis uint8_t name_len; 46b01cf3d3Skettenis uint16_t _reserved_field; 47b01cf3d3Skettenis uint32_t name_offset; 48b01cf3d3Skettenis union { 49b01cf3d3Skettenis struct { 50b01cf3d3Skettenis uint32_t data_len; 51b01cf3d3Skettenis uint32_t data_offset; 52b01cf3d3Skettenis } y; 53b01cf3d3Skettenis uint64_t val; 54b01cf3d3Skettenis } d; 55b01cf3d3Skettenis }; 56b01cf3d3Skettenis 57b01cf3d3Skettenis struct md { 58b01cf3d3Skettenis TAILQ_HEAD(md_node_head, md_node) node_list; 59b01cf3d3Skettenis TAILQ_HEAD(md_name_head, md_name) name_list; 60b01cf3d3Skettenis TAILQ_HEAD(md_data_head, md_data) data_list; 61b01cf3d3Skettenis }; 62b01cf3d3Skettenis 63b01cf3d3Skettenis struct md_node { 64b01cf3d3Skettenis struct md_name *name; 65b01cf3d3Skettenis TAILQ_HEAD(md_prop_head, md_prop) prop_list; 66b01cf3d3Skettenis 67b01cf3d3Skettenis TAILQ_ENTRY(md_node) link; 68b01cf3d3Skettenis uint64_t index; 69b01cf3d3Skettenis }; 70b01cf3d3Skettenis 71b01cf3d3Skettenis struct md_prop { 72b01cf3d3Skettenis struct md_name *name; 73b01cf3d3Skettenis uint8_t tag; 74b01cf3d3Skettenis union { 75b01cf3d3Skettenis uint64_t val; 76b01cf3d3Skettenis struct { 77b01cf3d3Skettenis uint64_t index; 78b01cf3d3Skettenis struct md_node *node; 79b01cf3d3Skettenis } arc; 80b01cf3d3Skettenis struct md_data *data; 81b01cf3d3Skettenis } d; 82b01cf3d3Skettenis 83b01cf3d3Skettenis TAILQ_ENTRY(md_prop) link; 84b01cf3d3Skettenis }; 85b01cf3d3Skettenis 86b01cf3d3Skettenis struct md_name { 87b01cf3d3Skettenis const char *str; 88b01cf3d3Skettenis 89b01cf3d3Skettenis TAILQ_ENTRY(md_name) link; 90b01cf3d3Skettenis uint32_t offset; 91b01cf3d3Skettenis int refcnt; 92b01cf3d3Skettenis }; 93b01cf3d3Skettenis 94b01cf3d3Skettenis struct md_data { 95b01cf3d3Skettenis void *data; 96b01cf3d3Skettenis size_t len; 97b01cf3d3Skettenis 98b01cf3d3Skettenis TAILQ_ENTRY(md_data) link; 99b01cf3d3Skettenis uint32_t offset; 100b01cf3d3Skettenis int refcnt; 101b01cf3d3Skettenis }; 102b01cf3d3Skettenis 103b01cf3d3Skettenis struct md_prop *md_add_prop(struct md *, struct md_node *, const char *); 104b01cf3d3Skettenis struct md_prop *md_add_prop_val(struct md *, struct md_node *, 105b01cf3d3Skettenis const char *, uint64_t); 106b01cf3d3Skettenis struct md_prop *md_add_prop_str(struct md *, struct md_node *, 107b01cf3d3Skettenis const char *, const char *); 108b01cf3d3Skettenis struct md_prop *md_add_prop_data(struct md *, struct md_node *, 109b01cf3d3Skettenis const char *, const uint8_t *, size_t); 110b01cf3d3Skettenis struct md_prop *md_add_prop_arc(struct md *, struct md_node *, 111b01cf3d3Skettenis const char *,struct md_node *); 1128d715939Skettenis void md_delete_prop(struct md *, struct md_node *, struct md_prop *); 113b01cf3d3Skettenis 114b01cf3d3Skettenis struct md_node *md_find_node(struct md *, const char *); 115d27a0d69Skettenis struct md_node *md_find_subnode(struct md *, struct md_node *, const char *); 1168d715939Skettenis struct md_node *md_add_node(struct md *, const char *); 1178d715939Skettenis void md_link_node(struct md *, struct md_node *, struct md_node *); 118b01cf3d3Skettenis struct md_prop *md_find_prop(struct md *, struct md_node *, const char *); 119b01cf3d3Skettenis 120b01cf3d3Skettenis bool md_get_prop_val(struct md *, struct md_node *, const char *, uint64_t *); 1218d715939Skettenis bool md_set_prop_val(struct md *, struct md_node *, const char *, uint64_t); 122b01cf3d3Skettenis bool md_get_prop_str(struct md *, struct md_node *, const char *, 123b01cf3d3Skettenis const char **); 124*aace55b7Skettenis bool md_set_prop_data(struct md *, struct md_node *, const char *, 125*aace55b7Skettenis const uint8_t *, size_t); 1267a75ed6cSkettenis bool md_get_prop_data(struct md *, struct md_node *, const char *, 1277a75ed6cSkettenis const void **, size_t *); 1287a75ed6cSkettenis 1297a75ed6cSkettenis void md_delete_node(struct md *, struct md_node *); 1307a75ed6cSkettenis void md_find_delete_node(struct md *, const char *); 1317a75ed6cSkettenis 1327a75ed6cSkettenis void md_collect_garbage(struct md *); 133b01cf3d3Skettenis 134e099dd74Skettenis struct md *md_alloc(void); 135b01cf3d3Skettenis struct md *md_ingest(void *, size_t); 1368d715939Skettenis size_t md_exhume(struct md *md, void **); 1377a75ed6cSkettenis struct md *md_copy(struct md *); 1388d715939Skettenis 1398d715939Skettenis struct md *md_read(const char *); 1408d715939Skettenis void md_write(struct md *, const char *); 141c994384aSkettenis uint32_t md_size(const char *); 142