#ifndef _RCM_IMPL_H
#define _RCM_IMPL_H
#ifdef __cplusplus
extern "C" {
#endif
#include <assert.h>
#include <stdarg.h>
#include <stdio.h>
#include <stdio_ext.h>
#include <stdlib.h>
#include <dirent.h>
#include <dlfcn.h>
#include <errno.h>
#include <fcntl.h>
#include <limits.h>
#include <locale.h>
#include <poll.h>
#include <signal.h>
#include <strings.h>
#include <syslog.h>
#include <thread.h>
#include <unistd.h>
#include <sys/mman.h>
#include <sys/param.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <librcm.h>
#include <librcm_impl.h>
#include "rcm_module.h"
#define RCMD_INIT 1
#define RCMD_NORMAL 2
#define RCMD_CLEANUP 3
#define RCMD_FINI 4
#define RSRC_NODE_CREATE 1
#define RSRC_NODE_REMOVE 2
#define RSRC_TYPE_NORMAL 0
#define RSRC_TYPE_DEVICE 1
#define RSRC_TYPE_FILESYS 2
#define RSRC_TYPE_ABSTRACT 3
#define LOCK_FOR_DR 0
#define LOCK_FOR_USE 1
#define SEQ_NUM_SHIFT 8
#define SEQ_NUM_MASK ((1 << SEQ_NUM_SHIFT) - 1)
typedef struct rcm_queue {
struct rcm_queue *next;
struct rcm_queue *prev;
} rcm_queue_t;
#define RCM_STRUCT_BASE_ADDR(struct_type, x, y) \
((struct_type *) ((void *)(((char *)(x)) - \
(int)(&((struct_type *)0)->y))))
typedef struct module {
struct module *next;
void *dlhandle;
struct rcm_mod_ops *(*init)();
const char *(*info)();
int (*fini)();
struct rcm_mod_ops *modops;
char *name;
rcm_handle_t *rcmhandle;
int ref_count;
rcm_queue_t client_q;
struct script_info *rsi;
} module_t;
typedef struct client {
rcm_queue_t queue;
struct client *next;
module_t *module;
char *alias;
pid_t pid;
int state;
uint_t flag;
uint_t prv_flags;
} client_t;
#define RCM_NEED_TO_UNREGISTER 1
typedef struct {
int n_req;
int n_req_max;
struct {
int seq_num;
int state;
id_t id;
uint_t flag;
int type;
char device[MAXPATHLEN];
} req[1];
} rcm_req_t;
typedef struct rsrc_node {
struct rsrc_node *parent;
struct rsrc_node *sibling;
struct rsrc_node *child;
char *name;
client_t *users;
int type;
} rsrc_node_t;
typedef struct {
int cmd;
int seq_num;
int retcode;
uint_t flag;
timespec_t *interval;
nvlist_t *nvl;
rcm_info_t **info;
} tree_walk_arg_t;
typedef struct {
int thr_count;
short wanted;
short state;
time_t last_update;
cond_t cv;
mutex_t lock;
} barrier_t;
extern mutex_t rcm_req_lock;
extern librcm_ops_t rcm_ops;
extern int need_cleanup;
#define EQUAL(x, y) (strcmp(x, y) == 0)
#define AFTER(x, y) (strcmp(x, y) > 0)
#define DESCENDENT(x, y) \
((strlen(x) > strlen(y)) && \
(strncmp(x, y, strlen(y)) == 0) && \
((x[strlen(y)] == '/') || \
(x[strlen(y)] == ':') || \
(x[strlen(y) - 1] == '/')))
void event_service(void **, size_t *);
int process_resource_suspend(char **, pid_t, uint_t, int, timespec_t *,
rcm_info_t **);
int notify_resource_resume(char **, pid_t, uint_t, int, rcm_info_t **);
int process_resource_offline(char **, pid_t, uint_t, int, rcm_info_t **);
int notify_resource_online(char **, pid_t, uint_t, int, rcm_info_t **);
int notify_resource_remove(char **, pid_t, uint_t, int, rcm_info_t **);
int add_resource_client(char *, char *, pid_t, uint_t, rcm_info_t **);
int remove_resource_client(char *, char *, pid_t, uint_t);
int get_resource_info(char **, uint_t, int, rcm_info_t **);
int notify_resource_event(char *, pid_t, uint_t, int, nvlist_t *,
rcm_info_t **);
int request_capacity_change(char *, pid_t, uint_t, int, nvlist_t *,
rcm_info_t **);
int notify_capacity_change(char *, pid_t, uint_t, int, nvlist_t *,
rcm_info_t **);
int get_resource_state(char *, pid_t, rcm_info_t **);
rcm_info_t *rsrc_mod_info();
rcm_info_t *rsrc_dr_info();
void clean_dr_list();
int dr_req_add(char *, pid_t, uint_t, int, int, timespec_t *, rcm_info_t **);
int dr_req_update(char *, pid_t, uint_t, int, int, rcm_info_t **);
int dr_req_lookup(int, char *);
void dr_req_remove(char *, uint_t);
int info_req_add(char *, uint_t, int);
void info_req_remove(int);
int rsrc_check_lock_conflicts(char *, uint_t, int, rcm_info_t **);
int rsrc_get_type(const char *);
int rsrc_node_find(char *, int, rsrc_node_t **);
int rsrc_node_add_user(rsrc_node_t *, char *, char *, pid_t, uint_t);
int rsrc_node_remove_user(rsrc_node_t *, char *, pid_t, uint_t);
client_t *rsrc_client_find(char *, pid_t, client_t **);
int rsrc_client_action_list(client_t *, int cmd, void *);
int rsrc_usage_info(char **, uint_t, int, rcm_info_t **);
int rsrc_tree_action(rsrc_node_t *, int, tree_walk_arg_t *);
void rcmd_set_state(int);
int rcmd_thr_incr(int);
void rcmd_thr_decr(void);
void rcmd_thr_signal(void);
void rcmd_lock_init(void);
void rcmd_db_init(void);
void rcmd_db_sync(void);
void rcmd_db_clean(void);
void rcmd_start_timer(int);
void rcmd_exit(int);
void rcm_log_message(int, char *, ...);
void rcm_log_msg(int, char *, ...);
void add_busy_rsrc_to_list(char *, pid_t, int, int, char *, const char *,
const char *, nvlist_t *, rcm_info_t **);
char *resolve_name(char *);
int proc_exist(pid_t);
void *s_malloc(size_t);
void *s_calloc(int, size_t);
void *s_realloc(void *, size_t);
char *s_strdup(const char *);
void rcm_init_queue(rcm_queue_t *);
void rcm_enqueue_head(rcm_queue_t *, rcm_queue_t *);
void rcm_enqueue_tail(rcm_queue_t *, rcm_queue_t *);
void rcm_enqueue(rcm_queue_t *, rcm_queue_t *);
rcm_queue_t *rcm_dequeue_head(rcm_queue_t *);
rcm_queue_t *rcm_dequeue_tail(rcm_queue_t *);
void rcm_dequeue(rcm_queue_t *);
int script_main_init(void);
int script_main_fini(void);
struct rcm_mod_ops *script_init(module_t *);
char *script_info(module_t *);
int script_fini(module_t *);
#ifdef __cplusplus
}
#endif
#endif