#ifndef _RSYNC_H
# define _RSYNC_H
# include <stdio.h>
# include <stdint.h>
# include <time.h>
# include "librsync_export.h"
# ifdef __cplusplus
extern "C" {
# endif
LIBRSYNC_EXPORT extern char const rs_librsync_version[];
typedef uint8_t rs_byte_t;
typedef intmax_t rs_long_t;
typedef enum {
RS_DELTA_MAGIC = 0x72730236,
RS_MD4_SIG_MAGIC = 0x72730136,
RS_BLAKE2_SIG_MAGIC = 0x72730137,
RS_RK_MD4_SIG_MAGIC = 0x72730146,
RS_RK_BLAKE2_SIG_MAGIC = 0x72730147,
} rs_magic_number;
typedef enum {
RS_LOG_EMERG = 0,
RS_LOG_ALERT = 1,
RS_LOG_CRIT = 2,
RS_LOG_ERR = 3,
RS_LOG_WARNING = 4,
RS_LOG_NOTICE = 5,
RS_LOG_INFO = 6,
RS_LOG_DEBUG = 7
} rs_loglevel;
typedef void rs_trace_fn_t(rs_loglevel level, char const *msg);
LIBRSYNC_EXPORT void rs_trace_set_level(rs_loglevel level);
LIBRSYNC_EXPORT void rs_trace_to(rs_trace_fn_t *);
LIBRSYNC_EXPORT void rs_trace_stderr(rs_loglevel level, char const *msg);
LIBRSYNC_EXPORT int rs_supports_trace(void);
LIBRSYNC_EXPORT void rs_hexify(char *to_buf, void const *from_buf,
int from_len);
LIBRSYNC_EXPORT size_t rs_unbase64(char *s);
LIBRSYNC_EXPORT void rs_base64(unsigned char const *buf, int n, char *out);
typedef enum rs_result {
RS_DONE = 0,
RS_BLOCKED = 1,
RS_RUNNING = 2,
RS_TEST_SKIPPED = 77,
RS_IO_ERROR = 100,
RS_SYNTAX_ERROR = 101,
RS_MEM_ERROR = 102,
RS_INPUT_ENDED = 103,
RS_BAD_MAGIC = 104,
RS_UNIMPLEMENTED = 105,
RS_CORRUPT = 106,
RS_INTERNAL_ERROR = 107,
RS_PARAM_ERROR = 108
} rs_result;
LIBRSYNC_EXPORT char const *rs_strerror(rs_result r);
typedef struct rs_stats {
char const *op;
int lit_cmds;
rs_long_t lit_bytes;
rs_long_t lit_cmdbytes;
rs_long_t copy_cmds, copy_bytes, copy_cmdbytes;
rs_long_t sig_cmds, sig_bytes;
int false_matches;
rs_long_t sig_blocks;
size_t block_len;
rs_long_t in_bytes;
rs_long_t out_bytes;
time_t start, end;
} rs_stats_t;
typedef struct rs_mdfour rs_mdfour_t;
LIBRSYNC_EXPORT extern const int RS_MD4_SUM_LENGTH, RS_BLAKE2_SUM_LENGTH;
# define RS_MAX_STRONG_SUM_LENGTH 32
typedef uint32_t rs_weak_sum_t;
typedef unsigned char rs_strong_sum_t[RS_MAX_STRONG_SUM_LENGTH];
LIBRSYNC_EXPORT void rs_mdfour(unsigned char *out, void const *in, size_t);
LIBRSYNC_EXPORT void rs_mdfour_begin( rs_mdfour_t *md);
LIBRSYNC_EXPORT void rs_mdfour_update(rs_mdfour_t *md, void const *in_void,
size_t n);
LIBRSYNC_EXPORT void rs_mdfour_result(rs_mdfour_t *md, unsigned char *out);
LIBRSYNC_EXPORT char *rs_format_stats(rs_stats_t const *stats, char *buf,
size_t size);
LIBRSYNC_EXPORT int rs_log_stats(rs_stats_t const *stats);
typedef struct rs_signature rs_signature_t;
LIBRSYNC_EXPORT void rs_signature_log_stats(rs_signature_t const *sig);
LIBRSYNC_EXPORT void rs_free_sumset(rs_signature_t *);
LIBRSYNC_EXPORT void rs_sumset_dump(rs_signature_t const *);
struct rs_buffers_s {
char *next_in;
size_t avail_in;
int eof_in;
char *next_out;
size_t avail_out;
};
typedef struct rs_buffers_s rs_buffers_t;
# define RS_DEFAULT_BLOCK_LEN 2048
typedef struct rs_job rs_job_t;
LIBRSYNC_EXPORT rs_result rs_job_iter(rs_job_t *job, rs_buffers_t *buffers);
typedef rs_result rs_driven_cb(rs_job_t *job, rs_buffers_t *buf,
void *opaque);
LIBRSYNC_EXPORT rs_result rs_job_drive(rs_job_t *job, rs_buffers_t *buf,
rs_driven_cb in_cb, void *in_opaque,
rs_driven_cb out_cb, void *out_opaque);
LIBRSYNC_EXPORT const rs_stats_t *rs_job_statistics(rs_job_t *job);
LIBRSYNC_EXPORT rs_result rs_job_free(rs_job_t *);
LIBRSYNC_EXPORT rs_job_t *rs_sig_begin(size_t new_block_len,
size_t strong_sum_len,
rs_magic_number sig_magic);
LIBRSYNC_EXPORT rs_job_t *rs_delta_begin(rs_signature_t *);
LIBRSYNC_EXPORT rs_job_t *rs_loadsig_begin(rs_signature_t **);
LIBRSYNC_EXPORT rs_result rs_build_hash_table(rs_signature_t *sums);
typedef rs_result rs_copy_cb(void *opaque, rs_long_t pos, size_t *len,
void **buf);
LIBRSYNC_EXPORT rs_job_t *rs_patch_begin(rs_copy_cb * copy_cb, void *copy_arg);
# ifndef RSYNC_NO_STDIO_INTERFACE
# include <stdio.h>
LIBRSYNC_EXPORT FILE *rs_file_open(char const *filename, char const *mode,
int force);
LIBRSYNC_EXPORT int rs_file_close(FILE *file);
LIBRSYNC_EXPORT rs_long_t rs_file_size(FILE *file);
LIBRSYNC_EXPORT rs_result rs_file_copy_cb(void *arg, rs_long_t pos, size_t *len,
void **buf);
LIBRSYNC_EXPORT extern int rs_inbuflen, rs_outbuflen;
LIBRSYNC_EXPORT rs_result rs_sig_file(FILE *old_file, FILE *sig_file,
size_t block_len, size_t strong_len,
rs_magic_number sig_magic,
rs_stats_t *stats);
LIBRSYNC_EXPORT rs_result rs_loadsig_file(FILE *sig_file,
rs_signature_t **sumset,
rs_stats_t *stats);
LIBRSYNC_EXPORT rs_result rs_delta_file(rs_signature_t *, FILE *new_file,
FILE *delta_file, rs_stats_t *);
LIBRSYNC_EXPORT rs_result rs_patch_file(FILE *basis_file, FILE *delta_file,
FILE *new_file, rs_stats_t *);
# endif
# ifdef __cplusplus
}
# endif
#endif