From: Fredrik Tolf Date: Fri, 21 Mar 2008 20:30:19 +0000 (+0100) Subject: Merge branch 'socket' into transsock X-Git-Tag: 1.3~21 X-Git-Url: http://git.dolda2000.com/gitweb/?p=doldaconnect.git;a=commitdiff_plain;h=96be906d7e4bf2bfa84a926e1b1b149cdd708021;hp=-c Merge branch 'socket' into transsock Conflicts: daemon/transfer.c daemon/transfer.h --- 96be906d7e4bf2bfa84a926e1b1b149cdd708021 diff --combined daemon/transfer.c index 26b9588,1e674e6..9ad6efe --- a/daemon/transfer.c +++ b/daemon/transfer.c @@@ -126,19 -126,22 +126,19 @@@ struct transfer *newtransfer(void return(new); } -void transferattach(struct transfer *transfer, struct transferiface *iface, void *data) +void transferattach(struct transfer *transfer, struct socket *dpipe) { - if(transfer->iface != NULL) - transferdetach(transfer); - transfer->iface = iface; - transfer->ifacedata = data; + transferdetach(transfer); + getsock(transfer->datapipe = dpipe); } 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); + putsock(transfer->datapipe); } + transfer->datapipe = NULL; } struct transfer *finddownload(wchar_t *peerid) @@@ -147,7 -150,7 +147,7 @@@ 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); @@@ -165,7 -168,7 +165,7 @@@ struct transfer *hasupload(struct fnet 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; @@@ -179,7 -182,7 +179,7 @@@ transfer->dir = TRNSD_UP; if(fn != NULL) getfnetnode(transfer->fn = fn); - transferattach(transfer, iface, data); + transferattach(transfer, dpipe); linktransfer(transfer); bumptransfer(transfer); return(transfer); @@@ -199,7 -202,8 +199,7 @@@ void resettransfer(struct transfer *tra { if(transfer->dir == TRNSD_DOWN) { - if(transfer->iface != NULL) - transferdetach(transfer); + transferdetach(transfer); killfilter(transfer); transfersetstate(transfer, TRNS_WAITING); transfersetactivity(transfer, L"reset"); @@@ -228,33 -232,19 +228,33 @@@ static void transexpire(int cancelled, transfer->timeout = 0; } -static void transferread(struct socket *sk, struct transfer *transfer) +static void localread(struct socket *sk, struct transfer *transfer) { - if((sockgetdatalen(sk) > 0) && (transfer->iface != NULL) && (transfer->iface->gotdata != NULL)) - transfer->iface->gotdata(transfer, transfer->ifacedata); + void *buf; + size_t blen; + + if(transfer->datapipe != NULL) { + buf = sockgetinbuf(sk, &blen); + sockqueue(transfer->datapipe, buf, blen); + if(sockqueuesize(transfer->datapipe) >= 65536) + sockblock(sk, 1); + else + sockblock(sk, 0); + } else { + if(sockgetdatalen(sk) >= 65536) + sockblock(sk, 1); + } } -static void transferwrite(struct socket *sk, struct transfer *transfer) +static void localwrite(struct socket *sk, struct transfer *transfer) { - if((transfer->iface != NULL) && (transfer->iface->wantdata != NULL)) - transfer->iface->wantdata(transfer, transfer->ifacedata); + void *buf; + size_t blen; + + } -static void transfererr(struct socket *sk, int errno, struct transfer *transfer) +static void localerr(struct socket *sk, int errno, struct transfer *transfer) { if((transfer->iface != NULL) && (transfer->iface->endofdata != NULL)) transfer->iface->endofdata(transfer, transfer->ifacedata); @@@ -284,9 -274,9 +284,9 @@@ void transferendofdata(struct transfer } } - size_t transferdatasize(struct transfer *transfer) + ssize_t transferdatasize(struct transfer *transfer) { - return(sockqueuesize(transfer->localend)); + return(sockqueueleft(transfer->localend)); } void *transfergetdata(struct transfer *transfer, size_t *size) @@@ -295,7 -285,6 +295,6 @@@ if(transfer->localend == NULL) return(NULL); - sockblock(transfer->localend, 0); time(&transfer->activity); if((buf = sockgetinbuf(transfer->localend, size)) == NULL) return(NULL); @@@ -319,7 -308,6 +318,6 @@@ void transferprepul(struct transfer *tr transfersetsize(transfer, size); transfer->curpos = start; transfer->endpos = end; - sockblock(lesk, 1); transfersetlocalend(transfer, lesk); } @@@ -334,7 -322,7 +332,7 @@@ void transferstartul(struct transfer *t transfersetstate(transfer, TRNS_MAIN); socksettos(sk, confgetint("transfer", "ultos")); if(transfer->localend != NULL) - sockblock(transfer->localend, 0); + transferread(transfer->localend, transfer); } void transfersetlocalend(struct transfer *transfer, struct socket *sk) @@@ -343,9 -331,9 +341,9 @@@ 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) @@@ -724,7 -712,7 +722,7 @@@ int forkfilter(struct transfer *transfe * 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);