#ifndef _TLM_BUFFERS_H_
#define _TLM_BUFFERS_H_
#include <sys/types.h>
#include <stdlib.h>
#include <limits.h>
#include <sys/stat.h>
#include <thread.h>
#include "tlm.h"
#ifndef RECORDSIZE
#define RECORDSIZE 512
#endif
#define DOTDOT_DIR ".."
#define IS_DOTDOT(s) (strcmp(s, DOTDOT_DIR) == 0)
#define SLASH '/'
#define NDMP_MAX_SELECTIONS 64
#define EXCL_PROC "/proc"
#define EXCL_TMP "/tmp"
typedef struct tlm_buffer {
char *tb_buffer_data;
long tb_buffer_size;
long tb_buffer_spot;
longlong_t tb_seek_spot;
longlong_t tb_file_size;
long tb_full : 1,
tb_eot : 1,
tb_eof : 1;
int tb_errno;
} tlm_buffer_t;
#define TLM_BUF_IN_READY 0x00000001
#define TLM_BUF_OUT_READY 0x00000002
typedef struct tlm_buffers {
int tbs_ref;
short tbs_buffer_in;
short tbs_buffer_out;
mutex_t tbs_mtx;
cond_t tbs_in_cv;
cond_t tbs_out_cv;
uint32_t tbs_flags;
long tbs_data_transfer_size;
longlong_t tbs_offset;
tlm_buffer_t tbs_buffer[TLM_TAPE_BUFFERS];
} tlm_buffers_t;
typedef struct tlm_cmd {
int tc_ref;
mutex_t tc_mtx;
cond_t tc_cv;
uint32_t tc_flags;
int tc_reader;
int tc_writer;
char tc_file_name[TLM_MAX_PATH_NAME];
tlm_buffers_t *tc_buffers;
} tlm_cmd_t;
typedef struct tlm_commands {
int tcs_reader;
int tcs_writer;
int tcs_reader_count;
int tcs_writer_count;
int tcs_error;
char tcs_message[TLM_LINE_SIZE];
tlm_cmd_t *tcs_command;
} tlm_commands_t;
typedef struct tlm_job_stats {
char js_job_name[TLM_MAX_BACKUP_JOB_NAME];
longlong_t js_bytes_total;
longlong_t js_bytes_in_file;
longlong_t js_files_so_far;
longlong_t js_files_total;
int js_errors;
time_t js_start_time;
time_t js_start_ltime;
time_t js_stop_time;
time_t js_chkpnt_time;
void *js_callbacks;
} tlm_job_stats_t;
struct full_dir_info {
fs_fhandle_t fd_dir_fh;
char fd_dir_name[TLM_MAX_PATH_NAME];
};
typedef struct lbr_fhlog_call_backs {
void *fh_cookie;
int (*fh_logpname)();
int (*fh_log_dir)();
int (*fh_log_node)();
} lbr_fhlog_call_backs_t;
typedef struct bk_selector {
void *bs_cookie;
int bs_level;
int bs_ldate;
boolean_t (*bs_fn)(struct bk_selector *bks, struct stat64 *s);
} bk_selector_t;
struct rs_name_maker;
typedef char *(*rsm_fp_t)(struct rs_name_maker *,
char *buf,
int pos,
char *path);
struct rs_name_maker {
rsm_fp_t rn_fp;
void *rn_nlp;
};
#define RSFLG_OVR_ALWAYS 0x00000001
#define RSFLG_OVR_NEVER 0x00000002
#define RSFLG_OVR_UPDATE 0x00000004
#define RSFLG_MATCH_WCARD 0x00000008
#define RSFLG_IGNORE_CASE 0x00000010
#define PM_NONE 0
#define PM_EXACT 1
#define PM_PARENT 2
#define PM_CHILD 3
extern tlm_job_stats_t *tlm_new_job_stats(char *);
extern tlm_job_stats_t *tlm_ref_job_stats(char *);
extern void tlm_un_ref_job_stats(char *);
extern boolean_t tlm_is_excluded(char *, char *, char **);
extern char *tlm_build_snapshot_name(char *, char *, char *);
extern char *tlm_remove_checkpoint(char *, char *);
extern tlm_buffers_t *tlm_allocate_buffers(boolean_t, long);
extern tlm_buffer_t *tlm_buffer_advance_in_idx(tlm_buffers_t *);
extern tlm_buffer_t *tlm_buffer_advance_out_idx(tlm_buffers_t *);
extern tlm_buffer_t *tlm_buffer_in_buf(tlm_buffers_t *, int *);
extern tlm_buffer_t *tlm_buffer_out_buf(tlm_buffers_t *, int *);
extern void tlm_buffer_mark_empty(tlm_buffer_t *);
extern void tlm_buffer_release_in_buf(tlm_buffers_t *);
extern void tlm_buffer_release_out_buf(tlm_buffers_t *);
extern void tlm_buffer_in_buf_wait(tlm_buffers_t *);
extern void tlm_buffer_out_buf_wait(tlm_buffers_t *);
extern void tlm_buffer_in_buf_timed_wait(tlm_buffers_t *, unsigned);
extern void tlm_buffer_out_buf_timed_wait(tlm_buffers_t *, unsigned);
extern char *tlm_get_write_buffer(long, long *, tlm_buffers_t *, int);
extern char *tlm_get_read_buffer(int, int *, tlm_buffers_t *, int *);
extern void tlm_unget_read_buffer(tlm_buffers_t *, int);
extern void tlm_unget_write_buffer(tlm_buffers_t *, int);
extern void tlm_release_buffers(tlm_buffers_t *);
extern tlm_cmd_t *tlm_create_reader_writer_ipc(boolean_t, long);
extern void tlm_release_reader_writer_ipc(tlm_cmd_t *);
extern void tlm_cmd_wait(tlm_cmd_t *, uint32_t);
extern void tlm_cmd_signal(tlm_cmd_t *, uint32_t);
typedef int (*path_hist_func_t)(lbr_fhlog_call_backs_t *,
char *,
struct stat64 *,
u_longlong_t);
typedef int (*dir_hist_func_t)(lbr_fhlog_call_backs_t *,
char *,
struct stat64 *);
typedef int (*node_hist_func_t)(lbr_fhlog_call_backs_t *,
char *,
char *,
struct stat64 *,
u_longlong_t);
lbr_fhlog_call_backs_t *lbrlog_callbacks_init(void *,
path_hist_func_t,
dir_hist_func_t,
node_hist_func_t);
typedef struct {
tlm_commands_t *ba_commands;
tlm_cmd_t *ba_cmd;
char *ba_job;
char *ba_dir;
char *ba_sels[NDMP_MAX_SELECTIONS];
pthread_barrier_t ba_barrier;
} tlm_backup_restore_arg_t;
extern void lbrlog_callbacks_done(lbr_fhlog_call_backs_t *);
extern boolean_t tlm_cat_path(char *, char *, char *);
extern char *trim_name(char *);
extern struct full_dir_info *dup_dir_info(struct full_dir_info *);
extern void write_tar_eof(tlm_cmd_t *);
extern int tlm_get_chkpnt_time(char *, int, time_t *, char *);
extern struct full_dir_info *tlm_new_dir_info(fs_fhandle_t *,
char *,
char *);
extern void tlm_release_list(char **);
extern longlong_t tlm_get_data_offset(tlm_cmd_t *);
extern int tlm_tarhdr_size(void);
#endif