X-Git-Url: http://dolda2000.com/gitweb/?a=blobdiff_plain;f=daemon%2Ftransfer.c;h=bebe01120c93037b95f25f9df46266aa58aa088b;hb=refs%2Fheads%2Fjava;hp=ab2579d64cdeed5bcb52e6212b246b3f5734faf1;hpb=5ec60e4217863b0e2d6a86ba3f60f60c68608227;p=doldaconnect.git diff --git a/daemon/transfer.c b/daemon/transfer.c index ab2579d..bebe011 100644 --- a/daemon/transfer.c +++ b/daemon/transfer.c @@ -1,6 +1,6 @@ /* * Dolda Connect - Modular multiuser Direct Connect-style client - * Copyright (C) 2004 Fredrik Tolf (fredrik@dolda2000.com) + * Copyright (C) 2004 Fredrik Tolf * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -39,10 +39,6 @@ #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; @@ -88,14 +84,16 @@ void freetransfer(struct transfer *transfer) free(transfer->exitstatus); if(transfer->localend != NULL) { - CBUNREG(transfer->localend, socket_read, transferread, transfer); - CBUNREG(transfer->localend, socket_write, transferwrite, transfer); - CBUNREG(transfer->localend, socket_err, transfererr, transfer); + transfer->localend->readcb = NULL; + transfer->localend->writecb = NULL; + transfer->localend->errcb = NULL; putsock(transfer->localend); } if(transfer->filterout != NULL) { - CBUNREG(transfer->filterout, socket_read, filterread, transfer); + transfer->filterout->readcb = NULL; + transfer->filterout->writecb = NULL; + transfer->filterout->errcb = NULL; putsock(transfer->filterout); } if(transfer->fn != NULL) @@ -233,27 +231,24 @@ static void transexpire(int cancelled, struct transfer *transfer) transfer->timeout = 0; } -static int transferread(struct socket *sk, struct transfer *transfer) +static void 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 int transferwrite(struct socket *sk, struct transfer *transfer) +static void transferwrite(struct socket *sk, struct transfer *transfer) { if((transfer->iface != NULL) && (transfer->iface->wantdata != NULL)) transfer->iface->wantdata(transfer, transfer->ifacedata); - return(0); } -static int transfererr(struct socket *sk, int errno, struct transfer *transfer) +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); - return(0); } void transferputdata(struct transfer *transfer, void *buf, size_t size) @@ -270,9 +265,9 @@ void transferendofdata(struct transfer *transfer) if(transfer->curpos >= transfer->size) { transfersetstate(transfer, TRNS_DONE); - CBUNREG(transfer->localend, socket_read, transferread, transfer); - CBUNREG(transfer->localend, socket_write, transferwrite, transfer); - CBUNREG(transfer->localend, socket_err, transfererr, transfer); + transfer->localend->readcb = NULL; + transfer->localend->writecb = NULL; + transfer->localend->errcb = NULL; putsock(transfer->localend); transfer->localend = NULL; } else { @@ -334,9 +329,10 @@ void transfersetlocalend(struct transfer *transfer, struct socket *sk) if(transfer->localend != NULL) putsock(transfer->localend); getsock(transfer->localend = sk); - 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); + 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; } static int tryreq(struct transfer *transfer) @@ -512,15 +508,15 @@ static void killfilter(struct transfer *transfer) } if(transfer->localend) { - CBUNREG(transfer->localend, socket_read, transferread, transfer); - CBUNREG(transfer->localend, socket_write, transferwrite, transfer); - CBUNREG(transfer->localend, socket_err, transfererr, transfer); + transfer->localend->readcb = NULL; + transfer->localend->writecb = NULL; + transfer->localend->errcb = NULL; putsock(transfer->localend); transfer->localend = NULL; } if(transfer->filterout) { - CBUNREG(transfer->filterout, socket_read, filterread, transfer); + transfer->filterout->readcb = NULL; putsock(transfer->filterout); transfer->filterout = NULL; } @@ -532,58 +528,6 @@ static void killfilter(struct transfer *transfer) transfer->filterbufsize = transfer->filterbufdata = 0; } -static char *findfilter(struct passwd *pwd) -{ - char *path, *filtername; - - if((path = sprintf2("%s/.dcdl-filter", pwd->pw_dir)) != NULL) - { - if(!access(path, X_OK)) - return(path); - free(path); - } - if((filtername = icwcstombs(confgetstr("transfer", "filter"), NULL)) == NULL) - { - flog(LOG_WARNING, "could not convert filter name into local charset: %s", strerror(errno)); - } else { - if(strchr(filtername, '/') == NULL) - { - if((path = sprintf2("/etc/%s", filtername)) != NULL) - { - if(!access(path, X_OK)) - { - free(filtername); - return(path); - } - free(path); - } - if((path = sprintf2("/usr/etc/%s", filtername)) != NULL) - { - if(!access(path, X_OK)) - { - free(filtername); - return(path); - } - free(path); - } - if((path = sprintf2("/usr/local/etc/%s", filtername)) != NULL) - { - if(!access(path, X_OK)) - { - free(filtername); - return(path); - } - free(path); - } - } else { - if(!access(filtername, X_OK)) - return(filtername); - } - free(filtername); - } - return(NULL); -} - static void handletranscmd(struct transfer *transfer, wchar_t *cmd, wchar_t *arg) { if(!wcscmp(cmd, L"status")) { @@ -595,14 +539,14 @@ static void handletranscmd(struct transfer *transfer, wchar_t *cmd, wchar_t *arg } } -static int filterread(struct socket *sk, struct transfer *transfer) +static void 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(0); + return; bufcat(transfer->filterbuf, buf, bufsize); free(buf); while((p = memchr(transfer->filterbuf, '\n', transfer->filterbufdata)) != NULL) @@ -628,7 +572,6 @@ static int 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) @@ -684,7 +627,10 @@ int forkfilter(struct transfer *transfer) errno = EACCES; return(-1); } - if((filtername = findfilter(pwent)) == NULL) + filtername = findfile("dc-filter", pwent->pw_dir, 0); + if(filtername == NULL) + filtername = findfile(icswcstombs(confgetstr("transfer", "filter"), NULL, NULL), NULL, 0); + if(filtername == NULL) { flog(LOG_WARNING, "could not find filter for user %s", pwent->pw_name); errno = ENOENT; @@ -720,7 +666,7 @@ int forkfilter(struct transfer *transfer) { argv = NULL; argvsize = argvdata = 0; - buf = sprintf2("%i", transfer->size); + buf = sprintf2("%zi", transfer->size); addtobuf(argv, filtername); addtobuf(argv, filename); addtobuf(argv, buf); @@ -765,7 +711,8 @@ int forkfilter(struct transfer *transfer) transfer->filter = pid; transfersetlocalend(transfer, insock); getsock(transfer->filterout = outsock); - CBREG(outsock, socket_read, (int (*)(struct socket *, void *))filterread, NULL, transfer); + outsock->data = transfer; + outsock->readcb = (void (*)(struct socket *, void *))filterread; putsock(insock); putsock(outsock); free(filtername); @@ -802,10 +749,22 @@ static int run(void) static struct configvar myvars[] = { + /** The maximum number of simultaneously permitted uploads. A + * common hub rule is that you will need at least as many slots as + * the number of hubs to which you are connected. */ {CONF_VAR_INT, "slots", {.num = 3}}, + /** The TOS value to use for upload connections (see the TOS + * VALUES section). */ {CONF_VAR_INT, "ultos", {.num = SOCK_TOS_MAXTP}}, + /** The TOS value to use for download connections (see the TOS + * VALUES section). */ {CONF_VAR_INT, "dltos", {.num = SOCK_TOS_MAXTP}}, + /** The name of the filter script (see the FILES section for + * lookup information). */ {CONF_VAR_STRING, "filter", {.str = L"dc-filter"}}, + /** If true, only one upload is allowed per remote peer. This + * option is still experimental, so it is recommended to leave it + * off. */ {CONF_VAR_BOOL, "ulquota", {.num = 0}}, {CONF_VAR_END} };