sparse-tools/src/blksync.c

138 lines
2.9 KiB
C

#include <getopt.h>
#include <hash.h>
#include <blksync.h>
#include <bs_engine.h>
#include <bs_comm.h>
#include <bs_analyze.h>
#include <sys/types.h>
#include <sys/stat.h>
char sHelp[] = "usage: dsync [ -v ] [ -4 | -6 ] [ -depth | -r ] [ -s ] [ -p <port> ] [ -b <blocksize> ] <file> [ host ]\n"
"\t-h\tshow this help\n"
"\t-v\tbe verbose\n"
"\t-l\tlisten and wait for connection\n"
"\t-r\treceiver\n"
"\t-s\tsender\n"
"\t-b\tset non-default blocksize\n"
"\t-p\tuse tcp port <port> for listening or connecting\n"
"\t-4\tuse ipv4\n"
"\t-6\tuse ipv6\n"
"\t-t\ttest mode, only output block hashes\n"
;
int main_listen();
int main_connect();
int show_help(char *msg){
if (msg && strlen(msg))
fprintf(stdout, "%s\n", msg);
fprintf(stdout, sHelp);
fflush(stdout);
return 0;
}
int main(int argc, char *argv[])
{
int opt;
long _l;
bs_engine_t *engine;
if (bs_engine_create(&engine))
fatal("could not allocate engine\n", 0);
while ((opt = getopt(argc, argv, "v46lrb:p:shtdm"))>0){
switch (opt){
case 'h':
return show_help(NULL);
case 'v':
engine->tool_flags |= BS_VERBOSE;
break;
case 'l':
engine->tool_flags |= BS_LISTENER;
break;
case 'r':
engine->bs_flags |= BS_RECEIVER;
break;
case 's':
engine->bs_flags |= BS_SENDER;
break;
case '4':
engine->comm.af_family = AF_INET;
break;
case '6':
engine->comm.af_family = AF_INET6;
break;
case 'p':
_l = strtol(optarg, NULL, 0 );
if (_l > 65535)
return show_help("port must be less then 65536");
engine->comm.port = _l;
break;
case 'b':
_l = strtol(optarg, NULL, 0 );
if (_l >= (1L<<32))
return show_help("blocksize must be smaller then 1<<32\n");
engine->parameters.blocksize = _l;
break;
case 'd':
engine->tool_flags |= BS_DEBUG;
break;
case 'm':
engine->bs_flags |= BS_MERKLE;
break;
}
}
if ((engine->bs_flags & (BS_SENDER | BS_RECEIVER))==(BS_SENDER | BS_RECEIVER))
{
fprintf(stderr, "can only be receiver or sender!\n");
exit(EXIT_FAILURE);
}
if (optind >= argc)
return show_help("need a file or device to sync");
strncpy( engine->file.filename, argv[optind++], sizeof(engine->file.filename));
if (optind >= argc)
engine->tool_flags |= BS_LISTENER;
else
strncpy(engine->comm.hostname, argv[optind++], sizeof(engine->comm.hostname));
if (engine->parameters.blocksize > MAX_MSG_PAYLOAD_LENGTH){
fprintf(stderr, "maximum blocksize can be %d bytes\n", MAX_MSG_PAYLOAD_LENGTH);
exit(EXIT_FAILURE);
}
bs_comm_start(engine);
if (engine->tool_flags & BS_VERBOSE)
bs_engine_dump(engine);
while (!(engine->tool_flags & BS_SHUTDOWN)) {
sleep(1);
if (engine->state_flags & BSS_COMM)
bs_comm_send(engine, 0, NULL, 0);
}
fprintf(stderr, "shuting down, waiting for threads to quit.\n");
fflush(stderr);
bs_engine_destroy(engine);
return 0;
}