sparse-tools/include/blksync.h

120 lines
2.4 KiB
C

//
// Created by haraldwolff on 07.08.22.
//
#ifndef MKSPARSE_DSYNC_H
#define MKSPARSE_DSYNC_H
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <fcntl.h>
#include <unistd.h>
#include <stdarg.h>
#include <pthread.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
typedef enum {
SR_SENDER = (1<<8),
SR_RECEIVER = (1<<9),
SR_TEST = (1<<10)
} sr_mode_t;
typedef enum {
DS_SIMULATE = (1<<0),
DS_REVERSE = (1<<1),
DS_LISTENER = (1<<2),
DS_VERBOSE = (1<<3),
DS_DUMPBLOCKS = (1<<4),
DS_COMPRESS_BZ2 = (1<<5),
DS_HELLO = (1<<12),
DS_ACK = (1<<13)
} ds_flags_t;
typedef struct {
sr_mode_t sr_mode;
ds_flags_t ds_flags;
int listenSocket,
clientSocket;
int file;
uint64_t filesize;
int32_t blocksize;
char filename[FILENAME_MAX];
char hostname[256];
pthread_mutex_t m_file,
m_socket;
long last_offset;
long stat_blocks;
long stat_block_bytes;
time_t t_start,
t_last_update;
uint64_t *local_hashes, *remote_hashes;
} bsync_engine_t;
typedef struct {
int magic;
ds_flags_t flags;
} bs_hello_t;
static const uint32_t magic = 0xbeefcafe;
static const uint32_t version = 1;
static const uint32_t defaultBlocksize = 4096;
bsync_engine_t *create_engine();
int connect_to_host(bsync_engine_t *engine, char *hostname, int port);
int accept_connection(bsync_engine_t *engine, char *hostname, int port);
int bs_recv(int socket, void *buffer, int size);
int bs_send(int socket, const void *buffer, int size);
int read_block(bsync_engine_t *engine, long offset, char *block, int blocksize);
int write_block(bsync_engine_t *engine, long offset, char *block, int blocksize);
int bs_sender(bsync_engine_t *engine);
int bs_receiver(bsync_engine_t *engine);
int bs_test(bsync_engine_t *engine);
char* ntounit(long l, char *p);
void dump_engine(bsync_engine_t *engine);
int dump_engine_state(bsync_engine_t *engine);
static inline void assert(int r, char *msg) {
if (r < 0) {
if (msg)
fprintf(stderr, msg, r);
if (errno)
fprintf(stderr, "errno=%d %s", errno, strerror(errno));
fflush(stderr);
}
}
static inline char* format(char *msg, ...){
va_list val;
static char _msg[2048];
va_start(val, msg);
vsnprintf(_msg, sizeof(_msg), msg, val);
va_end(val);
return _msg;
}
#define assert_r(r, msg) { if (r<0) { assert(r, msg); return r; } }
#define assert_x(r, msg) { if (r<0) { assert(r, msg); exit(EXIT_FAILURE); } }
#endif //MKSPARSE_DSYNC_H