OpenSolaris_b135/lib/libpicltree/ptree_impl.h

Compare this file to the similar file:
Show the results in this format:

/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License, Version 1.0 only
 * (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 (c) 1999-2001 by Sun Microsystems, Inc.
 * All rights reserved.
 */

#ifndef	_PTREE_IMPL_H
#define	_PTREE_IMPL_H

#pragma ident	"%Z%%M%	%I%	%E% SMI"

#ifdef	__cplusplus
extern "C" {
#endif

#include <synch.h>
#include <pthread.h>

typedef uint64_t picl_hdl_t;

/*
 * Hash table size of Ptree and PICL tables
 */
#define	HASH_TBL_SIZE		128
#define	HASH_INDEX(s, x)	((int)((x) & ((s) - 1)))

/*
 * Invalid PICL handle
 */
#define	PICL_INVALID_PICLHDL	(picl_hdl_t)0

/*
 * Is the object PICLized?
 */
#define	IS_PICLIZED(x)		((x)->picl_hdl != NULL)

/*
 * A handle is a 64-bit quantity with the daemon's pid value in top 32 bits
 * and the raw handle value in the lower 32 bits.
 */
#define	HASH_VAL(x)		((x) & 0xFFFFFFFF)
#define	GET_PID(x)		((x) >> 32)
#define	MAKE_HANDLE(x, y)	(((picl_hdl_t)(x) << 32) | (y))

/*
 * Lock type when locking a node
 */
#define	RDLOCK_NODE		1
#define	WRLOCK_NODE		2

/*
 * Property access operation
 */
#define	PROP_READ		1
#define	PROP_WRITE		2

/*
 * PICL object type
 */
typedef	struct picl_obj		picl_obj_t;

/*
 * Hash table structure
 */
struct hash_elem {
	uint32_t		hdl;
	union {
		void		*data;
		uint32_t	ptreeh;
	} u;
	struct hash_elem	*next;
};
typedef	struct hash_elem	hash_elem_t;
#define	hash_obj	u.data
#define	hash_hdl	u.ptreeh

typedef struct {
	int		hash_size;
	hash_elem_t	**tbl;
} hash_t;

/*
 * Property expression list
 */
typedef struct prop_list {
	char			*pname;
	char			*pval;
	struct prop_list	*next;
} prop_list_t;

/*
 * PICL property (scalar or a table entry)
 */
struct picl_prop {
	ptree_propinfo_t	info;
	void			*pvalue;
	picl_obj_t		*nodep;		/* prop's node or table */
	picl_obj_t		*next_in_list;
	picl_obj_t		*next_by_row;
	picl_obj_t		*next_by_col;
};
typedef	struct picl_prop	picl_prop_t;

/*
 * PICL node
 */
struct picl_node {
	rwlock_t	rwlock;		/* protects properties */
	picl_obj_t  	*firstprop;
	char		*classname;
	picl_obj_t	*parent;	/* protected by ptree lock */
	picl_obj_t	*child;		/* protected by ptree lock */
	picl_obj_t	*sibling;	/* protected by ptree lock */
};
typedef struct picl_node	picl_node_t;

/*
 * PICL object types
 */
#define	PICL_OBJ_NODE		0x1
#define	PICL_OBJ_PROP		0x2
#define	PICL_OBJ_TABLE		0x4
#define	PICL_OBJ_TABLEENTRY	0x8

/*
 * PICL object
 */
struct picl_obj {
	uint32_t	obj_type;
	picl_hdl_t	ptree_hdl;		/* ptree handle */
	picl_hdl_t	picl_hdl;		/* client handle */
	union {
		picl_node_t	node;
		picl_prop_t	prop;
	} u;
};

#define	pinfo_ver	u.prop.info.version
#define	prop_type	u.prop.info.piclinfo.type
#define	prop_size	u.prop.info.piclinfo.size
#define	prop_mode	u.prop.info.piclinfo.accessmode
#define	prop_name	u.prop.info.piclinfo.name
#define	prop_val	u.prop.pvalue
#define	next_row	u.prop.next_by_row
#define	next_col	u.prop.next_by_col
#define	next_prop	u.prop.next_in_list
#define	table_prop	u.prop.next_in_list
#define	prop_node	u.prop.nodep
#define	prop_table	u.prop.nodep
#define	read_func	u.prop.info.read
#define	write_func	u.prop.info.write

#define	first_prop	u.node.firstprop
#define	node_lock	u.node.rwlock
#define	child_node	u.node.child
#define	sibling_node	u.node.sibling
#define	parent_node	u.node.parent
#define	node_classname	u.node.classname

/*
 * PICL event queue structures
 */
struct eventq {
	const char		*ename;
	const void		*earg;
	size_t		size;
	void		(*completion_handler)(char *ename, void *earg,
			    size_t size);
	struct eventq	*next;
};
typedef struct eventq	eventq_t;

/*
 * Event handler list
 */
struct eh_list {
	char		*ename;
	void		*cookie;
	void		(*evt_handler)(const char *ename, const void *earg,
			    size_t size, void *cookie);
	short		execflg;
	short		wakeupflg;
	pthread_cond_t	cv;
	struct eh_list	*next;
};
typedef struct eh_list	evt_handler_t;

#define	SUPER_USER		0

#define	MIN(x, y)		((x) < (y) ? (x) : (y))

typedef struct picld_plugin_reg_list {
	picld_plugin_reg_t		reg;
	struct picld_plugin_reg_list	*next;
} picld_plugin_reg_list_t;

typedef struct picld_plinfo {
	char			*libname;
	char			*pathname;
	void 			*dlh;
	struct picld_plinfo	*next;
} picld_plugin_desc_t;

extern	int	xptree_initialize(int);
extern	void	xptree_destroy(void);
extern	int	xptree_reinitialize(void);
extern	int	xptree_refresh_notify(uint32_t secs);
extern	int	cvt_picl2ptree(picl_hdl_t piclh, picl_hdl_t *ptreeh);
extern	void	cvt_ptree2picl(picl_hdl_t *vbuf);
extern	int	xptree_get_propinfo_by_name(picl_nodehdl_t nodeh,
			const char *pname, ptree_propinfo_t *pinfo);
extern	int	xptree_get_propval_with_cred(picl_prophdl_t proph, void *valbuf,
			size_t size, door_cred_t cred);
extern	int	xptree_get_propval_by_name_with_cred(picl_nodehdl_t nodeh,
			const char *propname, void *valbuf, size_t sz,
			door_cred_t cred);
extern	int	xptree_update_propval_with_cred(picl_prophdl_t proph,
			const void *valbuf, size_t sz, door_cred_t cred);
extern	int	xptree_update_propval_by_name_with_cred(picl_nodehdl_t nodeh,
			const char *propname, const void *valbuf, size_t sz,
			door_cred_t cred);

/*
 * PICL daemon verbose level flag
 */
extern	int	verbose_level;
extern	void	dbg_print(int level, const char *fmt, ...);
extern	void	dbg_exec(int level, void (*fn)(void *), void *arg);

#ifdef	__cplusplus
}
#endif

#endif	/* _PTREE_IMPL_H */