#ifndef _LIBNDMP_H
#define _LIBNDMP_H
#include <rpc/types.h>
#include <libscf.h>
#include <libnvpair.h>
#ifdef __cplusplus
extern "C" {
#endif
#define NDMP_V2 2
#define NDMP_V3 3
#define NDMP_V4 4
#define NDMP_SINQ_SEQ_ACCESS_DEVICE 0x01
#define NDMP_SINQ_TAPE_ROBOT 0x08
extern int ndmp_errno;
#define NDMP_PLUGIN_VERSION 1
typedef struct ndmp_context {
char *nc_plname;
uint_t nc_plversion;
void *nc_pldata;
void *nc_cmds;
void *nc_params;
void *nc_ddata;
} ndmp_context_t;
typedef struct ndmp_plugin {
const char *np_plid;
uint_t np_plversion;
void *np_pldata;
int (*np_pre_backup)(struct ndmp_plugin *, ndmp_context_t *,
const char *);
int (*np_post_backup)(struct ndmp_plugin *, ndmp_context_t *,
int);
int (*np_pre_restore)(struct ndmp_plugin *, ndmp_context_t *,
const char *, const char *);
int (*np_post_restore)(struct ndmp_plugin *, ndmp_context_t *,
int);
} ndmp_plugin_t;
typedef enum ndmp_log_dma_type {
NDMP_LOGD_NORMAL = 0,
NDMP_LOGD_DEBUG = 1,
NDMP_LOGD_ERROR = 2,
NDMP_LOGD_WARNING = 3
} ndmp_log_dma_type_t;
typedef enum {
NDMP_BUTYPE_TAR = 0,
NDMP_BUTYPE_DUMP,
NDMP_BUTYPE_ZFS
} ndmpd_backup_type_t;
extern ndmpd_backup_type_t ndmp_get_backup_type(ndmp_context_t *);
#define ENDMP_BASE 2000
enum {
ENDMP_DOOR_SRV_TIMEOUT = ENDMP_BASE,
ENDMP_INVALID_ARG,
ENDMP_DOOR_SRV_OPERATION,
ENDMP_DOOR_OPEN,
ENDMP_MEM_ALLOC,
ENDMP_DOOR_ENCODE_START,
ENDMP_DOOR_ENCODE_FINISH,
ENDMP_DOOR_DECODE_FINISH,
ENDMP_SMF_PERM,
ENDMP_SMF_INTERNAL,
ENDMP_SMF_PROP,
ENDMP_SMF_PROP_GRP
};
typedef enum ndmp_tp_open_mode {
NDMP_TP_READ_MODE,
NDMP_TP_WRITE_MODE,
NDMP_TP_RAW_MODE,
NDMP_TP_RAW1_MODE = 0x7fffffff,
NDMP_TP_RAW2_MODE = NDMP_TP_RAW_MODE
} ndmp_tp_open_mode_t;
typedef enum ndmp_mv_state {
NDMP_MV_STATE_IDLE,
NDMP_MV_STATE_LISTEN,
NDMP_MV_STATE_ACTIVE,
NDMP_MV_STATE_PAUSED,
NDMP_MV_STATE_HALTED
} ndmp_mv_state_t;
typedef enum ndmp_mv_mode {
NDMP_MV_MODE_READ,
NDMP_MV_MODE_WRITE,
NDMP_MV_MODE_NOACTION
} ndmp_mv_mode_t;
typedef enum ndmp_mv_pause_reason {
NDMP_MV_PAUSE_NA,
NDMP_MV_PAUSE_EOM,
NDMP_MV_PAUSE_EOF,
NDMP_MV_PAUSE_SEEK,
NDMP_MV_PAUSE_MEDIA_ERROR,
NDMP_MV_PAUSE_EOW
} ndmp_mv_pause_reason_t;
typedef enum ndmp_mv_halt_reason {
NDMP_MV_HALT_NA,
NDMP_MV_HALT_CONNECT_CLOSED,
NDMP_MV_HALT_ABORTED,
NDMP_MV_HALT_INTERNAL_ERROR,
NDMP_MV_HALT_CONNECT_ERROR,
NDMP_MV_HALT_MEDIA_ERROR
} ndmp_mv_halt_reason_t;
typedef enum ndmp_ad_type {
NDMP_AD_LOCAL,
NDMP_AD_TCP,
NDMP_AD_FC,
NDMP_AD_IPC
} ndmp_ad_type_t;
typedef enum ndmp_dt_operation {
NDMP_DT_OP_NOACTION,
NDMP_DT_OP_BACKUP,
NDMP_DT_OP_RECOVER,
NDMP_DT_OP_RECOVER_FILEHIST
} ndmp_dt_operation_t;
typedef enum ndmp_dt_state {
NDMP_DT_STATE_IDLE,
NDMP_DT_STATE_ACTIVE,
NDMP_DT_STATE_HALTED,
NDMP_DT_STATE_LISTEN,
NDMP_DT_STATE_CONNECTED
} ndmp_dt_state_t;
typedef enum ndmp_dt_halt_reason {
NDMP_DT_HALT_NA,
NDMP_DT_HALT_SUCCESSFUL,
NDMP_DT_HALT_ABORTED,
NDMP_DT_HALT_INTERNAL_ERROR,
NDMP_DT_HALT_CONNECT_ERROR
} ndmp_dt_halt_reason_t;
typedef struct ndmp_devinfo {
uint_t nd_dev_type;
char *nd_name;
uint_t nd_lun;
uint_t nd_sid;
char *nd_vendor;
char *nd_product;
char *nd_revision;
char *nd_serial;
char *nd_wwn;
} ndmp_devinfo_t;
typedef struct ndmp_scsi {
int ns_scsi_open;
char *ns_adapter_name;
int ns_valid_target_set;
int ns_scsi_id;
int ns_lun;
} ndmp_scsi_t;
typedef struct ndmp_tape {
int nt_fd;
ulong_t nt_rec_count;
ndmp_tp_open_mode_t nt_mode;
char *nt_dev_name;
char *nt_adapter_name;
int nt_sid;
int nt_lun;
} ndmp_tape_t;
typedef struct ndmp_mover {
ndmp_mv_state_t nm_state;
ndmp_mv_mode_t nm_mode;
ndmp_mv_pause_reason_t nm_pause_reason;
ndmp_mv_halt_reason_t nm_halt_reason;
ulong_t nm_rec_size;
ulong_t nm_rec_num;
u_longlong_t nm_mov_pos;
u_longlong_t nm_window_offset;
u_longlong_t nm_window_length;
int nm_sock;
int nm_listen_sock;
ndmp_ad_type_t nm_addr_type;
char *nm_tcp_addr;
} ndmp_mover_t;
typedef struct ndmp_dt_name {
char *nn_name;
char *nn_dest;
} ndmp_dt_name_t;
typedef struct ndmp_dt_pval {
char *np_name;
char *np_value;
} ndmp_dt_pval_t;
typedef struct ndmp_dt_name_v3 {
char *nn3_opath;
char *nn3_dpath;
u_longlong_t nn3_node;
u_longlong_t nn3_fh_info;
} ndmp_dt_name_v3_t;
typedef struct ndmp_dt_v3 {
int dv3_listen_sock;
u_longlong_t dv3_bytes_processed;
ndmp_dt_name_v3_t *dv3_nlist;
} ndmp_dt_v3_t;
typedef struct ndmp_data {
ndmp_dt_operation_t nd_oper;
ndmp_dt_state_t nd_state;
ndmp_dt_halt_reason_t nd_halt_reason;
int nd_sock;
ndmp_ad_type_t nd_addr_type;
char *nd_tcp_addr;
int nd_abort;
u_longlong_t nd_read_offset;
u_longlong_t nd_read_length;
u_longlong_t nd_total_size;
ulong_t nd_env_len;
ndmp_dt_pval_t *nd_env;
ulong_t nld_nlist_len;
union {
ndmp_dt_name_t *nld_nlist;
ndmp_dt_v3_t nld_dt_v3;
} nd_nlist;
} ndmp_data_t;
typedef struct ndmp_session_info {
int nsi_sid;
int nsi_pver;
int nsi_auth;
int nsi_eof;
char *nsi_cl_addr;
ndmp_scsi_t nsi_scsi;
ndmp_tape_t nsi_tape;
ndmp_mover_t nsi_mover;
ndmp_data_t nsi_data;
} ndmp_session_info_t;
typedef struct ndmp_stat {
int ns_trun;
int ns_twait;
int ns_nbk;
int ns_nrs;
int ns_rfile;
int ns_wfile;
uint64_t ns_rdisk;
uint64_t ns_wdisk;
uint64_t ns_rtape;
uint64_t ns_wtape;
} ndmp_stat_t;
typedef struct ndmp_door_ctx {
char *ptr;
char *start_ptr;
char *end_ptr;
int status;
} ndmp_door_ctx_t;
extern int ndmp_get_devinfo(ndmp_devinfo_t **, size_t *);
extern void ndmp_get_devinfo_free(ndmp_devinfo_t *, size_t);
extern int ndmp_get_dbglevel(void);
extern int ndmp_get_session_info(ndmp_session_info_t **, size_t *);
extern void ndmp_get_session_info_free(ndmp_session_info_t *, size_t);
extern int ndmp_get_stats(ndmp_stat_t *);
extern int ndmp_terminate_session(int);
extern int ndmp_set_dbglevel(int);
extern const char *ndmp_strerror(int);
extern int ndmp_door_status(void);
extern int ndmp_get_prop(const char *, char **);
extern int ndmp_set_prop(const char *, const char *);
extern int ndmp_service_refresh(void);
extern char *ndmp_base64_encode(const char *);
extern char *ndmp_base64_decode(const char *);
extern ndmp_door_ctx_t *ndmp_door_decode_start(char *, int);
extern int ndmp_door_decode_finish(ndmp_door_ctx_t *);
extern ndmp_door_ctx_t *ndmp_door_encode_start(char *, int);
extern int ndmp_door_encode_finish(ndmp_door_ctx_t *, unsigned int *);
extern int32_t ndmp_door_get_int32(ndmp_door_ctx_t *);
extern uint32_t ndmp_door_get_uint32(ndmp_door_ctx_t *);
extern char *ndmp_door_get_string(ndmp_door_ctx_t *);
extern void ndmp_door_put_int32(ndmp_door_ctx_t *, int32_t);
extern void ndmp_door_put_uint32(ndmp_door_ctx_t *, uint32_t);
extern void ndmp_door_put_string(ndmp_door_ctx_t *, char *);
extern void ndmp_door_free_string(char *);
extern int64_t ndmp_door_get_int64(ndmp_door_ctx_t *);
extern uint64_t ndmp_door_get_uint64(ndmp_door_ctx_t *);
extern void ndmp_door_put_uint64(ndmp_door_ctx_t *, uint64_t);
extern void ndmp_door_put_short(ndmp_door_ctx_t *, short);
extern short ndmp_door_get_short(ndmp_door_ctx_t *);
extern void ndmp_door_put_ushort(ndmp_door_ctx_t *, unsigned short);
extern unsigned short ndmp_door_get_ushort(ndmp_door_ctx_t *);
extern void ndmp_door_put_buf(ndmp_door_ctx_t *, unsigned char *, int);
extern int ndmp_door_get_buf(ndmp_door_ctx_t *, unsigned char *, int);
extern int ndmp_include_zfs(ndmp_context_t *, const char *);
extern int ndmp_iter_zfs(ndmp_context_t *, int (*)(nvlist_t *, void *), void *);
extern uint_t ndmp_context_get_version(ndmp_context_t *);
extern void ndmp_context_set_specific(ndmp_context_t *, void *);
extern void *ndmp_context_get_specific(ndmp_context_t *);
void ndmp_log_dma(ndmp_context_t *, ndmp_log_dma_type_t, const char *, ...);
#ifdef __cplusplus
}
#endif
#endif