X-Git-Url: http://dolda2000.com/gitweb/?a=blobdiff_plain;f=daemon%2Ftransfer.c;h=1863e7462270ab2d13c736e812f98bb301fc7656;hb=1c5e71ff5eb6058d1729e43cc22167b799c99bed;hp=b713f52e571c889190c93db79afe95057fb0d0e9;hpb=bd5d862e9745b6fb3c67ccb215c0e6aaa65bacf9;p=doldaconnect.git diff --git a/daemon/transfer.c b/daemon/transfer.c index b713f52..1863e74 100644 --- a/daemon/transfer.c +++ b/daemon/transfer.c @@ -130,16 +130,22 @@ static void localread(struct socket *sk, struct transfer *transfer) { void *buf; size_t blen; + off_t curpos; if((transfer->datapipe != NULL) && (sockqueueleft(transfer->datapipe) > 0)) { buf = sockgetinbuf(sk, &blen); - if((transfer->endpos >= 0) && (transfer->curpos + blen > transfer->endpos)) - blen = transfer->endpos - transfer->curpos; + if((transfer->endpos >= 0) && (transfer->localpos + blen > transfer->endpos)) + blen = transfer->endpos - transfer->localpos; sockqueue(transfer->datapipe, buf, blen); free(buf); time(&transfer->activity); - transfer->curpos += blen; + transfer->localpos += blen; bytesupload += blen; + } + if((curpos = transfer->localpos - socktqueuesize(transfer->datapipe)) < 0) + curpos = 0; + if(curpos != transfer->curpos) { + transfer->curpos = curpos; CBCHAINDOCB(transfer, trans_p, transfer); } } @@ -181,15 +187,19 @@ static void localerr(struct socket *sk, int errno, struct transfer *transfer) static void dataerr(struct socket *sk, int errno, struct transfer *transfer) { - if(transfer->curpos >= transfer->size) { - transfersetstate(transfer, TRNS_DONE); - if(transfer->localend != NULL) { - closesock(transfer->localend); - quitsock(transfer->localend); - transfer->localend = NULL; + if(transfer->dir == TRNSD_DOWN) { + if(transfer->curpos >= transfer->size) { + transfersetstate(transfer, TRNS_DONE); + if(transfer->localend != NULL) { + closesock(transfer->localend); + quitsock(transfer->localend); + transfer->localend = NULL; + } + } else { + resettransfer(transfer); } - } else { - resettransfer(transfer); + } else if(transfer->dir == TRNSD_UP) { + transfer->close = 1; } } @@ -302,7 +312,7 @@ static void transexpire(int cancelled, struct transfer *transfer) void transferprepul(struct transfer *transfer, off_t size, off_t start, off_t end, struct socket *lesk) { transfersetsize(transfer, size); - transfer->curpos = start; + transfer->curpos = transfer->localpos = start; transfer->endpos = end; transfersetlocalend(transfer, lesk); } @@ -325,7 +335,6 @@ void transfersetlocalend(struct transfer *transfer, struct socket *sk) { if(transfer->localend != NULL) putsock(transfer->localend); - socksetdebug(sk, 2, "localend"); getsock(transfer->localend = sk); sk->data = transfer; sk->readcb = (void (*)(struct socket *, void *))localread;