X-Git-Url: http://git.dolda2000.com/gitweb/?a=blobdiff_plain;f=daemon%2Ftransfer.c;h=ab862a2bab8a8c30bdac2703ecb3307eadc10aaf;hb=7a5e9d410f5649769f58848870995b035bebecc0;hp=d335b643fa6cc0de937f2be3f2264ba047829816;hpb=082b041947457f1ac5aee7c0ed0dc8ffe477b961;p=doldaconnect.git diff --git a/daemon/transfer.c b/daemon/transfer.c index d335b64..ab862a2 100644 --- a/daemon/transfer.c +++ b/daemon/transfer.c @@ -40,14 +40,14 @@ static void killfilter(struct transfer *transfer); +unsigned long long bytesupload = 0; +unsigned long long bytesdownload = 0; struct transfer *transfers = NULL; int numtransfers = 0; GCBCHAIN(newtransfercb, struct transfer *); void freetransfer(struct transfer *transfer) { - struct transarg *ta; - if(transfer == transfers) transfers = transfer->next; if(transfer->next != NULL) @@ -60,13 +60,8 @@ void freetransfer(struct transfer *transfer) CBCHAINFREE(transfer, trans_p); CBCHAINFREE(transfer, trans_destroy); CBCHAINFREE(transfer, trans_filterout); - while((ta = transfer->args) != NULL) - { - transfer->args = ta->next; - free(ta->rec); - free(ta->val); - free(ta); - } + while(transfer->args != NULL) + freewcspair(transfer->args, &transfer->args); if(transfer->filter != -1) killfilter(transfer); if(transfer->etimer != NULL) @@ -128,17 +123,6 @@ struct transfer *newtransfer(void) return(new); } -void transferaddarg(struct transfer *transfer, wchar_t *rec, wchar_t *val) -{ - struct transarg *ta; - - ta = smalloc(sizeof(*ta)); - ta->rec = swcsdup(rec); - ta->val = swcsdup(val); - ta->next = transfer->args; - transfer->args = ta; -} - void transferattach(struct transfer *transfer, struct transferiface *iface, void *data) { if(transfer->iface != NULL) @@ -258,6 +242,7 @@ void transferputdata(struct transfer *transfer, void *buf, size_t size) time(&transfer->activity); sockqueue(transfer->localend, buf, size); transfer->curpos += size; + bytesdownload += size; CBCHAINDOCB(transfer, trans_p, transfer); } @@ -297,6 +282,7 @@ void *transfergetdata(struct transfer *transfer, size_t *size) buf = srealloc(buf, *size); } transfer->curpos += *size; + bytesupload += *size; CBCHAINDOCB(transfer, trans_p, transfer); return(buf); } @@ -335,14 +321,59 @@ void transfersetlocalend(struct transfer *transfer, struct socket *sk) sk->errcb = (void (*)(struct socket *, int, void *))transfererr; } -void bumptransfer(struct transfer *transfer) +static int tryreq(struct transfer *transfer) { struct fnetnode *fn; struct fnetpeer *peer; + + if((fn = transfer->fn) != NULL) + { + if(fn->state != FNN_EST) + { + transfer->close = 1; + return(1); + } + peer = fnetfindpeer(fn, transfer->peerid); + } else { + peer = NULL; + for(fn = fnetnodes; fn != NULL; fn = fn->next) + { + if((fn->state == FNN_EST) && (fn->fnet == transfer->fnet) && ((peer = fnetfindpeer(fn, transfer->peerid)) != NULL)) + break; + } + } + if(peer != NULL) + { + time(&transfer->lastreq); + return(fn->fnet->reqconn(peer)); + } + return(1); +} + +void trytransferbypeer(struct fnet *fnet, wchar_t *peerid) +{ + struct transfer *transfer; + + for(transfer = transfers; transfer != NULL; transfer = transfer->next) + { + if((transfer->dir == TRNSD_DOWN) && (transfer->state == TRNS_WAITING)) + { + if((transfer->fnet == fnet) && !wcscmp(transfer->peerid, peerid)) + { + if(!tryreq(transfer)) + return; + } + } + } +} + +void bumptransfer(struct transfer *transfer) +{ time_t now; if((now = time(NULL)) < transfer->timeout) { + if(transfer->etimer == NULL) transfer->etimer = timercallback(transfer->timeout, (void (*)(int, void *))transexpire, transfer); return; @@ -352,32 +383,9 @@ void bumptransfer(struct transfer *transfer) switch(transfer->state) { case TRNS_WAITING: - if(transfer->fn != NULL) - { - fn = transfer->fn; - if(fn->state != FNN_EST) - { - transfer->close = 1; - return; - } - peer = fnetfindpeer(fn, transfer->peerid); - } else { - peer = NULL; - for(fn = fnetnodes; fn != NULL; fn = fn->next) - { - if((fn->state == FNN_EST) && (fn->fnet == transfer->fnet) && ((peer = fnetfindpeer(fn, transfer->peerid)) != NULL)) - break; - } - } transfer->etimer = timercallback(transfer->timeout = (time(NULL) + 30), (void (*)(int, void *))transexpire, transfer); if(now - transfer->lastreq > 30) - { - if(peer != NULL) - { - fn->fnet->reqconn(peer); - time(&transfer->lastreq); - } - } + tryreq(transfer); break; case TRNS_HS: if(transfer->dir == TRNSD_UP) @@ -608,6 +616,7 @@ static void filterexit(pid_t pid, int status, void *data) } else { freetransfer(transfer); } + trytransferbypeer(transfer->fnet, transfer->peerid); break; } } @@ -623,7 +632,7 @@ int forkfilter(struct transfer *transfer) char **argv; size_t argvsize, argvdata; struct socket *insock, *outsock; - struct transarg *ta; + struct wcspair *ta; char *rec, *val; wfilename = transfer->path; @@ -697,7 +706,7 @@ int forkfilter(struct transfer *transfer) } for(ta = transfer->args; ta != NULL; ta = ta->next) { - if((rec = icwcstombs(ta->rec, NULL)) == NULL) + if((rec = icwcstombs(ta->key, NULL)) == NULL) continue; if((val = icwcstombs(ta->val, NULL)) == NULL) continue;