X-Git-Url: http://dolda2000.com/gitweb/?p=doldaconnect.git;a=blobdiff_plain;f=daemon%2Ftransfer.c;h=f23a3ed50f6b05c496a1536e7f0439f36d13b746;hp=433ceb1e277c1639416599f281fb7563d06275c5;hb=1ff9e8ea002024dee061378ae5871619d6b979dd;hpb=d1ef02006f3d39a45ef40235f716c7f9317195f6 diff --git a/daemon/transfer.c b/daemon/transfer.c index 433ceb1..f23a3ed 100644 --- a/daemon/transfer.c +++ b/daemon/transfer.c @@ -126,22 +126,82 @@ struct transfer *newtransfer(void) return(new); } -void transferattach(struct transfer *transfer, struct transferiface *iface, void *data) +static void localread(struct socket *sk, struct transfer *transfer) { - if(transfer->iface != NULL) - transferdetach(transfer); - transfer->iface = iface; - transfer->ifacedata = data; + void *buf; + size_t blen; + + if((transfer->datapipe != NULL) && (sockqueueleft(transfer->datapipe) > 0)) { + buf = sockgetinbuf(sk, &blen); + sockqueue(transfer->datapipe, buf, blen); + time(&transfer->activity); + transfer->curpos += blen; + bytesupload += blen; + CBCHAINDOCB(transfer, trans_p, transfer); + } +} + +static void dataread(struct socket *sk, struct transfer *transfer) +{ + void *buf; + size_t blen; + + if((transfer->localend != NULL) && (sockqueueleft(transfer->localend) > 0)) { + buf = sockgetinbuf(sk, &blen); + sockqueue(transfer->localend, buf, blen); + transfer->curpos += blen; + bytesdownload += blen; + CBCHAINDOCB(transfer, trans_p, transfer); + } +} + +static void localwrite(struct socket *sk, struct transfer *transfer) +{ + if(transfer->datapipe != NULL) + dataread(transfer->datapipe, transfer); +} + +static void datawrite(struct socket *sk, struct transfer *transfer) +{ + if(transfer->localend != NULL) + localread(transfer->localend, transfer); +} + +static void localerr(struct socket *sk, int errno, struct transfer *transfer) +{ + if(transfer->datapipe != NULL) + closesock(transfer->datapipe); +} + +static void dataerr(struct socket *sk, int errno, struct transfer *transfer) +{ + if(transfer->curpos >= transfer->size) { + transfersetstate(transfer, TRNS_DONE); + closesock(transfer->localend); + quitsock(transfer->localend); + transfer->localend = NULL; + } else { + resettransfer(transfer); + } +} + +void transferattach(struct transfer *transfer, struct socket *dpipe) +{ + transferdetach(transfer); + getsock(transfer->datapipe = dpipe); + dpipe->readcb = (void (*)(struct socket *, void *))dataread; + dpipe->writecb = (void (*)(struct socket *, void *))datawrite; + dpipe->errcb = (void (*)(struct socket *, int, void *))dataerr; + dpipe->data = transfer; } void transferdetach(struct transfer *transfer) { - if(transfer->iface != NULL) - { - transfer->iface->detach(transfer, transfer->ifacedata); - transfer->iface = NULL; - transfer->ifacedata = NULL; + if(transfer->datapipe != NULL) { + closesock(transfer->datapipe); + quitsock(transfer->datapipe); } + transfer->datapipe = NULL; } struct transfer *finddownload(wchar_t *peerid) @@ -150,7 +210,7 @@ struct transfer *finddownload(wchar_t *peerid) for(transfer = transfers; transfer != NULL; transfer = transfer->next) { - if((transfer->dir == TRNSD_DOWN) && (transfer->iface == NULL) && !wcscmp(peerid, transfer->peerid)) + if((transfer->dir == TRNSD_DOWN) && (transfer->datapipe == NULL) && !wcscmp(peerid, transfer->peerid)) break; } return(transfer); @@ -168,7 +228,7 @@ struct transfer *hasupload(struct fnet *fnet, wchar_t *peerid) return(transfer); } -struct transfer *newupload(struct fnetnode *fn, struct fnet *fnet, wchar_t *nickid, struct transferiface *iface, void *data) +struct transfer *newupload(struct fnetnode *fn, struct fnet *fnet, wchar_t *nickid, struct socket *dpipe) { struct transfer *transfer; @@ -182,7 +242,7 @@ struct transfer *newupload(struct fnetnode *fn, struct fnet *fnet, wchar_t *nick transfer->dir = TRNSD_UP; if(fn != NULL) getfnetnode(transfer->fn = fn); - transferattach(transfer, iface, data); + transferattach(transfer, dpipe); linktransfer(transfer); bumptransfer(transfer); return(transfer); @@ -202,8 +262,7 @@ void resettransfer(struct transfer *transfer) { if(transfer->dir == TRNSD_DOWN) { - if(transfer->iface != NULL) - transferdetach(transfer); + transferdetach(transfer); killfilter(transfer); transfersetstate(transfer, TRNS_WAITING); transfersetactivity(transfer, L"reset"); @@ -232,86 +291,11 @@ static void transexpire(int cancelled, struct transfer *transfer) transfer->timeout = 0; } -static void transferread(struct socket *sk, struct transfer *transfer) -{ - if(sockgetdatalen(sk) >= 65536) - sockblock(sk, 1); - if((transfer->iface != NULL) && (transfer->iface->gotdata != NULL)) - transfer->iface->gotdata(transfer, transfer->ifacedata); -} - -static void transferwrite(struct socket *sk, struct transfer *transfer) -{ - if((transfer->iface != NULL) && (transfer->iface->wantdata != NULL)) - transfer->iface->wantdata(transfer, transfer->ifacedata); -} - -static void transfererr(struct socket *sk, int errno, struct transfer *transfer) -{ - if((transfer->iface != NULL) && (transfer->iface->endofdata != NULL)) - transfer->iface->endofdata(transfer, transfer->ifacedata); -} - -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); -} - -void transferendofdata(struct transfer *transfer) -{ - if(transfer->curpos >= transfer->size) - { - transfersetstate(transfer, TRNS_DONE); - transfer->localend->readcb = NULL; - transfer->localend->writecb = NULL; - transfer->localend->errcb = NULL; - putsock(transfer->localend); - transfer->localend = NULL; - } else { - resettransfer(transfer); - } -} - -size_t transferdatasize(struct transfer *transfer) -{ - return(sockqueuesize(transfer->localend)); -} - -void *transfergetdata(struct transfer *transfer, size_t *size) -{ - void *buf; - - if(transfer->localend == NULL) - return(NULL); - sockblock(transfer->localend, 0); - time(&transfer->activity); - if((buf = sockgetinbuf(transfer->localend, size)) == NULL) - return(NULL); - if((transfer->endpos >= 0) && (transfer->curpos + *size >= transfer->endpos)) - { - if((*size = transfer->endpos - transfer->curpos) == 0) { - free(buf); - buf = NULL; - } else { - buf = srealloc(buf, *size); - } - } - transfer->curpos += *size; - bytesupload += *size; - CBCHAINDOCB(transfer, trans_p, transfer); - return(buf); -} - void transferprepul(struct transfer *transfer, off_t size, off_t start, off_t end, struct socket *lesk) { transfersetsize(transfer, size); transfer->curpos = start; transfer->endpos = end; - sockblock(lesk, 1); transfersetlocalend(transfer, lesk); } @@ -326,7 +310,7 @@ void transferstartul(struct transfer *transfer, struct socket *sk) transfersetstate(transfer, TRNS_MAIN); socksettos(sk, confgetint("transfer", "ultos")); if(transfer->localend != NULL) - sockblock(transfer->localend, 0); + localread(transfer->localend, transfer); } void transfersetlocalend(struct transfer *transfer, struct socket *sk) @@ -335,9 +319,9 @@ void transfersetlocalend(struct transfer *transfer, struct socket *sk) putsock(transfer->localend); getsock(transfer->localend = sk); sk->data = transfer; - sk->readcb = (void (*)(struct socket *, void *))transferread; - sk->writecb = (void (*)(struct socket *, void *))transferwrite; - sk->errcb = (void (*)(struct socket *, int, void *))transfererr; + sk->readcb = (void (*)(struct socket *, void *))localread; + sk->writecb = (void (*)(struct socket *, void *))localwrite; + sk->errcb = (void (*)(struct socket *, int, void *))localerr; } static int tryreq(struct transfer *transfer) @@ -716,7 +700,7 @@ int forkfilter(struct transfer *transfer) * the fd, and thus it closes it. Until I can find out whyever the * kernel gives a POLLIN on the fd (if I can at all...), I'll just * set ignread on insock for now. */ - sockblock(insock, 1); +/* sockblock(insock, 1); */ transfer->filter = pid; transfersetlocalend(transfer, insock); getsock(transfer->filterout = outsock); @@ -734,6 +718,7 @@ static int run(void) { struct transfer *transfer, *next; + /* for(transfer = transfers; transfer != NULL; transfer = transfer->next) { if((transfer->endpos >= 0) && (transfer->state == TRNS_MAIN) && (transfer->localend != NULL) && (transfer->localend->state == SOCK_EST) && (transfer->curpos >= transfer->endpos)) @@ -743,6 +728,7 @@ static int run(void) closesock(transfer->localend); } } + */ for(transfer = transfers; transfer != NULL; transfer = next) { next = transfer->next;