X-Git-Url: http://dolda2000.com/gitweb/?a=blobdiff_plain;f=daemon%2Ftransfer.c;h=ab2579d64cdeed5bcb52e6212b246b3f5734faf1;hb=f5dbbe62975d51f5096e1b38c3d982e6af093d8b;hp=cf636e4261cf464b7f11a3efc95f61edb48f5ac5;hpb=734dc54e7df608612f5743b210280ac1629107a7;p=doldaconnect.git diff --git a/daemon/transfer.c b/daemon/transfer.c index cf636e4..ab2579d 100644 --- a/daemon/transfer.c +++ b/daemon/transfer.c @@ -39,6 +39,10 @@ #include "client.h" static void killfilter(struct transfer *transfer); +static int transferread(struct socket *sk, struct transfer *transfer); +static int transferwrite(struct socket *sk, struct transfer *transfer); +static int transfererr(struct socket *sk, int errno, struct transfer *transfer); +static int filterread(struct socket *sk, struct transfer *transfer); unsigned long long bytesupload = 0; unsigned long long bytesdownload = 0; @@ -84,16 +88,14 @@ void freetransfer(struct transfer *transfer) free(transfer->exitstatus); if(transfer->localend != NULL) { - transfer->localend->readcb = NULL; - transfer->localend->writecb = NULL; - transfer->localend->errcb = NULL; + CBUNREG(transfer->localend, socket_read, transferread, transfer); + CBUNREG(transfer->localend, socket_write, transferwrite, transfer); + CBUNREG(transfer->localend, socket_err, transfererr, transfer); putsock(transfer->localend); } if(transfer->filterout != NULL) { - transfer->filterout->readcb = NULL; - transfer->filterout->writecb = NULL; - transfer->filterout->errcb = NULL; + CBUNREG(transfer->filterout, socket_read, filterread, transfer); putsock(transfer->filterout); } if(transfer->fn != NULL) @@ -155,6 +157,18 @@ struct transfer *finddownload(wchar_t *peerid) return(transfer); } +struct transfer *hasupload(struct fnet *fnet, wchar_t *peerid) +{ + struct transfer *transfer; + + for(transfer = transfers; transfer != NULL; transfer = transfer->next) + { + if((transfer->dir == TRNSD_UP) && (transfer->fnet == fnet) && !wcscmp(transfer->peerid, peerid)) + break; + } + return(transfer); +} + struct transfer *newupload(struct fnetnode *fn, struct fnet *fnet, wchar_t *nickid, struct transferiface *iface, void *data) { struct transfer *transfer; @@ -219,24 +233,27 @@ static void transexpire(int cancelled, struct transfer *transfer) transfer->timeout = 0; } -static void transferread(struct socket *sk, struct transfer *transfer) +static int transferread(struct socket *sk, struct transfer *transfer) { if(sockgetdatalen(sk) >= 65536) sk->ignread = 1; if((transfer->iface != NULL) && (transfer->iface->gotdata != NULL)) transfer->iface->gotdata(transfer, transfer->ifacedata); + return(0); } -static void transferwrite(struct socket *sk, struct transfer *transfer) +static int transferwrite(struct socket *sk, struct transfer *transfer) { if((transfer->iface != NULL) && (transfer->iface->wantdata != NULL)) transfer->iface->wantdata(transfer, transfer->ifacedata); + return(0); } -static void transfererr(struct socket *sk, int errno, struct transfer *transfer) +static int transfererr(struct socket *sk, int errno, struct transfer *transfer) { if((transfer->iface != NULL) && (transfer->iface->endofdata != NULL)) transfer->iface->endofdata(transfer, transfer->ifacedata); + return(0); } void transferputdata(struct transfer *transfer, void *buf, size_t size) @@ -253,9 +270,9 @@ 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; + CBUNREG(transfer->localend, socket_read, transferread, transfer); + CBUNREG(transfer->localend, socket_write, transferwrite, transfer); + CBUNREG(transfer->localend, socket_err, transfererr, transfer); putsock(transfer->localend); transfer->localend = NULL; } else { @@ -317,10 +334,9 @@ void transfersetlocalend(struct transfer *transfer, struct socket *sk) if(transfer->localend != NULL) 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; + CBREG(sk, socket_read, (int (*)(struct socket *, void *))transferread, NULL, transfer); + CBREG(sk, socket_write, (int (*)(struct socket *, void *))transferwrite, NULL, transfer); + CBREG(sk, socket_err, (int (*)(struct socket *, int, void *))transfererr, NULL, transfer); } static int tryreq(struct transfer *transfer) @@ -496,15 +512,15 @@ static void killfilter(struct transfer *transfer) } if(transfer->localend) { - transfer->localend->readcb = NULL; - transfer->localend->writecb = NULL; - transfer->localend->errcb = NULL; + CBUNREG(transfer->localend, socket_read, transferread, transfer); + CBUNREG(transfer->localend, socket_write, transferwrite, transfer); + CBUNREG(transfer->localend, socket_err, transfererr, transfer); putsock(transfer->localend); transfer->localend = NULL; } if(transfer->filterout) { - transfer->filterout->readcb = NULL; + CBUNREG(transfer->filterout, socket_read, filterread, transfer); putsock(transfer->filterout); transfer->filterout = NULL; } @@ -579,14 +595,14 @@ static void handletranscmd(struct transfer *transfer, wchar_t *cmd, wchar_t *arg } } -static void filterread(struct socket *sk, struct transfer *transfer) +static int filterread(struct socket *sk, struct transfer *transfer) { char *buf, *p, *p2; size_t bufsize; wchar_t *cmd, *arg; if((buf = sockgetinbuf(sk, &bufsize)) == NULL) - return; + return(0); bufcat(transfer->filterbuf, buf, bufsize); free(buf); while((p = memchr(transfer->filterbuf, '\n', transfer->filterbufdata)) != NULL) @@ -612,6 +628,7 @@ static void filterread(struct socket *sk, struct transfer *transfer) } memmove(transfer->filterbuf, p, transfer->filterbufdata -= (p - transfer->filterbuf)); } + return(0); } static void filterexit(pid_t pid, int status, void *data) @@ -748,8 +765,7 @@ int forkfilter(struct transfer *transfer) transfer->filter = pid; transfersetlocalend(transfer, insock); getsock(transfer->filterout = outsock); - outsock->data = transfer; - outsock->readcb = (void (*)(struct socket *, void *))filterread; + CBREG(outsock, socket_read, (int (*)(struct socket *, void *))filterread, NULL, transfer); putsock(insock); putsock(outsock); free(filtername); @@ -790,6 +806,7 @@ static struct configvar myvars[] = {CONF_VAR_INT, "ultos", {.num = SOCK_TOS_MAXTP}}, {CONF_VAR_INT, "dltos", {.num = SOCK_TOS_MAXTP}}, {CONF_VAR_STRING, "filter", {.str = L"dc-filter"}}, + {CONF_VAR_BOOL, "ulquota", {.num = 0}}, {CONF_VAR_END} };