#ifndef _PTREE_IMPL_H
#define _PTREE_IMPL_H
#ifdef __cplusplus
extern "C" {
#endif
#include <synch.h>
#include <pthread.h>
typedef uint64_t picl_hdl_t;
#define HASH_TBL_SIZE 128
#define HASH_INDEX(s, x) ((int)((x) & ((s) - 1)))
#define PICL_INVALID_PICLHDL (picl_hdl_t)0
#define IS_PICLIZED(x) ((x)->picl_hdl != 0)
#define HASH_VAL(x) ((x) & 0xFFFFFFFF)
#define GET_PID(x) ((x) >> 32)
#define MAKE_HANDLE(x, y) (((picl_hdl_t)(x) << 32) | (y))
#define RDLOCK_NODE 1
#define WRLOCK_NODE 2
#define PROP_READ 1
#define PROP_WRITE 2
typedef struct picl_obj picl_obj_t;
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;
typedef struct prop_list {
char *pname;
char *pval;
struct prop_list *next;
} prop_list_t;
struct picl_prop {
ptree_propinfo_t info;
void *pvalue;
picl_obj_t *nodep;
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;
struct picl_node {
rwlock_t rwlock;
picl_obj_t *firstprop;
char *classname;
picl_obj_t *parent;
picl_obj_t *child;
picl_obj_t *sibling;
};
typedef struct picl_node picl_node_t;
#define PICL_OBJ_NODE 0x1
#define PICL_OBJ_PROP 0x2
#define PICL_OBJ_TABLE 0x4
#define PICL_OBJ_TABLEENTRY 0x8
struct picl_obj {
uint32_t obj_type;
picl_hdl_t ptree_hdl;
picl_hdl_t picl_hdl;
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
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;
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);
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