X-Git-Url: http://dolda2000.com/gitweb/?a=blobdiff_plain;f=daemon%2Ftransfer.c;h=f5b6b50d4f268252c9d8bd6c3c5426eb18c4a629;hb=6e37d33d4f42ad119cafa516746b10adaa148e49;hp=1d4bd21645974de632183410e7412fb68cb8e3bc;hpb=13b303d46959819a2da9e7d783b751c9ade45da5;p=doldaconnect.git diff --git a/daemon/transfer.c b/daemon/transfer.c index 1d4bd21..f5b6b50 100644 --- a/daemon/transfer.c +++ b/daemon/transfer.c @@ -80,6 +80,8 @@ void freetransfer(struct transfer *transfer) free(transfer->filterbuf); if(transfer->hash != NULL) freehash(transfer->hash); + if(transfer->exitstatus != NULL) + free(transfer->exitstatus); if(transfer->localend != NULL) { transfer->localend->readcb = NULL; @@ -153,6 +155,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->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; @@ -566,6 +580,17 @@ static char *findfilter(struct passwd *pwd) return(NULL); } +static void handletranscmd(struct transfer *transfer, wchar_t *cmd, wchar_t *arg) +{ + if(!wcscmp(cmd, L"status")) { + if(arg == NULL) + arg = L""; + if(transfer->exitstatus != NULL) + free(transfer->exitstatus); + transfer->exitstatus = swcsdup(arg); + } +} + static void filterread(struct socket *sk, struct transfer *transfer) { char *buf, *p, *p2; @@ -589,6 +614,7 @@ static void filterread(struct socket *sk, struct transfer *transfer) if((arg = icmbstowcs(p2, NULL)) == NULL) flog(LOG_WARNING, "filter sent a string which could not be converted into the local charset: %s: %s", p2, strerror(errno)); } + handletranscmd(transfer, cmd, arg); CBCHAINDOCB(transfer, trans_filterout, transfer, cmd, arg); if(arg != NULL) free(arg); @@ -603,6 +629,8 @@ static void filterread(struct socket *sk, struct transfer *transfer) static void filterexit(pid_t pid, int status, void *data) { struct transfer *transfer; + struct fnet *fnet; + wchar_t *peerid; for(transfer = transfers; transfer != NULL; transfer = transfer->next) { @@ -610,13 +638,14 @@ static void filterexit(pid_t pid, int status, void *data) { transfer->filter = -1; killfilter(transfer); + fnet = transfer->fnet; + peerid = swcsdup(transfer->peerid); if(WEXITSTATUS(status)) - { resettransfer(transfer); - } else { + else freetransfer(transfer); - } - trytransferbypeer(transfer->fnet, transfer->peerid); + trytransferbypeer(fnet, peerid); + free(peerid); break; } }