summaryrefslogtreecommitdiffstats
path: root/src/core.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/core.c')
-rw-r--r--src/core.c25
1 files changed, 22 insertions, 3 deletions
diff --git a/src/core.c b/src/core.c
index 688f059..ff471cc 100644
--- a/src/core.c
+++ b/src/core.c
@@ -352,6 +352,21 @@ void tip_client_pending(struct tip_client *cli)
cli->state = TIP_CLIENT_PENDING;
}
+static bool tip_direct_download_in_progress(const struct tip_client *cli)
+{
+ struct tip_client *this;
+
+ list_for_each_entry(this, &client_list, list) {
+ if (cli->addr.sin_addr.s_addr == this->addr.sin_addr.s_addr)
+ continue;
+ if (cli->state != TIP_CLIENT_PENDING &&
+ !strcmp(cli->path, this->path))
+ return true;
+ }
+
+ return false;
+}
+
void tip_client_activate_pending(bool redirect_only)
{
struct tip_client *cli, *next;
@@ -361,9 +376,13 @@ void tip_client_activate_pending(bool redirect_only)
if (cli->state != TIP_CLIENT_PENDING)
continue;
redirected = tip_client_redirect(cli);
- if (!redirected && redirect_only)
- continue;
-
+ if (!redirected) {
+ if (redirect_only)
+ continue;
+ /* another client is fetching this file from server, skip. */
+ if (tip_direct_download_in_progress(cli))
+ continue;
+ }
ev_io_set(&cli->io, tip_client_socket(cli), EV_READ | EV_WRITE);
ev_io_start(tip_main_loop, &cli->io);
ev_timer_again(tip_main_loop, &cli->timer);