120 lines
2.4 KiB
C
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
|