#ifndef _POOL_INTERNAL_H
#define _POOL_INTERNAL_H
#include <libnvpair.h>
#include <stdarg.h>
#include <sys/pool.h>
#include <sys/pool_impl.h>
#ifdef __cplusplus
extern "C" {
#endif
#define PEC_QRY_ANY (PEC_QRY_SYSTEM | PEC_QRY_POOL | PEC_QRY_RES | \
PEC_QRY_COMP)
#define PEC_QRY_SYSTEM (1 << PEC_SYSTEM)
#define PEC_QRY_POOL (1 << PEC_POOL)
#define PEC_QRY_RES (PEC_QRY_RES_COMP | PEC_QRY_RES_AGG)
#define PEC_QRY_RES_COMP (1 << PEC_RES_COMP)
#define PEC_QRY_RES_AGG (1 << PEC_RES_AGG)
#define PEC_QRY_COMP (1 << PEC_COMP)
#define PEC_QRY_ELEM(e) (1 << pool_elem_class(e))
#define TO_ELEM(s) ((pool_elem_t *)s)
#define TO_CONF(s) (s->pe_conf)
#define XML_DATA_STORE 0
#define KERNEL_DATA_STORE 1
#define PV_NAME_MAX_LEN 1024
#define PV_VALUE_MAX_LEN 1024
#define CB_TAB_BUF_SIZE 8
#define CB_DEFAULT_LEN 256
#define PSID_IS_SYSSET(psid) (psid == PS_NONE)
#define POOL_SYSID_BAD (-2)
#define POOL_SYSID_BAD_STRING "-2"
#define KEY_BUFFER_SIZE 48
extern const char *c_a_dtype;
extern const char *c_name;
extern const char *c_type;
extern const char *c_ref_id;
extern const char *c_max_prop;
extern const char *c_min_prop;
extern const char *c_size_prop;
extern const char *c_sys_prop;
typedef struct char_buf
{
size_t cb_size;
char *cb_buf;
char cb_tab_buf[CB_TAB_BUF_SIZE];
} char_buf_t;
#define POOL_VALUE_INITIALIZER \
{POC_INVAL, NULL, 0 }
struct pool_value {
pool_value_class_t pv_class;
const char *pv_name;
union
{
uint64_t u;
int64_t i;
double d;
uchar_t b;
const char *s;
} pv_u;
};
typedef struct pool_prop_op {
int (*ppo_get_value)(const pool_elem_t *, pool_value_t *);
int (*ppo_set_value)(pool_elem_t *, const pool_value_t *);
} pool_prop_op_t;
typedef struct pool_prop {
const char *pp_pname;
pool_value_t pp_value;
uint_t pp_perms;
int (*pp_init)(struct pool_prop *);
pool_prop_op_t pp_op;
} pool_prop_t;
enum log_state {
LS_DO,
LS_UNDO,
LS_RECOVER,
LS_FAIL
};
typedef struct log log_t;
typedef struct log_item {
log_t *li_log;
int li_op;
void *li_details;
struct log_item *li_next;
struct log_item *li_prev;
enum log_state li_state;
} log_item_t;
struct log
{
pool_conf_t *l_conf;
log_item_t *l_sentinel;
enum log_state l_state;
};
typedef int (*log_item_action_t)(log_item_t *);
extern int resource_get_max(const pool_resource_t *, uint64_t *);
extern int resource_get_min(const pool_resource_t *, uint64_t *);
extern int resource_get_size(const pool_resource_t *, uint64_t *);
extern int resource_get_pinned(const pool_resource_t *,
uint64_t *);
extern char *elem_get_name(const pool_elem_t *);
extern id_t elem_get_sysid(const pool_elem_t *);
extern int elem_is_default(const pool_elem_t *);
extern boolean_t elem_is_tmp(const pool_elem_t *);
extern const pool_elem_t *get_default_elem(const pool_elem_t *);
extern int qsort_elem_compare(const void *, const void *);
extern const char *pool_elem_class_string(const pool_elem_t *);
extern const char *pool_resource_type_string(pool_resource_elem_class_t);
extern const char *pool_component_type_string(pool_component_elem_class_t);
extern int pool_conf_commit_sys(pool_conf_t *, int);
extern int pool_xml_connection_alloc(pool_conf_t *, int);
extern int pool_knl_connection_alloc(pool_conf_t *, int);
extern pool_component_t *pool_component_create(pool_conf_t *,
const pool_resource_t *, int64_t);
extern int pool_component_destroy(pool_component_t *);
extern pool_elem_t *pool_get_container(const pool_elem_t *);
extern int pool_set_container(pool_elem_t *, pool_elem_t *);
extern void do_dprintf(const char *, va_list);
extern void pool_dprintf(const char *, ...);
extern void pool_seterror(int);
extern pool_elem_class_t pool_elem_class(const pool_elem_t *);
extern pool_resource_elem_class_t pool_resource_elem_class(const pool_elem_t *);
extern pool_component_elem_class_t pool_component_elem_class(const
pool_elem_t *);
extern int pool_elem_same_class(const pool_elem_t *, const pool_elem_t *);
extern pool_elem_class_t pool_elem_class_from_string(const char *);
extern pool_resource_elem_class_t pool_resource_elem_class_from_string(const
char *);
extern pool_component_elem_class_t pool_component_elem_class_from_string(const
char *);
extern int pool_elem_compare(const pool_elem_t *,
const pool_elem_t *);
extern int pool_elem_compare_name(const pool_elem_t *,
const pool_elem_t *);
extern char_buf_t *alloc_char_buf(size_t);
extern void free_char_buf(char_buf_t *);
extern int set_char_buf(char_buf_t *, const char *, ...);
extern int append_char_buf(char_buf_t *, const char *, ...);
extern int pool_value_equal(pool_value_t *, pool_value_t *);
extern int pool_value_from_nvpair(pool_value_t *, nvpair_t *);
extern int is_valid_name(const char *);
extern const char *elem_get_prefix(const pool_elem_t *);
extern const char *is_a_known_prefix(pool_elem_class_t, const char *);
extern int pool_put_ns_property(pool_elem_t *, const char *,
const pool_value_t *);
extern int pool_put_any_property(pool_elem_t *, const char *,
const pool_value_t *);
extern int pool_put_any_ns_property(pool_elem_t *, const char *,
const pool_value_t *);
extern pool_value_class_t pool_get_ns_property(const pool_elem_t *,
const char *, pool_value_t *);
extern int pool_walk_any_properties(pool_conf_t *, pool_elem_t *,
void *, int (*)(pool_conf_t *, pool_elem_t *, const char *,
pool_value_t *, void *), int);
extern int pool_set_temporary(pool_conf_t *, pool_elem_t *);
extern const char *is_ns_property(const pool_elem_t *, const char *);
extern const char *property_name_minus_ns(const pool_elem_t *,
const char *);
extern void internal_init(void);
extern int conf_is_dynamic(const pool_conf_t *);
extern int pool_knl_update(pool_conf_t *, int *);
extern int resource_is_default(const pool_resource_t *);
extern int resource_is_system(const pool_resource_t *);
extern int resource_can_associate(const pool_resource_t *);
extern const pool_resource_t *get_default_resource(const pool_resource_t *);
extern pool_resource_t *resource_by_sysid(const pool_conf_t *, id_t,
const char *);
extern uint_t pool_get_provider_count(void);
extern const pool_prop_t *provider_get_props(const pool_elem_t *);
extern const pool_prop_t *provider_get_prop(const pool_elem_t *,
const char *);
extern int prop_is_stored(const pool_prop_t *);
extern int prop_is_readonly(const pool_prop_t *);
extern int prop_is_init(const pool_prop_t *);
extern int prop_is_hidden(const pool_prop_t *);
extern int prop_is_optional(const pool_prop_t *);
extern int cpu_is_requested(pool_component_t *);
extern int uint_init(pool_prop_t *, uint64_t);
extern int int_init(pool_prop_t *, int64_t);
extern int double_init(pool_prop_t *, double);
extern int bool_init(pool_prop_t *, uchar_t);
extern int string_init(pool_prop_t *, const char *);
extern log_t *log_alloc(pool_conf_t *);
extern void log_free(log_t *);
extern void log_empty(log_t *);
extern int log_walk(log_t *, log_item_action_t);
extern int log_reverse_walk(log_t *, log_item_action_t);
extern uint_t log_size(log_t *);
extern int log_append(log_t *, int, void *);
extern log_item_t *log_item_alloc(log_t *, int, void *);
extern int log_item_free(log_item_t *);
extern int pool_validate_resource(const pool_conf_t *,
const char *, const char *, int64_t);
extern const char *atom_string(const char *);
extern void atom_free(const char *);
#ifdef DEBUG
extern void log_item_dprintf(log_item_t *);
extern void pool_value_dprintf(const pool_value_t *);
extern void pool_elem_dprintf(const pool_elem_t *);
#endif
#ifdef __cplusplus
}
#endif
#endif