138 lines
2.9 KiB
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;
|
|
}
|
|
|
|
|
|
|
|
|