#ifndef _FMD_CASE_H
#define _FMD_CASE_H
#include <pthread.h>
#include <libnvpair.h>
#ifdef __cplusplus
extern "C" {
#endif
#include <fmd_list.h>
#include <fmd_api.h>
#include <fmd_buf.h>
struct fmd_module;
typedef struct fmd_case_item {
struct fmd_case_item *cit_next;
fmd_event_t *cit_event;
} fmd_case_item_t;
typedef struct fmd_case_susp {
struct fmd_case_susp *cis_next;
nvlist_t *cis_nvl;
} fmd_case_susp_t;
typedef struct fmd_case_impl {
fmd_list_t ci_list;
struct fmd_case_impl *ci_next;
struct fmd_case_impl *ci_code_next;
char *ci_uuid;
uint_t ci_uuidlen;
char *ci_code;
size_t ci_codelen;
struct fmd_module *ci_mod;
fmd_xprt_t *ci_xprt;
uint8_t ci_precanned;
nvlist_t *ci_diag_de;
uint8_t *ci_diag_asru;
uint8_t *ci_proxy_asru;
void *ci_data;
pthread_mutex_t ci_lock;
uint_t ci_refs;
ushort_t ci_state;
ushort_t ci_flags;
fmd_case_item_t *ci_items;
uint_t ci_nitems;
fmd_event_t *ci_principal;
fmd_case_susp_t *ci_suspects;
uint_t ci_nsuspects;
size_t ci_nvsz;
fmd_buf_hash_t ci_bufs;
struct timeval ci_tv;
int ci_tv_valid;
int ci_injected;
} fmd_case_impl_t;
#define FMD_CASE_CURRENT -1u
#define FMD_CASE_UNSOLVED 0
#define FMD_CASE_SOLVED 1
#define FMD_CASE_CLOSE_WAIT 2
#define FMD_CASE_CLOSED 3
#define FMD_CASE_REPAIRED 4
#define FMD_CASE_RESOLVED 5
#define FMD_CF_DIRTY 0x01
#define FMD_CF_SOLVED 0x02
#define FMD_CF_ISOLATED 0x04
#define FMD_CF_REPAIRED 0x08
#define FMD_CF_RESOLVED 0x10
#define FMD_CF_INVISIBLE 0x20
#define FMD_CF_DELETING 0x40
#define FMD_CF_RES_CMPL 0x80
#define FMD_PROXY_ASRU_NOT_NEEDED 0
#define FMD_PROXY_ASRU_FROM_ASRU 1
#define FMD_PROXY_ASRU_FROM_RSRC 2
typedef struct fmd_case_hash {
pthread_rwlock_t ch_lock;
fmd_case_impl_t **ch_hash;
fmd_case_impl_t **ch_code_hash;
uint_t ch_hashlen;
uint_t ch_count;
} fmd_case_hash_t;
extern fmd_case_hash_t *fmd_case_hash_create(void);
extern void fmd_case_hash_destroy(fmd_case_hash_t *);
extern fmd_case_t *fmd_case_hash_lookup(fmd_case_hash_t *, const char *);
extern void fmd_case_hash_apply(fmd_case_hash_t *,
void (*)(fmd_case_t *, void *), void *);
extern fmd_case_t *fmd_case_create(struct fmd_module *, const char *, void *);
extern fmd_case_t *fmd_case_recreate(struct fmd_module *,
struct fmd_xprt *, uint_t, const char *, const char *);
extern void fmd_case_destroy(fmd_case_t *, int);
extern void fmd_case_hold(fmd_case_t *);
extern void fmd_case_hold_locked(fmd_case_t *);
extern void fmd_case_rele(fmd_case_t *);
extern void fmd_case_rele_locked(fmd_case_t *);
extern void fmd_case_update(fmd_case_t *);
extern int fmd_case_insert_principal(void *, fmd_event_t *);
extern int fmd_case_insert_event(void *, fmd_event_t *);
extern void fmd_case_insert_suspect(fmd_case_t *, nvlist_t *);
extern void fmd_case_recreate_suspect(fmd_case_t *, nvlist_t *);
extern void fmd_case_reset_suspects(fmd_case_t *);
extern nvlist_t *fmd_case_mkevent(fmd_case_t *, const char *);
extern void fmd_case_publish(fmd_case_t *, uint_t);
extern void fmd_case_transition(fmd_case_t *, uint_t, uint_t);
extern void fmd_case_transition_update(fmd_case_t *, uint_t, uint_t);
extern void fmd_case_setdirty(fmd_case_t *);
extern void fmd_case_clrdirty(fmd_case_t *);
extern void fmd_case_commit(fmd_case_t *);
extern void fmd_case_update(fmd_case_t *);
extern void fmd_case_delete(fmd_case_t *);
extern void fmd_case_discard(fmd_case_t *, boolean_t);
extern void fmd_case_settime(fmd_case_t *, time_t, suseconds_t);
extern void fmd_case_setcode(fmd_case_t *, char *);
extern void fmd_case_set_de_fmri(fmd_case_t *, nvlist_t *);
extern void fmd_case_set_injected(fmd_case_t *);
extern void fmd_case_update_status(fmd_case_t *, uint8_t *, uint8_t *,
uint8_t *);
extern void fmd_case_update_containees(fmd_case_t *);
extern void fmd_case_xprt_updated(fmd_case_t *);
extern void fmd_case_close_status(fmd_case_t *);
extern int fmd_case_repair(fmd_case_t *);
extern int fmd_case_acquit(fmd_case_t *);
extern int fmd_case_contains(fmd_case_t *, fmd_event_t *);
extern int fmd_case_orphaned(fmd_case_t *);
extern void fmd_case_repair_replay(void);
extern void fmd_case_discard_resolved(fmd_case_t *, void *);
#ifdef __cplusplus
}
#endif
#endif