X-Git-Url: http://dolda2000.com/gitweb/?a=blobdiff_plain;f=daemon%2Ftransfer.c;h=b2be0fed0a6caa66769ea8d1cf285c77487a1deb;hb=3ea7528f421c6fb41172073504e03c555c87d9fb;hp=15bd5d25beecfdb4007ec35ae462b2744c6429b5;hpb=d3372da97568d5e1f35fa19787c8ec8af93a0435;p=doldaconnect.git diff --git a/daemon/transfer.c b/daemon/transfer.c index 15bd5d2..b2be0fe 100644 --- a/daemon/transfer.c +++ b/daemon/transfer.c @@ -36,6 +36,7 @@ #include "auth.h" #include "transfer.h" #include "module.h" +#include "client.h" static void killfilter(struct transfer *transfer); @@ -45,8 +46,6 @@ GCBCHAIN(newtransfercb, struct transfer *); void freetransfer(struct transfer *transfer) { - struct transarg *ta; - if(transfer == transfers) transfers = transfer->next; if(transfer->next != NULL) @@ -59,13 +58,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) @@ -82,6 +76,8 @@ void freetransfer(struct transfer *transfer) free(transfer->actdesc); if(transfer->filterbuf != NULL) free(transfer->filterbuf); + if(transfer->hash != NULL) + freehash(transfer->hash); if(transfer->localend != NULL) { transfer->localend->readcb = NULL; @@ -125,17 +121,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) @@ -154,6 +139,18 @@ void transferdetach(struct transfer *transfer) } } +struct transfer *finddownload(wchar_t *peerid) +{ + struct transfer *transfer; + + for(transfer = transfers; transfer != NULL; transfer = transfer->next) + { + if((transfer->dir == TRNSD_DOWN) && (transfer->iface == NULL) && !wcscmp(peerid, transfer->peerid)) + break; + } + return(transfer); +} + struct transfer *newupload(struct fnetnode *fn, struct fnet *fnet, wchar_t *nickid, struct transferiface *iface, void *data) { struct transfer *transfer; @@ -295,6 +292,12 @@ void transferprepul(struct transfer *transfer, size_t size, size_t start, size_t transfersetlocalend(transfer, lesk); } +void transferstartdl(struct transfer *transfer, struct socket *sk) +{ + transfersetstate(transfer, TRNS_MAIN); + socksettos(sk, confgetint("transfer", "dltos")); +} + void transferstartul(struct transfer *transfer, struct socket *sk) { transfersetstate(transfer, TRNS_MAIN); @@ -434,6 +437,14 @@ void transfersetpath(struct transfer *transfer, wchar_t *path) CBCHAINDOCB(transfer, trans_ac, transfer, L"path"); } +void transfersethash(struct transfer *transfer, struct hash *hash) +{ + if(transfer->hash != NULL) + freehash(transfer->hash); + transfer->hash = hash; + CBCHAINDOCB(transfer, trans_ac, transfer, L"hash"); +} + int slotsleft(void) { struct transfer *transfer; @@ -594,7 +605,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; @@ -653,9 +664,22 @@ int forkfilter(struct transfer *transfer) addtobuf(argv, filename); addtobuf(argv, buf); addtobuf(argv, peerid); + if(transfer->hash) + { + if((buf = icwcstombs(unparsehash(transfer->hash), NULL)) != NULL) + { + /* XXX: I am very doubtful of this, but it can just as + * well be argued that all data should be presented as + * key-value pairs. */ + addtobuf(argv, "hash"); + addtobuf(argv, buf); + } else { + flog(LOG_WARNING, "could not convert hash to local charset"); + } + } 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;