X-Git-Url: http://dolda2000.com/gitweb/?a=blobdiff_plain;f=daemon%2Ffnet-dc.c;h=df04b59f9755289cedacbd56fbbd73b50b2b521c;hb=796283c6df4713edcac9c199bf4fd26dff42c2fd;hp=d29514857587b6dd4299188dc50e9ff2a8e06171;hpb=69757b8cb02da682196de928a44dc991e07abad7;p=doldaconnect.git diff --git a/daemon/fnet-dc.c b/daemon/fnet-dc.c index d295148..df04b59 100644 --- a/daemon/fnet-dc.c +++ b/daemon/fnet-dc.c @@ -136,7 +136,7 @@ struct dcpeer int extended; int direction; /* Using the constants from transfer.h */ int compress; - int hascurpos, notthl; + int hascurpos, fetchingtthl, notthl; struct tigertreehash tth; void *cprsdata; char *key; @@ -676,6 +676,7 @@ static void requestfile(struct dcpeer *peer) sendadc(peer->sk, "0"); sendadc(peer->sk, "-1"); qstr(peer->sk, "|"); + peer->fetchingtthl = 1; return; } } @@ -1615,6 +1616,7 @@ static void startul(struct dcpeer *peer) static void cmd_filelength(struct socket *sk, struct dcpeer *peer, char *cmd, char *args) { int size; + struct transfer *transfer; if(peer->transfer == NULL) { @@ -1625,7 +1627,9 @@ static void cmd_filelength(struct socket *sk, struct dcpeer *peer, char *cmd, ch if(peer->transfer->size != size) { transfersetsize(peer->transfer, size); + transfer = peer->transfer; freedcpeer(peer); + trytransferbypeer(transfer->fnet, transfer->peerid); return; } startdl(peer); @@ -1634,6 +1638,13 @@ static void cmd_filelength(struct socket *sk, struct dcpeer *peer, char *cmd, ch static void cmd_error(struct socket *sk, struct dcpeer *peer, char *cmd, char *args) { + if(peer->fetchingtthl) + { + peer->fetchingtthl = 0; + peer->notthl = 1; + requestfile(peer); + return; + } if((peer->transfer != NULL) && (peer->transfer->dir == TRNSD_DOWN)) { transferseterror(peer->transfer, TRNSE_NOTFOUND); @@ -2141,6 +2152,7 @@ static void cmd_adcsnd(struct socket *sk, struct dcpeer *peer, char *cmd, char * peer->state = PEER_TTHL; peer->totalsize = numbytes; peer->curread = 0; + peer->fetchingtthl = 0; inittigertree(&peer->tth); handletthl(peer); } else if(!strcmp(argv[0], "file")) {