#ifndef _SYS_SYSEVENT_H
#define _SYS_SYSEVENT_H
#include <sys/nvpair.h>
#include <sys/null.h>
#ifdef __cplusplus
extern "C" {
#endif
#define EC_ALL "register_all_classes"
#define EC_SUB_ALL "register_all_subclasses"
#define SE_SLEEP 0
#define SE_NOSLEEP 1
#define SE_EINVAL 1
#define SE_ENOMEM 2
#define SE_EQSIZE 3
#define SE_EFAULT 4
#define SE_NOTFOUND 5
#define SE_NO_TRANSPORT 6
#define SE_DATA_TYPE_BYTE DATA_TYPE_BYTE
#define SE_DATA_TYPE_INT16 DATA_TYPE_INT16
#define SE_DATA_TYPE_UINT16 DATA_TYPE_UINT16
#define SE_DATA_TYPE_INT32 DATA_TYPE_INT32
#define SE_DATA_TYPE_UINT32 DATA_TYPE_UINT32
#define SE_DATA_TYPE_INT64 DATA_TYPE_INT64
#define SE_DATA_TYPE_UINT64 DATA_TYPE_UINT64
#define SE_DATA_TYPE_STRING DATA_TYPE_STRING
#define SE_DATA_TYPE_BYTES DATA_TYPE_BYTE_ARRAY
#define SE_DATA_TYPE_TIME DATA_TYPE_HRTIME
#define SE_KERN_PID 0
#define SUNW_VENDOR "SUNW"
#define ILLUMOS_VENDOR "ILLUMOS"
#define SE_USR_PUB "usr:"
#define SE_KERN_PUB "kern:"
#define SUNW_KERN_PUB SUNW_VENDOR ":" SE_KERN_PUB
#define SUNW_USR_PUB SUNW_VENDOR ":" SE_USR_PUB
#define ILLUMOS_KERN_PUB ILLUMOS_VENDOR ":" SE_KERN_PUB
#define MAX_ATTR_NAME 1024
#define MAX_STRING_SZ 1024
#define MAX_BYTE_ARRAY 1024
#define MAX_CLASS_LEN 64
#define MAX_SUBCLASS_LEN 64
#define MAX_PUB_LEN 128
#define MAX_CHNAME_LEN 128
#define MAX_SUBID_LEN 16
#define MAX_EV_SIZE_LEN (SHRT_MAX/4)
typedef void *sysevent_t;
typedef void evchan_t;
typedef nvlist_t sysevent_attr_list_t;
typedef nvpair_t sysevent_attr_t;
typedef struct sysevent_id {
uint64_t eid_seq;
hrtime_t eid_ts;
} sysevent_id_t;
typedef struct sysevent_bytes {
int32_t size;
uchar_t *data;
} sysevent_bytes_t;
typedef struct sysevent_value {
int32_t value_type;
union {
uchar_t sv_byte;
int16_t sv_int16;
uint16_t sv_uint16;
int32_t sv_int32;
uint32_t sv_uint32;
int64_t sv_int64;
uint64_t sv_uint64;
hrtime_t sv_time;
char *sv_string;
sysevent_bytes_t sv_bytes;
} value;
} sysevent_value_t;
#define EVCH_NOSLEEP 0x0001
#define EVCH_SLEEP 0x0002
#define EVCH_TRYHARD 0x0004
#define EVCH_QWAIT 0x0008
#define EVCH_SUB_KEEP 0x01
#define EVCH_WILDCARD_MAX 10
#define EVCH_ALLSUB "all_subs"
#define EVCH_CREAT 0x0001
#define EVCH_HOLD_PEND 0x0002
#define EVCH_HOLD_PEND_INDEF 0x0004
#define EVCH_B_FLAGS 0x0007
#define EVCH_GET_CHAN_LEN_MAX 1
#define EVCH_GET_CHAN_LEN 2
#define EVCH_SET_CHAN_LEN 3
#define EVCH_CMD_LAST EVCH_SET_CHAN_LEN
extern int sysevent_evc_bind(const char *, evchan_t **, uint32_t);
extern int sysevent_evc_unbind(evchan_t *);
extern int sysevent_evc_subscribe(evchan_t *, const char *, const char *,
int (*)(sysevent_t *, void *), void *, uint32_t);
extern int sysevent_evc_unsubscribe(evchan_t *, const char *);
extern int sysevent_evc_publish(evchan_t *, const char *, const char *,
const char *, const char *, nvlist_t *, uint32_t);
extern int sysevent_evc_control(evchan_t *, int, ...);
extern int sysevent_evc_setpropnvl(evchan_t *, nvlist_t *);
extern int sysevent_evc_getpropnvl(evchan_t *, nvlist_t **);
#ifndef _KERNEL
#include <door.h>
typedef struct sysevent_subattr sysevent_subattr_t;
extern sysevent_subattr_t *sysevent_subattr_alloc(void);
extern void sysevent_subattr_free(sysevent_subattr_t *);
extern void sysevent_subattr_thrattr(sysevent_subattr_t *, pthread_attr_t *);
extern void sysevent_subattr_sigmask(sysevent_subattr_t *, sigset_t *);
extern void sysevent_subattr_thrcreate(sysevent_subattr_t *,
door_xcreate_server_func_t *, void *);
extern void sysevent_subattr_thrsetup(sysevent_subattr_t *,
door_xcreate_thrsetup_func_t *, void *);
extern int sysevent_evc_xsubscribe(evchan_t *, const char *, const char *,
int (*)(sysevent_t *, void *), void *, uint32_t, sysevent_subattr_t *);
#else
extern int log_sysevent(sysevent_t *, int, sysevent_id_t *);
extern sysevent_t *sysevent_alloc(char *, char *, char *, int);
extern void sysevent_free(sysevent_t *);
extern int sysevent_add_attr(sysevent_attr_list_t **, char *,
sysevent_value_t *, int);
extern void sysevent_free_attr(sysevent_attr_list_t *);
extern int sysevent_attach_attributes(sysevent_t *, sysevent_attr_list_t *);
extern void sysevent_detach_attributes(sysevent_t *);
extern char *sysevent_get_class_name(sysevent_t *);
extern char *sysevent_get_subclass_name(sysevent_t *);
extern uint64_t sysevent_get_seq(sysevent_t *);
extern void sysevent_get_time(sysevent_t *, hrtime_t *);
extern size_t sysevent_get_size(sysevent_t *);
extern char *sysevent_get_pub(sysevent_t *);
extern int sysevent_get_attr_list(sysevent_t *, nvlist_t **);
#endif
#ifdef __cplusplus
}
#endif
#endif