clean up state on each retry

Reset the client object after retrying connection to download file.
master
tiptorrent development team 2022-02-08 16:19:01 +01:00
parent 93c13ba67c
commit ace36ad510
1 changed files with 12 additions and 9 deletions

View File

@ -525,6 +525,14 @@ static uint32_t select_file_chunk(bool *file_chunk)
return k;
}
static void tip_client_reset_state(struct tip_client *cli, int fd,
uint64_t chunk_offset)
{
memset(cli, 0, sizeof(*cli));
cli->chunk_offset = chunk_offset;
cli->fd = fd;
}
static char _filename[PATH_MAX + 1];
int main(int argc, char *argv[])
@ -551,6 +559,7 @@ int main(int argc, char *argv[])
do {
filename = argv[2];
memset(&_cli, 0, sizeof(_cli));
_cli.state = TIP_CLIENT_HEAD_HEADER;
ret = tip_client_request_file(&_cli, addr, filename);
} while (ret > 0);
@ -565,28 +574,22 @@ int main(int argc, char *argv[])
file_size = _cli.content_len;
for (i = 0; i < MAX_CHUNKS; i++) {
memset(&_cli, 0, sizeof(_cli));
k = select_file_chunk(file_chunk);
snprintf(_filename, sizeof(_filename), "%s.%u", argv[2], k);
filename = _filename;
chunk_size = file_size / MAX_CHUNKS;
_cli.chunk_offset = chunk_size * k;
_cli.fd = fd;
do {
tip_client_reset_state(&_cli, fd, chunk_size * k);
syslog(LOG_INFO, "Requesting file %s to server\n", filename);
_cli.state = TIP_CLIENT_GET_HEADER;
ret = tip_client_request_file(&_cli, addr, filename);
} while (ret > 0);
if (ret < 0) {
memset(&_cli, 0, sizeof(_cli));
_cli.chunk_offset = chunk_size * k;
_cli.fd = fd;
_cli.server_only = true;
do {
tip_client_reset_state(&_cli, fd, chunk_size * k);
_cli.server_only = true;
syslog(LOG_INFO, "Requesting file %s to server only\n", filename);
_cli.state = TIP_CLIENT_GET_HEADER;
ret = tip_client_request_file(&_cli, addr, filename);