xref: /illumos-gate/usr/src/lib/libpicltree/ptree_impl.h (revision 3299f39fdcbdab4be7a9c70daa3873f2b78a398d)
1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License, Version 1.0 only
6  * (the "License").  You may not use this file except in compliance
7  * with the License.
8  *
9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10  * or http://www.opensolaris.org/os/licensing.
11  * See the License for the specific language governing permissions
12  * and limitations under the License.
13  *
14  * When distributing Covered Code, include this CDDL HEADER in each
15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16  * If applicable, add the following below this CDDL HEADER, with the
17  * fields enclosed by brackets "[]" replaced with your own identifying
18  * information: Portions Copyright [yyyy] [name of copyright owner]
19  *
20  * CDDL HEADER END
21  */
22 /*
23  * Copyright (c) 1999-2001 by Sun Microsystems, Inc.
24  * All rights reserved.
25  */
26 
27 #ifndef	_PTREE_IMPL_H
28 #define	_PTREE_IMPL_H
29 
30 #pragma ident	"%Z%%M%	%I%	%E% SMI"
31 
32 #ifdef	__cplusplus
33 extern "C" {
34 #endif
35 
36 #include <synch.h>
37 #include <pthread.h>
38 
39 typedef uint64_t picl_hdl_t;
40 
41 /*
42  * Hash table size of Ptree and PICL tables
43  */
44 #define	HASH_TBL_SIZE		128
45 #define	HASH_INDEX(s, x)	((int)((x) & ((s) - 1)))
46 
47 /*
48  * Invalid PICL handle
49  */
50 #define	PICL_INVALID_PICLHDL	(picl_hdl_t)0
51 
52 /*
53  * Is the object PICLized?
54  */
55 #define	IS_PICLIZED(x)		((x)->picl_hdl != NULL)
56 
57 /*
58  * A handle is a 64-bit quantity with the daemon's pid value in top 32 bits
59  * and the raw handle value in the lower 32 bits.
60  */
61 #define	HASH_VAL(x)		((x) & 0xFFFFFFFF)
62 #define	GET_PID(x)		((x) >> 32)
63 #define	MAKE_HANDLE(x, y)	(((picl_hdl_t)(x) << 32) | (y))
64 
65 /*
66  * Lock type when locking a node
67  */
68 #define	RDLOCK_NODE		1
69 #define	WRLOCK_NODE		2
70 
71 /*
72  * Property access operation
73  */
74 #define	PROP_READ		1
75 #define	PROP_WRITE		2
76 
77 /*
78  * PICL object type
79  */
80 typedef	struct picl_obj		picl_obj_t;
81 
82 /*
83  * Hash table structure
84  */
85 struct hash_elem {
86 	uint32_t		hdl;
87 	union {
88 		void		*data;
89 		uint32_t	ptreeh;
90 	} u;
91 	struct hash_elem	*next;
92 };
93 typedef	struct hash_elem	hash_elem_t;
94 #define	hash_obj	u.data
95 #define	hash_hdl	u.ptreeh
96 
97 typedef struct {
98 	int		hash_size;
99 	hash_elem_t	**tbl;
100 } hash_t;
101 
102 /*
103  * Property expression list
104  */
105 typedef struct prop_list {
106 	char			*pname;
107 	char			*pval;
108 	struct prop_list	*next;
109 } prop_list_t;
110 
111 /*
112  * PICL property (scalar or a table entry)
113  */
114 struct picl_prop {
115 	ptree_propinfo_t	info;
116 	void			*pvalue;
117 	picl_obj_t		*nodep;		/* prop's node or table */
118 	picl_obj_t		*next_in_list;
119 	picl_obj_t		*next_by_row;
120 	picl_obj_t		*next_by_col;
121 };
122 typedef	struct picl_prop	picl_prop_t;
123 
124 /*
125  * PICL node
126  */
127 struct picl_node {
128 	rwlock_t	rwlock;		/* protects properties */
129 	picl_obj_t  	*firstprop;
130 	char		*classname;
131 	picl_obj_t	*parent;	/* protected by ptree lock */
132 	picl_obj_t	*child;		/* protected by ptree lock */
133 	picl_obj_t	*sibling;	/* protected by ptree lock */
134 };
135 typedef struct picl_node	picl_node_t;
136 
137 /*
138  * PICL object types
139  */
140 #define	PICL_OBJ_NODE		0x1
141 #define	PICL_OBJ_PROP		0x2
142 #define	PICL_OBJ_TABLE		0x4
143 #define	PICL_OBJ_TABLEENTRY	0x8
144 
145 /*
146  * PICL object
147  */
148 struct picl_obj {
149 	uint32_t	obj_type;
150 	picl_hdl_t	ptree_hdl;		/* ptree handle */
151 	picl_hdl_t	picl_hdl;		/* client handle */
152 	union {
153 		picl_node_t	node;
154 		picl_prop_t	prop;
155 	} u;
156 };
157 
158 #define	pinfo_ver	u.prop.info.version
159 #define	prop_type	u.prop.info.piclinfo.type
160 #define	prop_size	u.prop.info.piclinfo.size
161 #define	prop_mode	u.prop.info.piclinfo.accessmode
162 #define	prop_name	u.prop.info.piclinfo.name
163 #define	prop_val	u.prop.pvalue
164 #define	next_row	u.prop.next_by_row
165 #define	next_col	u.prop.next_by_col
166 #define	next_prop	u.prop.next_in_list
167 #define	table_prop	u.prop.next_in_list
168 #define	prop_node	u.prop.nodep
169 #define	prop_table	u.prop.nodep
170 #define	read_func	u.prop.info.read
171 #define	write_func	u.prop.info.write
172 
173 #define	first_prop	u.node.firstprop
174 #define	node_lock	u.node.rwlock
175 #define	child_node	u.node.child
176 #define	sibling_node	u.node.sibling
177 #define	parent_node	u.node.parent
178 #define	node_classname	u.node.classname
179 
180 /*
181  * PICL event queue structures
182  */
183 struct eventq {
184 	const char		*ename;
185 	const void		*earg;
186 	size_t		size;
187 	void		(*completion_handler)(char *ename, void *earg,
188 			    size_t size);
189 	struct eventq	*next;
190 };
191 typedef struct eventq	eventq_t;
192 
193 /*
194  * Event handler list
195  */
196 struct eh_list {
197 	char		*ename;
198 	void		*cookie;
199 	void		(*evt_handler)(const char *ename, const void *earg,
200 			    size_t size, void *cookie);
201 	short		execflg;
202 	short		wakeupflg;
203 	pthread_cond_t	cv;
204 	struct eh_list	*next;
205 };
206 typedef struct eh_list	evt_handler_t;
207 
208 #define	SUPER_USER		0
209 
210 #define	MIN(x, y)		((x) < (y) ? (x) : (y))
211 
212 typedef struct picld_plugin_reg_list {
213 	picld_plugin_reg_t		reg;
214 	struct picld_plugin_reg_list	*next;
215 } picld_plugin_reg_list_t;
216 
217 typedef struct picld_plinfo {
218 	char			*libname;
219 	char			*pathname;
220 	void 			*dlh;
221 	struct picld_plinfo	*next;
222 } picld_plugin_desc_t;
223 
224 extern	int	xptree_initialize(int);
225 extern	void	xptree_destroy(void);
226 extern	int	xptree_reinitialize(void);
227 extern	int	xptree_refresh_notify(uint32_t secs);
228 extern	int	cvt_picl2ptree(picl_hdl_t piclh, picl_hdl_t *ptreeh);
229 extern	void	cvt_ptree2picl(picl_hdl_t *vbuf);
230 extern	int	xptree_get_propinfo_by_name(picl_nodehdl_t nodeh,
231 			const char *pname, ptree_propinfo_t *pinfo);
232 extern	int	xptree_get_propval_with_cred(picl_prophdl_t proph, void *valbuf,
233 			size_t size, door_cred_t cred);
234 extern	int	xptree_get_propval_by_name_with_cred(picl_nodehdl_t nodeh,
235 			const char *propname, void *valbuf, size_t sz,
236 			door_cred_t cred);
237 extern	int	xptree_update_propval_with_cred(picl_prophdl_t proph,
238 			const void *valbuf, size_t sz, door_cred_t cred);
239 extern	int	xptree_update_propval_by_name_with_cred(picl_nodehdl_t nodeh,
240 			const char *propname, const void *valbuf, size_t sz,
241 			door_cred_t cred);
242 
243 /*
244  * PICL daemon verbose level flag
245  */
246 extern	int	verbose_level;
247 extern	void	dbg_print(int level, const char *fmt, ...);
248 extern	void	dbg_exec(int level, void (*fn)(void *), void *arg);
249 
250 #ifdef	__cplusplus
251 }
252 #endif
253 
254 #endif	/* _PTREE_IMPL_H */
255