add tip_client_run()
parent
9d13b48925
commit
d4753d6c3e
72
src/main.c
72
src/main.c
|
@ -126,7 +126,7 @@ static void tip_client_progress(struct tip_client *cli, bool now)
|
|||
}
|
||||
}
|
||||
|
||||
static int tip_client_connect(const char *addr);
|
||||
static int tip_client_connect(struct tip_client *cli, const char *addr);
|
||||
|
||||
static int tip_client_get_hdr(struct tip_client *cli)
|
||||
{
|
||||
|
@ -165,7 +165,7 @@ static int tip_client_get_hdr(struct tip_client *cli)
|
|||
|
||||
cli->redirected = true;
|
||||
tip_client_close(cli);
|
||||
tip_client_connect(redirect_addr);
|
||||
tip_client_connect(cli, redirect_addr);
|
||||
cli->state = TIP_CLIENT_GET_HEADER;
|
||||
|
||||
return 0;
|
||||
|
@ -230,7 +230,7 @@ static int tip_client_get_payload(struct tip_client *cli)
|
|||
if (cli->data_len >= cli->content_len) {
|
||||
if (cli->redirected) {
|
||||
tip_client_close(cli);
|
||||
tip_client_connect(addr);
|
||||
tip_client_connect(cli, addr);
|
||||
cli->state = TIP_CLIENT_POST_REDIRECT;
|
||||
|
||||
return 1;
|
||||
|
@ -444,11 +444,10 @@ static void tip_client_connect_cb(struct ev_loop *loop, struct ev_io *io, int ev
|
|||
#define TIP_TCP_KEEPALIVE_INTL 30
|
||||
#define TIP_TCP_KEEPALIVE_CNT 4
|
||||
|
||||
static int tip_client_connect(const char *addr)
|
||||
static int tip_client_connect(struct tip_client *cli, const char *addr)
|
||||
{
|
||||
int intl = TIP_TCP_KEEPALIVE_INTL, cnt = TIP_TCP_KEEPALIVE_CNT;
|
||||
int on = 1, idle = TIP_TCP_KEEPALIVE_IDLE;
|
||||
struct tip_client *cli = &_cli;
|
||||
int remote_fd;
|
||||
int flags;
|
||||
int len;
|
||||
|
@ -497,7 +496,7 @@ static int tip_client_connect(const char *addr)
|
|||
static int tip_client_request_file(struct tip_client *cli,
|
||||
const char *server, const char *filename)
|
||||
{
|
||||
tip_client_connect(server);
|
||||
tip_client_connect(cli, server);
|
||||
|
||||
while (cli->state != TIP_CLIENT_DONE && !cli->error)
|
||||
ev_loop(tip_main_loop, 0);
|
||||
|
@ -555,6 +554,42 @@ static void tip_client_reset_state(struct tip_client *cli, int fd,
|
|||
cli->num_retries = num_retries;
|
||||
}
|
||||
|
||||
static int tip_client_run(struct tip_client *cli, int fd, const char *addr,
|
||||
const char *filename, uint32_t chunk,
|
||||
uint64_t chunk_size)
|
||||
{
|
||||
int ret;
|
||||
|
||||
do {
|
||||
tip_client_reset_state(cli, fd, chunk_size * chunk);
|
||||
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) {
|
||||
do {
|
||||
tip_client_reset_state(cli, fd, chunk_size * chunk);
|
||||
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);
|
||||
} while (ret > 0);
|
||||
}
|
||||
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
if (cli->redirected)
|
||||
tip_client_stats.redirects++;
|
||||
else
|
||||
tip_client_stats.direct_from_server++;
|
||||
|
||||
tip_client_progress(cli, true);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static char _filename[PATH_MAX + 1];
|
||||
|
||||
int main(int argc, char *argv[])
|
||||
|
@ -598,32 +633,9 @@ int main(int argc, char *argv[])
|
|||
filename = _filename;
|
||||
chunk_size = file_size / MAX_CHUNKS;
|
||||
|
||||
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) {
|
||||
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);
|
||||
} while (ret > 0);
|
||||
}
|
||||
|
||||
if (ret < 0)
|
||||
if (tip_client_run(&_cli, fd, addr, filename, k, chunk_size) < 0)
|
||||
goto err_bailout;
|
||||
|
||||
if (_cli.redirected)
|
||||
tip_client_stats.redirects++;
|
||||
else
|
||||
tip_client_stats.direct_from_server++;
|
||||
|
||||
tip_client_progress(&_cli, true);
|
||||
file_chunk[k] = true;
|
||||
data_len += _cli.data_len;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue