Truncate the calculated transfer curpos when reading local file data.
[doldaconnect.git] / daemon / transfer.c
index 893953d..1863e74 100644 (file)
@@ -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);
 }