xref: /openbsd-src/usr.sbin/ldomctl/mdesc.h (revision aace55b739f03f5e84c7dffc26b977ff7b86d6b5)
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